OSDN Git Service

Update FSF address.
[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 Free Software Foundation, Inc.
4    Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
5
6    This file is part of GCC.
7
8    GCC is free software; you can redistribute it and/or modify it
9    under the terms of the GNU General Public License as published
10    by the Free Software Foundation; either version 2, or (at your
11    option) any later version.
12
13    GCC is distributed in the hope that it will be useful, but WITHOUT
14    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16    License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GCC; see the file COPYING.  If not, write to the
20    Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
21    MA 02110-1301, USA.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "rtl.h"
28 #include "regs.h"
29 #include "hard-reg-set.h"
30 #include "real.h"
31 #include "insn-config.h"
32 #include "conditions.h"
33 #include "insn-attr.h"
34 #include "flags.h"
35 #include "recog.h"
36 #include "obstack.h"
37 #include "tree.h"
38 #include "expr.h"
39 #include "optabs.h"
40 #include "except.h"
41 #include "function.h"
42 #include "output.h"
43 #include "basic-block.h"
44 #include "integrate.h"
45 #include "toplev.h"
46 #include "ggc.h"
47 #include "hashtab.h"
48 #include "tm_p.h"
49 #include "target.h"
50 #include "target-def.h"
51 #include "langhooks.h"
52 #include "reload.h"
53 #include "cfglayout.h"
54 #include "sched-int.h"
55 #include "tree-gimple.h"
56 #include "intl.h"
57 #if TARGET_XCOFF
58 #include "xcoffout.h"  /* get declarations of xcoff_*_section_name */
59 #endif
60 #if TARGET_MACHO
61 #include "gstab.h"  /* for N_SLINE */
62 #endif
63
64 #ifndef TARGET_NO_PROTOTYPE
65 #define TARGET_NO_PROTOTYPE 0
66 #endif
67
68 #define min(A,B)        ((A) < (B) ? (A) : (B))
69 #define max(A,B)        ((A) > (B) ? (A) : (B))
70
71 /* Structure used to define the rs6000 stack */
72 typedef struct rs6000_stack {
73   int first_gp_reg_save;        /* first callee saved GP register used */
74   int first_fp_reg_save;        /* first callee saved FP register used */
75   int first_altivec_reg_save;   /* first callee saved AltiVec register used */
76   int lr_save_p;                /* true if the link reg needs to be saved */
77   int cr_save_p;                /* true if the CR reg needs to be saved */
78   unsigned int vrsave_mask;     /* mask of vec registers to save */
79   int toc_save_p;               /* true if the TOC needs to be saved */
80   int push_p;                   /* true if we need to allocate stack space */
81   int calls_p;                  /* true if the function makes any calls */
82   int world_save_p;             /* true if we're saving *everything*:
83                                    r13-r31, cr, f14-f31, vrsave, v20-v31  */
84   enum rs6000_abi abi;          /* which ABI to use */
85   int gp_save_offset;           /* offset to save GP regs from initial SP */
86   int fp_save_offset;           /* offset to save FP regs from initial SP */
87   int altivec_save_offset;      /* offset to save AltiVec regs from initial SP */
88   int lr_save_offset;           /* offset to save LR from initial SP */
89   int cr_save_offset;           /* offset to save CR from initial SP */
90   int vrsave_save_offset;       /* offset to save VRSAVE from initial SP */
91   int spe_gp_save_offset;       /* offset to save spe 64-bit gprs  */
92   int toc_save_offset;          /* offset to save the TOC pointer */
93   int varargs_save_offset;      /* offset to save the varargs registers */
94   int ehrd_offset;              /* offset to EH return data */
95   int reg_size;                 /* register size (4 or 8) */
96   int varargs_size;             /* size to hold V.4 args passed in regs */
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 lr_size;                  /* size to hold LR if not in save_size */
106   int vrsave_size;              /* size to hold VRSAVE if not in save_size */
107   int altivec_padding_size;     /* size of altivec alignment padding if
108                                    not in save_size */
109   int spe_gp_size;              /* size of 64-bit GPR save size for SPE */
110   int spe_padding_size;
111   int toc_size;                 /* size to hold TOC if not in save_size */
112   HOST_WIDE_INT total_size;     /* total bytes allocated for stack */
113   int spe_64bit_regs_used;
114 } rs6000_stack_t;
115
116 /* Target cpu type */
117
118 enum processor_type rs6000_cpu;
119 struct rs6000_cpu_select rs6000_select[3] =
120 {
121   /* switch             name,                   tune    arch */
122   { (const char *)0,    "--with-cpu=",          1,      1 },
123   { (const char *)0,    "-mcpu=",               1,      1 },
124   { (const char *)0,    "-mtune=",              1,      0 },
125 };
126
127 /* Always emit branch hint bits.  */
128 static GTY(()) bool rs6000_always_hint;
129
130 /* Schedule instructions for group formation.  */
131 static GTY(()) bool rs6000_sched_groups;
132
133 /* Support for -msched-costly-dep option.  */
134 const char *rs6000_sched_costly_dep_str;
135 enum rs6000_dependence_cost rs6000_sched_costly_dep;
136
137 /* Support for -minsert-sched-nops option.  */
138 const char *rs6000_sched_insert_nops_str;
139 enum rs6000_nop_insertion rs6000_sched_insert_nops;
140
141 /* Support targetm.vectorize.builtin_mask_for_load.  */
142 static GTY(()) tree altivec_builtin_mask_for_load;
143
144 /* Size of long double */
145 int rs6000_long_double_type_size;
146
147 /* Whether -mabi=altivec has appeared */
148 int rs6000_altivec_abi;
149
150 /* Nonzero if we want SPE ABI extensions.  */
151 int rs6000_spe_abi;
152
153 /* Nonzero if floating point operations are done in the GPRs.  */
154 int rs6000_float_gprs = 0;
155
156 /* Nonzero if we want Darwin's struct-by-value-in-regs ABI.  */
157 int rs6000_darwin64_abi;
158
159 /* Set to nonzero once AIX common-mode calls have been defined.  */
160 static GTY(()) int common_mode_defined;
161
162 /* Save information from a "cmpxx" operation until the branch or scc is
163    emitted.  */
164 rtx rs6000_compare_op0, rs6000_compare_op1;
165 int rs6000_compare_fp_p;
166
167 /* Label number of label created for -mrelocatable, to call to so we can
168    get the address of the GOT section */
169 int rs6000_pic_labelno;
170
171 #ifdef USING_ELFOS_H
172 /* Which abi to adhere to */
173 const char *rs6000_abi_name;
174
175 /* Semantics of the small data area */
176 enum rs6000_sdata_type rs6000_sdata = SDATA_DATA;
177
178 /* Which small data model to use */
179 const char *rs6000_sdata_name = (char *)0;
180
181 /* Counter for labels which are to be placed in .fixup.  */
182 int fixuplabelno = 0;
183 #endif
184
185 /* Bit size of immediate TLS offsets and string from which it is decoded.  */
186 int rs6000_tls_size = 32;
187 const char *rs6000_tls_size_string;
188
189 /* ABI enumeration available for subtarget to use.  */
190 enum rs6000_abi rs6000_current_abi;
191
192 /* Whether to use variant of AIX ABI for PowerPC64 Linux.  */
193 int dot_symbols;
194
195 /* Debug flags */
196 const char *rs6000_debug_name;
197 int rs6000_debug_stack;         /* debug stack applications */
198 int rs6000_debug_arg;           /* debug argument handling */
199
200 /* Value is TRUE if register/mode pair is acceptable.  */
201 bool rs6000_hard_regno_mode_ok_p[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
202
203 /* Built in types.  */
204
205 tree rs6000_builtin_types[RS6000_BTI_MAX];
206 tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
207
208 const char *rs6000_traceback_name;
209 static enum {
210   traceback_default = 0,
211   traceback_none,
212   traceback_part,
213   traceback_full
214 } rs6000_traceback;
215
216 /* Flag to say the TOC is initialized */
217 int toc_initialized;
218 char toc_label_name[10];
219
220 /* Alias set for saves and restores from the rs6000 stack.  */
221 static GTY(()) int rs6000_sr_alias_set;
222
223 /* Control alignment for fields within structures.  */
224 /* String from -malign-XXXXX.  */
225 int rs6000_alignment_flags;
226
227 /* True for any options that were explicitly set.  */
228 struct {
229   bool aix_struct_ret;          /* True if -maix-struct-ret was used.  */
230   bool alignment;               /* True if -malign- was used.  */
231   bool abi;                     /* True if -mabi= was used.  */
232   bool spe;                     /* True if -mspe= was used.  */
233   bool float_gprs;              /* True if -mfloat-gprs= was used.  */
234   bool isel;                    /* True if -misel was used. */
235   bool long_double;             /* True if -mlong-double- was used.  */
236 } rs6000_explicit_options;
237
238 struct builtin_description
239 {
240   /* mask is not const because we're going to alter it below.  This
241      nonsense will go away when we rewrite the -march infrastructure
242      to give us more target flag bits.  */
243   unsigned int mask;
244   const enum insn_code icode;
245   const char *const name;
246   const enum rs6000_builtins code;
247 };
248 \f
249 /* Target cpu costs.  */
250
251 struct processor_costs {
252   const int mulsi;        /* cost of SImode multiplication.  */
253   const int mulsi_const;  /* cost of SImode multiplication by constant.  */
254   const int mulsi_const9; /* cost of SImode mult by short constant.  */
255   const int muldi;        /* cost of DImode multiplication.  */
256   const int divsi;        /* cost of SImode division.  */
257   const int divdi;        /* cost of DImode division.  */
258   const int fp;           /* cost of simple SFmode and DFmode insns.  */
259   const int dmul;         /* cost of DFmode multiplication (and fmadd).  */
260   const int sdiv;         /* cost of SFmode division (fdivs).  */
261   const int ddiv;         /* cost of DFmode division (fdiv).  */
262 };
263
264 const struct processor_costs *rs6000_cost;
265
266 /* Processor costs (relative to an add) */
267
268 /* Instruction size costs on 32bit processors.  */
269 static const
270 struct processor_costs size32_cost = {
271   COSTS_N_INSNS (1),    /* mulsi */
272   COSTS_N_INSNS (1),    /* mulsi_const */
273   COSTS_N_INSNS (1),    /* mulsi_const9 */
274   COSTS_N_INSNS (1),    /* muldi */
275   COSTS_N_INSNS (1),    /* divsi */
276   COSTS_N_INSNS (1),    /* divdi */
277   COSTS_N_INSNS (1),    /* fp */
278   COSTS_N_INSNS (1),    /* dmul */
279   COSTS_N_INSNS (1),    /* sdiv */
280   COSTS_N_INSNS (1),    /* ddiv */
281 };
282
283 /* Instruction size costs on 64bit processors.  */
284 static const
285 struct processor_costs size64_cost = {
286   COSTS_N_INSNS (1),    /* mulsi */
287   COSTS_N_INSNS (1),    /* mulsi_const */
288   COSTS_N_INSNS (1),    /* mulsi_const9 */
289   COSTS_N_INSNS (1),    /* muldi */
290   COSTS_N_INSNS (1),    /* divsi */
291   COSTS_N_INSNS (1),    /* divdi */
292   COSTS_N_INSNS (1),    /* fp */
293   COSTS_N_INSNS (1),    /* dmul */
294   COSTS_N_INSNS (1),    /* sdiv */
295   COSTS_N_INSNS (1),    /* ddiv */
296 };
297
298 /* Instruction costs on RIOS1 processors.  */
299 static const
300 struct processor_costs rios1_cost = {
301   COSTS_N_INSNS (5),    /* mulsi */
302   COSTS_N_INSNS (4),    /* mulsi_const */
303   COSTS_N_INSNS (3),    /* mulsi_const9 */
304   COSTS_N_INSNS (5),    /* muldi */
305   COSTS_N_INSNS (19),   /* divsi */
306   COSTS_N_INSNS (19),   /* divdi */
307   COSTS_N_INSNS (2),    /* fp */
308   COSTS_N_INSNS (2),    /* dmul */
309   COSTS_N_INSNS (19),   /* sdiv */
310   COSTS_N_INSNS (19),   /* ddiv */
311 };
312
313 /* Instruction costs on RIOS2 processors.  */
314 static const
315 struct processor_costs rios2_cost = {
316   COSTS_N_INSNS (2),    /* mulsi */
317   COSTS_N_INSNS (2),    /* mulsi_const */
318   COSTS_N_INSNS (2),    /* mulsi_const9 */
319   COSTS_N_INSNS (2),    /* muldi */
320   COSTS_N_INSNS (13),   /* divsi */
321   COSTS_N_INSNS (13),   /* divdi */
322   COSTS_N_INSNS (2),    /* fp */
323   COSTS_N_INSNS (2),    /* dmul */
324   COSTS_N_INSNS (17),   /* sdiv */
325   COSTS_N_INSNS (17),   /* ddiv */
326 };
327
328 /* Instruction costs on RS64A processors.  */
329 static const
330 struct processor_costs rs64a_cost = {
331   COSTS_N_INSNS (20),   /* mulsi */
332   COSTS_N_INSNS (12),   /* mulsi_const */
333   COSTS_N_INSNS (8),    /* mulsi_const9 */
334   COSTS_N_INSNS (34),   /* muldi */
335   COSTS_N_INSNS (65),   /* divsi */
336   COSTS_N_INSNS (67),   /* divdi */
337   COSTS_N_INSNS (4),    /* fp */
338   COSTS_N_INSNS (4),    /* dmul */
339   COSTS_N_INSNS (31),   /* sdiv */
340   COSTS_N_INSNS (31),   /* ddiv */
341 };
342
343 /* Instruction costs on MPCCORE processors.  */
344 static const
345 struct processor_costs mpccore_cost = {
346   COSTS_N_INSNS (2),    /* mulsi */
347   COSTS_N_INSNS (2),    /* mulsi_const */
348   COSTS_N_INSNS (2),    /* mulsi_const9 */
349   COSTS_N_INSNS (2),    /* muldi */
350   COSTS_N_INSNS (6),    /* divsi */
351   COSTS_N_INSNS (6),    /* divdi */
352   COSTS_N_INSNS (4),    /* fp */
353   COSTS_N_INSNS (5),    /* dmul */
354   COSTS_N_INSNS (10),   /* sdiv */
355   COSTS_N_INSNS (17),   /* ddiv */
356 };
357
358 /* Instruction costs on PPC403 processors.  */
359 static const
360 struct processor_costs ppc403_cost = {
361   COSTS_N_INSNS (4),    /* mulsi */
362   COSTS_N_INSNS (4),    /* mulsi_const */
363   COSTS_N_INSNS (4),    /* mulsi_const9 */
364   COSTS_N_INSNS (4),    /* muldi */
365   COSTS_N_INSNS (33),   /* divsi */
366   COSTS_N_INSNS (33),   /* divdi */
367   COSTS_N_INSNS (11),   /* fp */
368   COSTS_N_INSNS (11),   /* dmul */
369   COSTS_N_INSNS (11),   /* sdiv */
370   COSTS_N_INSNS (11),   /* ddiv */
371 };
372
373 /* Instruction costs on PPC405 processors.  */
374 static const
375 struct processor_costs ppc405_cost = {
376   COSTS_N_INSNS (5),    /* mulsi */
377   COSTS_N_INSNS (4),    /* mulsi_const */
378   COSTS_N_INSNS (3),    /* mulsi_const9 */
379   COSTS_N_INSNS (5),    /* muldi */
380   COSTS_N_INSNS (35),   /* divsi */
381   COSTS_N_INSNS (35),   /* divdi */
382   COSTS_N_INSNS (11),   /* fp */
383   COSTS_N_INSNS (11),   /* dmul */
384   COSTS_N_INSNS (11),   /* sdiv */
385   COSTS_N_INSNS (11),   /* ddiv */
386 };
387
388 /* Instruction costs on PPC440 processors.  */
389 static const
390 struct processor_costs ppc440_cost = {
391   COSTS_N_INSNS (3),    /* mulsi */
392   COSTS_N_INSNS (2),    /* mulsi_const */
393   COSTS_N_INSNS (2),    /* mulsi_const9 */
394   COSTS_N_INSNS (3),    /* muldi */
395   COSTS_N_INSNS (34),   /* divsi */
396   COSTS_N_INSNS (34),   /* divdi */
397   COSTS_N_INSNS (5),    /* fp */
398   COSTS_N_INSNS (5),    /* dmul */
399   COSTS_N_INSNS (19),   /* sdiv */
400   COSTS_N_INSNS (33),   /* ddiv */
401 };
402
403 /* Instruction costs on PPC601 processors.  */
404 static const
405 struct processor_costs ppc601_cost = {
406   COSTS_N_INSNS (5),    /* mulsi */
407   COSTS_N_INSNS (5),    /* mulsi_const */
408   COSTS_N_INSNS (5),    /* mulsi_const9 */
409   COSTS_N_INSNS (5),    /* muldi */
410   COSTS_N_INSNS (36),   /* divsi */
411   COSTS_N_INSNS (36),   /* divdi */
412   COSTS_N_INSNS (4),    /* fp */
413   COSTS_N_INSNS (5),    /* dmul */
414   COSTS_N_INSNS (17),   /* sdiv */
415   COSTS_N_INSNS (31),   /* ddiv */
416 };
417
418 /* Instruction costs on PPC603 processors.  */
419 static const
420 struct processor_costs ppc603_cost = {
421   COSTS_N_INSNS (5),    /* mulsi */
422   COSTS_N_INSNS (3),    /* mulsi_const */
423   COSTS_N_INSNS (2),    /* mulsi_const9 */
424   COSTS_N_INSNS (5),    /* muldi */
425   COSTS_N_INSNS (37),   /* divsi */
426   COSTS_N_INSNS (37),   /* divdi */
427   COSTS_N_INSNS (3),    /* fp */
428   COSTS_N_INSNS (4),    /* dmul */
429   COSTS_N_INSNS (18),   /* sdiv */
430   COSTS_N_INSNS (33),   /* ddiv */
431 };
432
433 /* Instruction costs on PPC604 processors.  */
434 static const
435 struct processor_costs ppc604_cost = {
436   COSTS_N_INSNS (4),    /* mulsi */
437   COSTS_N_INSNS (4),    /* mulsi_const */
438   COSTS_N_INSNS (4),    /* mulsi_const9 */
439   COSTS_N_INSNS (4),    /* muldi */
440   COSTS_N_INSNS (20),   /* divsi */
441   COSTS_N_INSNS (20),   /* divdi */
442   COSTS_N_INSNS (3),    /* fp */
443   COSTS_N_INSNS (3),    /* dmul */
444   COSTS_N_INSNS (18),   /* sdiv */
445   COSTS_N_INSNS (32),   /* ddiv */
446 };
447
448 /* Instruction costs on PPC604e processors.  */
449 static const
450 struct processor_costs ppc604e_cost = {
451   COSTS_N_INSNS (2),    /* mulsi */
452   COSTS_N_INSNS (2),    /* mulsi_const */
453   COSTS_N_INSNS (2),    /* mulsi_const9 */
454   COSTS_N_INSNS (2),    /* muldi */
455   COSTS_N_INSNS (20),   /* divsi */
456   COSTS_N_INSNS (20),   /* divdi */
457   COSTS_N_INSNS (3),    /* fp */
458   COSTS_N_INSNS (3),    /* dmul */
459   COSTS_N_INSNS (18),   /* sdiv */
460   COSTS_N_INSNS (32),   /* ddiv */
461 };
462
463 /* Instruction costs on PPC620 processors.  */
464 static const
465 struct processor_costs ppc620_cost = {
466   COSTS_N_INSNS (5),    /* mulsi */
467   COSTS_N_INSNS (4),    /* mulsi_const */
468   COSTS_N_INSNS (3),    /* mulsi_const9 */
469   COSTS_N_INSNS (7),    /* muldi */
470   COSTS_N_INSNS (21),   /* divsi */
471   COSTS_N_INSNS (37),   /* divdi */
472   COSTS_N_INSNS (3),    /* fp */
473   COSTS_N_INSNS (3),    /* dmul */
474   COSTS_N_INSNS (18),   /* sdiv */
475   COSTS_N_INSNS (32),   /* ddiv */
476 };
477
478 /* Instruction costs on PPC630 processors.  */
479 static const
480 struct processor_costs ppc630_cost = {
481   COSTS_N_INSNS (5),    /* mulsi */
482   COSTS_N_INSNS (4),    /* mulsi_const */
483   COSTS_N_INSNS (3),    /* mulsi_const9 */
484   COSTS_N_INSNS (7),    /* muldi */
485   COSTS_N_INSNS (21),   /* divsi */
486   COSTS_N_INSNS (37),   /* divdi */
487   COSTS_N_INSNS (3),    /* fp */
488   COSTS_N_INSNS (3),    /* dmul */
489   COSTS_N_INSNS (17),   /* sdiv */
490   COSTS_N_INSNS (21),   /* ddiv */
491 };
492
493 /* Instruction costs on PPC750 and PPC7400 processors.  */
494 static const
495 struct processor_costs ppc750_cost = {
496   COSTS_N_INSNS (5),    /* mulsi */
497   COSTS_N_INSNS (3),    /* mulsi_const */
498   COSTS_N_INSNS (2),    /* mulsi_const9 */
499   COSTS_N_INSNS (5),    /* muldi */
500   COSTS_N_INSNS (17),   /* divsi */
501   COSTS_N_INSNS (17),   /* divdi */
502   COSTS_N_INSNS (3),    /* fp */
503   COSTS_N_INSNS (3),    /* dmul */
504   COSTS_N_INSNS (17),   /* sdiv */
505   COSTS_N_INSNS (31),   /* ddiv */
506 };
507
508 /* Instruction costs on PPC7450 processors.  */
509 static const
510 struct processor_costs ppc7450_cost = {
511   COSTS_N_INSNS (4),    /* mulsi */
512   COSTS_N_INSNS (3),    /* mulsi_const */
513   COSTS_N_INSNS (3),    /* mulsi_const9 */
514   COSTS_N_INSNS (4),    /* muldi */
515   COSTS_N_INSNS (23),   /* divsi */
516   COSTS_N_INSNS (23),   /* divdi */
517   COSTS_N_INSNS (5),    /* fp */
518   COSTS_N_INSNS (5),    /* dmul */
519   COSTS_N_INSNS (21),   /* sdiv */
520   COSTS_N_INSNS (35),   /* ddiv */
521 };
522
523 /* Instruction costs on PPC8540 processors.  */
524 static const
525 struct processor_costs ppc8540_cost = {
526   COSTS_N_INSNS (4),    /* mulsi */
527   COSTS_N_INSNS (4),    /* mulsi_const */
528   COSTS_N_INSNS (4),    /* mulsi_const9 */
529   COSTS_N_INSNS (4),    /* muldi */
530   COSTS_N_INSNS (19),   /* divsi */
531   COSTS_N_INSNS (19),   /* divdi */
532   COSTS_N_INSNS (4),    /* fp */
533   COSTS_N_INSNS (4),    /* dmul */
534   COSTS_N_INSNS (29),   /* sdiv */
535   COSTS_N_INSNS (29),   /* ddiv */
536 };
537
538 /* Instruction costs on POWER4 and POWER5 processors.  */
539 static const
540 struct processor_costs power4_cost = {
541   COSTS_N_INSNS (3),    /* mulsi */
542   COSTS_N_INSNS (2),    /* mulsi_const */
543   COSTS_N_INSNS (2),    /* mulsi_const9 */
544   COSTS_N_INSNS (4),    /* muldi */
545   COSTS_N_INSNS (18),   /* divsi */
546   COSTS_N_INSNS (34),   /* divdi */
547   COSTS_N_INSNS (3),    /* fp */
548   COSTS_N_INSNS (3),    /* dmul */
549   COSTS_N_INSNS (17),   /* sdiv */
550   COSTS_N_INSNS (17),   /* ddiv */
551 };
552
553 \f
554 static bool rs6000_function_ok_for_sibcall (tree, tree);
555 static const char *rs6000_invalid_within_doloop (rtx);
556 static rtx rs6000_generate_compare (enum rtx_code);
557 static void rs6000_maybe_dead (rtx);
558 static void rs6000_emit_stack_tie (void);
559 static void rs6000_frame_related (rtx, rtx, HOST_WIDE_INT, rtx, rtx);
560 static rtx spe_synthesize_frame_save (rtx);
561 static bool spe_func_has_64bit_regs_p (void);
562 static void emit_frame_save (rtx, rtx, enum machine_mode, unsigned int,
563                              int, HOST_WIDE_INT);
564 static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
565 static void rs6000_emit_allocate_stack (HOST_WIDE_INT, int);
566 static unsigned rs6000_hash_constant (rtx);
567 static unsigned toc_hash_function (const void *);
568 static int toc_hash_eq (const void *, const void *);
569 static int constant_pool_expr_1 (rtx, int *, int *);
570 static bool constant_pool_expr_p (rtx);
571 static bool legitimate_small_data_p (enum machine_mode, rtx);
572 static bool legitimate_indexed_address_p (rtx, int);
573 static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
574 static struct machine_function * rs6000_init_machine_status (void);
575 static bool rs6000_assemble_integer (rtx, unsigned int, int);
576 static bool no_global_regs_above (int);
577 #ifdef HAVE_GAS_HIDDEN
578 static void rs6000_assemble_visibility (tree, int);
579 #endif
580 static int rs6000_ra_ever_killed (void);
581 static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
582 static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
583 static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
584 static const char *rs6000_mangle_fundamental_type (tree);
585 extern const struct attribute_spec rs6000_attribute_table[];
586 static void rs6000_set_default_type_attributes (tree);
587 static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT);
588 static void rs6000_output_function_epilogue (FILE *, HOST_WIDE_INT);
589 static void rs6000_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
590                                     tree);
591 static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
592 static bool rs6000_return_in_memory (tree, tree);
593 static void rs6000_file_start (void);
594 #if TARGET_ELF
595 static unsigned int rs6000_elf_section_type_flags (tree, const char *, int);
596 static void rs6000_elf_asm_out_constructor (rtx, int);
597 static void rs6000_elf_asm_out_destructor (rtx, int);
598 static void rs6000_elf_end_indicate_exec_stack (void) ATTRIBUTE_UNUSED;
599 static void rs6000_elf_select_section (tree, int, unsigned HOST_WIDE_INT);
600 static void rs6000_elf_unique_section (tree, int);
601 static void rs6000_elf_select_rtx_section (enum machine_mode, rtx,
602                                            unsigned HOST_WIDE_INT);
603 static void rs6000_elf_encode_section_info (tree, rtx, int)
604      ATTRIBUTE_UNUSED;
605 static bool rs6000_elf_in_small_data_p (tree);
606 #endif
607 #if TARGET_XCOFF
608 static void rs6000_xcoff_asm_globalize_label (FILE *, const char *);
609 static void rs6000_xcoff_asm_named_section (const char *, unsigned int, tree);
610 static void rs6000_xcoff_select_section (tree, int, unsigned HOST_WIDE_INT);
611 static void rs6000_xcoff_unique_section (tree, int);
612 static void rs6000_xcoff_select_rtx_section (enum machine_mode, rtx,
613                                              unsigned HOST_WIDE_INT);
614 static const char * rs6000_xcoff_strip_name_encoding (const char *);
615 static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
616 static void rs6000_xcoff_file_start (void);
617 static void rs6000_xcoff_file_end (void);
618 #endif
619 static int rs6000_variable_issue (FILE *, int, rtx, int);
620 static bool rs6000_rtx_costs (rtx, int, int, int *);
621 static int rs6000_adjust_cost (rtx, rtx, rtx, int);
622 static bool is_microcoded_insn (rtx);
623 static int is_dispatch_slot_restricted (rtx);
624 static bool is_cracked_insn (rtx);
625 static bool is_branch_slot_insn (rtx);
626 static int rs6000_adjust_priority (rtx, int);
627 static int rs6000_issue_rate (void);
628 static bool rs6000_is_costly_dependence (rtx, rtx, rtx, int, int);
629 static rtx get_next_active_insn (rtx, rtx);
630 static bool insn_terminates_group_p (rtx , enum group_termination);
631 static bool is_costly_group (rtx *, rtx);
632 static int force_new_group (int, FILE *, rtx *, rtx, bool *, int, int *);
633 static int redefine_groups (FILE *, int, rtx, rtx);
634 static int pad_groups (FILE *, int, rtx, rtx);
635 static void rs6000_sched_finish (FILE *, int);
636 static int rs6000_use_sched_lookahead (void);
637 static tree rs6000_builtin_mask_for_load (void);
638
639 static void def_builtin (int, const char *, tree, int);
640 static void rs6000_init_builtins (void);
641 static rtx rs6000_expand_unop_builtin (enum insn_code, tree, rtx);
642 static rtx rs6000_expand_binop_builtin (enum insn_code, tree, rtx);
643 static rtx rs6000_expand_ternop_builtin (enum insn_code, tree, rtx);
644 static rtx rs6000_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
645 static void altivec_init_builtins (void);
646 static void rs6000_common_init_builtins (void);
647 static void rs6000_init_libfuncs (void);
648
649 static void enable_mask_for_builtins (struct builtin_description *, int,
650                                       enum rs6000_builtins,
651                                       enum rs6000_builtins);
652 static tree build_opaque_vector_type (tree, int);
653 static void spe_init_builtins (void);
654 static rtx spe_expand_builtin (tree, rtx, bool *);
655 static rtx spe_expand_stv_builtin (enum insn_code, tree);
656 static rtx spe_expand_predicate_builtin (enum insn_code, tree, rtx);
657 static rtx spe_expand_evsel_builtin (enum insn_code, tree, rtx);
658 static int rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
659 static rs6000_stack_t *rs6000_stack_info (void);
660 static void debug_stack_info (rs6000_stack_t *);
661
662 static rtx altivec_expand_builtin (tree, rtx, bool *);
663 static rtx altivec_expand_ld_builtin (tree, rtx, bool *);
664 static rtx altivec_expand_st_builtin (tree, rtx, bool *);
665 static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
666 static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
667 static rtx altivec_expand_predicate_builtin (enum insn_code,
668                                              const char *, tree, rtx);
669 static rtx altivec_expand_lv_builtin (enum insn_code, tree, rtx);
670 static rtx altivec_expand_stv_builtin (enum insn_code, tree);
671 static bool rs6000_handle_option (size_t, const char *, int);
672 static void rs6000_parse_tls_size_option (void);
673 static void rs6000_parse_yes_no_option (const char *, const char *, int *);
674 static int first_altivec_reg_to_save (void);
675 static unsigned int compute_vrsave_mask (void);
676 static void compute_save_world_info (rs6000_stack_t *info_ptr);
677 static void is_altivec_return_reg (rtx, void *);
678 static rtx generate_set_vrsave (rtx, rs6000_stack_t *, int);
679 int easy_vector_constant (rtx, enum machine_mode);
680 static bool rs6000_is_opaque_type (tree);
681 static rtx rs6000_dwarf_register_span (rtx);
682 static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
683 static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
684 static rtx rs6000_tls_get_addr (void);
685 static rtx rs6000_got_sym (void);
686 static int rs6000_tls_symbol_ref_1 (rtx *, void *);
687 static const char *rs6000_get_some_local_dynamic_name (void);
688 static int rs6000_get_some_local_dynamic_name_1 (rtx *, void *);
689 static rtx rs6000_complex_function_value (enum machine_mode);
690 static rtx rs6000_spe_function_arg (CUMULATIVE_ARGS *,
691                                     enum machine_mode, tree);
692 static void rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *,
693                                                       HOST_WIDE_INT);
694 static void rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *,
695                                                         tree, HOST_WIDE_INT);
696 static void rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *,
697                                               HOST_WIDE_INT,
698                                               rtx[], int *);
699 static void rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *,
700                                                tree, HOST_WIDE_INT,
701                                                rtx[], int *);
702 static rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, tree, int, bool);
703 static rtx rs6000_mixed_function_arg (enum machine_mode, tree, int);
704 static void rs6000_move_block_from_reg (int regno, rtx x, int nregs);
705 static void setup_incoming_varargs (CUMULATIVE_ARGS *,
706                                     enum machine_mode, tree,
707                                     int *, int);
708 static bool rs6000_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
709                                       tree, bool);
710 static int rs6000_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
711                                      tree, bool);
712 static const char *invalid_arg_for_unprototyped_fn (tree, tree, tree);
713 #if TARGET_MACHO
714 static void macho_branch_islands (void);
715 static void add_compiler_branch_island (tree, tree, int);
716 static int no_previous_def (tree function_name);
717 static tree get_prev_label (tree function_name);
718 static void rs6000_darwin_file_start (void);
719 #endif
720
721 static tree rs6000_build_builtin_va_list (void);
722 static tree rs6000_gimplify_va_arg (tree, tree, tree *, tree *);
723 static bool rs6000_must_pass_in_stack (enum machine_mode, tree);
724 static bool rs6000_vector_mode_supported_p (enum machine_mode);
725 static int get_vec_cmp_insn (enum rtx_code, enum machine_mode,
726                              enum machine_mode);
727 static rtx rs6000_emit_vector_compare (enum rtx_code, rtx, rtx,
728                                        enum machine_mode);
729 static int get_vsel_insn (enum machine_mode);
730 static void rs6000_emit_vector_select (rtx, rtx, rtx, rtx);
731
732
733 const int INSN_NOT_AVAILABLE = -1;
734 static enum machine_mode rs6000_eh_return_filter_mode (void);
735
736 /* Hash table stuff for keeping track of TOC entries.  */
737
738 struct toc_hash_struct GTY(())
739 {
740   /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
741      ASM_OUTPUT_SPECIAL_POOL_ENTRY_P.  */
742   rtx key;
743   enum machine_mode key_mode;
744   int labelno;
745 };
746
747 static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
748 \f
749 /* Default register names.  */
750 char rs6000_reg_names[][8] =
751 {
752       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
753       "8",  "9", "10", "11", "12", "13", "14", "15",
754      "16", "17", "18", "19", "20", "21", "22", "23",
755      "24", "25", "26", "27", "28", "29", "30", "31",
756       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
757       "8",  "9", "10", "11", "12", "13", "14", "15",
758      "16", "17", "18", "19", "20", "21", "22", "23",
759      "24", "25", "26", "27", "28", "29", "30", "31",
760      "mq", "lr", "ctr","ap",
761       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
762       "xer",
763       /* AltiVec registers.  */
764       "0",  "1",  "2",  "3",  "4",  "5",  "6", "7",
765       "8",  "9",  "10", "11", "12", "13", "14", "15",
766       "16", "17", "18", "19", "20", "21", "22", "23",
767       "24", "25", "26", "27", "28", "29", "30", "31",
768       "vrsave", "vscr",
769       /* SPE registers.  */
770       "spe_acc", "spefscr"
771 };
772
773 #ifdef TARGET_REGNAMES
774 static const char alt_reg_names[][8] =
775 {
776    "%r0",   "%r1",  "%r2",  "%r3",  "%r4",  "%r5",  "%r6",  "%r7",
777    "%r8",   "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
778   "%r16",  "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
779   "%r24",  "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
780    "%f0",   "%f1",  "%f2",  "%f3",  "%f4",  "%f5",  "%f6",  "%f7",
781    "%f8",   "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
782   "%f16",  "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
783   "%f24",  "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
784     "mq",    "lr",  "ctr",   "ap",
785   "%cr0",  "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
786    "xer",
787   /* AltiVec registers.  */
788    "%v0",  "%v1",  "%v2",  "%v3",  "%v4",  "%v5",  "%v6", "%v7",
789    "%v8",  "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
790   "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
791   "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
792   "vrsave", "vscr",
793   /* SPE registers.  */
794   "spe_acc", "spefscr"
795 };
796 #endif
797 \f
798 #ifndef MASK_STRICT_ALIGN
799 #define MASK_STRICT_ALIGN 0
800 #endif
801 #ifndef TARGET_PROFILE_KERNEL
802 #define TARGET_PROFILE_KERNEL 0
803 #endif
804
805 /* The VRSAVE bitmask puts bit %v0 as the most significant bit.  */
806 #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
807 \f
808 /* Initialize the GCC target structure.  */
809 #undef TARGET_ATTRIBUTE_TABLE
810 #define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
811 #undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
812 #define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
813
814 #undef TARGET_ASM_ALIGNED_DI_OP
815 #define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
816
817 /* Default unaligned ops are only provided for ELF.  Find the ops needed
818    for non-ELF systems.  */
819 #ifndef OBJECT_FORMAT_ELF
820 #if TARGET_XCOFF
821 /* For XCOFF.  rs6000_assemble_integer will handle unaligned DIs on
822    64-bit targets.  */
823 #undef TARGET_ASM_UNALIGNED_HI_OP
824 #define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
825 #undef TARGET_ASM_UNALIGNED_SI_OP
826 #define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
827 #undef TARGET_ASM_UNALIGNED_DI_OP
828 #define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
829 #else
830 /* For Darwin.  */
831 #undef TARGET_ASM_UNALIGNED_HI_OP
832 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
833 #undef TARGET_ASM_UNALIGNED_SI_OP
834 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
835 #undef TARGET_ASM_UNALIGNED_DI_OP
836 #define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
837 #undef TARGET_ASM_ALIGNED_DI_OP
838 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
839 #endif
840 #endif
841
842 /* This hook deals with fixups for relocatable code and DI-mode objects
843    in 64-bit code.  */
844 #undef TARGET_ASM_INTEGER
845 #define TARGET_ASM_INTEGER rs6000_assemble_integer
846
847 #ifdef HAVE_GAS_HIDDEN
848 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
849 #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
850 #endif
851
852 #undef TARGET_HAVE_TLS
853 #define TARGET_HAVE_TLS HAVE_AS_TLS
854
855 #undef TARGET_CANNOT_FORCE_CONST_MEM
856 #define TARGET_CANNOT_FORCE_CONST_MEM rs6000_tls_referenced_p
857
858 #undef TARGET_ASM_FUNCTION_PROLOGUE
859 #define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
860 #undef TARGET_ASM_FUNCTION_EPILOGUE
861 #define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
862
863 #undef  TARGET_SCHED_VARIABLE_ISSUE
864 #define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
865
866 #undef TARGET_SCHED_ISSUE_RATE
867 #define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
868 #undef TARGET_SCHED_ADJUST_COST
869 #define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
870 #undef TARGET_SCHED_ADJUST_PRIORITY
871 #define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
872 #undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
873 #define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
874 #undef TARGET_SCHED_FINISH
875 #define TARGET_SCHED_FINISH rs6000_sched_finish
876
877 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
878 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
879
880 #undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD
881 #define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load
882
883 #undef TARGET_INIT_BUILTINS
884 #define TARGET_INIT_BUILTINS rs6000_init_builtins
885
886 #undef TARGET_EXPAND_BUILTIN
887 #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
888
889 #undef TARGET_MANGLE_FUNDAMENTAL_TYPE
890 #define TARGET_MANGLE_FUNDAMENTAL_TYPE rs6000_mangle_fundamental_type
891
892 #undef TARGET_INIT_LIBFUNCS
893 #define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
894
895 #if TARGET_MACHO
896 #undef TARGET_BINDS_LOCAL_P
897 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
898 #endif
899
900 #undef TARGET_ASM_OUTPUT_MI_THUNK
901 #define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
902
903 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
904 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_tree_hwi_hwi_tree_true
905
906 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
907 #define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
908
909 #undef TARGET_INVALID_WITHIN_DOLOOP
910 #define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop
911
912 #undef TARGET_RTX_COSTS
913 #define TARGET_RTX_COSTS rs6000_rtx_costs
914 #undef TARGET_ADDRESS_COST
915 #define TARGET_ADDRESS_COST hook_int_rtx_0
916
917 #undef TARGET_VECTOR_OPAQUE_P
918 #define TARGET_VECTOR_OPAQUE_P rs6000_is_opaque_type
919
920 #undef TARGET_DWARF_REGISTER_SPAN
921 #define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
922
923 /* On rs6000, function arguments are promoted, as are function return
924    values.  */
925 #undef TARGET_PROMOTE_FUNCTION_ARGS
926 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
927 #undef TARGET_PROMOTE_FUNCTION_RETURN
928 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
929
930 #undef TARGET_RETURN_IN_MEMORY
931 #define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
932
933 #undef TARGET_SETUP_INCOMING_VARARGS
934 #define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
935
936 /* Always strict argument naming on rs6000.  */
937 #undef TARGET_STRICT_ARGUMENT_NAMING
938 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
939 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
940 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
941 #undef TARGET_SPLIT_COMPLEX_ARG
942 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_tree_true
943 #undef TARGET_MUST_PASS_IN_STACK
944 #define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
945 #undef TARGET_PASS_BY_REFERENCE
946 #define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
947 #undef TARGET_ARG_PARTIAL_BYTES
948 #define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes
949
950 #undef TARGET_BUILD_BUILTIN_VA_LIST
951 #define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
952
953 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
954 #define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
955
956 #undef TARGET_EH_RETURN_FILTER_MODE
957 #define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
958
959 #undef TARGET_VECTOR_MODE_SUPPORTED_P
960 #define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p
961
962 #undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
963 #define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn
964
965 #undef TARGET_HANDLE_OPTION
966 #define TARGET_HANDLE_OPTION rs6000_handle_option
967
968 #undef TARGET_DEFAULT_TARGET_FLAGS
969 #define TARGET_DEFAULT_TARGET_FLAGS \
970   (TARGET_DEFAULT | MASK_SCHED_PROLOG)
971
972 /* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors
973    The PowerPC architecture requires only weak consistency among
974    processors--that is, memory accesses between processors need not be
975    sequentially consistent and memory accesses among processors can occur
976    in any order. The ability to order memory accesses weakly provides
977    opportunities for more efficient use of the system bus. Unless a
978    dependency exists, the 604e allows read operations to precede store
979    operations.  */
980 #undef TARGET_RELAXED_ORDERING
981 #define TARGET_RELAXED_ORDERING true
982
983 #ifdef HAVE_AS_TLS
984 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
985 #define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
986 #endif
987
988 struct gcc_target targetm = TARGET_INITIALIZER;
989 \f
990
991 /* Value is 1 if hard register REGNO can hold a value of machine-mode
992    MODE.  */
993 static int
994 rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
995 {
996   /* The GPRs can hold any mode, but values bigger than one register
997      cannot go past R31.  */
998   if (INT_REGNO_P (regno))
999     return INT_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1);
1000
1001   /* The float registers can only hold floating modes and DImode.  */
1002   if (FP_REGNO_P (regno))
1003     return
1004       (GET_MODE_CLASS (mode) == MODE_FLOAT
1005        && FP_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1))
1006       || (GET_MODE_CLASS (mode) == MODE_INT
1007           && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD);
1008
1009   /* The CR register can only hold CC modes.  */
1010   if (CR_REGNO_P (regno))
1011     return GET_MODE_CLASS (mode) == MODE_CC;
1012
1013   if (XER_REGNO_P (regno))
1014     return mode == PSImode;
1015
1016   /* AltiVec only in AldyVec registers.  */
1017   if (ALTIVEC_REGNO_P (regno))
1018     return ALTIVEC_VECTOR_MODE (mode);
1019
1020   /* ...but GPRs can hold SIMD data on the SPE in one register.  */
1021   if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1022     return 1;
1023
1024   /* We cannot put TImode anywhere except general register and it must be
1025      able to fit within the register set.  */
1026
1027   return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
1028 }
1029
1030 /* Initialize rs6000_hard_regno_mode_ok_p table.  */
1031 static void
1032 rs6000_init_hard_regno_mode_ok (void)
1033 {
1034   int r, m;
1035
1036   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
1037     for (m = 0; m < NUM_MACHINE_MODES; ++m)
1038       if (rs6000_hard_regno_mode_ok (r, m))
1039         rs6000_hard_regno_mode_ok_p[m][r] = true;
1040 }
1041
1042 /* If not otherwise specified by a target, make 'long double' equivalent to
1043    'double'.  */
1044
1045 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
1046 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
1047 #endif
1048
1049 /* Override command line options.  Mostly we process the processor
1050    type and sometimes adjust other TARGET_ options.  */
1051
1052 void
1053 rs6000_override_options (const char *default_cpu)
1054 {
1055   size_t i, j;
1056   struct rs6000_cpu_select *ptr;
1057   int set_masks;
1058
1059   /* Simplifications for entries below.  */
1060
1061   enum {
1062     POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS,
1063     POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC
1064   };
1065
1066   /* This table occasionally claims that a processor does not support
1067      a particular feature even though it does, but the feature is slower
1068      than the alternative.  Thus, it shouldn't be relied on as a
1069      complete description of the processor's support.
1070
1071      Please keep this list in order, and don't forget to update the
1072      documentation in invoke.texi when adding a new processor or
1073      flag.  */
1074   static struct ptt
1075     {
1076       const char *const name;           /* Canonical processor name.  */
1077       const enum processor_type processor; /* Processor type enum value.  */
1078       const int target_enable;  /* Target flags to enable.  */
1079     } const processor_target_table[]
1080       = {{"401", PROCESSOR_PPC403, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1081          {"403", PROCESSOR_PPC403,
1082           POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_STRICT_ALIGN},
1083          {"405", PROCESSOR_PPC405, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1084          {"405fp", PROCESSOR_PPC405, POWERPC_BASE_MASK},
1085          {"440", PROCESSOR_PPC440, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1086          {"440fp", PROCESSOR_PPC440, POWERPC_BASE_MASK},
1087          {"505", PROCESSOR_MPCCORE, POWERPC_BASE_MASK},
1088          {"601", PROCESSOR_PPC601,
1089           MASK_POWER | POWERPC_BASE_MASK | MASK_MULTIPLE | MASK_STRING},
1090          {"602", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1091          {"603", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1092          {"603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1093          {"604", PROCESSOR_PPC604, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1094          {"604e", PROCESSOR_PPC604e, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1095          {"620", PROCESSOR_PPC620,
1096           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1097          {"630", PROCESSOR_PPC630,
1098           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1099          {"740", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1100          {"7400", PROCESSOR_PPC7400, POWERPC_7400_MASK},
1101          {"7450", PROCESSOR_PPC7450, POWERPC_7400_MASK},
1102          {"750", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1103          {"801", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1104          {"821", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1105          {"823", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1106          {"8540", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1107          /* 8548 has a dummy entry for now.  */
1108          {"8548", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1109          {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1110          {"970", PROCESSOR_POWER4,
1111           POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1112          {"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS},
1113          {"ec603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1114          {"G3", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1115          {"G4",  PROCESSOR_PPC7450, POWERPC_7400_MASK},
1116          {"G5", PROCESSOR_POWER4,
1117           POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1118          {"power", PROCESSOR_POWER, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1119          {"power2", PROCESSOR_POWER,
1120           MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1121          {"power3", PROCESSOR_PPC630,
1122           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1123          {"power4", PROCESSOR_POWER4,
1124           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POWERPC64},
1125          {"power5", PROCESSOR_POWER5,
1126           POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GFXOPT
1127           | MASK_MFCRF | MASK_POPCNTB},
1128          {"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK},
1129          {"powerpc64", PROCESSOR_POWERPC64,
1130           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1131          {"rios", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1132          {"rios1", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1133          {"rios2", PROCESSOR_RIOS2,
1134           MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1135          {"rsc", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1136          {"rsc1", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1137          {"rs64", PROCESSOR_RS64A,
1138           POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}
1139       };
1140
1141   const size_t ptt_size = ARRAY_SIZE (processor_target_table);
1142
1143   /* Some OSs don't support saving the high part of 64-bit registers on
1144      context switch.  Other OSs don't support saving Altivec registers.
1145      On those OSs, we don't touch the MASK_POWERPC64 or MASK_ALTIVEC
1146      settings; if the user wants either, the user must explicitly specify
1147      them and we won't interfere with the user's specification.  */
1148
1149   enum {
1150     POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
1151     POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT
1152                      | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
1153                      | MASK_MFCRF)
1154   };
1155
1156   rs6000_init_hard_regno_mode_ok ();
1157
1158   set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;
1159 #ifdef OS_MISSING_POWERPC64
1160   if (OS_MISSING_POWERPC64)
1161     set_masks &= ~MASK_POWERPC64;
1162 #endif
1163 #ifdef OS_MISSING_ALTIVEC
1164   if (OS_MISSING_ALTIVEC)
1165     set_masks &= ~MASK_ALTIVEC;
1166 #endif
1167
1168   /* Don't override by the processor default if given explicitly.  */
1169   set_masks &= ~target_flags_explicit;
1170
1171   /* Identify the processor type.  */
1172   rs6000_select[0].string = default_cpu;
1173   rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
1174
1175   for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
1176     {
1177       ptr = &rs6000_select[i];
1178       if (ptr->string != (char *)0 && ptr->string[0] != '\0')
1179         {
1180           for (j = 0; j < ptt_size; j++)
1181             if (! strcmp (ptr->string, processor_target_table[j].name))
1182               {
1183                 if (ptr->set_tune_p)
1184                   rs6000_cpu = processor_target_table[j].processor;
1185
1186                 if (ptr->set_arch_p)
1187                   {
1188                     target_flags &= ~set_masks;
1189                     target_flags |= (processor_target_table[j].target_enable
1190                                      & set_masks);
1191                   }
1192                 break;
1193               }
1194
1195           if (j == ptt_size)
1196             error ("bad value (%s) for %s switch", ptr->string, ptr->name);
1197         }
1198     }
1199
1200   if (TARGET_E500)
1201     rs6000_isel = 1;
1202
1203   /* If we are optimizing big endian systems for space, use the load/store
1204      multiple and string instructions.  */
1205   if (BYTES_BIG_ENDIAN && optimize_size)
1206     target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
1207
1208   /* Don't allow -mmultiple or -mstring on little endian systems
1209      unless the cpu is a 750, because the hardware doesn't support the
1210      instructions used in little endian mode, and causes an alignment
1211      trap.  The 750 does not cause an alignment trap (except when the
1212      target is unaligned).  */
1213
1214   if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
1215     {
1216       if (TARGET_MULTIPLE)
1217         {
1218           target_flags &= ~MASK_MULTIPLE;
1219           if ((target_flags_explicit & MASK_MULTIPLE) != 0)
1220             warning (0, "-mmultiple is not supported on little endian systems");
1221         }
1222
1223       if (TARGET_STRING)
1224         {
1225           target_flags &= ~MASK_STRING;
1226           if ((target_flags_explicit & MASK_STRING) != 0)
1227             warning (0, "-mstring is not supported on little endian systems");
1228         }
1229     }
1230
1231   /* Set debug flags */
1232   if (rs6000_debug_name)
1233     {
1234       if (! strcmp (rs6000_debug_name, "all"))
1235         rs6000_debug_stack = rs6000_debug_arg = 1;
1236       else if (! strcmp (rs6000_debug_name, "stack"))
1237         rs6000_debug_stack = 1;
1238       else if (! strcmp (rs6000_debug_name, "arg"))
1239         rs6000_debug_arg = 1;
1240       else
1241         error ("unknown -mdebug-%s switch", rs6000_debug_name);
1242     }
1243
1244   if (rs6000_traceback_name)
1245     {
1246       if (! strncmp (rs6000_traceback_name, "full", 4))
1247         rs6000_traceback = traceback_full;
1248       else if (! strncmp (rs6000_traceback_name, "part", 4))
1249         rs6000_traceback = traceback_part;
1250       else if (! strncmp (rs6000_traceback_name, "no", 2))
1251         rs6000_traceback = traceback_none;
1252       else
1253         error ("unknown -mtraceback arg %qs; expecting %<full%>, %<partial%> or %<none%>",
1254                rs6000_traceback_name);
1255     }
1256
1257   if (!rs6000_explicit_options.long_double)
1258     rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
1259
1260   /* Set Altivec ABI as default for powerpc64 linux.  */
1261   if (TARGET_ELF && TARGET_64BIT)
1262     {
1263       rs6000_altivec_abi = 1;
1264       TARGET_ALTIVEC_VRSAVE = 1;
1265     }
1266
1267   /* Set the Darwin64 ABI as default for 64-bit Darwin.  */
1268   if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
1269     {
1270       rs6000_darwin64_abi = 1;
1271 #if TARGET_MACHO
1272       darwin_one_byte_bool = 1;
1273 #endif
1274       /* Default to natural alignment, for better performance.  */
1275       rs6000_alignment_flags = MASK_ALIGN_NATURAL;
1276     }
1277
1278   /* Handle -mtls-size option.  */
1279   rs6000_parse_tls_size_option ();
1280
1281 #ifdef SUBTARGET_OVERRIDE_OPTIONS
1282   SUBTARGET_OVERRIDE_OPTIONS;
1283 #endif
1284 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
1285   SUBSUBTARGET_OVERRIDE_OPTIONS;
1286 #endif
1287 #ifdef SUB3TARGET_OVERRIDE_OPTIONS
1288   SUB3TARGET_OVERRIDE_OPTIONS;
1289 #endif
1290
1291   if (TARGET_E500)
1292     {
1293       if (TARGET_ALTIVEC)
1294         error ("AltiVec and E500 instructions cannot coexist");
1295
1296       /* The e500 does not have string instructions, and we set
1297          MASK_STRING above when optimizing for size.  */
1298       if ((target_flags & MASK_STRING) != 0)
1299         target_flags = target_flags & ~MASK_STRING;
1300     }
1301   else if (rs6000_select[1].string != NULL)
1302     {
1303       /* For the powerpc-eabispe configuration, we set all these by
1304          default, so let's unset them if we manually set another
1305          CPU that is not the E500.  */
1306       if (!rs6000_explicit_options.abi)
1307         rs6000_spe_abi = 0;
1308       if (!rs6000_explicit_options.spe)
1309         rs6000_spe = 0;
1310       if (!rs6000_explicit_options.float_gprs)
1311         rs6000_float_gprs = 0;
1312       if (!rs6000_explicit_options.isel)
1313         rs6000_isel = 0;
1314       if (!rs6000_explicit_options.long_double)
1315         rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
1316     }
1317
1318   rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4
1319                         && rs6000_cpu != PROCESSOR_POWER5);
1320   rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
1321                          || rs6000_cpu == PROCESSOR_POWER5);
1322
1323   rs6000_sched_restricted_insns_priority
1324     = (rs6000_sched_groups ? 1 : 0);
1325
1326   /* Handle -msched-costly-dep option.  */
1327   rs6000_sched_costly_dep
1328     = (rs6000_sched_groups ? store_to_load_dep_costly : no_dep_costly);
1329
1330   if (rs6000_sched_costly_dep_str)
1331     {
1332       if (! strcmp (rs6000_sched_costly_dep_str, "no"))
1333         rs6000_sched_costly_dep = no_dep_costly;
1334       else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
1335         rs6000_sched_costly_dep = all_deps_costly;
1336       else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
1337         rs6000_sched_costly_dep = true_store_to_load_dep_costly;
1338       else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
1339         rs6000_sched_costly_dep = store_to_load_dep_costly;
1340       else
1341         rs6000_sched_costly_dep = atoi (rs6000_sched_costly_dep_str);
1342     }
1343
1344   /* Handle -minsert-sched-nops option.  */
1345   rs6000_sched_insert_nops
1346     = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
1347
1348   if (rs6000_sched_insert_nops_str)
1349     {
1350       if (! strcmp (rs6000_sched_insert_nops_str, "no"))
1351         rs6000_sched_insert_nops = sched_finish_none;
1352       else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
1353         rs6000_sched_insert_nops = sched_finish_pad_groups;
1354       else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
1355         rs6000_sched_insert_nops = sched_finish_regroup_exact;
1356       else
1357         rs6000_sched_insert_nops = atoi (rs6000_sched_insert_nops_str);
1358     }
1359
1360 #ifdef TARGET_REGNAMES
1361   /* If the user desires alternate register names, copy in the
1362      alternate names now.  */
1363   if (TARGET_REGNAMES)
1364     memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
1365 #endif
1366
1367   /* Set aix_struct_return last, after the ABI is determined.
1368      If -maix-struct-return or -msvr4-struct-return was explicitly
1369      used, don't override with the ABI default.  */
1370   if (!rs6000_explicit_options.aix_struct_ret)
1371     aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
1372
1373   if (TARGET_LONG_DOUBLE_128
1374       && (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN))
1375     REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
1376
1377   /* Allocate an alias set for register saves & restores from stack.  */
1378   rs6000_sr_alias_set = new_alias_set ();
1379
1380   if (TARGET_TOC)
1381     ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
1382
1383   /* We can only guarantee the availability of DI pseudo-ops when
1384      assembling for 64-bit targets.  */
1385   if (!TARGET_64BIT)
1386     {
1387       targetm.asm_out.aligned_op.di = NULL;
1388       targetm.asm_out.unaligned_op.di = NULL;
1389     }
1390
1391   /* Set branch target alignment, if not optimizing for size.  */
1392   if (!optimize_size)
1393     {
1394       if (rs6000_sched_groups)
1395         {
1396           if (align_functions <= 0)
1397             align_functions = 16;
1398           if (align_jumps <= 0)
1399             align_jumps = 16;
1400           if (align_loops <= 0)
1401             align_loops = 16;
1402         }
1403       if (align_jumps_max_skip <= 0)
1404         align_jumps_max_skip = 15;
1405       if (align_loops_max_skip <= 0)
1406         align_loops_max_skip = 15;
1407     }
1408
1409   /* Arrange to save and restore machine status around nested functions.  */
1410   init_machine_status = rs6000_init_machine_status;
1411
1412   /* We should always be splitting complex arguments, but we can't break
1413      Linux and Darwin ABIs at the moment.  For now, only AIX is fixed.  */
1414   if (DEFAULT_ABI != ABI_AIX)
1415     targetm.calls.split_complex_arg = NULL;
1416
1417   /* Initialize rs6000_cost with the appropriate target costs.  */
1418   if (optimize_size)
1419     rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
1420   else
1421     switch (rs6000_cpu)
1422       {
1423       case PROCESSOR_RIOS1:
1424         rs6000_cost = &rios1_cost;
1425         break;
1426
1427       case PROCESSOR_RIOS2:
1428         rs6000_cost = &rios2_cost;
1429         break;
1430
1431       case PROCESSOR_RS64A:
1432         rs6000_cost = &rs64a_cost;
1433         break;
1434
1435       case PROCESSOR_MPCCORE:
1436         rs6000_cost = &mpccore_cost;
1437         break;
1438
1439       case PROCESSOR_PPC403:
1440         rs6000_cost = &ppc403_cost;
1441         break;
1442
1443       case PROCESSOR_PPC405:
1444         rs6000_cost = &ppc405_cost;
1445         break;
1446
1447       case PROCESSOR_PPC440:
1448         rs6000_cost = &ppc440_cost;
1449         break;
1450
1451       case PROCESSOR_PPC601:
1452         rs6000_cost = &ppc601_cost;
1453         break;
1454
1455       case PROCESSOR_PPC603:
1456         rs6000_cost = &ppc603_cost;
1457         break;
1458
1459       case PROCESSOR_PPC604:
1460         rs6000_cost = &ppc604_cost;
1461         break;
1462
1463       case PROCESSOR_PPC604e:
1464         rs6000_cost = &ppc604e_cost;
1465         break;
1466
1467       case PROCESSOR_PPC620:
1468         rs6000_cost = &ppc620_cost;
1469         break;
1470
1471       case PROCESSOR_PPC630:
1472         rs6000_cost = &ppc630_cost;
1473         break;
1474
1475       case PROCESSOR_PPC750:
1476       case PROCESSOR_PPC7400:
1477         rs6000_cost = &ppc750_cost;
1478         break;
1479
1480       case PROCESSOR_PPC7450:
1481         rs6000_cost = &ppc7450_cost;
1482         break;
1483
1484       case PROCESSOR_PPC8540:
1485         rs6000_cost = &ppc8540_cost;
1486         break;
1487
1488       case PROCESSOR_POWER4:
1489       case PROCESSOR_POWER5:
1490         rs6000_cost = &power4_cost;
1491         break;
1492
1493       default:
1494         gcc_unreachable ();
1495       }
1496 }
1497
1498 /* Implement targetm.vectorize.builtin_mask_for_load.  */
1499 static tree
1500 rs6000_builtin_mask_for_load (void)
1501 {
1502   if (TARGET_ALTIVEC)
1503     return altivec_builtin_mask_for_load;
1504   else
1505     return 0;
1506 }
1507
1508 /* Handle generic options of the form -mfoo=yes/no.
1509    NAME is the option name.
1510    VALUE is the option value.
1511    FLAG is the pointer to the flag where to store a 1 or 0, depending on
1512    whether the option value is 'yes' or 'no' respectively.  */
1513 static void
1514 rs6000_parse_yes_no_option (const char *name, const char *value, int *flag)
1515 {
1516   if (value == 0)
1517     return;
1518   else if (!strcmp (value, "yes"))
1519     *flag = 1;
1520   else if (!strcmp (value, "no"))
1521     *flag = 0;
1522   else
1523     error ("unknown -m%s= option specified: '%s'", name, value);
1524 }
1525
1526 /* Validate and record the size specified with the -mtls-size option.  */
1527
1528 static void
1529 rs6000_parse_tls_size_option (void)
1530 {
1531   if (rs6000_tls_size_string == 0)
1532     return;
1533   else if (strcmp (rs6000_tls_size_string, "16") == 0)
1534     rs6000_tls_size = 16;
1535   else if (strcmp (rs6000_tls_size_string, "32") == 0)
1536     rs6000_tls_size = 32;
1537   else if (strcmp (rs6000_tls_size_string, "64") == 0)
1538     rs6000_tls_size = 64;
1539   else
1540     error ("bad value %qs for -mtls-size switch", rs6000_tls_size_string);
1541 }
1542
1543 void
1544 optimization_options (int level ATTRIBUTE_UNUSED, int size ATTRIBUTE_UNUSED)
1545 {
1546   if (DEFAULT_ABI == ABI_DARWIN)
1547     /* The Darwin libraries never set errno, so we might as well
1548        avoid calling them when that's the only reason we would.  */
1549     flag_errno_math = 0;
1550 }
1551
1552 /* Implement TARGET_HANDLE_OPTION.  */
1553
1554 static bool
1555 rs6000_handle_option (size_t code, const char *arg, int value)
1556 {
1557   switch (code)
1558     {
1559     case OPT_mno_power:
1560       target_flags &= ~(MASK_POWER | MASK_POWER2
1561                         | MASK_MULTIPLE | MASK_STRING);
1562       target_flags_explicit |= (MASK_POWER | MASK_POWER2
1563                                 | MASK_MULTIPLE | MASK_STRING);
1564       break;
1565     case OPT_mno_powerpc:
1566       target_flags &= ~(MASK_POWERPC | MASK_PPC_GPOPT
1567                         | MASK_PPC_GFXOPT | MASK_POWERPC64);
1568       target_flags_explicit |= (MASK_POWERPC | MASK_PPC_GPOPT
1569                                 | MASK_PPC_GFXOPT | MASK_POWERPC64);
1570       break;
1571     case OPT_mfull_toc:
1572       target_flags &= ~(MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC
1573                         | MASK_NO_SUM_IN_TOC);
1574       target_flags_explicit |= (MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC
1575                                 | MASK_NO_SUM_IN_TOC);
1576 #ifdef TARGET_USES_SYSV4_OPT
1577       /* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be
1578          just the same as -mminimal-toc.  */
1579       target_flags |= MASK_MINIMAL_TOC;
1580       target_flags_explicit |= MASK_MINIMAL_TOC;
1581 #endif
1582       break;
1583
1584 #ifdef TARGET_USES_SYSV4_OPT
1585     case OPT_mtoc:
1586       /* Make -mtoc behave like -mminimal-toc.  */
1587       target_flags |= MASK_MINIMAL_TOC;
1588       target_flags_explicit |= MASK_MINIMAL_TOC;
1589       break;
1590 #endif
1591
1592 #ifdef TARGET_USES_AIX64_OPT
1593     case OPT_maix64:
1594 #else
1595     case OPT_m64:
1596 #endif
1597       target_flags |= MASK_POWERPC64 | MASK_POWERPC | MASK_PPC_GFXOPT;
1598       target_flags_explicit |= MASK_POWERPC64 | MASK_POWERPC
1599         | MASK_PPC_GFXOPT;
1600       break;
1601
1602 #ifdef TARGET_USES_AIX64_OPT
1603     case OPT_maix32:
1604 #else
1605     case OPT_m32:
1606 #endif
1607       target_flags &= ~MASK_POWERPC64;
1608       target_flags_explicit |= MASK_POWERPC64;
1609       break;
1610
1611     case OPT_minsert_sched_nops_:
1612       rs6000_sched_insert_nops_str = arg;
1613       break;
1614
1615     case OPT_mminimal_toc:
1616       if (value == 1)
1617         {
1618           target_flags &= ~(MASK_NO_FP_IN_TOC | MASK_NO_SUM_IN_TOC);
1619           target_flags_explicit |= (MASK_NO_FP_IN_TOC | MASK_NO_SUM_IN_TOC);
1620         }
1621       break;
1622
1623     case OPT_mpower:
1624       if (value == 1)
1625         {
1626           target_flags |= (MASK_MULTIPLE | MASK_STRING);
1627           target_flags_explicit |= (MASK_MULTIPLE | MASK_STRING);
1628         }
1629       break;
1630
1631     case OPT_mpower2:
1632       if (value == 1)
1633         {
1634           target_flags |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
1635           target_flags_explicit |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
1636         }
1637       break;
1638
1639     case OPT_mpowerpc_gpopt:
1640     case OPT_mpowerpc_gfxopt:
1641       if (value == 1)
1642         {
1643           target_flags |= MASK_POWERPC;
1644           target_flags_explicit |= MASK_POWERPC;
1645         }
1646       break;
1647
1648     case OPT_maix_struct_return:
1649     case OPT_msvr4_struct_return:
1650       rs6000_explicit_options.aix_struct_ret = true;
1651       break;
1652
1653     case OPT_mvrsave_:
1654       rs6000_parse_yes_no_option ("vrsave", arg, &(TARGET_ALTIVEC_VRSAVE));
1655       break;
1656
1657     case OPT_misel_:
1658       rs6000_explicit_options.isel = true;
1659       rs6000_parse_yes_no_option ("isel", arg, &(rs6000_isel));
1660       break;
1661
1662     case OPT_mspe_:
1663       rs6000_explicit_options.spe = true;
1664       rs6000_parse_yes_no_option ("spe", arg, &(rs6000_spe));
1665       /* No SPE means 64-bit long doubles, even if an E500.  */
1666       if (!rs6000_spe)
1667         rs6000_long_double_type_size = 64;
1668       break;
1669
1670     case OPT_mdebug_:
1671       rs6000_debug_name = arg;
1672       break;
1673
1674 #ifdef TARGET_USES_SYSV4_OPT
1675     case OPT_mcall_:
1676       rs6000_abi_name = arg;
1677       break;
1678
1679     case OPT_msdata_:
1680       rs6000_sdata_name = arg;
1681       break;
1682
1683     case OPT_mtls_size_:
1684       rs6000_tls_size_string = arg;
1685       break;
1686
1687     case OPT_mrelocatable:
1688       if (value == 1)
1689         {
1690           target_flags |= MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC;
1691           target_flags_explicit |= MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC;
1692         }
1693       break;
1694
1695     case OPT_mrelocatable_lib:
1696       if (value == 1)
1697         {
1698           target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC
1699             | MASK_NO_FP_IN_TOC;
1700           target_flags_explicit |= MASK_RELOCATABLE | MASK_MINIMAL_TOC
1701             | MASK_NO_FP_IN_TOC;
1702         }
1703       else
1704         {
1705           target_flags &= ~MASK_RELOCATABLE;
1706           target_flags_explicit |= MASK_RELOCATABLE;
1707         }
1708       break;
1709 #endif
1710
1711     case OPT_mabi_:
1712       rs6000_explicit_options.abi = true;
1713       if (!strcmp (arg, "altivec"))
1714         {
1715           rs6000_altivec_abi = 1;
1716           rs6000_spe_abi = 0;
1717         }
1718       else if (! strcmp (arg, "no-altivec"))
1719         rs6000_altivec_abi = 0;
1720       else if (! strcmp (arg, "spe"))
1721         {
1722           rs6000_spe_abi = 1;
1723           rs6000_altivec_abi = 0;
1724           if (!TARGET_SPE_ABI)
1725             error ("not configured for ABI: '%s'", arg);
1726         }
1727       else if (! strcmp (arg, "no-spe"))
1728         rs6000_spe_abi = 0;
1729
1730       /* These are here for testing during development only, do not
1731          document in the manual please.  */
1732       else if (! strcmp (arg, "d64"))
1733         {
1734           rs6000_darwin64_abi = 1;
1735           warning (0, "Using darwin64 ABI");
1736         }
1737       else if (! strcmp (arg, "d32"))
1738         {
1739           rs6000_darwin64_abi = 0;
1740           warning (0, "Using old darwin ABI");
1741         }
1742
1743       else
1744         {
1745           error ("unknown ABI specified: '%s'", arg);
1746           return false;
1747         }
1748       break;
1749
1750     case OPT_mcpu_:
1751       rs6000_select[1].string = arg;
1752       break;
1753
1754     case OPT_mtune_:
1755       rs6000_select[2].string = arg;
1756       break;
1757
1758     case OPT_mtraceback_:
1759       rs6000_traceback_name = arg;
1760       break;
1761
1762     case OPT_mfloat_gprs_:
1763       rs6000_explicit_options.float_gprs = true;
1764       if (! strcmp (arg, "yes") || ! strcmp (arg, "single"))
1765         rs6000_float_gprs = 1;
1766       else if (! strcmp (arg, "double"))
1767         rs6000_float_gprs = 2;
1768       else if (! strcmp (arg, "no"))
1769         rs6000_float_gprs = 0;
1770       else
1771         {
1772           error ("invalid option for -mfloat-gprs: '%s'", arg);
1773           return false;
1774         }
1775       break;
1776
1777     case OPT_mlong_double_:
1778       rs6000_explicit_options.long_double = true;
1779       rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
1780       if (value != 64 && value != 128)
1781         {
1782           error ("Unknown switch -mlong-double-%s", arg);
1783           rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
1784           return false;
1785         }
1786       else
1787         rs6000_long_double_type_size = value;
1788       break;
1789
1790     case OPT_msched_costly_dep_:
1791       rs6000_sched_costly_dep_str = arg;
1792       break;
1793
1794     case OPT_malign_:
1795       rs6000_explicit_options.alignment = true;
1796       if (! strcmp (arg, "power"))
1797         {
1798           /* On 64-bit Darwin, power alignment is ABI-incompatible with
1799              some C library functions, so warn about it. The flag may be
1800              useful for performance studies from time to time though, so
1801              don't disable it entirely.  */
1802           if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
1803             warning (0, "-malign-power is not supported for 64-bit Darwin;"
1804                      " it is incompatible with the installed C and C++ libraries");
1805           rs6000_alignment_flags = MASK_ALIGN_POWER;
1806         }
1807       else if (! strcmp (arg, "natural"))
1808         rs6000_alignment_flags = MASK_ALIGN_NATURAL;
1809       else
1810         {
1811           error ("unknown -malign-XXXXX option specified: '%s'", arg);
1812           return false;
1813         }
1814       break;
1815     }
1816   return true;
1817 }
1818 \f
1819 /* Do anything needed at the start of the asm file.  */
1820
1821 static void
1822 rs6000_file_start (void)
1823 {
1824   size_t i;
1825   char buffer[80];
1826   const char *start = buffer;
1827   struct rs6000_cpu_select *ptr;
1828   const char *default_cpu = TARGET_CPU_DEFAULT;
1829   FILE *file = asm_out_file;
1830
1831   default_file_start ();
1832
1833 #ifdef TARGET_BI_ARCH
1834   if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
1835     default_cpu = 0;
1836 #endif
1837
1838   if (flag_verbose_asm)
1839     {
1840       sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
1841       rs6000_select[0].string = default_cpu;
1842
1843       for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
1844         {
1845           ptr = &rs6000_select[i];
1846           if (ptr->string != (char *)0 && ptr->string[0] != '\0')
1847             {
1848               fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
1849               start = "";
1850             }
1851         }
1852
1853 #ifdef USING_ELFOS_H
1854       switch (rs6000_sdata)
1855         {
1856         case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
1857         case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
1858         case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
1859         case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
1860         }
1861
1862       if (rs6000_sdata && g_switch_value)
1863         {
1864           fprintf (file, "%s -G " HOST_WIDE_INT_PRINT_UNSIGNED, start,
1865                    g_switch_value);
1866           start = "";
1867         }
1868 #endif
1869
1870       if (*start == '\0')
1871         putc ('\n', file);
1872     }
1873
1874   if (DEFAULT_ABI == ABI_AIX || (TARGET_ELF && flag_pic == 2))
1875     {
1876       toc_section ();
1877       text_section ();
1878     }
1879 }
1880
1881 \f
1882 /* Return nonzero if this function is known to have a null epilogue.  */
1883
1884 int
1885 direct_return (void)
1886 {
1887   if (reload_completed)
1888     {
1889       rs6000_stack_t *info = rs6000_stack_info ();
1890
1891       if (info->first_gp_reg_save == 32
1892           && info->first_fp_reg_save == 64
1893           && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
1894           && ! info->lr_save_p
1895           && ! info->cr_save_p
1896           && info->vrsave_mask == 0
1897           && ! info->push_p)
1898         return 1;
1899     }
1900
1901   return 0;
1902 }
1903
1904 /* Return the number of instructions it takes to form a constant in an
1905    integer register.  */
1906
1907 int
1908 num_insns_constant_wide (HOST_WIDE_INT value)
1909 {
1910   /* signed constant loadable with {cal|addi} */
1911   if (CONST_OK_FOR_LETTER_P (value, 'I'))
1912     return 1;
1913
1914   /* constant loadable with {cau|addis} */
1915   else if (CONST_OK_FOR_LETTER_P (value, 'L'))
1916     return 1;
1917
1918 #if HOST_BITS_PER_WIDE_INT == 64
1919   else if (TARGET_POWERPC64)
1920     {
1921       HOST_WIDE_INT low  = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
1922       HOST_WIDE_INT high = value >> 31;
1923
1924       if (high == 0 || high == -1)
1925         return 2;
1926
1927       high >>= 1;
1928
1929       if (low == 0)
1930         return num_insns_constant_wide (high) + 1;
1931       else
1932         return (num_insns_constant_wide (high)
1933                 + num_insns_constant_wide (low) + 1);
1934     }
1935 #endif
1936
1937   else
1938     return 2;
1939 }
1940
1941 int
1942 num_insns_constant (rtx op, enum machine_mode mode)
1943 {
1944   HOST_WIDE_INT low, high;
1945   
1946   switch (GET_CODE (op))
1947     {
1948     case CONST_INT:
1949 #if HOST_BITS_PER_WIDE_INT == 64
1950       if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
1951           && mask_operand (op, mode))
1952         return 2;
1953       else
1954 #endif
1955         return num_insns_constant_wide (INTVAL (op));
1956
1957       case CONST_DOUBLE:
1958         if (mode == SFmode)
1959           {
1960             long l;
1961             REAL_VALUE_TYPE rv;
1962             
1963             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1964             REAL_VALUE_TO_TARGET_SINGLE (rv, l);
1965             return num_insns_constant_wide ((HOST_WIDE_INT) l);
1966           }
1967
1968         if (mode == VOIDmode || mode == DImode)
1969           {
1970             high = CONST_DOUBLE_HIGH (op);
1971             low  = CONST_DOUBLE_LOW (op);
1972           }
1973         else
1974           {
1975             long l[2];
1976             REAL_VALUE_TYPE rv;
1977             
1978             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1979             REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
1980             high = l[WORDS_BIG_ENDIAN == 0];
1981             low  = l[WORDS_BIG_ENDIAN != 0];
1982           }
1983
1984         if (TARGET_32BIT)
1985           return (num_insns_constant_wide (low)
1986                   + num_insns_constant_wide (high));
1987         else
1988           {
1989             if ((high == 0 && low >= 0)
1990                 || (high == -1 && low < 0))
1991               return num_insns_constant_wide (low);
1992             
1993             else if (mask_operand (op, mode))
1994               return 2;
1995             
1996             else if (low == 0)
1997               return num_insns_constant_wide (high) + 1;
1998             
1999             else
2000               return (num_insns_constant_wide (high)
2001                       + num_insns_constant_wide (low) + 1);
2002           }
2003         
2004     default:
2005       gcc_unreachable ();
2006     }
2007 }
2008
2009 /* Returns the constant for the splat instruction, if exists.  */
2010
2011 int
2012 easy_vector_splat_const (int cst, enum machine_mode mode)
2013 {
2014   switch (mode)
2015     {
2016     case V4SImode:
2017       if (EASY_VECTOR_15 (cst)
2018           || EASY_VECTOR_15_ADD_SELF (cst))
2019         return cst;
2020       if ((cst & 0xffff) != ((cst >> 16) & 0xffff))
2021         break;
2022       cst = cst >> 16;
2023       /* Fall thru */
2024
2025     case V8HImode:
2026       if (EASY_VECTOR_15 (cst)
2027           || EASY_VECTOR_15_ADD_SELF (cst))
2028         return cst;
2029       if ((cst & 0xff) != ((cst >> 8) & 0xff))
2030         break;
2031       cst = cst >> 8;
2032       /* Fall thru */
2033
2034     case V16QImode:
2035       if (EASY_VECTOR_15 (cst)
2036           || EASY_VECTOR_15_ADD_SELF (cst))
2037         return cst;
2038     default:
2039       break;
2040     }
2041   return 0;
2042 }
2043
2044 /* Return nonzero if all elements of a vector have the same value.  */
2045
2046 int
2047 easy_vector_same (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2048 {
2049   int units, i, cst;
2050
2051   units = CONST_VECTOR_NUNITS (op);
2052
2053   cst = INTVAL (CONST_VECTOR_ELT (op, 0));
2054   for (i = 1; i < units; ++i)
2055     if (INTVAL (CONST_VECTOR_ELT (op, i)) != cst)
2056       break;
2057   if (i == units && easy_vector_splat_const (cst, mode))
2058     return 1;
2059   return 0;
2060 }
2061
2062 /* Generate easy_vector_constant out of a easy_vector_constant_add_self.  */
2063
2064 rtx
2065 gen_easy_vector_constant_add_self (rtx op)
2066 {
2067   int i, units;
2068   rtvec v;
2069   units = GET_MODE_NUNITS (GET_MODE (op));
2070   v = rtvec_alloc (units);
2071
2072   for (i = 0; i < units; i++)
2073     RTVEC_ELT (v, i) =
2074       GEN_INT (INTVAL (CONST_VECTOR_ELT (op, i)) >> 1);
2075   return gen_rtx_raw_CONST_VECTOR (GET_MODE (op), v);
2076 }
2077
2078 const char *
2079 output_vec_const_move (rtx *operands)
2080 {
2081   int cst, cst2;
2082   enum machine_mode mode;
2083   rtx dest, vec;
2084
2085   dest = operands[0];
2086   vec = operands[1];
2087
2088   cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
2089   cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
2090   mode = GET_MODE (dest);
2091
2092   if (TARGET_ALTIVEC)
2093     {
2094       if (zero_constant (vec, mode))
2095         return "vxor %0,%0,%0";
2096
2097       gcc_assert (easy_vector_constant (vec, mode));
2098       
2099       operands[1] = GEN_INT (cst);
2100       switch (mode)
2101         {
2102         case V4SImode:
2103           if (EASY_VECTOR_15 (cst))
2104             {
2105               operands[1] = GEN_INT (cst);
2106               return "vspltisw %0,%1";
2107             }
2108           else if (EASY_VECTOR_15_ADD_SELF (cst))
2109             return "#";
2110           cst = cst >> 16;
2111           /* Fall thru */
2112
2113         case V8HImode:
2114           if (EASY_VECTOR_15 (cst))
2115             {
2116               operands[1] = GEN_INT (cst);
2117               return "vspltish %0,%1";
2118             }
2119           else if (EASY_VECTOR_15_ADD_SELF (cst))
2120             return "#";
2121           cst = cst >> 8;
2122           /* Fall thru */
2123
2124         case V16QImode:
2125           if (EASY_VECTOR_15 (cst))
2126             {
2127               operands[1] = GEN_INT (cst);
2128               return "vspltisb %0,%1";
2129             }
2130           else if (EASY_VECTOR_15_ADD_SELF (cst))
2131             return "#";
2132           
2133         default:
2134           gcc_unreachable ();
2135         }
2136     }
2137
2138   gcc_assert (TARGET_SPE);
2139   
2140   /* Vector constant 0 is handled as a splitter of V2SI, and in the
2141      pattern of V1DI, V4HI, and V2SF.
2142
2143      FIXME: We should probably return # and add post reload
2144      splitters for these, but this way is so easy ;-).  */
2145   operands[1] = GEN_INT (cst);
2146   operands[2] = GEN_INT (cst2);
2147   if (cst == cst2)
2148     return "li %0,%1\n\tevmergelo %0,%0,%0";
2149   else
2150     return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
2151 }
2152
2153 int
2154 mask64_1or2_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED,
2155                        bool allow_one)
2156 {
2157   if (GET_CODE (op) == CONST_INT)
2158     {
2159       HOST_WIDE_INT c, lsb;
2160       bool one_ok;
2161       
2162       c = INTVAL (op);
2163
2164       /* Disallow all zeros.  */
2165       if (c == 0)
2166         return 0;
2167
2168       /* We can use a single rlwinm insn if no upper bits of C are set
2169          AND there are zero, one or two transitions in the _whole_ of
2170          C.  */
2171       one_ok = !(c & ~(HOST_WIDE_INT)0xffffffff);
2172       
2173       /* We don't change the number of transitions by inverting,
2174          so make sure we start with the LS bit zero.  */
2175       if (c & 1)
2176         c = ~c;
2177
2178       /* Find the first transition.  */
2179       lsb = c & -c;
2180
2181       /* Invert to look for a second transition.  */
2182       c = ~c;
2183
2184       /* Erase first transition.  */
2185       c &= -lsb;
2186
2187       /* Find the second transition.  */
2188       lsb = c & -c;
2189
2190       /* Invert to look for a third transition.  */
2191       c = ~c;
2192
2193       /* Erase second transition.  */
2194       c &= -lsb;
2195
2196       if (one_ok && !(allow_one || c))
2197         return 0;
2198
2199       /* Find the third transition (if any).  */
2200       lsb = c & -c;
2201
2202       /* Match if all the bits above are 1's (or c is zero).  */
2203       return c == -lsb;
2204     }
2205   return 0;
2206 }
2207
2208 /* Generates shifts and masks for a pair of rldicl or rldicr insns to
2209    implement ANDing by the mask IN.  */
2210 void
2211 build_mask64_2_operands (rtx in, rtx *out)
2212 {
2213 #if HOST_BITS_PER_WIDE_INT >= 64
2214   unsigned HOST_WIDE_INT c, lsb, m1, m2;
2215   int shift;
2216
2217   gcc_assert (GET_CODE (in) == CONST_INT);
2218
2219   c = INTVAL (in);
2220   if (c & 1)
2221     {
2222       /* Assume c initially something like 0x00fff000000fffff.  The idea
2223          is to rotate the word so that the middle ^^^^^^ group of zeros
2224          is at the MS end and can be cleared with an rldicl mask.  We then
2225          rotate back and clear off the MS    ^^ group of zeros with a
2226          second rldicl.  */
2227       c = ~c;                   /*   c == 0xff000ffffff00000 */
2228       lsb = c & -c;             /* lsb == 0x0000000000100000 */
2229       m1 = -lsb;                /*  m1 == 0xfffffffffff00000 */
2230       c = ~c;                   /*   c == 0x00fff000000fffff */
2231       c &= -lsb;                /*   c == 0x00fff00000000000 */
2232       lsb = c & -c;             /* lsb == 0x0000100000000000 */
2233       c = ~c;                   /*   c == 0xff000fffffffffff */
2234       c &= -lsb;                /*   c == 0xff00000000000000 */
2235       shift = 0;
2236       while ((lsb >>= 1) != 0)
2237         shift++;                /* shift == 44 on exit from loop */
2238       m1 <<= 64 - shift;        /*  m1 == 0xffffff0000000000 */
2239       m1 = ~m1;                 /*  m1 == 0x000000ffffffffff */
2240       m2 = ~c;                  /*  m2 == 0x00ffffffffffffff */
2241     }
2242   else
2243     {
2244       /* Assume c initially something like 0xff000f0000000000.  The idea
2245          is to rotate the word so that the     ^^^  middle group of zeros
2246          is at the LS end and can be cleared with an rldicr mask.  We then
2247          rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
2248          a second rldicr.  */
2249       lsb = c & -c;             /* lsb == 0x0000010000000000 */
2250       m2 = -lsb;                /*  m2 == 0xffffff0000000000 */
2251       c = ~c;                   /*   c == 0x00fff0ffffffffff */
2252       c &= -lsb;                /*   c == 0x00fff00000000000 */
2253       lsb = c & -c;             /* lsb == 0x0000100000000000 */
2254       c = ~c;                   /*   c == 0xff000fffffffffff */
2255       c &= -lsb;                /*   c == 0xff00000000000000 */
2256       shift = 0;
2257       while ((lsb >>= 1) != 0)
2258         shift++;                /* shift == 44 on exit from loop */
2259       m1 = ~c;                  /*  m1 == 0x00ffffffffffffff */
2260       m1 >>= shift;             /*  m1 == 0x0000000000000fff */
2261       m1 = ~m1;                 /*  m1 == 0xfffffffffffff000 */
2262     }
2263
2264   /* Note that when we only have two 0->1 and 1->0 transitions, one of the
2265      masks will be all 1's.  We are guaranteed more than one transition.  */
2266   out[0] = GEN_INT (64 - shift);
2267   out[1] = GEN_INT (m1);
2268   out[2] = GEN_INT (shift);
2269   out[3] = GEN_INT (m2);
2270 #else
2271   (void)in;
2272   (void)out;
2273   gcc_unreachable ();
2274 #endif
2275 }
2276
2277 /* Return TRUE if OP is an invalid SUBREG operation on the e500.  */
2278
2279 bool
2280 invalid_e500_subreg (rtx op, enum machine_mode mode)
2281 {
2282   /* Reject (subreg:SI (reg:DF)).  */
2283   if (GET_CODE (op) == SUBREG
2284       && mode == SImode
2285       && REG_P (SUBREG_REG (op))
2286       && GET_MODE (SUBREG_REG (op)) == DFmode)
2287     return true;
2288
2289   /* Reject (subreg:DF (reg:DI)).  */
2290   if (GET_CODE (op) == SUBREG
2291       && mode == DFmode
2292       && REG_P (SUBREG_REG (op))
2293       && GET_MODE (SUBREG_REG (op)) == DImode)
2294     return true;
2295
2296   return false;
2297 }
2298
2299 /* Darwin, AIX increases natural record alignment to doubleword if the first
2300    field is an FP double while the FP fields remain word aligned.  */
2301
2302 unsigned int
2303 rs6000_special_round_type_align (tree type, int computed, int specified)
2304 {
2305   tree field = TYPE_FIELDS (type);
2306
2307   /* Skip all non field decls */ 
2308   while (field != NULL && TREE_CODE (field) != FIELD_DECL)
2309     field = TREE_CHAIN (field);
2310
2311   if (field == NULL || field == type || DECL_MODE (field) != DFmode)
2312     return MAX (computed, specified);
2313
2314   return MAX (MAX (computed, specified), 64);
2315 }
2316
2317 /* Return 1 for an operand in small memory on V.4/eabi.  */
2318
2319 int
2320 small_data_operand (rtx op ATTRIBUTE_UNUSED,
2321                     enum machine_mode mode ATTRIBUTE_UNUSED)
2322 {
2323 #if TARGET_ELF
2324   rtx sym_ref;
2325
2326   if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
2327     return 0;
2328
2329   if (DEFAULT_ABI != ABI_V4)
2330     return 0;
2331
2332   if (GET_CODE (op) == SYMBOL_REF)
2333     sym_ref = op;
2334
2335   else if (GET_CODE (op) != CONST
2336            || GET_CODE (XEXP (op, 0)) != PLUS
2337            || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
2338            || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
2339     return 0;
2340
2341   else
2342     {
2343       rtx sum = XEXP (op, 0);
2344       HOST_WIDE_INT summand;
2345
2346       /* We have to be careful here, because it is the referenced address
2347          that must be 32k from _SDA_BASE_, not just the symbol.  */
2348       summand = INTVAL (XEXP (sum, 1));
2349       if (summand < 0 || (unsigned HOST_WIDE_INT) summand > g_switch_value)
2350         return 0;
2351
2352       sym_ref = XEXP (sum, 0);
2353     }
2354
2355   return SYMBOL_REF_SMALL_P (sym_ref);
2356 #else
2357   return 0;
2358 #endif
2359 }
2360
2361 /* Return true if either operand is a general purpose register.  */
2362
2363 bool
2364 gpr_or_gpr_p (rtx op0, rtx op1)
2365 {
2366   return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
2367           || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
2368 }
2369
2370 \f
2371 /* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address.  */
2372
2373 static int
2374 constant_pool_expr_1 (rtx op, int *have_sym, int *have_toc)
2375 {
2376   switch (GET_CODE (op))
2377     {
2378     case SYMBOL_REF:
2379       if (RS6000_SYMBOL_REF_TLS_P (op))
2380         return 0;
2381       else if (CONSTANT_POOL_ADDRESS_P (op))
2382         {
2383           if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (op), Pmode))
2384             {
2385               *have_sym = 1;
2386               return 1;
2387             }
2388           else
2389             return 0;
2390         }
2391       else if (! strcmp (XSTR (op, 0), toc_label_name))
2392         {
2393           *have_toc = 1;
2394           return 1;
2395         }
2396       else
2397         return 0;
2398     case PLUS:
2399     case MINUS:
2400       return (constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc)
2401               && constant_pool_expr_1 (XEXP (op, 1), have_sym, have_toc));
2402     case CONST:
2403       return constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc);
2404     case CONST_INT:
2405       return 1;
2406     default:
2407       return 0;
2408     }
2409 }
2410
2411 static bool
2412 constant_pool_expr_p (rtx op)
2413 {
2414   int have_sym = 0;
2415   int have_toc = 0;
2416   return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_sym;
2417 }
2418
2419 bool
2420 toc_relative_expr_p (rtx op)
2421 {
2422   int have_sym = 0;
2423   int have_toc = 0;
2424   return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_toc;
2425 }
2426
2427 bool
2428 legitimate_constant_pool_address_p (rtx x)
2429 {
2430   return (TARGET_TOC
2431           && GET_CODE (x) == PLUS
2432           && GET_CODE (XEXP (x, 0)) == REG
2433           && (TARGET_MINIMAL_TOC || REGNO (XEXP (x, 0)) == TOC_REGISTER)
2434           && constant_pool_expr_p (XEXP (x, 1)));
2435 }
2436
2437 static bool
2438 legitimate_small_data_p (enum machine_mode mode, rtx x)
2439 {
2440   return (DEFAULT_ABI == ABI_V4
2441           && !flag_pic && !TARGET_TOC
2442           && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
2443           && small_data_operand (x, mode));
2444 }
2445
2446 /* SPE offset addressing is limited to 5-bits worth of double words.  */
2447 #define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
2448
2449 bool
2450 rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
2451 {
2452   unsigned HOST_WIDE_INT offset, extra;
2453
2454   if (GET_CODE (x) != PLUS)
2455     return false;
2456   if (GET_CODE (XEXP (x, 0)) != REG)
2457     return false;
2458   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
2459     return false;
2460   if (legitimate_constant_pool_address_p (x))
2461     return true;
2462   if (GET_CODE (XEXP (x, 1)) != CONST_INT)
2463     return false;
2464
2465   offset = INTVAL (XEXP (x, 1));
2466   extra = 0;
2467   switch (mode)
2468     {
2469     case V16QImode:
2470     case V8HImode:
2471     case V4SFmode:
2472     case V4SImode:
2473       /* AltiVec vector modes.  Only reg+reg addressing is valid here,
2474          which leaves the only valid constant offset of zero, which by
2475          canonicalization rules is also invalid.  */
2476       return false;
2477
2478     case V4HImode:
2479     case V2SImode:
2480     case V1DImode:
2481     case V2SFmode:
2482       /* SPE vector modes.  */
2483       return SPE_CONST_OFFSET_OK (offset);
2484
2485     case DFmode:
2486       if (TARGET_E500_DOUBLE)
2487         return SPE_CONST_OFFSET_OK (offset);
2488
2489     case DImode:
2490       /* On e500v2, we may have:
2491
2492            (subreg:DF (mem:DI (plus (reg) (const_int))) 0).
2493
2494          Which gets addressed with evldd instructions.  */
2495       if (TARGET_E500_DOUBLE)
2496         return SPE_CONST_OFFSET_OK (offset);
2497
2498       if (mode == DFmode || !TARGET_POWERPC64)
2499         extra = 4;
2500       else if (offset & 3)
2501         return false;
2502       break;
2503
2504     case TFmode:
2505     case TImode:
2506       if (mode == TFmode || !TARGET_POWERPC64)
2507         extra = 12;
2508       else if (offset & 3)
2509         return false;
2510       else
2511         extra = 8;
2512       break;
2513
2514     default:
2515       break;
2516     }
2517
2518   offset += 0x8000;
2519   return (offset < 0x10000) && (offset + extra < 0x10000);
2520 }
2521
2522 static bool
2523 legitimate_indexed_address_p (rtx x, int strict)
2524 {
2525   rtx op0, op1;
2526
2527   if (GET_CODE (x) != PLUS)
2528     return false;
2529
2530   op0 = XEXP (x, 0);
2531   op1 = XEXP (x, 1);
2532
2533   if (!REG_P (op0) || !REG_P (op1))
2534     return false;
2535
2536   return ((INT_REG_OK_FOR_BASE_P (op0, strict)
2537            && INT_REG_OK_FOR_INDEX_P (op1, strict))
2538           || (INT_REG_OK_FOR_BASE_P (op1, strict)
2539               && INT_REG_OK_FOR_INDEX_P (op0, strict)));
2540 }
2541
2542 inline bool
2543 legitimate_indirect_address_p (rtx x, int strict)
2544 {
2545   return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
2546 }
2547
2548 bool
2549 macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
2550 {
2551   if (!TARGET_MACHO || !flag_pic
2552       || mode != SImode || GET_CODE (x) != MEM)
2553     return false;
2554   x = XEXP (x, 0);
2555
2556   if (GET_CODE (x) != LO_SUM)
2557     return false;
2558   if (GET_CODE (XEXP (x, 0)) != REG)
2559     return false;
2560   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
2561     return false;
2562   x = XEXP (x, 1);
2563
2564   return CONSTANT_P (x);
2565 }
2566
2567 static bool
2568 legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
2569 {
2570   if (GET_CODE (x) != LO_SUM)
2571     return false;
2572   if (GET_CODE (XEXP (x, 0)) != REG)
2573     return false;
2574   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
2575     return false;
2576   /* Restrict addressing for DI because of our SUBREG hackery.  */
2577   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == DImode))
2578     return false;
2579   x = XEXP (x, 1);
2580
2581   if (TARGET_ELF || TARGET_MACHO)
2582     {
2583       if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
2584         return false;
2585       if (TARGET_TOC)
2586         return false;
2587       if (GET_MODE_NUNITS (mode) != 1)
2588         return false;
2589       if (GET_MODE_BITSIZE (mode) > 64
2590           || (GET_MODE_BITSIZE (mode) > 32 && !TARGET_POWERPC64
2591               && !(TARGET_HARD_FLOAT && TARGET_FPRS && mode == DFmode)))
2592         return false;
2593
2594       return CONSTANT_P (x);
2595     }
2596
2597   return false;
2598 }
2599
2600
2601 /* Try machine-dependent ways of modifying an illegitimate address
2602    to be legitimate.  If we find one, return the new, valid address.
2603    This is used from only one place: `memory_address' in explow.c.
2604
2605    OLDX is the address as it was before break_out_memory_refs was
2606    called.  In some cases it is useful to look at this to decide what
2607    needs to be done.
2608
2609    MODE is passed so that this function can use GO_IF_LEGITIMATE_ADDRESS.
2610
2611    It is always safe for this function to do nothing.  It exists to
2612    recognize opportunities to optimize the output.
2613
2614    On RS/6000, first check for the sum of a register with a constant
2615    integer that is out of range.  If so, generate code to add the
2616    constant with the low-order 16 bits masked to the register and force
2617    this result into another register (this can be done with `cau').
2618    Then generate an address of REG+(CONST&0xffff), allowing for the
2619    possibility of bit 16 being a one.
2620
2621    Then check for the sum of a register and something not constant, try to
2622    load the other things into a register and return the sum.  */
2623
2624 rtx
2625 rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
2626                            enum machine_mode mode)
2627 {
2628   if (GET_CODE (x) == SYMBOL_REF)
2629     {
2630       enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
2631       if (model != 0)
2632         return rs6000_legitimize_tls_address (x, model);
2633     }
2634
2635   if (GET_CODE (x) == PLUS
2636       && GET_CODE (XEXP (x, 0)) == REG
2637       && GET_CODE (XEXP (x, 1)) == CONST_INT
2638       && (unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000) >= 0x10000)
2639     {
2640       HOST_WIDE_INT high_int, low_int;
2641       rtx sum;
2642       low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
2643       high_int = INTVAL (XEXP (x, 1)) - low_int;
2644       sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
2645                                          GEN_INT (high_int)), 0);
2646       return gen_rtx_PLUS (Pmode, sum, GEN_INT (low_int));
2647     }
2648   else if (GET_CODE (x) == PLUS
2649            && GET_CODE (XEXP (x, 0)) == REG
2650            && GET_CODE (XEXP (x, 1)) != CONST_INT
2651            && GET_MODE_NUNITS (mode) == 1
2652            && ((TARGET_HARD_FLOAT && TARGET_FPRS)
2653                || TARGET_POWERPC64
2654                || (((mode != DImode && mode != DFmode) || TARGET_E500_DOUBLE)
2655                    && mode != TFmode))
2656            && (TARGET_POWERPC64 || mode != DImode)
2657            && mode != TImode)
2658     {
2659       return gen_rtx_PLUS (Pmode, XEXP (x, 0),
2660                            force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
2661     }
2662   else if (ALTIVEC_VECTOR_MODE (mode))
2663     {
2664       rtx reg;
2665
2666       /* Make sure both operands are registers.  */
2667       if (GET_CODE (x) == PLUS)
2668         return gen_rtx_PLUS (Pmode, force_reg (Pmode, XEXP (x, 0)),
2669                              force_reg (Pmode, XEXP (x, 1)));
2670
2671       reg = force_reg (Pmode, x);
2672       return reg;
2673     }
2674   else if (SPE_VECTOR_MODE (mode)
2675            || (TARGET_E500_DOUBLE && (mode == DFmode
2676                                       || mode == DImode)))
2677     {
2678       if (mode == DImode)
2679         return NULL_RTX;
2680       /* We accept [reg + reg] and [reg + OFFSET].  */
2681
2682       if (GET_CODE (x) == PLUS)
2683         {
2684           rtx op1 = XEXP (x, 0);
2685           rtx op2 = XEXP (x, 1);
2686
2687           op1 = force_reg (Pmode, op1);
2688
2689           if (GET_CODE (op2) != REG
2690               && (GET_CODE (op2) != CONST_INT
2691                   || !SPE_CONST_OFFSET_OK (INTVAL (op2))))
2692             op2 = force_reg (Pmode, op2);
2693
2694           return gen_rtx_PLUS (Pmode, op1, op2);
2695         }
2696
2697       return force_reg (Pmode, x);
2698     }
2699   else if (TARGET_ELF
2700            && TARGET_32BIT
2701            && TARGET_NO_TOC
2702            && ! flag_pic
2703            && GET_CODE (x) != CONST_INT
2704            && GET_CODE (x) != CONST_DOUBLE
2705            && CONSTANT_P (x)
2706            && GET_MODE_NUNITS (mode) == 1
2707            && (GET_MODE_BITSIZE (mode) <= 32
2708                || ((TARGET_HARD_FLOAT && TARGET_FPRS) && mode == DFmode)))
2709     {
2710       rtx reg = gen_reg_rtx (Pmode);
2711       emit_insn (gen_elf_high (reg, x));
2712       return gen_rtx_LO_SUM (Pmode, reg, x);
2713     }
2714   else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
2715            && ! flag_pic
2716 #if TARGET_MACHO
2717            && ! MACHO_DYNAMIC_NO_PIC_P
2718 #endif
2719            && GET_CODE (x) != CONST_INT
2720            && GET_CODE (x) != CONST_DOUBLE
2721            && CONSTANT_P (x)
2722            && ((TARGET_HARD_FLOAT && TARGET_FPRS) || mode != DFmode)
2723            && mode != DImode
2724            && mode != TImode)
2725     {
2726       rtx reg = gen_reg_rtx (Pmode);
2727       emit_insn (gen_macho_high (reg, x));
2728       return gen_rtx_LO_SUM (Pmode, reg, x);
2729     }
2730   else if (TARGET_TOC
2731            && constant_pool_expr_p (x)
2732            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
2733     {
2734       return create_TOC_reference (x);
2735     }
2736   else
2737     return NULL_RTX;
2738 }
2739
2740 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
2741    We need to emit DTP-relative relocations.  */
2742
2743 static void
2744 rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
2745 {
2746   switch (size)
2747     {
2748     case 4:
2749       fputs ("\t.long\t", file);
2750       break;
2751     case 8:
2752       fputs (DOUBLE_INT_ASM_OP, file);
2753       break;
2754     default:
2755       gcc_unreachable ();
2756     }
2757   output_addr_const (file, x);
2758   fputs ("@dtprel+0x8000", file);
2759 }
2760
2761 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
2762
2763 static GTY(()) rtx rs6000_tls_symbol;
2764 static rtx
2765 rs6000_tls_get_addr (void)
2766 {
2767   if (!rs6000_tls_symbol)
2768     rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
2769
2770   return rs6000_tls_symbol;
2771 }
2772
2773 /* Construct the SYMBOL_REF for TLS GOT references.  */
2774
2775 static GTY(()) rtx rs6000_got_symbol;
2776 static rtx
2777 rs6000_got_sym (void)
2778 {
2779   if (!rs6000_got_symbol)
2780     {
2781       rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
2782       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
2783       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
2784     }
2785
2786   return rs6000_got_symbol;
2787 }
2788
2789 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
2790    this (thread-local) address.  */
2791
2792 static rtx
2793 rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
2794 {
2795   rtx dest, insn;
2796
2797   dest = gen_reg_rtx (Pmode);
2798   if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
2799     {
2800       rtx tlsreg;
2801
2802       if (TARGET_64BIT)
2803         {
2804           tlsreg = gen_rtx_REG (Pmode, 13);
2805           insn = gen_tls_tprel_64 (dest, tlsreg, addr);
2806         }
2807       else
2808         {
2809           tlsreg = gen_rtx_REG (Pmode, 2);
2810           insn = gen_tls_tprel_32 (dest, tlsreg, addr);
2811         }
2812       emit_insn (insn);
2813     }
2814   else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
2815     {
2816       rtx tlsreg, tmp;
2817
2818       tmp = gen_reg_rtx (Pmode);
2819       if (TARGET_64BIT)
2820         {
2821           tlsreg = gen_rtx_REG (Pmode, 13);
2822           insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
2823         }
2824       else
2825         {
2826           tlsreg = gen_rtx_REG (Pmode, 2);
2827           insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
2828         }
2829       emit_insn (insn);
2830       if (TARGET_64BIT)
2831         insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
2832       else
2833         insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
2834       emit_insn (insn);
2835     }
2836   else
2837     {
2838       rtx r3, got, tga, tmp1, tmp2, eqv;
2839
2840       if (TARGET_64BIT)
2841         got = gen_rtx_REG (Pmode, TOC_REGISTER);
2842       else
2843         {
2844           if (flag_pic == 1)
2845             got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
2846           else
2847             {
2848               rtx gsym = rs6000_got_sym ();
2849               got = gen_reg_rtx (Pmode);
2850               if (flag_pic == 0)
2851                 rs6000_emit_move (got, gsym, Pmode);
2852               else
2853                 {
2854                   rtx tempLR, tmp3, mem;
2855                   rtx first, last;
2856
2857                   tempLR = gen_reg_rtx (Pmode);
2858                   tmp1 = gen_reg_rtx (Pmode);
2859                   tmp2 = gen_reg_rtx (Pmode);
2860                   tmp3 = gen_reg_rtx (Pmode);
2861                   mem = gen_const_mem (Pmode, tmp1);
2862
2863                   first = emit_insn (gen_load_toc_v4_PIC_1b (tempLR, gsym));
2864                   emit_move_insn (tmp1, tempLR);
2865                   emit_move_insn (tmp2, mem);
2866                   emit_insn (gen_addsi3 (tmp3, tmp1, tmp2));
2867                   last = emit_move_insn (got, tmp3);
2868                   REG_NOTES (last) = gen_rtx_EXPR_LIST (REG_EQUAL, gsym,
2869                                                         REG_NOTES (last));
2870                   REG_NOTES (first) = gen_rtx_INSN_LIST (REG_LIBCALL, last,
2871                                                          REG_NOTES (first));
2872                   REG_NOTES (last) = gen_rtx_INSN_LIST (REG_RETVAL, first,
2873                                                         REG_NOTES (last));
2874                 }
2875             }
2876         }
2877
2878       if (model == TLS_MODEL_GLOBAL_DYNAMIC)
2879         {
2880           r3 = gen_rtx_REG (Pmode, 3);
2881           if (TARGET_64BIT)
2882             insn = gen_tls_gd_64 (r3, got, addr);
2883           else
2884             insn = gen_tls_gd_32 (r3, got, addr);
2885           start_sequence ();
2886           emit_insn (insn);
2887           tga = gen_rtx_MEM (Pmode, rs6000_tls_get_addr ());
2888           insn = gen_call_value (r3, tga, const0_rtx, const0_rtx);
2889           insn = emit_call_insn (insn);
2890           CONST_OR_PURE_CALL_P (insn) = 1;
2891           use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
2892           insn = get_insns ();
2893           end_sequence ();
2894           emit_libcall_block (insn, dest, r3, addr);
2895         }
2896       else if (model == TLS_MODEL_LOCAL_DYNAMIC)
2897         {
2898           r3 = gen_rtx_REG (Pmode, 3);
2899           if (TARGET_64BIT)
2900             insn = gen_tls_ld_64 (r3, got);
2901           else
2902             insn = gen_tls_ld_32 (r3, got);
2903           start_sequence ();
2904           emit_insn (insn);
2905           tga = gen_rtx_MEM (Pmode, rs6000_tls_get_addr ());
2906           insn = gen_call_value (r3, tga, const0_rtx, const0_rtx);
2907           insn = emit_call_insn (insn);
2908           CONST_OR_PURE_CALL_P (insn) = 1;
2909           use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
2910           insn = get_insns ();
2911           end_sequence ();
2912           tmp1 = gen_reg_rtx (Pmode);
2913           eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
2914                                 UNSPEC_TLSLD);
2915           emit_libcall_block (insn, tmp1, r3, eqv);
2916           if (rs6000_tls_size == 16)
2917             {
2918               if (TARGET_64BIT)
2919                 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
2920               else
2921                 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
2922             }
2923           else if (rs6000_tls_size == 32)
2924             {
2925               tmp2 = gen_reg_rtx (Pmode);
2926               if (TARGET_64BIT)
2927                 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
2928               else
2929                 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
2930               emit_insn (insn);
2931               if (TARGET_64BIT)
2932                 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
2933               else
2934                 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
2935             }
2936           else
2937             {
2938               tmp2 = gen_reg_rtx (Pmode);
2939               if (TARGET_64BIT)
2940                 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
2941               else
2942                 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
2943               emit_insn (insn);
2944               insn = gen_rtx_SET (Pmode, dest,
2945                                   gen_rtx_PLUS (Pmode, tmp2, tmp1));
2946             }
2947           emit_insn (insn);
2948         }
2949       else
2950         {
2951           /* IE, or 64 bit offset LE.  */
2952           tmp2 = gen_reg_rtx (Pmode);
2953           if (TARGET_64BIT)
2954             insn = gen_tls_got_tprel_64 (tmp2, got, addr);
2955           else
2956             insn = gen_tls_got_tprel_32 (tmp2, got, addr);
2957           emit_insn (insn);
2958           if (TARGET_64BIT)
2959             insn = gen_tls_tls_64 (dest, tmp2, addr);
2960           else
2961             insn = gen_tls_tls_32 (dest, tmp2, addr);
2962           emit_insn (insn);
2963         }
2964     }
2965
2966   return dest;
2967 }
2968
2969 /* Return 1 if X contains a thread-local symbol.  */
2970
2971 bool
2972 rs6000_tls_referenced_p (rtx x)
2973 {
2974   if (! TARGET_HAVE_TLS)
2975     return false;
2976
2977   return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
2978 }
2979
2980 /* Return 1 if *X is a thread-local symbol.  This is the same as
2981    rs6000_tls_symbol_ref except for the type of the unused argument.  */
2982
2983 static int
2984 rs6000_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
2985 {
2986   return RS6000_SYMBOL_REF_TLS_P (*x);
2987 }
2988
2989 /* The convention appears to be to define this wherever it is used.
2990    With legitimize_reload_address now defined here, REG_MODE_OK_FOR_BASE_P
2991    is now used here.  */
2992 #ifndef REG_MODE_OK_FOR_BASE_P
2993 #define REG_MODE_OK_FOR_BASE_P(REGNO, MODE) REG_OK_FOR_BASE_P (REGNO)
2994 #endif
2995
2996 /* Our implementation of LEGITIMIZE_RELOAD_ADDRESS.  Returns a value to
2997    replace the input X, or the original X if no replacement is called for.
2998    The output parameter *WIN is 1 if the calling macro should goto WIN,
2999    0 if it should not.
3000
3001    For RS/6000, we wish to handle large displacements off a base
3002    register by splitting the addend across an addiu/addis and the mem insn.
3003    This cuts number of extra insns needed from 3 to 1.
3004
3005    On Darwin, we use this to generate code for floating point constants.
3006    A movsf_low is generated so we wind up with 2 instructions rather than 3.
3007    The Darwin code is inside #if TARGET_MACHO because only then is
3008    machopic_function_base_name() defined.  */
3009 rtx
3010 rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
3011                                   int opnum, int type,
3012                                   int ind_levels ATTRIBUTE_UNUSED, int *win)
3013 {
3014   /* We must recognize output that we have already generated ourselves.  */
3015   if (GET_CODE (x) == PLUS
3016       && GET_CODE (XEXP (x, 0)) == PLUS
3017       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
3018       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3019       && GET_CODE (XEXP (x, 1)) == CONST_INT)
3020     {
3021       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3022                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3023                    opnum, (enum reload_type)type);
3024       *win = 1;
3025       return x;
3026     }
3027
3028 #if TARGET_MACHO
3029   if (DEFAULT_ABI == ABI_DARWIN && flag_pic
3030       && GET_CODE (x) == LO_SUM
3031       && GET_CODE (XEXP (x, 0)) == PLUS
3032       && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
3033       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
3034       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 0)) == CONST
3035       && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
3036       && GET_CODE (XEXP (XEXP (x, 1), 0)) == MINUS
3037       && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 0)) == SYMBOL_REF
3038       && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 1)) == SYMBOL_REF)
3039     {
3040       /* Result of previous invocation of this function on Darwin
3041          floating point constant.  */
3042       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3043                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
3044                    opnum, (enum reload_type)type);
3045       *win = 1;
3046       return x;
3047     }
3048 #endif
3049
3050   /* Force ld/std non-word aligned offset into base register by wrapping
3051      in offset 0.  */
3052   if (GET_CODE (x) == PLUS
3053       && GET_CODE (XEXP (x, 0)) == REG
3054       && REGNO (XEXP (x, 0)) < 32
3055       && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
3056       && GET_CODE (XEXP (x, 1)) == CONST_INT
3057       && (INTVAL (XEXP (x, 1)) & 3) != 0
3058       && !ALTIVEC_VECTOR_MODE (mode)
3059       && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
3060       && TARGET_POWERPC64)
3061     {
3062       x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
3063       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3064                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3065                    opnum, (enum reload_type) type);
3066       *win = 1;
3067       return x;
3068     }
3069
3070   if (GET_CODE (x) == PLUS
3071       && GET_CODE (XEXP (x, 0)) == REG
3072       && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
3073       && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
3074       && GET_CODE (XEXP (x, 1)) == CONST_INT
3075       && !SPE_VECTOR_MODE (mode)
3076       && !(TARGET_E500_DOUBLE && (mode == DFmode
3077                                   || mode == DImode))
3078       && !ALTIVEC_VECTOR_MODE (mode))
3079     {
3080       HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
3081       HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
3082       HOST_WIDE_INT high
3083         = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
3084
3085       /* Check for 32-bit overflow.  */
3086       if (high + low != val)
3087         {
3088           *win = 0;
3089           return x;
3090         }
3091
3092       /* Reload the high part into a base reg; leave the low part
3093          in the mem directly.  */
3094
3095       x = gen_rtx_PLUS (GET_MODE (x),
3096                         gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
3097                                       GEN_INT (high)),
3098                         GEN_INT (low));
3099
3100       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3101                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3102                    opnum, (enum reload_type)type);
3103       *win = 1;
3104       return x;
3105     }
3106
3107 #if TARGET_MACHO
3108   if (GET_CODE (x) == SYMBOL_REF
3109       && DEFAULT_ABI == ABI_DARWIN
3110       && !ALTIVEC_VECTOR_MODE (mode)
3111       && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
3112       /* Don't do this for TFmode, since the result isn't offsettable.
3113          The same goes for DImode without 64-bit gprs.  */
3114       && mode != TFmode
3115       && (mode != DImode || TARGET_POWERPC64))
3116     {
3117       if (flag_pic)
3118         {
3119           rtx offset = gen_rtx_CONST (Pmode,
3120                          gen_rtx_MINUS (Pmode, x,
3121                                         machopic_function_base_sym ()));
3122           x = gen_rtx_LO_SUM (GET_MODE (x),
3123                 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
3124                   gen_rtx_HIGH (Pmode, offset)), offset);
3125         }
3126       else
3127         x = gen_rtx_LO_SUM (GET_MODE (x),
3128               gen_rtx_HIGH (Pmode, x), x);
3129
3130       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3131                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
3132                    opnum, (enum reload_type)type);
3133       *win = 1;
3134       return x;
3135     }
3136 #endif
3137
3138   if (TARGET_TOC
3139       && constant_pool_expr_p (x)
3140       && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
3141     {
3142       (x) = create_TOC_reference (x);
3143       *win = 1;
3144       return x;
3145     }
3146   *win = 0;
3147   return x;
3148 }
3149
3150 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
3151    that is a valid memory address for an instruction.
3152    The MODE argument is the machine mode for the MEM expression
3153    that wants to use this address.
3154
3155    On the RS/6000, there are four valid address: a SYMBOL_REF that
3156    refers to a constant pool entry of an address (or the sum of it
3157    plus a constant), a short (16-bit signed) constant plus a register,
3158    the sum of two registers, or a register indirect, possibly with an
3159    auto-increment.  For DFmode and DImode with a constant plus register,
3160    we must ensure that both words are addressable or PowerPC64 with offset
3161    word aligned.
3162
3163    For modes spanning multiple registers (DFmode in 32-bit GPRs,
3164    32-bit DImode, TImode, TFmode), indexed addressing cannot be used because
3165    adjacent memory cells are accessed by adding word-sized offsets
3166    during assembly output.  */
3167 int
3168 rs6000_legitimate_address (enum machine_mode mode, rtx x, int reg_ok_strict)
3169 {
3170   /* If this is an unaligned stvx/ldvx type address, discard the outer AND.  */
3171   if (TARGET_ALTIVEC
3172       && ALTIVEC_VECTOR_MODE (mode)
3173       && GET_CODE (x) == AND
3174       && GET_CODE (XEXP (x, 1)) == CONST_INT
3175       && INTVAL (XEXP (x, 1)) == -16)
3176     x = XEXP (x, 0);
3177
3178   if (RS6000_SYMBOL_REF_TLS_P (x))
3179     return 0;
3180   if (legitimate_indirect_address_p (x, reg_ok_strict))
3181     return 1;
3182   if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
3183       && !ALTIVEC_VECTOR_MODE (mode)
3184       && !SPE_VECTOR_MODE (mode)
3185       /* Restrict addressing for DI because of our SUBREG hackery.  */
3186       && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == DImode))
3187       && TARGET_UPDATE
3188       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
3189     return 1;
3190   if (legitimate_small_data_p (mode, x))
3191     return 1;
3192   if (legitimate_constant_pool_address_p (x))
3193     return 1;
3194   /* If not REG_OK_STRICT (before reload) let pass any stack offset.  */
3195   if (! reg_ok_strict
3196       && GET_CODE (x) == PLUS
3197       && GET_CODE (XEXP (x, 0)) == REG
3198       && (XEXP (x, 0) == virtual_stack_vars_rtx
3199           || XEXP (x, 0) == arg_pointer_rtx)
3200       && GET_CODE (XEXP (x, 1)) == CONST_INT)
3201     return 1;
3202   if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
3203     return 1;
3204   if (mode != TImode
3205       && mode != TFmode
3206       && ((TARGET_HARD_FLOAT && TARGET_FPRS)
3207           || TARGET_POWERPC64
3208           || ((mode != DFmode || TARGET_E500_DOUBLE) && mode != TFmode))
3209       && (TARGET_POWERPC64 || mode != DImode)
3210       && legitimate_indexed_address_p (x, reg_ok_strict))
3211     return 1;
3212   if (legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
3213     return 1;
3214   return 0;
3215 }
3216
3217 /* Go to LABEL if ADDR (a legitimate address expression)
3218    has an effect that depends on the machine mode it is used for.
3219
3220    On the RS/6000 this is true of all integral offsets (since AltiVec
3221    modes don't allow them) or is a pre-increment or decrement.
3222
3223    ??? Except that due to conceptual problems in offsettable_address_p
3224    we can't really report the problems of integral offsets.  So leave
3225    this assuming that the adjustable offset must be valid for the
3226    sub-words of a TFmode operand, which is what we had before.  */
3227
3228 bool
3229 rs6000_mode_dependent_address (rtx addr)
3230 {
3231   switch (GET_CODE (addr))
3232     {
3233     case PLUS:
3234       if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
3235         {
3236           unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
3237           return val + 12 + 0x8000 >= 0x10000;
3238         }
3239       break;
3240
3241     case LO_SUM:
3242       return true;
3243
3244     case PRE_INC:
3245     case PRE_DEC:
3246       return TARGET_UPDATE;
3247
3248     default:
3249       break;
3250     }
3251
3252   return false;
3253 }
3254
3255 /* Return number of consecutive hard regs needed starting at reg REGNO
3256    to hold something of mode MODE.
3257    This is ordinarily the length in words of a value of mode MODE
3258    but can be less for certain modes in special long registers.
3259
3260    For the SPE, GPRs are 64 bits but only 32 bits are visible in
3261    scalar instructions.  The upper 32 bits are only available to the
3262    SIMD instructions.
3263
3264    POWER and PowerPC GPRs hold 32 bits worth;
3265    PowerPC64 GPRs and FPRs point register holds 64 bits worth.  */
3266
3267 int
3268 rs6000_hard_regno_nregs (int regno, enum machine_mode mode)
3269 {
3270   if (FP_REGNO_P (regno))
3271     return (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
3272
3273   if (TARGET_E500_DOUBLE && mode == DFmode)
3274     return 1;
3275
3276   if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
3277     return (GET_MODE_SIZE (mode) + UNITS_PER_SPE_WORD - 1) / UNITS_PER_SPE_WORD;
3278
3279   if (ALTIVEC_REGNO_P (regno))
3280     return
3281       (GET_MODE_SIZE (mode) + UNITS_PER_ALTIVEC_WORD - 1) / UNITS_PER_ALTIVEC_WORD;
3282
3283   return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3284 }
3285
3286 /* Change register usage conditional on target flags.  */
3287 void
3288 rs6000_conditional_register_usage (void)
3289 {
3290   int i;
3291
3292   /* Set MQ register fixed (already call_used) if not POWER
3293      architecture (RIOS1, RIOS2, RSC, and PPC601) so that it will not
3294      be allocated.  */
3295   if (! TARGET_POWER)
3296     fixed_regs[64] = 1;
3297
3298   /* 64-bit AIX and Linux reserve GPR13 for thread-private data.  */
3299   if (TARGET_64BIT)
3300     fixed_regs[13] = call_used_regs[13]
3301       = call_really_used_regs[13] = 1;
3302
3303   /* Conditionally disable FPRs.  */
3304   if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
3305     for (i = 32; i < 64; i++)
3306       fixed_regs[i] = call_used_regs[i]
3307         = call_really_used_regs[i] = 1;
3308
3309   /* The TOC register is not killed across calls in a way that is
3310      visible to the compiler.  */
3311   if (DEFAULT_ABI == ABI_AIX)
3312     call_really_used_regs[2] = 0;
3313
3314   if (DEFAULT_ABI == ABI_V4
3315       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
3316       && flag_pic == 2)
3317     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3318
3319   if (DEFAULT_ABI == ABI_V4
3320       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
3321       && flag_pic == 1)
3322     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3323       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3324       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3325
3326   if (DEFAULT_ABI == ABI_DARWIN
3327       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
3328       fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3329       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3330       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3331
3332   if (TARGET_TOC && TARGET_MINIMAL_TOC)
3333     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3334       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3335
3336   if (TARGET_ALTIVEC)
3337     global_regs[VSCR_REGNO] = 1;
3338
3339   if (TARGET_SPE)
3340     {
3341       global_regs[SPEFSCR_REGNO] = 1;
3342       fixed_regs[FIXED_SCRATCH]
3343         = call_used_regs[FIXED_SCRATCH]
3344         = call_really_used_regs[FIXED_SCRATCH] = 1;
3345     }
3346
3347   if (! TARGET_ALTIVEC)
3348     {
3349       for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
3350         fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
3351       call_really_used_regs[VRSAVE_REGNO] = 1;
3352     }
3353
3354   if (TARGET_ALTIVEC_ABI)
3355     for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
3356       call_used_regs[i] = call_really_used_regs[i] = 1;
3357 }
3358 \f
3359 /* Try to output insns to set TARGET equal to the constant C if it can
3360    be done in less than N insns.  Do all computations in MODE.
3361    Returns the place where the output has been placed if it can be
3362    done and the insns have been emitted.  If it would take more than N
3363    insns, zero is returned and no insns and emitted.  */
3364
3365 rtx
3366 rs6000_emit_set_const (rtx dest, enum machine_mode mode,
3367                        rtx source, int n ATTRIBUTE_UNUSED)
3368 {
3369   rtx result, insn, set;
3370   HOST_WIDE_INT c0, c1;
3371
3372   switch (mode)
3373     {
3374       case  QImode:
3375     case HImode:
3376       if (dest == NULL)
3377         dest = gen_reg_rtx (mode);
3378       emit_insn (gen_rtx_SET (VOIDmode, dest, source));
3379       return dest;
3380       
3381     case SImode:
3382       result = no_new_pseudos ? dest : gen_reg_rtx (SImode);
3383       
3384       emit_insn (gen_rtx_SET (VOIDmode, result,
3385                               GEN_INT (INTVAL (source)
3386                                        & (~ (HOST_WIDE_INT) 0xffff))));
3387       emit_insn (gen_rtx_SET (VOIDmode, dest,
3388                               gen_rtx_IOR (SImode, result,
3389                                            GEN_INT (INTVAL (source) & 0xffff))));
3390       result = dest;
3391       break;
3392
3393     case DImode:
3394       switch (GET_CODE (source))
3395         {
3396         case CONST_INT:
3397           c0 = INTVAL (source);
3398           c1 = -(c0 < 0);
3399           break;
3400           
3401         case CONST_DOUBLE:
3402 #if HOST_BITS_PER_WIDE_INT >= 64
3403           c0 = CONST_DOUBLE_LOW (source);
3404           c1 = -(c0 < 0);
3405 #else
3406           c0 = CONST_DOUBLE_LOW (source);
3407           c1 = CONST_DOUBLE_HIGH (source);
3408 #endif
3409           break;
3410
3411         default:
3412           gcc_unreachable ();
3413         }
3414
3415       result = rs6000_emit_set_long_const (dest, c0, c1);
3416       break;
3417
3418     default:
3419       gcc_unreachable ();
3420     }
3421
3422   insn = get_last_insn ();
3423   set = single_set (insn);
3424   if (! CONSTANT_P (SET_SRC (set)))
3425     set_unique_reg_note (insn, REG_EQUAL, source);
3426
3427   return result;
3428 }
3429
3430 /* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
3431    fall back to a straight forward decomposition.  We do this to avoid
3432    exponential run times encountered when looking for longer sequences
3433    with rs6000_emit_set_const.  */
3434 static rtx
3435 rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
3436 {
3437   if (!TARGET_POWERPC64)
3438     {
3439       rtx operand1, operand2;
3440
3441       operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
3442                                         DImode);
3443       operand2 = operand_subword_force (dest, WORDS_BIG_ENDIAN != 0,
3444                                         DImode);
3445       emit_move_insn (operand1, GEN_INT (c1));
3446       emit_move_insn (operand2, GEN_INT (c2));
3447     }
3448   else
3449     {
3450       HOST_WIDE_INT ud1, ud2, ud3, ud4;
3451
3452       ud1 = c1 & 0xffff;
3453       ud2 = (c1 & 0xffff0000) >> 16;
3454 #if HOST_BITS_PER_WIDE_INT >= 64
3455       c2 = c1 >> 32;
3456 #endif
3457       ud3 = c2 & 0xffff;
3458       ud4 = (c2 & 0xffff0000) >> 16;
3459
3460       if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
3461           || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
3462         {
3463           if (ud1 & 0x8000)
3464             emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) -  0x8000)));
3465           else
3466             emit_move_insn (dest, GEN_INT (ud1));
3467         }
3468
3469       else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
3470                || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
3471         {
3472           if (ud2 & 0x8000)
3473             emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
3474                                            - 0x80000000));
3475           else
3476             emit_move_insn (dest, GEN_INT (ud2 << 16));
3477           if (ud1 != 0)
3478             emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
3479         }
3480       else if ((ud4 == 0xffff && (ud3 & 0x8000))
3481                || (ud4 == 0 && ! (ud3 & 0x8000)))
3482         {
3483           if (ud3 & 0x8000)
3484             emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
3485                                            - 0x80000000));
3486           else
3487             emit_move_insn (dest, GEN_INT (ud3 << 16));
3488
3489           if (ud2 != 0)
3490             emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud2)));
3491           emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (16)));
3492           if (ud1 != 0)
3493             emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
3494         }
3495       else
3496         {
3497           if (ud4 & 0x8000)
3498             emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
3499                                            - 0x80000000));
3500           else
3501             emit_move_insn (dest, GEN_INT (ud4 << 16));
3502
3503           if (ud3 != 0)
3504             emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud3)));
3505
3506           emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (32)));
3507           if (ud2 != 0)
3508             emit_move_insn (dest, gen_rtx_IOR (DImode, dest,
3509                                                GEN_INT (ud2 << 16)));
3510           if (ud1 != 0)
3511             emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
3512         }
3513     }
3514   return dest;
3515 }
3516
3517 /* Helper for the following.  Get rid of [r+r] memory refs
3518    in cases where it won't work (TImode, TFmode).  */
3519
3520 static void
3521 rs6000_eliminate_indexed_memrefs (rtx operands[2])
3522 {
3523   if (GET_CODE (operands[0]) == MEM
3524       && GET_CODE (XEXP (operands[0], 0)) != REG
3525       && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0))
3526       && ! reload_in_progress)
3527     operands[0]
3528       = replace_equiv_address (operands[0],
3529                                copy_addr_to_reg (XEXP (operands[0], 0)));
3530
3531   if (GET_CODE (operands[1]) == MEM
3532       && GET_CODE (XEXP (operands[1], 0)) != REG
3533       && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0))
3534       && ! reload_in_progress)
3535     operands[1]
3536       = replace_equiv_address (operands[1],
3537                                copy_addr_to_reg (XEXP (operands[1], 0)));
3538 }
3539
3540 /* Emit a move from SOURCE to DEST in mode MODE.  */
3541 void
3542 rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
3543 {
3544   rtx operands[2];
3545   operands[0] = dest;
3546   operands[1] = source;
3547
3548   /* Sanity checks.  Check that we get CONST_DOUBLE only when we should.  */
3549   if (GET_CODE (operands[1]) == CONST_DOUBLE
3550       && ! FLOAT_MODE_P (mode)
3551       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
3552     {
3553       /* FIXME.  This should never happen.  */
3554       /* Since it seems that it does, do the safe thing and convert
3555          to a CONST_INT.  */
3556       operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
3557     }
3558   gcc_assert (GET_CODE (operands[1]) != CONST_DOUBLE
3559               || FLOAT_MODE_P (mode)
3560               || ((CONST_DOUBLE_HIGH (operands[1]) != 0
3561                    || CONST_DOUBLE_LOW (operands[1]) < 0)
3562                   && (CONST_DOUBLE_HIGH (operands[1]) != -1
3563                       || CONST_DOUBLE_LOW (operands[1]) >= 0)));
3564   
3565   /* Check if GCC is setting up a block move that will end up using FP
3566      registers as temporaries.  We must make sure this is acceptable.  */
3567   if (GET_CODE (operands[0]) == MEM
3568       && GET_CODE (operands[1]) == MEM
3569       && mode == DImode
3570       && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
3571           || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
3572       && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
3573                                             ? 32 : MEM_ALIGN (operands[0])))
3574             || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
3575                                                ? 32
3576                                                : MEM_ALIGN (operands[1]))))
3577       && ! MEM_VOLATILE_P (operands [0])
3578       && ! MEM_VOLATILE_P (operands [1]))
3579     {
3580       emit_move_insn (adjust_address (operands[0], SImode, 0),
3581                       adjust_address (operands[1], SImode, 0));
3582       emit_move_insn (adjust_address (operands[0], SImode, 4),
3583                       adjust_address (operands[1], SImode, 4));
3584       return;
3585     }
3586
3587   if (!no_new_pseudos && GET_CODE (operands[0]) == MEM
3588       && !gpc_reg_operand (operands[1], mode))
3589     operands[1] = force_reg (mode, operands[1]);
3590
3591   if (mode == SFmode && ! TARGET_POWERPC
3592       && TARGET_HARD_FLOAT && TARGET_FPRS
3593       && GET_CODE (operands[0]) == MEM)
3594     {
3595       int regnum;
3596
3597       if (reload_in_progress || reload_completed)
3598         regnum = true_regnum (operands[1]);
3599       else if (GET_CODE (operands[1]) == REG)
3600         regnum = REGNO (operands[1]);
3601       else
3602         regnum = -1;
3603
3604       /* If operands[1] is a register, on POWER it may have
3605          double-precision data in it, so truncate it to single
3606          precision.  */
3607       if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
3608         {
3609           rtx newreg;
3610           newreg = (no_new_pseudos ? operands[1] : gen_reg_rtx (mode));
3611           emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
3612           operands[1] = newreg;
3613         }
3614     }
3615
3616   /* Recognize the case where operand[1] is a reference to thread-local
3617      data and load its address to a register.  */
3618   if (rs6000_tls_referenced_p (operands[1]))
3619     {
3620       enum tls_model model;
3621       rtx tmp = operands[1];
3622       rtx addend = NULL;
3623
3624       if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
3625         {
3626           addend = XEXP (XEXP (tmp, 0), 1);
3627           tmp = XEXP (XEXP (tmp, 0), 0);
3628         }
3629
3630       gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
3631       model = SYMBOL_REF_TLS_MODEL (tmp);
3632       gcc_assert (model != 0);
3633
3634       tmp = rs6000_legitimize_tls_address (tmp, model);
3635       if (addend)
3636         {
3637           tmp = gen_rtx_PLUS (mode, tmp, addend);
3638           tmp = force_operand (tmp, operands[0]);
3639         }
3640       operands[1] = tmp;
3641     }
3642
3643   /* Handle the case where reload calls us with an invalid address.  */
3644   if (reload_in_progress && mode == Pmode
3645       && (! general_operand (operands[1], mode)
3646           || ! nonimmediate_operand (operands[0], mode)))
3647     goto emit_set;
3648
3649   /* 128-bit constant floating-point values on Darwin should really be
3650      loaded as two parts.  */
3651   if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
3652       && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128
3653       && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
3654     {
3655       /* DImode is used, not DFmode, because simplify_gen_subreg doesn't
3656          know how to get a DFmode SUBREG of a TFmode.  */
3657       rs6000_emit_move (simplify_gen_subreg (DImode, operands[0], mode, 0),
3658                         simplify_gen_subreg (DImode, operands[1], mode, 0),
3659                         DImode);
3660       rs6000_emit_move (simplify_gen_subreg (DImode, operands[0], mode,
3661                                              GET_MODE_SIZE (DImode)),
3662                         simplify_gen_subreg (DImode, operands[1], mode,
3663                                              GET_MODE_SIZE (DImode)),
3664                         DImode);
3665       return;
3666     }
3667
3668   /* FIXME:  In the long term, this switch statement should go away
3669      and be replaced by a sequence of tests based on things like
3670      mode == Pmode.  */
3671   switch (mode)
3672     {
3673     case HImode:
3674     case QImode:
3675       if (CONSTANT_P (operands[1])
3676           && GET_CODE (operands[1]) != CONST_INT)
3677         operands[1] = force_const_mem (mode, operands[1]);
3678       break;
3679
3680     case TFmode:
3681       rs6000_eliminate_indexed_memrefs (operands);
3682       /* fall through */
3683
3684     case DFmode:
3685     case SFmode:
3686       if (CONSTANT_P (operands[1])
3687           && ! easy_fp_constant (operands[1], mode))
3688         operands[1] = force_const_mem (mode, operands[1]);
3689       break;
3690
3691     case V16QImode:
3692     case V8HImode:
3693     case V4SFmode:
3694     case V4SImode:
3695     case V4HImode:
3696     case V2SFmode:
3697     case V2SImode:
3698     case V1DImode:
3699       if (CONSTANT_P (operands[1])
3700           && !easy_vector_constant (operands[1], mode))
3701         operands[1] = force_const_mem (mode, operands[1]);
3702       break;
3703
3704     case SImode:
3705     case DImode:
3706       /* Use default pattern for address of ELF small data */
3707       if (TARGET_ELF
3708           && mode == Pmode
3709           && DEFAULT_ABI == ABI_V4
3710           && (GET_CODE (operands[1]) == SYMBOL_REF
3711               || GET_CODE (operands[1]) == CONST)
3712           && small_data_operand (operands[1], mode))
3713         {
3714           emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
3715           return;
3716         }
3717
3718       if (DEFAULT_ABI == ABI_V4
3719           && mode == Pmode && mode == SImode
3720           && flag_pic == 1 && got_operand (operands[1], mode))
3721         {
3722           emit_insn (gen_movsi_got (operands[0], operands[1]));
3723           return;
3724         }
3725
3726       if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
3727           && TARGET_NO_TOC
3728           && ! flag_pic
3729           && mode == Pmode
3730           && CONSTANT_P (operands[1])
3731           && GET_CODE (operands[1]) != HIGH
3732           && GET_CODE (operands[1]) != CONST_INT)
3733         {
3734           rtx target = (no_new_pseudos ? operands[0] : gen_reg_rtx (mode));
3735
3736           /* If this is a function address on -mcall-aixdesc,
3737              convert it to the address of the descriptor.  */
3738           if (DEFAULT_ABI == ABI_AIX
3739               && GET_CODE (operands[1]) == SYMBOL_REF
3740               && XSTR (operands[1], 0)[0] == '.')
3741             {
3742               const char *name = XSTR (operands[1], 0);
3743               rtx new_ref;
3744               while (*name == '.')
3745                 name++;
3746               new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
3747               CONSTANT_POOL_ADDRESS_P (new_ref)
3748                 = CONSTANT_POOL_ADDRESS_P (operands[1]);
3749               SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
3750               SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
3751               SYMBOL_REF_DECL (new_ref) = SYMBOL_REF_DECL (operands[1]);
3752               operands[1] = new_ref;
3753             }
3754
3755           if (DEFAULT_ABI == ABI_DARWIN)
3756             {
3757 #if TARGET_MACHO
3758               if (MACHO_DYNAMIC_NO_PIC_P)
3759                 {
3760                   /* Take care of any required data indirection.  */
3761                   operands[1] = rs6000_machopic_legitimize_pic_address (
3762                                   operands[1], mode, operands[0]);
3763                   if (operands[0] != operands[1])
3764                     emit_insn (gen_rtx_SET (VOIDmode,
3765                                             operands[0], operands[1]));
3766                   return;
3767                 }
3768 #endif
3769               emit_insn (gen_macho_high (target, operands[1]));
3770               emit_insn (gen_macho_low (operands[0], target, operands[1]));
3771               return;
3772             }
3773
3774           emit_insn (gen_elf_high (target, operands[1]));
3775           emit_insn (gen_elf_low (operands[0], target, operands[1]));
3776           return;
3777         }
3778
3779       /* If this is a SYMBOL_REF that refers to a constant pool entry,
3780          and we have put it in the TOC, we just need to make a TOC-relative
3781          reference to it.  */
3782       if (TARGET_TOC
3783           && GET_CODE (operands[1]) == SYMBOL_REF
3784           && constant_pool_expr_p (operands[1])
3785           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
3786                                               get_pool_mode (operands[1])))
3787         {
3788           operands[1] = create_TOC_reference (operands[1]);
3789         }
3790       else if (mode == Pmode
3791                && CONSTANT_P (operands[1])
3792                && ((GET_CODE (operands[1]) != CONST_INT
3793                     && ! easy_fp_constant (operands[1], mode))
3794                    || (GET_CODE (operands[1]) == CONST_INT
3795                        && num_insns_constant (operands[1], mode) > 2)
3796                    || (GET_CODE (operands[0]) == REG
3797                        && FP_REGNO_P (REGNO (operands[0]))))
3798                && GET_CODE (operands[1]) != HIGH
3799                && ! legitimate_constant_pool_address_p (operands[1])
3800                && ! toc_relative_expr_p (operands[1]))
3801         {
3802           /* Emit a USE operation so that the constant isn't deleted if
3803              expensive optimizations are turned on because nobody
3804              references it.  This should only be done for operands that
3805              contain SYMBOL_REFs with CONSTANT_POOL_ADDRESS_P set.
3806              This should not be done for operands that contain LABEL_REFs.
3807              For now, we just handle the obvious case.  */
3808           if (GET_CODE (operands[1]) != LABEL_REF)
3809             emit_insn (gen_rtx_USE (VOIDmode, operands[1]));
3810
3811 #if TARGET_MACHO
3812           /* Darwin uses a special PIC legitimizer.  */
3813           if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
3814             {
3815               operands[1] =
3816                 rs6000_machopic_legitimize_pic_address (operands[1], mode,
3817                                                         operands[0]);
3818               if (operands[0] != operands[1])
3819                 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
3820               return;
3821             }
3822 #endif
3823
3824           /* If we are to limit the number of things we put in the TOC and
3825              this is a symbol plus a constant we can add in one insn,
3826              just put the symbol in the TOC and add the constant.  Don't do
3827              this if reload is in progress.  */
3828           if (GET_CODE (operands[1]) == CONST
3829               && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
3830               && GET_CODE (XEXP (operands[1], 0)) == PLUS
3831               && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
3832               && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
3833                   || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
3834               && ! side_effects_p (operands[0]))
3835             {
3836               rtx sym =
3837                 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
3838               rtx other = XEXP (XEXP (operands[1], 0), 1);
3839
3840               sym = force_reg (mode, sym);
3841               if (mode == SImode)
3842                 emit_insn (gen_addsi3 (operands[0], sym, other));
3843               else
3844                 emit_insn (gen_adddi3 (operands[0], sym, other));
3845               return;
3846             }
3847
3848           operands[1] = force_const_mem (mode, operands[1]);
3849
3850           if (TARGET_TOC
3851               && constant_pool_expr_p (XEXP (operands[1], 0))
3852               && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
3853                         get_pool_constant (XEXP (operands[1], 0)),
3854                         get_pool_mode (XEXP (operands[1], 0))))
3855             {
3856               operands[1]
3857                 = gen_const_mem (mode,
3858                                  create_TOC_reference (XEXP (operands[1], 0)));
3859               set_mem_alias_set (operands[1], get_TOC_alias_set ());
3860             }
3861         }
3862       break;
3863
3864     case TImode:
3865       rs6000_eliminate_indexed_memrefs (operands);
3866
3867       if (TARGET_POWER)
3868         {
3869           emit_insn (gen_rtx_PARALLEL (VOIDmode,
3870                        gen_rtvec (2,
3871                                   gen_rtx_SET (VOIDmode,
3872                                                operands[0], operands[1]),
3873                                   gen_rtx_CLOBBER (VOIDmode,
3874                                                    gen_rtx_SCRATCH (SImode)))));
3875           return;
3876         }
3877       break;
3878
3879     default:
3880       gcc_unreachable ();
3881     }
3882
3883   /* Above, we may have called force_const_mem which may have returned
3884      an invalid address.  If we can, fix this up; otherwise, reload will
3885      have to deal with it.  */
3886   if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
3887     operands[1] = validize_mem (operands[1]);
3888
3889  emit_set:
3890   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
3891 }
3892 \f
3893 /* Nonzero if we can use a floating-point register to pass this arg.  */
3894 #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE)         \
3895   (GET_MODE_CLASS (MODE) == MODE_FLOAT          \
3896    && (CUM)->fregno <= FP_ARG_MAX_REG           \
3897    && TARGET_HARD_FLOAT && TARGET_FPRS)
3898
3899 /* Nonzero if we can use an AltiVec register to pass this arg.  */
3900 #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE,NAMED)      \
3901   (ALTIVEC_VECTOR_MODE (MODE)                           \
3902    && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG              \
3903    && TARGET_ALTIVEC_ABI                                \
3904    && (NAMED))
3905
3906 /* Return a nonzero value to say to return the function value in
3907    memory, just as large structures are always returned.  TYPE will be
3908    the data type of the value, and FNTYPE will be the type of the
3909    function doing the returning, or @code{NULL} for libcalls.
3910
3911    The AIX ABI for the RS/6000 specifies that all structures are
3912    returned in memory.  The Darwin ABI does the same.  The SVR4 ABI
3913    specifies that structures <= 8 bytes are returned in r3/r4, but a
3914    draft put them in memory, and GCC used to implement the draft
3915    instead of the final standard.  Therefore, aix_struct_return
3916    controls this instead of DEFAULT_ABI; V.4 targets needing backward
3917    compatibility can change DRAFT_V4_STRUCT_RET to override the
3918    default, and -m switches get the final word.  See
3919    rs6000_override_options for more details.
3920
3921    The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
3922    long double support is enabled.  These values are returned in memory.
3923
3924    int_size_in_bytes returns -1 for variable size objects, which go in
3925    memory always.  The cast to unsigned makes -1 > 8.  */
3926
3927 static bool
3928 rs6000_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
3929 {
3930   /* In the darwin64 abi, try to use registers for larger structs
3931      if possible.  */
3932   if (rs6000_darwin64_abi
3933       && TREE_CODE (type) == RECORD_TYPE
3934       && int_size_in_bytes (type) > 0)
3935     {
3936       CUMULATIVE_ARGS valcum;
3937       rtx valret;
3938
3939       valcum.words = 0;
3940       valcum.fregno = FP_ARG_MIN_REG;
3941       valcum.vregno = ALTIVEC_ARG_MIN_REG;
3942       /* Do a trial code generation as if this were going to be passed
3943          as an argument; if any part goes in memory, we return NULL.  */
3944       valret = rs6000_darwin64_record_arg (&valcum, type, 1, true);
3945       if (valret)
3946         return false;
3947       /* Otherwise fall through to more conventional ABI rules.  */
3948     }
3949
3950   if (AGGREGATE_TYPE_P (type)
3951       && (aix_struct_return
3952           || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
3953     return true;
3954
3955   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
3956      modes only exist for GCC vector types if -maltivec.  */
3957   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
3958       && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
3959     return false;
3960
3961   /* Return synthetic vectors in memory.  */
3962   if (TREE_CODE (type) == VECTOR_TYPE
3963       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
3964     {
3965       static bool warned_for_return_big_vectors = false;
3966       if (!warned_for_return_big_vectors)
3967         {
3968           warning (0, "GCC vector returned by reference: "
3969                    "non-standard ABI extension with no compatibility guarantee");
3970           warned_for_return_big_vectors = true;
3971         }
3972       return true;
3973     }
3974
3975   if (DEFAULT_ABI == ABI_V4 && TYPE_MODE (type) == TFmode)
3976     return true;
3977
3978   return false;
3979 }
3980
3981 /* Initialize a variable CUM of type CUMULATIVE_ARGS
3982    for a call to a function whose data type is FNTYPE.
3983    For a library call, FNTYPE is 0.
3984
3985    For incoming args we set the number of arguments in the prototype large
3986    so we never return a PARALLEL.  */
3987
3988 void
3989 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
3990                       rtx libname ATTRIBUTE_UNUSED, int incoming,
3991                       int libcall, int n_named_args)
3992 {
3993   static CUMULATIVE_ARGS zero_cumulative;
3994
3995   *cum = zero_cumulative;
3996   cum->words = 0;
3997   cum->fregno = FP_ARG_MIN_REG;
3998   cum->vregno = ALTIVEC_ARG_MIN_REG;
3999   cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
4000   cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
4001                       ? CALL_LIBCALL : CALL_NORMAL);
4002   cum->sysv_gregno = GP_ARG_MIN_REG;
4003   cum->stdarg = fntype
4004     && (TYPE_ARG_TYPES (fntype) != 0
4005         && (TREE_VALUE (tree_last  (TYPE_ARG_TYPES (fntype)))
4006             != void_type_node));
4007
4008   cum->nargs_prototype = 0;
4009   if (incoming || cum->prototype)
4010     cum->nargs_prototype = n_named_args;
4011
4012   /* Check for a longcall attribute.  */
4013   if ((!fntype && rs6000_default_long_calls)
4014       || (fntype
4015           && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
4016           && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
4017     cum->call_cookie |= CALL_LONG;
4018
4019   if (TARGET_DEBUG_ARG)
4020     {
4021       fprintf (stderr, "\ninit_cumulative_args:");
4022       if (fntype)
4023         {
4024           tree ret_type = TREE_TYPE (fntype);
4025           fprintf (stderr, " ret code = %s,",
4026                    tree_code_name[ (int)TREE_CODE (ret_type) ]);
4027         }
4028
4029       if (cum->call_cookie & CALL_LONG)
4030         fprintf (stderr, " longcall,");
4031
4032       fprintf (stderr, " proto = %d, nargs = %d\n",
4033                cum->prototype, cum->nargs_prototype);
4034     }
4035
4036   if (fntype
4037       && !TARGET_ALTIVEC
4038       && TARGET_ALTIVEC_ABI
4039       && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
4040     {
4041       error ("Cannot return value in vector register because"
4042              " altivec instructions are disabled, use -maltivec"
4043              " to enable them.");
4044     }
4045 }
4046 \f
4047 /* Return true if TYPE must be passed on the stack and not in registers.  */
4048
4049 static bool
4050 rs6000_must_pass_in_stack (enum machine_mode mode, tree type)
4051 {
4052   if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT)
4053     return must_pass_in_stack_var_size (mode, type);
4054   else
4055     return must_pass_in_stack_var_size_or_pad (mode, type);
4056 }
4057
4058 /* If defined, a C expression which determines whether, and in which
4059    direction, to pad out an argument with extra space.  The value
4060    should be of type `enum direction': either `upward' to pad above
4061    the argument, `downward' to pad below, or `none' to inhibit
4062    padding.
4063
4064    For the AIX ABI structs are always stored left shifted in their
4065    argument slot.  */
4066
4067 enum direction
4068 function_arg_padding (enum machine_mode mode, tree type)
4069 {
4070 #ifndef AGGREGATE_PADDING_FIXED
4071 #define AGGREGATE_PADDING_FIXED 0
4072 #endif
4073 #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
4074 #define AGGREGATES_PAD_UPWARD_ALWAYS 0
4075 #endif
4076
4077   if (!AGGREGATE_PADDING_FIXED)
4078     {
4079       /* GCC used to pass structures of the same size as integer types as
4080          if they were in fact integers, ignoring FUNCTION_ARG_PADDING.
4081          i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
4082          passed padded downward, except that -mstrict-align further
4083          muddied the water in that multi-component structures of 2 and 4
4084          bytes in size were passed padded upward.
4085
4086          The following arranges for best compatibility with previous
4087          versions of gcc, but removes the -mstrict-align dependency.  */
4088       if (BYTES_BIG_ENDIAN)
4089         {
4090           HOST_WIDE_INT size = 0;
4091
4092           if (mode == BLKmode)
4093             {
4094               if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
4095                 size = int_size_in_bytes (type);
4096             }
4097           else
4098             size = GET_MODE_SIZE (mode);
4099
4100           if (size == 1 || size == 2 || size == 4)
4101             return downward;
4102         }
4103       return upward;
4104     }
4105
4106   if (AGGREGATES_PAD_UPWARD_ALWAYS)
4107     {
4108       if (type != 0 && AGGREGATE_TYPE_P (type))
4109         return upward;
4110     }
4111
4112   /* Fall back to the default.  */
4113   return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
4114 }
4115
4116 /* If defined, a C expression that gives the alignment boundary, in bits,
4117    of an argument with the specified mode and type.  If it is not defined,
4118    PARM_BOUNDARY is used for all arguments.
4119
4120    V.4 wants long longs to be double word aligned.
4121    Doubleword align SPE vectors.
4122    Quadword align Altivec vectors.
4123    Quadword align large synthetic vector types.   */
4124
4125 int
4126 function_arg_boundary (enum machine_mode mode, tree type)
4127 {
4128   if (DEFAULT_ABI == ABI_V4 && GET_MODE_SIZE (mode) == 8)
4129     return 64;
4130   else if (SPE_VECTOR_MODE (mode)
4131            || (type && TREE_CODE (type) == VECTOR_TYPE
4132                && int_size_in_bytes (type) >= 8
4133                && int_size_in_bytes (type) < 16))
4134     return 64;
4135   else if (ALTIVEC_VECTOR_MODE (mode)
4136            || (type && TREE_CODE (type) == VECTOR_TYPE
4137                && int_size_in_bytes (type) >= 16))
4138     return 128;
4139   else if (rs6000_darwin64_abi && mode == BLKmode
4140            && type && TYPE_ALIGN (type) > 64)
4141     return 128;
4142   else
4143     return PARM_BOUNDARY;
4144 }
4145
4146 /* For a function parm of MODE and TYPE, return the starting word in
4147    the parameter area.  NWORDS of the parameter area are already used.  */
4148
4149 static unsigned int
4150 rs6000_parm_start (enum machine_mode mode, tree type, unsigned int nwords)
4151 {
4152   unsigned int align;
4153   unsigned int parm_offset;
4154
4155   align = function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
4156   parm_offset = DEFAULT_ABI == ABI_V4 ? 2 : 6;
4157   return nwords + (-(parm_offset + nwords) & align);
4158 }
4159
4160 /* Compute the size (in words) of a function argument.  */
4161
4162 static unsigned long
4163 rs6000_arg_size (enum machine_mode mode, tree type)
4164 {
4165   unsigned long size;
4166
4167   if (mode != BLKmode)
4168     size = GET_MODE_SIZE (mode);
4169   else
4170     size = int_size_in_bytes (type);
4171
4172   if (TARGET_32BIT)
4173     return (size + 3) >> 2;
4174   else
4175     return (size + 7) >> 3;
4176 }
4177 \f
4178 /* Use this to flush pending int fields.  */
4179
4180 static void
4181 rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
4182                                           HOST_WIDE_INT bitpos)
4183 {
4184   unsigned int startbit, endbit;
4185   int intregs, intoffset;
4186   enum machine_mode mode;
4187
4188   if (cum->intoffset == -1)
4189     return;
4190
4191   intoffset = cum->intoffset;
4192   cum->intoffset = -1;
4193
4194   if (intoffset % BITS_PER_WORD != 0)
4195     {
4196       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
4197                             MODE_INT, 0);
4198       if (mode == BLKmode)
4199         {
4200           /* We couldn't find an appropriate mode, which happens,
4201              e.g., in packed structs when there are 3 bytes to load.
4202              Back intoffset back to the beginning of the word in this
4203              case.  */
4204           intoffset = intoffset & -BITS_PER_WORD;
4205         }
4206     }
4207
4208   startbit = intoffset & -BITS_PER_WORD;
4209   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
4210   intregs = (endbit - startbit) / BITS_PER_WORD;
4211   cum->words += intregs;
4212 }
4213
4214 /* The darwin64 ABI calls for us to recurse down through structs,
4215    looking for elements passed in registers.  Unfortunately, we have
4216    to track int register count here also because of misalignments
4217    in powerpc alignment mode.  */
4218
4219 static void
4220 rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
4221                                             tree type,
4222                                             HOST_WIDE_INT startbitpos)
4223 {
4224   tree f;
4225
4226   for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
4227     if (TREE_CODE (f) == FIELD_DECL)
4228       {
4229         HOST_WIDE_INT bitpos = startbitpos;
4230         tree ftype = TREE_TYPE (f);
4231         enum machine_mode mode = TYPE_MODE (ftype);
4232
4233         if (DECL_SIZE (f) != 0
4234             && host_integerp (bit_position (f), 1))
4235           bitpos += int_bit_position (f);
4236
4237         /* ??? FIXME: else assume zero offset.  */
4238
4239         if (TREE_CODE (ftype) == RECORD_TYPE)
4240           rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
4241         else if (USE_FP_FOR_ARG_P (cum, mode, ftype))
4242           {
4243             rs6000_darwin64_record_arg_advance_flush (cum, bitpos);
4244             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
4245             cum->words += (GET_MODE_SIZE (mode) + 7) >> 3;
4246           }
4247         else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, 1))
4248           {
4249             rs6000_darwin64_record_arg_advance_flush (cum, bitpos);
4250             cum->vregno++;
4251             cum->words += 2;
4252           }
4253         else if (cum->intoffset == -1)
4254           cum->intoffset = bitpos;
4255       }
4256 }
4257
4258 /* Update the data in CUM to advance over an argument
4259    of mode MODE and data type TYPE.
4260    (TYPE is null for libcalls where that information may not be available.)
4261
4262    Note that for args passed by reference, function_arg will be called
4263    with MODE and TYPE set to that of the pointer to the arg, not the arg
4264    itself.  */
4265
4266 void
4267 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4268                       tree type, int named, int depth)
4269 {
4270   int size;
4271
4272   /* Only tick off an argument if we're not recursing.  */
4273   if (depth == 0)
4274     cum->nargs_prototype--;
4275
4276   if (TARGET_ALTIVEC_ABI
4277       && (ALTIVEC_VECTOR_MODE (mode)
4278           || (type && TREE_CODE (type) == VECTOR_TYPE
4279               && int_size_in_bytes (type) == 16)))
4280     {
4281       bool stack = false;
4282
4283       if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
4284         {
4285           cum->vregno++;
4286           if (!TARGET_ALTIVEC)
4287             error ("Cannot pass argument in vector register because"
4288                    " altivec instructions are disabled, use -maltivec"
4289                    " to enable them.");
4290
4291           /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
4292              even if it is going to be passed in a vector register.
4293              Darwin does the same for variable-argument functions.  */
4294           if ((DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
4295               || (cum->stdarg && DEFAULT_ABI != ABI_V4))
4296             stack = true;
4297         }
4298       else
4299         stack = true;
4300
4301       if (stack)
4302         {
4303           int align;
4304
4305           /* Vector parameters must be 16-byte aligned.  This places
4306              them at 2 mod 4 in terms of words in 32-bit mode, since
4307              the parameter save area starts at offset 24 from the
4308              stack.  In 64-bit mode, they just have to start on an
4309              even word, since the parameter save area is 16-byte
4310              aligned.  Space for GPRs is reserved even if the argument
4311              will be passed in memory.  */
4312           if (TARGET_32BIT)
4313             align = (2 - cum->words) & 3;
4314           else
4315             align = cum->words & 1;
4316           cum->words += align + rs6000_arg_size (mode, type);
4317
4318           if (TARGET_DEBUG_ARG)
4319             {
4320               fprintf (stderr, "function_adv: words = %2d, align=%d, ",
4321                        cum->words, align);
4322               fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
4323                        cum->nargs_prototype, cum->prototype,
4324                        GET_MODE_NAME (mode));
4325             }
4326         }
4327     }
4328   else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
4329            && !cum->stdarg
4330            && cum->sysv_gregno <= GP_ARG_MAX_REG)
4331     cum->sysv_gregno++;
4332
4333   else if (rs6000_darwin64_abi
4334            && mode == BLKmode
4335            && TREE_CODE (type) == RECORD_TYPE
4336            && (size = int_size_in_bytes (type)) > 0)
4337     {
4338       /* Variable sized types have size == -1 and are
4339          treated as if consisting entirely of ints.
4340          Pad to 16 byte boundary if needed.  */
4341       if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
4342           && (cum->words % 2) != 0)
4343         cum->words++;
4344       /* For varargs, we can just go up by the size of the struct. */
4345       if (!named)
4346         cum->words += (size + 7) / 8;
4347       else
4348         {
4349           /* It is tempting to say int register count just goes up by
4350              sizeof(type)/8, but this is wrong in a case such as
4351              { int; double; int; } [powerpc alignment].  We have to
4352              grovel through the fields for these too.  */
4353           cum->intoffset = 0;
4354           rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
4355           rs6000_darwin64_record_arg_advance_flush (cum, 
4356                                                     size * BITS_PER_UNIT);
4357         }
4358     }
4359   else if (DEFAULT_ABI == ABI_V4)
4360     {
4361       if (TARGET_HARD_FLOAT && TARGET_FPRS
4362           && (mode == SFmode || mode == DFmode))
4363         {
4364           if (cum->fregno <= FP_ARG_V4_MAX_REG)
4365             cum->fregno++;
4366           else
4367             {
4368               if (mode == DFmode)
4369                 cum->words += cum->words & 1;
4370               cum->words += rs6000_arg_size (mode, type);
4371             }
4372         }
4373       else
4374         {
4375           int n_words = rs6000_arg_size (mode, type);
4376           int gregno = cum->sysv_gregno;
4377
4378           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
4379              (r7,r8) or (r9,r10).  As does any other 2 word item such
4380              as complex int due to a historical mistake.  */
4381           if (n_words == 2)
4382             gregno += (1 - gregno) & 1;
4383
4384           /* Multi-reg args are not split between registers and stack.  */
4385           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
4386             {
4387               /* Long long and SPE vectors are aligned on the stack.
4388                  So are other 2 word items such as complex int due to
4389                  a historical mistake.  */
4390               if (n_words == 2)
4391                 cum->words += cum->words & 1;
4392               cum->words += n_words;
4393             }
4394
4395           /* Note: continuing to accumulate gregno past when we've started
4396              spilling to the stack indicates the fact that we've started
4397              spilling to the stack to expand_builtin_saveregs.  */
4398           cum->sysv_gregno = gregno + n_words;
4399         }
4400
4401       if (TARGET_DEBUG_ARG)
4402         {
4403           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
4404                    cum->words, cum->fregno);
4405           fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
4406                    cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
4407           fprintf (stderr, "mode = %4s, named = %d\n",
4408                    GET_MODE_NAME (mode), named);
4409         }
4410     }
4411   else
4412     {
4413       int n_words = rs6000_arg_size (mode, type);
4414       int start_words = cum->words;
4415       int align_words = rs6000_parm_start (mode, type, start_words);
4416
4417       cum->words = align_words + n_words;
4418
4419       if (GET_MODE_CLASS (mode) == MODE_FLOAT
4420           && TARGET_HARD_FLOAT && TARGET_FPRS)
4421         cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
4422
4423       if (TARGET_DEBUG_ARG)
4424         {
4425           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
4426                    cum->words, cum->fregno);
4427           fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
4428                    cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
4429           fprintf (stderr, "named = %d, align = %d, depth = %d\n",
4430                    named, align_words - start_words, depth);
4431         }
4432     }
4433 }
4434
4435 static rtx
4436 spe_build_register_parallel (enum machine_mode mode, int gregno)
4437 {
4438   rtx r1, r3;
4439
4440   switch (mode)
4441     {
4442     case DFmode:
4443       r1 = gen_rtx_REG (DImode, gregno);
4444       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
4445       return gen_rtx_PARALLEL (mode, gen_rtvec (1, r1));
4446
4447     case DCmode:
4448       r1 = gen_rtx_REG (DImode, gregno);
4449       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
4450       r3 = gen_rtx_REG (DImode, gregno + 2);
4451       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
4452       return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r3));
4453
4454     default:
4455       gcc_unreachable ();
4456     }
4457 }
4458
4459 /* Determine where to put a SIMD argument on the SPE.  */
4460 static rtx
4461 rs6000_spe_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4462                          tree type)
4463 {
4464   int gregno = cum->sysv_gregno;
4465
4466   /* On E500 v2, double arithmetic is done on the full 64-bit GPR, but
4467      are passed and returned in a pair of GPRs for ABI compatibility.  */
4468   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == DCmode))
4469     {
4470       int n_words = rs6000_arg_size (mode, type);
4471
4472       /* Doubles go in an odd/even register pair (r5/r6, etc).  */
4473       if (mode == DFmode)
4474         gregno += (1 - gregno) & 1;
4475
4476       /* Multi-reg args are not split between registers and stack.  */
4477       if (gregno + n_words - 1 > GP_ARG_MAX_REG)
4478         return NULL_RTX;
4479
4480       return spe_build_register_parallel (mode, gregno);
4481     }
4482   if (cum->stdarg)
4483     {
4484       int n_words = rs6000_arg_size (mode, type);
4485
4486       /* SPE vectors are put in odd registers.  */
4487       if (n_words == 2 && (gregno & 1) == 0)
4488         gregno += 1;
4489
4490       if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
4491         {
4492           rtx r1, r2;
4493           enum machine_mode m = SImode;
4494
4495           r1 = gen_rtx_REG (m, gregno);
4496           r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
4497           r2 = gen_rtx_REG (m, gregno + 1);
4498           r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
4499           return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
4500         }
4501       else
4502         return NULL_RTX;
4503     }
4504   else
4505     {
4506       if (gregno <= GP_ARG_MAX_REG)
4507         return gen_rtx_REG (mode, gregno);
4508       else
4509         return NULL_RTX;
4510     }
4511 }
4512
4513 /* A subroutine of rs6000_darwin64_record_arg.  Assign the bits of the
4514    structure between cum->intoffset and bitpos to integer registers.  */
4515
4516 static void
4517 rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum, 
4518                                   HOST_WIDE_INT bitpos, rtx rvec[], int *k)
4519 {
4520   enum machine_mode mode;
4521   unsigned int regno;
4522   unsigned int startbit, endbit;
4523   int this_regno, intregs, intoffset;
4524   rtx reg;
4525
4526   if (cum->intoffset == -1)
4527     return;
4528
4529   intoffset = cum->intoffset;
4530   cum->intoffset = -1;
4531
4532   /* If this is the trailing part of a word, try to only load that
4533      much into the register.  Otherwise load the whole register.  Note
4534      that in the latter case we may pick up unwanted bits.  It's not a
4535      problem at the moment but may wish to revisit.  */
4536
4537   if (intoffset % BITS_PER_WORD != 0)
4538     {
4539       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
4540                           MODE_INT, 0);
4541       if (mode == BLKmode)
4542         {
4543           /* We couldn't find an appropriate mode, which happens,
4544              e.g., in packed structs when there are 3 bytes to load.
4545              Back intoffset back to the beginning of the word in this
4546              case.  */
4547          intoffset = intoffset & -BITS_PER_WORD;
4548          mode = word_mode;
4549         }
4550     }
4551   else
4552     mode = word_mode;
4553
4554   startbit = intoffset & -BITS_PER_WORD;
4555   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
4556   intregs = (endbit - startbit) / BITS_PER_WORD;
4557   this_regno = cum->words + intoffset / BITS_PER_WORD;
4558
4559   if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
4560     cum->use_stack = 1;
4561     
4562   intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
4563   if (intregs <= 0)
4564     return;
4565
4566   intoffset /= BITS_PER_UNIT;
4567   do
4568     {
4569       regno = GP_ARG_MIN_REG + this_regno;
4570       reg = gen_rtx_REG (mode, regno);
4571       rvec[(*k)++] =
4572         gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
4573
4574       this_regno += 1;
4575       intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
4576       mode = word_mode;
4577       intregs -= 1;
4578     }
4579   while (intregs > 0);
4580 }
4581
4582 /* Recursive workhorse for the following.  */
4583
4584 static void
4585 rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, tree type, 
4586                                     HOST_WIDE_INT startbitpos, rtx rvec[],
4587                                     int *k)
4588 {
4589   tree f;
4590
4591   for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
4592     if (TREE_CODE (f) == FIELD_DECL)
4593       {
4594         HOST_WIDE_INT bitpos = startbitpos;
4595         tree ftype = TREE_TYPE (f);
4596         enum machine_mode mode = TYPE_MODE (ftype);
4597
4598         if (DECL_SIZE (f) != 0
4599             && host_integerp (bit_position (f), 1))
4600           bitpos += int_bit_position (f);
4601
4602         /* ??? FIXME: else assume zero offset.  */
4603
4604         if (TREE_CODE (ftype) == RECORD_TYPE)
4605           rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
4606         else if (cum->named && USE_FP_FOR_ARG_P (cum, mode, ftype))
4607           {
4608 #if 0
4609             switch (mode)
4610               {
4611               case SCmode: mode = SFmode; break;
4612               case DCmode: mode = DFmode; break;
4613               case TCmode: mode = TFmode; break;
4614               default: break;
4615               }
4616 #endif
4617             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
4618             rvec[(*k)++]
4619               = gen_rtx_EXPR_LIST (VOIDmode, 
4620                                    gen_rtx_REG (mode, cum->fregno++),
4621                                    GEN_INT (bitpos / BITS_PER_UNIT));
4622             if (mode == TFmode)
4623               cum->fregno++;
4624           }
4625         else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, ftype, 1))
4626           {
4627             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
4628             rvec[(*k)++]
4629               = gen_rtx_EXPR_LIST (VOIDmode, 
4630                                    gen_rtx_REG (mode, cum->vregno++), 
4631                                    GEN_INT (bitpos / BITS_PER_UNIT));
4632           }
4633         else if (cum->intoffset == -1)
4634           cum->intoffset = bitpos;
4635       }
4636 }
4637
4638 /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
4639    the register(s) to be used for each field and subfield of a struct
4640    being passed by value, along with the offset of where the
4641    register's value may be found in the block.  FP fields go in FP
4642    register, vector fields go in vector registers, and everything
4643    else goes in int registers, packed as in memory.  
4644
4645    This code is also used for function return values.  RETVAL indicates
4646    whether this is the case.
4647
4648    Much of this is taken from the Sparc V9 port, which has a similar
4649    calling convention.  */
4650
4651 static rtx
4652 rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, tree type,
4653                             int named, bool retval)
4654 {
4655   rtx rvec[FIRST_PSEUDO_REGISTER];
4656   int k = 1, kbase = 1;
4657   HOST_WIDE_INT typesize = int_size_in_bytes (type);
4658   /* This is a copy; modifications are not visible to our caller.  */
4659   CUMULATIVE_ARGS copy_cum = *orig_cum;
4660   CUMULATIVE_ARGS *cum = &copy_cum;
4661
4662   /* Pad to 16 byte boundary if needed.  */
4663   if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
4664       && (cum->words % 2) != 0)
4665     cum->words++;
4666
4667   cum->intoffset = 0;
4668   cum->use_stack = 0;
4669   cum->named = named;
4670
4671   /* Put entries into rvec[] for individual FP and vector fields, and
4672      for the chunks of memory that go in int regs.  Note we start at
4673      element 1; 0 is reserved for an indication of using memory, and
4674      may or may not be filled in below. */
4675   rs6000_darwin64_record_arg_recurse (cum, type, 0, rvec, &k);
4676   rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
4677
4678   /* If any part of the struct went on the stack put all of it there.
4679      This hack is because the generic code for
4680      FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
4681      parts of the struct are not at the beginning.  */
4682   if (cum->use_stack)
4683     {
4684       if (retval)
4685         return NULL_RTX;    /* doesn't go in registers at all */
4686       kbase = 0;
4687       rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
4688     }
4689   if (k > 1 || cum->use_stack)
4690     return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
4691   else
4692     return NULL_RTX;
4693 }
4694
4695 /* Determine where to place an argument in 64-bit mode with 32-bit ABI.  */
4696
4697 static rtx
4698 rs6000_mixed_function_arg (enum machine_mode mode, tree type, int align_words)
4699 {
4700   int n_units;
4701   int i, k;
4702   rtx rvec[GP_ARG_NUM_REG + 1];
4703
4704   if (align_words >= GP_ARG_NUM_REG)
4705     return NULL_RTX;
4706
4707   n_units = rs6000_arg_size (mode, type);
4708
4709   /* Optimize the simple case where the arg fits in one gpr, except in
4710      the case of BLKmode due to assign_parms assuming that registers are
4711      BITS_PER_WORD wide.  */
4712   if (n_units == 0
4713       || (n_units == 1 && mode != BLKmode))
4714     return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
4715
4716   k = 0;
4717   if (align_words + n_units > GP_ARG_NUM_REG)
4718     /* Not all of the arg fits in gprs.  Say that it goes in memory too,
4719        using a magic NULL_RTX component.
4720        FIXME: This is not strictly correct.  Only some of the arg
4721        belongs in memory, not all of it.  However, there isn't any way
4722        to do this currently, apart from building rtx descriptions for
4723        the pieces of memory we want stored.  Due to bugs in the generic
4724        code we can't use the normal function_arg_partial_nregs scheme
4725        with the PARALLEL arg description we emit here.
4726        In any case, the code to store the whole arg to memory is often
4727        more efficient than code to store pieces, and we know that space
4728        is available in the right place for the whole arg.  */
4729     /* FIXME: This should be fixed since the conversion to
4730        TARGET_ARG_PARTIAL_BYTES.  */
4731     rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
4732
4733   i = 0;
4734   do
4735     {
4736       rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
4737       rtx off = GEN_INT (i++ * 4);
4738       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
4739     }
4740   while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
4741
4742   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
4743 }
4744
4745 /* Determine where to put an argument to a function.
4746    Value is zero to push the argument on the stack,
4747    or a hard register in which to store the argument.
4748
4749    MODE is the argument's machine mode.
4750    TYPE is the data type of the argument (as a tree).
4751     This is null for libcalls where that information may
4752     not be available.
4753    CUM is a variable of type CUMULATIVE_ARGS which gives info about
4754     the preceding args and about the function being called.  It is
4755     not modified in this routine.
4756    NAMED is nonzero if this argument is a named parameter
4757     (otherwise it is an extra parameter matching an ellipsis).
4758
4759    On RS/6000 the first eight words of non-FP are normally in registers
4760    and the rest are pushed.  Under AIX, the first 13 FP args are in registers.
4761    Under V.4, the first 8 FP args are in registers.
4762
4763    If this is floating-point and no prototype is specified, we use
4764    both an FP and integer register (or possibly FP reg and stack).  Library
4765    functions (when CALL_LIBCALL is set) always have the proper types for args,
4766    so we can pass the FP value just in one register.  emit_library_function
4767    doesn't support PARALLEL anyway.
4768
4769    Note that for args passed by reference, function_arg will be called
4770    with MODE and TYPE set to that of the pointer to the arg, not the arg
4771    itself.  */
4772
4773 rtx
4774 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4775               tree type, int named)
4776 {
4777   enum rs6000_abi abi = DEFAULT_ABI;
4778
4779   /* Return a marker to indicate whether CR1 needs to set or clear the
4780      bit that V.4 uses to say fp args were passed in registers.
4781      Assume that we don't need the marker for software floating point,
4782      or compiler generated library calls.  */
4783   if (mode == VOIDmode)
4784     {
4785       if (abi == ABI_V4
4786           && cum->nargs_prototype < 0
4787           && (cum->call_cookie & CALL_LIBCALL) == 0
4788           && (cum->prototype || TARGET_NO_PROTOTYPE))
4789         {
4790           /* For the SPE, we need to crxor CR6 always.  */
4791           if (TARGET_SPE_ABI)
4792             return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
4793           else if (TARGET_HARD_FLOAT && TARGET_FPRS)
4794             return GEN_INT (cum->call_cookie
4795                             | ((cum->fregno == FP_ARG_MIN_REG)
4796                                ? CALL_V4_SET_FP_ARGS
4797                                : CALL_V4_CLEAR_FP_ARGS));
4798         }
4799
4800       return GEN_INT (cum->call_cookie);
4801     }
4802
4803   if (rs6000_darwin64_abi && mode == BLKmode
4804       && TREE_CODE (type) == RECORD_TYPE)
4805     {
4806       rtx rslt = rs6000_darwin64_record_arg (cum, type, named, false);
4807       if (rslt != NULL_RTX)
4808         return rslt;
4809       /* Else fall through to usual handling.  */
4810     }
4811
4812   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
4813     if (TARGET_64BIT && ! cum->prototype)
4814       {
4815         /* Vector parameters get passed in vector register
4816            and also in GPRs or memory, in absence of prototype.  */
4817         int align_words;
4818         rtx slot;
4819         align_words = (cum->words + 1) & ~1;
4820
4821         if (align_words >= GP_ARG_NUM_REG)
4822           {
4823             slot = NULL_RTX;
4824           }
4825         else
4826           {
4827             slot = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
4828           }
4829         return gen_rtx_PARALLEL (mode,
4830                  gen_rtvec (2,
4831                             gen_rtx_EXPR_LIST (VOIDmode,
4832                                                slot, const0_rtx),
4833                             gen_rtx_EXPR_LIST (VOIDmode,
4834                                                gen_rtx_REG (mode, cum->vregno),
4835                                                const0_rtx)));
4836       }
4837     else
4838       return gen_rtx_REG (mode, cum->vregno);
4839   else if (TARGET_ALTIVEC_ABI
4840            && (ALTIVEC_VECTOR_MODE (mode)
4841                || (type && TREE_CODE (type) == VECTOR_TYPE
4842                    && int_size_in_bytes (type) == 16)))
4843     {
4844       if (named || abi == ABI_V4)
4845         return NULL_RTX;
4846       else
4847         {
4848           /* Vector parameters to varargs functions under AIX or Darwin
4849              get passed in memory and possibly also in GPRs.  */
4850           int align, align_words, n_words;
4851           enum machine_mode part_mode;
4852
4853           /* Vector parameters must be 16-byte aligned.  This places them at
4854              2 mod 4 in terms of words in 32-bit mode, since the parameter
4855              save area starts at offset 24 from the stack.  In 64-bit mode,
4856              they just have to start on an even word, since the parameter
4857              save area is 16-byte aligned.  */
4858           if (TARGET_32BIT)
4859             align = (2 - cum->words) & 3;
4860           else
4861             align = cum->words & 1;
4862           align_words = cum->words + align;
4863
4864           /* Out of registers?  Memory, then.  */
4865           if (align_words >= GP_ARG_NUM_REG)
4866             return NULL_RTX;
4867
4868           if (TARGET_32BIT && TARGET_POWERPC64)
4869             return rs6000_mixed_function_arg (mode, type, align_words);
4870
4871           /* The vector value goes in GPRs.  Only the part of the
4872              value in GPRs is reported here.  */
4873           part_mode = mode;
4874           n_words = rs6000_arg_size (mode, type);
4875           if (align_words + n_words > GP_ARG_NUM_REG)
4876             /* Fortunately, there are only two possibilities, the value
4877                is either wholly in GPRs or half in GPRs and half not.  */
4878             part_mode = DImode;
4879
4880           return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
4881         }
4882     }
4883   else if (TARGET_SPE_ABI && TARGET_SPE
4884            && (SPE_VECTOR_MODE (mode)
4885                || (TARGET_E500_DOUBLE && (mode == DFmode
4886                                           || mode == DCmode))))
4887     return rs6000_spe_function_arg (cum, mode, type);
4888
4889   else if (abi == ABI_V4)
4890     {
4891       if (TARGET_HARD_FLOAT && TARGET_FPRS
4892           && (mode == SFmode || mode == DFmode))
4893         {
4894           if (cum->fregno <= FP_ARG_V4_MAX_REG)
4895             return gen_rtx_REG (mode, cum->fregno);
4896           else
4897             return NULL_RTX;
4898         }
4899       else
4900         {
4901           int n_words = rs6000_arg_size (mode, type);
4902           int gregno = cum->sysv_gregno;
4903
4904           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
4905              (r7,r8) or (r9,r10).  As does any other 2 word item such
4906              as complex int due to a historical mistake.  */
4907           if (n_words == 2)
4908             gregno += (1 - gregno) & 1;
4909
4910           /* Multi-reg args are not split between registers and stack.  */
4911           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
4912             return NULL_RTX;
4913
4914           if (TARGET_32BIT && TARGET_POWERPC64)
4915             return rs6000_mixed_function_arg (mode, type,
4916                                               gregno - GP_ARG_MIN_REG);
4917           return gen_rtx_REG (mode, gregno);
4918         }
4919     }
4920   else
4921     {
4922       int align_words = rs6000_parm_start (mode, type, cum->words);
4923
4924       if (USE_FP_FOR_ARG_P (cum, mode, type))
4925         {
4926           rtx rvec[GP_ARG_NUM_REG + 1];
4927           rtx r;
4928           int k;
4929           bool needs_psave;
4930           enum machine_mode fmode = mode;
4931           unsigned long n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
4932
4933           if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
4934             {
4935               /* Currently, we only ever need one reg here because complex
4936                  doubles are split.  */
4937               gcc_assert (cum->fregno == FP_ARG_MAX_REG && fmode == TFmode);
4938
4939               /* Long double split over regs and memory.  */
4940               fmode = DFmode;
4941             }
4942
4943           /* Do we also need to pass this arg in the parameter save
4944              area?  */
4945           needs_psave = (type
4946                          && (cum->nargs_prototype <= 0
4947                              || (DEFAULT_ABI == ABI_AIX
4948                                  && TARGET_XL_COMPAT
4949                                  && align_words >= GP_ARG_NUM_REG)));
4950
4951           if (!needs_psave && mode == fmode)
4952             return gen_rtx_REG (fmode, cum->fregno);
4953
4954           k = 0;
4955           if (needs_psave)
4956             {
4957               /* Describe the part that goes in gprs or the stack.
4958                  This piece must come first, before the fprs.  */
4959               if (align_words < GP_ARG_NUM_REG)
4960                 {
4961                   unsigned long n_words = rs6000_arg_size (mode, type);
4962
4963                   if (align_words + n_words > GP_ARG_NUM_REG
4964                       || (TARGET_32BIT && TARGET_POWERPC64))
4965                     {
4966                       /* If this is partially on the stack, then we only
4967                          include the portion actually in registers here.  */
4968                       enum machine_mode rmode = TARGET_32BIT ? SImode : DImode;
4969                       rtx off;
4970                       int i=0;
4971                       if (align_words + n_words > GP_ARG_NUM_REG
4972                           && (TARGET_32BIT && TARGET_POWERPC64))
4973                         /* Not all of the arg fits in gprs.  Say that it
4974                            goes in memory too, using a magic NULL_RTX
4975                            component.  Also see comment in
4976                            rs6000_mixed_function_arg for why the normal
4977                            function_arg_partial_nregs scheme doesn't work
4978                            in this case. */
4979                         rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX,
4980                                                        const0_rtx);
4981                       do
4982                         {
4983                           r = gen_rtx_REG (rmode,
4984                                            GP_ARG_MIN_REG + align_words);
4985                           off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
4986                           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
4987                         }
4988                       while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
4989                     }
4990                   else
4991                     {
4992                       /* The whole arg fits in gprs.  */
4993                       r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
4994                       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
4995                     }
4996                 }
4997               else
4998                 /* It's entirely in memory.  */
4999                 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
5000             }
5001
5002           /* Describe where this piece goes in the fprs.  */
5003           r = gen_rtx_REG (fmode, cum->fregno);
5004           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
5005
5006           return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
5007         }
5008       else if (align_words < GP_ARG_NUM_REG)
5009         {
5010           if (TARGET_32BIT && TARGET_POWERPC64)
5011             return rs6000_mixed_function_arg (mode, type, align_words);
5012
5013           if (mode == BLKmode)
5014             mode = Pmode;
5015
5016           return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
5017         }
5018       else
5019         return NULL_RTX;
5020     }
5021 }
5022 \f
5023 /* For an arg passed partly in registers and partly in memory, this is
5024    the number of bytes passed in registers.  For args passed entirely in
5025    registers or entirely in memory, zero.  When an arg is described by a
5026    PARALLEL, perhaps using more than one register type, this function
5027    returns the number of bytes used by the first element of the PARALLEL.  */
5028
5029 static int
5030 rs6000_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5031                           tree type, bool named)
5032 {
5033   int ret = 0;
5034   int align_words;
5035
5036   if (DEFAULT_ABI == ABI_V4)
5037     return 0;
5038
5039   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)
5040       && cum->nargs_prototype >= 0)
5041     return 0;
5042
5043   /* In this complicated case we just disable the partial_nregs code.  */
5044   if (rs6000_darwin64_abi && mode == BLKmode
5045       && TREE_CODE (type) == RECORD_TYPE
5046       && int_size_in_bytes (type) > 0)
5047     return 0;
5048
5049   align_words = rs6000_parm_start (mode, type, cum->words);
5050
5051   if (USE_FP_FOR_ARG_P (cum, mode, type)
5052       /* If we are passing this arg in the fixed parameter save area
5053          (gprs or memory) as well as fprs, then this function should
5054          return the number of bytes passed in the parameter save area
5055          rather than bytes passed in fprs.  */ 
5056       && !(type
5057            && (cum->nargs_prototype <= 0
5058                || (DEFAULT_ABI == ABI_AIX
5059                    && TARGET_XL_COMPAT
5060                    && align_words >= GP_ARG_NUM_REG))))
5061     {
5062       if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3) > FP_ARG_MAX_REG + 1)
5063         ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8;
5064       else if (cum->nargs_prototype >= 0)
5065         return 0;
5066     }
5067
5068   if (align_words < GP_ARG_NUM_REG
5069       && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
5070     ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
5071
5072   if (ret != 0 && TARGET_DEBUG_ARG)
5073     fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
5074
5075   return ret;
5076 }
5077 \f
5078 /* A C expression that indicates when an argument must be passed by
5079    reference.  If nonzero for an argument, a copy of that argument is
5080    made in memory and a pointer to the argument is passed instead of
5081    the argument itself.  The pointer is passed in whatever way is
5082    appropriate for passing a pointer to that type.
5083
5084    Under V.4, aggregates and long double are passed by reference.
5085
5086    As an extension to all 32-bit ABIs, AltiVec vectors are passed by
5087    reference unless the AltiVec vector extension ABI is in force.
5088
5089    As an extension to all ABIs, variable sized types are passed by
5090    reference.  */
5091
5092 static bool
5093 rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5094                           enum machine_mode mode, tree type,
5095                           bool named ATTRIBUTE_UNUSED)
5096 {
5097   if (DEFAULT_ABI == ABI_V4 && mode == TFmode)
5098     {
5099       if (TARGET_DEBUG_ARG)
5100         fprintf (stderr, "function_arg_pass_by_reference: V4 long double\n");
5101       return 1;
5102     }
5103
5104   if (!type)
5105     return 0;
5106
5107   if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
5108     {
5109       if (TARGET_DEBUG_ARG)
5110         fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
5111       return 1;
5112     }
5113
5114   if (int_size_in_bytes (type) < 0)
5115     {
5116       if (TARGET_DEBUG_ARG)
5117         fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
5118       return 1;
5119     }
5120
5121   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
5122      modes only exist for GCC vector types if -maltivec.  */
5123   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
5124     {
5125       if (TARGET_DEBUG_ARG)
5126         fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
5127       return 1;
5128     }
5129
5130   /* Pass synthetic vectors in memory.  */
5131   if (TREE_CODE (type) == VECTOR_TYPE
5132       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
5133     {
5134       static bool warned_for_pass_big_vectors = false;
5135       if (TARGET_DEBUG_ARG)
5136         fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
5137       if (!warned_for_pass_big_vectors)
5138         {
5139           warning (0, "GCC vector passed by reference: "
5140                    "non-standard ABI extension with no compatibility guarantee");
5141           warned_for_pass_big_vectors = true;
5142         }
5143       return 1;
5144     }
5145
5146   return 0;
5147 }
5148
5149 static void
5150 rs6000_move_block_from_reg (int regno, rtx x, int nregs)
5151 {
5152   int i;
5153   enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
5154
5155   if (nregs == 0)
5156     return;
5157
5158   for (i = 0; i < nregs; i++)
5159     {
5160       rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
5161       if (reload_completed)
5162         {
5163           if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
5164             tem = NULL_RTX;
5165           else
5166             tem = simplify_gen_subreg (reg_mode, x, BLKmode,
5167                                        i * GET_MODE_SIZE (reg_mode));
5168         }
5169       else
5170         tem = replace_equiv_address (tem, XEXP (tem, 0));
5171
5172       gcc_assert (tem);
5173
5174       emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
5175     }
5176 }
5177 \f
5178 /* Perform any needed actions needed for a function that is receiving a
5179    variable number of arguments.
5180
5181    CUM is as above.
5182
5183    MODE and TYPE are the mode and type of the current parameter.
5184
5185    PRETEND_SIZE is a variable that should be set to the amount of stack
5186    that must be pushed by the prolog to pretend that our caller pushed
5187    it.
5188
5189    Normally, this macro will push all remaining incoming registers on the
5190    stack and set PRETEND_SIZE to the length of the registers pushed.  */
5191
5192 static void
5193 setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5194                         tree type, int *pretend_size ATTRIBUTE_UNUSED,
5195                         int no_rtl)
5196 {
5197   CUMULATIVE_ARGS next_cum;
5198   int reg_size = TARGET_32BIT ? 4 : 8;
5199   rtx save_area = NULL_RTX, mem;
5200   int first_reg_offset, set;
5201
5202   /* Skip the last named argument.  */
5203   next_cum = *cum;
5204   function_arg_advance (&next_cum, mode, type, 1, 0);
5205
5206   if (DEFAULT_ABI == ABI_V4)
5207     {
5208       if (! no_rtl)
5209         save_area = plus_constant (virtual_stack_vars_rtx,
5210                                    - RS6000_VARARGS_SIZE);
5211
5212       first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
5213     }
5214   else
5215     {
5216       first_reg_offset = next_cum.words;
5217       save_area = virtual_incoming_args_rtx;
5218
5219       if (targetm.calls.must_pass_in_stack (mode, type))
5220         first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
5221     }
5222
5223   set = get_varargs_alias_set ();
5224   if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
5225       && cfun->va_list_gpr_size)
5226     {
5227       int nregs = GP_ARG_NUM_REG - first_reg_offset;
5228
5229       if (va_list_gpr_counter_field)
5230         {
5231           /* V4 va_list_gpr_size counts number of registers needed.  */
5232           if (nregs > cfun->va_list_gpr_size)
5233             nregs = cfun->va_list_gpr_size;
5234         }
5235       else
5236         {
5237           /* char * va_list instead counts number of bytes needed.  */
5238           if (nregs > cfun->va_list_gpr_size / reg_size)
5239             nregs = cfun->va_list_gpr_size / reg_size;
5240         }
5241
5242       mem = gen_rtx_MEM (BLKmode,
5243                          plus_constant (save_area,
5244                                         first_reg_offset * reg_size)),
5245       set_mem_alias_set (mem, set);
5246       set_mem_align (mem, BITS_PER_WORD);
5247
5248       rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
5249                                   nregs);
5250     }
5251
5252   /* Save FP registers if needed.  */
5253   if (DEFAULT_ABI == ABI_V4
5254       && TARGET_HARD_FLOAT && TARGET_FPRS
5255       && ! no_rtl
5256       && next_cum.fregno <= FP_ARG_V4_MAX_REG
5257       && cfun->va_list_fpr_size)
5258     {
5259       int fregno = next_cum.fregno, nregs;
5260       rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
5261       rtx lab = gen_label_rtx ();
5262       int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG) * 8);
5263
5264       emit_jump_insn
5265         (gen_rtx_SET (VOIDmode,
5266                       pc_rtx,
5267                       gen_rtx_IF_THEN_ELSE (VOIDmode,
5268                                             gen_rtx_NE (VOIDmode, cr1,
5269                                                         const0_rtx),
5270                                             gen_rtx_LABEL_REF (VOIDmode, lab),
5271                                             pc_rtx)));
5272
5273       for (nregs = 0;
5274            fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
5275            fregno++, off += 8, nregs++)
5276         {
5277           mem = gen_rtx_MEM (DFmode, plus_constant (save_area, off));
5278           set_mem_alias_set (mem, set);
5279           set_mem_align (mem, GET_MODE_ALIGNMENT (DFmode));
5280           emit_move_insn (mem, gen_rtx_REG (DFmode, fregno));
5281         }
5282
5283       emit_label (lab);
5284     }
5285 }
5286
5287 /* Create the va_list data type.  */
5288
5289 static tree
5290 rs6000_build_builtin_va_list (void)
5291 {
5292   tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
5293
5294   /* For AIX, prefer 'char *' because that's what the system
5295      header files like.  */
5296   if (DEFAULT_ABI != ABI_V4)
5297     return build_pointer_type (char_type_node);
5298
5299   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
5300   type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
5301
5302   f_gpr = build_decl (FIELD_DECL, get_identifier ("gpr"),
5303                       unsigned_char_type_node);
5304   f_fpr = build_decl (FIELD_DECL, get_identifier ("fpr"),
5305                       unsigned_char_type_node);
5306   /* Give the two bytes of padding a name, so that -Wpadded won't warn on
5307      every user file.  */
5308   f_res = build_decl (FIELD_DECL, get_identifier ("reserved"),
5309                       short_unsigned_type_node);
5310   f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
5311                       ptr_type_node);
5312   f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
5313                       ptr_type_node);
5314
5315   va_list_gpr_counter_field = f_gpr;
5316   va_list_fpr_counter_field = f_fpr;
5317
5318   DECL_FIELD_CONTEXT (f_gpr) = record;
5319   DECL_FIELD_CONTEXT (f_fpr) = record;
5320   DECL_FIELD_CONTEXT (f_res) = record;
5321   DECL_FIELD_CONTEXT (f_ovf) = record;
5322   DECL_FIELD_CONTEXT (f_sav) = record;
5323
5324   TREE_CHAIN (record) = type_decl;
5325   TYPE_NAME (record) = type_decl;
5326   TYPE_FIELDS (record) = f_gpr;
5327   TREE_CHAIN (f_gpr) = f_fpr;
5328   TREE_CHAIN (f_fpr) = f_res;
5329   TREE_CHAIN (f_res) = f_ovf;
5330   TREE_CHAIN (f_ovf) = f_sav;
5331
5332   layout_type (record);
5333
5334   /* The correct type is an array type of one element.  */
5335   return build_array_type (record, build_index_type (size_zero_node));
5336 }
5337
5338 /* Implement va_start.  */
5339
5340 void
5341 rs6000_va_start (tree valist, rtx nextarg)
5342 {
5343   HOST_WIDE_INT words, n_gpr, n_fpr;
5344   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
5345   tree gpr, fpr, ovf, sav, t;
5346
5347   /* Only SVR4 needs something special.  */
5348   if (DEFAULT_ABI != ABI_V4)
5349     {
5350       std_expand_builtin_va_start (valist, nextarg);
5351       return;
5352     }
5353
5354   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
5355   f_fpr = TREE_CHAIN (f_gpr);
5356   f_res = TREE_CHAIN (f_fpr);
5357   f_ovf = TREE_CHAIN (f_res);
5358   f_sav = TREE_CHAIN (f_ovf);
5359
5360   valist = build_va_arg_indirect_ref (valist);
5361   gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
5362   fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
5363   ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
5364   sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
5365
5366   /* Count number of gp and fp argument registers used.  */
5367   words = current_function_args_info.words;
5368   n_gpr = MIN (current_function_args_info.sysv_gregno - GP_ARG_MIN_REG,
5369                GP_ARG_NUM_REG);
5370   n_fpr = MIN (current_function_args_info.fregno - FP_ARG_MIN_REG,
5371                FP_ARG_NUM_REG);
5372
5373   if (TARGET_DEBUG_ARG)
5374     fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
5375              HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
5376              words, n_gpr, n_fpr);
5377
5378   if (cfun->va_list_gpr_size)
5379     {
5380       t = build (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
5381                  build_int_cst (NULL_TREE, n_gpr));
5382       TREE_SIDE_EFFECTS (t) = 1;
5383       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5384     }
5385
5386   if (cfun->va_list_fpr_size)
5387     {
5388       t = build (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
5389                  build_int_cst (NULL_TREE, n_fpr));
5390       TREE_SIDE_EFFECTS (t) = 1;
5391       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5392     }
5393
5394   /* Find the overflow area.  */
5395   t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
5396   if (words != 0)
5397     t = build (PLUS_EXPR, TREE_TYPE (ovf), t,
5398                build_int_cst (NULL_TREE, words * UNITS_PER_WORD));
5399   t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
5400   TREE_SIDE_EFFECTS (t) = 1;
5401   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5402
5403   /* If there were no va_arg invocations, don't set up the register
5404      save area.  */
5405   if (!cfun->va_list_gpr_size
5406       && !cfun->va_list_fpr_size
5407       && n_gpr < GP_ARG_NUM_REG
5408       && n_fpr < FP_ARG_V4_MAX_REG)
5409     return;
5410
5411   /* Find the register save area.  */
5412   t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
5413   t = build (PLUS_EXPR, TREE_TYPE (sav), t,
5414              build_int_cst (NULL_TREE, -RS6000_VARARGS_SIZE));
5415   t = build (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
5416   TREE_SIDE_EFFECTS (t) = 1;
5417   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5418 }
5419
5420 /* Implement va_arg.  */
5421
5422 tree
5423 rs6000_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p)
5424 {
5425   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
5426   tree gpr, fpr, ovf, sav, reg, t, u;
5427   int size, rsize, n_reg, sav_ofs, sav_scale;
5428   tree lab_false, lab_over, addr;
5429   int align;
5430   tree ptrtype = build_pointer_type (type);
5431
5432   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
5433     {
5434       t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
5435       return build_va_arg_indirect_ref (t);
5436     }
5437
5438   if (DEFAULT_ABI != ABI_V4)
5439     {
5440       if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
5441         {
5442           tree elem_type = TREE_TYPE (type);
5443           enum machine_mode elem_mode = TYPE_MODE (elem_type);
5444           int elem_size = GET_MODE_SIZE (elem_mode);
5445
5446           if (elem_size < UNITS_PER_WORD)
5447             {
5448               tree real_part, imag_part;
5449               tree post = NULL_TREE;
5450
5451               real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
5452                                                   &post);
5453               /* Copy the value into a temporary, lest the formal temporary
5454                  be reused out from under us.  */
5455               real_part = get_initialized_tmp_var (real_part, pre_p, &post);
5456               append_to_statement_list (post, pre_p);
5457
5458               imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
5459                                                   post_p);
5460
5461               return build (COMPLEX_EXPR, type, real_part, imag_part);
5462             }
5463         }
5464
5465       return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
5466     }
5467
5468   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
5469   f_fpr = TREE_CHAIN (f_gpr);
5470   f_res = TREE_CHAIN (f_fpr);
5471   f_ovf = TREE_CHAIN (f_res);
5472   f_sav = TREE_CHAIN (f_ovf);
5473
5474   valist = build_va_arg_indirect_ref (valist);
5475   gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
5476   fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
5477   ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
5478   sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
5479
5480   size = int_size_in_bytes (type);
5481   rsize = (size + 3) / 4;
5482   align = 1;
5483
5484   if (TARGET_HARD_FLOAT && TARGET_FPRS
5485       && (TYPE_MODE (type) == SFmode || TYPE_MODE (type) == DFmode))
5486     {
5487       /* FP args go in FP registers, if present.  */
5488       reg = fpr;
5489       n_reg = 1;
5490       sav_ofs = 8*4;
5491       sav_scale = 8;
5492       if (TYPE_MODE (type) == DFmode)
5493         align = 8;
5494     }
5495   else
5496     {
5497       /* Otherwise into GP registers.  */
5498       reg = gpr;
5499       n_reg = rsize;
5500       sav_ofs = 0;
5501       sav_scale = 4;
5502       if (n_reg == 2)
5503         align = 8;
5504     }
5505
5506   /* Pull the value out of the saved registers....  */
5507
5508   lab_over = NULL;
5509   addr = create_tmp_var (ptr_type_node, "addr");
5510   DECL_POINTER_ALIAS_SET (addr) = get_varargs_alias_set ();
5511
5512   /*  AltiVec vectors never go in registers when -mabi=altivec.  */
5513   if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
5514     align = 16;
5515   else
5516     {
5517       lab_false = create_artificial_label ();
5518       lab_over = create_artificial_label ();
5519
5520       /* Long long and SPE vectors are aligned in the registers.
5521          As are any other 2 gpr item such as complex int due to a
5522          historical mistake.  */
5523       u = reg;
5524       if (n_reg == 2)
5525         {
5526           u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), reg,
5527                      size_int (n_reg - 1));
5528           u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg, u);
5529         }
5530
5531       t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
5532       t = build2 (GE_EXPR, boolean_type_node, u, t);
5533       u = build1 (GOTO_EXPR, void_type_node, lab_false);
5534       t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
5535       gimplify_and_add (t, pre_p);
5536
5537       t = sav;
5538       if (sav_ofs)
5539         t = build2 (PLUS_EXPR, ptr_type_node, sav, size_int (sav_ofs));
5540
5541       u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg, size_int (n_reg));
5542       u = build1 (CONVERT_EXPR, integer_type_node, u);
5543       u = build2 (MULT_EXPR, integer_type_node, u, size_int (sav_scale));
5544       t = build2 (PLUS_EXPR, ptr_type_node, t, u);
5545
5546       t = build2 (MODIFY_EXPR, void_type_node, addr, t);
5547       gimplify_and_add (t, pre_p);
5548
5549       t = build1 (GOTO_EXPR, void_type_node, lab_over);
5550       gimplify_and_add (t, pre_p);
5551
5552       t = build1 (LABEL_EXPR, void_type_node, lab_false);
5553       append_to_statement_list (t, pre_p);
5554
5555       if (n_reg > 2)
5556         {
5557           /* Ensure that we don't find any more args in regs.
5558              Alignment has taken care of the n_reg == 2 case.  */
5559           t = build (MODIFY_EXPR, TREE_TYPE (reg), reg, size_int (8));
5560           gimplify_and_add (t, pre_p);
5561         }
5562     }
5563
5564   /* ... otherwise out of the overflow area.  */
5565
5566   /* Care for on-stack alignment if needed.  */
5567   t = ovf;
5568   if (align != 1)
5569     {
5570       t = build2 (PLUS_EXPR, TREE_TYPE (t), t, size_int (align - 1));
5571       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
5572                   build_int_cst (NULL_TREE, -align));
5573     }
5574   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
5575
5576   u = build2 (MODIFY_EXPR, void_type_node, addr, t);
5577   gimplify_and_add (u, pre_p);
5578
5579   t = build2 (PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
5580   t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
5581   gimplify_and_add (t, pre_p);
5582
5583   if (lab_over)
5584     {
5585       t = build1 (LABEL_EXPR, void_type_node, lab_over);
5586       append_to_statement_list (t, pre_p);
5587     }
5588
5589   addr = fold_convert (ptrtype, addr);
5590   return build_va_arg_indirect_ref (addr);
5591 }
5592
5593 /* Builtins.  */
5594
5595 static void
5596 def_builtin (int mask, const char *name, tree type, int code)
5597 {
5598   if (mask & target_flags)
5599     {
5600       if (rs6000_builtin_decls[code])
5601         abort ();
5602
5603       rs6000_builtin_decls[code] =
5604         lang_hooks.builtin_function (name, type, code, BUILT_IN_MD,
5605                                      NULL, NULL_TREE);
5606     }
5607 }
5608
5609 /* Simple ternary operations: VECd = foo (VECa, VECb, VECc).  */
5610
5611 static const struct builtin_description bdesc_3arg[] =
5612 {
5613   { MASK_ALTIVEC, CODE_FOR_altivec_vmaddfp, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
5614   { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
5615   { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
5616   { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
5617   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
5618   { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
5619   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
5620   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
5621   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
5622   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
5623   { MASK_ALTIVEC, CODE_FOR_altivec_vnmsubfp, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
5624   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
5625   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
5626   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
5627   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
5628   { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
5629   { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
5630   { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
5631   { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
5632   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
5633   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
5634   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
5635   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
5636
5637   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madd", ALTIVEC_BUILTIN_VEC_MADD },
5638   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madds", ALTIVEC_BUILTIN_VEC_MADDS },
5639   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mladd", ALTIVEC_BUILTIN_VEC_MLADD },
5640   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mradds", ALTIVEC_BUILTIN_VEC_MRADDS },
5641   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msum", ALTIVEC_BUILTIN_VEC_MSUM },
5642   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshm", ALTIVEC_BUILTIN_VEC_VMSUMSHM },
5643   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhm", ALTIVEC_BUILTIN_VEC_VMSUMUHM },
5644   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsummbm", ALTIVEC_BUILTIN_VEC_VMSUMMBM },
5645   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumubm", ALTIVEC_BUILTIN_VEC_VMSUMUBM },
5646   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msums", ALTIVEC_BUILTIN_VEC_MSUMS },
5647   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshs", ALTIVEC_BUILTIN_VEC_VMSUMSHS },
5648   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhs", ALTIVEC_BUILTIN_VEC_VMSUMUHS },
5649   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmsub", ALTIVEC_BUILTIN_VEC_NMSUB },
5650   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_perm", ALTIVEC_BUILTIN_VEC_PERM },
5651   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sel", ALTIVEC_BUILTIN_VEC_SEL },
5652 };
5653
5654 /* DST operations: void foo (void *, const int, const char).  */
5655
5656 static const struct builtin_description bdesc_dst[] =
5657 {
5658   { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
5659   { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
5660   { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
5661   { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT },
5662
5663   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dst", ALTIVEC_BUILTIN_VEC_DST },
5664   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstt", ALTIVEC_BUILTIN_VEC_DSTT },
5665   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstst", ALTIVEC_BUILTIN_VEC_DSTST },
5666   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dststt", ALTIVEC_BUILTIN_VEC_DSTSTT }
5667 };
5668
5669 /* Simple binary operations: VECc = foo (VECa, VECb).  */
5670
5671 static struct builtin_description bdesc_2arg[] =
5672 {
5673   { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
5674   { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
5675   { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
5676   { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
5677   { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
5678   { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
5679   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
5680   { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
5681   { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
5682   { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
5683   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
5684   { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
5685   { MASK_ALTIVEC, CODE_FOR_andcv4si3, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
5686   { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
5687   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
5688   { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
5689   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
5690   { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
5691   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
5692   { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
5693   { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
5694   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
5695   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequb, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
5696   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequh, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
5697   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequw, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
5698   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpeqfp, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
5699   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgefp, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
5700   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtub, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
5701   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsb, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
5702   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuh, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
5703   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsh, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
5704   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuw, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
5705   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsw, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
5706   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtfp, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
5707   { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
5708   { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
5709   { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
5710   { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
5711   { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
5712   { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
5713   { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
5714   { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
5715   { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
5716   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
5717   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
5718   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
5719   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
5720   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
5721   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
5722   { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
5723   { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
5724   { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
5725   { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
5726   { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
5727   { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
5728   { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
5729   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
5730   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
5731   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
5732   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
5733   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
5734   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
5735   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
5736   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
5737   { MASK_ALTIVEC, CODE_FOR_altivec_norv4si3, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
5738   { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
5739   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
5740   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
5741   { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
5742   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhss, "__builtin_altivec_vpkuhss", ALTIVEC_BUILTIN_VPKUHSS },
5743   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
5744   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwss, "__builtin_altivec_vpkuwss", ALTIVEC_BUILTIN_VPKUWSS },
5745   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
5746   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
5747   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
5748   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
5749   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
5750   { MASK_ALTIVEC, CODE_FOR_altivec_vrlb, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
5751   { MASK_ALTIVEC, CODE_FOR_altivec_vrlh, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
5752   { MASK_ALTIVEC, CODE_FOR_altivec_vrlw, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
5753   { MASK_ALTIVEC, CODE_FOR_altivec_vslb, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
5754   { MASK_ALTIVEC, CODE_FOR_altivec_vslh, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
5755   { MASK_ALTIVEC, CODE_FOR_altivec_vslw, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
5756   { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
5757   { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
5758   { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
5759   { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
5760   { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
5761   { MASK_ALTIVEC, CODE_FOR_lshrv16qi3, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
5762   { MASK_ALTIVEC, CODE_FOR_lshrv8hi3, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
5763   { MASK_ALTIVEC, CODE_FOR_lshrv4si3, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
5764   { MASK_ALTIVEC, CODE_FOR_ashrv16qi3, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
5765   { MASK_ALTIVEC, CODE_FOR_ashrv8hi3, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
5766   { MASK_ALTIVEC, CODE_FOR_ashrv4si3, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
5767   { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
5768   { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
5769   { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
5770   { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
5771   { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
5772   { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
5773   { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
5774   { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
5775   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
5776   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
5777   { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
5778   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
5779   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
5780   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
5781   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
5782   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
5783   { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
5784   { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
5785   { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
5786
5787   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_add", ALTIVEC_BUILTIN_VEC_ADD },
5788   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddfp", ALTIVEC_BUILTIN_VEC_VADDFP },
5789   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduwm", ALTIVEC_BUILTIN_VEC_VADDUWM },
5790   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhm", ALTIVEC_BUILTIN_VEC_VADDUHM },
5791   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubm", ALTIVEC_BUILTIN_VEC_VADDUBM },
5792   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_addc", ALTIVEC_BUILTIN_VEC_ADDC },
5793   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_adds", ALTIVEC_BUILTIN_VEC_ADDS },
5794   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsws", ALTIVEC_BUILTIN_VEC_VADDSWS },
5795   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduws", ALTIVEC_BUILTIN_VEC_VADDUWS },
5796   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddshs", ALTIVEC_BUILTIN_VEC_VADDSHS },
5797   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhs", ALTIVEC_BUILTIN_VEC_VADDUHS },
5798   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsbs", ALTIVEC_BUILTIN_VEC_VADDSBS },
5799   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubs", ALTIVEC_BUILTIN_VEC_VADDUBS },
5800   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_and", ALTIVEC_BUILTIN_VEC_AND },
5801   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_andc", ALTIVEC_BUILTIN_VEC_ANDC },
5802   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_avg", ALTIVEC_BUILTIN_VEC_AVG },
5803   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsw", ALTIVEC_BUILTIN_VEC_VAVGSW },
5804   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguw", ALTIVEC_BUILTIN_VEC_VAVGUW },
5805   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsh", ALTIVEC_BUILTIN_VEC_VAVGSH },
5806   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguh", ALTIVEC_BUILTIN_VEC_VAVGUH },
5807   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsb", ALTIVEC_BUILTIN_VEC_VAVGSB },
5808   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgub", ALTIVEC_BUILTIN_VEC_VAVGUB },
5809   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpb", ALTIVEC_BUILTIN_VEC_CMPB },
5810   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpeq", ALTIVEC_BUILTIN_VEC_CMPEQ },
5811   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpeqfp", ALTIVEC_BUILTIN_VEC_VCMPEQFP },
5812   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequw", ALTIVEC_BUILTIN_VEC_VCMPEQUW },
5813   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequh", ALTIVEC_BUILTIN_VEC_VCMPEQUH },
5814   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequb", ALTIVEC_BUILTIN_VEC_VCMPEQUB },
5815   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpge", ALTIVEC_BUILTIN_VEC_CMPGE },
5816   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpgt", ALTIVEC_BUILTIN_VEC_CMPGT },
5817   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtfp", ALTIVEC_BUILTIN_VEC_VCMPGTFP },
5818   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsw", ALTIVEC_BUILTIN_VEC_VCMPGTSW },
5819   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuw", ALTIVEC_BUILTIN_VEC_VCMPGTUW },
5820   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsh", ALTIVEC_BUILTIN_VEC_VCMPGTSH },
5821   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuh", ALTIVEC_BUILTIN_VEC_VCMPGTUH },
5822   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsb", ALTIVEC_BUILTIN_VEC_VCMPGTSB },
5823   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtub", ALTIVEC_BUILTIN_VEC_VCMPGTUB },
5824   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmple", ALTIVEC_BUILTIN_VEC_CMPLE },
5825   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmplt", ALTIVEC_BUILTIN_VEC_CMPLT },
5826   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_max", ALTIVEC_BUILTIN_VEC_MAX },
5827   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxfp", ALTIVEC_BUILTIN_VEC_VMAXFP },
5828   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsw", ALTIVEC_BUILTIN_VEC_VMAXSW },
5829   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuw", ALTIVEC_BUILTIN_VEC_VMAXUW },
5830   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsh", ALTIVEC_BUILTIN_VEC_VMAXSH },
5831   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuh", ALTIVEC_BUILTIN_VEC_VMAXUH },
5832   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsb", ALTIVEC_BUILTIN_VEC_VMAXSB },
5833   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxub", ALTIVEC_BUILTIN_VEC_VMAXUB },
5834   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergeh", ALTIVEC_BUILTIN_VEC_MERGEH },
5835   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghw", ALTIVEC_BUILTIN_VEC_VMRGHW },
5836   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghh", ALTIVEC_BUILTIN_VEC_VMRGHH },
5837   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghb", ALTIVEC_BUILTIN_VEC_VMRGHB },
5838   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergel", ALTIVEC_BUILTIN_VEC_MERGEL },
5839   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglw", ALTIVEC_BUILTIN_VEC_VMRGLW },
5840   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglh", ALTIVEC_BUILTIN_VEC_VMRGLH },
5841   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglb", ALTIVEC_BUILTIN_VEC_VMRGLB },
5842   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_min", ALTIVEC_BUILTIN_VEC_MIN },
5843   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminfp", ALTIVEC_BUILTIN_VEC_VMINFP },
5844   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsw", ALTIVEC_BUILTIN_VEC_VMINSW },
5845   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuw", ALTIVEC_BUILTIN_VEC_VMINUW },
5846   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsh", ALTIVEC_BUILTIN_VEC_VMINSH },
5847   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuh", ALTIVEC_BUILTIN_VEC_VMINUH },
5848   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsb", ALTIVEC_BUILTIN_VEC_VMINSB },
5849   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminub", ALTIVEC_BUILTIN_VEC_VMINUB },
5850   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mule", ALTIVEC_BUILTIN_VEC_MULE },
5851   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleub", ALTIVEC_BUILTIN_VEC_VMULEUB },
5852   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesb", ALTIVEC_BUILTIN_VEC_VMULESB },
5853   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleuh", ALTIVEC_BUILTIN_VEC_VMULEUH },
5854   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesh", ALTIVEC_BUILTIN_VEC_VMULESH },
5855   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mulo", ALTIVEC_BUILTIN_VEC_MULO },
5856   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosh", ALTIVEC_BUILTIN_VEC_VMULOSH },
5857   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulouh", ALTIVEC_BUILTIN_VEC_VMULOUH },
5858   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosb", ALTIVEC_BUILTIN_VEC_VMULOSB },
5859   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuloub", ALTIVEC_BUILTIN_VEC_VMULOUB },
5860   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nor", ALTIVEC_BUILTIN_VEC_NOR },
5861   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_or", ALTIVEC_BUILTIN_VEC_OR },
5862   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_pack", ALTIVEC_BUILTIN_VEC_PACK },
5863   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwum", ALTIVEC_BUILTIN_VEC_VPKUWUM },
5864   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhum", ALTIVEC_BUILTIN_VEC_VPKUHUM },
5865   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packpx", ALTIVEC_BUILTIN_VEC_PACKPX },
5866   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packs", ALTIVEC_BUILTIN_VEC_PACKS },
5867   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswss", ALTIVEC_BUILTIN_VEC_VPKSWSS },
5868   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwus", ALTIVEC_BUILTIN_VEC_VPKUWUS },
5869   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshss", ALTIVEC_BUILTIN_VEC_VPKSHSS },
5870   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhus", ALTIVEC_BUILTIN_VEC_VPKUHUS },
5871   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packsu", ALTIVEC_BUILTIN_VEC_PACKSU },
5872   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswus", ALTIVEC_BUILTIN_VEC_VPKSWUS },
5873   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshus", ALTIVEC_BUILTIN_VEC_VPKSHUS },
5874   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rl", ALTIVEC_BUILTIN_VEC_RL },
5875   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlw", ALTIVEC_BUILTIN_VEC_VRLW },
5876   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlh", ALTIVEC_BUILTIN_VEC_VRLH },
5877   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlb", ALTIVEC_BUILTIN_VEC_VRLB },
5878   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sl", ALTIVEC_BUILTIN_VEC_SL },
5879   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslw", ALTIVEC_BUILTIN_VEC_VSLW },
5880   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslh", ALTIVEC_BUILTIN_VEC_VSLH },
5881   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslb", ALTIVEC_BUILTIN_VEC_VSLB },
5882   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sll", ALTIVEC_BUILTIN_VEC_SLL },
5883   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_slo", ALTIVEC_BUILTIN_VEC_SLO },
5884   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sr", ALTIVEC_BUILTIN_VEC_SR },
5885   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrw", ALTIVEC_BUILTIN_VEC_VSRW },
5886   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrh", ALTIVEC_BUILTIN_VEC_VSRH },
5887   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrb", ALTIVEC_BUILTIN_VEC_VSRB },
5888   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sra", ALTIVEC_BUILTIN_VEC_SRA },
5889   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsraw", ALTIVEC_BUILTIN_VEC_VSRAW },
5890   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrah", ALTIVEC_BUILTIN_VEC_VSRAH },
5891   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrab", ALTIVEC_BUILTIN_VEC_VSRAB },
5892   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_srl", ALTIVEC_BUILTIN_VEC_SRL },
5893   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sro", ALTIVEC_BUILTIN_VEC_SRO },
5894   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sub", ALTIVEC_BUILTIN_VEC_SUB },
5895   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubfp", ALTIVEC_BUILTIN_VEC_VSUBFP },
5896   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuwm", ALTIVEC_BUILTIN_VEC_VSUBUWM },
5897   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhm", ALTIVEC_BUILTIN_VEC_VSUBUHM },
5898   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububm", ALTIVEC_BUILTIN_VEC_VSUBUBM },
5899   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subc", ALTIVEC_BUILTIN_VEC_SUBC },
5900   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subs", ALTIVEC_BUILTIN_VEC_SUBS },
5901   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsws", ALTIVEC_BUILTIN_VEC_VSUBSWS },
5902   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuws", ALTIVEC_BUILTIN_VEC_VSUBUWS },
5903   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubshs", ALTIVEC_BUILTIN_VEC_VSUBSHS },
5904   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhs", ALTIVEC_BUILTIN_VEC_VSUBUHS },
5905   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsbs", ALTIVEC_BUILTIN_VEC_VSUBSBS },
5906   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububs", ALTIVEC_BUILTIN_VEC_VSUBUBS },
5907   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum4s", ALTIVEC_BUILTIN_VEC_SUM4S },
5908   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4shs", ALTIVEC_BUILTIN_VEC_VSUM4SHS },
5909   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4sbs", ALTIVEC_BUILTIN_VEC_VSUM4SBS },
5910   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4ubs", ALTIVEC_BUILTIN_VEC_VSUM4UBS },
5911   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum2s", ALTIVEC_BUILTIN_VEC_SUM2S },
5912   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sums", ALTIVEC_BUILTIN_VEC_SUMS },
5913   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_xor", ALTIVEC_BUILTIN_VEC_XOR },
5914
5915   /* Place holder, leave as first spe builtin.  */
5916   { 0, CODE_FOR_spe_evaddw, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
5917   { 0, CODE_FOR_spe_evand, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
5918   { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
5919   { 0, CODE_FOR_spe_evdivws, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
5920   { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
5921   { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
5922   { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
5923   { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
5924   { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
5925   { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
5926   { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
5927   { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
5928   { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
5929   { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
5930   { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
5931   { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
5932   { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
5933   { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
5934   { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
5935   { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
5936   { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
5937   { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
5938   { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
5939   { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
5940   { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
5941   { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
5942   { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
5943   { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
5944   { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
5945   { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
5946   { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
5947   { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
5948   { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
5949   { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
5950   { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
5951   { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
5952   { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
5953   { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
5954   { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
5955   { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
5956   { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
5957   { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
5958   { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
5959   { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
5960   { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
5961   { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
5962   { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
5963   { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
5964   { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
5965   { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
5966   { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
5967   { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
5968   { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
5969   { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
5970   { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
5971   { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
5972   { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
5973   { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
5974   { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
5975   { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
5976   { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
5977   { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
5978   { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
5979   { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
5980   { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
5981   { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
5982   { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
5983   { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
5984   { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
5985   { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
5986   { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
5987   { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
5988   { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
5989   { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
5990   { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
5991   { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
5992   { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
5993   { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
5994   { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
5995   { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
5996   { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
5997   { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
5998   { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
5999   { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
6000   { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
6001   { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
6002   { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
6003   { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
6004   { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
6005   { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
6006   { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
6007   { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
6008   { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
6009   { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
6010   { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
6011   { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
6012   { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
6013   { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
6014   { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
6015   { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
6016   { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
6017   { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
6018   { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
6019   { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
6020   { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
6021   { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
6022   { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
6023   { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
6024   { 0, CODE_FOR_spe_evsubfw, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
6025
6026   /* SPE binary operations expecting a 5-bit unsigned literal.  */
6027   { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
6028
6029   { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
6030   { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
6031   { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
6032   { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
6033   { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
6034   { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
6035   { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
6036   { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
6037   { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
6038   { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
6039   { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
6040   { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
6041   { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
6042   { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
6043   { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
6044   { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
6045   { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
6046   { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
6047   { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
6048   { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
6049   { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
6050   { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
6051   { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
6052   { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
6053   { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
6054   { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
6055
6056   /* Place-holder.  Leave as last binary SPE builtin.  */
6057   { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR }
6058 };
6059
6060 /* AltiVec predicates.  */
6061
6062 struct builtin_description_predicates
6063 {
6064   const unsigned int mask;
6065   const enum insn_code icode;
6066   const char *opcode;
6067   const char *const name;
6068   const enum rs6000_builtins code;
6069 };
6070
6071 static const struct builtin_description_predicates bdesc_altivec_preds[] =
6072 {
6073   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpbfp.", "__builtin_altivec_vcmpbfp_p", ALTIVEC_BUILTIN_VCMPBFP_P },
6074   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpeqfp.", "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
6075   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgefp.", "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
6076   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgtfp.", "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
6077   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpequw.", "__builtin_altivec_vcmpequw_p", ALTIVEC_BUILTIN_VCMPEQUW_P },
6078   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtsw.", "__builtin_altivec_vcmpgtsw_p", ALTIVEC_BUILTIN_VCMPGTSW_P },
6079   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtuw.", "__builtin_altivec_vcmpgtuw_p", ALTIVEC_BUILTIN_VCMPGTUW_P },
6080   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtuh.", "__builtin_altivec_vcmpgtuh_p", ALTIVEC_BUILTIN_VCMPGTUH_P },
6081   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtsh.", "__builtin_altivec_vcmpgtsh_p", ALTIVEC_BUILTIN_VCMPGTSH_P },
6082   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpequh.", "__builtin_altivec_vcmpequh_p", ALTIVEC_BUILTIN_VCMPEQUH_P },
6083   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpequb.", "__builtin_altivec_vcmpequb_p", ALTIVEC_BUILTIN_VCMPEQUB_P },
6084   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtsb.", "__builtin_altivec_vcmpgtsb_p", ALTIVEC_BUILTIN_VCMPGTSB_P },
6085   { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtub.", "__builtin_altivec_vcmpgtub_p", ALTIVEC_BUILTIN_VCMPGTUB_P },
6086
6087   { MASK_ALTIVEC, 0, NULL, "__builtin_vec_vcmpeq_p", ALTIVEC_BUILTIN_VCMPEQ_P },
6088   { MASK_ALTIVEC, 0, NULL, "__builtin_vec_vcmpgt_p", ALTIVEC_BUILTIN_VCMPGT_P },
6089   { MASK_ALTIVEC, 0, NULL, "__builtin_vec_vcmpge_p", ALTIVEC_BUILTIN_VCMPGE_P }
6090 };
6091
6092 /* SPE predicates.  */
6093 static struct builtin_description bdesc_spe_predicates[] =
6094 {
6095   /* Place-holder.  Leave as first.  */
6096   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
6097   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
6098   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
6099   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
6100   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
6101   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
6102   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
6103   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
6104   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
6105   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
6106   /* Place-holder.  Leave as last.  */
6107   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
6108 };
6109
6110 /* SPE evsel predicates.  */
6111 static struct builtin_description bdesc_spe_evsel[] =
6112 {
6113   /* Place-holder.  Leave as first.  */
6114   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
6115   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
6116   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
6117   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
6118   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
6119   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
6120   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
6121   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
6122   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
6123   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
6124   /* Place-holder.  Leave as last.  */
6125   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
6126 };
6127
6128 /* ABS* operations.  */
6129
6130 static const struct builtin_description bdesc_abs[] =
6131 {
6132   { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
6133   { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
6134   { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
6135   { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
6136   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
6137   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
6138   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI }
6139 };
6140
6141 /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
6142    foo (VECa).  */
6143
6144 static struct builtin_description bdesc_1arg[] =
6145 {
6146   { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
6147   { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
6148   { MASK_ALTIVEC, CODE_FOR_altivec_vrefp, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
6149   { MASK_ALTIVEC, CODE_FOR_altivec_vrfim, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
6150   { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
6151   { MASK_ALTIVEC, CODE_FOR_altivec_vrfip, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
6152   { MASK_ALTIVEC, CODE_FOR_ftruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
6153   { MASK_ALTIVEC, CODE_FOR_altivec_vrsqrtefp, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
6154   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
6155   { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
6156   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
6157   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
6158   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
6159   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
6160   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
6161   { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
6162   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
6163
6164   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abs", ALTIVEC_BUILTIN_VEC_ABS },
6165   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abss", ALTIVEC_BUILTIN_VEC_ABSS },
6166   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_ceil", ALTIVEC_BUILTIN_VEC_CEIL },
6167   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_expte", ALTIVEC_BUILTIN_VEC_EXPTE },
6168   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_floor", ALTIVEC_BUILTIN_VEC_FLOOR },
6169   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_loge", ALTIVEC_BUILTIN_VEC_LOGE },
6170   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mtvscr", ALTIVEC_BUILTIN_VEC_MTVSCR },
6171   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_re", ALTIVEC_BUILTIN_VEC_RE },
6172   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_round", ALTIVEC_BUILTIN_VEC_ROUND },
6173   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrte", ALTIVEC_BUILTIN_VEC_RSQRTE },
6174   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_trunc", ALTIVEC_BUILTIN_VEC_TRUNC },
6175   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackh", ALTIVEC_BUILTIN_VEC_UNPACKH },
6176   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsh", ALTIVEC_BUILTIN_VEC_VUPKHSH },
6177   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhpx", ALTIVEC_BUILTIN_VEC_VUPKHPX },
6178   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsb", ALTIVEC_BUILTIN_VEC_VUPKHSB },
6179   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackl", ALTIVEC_BUILTIN_VEC_UNPACKL },
6180   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklpx", ALTIVEC_BUILTIN_VEC_VUPKLPX },
6181   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsh", ALTIVEC_BUILTIN_VEC_VUPKLSH },
6182   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsb", ALTIVEC_BUILTIN_VEC_VUPKLSB },
6183
6184   /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
6185      end with SPE_BUILTIN_EVSUBFUSIAAW.  */
6186   { 0, CODE_FOR_spe_evabs, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
6187   { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
6188   { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
6189   { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
6190   { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
6191   { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
6192   { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
6193   { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
6194   { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
6195   { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
6196   { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
6197   { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
6198   { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
6199   { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
6200   { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
6201   { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
6202   { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
6203   { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
6204   { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
6205   { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
6206   { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
6207   { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
6208   { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
6209   { 0, CODE_FOR_negv2si2, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
6210   { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
6211   { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
6212   { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
6213   { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
6214
6215   /* Place-holder.  Leave as last unary SPE builtin.  */
6216   { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW }
6217 };
6218
6219 static rtx
6220 rs6000_expand_unop_builtin (enum insn_code icode, tree arglist, rtx target)
6221 {
6222   rtx pat;
6223   tree arg0 = TREE_VALUE (arglist);
6224   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6225   enum machine_mode tmode = insn_data[icode].operand[0].mode;
6226   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6227
6228   if (icode == CODE_FOR_nothing)
6229     /* Builtin not supported on this processor.  */
6230     return 0;
6231
6232   /* If we got invalid arguments bail out before generating bad rtl.  */
6233   if (arg0 == error_mark_node)
6234     return const0_rtx;
6235
6236   if (icode == CODE_FOR_altivec_vspltisb
6237       || icode == CODE_FOR_altivec_vspltish
6238       || icode == CODE_FOR_altivec_vspltisw
6239       || icode == CODE_FOR_spe_evsplatfi
6240       || icode == CODE_FOR_spe_evsplati)
6241     {
6242       /* Only allow 5-bit *signed* literals.  */
6243       if (GET_CODE (op0) != CONST_INT
6244           || INTVAL (op0) > 15
6245           || INTVAL (op0) < -16)
6246         {
6247           error ("argument 1 must be a 5-bit signed literal");
6248           return const0_rtx;
6249         }
6250     }
6251
6252   if (target == 0
6253       || GET_MODE (target) != tmode
6254       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6255     target = gen_reg_rtx (tmode);
6256
6257   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6258     op0 = copy_to_mode_reg (mode0, op0);
6259
6260   pat = GEN_FCN (icode) (target, op0);
6261   if (! pat)
6262     return 0;
6263   emit_insn (pat);
6264
6265   return target;
6266 }
6267
6268 static rtx
6269 altivec_expand_abs_builtin (enum insn_code icode, tree arglist, rtx target)
6270 {
6271   rtx pat, scratch1, scratch2;
6272   tree arg0 = TREE_VALUE (arglist);
6273   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6274   enum machine_mode tmode = insn_data[icode].operand[0].mode;
6275   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6276
6277   /* If we have invalid arguments, bail out before generating bad rtl.  */
6278   if (arg0 == error_mark_node)
6279     return const0_rtx;
6280
6281   if (target == 0
6282       || GET_MODE (target) != tmode
6283       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6284     target = gen_reg_rtx (tmode);
6285
6286   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6287     op0 = copy_to_mode_reg (mode0, op0);
6288
6289   scratch1 = gen_reg_rtx (mode0);
6290   scratch2 = gen_reg_rtx (mode0);
6291
6292   pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
6293   if (! pat)
6294     return 0;
6295   emit_insn (pat);
6296
6297   return target;
6298 }
6299
6300 static rtx
6301 rs6000_expand_binop_builtin (enum insn_code icode, tree arglist, rtx target)
6302 {
6303   rtx pat;
6304   tree arg0 = TREE_VALUE (arglist);
6305   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6306   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6307   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6308   enum machine_mode tmode = insn_data[icode].operand[0].mode;
6309   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6310   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
6311
6312   if (icode == CODE_FOR_nothing)
6313     /* Builtin not supported on this processor.  */
6314     return 0;
6315
6316   /* If we got invalid arguments bail out before generating bad rtl.  */
6317   if (arg0 == error_mark_node || arg1 == error_mark_node)
6318     return const0_rtx;
6319
6320   if (icode == CODE_FOR_altivec_vcfux
6321       || icode == CODE_FOR_altivec_vcfsx
6322       || icode == CODE_FOR_altivec_vctsxs
6323       || icode == CODE_FOR_altivec_vctuxs
6324       || icode == CODE_FOR_altivec_vspltb
6325       || icode == CODE_FOR_altivec_vsplth
6326       || icode == CODE_FOR_altivec_vspltw
6327       || icode == CODE_FOR_spe_evaddiw
6328       || icode == CODE_FOR_spe_evldd
6329       || icode == CODE_FOR_spe_evldh
6330       || icode == CODE_FOR_spe_evldw
6331       || icode == CODE_FOR_spe_evlhhesplat
6332       || icode == CODE_FOR_spe_evlhhossplat
6333       || icode == CODE_FOR_spe_evlhhousplat
6334       || icode == CODE_FOR_spe_evlwhe
6335       || icode == CODE_FOR_spe_evlwhos
6336       || icode == CODE_FOR_spe_evlwhou
6337       || icode == CODE_FOR_spe_evlwhsplat
6338       || icode == CODE_FOR_spe_evlwwsplat
6339       || icode == CODE_FOR_spe_evrlwi
6340       || icode == CODE_FOR_spe_evslwi
6341       || icode == CODE_FOR_spe_evsrwis
6342       || icode == CODE_FOR_spe_evsubifw
6343       || icode == CODE_FOR_spe_evsrwiu)
6344     {
6345       /* Only allow 5-bit unsigned literals.  */
6346       STRIP_NOPS (arg1);
6347       if (TREE_CODE (arg1) != INTEGER_CST
6348           || TREE_INT_CST_LOW (arg1) & ~0x1f)
6349         {
6350           error ("argument 2 must be a 5-bit unsigned literal");
6351           return const0_rtx;
6352         }
6353     }
6354
6355   if (target == 0
6356       || GET_MODE (target) != tmode
6357       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6358     target = gen_reg_rtx (tmode);
6359
6360   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6361     op0 = copy_to_mode_reg (mode0, op0);
6362   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
6363     op1 = copy_to_mode_reg (mode1, op1);
6364
6365   pat = GEN_FCN (icode) (target, op0, op1);
6366   if (! pat)
6367     return 0;
6368   emit_insn (pat);
6369
6370   return target;
6371 }
6372
6373 static rtx
6374 altivec_expand_predicate_builtin (enum insn_code icode, const char *opcode,
6375                                   tree arglist, rtx target)
6376 {
6377   rtx pat, scratch;
6378   tree cr6_form = TREE_VALUE (arglist);
6379   tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
6380   tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6381   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6382   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6383   enum machine_mode tmode = SImode;
6384   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6385   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
6386   int cr6_form_int;
6387
6388   if (TREE_CODE (cr6_form) != INTEGER_CST)
6389     {
6390       error ("argument 1 of __builtin_altivec_predicate must be a constant");
6391       return const0_rtx;
6392     }
6393   else
6394     cr6_form_int = TREE_INT_CST_LOW (cr6_form);
6395
6396   gcc_assert (mode0 == mode1);
6397
6398   /* If we have invalid arguments, bail out before generating bad rtl.  */
6399   if (arg0 == error_mark_node || arg1 == error_mark_node)
6400     return const0_rtx;
6401
6402   if (target == 0
6403       || GET_MODE (target) != tmode
6404       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6405     target = gen_reg_rtx (tmode);
6406
6407   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6408     op0 = copy_to_mode_reg (mode0, op0);
6409   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
6410     op1 = copy_to_mode_reg (mode1, op1);
6411
6412   scratch = gen_reg_rtx (mode0);
6413
6414   pat = GEN_FCN (icode) (scratch, op0, op1,
6415                          gen_rtx_SYMBOL_REF (Pmode, opcode));
6416   if (! pat)
6417     return 0;
6418   emit_insn (pat);
6419
6420   /* The vec_any* and vec_all* predicates use the same opcodes for two
6421      different operations, but the bits in CR6 will be different
6422      depending on what information we want.  So we have to play tricks
6423      with CR6 to get the right bits out.
6424
6425      If you think this is disgusting, look at the specs for the
6426      AltiVec predicates.  */
6427
6428   switch (cr6_form_int)
6429     {
6430     case 0:
6431       emit_insn (gen_cr6_test_for_zero (target));
6432       break;
6433     case 1:
6434       emit_insn (gen_cr6_test_for_zero_reverse (target));
6435       break;
6436     case 2:
6437       emit_insn (gen_cr6_test_for_lt (target));
6438       break;
6439     case 3:
6440       emit_insn (gen_cr6_test_for_lt_reverse (target));
6441       break;
6442     default:
6443       error ("argument 1 of __builtin_altivec_predicate is out of range");
6444       break;
6445     }
6446
6447   return target;
6448 }
6449
6450 static rtx
6451 altivec_expand_lv_builtin (enum insn_code icode, tree arglist, rtx target)
6452 {
6453   rtx pat, addr;
6454   tree arg0 = TREE_VALUE (arglist);
6455   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6456   enum machine_mode tmode = insn_data[icode].operand[0].mode;
6457   enum machine_mode mode0 = Pmode;
6458   enum machine_mode mode1 = Pmode;
6459   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6460   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6461
6462   if (icode == CODE_FOR_nothing)
6463     /* Builtin not supported on this processor.  */
6464     return 0;
6465
6466   /* If we got invalid arguments bail out before generating bad rtl.  */
6467   if (arg0 == error_mark_node || arg1 == error_mark_node)
6468     return const0_rtx;
6469
6470   if (target == 0
6471       || GET_MODE (target) != tmode
6472       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6473     target = gen_reg_rtx (tmode);
6474
6475   op1 = copy_to_mode_reg (mode1, op1);
6476
6477   if (op0 == const0_rtx)
6478     {
6479       addr = gen_rtx_MEM (tmode, op1);
6480     }
6481   else
6482     {
6483       op0 = copy_to_mode_reg (mode0, op0);
6484       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
6485     }
6486
6487   pat = GEN_FCN (icode) (target, addr);
6488
6489   if (! pat)
6490     return 0;
6491   emit_insn (pat);
6492
6493   return target;
6494 }
6495
6496 static rtx
6497 spe_expand_stv_builtin (enum insn_code icode, tree arglist)
6498 {
6499   tree arg0 = TREE_VALUE (arglist);
6500   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6501   tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6502   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6503   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6504   rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
6505   rtx pat;
6506   enum machine_mode mode0 = insn_data[icode].operand[0].mode;
6507   enum machine_mode mode1 = insn_data[icode].operand[1].mode;
6508   enum machine_mode mode2 = insn_data[icode].operand[2].mode;
6509
6510   /* Invalid arguments.  Bail before doing anything stoopid!  */
6511   if (arg0 == error_mark_node
6512       || arg1 == error_mark_node
6513       || arg2 == error_mark_node)
6514     return const0_rtx;
6515
6516   if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
6517     op0 = copy_to_mode_reg (mode2, op0);
6518   if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
6519     op1 = copy_to_mode_reg (mode0, op1);
6520   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
6521     op2 = copy_to_mode_reg (mode1, op2);
6522
6523   pat = GEN_FCN (icode) (op1, op2, op0);
6524   if (pat)
6525     emit_insn (pat);
6526   return NULL_RTX;
6527 }
6528
6529 static rtx
6530 altivec_expand_stv_builtin (enum insn_code icode, tree arglist)
6531 {
6532   tree arg0 = TREE_VALUE (arglist);
6533   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6534   tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6535   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6536   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6537   rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
6538   rtx pat, addr;
6539   enum machine_mode tmode = insn_data[icode].operand[0].mode;
6540   enum machine_mode mode1 = Pmode;
6541   enum machine_mode mode2 = Pmode;
6542
6543   /* Invalid arguments.  Bail before doing anything stoopid!  */
6544   if (arg0 == error_mark_node
6545       || arg1 == error_mark_node
6546       || arg2 == error_mark_node)
6547     return const0_rtx;
6548
6549   if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
6550     op0 = copy_to_mode_reg (tmode, op0);
6551
6552   op2 = copy_to_mode_reg (mode2, op2);
6553
6554   if (op1 == const0_rtx)
6555     {
6556       addr = gen_rtx_MEM (tmode, op2);
6557     }
6558   else
6559     {
6560       op1 = copy_to_mode_reg (mode1, op1);
6561       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
6562     }
6563
6564   pat = GEN_FCN (icode) (addr, op0);
6565   if (pat)
6566     emit_insn (pat);
6567   return NULL_RTX;
6568 }
6569
6570 static rtx
6571 rs6000_expand_ternop_builtin (enum insn_code icode, tree arglist, rtx target)
6572 {
6573   rtx pat;
6574   tree arg0 = TREE_VALUE (arglist);
6575   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6576   tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6577   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6578   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6579   rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
6580   enum machine_mode tmode = insn_data[icode].operand[0].mode;
6581   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6582   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
6583   enum machine_mode mode2 = insn_data[icode].operand[3].mode;
6584
6585   if (icode == CODE_FOR_nothing)
6586     /* Builtin not supported on this processor.  */
6587     return 0;
6588
6589   /* If we got invalid arguments bail out before generating bad rtl.  */
6590   if (arg0 == error_mark_node
6591       || arg1 == error_mark_node
6592       || arg2 == error_mark_node)
6593     return const0_rtx;
6594
6595   if (icode == CODE_FOR_altivec_vsldoi_v4sf
6596       || icode == CODE_FOR_altivec_vsldoi_v4si
6597       || icode == CODE_FOR_altivec_vsldoi_v8hi
6598       || icode == CODE_FOR_altivec_vsldoi_v16qi)
6599     {
6600       /* Only allow 4-bit unsigned literals.  */
6601       STRIP_NOPS (arg2);
6602       if (TREE_CODE (arg2) != INTEGER_CST
6603           || TREE_INT_CST_LOW (arg2) & ~0xf)
6604         {
6605           error ("argument 3 must be a 4-bit unsigned literal");
6606           return const0_rtx;
6607         }
6608     }
6609
6610   if (target == 0
6611       || GET_MODE (target) != tmode
6612       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6613     target = gen_reg_rtx (tmode);
6614
6615   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6616     op0 = copy_to_mode_reg (mode0, op0);
6617   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
6618     op1 = copy_to_mode_reg (mode1, op1);
6619   if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
6620     op2 = copy_to_mode_reg (mode2, op2);
6621
6622   pat = GEN_FCN (icode) (target, op0, op1, op2);
6623   if (! pat)
6624     return 0;
6625   emit_insn (pat);
6626
6627   return target;
6628 }
6629
6630 /* Expand the lvx builtins.  */
6631 static rtx
6632 altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp)
6633 {
6634   tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6635   tree arglist = TREE_OPERAND (exp, 1);
6636   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
6637   tree arg0;
6638   enum machine_mode tmode, mode0;
6639   rtx pat, op0;
6640   enum insn_code icode;
6641
6642   switch (fcode)
6643     {
6644     case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
6645       icode = CODE_FOR_altivec_lvx_v16qi;
6646       break;
6647     case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
6648       icode = CODE_FOR_altivec_lvx_v8hi;
6649       break;
6650     case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
6651       icode = CODE_FOR_altivec_lvx_v4si;
6652       break;
6653     case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
6654       icode = CODE_FOR_altivec_lvx_v4sf;
6655       break;
6656     default:
6657       *expandedp = false;
6658       return NULL_RTX;
6659     }
6660
6661   *expandedp = true;
6662
6663   arg0 = TREE_VALUE (arglist);
6664   op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6665   tmode = insn_data[icode].operand[0].mode;
6666   mode0 = insn_data[icode].operand[1].mode;
6667
6668   if (target == 0
6669       || GET_MODE (target) != tmode
6670       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6671     target = gen_reg_rtx (tmode);
6672
6673   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6674     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
6675
6676   pat = GEN_FCN (icode) (target, op0);
6677   if (! pat)
6678     return 0;
6679   emit_insn (pat);
6680   return target;
6681 }
6682
6683 /* Expand the stvx builtins.  */
6684 static rtx
6685 altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
6686                            bool *expandedp)
6687 {
6688   tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6689   tree arglist = TREE_OPERAND (exp, 1);
6690   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
6691   tree arg0, arg1;
6692   enum machine_mode mode0, mode1;
6693   rtx pat, op0, op1;
6694   enum insn_code icode;
6695
6696   switch (fcode)
6697     {
6698     case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
6699       icode = CODE_FOR_altivec_stvx_v16qi;
6700       break;
6701     case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
6702       icode = CODE_FOR_altivec_stvx_v8hi;
6703       break;
6704     case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
6705       icode = CODE_FOR_altivec_stvx_v4si;
6706       break;
6707     case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
6708       icode = CODE_FOR_altivec_stvx_v4sf;
6709       break;
6710     default:
6711       *expandedp = false;
6712       return NULL_RTX;
6713     }
6714
6715   arg0 = TREE_VALUE (arglist);
6716   arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6717   op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6718   op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6719   mode0 = insn_data[icode].operand[0].mode;
6720   mode1 = insn_data[icode].operand[1].mode;
6721
6722   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
6723     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
6724   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
6725     op1 = copy_to_mode_reg (mode1, op1);
6726
6727   pat = GEN_FCN (icode) (op0, op1);
6728   if (pat)
6729     emit_insn (pat);
6730
6731   *expandedp = true;
6732   return NULL_RTX;
6733 }
6734
6735 /* Expand the dst builtins.  */
6736 static rtx
6737 altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
6738                             bool *expandedp)
6739 {
6740   tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6741   tree arglist = TREE_OPERAND (exp, 1);
6742   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
6743   tree arg0, arg1, arg2;
6744   enum machine_mode mode0, mode1, mode2;
6745   rtx pat, op0, op1, op2;
6746   struct builtin_description *d;
6747   size_t i;
6748
6749   *expandedp = false;
6750
6751   /* Handle DST variants.  */
6752   d = (struct builtin_description *) bdesc_dst;
6753   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
6754     if (d->code == fcode)
6755       {
6756         arg0 = TREE_VALUE (arglist);
6757         arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6758         arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6759         op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6760         op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6761         op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
6762         mode0 = insn_data[d->icode].operand[0].mode;
6763         mode1 = insn_data[d->icode].operand[1].mode;
6764         mode2 = insn_data[d->icode].operand[2].mode;
6765
6766         /* Invalid arguments, bail out before generating bad rtl.  */
6767         if (arg0 == error_mark_node
6768             || arg1 == error_mark_node
6769             || arg2 == error_mark_node)
6770           return const0_rtx;
6771
6772         *expandedp = true;
6773         STRIP_NOPS (arg2);
6774         if (TREE_CODE (arg2) != INTEGER_CST
6775             || TREE_INT_CST_LOW (arg2) & ~0x3)
6776           {
6777             error ("argument to %qs must be a 2-bit unsigned literal", d->name);
6778             return const0_rtx;
6779           }
6780
6781         if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
6782           op0 = copy_to_mode_reg (Pmode, op0);
6783         if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
6784           op1 = copy_to_mode_reg (mode1, op1);
6785
6786         pat = GEN_FCN (d->icode) (op0, op1, op2);
6787         if (pat != 0)
6788           emit_insn (pat);
6789
6790         return NULL_RTX;
6791       }
6792
6793   return NULL_RTX;
6794 }
6795
6796 /* Expand the builtin in EXP and store the result in TARGET.  Store
6797    true in *EXPANDEDP if we found a builtin to expand.  */
6798 static rtx
6799 altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
6800 {
6801   struct builtin_description *d;
6802   struct builtin_description_predicates *dp;
6803   size_t i;
6804   enum insn_code icode;
6805   tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6806   tree arglist = TREE_OPERAND (exp, 1);
6807   tree arg0;
6808   rtx op0, pat;
6809   enum machine_mode tmode, mode0;
6810   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
6811
6812   if (fcode >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
6813       && fcode <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
6814     {
6815       *expandedp = true;
6816       error ("unresolved overload for Altivec builtin %qE", fndecl);
6817       return const0_rtx;
6818     }
6819
6820   target = altivec_expand_ld_builtin (exp, target, expandedp);
6821   if (*expandedp)
6822     return target;
6823
6824   target = altivec_expand_st_builtin (exp, target, expandedp);
6825   if (*expandedp)
6826     return target;
6827
6828   target = altivec_expand_dst_builtin (exp, target, expandedp);
6829   if (*expandedp)
6830     return target;
6831
6832   *expandedp = true;
6833
6834   switch (fcode)
6835     {
6836     case ALTIVEC_BUILTIN_STVX:
6837       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, arglist);
6838     case ALTIVEC_BUILTIN_STVEBX:
6839       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, arglist);
6840     case ALTIVEC_BUILTIN_STVEHX:
6841       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, arglist);
6842     case ALTIVEC_BUILTIN_STVEWX:
6843       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, arglist);
6844     case ALTIVEC_BUILTIN_STVXL:
6845       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, arglist);
6846
6847     case ALTIVEC_BUILTIN_MFVSCR:
6848       icode = CODE_FOR_altivec_mfvscr;
6849       tmode = insn_data[icode].operand[0].mode;
6850
6851       if (target == 0
6852           || GET_MODE (target) != tmode
6853           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6854         target = gen_reg_rtx (tmode);
6855
6856       pat = GEN_FCN (icode) (target);
6857       if (! pat)
6858         return 0;
6859       emit_insn (pat);
6860       return target;
6861
6862     case ALTIVEC_BUILTIN_MTVSCR:
6863       icode = CODE_FOR_altivec_mtvscr;
6864       arg0 = TREE_VALUE (arglist);
6865       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6866       mode0 = insn_data[icode].operand[0].mode;
6867
6868       /* If we got invalid arguments bail out before generating bad rtl.  */
6869       if (arg0 == error_mark_node)
6870         return const0_rtx;
6871
6872       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
6873         op0 = copy_to_mode_reg (mode0, op0);
6874
6875       pat = GEN_FCN (icode) (op0);
6876       if (pat)
6877         emit_insn (pat);
6878       return NULL_RTX;
6879
6880     case ALTIVEC_BUILTIN_DSSALL:
6881       emit_insn (gen_altivec_dssall ());
6882       return NULL_RTX;
6883
6884     case ALTIVEC_BUILTIN_DSS:
6885       icode = CODE_FOR_altivec_dss;
6886       arg0 = TREE_VALUE (arglist);
6887       STRIP_NOPS (arg0);
6888       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6889       mode0 = insn_data[icode].operand[0].mode;
6890
6891       /* If we got invalid arguments bail out before generating bad rtl.  */
6892       if (arg0 == error_mark_node)
6893         return const0_rtx;
6894
6895       if (TREE_CODE (arg0) != INTEGER_CST
6896           || TREE_INT_CST_LOW (arg0) & ~0x3)
6897         {
6898           error ("argument to dss must be a 2-bit unsigned literal");
6899           return const0_rtx;
6900         }
6901
6902       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
6903         op0 = copy_to_mode_reg (mode0, op0);
6904
6905       emit_insn (gen_altivec_dss (op0));
6906       return NULL_RTX;
6907     }
6908
6909   /* Expand abs* operations.  */
6910   d = (struct builtin_description *) bdesc_abs;
6911   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
6912     if (d->code == fcode)
6913       return altivec_expand_abs_builtin (d->icode, arglist, target);
6914
6915   /* Expand the AltiVec predicates.  */
6916   dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
6917   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
6918     if (dp->code == fcode)
6919       return altivec_expand_predicate_builtin (dp->icode, dp->opcode,
6920                                                arglist, target);
6921
6922   /* LV* are funky.  We initialized them differently.  */
6923   switch (fcode)
6924     {
6925     case ALTIVEC_BUILTIN_LVSL:
6926       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
6927                                         arglist, target);
6928     case ALTIVEC_BUILTIN_LVSR:
6929       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
6930                                         arglist, target);
6931     case ALTIVEC_BUILTIN_LVEBX:
6932       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
6933                                         arglist, target);
6934     case ALTIVEC_BUILTIN_LVEHX:
6935       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
6936                                         arglist, target);
6937     case ALTIVEC_BUILTIN_LVEWX:
6938       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
6939                                         arglist, target);
6940     case ALTIVEC_BUILTIN_LVXL:
6941       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
6942                                         arglist, target);
6943     case ALTIVEC_BUILTIN_LVX:
6944       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx,
6945                                         arglist, target);
6946     default:
6947       break;
6948       /* Fall through.  */
6949     }
6950
6951   *expandedp = false;
6952   return NULL_RTX;
6953 }
6954
6955 /* Binops that need to be initialized manually, but can be expanded
6956    automagically by rs6000_expand_binop_builtin.  */
6957 static struct builtin_description bdesc_2arg_spe[] =
6958 {
6959   { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
6960   { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
6961   { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
6962   { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
6963   { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
6964   { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
6965   { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
6966   { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
6967   { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
6968   { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
6969   { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
6970   { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
6971   { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
6972   { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
6973   { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
6974   { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
6975   { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
6976   { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
6977   { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
6978   { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
6979   { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
6980   { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
6981 };
6982
6983 /* Expand the builtin in EXP and store the result in TARGET.  Store
6984    true in *EXPANDEDP if we found a builtin to expand.
6985
6986    This expands the SPE builtins that are not simple unary and binary
6987    operations.  */
6988 static rtx
6989 spe_expand_builtin (tree exp, rtx target, bool *expandedp)
6990 {
6991   tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6992   tree arglist = TREE_OPERAND (exp, 1);
6993   tree arg1, arg0;
6994   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
6995   enum insn_code icode;
6996   enum machine_mode tmode, mode0;
6997   rtx pat, op0;
6998   struct builtin_description *d;
6999   size_t i;
7000
7001   *expandedp = true;
7002
7003   /* Syntax check for a 5-bit unsigned immediate.  */
7004   switch (fcode)
7005     {
7006     case SPE_BUILTIN_EVSTDD:
7007     case SPE_BUILTIN_EVSTDH:
7008     case SPE_BUILTIN_EVSTDW:
7009     case SPE_BUILTIN_EVSTWHE:
7010     case SPE_BUILTIN_EVSTWHO:
7011     case SPE_BUILTIN_EVSTWWE:
7012     case SPE_BUILTIN_EVSTWWO:
7013       arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7014       if (TREE_CODE (arg1) != INTEGER_CST
7015           || TREE_INT_CST_LOW (arg1) & ~0x1f)
7016         {
7017           error ("argument 2 must be a 5-bit unsigned literal");
7018           return const0_rtx;
7019         }
7020       break;
7021     default:
7022       break;
7023     }
7024
7025   /* The evsplat*i instructions are not quite generic.  */
7026   switch (fcode)
7027     {
7028     case SPE_BUILTIN_EVSPLATFI:
7029       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
7030                                          arglist, target);
7031     case SPE_BUILTIN_EVSPLATI:
7032       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
7033                                          arglist, target);
7034     default:
7035       break;
7036     }
7037
7038   d = (struct builtin_description *) bdesc_2arg_spe;
7039   for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
7040     if (d->code == fcode)
7041       return rs6000_expand_binop_builtin (d->icode, arglist, target);
7042
7043   d = (struct builtin_description *) bdesc_spe_predicates;
7044   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
7045     if (d->code == fcode)
7046       return spe_expand_predicate_builtin (d->icode, arglist, target);
7047
7048   d = (struct builtin_description *) bdesc_spe_evsel;
7049   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
7050     if (d->code == fcode)
7051       return spe_expand_evsel_builtin (d->icode, arglist, target);
7052
7053   switch (fcode)
7054     {
7055     case SPE_BUILTIN_EVSTDDX:
7056       return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, arglist);
7057     case SPE_BUILTIN_EVSTDHX:
7058       return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, arglist);
7059     case SPE_BUILTIN_EVSTDWX:
7060       return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, arglist);
7061     case SPE_BUILTIN_EVSTWHEX:
7062       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, arglist);
7063     case SPE_BUILTIN_EVSTWHOX:
7064       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, arglist);
7065     case SPE_BUILTIN_EVSTWWEX:
7066       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, arglist);
7067     case SPE_BUILTIN_EVSTWWOX:
7068       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, arglist);
7069     case SPE_BUILTIN_EVSTDD:
7070       return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, arglist);
7071     case SPE_BUILTIN_EVSTDH:
7072       return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, arglist);
7073     case SPE_BUILTIN_EVSTDW:
7074       return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, arglist);
7075     case SPE_BUILTIN_EVSTWHE:
7076       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, arglist);
7077     case SPE_BUILTIN_EVSTWHO:
7078       return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, arglist);
7079     case SPE_BUILTIN_EVSTWWE:
7080       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, arglist);
7081     case SPE_BUILTIN_EVSTWWO:
7082       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, arglist);
7083     case SPE_BUILTIN_MFSPEFSCR:
7084       icode = CODE_FOR_spe_mfspefscr;
7085       tmode = insn_data[icode].operand[0].mode;
7086
7087       if (target == 0
7088           || GET_MODE (target) != tmode
7089           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7090         target = gen_reg_rtx (tmode);
7091
7092       pat = GEN_FCN (icode) (target);
7093       if (! pat)
7094         return 0;
7095       emit_insn (pat);
7096       return target;
7097     case SPE_BUILTIN_MTSPEFSCR:
7098       icode = CODE_FOR_spe_mtspefscr;
7099       arg0 = TREE_VALUE (arglist);
7100       op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
7101       mode0 = insn_data[icode].operand[0].mode;
7102
7103       if (arg0 == error_mark_node)
7104         return const0_rtx;
7105
7106       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
7107         op0 = copy_to_mode_reg (mode0, op0);
7108
7109       pat = GEN_FCN (icode) (op0);
7110       if (pat)
7111         emit_insn (pat);
7112       return NULL_RTX;
7113     default:
7114       break;
7115     }
7116
7117   *expandedp = false;
7118   return NULL_RTX;
7119 }
7120
7121 static rtx
7122 spe_expand_predicate_builtin (enum insn_code icode, tree arglist, rtx target)
7123 {
7124   rtx pat, scratch, tmp;
7125   tree form = TREE_VALUE (arglist);
7126   tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
7127   tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7128   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
7129   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
7130   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7131   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
7132   int form_int;
7133   enum rtx_code code;
7134
7135   if (TREE_CODE (form) != INTEGER_CST)
7136     {
7137       error ("argument 1 of __builtin_spe_predicate must be a constant");
7138       return const0_rtx;
7139     }
7140   else
7141     form_int = TREE_INT_CST_LOW (form);
7142
7143   gcc_assert (mode0 == mode1);
7144
7145   if (arg0 == error_mark_node || arg1 == error_mark_node)
7146     return const0_rtx;
7147
7148   if (target == 0
7149       || GET_MODE (target) != SImode
7150       || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
7151     target = gen_reg_rtx (SImode);
7152
7153   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7154     op0 = copy_to_mode_reg (mode0, op0);
7155   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
7156     op1 = copy_to_mode_reg (mode1, op1);
7157
7158   scratch = gen_reg_rtx (CCmode);
7159
7160   pat = GEN_FCN (icode) (scratch, op0, op1);
7161   if (! pat)
7162     return const0_rtx;
7163   emit_insn (pat);
7164
7165   /* There are 4 variants for each predicate: _any_, _all_, _upper_,
7166      _lower_.  We use one compare, but look in different bits of the
7167      CR for each variant.
7168
7169      There are 2 elements in each SPE simd type (upper/lower).  The CR
7170      bits are set as follows:
7171
7172      BIT0  | BIT 1  | BIT 2   | BIT 3
7173      U     |   L    | (U | L) | (U & L)
7174
7175      So, for an "all" relationship, BIT 3 would be set.
7176      For an "any" relationship, BIT 2 would be set.  Etc.
7177
7178      Following traditional nomenclature, these bits map to:
7179
7180      BIT0  | BIT 1  | BIT 2   | BIT 3
7181      LT    | GT     | EQ      | OV
7182
7183      Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
7184   */
7185
7186   switch (form_int)
7187     {
7188       /* All variant.  OV bit.  */
7189     case 0:
7190       /* We need to get to the OV bit, which is the ORDERED bit.  We
7191          could generate (ordered:SI (reg:CC xx) (const_int 0)), but
7192          that's ugly and will make validate_condition_mode die.
7193          So let's just use another pattern.  */
7194       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
7195       return target;
7196       /* Any variant.  EQ bit.  */
7197     case 1:
7198       code = EQ;
7199       break;
7200       /* Upper variant.  LT bit.  */
7201     case 2:
7202       code = LT;
7203       break;
7204       /* Lower variant.  GT bit.  */
7205     case 3:
7206       code = GT;
7207       break;
7208     default:
7209       error ("argument 1 of __builtin_spe_predicate is out of range");
7210       return const0_rtx;
7211     }
7212
7213   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
7214   emit_move_insn (target, tmp);
7215
7216   return target;
7217 }
7218
7219 /* The evsel builtins look like this:
7220
7221      e = __builtin_spe_evsel_OP (a, b, c, d);
7222
7223    and work like this:
7224
7225      e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
7226      e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
7227 */
7228
7229 static rtx
7230 spe_expand_evsel_builtin (enum insn_code icode, tree arglist, rtx target)
7231 {
7232   rtx pat, scratch;
7233   tree arg0 = TREE_VALUE (arglist);
7234   tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
7235   tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7236   tree arg3 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist))));
7237   rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
7238   rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
7239   rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
7240   rtx op3 = expand_expr (arg3, NULL_RTX, VOIDmode, 0);
7241   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7242   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
7243
7244   gcc_assert (mode0 == mode1);
7245
7246   if (arg0 == error_mark_node || arg1 == error_mark_node
7247       || arg2 == error_mark_node || arg3 == error_mark_node)
7248     return const0_rtx;
7249
7250   if (target == 0
7251       || GET_MODE (target) != mode0
7252       || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
7253     target = gen_reg_rtx (mode0);
7254
7255   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7256     op0 = copy_to_mode_reg (mode0, op0);
7257   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
7258     op1 = copy_to_mode_reg (mode0, op1);
7259   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
7260     op2 = copy_to_mode_reg (mode0, op2);
7261   if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
7262     op3 = copy_to_mode_reg (mode0, op3);
7263
7264   /* Generate the compare.  */
7265   scratch = gen_reg_rtx (CCmode);
7266   pat = GEN_FCN (icode) (scratch, op0, op1);
7267   if (! pat)
7268     return const0_rtx;
7269   emit_insn (pat);
7270
7271   if (mode0 == V2SImode)
7272     emit_insn (gen_spe_evsel (target, op2, op3, scratch));
7273   else
7274     emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
7275
7276   return target;
7277 }
7278
7279 /* Expand an expression EXP that calls a built-in function,
7280    with result going to TARGET if that's convenient
7281    (and in mode MODE if that's convenient).
7282    SUBTARGET may be used as the target for computing one of EXP's operands.
7283    IGNORE is nonzero if the value is to be ignored.  */
7284
7285 static rtx
7286 rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
7287                        enum machine_mode mode ATTRIBUTE_UNUSED,
7288                        int ignore ATTRIBUTE_UNUSED)
7289 {
7290   tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7291   tree arglist = TREE_OPERAND (exp, 1);
7292   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
7293   struct builtin_description *d;
7294   size_t i;
7295   rtx ret;
7296   bool success;
7297
7298   if (fcode == ALTIVEC_BUILTIN_MASK_FOR_LOAD
7299       || fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
7300     {
7301       int icode = (int) CODE_FOR_altivec_lvsr;
7302       enum machine_mode tmode = insn_data[icode].operand[0].mode;
7303       enum machine_mode mode = insn_data[icode].operand[1].mode;
7304       tree arg;
7305       rtx op, addr, pat;
7306
7307       gcc_assert (TARGET_ALTIVEC);
7308
7309       arg = TREE_VALUE (arglist);
7310       gcc_assert (TREE_CODE (TREE_TYPE (arg)) == POINTER_TYPE);
7311       op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
7312       addr = memory_address (mode, op);
7313       if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
7314         op = addr;
7315       else
7316         {
7317           /* For the load case need to negate the address.  */
7318           op = gen_reg_rtx (GET_MODE (addr));
7319           emit_insn (gen_rtx_SET (VOIDmode, op,
7320                          gen_rtx_NEG (GET_MODE (addr), addr)));
7321         }
7322       op = gen_rtx_MEM (mode, op);
7323
7324       if (target == 0
7325           || GET_MODE (target) != tmode
7326           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7327         target = gen_reg_rtx (tmode);
7328
7329       /*pat = gen_altivec_lvsr (target, op);*/
7330       pat = GEN_FCN (icode) (target, op);
7331       if (!pat)
7332         return 0;
7333       emit_insn (pat);
7334
7335       return target;
7336     }
7337
7338   if (TARGET_ALTIVEC)
7339     {
7340       ret = altivec_expand_builtin (exp, target, &success);
7341
7342       if (success)
7343         return ret;
7344     }
7345   if (TARGET_SPE)
7346     {
7347       ret = spe_expand_builtin (exp, target, &success);
7348
7349       if (success)
7350         return ret;
7351     }
7352
7353   gcc_assert (TARGET_ALTIVEC || TARGET_SPE);
7354   
7355   /* Handle simple unary operations.  */
7356   d = (struct builtin_description *) bdesc_1arg;
7357   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
7358     if (d->code == fcode)
7359       return rs6000_expand_unop_builtin (d->icode, arglist, target);
7360   
7361   /* Handle simple binary operations.  */
7362   d = (struct builtin_description *) bdesc_2arg;
7363   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
7364     if (d->code == fcode)
7365       return rs6000_expand_binop_builtin (d->icode, arglist, target);
7366
7367   /* Handle simple ternary operations.  */
7368   d = (struct builtin_description *) bdesc_3arg;
7369   for (i = 0; i < ARRAY_SIZE  (bdesc_3arg); i++, d++)
7370     if (d->code == fcode)
7371       return rs6000_expand_ternop_builtin (d->icode, arglist, target);
7372   
7373   gcc_unreachable ();
7374 }
7375
7376 static tree
7377 build_opaque_vector_type (tree node, int nunits)
7378 {
7379   node = copy_node (node);
7380   TYPE_MAIN_VARIANT (node) = node;
7381   return build_vector_type (node, nunits);
7382 }
7383
7384 static void
7385 rs6000_init_builtins (void)
7386 {
7387   V2SI_type_node = build_vector_type (intSI_type_node, 2);
7388   V2SF_type_node = build_vector_type (float_type_node, 2);
7389   V4HI_type_node = build_vector_type (intHI_type_node, 4);
7390   V4SI_type_node = build_vector_type (intSI_type_node, 4);
7391   V4SF_type_node = build_vector_type (float_type_node, 4);
7392   V8HI_type_node = build_vector_type (intHI_type_node, 8);
7393   V16QI_type_node = build_vector_type (intQI_type_node, 16);
7394
7395   unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16);
7396   unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8);
7397   unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4);
7398
7399   opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2);
7400   opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2);
7401   opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
7402   opaque_V4SI_type_node = copy_node (V4SI_type_node);
7403
7404   /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
7405      types, especially in C++ land.  Similarly, 'vector pixel' is distinct from
7406      'vector unsigned short'.  */
7407
7408   bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
7409   bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
7410   bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
7411   pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
7412
7413   long_integer_type_internal_node = long_integer_type_node;
7414   long_unsigned_type_internal_node = long_unsigned_type_node;
7415   intQI_type_internal_node = intQI_type_node;
7416   uintQI_type_internal_node = unsigned_intQI_type_node;
7417   intHI_type_internal_node = intHI_type_node;
7418   uintHI_type_internal_node = unsigned_intHI_type_node;
7419   intSI_type_internal_node = intSI_type_node;
7420   uintSI_type_internal_node = unsigned_intSI_type_node;
7421   float_type_internal_node = float_type_node;
7422   void_type_internal_node = void_type_node;
7423
7424   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7425                                             get_identifier ("__bool char"),
7426                                             bool_char_type_node));
7427   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7428                                             get_identifier ("__bool short"),
7429                                             bool_short_type_node));
7430   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7431                                             get_identifier ("__bool int"),
7432                                             bool_int_type_node));
7433   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7434                                             get_identifier ("__pixel"),
7435                                             pixel_type_node));
7436
7437   bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
7438   bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
7439   bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
7440   pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
7441
7442   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7443                                             get_identifier ("__vector unsigned char"),
7444                                             unsigned_V16QI_type_node));
7445   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7446                                             get_identifier ("__vector signed char"),
7447                                             V16QI_type_node));
7448   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7449                                             get_identifier ("__vector __bool char"),
7450                                             bool_V16QI_type_node));
7451
7452   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7453                                             get_identifier ("__vector unsigned short"),
7454                                             unsigned_V8HI_type_node));
7455   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7456                                             get_identifier ("__vector signed short"),
7457                                             V8HI_type_node));
7458   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7459                                             get_identifier ("__vector __bool short"),
7460                                             bool_V8HI_type_node));
7461
7462   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7463                                             get_identifier ("__vector unsigned int"),
7464                                             unsigned_V4SI_type_node));
7465   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7466                                             get_identifier ("__vector signed int"),
7467                                             V4SI_type_node));
7468   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7469                                             get_identifier ("__vector __bool int"),
7470                                             bool_V4SI_type_node));
7471
7472   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7473                                             get_identifier ("__vector float"),
7474                                             V4SF_type_node));
7475   (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7476                                             get_identifier ("__vector __pixel"),
7477                                             pixel_V8HI_type_node));
7478
7479   if (TARGET_SPE)
7480     spe_init_builtins ();
7481   if (TARGET_ALTIVEC)
7482     altivec_init_builtins ();
7483   if (TARGET_ALTIVEC || TARGET_SPE)
7484     rs6000_common_init_builtins ();
7485 }
7486
7487 /* Search through a set of builtins and enable the mask bits.
7488    DESC is an array of builtins.
7489    SIZE is the total number of builtins.
7490    START is the builtin enum at which to start.
7491    END is the builtin enum at which to end.  */
7492 static void
7493 enable_mask_for_builtins (struct builtin_description *desc, int size,
7494                           enum rs6000_builtins start,
7495                           enum rs6000_builtins end)
7496 {
7497   int i;
7498
7499   for (i = 0; i < size; ++i)
7500     if (desc[i].code == start)
7501       break;
7502
7503   if (i == size)
7504     return;
7505
7506   for (; i < size; ++i)
7507     {
7508       /* Flip all the bits on.  */
7509       desc[i].mask = target_flags;
7510       if (desc[i].code == end)
7511         break;
7512     }
7513 }
7514
7515 static void
7516 spe_init_builtins (void)
7517 {
7518   tree endlink = void_list_node;
7519   tree puint_type_node = build_pointer_type (unsigned_type_node);
7520   tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
7521   struct builtin_description *d;
7522   size_t i;
7523
7524   tree v2si_ftype_4_v2si
7525     = build_function_type
7526     (opaque_V2SI_type_node,
7527      tree_cons (NULL_TREE, opaque_V2SI_type_node,
7528                 tree_cons (NULL_TREE, opaque_V2SI_type_node,
7529                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
7530                                       tree_cons (NULL_TREE, opaque_V2SI_type_node,
7531                                                  endlink)))));
7532
7533   tree v2sf_ftype_4_v2sf
7534     = build_function_type
7535     (opaque_V2SF_type_node,
7536      tree_cons (NULL_TREE, opaque_V2SF_type_node,
7537                 tree_cons (NULL_TREE, opaque_V2SF_type_node,
7538                            tree_cons (NULL_TREE, opaque_V2SF_type_node,
7539                                       tree_cons (NULL_TREE, opaque_V2SF_type_node,
7540                                                  endlink)))));
7541
7542   tree int_ftype_int_v2si_v2si
7543     = build_function_type
7544     (integer_type_node,
7545      tree_cons (NULL_TREE, integer_type_node,
7546                 tree_cons (NULL_TREE, opaque_V2SI_type_node,
7547                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
7548                                       endlink))));
7549
7550   tree int_ftype_int_v2sf_v2sf
7551     = build_function_type
7552     (integer_type_node,
7553      tree_cons (NULL_TREE, integer_type_node,
7554                 tree_cons (NULL_TREE, opaque_V2SF_type_node,
7555                            tree_cons (NULL_TREE, opaque_V2SF_type_node,
7556                                       endlink))));
7557
7558   tree void_ftype_v2si_puint_int
7559     = build_function_type (void_type_node,
7560                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
7561                                       tree_cons (NULL_TREE, puint_type_node,
7562                                                  tree_cons (NULL_TREE,
7563                                                             integer_type_node,
7564                                                             endlink))));
7565
7566   tree void_ftype_v2si_puint_char
7567     = build_function_type (void_type_node,
7568                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
7569                                       tree_cons (NULL_TREE, puint_type_node,
7570                                                  tree_cons (NULL_TREE,
7571                                                             char_type_node,
7572                                                             endlink))));
7573
7574   tree void_ftype_v2si_pv2si_int
7575     = build_function_type (void_type_node,
7576                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
7577                                       tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
7578                                                  tree_cons (NULL_TREE,
7579                                                             integer_type_node,
7580                                                             endlink))));
7581
7582   tree void_ftype_v2si_pv2si_char
7583     = build_function_type (void_type_node,
7584                            tree_cons (NULL_TREE, opaque_V2SI_type_node,
7585                                       tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
7586                                                  tree_cons (NULL_TREE,
7587                                                             char_type_node,
7588                                                             endlink))));
7589
7590   tree void_ftype_int
7591     = build_function_type (void_type_node,
7592                            tree_cons (NULL_TREE, integer_type_node, endlink));
7593
7594   tree int_ftype_void
7595     = build_function_type (integer_type_node, endlink);
7596
7597   tree v2si_ftype_pv2si_int
7598     = build_function_type (opaque_V2SI_type_node,
7599                            tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
7600                                       tree_cons (NULL_TREE, integer_type_node,
7601                                                  endlink)));
7602
7603   tree v2si_ftype_puint_int
7604     = build_function_type (opaque_V2SI_type_node,
7605                            tree_cons (NULL_TREE, puint_type_node,
7606                                       tree_cons (NULL_TREE, integer_type_node,
7607                                                  endlink)));
7608
7609   tree v2si_ftype_pushort_int
7610     = build_function_type (opaque_V2SI_type_node,
7611                            tree_cons (NULL_TREE, pushort_type_node,
7612                                       tree_cons (NULL_TREE, integer_type_node,
7613                                                  endlink)));
7614
7615   tree v2si_ftype_signed_char
7616     = build_function_type (opaque_V2SI_type_node,
7617                            tree_cons (NULL_TREE, signed_char_type_node,
7618                                       endlink));
7619
7620   /* The initialization of the simple binary and unary builtins is
7621      done in rs6000_common_init_builtins, but we have to enable the
7622      mask bits here manually because we have run out of `target_flags'
7623      bits.  We really need to redesign this mask business.  */
7624
7625   enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
7626                             ARRAY_SIZE (bdesc_2arg),
7627                             SPE_BUILTIN_EVADDW,
7628                             SPE_BUILTIN_EVXOR);
7629   enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
7630                             ARRAY_SIZE (bdesc_1arg),
7631                             SPE_BUILTIN_EVABS,
7632                             SPE_BUILTIN_EVSUBFUSIAAW);
7633   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
7634                             ARRAY_SIZE (bdesc_spe_predicates),
7635                             SPE_BUILTIN_EVCMPEQ,
7636                             SPE_BUILTIN_EVFSTSTLT);
7637   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
7638                             ARRAY_SIZE (bdesc_spe_evsel),
7639                             SPE_BUILTIN_EVSEL_CMPGTS,
7640                             SPE_BUILTIN_EVSEL_FSTSTEQ);
7641
7642   (*lang_hooks.decls.pushdecl)
7643     (build_decl (TYPE_DECL, get_identifier ("__ev64_opaque__"),
7644                  opaque_V2SI_type_node));
7645
7646   /* Initialize irregular SPE builtins.  */
7647
7648   def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
7649   def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
7650   def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
7651   def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
7652   def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
7653   def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
7654   def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
7655   def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
7656   def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
7657   def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
7658   def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
7659   def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
7660   def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
7661   def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
7662   def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
7663   def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
7664   def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
7665   def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
7666
7667   /* Loads.  */
7668   def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
7669   def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
7670   def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
7671   def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
7672   def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
7673   def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
7674   def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
7675   def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
7676   def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
7677   def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
7678   def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
7679   def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
7680   def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
7681   def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
7682   def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
7683   def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
7684   def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
7685   def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
7686   def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
7687   def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
7688   def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
7689   def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
7690
7691   /* Predicates.  */
7692   d = (struct builtin_description *) bdesc_spe_predicates;
7693   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
7694     {
7695       tree type;
7696
7697       switch (insn_data[d->icode].operand[1].mode)
7698         {
7699         case V2SImode:
7700           type = int_ftype_int_v2si_v2si;
7701           break;
7702         case V2SFmode:
7703           type = int_ftype_int_v2sf_v2sf;
7704           break;
7705         default:
7706           gcc_unreachable ();
7707         }
7708
7709       def_builtin (d->mask, d->name, type, d->code);
7710     }
7711
7712   /* Evsel predicates.  */
7713   d = (struct builtin_description *) bdesc_spe_evsel;
7714   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
7715     {
7716       tree type;
7717
7718       switch (insn_data[d->icode].operand[1].mode)
7719         {
7720         case V2SImode:
7721           type = v2si_ftype_4_v2si;
7722           break;
7723         case V2SFmode:
7724           type = v2sf_ftype_4_v2sf;
7725           break;
7726         default:
7727           gcc_unreachable ();
7728         }
7729
7730       def_builtin (d->mask, d->name, type, d->code);
7731     }
7732 }
7733
7734 static void
7735 altivec_init_builtins (void)
7736 {
7737   struct builtin_description *d;
7738   struct builtin_description_predicates *dp;
7739   size_t i;
7740   tree pfloat_type_node = build_pointer_type (float_type_node);
7741   tree pint_type_node = build_pointer_type (integer_type_node);
7742   tree pshort_type_node = build_pointer_type (short_integer_type_node);
7743   tree pchar_type_node = build_pointer_type (char_type_node);
7744
7745   tree pvoid_type_node = build_pointer_type (void_type_node);
7746
7747   tree pcfloat_type_node = build_pointer_type (build_qualified_type (float_type_node, TYPE_QUAL_CONST));
7748   tree pcint_type_node = build_pointer_type (build_qualified_type (integer_type_node, TYPE_QUAL_CONST));
7749   tree pcshort_type_node = build_pointer_type (build_qualified_type (short_integer_type_node, TYPE_QUAL_CONST));
7750   tree pcchar_type_node = build_pointer_type (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
7751
7752   tree pcvoid_type_node = build_pointer_type (build_qualified_type (void_type_node, TYPE_QUAL_CONST));
7753
7754   tree int_ftype_opaque
7755     = build_function_type_list (integer_type_node,
7756                                 opaque_V4SI_type_node, NULL_TREE);
7757
7758   tree opaque_ftype_opaque_int
7759     = build_function_type_list (opaque_V4SI_type_node,
7760                                 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
7761   tree opaque_ftype_opaque_opaque_int
7762     = build_function_type_list (opaque_V4SI_type_node,
7763                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
7764                                 integer_type_node, NULL_TREE);
7765   tree int_ftype_int_opaque_opaque
7766     = build_function_type_list (integer_type_node,
7767                                 integer_type_node, opaque_V4SI_type_node,
7768                                 opaque_V4SI_type_node, NULL_TREE);
7769   tree int_ftype_int_v4si_v4si
7770     = build_function_type_list (integer_type_node,
7771                                 integer_type_node, V4SI_type_node,
7772                                 V4SI_type_node, NULL_TREE);
7773   tree v4sf_ftype_pcfloat
7774     = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
7775   tree void_ftype_pfloat_v4sf
7776     = build_function_type_list (void_type_node,
7777                                 pfloat_type_node, V4SF_type_node, NULL_TREE);
7778   tree v4si_ftype_pcint
7779     = build_function_type_list (V4SI_type_node, pcint_type_node, NULL_TREE);
7780   tree void_ftype_pint_v4si
7781     = build_function_type_list (void_type_node,
7782                                 pint_type_node, V4SI_type_node, NULL_TREE);
7783   tree v8hi_ftype_pcshort
7784     = build_function_type_list (V8HI_type_node, pcshort_type_node, NULL_TREE);
7785   tree void_ftype_pshort_v8hi
7786     = build_function_type_list (void_type_node,
7787                                 pshort_type_node, V8HI_type_node, NULL_TREE);
7788   tree v16qi_ftype_pcchar
7789     = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
7790   tree void_ftype_pchar_v16qi
7791     = build_function_type_list (void_type_node,
7792                                 pchar_type_node, V16QI_type_node, NULL_TREE);
7793   tree void_ftype_v4si
7794     = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
7795   tree v8hi_ftype_void
7796     = build_function_type (V8HI_type_node, void_list_node);
7797   tree void_ftype_void
7798     = build_function_type (void_type_node, void_list_node);
7799   tree void_ftype_int
7800     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
7801
7802   tree opaque_ftype_long_pcvoid
7803     = build_function_type_list (opaque_V4SI_type_node,
7804                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
7805   tree v16qi_ftype_long_pcvoid
7806     = build_function_type_list (V16QI_type_node,
7807                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
7808   tree v8hi_ftype_long_pcvoid
7809     = build_function_type_list (V8HI_type_node,
7810                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
7811   tree v4si_ftype_long_pcvoid
7812     = build_function_type_list (V4SI_type_node,
7813                                 long_integer_type_node, pcvoid_type_node, NULL_TREE);
7814
7815   tree void_ftype_opaque_long_pvoid
7816     = build_function_type_list (void_type_node,
7817                                 opaque_V4SI_type_node, long_integer_type_node,
7818                                 pvoid_type_node, NULL_TREE);
7819   tree void_ftype_v4si_long_pvoid
7820     = build_function_type_list (void_type_node,
7821                                 V4SI_type_node, long_integer_type_node,
7822                                 pvoid_type_node, NULL_TREE);
7823   tree void_ftype_v16qi_long_pvoid
7824     = build_function_type_list (void_type_node,
7825                                 V16QI_type_node, long_integer_type_node,
7826                                 pvoid_type_node, NULL_TREE);
7827   tree void_ftype_v8hi_long_pvoid
7828     = build_function_type_list (void_type_node,
7829                                 V8HI_type_node, long_integer_type_node,
7830                                 pvoid_type_node, NULL_TREE);
7831   tree int_ftype_int_v8hi_v8hi
7832     = build_function_type_list (integer_type_node,
7833                                 integer_type_node, V8HI_type_node,
7834                                 V8HI_type_node, NULL_TREE);
7835   tree int_ftype_int_v16qi_v16qi
7836     = build_function_type_list (integer_type_node,
7837                                 integer_type_node, V16QI_type_node,
7838                                 V16QI_type_node, NULL_TREE);
7839   tree int_ftype_int_v4sf_v4sf
7840     = build_function_type_list (integer_type_node,
7841                                 integer_type_node, V4SF_type_node,
7842                                 V4SF_type_node, NULL_TREE);
7843   tree v4si_ftype_v4si
7844     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
7845   tree v8hi_ftype_v8hi
7846     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
7847   tree v16qi_ftype_v16qi
7848     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
7849   tree v4sf_ftype_v4sf
7850     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
7851   tree void_ftype_pcvoid_int_int
7852     = build_function_type_list (void_type_node,
7853                                 pcvoid_type_node, integer_type_node,
7854                                 integer_type_node, NULL_TREE);
7855
7856   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4sf", v4sf_ftype_pcfloat,
7857                ALTIVEC_BUILTIN_LD_INTERNAL_4sf);
7858   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4sf", void_ftype_pfloat_v4sf,
7859                ALTIVEC_BUILTIN_ST_INTERNAL_4sf);
7860   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4si", v4si_ftype_pcint,
7861                ALTIVEC_BUILTIN_LD_INTERNAL_4si);
7862   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4si", void_ftype_pint_v4si,
7863                ALTIVEC_BUILTIN_ST_INTERNAL_4si);
7864   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_8hi", v8hi_ftype_pcshort,
7865                ALTIVEC_BUILTIN_LD_INTERNAL_8hi);
7866   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_8hi", void_ftype_pshort_v8hi,
7867                ALTIVEC_BUILTIN_ST_INTERNAL_8hi);
7868   def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_16qi", v16qi_ftype_pcchar,
7869                ALTIVEC_BUILTIN_LD_INTERNAL_16qi);
7870   def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_16qi", void_ftype_pchar_v16qi,
7871                ALTIVEC_BUILTIN_ST_INTERNAL_16qi);
7872   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
7873   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
7874   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
7875   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
7876   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
7877   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
7878   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
7879   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
7880   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
7881   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
7882   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
7883   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
7884   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
7885   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
7886   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
7887   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
7888   def_builtin (MASK_ALTIVEC, "__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
7889   def_builtin (MASK_ALTIVEC, "__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
7890   def_builtin (MASK_ALTIVEC, "__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
7891   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
7892   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
7893   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
7894   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
7895   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
7896   def_builtin (MASK_ALTIVEC, "__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
7897   def_builtin (MASK_ALTIVEC, "__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
7898   def_builtin (MASK_ALTIVEC, "__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
7899   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
7900   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
7901   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
7902
7903   def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
7904
7905   def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
7906   def_builtin (MASK_ALTIVEC, "__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
7907   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
7908   def_builtin (MASK_ALTIVEC, "__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
7909   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
7910   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
7911   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
7912   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
7913   def_builtin (MASK_ALTIVEC, "__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
7914   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
7915
7916   /* Add the DST variants.  */
7917   d = (struct builtin_description *) bdesc_dst;
7918   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
7919     def_builtin (d->mask, d->name, void_ftype_pcvoid_int_int, d->code);
7920
7921   /* Initialize the predicates.  */
7922   dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
7923   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
7924     {
7925       enum machine_mode mode1;
7926       tree type;
7927       bool is_overloaded = dp->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
7928                            && dp->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
7929
7930       if (is_overloaded)
7931         mode1 = VOIDmode;
7932       else
7933         mode1 = insn_data[dp->icode].operand[1].mode;
7934
7935       switch (mode1)
7936         {
7937         case VOIDmode:
7938           type = int_ftype_int_opaque_opaque;
7939           break;
7940         case V4SImode:
7941           type = int_ftype_int_v4si_v4si;
7942           break;
7943         case V8HImode:
7944           type = int_ftype_int_v8hi_v8hi;
7945           break;
7946         case V16QImode:
7947           type = int_ftype_int_v16qi_v16qi;
7948           break;
7949         case V4SFmode:
7950           type = int_ftype_int_v4sf_v4sf;
7951           break;
7952         default:
7953           gcc_unreachable ();
7954         }
7955
7956       def_builtin (dp->mask, dp->name, type, dp->code);
7957     }
7958
7959   /* Initialize the abs* operators.  */
7960   d = (struct builtin_description *) bdesc_abs;
7961   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
7962     {
7963       enum machine_mode mode0;
7964       tree type;
7965
7966       mode0 = insn_data[d->icode].operand[0].mode;
7967
7968       switch (mode0)
7969         {
7970         case V4SImode:
7971           type = v4si_ftype_v4si;
7972           break;
7973         case V8HImode:
7974           type = v8hi_ftype_v8hi;
7975           break;
7976         case V16QImode:
7977           type = v16qi_ftype_v16qi;
7978           break;
7979         case V4SFmode:
7980           type = v4sf_ftype_v4sf;
7981           break;
7982         default:
7983           gcc_unreachable ();
7984         }
7985
7986       def_builtin (d->mask, d->name, type, d->code);
7987     }
7988
7989   if (TARGET_ALTIVEC)
7990     {
7991       tree decl;
7992
7993       /* Initialize target builtin that implements
7994          targetm.vectorize.builtin_mask_for_load.  */
7995
7996       decl = lang_hooks.builtin_function ("__builtin_altivec_mask_for_load",
7997                                v16qi_ftype_long_pcvoid,
7998                                ALTIVEC_BUILTIN_MASK_FOR_LOAD,
7999                                BUILT_IN_MD, NULL,
8000                                tree_cons (get_identifier ("const"),
8001                                           NULL_TREE, NULL_TREE));
8002       /* Record the decl. Will be used by rs6000_builtin_mask_for_load.  */
8003       altivec_builtin_mask_for_load = decl;
8004     }
8005 }
8006
8007 static void
8008 rs6000_common_init_builtins (void)
8009 {
8010   struct builtin_description *d;
8011   size_t i;
8012
8013   tree v4sf_ftype_v4sf_v4sf_v16qi
8014     = build_function_type_list (V4SF_type_node,
8015                                 V4SF_type_node, V4SF_type_node,
8016                                 V16QI_type_node, NULL_TREE);
8017   tree v4si_ftype_v4si_v4si_v16qi
8018     = build_function_type_list (V4SI_type_node,
8019                                 V4SI_type_node, V4SI_type_node,
8020                                 V16QI_type_node, NULL_TREE);
8021   tree v8hi_ftype_v8hi_v8hi_v16qi
8022     = build_function_type_list (V8HI_type_node,
8023                                 V8HI_type_node, V8HI_type_node,
8024                                 V16QI_type_node, NULL_TREE);
8025   tree v16qi_ftype_v16qi_v16qi_v16qi
8026     = build_function_type_list (V16QI_type_node,
8027                                 V16QI_type_node, V16QI_type_node,
8028                                 V16QI_type_node, NULL_TREE);
8029   tree v4si_ftype_int
8030     = build_function_type_list (V4SI_type_node, integer_type_node, NULL_TREE);
8031   tree v8hi_ftype_int
8032     = build_function_type_list (V8HI_type_node, integer_type_node, NULL_TREE);
8033   tree v16qi_ftype_int
8034     = build_function_type_list (V16QI_type_node, integer_type_node, NULL_TREE);
8035   tree v8hi_ftype_v16qi
8036     = build_function_type_list (V8HI_type_node, V16QI_type_node, NULL_TREE);
8037   tree v4sf_ftype_v4sf
8038     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
8039
8040   tree v2si_ftype_v2si_v2si
8041     = build_function_type_list (opaque_V2SI_type_node,
8042                                 opaque_V2SI_type_node,
8043                                 opaque_V2SI_type_node, NULL_TREE);
8044
8045   tree v2sf_ftype_v2sf_v2sf
8046     = build_function_type_list (opaque_V2SF_type_node,
8047                                 opaque_V2SF_type_node,
8048                                 opaque_V2SF_type_node, NULL_TREE);
8049
8050   tree v2si_ftype_int_int
8051     = build_function_type_list (opaque_V2SI_type_node,
8052                                 integer_type_node, integer_type_node,
8053                                 NULL_TREE);
8054
8055   tree opaque_ftype_opaque
8056     = build_function_type_list (opaque_V4SI_type_node,
8057                                 opaque_V4SI_type_node, NULL_TREE);
8058
8059   tree v2si_ftype_v2si
8060     = build_function_type_list (opaque_V2SI_type_node,
8061                                 opaque_V2SI_type_node, NULL_TREE);
8062
8063   tree v2sf_ftype_v2sf
8064     = build_function_type_list (opaque_V2SF_type_node,
8065                                 opaque_V2SF_type_node, NULL_TREE);
8066
8067   tree v2sf_ftype_v2si
8068     = build_function_type_list (opaque_V2SF_type_node,
8069                                 opaque_V2SI_type_node, NULL_TREE);
8070
8071   tree v2si_ftype_v2sf
8072     = build_function_type_list (opaque_V2SI_type_node,
8073                                 opaque_V2SF_type_node, NULL_TREE);
8074
8075   tree v2si_ftype_v2si_char
8076     = build_function_type_list (opaque_V2SI_type_node,
8077                                 opaque_V2SI_type_node,
8078                                 char_type_node, NULL_TREE);
8079
8080   tree v2si_ftype_int_char
8081     = build_function_type_list (opaque_V2SI_type_node,
8082                                 integer_type_node, char_type_node, NULL_TREE);
8083
8084   tree v2si_ftype_char
8085     = build_function_type_list (opaque_V2SI_type_node,
8086                                 char_type_node, NULL_TREE);
8087
8088   tree int_ftype_int_int
8089     = build_function_type_list (integer_type_node,
8090                                 integer_type_node, integer_type_node,
8091                                 NULL_TREE);
8092
8093   tree opaque_ftype_opaque_opaque
8094     = build_function_type_list (opaque_V4SI_type_node,
8095                                 opaque_V4SI_type_node, opaque_V4SI_type_node, NULL_TREE);
8096   tree v4si_ftype_v4si_v4si
8097     = build_function_type_list (V4SI_type_node,
8098                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
8099   tree v4sf_ftype_v4si_int
8100     = build_function_type_list (V4SF_type_node,
8101                                 V4SI_type_node, integer_type_node, NULL_TREE);
8102   tree v4si_ftype_v4sf_int
8103     = build_function_type_list (V4SI_type_node,
8104                                 V4SF_type_node, integer_type_node, NULL_TREE);
8105   tree v4si_ftype_v4si_int
8106     = build_function_type_list (V4SI_type_node,
8107                                 V4SI_type_node, integer_type_node, NULL_TREE);
8108   tree v8hi_ftype_v8hi_int
8109     = build_function_type_list (V8HI_type_node,
8110                                 V8HI_type_node, integer_type_node, NULL_TREE);
8111   tree v16qi_ftype_v16qi_int
8112     = build_function_type_list (V16QI_type_node,
8113                                 V16QI_type_node, integer_type_node, NULL_TREE);
8114   tree v16qi_ftype_v16qi_v16qi_int
8115     = build_function_type_list (V16QI_type_node,
8116                                 V16QI_type_node, V16QI_type_node,
8117                                 integer_type_node, NULL_TREE);
8118   tree v8hi_ftype_v8hi_v8hi_int
8119     = build_function_type_list (V8HI_type_node,
8120                                 V8HI_type_node, V8HI_type_node,
8121                                 integer_type_node, NULL_TREE);
8122   tree v4si_ftype_v4si_v4si_int
8123     = build_function_type_list (V4SI_type_node,
8124                                 V4SI_type_node, V4SI_type_node,
8125                                 integer_type_node, NULL_TREE);
8126   tree v4sf_ftype_v4sf_v4sf_int
8127     = build_function_type_list (V4SF_type_node,
8128                                 V4SF_type_node, V4SF_type_node,
8129                                 integer_type_node, NULL_TREE);
8130   tree v4sf_ftype_v4sf_v4sf
8131     = build_function_type_list (V4SF_type_node,
8132                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
8133   tree opaque_ftype_opaque_opaque_opaque
8134     = build_function_type_list (opaque_V4SI_type_node,
8135                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
8136                                 opaque_V4SI_type_node, NULL_TREE);
8137   tree v4sf_ftype_v4sf_v4sf_v4si
8138     = build_function_type_list (V4SF_type_node,
8139                                 V4SF_type_node, V4SF_type_node,
8140                                 V4SI_type_node, NULL_TREE);
8141   tree v4sf_ftype_v4sf_v4sf_v4sf
8142     = build_function_type_list (V4SF_type_node,
8143                                 V4SF_type_node, V4SF_type_node,
8144                                 V4SF_type_node, NULL_TREE);
8145   tree v4si_ftype_v4si_v4si_v4si
8146     = build_function_type_list (V4SI_type_node,
8147                                 V4SI_type_node, V4SI_type_node,
8148                                 V4SI_type_node, NULL_TREE);
8149   tree v8hi_ftype_v8hi_v8hi
8150     = build_function_type_list (V8HI_type_node,
8151                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
8152   tree v8hi_ftype_v8hi_v8hi_v8hi
8153     = build_function_type_list (V8HI_type_node,
8154                                 V8HI_type_node, V8HI_type_node,
8155                                 V8HI_type_node, NULL_TREE);
8156   tree v4si_ftype_v8hi_v8hi_v4si
8157     = build_function_type_list (V4SI_type_node,
8158                                 V8HI_type_node, V8HI_type_node,
8159                                 V4SI_type_node, NULL_TREE);
8160   tree v4si_ftype_v16qi_v16qi_v4si
8161     = build_function_type_list (V4SI_type_node,
8162                                 V16QI_type_node, V16QI_type_node,
8163                                 V4SI_type_node, NULL_TREE);
8164   tree v16qi_ftype_v16qi_v16qi
8165     = build_function_type_list (V16QI_type_node,
8166                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
8167   tree v4si_ftype_v4sf_v4sf
8168     = build_function_type_list (V4SI_type_node,
8169                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
8170   tree v8hi_ftype_v16qi_v16qi
8171     = build_function_type_list (V8HI_type_node,
8172                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
8173   tree v4si_ftype_v8hi_v8hi
8174     = build_function_type_list (V4SI_type_node,
8175                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
8176   tree v8hi_ftype_v4si_v4si
8177     = build_function_type_list (V8HI_type_node,
8178                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
8179   tree v16qi_ftype_v8hi_v8hi
8180     = build_function_type_list (V16QI_type_node,
8181                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
8182   tree v4si_ftype_v16qi_v4si
8183     = build_function_type_list (V4SI_type_node,
8184                                 V16QI_type_node, V4SI_type_node, NULL_TREE);
8185   tree v4si_ftype_v16qi_v16qi
8186     = build_function_type_list (V4SI_type_node,
8187                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
8188   tree v4si_ftype_v8hi_v4si
8189     = build_function_type_list (V4SI_type_node,
8190                                 V8HI_type_node, V4SI_type_node, NULL_TREE);
8191   tree v4si_ftype_v8hi
8192     = build_function_type_list (V4SI_type_node, V8HI_type_node, NULL_TREE);
8193   tree int_ftype_v4si_v4si
8194     = build_function_type_list (integer_type_node,
8195                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
8196   tree int_ftype_v4sf_v4sf
8197     = build_function_type_list (integer_type_node,
8198                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
8199   tree int_ftype_v16qi_v16qi
8200     = build_function_type_list (integer_type_node,
8201                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
8202   tree int_ftype_v8hi_v8hi
8203     = build_function_type_list (integer_type_node,
8204                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
8205
8206   /* Add the simple ternary operators.  */
8207   d = (struct builtin_description *) bdesc_3arg;
8208   for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
8209     {
8210       enum machine_mode mode0, mode1, mode2, mode3;
8211       tree type;
8212       bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
8213                            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
8214
8215       if (is_overloaded)
8216         {
8217           mode0 = VOIDmode;
8218           mode1 = VOIDmode;
8219           mode2 = VOIDmode;
8220           mode3 = VOIDmode;
8221         }
8222       else
8223         {
8224           if (d->name == 0 || d->icode == CODE_FOR_nothing)
8225             continue;
8226
8227           mode0 = insn_data[d->icode].operand[0].mode;
8228           mode1 = insn_data[d->icode].operand[1].mode;
8229           mode2 = insn_data[d->icode].operand[2].mode;
8230           mode3 = insn_data[d->icode].operand[3].mode;
8231         }
8232       
8233       /* When all four are of the same mode.  */
8234       if (mode0 == mode1 && mode1 == mode2 && mode2 == mode3)
8235         {
8236           switch (mode0)
8237             {
8238             case VOIDmode:
8239               type = opaque_ftype_opaque_opaque_opaque;
8240               break;
8241             case V4SImode:
8242               type = v4si_ftype_v4si_v4si_v4si;
8243               break;
8244             case V4SFmode:
8245               type = v4sf_ftype_v4sf_v4sf_v4sf;
8246               break;
8247             case V8HImode:
8248               type = v8hi_ftype_v8hi_v8hi_v8hi;
8249               break;
8250             case V16QImode:
8251               type = v16qi_ftype_v16qi_v16qi_v16qi;
8252               break;
8253             default:
8254               gcc_unreachable ();
8255             }
8256         }
8257       else if (mode0 == mode1 && mode1 == mode2 && mode3 == V16QImode)
8258         {
8259           switch (mode0)
8260             {
8261             case V4SImode:
8262               type = v4si_ftype_v4si_v4si_v16qi;
8263               break;
8264             case V4SFmode:
8265               type = v4sf_ftype_v4sf_v4sf_v16qi;
8266               break;
8267             case V8HImode:
8268               type = v8hi_ftype_v8hi_v8hi_v16qi;
8269               break;
8270             case V16QImode:
8271               type = v16qi_ftype_v16qi_v16qi_v16qi;
8272               break;
8273             default:
8274               gcc_unreachable ();
8275             }
8276         }
8277       else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode
8278                && mode3 == V4SImode)
8279         type = v4si_ftype_v16qi_v16qi_v4si;
8280       else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode
8281                && mode3 == V4SImode)
8282         type = v4si_ftype_v8hi_v8hi_v4si;
8283       else if (mode0 == V4SFmode && mode1 == V4SFmode && mode2 == V4SFmode
8284                && mode3 == V4SImode)
8285         type = v4sf_ftype_v4sf_v4sf_v4si;
8286
8287       /* vchar, vchar, vchar, 4 bit literal.  */
8288       else if (mode0 == V16QImode && mode1 == mode0 && mode2 == mode0
8289                && mode3 == QImode)
8290         type = v16qi_ftype_v16qi_v16qi_int;
8291
8292       /* vshort, vshort, vshort, 4 bit literal.  */
8293       else if (mode0 == V8HImode && mode1 == mode0 && mode2 == mode0
8294                && mode3 == QImode)
8295         type = v8hi_ftype_v8hi_v8hi_int;
8296
8297       /* vint, vint, vint, 4 bit literal.  */
8298       else if (mode0 == V4SImode && mode1 == mode0 && mode2 == mode0
8299                && mode3 == QImode)
8300         type = v4si_ftype_v4si_v4si_int;
8301
8302       /* vfloat, vfloat, vfloat, 4 bit literal.  */
8303       else if (mode0 == V4SFmode && mode1 == mode0 && mode2 == mode0
8304                && mode3 == QImode)
8305         type = v4sf_ftype_v4sf_v4sf_int;
8306
8307       else
8308         gcc_unreachable ();
8309
8310       def_builtin (d->mask, d->name, type, d->code);
8311     }
8312
8313   /* Add the simple binary operators.  */
8314   d = (struct builtin_description *) bdesc_2arg;
8315   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
8316     {
8317       enum machine_mode mode0, mode1, mode2;
8318       tree type;
8319       bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
8320                            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
8321
8322       if (is_overloaded)
8323         {
8324           mode0 = VOIDmode;
8325           mode1 = VOIDmode;
8326           mode2 = VOIDmode;
8327         }
8328       else
8329         { 
8330           if (d->name == 0 || d->icode == CODE_FOR_nothing)
8331             continue;
8332
8333           mode0 = insn_data[d->icode].operand[0].mode;
8334           mode1 = insn_data[d->icode].operand[1].mode;
8335           mode2 = insn_data[d->icode].operand[2].mode;
8336         }
8337
8338       /* When all three operands are of the same mode.  */
8339       if (mode0 == mode1 && mode1 == mode2)
8340         {
8341           switch (mode0)
8342             {
8343             case VOIDmode:
8344               type = opaque_ftype_opaque_opaque;
8345               break;
8346             case V4SFmode:
8347               type = v4sf_ftype_v4sf_v4sf;
8348               break;
8349             case V4SImode:
8350               type = v4si_ftype_v4si_v4si;
8351               break;
8352             case V16QImode:
8353               type = v16qi_ftype_v16qi_v16qi;
8354               break;
8355             case V8HImode:
8356               type = v8hi_ftype_v8hi_v8hi;
8357               break;
8358             case V2SImode:
8359               type = v2si_ftype_v2si_v2si;
8360               break;
8361             case V2SFmode:
8362               type = v2sf_ftype_v2sf_v2sf;
8363               break;
8364             case SImode:
8365               type = int_ftype_int_int;
8366               break;
8367             default:
8368               gcc_unreachable ();
8369             }
8370         }
8371
8372       /* A few other combos we really don't want to do manually.  */
8373
8374       /* vint, vfloat, vfloat.  */
8375       else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == V4SFmode)
8376         type = v4si_ftype_v4sf_v4sf;
8377
8378       /* vshort, vchar, vchar.  */
8379       else if (mode0 == V8HImode && mode1 == V16QImode && mode2 == V16QImode)
8380         type = v8hi_ftype_v16qi_v16qi;
8381
8382       /* vint, vshort, vshort.  */
8383       else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode)
8384         type = v4si_ftype_v8hi_v8hi;
8385
8386       /* vshort, vint, vint.  */
8387       else if (mode0 == V8HImode && mode1 == V4SImode && mode2 == V4SImode)
8388         type = v8hi_ftype_v4si_v4si;
8389
8390       /* vchar, vshort, vshort.  */
8391       else if (mode0 == V16QImode && mode1 == V8HImode && mode2 == V8HImode)
8392         type = v16qi_ftype_v8hi_v8hi;
8393
8394       /* vint, vchar, vint.  */
8395       else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V4SImode)
8396         type = v4si_ftype_v16qi_v4si;
8397
8398       /* vint, vchar, vchar.  */
8399       else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode)
8400         type = v4si_ftype_v16qi_v16qi;
8401
8402       /* vint, vshort, vint.  */
8403       else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V4SImode)
8404         type = v4si_ftype_v8hi_v4si;
8405
8406       /* vint, vint, 5 bit literal.  */
8407       else if (mode0 == V4SImode && mode1 == V4SImode && mode2 == QImode)
8408         type = v4si_ftype_v4si_int;
8409
8410       /* vshort, vshort, 5 bit literal.  */
8411       else if (mode0 == V8HImode && mode1 == V8HImode && mode2 == QImode)
8412         type = v8hi_ftype_v8hi_int;
8413
8414       /* vchar, vchar, 5 bit literal.  */
8415       else if (mode0 == V16QImode && mode1 == V16QImode && mode2 == QImode)
8416         type = v16qi_ftype_v16qi_int;
8417
8418       /* vfloat, vint, 5 bit literal.  */
8419       else if (mode0 == V4SFmode && mode1 == V4SImode && mode2 == QImode)
8420         type = v4sf_ftype_v4si_int;
8421
8422       /* vint, vfloat, 5 bit literal.  */
8423       else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == QImode)
8424         type = v4si_ftype_v4sf_int;
8425
8426       else if (mode0 == V2SImode && mode1 == SImode && mode2 == SImode)
8427         type = v2si_ftype_int_int;
8428
8429       else if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
8430         type = v2si_ftype_v2si_char;
8431
8432       else if (mode0 == V2SImode && mode1 == SImode && mode2 == QImode)
8433         type = v2si_ftype_int_char;
8434
8435       else
8436         {
8437           /* int, x, x.  */
8438           gcc_assert (mode0 == SImode);
8439           switch (mode1)
8440             {
8441             case V4SImode:
8442               type = int_ftype_v4si_v4si;
8443               break;
8444             case V4SFmode:
8445               type = int_ftype_v4sf_v4sf;
8446               break;
8447             case V16QImode:
8448               type = int_ftype_v16qi_v16qi;
8449               break;
8450             case V8HImode:
8451               type = int_ftype_v8hi_v8hi;
8452               break;
8453             default:
8454               gcc_unreachable ();
8455             }
8456         }
8457
8458       def_builtin (d->mask, d->name, type, d->code);
8459     }
8460
8461   /* Add the simple unary operators.  */
8462   d = (struct builtin_description *) bdesc_1arg;
8463   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
8464     {
8465       enum machine_mode mode0, mode1;
8466       tree type;
8467       bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
8468                            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
8469
8470       if (is_overloaded)
8471         {
8472           mode0 = VOIDmode;
8473           mode1 = VOIDmode;
8474         }
8475       else
8476         {
8477           if (d->name == 0 || d->icode == CODE_FOR_nothing)
8478             continue;
8479       
8480           mode0 = insn_data[d->icode].operand[0].mode;
8481           mode1 = insn_data[d->icode].operand[1].mode;
8482         }
8483
8484       if (mode0 == V4SImode && mode1 == QImode)
8485         type = v4si_ftype_int;
8486       else if (mode0 == V8HImode && mode1 == QImode)
8487         type = v8hi_ftype_int;
8488       else if (mode0 == V16QImode && mode1 == QImode)
8489         type = v16qi_ftype_int;
8490       else if (mode0 == VOIDmode && mode1 == VOIDmode)
8491         type = opaque_ftype_opaque;
8492       else if (mode0 == V4SFmode && mode1 == V4SFmode)
8493         type = v4sf_ftype_v4sf;
8494       else if (mode0 == V8HImode && mode1 == V16QImode)
8495         type = v8hi_ftype_v16qi;
8496       else if (mode0 == V4SImode && mode1 == V8HImode)
8497         type = v4si_ftype_v8hi;
8498       else if (mode0 == V2SImode && mode1 == V2SImode)
8499         type = v2si_ftype_v2si;
8500       else if (mode0 == V2SFmode && mode1 == V2SFmode)
8501         type = v2sf_ftype_v2sf;
8502       else if (mode0 == V2SFmode && mode1 == V2SImode)
8503         type = v2sf_ftype_v2si;
8504       else if (mode0 == V2SImode && mode1 == V2SFmode)
8505         type = v2si_ftype_v2sf;
8506       else if (mode0 == V2SImode && mode1 == QImode)
8507         type = v2si_ftype_char;
8508       else
8509         gcc_unreachable ();
8510
8511       def_builtin (d->mask, d->name, type, d->code);
8512     }
8513 }
8514
8515 static void
8516 rs6000_init_libfuncs (void)
8517 {
8518   if (!TARGET_HARD_FLOAT)
8519     return;
8520
8521   if (DEFAULT_ABI != ABI_V4)
8522     {
8523       if (TARGET_XCOFF && ! TARGET_POWER2 && ! TARGET_POWERPC)
8524         {
8525           /* AIX library routines for float->int conversion.  */
8526           set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc");
8527           set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc");
8528           set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc");
8529           set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc");
8530         }
8531
8532       /* AIX/Darwin/64-bit Linux quad floating point routines.  */
8533       if (!TARGET_XL_COMPAT)
8534         {
8535           set_optab_libfunc (add_optab, TFmode, "__gcc_qadd");
8536           set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
8537           set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
8538           set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
8539         }
8540       else
8541         {
8542           set_optab_libfunc (add_optab, TFmode, "_xlqadd");
8543           set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
8544           set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
8545           set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
8546         }
8547     }
8548   else
8549     {
8550       /* 32-bit SVR4 quad floating point routines.  */
8551
8552       set_optab_libfunc (add_optab, TFmode, "_q_add");
8553       set_optab_libfunc (sub_optab, TFmode, "_q_sub");
8554       set_optab_libfunc (neg_optab, TFmode, "_q_neg");
8555       set_optab_libfunc (smul_optab, TFmode, "_q_mul");
8556       set_optab_libfunc (sdiv_optab, TFmode, "_q_div");
8557       if (TARGET_PPC_GPOPT || TARGET_POWER2)
8558         set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
8559
8560       set_optab_libfunc (eq_optab, TFmode, "_q_feq");
8561       set_optab_libfunc (ne_optab, TFmode, "_q_fne");
8562       set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
8563       set_optab_libfunc (ge_optab, TFmode, "_q_fge");
8564       set_optab_libfunc (lt_optab, TFmode, "_q_flt");
8565       set_optab_libfunc (le_optab, TFmode, "_q_fle");
8566
8567       set_conv_libfunc (sext_optab, TFmode, SFmode, "_q_stoq");
8568       set_conv_libfunc (sext_optab, TFmode, DFmode, "_q_dtoq");
8569       set_conv_libfunc (trunc_optab, SFmode, TFmode, "_q_qtos");
8570       set_conv_libfunc (trunc_optab, DFmode, TFmode, "_q_qtod");
8571       set_conv_libfunc (sfix_optab, SImode, TFmode, "_q_qtoi");
8572       set_conv_libfunc (ufix_optab, SImode, TFmode, "_q_qtou");
8573       set_conv_libfunc (sfloat_optab, TFmode, SImode, "_q_itoq");
8574     }
8575 }
8576
8577 \f
8578 /* Expand a block clear operation, and return 1 if successful.  Return 0
8579    if we should let the compiler generate normal code.
8580
8581    operands[0] is the destination
8582    operands[1] is the length
8583    operands[2] is the alignment */
8584
8585 int
8586 expand_block_clear (rtx operands[])
8587 {
8588   rtx orig_dest = operands[0];
8589   rtx bytes_rtx = operands[1];
8590   rtx align_rtx = operands[2];
8591   bool constp   = (GET_CODE (bytes_rtx) == CONST_INT);
8592   HOST_WIDE_INT align;
8593   HOST_WIDE_INT bytes;
8594   int offset;
8595   int clear_bytes;
8596   int clear_step;
8597
8598   /* If this is not a fixed size move, just call memcpy */
8599   if (! constp)
8600     return 0;
8601
8602   /* This must be a fixed size alignment  */
8603   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
8604   align = INTVAL (align_rtx) * BITS_PER_UNIT;
8605
8606   /* Anything to clear? */
8607   bytes = INTVAL (bytes_rtx);
8608   if (bytes <= 0)
8609     return 1;
8610
8611   /* Use the builtin memset after a point, to avoid huge code bloat.
8612      When optimize_size, avoid any significant code bloat; calling
8613      memset is about 4 instructions, so allow for one instruction to
8614      load zero and three to do clearing.  */
8615   if (TARGET_ALTIVEC && align >= 128)
8616     clear_step = 16;
8617   else if (TARGET_POWERPC64 && align >= 32)
8618     clear_step = 8;
8619   else
8620     clear_step = 4;
8621
8622   if (optimize_size && bytes > 3 * clear_step)
8623     return 0;
8624   if (! optimize_size && bytes > 8 * clear_step)
8625     return 0;
8626
8627   for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes)
8628     {
8629       enum machine_mode mode = BLKmode;
8630       rtx dest;
8631
8632       if (bytes >= 16 && TARGET_ALTIVEC && align >= 128)
8633         {
8634           clear_bytes = 16;
8635           mode = V4SImode;
8636         }
8637       else if (bytes >= 8 && TARGET_POWERPC64
8638           /* 64-bit loads and stores require word-aligned
8639              displacements.  */
8640           && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
8641         {
8642           clear_bytes = 8;
8643           mode = DImode;
8644         }
8645       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
8646         {                       /* move 4 bytes */
8647           clear_bytes = 4;
8648           mode = SImode;
8649         }
8650       else if (bytes == 2 && (align >= 16 || !STRICT_ALIGNMENT))
8651         {                       /* move 2 bytes */
8652           clear_bytes = 2;
8653           mode = HImode;
8654         }
8655       else /* move 1 byte at a time */
8656         {
8657           clear_bytes = 1;
8658           mode = QImode;
8659         }
8660
8661       dest = adjust_address (orig_dest, mode, offset);
8662
8663       emit_move_insn (dest, CONST0_RTX (mode));
8664     }
8665
8666   return 1;
8667 }
8668
8669 \f
8670 /* Expand a block move operation, and return 1 if successful.  Return 0
8671    if we should let the compiler generate normal code.
8672
8673    operands[0] is the destination
8674    operands[1] is the source
8675    operands[2] is the length
8676    operands[3] is the alignment */
8677
8678 #define MAX_MOVE_REG 4
8679
8680 int
8681 expand_block_move (rtx operands[])
8682 {
8683   rtx orig_dest = operands[0];
8684   rtx orig_src  = operands[1];
8685   rtx bytes_rtx = operands[2];
8686   rtx align_rtx = operands[3];
8687   int constp    = (GET_CODE (bytes_rtx) == CONST_INT);
8688   int align;
8689   int bytes;
8690   int offset;
8691   int move_bytes;
8692   rtx stores[MAX_MOVE_REG];
8693   int num_reg = 0;
8694
8695   /* If this is not a fixed size move, just call memcpy */
8696   if (! constp)
8697     return 0;
8698
8699   /* This must be a fixed size alignment */
8700   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
8701   align = INTVAL (align_rtx) * BITS_PER_UNIT;
8702
8703   /* Anything to move? */
8704   bytes = INTVAL (bytes_rtx);
8705   if (bytes <= 0)
8706     return 1;
8707
8708   /* store_one_arg depends on expand_block_move to handle at least the size of
8709      reg_parm_stack_space.  */
8710   if (bytes > (TARGET_POWERPC64 ? 64 : 32))
8711     return 0;
8712
8713   for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
8714     {
8715       union {
8716         rtx (*movmemsi) (rtx, rtx, rtx, rtx);
8717         rtx (*mov) (rtx, rtx);
8718       } gen_func;
8719       enum machine_mode mode = BLKmode;
8720       rtx src, dest;
8721
8722       /* Altivec first, since it will be faster than a string move
8723          when it applies, and usually not significantly larger.  */
8724       if (TARGET_ALTIVEC && bytes >= 16 && align >= 128)
8725         {
8726           move_bytes = 16;
8727           mode = V4SImode;
8728           gen_func.mov = gen_movv4si;
8729         }
8730       else if (TARGET_STRING
8731           && bytes > 24         /* move up to 32 bytes at a time */
8732           && ! fixed_regs[5]
8733           && ! fixed_regs[6]
8734           && ! fixed_regs[7]
8735           && ! fixed_regs[8]
8736           && ! fixed_regs[9]
8737           && ! fixed_regs[10]
8738           && ! fixed_regs[11]
8739           && ! fixed_regs[12])
8740         {
8741           move_bytes = (bytes > 32) ? 32 : bytes;
8742           gen_func.movmemsi = gen_movmemsi_8reg;
8743         }
8744       else if (TARGET_STRING
8745                && bytes > 16    /* move up to 24 bytes at a time */
8746                && ! fixed_regs[5]
8747                && ! fixed_regs[6]
8748                && ! fixed_regs[7]
8749                && ! fixed_regs[8]
8750                && ! fixed_regs[9]
8751                && ! fixed_regs[10])
8752         {
8753           move_bytes = (bytes > 24) ? 24 : bytes;
8754           gen_func.movmemsi = gen_movmemsi_6reg;
8755         }
8756       else if (TARGET_STRING
8757                && bytes > 8     /* move up to 16 bytes at a time */
8758                && ! fixed_regs[5]
8759                && ! fixed_regs[6]
8760                && ! fixed_regs[7]
8761                && ! fixed_regs[8])
8762         {
8763           move_bytes = (bytes > 16) ? 16 : bytes;
8764           gen_func.movmemsi = gen_movmemsi_4reg;
8765         }
8766       else if (bytes >= 8 && TARGET_POWERPC64
8767                /* 64-bit loads and stores require word-aligned
8768                   displacements.  */
8769                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
8770         {
8771           move_bytes = 8;
8772           mode = DImode;
8773           gen_func.mov = gen_movdi;
8774         }
8775       else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
8776         {                       /* move up to 8 bytes at a time */
8777           move_bytes = (bytes > 8) ? 8 : bytes;
8778           gen_func.movmemsi = gen_movmemsi_2reg;
8779         }
8780       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
8781         {                       /* move 4 bytes */
8782           move_bytes = 4;
8783           mode = SImode;
8784           gen_func.mov = gen_movsi;
8785         }
8786       else if (bytes == 2 && (align >= 16 || !STRICT_ALIGNMENT))
8787         {                       /* move 2 bytes */
8788           move_bytes = 2;
8789           mode = HImode;
8790           gen_func.mov = gen_movhi;
8791         }
8792       else if (TARGET_STRING && bytes > 1)
8793         {                       /* move up to 4 bytes at a time */
8794           move_bytes = (bytes > 4) ? 4 : bytes;
8795           gen_func.movmemsi = gen_movmemsi_1reg;
8796         }
8797       else /* move 1 byte at a time */
8798         {
8799           move_bytes = 1;
8800           mode = QImode;
8801           gen_func.mov = gen_movqi;
8802         }
8803
8804       src = adjust_address (orig_src, mode, offset);
8805       dest = adjust_address (orig_dest, mode, offset);
8806
8807       if (mode != BLKmode)
8808         {
8809           rtx tmp_reg = gen_reg_rtx (mode);
8810
8811           emit_insn ((*gen_func.mov) (tmp_reg, src));
8812           stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
8813         }
8814
8815       if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
8816         {
8817           int i;
8818           for (i = 0; i < num_reg; i++)
8819             emit_insn (stores[i]);
8820           num_reg = 0;
8821         }
8822
8823       if (mode == BLKmode)
8824         {
8825           /* Move the address into scratch registers.  The movmemsi
8826              patterns require zero offset.  */
8827           if (!REG_P (XEXP (src, 0)))
8828             {
8829               rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
8830               src = replace_equiv_address (src, src_reg);
8831             }
8832           set_mem_size (src, GEN_INT (move_bytes));
8833
8834           if (!REG_P (XEXP (dest, 0)))
8835             {
8836               rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
8837               dest = replace_equiv_address (dest, dest_reg);
8838             }
8839           set_mem_size (dest, GEN_INT (move_bytes));
8840
8841           emit_insn ((*gen_func.movmemsi) (dest, src,
8842                                            GEN_INT (move_bytes & 31),
8843                                            align_rtx));
8844         }
8845     }
8846
8847   return 1;
8848 }
8849
8850 \f
8851 /* Return a string to perform a load_multiple operation.
8852    operands[0] is the vector.
8853    operands[1] is the source address.
8854    operands[2] is the first destination register.  */
8855
8856 const char *
8857 rs6000_output_load_multiple (rtx operands[3])
8858 {
8859   /* We have to handle the case where the pseudo used to contain the address
8860      is assigned to one of the output registers.  */
8861   int i, j;
8862   int words = XVECLEN (operands[0], 0);
8863   rtx xop[10];
8864
8865   if (XVECLEN (operands[0], 0) == 1)
8866     return "{l|lwz} %2,0(%1)";
8867
8868   for (i = 0; i < words; i++)
8869     if (refers_to_regno_p (REGNO (operands[2]) + i,
8870                            REGNO (operands[2]) + i + 1, operands[1], 0))
8871       {
8872         if (i == words-1)
8873           {
8874             xop[0] = GEN_INT (4 * (words-1));
8875             xop[1] = operands[1];
8876             xop[2] = operands[2];
8877             output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
8878             return "";
8879           }
8880         else if (i == 0)
8881           {
8882             xop[0] = GEN_INT (4 * (words-1));
8883             xop[1] = operands[1];
8884             xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
8885             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);
8886             return "";
8887           }
8888         else
8889           {
8890             for (j = 0; j < words; j++)
8891               if (j != i)
8892                 {
8893                   xop[0] = GEN_INT (j * 4);
8894                   xop[1] = operands[1];
8895                   xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
8896                   output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
8897                 }
8898             xop[0] = GEN_INT (i * 4);
8899             xop[1] = operands[1];
8900             output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
8901             return "";
8902           }
8903       }
8904
8905   return "{lsi|lswi} %2,%1,%N0";
8906 }
8907
8908 \f
8909 /* A validation routine: say whether CODE, a condition code, and MODE
8910    match.  The other alternatives either don't make sense or should
8911    never be generated.  */
8912
8913 void
8914 validate_condition_mode (enum rtx_code code, enum machine_mode mode)
8915 {
8916   gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
8917                || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
8918               && GET_MODE_CLASS (mode) == MODE_CC);
8919
8920   /* These don't make sense.  */
8921   gcc_assert ((code != GT && code != LT && code != GE && code != LE)
8922               || mode != CCUNSmode);
8923
8924   gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
8925               || mode == CCUNSmode);
8926
8927   gcc_assert (mode == CCFPmode
8928               || (code != ORDERED && code != UNORDERED
8929                   && code != UNEQ && code != LTGT
8930                   && code != UNGT && code != UNLT
8931                   && code != UNGE && code != UNLE));
8932
8933   /* These should never be generated except for
8934      flag_finite_math_only.  */
8935   gcc_assert (mode != CCFPmode
8936               || flag_finite_math_only
8937               || (code != LE && code != GE
8938                   && code != UNEQ && code != LTGT
8939                   && code != UNGT && code != UNLT));
8940
8941   /* These are invalid; the information is not there.  */
8942   gcc_assert (mode != CCEQmode || code == EQ || code == NE);
8943 }
8944
8945 \f
8946 /* Return 1 if ANDOP is a mask that has no bits on that are not in the
8947    mask required to convert the result of a rotate insn into a shift
8948    left insn of SHIFTOP bits.  Both are known to be SImode CONST_INT.  */
8949
8950 int
8951 includes_lshift_p (rtx shiftop, rtx andop)
8952 {
8953   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
8954
8955   shift_mask <<= INTVAL (shiftop);
8956
8957   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
8958 }
8959
8960 /* Similar, but for right shift.  */
8961
8962 int
8963 includes_rshift_p (rtx shiftop, rtx andop)
8964 {
8965   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
8966
8967   shift_mask >>= INTVAL (shiftop);
8968
8969   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
8970 }
8971
8972 /* Return 1 if ANDOP is a mask suitable for use with an rldic insn
8973    to perform a left shift.  It must have exactly SHIFTOP least
8974    significant 0's, then one or more 1's, then zero or more 0's.  */
8975
8976 int
8977 includes_rldic_lshift_p (rtx shiftop, rtx andop)
8978 {
8979   if (GET_CODE (andop) == CONST_INT)
8980     {
8981       HOST_WIDE_INT c, lsb, shift_mask;
8982
8983       c = INTVAL (andop);
8984       if (c == 0 || c == ~0)
8985         return 0;
8986
8987       shift_mask = ~0;
8988       shift_mask <<= INTVAL (shiftop);
8989
8990       /* Find the least significant one bit.  */
8991       lsb = c & -c;
8992
8993       /* It must coincide with the LSB of the shift mask.  */
8994       if (-lsb != shift_mask)
8995         return 0;
8996
8997       /* Invert to look for the next transition (if any).  */
8998       c = ~c;
8999
9000       /* Remove the low group of ones (originally low group of zeros).  */
9001       c &= -lsb;
9002
9003       /* Again find the lsb, and check we have all 1's above.  */
9004       lsb = c & -c;
9005       return c == -lsb;
9006     }
9007   else if (GET_CODE (andop) == CONST_DOUBLE
9008            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
9009     {
9010       HOST_WIDE_INT low, high, lsb;
9011       HOST_WIDE_INT shift_mask_low, shift_mask_high;
9012
9013       low = CONST_DOUBLE_LOW (andop);
9014       if (HOST_BITS_PER_WIDE_INT < 64)
9015         high = CONST_DOUBLE_HIGH (andop);
9016
9017       if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
9018           || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
9019         return 0;
9020
9021       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
9022         {
9023           shift_mask_high = ~0;
9024           if (INTVAL (shiftop) > 32)
9025             shift_mask_high <<= INTVAL (shiftop) - 32;
9026
9027           lsb = high & -high;
9028
9029           if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
9030             return 0;
9031
9032           high = ~high;
9033           high &= -lsb;
9034
9035           lsb = high & -high;
9036           return high == -lsb;
9037         }
9038
9039       shift_mask_low = ~0;
9040       shift_mask_low <<= INTVAL (shiftop);
9041
9042       lsb = low & -low;
9043
9044       if (-lsb != shift_mask_low)
9045         return 0;
9046
9047       if (HOST_BITS_PER_WIDE_INT < 64)
9048         high = ~high;
9049       low = ~low;
9050       low &= -lsb;
9051
9052       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
9053         {
9054           lsb = high & -high;
9055           return high == -lsb;
9056         }
9057
9058       lsb = low & -low;
9059       return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
9060     }
9061   else
9062     return 0;
9063 }
9064
9065 /* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
9066    to perform a left shift.  It must have SHIFTOP or more least
9067    significant 0's, with the remainder of the word 1's.  */
9068
9069 int
9070 includes_rldicr_lshift_p (rtx shiftop, rtx andop)
9071 {
9072   if (GET_CODE (andop) == CONST_INT)
9073     {
9074       HOST_WIDE_INT c, lsb, shift_mask;
9075
9076       shift_mask = ~0;
9077       shift_mask <<= INTVAL (shiftop);
9078       c = INTVAL (andop);
9079
9080       /* Find the least significant one bit.  */
9081       lsb = c & -c;
9082
9083       /* It must be covered by the shift mask.
9084          This test also rejects c == 0.  */
9085       if ((lsb & shift_mask) == 0)
9086         return 0;
9087
9088       /* Check we have all 1's above the transition, and reject all 1's.  */
9089       return c == -lsb && lsb != 1;
9090     }
9091   else if (GET_CODE (andop) == CONST_DOUBLE
9092            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
9093     {
9094       HOST_WIDE_INT low, lsb, shift_mask_low;
9095
9096       low = CONST_DOUBLE_LOW (andop);
9097
9098       if (HOST_BITS_PER_WIDE_INT < 64)
9099         {
9100           HOST_WIDE_INT high, shift_mask_high;
9101
9102           high = CONST_DOUBLE_HIGH (andop);
9103
9104           if (low == 0)
9105             {
9106               shift_mask_high = ~0;
9107               if (INTVAL (shiftop) > 32)
9108                 shift_mask_high <<= INTVAL (shiftop) - 32;
9109
9110               lsb = high & -high;
9111
9112               if ((lsb & shift_mask_high) == 0)
9113                 return 0;
9114
9115               return high == -lsb;
9116             }
9117           if (high != ~0)
9118             return 0;
9119         }
9120
9121       shift_mask_low = ~0;
9122       shift_mask_low <<= INTVAL (shiftop);
9123
9124       lsb = low & -low;
9125
9126       if ((lsb & shift_mask_low) == 0)
9127         return 0;
9128
9129       return low == -lsb && lsb != 1;
9130     }
9131   else
9132     return 0;
9133 }
9134
9135 /* Return 1 if operands will generate a valid arguments to rlwimi
9136 instruction for insert with right shift in 64-bit mode.  The mask may
9137 not start on the first bit or stop on the last bit because wrap-around
9138 effects of instruction do not correspond to semantics of RTL insn.  */
9139
9140 int
9141 insvdi_rshift_rlwimi_p (rtx sizeop, rtx startop, rtx shiftop)
9142 {
9143   if (INTVAL (startop) < 64
9144       && INTVAL (startop) > 32
9145       && (INTVAL (sizeop) + INTVAL (startop) < 64)
9146       && (INTVAL (sizeop) + INTVAL (startop) > 33)
9147       && (INTVAL (sizeop) + INTVAL (startop) + INTVAL (shiftop) < 96)
9148       && (INTVAL (sizeop) + INTVAL (startop) + INTVAL (shiftop) >= 64)
9149       && (64 - (INTVAL (shiftop) & 63)) >= INTVAL (sizeop))
9150     return 1;
9151
9152   return 0;
9153 }
9154
9155 /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
9156    for lfq and stfq insns iff the registers are hard registers.   */
9157
9158 int
9159 registers_ok_for_quad_peep (rtx reg1, rtx reg2)
9160 {
9161   /* We might have been passed a SUBREG.  */
9162   if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
9163     return 0;
9164
9165   /* We might have been passed non floating point registers.  */
9166   if (!FP_REGNO_P (REGNO (reg1))
9167       || !FP_REGNO_P (REGNO (reg2)))
9168     return 0;
9169
9170   return (REGNO (reg1) == REGNO (reg2) - 1);
9171 }
9172
9173 /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
9174    addr1 and addr2 must be in consecutive memory locations
9175    (addr2 == addr1 + 8).  */
9176
9177 int
9178 mems_ok_for_quad_peep (rtx mem1, rtx mem2)
9179 {
9180   rtx addr1, addr2;
9181   unsigned int reg1;
9182   int offset1;
9183
9184   /* The mems cannot be volatile.  */
9185   if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
9186     return 0;
9187
9188   addr1 = XEXP (mem1, 0);
9189   addr2 = XEXP (mem2, 0);
9190
9191   /* Extract an offset (if used) from the first addr.  */
9192   if (GET_CODE (addr1) == PLUS)
9193     {
9194       /* If not a REG, return zero.  */
9195       if (GET_CODE (XEXP (addr1, 0)) != REG)
9196         return 0;
9197       else
9198         {
9199           reg1 = REGNO (XEXP (addr1, 0));
9200           /* The offset must be constant!  */
9201           if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
9202             return 0;
9203           offset1 = INTVAL (XEXP (addr1, 1));
9204         }
9205     }
9206   else if (GET_CODE (addr1) != REG)
9207     return 0;
9208   else
9209     {
9210       reg1 = REGNO (addr1);
9211       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
9212       offset1 = 0;
9213     }
9214
9215   /* Make sure the second address is a (mem (plus (reg) (const_int)))
9216      or if it is (mem (reg)) then make sure that offset1 is -8 and the same
9217      register as addr1.  */
9218   if (offset1 == -8 && GET_CODE (addr2) == REG && reg1 == REGNO (addr2))
9219     return 1;
9220   if (GET_CODE (addr2) != PLUS)
9221     return 0;
9222
9223   if (GET_CODE (XEXP (addr2, 0)) != REG
9224       || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
9225     return 0;
9226
9227   if (reg1 != REGNO (XEXP (addr2, 0)))
9228     return 0;
9229
9230   /* The offset for the second addr must be 8 more than the first addr.  */
9231   if (INTVAL (XEXP (addr2, 1)) != offset1 + 8)
9232     return 0;
9233
9234   /* All the tests passed.  addr1 and addr2 are valid for lfq or stfq
9235      instructions.  */
9236   return 1;
9237 }
9238 \f
9239 /* Return the register class of a scratch register needed to copy IN into
9240    or out of a register in CLASS in MODE.  If it can be done directly,
9241    NO_REGS is returned.  */
9242
9243 enum reg_class
9244 secondary_reload_class (enum reg_class class,
9245                         enum machine_mode mode ATTRIBUTE_UNUSED,
9246                         rtx in)
9247 {
9248   int regno;
9249
9250   if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
9251 #if TARGET_MACHO
9252                      && MACHOPIC_INDIRECT
9253 #endif
9254                      ))
9255     {
9256       /* We cannot copy a symbolic operand directly into anything
9257          other than BASE_REGS for TARGET_ELF.  So indicate that a
9258          register from BASE_REGS is needed as an intermediate
9259          register.
9260
9261          On Darwin, pic addresses require a load from memory, which
9262          needs a base register.  */
9263       if (class != BASE_REGS
9264           && (GET_CODE (in) == SYMBOL_REF
9265               || GET_CODE (in) == HIGH
9266               || GET_CODE (in) == LABEL_REF
9267               || GET_CODE (in) == CONST))
9268         return BASE_REGS;
9269     }
9270
9271   if (GET_CODE (in) == REG)
9272     {
9273       regno = REGNO (in);
9274       if (regno >= FIRST_PSEUDO_REGISTER)
9275         {
9276           regno = true_regnum (in);
9277           if (regno >= FIRST_PSEUDO_REGISTER)
9278             regno = -1;
9279         }
9280     }
9281   else if (GET_CODE (in) == SUBREG)
9282     {
9283       regno = true_regnum (in);
9284       if (regno >= FIRST_PSEUDO_REGISTER)
9285         regno = -1;
9286     }
9287   else
9288     regno = -1;
9289
9290   /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
9291      into anything.  */
9292   if (class == GENERAL_REGS || class == BASE_REGS
9293       || (regno >= 0 && INT_REGNO_P (regno)))
9294     return NO_REGS;
9295
9296   /* Constants, memory, and FP registers can go into FP registers.  */
9297   if ((regno == -1 || FP_REGNO_P (regno))
9298       && (class == FLOAT_REGS || class == NON_SPECIAL_REGS))
9299     return NO_REGS;
9300
9301   /* Memory, and AltiVec registers can go into AltiVec registers.  */
9302   if ((regno == -1 || ALTIVEC_REGNO_P (regno))
9303       && class == ALTIVEC_REGS)
9304     return NO_REGS;
9305
9306   /* We can copy among the CR registers.  */
9307   if ((class == CR_REGS || class == CR0_REGS)
9308       && regno >= 0 && CR_REGNO_P (regno))
9309     return NO_REGS;
9310
9311   /* Otherwise, we need GENERAL_REGS.  */
9312   return GENERAL_REGS;
9313 }
9314 \f
9315 /* Given a comparison operation, return the bit number in CCR to test.  We
9316    know this is a valid comparison.
9317
9318    SCC_P is 1 if this is for an scc.  That means that %D will have been
9319    used instead of %C, so the bits will be in different places.
9320
9321    Return -1 if OP isn't a valid comparison for some reason.  */
9322
9323 int
9324 ccr_bit (rtx op, int scc_p)
9325 {
9326   enum rtx_code code = GET_CODE (op);
9327   enum machine_mode cc_mode;
9328   int cc_regnum;
9329   int base_bit;
9330   rtx reg;
9331
9332   if (!COMPARISON_P (op))
9333     return -1;
9334
9335   reg = XEXP (op, 0);
9336
9337   gcc_assert (GET_CODE (reg) == REG && CR_REGNO_P (REGNO (reg)));
9338
9339   cc_mode = GET_MODE (reg);
9340   cc_regnum = REGNO (reg);
9341   base_bit = 4 * (cc_regnum - CR0_REGNO);
9342
9343   validate_condition_mode (code, cc_mode);
9344
9345   /* When generating a sCOND operation, only positive conditions are
9346      allowed.  */
9347   gcc_assert (!scc_p
9348               || code == EQ || code == GT || code == LT || code == UNORDERED
9349               || code == GTU || code == LTU);
9350
9351   switch (code)
9352     {
9353     case NE:
9354       return scc_p ? base_bit + 3 : base_bit + 2;
9355     case EQ:
9356       return base_bit + 2;
9357     case GT:  case GTU:  case UNLE:
9358       return base_bit + 1;
9359     case LT:  case LTU:  case UNGE:
9360       return base_bit;
9361     case ORDERED:  case UNORDERED:
9362       return base_bit + 3;
9363
9364     case GE:  case GEU:
9365       /* If scc, we will have done a cror to put the bit in the
9366          unordered position.  So test that bit.  For integer, this is ! LT
9367          unless this is an scc insn.  */
9368       return scc_p ? base_bit + 3 : base_bit;
9369
9370     case LE:  case LEU:
9371       return scc_p ? base_bit + 3 : base_bit + 1;
9372
9373     default:
9374       gcc_unreachable ();
9375     }
9376 }
9377 \f
9378 /* Return the GOT register.  */
9379
9380 rtx
9381 rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
9382 {
9383   /* The second flow pass currently (June 1999) can't update
9384      regs_ever_live without disturbing other parts of the compiler, so
9385      update it here to make the prolog/epilogue code happy.  */
9386   if (no_new_pseudos && ! regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM])
9387     regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
9388
9389   current_function_uses_pic_offset_table = 1;
9390
9391   return pic_offset_table_rtx;
9392 }
9393 \f
9394 /* Function to init struct machine_function.
9395    This will be called, via a pointer variable,
9396    from push_function_context.  */
9397
9398 static struct machine_function *
9399 rs6000_init_machine_status (void)
9400 {
9401   return ggc_alloc_cleared (sizeof (machine_function));
9402 }
9403 \f
9404 /* These macros test for integers and extract the low-order bits.  */
9405 #define INT_P(X)  \
9406 ((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE)    \
9407  && GET_MODE (X) == VOIDmode)
9408
9409 #define INT_LOWPART(X) \
9410   (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
9411
9412 int
9413 extract_MB (rtx op)
9414 {
9415   int i;
9416   unsigned long val = INT_LOWPART (op);
9417
9418   /* If the high bit is zero, the value is the first 1 bit we find
9419      from the left.  */
9420   if ((val & 0x80000000) == 0)
9421     {
9422       gcc_assert (val & 0xffffffff);
9423
9424       i = 1;
9425       while (((val <<= 1) & 0x80000000) == 0)
9426         ++i;
9427       return i;
9428     }
9429
9430   /* If the high bit is set and the low bit is not, or the mask is all
9431      1's, the value is zero.  */
9432   if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
9433     return 0;
9434
9435   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
9436      from the right.  */
9437   i = 31;
9438   while (((val >>= 1) & 1) != 0)
9439     --i;
9440
9441   return i;
9442 }
9443
9444 int
9445 extract_ME (rtx op)
9446 {
9447   int i;
9448   unsigned long val = INT_LOWPART (op);
9449
9450   /* If the low bit is zero, the value is the first 1 bit we find from
9451      the right.  */
9452   if ((val & 1) == 0)
9453     {
9454       gcc_assert (val & 0xffffffff);
9455
9456       i = 30;
9457       while (((val >>= 1) & 1) == 0)
9458         --i;
9459
9460       return i;
9461     }
9462
9463   /* If the low bit is set and the high bit is not, or the mask is all
9464      1's, the value is 31.  */
9465   if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
9466     return 31;
9467
9468   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
9469      from the left.  */
9470   i = 0;
9471   while (((val <<= 1) & 0x80000000) != 0)
9472     ++i;
9473
9474   return i;
9475 }
9476
9477 /* Locate some local-dynamic symbol still in use by this function
9478    so that we can print its name in some tls_ld pattern.  */
9479
9480 static const char *
9481 rs6000_get_some_local_dynamic_name (void)
9482 {
9483   rtx insn;
9484
9485   if (cfun->machine->some_ld_name)
9486     return cfun->machine->some_ld_name;
9487
9488   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
9489     if (INSN_P (insn)
9490         && for_each_rtx (&PATTERN (insn),
9491                          rs6000_get_some_local_dynamic_name_1, 0))
9492       return cfun->machine->some_ld_name;
9493
9494   gcc_unreachable ();
9495 }
9496
9497 /* Helper function for rs6000_get_some_local_dynamic_name.  */
9498
9499 static int
9500 rs6000_get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
9501 {
9502   rtx x = *px;
9503
9504   if (GET_CODE (x) == SYMBOL_REF)
9505     {
9506       const char *str = XSTR (x, 0);
9507       if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
9508         {
9509           cfun->machine->some_ld_name = str;
9510           return 1;
9511         }
9512     }
9513
9514   return 0;
9515 }
9516
9517 /* Write out a function code label.  */
9518
9519 void
9520 rs6000_output_function_entry (FILE *file, const char *fname)
9521 {
9522   if (fname[0] != '.')
9523     {
9524       switch (DEFAULT_ABI)
9525         {
9526         default:
9527           gcc_unreachable ();
9528
9529         case ABI_AIX:
9530           if (DOT_SYMBOLS)
9531             putc ('.', file);
9532           else
9533             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
9534           break;
9535
9536         case ABI_V4:
9537         case ABI_DARWIN:
9538           break;
9539         }
9540     }
9541   if (TARGET_AIX)
9542     RS6000_OUTPUT_BASENAME (file, fname);
9543   else
9544     assemble_name (file, fname);
9545 }
9546
9547 /* Print an operand.  Recognize special options, documented below.  */
9548
9549 #if TARGET_ELF
9550 #define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
9551 #define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
9552 #else
9553 #define SMALL_DATA_RELOC "sda21"
9554 #define SMALL_DATA_REG 0
9555 #endif
9556
9557 void
9558 print_operand (FILE *file, rtx x, int code)
9559 {
9560   int i;
9561   HOST_WIDE_INT val;
9562   unsigned HOST_WIDE_INT uval;
9563
9564   switch (code)
9565     {
9566     case '.':
9567       /* Write out an instruction after the call which may be replaced
9568          with glue code by the loader.  This depends on the AIX version.  */
9569       asm_fprintf (file, RS6000_CALL_GLUE);
9570       return;
9571
9572       /* %a is output_address.  */
9573
9574     case 'A':
9575       /* If X is a constant integer whose low-order 5 bits are zero,
9576          write 'l'.  Otherwise, write 'r'.  This is a kludge to fix a bug
9577          in the AIX assembler where "sri" with a zero shift count
9578          writes a trash instruction.  */
9579       if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
9580         putc ('l', file);
9581       else
9582         putc ('r', file);
9583       return;
9584
9585     case 'b':
9586       /* If constant, low-order 16 bits of constant, unsigned.
9587          Otherwise, write normally.  */
9588       if (INT_P (x))
9589         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
9590       else
9591         print_operand (file, x, 0);
9592       return;
9593
9594     case 'B':
9595       /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
9596          for 64-bit mask direction.  */
9597       putc (((INT_LOWPART (x) & 1) == 0 ? 'r' : 'l'), file);
9598       return;
9599
9600       /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
9601          output_operand.  */
9602
9603     case 'c':
9604       /* X is a CR register.  Print the number of the GT bit of the CR.  */
9605       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9606         output_operand_lossage ("invalid %%E value");
9607       else
9608         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 1);
9609       return;
9610
9611     case 'D':
9612       /* Like 'J' but get to the EQ bit.  */
9613       gcc_assert (GET_CODE (x) == REG);
9614
9615       /* Bit 1 is EQ bit.  */
9616       i = 4 * (REGNO (x) - CR0_REGNO) + 2;
9617
9618       fprintf (file, "%d", i);
9619       return;
9620
9621     case 'E':
9622       /* X is a CR register.  Print the number of the EQ bit of the CR */
9623       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9624         output_operand_lossage ("invalid %%E value");
9625       else
9626         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
9627       return;
9628
9629     case 'f':
9630       /* X is a CR register.  Print the shift count needed to move it
9631          to the high-order four bits.  */
9632       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9633         output_operand_lossage ("invalid %%f value");
9634       else
9635         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
9636       return;
9637
9638     case 'F':
9639       /* Similar, but print the count for the rotate in the opposite
9640          direction.  */
9641       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9642         output_operand_lossage ("invalid %%F value");
9643       else
9644         fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
9645       return;
9646
9647     case 'G':
9648       /* X is a constant integer.  If it is negative, print "m",
9649          otherwise print "z".  This is to make an aze or ame insn.  */
9650       if (GET_CODE (x) != CONST_INT)
9651         output_operand_lossage ("invalid %%G value");
9652       else if (INTVAL (x) >= 0)
9653         putc ('z', file);
9654       else
9655         putc ('m', file);
9656       return;
9657
9658     case 'h':
9659       /* If constant, output low-order five bits.  Otherwise, write
9660          normally.  */
9661       if (INT_P (x))
9662         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
9663       else
9664         print_operand (file, x, 0);
9665       return;
9666
9667     case 'H':
9668       /* If constant, output low-order six bits.  Otherwise, write
9669          normally.  */
9670       if (INT_P (x))
9671         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
9672       else
9673         print_operand (file, x, 0);
9674       return;
9675
9676     case 'I':
9677       /* Print `i' if this is a constant, else nothing.  */
9678       if (INT_P (x))
9679         putc ('i', file);
9680       return;
9681
9682     case 'j':
9683       /* Write the bit number in CCR for jump.  */
9684       i = ccr_bit (x, 0);
9685       if (i == -1)
9686         output_operand_lossage ("invalid %%j code");
9687       else
9688         fprintf (file, "%d", i);
9689       return;
9690
9691     case 'J':
9692       /* Similar, but add one for shift count in rlinm for scc and pass
9693          scc flag to `ccr_bit'.  */
9694       i = ccr_bit (x, 1);
9695       if (i == -1)
9696         output_operand_lossage ("invalid %%J code");
9697       else
9698         /* If we want bit 31, write a shift count of zero, not 32.  */
9699         fprintf (file, "%d", i == 31 ? 0 : i + 1);
9700       return;
9701
9702     case 'k':
9703       /* X must be a constant.  Write the 1's complement of the
9704          constant.  */
9705       if (! INT_P (x))
9706         output_operand_lossage ("invalid %%k value");
9707       else
9708         fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
9709       return;
9710
9711     case 'K':
9712       /* X must be a symbolic constant on ELF.  Write an
9713          expression suitable for an 'addi' that adds in the low 16
9714          bits of the MEM.  */
9715       if (GET_CODE (x) != CONST)
9716         {
9717           print_operand_address (file, x);
9718           fputs ("@l", file);
9719         }
9720       else
9721         {
9722           if (GET_CODE (XEXP (x, 0)) != PLUS
9723               || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
9724                   && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
9725               || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
9726             output_operand_lossage ("invalid %%K value");
9727           print_operand_address (file, XEXP (XEXP (x, 0), 0));
9728           fputs ("@l", file);
9729           /* For GNU as, there must be a non-alphanumeric character
9730              between 'l' and the number.  The '-' is added by
9731              print_operand() already.  */
9732           if (INTVAL (XEXP (XEXP (x, 0), 1)) >= 0)
9733             fputs ("+", file);
9734           print_operand (file, XEXP (XEXP (x, 0), 1), 0);
9735         }
9736       return;
9737
9738       /* %l is output_asm_label.  */
9739
9740     case 'L':
9741       /* Write second word of DImode or DFmode reference.  Works on register
9742          or non-indexed memory only.  */
9743       if (GET_CODE (x) == REG)
9744         fputs (reg_names[REGNO (x) + 1], file);
9745       else if (GET_CODE (x) == MEM)
9746         {
9747           /* Handle possible auto-increment.  Since it is pre-increment and
9748              we have already done it, we can just use an offset of word.  */
9749           if (GET_CODE (XEXP (x, 0)) == PRE_INC
9750               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
9751             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
9752                                            UNITS_PER_WORD));
9753           else
9754             output_address (XEXP (adjust_address_nv (x, SImode,
9755                                                      UNITS_PER_WORD),
9756                                   0));
9757
9758           if (small_data_operand (x, GET_MODE (x)))
9759             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
9760                      reg_names[SMALL_DATA_REG]);
9761         }
9762       return;
9763
9764     case 'm':
9765       /* MB value for a mask operand.  */
9766       if (! mask_operand (x, SImode))
9767         output_operand_lossage ("invalid %%m value");
9768
9769       fprintf (file, "%d", extract_MB (x));
9770       return;
9771
9772     case 'M':
9773       /* ME value for a mask operand.  */
9774       if (! mask_operand (x, SImode))
9775         output_operand_lossage ("invalid %%M value");
9776
9777       fprintf (file, "%d", extract_ME (x));
9778       return;
9779
9780       /* %n outputs the negative of its operand.  */
9781
9782     case 'N':
9783       /* Write the number of elements in the vector times 4.  */
9784       if (GET_CODE (x) != PARALLEL)
9785         output_operand_lossage ("invalid %%N value");
9786       else
9787         fprintf (file, "%d", XVECLEN (x, 0) * 4);
9788       return;
9789
9790     case 'O':
9791       /* Similar, but subtract 1 first.  */
9792       if (GET_CODE (x) != PARALLEL)
9793         output_operand_lossage ("invalid %%O value");
9794       else
9795         fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
9796       return;
9797
9798     case 'p':
9799       /* X is a CONST_INT that is a power of two.  Output the logarithm.  */
9800       if (! INT_P (x)
9801           || INT_LOWPART (x) < 0
9802           || (i = exact_log2 (INT_LOWPART (x))) < 0)
9803         output_operand_lossage ("invalid %%p value");
9804       else
9805         fprintf (file, "%d", i);
9806       return;
9807
9808     case 'P':
9809       /* The operand must be an indirect memory reference.  The result
9810          is the register name.  */
9811       if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
9812           || REGNO (XEXP (x, 0)) >= 32)
9813         output_operand_lossage ("invalid %%P value");
9814       else
9815         fputs (reg_names[REGNO (XEXP (x, 0))], file);
9816       return;
9817
9818     case 'q':
9819       /* This outputs the logical code corresponding to a boolean
9820          expression.  The expression may have one or both operands
9821          negated (if one, only the first one).  For condition register
9822          logical operations, it will also treat the negated
9823          CR codes as NOTs, but not handle NOTs of them.  */
9824       {
9825         const char *const *t = 0;
9826         const char *s;
9827         enum rtx_code code = GET_CODE (x);
9828         static const char * const tbl[3][3] = {
9829           { "and", "andc", "nor" },
9830           { "or", "orc", "nand" },
9831           { "xor", "eqv", "xor" } };
9832
9833         if (code == AND)
9834           t = tbl[0];
9835         else if (code == IOR)
9836           t = tbl[1];
9837         else if (code == XOR)
9838           t = tbl[2];
9839         else
9840           output_operand_lossage ("invalid %%q value");
9841
9842         if (GET_CODE (XEXP (x, 0)) != NOT)
9843           s = t[0];
9844         else
9845           {
9846             if (GET_CODE (XEXP (x, 1)) == NOT)
9847               s = t[2];
9848             else
9849               s = t[1];
9850           }
9851
9852         fputs (s, file);
9853       }
9854       return;
9855
9856     case 'Q':
9857       if (TARGET_MFCRF)
9858         fputc (',', file);
9859         /* FALLTHRU */
9860       else
9861         return;
9862
9863     case 'R':
9864       /* X is a CR register.  Print the mask for `mtcrf'.  */
9865       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9866         output_operand_lossage ("invalid %%R value");
9867       else
9868         fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
9869       return;
9870
9871     case 's':
9872       /* Low 5 bits of 32 - value */
9873       if (! INT_P (x))
9874         output_operand_lossage ("invalid %%s value");
9875       else
9876         fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
9877       return;
9878
9879     case 'S':
9880       /* PowerPC64 mask position.  All 0's is excluded.
9881          CONST_INT 32-bit mask is considered sign-extended so any
9882          transition must occur within the CONST_INT, not on the boundary.  */
9883       if (! mask_operand (x, DImode))
9884         output_operand_lossage ("invalid %%S value");
9885
9886       uval = INT_LOWPART (x);
9887
9888       if (uval & 1)     /* Clear Left */
9889         {
9890 #if HOST_BITS_PER_WIDE_INT > 64
9891           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
9892 #endif
9893           i = 64;
9894         }
9895       else              /* Clear Right */
9896         {
9897           uval = ~uval;
9898 #if HOST_BITS_PER_WIDE_INT > 64
9899           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
9900 #endif
9901           i = 63;
9902         }
9903       while (uval != 0)
9904         --i, uval >>= 1;
9905       gcc_assert (i >= 0);
9906       fprintf (file, "%d", i);
9907       return;
9908
9909     case 't':
9910       /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
9911       gcc_assert (GET_CODE (x) == REG && GET_MODE (x) == CCmode);
9912
9913       /* Bit 3 is OV bit.  */
9914       i = 4 * (REGNO (x) - CR0_REGNO) + 3;
9915
9916       /* If we want bit 31, write a shift count of zero, not 32.  */
9917       fprintf (file, "%d", i == 31 ? 0 : i + 1);
9918       return;
9919
9920     case 'T':
9921       /* Print the symbolic name of a branch target register.  */
9922       if (GET_CODE (x) != REG || (REGNO (x) != LINK_REGISTER_REGNUM
9923                                   && REGNO (x) != COUNT_REGISTER_REGNUM))
9924         output_operand_lossage ("invalid %%T value");
9925       else if (REGNO (x) == LINK_REGISTER_REGNUM)
9926         fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
9927       else
9928         fputs ("ctr", file);
9929       return;
9930
9931     case 'u':
9932       /* High-order 16 bits of constant for use in unsigned operand.  */
9933       if (! INT_P (x))
9934         output_operand_lossage ("invalid %%u value");
9935       else
9936         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
9937                  (INT_LOWPART (x) >> 16) & 0xffff);
9938       return;
9939
9940     case 'v':
9941       /* High-order 16 bits of constant for use in signed operand.  */
9942       if (! INT_P (x))
9943         output_operand_lossage ("invalid %%v value");
9944       else
9945         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
9946                  (INT_LOWPART (x) >> 16) & 0xffff);
9947       return;
9948
9949     case 'U':
9950       /* Print `u' if this has an auto-increment or auto-decrement.  */
9951       if (GET_CODE (x) == MEM
9952           && (GET_CODE (XEXP (x, 0)) == PRE_INC
9953               || GET_CODE (XEXP (x, 0)) == PRE_DEC))
9954         putc ('u', file);
9955       return;
9956
9957     case 'V':
9958       /* Print the trap code for this operand.  */
9959       switch (GET_CODE (x))
9960         {
9961         case EQ:
9962           fputs ("eq", file);   /* 4 */
9963           break;
9964         case NE:
9965           fputs ("ne", file);   /* 24 */
9966           break;
9967         case LT:
9968           fputs ("lt", file);   /* 16 */
9969           break;
9970         case LE:
9971           fputs ("le", file);   /* 20 */
9972           break;
9973         case GT:
9974           fputs ("gt", file);   /* 8 */
9975           break;
9976         case GE:
9977           fputs ("ge", file);   /* 12 */
9978           break;
9979         case LTU:
9980           fputs ("llt", file);  /* 2 */
9981           break;
9982         case LEU:
9983           fputs ("lle", file);  /* 6 */
9984           break;
9985         case GTU:
9986           fputs ("lgt", file);  /* 1 */
9987           break;
9988         case GEU:
9989           fputs ("lge", file);  /* 5 */
9990           break;
9991         default:
9992           gcc_unreachable ();
9993         }
9994       break;
9995
9996     case 'w':
9997       /* If constant, low-order 16 bits of constant, signed.  Otherwise, write
9998          normally.  */
9999       if (INT_P (x))
10000         fprintf (file, HOST_WIDE_INT_PRINT_DEC,
10001                  ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
10002       else
10003         print_operand (file, x, 0);
10004       return;
10005
10006     case 'W':
10007       /* MB value for a PowerPC64 rldic operand.  */
10008       val = (GET_CODE (x) == CONST_INT
10009              ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
10010
10011       if (val < 0)
10012         i = -1;
10013       else
10014         for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
10015           if ((val <<= 1) < 0)
10016             break;
10017
10018 #if HOST_BITS_PER_WIDE_INT == 32
10019       if (GET_CODE (x) == CONST_INT && i >= 0)
10020         i += 32;  /* zero-extend high-part was all 0's */
10021       else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
10022         {
10023           val = CONST_DOUBLE_LOW (x);
10024
10025           gcc_assert (val);
10026           if (val < 0)
10027             --i;
10028           else
10029             for ( ; i < 64; i++)
10030               if ((val <<= 1) < 0)
10031                 break;
10032         }
10033 #endif
10034
10035       fprintf (file, "%d", i + 1);
10036       return;
10037
10038     case 'X':
10039       if (GET_CODE (x) == MEM
10040           && legitimate_indexed_address_p (XEXP (x, 0), 0))
10041         putc ('x', file);
10042       return;
10043
10044     case 'Y':
10045       /* Like 'L', for third word of TImode  */
10046       if (GET_CODE (x) == REG)
10047         fputs (reg_names[REGNO (x) + 2], file);
10048       else if (GET_CODE (x) == MEM)
10049         {
10050           if (GET_CODE (XEXP (x, 0)) == PRE_INC
10051               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
10052             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
10053           else
10054             output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
10055           if (small_data_operand (x, GET_MODE (x)))
10056             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10057                      reg_names[SMALL_DATA_REG]);
10058         }
10059       return;
10060
10061     case 'z':
10062       /* X is a SYMBOL_REF.  Write out the name preceded by a
10063          period and without any trailing data in brackets.  Used for function
10064          names.  If we are configured for System V (or the embedded ABI) on
10065          the PowerPC, do not emit the period, since those systems do not use
10066          TOCs and the like.  */
10067       gcc_assert (GET_CODE (x) == SYMBOL_REF);
10068
10069       /* Mark the decl as referenced so that cgraph will output the
10070          function.  */
10071       if (SYMBOL_REF_DECL (x))
10072         mark_decl_referenced (SYMBOL_REF_DECL (x));
10073
10074       /* For macho, check to see if we need a stub.  */
10075       if (TARGET_MACHO)
10076         {
10077           const char *name = XSTR (x, 0);
10078 #if TARGET_MACHO
10079           if (MACHOPIC_INDIRECT
10080               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
10081             name = machopic_indirection_name (x, /*stub_p=*/true);
10082 #endif
10083           assemble_name (file, name);
10084         }
10085       else if (!DOT_SYMBOLS)
10086         assemble_name (file, XSTR (x, 0));
10087       else
10088         rs6000_output_function_entry (file, XSTR (x, 0));
10089       return;
10090
10091     case 'Z':
10092       /* Like 'L', for last word of TImode.  */
10093       if (GET_CODE (x) == REG)
10094         fputs (reg_names[REGNO (x) + 3], file);
10095       else if (GET_CODE (x) == MEM)
10096         {
10097           if (GET_CODE (XEXP (x, 0)) == PRE_INC
10098               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
10099             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
10100           else
10101             output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
10102           if (small_data_operand (x, GET_MODE (x)))
10103             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10104                      reg_names[SMALL_DATA_REG]);
10105         }
10106       return;
10107
10108       /* Print AltiVec or SPE memory operand.  */
10109     case 'y':
10110       {
10111         rtx tmp;
10112
10113         gcc_assert (GET_CODE (x) == MEM);
10114
10115         tmp = XEXP (x, 0);
10116
10117         if (TARGET_E500)
10118           {
10119             /* Handle [reg].  */
10120             if (GET_CODE (tmp) == REG)
10121               {
10122                 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
10123                 break;
10124               }
10125             /* Handle [reg+UIMM].  */
10126             else if (GET_CODE (tmp) == PLUS &&
10127                      GET_CODE (XEXP (tmp, 1)) == CONST_INT)
10128               {
10129                 int x;
10130
10131                 gcc_assert (GET_CODE (XEXP (tmp, 0)) == REG);
10132
10133                 x = INTVAL (XEXP (tmp, 1));
10134                 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
10135                 break;
10136               }
10137
10138             /* Fall through.  Must be [reg+reg].  */
10139           }
10140         if (TARGET_ALTIVEC
10141             && GET_CODE (tmp) == AND
10142             && GET_CODE (XEXP (tmp, 1)) == CONST_INT
10143             && INTVAL (XEXP (tmp, 1)) == -16)
10144           tmp = XEXP (tmp, 0);
10145         if (GET_CODE (tmp) == REG)
10146           fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
10147         else
10148           {
10149             gcc_assert (GET_CODE (tmp) == PLUS
10150                         && GET_CODE (XEXP (tmp, 1)) == REG);
10151             
10152             if (REGNO (XEXP (tmp, 0)) == 0)
10153               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
10154                        reg_names[ REGNO (XEXP (tmp, 0)) ]);
10155             else
10156               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
10157                        reg_names[ REGNO (XEXP (tmp, 1)) ]);
10158           }
10159         break;
10160       }
10161
10162     case 0:
10163       if (GET_CODE (x) == REG)
10164         fprintf (file, "%s", reg_names[REGNO (x)]);
10165       else if (GET_CODE (x) == MEM)
10166         {
10167           /* We need to handle PRE_INC and PRE_DEC here, since we need to
10168              know the width from the mode.  */
10169           if (GET_CODE (XEXP (x, 0)) == PRE_INC)
10170             fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
10171                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
10172           else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
10173             fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
10174                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
10175           else
10176             output_address (XEXP (x, 0));
10177         }
10178       else
10179         output_addr_const (file, x);
10180       return;
10181
10182     case '&':
10183       assemble_name (file, rs6000_get_some_local_dynamic_name ());
10184       return;
10185
10186     default:
10187       output_operand_lossage ("invalid %%xn code");
10188     }
10189 }
10190 \f
10191 /* Print the address of an operand.  */
10192
10193 void
10194 print_operand_address (FILE *file, rtx x)
10195 {
10196   if (GET_CODE (x) == REG)
10197     fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
10198   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
10199            || GET_CODE (x) == LABEL_REF)
10200     {
10201       output_addr_const (file, x);
10202       if (small_data_operand (x, GET_MODE (x)))
10203         fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10204                  reg_names[SMALL_DATA_REG]);
10205       else
10206         gcc_assert (!TARGET_TOC);
10207     }
10208   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
10209     {
10210       if (REGNO (XEXP (x, 0)) == 0)
10211         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
10212                  reg_names[ REGNO (XEXP (x, 0)) ]);
10213       else
10214         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
10215                  reg_names[ REGNO (XEXP (x, 1)) ]);
10216     }
10217   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
10218     fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
10219              INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
10220 #if TARGET_ELF
10221   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
10222            && CONSTANT_P (XEXP (x, 1)))
10223     {
10224       output_addr_const (file, XEXP (x, 1));
10225       fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
10226     }
10227 #endif
10228 #if TARGET_MACHO
10229   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
10230            && CONSTANT_P (XEXP (x, 1)))
10231     {
10232       fprintf (file, "lo16(");
10233       output_addr_const (file, XEXP (x, 1));
10234       fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
10235     }
10236 #endif
10237   else if (legitimate_constant_pool_address_p (x))
10238     {
10239       if (TARGET_AIX && (!TARGET_ELF || !TARGET_MINIMAL_TOC))
10240         {
10241           rtx contains_minus = XEXP (x, 1);
10242           rtx minus, symref;
10243           const char *name;
10244
10245           /* Find the (minus (sym) (toc)) buried in X, and temporarily
10246              turn it into (sym) for output_addr_const.  */
10247           while (GET_CODE (XEXP (contains_minus, 0)) != MINUS)
10248             contains_minus = XEXP (contains_minus, 0);
10249
10250           minus = XEXP (contains_minus, 0);
10251           symref = XEXP (minus, 0);
10252           XEXP (contains_minus, 0) = symref;
10253           if (TARGET_ELF)
10254             {
10255               char *newname;
10256
10257               name = XSTR (symref, 0);
10258               newname = alloca (strlen (name) + sizeof ("@toc"));
10259               strcpy (newname, name);
10260               strcat (newname, "@toc");
10261               XSTR (symref, 0) = newname;
10262             }
10263           output_addr_const (file, XEXP (x, 1));
10264           if (TARGET_ELF)
10265             XSTR (symref, 0) = name;
10266           XEXP (contains_minus, 0) = minus;
10267         }
10268       else
10269         output_addr_const (file, XEXP (x, 1));
10270
10271       fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
10272     }
10273   else
10274     gcc_unreachable ();
10275 }
10276 \f
10277 /* Target hook for assembling integer objects.  The PowerPC version has
10278    to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
10279    is defined.  It also needs to handle DI-mode objects on 64-bit
10280    targets.  */
10281
10282 static bool
10283 rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
10284 {
10285 #ifdef RELOCATABLE_NEEDS_FIXUP
10286   /* Special handling for SI values.  */
10287   if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
10288     {
10289       extern int in_toc_section (void);
10290       static int recurse = 0;
10291
10292       /* For -mrelocatable, we mark all addresses that need to be fixed up
10293          in the .fixup section.  */
10294       if (TARGET_RELOCATABLE
10295           && !in_toc_section ()
10296           && !in_text_section ()
10297           && !in_unlikely_text_section ()
10298           && !recurse
10299           && GET_CODE (x) != CONST_INT
10300           && GET_CODE (x) != CONST_DOUBLE
10301           && CONSTANT_P (x))
10302         {
10303           char buf[256];
10304
10305           recurse = 1;
10306           ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
10307           fixuplabelno++;
10308           ASM_OUTPUT_LABEL (asm_out_file, buf);
10309           fprintf (asm_out_file, "\t.long\t(");
10310           output_addr_const (asm_out_file, x);
10311           fprintf (asm_out_file, ")@fixup\n");
10312           fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
10313           ASM_OUTPUT_ALIGN (asm_out_file, 2);
10314           fprintf (asm_out_file, "\t.long\t");
10315           assemble_name (asm_out_file, buf);
10316           fprintf (asm_out_file, "\n\t.previous\n");
10317           recurse = 0;
10318           return true;
10319         }
10320       /* Remove initial .'s to turn a -mcall-aixdesc function
10321          address into the address of the descriptor, not the function
10322          itself.  */
10323       else if (GET_CODE (x) == SYMBOL_REF
10324                && XSTR (x, 0)[0] == '.'
10325                && DEFAULT_ABI == ABI_AIX)
10326         {
10327           const char *name = XSTR (x, 0);
10328           while (*name == '.')
10329             name++;
10330
10331           fprintf (asm_out_file, "\t.long\t%s\n", name);
10332           return true;
10333         }
10334     }
10335 #endif /* RELOCATABLE_NEEDS_FIXUP */
10336   return default_assemble_integer (x, size, aligned_p);
10337 }
10338
10339 #ifdef HAVE_GAS_HIDDEN
10340 /* Emit an assembler directive to set symbol visibility for DECL to
10341    VISIBILITY_TYPE.  */
10342
10343 static void
10344 rs6000_assemble_visibility (tree decl, int vis)
10345 {
10346   /* Functions need to have their entry point symbol visibility set as
10347      well as their descriptor symbol visibility.  */
10348   if (DEFAULT_ABI == ABI_AIX
10349       && DOT_SYMBOLS
10350       && TREE_CODE (decl) == FUNCTION_DECL)
10351     {
10352       static const char * const visibility_types[] = {
10353         NULL, "internal", "hidden", "protected"
10354       };
10355
10356       const char *name, *type;
10357
10358       name = ((* targetm.strip_name_encoding)
10359               (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
10360       type = visibility_types[vis];
10361
10362       fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
10363       fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
10364     }
10365   else
10366     default_assemble_visibility (decl, vis);
10367 }
10368 #endif
10369 \f
10370 enum rtx_code
10371 rs6000_reverse_condition (enum machine_mode mode, enum rtx_code code)
10372 {
10373   /* Reversal of FP compares takes care -- an ordered compare
10374      becomes an unordered compare and vice versa.  */
10375   if (mode == CCFPmode
10376       && (!flag_finite_math_only
10377           || code == UNLT || code == UNLE || code == UNGT || code == UNGE
10378           || code == UNEQ || code == LTGT))
10379     return reverse_condition_maybe_unordered (code);
10380   else
10381     return reverse_condition (code);
10382 }
10383
10384 /* Generate a compare for CODE.  Return a brand-new rtx that
10385    represents the result of the compare.  */
10386
10387 static rtx
10388 rs6000_generate_compare (enum rtx_code code)
10389 {
10390   enum machine_mode comp_mode;
10391   rtx compare_result;
10392
10393   if (rs6000_compare_fp_p)
10394     comp_mode = CCFPmode;
10395   else if (code == GTU || code == LTU
10396            || code == GEU || code == LEU)
10397     comp_mode = CCUNSmode;
10398   else if ((code == EQ || code == NE)
10399            && GET_CODE (rs6000_compare_op0) == SUBREG
10400            && GET_CODE (rs6000_compare_op1) == SUBREG
10401            && SUBREG_PROMOTED_UNSIGNED_P (rs6000_compare_op0)
10402            && SUBREG_PROMOTED_UNSIGNED_P (rs6000_compare_op1))
10403     /* These are unsigned values, perhaps there will be a later
10404        ordering compare that can be shared with this one.
10405        Unfortunately we cannot detect the signedness of the operands
10406        for non-subregs.  */
10407     comp_mode = CCUNSmode;
10408   else
10409     comp_mode = CCmode;
10410
10411   /* First, the compare.  */
10412   compare_result = gen_reg_rtx (comp_mode);
10413
10414   /* SPE FP compare instructions on the GPRs.  Yuck!  */
10415   if ((TARGET_E500 && !TARGET_FPRS && TARGET_HARD_FLOAT)
10416       && rs6000_compare_fp_p)
10417     {
10418       rtx cmp, or_result, compare_result2;
10419       enum machine_mode op_mode = GET_MODE (rs6000_compare_op0);
10420
10421       if (op_mode == VOIDmode)
10422         op_mode = GET_MODE (rs6000_compare_op1);
10423
10424       /* Note: The E500 comparison instructions set the GT bit (x +
10425          1), on success.  This explains the mess.  */
10426
10427       switch (code)
10428         {
10429         case EQ: case UNEQ: case NE: case LTGT:
10430           switch (op_mode)
10431             {
10432             case SFmode:
10433               cmp = flag_unsafe_math_optimizations
10434                 ? gen_tstsfeq_gpr (compare_result, rs6000_compare_op0,
10435                                    rs6000_compare_op1)
10436                 : gen_cmpsfeq_gpr (compare_result, rs6000_compare_op0,
10437                                    rs6000_compare_op1);
10438               break;
10439
10440             case DFmode:
10441               cmp = flag_unsafe_math_optimizations
10442                 ? gen_tstdfeq_gpr (compare_result, rs6000_compare_op0,
10443                                    rs6000_compare_op1)
10444                 : gen_cmpdfeq_gpr (compare_result, rs6000_compare_op0,
10445                                    rs6000_compare_op1);
10446               break;
10447
10448             default:
10449               gcc_unreachable ();
10450             }
10451           break;
10452           
10453         case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
10454           switch (op_mode)
10455             {
10456             case SFmode:
10457               cmp = flag_unsafe_math_optimizations
10458                 ? gen_tstsfgt_gpr (compare_result, rs6000_compare_op0,
10459                                    rs6000_compare_op1)
10460                 : gen_cmpsfgt_gpr (compare_result, rs6000_compare_op0,
10461                                    rs6000_compare_op1);
10462               break;
10463               
10464             case DFmode:
10465               cmp = flag_unsafe_math_optimizations
10466                 ? gen_tstdfgt_gpr (compare_result, rs6000_compare_op0,
10467                                    rs6000_compare_op1)
10468                 : gen_cmpdfgt_gpr (compare_result, rs6000_compare_op0,
10469                                    rs6000_compare_op1);
10470               break;
10471
10472             default:
10473               gcc_unreachable ();
10474             }
10475           break;
10476           
10477         case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
10478           switch (op_mode)
10479             {
10480             case SFmode:
10481               cmp = flag_unsafe_math_optimizations
10482                 ? gen_tstsflt_gpr (compare_result, rs6000_compare_op0,
10483                                    rs6000_compare_op1)
10484                 : gen_cmpsflt_gpr (compare_result, rs6000_compare_op0,
10485                                    rs6000_compare_op1);
10486               break;
10487               
10488             case DFmode:
10489               cmp = flag_unsafe_math_optimizations
10490                 ? gen_tstdflt_gpr (compare_result, rs6000_compare_op0,
10491                                    rs6000_compare_op1)
10492                 : gen_cmpdflt_gpr (compare_result, rs6000_compare_op0,
10493                                    rs6000_compare_op1);
10494               break;
10495
10496             default:
10497               gcc_unreachable ();
10498             }
10499           break;
10500         default:
10501           gcc_unreachable ();
10502         }
10503
10504       /* Synthesize LE and GE from LT/GT || EQ.  */
10505       if (code == LE || code == GE || code == LEU || code == GEU)
10506         {
10507           emit_insn (cmp);
10508
10509           switch (code)
10510             {
10511             case LE: code = LT; break;
10512             case GE: code = GT; break;
10513             case LEU: code = LT; break;
10514             case GEU: code = GT; break;
10515             default: gcc_unreachable ();
10516             }
10517
10518           compare_result2 = gen_reg_rtx (CCFPmode);
10519
10520           /* Do the EQ.  */
10521           switch (op_mode)
10522             {
10523             case SFmode:
10524               cmp = flag_unsafe_math_optimizations
10525                 ? gen_tstsfeq_gpr (compare_result2, rs6000_compare_op0,
10526                                    rs6000_compare_op1)
10527                 : gen_cmpsfeq_gpr (compare_result2, rs6000_compare_op0,
10528                                    rs6000_compare_op1);
10529               break;
10530
10531             case DFmode:
10532               cmp = flag_unsafe_math_optimizations
10533                 ? gen_tstdfeq_gpr (compare_result2, rs6000_compare_op0,
10534                                    rs6000_compare_op1)
10535                 : gen_cmpdfeq_gpr (compare_result2, rs6000_compare_op0,
10536                                    rs6000_compare_op1);
10537               break;
10538
10539             default:
10540               gcc_unreachable ();
10541             }
10542           emit_insn (cmp);
10543
10544           /* OR them together.  */
10545           or_result = gen_reg_rtx (CCFPmode);
10546           cmp = gen_e500_cr_ior_compare (or_result, compare_result,
10547                                            compare_result2);
10548           compare_result = or_result;
10549           code = EQ;
10550         }
10551       else
10552         {
10553           if (code == NE || code == LTGT)
10554             code = NE;
10555           else
10556             code = EQ;
10557         }
10558
10559       emit_insn (cmp);
10560     }
10561   else
10562     {
10563       /* Generate XLC-compatible TFmode compare as PARALLEL with extra
10564          CLOBBERs to match cmptf_internal2 pattern.  */
10565       if (comp_mode == CCFPmode && TARGET_XL_COMPAT
10566           && GET_MODE (rs6000_compare_op0) == TFmode
10567           && (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
10568           && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128)
10569         emit_insn (gen_rtx_PARALLEL (VOIDmode,
10570           gen_rtvec (9,
10571                      gen_rtx_SET (VOIDmode,
10572                                   compare_result,
10573                                   gen_rtx_COMPARE (comp_mode,
10574                                                    rs6000_compare_op0,
10575                                                    rs6000_compare_op1)),
10576                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10577                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10578                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10579                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10580                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10581                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10582                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10583                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)))));
10584       else
10585         emit_insn (gen_rtx_SET (VOIDmode, compare_result,
10586                                 gen_rtx_COMPARE (comp_mode,
10587                                                  rs6000_compare_op0,
10588                                                  rs6000_compare_op1)));
10589     }
10590
10591   /* Some kinds of FP comparisons need an OR operation;
10592      under flag_finite_math_only we don't bother.  */
10593   if (rs6000_compare_fp_p
10594       && !flag_finite_math_only
10595       && !(TARGET_HARD_FLOAT && TARGET_E500 && !TARGET_FPRS)
10596       && (code == LE || code == GE
10597           || code == UNEQ || code == LTGT
10598           || code == UNGT || code == UNLT))
10599     {
10600       enum rtx_code or1, or2;
10601       rtx or1_rtx, or2_rtx, compare2_rtx;
10602       rtx or_result = gen_reg_rtx (CCEQmode);
10603
10604       switch (code)
10605         {
10606         case LE: or1 = LT;  or2 = EQ;  break;
10607         case GE: or1 = GT;  or2 = EQ;  break;
10608         case UNEQ: or1 = UNORDERED;  or2 = EQ;  break;
10609         case LTGT: or1 = LT;  or2 = GT;  break;
10610         case UNGT: or1 = UNORDERED;  or2 = GT;  break;
10611         case UNLT: or1 = UNORDERED;  or2 = LT;  break;
10612         default:  gcc_unreachable ();
10613         }
10614       validate_condition_mode (or1, comp_mode);
10615       validate_condition_mode (or2, comp_mode);
10616       or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
10617       or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
10618       compare2_rtx = gen_rtx_COMPARE (CCEQmode,
10619                                       gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
10620                                       const_true_rtx);
10621       emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
10622
10623       compare_result = or_result;
10624       code = EQ;
10625     }
10626
10627   validate_condition_mode (code, GET_MODE (compare_result));
10628
10629   return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
10630 }
10631
10632
10633 /* Emit the RTL for an sCOND pattern.  */
10634
10635 void
10636 rs6000_emit_sCOND (enum rtx_code code, rtx result)
10637 {
10638   rtx condition_rtx;
10639   enum machine_mode op_mode;
10640   enum rtx_code cond_code;
10641
10642   condition_rtx = rs6000_generate_compare (code);
10643   cond_code = GET_CODE (condition_rtx);
10644
10645   if (TARGET_E500 && rs6000_compare_fp_p
10646       && !TARGET_FPRS && TARGET_HARD_FLOAT)
10647     {
10648       rtx t;
10649
10650       PUT_MODE (condition_rtx, SImode);
10651       t = XEXP (condition_rtx, 0);
10652
10653       gcc_assert (cond_code == NE || cond_code == EQ);
10654
10655       if (cond_code == NE)
10656         emit_insn (gen_e500_flip_gt_bit (t, t));
10657
10658       emit_insn (gen_move_from_CR_gt_bit (result, t));
10659       return;
10660     }
10661
10662   if (cond_code == NE
10663       || cond_code == GE || cond_code == LE
10664       || cond_code == GEU || cond_code == LEU
10665       || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
10666     {
10667       rtx not_result = gen_reg_rtx (CCEQmode);
10668       rtx not_op, rev_cond_rtx;
10669       enum machine_mode cc_mode;
10670
10671       cc_mode = GET_MODE (XEXP (condition_rtx, 0));
10672
10673       rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
10674                                      SImode, XEXP (condition_rtx, 0), const0_rtx);
10675       not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
10676       emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
10677       condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
10678     }
10679
10680   op_mode = GET_MODE (rs6000_compare_op0);
10681   if (op_mode == VOIDmode)
10682     op_mode = GET_MODE (rs6000_compare_op1);
10683
10684   if (TARGET_POWERPC64 && (op_mode == DImode || rs6000_compare_fp_p))
10685     {
10686       PUT_MODE (condition_rtx, DImode);
10687       convert_move (result, condition_rtx, 0);
10688     }
10689   else
10690     {
10691       PUT_MODE (condition_rtx, SImode);
10692       emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
10693     }
10694 }
10695
10696 /* Emit a branch of kind CODE to location LOC.  */
10697
10698 void
10699 rs6000_emit_cbranch (enum rtx_code code, rtx loc)
10700 {
10701   rtx condition_rtx, loc_ref;
10702
10703   condition_rtx = rs6000_generate_compare (code);
10704   loc_ref = gen_rtx_LABEL_REF (VOIDmode, loc);
10705   emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
10706                                gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
10707                                                      loc_ref, pc_rtx)));
10708 }
10709
10710 /* Return the string to output a conditional branch to LABEL, which is
10711    the operand number of the label, or -1 if the branch is really a
10712    conditional return.
10713
10714    OP is the conditional expression.  XEXP (OP, 0) is assumed to be a
10715    condition code register and its mode specifies what kind of
10716    comparison we made.
10717
10718    REVERSED is nonzero if we should reverse the sense of the comparison.
10719
10720    INSN is the insn.  */
10721
10722 char *
10723 output_cbranch (rtx op, const char *label, int reversed, rtx insn)
10724 {
10725   static char string[64];
10726   enum rtx_code code = GET_CODE (op);
10727   rtx cc_reg = XEXP (op, 0);
10728   enum machine_mode mode = GET_MODE (cc_reg);
10729   int cc_regno = REGNO (cc_reg) - CR0_REGNO;
10730   int need_longbranch = label != NULL && get_attr_length (insn) == 8;
10731   int really_reversed = reversed ^ need_longbranch;
10732   char *s = string;
10733   const char *ccode;
10734   const char *pred;
10735   rtx note;
10736
10737   validate_condition_mode (code, mode);
10738
10739   /* Work out which way this really branches.  We could use
10740      reverse_condition_maybe_unordered here always but this
10741      makes the resulting assembler clearer.  */
10742   if (really_reversed)
10743     {
10744       /* Reversal of FP compares takes care -- an ordered compare
10745          becomes an unordered compare and vice versa.  */
10746       if (mode == CCFPmode)
10747         code = reverse_condition_maybe_unordered (code);
10748       else
10749         code = reverse_condition (code);
10750     }
10751
10752   if ((TARGET_E500 && !TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
10753     {
10754       /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
10755          to the GT bit.  */
10756       switch (code)
10757         {
10758         case EQ:
10759           /* Opposite of GT.  */
10760           code = GT;
10761           break;
10762
10763         case NE:
10764           code = UNLE;
10765           break;
10766
10767         default:
10768           gcc_unreachable ();
10769         }
10770     }
10771
10772   switch (code)
10773     {
10774       /* Not all of these are actually distinct opcodes, but
10775          we distinguish them for clarity of the resulting assembler.  */
10776     case NE: case LTGT:
10777       ccode = "ne"; break;
10778     case EQ: case UNEQ:
10779       ccode = "eq"; break;
10780     case GE: case GEU:
10781       ccode = "ge"; break;
10782     case GT: case GTU: case UNGT:
10783       ccode = "gt"; break;
10784     case LE: case LEU:
10785       ccode = "le"; break;
10786     case LT: case LTU: case UNLT:
10787       ccode = "lt"; break;
10788     case UNORDERED: ccode = "un"; break;
10789     case ORDERED: ccode = "nu"; break;
10790     case UNGE: ccode = "nl"; break;
10791     case UNLE: ccode = "ng"; break;
10792     default:
10793       gcc_unreachable ();
10794     }
10795
10796   /* Maybe we have a guess as to how likely the branch is.
10797      The old mnemonics don't have a way to specify this information.  */
10798   pred = "";
10799   note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
10800   if (note != NULL_RTX)
10801     {
10802       /* PROB is the difference from 50%.  */
10803       int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
10804
10805       /* Only hint for highly probable/improbable branches on newer
10806          cpus as static prediction overrides processor dynamic
10807          prediction.  For older cpus we may as well always hint, but
10808          assume not taken for branches that are very close to 50% as a
10809          mispredicted taken branch is more expensive than a
10810          mispredicted not-taken branch.  */
10811       if (rs6000_always_hint
10812           || abs (prob) > REG_BR_PROB_BASE / 100 * 48)
10813         {
10814           if (abs (prob) > REG_BR_PROB_BASE / 20
10815               && ((prob > 0) ^ need_longbranch))
10816             pred = "+";
10817           else
10818             pred = "-";
10819         }
10820     }
10821
10822   if (label == NULL)
10823     s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
10824   else
10825     s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
10826
10827   /* We need to escape any '%' characters in the reg_names string.
10828      Assume they'd only be the first character....  */
10829   if (reg_names[cc_regno + CR0_REGNO][0] == '%')
10830     *s++ = '%';
10831   s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
10832
10833   if (label != NULL)
10834     {
10835       /* If the branch distance was too far, we may have to use an
10836          unconditional branch to go the distance.  */
10837       if (need_longbranch)
10838         s += sprintf (s, ",$+8\n\tb %s", label);
10839       else
10840         s += sprintf (s, ",%s", label);
10841     }
10842
10843   return string;
10844 }
10845
10846 /* Return the string to flip the GT bit on a CR.  */
10847 char *
10848 output_e500_flip_gt_bit (rtx dst, rtx src)
10849 {
10850   static char string[64];
10851   int a, b;
10852
10853   gcc_assert (GET_CODE (dst) == REG && CR_REGNO_P (REGNO (dst))
10854               && GET_CODE (src) == REG && CR_REGNO_P (REGNO (src)));
10855
10856   /* GT bit.  */
10857   a = 4 * (REGNO (dst) - CR0_REGNO) + 1;
10858   b = 4 * (REGNO (src) - CR0_REGNO) + 1;
10859
10860   sprintf (string, "crnot %d,%d", a, b);
10861   return string;
10862 }
10863
10864 /* Return insn index for the vector compare instruction for given CODE,
10865    and DEST_MODE, OP_MODE. Return INSN_NOT_AVAILABLE if valid insn is
10866    not available.  */
10867
10868 static int
10869 get_vec_cmp_insn (enum rtx_code code,
10870                   enum machine_mode dest_mode,
10871                   enum machine_mode op_mode)
10872 {
10873   if (!TARGET_ALTIVEC)
10874     return INSN_NOT_AVAILABLE;
10875
10876   switch (code)
10877     {
10878     case EQ:
10879       if (dest_mode == V16QImode && op_mode == V16QImode)
10880         return UNSPEC_VCMPEQUB;
10881       if (dest_mode == V8HImode && op_mode == V8HImode)
10882         return UNSPEC_VCMPEQUH;
10883       if (dest_mode == V4SImode && op_mode == V4SImode)
10884         return UNSPEC_VCMPEQUW;
10885       if (dest_mode == V4SImode && op_mode == V4SFmode)
10886         return UNSPEC_VCMPEQFP;
10887       break;
10888     case GE:
10889       if (dest_mode == V4SImode && op_mode == V4SFmode)
10890         return UNSPEC_VCMPGEFP;
10891     case GT:
10892       if (dest_mode == V16QImode && op_mode == V16QImode)
10893         return UNSPEC_VCMPGTSB;
10894       if (dest_mode == V8HImode && op_mode == V8HImode)
10895         return UNSPEC_VCMPGTSH;
10896       if (dest_mode == V4SImode && op_mode == V4SImode)
10897         return UNSPEC_VCMPGTSW;
10898       if (dest_mode == V4SImode && op_mode == V4SFmode)
10899         return UNSPEC_VCMPGTFP;
10900       break;
10901     case GTU:
10902       if (dest_mode == V16QImode && op_mode == V16QImode)
10903         return UNSPEC_VCMPGTUB;
10904       if (dest_mode == V8HImode && op_mode == V8HImode)
10905         return UNSPEC_VCMPGTUH;
10906       if (dest_mode == V4SImode && op_mode == V4SImode)
10907         return UNSPEC_VCMPGTUW;
10908       break;
10909     default:
10910       break;
10911     }
10912   return INSN_NOT_AVAILABLE;
10913 }
10914
10915 /* Emit vector compare for operands OP0 and OP1 using code RCODE.
10916    DMODE is expected destination mode. This is a recursive function.  */
10917
10918 static rtx
10919 rs6000_emit_vector_compare (enum rtx_code rcode,
10920                             rtx op0, rtx op1,
10921                             enum machine_mode dmode)
10922 {
10923   int vec_cmp_insn;
10924   rtx mask;
10925   enum machine_mode dest_mode;
10926   enum machine_mode op_mode = GET_MODE (op1);
10927
10928   gcc_assert (TARGET_ALTIVEC);
10929   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
10930
10931   /* Floating point vector compare instructions uses destination V4SImode.
10932      Move destination to appropriate mode later.  */
10933   if (dmode == V4SFmode)
10934     dest_mode = V4SImode;
10935   else
10936     dest_mode = dmode;
10937
10938   mask = gen_reg_rtx (dest_mode);
10939   vec_cmp_insn = get_vec_cmp_insn (rcode, dest_mode, op_mode);
10940
10941   if (vec_cmp_insn == INSN_NOT_AVAILABLE)
10942     {
10943       bool swap_operands = false;
10944       bool try_again = false;
10945       switch (rcode)
10946         {
10947         case LT:
10948           rcode = GT;
10949           swap_operands = true;
10950           try_again = true;
10951           break;
10952         case LTU:
10953           rcode = GTU;
10954           swap_operands = true;
10955           try_again = true;
10956           break;
10957         case NE:
10958           /* Treat A != B as ~(A==B).  */
10959           {
10960             enum insn_code nor_code;
10961             rtx eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1,
10962                                                      dest_mode);
10963
10964             nor_code = one_cmpl_optab->handlers[(int)dest_mode].insn_code;
10965             gcc_assert (nor_code != CODE_FOR_nothing);
10966             emit_insn (GEN_FCN (nor_code) (mask, eq_rtx));
10967
10968             if (dmode != dest_mode)
10969               {
10970                 rtx temp = gen_reg_rtx (dest_mode);
10971                 convert_move (temp, mask, 0);
10972                 return temp;
10973               }
10974             return mask;
10975           }
10976           break;
10977         case GE:
10978         case GEU:
10979         case LE:
10980         case LEU:
10981           /* Try GT/GTU/LT/LTU OR EQ */
10982           {
10983             rtx c_rtx, eq_rtx;
10984             enum insn_code ior_code;
10985             enum rtx_code new_code;
10986
10987             switch (rcode)
10988               {
10989               case  GE:
10990                 new_code = GT;
10991                 break;
10992
10993               case GEU:
10994                 new_code = GTU;
10995                 break;
10996
10997               case LE:
10998                 new_code = LT;
10999                 break;
11000
11001               case LEU:
11002                 new_code = LTU;
11003                 break;
11004
11005               default:
11006                 gcc_unreachable ();
11007               }
11008
11009             c_rtx = rs6000_emit_vector_compare (new_code,
11010                                                 op0, op1, dest_mode);
11011             eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1,
11012                                                  dest_mode);
11013
11014             ior_code = ior_optab->handlers[(int)dest_mode].insn_code;
11015             gcc_assert (ior_code != CODE_FOR_nothing);
11016             emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
11017             if (dmode != dest_mode)
11018               {
11019                 rtx temp = gen_reg_rtx (dest_mode);
11020                 convert_move (temp, mask, 0);
11021                 return temp;
11022               }
11023             return mask;
11024           }
11025           break;
11026         default:
11027           gcc_unreachable ();
11028         }
11029
11030       if (try_again)
11031         {
11032           vec_cmp_insn = get_vec_cmp_insn (rcode, dest_mode, op_mode);
11033           /* You only get two chances.  */
11034           gcc_assert (vec_cmp_insn != INSN_NOT_AVAILABLE);
11035         }
11036
11037       if (swap_operands)
11038         {
11039           rtx tmp;
11040           tmp = op0;
11041           op0 = op1;
11042           op1 = tmp;
11043         }
11044     }
11045
11046   emit_insn (gen_rtx_SET (VOIDmode, mask,
11047                           gen_rtx_UNSPEC (dest_mode,
11048                                           gen_rtvec (2, op0, op1),
11049                                           vec_cmp_insn)));
11050   if (dmode != dest_mode)
11051     {
11052       rtx temp = gen_reg_rtx (dest_mode);
11053       convert_move (temp, mask, 0);
11054       return temp;
11055     }
11056   return mask;
11057 }
11058
11059 /* Return vector select instruction for MODE. Return INSN_NOT_AVAILABLE, if
11060    valid insn doesn exist for given mode.  */
11061
11062 static int
11063 get_vsel_insn (enum machine_mode mode)
11064 {
11065   switch (mode)
11066     {
11067     case V4SImode:
11068       return UNSPEC_VSEL4SI;
11069       break;
11070     case V4SFmode:
11071       return UNSPEC_VSEL4SF;
11072       break;
11073     case V8HImode:
11074       return UNSPEC_VSEL8HI;
11075       break;
11076     case V16QImode:
11077       return UNSPEC_VSEL16QI;
11078       break;
11079     default:
11080       return INSN_NOT_AVAILABLE;
11081       break;
11082     }
11083   return INSN_NOT_AVAILABLE;
11084 }
11085
11086 /* Emit vector select insn where DEST is destination using
11087    operands OP1, OP2 and MASK.  */
11088
11089 static void
11090 rs6000_emit_vector_select (rtx dest, rtx op1, rtx op2, rtx mask)
11091 {
11092   rtx t, temp;
11093   enum machine_mode dest_mode = GET_MODE (dest);
11094   int vsel_insn_index  = get_vsel_insn (GET_MODE (dest));
11095
11096   temp = gen_reg_rtx (dest_mode);
11097
11098   /* For each vector element, select op1 when mask is 1 otherwise 
11099      select op2.  */
11100   t = gen_rtx_SET (VOIDmode, temp,
11101                    gen_rtx_UNSPEC (dest_mode,
11102                                    gen_rtvec (3, op2, op1, mask),
11103                                    vsel_insn_index));
11104   emit_insn (t);
11105   emit_move_insn (dest, temp);
11106   return;
11107 }
11108
11109 /* Emit vector conditional expression.
11110    DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
11111    CC_OP0 and CC_OP1 are the two operands for the relation operation COND.  */
11112
11113 int
11114 rs6000_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
11115                               rtx cond, rtx cc_op0, rtx cc_op1)
11116 {
11117   enum machine_mode dest_mode = GET_MODE (dest);
11118   enum rtx_code rcode = GET_CODE (cond);
11119   rtx mask;
11120
11121   if (!TARGET_ALTIVEC)
11122     return 0;
11123
11124   /* Get the vector mask for the given relational operations.  */
11125   mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode);
11126
11127   rs6000_emit_vector_select (dest, op1, op2, mask);
11128
11129   return 1;
11130 }
11131
11132 /* Emit a conditional move: move TRUE_COND to DEST if OP of the
11133    operands of the last comparison is nonzero/true, FALSE_COND if it
11134    is zero/false.  Return 0 if the hardware has no such operation.  */
11135
11136 int
11137 rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
11138 {
11139   enum rtx_code code = GET_CODE (op);
11140   rtx op0 = rs6000_compare_op0;
11141   rtx op1 = rs6000_compare_op1;
11142   REAL_VALUE_TYPE c1;
11143   enum machine_mode compare_mode = GET_MODE (op0);
11144   enum machine_mode result_mode = GET_MODE (dest);
11145   rtx temp;
11146   bool is_against_zero;
11147
11148   /* These modes should always match.  */
11149   if (GET_MODE (op1) != compare_mode
11150       /* In the isel case however, we can use a compare immediate, so
11151          op1 may be a small constant.  */
11152       && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
11153     return 0;
11154   if (GET_MODE (true_cond) != result_mode)
11155     return 0;
11156   if (GET_MODE (false_cond) != result_mode)
11157     return 0;
11158
11159   /* First, work out if the hardware can do this at all, or
11160      if it's too slow....  */
11161   if (! rs6000_compare_fp_p)
11162     {
11163       if (TARGET_ISEL)
11164         return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
11165       return 0;
11166     }
11167   else if (TARGET_E500 && TARGET_HARD_FLOAT && !TARGET_FPRS
11168            && GET_MODE_CLASS (compare_mode) == MODE_FLOAT)
11169     return 0;
11170
11171   is_against_zero = op1 == CONST0_RTX (compare_mode);
11172
11173   /* A floating-point subtract might overflow, underflow, or produce
11174      an inexact result, thus changing the floating-point flags, so it
11175      can't be generated if we care about that.  It's safe if one side
11176      of the construct is zero, since then no subtract will be
11177      generated.  */
11178   if (GET_MODE_CLASS (compare_mode) == MODE_FLOAT
11179       && flag_trapping_math && ! is_against_zero)
11180     return 0;
11181
11182   /* Eliminate half of the comparisons by switching operands, this
11183      makes the remaining code simpler.  */
11184   if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
11185       || code == LTGT || code == LT || code == UNLE)
11186     {
11187       code = reverse_condition_maybe_unordered (code);
11188       temp = true_cond;
11189       true_cond = false_cond;
11190       false_cond = temp;
11191     }
11192
11193   /* UNEQ and LTGT take four instructions for a comparison with zero,
11194      it'll probably be faster to use a branch here too.  */
11195   if (code == UNEQ && HONOR_NANS (compare_mode))
11196     return 0;
11197
11198   if (GET_CODE (op1) == CONST_DOUBLE)
11199     REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
11200
11201   /* We're going to try to implement comparisons by performing
11202      a subtract, then comparing against zero.  Unfortunately,
11203      Inf - Inf is NaN which is not zero, and so if we don't
11204      know that the operand is finite and the comparison
11205      would treat EQ different to UNORDERED, we can't do it.  */
11206   if (HONOR_INFINITIES (compare_mode)
11207       && code != GT && code != UNGE
11208       && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
11209       /* Constructs of the form (a OP b ? a : b) are safe.  */
11210       && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
11211           || (! rtx_equal_p (op0, true_cond)
11212               && ! rtx_equal_p (op1, true_cond))))
11213     return 0;
11214
11215   /* At this point we know we can use fsel.  */
11216
11217   /* Reduce the comparison to a comparison against zero.  */
11218   if (! is_against_zero)
11219     {
11220       temp = gen_reg_rtx (compare_mode);
11221       emit_insn (gen_rtx_SET (VOIDmode, temp,
11222                               gen_rtx_MINUS (compare_mode, op0, op1)));
11223       op0 = temp;
11224       op1 = CONST0_RTX (compare_mode);
11225     }
11226
11227   /* If we don't care about NaNs we can reduce some of the comparisons
11228      down to faster ones.  */
11229   if (! HONOR_NANS (compare_mode))
11230     switch (code)
11231       {
11232       case GT:
11233         code = LE;
11234         temp = true_cond;
11235         true_cond = false_cond;
11236         false_cond = temp;
11237         break;
11238       case UNGE:
11239         code = GE;
11240         break;
11241       case UNEQ:
11242         code = EQ;
11243         break;
11244       default:
11245         break;
11246       }
11247
11248   /* Now, reduce everything down to a GE.  */
11249   switch (code)
11250     {
11251     case GE:
11252       break;
11253
11254     case LE:
11255       temp = gen_reg_rtx (compare_mode);
11256       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
11257       op0 = temp;
11258       break;
11259
11260     case ORDERED:
11261       temp = gen_reg_rtx (compare_mode);
11262       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
11263       op0 = temp;
11264       break;
11265
11266     case EQ:
11267       temp = gen_reg_rtx (compare_mode);
11268       emit_insn (gen_rtx_SET (VOIDmode, temp,
11269                               gen_rtx_NEG (compare_mode,
11270                                            gen_rtx_ABS (compare_mode, op0))));
11271       op0 = temp;
11272       break;
11273
11274     case UNGE:
11275       /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
11276       temp = gen_reg_rtx (result_mode);
11277       emit_insn (gen_rtx_SET (VOIDmode, temp,
11278                               gen_rtx_IF_THEN_ELSE (result_mode,
11279                                                     gen_rtx_GE (VOIDmode,
11280                                                                 op0, op1),
11281                                                     true_cond, false_cond)));
11282       false_cond = true_cond;
11283       true_cond = temp;
11284
11285       temp = gen_reg_rtx (compare_mode);
11286       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
11287       op0 = temp;
11288       break;
11289
11290     case GT:
11291       /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
11292       temp = gen_reg_rtx (result_mode);
11293       emit_insn (gen_rtx_SET (VOIDmode, temp,
11294                               gen_rtx_IF_THEN_ELSE (result_mode,
11295                                                     gen_rtx_GE (VOIDmode,
11296                                                                 op0, op1),
11297                                                     true_cond, false_cond)));
11298       true_cond = false_cond;
11299       false_cond = temp;
11300
11301       temp = gen_reg_rtx (compare_mode);
11302       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
11303       op0 = temp;
11304       break;
11305
11306     default:
11307       gcc_unreachable ();
11308     }
11309
11310   emit_insn (gen_rtx_SET (VOIDmode, dest,
11311                           gen_rtx_IF_THEN_ELSE (result_mode,
11312                                                 gen_rtx_GE (VOIDmode,
11313                                                             op0, op1),
11314                                                 true_cond, false_cond)));
11315   return 1;
11316 }
11317
11318 /* Same as above, but for ints (isel).  */
11319
11320 static int
11321 rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
11322 {
11323   rtx condition_rtx, cr;
11324
11325   /* All isel implementations thus far are 32-bits.  */
11326   if (GET_MODE (rs6000_compare_op0) != SImode)
11327     return 0;
11328
11329   /* We still have to do the compare, because isel doesn't do a
11330      compare, it just looks at the CRx bits set by a previous compare
11331      instruction.  */
11332   condition_rtx = rs6000_generate_compare (GET_CODE (op));
11333   cr = XEXP (condition_rtx, 0);
11334
11335   if (GET_MODE (cr) == CCmode)
11336     emit_insn (gen_isel_signed (dest, condition_rtx,
11337                                 true_cond, false_cond, cr));
11338   else
11339     emit_insn (gen_isel_unsigned (dest, condition_rtx,
11340                                   true_cond, false_cond, cr));
11341
11342   return 1;
11343 }
11344
11345 const char *
11346 output_isel (rtx *operands)
11347 {
11348   enum rtx_code code;
11349
11350   code = GET_CODE (operands[1]);
11351   if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
11352     {
11353       PUT_CODE (operands[1], reverse_condition (code));
11354       return "isel %0,%3,%2,%j1";
11355     }
11356   else
11357     return "isel %0,%2,%3,%j1";
11358 }
11359
11360 void
11361 rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
11362 {
11363   enum machine_mode mode = GET_MODE (op0);
11364   enum rtx_code c;
11365   rtx target;
11366
11367   if (code == SMAX || code == SMIN)
11368     c = GE;
11369   else
11370     c = GEU;
11371
11372   if (code == SMAX || code == UMAX)
11373     target = emit_conditional_move (dest, c, op0, op1, mode,
11374                                     op0, op1, mode, 0);
11375   else
11376     target = emit_conditional_move (dest, c, op0, op1, mode,
11377                                     op1, op0, mode, 0);
11378   gcc_assert (target);
11379   if (target != dest)
11380     emit_move_insn (dest, target);
11381 }
11382
11383 /* Emit instructions to perform a load-reserved/store-conditional operation.
11384    The operation performed is an atomic
11385    (set M (CODE:MODE M OP))
11386    If not NULL, BEFORE is atomically set to M before the operation, and
11387    AFTER is set to M after the operation (that is, (CODE:MODE M OP)).
11388    If SYNC_P then a memory barrier is emitted before the operation.  
11389    Either OP or M may be wrapped in a NOT operation.  */
11390
11391 void
11392 rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
11393                   rtx m, rtx op, rtx before_param, rtx after_param,
11394                   bool sync_p)
11395 {
11396   enum machine_mode used_mode;
11397   rtx the_op, set_before, set_after, set_atomic, cc_scratch, before, after;
11398   rtx used_m;
11399   rtvec vec;
11400   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
11401   rtx shift = NULL_RTX;
11402   
11403   if (sync_p)
11404     emit_insn (gen_memory_barrier ());
11405   
11406   if (GET_CODE (m) == NOT)
11407     used_m = XEXP (m, 0);
11408   else
11409     used_m = m;
11410
11411   /* If this is smaller than SImode, we'll have to use SImode with
11412      adjustments.  */
11413   if (mode == QImode || mode == HImode)
11414     {
11415       rtx newop, oldop;
11416
11417       if (MEM_ALIGN (used_m) >= 32)
11418         {
11419           int ishift = 0;
11420           if (BYTES_BIG_ENDIAN)
11421             ishift = GET_MODE_BITSIZE (SImode) - GET_MODE_BITSIZE (mode);
11422           
11423           shift = GEN_INT (ishift);
11424         }
11425       else
11426         {
11427           rtx addrSI, aligned_addr;
11428           int shift_mask = mode == QImode ? 0x18 : 0x10;
11429           
11430           addrSI = force_reg (SImode, gen_lowpart_common (SImode,
11431                                                           XEXP (used_m, 0)));
11432           shift = gen_reg_rtx (SImode);
11433
11434           emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
11435                                  GEN_INT (shift_mask)));
11436           emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
11437
11438           aligned_addr = expand_binop (Pmode, and_optab,
11439                                        XEXP (used_m, 0),
11440                                        GEN_INT (-4), NULL_RTX,
11441                                        1, OPTAB_LIB_WIDEN);
11442           used_m = change_address (used_m, SImode, aligned_addr);
11443           set_mem_align (used_m, 32);
11444           /* It's safe to keep the old alias set of USED_M, because
11445              the operation is atomic and only affects the original
11446              USED_M.  */
11447           if (GET_CODE (m) == NOT)
11448             m = gen_rtx_NOT (SImode, used_m);
11449           else
11450             m = used_m;
11451         }
11452
11453       if (GET_CODE (op) == NOT)
11454         {
11455           oldop = lowpart_subreg (SImode, XEXP (op, 0), mode);
11456           oldop = gen_rtx_NOT (SImode, oldop);
11457         }
11458       else
11459         oldop = lowpart_subreg (SImode, op, mode);
11460       switch (code)
11461         {
11462         case IOR:
11463         case XOR:
11464           newop = expand_binop (SImode, and_optab,
11465                                 oldop, GEN_INT (imask), NULL_RTX,
11466                                 1, OPTAB_LIB_WIDEN);
11467           emit_insn (gen_ashlsi3 (newop, newop, shift));
11468           break;
11469
11470         case AND:
11471           newop = expand_binop (SImode, ior_optab,
11472                                 oldop, GEN_INT (~imask), NULL_RTX,
11473                                 1, OPTAB_LIB_WIDEN);
11474           emit_insn (gen_rotlsi3 (newop, newop, shift));
11475           break;
11476
11477         case PLUS:
11478           {
11479             rtx mask;
11480             
11481             newop = expand_binop (SImode, and_optab,
11482                                   oldop, GEN_INT (imask), NULL_RTX,
11483                                   1, OPTAB_LIB_WIDEN);
11484             emit_insn (gen_ashlsi3 (newop, newop, shift));
11485
11486             mask = gen_reg_rtx (SImode);
11487             emit_move_insn (mask, GEN_INT (imask));
11488             emit_insn (gen_ashlsi3 (mask, mask, shift));
11489
11490             newop = gen_rtx_AND (SImode, gen_rtx_PLUS (SImode, m, newop),
11491                                  mask);
11492             newop = gen_rtx_IOR (SImode, newop,
11493                                  gen_rtx_AND (SImode,
11494                                               gen_rtx_NOT (SImode, mask),
11495                                               m));
11496             break;
11497           }
11498
11499         default:
11500           gcc_unreachable ();
11501         }
11502
11503       if (GET_CODE (m) == NOT)
11504         {
11505           rtx mask, xorm;
11506
11507           mask = gen_reg_rtx (SImode);
11508           emit_move_insn (mask, GEN_INT (imask));
11509           emit_insn (gen_ashlsi3 (mask, mask, shift));
11510
11511           xorm = gen_rtx_XOR (SImode, used_m, mask);
11512           /* Depending on the value of 'op', the XOR or the operation might
11513              be able to be simplified away.  */
11514           newop = simplify_gen_binary (code, SImode, xorm, newop);
11515         }
11516       op = newop;
11517       used_mode = SImode;
11518       before = gen_reg_rtx (used_mode);
11519       after = gen_reg_rtx (used_mode);
11520     }
11521   else
11522     {
11523       used_mode = mode;
11524       before = before_param;
11525       after = after_param;
11526
11527       if (before == NULL_RTX)
11528         before = gen_reg_rtx (used_mode);
11529       if (after == NULL_RTX)
11530         after = gen_reg_rtx (used_mode);
11531     }
11532   
11533   if ((code == PLUS || GET_CODE (m) == NOT) && used_mode != mode)
11534     the_op = op;  /* Computed above.  */
11535   else if (GET_CODE (op) == NOT && GET_CODE (m) != NOT)
11536     the_op = gen_rtx_fmt_ee (code, used_mode, op, m);
11537   else
11538     the_op = gen_rtx_fmt_ee (code, used_mode, m, op);
11539
11540   set_after = gen_rtx_SET (VOIDmode, after, the_op);
11541   set_before = gen_rtx_SET (VOIDmode, before, used_m);
11542   set_atomic = gen_rtx_SET (VOIDmode, used_m,
11543                             gen_rtx_UNSPEC (used_mode, gen_rtvec (1, the_op),
11544                                             UNSPEC_SYNC_OP));
11545   cc_scratch = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
11546
11547   if (code == PLUS && used_mode != mode)
11548     vec = gen_rtvec (5, set_after, set_before, set_atomic, cc_scratch,
11549                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
11550   else
11551     vec = gen_rtvec (4, set_after, set_before, set_atomic, cc_scratch);
11552   emit_insn (gen_rtx_PARALLEL (VOIDmode, vec));
11553
11554   /* Shift and mask the return values properly.  */
11555   if (used_mode != mode && before_param)
11556     {
11557       emit_insn (gen_lshrsi3 (before, before, shift));
11558       convert_move (before_param, before, 1);
11559     }
11560
11561   if (used_mode != mode && after_param)
11562     {
11563       emit_insn (gen_lshrsi3 (after, after, shift));
11564       convert_move (after_param, after, 1);
11565     }
11566
11567   /* The previous sequence will end with a branch that's dependent on
11568      the conditional store, so placing an isync will ensure that no
11569      other instructions (especially, no load or store instructions)
11570      can start before the atomic operation completes.  */
11571   if (sync_p)
11572     emit_insn (gen_isync ());
11573 }
11574
11575 /* Emit instructions to move SRC to DST.  Called by splitters for
11576    multi-register moves.  It will emit at most one instruction for
11577    each register that is accessed; that is, it won't emit li/lis pairs
11578    (or equivalent for 64-bit code).  One of SRC or DST must be a hard
11579    register.  */
11580
11581 void
11582 rs6000_split_multireg_move (rtx dst, rtx src)
11583 {
11584   /* The register number of the first register being moved.  */
11585   int reg;
11586   /* The mode that is to be moved.  */
11587   enum machine_mode mode;
11588   /* The mode that the move is being done in, and its size.  */
11589   enum machine_mode reg_mode;
11590   int reg_mode_size;
11591   /* The number of registers that will be moved.  */
11592   int nregs;
11593
11594   reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
11595   mode = GET_MODE (dst);
11596   nregs = hard_regno_nregs[reg][mode];
11597   if (FP_REGNO_P (reg))
11598     reg_mode = DFmode;
11599   else if (ALTIVEC_REGNO_P (reg))
11600     reg_mode = V16QImode;
11601   else
11602     reg_mode = word_mode;
11603   reg_mode_size = GET_MODE_SIZE (reg_mode);
11604
11605   gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
11606
11607   if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
11608     {
11609       /* Move register range backwards, if we might have destructive
11610          overlap.  */
11611       int i;
11612       for (i = nregs - 1; i >= 0; i--)
11613         emit_insn (gen_rtx_SET (VOIDmode,
11614                                 simplify_gen_subreg (reg_mode, dst, mode,
11615                                                      i * reg_mode_size),
11616                                 simplify_gen_subreg (reg_mode, src, mode,
11617                                                      i * reg_mode_size)));
11618     }
11619   else
11620     {
11621       int i;
11622       int j = -1;
11623       bool used_update = false;
11624
11625       if (MEM_P (src) && INT_REGNO_P (reg))
11626         {
11627           rtx breg;
11628
11629           if (GET_CODE (XEXP (src, 0)) == PRE_INC
11630               || GET_CODE (XEXP (src, 0)) == PRE_DEC)
11631             {
11632               rtx delta_rtx;
11633               breg = XEXP (XEXP (src, 0), 0);
11634               delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
11635                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
11636                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
11637               emit_insn (TARGET_32BIT
11638                          ? gen_addsi3 (breg, breg, delta_rtx)
11639                          : gen_adddi3 (breg, breg, delta_rtx));
11640               src = gen_rtx_MEM (mode, breg);
11641             }
11642           else if (! offsettable_memref_p (src))
11643             {
11644               rtx newsrc, basereg;
11645               basereg = gen_rtx_REG (Pmode, reg);
11646               emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0)));
11647               newsrc = gen_rtx_MEM (GET_MODE (src), basereg);
11648               MEM_COPY_ATTRIBUTES (newsrc, src);
11649               src = newsrc;
11650             }
11651
11652           breg = XEXP (src, 0);
11653           if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
11654             breg = XEXP (breg, 0);
11655
11656           /* If the base register we are using to address memory is
11657              also a destination reg, then change that register last.  */
11658           if (REG_P (breg)
11659               && REGNO (breg) >= REGNO (dst)
11660               && REGNO (breg) < REGNO (dst) + nregs)
11661             j = REGNO (breg) - REGNO (dst);
11662         }
11663
11664       if (GET_CODE (dst) == MEM && INT_REGNO_P (reg))
11665         {
11666           rtx breg;
11667
11668           if (GET_CODE (XEXP (dst, 0)) == PRE_INC
11669               || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
11670             {
11671               rtx delta_rtx;
11672               breg = XEXP (XEXP (dst, 0), 0);
11673               delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
11674                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
11675                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
11676
11677               /* We have to update the breg before doing the store.
11678                  Use store with update, if available.  */
11679
11680               if (TARGET_UPDATE)
11681                 {
11682                   rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
11683                   emit_insn (TARGET_32BIT
11684                              ? (TARGET_POWERPC64
11685                                 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
11686                                 : gen_movsi_update (breg, breg, delta_rtx, nsrc))
11687                              : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
11688                   used_update = true;
11689                 }
11690               else
11691                 emit_insn (TARGET_32BIT
11692                            ? gen_addsi3 (breg, breg, delta_rtx)
11693                            : gen_adddi3 (breg, breg, delta_rtx));
11694               dst = gen_rtx_MEM (mode, breg);
11695             }
11696           else
11697             gcc_assert (offsettable_memref_p (dst));
11698         }
11699
11700       for (i = 0; i < nregs; i++)
11701         {
11702           /* Calculate index to next subword.  */
11703           ++j;
11704           if (j == nregs)
11705             j = 0;
11706
11707           /* If compiler already emitted move of first word by
11708              store with update, no need to do anything.  */
11709           if (j == 0 && used_update)
11710             continue;
11711
11712           emit_insn (gen_rtx_SET (VOIDmode,
11713                                   simplify_gen_subreg (reg_mode, dst, mode,
11714                                                        j * reg_mode_size),
11715                                   simplify_gen_subreg (reg_mode, src, mode,
11716                                                        j * reg_mode_size)));
11717         }
11718     }
11719 }
11720
11721 \f
11722 /* This page contains routines that are used to determine what the
11723    function prologue and epilogue code will do and write them out.  */
11724
11725 /* Return the first fixed-point register that is required to be
11726    saved. 32 if none.  */
11727
11728 int
11729 first_reg_to_save (void)
11730 {
11731   int first_reg;
11732
11733   /* Find lowest numbered live register.  */
11734   for (first_reg = 13; first_reg <= 31; first_reg++)
11735     if (regs_ever_live[first_reg]
11736         && (! call_used_regs[first_reg]
11737             || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
11738                 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
11739                     || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
11740                     || (TARGET_TOC && TARGET_MINIMAL_TOC)))))
11741       break;
11742
11743 #if TARGET_MACHO
11744   if (flag_pic
11745       && current_function_uses_pic_offset_table
11746       && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
11747     return RS6000_PIC_OFFSET_TABLE_REGNUM;
11748 #endif
11749
11750   return first_reg;
11751 }
11752
11753 /* Similar, for FP regs.  */
11754
11755 int
11756 first_fp_reg_to_save (void)
11757 {
11758   int first_reg;
11759
11760   /* Find lowest numbered live register.  */
11761   for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
11762     if (regs_ever_live[first_reg])
11763       break;
11764
11765   return first_reg;
11766 }
11767
11768 /* Similar, for AltiVec regs.  */
11769
11770 static int
11771 first_altivec_reg_to_save (void)
11772 {
11773   int i;
11774
11775   /* Stack frame remains as is unless we are in AltiVec ABI.  */
11776   if (! TARGET_ALTIVEC_ABI)
11777     return LAST_ALTIVEC_REGNO + 1;
11778
11779   /* Find lowest numbered live register.  */
11780   for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
11781     if (regs_ever_live[i])
11782       break;
11783
11784   return i;
11785 }
11786
11787 /* Return a 32-bit mask of the AltiVec registers we need to set in
11788    VRSAVE.  Bit n of the return value is 1 if Vn is live.  The MSB in
11789    the 32-bit word is 0.  */
11790
11791 static unsigned int
11792 compute_vrsave_mask (void)
11793 {
11794   unsigned int i, mask = 0;
11795
11796   /* First, find out if we use _any_ altivec registers.  */
11797   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
11798     if (regs_ever_live[i])
11799       mask |= ALTIVEC_REG_BIT (i);
11800
11801   if (mask == 0)
11802     return mask;
11803
11804   /* Next, remove the argument registers from the set.  These must
11805      be in the VRSAVE mask set by the caller, so we don't need to add
11806      them in again.  More importantly, the mask we compute here is
11807      used to generate CLOBBERs in the set_vrsave insn, and we do not
11808      wish the argument registers to die.  */
11809   for (i = cfun->args_info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
11810     mask &= ~ALTIVEC_REG_BIT (i);
11811
11812   /* Similarly, remove the return value from the set.  */
11813   {
11814     bool yes = false;
11815     diddle_return_value (is_altivec_return_reg, &yes);
11816     if (yes)
11817       mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
11818   }
11819
11820   return mask;
11821 }
11822
11823 /* For a very restricted set of circumstances, we can cut down the
11824    size of prologues/epilogues by calling our own save/restore-the-world
11825    routines.  */
11826
11827 static void
11828 compute_save_world_info (rs6000_stack_t *info_ptr)
11829 {
11830   info_ptr->world_save_p = 1;
11831   info_ptr->world_save_p
11832     = (WORLD_SAVE_P (info_ptr)
11833        && DEFAULT_ABI == ABI_DARWIN
11834        && ! (current_function_calls_setjmp && flag_exceptions)
11835        && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
11836        && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
11837        && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
11838        && info_ptr->cr_save_p);
11839
11840   /* This will not work in conjunction with sibcalls.  Make sure there
11841      are none.  (This check is expensive, but seldom executed.) */
11842   if (WORLD_SAVE_P (info_ptr))
11843     {
11844       rtx insn;
11845       for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
11846         if ( GET_CODE (insn) == CALL_INSN
11847              && SIBLING_CALL_P (insn))
11848           {
11849             info_ptr->world_save_p = 0;
11850             break;
11851           }
11852     }
11853
11854   if (WORLD_SAVE_P (info_ptr))
11855     {
11856       /* Even if we're not touching VRsave, make sure there's room on the
11857          stack for it, if it looks like we're calling SAVE_WORLD, which
11858          will attempt to save it. */
11859       info_ptr->vrsave_size  = 4;
11860
11861       /* "Save" the VRsave register too if we're saving the world.  */
11862       if (info_ptr->vrsave_mask == 0)
11863         info_ptr->vrsave_mask = compute_vrsave_mask ();
11864
11865       /* Because the Darwin register save/restore routines only handle
11866          F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
11867          check.  */
11868       gcc_assert (info_ptr->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
11869                   && (info_ptr->first_altivec_reg_save
11870                       >= FIRST_SAVED_ALTIVEC_REGNO));
11871     }
11872   return;
11873 }
11874
11875
11876 static void
11877 is_altivec_return_reg (rtx reg, void *xyes)
11878 {
11879   bool *yes = (bool *) xyes;
11880   if (REGNO (reg) == ALTIVEC_ARG_RETURN)
11881     *yes = true;
11882 }
11883
11884 \f
11885 /* Calculate the stack information for the current function.  This is
11886    complicated by having two separate calling sequences, the AIX calling
11887    sequence and the V.4 calling sequence.
11888
11889    AIX (and Darwin/Mac OS X) stack frames look like:
11890                                                           32-bit  64-bit
11891         SP----> +---------------------------------------+
11892                 | back chain to caller                  | 0       0
11893                 +---------------------------------------+
11894                 | saved CR                              | 4       8 (8-11)
11895                 +---------------------------------------+
11896                 | saved LR                              | 8       16
11897                 +---------------------------------------+
11898                 | reserved for compilers                | 12      24
11899                 +---------------------------------------+
11900                 | reserved for binders                  | 16      32
11901                 +---------------------------------------+
11902                 | saved TOC pointer                     | 20      40
11903                 +---------------------------------------+
11904                 | Parameter save area (P)               | 24      48
11905                 +---------------------------------------+
11906                 | Alloca space (A)                      | 24+P    etc.
11907                 +---------------------------------------+
11908                 | Local variable space (L)              | 24+P+A
11909                 +---------------------------------------+
11910                 | Float/int conversion temporary (X)    | 24+P+A+L
11911                 +---------------------------------------+
11912                 | Save area for AltiVec registers (W)   | 24+P+A+L+X
11913                 +---------------------------------------+
11914                 | AltiVec alignment padding (Y)         | 24+P+A+L+X+W
11915                 +---------------------------------------+
11916                 | Save area for VRSAVE register (Z)     | 24+P+A+L+X+W+Y
11917                 +---------------------------------------+
11918                 | Save area for GP registers (G)        | 24+P+A+X+L+X+W+Y+Z
11919                 +---------------------------------------+
11920                 | Save area for FP registers (F)        | 24+P+A+X+L+X+W+Y+Z+G
11921                 +---------------------------------------+
11922         old SP->| back chain to caller's caller         |
11923                 +---------------------------------------+
11924
11925    The required alignment for AIX configurations is two words (i.e., 8
11926    or 16 bytes).
11927
11928
11929    V.4 stack frames look like:
11930
11931         SP----> +---------------------------------------+
11932                 | back chain to caller                  | 0
11933                 +---------------------------------------+
11934                 | caller's saved LR                     | 4
11935                 +---------------------------------------+
11936                 | Parameter save area (P)               | 8
11937                 +---------------------------------------+
11938                 | Alloca space (A)                      | 8+P
11939                 +---------------------------------------+
11940                 | Varargs save area (V)                 | 8+P+A
11941                 +---------------------------------------+
11942                 | Local variable space (L)              | 8+P+A+V
11943                 +---------------------------------------+
11944                 | Float/int conversion temporary (X)    | 8+P+A+V+L
11945                 +---------------------------------------+
11946                 | Save area for AltiVec registers (W)   | 8+P+A+V+L+X
11947                 +---------------------------------------+
11948                 | AltiVec alignment padding (Y)         | 8+P+A+V+L+X+W
11949                 +---------------------------------------+
11950                 | Save area for VRSAVE register (Z)     | 8+P+A+V+L+X+W+Y
11951                 +---------------------------------------+
11952                 | SPE: area for 64-bit GP registers     |
11953                 +---------------------------------------+
11954                 | SPE alignment padding                 |
11955                 +---------------------------------------+
11956                 | saved CR (C)                          | 8+P+A+V+L+X+W+Y+Z
11957                 +---------------------------------------+
11958                 | Save area for GP registers (G)        | 8+P+A+V+L+X+W+Y+Z+C
11959                 +---------------------------------------+
11960                 | Save area for FP registers (F)        | 8+P+A+V+L+X+W+Y+Z+C+G
11961                 +---------------------------------------+
11962         old SP->| back chain to caller's caller         |
11963                 +---------------------------------------+
11964
11965    The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
11966    given.  (But note below and in sysv4.h that we require only 8 and
11967    may round up the size of our stack frame anyways.  The historical
11968    reason is early versions of powerpc-linux which didn't properly
11969    align the stack at program startup.  A happy side-effect is that
11970    -mno-eabi libraries can be used with -meabi programs.)
11971
11972    The EABI configuration defaults to the V.4 layout.  However,
11973    the stack alignment requirements may differ.  If -mno-eabi is not
11974    given, the required stack alignment is 8 bytes; if -mno-eabi is
11975    given, the required alignment is 16 bytes.  (But see V.4 comment
11976    above.)  */
11977
11978 #ifndef ABI_STACK_BOUNDARY
11979 #define ABI_STACK_BOUNDARY STACK_BOUNDARY
11980 #endif
11981
11982 static rs6000_stack_t *
11983 rs6000_stack_info (void)
11984 {
11985   static rs6000_stack_t info, zero_info;
11986   rs6000_stack_t *info_ptr = &info;
11987   int reg_size = TARGET_32BIT ? 4 : 8;
11988   int ehrd_size;
11989   int save_align;
11990   HOST_WIDE_INT non_fixed_size;
11991
11992   /* Zero all fields portably.  */
11993   info = zero_info;
11994
11995   if (TARGET_SPE)
11996     {
11997       /* Cache value so we don't rescan instruction chain over and over.  */
11998       if (cfun->machine->insn_chain_scanned_p == 0)
11999         cfun->machine->insn_chain_scanned_p
12000           = spe_func_has_64bit_regs_p () + 1;
12001       info_ptr->spe_64bit_regs_used = cfun->machine->insn_chain_scanned_p - 1;
12002     }
12003
12004   /* Select which calling sequence.  */
12005   info_ptr->abi = DEFAULT_ABI;
12006
12007   /* Calculate which registers need to be saved & save area size.  */
12008   info_ptr->first_gp_reg_save = first_reg_to_save ();
12009   /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
12010      even if it currently looks like we won't.  */
12011   if (((TARGET_TOC && TARGET_MINIMAL_TOC)
12012        || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
12013        || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
12014       && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
12015     info_ptr->gp_size = reg_size * (32 - RS6000_PIC_OFFSET_TABLE_REGNUM);
12016   else
12017     info_ptr->gp_size = reg_size * (32 - info_ptr->first_gp_reg_save);
12018
12019   /* For the SPE, we have an additional upper 32-bits on each GPR.
12020      Ideally we should save the entire 64-bits only when the upper
12021      half is used in SIMD instructions.  Since we only record
12022      registers live (not the size they are used in), this proves
12023      difficult because we'd have to traverse the instruction chain at
12024      the right time, taking reload into account.  This is a real pain,
12025      so we opt to save the GPRs in 64-bits always if but one register
12026      gets used in 64-bits.  Otherwise, all the registers in the frame
12027      get saved in 32-bits.
12028
12029      So... since when we save all GPRs (except the SP) in 64-bits, the
12030      traditional GP save area will be empty.  */
12031   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
12032     info_ptr->gp_size = 0;
12033
12034   info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
12035   info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
12036
12037   info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
12038   info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
12039                                  - info_ptr->first_altivec_reg_save);
12040
12041   /* Does this function call anything?  */
12042   info_ptr->calls_p = (! current_function_is_leaf
12043                        || cfun->machine->ra_needs_full_frame);
12044
12045   /* Determine if we need to save the link register.  */
12046   if (rs6000_ra_ever_killed ()
12047       || (DEFAULT_ABI == ABI_AIX
12048           && current_function_profile
12049           && !TARGET_PROFILE_KERNEL)
12050 #ifdef TARGET_RELOCATABLE
12051       || (TARGET_RELOCATABLE && (get_pool_size () != 0))
12052 #endif
12053       || (info_ptr->first_fp_reg_save != 64
12054           && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save))
12055       || info_ptr->first_altivec_reg_save <= LAST_ALTIVEC_REGNO
12056       || (DEFAULT_ABI == ABI_V4 && current_function_calls_alloca)
12057       || info_ptr->calls_p)
12058     {
12059       info_ptr->lr_save_p = 1;
12060       regs_ever_live[LINK_REGISTER_REGNUM] = 1;
12061     }
12062
12063   /* Determine if we need to save the condition code registers.  */
12064   if (regs_ever_live[CR2_REGNO]
12065       || regs_ever_live[CR3_REGNO]
12066       || regs_ever_live[CR4_REGNO])
12067     {
12068       info_ptr->cr_save_p = 1;
12069       if (DEFAULT_ABI == ABI_V4)
12070         info_ptr->cr_size = reg_size;
12071     }
12072
12073   /* If the current function calls __builtin_eh_return, then we need
12074      to allocate stack space for registers that will hold data for
12075      the exception handler.  */
12076   if (current_function_calls_eh_return)
12077     {
12078       unsigned int i;
12079       for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
12080         continue;
12081
12082       /* SPE saves EH registers in 64-bits.  */
12083       ehrd_size = i * (TARGET_SPE_ABI
12084                        && info_ptr->spe_64bit_regs_used != 0
12085                        ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
12086     }
12087   else
12088     ehrd_size = 0;
12089
12090   /* Determine various sizes.  */
12091   info_ptr->reg_size     = reg_size;
12092   info_ptr->fixed_size   = RS6000_SAVE_AREA;
12093   info_ptr->varargs_size = RS6000_VARARGS_AREA;
12094   info_ptr->vars_size    = RS6000_ALIGN (get_frame_size (), 8);
12095   info_ptr->parm_size    = RS6000_ALIGN (current_function_outgoing_args_size,
12096                                          TARGET_ALTIVEC ? 16 : 8);
12097
12098   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
12099     info_ptr->spe_gp_size = 8 * (32 - info_ptr->first_gp_reg_save);
12100   else
12101     info_ptr->spe_gp_size = 0;
12102
12103   if (TARGET_ALTIVEC_ABI)
12104     info_ptr->vrsave_mask = compute_vrsave_mask ();
12105   else
12106     info_ptr->vrsave_mask = 0;
12107
12108   if (TARGET_ALTIVEC_VRSAVE && info_ptr->vrsave_mask)
12109     info_ptr->vrsave_size  = 4;
12110   else
12111     info_ptr->vrsave_size  = 0;
12112
12113   compute_save_world_info (info_ptr);
12114
12115   /* Calculate the offsets.  */
12116   switch (DEFAULT_ABI)
12117     {
12118     case ABI_NONE:
12119     default:
12120       gcc_unreachable ();
12121
12122     case ABI_AIX:
12123     case ABI_DARWIN:
12124       info_ptr->fp_save_offset   = - info_ptr->fp_size;
12125       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
12126
12127       if (TARGET_ALTIVEC_ABI)
12128         {
12129           info_ptr->vrsave_save_offset
12130             = info_ptr->gp_save_offset - info_ptr->vrsave_size;
12131
12132           /* Align stack so vector save area is on a quadword boundary.  */
12133           if (info_ptr->altivec_size != 0)
12134             info_ptr->altivec_padding_size
12135               = 16 - (-info_ptr->vrsave_save_offset % 16);
12136           else
12137             info_ptr->altivec_padding_size = 0;
12138
12139           info_ptr->altivec_save_offset
12140             = info_ptr->vrsave_save_offset
12141             - info_ptr->altivec_padding_size
12142             - info_ptr->altivec_size;
12143
12144           /* Adjust for AltiVec case.  */
12145           info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
12146         }
12147       else
12148         info_ptr->ehrd_offset      = info_ptr->gp_save_offset - ehrd_size;
12149       info_ptr->cr_save_offset   = reg_size; /* first word when 64-bit.  */
12150       info_ptr->lr_save_offset   = 2*reg_size;
12151       break;
12152
12153     case ABI_V4:
12154       info_ptr->fp_save_offset   = - info_ptr->fp_size;
12155       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
12156       info_ptr->cr_save_offset   = info_ptr->gp_save_offset - info_ptr->cr_size;
12157
12158       if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
12159         {
12160           /* Align stack so SPE GPR save area is aligned on a
12161              double-word boundary.  */
12162           if (info_ptr->spe_gp_size != 0)
12163             info_ptr->spe_padding_size
12164               = 8 - (-info_ptr->cr_save_offset % 8);
12165           else
12166             info_ptr->spe_padding_size = 0;
12167
12168           info_ptr->spe_gp_save_offset
12169             = info_ptr->cr_save_offset
12170             - info_ptr->spe_padding_size
12171             - info_ptr->spe_gp_size;
12172
12173           /* Adjust for SPE case.  */
12174           info_ptr->toc_save_offset
12175             = info_ptr->spe_gp_save_offset - info_ptr->toc_size;
12176         }
12177       else if (TARGET_ALTIVEC_ABI)
12178         {
12179           info_ptr->vrsave_save_offset
12180             = info_ptr->cr_save_offset - info_ptr->vrsave_size;
12181
12182           /* Align stack so vector save area is on a quadword boundary.  */
12183           if (info_ptr->altivec_size != 0)
12184             info_ptr->altivec_padding_size
12185               = 16 - (-info_ptr->vrsave_save_offset % 16);
12186           else
12187             info_ptr->altivec_padding_size = 0;
12188
12189           info_ptr->altivec_save_offset
12190             = info_ptr->vrsave_save_offset
12191             - info_ptr->altivec_padding_size
12192             - info_ptr->altivec_size;
12193
12194           /* Adjust for AltiVec case.  */
12195           info_ptr->toc_save_offset
12196             = info_ptr->altivec_save_offset - info_ptr->toc_size;
12197         }
12198       else
12199         info_ptr->toc_save_offset  = info_ptr->cr_save_offset - info_ptr->toc_size;
12200       info_ptr->ehrd_offset      = info_ptr->toc_save_offset - ehrd_size;
12201       info_ptr->lr_save_offset   = reg_size;
12202       break;
12203     }
12204
12205   save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
12206   info_ptr->save_size    = RS6000_ALIGN (info_ptr->fp_size
12207                                          + info_ptr->gp_size
12208                                          + info_ptr->altivec_size
12209                                          + info_ptr->altivec_padding_size
12210                                          + info_ptr->spe_gp_size
12211                                          + info_ptr->spe_padding_size
12212                                          + ehrd_size
12213                                          + info_ptr->cr_size
12214                                          + info_ptr->lr_size
12215                                          + info_ptr->vrsave_size
12216                                          + info_ptr->toc_size,
12217                                          save_align);
12218
12219   non_fixed_size         = (info_ptr->vars_size
12220                             + info_ptr->parm_size
12221                             + info_ptr->save_size
12222                             + info_ptr->varargs_size);
12223
12224   info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size,
12225                                        ABI_STACK_BOUNDARY / BITS_PER_UNIT);
12226
12227   /* Determine if we need to allocate any stack frame:
12228
12229      For AIX we need to push the stack if a frame pointer is needed
12230      (because the stack might be dynamically adjusted), if we are
12231      debugging, if we make calls, or if the sum of fp_save, gp_save,
12232      and local variables are more than the space needed to save all
12233      non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
12234      + 18*8 = 288 (GPR13 reserved).
12235
12236      For V.4 we don't have the stack cushion that AIX uses, but assume
12237      that the debugger can handle stackless frames.  */
12238
12239   if (info_ptr->calls_p)
12240     info_ptr->push_p = 1;
12241
12242   else if (DEFAULT_ABI == ABI_V4)
12243     info_ptr->push_p = non_fixed_size != 0;
12244
12245   else if (frame_pointer_needed)
12246     info_ptr->push_p = 1;
12247
12248   else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
12249     info_ptr->push_p = 1;
12250
12251   else
12252     info_ptr->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
12253
12254   /* Zero offsets if we're not saving those registers.  */
12255   if (info_ptr->fp_size == 0)
12256     info_ptr->fp_save_offset = 0;
12257
12258   if (info_ptr->gp_size == 0)
12259     info_ptr->gp_save_offset = 0;
12260
12261   if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
12262     info_ptr->altivec_save_offset = 0;
12263
12264   if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
12265     info_ptr->vrsave_save_offset = 0;
12266
12267   if (! TARGET_SPE_ABI
12268       || info_ptr->spe_64bit_regs_used == 0
12269       || info_ptr->spe_gp_size == 0)
12270     info_ptr->spe_gp_save_offset = 0;
12271
12272   if (! info_ptr->lr_save_p)
12273     info_ptr->lr_save_offset = 0;
12274
12275   if (! info_ptr->cr_save_p)
12276     info_ptr->cr_save_offset = 0;
12277
12278   if (! info_ptr->toc_save_p)
12279     info_ptr->toc_save_offset = 0;
12280
12281   return info_ptr;
12282 }
12283
12284 /* Return true if the current function uses any GPRs in 64-bit SIMD
12285    mode.  */
12286
12287 static bool
12288 spe_func_has_64bit_regs_p (void)
12289 {
12290   rtx insns, insn;
12291
12292   /* Functions that save and restore all the call-saved registers will
12293      need to save/restore the registers in 64-bits.  */
12294   if (current_function_calls_eh_return
12295       || current_function_calls_setjmp
12296       || current_function_has_nonlocal_goto)
12297     return true;
12298
12299   insns = get_insns ();
12300
12301   for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
12302     {
12303       if (INSN_P (insn))
12304         {
12305           rtx i;
12306
12307           /* FIXME: This should be implemented with attributes...
12308
12309                  (set_attr "spe64" "true")....then,
12310                  if (get_spe64(insn)) return true;
12311
12312              It's the only reliable way to do the stuff below.  */
12313
12314           i = PATTERN (insn);
12315           if (GET_CODE (i) == SET)
12316             {
12317               enum machine_mode mode = GET_MODE (SET_SRC (i));
12318
12319               if (SPE_VECTOR_MODE (mode))
12320                 return true;
12321               if (TARGET_E500_DOUBLE && mode == DFmode)
12322                 return true;
12323             }
12324         }
12325     }
12326
12327   return false;
12328 }
12329
12330 static void
12331 debug_stack_info (rs6000_stack_t *info)
12332 {
12333   const char *abi_string;
12334
12335   if (! info)
12336     info = rs6000_stack_info ();
12337
12338   fprintf (stderr, "\nStack information for function %s:\n",
12339            ((current_function_decl && DECL_NAME (current_function_decl))
12340             ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
12341             : "<unknown>"));
12342
12343   switch (info->abi)
12344     {
12345     default:             abi_string = "Unknown";        break;
12346     case ABI_NONE:       abi_string = "NONE";           break;
12347     case ABI_AIX:        abi_string = "AIX";            break;
12348     case ABI_DARWIN:     abi_string = "Darwin";         break;
12349     case ABI_V4:         abi_string = "V.4";            break;
12350     }
12351
12352   fprintf (stderr, "\tABI                 = %5s\n", abi_string);
12353
12354   if (TARGET_ALTIVEC_ABI)
12355     fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
12356
12357   if (TARGET_SPE_ABI)
12358     fprintf (stderr, "\tSPE ABI extensions enabled.\n");
12359
12360   if (info->first_gp_reg_save != 32)
12361     fprintf (stderr, "\tfirst_gp_reg_save   = %5d\n", info->first_gp_reg_save);
12362
12363   if (info->first_fp_reg_save != 64)
12364     fprintf (stderr, "\tfirst_fp_reg_save   = %5d\n", info->first_fp_reg_save);
12365
12366   if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
12367     fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
12368              info->first_altivec_reg_save);
12369
12370   if (info->lr_save_p)
12371     fprintf (stderr, "\tlr_save_p           = %5d\n", info->lr_save_p);
12372
12373   if (info->cr_save_p)
12374     fprintf (stderr, "\tcr_save_p           = %5d\n", info->cr_save_p);
12375
12376   if (info->toc_save_p)
12377     fprintf (stderr, "\ttoc_save_p          = %5d\n", info->toc_save_p);
12378
12379   if (info->vrsave_mask)
12380     fprintf (stderr, "\tvrsave_mask         = 0x%x\n", info->vrsave_mask);
12381
12382   if (info->push_p)
12383     fprintf (stderr, "\tpush_p              = %5d\n", info->push_p);
12384
12385   if (info->calls_p)
12386     fprintf (stderr, "\tcalls_p             = %5d\n", info->calls_p);
12387
12388   if (info->gp_save_offset)
12389     fprintf (stderr, "\tgp_save_offset      = %5d\n", info->gp_save_offset);
12390
12391   if (info->fp_save_offset)
12392     fprintf (stderr, "\tfp_save_offset      = %5d\n", info->fp_save_offset);
12393
12394   if (info->altivec_save_offset)
12395     fprintf (stderr, "\taltivec_save_offset = %5d\n",
12396              info->altivec_save_offset);
12397
12398   if (info->spe_gp_save_offset)
12399     fprintf (stderr, "\tspe_gp_save_offset  = %5d\n",
12400              info->spe_gp_save_offset);
12401
12402   if (info->vrsave_save_offset)
12403     fprintf (stderr, "\tvrsave_save_offset  = %5d\n",
12404              info->vrsave_save_offset);
12405
12406   if (info->lr_save_offset)
12407     fprintf (stderr, "\tlr_save_offset      = %5d\n", info->lr_save_offset);
12408
12409   if (info->cr_save_offset)
12410     fprintf (stderr, "\tcr_save_offset      = %5d\n", info->cr_save_offset);
12411
12412   if (info->toc_save_offset)
12413     fprintf (stderr, "\ttoc_save_offset     = %5d\n", info->toc_save_offset);
12414
12415   if (info->varargs_save_offset)
12416     fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
12417
12418   if (info->total_size)
12419     fprintf (stderr, "\ttotal_size          = "HOST_WIDE_INT_PRINT_DEC"\n",
12420              info->total_size);
12421
12422   if (info->varargs_size)
12423     fprintf (stderr, "\tvarargs_size        = %5d\n", info->varargs_size);
12424
12425   if (info->vars_size)
12426     fprintf (stderr, "\tvars_size           = "HOST_WIDE_INT_PRINT_DEC"\n",
12427              info->vars_size);
12428
12429   if (info->parm_size)
12430     fprintf (stderr, "\tparm_size           = %5d\n", info->parm_size);
12431
12432   if (info->fixed_size)
12433     fprintf (stderr, "\tfixed_size          = %5d\n", info->fixed_size);
12434
12435   if (info->gp_size)
12436     fprintf (stderr, "\tgp_size             = %5d\n", info->gp_size);
12437
12438   if (info->spe_gp_size)
12439     fprintf (stderr, "\tspe_gp_size         = %5d\n", info->spe_gp_size);
12440
12441   if (info->fp_size)
12442     fprintf (stderr, "\tfp_size             = %5d\n", info->fp_size);
12443
12444   if (info->altivec_size)
12445     fprintf (stderr, "\taltivec_size        = %5d\n", info->altivec_size);
12446
12447   if (info->vrsave_size)
12448     fprintf (stderr, "\tvrsave_size         = %5d\n", info->vrsave_size);
12449
12450   if (info->altivec_padding_size)
12451     fprintf (stderr, "\taltivec_padding_size= %5d\n",
12452              info->altivec_padding_size);
12453
12454   if (info->spe_padding_size)
12455     fprintf (stderr, "\tspe_padding_size    = %5d\n",
12456              info->spe_padding_size);
12457
12458   if (info->lr_size)
12459     fprintf (stderr, "\tlr_size             = %5d\n", info->lr_size);
12460
12461   if (info->cr_size)
12462     fprintf (stderr, "\tcr_size             = %5d\n", info->cr_size);
12463
12464   if (info->toc_size)
12465     fprintf (stderr, "\ttoc_size            = %5d\n", info->toc_size);
12466
12467   if (info->save_size)
12468     fprintf (stderr, "\tsave_size           = %5d\n", info->save_size);
12469
12470   if (info->reg_size != 4)
12471     fprintf (stderr, "\treg_size            = %5d\n", info->reg_size);
12472
12473   fprintf (stderr, "\n");
12474 }
12475
12476 rtx
12477 rs6000_return_addr (int count, rtx frame)
12478 {
12479   /* Currently we don't optimize very well between prolog and body
12480      code and for PIC code the code can be actually quite bad, so
12481      don't try to be too clever here.  */
12482   if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
12483     {
12484       cfun->machine->ra_needs_full_frame = 1;
12485
12486       return
12487         gen_rtx_MEM
12488           (Pmode,
12489            memory_address
12490            (Pmode,
12491             plus_constant (copy_to_reg
12492                            (gen_rtx_MEM (Pmode,
12493                                          memory_address (Pmode, frame))),
12494                            RETURN_ADDRESS_OFFSET)));
12495     }
12496
12497   cfun->machine->ra_need_lr = 1;
12498   return get_hard_reg_initial_val (Pmode, LINK_REGISTER_REGNUM);
12499 }
12500
12501 /* Say whether a function is a candidate for sibcall handling or not.
12502    We do not allow indirect calls to be optimized into sibling calls.
12503    Also, we can't do it if there are any vector parameters; there's
12504    nowhere to put the VRsave code so it works; note that functions with
12505    vector parameters are required to have a prototype, so the argument
12506    type info must be available here.  (The tail recursion case can work
12507    with vector parameters, but there's no way to distinguish here.) */
12508 static bool
12509 rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
12510 {
12511   tree type;
12512   if (decl)
12513     {
12514       if (TARGET_ALTIVEC_VRSAVE)
12515         {
12516           for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
12517                type; type = TREE_CHAIN (type))
12518             {
12519               if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
12520                 return false;
12521             }
12522         }
12523       if (DEFAULT_ABI == ABI_DARWIN
12524           || (*targetm.binds_local_p) (decl))
12525         {
12526           tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
12527
12528           if (!lookup_attribute ("longcall", attr_list)
12529               || lookup_attribute ("shortcall", attr_list))
12530             return true;
12531         }
12532     }
12533   return false;
12534 }
12535
12536 /* NULL if INSN insn is valid within a low-overhead loop.
12537    Otherwise return why doloop cannot be applied.
12538    PowerPC uses the COUNT register for branch on table instructions.  */
12539
12540 static const char *
12541 rs6000_invalid_within_doloop (rtx insn)
12542 {
12543   if (CALL_P (insn))
12544     return "Function call in the loop.";
12545
12546   if (JUMP_P (insn)
12547       && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
12548           || GET_CODE (PATTERN (insn)) == ADDR_VEC))
12549     return "Computed branch in the loop.";
12550
12551   return NULL;
12552 }
12553
12554 static int
12555 rs6000_ra_ever_killed (void)
12556 {
12557   rtx top;
12558   rtx reg;
12559   rtx insn;
12560
12561   if (current_function_is_thunk)
12562     return 0;
12563
12564   /* regs_ever_live has LR marked as used if any sibcalls are present,
12565      but this should not force saving and restoring in the
12566      pro/epilogue.  Likewise, reg_set_between_p thinks a sibcall
12567      clobbers LR, so that is inappropriate.  */
12568
12569   /* Also, the prologue can generate a store into LR that
12570      doesn't really count, like this:
12571
12572         move LR->R0
12573         bcl to set PIC register
12574         move LR->R31
12575         move R0->LR
12576
12577      When we're called from the epilogue, we need to avoid counting
12578      this as a store.  */
12579
12580   push_topmost_sequence ();
12581   top = get_insns ();
12582   pop_topmost_sequence ();
12583   reg = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
12584
12585   for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
12586     {
12587       if (INSN_P (insn))
12588         {
12589           if (FIND_REG_INC_NOTE (insn, reg))
12590             return 1;
12591           else if (GET_CODE (insn) == CALL_INSN
12592                    && !SIBLING_CALL_P (insn))
12593             return 1;
12594           else if (set_of (reg, insn) != NULL_RTX
12595                    && !prologue_epilogue_contains (insn))
12596             return 1;
12597         }
12598     }
12599   return 0;
12600 }
12601 \f
12602 /* Add a REG_MAYBE_DEAD note to the insn.  */
12603 static void
12604 rs6000_maybe_dead (rtx insn)
12605 {
12606   REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD,
12607                                         const0_rtx,
12608                                         REG_NOTES (insn));
12609 }
12610
12611 /* Emit instructions needed to load the TOC register.
12612    This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
12613    a constant pool; or for SVR4 -fpic.  */
12614
12615 void
12616 rs6000_emit_load_toc_table (int fromprolog)
12617 {
12618   rtx dest, insn;
12619   dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
12620
12621   if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
12622     {
12623       char buf[30];
12624       rtx lab, tmp1, tmp2, got, tempLR;
12625
12626       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
12627       lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
12628       if (flag_pic == 2)
12629         got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
12630       else
12631         got = rs6000_got_sym ();
12632       tmp1 = tmp2 = dest;
12633       if (!fromprolog)
12634         {
12635           tmp1 = gen_reg_rtx (Pmode);
12636           tmp2 = gen_reg_rtx (Pmode);
12637         }
12638       tempLR = (fromprolog
12639                 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
12640                 : gen_reg_rtx (Pmode));
12641       insn = emit_insn (gen_load_toc_v4_PIC_1 (tempLR, lab));
12642       if (fromprolog)
12643         rs6000_maybe_dead (insn);
12644       insn = emit_move_insn (tmp1, tempLR);
12645       if (fromprolog)
12646         rs6000_maybe_dead (insn);
12647       insn = emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
12648       if (fromprolog)
12649         rs6000_maybe_dead (insn);
12650       insn = emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
12651       if (fromprolog)
12652         rs6000_maybe_dead (insn);
12653     }
12654   else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
12655     {
12656       rtx tempLR = (fromprolog
12657                     ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
12658                     : gen_reg_rtx (Pmode));
12659
12660       insn = emit_insn (gen_load_toc_v4_pic_si (tempLR));
12661       if (fromprolog)
12662         rs6000_maybe_dead (insn);
12663       insn = emit_move_insn (dest, tempLR);
12664       if (fromprolog)
12665         rs6000_maybe_dead (insn);
12666     }
12667   else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
12668     {
12669       char buf[30];
12670       rtx tempLR = (fromprolog
12671                     ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
12672                     : gen_reg_rtx (Pmode));
12673       rtx temp0 = (fromprolog
12674                    ? gen_rtx_REG (Pmode, 0)
12675                    : gen_reg_rtx (Pmode));
12676
12677       if (fromprolog)
12678         {
12679           rtx symF, symL;
12680
12681           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
12682           symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
12683
12684           ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
12685           symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
12686
12687           rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1 (tempLR,
12688                                                                symF)));
12689           rs6000_maybe_dead (emit_move_insn (dest, tempLR));
12690           rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest,
12691                                                                symL,
12692                                                                symF)));
12693         }
12694       else
12695         {
12696           rtx tocsym;
12697
12698           tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
12699           emit_insn (gen_load_toc_v4_PIC_1b (tempLR, tocsym));
12700           emit_move_insn (dest, tempLR);
12701           emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
12702         }
12703       insn = emit_insn (gen_addsi3 (dest, temp0, dest));
12704       if (fromprolog)
12705         rs6000_maybe_dead (insn);
12706     }
12707   else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
12708     {
12709       /* This is for AIX code running in non-PIC ELF32.  */
12710       char buf[30];
12711       rtx realsym;
12712       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
12713       realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
12714
12715       insn = emit_insn (gen_elf_high (dest, realsym));
12716       if (fromprolog)
12717         rs6000_maybe_dead (insn);
12718       insn = emit_insn (gen_elf_low (dest, dest, realsym));
12719       if (fromprolog)
12720         rs6000_maybe_dead (insn);
12721     }
12722   else
12723     {
12724       gcc_assert (DEFAULT_ABI == ABI_AIX);
12725       
12726       if (TARGET_32BIT)
12727         insn = emit_insn (gen_load_toc_aix_si (dest));
12728       else
12729         insn = emit_insn (gen_load_toc_aix_di (dest));
12730       if (fromprolog)
12731         rs6000_maybe_dead (insn);
12732     }
12733 }
12734
12735 /* Emit instructions to restore the link register after determining where
12736    its value has been stored.  */
12737
12738 void
12739 rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
12740 {
12741   rs6000_stack_t *info = rs6000_stack_info ();
12742   rtx operands[2];
12743
12744   operands[0] = source;
12745   operands[1] = scratch;
12746
12747   if (info->lr_save_p)
12748     {
12749       rtx frame_rtx = stack_pointer_rtx;
12750       HOST_WIDE_INT sp_offset = 0;
12751       rtx tmp;
12752
12753       if (frame_pointer_needed
12754           || current_function_calls_alloca
12755           || info->total_size > 32767)
12756         {
12757           emit_move_insn (operands[1], gen_rtx_MEM (Pmode, frame_rtx));
12758           frame_rtx = operands[1];
12759         }
12760       else if (info->push_p)
12761         sp_offset = info->total_size;
12762
12763       tmp = plus_constant (frame_rtx, info->lr_save_offset + sp_offset);
12764       tmp = gen_rtx_MEM (Pmode, tmp);
12765       emit_move_insn (tmp, operands[0]);
12766     }
12767   else
12768     emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM), operands[0]);
12769 }
12770
12771 static GTY(()) int set = -1;
12772
12773 int
12774 get_TOC_alias_set (void)
12775 {
12776   if (set == -1)
12777     set = new_alias_set ();
12778   return set;
12779 }
12780
12781 /* This returns nonzero if the current function uses the TOC.  This is
12782    determined by the presence of (use (unspec ... UNSPEC_TOC)), which
12783    is generated by the ABI_V4 load_toc_* patterns.  */
12784 #if TARGET_ELF
12785 static int
12786 uses_TOC (void)
12787 {
12788   rtx insn;
12789
12790   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
12791     if (INSN_P (insn))
12792       {
12793         rtx pat = PATTERN (insn);
12794         int i;
12795
12796         if (GET_CODE (pat) == PARALLEL)
12797           for (i = 0; i < XVECLEN (pat, 0); i++)
12798             {
12799               rtx sub = XVECEXP (pat, 0, i);
12800               if (GET_CODE (sub) == USE)
12801                 {
12802                   sub = XEXP (sub, 0);
12803                   if (GET_CODE (sub) == UNSPEC
12804                       && XINT (sub, 1) == UNSPEC_TOC)
12805                     return 1;
12806                 }
12807             }
12808       }
12809   return 0;
12810 }
12811 #endif
12812
12813 rtx
12814 create_TOC_reference (rtx symbol)
12815 {
12816   return gen_rtx_PLUS (Pmode,
12817            gen_rtx_REG (Pmode, TOC_REGISTER),
12818              gen_rtx_CONST (Pmode,
12819                gen_rtx_MINUS (Pmode, symbol,
12820                  gen_rtx_SYMBOL_REF (Pmode, toc_label_name))));
12821 }
12822
12823 /* If _Unwind_* has been called from within the same module,
12824    toc register is not guaranteed to be saved to 40(1) on function
12825    entry.  Save it there in that case.  */
12826
12827 void
12828 rs6000_aix_emit_builtin_unwind_init (void)
12829 {
12830   rtx mem;
12831   rtx stack_top = gen_reg_rtx (Pmode);
12832   rtx opcode_addr = gen_reg_rtx (Pmode);
12833   rtx opcode = gen_reg_rtx (SImode);
12834   rtx tocompare = gen_reg_rtx (SImode);
12835   rtx no_toc_save_needed = gen_label_rtx ();
12836
12837   mem = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
12838   emit_move_insn (stack_top, mem);
12839
12840   mem = gen_rtx_MEM (Pmode,
12841                      gen_rtx_PLUS (Pmode, stack_top,
12842                                    GEN_INT (2 * GET_MODE_SIZE (Pmode))));
12843   emit_move_insn (opcode_addr, mem);
12844   emit_move_insn (opcode, gen_rtx_MEM (SImode, opcode_addr));
12845   emit_move_insn (tocompare, gen_int_mode (TARGET_32BIT ? 0x80410014
12846                                            : 0xE8410028, SImode));
12847
12848   do_compare_rtx_and_jump (opcode, tocompare, EQ, 1,
12849                            SImode, NULL_RTX, NULL_RTX,
12850                            no_toc_save_needed);
12851
12852   mem = gen_rtx_MEM (Pmode,
12853                      gen_rtx_PLUS (Pmode, stack_top,
12854                                    GEN_INT (5 * GET_MODE_SIZE (Pmode))));
12855   emit_move_insn (mem, gen_rtx_REG (Pmode, 2));
12856   emit_label (no_toc_save_needed);
12857 }
12858 \f
12859 /* This ties together stack memory (MEM with an alias set of
12860    rs6000_sr_alias_set) and the change to the stack pointer.  */
12861
12862 static void
12863 rs6000_emit_stack_tie (void)
12864 {
12865   rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
12866
12867   set_mem_alias_set (mem, rs6000_sr_alias_set);
12868   emit_insn (gen_stack_tie (mem));
12869 }
12870
12871 /* Emit the correct code for allocating stack space, as insns.
12872    If COPY_R12, make sure a copy of the old frame is left in r12.
12873    The generated code may use hard register 0 as a temporary.  */
12874
12875 static void
12876 rs6000_emit_allocate_stack (HOST_WIDE_INT size, int copy_r12)
12877 {
12878   rtx insn;
12879   rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
12880   rtx tmp_reg = gen_rtx_REG (Pmode, 0);
12881   rtx todec = gen_int_mode (-size, Pmode);
12882
12883   if (INTVAL (todec) != -size)
12884     {
12885       warning (0, "stack frame too large");
12886       emit_insn (gen_trap ());
12887       return;
12888     }
12889
12890   if (current_function_limit_stack)
12891     {
12892       if (REG_P (stack_limit_rtx)
12893           && REGNO (stack_limit_rtx) > 1
12894           && REGNO (stack_limit_rtx) <= 31)
12895         {
12896           emit_insn (TARGET_32BIT
12897                      ? gen_addsi3 (tmp_reg,
12898                                    stack_limit_rtx,
12899                                    GEN_INT (size))
12900                      : gen_adddi3 (tmp_reg,
12901                                    stack_limit_rtx,
12902                                    GEN_INT (size)));
12903
12904           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
12905                                     const0_rtx));
12906         }
12907       else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
12908                && TARGET_32BIT
12909                && DEFAULT_ABI == ABI_V4)
12910         {
12911           rtx toload = gen_rtx_CONST (VOIDmode,
12912                                       gen_rtx_PLUS (Pmode,
12913                                                     stack_limit_rtx,
12914                                                     GEN_INT (size)));
12915
12916           emit_insn (gen_elf_high (tmp_reg, toload));
12917           emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
12918           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
12919                                     const0_rtx));
12920         }
12921       else
12922         warning (0, "stack limit expression is not supported");
12923     }
12924
12925   if (copy_r12 || ! TARGET_UPDATE)
12926     emit_move_insn (gen_rtx_REG (Pmode, 12), stack_reg);
12927
12928   if (TARGET_UPDATE)
12929     {
12930       if (size > 32767)
12931         {
12932           /* Need a note here so that try_split doesn't get confused.  */
12933           if (get_last_insn () == NULL_RTX)
12934             emit_note (NOTE_INSN_DELETED);
12935           insn = emit_move_insn (tmp_reg, todec);
12936           try_split (PATTERN (insn), insn, 0);
12937           todec = tmp_reg;
12938         }
12939
12940       insn = emit_insn (TARGET_32BIT
12941                         ? gen_movsi_update (stack_reg, stack_reg,
12942                                             todec, stack_reg)
12943                         : gen_movdi_di_update (stack_reg, stack_reg,
12944                                             todec, stack_reg));
12945     }
12946   else
12947     {
12948       insn = emit_insn (TARGET_32BIT
12949                         ? gen_addsi3 (stack_reg, stack_reg, todec)
12950                         : gen_adddi3 (stack_reg, stack_reg, todec));
12951       emit_move_insn (gen_rtx_MEM (Pmode, stack_reg),
12952                       gen_rtx_REG (Pmode, 12));
12953     }
12954
12955   RTX_FRAME_RELATED_P (insn) = 1;
12956   REG_NOTES (insn) =
12957     gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
12958                        gen_rtx_SET (VOIDmode, stack_reg,
12959                                     gen_rtx_PLUS (Pmode, stack_reg,
12960                                                   GEN_INT (-size))),
12961                        REG_NOTES (insn));
12962 }
12963
12964 /* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
12965    with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
12966    is not NULL.  It would be nice if dwarf2out_frame_debug_expr could
12967    deduce these equivalences by itself so it wasn't necessary to hold
12968    its hand so much.  */
12969
12970 static void
12971 rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
12972                       rtx reg2, rtx rreg)
12973 {
12974   rtx real, temp;
12975
12976   /* copy_rtx will not make unique copies of registers, so we need to
12977      ensure we don't have unwanted sharing here.  */
12978   if (reg == reg2)
12979     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
12980
12981   if (reg == rreg)
12982     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
12983
12984   real = copy_rtx (PATTERN (insn));
12985
12986   if (reg2 != NULL_RTX)
12987     real = replace_rtx (real, reg2, rreg);
12988
12989   real = replace_rtx (real, reg,
12990                       gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
12991                                                         STACK_POINTER_REGNUM),
12992                                     GEN_INT (val)));
12993
12994   /* We expect that 'real' is either a SET or a PARALLEL containing
12995      SETs (and possibly other stuff).  In a PARALLEL, all the SETs
12996      are important so they all have to be marked RTX_FRAME_RELATED_P.  */
12997
12998   if (GET_CODE (real) == SET)
12999     {
13000       rtx set = real;
13001
13002       temp = simplify_rtx (SET_SRC (set));
13003       if (temp)
13004         SET_SRC (set) = temp;
13005       temp = simplify_rtx (SET_DEST (set));
13006       if (temp)
13007         SET_DEST (set) = temp;
13008       if (GET_CODE (SET_DEST (set)) == MEM)
13009         {
13010           temp = simplify_rtx (XEXP (SET_DEST (set), 0));
13011           if (temp)
13012             XEXP (SET_DEST (set), 0) = temp;
13013         }
13014     }
13015   else
13016     {
13017       int i;
13018
13019       gcc_assert (GET_CODE (real) == PARALLEL);
13020       for (i = 0; i < XVECLEN (real, 0); i++)
13021         if (GET_CODE (XVECEXP (real, 0, i)) == SET)
13022           {
13023             rtx set = XVECEXP (real, 0, i);
13024
13025             temp = simplify_rtx (SET_SRC (set));
13026             if (temp)
13027               SET_SRC (set) = temp;
13028             temp = simplify_rtx (SET_DEST (set));
13029             if (temp)
13030               SET_DEST (set) = temp;
13031             if (GET_CODE (SET_DEST (set)) == MEM)
13032               {
13033                 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
13034                 if (temp)
13035                   XEXP (SET_DEST (set), 0) = temp;
13036               }
13037             RTX_FRAME_RELATED_P (set) = 1;
13038           }
13039     }
13040
13041   if (TARGET_SPE)
13042     real = spe_synthesize_frame_save (real);
13043
13044   RTX_FRAME_RELATED_P (insn) = 1;
13045   REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
13046                                         real,
13047                                         REG_NOTES (insn));
13048 }
13049
13050 /* Given an SPE frame note, return a PARALLEL of SETs with the
13051    original note, plus a synthetic register save.  */
13052
13053 static rtx
13054 spe_synthesize_frame_save (rtx real)
13055 {
13056   rtx synth, offset, reg, real2;
13057
13058   if (GET_CODE (real) != SET
13059       || GET_MODE (SET_SRC (real)) != V2SImode)
13060     return real;
13061
13062   /* For the SPE, registers saved in 64-bits, get a PARALLEL for their
13063      frame related note.  The parallel contains a set of the register
13064      being saved, and another set to a synthetic register (n+1200).
13065      This is so we can differentiate between 64-bit and 32-bit saves.
13066      Words cannot describe this nastiness.  */
13067
13068   gcc_assert (GET_CODE (SET_DEST (real)) == MEM
13069               && GET_CODE (XEXP (SET_DEST (real), 0)) == PLUS
13070               && GET_CODE (SET_SRC (real)) == REG);
13071
13072   /* Transform:
13073        (set (mem (plus (reg x) (const y)))
13074             (reg z))
13075      into:
13076        (set (mem (plus (reg x) (const y+4)))
13077             (reg z+1200))
13078   */
13079
13080   real2 = copy_rtx (real);
13081   PUT_MODE (SET_DEST (real2), SImode);
13082   reg = SET_SRC (real2);
13083   real2 = replace_rtx (real2, reg, gen_rtx_REG (SImode, REGNO (reg)));
13084   synth = copy_rtx (real2);
13085
13086   if (BYTES_BIG_ENDIAN)
13087     {
13088       offset = XEXP (XEXP (SET_DEST (real2), 0), 1);
13089       real2 = replace_rtx (real2, offset, GEN_INT (INTVAL (offset) + 4));
13090     }
13091
13092   reg = SET_SRC (synth);
13093
13094   synth = replace_rtx (synth, reg,
13095                        gen_rtx_REG (SImode, REGNO (reg) + 1200));
13096
13097   offset = XEXP (XEXP (SET_DEST (synth), 0), 1);
13098   synth = replace_rtx (synth, offset,
13099                        GEN_INT (INTVAL (offset)
13100                                 + (BYTES_BIG_ENDIAN ? 0 : 4)));
13101
13102   RTX_FRAME_RELATED_P (synth) = 1;
13103   RTX_FRAME_RELATED_P (real2) = 1;
13104   if (BYTES_BIG_ENDIAN)
13105     real = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, synth, real2));
13106   else
13107     real = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, real2, synth));
13108
13109   return real;
13110 }
13111
13112 /* Returns an insn that has a vrsave set operation with the
13113    appropriate CLOBBERs.  */
13114
13115 static rtx
13116 generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
13117 {
13118   int nclobs, i;
13119   rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
13120   rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
13121
13122   clobs[0]
13123     = gen_rtx_SET (VOIDmode,
13124                    vrsave,
13125                    gen_rtx_UNSPEC_VOLATILE (SImode,
13126                                             gen_rtvec (2, reg, vrsave),
13127                                             30));
13128
13129   nclobs = 1;
13130
13131   /* We need to clobber the registers in the mask so the scheduler
13132      does not move sets to VRSAVE before sets of AltiVec registers.
13133
13134      However, if the function receives nonlocal gotos, reload will set
13135      all call saved registers live.  We will end up with:
13136
13137         (set (reg 999) (mem))
13138         (parallel [ (set (reg vrsave) (unspec blah))
13139                     (clobber (reg 999))])
13140
13141      The clobber will cause the store into reg 999 to be dead, and
13142      flow will attempt to delete an epilogue insn.  In this case, we
13143      need an unspec use/set of the register.  */
13144
13145   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
13146     if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
13147       {
13148         if (!epiloguep || call_used_regs [i])
13149           clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
13150                                              gen_rtx_REG (V4SImode, i));
13151         else
13152           {
13153             rtx reg = gen_rtx_REG (V4SImode, i);
13154
13155             clobs[nclobs++]
13156               = gen_rtx_SET (VOIDmode,
13157                              reg,
13158                              gen_rtx_UNSPEC (V4SImode,
13159                                              gen_rtvec (1, reg), 27));
13160           }
13161       }
13162
13163   insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
13164
13165   for (i = 0; i < nclobs; ++i)
13166     XVECEXP (insn, 0, i) = clobs[i];
13167
13168   return insn;
13169 }
13170
13171 /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
13172    Save REGNO into [FRAME_REG + OFFSET] in mode MODE.  */
13173
13174 static void
13175 emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
13176                  unsigned int regno, int offset, HOST_WIDE_INT total_size)
13177 {
13178   rtx reg, offset_rtx, insn, mem, addr, int_rtx;
13179   rtx replacea, replaceb;
13180
13181   int_rtx = GEN_INT (offset);
13182
13183   /* Some cases that need register indexed addressing.  */
13184   if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
13185       || (TARGET_E500_DOUBLE && mode == DFmode)
13186       || (TARGET_SPE_ABI
13187           && SPE_VECTOR_MODE (mode)
13188           && !SPE_CONST_OFFSET_OK (offset)))
13189     {
13190       /* Whomever calls us must make sure r11 is available in the
13191          flow path of instructions in the prologue.  */
13192       offset_rtx = gen_rtx_REG (Pmode, 11);
13193       emit_move_insn (offset_rtx, int_rtx);
13194
13195       replacea = offset_rtx;
13196       replaceb = int_rtx;
13197     }
13198   else
13199     {
13200       offset_rtx = int_rtx;
13201       replacea = NULL_RTX;
13202       replaceb = NULL_RTX;
13203     }
13204
13205   reg = gen_rtx_REG (mode, regno);
13206   addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
13207   mem = gen_rtx_MEM (mode, addr);
13208   set_mem_alias_set (mem, rs6000_sr_alias_set);
13209
13210   insn = emit_move_insn (mem, reg);
13211
13212   rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
13213 }
13214
13215 /* Emit an offset memory reference suitable for a frame store, while
13216    converting to a valid addressing mode.  */
13217
13218 static rtx
13219 gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
13220 {
13221   rtx int_rtx, offset_rtx;
13222
13223   int_rtx = GEN_INT (offset);
13224
13225   if ((TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
13226       || (TARGET_E500_DOUBLE && mode == DFmode))
13227     {
13228       offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
13229       emit_move_insn (offset_rtx, int_rtx);
13230     }
13231   else
13232     offset_rtx = int_rtx;
13233
13234   return gen_rtx_MEM (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
13235 }
13236
13237 /* Look for user-defined global regs.  We should not save and restore these,
13238    and cannot use stmw/lmw if there are any in its range.  */
13239
13240 static bool
13241 no_global_regs_above (int first_greg)
13242 {
13243   int i;
13244   for (i = 0; i < 32 - first_greg; i++)
13245     if (global_regs[first_greg + i])
13246       return false;
13247   return true;
13248 }
13249
13250 #ifndef TARGET_FIX_AND_CONTINUE
13251 #define TARGET_FIX_AND_CONTINUE 0
13252 #endif
13253
13254 /* Emit function prologue as insns.  */
13255
13256 void
13257 rs6000_emit_prologue (void)
13258 {
13259   rs6000_stack_t *info = rs6000_stack_info ();
13260   enum machine_mode reg_mode = Pmode;
13261   int reg_size = TARGET_32BIT ? 4 : 8;
13262   rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
13263   rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
13264   rtx frame_reg_rtx = sp_reg_rtx;
13265   rtx cr_save_rtx = NULL_RTX;
13266   rtx insn;
13267   int saving_FPRs_inline;
13268   int using_store_multiple;
13269   HOST_WIDE_INT sp_offset = 0;
13270
13271   if (TARGET_FIX_AND_CONTINUE)
13272     {
13273       /* gdb on darwin arranges to forward a function from the old
13274          address by modifying the first 5 instructions of the function
13275          to branch to the overriding function.  This is necessary to
13276          permit function pointers that point to the old function to
13277          actually forward to the new function.  */
13278       emit_insn (gen_nop ());
13279       emit_insn (gen_nop ());
13280       emit_insn (gen_nop ());
13281       emit_insn (gen_nop ());
13282       emit_insn (gen_nop ());
13283     }
13284
13285   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
13286     {
13287       reg_mode = V2SImode;
13288       reg_size = 8;
13289     }
13290
13291   using_store_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
13292                           && (!TARGET_SPE_ABI
13293                               || info->spe_64bit_regs_used == 0)
13294                           && info->first_gp_reg_save < 31
13295                           && no_global_regs_above (info->first_gp_reg_save));
13296   saving_FPRs_inline = (info->first_fp_reg_save == 64
13297                         || FP_SAVE_INLINE (info->first_fp_reg_save)
13298                         || current_function_calls_eh_return
13299                         || cfun->machine->ra_need_lr);
13300
13301   /* For V.4, update stack before we do any saving and set back pointer.  */
13302   if (info->push_p
13303       && (DEFAULT_ABI == ABI_V4
13304           || current_function_calls_eh_return))
13305     {
13306       if (info->total_size < 32767)
13307         sp_offset = info->total_size;
13308       else
13309         frame_reg_rtx = frame_ptr_rtx;
13310       rs6000_emit_allocate_stack (info->total_size,
13311                                   (frame_reg_rtx != sp_reg_rtx
13312                                    && (info->cr_save_p
13313                                        || info->lr_save_p
13314                                        || info->first_fp_reg_save < 64
13315                                        || info->first_gp_reg_save < 32
13316                                        )));
13317       if (frame_reg_rtx != sp_reg_rtx)
13318         rs6000_emit_stack_tie ();
13319     }
13320
13321   /* Handle world saves specially here.  */
13322   if (WORLD_SAVE_P (info))
13323     {
13324       int i, j, sz;
13325       rtx treg;
13326       rtvec p;
13327
13328       /* save_world expects lr in r0. */
13329       if (info->lr_save_p)
13330         {
13331           insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
13332                                  gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
13333           RTX_FRAME_RELATED_P (insn) = 1;
13334         }
13335
13336       /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
13337          assumptions about the offsets of various bits of the stack
13338          frame.  */
13339       gcc_assert (info->gp_save_offset == -220
13340                   && info->fp_save_offset == -144
13341                   && info->lr_save_offset == 8
13342                   && info->cr_save_offset == 4
13343                   && info->push_p
13344                   && info->lr_save_p
13345                   && (!current_function_calls_eh_return
13346                        || info->ehrd_offset == -432)
13347                   && info->vrsave_save_offset == -224
13348                   && info->altivec_save_offset == (-224 -16 -192));
13349
13350       treg = gen_rtx_REG (SImode, 11);
13351       emit_move_insn (treg, GEN_INT (-info->total_size));
13352
13353       /* SAVE_WORLD takes the caller's LR in R0 and the frame size
13354          in R11.  It also clobbers R12, so beware!  */
13355
13356       /* Preserve CR2 for save_world prologues */
13357       sz = 6;
13358       sz += 32 - info->first_gp_reg_save;
13359       sz += 64 - info->first_fp_reg_save;
13360       sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
13361       p = rtvec_alloc (sz);
13362       j = 0;
13363       RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode,
13364                                             gen_rtx_REG (Pmode,
13365                                                          LINK_REGISTER_REGNUM));
13366       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
13367                                         gen_rtx_SYMBOL_REF (Pmode,
13368                                                             "*save_world"));
13369       /* We do floats first so that the instruction pattern matches
13370          properly.  */
13371       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
13372         {
13373           rtx reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
13374           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13375                                    GEN_INT (info->fp_save_offset
13376                                             + sp_offset + 8 * i));
13377           rtx mem = gen_rtx_MEM (DFmode, addr);
13378           set_mem_alias_set (mem, rs6000_sr_alias_set);
13379
13380           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
13381         }
13382       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
13383         {
13384           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
13385           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13386                                    GEN_INT (info->altivec_save_offset
13387                                             + sp_offset + 16 * i));
13388           rtx mem = gen_rtx_MEM (V4SImode, addr);
13389           set_mem_alias_set (mem, rs6000_sr_alias_set);
13390
13391           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
13392         }
13393       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
13394         {
13395           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
13396           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13397                                    GEN_INT (info->gp_save_offset
13398                                             + sp_offset + reg_size * i));
13399           rtx mem = gen_rtx_MEM (reg_mode, addr);
13400           set_mem_alias_set (mem, rs6000_sr_alias_set);
13401
13402           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
13403         }
13404
13405       {
13406         /* CR register traditionally saved as CR2.  */
13407         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
13408         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13409                                  GEN_INT (info->cr_save_offset
13410                                           + sp_offset));
13411         rtx mem = gen_rtx_MEM (reg_mode, addr);
13412         set_mem_alias_set (mem, rs6000_sr_alias_set);
13413
13414         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
13415       }
13416       /* Prevent any attempt to delete the setting of r0 and treg!  */
13417       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 0));
13418       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode, treg);
13419       RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode, sp_reg_rtx);
13420
13421       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
13422       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13423                             NULL_RTX, NULL_RTX);
13424
13425       if (current_function_calls_eh_return)
13426         {
13427           unsigned int i;
13428           for (i = 0; ; ++i)
13429             {
13430               unsigned int regno = EH_RETURN_DATA_REGNO (i);
13431               if (regno == INVALID_REGNUM)
13432                 break;
13433               emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
13434                                info->ehrd_offset + sp_offset
13435                                + reg_size * (int) i,
13436                                info->total_size);
13437             }
13438         }
13439     }
13440
13441   /* Save AltiVec registers if needed.  */
13442   if (!WORLD_SAVE_P (info) && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
13443     {
13444       int i;
13445
13446       /* There should be a non inline version of this, for when we
13447          are saving lots of vector registers.  */
13448       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
13449         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
13450           {
13451             rtx areg, savereg, mem;
13452             int offset;
13453
13454             offset = info->altivec_save_offset + sp_offset
13455               + 16 * (i - info->first_altivec_reg_save);
13456
13457             savereg = gen_rtx_REG (V4SImode, i);
13458
13459             areg = gen_rtx_REG (Pmode, 0);
13460             emit_move_insn (areg, GEN_INT (offset));
13461
13462             /* AltiVec addressing mode is [reg+reg].  */
13463             mem = gen_rtx_MEM (V4SImode,
13464                                gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
13465
13466             set_mem_alias_set (mem, rs6000_sr_alias_set);
13467
13468             insn = emit_move_insn (mem, savereg);
13469
13470             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13471                                   areg, GEN_INT (offset));
13472           }
13473     }
13474
13475   /* VRSAVE is a bit vector representing which AltiVec registers
13476      are used.  The OS uses this to determine which vector
13477      registers to save on a context switch.  We need to save
13478      VRSAVE on the stack frame, add whatever AltiVec registers we
13479      used in this function, and do the corresponding magic in the
13480      epilogue.  */
13481
13482   if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
13483       && info->vrsave_mask != 0)
13484     {
13485       rtx reg, mem, vrsave;
13486       int offset;
13487
13488       /* Get VRSAVE onto a GPR.  Note that ABI_V4 might be using r12
13489          as frame_reg_rtx and r11 as the static chain pointer for
13490          nested functions.  */
13491       reg = gen_rtx_REG (SImode, 0);
13492       vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
13493       if (TARGET_MACHO)
13494         emit_insn (gen_get_vrsave_internal (reg));
13495       else
13496         emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
13497
13498       if (!WORLD_SAVE_P (info))
13499         {
13500           /* Save VRSAVE.  */
13501           offset = info->vrsave_save_offset + sp_offset;
13502           mem
13503             = gen_rtx_MEM (SImode,
13504                            gen_rtx_PLUS (Pmode, frame_reg_rtx, GEN_INT (offset)));
13505           set_mem_alias_set (mem, rs6000_sr_alias_set);
13506           insn = emit_move_insn (mem, reg);
13507         }
13508
13509       /* Include the registers in the mask.  */
13510       emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
13511
13512       insn = emit_insn (generate_set_vrsave (reg, info, 0));
13513     }
13514
13515   /* If we use the link register, get it into r0.  */
13516   if (!WORLD_SAVE_P (info) && info->lr_save_p)
13517     {
13518       insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
13519                              gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
13520       RTX_FRAME_RELATED_P (insn) = 1;
13521     }
13522
13523   /* If we need to save CR, put it into r12.  */
13524   if (!WORLD_SAVE_P (info) && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
13525     {
13526       rtx set;
13527
13528       cr_save_rtx = gen_rtx_REG (SImode, 12);
13529       insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
13530       RTX_FRAME_RELATED_P (insn) = 1;
13531       /* Now, there's no way that dwarf2out_frame_debug_expr is going
13532          to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
13533          But that's OK.  All we have to do is specify that _one_ condition
13534          code register is saved in this stack slot.  The thrower's epilogue
13535          will then restore all the call-saved registers.
13536          We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux.  */
13537       set = gen_rtx_SET (VOIDmode, cr_save_rtx,
13538                          gen_rtx_REG (SImode, CR2_REGNO));
13539       REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
13540                                             set,
13541                                             REG_NOTES (insn));
13542     }
13543
13544   /* Do any required saving of fpr's.  If only one or two to save, do
13545      it ourselves.  Otherwise, call function.  */
13546   if (!WORLD_SAVE_P (info) && saving_FPRs_inline)
13547     {
13548       int i;
13549       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
13550         if ((regs_ever_live[info->first_fp_reg_save+i]
13551              && ! call_used_regs[info->first_fp_reg_save+i]))
13552           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, DFmode,
13553                            info->first_fp_reg_save + i,
13554                            info->fp_save_offset + sp_offset + 8 * i,
13555                            info->total_size);
13556     }
13557   else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
13558     {
13559       int i;
13560       char rname[30];
13561       const char *alloc_rname;
13562       rtvec p;
13563       p = rtvec_alloc (2 + 64 - info->first_fp_reg_save);
13564
13565       RTVEC_ELT (p, 0) = gen_rtx_CLOBBER (VOIDmode,
13566                                           gen_rtx_REG (Pmode,
13567                                                        LINK_REGISTER_REGNUM));
13568       sprintf (rname, "%s%d%s", SAVE_FP_PREFIX,
13569                info->first_fp_reg_save - 32, SAVE_FP_SUFFIX);
13570       alloc_rname = ggc_strdup (rname);
13571       RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
13572                                       gen_rtx_SYMBOL_REF (Pmode,
13573                                                           alloc_rname));
13574       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
13575         {
13576           rtx addr, reg, mem;
13577           reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
13578           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13579                                GEN_INT (info->fp_save_offset
13580                                         + sp_offset + 8*i));
13581           mem = gen_rtx_MEM (DFmode, addr);
13582           set_mem_alias_set (mem, rs6000_sr_alias_set);
13583
13584           RTVEC_ELT (p, i + 2) = gen_rtx_SET (VOIDmode, mem, reg);
13585         }
13586       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
13587       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13588                             NULL_RTX, NULL_RTX);
13589     }
13590
13591   /* Save GPRs.  This is done as a PARALLEL if we are using
13592      the store-multiple instructions.  */
13593   if (!WORLD_SAVE_P (info) && using_store_multiple)
13594     {
13595       rtvec p;
13596       int i;
13597       p = rtvec_alloc (32 - info->first_gp_reg_save);
13598       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
13599         {
13600           rtx addr, reg, mem;
13601           reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
13602           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13603                                GEN_INT (info->gp_save_offset
13604                                         + sp_offset
13605                                         + reg_size * i));
13606           mem = gen_rtx_MEM (reg_mode, addr);
13607           set_mem_alias_set (mem, rs6000_sr_alias_set);
13608
13609           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
13610         }
13611       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
13612       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13613                             NULL_RTX, NULL_RTX);
13614     }
13615   else if (!WORLD_SAVE_P (info))
13616     {
13617       int i;
13618       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
13619         if ((regs_ever_live[info->first_gp_reg_save + i]
13620              && (!call_used_regs[info->first_gp_reg_save + i]
13621                  || (i + info->first_gp_reg_save
13622                      == RS6000_PIC_OFFSET_TABLE_REGNUM
13623                      && TARGET_TOC && TARGET_MINIMAL_TOC)))
13624             || (i + info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
13625                 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
13626                     || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
13627           {
13628             rtx addr, reg, mem;
13629             reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
13630
13631             if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
13632               {
13633                 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
13634                 rtx b;
13635
13636                 if (!SPE_CONST_OFFSET_OK (offset))
13637                   {
13638                     b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
13639                     emit_move_insn (b, GEN_INT (offset));
13640                   }
13641                 else
13642                   b = GEN_INT (offset);
13643
13644                 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
13645                 mem = gen_rtx_MEM (V2SImode, addr);
13646                 set_mem_alias_set (mem, rs6000_sr_alias_set);
13647                 insn = emit_move_insn (mem, reg);
13648
13649                 if (GET_CODE (b) == CONST_INT)
13650                   rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13651                                         NULL_RTX, NULL_RTX);
13652                 else
13653                   rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13654                                         b, GEN_INT (offset));
13655               }
13656             else
13657               {
13658                 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13659                                      GEN_INT (info->gp_save_offset
13660                                               + sp_offset
13661                                               + reg_size * i));
13662                 mem = gen_rtx_MEM (reg_mode, addr);
13663                 set_mem_alias_set (mem, rs6000_sr_alias_set);
13664
13665                 insn = emit_move_insn (mem, reg);
13666                 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13667                                       NULL_RTX, NULL_RTX);
13668               }
13669           }
13670     }
13671
13672   /* ??? There's no need to emit actual instructions here, but it's the
13673      easiest way to get the frame unwind information emitted.  */
13674   if (!WORLD_SAVE_P (info) && current_function_calls_eh_return)
13675     {
13676       unsigned int i, regno;
13677
13678       /* In AIX ABI we need to pretend we save r2 here.  */
13679       if (TARGET_AIX)
13680         {
13681           rtx addr, reg, mem;
13682
13683           reg = gen_rtx_REG (reg_mode, 2);
13684           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13685                                GEN_INT (sp_offset + 5 * reg_size));
13686           mem = gen_rtx_MEM (reg_mode, addr);
13687           set_mem_alias_set (mem, rs6000_sr_alias_set);
13688
13689           insn = emit_move_insn (mem, reg);
13690           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13691                                 NULL_RTX, NULL_RTX);
13692           PATTERN (insn) = gen_blockage ();
13693         }
13694
13695       for (i = 0; ; ++i)
13696         {
13697           regno = EH_RETURN_DATA_REGNO (i);
13698           if (regno == INVALID_REGNUM)
13699             break;
13700
13701           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
13702                            info->ehrd_offset + sp_offset
13703                            + reg_size * (int) i,
13704                            info->total_size);
13705         }
13706     }
13707
13708   /* Save lr if we used it.  */
13709   if (!WORLD_SAVE_P (info) && info->lr_save_p)
13710     {
13711       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13712                                GEN_INT (info->lr_save_offset + sp_offset));
13713       rtx reg = gen_rtx_REG (Pmode, 0);
13714       rtx mem = gen_rtx_MEM (Pmode, addr);
13715       /* This should not be of rs6000_sr_alias_set, because of
13716          __builtin_return_address.  */
13717
13718       insn = emit_move_insn (mem, reg);
13719       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13720                             NULL_RTX, NULL_RTX);
13721     }
13722
13723   /* Save CR if we use any that must be preserved.  */
13724   if (!WORLD_SAVE_P (info) && info->cr_save_p)
13725     {
13726       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13727                                GEN_INT (info->cr_save_offset + sp_offset));
13728       rtx mem = gen_rtx_MEM (SImode, addr);
13729       /* See the large comment above about why CR2_REGNO is used.  */
13730       rtx magic_eh_cr_reg = gen_rtx_REG (SImode, CR2_REGNO);
13731
13732       set_mem_alias_set (mem, rs6000_sr_alias_set);
13733
13734       /* If r12 was used to hold the original sp, copy cr into r0 now
13735          that it's free.  */
13736       if (REGNO (frame_reg_rtx) == 12)
13737         {
13738           rtx set;
13739
13740           cr_save_rtx = gen_rtx_REG (SImode, 0);
13741           insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
13742           RTX_FRAME_RELATED_P (insn) = 1;
13743           set = gen_rtx_SET (VOIDmode, cr_save_rtx, magic_eh_cr_reg);
13744           REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
13745                                                 set,
13746                                                 REG_NOTES (insn));
13747
13748         }
13749       insn = emit_move_insn (mem, cr_save_rtx);
13750
13751       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13752                             NULL_RTX, NULL_RTX);
13753     }
13754
13755   /* Update stack and set back pointer unless this is V.4,
13756      for which it was done previously.  */
13757   if (!WORLD_SAVE_P (info) && info->push_p
13758       && !(DEFAULT_ABI == ABI_V4 || current_function_calls_eh_return))
13759     rs6000_emit_allocate_stack (info->total_size, FALSE);
13760
13761   /* Set frame pointer, if needed.  */
13762   if (frame_pointer_needed)
13763     {
13764       insn = emit_move_insn (gen_rtx_REG (Pmode, FRAME_POINTER_REGNUM),
13765                              sp_reg_rtx);
13766       RTX_FRAME_RELATED_P (insn) = 1;
13767     }
13768
13769   /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up.  */
13770   if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
13771       || (DEFAULT_ABI == ABI_V4
13772           && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
13773           && regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM]))
13774     {
13775       /* If emit_load_toc_table will use the link register, we need to save
13776          it.  We use R12 for this purpose because emit_load_toc_table
13777          can use register 0.  This allows us to use a plain 'blr' to return
13778          from the procedure more often.  */
13779       int save_LR_around_toc_setup = (TARGET_ELF
13780                                       && DEFAULT_ABI != ABI_AIX
13781                                       && flag_pic
13782                                       && ! info->lr_save_p
13783                                       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0);
13784       if (save_LR_around_toc_setup)
13785         {
13786           rtx lr = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
13787
13788           insn = emit_move_insn (frame_ptr_rtx, lr);
13789           rs6000_maybe_dead (insn);
13790           RTX_FRAME_RELATED_P (insn) = 1;
13791
13792           rs6000_emit_load_toc_table (TRUE);
13793
13794           insn = emit_move_insn (lr, frame_ptr_rtx);
13795           rs6000_maybe_dead (insn);
13796           RTX_FRAME_RELATED_P (insn) = 1;
13797         }
13798       else
13799         rs6000_emit_load_toc_table (TRUE);
13800     }
13801
13802 #if TARGET_MACHO
13803   if (DEFAULT_ABI == ABI_DARWIN
13804       && flag_pic && current_function_uses_pic_offset_table)
13805     {
13806       rtx lr = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
13807       rtx src = machopic_function_base_sym ();
13808
13809       /* Save and restore LR locally around this call (in R0).  */
13810       if (!info->lr_save_p)
13811         rs6000_maybe_dead (emit_move_insn (gen_rtx_REG (Pmode, 0), lr));
13812
13813       rs6000_maybe_dead (emit_insn (gen_load_macho_picbase (lr, src)));
13814
13815       insn = emit_move_insn (gen_rtx_REG (Pmode,
13816                                           RS6000_PIC_OFFSET_TABLE_REGNUM),
13817                              lr);
13818       rs6000_maybe_dead (insn);
13819
13820       if (!info->lr_save_p)
13821         rs6000_maybe_dead (emit_move_insn (lr, gen_rtx_REG (Pmode, 0)));
13822     }
13823 #endif
13824 }
13825
13826 /* Write function prologue.  */
13827
13828 static void
13829 rs6000_output_function_prologue (FILE *file,
13830                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
13831 {
13832   rs6000_stack_t *info = rs6000_stack_info ();
13833
13834   if (TARGET_DEBUG_STACK)
13835     debug_stack_info (info);
13836
13837   /* Write .extern for any function we will call to save and restore
13838      fp values.  */
13839   if (info->first_fp_reg_save < 64
13840       && !FP_SAVE_INLINE (info->first_fp_reg_save))
13841     fprintf (file, "\t.extern %s%d%s\n\t.extern %s%d%s\n",
13842              SAVE_FP_PREFIX, info->first_fp_reg_save - 32, SAVE_FP_SUFFIX,
13843              RESTORE_FP_PREFIX, info->first_fp_reg_save - 32,
13844              RESTORE_FP_SUFFIX);
13845
13846   /* Write .extern for AIX common mode routines, if needed.  */
13847   if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
13848     {
13849       fputs ("\t.extern __mulh\n", file);
13850       fputs ("\t.extern __mull\n", file);
13851       fputs ("\t.extern __divss\n", file);
13852       fputs ("\t.extern __divus\n", file);
13853       fputs ("\t.extern __quoss\n", file);
13854       fputs ("\t.extern __quous\n", file);
13855       common_mode_defined = 1;
13856     }
13857
13858   if (! HAVE_prologue)
13859     {
13860       start_sequence ();
13861
13862       /* A NOTE_INSN_DELETED is supposed to be at the start and end of
13863          the "toplevel" insn chain.  */
13864       emit_note (NOTE_INSN_DELETED);
13865       rs6000_emit_prologue ();
13866       emit_note (NOTE_INSN_DELETED);
13867
13868       /* Expand INSN_ADDRESSES so final() doesn't crash.  */
13869       {
13870         rtx insn;
13871         unsigned addr = 0;
13872         for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
13873           {
13874             INSN_ADDRESSES_NEW (insn, addr);
13875             addr += 4;
13876           }
13877       }
13878
13879       if (TARGET_DEBUG_STACK)
13880         debug_rtx_list (get_insns (), 100);
13881       final (get_insns (), file, FALSE);
13882       end_sequence ();
13883     }
13884
13885   rs6000_pic_labelno++;
13886 }
13887
13888 /* Emit function epilogue as insns.
13889
13890    At present, dwarf2out_frame_debug_expr doesn't understand
13891    register restores, so we don't bother setting RTX_FRAME_RELATED_P
13892    anywhere in the epilogue.  Most of the insns below would in any case
13893    need special notes to explain where r11 is in relation to the stack.  */
13894
13895 void
13896 rs6000_emit_epilogue (int sibcall)
13897 {
13898   rs6000_stack_t *info;
13899   int restoring_FPRs_inline;
13900   int using_load_multiple;
13901   int using_mfcr_multiple;
13902   int use_backchain_to_restore_sp;
13903   int sp_offset = 0;
13904   rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
13905   rtx frame_reg_rtx = sp_reg_rtx;
13906   enum machine_mode reg_mode = Pmode;
13907   int reg_size = TARGET_32BIT ? 4 : 8;
13908   int i;
13909
13910   info = rs6000_stack_info ();
13911
13912   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
13913     {
13914       reg_mode = V2SImode;
13915       reg_size = 8;
13916     }
13917
13918   using_load_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
13919                          && (!TARGET_SPE_ABI
13920                              || info->spe_64bit_regs_used == 0)
13921                          && info->first_gp_reg_save < 31
13922                          && no_global_regs_above (info->first_gp_reg_save));
13923   restoring_FPRs_inline = (sibcall
13924                            || current_function_calls_eh_return
13925                            || info->first_fp_reg_save == 64
13926                            || FP_SAVE_INLINE (info->first_fp_reg_save));
13927   use_backchain_to_restore_sp = (frame_pointer_needed
13928                                  || current_function_calls_alloca
13929                                  || info->total_size > 32767);
13930   using_mfcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
13931                          || rs6000_cpu == PROCESSOR_PPC603
13932                          || rs6000_cpu == PROCESSOR_PPC750
13933                          || optimize_size);
13934
13935   if (WORLD_SAVE_P (info))
13936     {
13937       int i, j;
13938       char rname[30];
13939       const char *alloc_rname;
13940       rtvec p;
13941
13942       /* eh_rest_world_r10 will return to the location saved in the LR
13943          stack slot (which is not likely to be our caller.)
13944          Input: R10 -- stack adjustment.  Clobbers R0, R11, R12, R7, R8.
13945          rest_world is similar, except any R10 parameter is ignored.
13946          The exception-handling stuff that was here in 2.95 is no
13947          longer necessary.  */
13948
13949       p = rtvec_alloc (9
13950                        + 1
13951                        + 32 - info->first_gp_reg_save
13952                        + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
13953                        + 63 + 1 - info->first_fp_reg_save);
13954
13955       strcpy (rname, ((current_function_calls_eh_return) ?
13956                       "*eh_rest_world_r10" : "*rest_world"));
13957       alloc_rname = ggc_strdup (rname);
13958
13959       j = 0;
13960       RTVEC_ELT (p, j++) = gen_rtx_RETURN (VOIDmode);
13961       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
13962                                         gen_rtx_REG (Pmode,
13963                                                      LINK_REGISTER_REGNUM));
13964       RTVEC_ELT (p, j++)
13965         = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, alloc_rname));
13966       /* The instruction pattern requires a clobber here;
13967          it is shared with the restVEC helper. */
13968       RTVEC_ELT (p, j++)
13969         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
13970
13971       {
13972         /* CR register traditionally saved as CR2.  */
13973         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
13974         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13975                                  GEN_INT (info->cr_save_offset));
13976         rtx mem = gen_rtx_MEM (reg_mode, addr);
13977         set_mem_alias_set (mem, rs6000_sr_alias_set);
13978
13979         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
13980       }
13981
13982       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
13983         {
13984           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
13985           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13986                                    GEN_INT (info->gp_save_offset
13987                                             + reg_size * i));
13988           rtx mem = gen_rtx_MEM (reg_mode, addr);
13989           set_mem_alias_set (mem, rs6000_sr_alias_set);
13990
13991           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
13992         }
13993       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
13994         {
13995           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
13996           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13997                                    GEN_INT (info->altivec_save_offset
13998                                             + 16 * i));
13999           rtx mem = gen_rtx_MEM (V4SImode, addr);
14000           set_mem_alias_set (mem, rs6000_sr_alias_set);
14001
14002           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
14003         }
14004       for (i = 0; info->first_fp_reg_save + i <= 63; i++)
14005         {
14006           rtx reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
14007           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14008                                    GEN_INT (info->fp_save_offset
14009                                             + 8 * i));
14010           rtx mem = gen_rtx_MEM (DFmode, addr);
14011           set_mem_alias_set (mem, rs6000_sr_alias_set);
14012
14013           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
14014         }
14015       RTVEC_ELT (p, j++)
14016         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 0));
14017       RTVEC_ELT (p, j++)
14018         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 12));
14019       RTVEC_ELT (p, j++)
14020         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 7));
14021       RTVEC_ELT (p, j++)
14022         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 8));
14023       RTVEC_ELT (p, j++)
14024         = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
14025       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
14026
14027       return;
14028     }
14029
14030   /* If we have a frame pointer, a call to alloca,  or a large stack
14031      frame, restore the old stack pointer using the backchain.  Otherwise,
14032      we know what size to update it with.  */
14033   if (use_backchain_to_restore_sp)
14034     {
14035       /* Under V.4, don't reset the stack pointer until after we're done
14036          loading the saved registers.  */
14037       if (DEFAULT_ABI == ABI_V4)
14038         frame_reg_rtx = gen_rtx_REG (Pmode, 11);
14039
14040       emit_move_insn (frame_reg_rtx,
14041                       gen_rtx_MEM (Pmode, sp_reg_rtx));
14042
14043     }
14044   else if (info->push_p)
14045     {
14046       if (DEFAULT_ABI == ABI_V4
14047           || current_function_calls_eh_return)
14048         sp_offset = info->total_size;
14049       else
14050         {
14051           emit_insn (TARGET_32BIT
14052                      ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
14053                                    GEN_INT (info->total_size))
14054                      : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
14055                                    GEN_INT (info->total_size)));
14056         }
14057     }
14058
14059   /* Restore AltiVec registers if needed.  */
14060   if (TARGET_ALTIVEC_ABI && info->altivec_size != 0)
14061     {
14062       int i;
14063
14064       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
14065         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
14066           {
14067             rtx addr, areg, mem;
14068
14069             areg = gen_rtx_REG (Pmode, 0);
14070             emit_move_insn
14071               (areg, GEN_INT (info->altivec_save_offset
14072                               + sp_offset
14073                               + 16 * (i - info->first_altivec_reg_save)));
14074
14075             /* AltiVec addressing mode is [reg+reg].  */
14076             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
14077             mem = gen_rtx_MEM (V4SImode, addr);
14078             set_mem_alias_set (mem, rs6000_sr_alias_set);
14079
14080             emit_move_insn (gen_rtx_REG (V4SImode, i), mem);
14081           }
14082     }
14083
14084   /* Restore VRSAVE if needed.  */
14085   if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
14086       && info->vrsave_mask != 0)
14087     {
14088       rtx addr, mem, reg;
14089
14090       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14091                            GEN_INT (info->vrsave_save_offset + sp_offset));
14092       mem = gen_rtx_MEM (SImode, addr);
14093       set_mem_alias_set (mem, rs6000_sr_alias_set);
14094       reg = gen_rtx_REG (SImode, 12);
14095       emit_move_insn (reg, mem);
14096
14097       emit_insn (generate_set_vrsave (reg, info, 1));
14098     }
14099
14100   /* Get the old lr if we saved it.  */
14101   if (info->lr_save_p)
14102     {
14103       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
14104                                       info->lr_save_offset + sp_offset);
14105
14106       set_mem_alias_set (mem, rs6000_sr_alias_set);
14107
14108       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
14109     }
14110
14111   /* Get the old cr if we saved it.  */
14112   if (info->cr_save_p)
14113     {
14114       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14115                                GEN_INT (info->cr_save_offset + sp_offset));
14116       rtx mem = gen_rtx_MEM (SImode, addr);
14117
14118       set_mem_alias_set (mem, rs6000_sr_alias_set);
14119
14120       emit_move_insn (gen_rtx_REG (SImode, 12), mem);
14121     }
14122
14123   /* Set LR here to try to overlap restores below.  */
14124   if (info->lr_save_p)
14125     emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM),
14126                     gen_rtx_REG (Pmode, 0));
14127
14128   /* Load exception handler data registers, if needed.  */
14129   if (current_function_calls_eh_return)
14130     {
14131       unsigned int i, regno;
14132
14133       if (TARGET_AIX)
14134         {
14135           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14136                                    GEN_INT (sp_offset + 5 * reg_size));
14137           rtx mem = gen_rtx_MEM (reg_mode, addr);
14138
14139           set_mem_alias_set (mem, rs6000_sr_alias_set);
14140
14141           emit_move_insn (gen_rtx_REG (reg_mode, 2), mem);
14142         }
14143
14144       for (i = 0; ; ++i)
14145         {
14146           rtx mem;
14147
14148           regno = EH_RETURN_DATA_REGNO (i);
14149           if (regno == INVALID_REGNUM)
14150             break;
14151
14152           mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
14153                                       info->ehrd_offset + sp_offset
14154                                       + reg_size * (int) i);
14155           set_mem_alias_set (mem, rs6000_sr_alias_set);
14156
14157           emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
14158         }
14159     }
14160
14161   /* Restore GPRs.  This is done as a PARALLEL if we are using
14162      the load-multiple instructions.  */
14163   if (using_load_multiple)
14164     {
14165       rtvec p;
14166       p = rtvec_alloc (32 - info->first_gp_reg_save);
14167       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
14168         {
14169           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14170                                    GEN_INT (info->gp_save_offset
14171                                             + sp_offset
14172                                             + reg_size * i));
14173           rtx mem = gen_rtx_MEM (reg_mode, addr);
14174
14175           set_mem_alias_set (mem, rs6000_sr_alias_set);
14176
14177           RTVEC_ELT (p, i) =
14178             gen_rtx_SET (VOIDmode,
14179                          gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
14180                          mem);
14181         }
14182       emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
14183     }
14184   else
14185     for (i = 0; i < 32 - info->first_gp_reg_save; i++)
14186       if ((regs_ever_live[info->first_gp_reg_save + i]
14187            && (!call_used_regs[info->first_gp_reg_save + i]
14188                || (i + info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
14189                    && TARGET_TOC && TARGET_MINIMAL_TOC)))
14190           || (i + info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
14191               && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
14192                   || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
14193         {
14194           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14195                                    GEN_INT (info->gp_save_offset
14196                                             + sp_offset
14197                                             + reg_size * i));
14198           rtx mem = gen_rtx_MEM (reg_mode, addr);
14199
14200           /* Restore 64-bit quantities for SPE.  */
14201           if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
14202             {
14203               int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
14204               rtx b;
14205
14206               if (!SPE_CONST_OFFSET_OK (offset))
14207                 {
14208                   b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
14209                   emit_move_insn (b, GEN_INT (offset));
14210                 }
14211               else
14212                 b = GEN_INT (offset);
14213
14214               addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
14215               mem = gen_rtx_MEM (V2SImode, addr);
14216             }
14217
14218           set_mem_alias_set (mem, rs6000_sr_alias_set);
14219
14220           emit_move_insn (gen_rtx_REG (reg_mode,
14221                                        info->first_gp_reg_save + i), mem);
14222         }
14223
14224   /* Restore fpr's if we need to do it without calling a function.  */
14225   if (restoring_FPRs_inline)
14226     for (i = 0; i < 64 - info->first_fp_reg_save; i++)
14227       if ((regs_ever_live[info->first_fp_reg_save+i]
14228            && ! call_used_regs[info->first_fp_reg_save+i]))
14229         {
14230           rtx addr, mem;
14231           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14232                                GEN_INT (info->fp_save_offset
14233                                         + sp_offset
14234                                         + 8 * i));
14235           mem = gen_rtx_MEM (DFmode, addr);
14236           set_mem_alias_set (mem, rs6000_sr_alias_set);
14237
14238           emit_move_insn (gen_rtx_REG (DFmode,
14239                                        info->first_fp_reg_save + i),
14240                           mem);
14241         }
14242
14243   /* If we saved cr, restore it here.  Just those that were used.  */
14244   if (info->cr_save_p)
14245     {
14246       rtx r12_rtx = gen_rtx_REG (SImode, 12);
14247       int count = 0;
14248
14249       if (using_mfcr_multiple)
14250         {
14251           for (i = 0; i < 8; i++)
14252             if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
14253               count++;
14254           gcc_assert (count);
14255         }
14256
14257       if (using_mfcr_multiple && count > 1)
14258         {
14259           rtvec p;
14260           int ndx;
14261
14262           p = rtvec_alloc (count);
14263
14264           ndx = 0;
14265           for (i = 0; i < 8; i++)
14266             if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
14267               {
14268                 rtvec r = rtvec_alloc (2);
14269                 RTVEC_ELT (r, 0) = r12_rtx;
14270                 RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
14271                 RTVEC_ELT (p, ndx) =
14272                   gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
14273                                gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
14274                 ndx++;
14275               }
14276           emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
14277           gcc_assert (ndx == count);
14278         }
14279       else
14280         for (i = 0; i < 8; i++)
14281           if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
14282             {
14283               emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
14284                                                            CR0_REGNO+i),
14285                                               r12_rtx));
14286             }
14287     }
14288
14289   /* If this is V.4, unwind the stack pointer after all of the loads
14290      have been done.  We need to emit a block here so that sched
14291      doesn't decide to move the sp change before the register restores
14292      (which may not have any obvious dependency on the stack).  This
14293      doesn't hurt performance, because there is no scheduling that can
14294      be done after this point.  */
14295   if (DEFAULT_ABI == ABI_V4
14296       || current_function_calls_eh_return)
14297     {
14298       if (frame_reg_rtx != sp_reg_rtx)
14299         rs6000_emit_stack_tie ();
14300
14301       if (use_backchain_to_restore_sp)
14302         {
14303           emit_move_insn (sp_reg_rtx, frame_reg_rtx);
14304         }
14305       else if (sp_offset != 0)
14306         {
14307           emit_insn (TARGET_32BIT
14308                      ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
14309                                    GEN_INT (sp_offset))
14310                      : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
14311                                    GEN_INT (sp_offset)));
14312         }
14313     }
14314
14315   if (current_function_calls_eh_return)
14316     {
14317       rtx sa = EH_RETURN_STACKADJ_RTX;
14318       emit_insn (TARGET_32BIT
14319                  ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx, sa)
14320                  : gen_adddi3 (sp_reg_rtx, sp_reg_rtx, sa));
14321     }
14322
14323   if (!sibcall)
14324     {
14325       rtvec p;
14326       if (! restoring_FPRs_inline)
14327         p = rtvec_alloc (3 + 64 - info->first_fp_reg_save);
14328       else
14329         p = rtvec_alloc (2);
14330
14331       RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
14332       RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
14333                                       gen_rtx_REG (Pmode,
14334                                                    LINK_REGISTER_REGNUM));
14335
14336       /* If we have to restore more than two FP registers, branch to the
14337          restore function.  It will return to our caller.  */
14338       if (! restoring_FPRs_inline)
14339         {
14340           int i;
14341           char rname[30];
14342           const char *alloc_rname;
14343
14344           sprintf (rname, "%s%d%s", RESTORE_FP_PREFIX,
14345                    info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX);
14346           alloc_rname = ggc_strdup (rname);
14347           RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode,
14348                                           gen_rtx_SYMBOL_REF (Pmode,
14349                                                               alloc_rname));
14350
14351           for (i = 0; i < 64 - info->first_fp_reg_save; i++)
14352             {
14353               rtx addr, mem;
14354               addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
14355                                    GEN_INT (info->fp_save_offset + 8*i));
14356               mem = gen_rtx_MEM (DFmode, addr);
14357               set_mem_alias_set (mem, rs6000_sr_alias_set);
14358
14359               RTVEC_ELT (p, i+3) =
14360                 gen_rtx_SET (VOIDmode,
14361                              gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
14362                              mem);
14363             }
14364         }
14365
14366       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
14367     }
14368 }
14369
14370 /* Write function epilogue.  */
14371
14372 static void
14373 rs6000_output_function_epilogue (FILE *file,
14374                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
14375 {
14376   rs6000_stack_t *info = rs6000_stack_info ();
14377
14378   if (! HAVE_epilogue)
14379     {
14380       rtx insn = get_last_insn ();
14381       /* If the last insn was a BARRIER, we don't have to write anything except
14382          the trace table.  */
14383       if (GET_CODE (insn) == NOTE)
14384         insn = prev_nonnote_insn (insn);
14385       if (insn == 0 ||  GET_CODE (insn) != BARRIER)
14386         {
14387           /* This is slightly ugly, but at least we don't have two
14388              copies of the epilogue-emitting code.  */
14389           start_sequence ();
14390
14391           /* A NOTE_INSN_DELETED is supposed to be at the start
14392              and end of the "toplevel" insn chain.  */
14393           emit_note (NOTE_INSN_DELETED);
14394           rs6000_emit_epilogue (FALSE);
14395           emit_note (NOTE_INSN_DELETED);
14396
14397           /* Expand INSN_ADDRESSES so final() doesn't crash.  */
14398           {
14399             rtx insn;
14400             unsigned addr = 0;
14401             for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
14402               {
14403                 INSN_ADDRESSES_NEW (insn, addr);
14404                 addr += 4;
14405               }
14406           }
14407
14408           if (TARGET_DEBUG_STACK)
14409             debug_rtx_list (get_insns (), 100);
14410           final (get_insns (), file, FALSE);
14411           end_sequence ();
14412         }
14413     }
14414
14415 #if TARGET_MACHO
14416   macho_branch_islands ();
14417   /* Mach-O doesn't support labels at the end of objects, so if
14418      it looks like we might want one, insert a NOP.  */
14419   {
14420     rtx insn = get_last_insn ();
14421     while (insn
14422            && NOTE_P (insn)
14423            && NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED_LABEL)
14424       insn = PREV_INSN (insn);
14425     if (insn
14426         && (LABEL_P (insn)
14427             || (NOTE_P (insn)
14428                 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL)))
14429       fputs ("\tnop\n", file);
14430   }
14431 #endif
14432
14433   /* Output a traceback table here.  See /usr/include/sys/debug.h for info
14434      on its format.
14435
14436      We don't output a traceback table if -finhibit-size-directive was
14437      used.  The documentation for -finhibit-size-directive reads
14438      ``don't output a @code{.size} assembler directive, or anything
14439      else that would cause trouble if the function is split in the
14440      middle, and the two halves are placed at locations far apart in
14441      memory.''  The traceback table has this property, since it
14442      includes the offset from the start of the function to the
14443      traceback table itself.
14444
14445      System V.4 Powerpc's (and the embedded ABI derived from it) use a
14446      different traceback table.  */
14447   if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
14448       && rs6000_traceback != traceback_none)
14449     {
14450       const char *fname = NULL;
14451       const char *language_string = lang_hooks.name;
14452       int fixed_parms = 0, float_parms = 0, parm_info = 0;
14453       int i;
14454       int optional_tbtab;
14455
14456       if (rs6000_traceback == traceback_full)
14457         optional_tbtab = 1;
14458       else if (rs6000_traceback == traceback_part)
14459         optional_tbtab = 0;
14460       else
14461         optional_tbtab = !optimize_size && !TARGET_ELF;
14462
14463       if (optional_tbtab)
14464         {
14465           fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
14466           while (*fname == '.') /* V.4 encodes . in the name */
14467             fname++;
14468
14469           /* Need label immediately before tbtab, so we can compute
14470              its offset from the function start.  */
14471           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
14472           ASM_OUTPUT_LABEL (file, fname);
14473         }
14474
14475       /* The .tbtab pseudo-op can only be used for the first eight
14476          expressions, since it can't handle the possibly variable
14477          length fields that follow.  However, if you omit the optional
14478          fields, the assembler outputs zeros for all optional fields
14479          anyways, giving each variable length field is minimum length
14480          (as defined in sys/debug.h).  Thus we can not use the .tbtab
14481          pseudo-op at all.  */
14482
14483       /* An all-zero word flags the start of the tbtab, for debuggers
14484          that have to find it by searching forward from the entry
14485          point or from the current pc.  */
14486       fputs ("\t.long 0\n", file);
14487
14488       /* Tbtab format type.  Use format type 0.  */
14489       fputs ("\t.byte 0,", file);
14490
14491       /* Language type.  Unfortunately, there does not seem to be any
14492          official way to discover the language being compiled, so we
14493          use language_string.
14494          C is 0.  Fortran is 1.  Pascal is 2.  Ada is 3.  C++ is 9.
14495          Java is 13.  Objective-C is 14.  */
14496       if (! strcmp (language_string, "GNU C"))
14497         i = 0;
14498       else if (! strcmp (language_string, "GNU F77")
14499                || ! strcmp (language_string, "GNU F95"))
14500         i = 1;
14501       else if (! strcmp (language_string, "GNU Pascal"))
14502         i = 2;
14503       else if (! strcmp (language_string, "GNU Ada"))
14504         i = 3;
14505       else if (! strcmp (language_string, "GNU C++"))
14506         i = 9;
14507       else if (! strcmp (language_string, "GNU Java"))
14508         i = 13;
14509       else if (! strcmp (language_string, "GNU Objective-C"))
14510         i = 14;
14511       else
14512         gcc_unreachable ();
14513       fprintf (file, "%d,", i);
14514
14515       /* 8 single bit fields: global linkage (not set for C extern linkage,
14516          apparently a PL/I convention?), out-of-line epilogue/prologue, offset
14517          from start of procedure stored in tbtab, internal function, function
14518          has controlled storage, function has no toc, function uses fp,
14519          function logs/aborts fp operations.  */
14520       /* Assume that fp operations are used if any fp reg must be saved.  */
14521       fprintf (file, "%d,",
14522                (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
14523
14524       /* 6 bitfields: function is interrupt handler, name present in
14525          proc table, function calls alloca, on condition directives
14526          (controls stack walks, 3 bits), saves condition reg, saves
14527          link reg.  */
14528       /* The `function calls alloca' bit seems to be set whenever reg 31 is
14529          set up as a frame pointer, even when there is no alloca call.  */
14530       fprintf (file, "%d,",
14531                ((optional_tbtab << 6)
14532                 | ((optional_tbtab & frame_pointer_needed) << 5)
14533                 | (info->cr_save_p << 1)
14534                 | (info->lr_save_p)));
14535
14536       /* 3 bitfields: saves backchain, fixup code, number of fpr saved
14537          (6 bits).  */
14538       fprintf (file, "%d,",
14539                (info->push_p << 7) | (64 - info->first_fp_reg_save));
14540
14541       /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits).  */
14542       fprintf (file, "%d,", (32 - first_reg_to_save ()));
14543
14544       if (optional_tbtab)
14545         {
14546           /* Compute the parameter info from the function decl argument
14547              list.  */
14548           tree decl;
14549           int next_parm_info_bit = 31;
14550
14551           for (decl = DECL_ARGUMENTS (current_function_decl);
14552                decl; decl = TREE_CHAIN (decl))
14553             {
14554               rtx parameter = DECL_INCOMING_RTL (decl);
14555               enum machine_mode mode = GET_MODE (parameter);
14556
14557               if (GET_CODE (parameter) == REG)
14558                 {
14559                   if (GET_MODE_CLASS (mode) == MODE_FLOAT)
14560                     {
14561                       int bits;
14562
14563                       float_parms++;
14564
14565                       switch (mode)
14566                         {
14567                         case SFmode:
14568                           bits = 0x2;
14569                           break;
14570
14571                         case DFmode:
14572                         case TFmode:
14573                           bits = 0x3;
14574                           break;
14575
14576                         default:
14577                           gcc_unreachable ();
14578                         }
14579
14580                       /* If only one bit will fit, don't or in this entry.  */
14581                       if (next_parm_info_bit > 0)
14582                         parm_info |= (bits << (next_parm_info_bit - 1));
14583                       next_parm_info_bit -= 2;
14584                     }
14585                   else
14586                     {
14587                       fixed_parms += ((GET_MODE_SIZE (mode)
14588                                        + (UNITS_PER_WORD - 1))
14589                                       / UNITS_PER_WORD);
14590                       next_parm_info_bit -= 1;
14591                     }
14592                 }
14593             }
14594         }
14595
14596       /* Number of fixed point parameters.  */
14597       /* This is actually the number of words of fixed point parameters; thus
14598          an 8 byte struct counts as 2; and thus the maximum value is 8.  */
14599       fprintf (file, "%d,", fixed_parms);
14600
14601       /* 2 bitfields: number of floating point parameters (7 bits), parameters
14602          all on stack.  */
14603       /* This is actually the number of fp registers that hold parameters;
14604          and thus the maximum value is 13.  */
14605       /* Set parameters on stack bit if parameters are not in their original
14606          registers, regardless of whether they are on the stack?  Xlc
14607          seems to set the bit when not optimizing.  */
14608       fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
14609
14610       if (! optional_tbtab)
14611         return;
14612
14613       /* Optional fields follow.  Some are variable length.  */
14614
14615       /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
14616          11 double float.  */
14617       /* There is an entry for each parameter in a register, in the order that
14618          they occur in the parameter list.  Any intervening arguments on the
14619          stack are ignored.  If the list overflows a long (max possible length
14620          34 bits) then completely leave off all elements that don't fit.  */
14621       /* Only emit this long if there was at least one parameter.  */
14622       if (fixed_parms || float_parms)
14623         fprintf (file, "\t.long %d\n", parm_info);
14624
14625       /* Offset from start of code to tb table.  */
14626       fputs ("\t.long ", file);
14627       ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
14628       if (TARGET_AIX)
14629         RS6000_OUTPUT_BASENAME (file, fname);
14630       else
14631         assemble_name (file, fname);
14632       putc ('-', file);
14633       rs6000_output_function_entry (file, fname);
14634       putc ('\n', file);
14635
14636       /* Interrupt handler mask.  */
14637       /* Omit this long, since we never set the interrupt handler bit
14638          above.  */
14639
14640       /* Number of CTL (controlled storage) anchors.  */
14641       /* Omit this long, since the has_ctl bit is never set above.  */
14642
14643       /* Displacement into stack of each CTL anchor.  */
14644       /* Omit this list of longs, because there are no CTL anchors.  */
14645
14646       /* Length of function name.  */
14647       if (*fname == '*')
14648         ++fname;
14649       fprintf (file, "\t.short %d\n", (int) strlen (fname));
14650
14651       /* Function name.  */
14652       assemble_string (fname, strlen (fname));
14653
14654       /* Register for alloca automatic storage; this is always reg 31.
14655          Only emit this if the alloca bit was set above.  */
14656       if (frame_pointer_needed)
14657         fputs ("\t.byte 31\n", file);
14658
14659       fputs ("\t.align 2\n", file);
14660     }
14661 }
14662 \f
14663 /* A C compound statement that outputs the assembler code for a thunk
14664    function, used to implement C++ virtual function calls with
14665    multiple inheritance.  The thunk acts as a wrapper around a virtual
14666    function, adjusting the implicit object parameter before handing
14667    control off to the real function.
14668
14669    First, emit code to add the integer DELTA to the location that
14670    contains the incoming first argument.  Assume that this argument
14671    contains a pointer, and is the one used to pass the `this' pointer
14672    in C++.  This is the incoming argument *before* the function
14673    prologue, e.g. `%o0' on a sparc.  The addition must preserve the
14674    values of all other incoming arguments.
14675
14676    After the addition, emit code to jump to FUNCTION, which is a
14677    `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
14678    not touch the return address.  Hence returning from FUNCTION will
14679    return to whoever called the current `thunk'.
14680
14681    The effect must be as if FUNCTION had been called directly with the
14682    adjusted first argument.  This macro is responsible for emitting
14683    all of the code for a thunk function; output_function_prologue()
14684    and output_function_epilogue() are not invoked.
14685
14686    The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
14687    been extracted from it.)  It might possibly be useful on some
14688    targets, but probably not.
14689
14690    If you do not define this macro, the target-independent code in the
14691    C++ frontend will generate a less efficient heavyweight thunk that
14692    calls FUNCTION instead of jumping to it.  The generic approach does
14693    not support varargs.  */
14694
14695 static void
14696 rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
14697                         HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
14698                         tree function)
14699 {
14700   rtx this, insn, funexp;
14701
14702   reload_completed = 1;
14703   epilogue_completed = 1;
14704   no_new_pseudos = 1;
14705   reset_block_changes ();
14706
14707   /* Mark the end of the (empty) prologue.  */
14708   emit_note (NOTE_INSN_PROLOGUE_END);
14709
14710   /* Find the "this" pointer.  If the function returns a structure,
14711      the structure return pointer is in r3.  */
14712   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
14713     this = gen_rtx_REG (Pmode, 4);
14714   else
14715     this = gen_rtx_REG (Pmode, 3);
14716
14717   /* Apply the constant offset, if required.  */
14718   if (delta)
14719     {
14720       rtx delta_rtx = GEN_INT (delta);
14721       emit_insn (TARGET_32BIT
14722                  ? gen_addsi3 (this, this, delta_rtx)
14723                  : gen_adddi3 (this, this, delta_rtx));
14724     }
14725
14726   /* Apply the offset from the vtable, if required.  */
14727   if (vcall_offset)
14728     {
14729       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
14730       rtx tmp = gen_rtx_REG (Pmode, 12);
14731
14732       emit_move_insn (tmp, gen_rtx_MEM (Pmode, this));
14733       if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
14734         {
14735           emit_insn (TARGET_32BIT
14736                      ? gen_addsi3 (tmp, tmp, vcall_offset_rtx)
14737                      : gen_adddi3 (tmp, tmp, vcall_offset_rtx));
14738           emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
14739         }
14740       else
14741         {
14742           rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
14743
14744           emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
14745         }
14746       emit_insn (TARGET_32BIT
14747                  ? gen_addsi3 (this, this, tmp)
14748                  : gen_adddi3 (this, this, tmp));
14749     }
14750
14751   /* Generate a tail call to the target function.  */
14752   if (!TREE_USED (function))
14753     {
14754       assemble_external (function);
14755       TREE_USED (function) = 1;
14756     }
14757   funexp = XEXP (DECL_RTL (function), 0);
14758   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
14759
14760 #if TARGET_MACHO
14761   if (MACHOPIC_INDIRECT)
14762     funexp = machopic_indirect_call_target (funexp);
14763 #endif
14764
14765   /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
14766      generate sibcall RTL explicitly.  */
14767   insn = emit_call_insn (
14768            gen_rtx_PARALLEL (VOIDmode,
14769              gen_rtvec (4,
14770                         gen_rtx_CALL (VOIDmode,
14771                                       funexp, const0_rtx),
14772                         gen_rtx_USE (VOIDmode, const0_rtx),
14773                         gen_rtx_USE (VOIDmode,
14774                                      gen_rtx_REG (SImode,
14775                                                   LINK_REGISTER_REGNUM)),
14776                         gen_rtx_RETURN (VOIDmode))));
14777   SIBLING_CALL_P (insn) = 1;
14778   emit_barrier ();
14779
14780   /* Run just enough of rest_of_compilation to get the insns emitted.
14781      There's not really enough bulk here to make other passes such as
14782      instruction scheduling worth while.  Note that use_thunk calls
14783      assemble_start_function and assemble_end_function.  */
14784   insn = get_insns ();
14785   insn_locators_initialize ();
14786   shorten_branches (insn);
14787   final_start_function (insn, file, 1);
14788   final (insn, file, 1);
14789   final_end_function ();
14790
14791   reload_completed = 0;
14792   epilogue_completed = 0;
14793   no_new_pseudos = 0;
14794 }
14795 \f
14796 /* A quick summary of the various types of 'constant-pool tables'
14797    under PowerPC:
14798
14799    Target       Flags           Name            One table per
14800    AIX          (none)          AIX TOC         object file
14801    AIX          -mfull-toc      AIX TOC         object file
14802    AIX          -mminimal-toc   AIX minimal TOC translation unit
14803    SVR4/EABI    (none)          SVR4 SDATA      object file
14804    SVR4/EABI    -fpic           SVR4 pic        object file
14805    SVR4/EABI    -fPIC           SVR4 PIC        translation unit
14806    SVR4/EABI    -mrelocatable   EABI TOC        function
14807    SVR4/EABI    -maix           AIX TOC         object file
14808    SVR4/EABI    -maix -mminimal-toc
14809                                 AIX minimal TOC translation unit
14810
14811    Name                 Reg.    Set by  entries       contains:
14812                                         made by  addrs? fp?     sum?
14813
14814    AIX TOC              2       crt0    as       Y      option  option
14815    AIX minimal TOC      30      prolog  gcc      Y      Y       option
14816    SVR4 SDATA           13      crt0    gcc      N      Y       N
14817    SVR4 pic             30      prolog  ld       Y      not yet N
14818    SVR4 PIC             30      prolog  gcc      Y      option  option
14819    EABI TOC             30      prolog  gcc      Y      option  option
14820
14821 */
14822
14823 /* Hash functions for the hash table.  */
14824
14825 static unsigned
14826 rs6000_hash_constant (rtx k)
14827 {
14828   enum rtx_code code = GET_CODE (k);
14829   enum machine_mode mode = GET_MODE (k);
14830   unsigned result = (code << 3) ^ mode;
14831   const char *format;
14832   int flen, fidx;
14833
14834   format = GET_RTX_FORMAT (code);
14835   flen = strlen (format);
14836   fidx = 0;
14837
14838   switch (code)
14839     {
14840     case LABEL_REF:
14841       return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
14842
14843     case CONST_DOUBLE:
14844       if (mode != VOIDmode)
14845         return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
14846       flen = 2;
14847       break;
14848
14849     case CODE_LABEL:
14850       fidx = 3;
14851       break;
14852
14853     default:
14854       break;
14855     }
14856
14857   for (; fidx < flen; fidx++)
14858     switch (format[fidx])
14859       {
14860       case 's':
14861         {
14862           unsigned i, len;
14863           const char *str = XSTR (k, fidx);
14864           len = strlen (str);
14865           result = result * 613 + len;
14866           for (i = 0; i < len; i++)
14867             result = result * 613 + (unsigned) str[i];
14868           break;
14869         }
14870       case 'u':
14871       case 'e':
14872         result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
14873         break;
14874       case 'i':
14875       case 'n':
14876         result = result * 613 + (unsigned) XINT (k, fidx);
14877         break;
14878       case 'w':
14879         if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
14880           result = result * 613 + (unsigned) XWINT (k, fidx);
14881         else
14882           {
14883             size_t i;
14884             for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
14885               result = result * 613 + (unsigned) (XWINT (k, fidx)
14886                                                   >> CHAR_BIT * i);
14887           }
14888         break;
14889       case '0':
14890         break;
14891       default:
14892         gcc_unreachable ();
14893       }
14894
14895   return result;
14896 }
14897
14898 static unsigned
14899 toc_hash_function (const void *hash_entry)
14900 {
14901   const struct toc_hash_struct *thc =
14902     (const struct toc_hash_struct *) hash_entry;
14903   return rs6000_hash_constant (thc->key) ^ thc->key_mode;
14904 }
14905
14906 /* Compare H1 and H2 for equivalence.  */
14907
14908 static int
14909 toc_hash_eq (const void *h1, const void *h2)
14910 {
14911   rtx r1 = ((const struct toc_hash_struct *) h1)->key;
14912   rtx r2 = ((const struct toc_hash_struct *) h2)->key;
14913
14914   if (((const struct toc_hash_struct *) h1)->key_mode
14915       != ((const struct toc_hash_struct *) h2)->key_mode)
14916     return 0;
14917
14918   return rtx_equal_p (r1, r2);
14919 }
14920
14921 /* These are the names given by the C++ front-end to vtables, and
14922    vtable-like objects.  Ideally, this logic should not be here;
14923    instead, there should be some programmatic way of inquiring as
14924    to whether or not an object is a vtable.  */
14925
14926 #define VTABLE_NAME_P(NAME)                             \
14927   (strncmp ("_vt.", name, strlen ("_vt.")) == 0         \
14928   || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0       \
14929   || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0       \
14930   || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0       \
14931   || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
14932
14933 void
14934 rs6000_output_symbol_ref (FILE *file, rtx x)
14935 {
14936   /* Currently C++ toc references to vtables can be emitted before it
14937      is decided whether the vtable is public or private.  If this is
14938      the case, then the linker will eventually complain that there is
14939      a reference to an unknown section.  Thus, for vtables only,
14940      we emit the TOC reference to reference the symbol and not the
14941      section.  */
14942   const char *name = XSTR (x, 0);
14943
14944   if (VTABLE_NAME_P (name))
14945     {
14946       RS6000_OUTPUT_BASENAME (file, name);
14947     }
14948   else
14949     assemble_name (file, name);
14950 }
14951
14952 /* Output a TOC entry.  We derive the entry name from what is being
14953    written.  */
14954
14955 void
14956 output_toc (FILE *file, rtx x, int labelno, enum machine_mode mode)
14957 {
14958   char buf[256];
14959   const char *name = buf;
14960   const char *real_name;
14961   rtx base = x;
14962   int offset = 0;
14963
14964   gcc_assert (!TARGET_NO_TOC);
14965
14966   /* When the linker won't eliminate them, don't output duplicate
14967      TOC entries (this happens on AIX if there is any kind of TOC,
14968      and on SVR4 under -fPIC or -mrelocatable).  Don't do this for
14969      CODE_LABELs.  */
14970   if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
14971     {
14972       struct toc_hash_struct *h;
14973       void * * found;
14974
14975       /* Create toc_hash_table.  This can't be done at OVERRIDE_OPTIONS
14976          time because GGC is not initialized at that point.  */
14977       if (toc_hash_table == NULL)
14978         toc_hash_table = htab_create_ggc (1021, toc_hash_function,
14979                                           toc_hash_eq, NULL);
14980
14981       h = ggc_alloc (sizeof (*h));
14982       h->key = x;
14983       h->key_mode = mode;
14984       h->labelno = labelno;
14985
14986       found = htab_find_slot (toc_hash_table, h, 1);
14987       if (*found == NULL)
14988         *found = h;
14989       else  /* This is indeed a duplicate.
14990                Set this label equal to that label.  */
14991         {
14992           fputs ("\t.set ", file);
14993           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
14994           fprintf (file, "%d,", labelno);
14995           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
14996           fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
14997                                               found)->labelno));
14998           return;
14999         }
15000     }
15001
15002   /* If we're going to put a double constant in the TOC, make sure it's
15003      aligned properly when strict alignment is on.  */
15004   if (GET_CODE (x) == CONST_DOUBLE
15005       && STRICT_ALIGNMENT
15006       && GET_MODE_BITSIZE (mode) >= 64
15007       && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
15008     ASM_OUTPUT_ALIGN (file, 3);
15009   }
15010
15011   (*targetm.asm_out.internal_label) (file, "LC", labelno);
15012
15013   /* Handle FP constants specially.  Note that if we have a minimal
15014      TOC, things we put here aren't actually in the TOC, so we can allow
15015      FP constants.  */
15016   if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == TFmode)
15017     {
15018       REAL_VALUE_TYPE rv;
15019       long k[4];
15020
15021       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
15022       REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
15023
15024       if (TARGET_64BIT)
15025         {
15026           if (TARGET_MINIMAL_TOC)
15027             fputs (DOUBLE_INT_ASM_OP, file);
15028           else
15029             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
15030                      k[0] & 0xffffffff, k[1] & 0xffffffff,
15031                      k[2] & 0xffffffff, k[3] & 0xffffffff);
15032           fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
15033                    k[0] & 0xffffffff, k[1] & 0xffffffff,
15034                    k[2] & 0xffffffff, k[3] & 0xffffffff);
15035           return;
15036         }
15037       else
15038         {
15039           if (TARGET_MINIMAL_TOC)
15040             fputs ("\t.long ", file);
15041           else
15042             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
15043                      k[0] & 0xffffffff, k[1] & 0xffffffff,
15044                      k[2] & 0xffffffff, k[3] & 0xffffffff);
15045           fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
15046                    k[0] & 0xffffffff, k[1] & 0xffffffff,
15047                    k[2] & 0xffffffff, k[3] & 0xffffffff);
15048           return;
15049         }
15050     }
15051   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
15052     {
15053       REAL_VALUE_TYPE rv;
15054       long k[2];
15055
15056       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
15057       REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
15058
15059       if (TARGET_64BIT)
15060         {
15061           if (TARGET_MINIMAL_TOC)
15062             fputs (DOUBLE_INT_ASM_OP, file);
15063           else
15064             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
15065                      k[0] & 0xffffffff, k[1] & 0xffffffff);
15066           fprintf (file, "0x%lx%08lx\n",
15067                    k[0] & 0xffffffff, k[1] & 0xffffffff);
15068           return;
15069         }
15070       else
15071         {
15072           if (TARGET_MINIMAL_TOC)
15073             fputs ("\t.long ", file);
15074           else
15075             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
15076                      k[0] & 0xffffffff, k[1] & 0xffffffff);
15077           fprintf (file, "0x%lx,0x%lx\n",
15078                    k[0] & 0xffffffff, k[1] & 0xffffffff);
15079           return;
15080         }
15081     }
15082   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
15083     {
15084       REAL_VALUE_TYPE rv;
15085       long l;
15086
15087       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
15088       REAL_VALUE_TO_TARGET_SINGLE (rv, l);
15089
15090       if (TARGET_64BIT)
15091         {
15092           if (TARGET_MINIMAL_TOC)
15093             fputs (DOUBLE_INT_ASM_OP, file);
15094           else
15095             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
15096           fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
15097           return;
15098         }
15099       else
15100         {
15101           if (TARGET_MINIMAL_TOC)
15102             fputs ("\t.long ", file);
15103           else
15104             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
15105           fprintf (file, "0x%lx\n", l & 0xffffffff);
15106           return;
15107         }
15108     }
15109   else if (GET_MODE (x) == VOIDmode
15110            && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
15111     {
15112       unsigned HOST_WIDE_INT low;
15113       HOST_WIDE_INT high;
15114
15115       if (GET_CODE (x) == CONST_DOUBLE)
15116         {
15117           low = CONST_DOUBLE_LOW (x);
15118           high = CONST_DOUBLE_HIGH (x);
15119         }
15120       else
15121 #if HOST_BITS_PER_WIDE_INT == 32
15122         {
15123           low = INTVAL (x);
15124           high = (low & 0x80000000) ? ~0 : 0;
15125         }
15126 #else
15127         {
15128           low = INTVAL (x) & 0xffffffff;
15129           high = (HOST_WIDE_INT) INTVAL (x) >> 32;
15130         }
15131 #endif
15132
15133       /* TOC entries are always Pmode-sized, but since this
15134          is a bigendian machine then if we're putting smaller
15135          integer constants in the TOC we have to pad them.
15136          (This is still a win over putting the constants in
15137          a separate constant pool, because then we'd have
15138          to have both a TOC entry _and_ the actual constant.)
15139
15140          For a 32-bit target, CONST_INT values are loaded and shifted
15141          entirely within `low' and can be stored in one TOC entry.  */
15142
15143       /* It would be easy to make this work, but it doesn't now.  */
15144       gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
15145
15146       if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
15147         {
15148 #if HOST_BITS_PER_WIDE_INT == 32
15149           lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
15150                          POINTER_SIZE, &low, &high, 0);
15151 #else
15152           low |= high << 32;
15153           low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
15154           high = (HOST_WIDE_INT) low >> 32;
15155           low &= 0xffffffff;
15156 #endif
15157         }
15158
15159       if (TARGET_64BIT)
15160         {
15161           if (TARGET_MINIMAL_TOC)
15162             fputs (DOUBLE_INT_ASM_OP, file);
15163           else
15164             fprintf (file, "\t.tc ID_%lx_%lx[TC],",
15165                      (long) high & 0xffffffff, (long) low & 0xffffffff);
15166           fprintf (file, "0x%lx%08lx\n",
15167                    (long) high & 0xffffffff, (long) low & 0xffffffff);
15168           return;
15169         }
15170       else
15171         {
15172           if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
15173             {
15174               if (TARGET_MINIMAL_TOC)
15175                 fputs ("\t.long ", file);
15176               else
15177                 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
15178                          (long) high & 0xffffffff, (long) low & 0xffffffff);
15179               fprintf (file, "0x%lx,0x%lx\n",
15180                        (long) high & 0xffffffff, (long) low & 0xffffffff);
15181             }
15182           else
15183             {
15184               if (TARGET_MINIMAL_TOC)
15185                 fputs ("\t.long ", file);
15186               else
15187                 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
15188               fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
15189             }
15190           return;
15191         }
15192     }
15193
15194   if (GET_CODE (x) == CONST)
15195     {
15196       gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS);
15197
15198       base = XEXP (XEXP (x, 0), 0);
15199       offset = INTVAL (XEXP (XEXP (x, 0), 1));
15200     }
15201
15202   switch (GET_CODE (base))
15203     {
15204     case SYMBOL_REF:
15205       name = XSTR (base, 0);
15206       break;
15207
15208     case LABEL_REF:
15209       ASM_GENERATE_INTERNAL_LABEL (buf, "L",
15210                                    CODE_LABEL_NUMBER (XEXP (base, 0)));
15211       break;
15212
15213     case CODE_LABEL:
15214       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
15215       break;
15216
15217     default:
15218       gcc_unreachable ();
15219     }
15220
15221   real_name = (*targetm.strip_name_encoding) (name);
15222   if (TARGET_MINIMAL_TOC)
15223     fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
15224   else
15225     {
15226       fprintf (file, "\t.tc %s", real_name);
15227
15228       if (offset < 0)
15229         fprintf (file, ".N%d", - offset);
15230       else if (offset)
15231         fprintf (file, ".P%d", offset);
15232
15233       fputs ("[TC],", file);
15234     }
15235
15236   /* Currently C++ toc references to vtables can be emitted before it
15237      is decided whether the vtable is public or private.  If this is
15238      the case, then the linker will eventually complain that there is
15239      a TOC reference to an unknown section.  Thus, for vtables only,
15240      we emit the TOC reference to reference the symbol and not the
15241      section.  */
15242   if (VTABLE_NAME_P (name))
15243     {
15244       RS6000_OUTPUT_BASENAME (file, name);
15245       if (offset < 0)
15246         fprintf (file, "%d", offset);
15247       else if (offset > 0)
15248         fprintf (file, "+%d", offset);
15249     }
15250   else
15251     output_addr_const (file, x);
15252   putc ('\n', file);
15253 }
15254 \f
15255 /* Output an assembler pseudo-op to write an ASCII string of N characters
15256    starting at P to FILE.
15257
15258    On the RS/6000, we have to do this using the .byte operation and
15259    write out special characters outside the quoted string.
15260    Also, the assembler is broken; very long strings are truncated,
15261    so we must artificially break them up early.  */
15262
15263 void
15264 output_ascii (FILE *file, const char *p, int n)
15265 {
15266   char c;
15267   int i, count_string;
15268   const char *for_string = "\t.byte \"";
15269   const char *for_decimal = "\t.byte ";
15270   const char *to_close = NULL;
15271
15272   count_string = 0;
15273   for (i = 0; i < n; i++)
15274     {
15275       c = *p++;
15276       if (c >= ' ' && c < 0177)
15277         {
15278           if (for_string)
15279             fputs (for_string, file);
15280           putc (c, file);
15281
15282           /* Write two quotes to get one.  */
15283           if (c == '"')
15284             {
15285               putc (c, file);
15286               ++count_string;
15287             }
15288
15289           for_string = NULL;
15290           for_decimal = "\"\n\t.byte ";
15291           to_close = "\"\n";
15292           ++count_string;
15293
15294           if (count_string >= 512)
15295             {
15296               fputs (to_close, file);
15297
15298               for_string = "\t.byte \"";
15299               for_decimal = "\t.byte ";
15300               to_close = NULL;
15301               count_string = 0;
15302             }
15303         }
15304       else
15305         {
15306           if (for_decimal)
15307             fputs (for_decimal, file);
15308           fprintf (file, "%d", c);
15309
15310           for_string = "\n\t.byte \"";
15311           for_decimal = ", ";
15312           to_close = "\n";
15313           count_string = 0;
15314         }
15315     }
15316
15317   /* Now close the string if we have written one.  Then end the line.  */
15318   if (to_close)
15319     fputs (to_close, file);
15320 }
15321 \f
15322 /* Generate a unique section name for FILENAME for a section type
15323    represented by SECTION_DESC.  Output goes into BUF.
15324
15325    SECTION_DESC can be any string, as long as it is different for each
15326    possible section type.
15327
15328    We name the section in the same manner as xlc.  The name begins with an
15329    underscore followed by the filename (after stripping any leading directory
15330    names) with the last period replaced by the string SECTION_DESC.  If
15331    FILENAME does not contain a period, SECTION_DESC is appended to the end of
15332    the name.  */
15333
15334 void
15335 rs6000_gen_section_name (char **buf, const char *filename,
15336                          const char *section_desc)
15337 {
15338   const char *q, *after_last_slash, *last_period = 0;
15339   char *p;
15340   int len;
15341
15342   after_last_slash = filename;
15343   for (q = filename; *q; q++)
15344     {
15345       if (*q == '/')
15346         after_last_slash = q + 1;
15347       else if (*q == '.')
15348         last_period = q;
15349     }
15350
15351   len = strlen (after_last_slash) + strlen (section_desc) + 2;
15352   *buf = (char *) xmalloc (len);
15353
15354   p = *buf;
15355   *p++ = '_';
15356
15357   for (q = after_last_slash; *q; q++)
15358     {
15359       if (q == last_period)
15360         {
15361           strcpy (p, section_desc);
15362           p += strlen (section_desc);
15363           break;
15364         }
15365
15366       else if (ISALNUM (*q))
15367         *p++ = *q;
15368     }
15369
15370   if (last_period == 0)
15371     strcpy (p, section_desc);
15372   else
15373     *p = '\0';
15374 }
15375 \f
15376 /* Emit profile function.  */
15377
15378 void
15379 output_profile_hook (int labelno ATTRIBUTE_UNUSED)
15380 {
15381   /* Non-standard profiling for kernels, which just saves LR then calls
15382      _mcount without worrying about arg saves.  The idea is to change
15383      the function prologue as little as possible as it isn't easy to
15384      account for arg save/restore code added just for _mcount.  */
15385   if (TARGET_PROFILE_KERNEL)
15386     return;
15387
15388   if (DEFAULT_ABI == ABI_AIX)
15389     {
15390 #ifndef NO_PROFILE_COUNTERS
15391 # define NO_PROFILE_COUNTERS 0
15392 #endif
15393       if (NO_PROFILE_COUNTERS)
15394         emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 0);
15395       else
15396         {
15397           char buf[30];
15398           const char *label_name;
15399           rtx fun;
15400
15401           ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
15402           label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
15403           fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
15404
15405           emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 1,
15406                              fun, Pmode);
15407         }
15408     }
15409   else if (DEFAULT_ABI == ABI_DARWIN)
15410     {
15411       const char *mcount_name = RS6000_MCOUNT;
15412       int caller_addr_regno = LINK_REGISTER_REGNUM;
15413
15414       /* Be conservative and always set this, at least for now.  */
15415       current_function_uses_pic_offset_table = 1;
15416
15417 #if TARGET_MACHO
15418       /* For PIC code, set up a stub and collect the caller's address
15419          from r0, which is where the prologue puts it.  */
15420       if (MACHOPIC_INDIRECT
15421           && current_function_uses_pic_offset_table)
15422         caller_addr_regno = 0;
15423 #endif
15424       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
15425                          0, VOIDmode, 1,
15426                          gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
15427     }
15428 }
15429
15430 /* Write function profiler code.  */
15431
15432 void
15433 output_function_profiler (FILE *file, int labelno)
15434 {
15435   char buf[100];
15436
15437   switch (DEFAULT_ABI)
15438     {
15439     default:
15440       gcc_unreachable ();
15441
15442     case ABI_V4:
15443       if (!TARGET_32BIT)
15444         {
15445           warning (0, "no profiling of 64-bit code for this ABI");
15446           return;
15447         }
15448       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
15449       fprintf (file, "\tmflr %s\n", reg_names[0]);
15450       if (NO_PROFILE_COUNTERS)
15451         {
15452           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
15453                        reg_names[0], reg_names[1]);
15454         }
15455       else if (TARGET_SECURE_PLT && flag_pic)
15456         {
15457           asm_fprintf (file, "\tbcl 20,31,1f\n1:\n\t{st|stw} %s,4(%s)\n",
15458                        reg_names[0], reg_names[1]);
15459           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
15460           asm_fprintf (file, "\t{cau|addis} %s,%s,",
15461                        reg_names[12], reg_names[12]);
15462           assemble_name (file, buf);
15463           asm_fprintf (file, "-1b@ha\n\t{cal|la} %s,", reg_names[0]);
15464           assemble_name (file, buf);
15465           asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
15466         }
15467       else if (flag_pic == 1)
15468         {
15469           fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
15470           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
15471                        reg_names[0], reg_names[1]);
15472           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
15473           asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
15474           assemble_name (file, buf);
15475           asm_fprintf (file, "@got(%s)\n", reg_names[12]);
15476         }
15477       else if (flag_pic > 1)
15478         {
15479           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
15480                        reg_names[0], reg_names[1]);
15481           /* Now, we need to get the address of the label.  */
15482           fputs ("\tbcl 20,31,1f\n\t.long ", file);
15483           assemble_name (file, buf);
15484           fputs ("-.\n1:", file);
15485           asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
15486           asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
15487                        reg_names[0], reg_names[11]);
15488           asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
15489                        reg_names[0], reg_names[0], reg_names[11]);
15490         }
15491       else
15492         {
15493           asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
15494           assemble_name (file, buf);
15495           fputs ("@ha\n", file);
15496           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
15497                        reg_names[0], reg_names[1]);
15498           asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
15499           assemble_name (file, buf);
15500           asm_fprintf (file, "@l(%s)\n", reg_names[12]);
15501         }
15502
15503       /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH.  */
15504       fprintf (file, "\tbl %s%s\n",
15505                RS6000_MCOUNT, flag_pic ? "@plt" : "");
15506       break;
15507
15508     case ABI_AIX:
15509     case ABI_DARWIN:
15510       if (!TARGET_PROFILE_KERNEL)
15511         {
15512           /* Don't do anything, done in output_profile_hook ().  */
15513         }
15514       else
15515         {
15516           gcc_assert (!TARGET_32BIT);
15517
15518           asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
15519           asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
15520
15521           if (cfun->static_chain_decl != NULL)
15522             {
15523               asm_fprintf (file, "\tstd %s,24(%s)\n",
15524                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
15525               fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
15526               asm_fprintf (file, "\tld %s,24(%s)\n",
15527                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
15528             }
15529           else
15530             fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
15531         }
15532       break;
15533     }
15534 }
15535
15536 \f
15537 /* Power4 load update and store update instructions are cracked into a
15538    load or store and an integer insn which are executed in the same cycle.
15539    Branches have their own dispatch slot which does not count against the
15540    GCC issue rate, but it changes the program flow so there are no other
15541    instructions to issue in this cycle.  */
15542
15543 static int
15544 rs6000_variable_issue (FILE *stream ATTRIBUTE_UNUSED,
15545                        int verbose ATTRIBUTE_UNUSED,
15546                        rtx insn, int more)
15547 {
15548   if (GET_CODE (PATTERN (insn)) == USE
15549       || GET_CODE (PATTERN (insn)) == CLOBBER)
15550     return more;
15551
15552   if (rs6000_sched_groups)
15553     {
15554       if (is_microcoded_insn (insn))
15555         return 0;
15556       else if (is_cracked_insn (insn))
15557         return more > 2 ? more - 2 : 0;
15558     }
15559
15560   return more - 1;
15561 }
15562
15563 /* Adjust the cost of a scheduling dependency.  Return the new cost of
15564    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
15565
15566 static int
15567 rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
15568 {
15569   if (! recog_memoized (insn))
15570     return 0;
15571
15572   if (REG_NOTE_KIND (link) != 0)
15573     return 0;
15574
15575   if (REG_NOTE_KIND (link) == 0)
15576     {
15577       /* Data dependency; DEP_INSN writes a register that INSN reads
15578          some cycles later.  */
15579
15580       /* Separate a load from a narrower, dependent store.  */
15581       if (rs6000_sched_groups
15582           && GET_CODE (PATTERN (insn)) == SET
15583           && GET_CODE (PATTERN (dep_insn)) == SET
15584           && GET_CODE (XEXP (PATTERN (insn), 1)) == MEM
15585           && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == MEM
15586           && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
15587               > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
15588         return cost + 14;
15589
15590       switch (get_attr_type (insn))
15591         {
15592         case TYPE_JMPREG:
15593           /* Tell the first scheduling pass about the latency between
15594              a mtctr and bctr (and mtlr and br/blr).  The first
15595              scheduling pass will not know about this latency since
15596              the mtctr instruction, which has the latency associated
15597              to it, will be generated by reload.  */
15598           return TARGET_POWER ? 5 : 4;
15599         case TYPE_BRANCH:
15600           /* Leave some extra cycles between a compare and its
15601              dependent branch, to inhibit expensive mispredicts.  */
15602           if ((rs6000_cpu_attr == CPU_PPC603
15603                || rs6000_cpu_attr == CPU_PPC604
15604                || rs6000_cpu_attr == CPU_PPC604E
15605                || rs6000_cpu_attr == CPU_PPC620
15606                || rs6000_cpu_attr == CPU_PPC630
15607                || rs6000_cpu_attr == CPU_PPC750
15608                || rs6000_cpu_attr == CPU_PPC7400
15609                || rs6000_cpu_attr == CPU_PPC7450
15610                || rs6000_cpu_attr == CPU_POWER4
15611                || rs6000_cpu_attr == CPU_POWER5)
15612               && recog_memoized (dep_insn)
15613               && (INSN_CODE (dep_insn) >= 0)
15614               && (get_attr_type (dep_insn) == TYPE_CMP
15615                   || get_attr_type (dep_insn) == TYPE_COMPARE
15616                   || get_attr_type (dep_insn) == TYPE_DELAYED_COMPARE
15617                   || get_attr_type (dep_insn) == TYPE_IMUL_COMPARE
15618                   || get_attr_type (dep_insn) == TYPE_LMUL_COMPARE
15619                   || get_attr_type (dep_insn) == TYPE_FPCOMPARE
15620                   || get_attr_type (dep_insn) == TYPE_CR_LOGICAL
15621                   || get_attr_type (dep_insn) == TYPE_DELAYED_CR))
15622             return cost + 2;
15623         default:
15624           break;
15625         }
15626       /* Fall out to return default cost.  */
15627     }
15628
15629   return cost;
15630 }
15631
15632 /* The function returns a true if INSN is microcoded.
15633    Return false otherwise.  */
15634
15635 static bool
15636 is_microcoded_insn (rtx insn)
15637 {
15638   if (!insn || !INSN_P (insn)
15639       || GET_CODE (PATTERN (insn)) == USE
15640       || GET_CODE (PATTERN (insn)) == CLOBBER)
15641     return false;
15642
15643   if (rs6000_sched_groups)
15644     {
15645       enum attr_type type = get_attr_type (insn);
15646       if (type == TYPE_LOAD_EXT_U
15647           || type == TYPE_LOAD_EXT_UX
15648           || type == TYPE_LOAD_UX
15649           || type == TYPE_STORE_UX
15650           || type == TYPE_MFCR)
15651         return true;
15652     }
15653
15654   return false;
15655 }
15656
15657 /* The function returns a nonzero value if INSN can be scheduled only
15658    as the first insn in a dispatch group ("dispatch-slot restricted").
15659    In this case, the returned value indicates how many dispatch slots
15660    the insn occupies (at the beginning of the group).
15661    Return 0 otherwise.  */
15662
15663 static int
15664 is_dispatch_slot_restricted (rtx insn)
15665 {
15666   enum attr_type type;
15667
15668   if (!rs6000_sched_groups)
15669     return 0;
15670
15671   if (!insn
15672       || insn == NULL_RTX
15673       || GET_CODE (insn) == NOTE
15674       || GET_CODE (PATTERN (insn)) == USE
15675       || GET_CODE (PATTERN (insn)) == CLOBBER)
15676     return 0;
15677
15678   type = get_attr_type (insn);
15679
15680   switch (type)
15681     {
15682     case TYPE_MFCR:
15683     case TYPE_MFCRF:
15684     case TYPE_MTCR:
15685     case TYPE_DELAYED_CR:
15686     case TYPE_CR_LOGICAL:
15687     case TYPE_MTJMPR:
15688     case TYPE_MFJMPR:
15689       return 1;
15690     case TYPE_IDIV:
15691     case TYPE_LDIV:
15692       return 2;
15693     default:
15694       if (rs6000_cpu == PROCESSOR_POWER5
15695           && is_cracked_insn (insn))
15696         return 2;
15697       return 0;
15698     }
15699 }
15700
15701 /* The function returns true if INSN is cracked into 2 instructions
15702    by the processor (and therefore occupies 2 issue slots).  */
15703
15704 static bool
15705 is_cracked_insn (rtx insn)
15706 {
15707   if (!insn || !INSN_P (insn)
15708       || GET_CODE (PATTERN (insn)) == USE
15709       || GET_CODE (PATTERN (insn)) == CLOBBER)
15710     return false;
15711
15712   if (rs6000_sched_groups)
15713     {
15714       enum attr_type type = get_attr_type (insn);
15715       if (type == TYPE_LOAD_U || type == TYPE_STORE_U
15716           || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
15717           || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
15718           || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
15719           || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
15720           || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
15721           || type == TYPE_IDIV || type == TYPE_LDIV
15722           || type == TYPE_INSERT_WORD)
15723         return true;
15724     }
15725
15726   return false;
15727 }
15728
15729 /* The function returns true if INSN can be issued only from
15730    the branch slot.  */
15731
15732 static bool
15733 is_branch_slot_insn (rtx insn)
15734 {
15735   if (!insn || !INSN_P (insn)
15736       || GET_CODE (PATTERN (insn)) == USE
15737       || GET_CODE (PATTERN (insn)) == CLOBBER)
15738     return false;
15739
15740   if (rs6000_sched_groups)
15741     {
15742       enum attr_type type = get_attr_type (insn);
15743       if (type == TYPE_BRANCH || type == TYPE_JMPREG)
15744         return true;
15745       return false;
15746     }
15747
15748   return false;
15749 }
15750
15751 /* A C statement (sans semicolon) to update the integer scheduling
15752    priority INSN_PRIORITY (INSN). Increase the priority to execute the
15753    INSN earlier, reduce the priority to execute INSN later.  Do not
15754    define this macro if you do not need to adjust the scheduling
15755    priorities of insns.  */
15756
15757 static int
15758 rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
15759 {
15760   /* On machines (like the 750) which have asymmetric integer units,
15761      where one integer unit can do multiply and divides and the other
15762      can't, reduce the priority of multiply/divide so it is scheduled
15763      before other integer operations.  */
15764
15765 #if 0
15766   if (! INSN_P (insn))
15767     return priority;
15768
15769   if (GET_CODE (PATTERN (insn)) == USE)
15770     return priority;
15771
15772   switch (rs6000_cpu_attr) {
15773   case CPU_PPC750:
15774     switch (get_attr_type (insn))
15775       {
15776       default:
15777         break;
15778
15779       case TYPE_IMUL:
15780       case TYPE_IDIV:
15781         fprintf (stderr, "priority was %#x (%d) before adjustment\n",
15782                  priority, priority);
15783         if (priority >= 0 && priority < 0x01000000)
15784           priority >>= 3;
15785         break;
15786       }
15787   }
15788 #endif
15789
15790   if (is_dispatch_slot_restricted (insn)
15791       && reload_completed
15792       && current_sched_info->sched_max_insns_priority
15793       && rs6000_sched_restricted_insns_priority)
15794     {
15795
15796       /* Prioritize insns that can be dispatched only in the first
15797          dispatch slot.  */
15798       if (rs6000_sched_restricted_insns_priority == 1)
15799         /* Attach highest priority to insn. This means that in
15800            haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
15801            precede 'priority' (critical path) considerations.  */
15802         return current_sched_info->sched_max_insns_priority;
15803       else if (rs6000_sched_restricted_insns_priority == 2)
15804         /* Increase priority of insn by a minimal amount. This means that in
15805            haifa-sched.c:ready_sort(), only 'priority' (critical path)
15806            considerations precede dispatch-slot restriction considerations.  */
15807         return (priority + 1);
15808     }
15809
15810   return priority;
15811 }
15812
15813 /* Return how many instructions the machine can issue per cycle.  */
15814
15815 static int
15816 rs6000_issue_rate (void)
15817 {
15818   /* Use issue rate of 1 for first scheduling pass to decrease degradation.  */
15819   if (!reload_completed)
15820     return 1;
15821
15822   switch (rs6000_cpu_attr) {
15823   case CPU_RIOS1:  /* ? */
15824   case CPU_RS64A:
15825   case CPU_PPC601: /* ? */
15826   case CPU_PPC7450:
15827     return 3;
15828   case CPU_PPC440:
15829   case CPU_PPC603:
15830   case CPU_PPC750:
15831   case CPU_PPC7400:
15832   case CPU_PPC8540:
15833     return 2;
15834   case CPU_RIOS2:
15835   case CPU_PPC604:
15836   case CPU_PPC604E:
15837   case CPU_PPC620:
15838   case CPU_PPC630:
15839     return 4;
15840   case CPU_POWER4:
15841   case CPU_POWER5:
15842     return 5;
15843   default:
15844     return 1;
15845   }
15846 }
15847
15848 /* Return how many instructions to look ahead for better insn
15849    scheduling.  */
15850
15851 static int
15852 rs6000_use_sched_lookahead (void)
15853 {
15854   if (rs6000_cpu_attr == CPU_PPC8540)
15855     return 4;
15856   return 0;
15857 }
15858
15859 /* Determine is PAT refers to memory.  */
15860
15861 static bool
15862 is_mem_ref (rtx pat)
15863 {
15864   const char * fmt;
15865   int i, j;
15866   bool ret = false;
15867
15868   if (GET_CODE (pat) == MEM)
15869     return true;
15870
15871   /* Recursively process the pattern.  */
15872   fmt = GET_RTX_FORMAT (GET_CODE (pat));
15873
15874   for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0 && !ret; i--)
15875     {
15876       if (fmt[i] == 'e')
15877         ret |= is_mem_ref (XEXP (pat, i));
15878       else if (fmt[i] == 'E')
15879         for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
15880           ret |= is_mem_ref (XVECEXP (pat, i, j));
15881     }
15882
15883   return ret;
15884 }
15885
15886 /* Determine if PAT is a PATTERN of a load insn.  */
15887
15888 static bool
15889 is_load_insn1 (rtx pat)
15890 {
15891   if (!pat || pat == NULL_RTX)
15892     return false;
15893
15894   if (GET_CODE (pat) == SET)
15895     return is_mem_ref (SET_SRC (pat));
15896
15897   if (GET_CODE (pat) == PARALLEL)
15898     {
15899       int i;
15900
15901       for (i = 0; i < XVECLEN (pat, 0); i++)
15902         if (is_load_insn1 (XVECEXP (pat, 0, i)))
15903           return true;
15904     }
15905
15906   return false;
15907 }
15908
15909 /* Determine if INSN loads from memory.  */
15910
15911 static bool
15912 is_load_insn (rtx insn)
15913 {
15914   if (!insn || !INSN_P (insn))
15915     return false;
15916
15917   if (GET_CODE (insn) == CALL_INSN)
15918     return false;
15919
15920   return is_load_insn1 (PATTERN (insn));
15921 }
15922
15923 /* Determine if PAT is a PATTERN of a store insn.  */
15924
15925 static bool
15926 is_store_insn1 (rtx pat)
15927 {
15928   if (!pat || pat == NULL_RTX)
15929     return false;
15930
15931   if (GET_CODE (pat) == SET)
15932     return is_mem_ref (SET_DEST (pat));
15933
15934   if (GET_CODE (pat) == PARALLEL)
15935     {
15936       int i;
15937
15938       for (i = 0; i < XVECLEN (pat, 0); i++)
15939         if (is_store_insn1 (XVECEXP (pat, 0, i)))
15940           return true;
15941     }
15942
15943   return false;
15944 }
15945
15946 /* Determine if INSN stores to memory.  */
15947
15948 static bool
15949 is_store_insn (rtx insn)
15950 {
15951   if (!insn || !INSN_P (insn))
15952     return false;
15953
15954   return is_store_insn1 (PATTERN (insn));
15955 }
15956
15957 /* Returns whether the dependence between INSN and NEXT is considered
15958    costly by the given target.  */
15959
15960 static bool
15961 rs6000_is_costly_dependence (rtx insn, rtx next, rtx link, int cost,
15962                              int distance)
15963 {
15964   /* If the flag is not enabled - no dependence is considered costly;
15965      allow all dependent insns in the same group.
15966      This is the most aggressive option.  */
15967   if (rs6000_sched_costly_dep == no_dep_costly)
15968     return false;
15969
15970   /* If the flag is set to 1 - a dependence is always considered costly;
15971      do not allow dependent instructions in the same group.
15972      This is the most conservative option.  */
15973   if (rs6000_sched_costly_dep == all_deps_costly)
15974     return true;
15975
15976   if (rs6000_sched_costly_dep == store_to_load_dep_costly
15977       && is_load_insn (next)
15978       && is_store_insn (insn))
15979     /* Prevent load after store in the same group.  */
15980     return true;
15981
15982   if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
15983       && is_load_insn (next)
15984       && is_store_insn (insn)
15985       && (!link || (int) REG_NOTE_KIND (link) == 0))
15986      /* Prevent load after store in the same group if it is a true
15987         dependence.  */
15988      return true;
15989
15990   /* The flag is set to X; dependences with latency >= X are considered costly,
15991      and will not be scheduled in the same group.  */
15992   if (rs6000_sched_costly_dep <= max_dep_latency
15993       && ((cost - distance) >= (int)rs6000_sched_costly_dep))
15994     return true;
15995
15996   return false;
15997 }
15998
15999 /* Return the next insn after INSN that is found before TAIL is reached,
16000    skipping any "non-active" insns - insns that will not actually occupy
16001    an issue slot.  Return NULL_RTX if such an insn is not found.  */
16002
16003 static rtx
16004 get_next_active_insn (rtx insn, rtx tail)
16005 {
16006   rtx next_insn;
16007
16008   if (!insn || insn == tail)
16009     return NULL_RTX;
16010
16011   next_insn = NEXT_INSN (insn);
16012
16013   while (next_insn
16014          && next_insn != tail
16015          && (GET_CODE (next_insn) == NOTE
16016              || GET_CODE (PATTERN (next_insn)) == USE
16017              || GET_CODE (PATTERN (next_insn)) == CLOBBER))
16018     {
16019       next_insn = NEXT_INSN (next_insn);
16020     }
16021
16022   if (!next_insn || next_insn == tail)
16023     return NULL_RTX;
16024
16025   return next_insn;
16026 }
16027
16028 /* Return whether the presence of INSN causes a dispatch group termination
16029    of group WHICH_GROUP.
16030
16031    If WHICH_GROUP == current_group, this function will return true if INSN
16032    causes the termination of the current group (i.e, the dispatch group to
16033    which INSN belongs). This means that INSN will be the last insn in the
16034    group it belongs to.
16035
16036    If WHICH_GROUP == previous_group, this function will return true if INSN
16037    causes the termination of the previous group (i.e, the dispatch group that
16038    precedes the group to which INSN belongs).  This means that INSN will be
16039    the first insn in the group it belongs to).  */
16040
16041 static bool
16042 insn_terminates_group_p (rtx insn, enum group_termination which_group)
16043 {
16044   enum attr_type type;
16045
16046   if (! insn)
16047     return false;
16048
16049   type = get_attr_type (insn);
16050
16051   if (is_microcoded_insn (insn))
16052     return true;
16053
16054   if (which_group == current_group)
16055     {
16056       if (is_branch_slot_insn (insn))
16057         return true;
16058       return false;
16059     }
16060   else if (which_group == previous_group)
16061     {
16062       if (is_dispatch_slot_restricted (insn))
16063         return true;
16064       return false;
16065     }
16066
16067   return false;
16068 }
16069
16070 /* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
16071    dispatch group) from the insns in GROUP_INSNS.  Return false otherwise.  */
16072
16073 static bool
16074 is_costly_group (rtx *group_insns, rtx next_insn)
16075 {
16076   int i;
16077   rtx link;
16078   int cost;
16079   int issue_rate = rs6000_issue_rate ();
16080
16081   for (i = 0; i < issue_rate; i++)
16082     {
16083       rtx insn = group_insns[i];
16084       if (!insn)
16085         continue;
16086       for (link = INSN_DEPEND (insn); link != 0; link = XEXP (link, 1))
16087         {
16088           rtx next = XEXP (link, 0);
16089           if (next == next_insn)
16090             {
16091               cost = insn_cost (insn, link, next_insn);
16092               if (rs6000_is_costly_dependence (insn, next_insn, link, cost, 0))
16093                 return true;
16094             }
16095         }
16096     }
16097
16098   return false;
16099 }
16100
16101 /* Utility of the function redefine_groups.
16102    Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
16103    in the same dispatch group.  If so, insert nops before NEXT_INSN, in order
16104    to keep it "far" (in a separate group) from GROUP_INSNS, following
16105    one of the following schemes, depending on the value of the flag
16106    -minsert_sched_nops = X:
16107    (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
16108        in order to force NEXT_INSN into a separate group.
16109    (2) X < sched_finish_regroup_exact: insert exactly X nops.
16110    GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
16111    insertion (has a group just ended, how many vacant issue slots remain in the
16112    last group, and how many dispatch groups were encountered so far).  */
16113
16114 static int
16115 force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
16116                  rtx next_insn, bool *group_end, int can_issue_more,
16117                  int *group_count)
16118 {
16119   rtx nop;
16120   bool force;
16121   int issue_rate = rs6000_issue_rate ();
16122   bool end = *group_end;
16123   int i;
16124
16125   if (next_insn == NULL_RTX)
16126     return can_issue_more;
16127
16128   if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
16129     return can_issue_more;
16130
16131   force = is_costly_group (group_insns, next_insn);
16132   if (!force)
16133     return can_issue_more;
16134
16135   if (sched_verbose > 6)
16136     fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
16137              *group_count ,can_issue_more);
16138
16139   if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
16140     {
16141       if (*group_end)
16142         can_issue_more = 0;
16143
16144       /* Since only a branch can be issued in the last issue_slot, it is
16145          sufficient to insert 'can_issue_more - 1' nops if next_insn is not
16146          a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
16147          in this case the last nop will start a new group and the branch
16148          will be forced to the new group.  */
16149       if (can_issue_more && !is_branch_slot_insn (next_insn))
16150         can_issue_more--;
16151
16152       while (can_issue_more > 0)
16153         {
16154           nop = gen_nop ();
16155           emit_insn_before (nop, next_insn);
16156           can_issue_more--;
16157         }
16158
16159       *group_end = true;
16160       return 0;
16161     }
16162
16163   if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
16164     {
16165       int n_nops = rs6000_sched_insert_nops;
16166
16167       /* Nops can't be issued from the branch slot, so the effective
16168          issue_rate for nops is 'issue_rate - 1'.  */
16169       if (can_issue_more == 0)
16170         can_issue_more = issue_rate;
16171       can_issue_more--;
16172       if (can_issue_more == 0)
16173         {
16174           can_issue_more = issue_rate - 1;
16175           (*group_count)++;
16176           end = true;
16177           for (i = 0; i < issue_rate; i++)
16178             {
16179               group_insns[i] = 0;
16180             }
16181         }
16182
16183       while (n_nops > 0)
16184         {
16185           nop = gen_nop ();
16186           emit_insn_before (nop, next_insn);
16187           if (can_issue_more == issue_rate - 1) /* new group begins */
16188             end = false;
16189           can_issue_more--;
16190           if (can_issue_more == 0)
16191             {
16192               can_issue_more = issue_rate - 1;
16193               (*group_count)++;
16194               end = true;
16195               for (i = 0; i < issue_rate; i++)
16196                 {
16197                   group_insns[i] = 0;
16198                 }
16199             }
16200           n_nops--;
16201         }
16202
16203       /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1').  */
16204       can_issue_more++;
16205
16206       /* Is next_insn going to start a new group?  */
16207       *group_end
16208         = (end
16209            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
16210            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
16211            || (can_issue_more < issue_rate &&
16212                insn_terminates_group_p (next_insn, previous_group)));
16213       if (*group_end && end)
16214         (*group_count)--;
16215
16216       if (sched_verbose > 6)
16217         fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
16218                  *group_count, can_issue_more);
16219       return can_issue_more;
16220     }
16221
16222   return can_issue_more;
16223 }
16224
16225 /* This function tries to synch the dispatch groups that the compiler "sees"
16226    with the dispatch groups that the processor dispatcher is expected to
16227    form in practice.  It tries to achieve this synchronization by forcing the
16228    estimated processor grouping on the compiler (as opposed to the function
16229    'pad_goups' which tries to force the scheduler's grouping on the processor).
16230
16231    The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
16232    examines the (estimated) dispatch groups that will be formed by the processor
16233    dispatcher.  It marks these group boundaries to reflect the estimated
16234    processor grouping, overriding the grouping that the scheduler had marked.
16235    Depending on the value of the flag '-minsert-sched-nops' this function can
16236    force certain insns into separate groups or force a certain distance between
16237    them by inserting nops, for example, if there exists a "costly dependence"
16238    between the insns.
16239
16240    The function estimates the group boundaries that the processor will form as
16241    follows:  It keeps track of how many vacant issue slots are available after
16242    each insn.  A subsequent insn will start a new group if one of the following
16243    4 cases applies:
16244    - no more vacant issue slots remain in the current dispatch group.
16245    - only the last issue slot, which is the branch slot, is vacant, but the next
16246      insn is not a branch.
16247    - only the last 2 or less issue slots, including the branch slot, are vacant,
16248      which means that a cracked insn (which occupies two issue slots) can't be
16249      issued in this group.
16250    - less than 'issue_rate' slots are vacant, and the next insn always needs to
16251      start a new group.  */
16252
16253 static int
16254 redefine_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
16255 {
16256   rtx insn, next_insn;
16257   int issue_rate;
16258   int can_issue_more;
16259   int slot, i;
16260   bool group_end;
16261   int group_count = 0;
16262   rtx *group_insns;
16263
16264   /* Initialize.  */
16265   issue_rate = rs6000_issue_rate ();
16266   group_insns = alloca (issue_rate * sizeof (rtx));
16267   for (i = 0; i < issue_rate; i++)
16268     {
16269       group_insns[i] = 0;
16270     }
16271   can_issue_more = issue_rate;
16272   slot = 0;
16273   insn = get_next_active_insn (prev_head_insn, tail);
16274   group_end = false;
16275
16276   while (insn != NULL_RTX)
16277     {
16278       slot = (issue_rate - can_issue_more);
16279       group_insns[slot] = insn;
16280       can_issue_more =
16281         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
16282       if (insn_terminates_group_p (insn, current_group))
16283         can_issue_more = 0;
16284
16285       next_insn = get_next_active_insn (insn, tail);
16286       if (next_insn == NULL_RTX)
16287         return group_count + 1;
16288
16289       /* Is next_insn going to start a new group?  */
16290       group_end
16291         = (can_issue_more == 0
16292            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
16293            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
16294            || (can_issue_more < issue_rate &&
16295                insn_terminates_group_p (next_insn, previous_group)));
16296
16297       can_issue_more = force_new_group (sched_verbose, dump, group_insns,
16298                                         next_insn, &group_end, can_issue_more,
16299                                         &group_count);
16300
16301       if (group_end)
16302         {
16303           group_count++;
16304           can_issue_more = 0;
16305           for (i = 0; i < issue_rate; i++)
16306             {
16307               group_insns[i] = 0;
16308             }
16309         }
16310
16311       if (GET_MODE (next_insn) == TImode && can_issue_more)
16312         PUT_MODE (next_insn, VOIDmode);
16313       else if (!can_issue_more && GET_MODE (next_insn) != TImode)
16314         PUT_MODE (next_insn, TImode);
16315
16316       insn = next_insn;
16317       if (can_issue_more == 0)
16318         can_issue_more = issue_rate;
16319     } /* while */
16320
16321   return group_count;
16322 }
16323
16324 /* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
16325    dispatch group boundaries that the scheduler had marked.  Pad with nops
16326    any dispatch groups which have vacant issue slots, in order to force the
16327    scheduler's grouping on the processor dispatcher.  The function
16328    returns the number of dispatch groups found.  */
16329
16330 static int
16331 pad_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
16332 {
16333   rtx insn, next_insn;
16334   rtx nop;
16335   int issue_rate;
16336   int can_issue_more;
16337   int group_end;
16338   int group_count = 0;
16339
16340   /* Initialize issue_rate.  */
16341   issue_rate = rs6000_issue_rate ();
16342   can_issue_more = issue_rate;
16343
16344   insn = get_next_active_insn (prev_head_insn, tail);
16345   next_insn = get_next_active_insn (insn, tail);
16346
16347   while (insn != NULL_RTX)
16348     {
16349       can_issue_more =
16350         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
16351
16352       group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
16353
16354       if (next_insn == NULL_RTX)
16355         break;
16356
16357       if (group_end)
16358         {
16359           /* If the scheduler had marked group termination at this location
16360              (between insn and next_indn), and neither insn nor next_insn will
16361              force group termination, pad the group with nops to force group
16362              termination.  */
16363           if (can_issue_more
16364               && (rs6000_sched_insert_nops == sched_finish_pad_groups)
16365               && !insn_terminates_group_p (insn, current_group)
16366               && !insn_terminates_group_p (next_insn, previous_group))
16367             {
16368               if (!is_branch_slot_insn (next_insn))
16369                 can_issue_more--;
16370
16371               while (can_issue_more)
16372                 {
16373                   nop = gen_nop ();
16374                   emit_insn_before (nop, next_insn);
16375                   can_issue_more--;
16376                 }
16377             }
16378
16379           can_issue_more = issue_rate;
16380           group_count++;
16381         }
16382
16383       insn = next_insn;
16384       next_insn = get_next_active_insn (insn, tail);
16385     }
16386
16387   return group_count;
16388 }
16389
16390 /* The following function is called at the end of scheduling BB.
16391    After reload, it inserts nops at insn group bundling.  */
16392
16393 static void
16394 rs6000_sched_finish (FILE *dump, int sched_verbose)
16395 {
16396   int n_groups;
16397
16398   if (sched_verbose)
16399     fprintf (dump, "=== Finishing schedule.\n");
16400
16401   if (reload_completed && rs6000_sched_groups)
16402     {
16403       if (rs6000_sched_insert_nops == sched_finish_none)
16404         return;
16405
16406       if (rs6000_sched_insert_nops == sched_finish_pad_groups)
16407         n_groups = pad_groups (dump, sched_verbose,
16408                                current_sched_info->prev_head,
16409                                current_sched_info->next_tail);
16410       else
16411         n_groups = redefine_groups (dump, sched_verbose,
16412                                     current_sched_info->prev_head,
16413                                     current_sched_info->next_tail);
16414
16415       if (sched_verbose >= 6)
16416         {
16417           fprintf (dump, "ngroups = %d\n", n_groups);
16418           print_rtl (dump, current_sched_info->prev_head);
16419           fprintf (dump, "Done finish_sched\n");
16420         }
16421     }
16422 }
16423 \f
16424 /* Length in units of the trampoline for entering a nested function.  */
16425
16426 int
16427 rs6000_trampoline_size (void)
16428 {
16429   int ret = 0;
16430
16431   switch (DEFAULT_ABI)
16432     {
16433     default:
16434       gcc_unreachable ();
16435
16436     case ABI_AIX:
16437       ret = (TARGET_32BIT) ? 12 : 24;
16438       break;
16439
16440     case ABI_DARWIN:
16441     case ABI_V4:
16442       ret = (TARGET_32BIT) ? 40 : 48;
16443       break;
16444     }
16445
16446   return ret;
16447 }
16448
16449 /* Emit RTL insns to initialize the variable parts of a trampoline.
16450    FNADDR is an RTX for the address of the function's pure code.
16451    CXT is an RTX for the static chain value for the function.  */
16452
16453 void
16454 rs6000_initialize_trampoline (rtx addr, rtx fnaddr, rtx cxt)
16455 {
16456   enum machine_mode pmode = Pmode;
16457   int regsize = (TARGET_32BIT) ? 4 : 8;
16458   rtx ctx_reg = force_reg (pmode, cxt);
16459
16460   switch (DEFAULT_ABI)
16461     {
16462     default:
16463       gcc_unreachable ();
16464
16465 /* Macros to shorten the code expansions below.  */
16466 #define MEM_DEREF(addr) gen_rtx_MEM (pmode, memory_address (pmode, addr))
16467 #define MEM_PLUS(addr,offset) \
16468   gen_rtx_MEM (pmode, memory_address (pmode, plus_constant (addr, offset)))
16469
16470     /* Under AIX, just build the 3 word function descriptor */
16471     case ABI_AIX:
16472       {
16473         rtx fn_reg = gen_reg_rtx (pmode);
16474         rtx toc_reg = gen_reg_rtx (pmode);
16475         emit_move_insn (fn_reg, MEM_DEREF (fnaddr));
16476         emit_move_insn (toc_reg, MEM_PLUS (fnaddr, regsize));
16477         emit_move_insn (MEM_DEREF (addr), fn_reg);
16478         emit_move_insn (MEM_PLUS (addr, regsize), toc_reg);
16479         emit_move_insn (MEM_PLUS (addr, 2*regsize), ctx_reg);
16480       }
16481       break;
16482
16483     /* Under V.4/eabi/darwin, __trampoline_setup does the real work.  */
16484     case ABI_DARWIN:
16485     case ABI_V4:
16486       emit_library_call (gen_rtx_SYMBOL_REF (SImode, "__trampoline_setup"),
16487                          FALSE, VOIDmode, 4,
16488                          addr, pmode,
16489                          GEN_INT (rs6000_trampoline_size ()), SImode,
16490                          fnaddr, pmode,
16491                          ctx_reg, pmode);
16492       break;
16493     }
16494
16495   return;
16496 }
16497
16498 \f
16499 /* Table of valid machine attributes.  */
16500
16501 const struct attribute_spec rs6000_attribute_table[] =
16502 {
16503   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
16504   { "altivec",   1, 1, false, true,  false, rs6000_handle_altivec_attribute },
16505   { "longcall",  0, 0, false, true,  true,  rs6000_handle_longcall_attribute },
16506   { "shortcall", 0, 0, false, true,  true,  rs6000_handle_longcall_attribute },
16507 #ifdef SUBTARGET_ATTRIBUTE_TABLE
16508   SUBTARGET_ATTRIBUTE_TABLE,
16509 #endif
16510   { NULL,        0, 0, false, false, false, NULL }
16511 };
16512
16513 /* Handle the "altivec" attribute.  The attribute may have
16514    arguments as follows:
16515
16516         __attribute__((altivec(vector__)))
16517         __attribute__((altivec(pixel__)))       (always followed by 'unsigned short')
16518         __attribute__((altivec(bool__)))        (always followed by 'unsigned')
16519
16520   and may appear more than once (e.g., 'vector bool char') in a
16521   given declaration.  */
16522
16523 static tree
16524 rs6000_handle_altivec_attribute (tree *node,
16525                                  tree name ATTRIBUTE_UNUSED,
16526                                  tree args,
16527                                  int flags ATTRIBUTE_UNUSED,
16528                                  bool *no_add_attrs)
16529 {
16530   tree type = *node, result = NULL_TREE;
16531   enum machine_mode mode;
16532   int unsigned_p;
16533   char altivec_type
16534     = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
16535         && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
16536        ? *IDENTIFIER_POINTER (TREE_VALUE (args))
16537        : '?');
16538
16539   while (POINTER_TYPE_P (type)
16540          || TREE_CODE (type) == FUNCTION_TYPE
16541          || TREE_CODE (type) == METHOD_TYPE
16542          || TREE_CODE (type) == ARRAY_TYPE)
16543     type = TREE_TYPE (type);
16544
16545   mode = TYPE_MODE (type);
16546
16547   /* Check for invalid AltiVec type qualifiers.  */
16548   if (type == long_unsigned_type_node || type == long_integer_type_node)
16549     {
16550     if (TARGET_64BIT)
16551       error ("use of %<long%> in AltiVec types is invalid for 64-bit code");
16552     else if (rs6000_warn_altivec_long)
16553       warning (0, "use of %<long%> in AltiVec types is deprecated; use %<int%>");
16554     }
16555   else if (type == long_long_unsigned_type_node
16556            || type == long_long_integer_type_node)
16557     error ("use of %<long long%> in AltiVec types is invalid");
16558   else if (type == double_type_node)
16559     error ("use of %<double%> in AltiVec types is invalid");
16560   else if (type == long_double_type_node)
16561     error ("use of %<long double%> in AltiVec types is invalid");
16562   else if (type == boolean_type_node)
16563     error ("use of boolean types in AltiVec types is invalid");
16564   else if (TREE_CODE (type) == COMPLEX_TYPE)
16565     error ("use of %<complex%> in AltiVec types is invalid");
16566
16567   switch (altivec_type)
16568     {
16569     case 'v':
16570       unsigned_p = TYPE_UNSIGNED (type);
16571       switch (mode)
16572         {
16573         case SImode:
16574           result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
16575           break;
16576         case HImode:
16577           result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
16578           break;
16579         case QImode:
16580           result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
16581           break;
16582         case SFmode: result = V4SF_type_node; break;
16583           /* If the user says 'vector int bool', we may be handed the 'bool'
16584              attribute _before_ the 'vector' attribute, and so select the
16585              proper type in the 'b' case below.  */
16586         case V4SImode: case V8HImode: case V16QImode: case V4SFmode:
16587           result = type;
16588         default: break;
16589         }
16590       break;
16591     case 'b':
16592       switch (mode)
16593         {
16594         case SImode: case V4SImode: result = bool_V4SI_type_node; break;
16595         case HImode: case V8HImode: result = bool_V8HI_type_node; break;
16596         case QImode: case V16QImode: result = bool_V16QI_type_node;
16597         default: break;
16598         }
16599       break;
16600     case 'p':
16601       switch (mode)
16602         {
16603         case V8HImode: result = pixel_V8HI_type_node;
16604         default: break;
16605         }
16606     default: break;
16607     }
16608
16609   if (result && result != type && TYPE_READONLY (type))
16610     result = build_qualified_type (result, TYPE_QUAL_CONST);
16611
16612   *no_add_attrs = true;  /* No need to hang on to the attribute.  */
16613
16614   if (result)
16615     *node = reconstruct_complex_type (*node, result);
16616
16617   return NULL_TREE;
16618 }
16619
16620 /* AltiVec defines four built-in scalar types that serve as vector
16621    elements; we must teach the compiler how to mangle them.  */
16622
16623 static const char *
16624 rs6000_mangle_fundamental_type (tree type)
16625 {
16626   if (type == bool_char_type_node) return "U6__boolc";
16627   if (type == bool_short_type_node) return "U6__bools";
16628   if (type == pixel_type_node) return "u7__pixel";
16629   if (type == bool_int_type_node) return "U6__booli";
16630
16631   /* For all other types, use normal C++ mangling.  */
16632   return NULL;
16633 }
16634
16635 /* Handle a "longcall" or "shortcall" attribute; arguments as in
16636    struct attribute_spec.handler.  */
16637
16638 static tree
16639 rs6000_handle_longcall_attribute (tree *node, tree name,
16640                                   tree args ATTRIBUTE_UNUSED,
16641                                   int flags ATTRIBUTE_UNUSED,
16642                                   bool *no_add_attrs)
16643 {
16644   if (TREE_CODE (*node) != FUNCTION_TYPE
16645       && TREE_CODE (*node) != FIELD_DECL
16646       && TREE_CODE (*node) != TYPE_DECL)
16647     {
16648       warning (OPT_Wattributes, "%qs attribute only applies to functions",
16649                IDENTIFIER_POINTER (name));
16650       *no_add_attrs = true;
16651     }
16652
16653   return NULL_TREE;
16654 }
16655
16656 /* Set longcall attributes on all functions declared when
16657    rs6000_default_long_calls is true.  */
16658 static void
16659 rs6000_set_default_type_attributes (tree type)
16660 {
16661   if (rs6000_default_long_calls
16662       && (TREE_CODE (type) == FUNCTION_TYPE
16663           || TREE_CODE (type) == METHOD_TYPE))
16664     TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
16665                                         NULL_TREE,
16666                                         TYPE_ATTRIBUTES (type));
16667 }
16668
16669 /* Return a reference suitable for calling a function with the
16670    longcall attribute.  */
16671
16672 rtx
16673 rs6000_longcall_ref (rtx call_ref)
16674 {
16675   const char *call_name;
16676   tree node;
16677
16678   if (GET_CODE (call_ref) != SYMBOL_REF)
16679     return call_ref;
16680
16681   /* System V adds '.' to the internal name, so skip them.  */
16682   call_name = XSTR (call_ref, 0);
16683   if (*call_name == '.')
16684     {
16685       while (*call_name == '.')
16686         call_name++;
16687
16688       node = get_identifier (call_name);
16689       call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
16690     }
16691
16692   return force_reg (Pmode, call_ref);
16693 }
16694 \f
16695 #ifdef USING_ELFOS_H
16696
16697 /* A C statement or statements to switch to the appropriate section
16698    for output of RTX in mode MODE.  You can assume that RTX is some
16699    kind of constant in RTL.  The argument MODE is redundant except in
16700    the case of a `const_int' rtx.  Select the section by calling
16701    `text_section' or one of the alternatives for other sections.
16702
16703    Do not define this macro if you put all constants in the read-only
16704    data section.  */
16705
16706 static void
16707 rs6000_elf_select_rtx_section (enum machine_mode mode, rtx x,
16708                                unsigned HOST_WIDE_INT align)
16709 {
16710   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
16711     toc_section ();
16712   else
16713     default_elf_select_rtx_section (mode, x, align);
16714 }
16715
16716 /* A C statement or statements to switch to the appropriate
16717    section for output of DECL.  DECL is either a `VAR_DECL' node
16718    or a constant of some sort.  RELOC indicates whether forming
16719    the initial value of DECL requires link-time relocations.  */
16720
16721 static void
16722 rs6000_elf_select_section (tree decl, int reloc,
16723                            unsigned HOST_WIDE_INT align)
16724 {
16725   /* Pretend that we're always building for a shared library when
16726      ABI_AIX, because otherwise we end up with dynamic relocations
16727      in read-only sections.  This happens for function pointers,
16728      references to vtables in typeinfo, and probably other cases.  */
16729   default_elf_select_section_1 (decl, reloc, align,
16730                                 flag_pic || DEFAULT_ABI == ABI_AIX);
16731 }
16732
16733 /* A C statement to build up a unique section name, expressed as a
16734    STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
16735    RELOC indicates whether the initial value of EXP requires
16736    link-time relocations.  If you do not define this macro, GCC will use
16737    the symbol name prefixed by `.' as the section name.  Note - this
16738    macro can now be called for uninitialized data items as well as
16739    initialized data and functions.  */
16740
16741 static void
16742 rs6000_elf_unique_section (tree decl, int reloc)
16743 {
16744   /* As above, pretend that we're always building for a shared library
16745      when ABI_AIX, to avoid dynamic relocations in read-only sections.  */
16746   default_unique_section_1 (decl, reloc,
16747                             flag_pic || DEFAULT_ABI == ABI_AIX);
16748 }
16749 \f
16750 /* For a SYMBOL_REF, set generic flags and then perform some
16751    target-specific processing.
16752
16753    When the AIX ABI is requested on a non-AIX system, replace the
16754    function name with the real name (with a leading .) rather than the
16755    function descriptor name.  This saves a lot of overriding code to
16756    read the prefixes.  */
16757
16758 static void
16759 rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
16760 {
16761   default_encode_section_info (decl, rtl, first);
16762
16763   if (first
16764       && TREE_CODE (decl) == FUNCTION_DECL
16765       && !TARGET_AIX
16766       && DEFAULT_ABI == ABI_AIX)
16767     {
16768       rtx sym_ref = XEXP (rtl, 0);
16769       size_t len = strlen (XSTR (sym_ref, 0));
16770       char *str = alloca (len + 2);
16771       str[0] = '.';
16772       memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
16773       XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
16774     }
16775 }
16776
16777 static bool
16778 rs6000_elf_in_small_data_p (tree decl)
16779 {
16780   if (rs6000_sdata == SDATA_NONE)
16781     return false;
16782
16783   /* We want to merge strings, so we never consider them small data.  */
16784   if (TREE_CODE (decl) == STRING_CST)
16785     return false;
16786
16787   /* Functions are never in the small data area.  */
16788   if (TREE_CODE (decl) == FUNCTION_DECL)
16789     return false;
16790
16791   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
16792     {
16793       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
16794       if (strcmp (section, ".sdata") == 0
16795           || strcmp (section, ".sdata2") == 0
16796           || strcmp (section, ".sbss") == 0
16797           || strcmp (section, ".sbss2") == 0
16798           || strcmp (section, ".PPC.EMB.sdata0") == 0
16799           || strcmp (section, ".PPC.EMB.sbss0") == 0)
16800         return true;
16801     }
16802   else
16803     {
16804       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
16805
16806       if (size > 0
16807           && (unsigned HOST_WIDE_INT) size <= g_switch_value
16808           /* If it's not public, and we're not going to reference it there,
16809              there's no need to put it in the small data section.  */
16810           && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
16811         return true;
16812     }
16813
16814   return false;
16815 }
16816
16817 #endif /* USING_ELFOS_H */
16818
16819 \f
16820 /* Return a REG that occurs in ADDR with coefficient 1.
16821    ADDR can be effectively incremented by incrementing REG.
16822
16823    r0 is special and we must not select it as an address
16824    register by this routine since our caller will try to
16825    increment the returned register via an "la" instruction.  */
16826
16827 rtx
16828 find_addr_reg (rtx addr)
16829 {
16830   while (GET_CODE (addr) == PLUS)
16831     {
16832       if (GET_CODE (XEXP (addr, 0)) == REG
16833           && REGNO (XEXP (addr, 0)) != 0)
16834         addr = XEXP (addr, 0);
16835       else if (GET_CODE (XEXP (addr, 1)) == REG
16836                && REGNO (XEXP (addr, 1)) != 0)
16837         addr = XEXP (addr, 1);
16838       else if (CONSTANT_P (XEXP (addr, 0)))
16839         addr = XEXP (addr, 1);
16840       else if (CONSTANT_P (XEXP (addr, 1)))
16841         addr = XEXP (addr, 0);
16842       else
16843         gcc_unreachable ();
16844     }
16845   gcc_assert (GET_CODE (addr) == REG && REGNO (addr) != 0);
16846   return addr;
16847 }
16848
16849 void
16850 rs6000_fatal_bad_address (rtx op)
16851 {
16852   fatal_insn ("bad address", op);
16853 }
16854
16855 #if TARGET_MACHO
16856
16857 static tree branch_island_list = 0;
16858
16859 /* Remember to generate a branch island for far calls to the given
16860    function.  */
16861
16862 static void
16863 add_compiler_branch_island (tree label_name, tree function_name,
16864                             int line_number)
16865 {
16866   tree branch_island = build_tree_list (function_name, label_name);
16867   TREE_TYPE (branch_island) = build_int_cst (NULL_TREE, line_number);
16868   TREE_CHAIN (branch_island) = branch_island_list;
16869   branch_island_list = branch_island;
16870 }
16871
16872 #define BRANCH_ISLAND_LABEL_NAME(BRANCH_ISLAND)     TREE_VALUE (BRANCH_ISLAND)
16873 #define BRANCH_ISLAND_FUNCTION_NAME(BRANCH_ISLAND)  TREE_PURPOSE (BRANCH_ISLAND)
16874 #define BRANCH_ISLAND_LINE_NUMBER(BRANCH_ISLAND)    \
16875                 TREE_INT_CST_LOW (TREE_TYPE (BRANCH_ISLAND))
16876
16877 /* Generate far-jump branch islands for everything on the
16878    branch_island_list.  Invoked immediately after the last instruction
16879    of the epilogue has been emitted; the branch-islands must be
16880    appended to, and contiguous with, the function body.  Mach-O stubs
16881    are generated in machopic_output_stub().  */
16882
16883 static void
16884 macho_branch_islands (void)
16885 {
16886   char tmp_buf[512];
16887   tree branch_island;
16888
16889   for (branch_island = branch_island_list;
16890        branch_island;
16891        branch_island = TREE_CHAIN (branch_island))
16892     {
16893       const char *label =
16894         IDENTIFIER_POINTER (BRANCH_ISLAND_LABEL_NAME (branch_island));
16895       const char *name  =
16896         IDENTIFIER_POINTER (BRANCH_ISLAND_FUNCTION_NAME (branch_island));
16897       char name_buf[512];
16898       /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF().  */
16899       if (name[0] == '*' || name[0] == '&')
16900         strcpy (name_buf, name+1);
16901       else
16902         {
16903           name_buf[0] = '_';
16904           strcpy (name_buf+1, name);
16905         }
16906       strcpy (tmp_buf, "\n");
16907       strcat (tmp_buf, label);
16908 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
16909       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
16910         dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
16911 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
16912       if (flag_pic)
16913         {
16914           strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
16915           strcat (tmp_buf, label);
16916           strcat (tmp_buf, "_pic\n");
16917           strcat (tmp_buf, label);
16918           strcat (tmp_buf, "_pic:\n\tmflr r11\n");
16919
16920           strcat (tmp_buf, "\taddis r11,r11,ha16(");
16921           strcat (tmp_buf, name_buf);
16922           strcat (tmp_buf, " - ");
16923           strcat (tmp_buf, label);
16924           strcat (tmp_buf, "_pic)\n");
16925
16926           strcat (tmp_buf, "\tmtlr r0\n");
16927
16928           strcat (tmp_buf, "\taddi r12,r11,lo16(");
16929           strcat (tmp_buf, name_buf);
16930           strcat (tmp_buf, " - ");
16931           strcat (tmp_buf, label);
16932           strcat (tmp_buf, "_pic)\n");
16933
16934           strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
16935         }
16936       else
16937         {
16938           strcat (tmp_buf, ":\nlis r12,hi16(");
16939           strcat (tmp_buf, name_buf);
16940           strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
16941           strcat (tmp_buf, name_buf);
16942           strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
16943         }
16944       output_asm_insn (tmp_buf, 0);
16945 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
16946       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
16947         dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
16948 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
16949     }
16950
16951   branch_island_list = 0;
16952 }
16953
16954 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
16955    already there or not.  */
16956
16957 static int
16958 no_previous_def (tree function_name)
16959 {
16960   tree branch_island;
16961   for (branch_island = branch_island_list;
16962        branch_island;
16963        branch_island = TREE_CHAIN (branch_island))
16964     if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
16965       return 0;
16966   return 1;
16967 }
16968
16969 /* GET_PREV_LABEL gets the label name from the previous definition of
16970    the function.  */
16971
16972 static tree
16973 get_prev_label (tree function_name)
16974 {
16975   tree branch_island;
16976   for (branch_island = branch_island_list;
16977        branch_island;
16978        branch_island = TREE_CHAIN (branch_island))
16979     if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
16980       return BRANCH_ISLAND_LABEL_NAME (branch_island);
16981   return 0;
16982 }
16983
16984 /* INSN is either a function call or a millicode call.  It may have an
16985    unconditional jump in its delay slot.
16986
16987    CALL_DEST is the routine we are calling.  */
16988
16989 char *
16990 output_call (rtx insn, rtx *operands, int dest_operand_number,
16991              int cookie_operand_number)
16992 {
16993   static char buf[256];
16994   if (GET_CODE (operands[dest_operand_number]) == SYMBOL_REF
16995       && (INTVAL (operands[cookie_operand_number]) & CALL_LONG))
16996     {
16997       tree labelname;
16998       tree funname = get_identifier (XSTR (operands[dest_operand_number], 0));
16999
17000       if (no_previous_def (funname))
17001         {
17002           int line_number = 0;
17003           rtx label_rtx = gen_label_rtx ();
17004           char *label_buf, temp_buf[256];
17005           ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
17006                                        CODE_LABEL_NUMBER (label_rtx));
17007           label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
17008           labelname = get_identifier (label_buf);
17009           for (; insn && GET_CODE (insn) != NOTE; insn = PREV_INSN (insn));
17010           if (insn)
17011             line_number = NOTE_LINE_NUMBER (insn);
17012           add_compiler_branch_island (labelname, funname, line_number);
17013         }
17014       else
17015         labelname = get_prev_label (funname);
17016
17017       /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
17018          instruction will reach 'foo', otherwise link as 'bl L42'".
17019          "L42" should be a 'branch island', that will do a far jump to
17020          'foo'.  Branch islands are generated in
17021          macho_branch_islands().  */
17022       sprintf (buf, "jbsr %%z%d,%.246s",
17023                dest_operand_number, IDENTIFIER_POINTER (labelname));
17024     }
17025   else
17026     sprintf (buf, "bl %%z%d", dest_operand_number);
17027   return buf;
17028 }
17029
17030 /* Generate PIC and indirect symbol stubs.  */
17031
17032 void
17033 machopic_output_stub (FILE *file, const char *symb, const char *stub)
17034 {
17035   unsigned int length;
17036   char *symbol_name, *lazy_ptr_name;
17037   char *local_label_0;
17038   static int label = 0;
17039
17040   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
17041   symb = (*targetm.strip_name_encoding) (symb);
17042
17043
17044   length = strlen (symb);
17045   symbol_name = alloca (length + 32);
17046   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
17047
17048   lazy_ptr_name = alloca (length + 32);
17049   GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
17050
17051   if (flag_pic == 2)
17052     machopic_picsymbol_stub1_section ();
17053   else
17054     machopic_symbol_stub1_section ();
17055
17056   if (flag_pic == 2)
17057     {
17058       fprintf (file, "\t.align 5\n");
17059
17060       fprintf (file, "%s:\n", stub);
17061       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
17062
17063       label++;
17064       local_label_0 = alloca (sizeof ("\"L00000000000$spb\""));
17065       sprintf (local_label_0, "\"L%011d$spb\"", label);
17066
17067       fprintf (file, "\tmflr r0\n");
17068       fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
17069       fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
17070       fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
17071                lazy_ptr_name, local_label_0);
17072       fprintf (file, "\tmtlr r0\n");
17073       fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
17074                (TARGET_64BIT ? "ldu" : "lwzu"),
17075                lazy_ptr_name, local_label_0);
17076       fprintf (file, "\tmtctr r12\n");
17077       fprintf (file, "\tbctr\n");
17078     }
17079   else
17080     {
17081       fprintf (file, "\t.align 4\n");
17082
17083       fprintf (file, "%s:\n", stub);
17084       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
17085
17086       fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
17087       fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
17088                (TARGET_64BIT ? "ldu" : "lwzu"),
17089                lazy_ptr_name);
17090       fprintf (file, "\tmtctr r12\n");
17091       fprintf (file, "\tbctr\n");
17092     }
17093
17094   machopic_lazy_symbol_ptr_section ();
17095   fprintf (file, "%s:\n", lazy_ptr_name);
17096   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
17097   fprintf (file, "%sdyld_stub_binding_helper\n",
17098            (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
17099 }
17100
17101 /* Legitimize PIC addresses.  If the address is already
17102    position-independent, we return ORIG.  Newly generated
17103    position-independent addresses go into a reg.  This is REG if non
17104    zero, otherwise we allocate register(s) as necessary.  */
17105
17106 #define SMALL_INT(X) ((unsigned) (INTVAL (X) + 0x8000) < 0x10000)
17107
17108 rtx
17109 rs6000_machopic_legitimize_pic_address (rtx orig, enum machine_mode mode,
17110                                         rtx reg)
17111 {
17112   rtx base, offset;
17113
17114   if (reg == NULL && ! reload_in_progress && ! reload_completed)
17115     reg = gen_reg_rtx (Pmode);
17116
17117   if (GET_CODE (orig) == CONST)
17118     {
17119       rtx reg_temp;
17120
17121       if (GET_CODE (XEXP (orig, 0)) == PLUS
17122           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
17123         return orig;
17124
17125       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
17126       
17127       /* Use a different reg for the intermediate value, as
17128          it will be marked UNCHANGING.  */
17129       reg_temp = no_new_pseudos ? reg : gen_reg_rtx (Pmode);
17130       base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
17131                                                      Pmode, reg_temp);
17132       offset =
17133         rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
17134                                                 Pmode, reg);
17135       
17136       if (GET_CODE (offset) == CONST_INT)
17137         {
17138           if (SMALL_INT (offset))
17139             return plus_constant (base, INTVAL (offset));
17140           else if (! reload_in_progress && ! reload_completed)
17141             offset = force_reg (Pmode, offset);
17142           else
17143             {
17144               rtx mem = force_const_mem (Pmode, orig);
17145               return machopic_legitimize_pic_address (mem, Pmode, reg);
17146             }
17147         }
17148       return gen_rtx_PLUS (Pmode, base, offset);
17149     }
17150
17151   /* Fall back on generic machopic code.  */
17152   return machopic_legitimize_pic_address (orig, mode, reg);
17153 }
17154
17155 /* This is just a placeholder to make linking work without having to
17156    add this to the generic Darwin EXTRA_SECTIONS.  If -mcall-aix is
17157    ever needed for Darwin (not too likely!) this would have to get a
17158    real definition.  */
17159
17160 void
17161 toc_section (void)
17162 {
17163 }
17164
17165 /* Output a .machine directive for the Darwin assembler, and call
17166    the generic start_file routine.  */
17167
17168 static void
17169 rs6000_darwin_file_start (void)
17170 {
17171   static const struct
17172   {
17173     const char *arg;
17174     const char *name;
17175     int if_set;
17176   } mapping[] = {
17177     { "ppc64", "ppc64", MASK_64BIT },
17178     { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
17179     { "power4", "ppc970", 0 },
17180     { "G5", "ppc970", 0 },
17181     { "7450", "ppc7450", 0 },
17182     { "7400", "ppc7400", MASK_ALTIVEC },
17183     { "G4", "ppc7400", 0 },
17184     { "750", "ppc750", 0 },
17185     { "740", "ppc750", 0 },
17186     { "G3", "ppc750", 0 },
17187     { "604e", "ppc604e", 0 },
17188     { "604", "ppc604", 0 },
17189     { "603e", "ppc603", 0 },
17190     { "603", "ppc603", 0 },
17191     { "601", "ppc601", 0 },
17192     { NULL, "ppc", 0 } };
17193   const char *cpu_id = "";
17194   size_t i;
17195
17196   rs6000_file_start ();
17197
17198   /* Determine the argument to -mcpu=.  Default to G3 if not specified.  */
17199   for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
17200     if (rs6000_select[i].set_arch_p && rs6000_select[i].string
17201         && rs6000_select[i].string[0] != '\0')
17202       cpu_id = rs6000_select[i].string;
17203
17204   /* Look through the mapping array.  Pick the first name that either
17205      matches the argument, has a bit set in IF_SET that is also set
17206      in the target flags, or has a NULL name.  */
17207
17208   i = 0;
17209   while (mapping[i].arg != NULL
17210          && strcmp (mapping[i].arg, cpu_id) != 0
17211          && (mapping[i].if_set & target_flags) == 0)
17212     i++;
17213
17214   fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
17215 }
17216
17217 #endif /* TARGET_MACHO */
17218
17219 #if TARGET_ELF
17220 static unsigned int
17221 rs6000_elf_section_type_flags (tree decl, const char *name, int reloc)
17222 {
17223   return default_section_type_flags_1 (decl, name, reloc,
17224                                        flag_pic || DEFAULT_ABI == ABI_AIX);
17225 }
17226
17227 /* Record an element in the table of global constructors.  SYMBOL is
17228    a SYMBOL_REF of the function to be called; PRIORITY is a number
17229    between 0 and MAX_INIT_PRIORITY.
17230
17231    This differs from default_named_section_asm_out_constructor in
17232    that we have special handling for -mrelocatable.  */
17233
17234 static void
17235 rs6000_elf_asm_out_constructor (rtx symbol, int priority)
17236 {
17237   const char *section = ".ctors";
17238   char buf[16];
17239
17240   if (priority != DEFAULT_INIT_PRIORITY)
17241     {
17242       sprintf (buf, ".ctors.%.5u",
17243                /* Invert the numbering so the linker puts us in the proper
17244                   order; constructors are run from right to left, and the
17245                   linker sorts in increasing order.  */
17246                MAX_INIT_PRIORITY - priority);
17247       section = buf;
17248     }
17249
17250   named_section_flags (section, SECTION_WRITE);
17251   assemble_align (POINTER_SIZE);
17252
17253   if (TARGET_RELOCATABLE)
17254     {
17255       fputs ("\t.long (", asm_out_file);
17256       output_addr_const (asm_out_file, symbol);
17257       fputs (")@fixup\n", asm_out_file);
17258     }
17259   else
17260     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
17261 }
17262
17263 static void
17264 rs6000_elf_asm_out_destructor (rtx symbol, int priority)
17265 {
17266   const char *section = ".dtors";
17267   char buf[16];
17268
17269   if (priority != DEFAULT_INIT_PRIORITY)
17270     {
17271       sprintf (buf, ".dtors.%.5u",
17272                /* Invert the numbering so the linker puts us in the proper
17273                   order; constructors are run from right to left, and the
17274                   linker sorts in increasing order.  */
17275                MAX_INIT_PRIORITY - priority);
17276       section = buf;
17277     }
17278
17279   named_section_flags (section, SECTION_WRITE);
17280   assemble_align (POINTER_SIZE);
17281
17282   if (TARGET_RELOCATABLE)
17283     {
17284       fputs ("\t.long (", asm_out_file);
17285       output_addr_const (asm_out_file, symbol);
17286       fputs (")@fixup\n", asm_out_file);
17287     }
17288   else
17289     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
17290 }
17291
17292 void
17293 rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
17294 {
17295   if (TARGET_64BIT)
17296     {
17297       fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
17298       ASM_OUTPUT_LABEL (file, name);
17299       fputs (DOUBLE_INT_ASM_OP, file);
17300       rs6000_output_function_entry (file, name);
17301       fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
17302       if (DOT_SYMBOLS)
17303         {
17304           fputs ("\t.size\t", file);
17305           assemble_name (file, name);
17306           fputs (",24\n\t.type\t.", file);
17307           assemble_name (file, name);
17308           fputs (",@function\n", file);
17309           if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
17310             {
17311               fputs ("\t.globl\t.", file);
17312               assemble_name (file, name);
17313               putc ('\n', file);
17314             }
17315         }
17316       else
17317         ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
17318       ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
17319       rs6000_output_function_entry (file, name);
17320       fputs (":\n", file);
17321       return;
17322     }
17323
17324   if (TARGET_RELOCATABLE
17325       && !TARGET_SECURE_PLT
17326       && (get_pool_size () != 0 || current_function_profile)
17327       && uses_TOC ())
17328     {
17329       char buf[256];
17330
17331       (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
17332
17333       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
17334       fprintf (file, "\t.long ");
17335       assemble_name (file, buf);
17336       putc ('-', file);
17337       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
17338       assemble_name (file, buf);
17339       putc ('\n', file);
17340     }
17341
17342   ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
17343   ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
17344
17345   if (DEFAULT_ABI == ABI_AIX)
17346     {
17347       const char *desc_name, *orig_name;
17348
17349       orig_name = (*targetm.strip_name_encoding) (name);
17350       desc_name = orig_name;
17351       while (*desc_name == '.')
17352         desc_name++;
17353
17354       if (TREE_PUBLIC (decl))
17355         fprintf (file, "\t.globl %s\n", desc_name);
17356
17357       fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
17358       fprintf (file, "%s:\n", desc_name);
17359       fprintf (file, "\t.long %s\n", orig_name);
17360       fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
17361       if (DEFAULT_ABI == ABI_AIX)
17362         fputs ("\t.long 0\n", file);
17363       fprintf (file, "\t.previous\n");
17364     }
17365   ASM_OUTPUT_LABEL (file, name);
17366 }
17367
17368 static void
17369 rs6000_elf_end_indicate_exec_stack (void)
17370 {
17371   if (TARGET_32BIT)
17372     file_end_indicate_exec_stack ();
17373 }
17374 #endif
17375
17376 #if TARGET_XCOFF
17377 static void
17378 rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
17379 {
17380   fputs (GLOBAL_ASM_OP, stream);
17381   RS6000_OUTPUT_BASENAME (stream, name);
17382   putc ('\n', stream);
17383 }
17384
17385 static void
17386 rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
17387                                 tree decl ATTRIBUTE_UNUSED)
17388 {
17389   int smclass;
17390   static const char * const suffix[3] = { "PR", "RO", "RW" };
17391
17392   if (flags & SECTION_CODE)
17393     smclass = 0;
17394   else if (flags & SECTION_WRITE)
17395     smclass = 2;
17396   else
17397     smclass = 1;
17398
17399   fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
17400            (flags & SECTION_CODE) ? "." : "",
17401            name, suffix[smclass], flags & SECTION_ENTSIZE);
17402 }
17403
17404 static void
17405 rs6000_xcoff_select_section (tree decl, int reloc,
17406                              unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
17407 {
17408   if (decl_readonly_section_1 (decl, reloc, 1))
17409     {
17410       if (TREE_PUBLIC (decl))
17411         read_only_data_section ();
17412       else
17413         read_only_private_data_section ();
17414     }
17415   else
17416     {
17417       if (TREE_PUBLIC (decl))
17418         data_section ();
17419       else
17420         private_data_section ();
17421     }
17422 }
17423
17424 static void
17425 rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
17426 {
17427   const char *name;
17428
17429   /* Use select_section for private and uninitialized data.  */
17430   if (!TREE_PUBLIC (decl)
17431       || DECL_COMMON (decl)
17432       || DECL_INITIAL (decl) == NULL_TREE
17433       || DECL_INITIAL (decl) == error_mark_node
17434       || (flag_zero_initialized_in_bss
17435           && initializer_zerop (DECL_INITIAL (decl))))
17436     return;
17437
17438   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
17439   name = (*targetm.strip_name_encoding) (name);
17440   DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
17441 }
17442
17443 /* Select section for constant in constant pool.
17444
17445    On RS/6000, all constants are in the private read-only data area.
17446    However, if this is being placed in the TOC it must be output as a
17447    toc entry.  */
17448
17449 static void
17450 rs6000_xcoff_select_rtx_section (enum machine_mode mode, rtx x,
17451                                  unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
17452 {
17453   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
17454     toc_section ();
17455   else
17456     read_only_private_data_section ();
17457 }
17458
17459 /* Remove any trailing [DS] or the like from the symbol name.  */
17460
17461 static const char *
17462 rs6000_xcoff_strip_name_encoding (const char *name)
17463 {
17464   size_t len;
17465   if (*name == '*')
17466     name++;
17467   len = strlen (name);
17468   if (name[len - 1] == ']')
17469     return ggc_alloc_string (name, len - 4);
17470   else
17471     return name;
17472 }
17473
17474 /* Section attributes.  AIX is always PIC.  */
17475
17476 static unsigned int
17477 rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
17478 {
17479   unsigned int align;
17480   unsigned int flags = default_section_type_flags_1 (decl, name, reloc, 1);
17481
17482   /* Align to at least UNIT size.  */
17483   if (flags & SECTION_CODE)
17484     align = MIN_UNITS_PER_WORD;
17485   else
17486     /* Increase alignment of large objects if not already stricter.  */
17487     align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
17488                  int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
17489                  ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
17490
17491   return flags | (exact_log2 (align) & SECTION_ENTSIZE);
17492 }
17493
17494 /* Output at beginning of assembler file.
17495
17496    Initialize the section names for the RS/6000 at this point.
17497
17498    Specify filename, including full path, to assembler.
17499
17500    We want to go into the TOC section so at least one .toc will be emitted.
17501    Also, in order to output proper .bs/.es pairs, we need at least one static
17502    [RW] section emitted.
17503
17504    Finally, declare mcount when profiling to make the assembler happy.  */
17505
17506 static void
17507 rs6000_xcoff_file_start (void)
17508 {
17509   rs6000_gen_section_name (&xcoff_bss_section_name,
17510                            main_input_filename, ".bss_");
17511   rs6000_gen_section_name (&xcoff_private_data_section_name,
17512                            main_input_filename, ".rw_");
17513   rs6000_gen_section_name (&xcoff_read_only_section_name,
17514                            main_input_filename, ".ro_");
17515
17516   fputs ("\t.file\t", asm_out_file);
17517   output_quoted_string (asm_out_file, main_input_filename);
17518   fputc ('\n', asm_out_file);
17519   if (write_symbols != NO_DEBUG)
17520     private_data_section ();
17521   text_section ();
17522   if (profile_flag)
17523     fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
17524   rs6000_file_start ();
17525 }
17526
17527 /* Output at end of assembler file.
17528    On the RS/6000, referencing data should automatically pull in text.  */
17529
17530 static void
17531 rs6000_xcoff_file_end (void)
17532 {
17533   text_section ();
17534   fputs ("_section_.text:\n", asm_out_file);
17535   data_section ();
17536   fputs (TARGET_32BIT
17537          ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
17538          asm_out_file);
17539 }
17540 #endif /* TARGET_XCOFF */
17541
17542 /* Compute a (partial) cost for rtx X.  Return true if the complete
17543    cost has been computed, and false if subexpressions should be
17544    scanned.  In either case, *TOTAL contains the cost result.  */
17545
17546 static bool
17547 rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
17548 {
17549   enum machine_mode mode = GET_MODE (x);
17550
17551   switch (code)
17552     {
17553       /* On the RS/6000, if it is valid in the insn, it is free.  */
17554     case CONST_INT:
17555       if (((outer_code == SET
17556             || outer_code == PLUS
17557             || outer_code == MINUS)
17558            && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
17559                || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')))
17560           || (outer_code == AND
17561               && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
17562                   || (CONST_OK_FOR_LETTER_P (INTVAL (x),
17563                                              mode == SImode ? 'L' : 'J'))
17564                   || mask_operand (x, VOIDmode)))
17565           || ((outer_code == IOR || outer_code == XOR)
17566               && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
17567                   || (CONST_OK_FOR_LETTER_P (INTVAL (x),
17568                                              mode == SImode ? 'L' : 'J'))))
17569           || outer_code == ASHIFT
17570           || outer_code == ASHIFTRT
17571           || outer_code == LSHIFTRT
17572           || outer_code == ROTATE
17573           || outer_code == ROTATERT
17574           || outer_code == ZERO_EXTRACT
17575           || (outer_code == MULT
17576               && CONST_OK_FOR_LETTER_P (INTVAL (x), 'I'))
17577           || ((outer_code == DIV || outer_code == UDIV
17578                || outer_code == MOD || outer_code == UMOD)
17579               && exact_log2 (INTVAL (x)) >= 0)
17580           || (outer_code == COMPARE
17581               && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
17582                   || CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')))
17583           || (outer_code == EQ
17584               && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
17585                   || CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
17586                   || (CONST_OK_FOR_LETTER_P (INTVAL (x),
17587                                              mode == SImode ? 'L' : 'J'))))
17588           || (outer_code == GTU
17589               && CONST_OK_FOR_LETTER_P (INTVAL (x), 'I'))
17590           || (outer_code == LTU
17591               && CONST_OK_FOR_LETTER_P (INTVAL (x), 'P')))
17592         {
17593           *total = 0;
17594           return true;
17595         }
17596       else if ((outer_code == PLUS
17597                 && reg_or_add_cint_operand (x, VOIDmode))
17598                || (outer_code == MINUS
17599                    && reg_or_sub_cint_operand (x, VOIDmode))
17600                || ((outer_code == SET
17601                     || outer_code == IOR
17602                     || outer_code == XOR)
17603                    && (INTVAL (x)
17604                        & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
17605         {
17606           *total = COSTS_N_INSNS (1);
17607           return true;
17608         }
17609       /* FALLTHRU */
17610
17611     case CONST_DOUBLE:
17612       if (mode == DImode
17613           && ((outer_code == AND
17614                && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
17615                    || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')
17616                    || mask_operand (x, DImode)))
17617               || ((outer_code == IOR || outer_code == XOR)
17618                   && CONST_DOUBLE_HIGH (x) == 0
17619                   && (CONST_DOUBLE_LOW (x)
17620                       & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0)))
17621         {
17622           *total = 0;
17623           return true;
17624         }
17625       else if (mode == DImode
17626                && (outer_code == SET
17627                    || outer_code == IOR
17628                    || outer_code == XOR)
17629                && CONST_DOUBLE_HIGH (x) == 0)
17630         {
17631           *total = COSTS_N_INSNS (1);
17632           return true;
17633         }
17634       /* FALLTHRU */
17635
17636     case CONST:
17637     case HIGH:
17638     case SYMBOL_REF:
17639     case MEM:
17640       /* When optimizing for size, MEM should be slightly more expensive
17641          than generating address, e.g., (plus (reg) (const)).
17642          L1 cache latency is about two instructions.  */
17643       *total = optimize_size ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
17644       return true;
17645
17646     case LABEL_REF:
17647       *total = 0;
17648       return true;
17649
17650     case PLUS:
17651       if (mode == DFmode)
17652         {
17653           if (GET_CODE (XEXP (x, 0)) == MULT)
17654             {
17655               /* FNMA accounted in outer NEG.  */
17656               if (outer_code == NEG)
17657                 *total = rs6000_cost->dmul - rs6000_cost->fp;
17658               else
17659                 *total = rs6000_cost->dmul;
17660             }
17661           else
17662             *total = rs6000_cost->fp;
17663         }
17664       else if (mode == SFmode)
17665         {
17666           /* FNMA accounted in outer NEG.  */
17667           if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
17668             *total = 0;
17669           else
17670             *total = rs6000_cost->fp;
17671         }
17672       else if (GET_CODE (XEXP (x, 0)) == MULT)
17673         {
17674           /* The rs6000 doesn't have shift-and-add instructions.  */
17675           rs6000_rtx_costs (XEXP (x, 0), MULT, PLUS, total);
17676           *total += COSTS_N_INSNS (1);
17677         }
17678       else
17679         *total = COSTS_N_INSNS (1);
17680       return false;
17681
17682     case MINUS:
17683       if (mode == DFmode)
17684         {
17685           if (GET_CODE (XEXP (x, 0)) == MULT)
17686             {
17687               /* FNMA accounted in outer NEG.  */
17688               if (outer_code == NEG)
17689                 *total = 0;
17690               else
17691                 *total = rs6000_cost->dmul;
17692             }
17693           else
17694             *total = rs6000_cost->fp;
17695         }
17696       else if (mode == SFmode)
17697         {
17698           /* FNMA accounted in outer NEG.  */
17699           if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
17700             *total = 0;
17701           else
17702             *total = rs6000_cost->fp;
17703         }
17704       else if (GET_CODE (XEXP (x, 0)) == MULT)
17705         {
17706           /* The rs6000 doesn't have shift-and-sub instructions.  */
17707           rs6000_rtx_costs (XEXP (x, 0), MULT, MINUS, total);
17708           *total += COSTS_N_INSNS (1);
17709         }
17710       else
17711         *total = COSTS_N_INSNS (1);
17712       return false;
17713
17714     case MULT:
17715       if (GET_CODE (XEXP (x, 1)) == CONST_INT
17716           && CONST_OK_FOR_LETTER_P (INTVAL (XEXP (x, 1)), 'I'))
17717         {
17718           if (INTVAL (XEXP (x, 1)) >= -256
17719               && INTVAL (XEXP (x, 1)) <= 255)
17720             *total = rs6000_cost->mulsi_const9;
17721           else
17722             *total = rs6000_cost->mulsi_const;
17723         }
17724       /* FMA accounted in outer PLUS/MINUS.  */
17725       else if ((mode == DFmode || mode == SFmode)
17726                && (outer_code == PLUS || outer_code == MINUS))
17727         *total = 0;
17728       else if (mode == DFmode)
17729         *total = rs6000_cost->dmul;
17730       else if (mode == SFmode)
17731         *total = rs6000_cost->fp;
17732       else if (mode == DImode)
17733         *total = rs6000_cost->muldi;
17734       else
17735         *total = rs6000_cost->mulsi;
17736       return false;
17737
17738     case DIV:
17739     case MOD:
17740       if (FLOAT_MODE_P (mode))
17741         {
17742           *total = mode == DFmode ? rs6000_cost->ddiv
17743                                   : rs6000_cost->sdiv;
17744           return false;
17745         }
17746       /* FALLTHRU */
17747
17748     case UDIV:
17749     case UMOD:
17750       if (GET_CODE (XEXP (x, 1)) == CONST_INT
17751           && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
17752         {
17753           if (code == DIV || code == MOD)
17754             /* Shift, addze */
17755             *total = COSTS_N_INSNS (2);
17756           else
17757             /* Shift */
17758             *total = COSTS_N_INSNS (1);
17759         }
17760       else
17761         {
17762           if (GET_MODE (XEXP (x, 1)) == DImode)
17763             *total = rs6000_cost->divdi;
17764           else
17765             *total = rs6000_cost->divsi;
17766         }
17767       /* Add in shift and subtract for MOD. */
17768       if (code == MOD || code == UMOD)
17769         *total += COSTS_N_INSNS (2);
17770       return false;
17771
17772     case FFS:
17773       *total = COSTS_N_INSNS (4);
17774       return false;
17775
17776     case NOT:
17777       if (outer_code == AND || outer_code == IOR || outer_code == XOR)
17778         {
17779           *total = 0;
17780           return false;
17781         }
17782       /* FALLTHRU */
17783
17784     case AND:
17785     case IOR:
17786     case XOR:
17787     case ZERO_EXTRACT:
17788       *total = COSTS_N_INSNS (1);
17789       return false;
17790
17791     case ASHIFT:
17792     case ASHIFTRT:
17793     case LSHIFTRT:
17794     case ROTATE:
17795     case ROTATERT:
17796       /* Handle mul_highpart.  */
17797       if (outer_code == TRUNCATE
17798           && GET_CODE (XEXP (x, 0)) == MULT)
17799         {
17800           if (mode == DImode)
17801             *total = rs6000_cost->muldi;
17802           else
17803             *total = rs6000_cost->mulsi;
17804           return true;
17805         }
17806       else if (outer_code == AND)
17807         *total = 0;
17808       else
17809         *total = COSTS_N_INSNS (1);
17810       return false;
17811
17812     case SIGN_EXTEND:
17813     case ZERO_EXTEND:
17814       if (GET_CODE (XEXP (x, 0)) == MEM)
17815         *total = 0;
17816       else
17817         *total = COSTS_N_INSNS (1);
17818       return false;
17819
17820     case COMPARE:
17821     case NEG:
17822     case ABS:
17823       if (!FLOAT_MODE_P (mode))
17824         {
17825           *total = COSTS_N_INSNS (1);
17826           return false;
17827         }
17828       /* FALLTHRU */
17829
17830     case FLOAT:
17831     case UNSIGNED_FLOAT:
17832     case FIX:
17833     case UNSIGNED_FIX:
17834     case FLOAT_EXTEND:
17835     case FLOAT_TRUNCATE:
17836       *total = rs6000_cost->fp;
17837       return false;
17838
17839     case UNSPEC:
17840       switch (XINT (x, 1))
17841         {
17842         case UNSPEC_FRSP:
17843           *total = rs6000_cost->fp;
17844           return true;
17845
17846         default:
17847           break;
17848         }
17849       break;
17850
17851     case CALL:
17852     case IF_THEN_ELSE:
17853       if (optimize_size)
17854         {
17855           *total = COSTS_N_INSNS (1);
17856           return true;
17857         }
17858       else if (FLOAT_MODE_P (mode)
17859                && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS)
17860         {
17861           *total = rs6000_cost->fp;
17862           return false;
17863         }
17864       break;
17865
17866     case EQ:
17867     case GTU:
17868     case LTU:
17869       /* Carry bit requires mode == Pmode.
17870          NEG or PLUS already counted so only add one.  */
17871       if (mode == Pmode
17872           && (outer_code == NEG || outer_code == PLUS))
17873         {
17874           *total = COSTS_N_INSNS (1);
17875           return true;
17876         }
17877       if (outer_code == SET)
17878         {
17879           if (XEXP (x, 1) == const0_rtx)
17880             {
17881               *total = COSTS_N_INSNS (2);
17882               return true;
17883             }
17884           else if (mode == Pmode)
17885             {
17886               *total = COSTS_N_INSNS (3);
17887               return false;
17888             }
17889         }
17890       /* FALLTHRU */
17891
17892     case GT:
17893     case LT:
17894     case UNORDERED:
17895       if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
17896         {
17897           *total = COSTS_N_INSNS (2);
17898           return true;
17899         }
17900       /* CC COMPARE.  */
17901       if (outer_code == COMPARE)
17902         {
17903           *total = 0;
17904           return true;
17905         }
17906       break;
17907
17908     default:
17909       break;
17910     }
17911
17912   return false;
17913 }
17914
17915 /* A C expression returning the cost of moving data from a register of class
17916    CLASS1 to one of CLASS2.  */
17917
17918 int
17919 rs6000_register_move_cost (enum machine_mode mode,
17920                            enum reg_class from, enum reg_class to)
17921 {
17922   /*  Moves from/to GENERAL_REGS.  */
17923   if (reg_classes_intersect_p (to, GENERAL_REGS)
17924       || reg_classes_intersect_p (from, GENERAL_REGS))
17925     {
17926       if (! reg_classes_intersect_p (to, GENERAL_REGS))
17927         from = to;
17928
17929       if (from == FLOAT_REGS || from == ALTIVEC_REGS)
17930         return (rs6000_memory_move_cost (mode, from, 0)
17931                 + rs6000_memory_move_cost (mode, GENERAL_REGS, 0));
17932
17933       /* It's more expensive to move CR_REGS than CR0_REGS because of the
17934          shift.  */
17935       else if (from == CR_REGS)
17936         return 4;
17937
17938       else
17939         /* A move will cost one instruction per GPR moved.  */
17940         return 2 * hard_regno_nregs[0][mode];
17941     }
17942
17943   /* Moving between two similar registers is just one instruction.  */
17944   else if (reg_classes_intersect_p (to, from))
17945     return mode == TFmode ? 4 : 2;
17946
17947   /* Everything else has to go through GENERAL_REGS.  */
17948   else
17949     return (rs6000_register_move_cost (mode, GENERAL_REGS, to)
17950             + rs6000_register_move_cost (mode, from, GENERAL_REGS));
17951 }
17952
17953 /* A C expressions returning the cost of moving data of MODE from a register to
17954    or from memory.  */
17955
17956 int
17957 rs6000_memory_move_cost (enum machine_mode mode, enum reg_class class,
17958                          int in ATTRIBUTE_UNUSED)
17959 {
17960   if (reg_classes_intersect_p (class, GENERAL_REGS))
17961     return 4 * hard_regno_nregs[0][mode];
17962   else if (reg_classes_intersect_p (class, FLOAT_REGS))
17963     return 4 * hard_regno_nregs[32][mode];
17964   else if (reg_classes_intersect_p (class, ALTIVEC_REGS))
17965     return 4 * hard_regno_nregs[FIRST_ALTIVEC_REGNO][mode];
17966   else
17967     return 4 + rs6000_register_move_cost (mode, class, GENERAL_REGS);
17968 }
17969
17970 /* Newton-Raphson approximation of single-precision floating point divide n/d.
17971    Assumes no trapping math and finite arguments.  */
17972
17973 void
17974 rs6000_emit_swdivsf (rtx res, rtx n, rtx d)
17975 {
17976   rtx x0, e0, e1, y1, u0, v0, one;
17977
17978   x0 = gen_reg_rtx (SFmode);
17979   e0 = gen_reg_rtx (SFmode);
17980   e1 = gen_reg_rtx (SFmode);
17981   y1 = gen_reg_rtx (SFmode);
17982   u0 = gen_reg_rtx (SFmode);
17983   v0 = gen_reg_rtx (SFmode);
17984   one = force_reg (SFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, SFmode));
17985
17986   /* x0 = 1./d estimate */
17987   emit_insn (gen_rtx_SET (VOIDmode, x0,
17988                           gen_rtx_UNSPEC (SFmode, gen_rtvec (1, d),
17989                                           UNSPEC_FRES)));
17990   /* e0 = 1. - d * x0 */
17991   emit_insn (gen_rtx_SET (VOIDmode, e0,
17992                           gen_rtx_MINUS (SFmode, one,
17993                                          gen_rtx_MULT (SFmode, d, x0))));
17994   /* e1 = e0 + e0 * e0 */
17995   emit_insn (gen_rtx_SET (VOIDmode, e1,
17996                           gen_rtx_PLUS (SFmode,
17997                                         gen_rtx_MULT (SFmode, e0, e0), e0)));
17998   /* y1 = x0 + e1 * x0 */
17999   emit_insn (gen_rtx_SET (VOIDmode, y1,
18000                           gen_rtx_PLUS (SFmode,
18001                                         gen_rtx_MULT (SFmode, e1, x0), x0)));
18002   /* u0 = n * y1 */
18003   emit_insn (gen_rtx_SET (VOIDmode, u0,
18004                           gen_rtx_MULT (SFmode, n, y1)));
18005   /* v0 = n - d * u0 */
18006   emit_insn (gen_rtx_SET (VOIDmode, v0,
18007                           gen_rtx_MINUS (SFmode, n,
18008                                          gen_rtx_MULT (SFmode, d, u0))));
18009   /* res = u0 + v0 * y1 */
18010   emit_insn (gen_rtx_SET (VOIDmode, res,
18011                           gen_rtx_PLUS (SFmode,
18012                                         gen_rtx_MULT (SFmode, v0, y1), u0)));
18013 }
18014
18015 /* Newton-Raphson approximation of double-precision floating point divide n/d.
18016    Assumes no trapping math and finite arguments.  */
18017
18018 void
18019 rs6000_emit_swdivdf (rtx res, rtx n, rtx d)
18020 {
18021   rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
18022
18023   x0 = gen_reg_rtx (DFmode);
18024   e0 = gen_reg_rtx (DFmode);
18025   e1 = gen_reg_rtx (DFmode);
18026   e2 = gen_reg_rtx (DFmode);
18027   y1 = gen_reg_rtx (DFmode);
18028   y2 = gen_reg_rtx (DFmode);
18029   y3 = gen_reg_rtx (DFmode);
18030   u0 = gen_reg_rtx (DFmode);
18031   v0 = gen_reg_rtx (DFmode);
18032   one = force_reg (DFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, DFmode));
18033
18034   /* x0 = 1./d estimate */
18035   emit_insn (gen_rtx_SET (VOIDmode, x0,
18036                           gen_rtx_UNSPEC (DFmode, gen_rtvec (1, d),
18037                                           UNSPEC_FRES)));
18038   /* e0 = 1. - d * x0 */
18039   emit_insn (gen_rtx_SET (VOIDmode, e0,
18040                           gen_rtx_MINUS (DFmode, one,
18041                                          gen_rtx_MULT (SFmode, d, x0))));
18042   /* y1 = x0 + e0 * x0 */
18043   emit_insn (gen_rtx_SET (VOIDmode, y1,
18044                           gen_rtx_PLUS (DFmode,
18045                                         gen_rtx_MULT (DFmode, e0, x0), x0)));
18046   /* e1 = e0 * e0 */
18047   emit_insn (gen_rtx_SET (VOIDmode, e1,
18048                           gen_rtx_MULT (DFmode, e0, e0)));
18049   /* y2 = y1 + e1 * y1 */
18050   emit_insn (gen_rtx_SET (VOIDmode, y2,
18051                           gen_rtx_PLUS (DFmode,
18052                                         gen_rtx_MULT (DFmode, e1, y1), y1)));
18053   /* e2 = e1 * e1 */
18054   emit_insn (gen_rtx_SET (VOIDmode, e2,
18055                           gen_rtx_MULT (DFmode, e1, e1)));
18056   /* y3 = y2 + e2 * y2 */
18057   emit_insn (gen_rtx_SET (VOIDmode, y3,
18058                           gen_rtx_PLUS (DFmode,
18059                                         gen_rtx_MULT (DFmode, e2, y2), y2)));
18060   /* u0 = n * y3 */
18061   emit_insn (gen_rtx_SET (VOIDmode, u0,
18062                           gen_rtx_MULT (DFmode, n, y3)));
18063   /* v0 = n - d * u0 */
18064   emit_insn (gen_rtx_SET (VOIDmode, v0,
18065                           gen_rtx_MINUS (DFmode, n,
18066                                          gen_rtx_MULT (DFmode, d, u0))));
18067   /* res = u0 + v0 * y3 */
18068   emit_insn (gen_rtx_SET (VOIDmode, res,
18069                           gen_rtx_PLUS (DFmode,
18070                                         gen_rtx_MULT (DFmode, v0, y3), u0)));
18071 }
18072
18073 /* Return an RTX representing where to find the function value of a
18074    function returning MODE.  */
18075 static rtx
18076 rs6000_complex_function_value (enum machine_mode mode)
18077 {
18078   unsigned int regno;
18079   rtx r1, r2;
18080   enum machine_mode inner = GET_MODE_INNER (mode);
18081   unsigned int inner_bytes = GET_MODE_SIZE (inner);
18082
18083   if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
18084     regno = FP_ARG_RETURN;
18085   else
18086     {
18087       regno = GP_ARG_RETURN;
18088
18089       /* 32-bit is OK since it'll go in r3/r4.  */
18090       if (TARGET_32BIT && inner_bytes >= 4)
18091         return gen_rtx_REG (mode, regno);
18092     }
18093
18094   if (inner_bytes >= 8)
18095     return gen_rtx_REG (mode, regno);
18096
18097   r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
18098                           const0_rtx);
18099   r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
18100                           GEN_INT (inner_bytes));
18101   return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
18102 }
18103
18104 /* Define how to find the value returned by a function.
18105    VALTYPE is the data type of the value (as a tree).
18106    If the precise function being called is known, FUNC is its FUNCTION_DECL;
18107    otherwise, FUNC is 0.
18108
18109    On the SPE, both FPs and vectors are returned in r3.
18110
18111    On RS/6000 an integer value is in r3 and a floating-point value is in
18112    fp1, unless -msoft-float.  */
18113
18114 rtx
18115 rs6000_function_value (tree valtype, tree func ATTRIBUTE_UNUSED)
18116 {
18117   enum machine_mode mode;
18118   unsigned int regno;
18119
18120   /* Special handling for structs in darwin64.  */
18121   if (rs6000_darwin64_abi
18122       && TYPE_MODE (valtype) == BLKmode
18123       && TREE_CODE (valtype) == RECORD_TYPE
18124       && int_size_in_bytes (valtype) > 0)
18125     {
18126       CUMULATIVE_ARGS valcum;
18127       rtx valret;
18128
18129       valcum.words = 0;
18130       valcum.fregno = FP_ARG_MIN_REG;
18131       valcum.vregno = ALTIVEC_ARG_MIN_REG;
18132       /* Do a trial code generation as if this were going to be passed as
18133          an argument; if any part goes in memory, we return NULL.  */
18134       valret = rs6000_darwin64_record_arg (&valcum, valtype, 1, true);
18135       if (valret)
18136         return valret;
18137       /* Otherwise fall through to standard ABI rules.  */
18138     }
18139
18140   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DImode)
18141     {
18142       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
18143       return gen_rtx_PARALLEL (DImode,
18144         gen_rtvec (2,
18145                    gen_rtx_EXPR_LIST (VOIDmode,
18146                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
18147                                       const0_rtx),
18148                    gen_rtx_EXPR_LIST (VOIDmode,
18149                                       gen_rtx_REG (SImode,
18150                                                    GP_ARG_RETURN + 1),
18151                                       GEN_INT (4))));
18152     }
18153
18154   if ((INTEGRAL_TYPE_P (valtype)
18155        && TYPE_PRECISION (valtype) < BITS_PER_WORD)
18156       || POINTER_TYPE_P (valtype))
18157     mode = TARGET_32BIT ? SImode : DImode;
18158   else
18159     mode = TYPE_MODE (valtype);
18160
18161   if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS)
18162     regno = FP_ARG_RETURN;
18163   else if (TREE_CODE (valtype) == COMPLEX_TYPE
18164            && targetm.calls.split_complex_arg)
18165     return rs6000_complex_function_value (mode);
18166   else if (TREE_CODE (valtype) == VECTOR_TYPE
18167            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
18168            && ALTIVEC_VECTOR_MODE (mode))
18169     regno = ALTIVEC_ARG_RETURN;
18170   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
18171            && (mode == DFmode || mode == DCmode))
18172     return spe_build_register_parallel (mode, GP_ARG_RETURN);
18173   else
18174     regno = GP_ARG_RETURN;
18175
18176   return gen_rtx_REG (mode, regno);
18177 }
18178
18179 /* Define how to find the value returned by a library function
18180    assuming the value has mode MODE.  */
18181 rtx
18182 rs6000_libcall_value (enum machine_mode mode)
18183 {
18184   unsigned int regno;
18185
18186   if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
18187     {
18188       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
18189       return gen_rtx_PARALLEL (DImode,
18190         gen_rtvec (2,
18191                    gen_rtx_EXPR_LIST (VOIDmode,
18192                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
18193                                       const0_rtx),
18194                    gen_rtx_EXPR_LIST (VOIDmode,
18195                                       gen_rtx_REG (SImode,
18196                                                    GP_ARG_RETURN + 1),
18197                                       GEN_INT (4))));
18198     }
18199
18200   if (GET_MODE_CLASS (mode) == MODE_FLOAT
18201            && TARGET_HARD_FLOAT && TARGET_FPRS)
18202     regno = FP_ARG_RETURN;
18203   else if (ALTIVEC_VECTOR_MODE (mode)
18204            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
18205     regno = ALTIVEC_ARG_RETURN;
18206   else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
18207     return rs6000_complex_function_value (mode);
18208   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
18209            && (mode == DFmode || mode == DCmode))
18210     return spe_build_register_parallel (mode, GP_ARG_RETURN);
18211   else
18212     regno = GP_ARG_RETURN;
18213
18214   return gen_rtx_REG (mode, regno);
18215 }
18216
18217 /* Define the offset between two registers, FROM to be eliminated and its
18218    replacement TO, at the start of a routine.  */
18219 HOST_WIDE_INT
18220 rs6000_initial_elimination_offset (int from, int to)
18221 {
18222   rs6000_stack_t *info = rs6000_stack_info ();
18223   HOST_WIDE_INT offset;
18224
18225   if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
18226     offset = info->push_p ? 0 : -info->total_size;
18227   else if (from == ARG_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
18228     offset = info->total_size;
18229   else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
18230     offset = info->push_p ? info->total_size : 0;
18231   else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
18232     offset = 0;
18233   else
18234     gcc_unreachable ();
18235
18236   return offset;
18237 }
18238
18239 /* Return true if TYPE is a SPE or AltiVec opaque type.  */
18240
18241 static bool
18242 rs6000_is_opaque_type (tree type)
18243 {
18244   return (type == opaque_V2SI_type_node
18245               || type == opaque_V2SF_type_node
18246               || type == opaque_p_V2SI_type_node
18247               || type == opaque_V4SI_type_node);
18248 }
18249
18250 static rtx
18251 rs6000_dwarf_register_span (rtx reg)
18252 {
18253   unsigned regno;
18254
18255   if (TARGET_SPE
18256       && (SPE_VECTOR_MODE (GET_MODE (reg))
18257           || (TARGET_E500_DOUBLE && GET_MODE (reg) == DFmode)))
18258     ;
18259   else
18260     return NULL_RTX;
18261
18262   regno = REGNO (reg);
18263
18264   /* The duality of the SPE register size wreaks all kinds of havoc.
18265      This is a way of distinguishing r0 in 32-bits from r0 in
18266      64-bits.  */
18267   return
18268     gen_rtx_PARALLEL (VOIDmode,
18269                       BYTES_BIG_ENDIAN
18270                       ? gen_rtvec (2,
18271                                    gen_rtx_REG (SImode, regno + 1200),
18272                                    gen_rtx_REG (SImode, regno))
18273                       : gen_rtvec (2,
18274                                    gen_rtx_REG (SImode, regno),
18275                                    gen_rtx_REG (SImode, regno + 1200)));
18276 }
18277
18278 /* Map internal gcc register numbers to DWARF2 register numbers.  */
18279
18280 unsigned int
18281 rs6000_dbx_register_number (unsigned int regno)
18282 {
18283   if (regno <= 63 || write_symbols != DWARF2_DEBUG)
18284     return regno;
18285   if (regno == MQ_REGNO)
18286     return 100;
18287   if (regno == LINK_REGISTER_REGNUM)
18288     return 108;
18289   if (regno == COUNT_REGISTER_REGNUM)
18290     return 109;
18291   if (CR_REGNO_P (regno))
18292     return regno - CR0_REGNO + 86;
18293   if (regno == XER_REGNO)
18294     return 101;
18295   if (ALTIVEC_REGNO_P (regno))
18296     return regno - FIRST_ALTIVEC_REGNO + 1124;
18297   if (regno == VRSAVE_REGNO)
18298     return 356;
18299   if (regno == VSCR_REGNO)
18300     return 67;
18301   if (regno == SPE_ACC_REGNO)
18302     return 99;
18303   if (regno == SPEFSCR_REGNO)
18304     return 612;
18305   /* SPE high reg number.  We get these values of regno from
18306      rs6000_dwarf_register_span.  */
18307   gcc_assert (regno >= 1200 && regno < 1232);
18308   return regno;
18309 }
18310
18311 /* target hook eh_return_filter_mode */
18312 static enum machine_mode
18313 rs6000_eh_return_filter_mode (void)
18314 {
18315   return TARGET_32BIT ? SImode : word_mode;
18316 }
18317
18318 /* Target hook for vector_mode_supported_p.  */
18319 static bool
18320 rs6000_vector_mode_supported_p (enum machine_mode mode)
18321 {
18322
18323   if (TARGET_SPE && SPE_VECTOR_MODE (mode))
18324     return true;
18325
18326   else if (TARGET_ALTIVEC && ALTIVEC_VECTOR_MODE (mode))
18327     return true;
18328
18329   else
18330     return false;
18331 }
18332
18333 /* Target hook for invalid_arg_for_unprototyped_fn. */ 
18334 static const char * 
18335 invalid_arg_for_unprototyped_fn (tree typelist, tree funcdecl, tree val)
18336 {
18337   return (!rs6000_darwin64_abi
18338           && typelist == 0
18339           && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
18340           && (funcdecl == NULL_TREE
18341               || (TREE_CODE (funcdecl) == FUNCTION_DECL
18342                   && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
18343           ? N_("AltiVec argument passed to unprototyped function")
18344           : NULL;
18345 }
18346
18347 #include "gt-rs6000.h"