OSDN Git Service

* config/rs6000/rs6000.c (rs6000_emit_prologue): Add REG_CFA_RESTORE
[pf3gnuchains/gcc-fork.git] / gcc / config / rs6000 / rs6000.c
1 /* Subroutines used for code generation on IBM RS/6000.
2    Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4    Free Software Foundation, Inc.
5    Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
6
7    This file is part of GCC.
8
9    GCC is free software; you can redistribute it and/or modify it
10    under the terms of the GNU General Public License as published
11    by the Free Software Foundation; either version 3, or (at your
12    option) any later version.
13
14    GCC is distributed in the hope that it will be useful, but WITHOUT
15    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
17    License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with GCC; see the file COPYING3.  If not see
21    <http://www.gnu.org/licenses/>.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "rtl.h"
28 #include "regs.h"
29 #include "hard-reg-set.h"
30 #include "insn-config.h"
31 #include "conditions.h"
32 #include "insn-attr.h"
33 #include "flags.h"
34 #include "recog.h"
35 #include "obstack.h"
36 #include "tree.h"
37 #include "expr.h"
38 #include "optabs.h"
39 #include "except.h"
40 #include "function.h"
41 #include "output.h"
42 #include "basic-block.h"
43 #include "integrate.h"
44 #include "diagnostic-core.h"
45 #include "toplev.h"
46 #include "ggc.h"
47 #include "hashtab.h"
48 #include "tm_p.h"
49 #include "target.h"
50 #include "target-def.h"
51 #include "common/common-target.h"
52 #include "langhooks.h"
53 #include "reload.h"
54 #include "cfglayout.h"
55 #include "cfgloop.h"
56 #include "sched-int.h"
57 #include "gimple.h"
58 #include "tree-flow.h"
59 #include "intl.h"
60 #include "params.h"
61 #include "tm-constrs.h"
62 #include "opts.h"
63 #if TARGET_XCOFF
64 #include "xcoffout.h"  /* get declarations of xcoff_*_section_name */
65 #endif
66 #if TARGET_MACHO
67 #include "gstab.h"  /* for N_SLINE */
68 #endif
69
70 #ifndef TARGET_NO_PROTOTYPE
71 #define TARGET_NO_PROTOTYPE 0
72 #endif
73
74 #define min(A,B)        ((A) < (B) ? (A) : (B))
75 #define max(A,B)        ((A) > (B) ? (A) : (B))
76
77 /* Structure used to define the rs6000 stack */
78 typedef struct rs6000_stack {
79   int reload_completed;         /* stack info won't change from here on */
80   int first_gp_reg_save;        /* first callee saved GP register used */
81   int first_fp_reg_save;        /* first callee saved FP register used */
82   int first_altivec_reg_save;   /* first callee saved AltiVec register used */
83   int lr_save_p;                /* true if the link reg needs to be saved */
84   int cr_save_p;                /* true if the CR reg needs to be saved */
85   unsigned int vrsave_mask;     /* mask of vec registers to save */
86   int push_p;                   /* true if we need to allocate stack space */
87   int calls_p;                  /* true if the function makes any calls */
88   int world_save_p;             /* true if we're saving *everything*:
89                                    r13-r31, cr, f14-f31, vrsave, v20-v31  */
90   enum rs6000_abi abi;          /* which ABI to use */
91   int gp_save_offset;           /* offset to save GP regs from initial SP */
92   int fp_save_offset;           /* offset to save FP regs from initial SP */
93   int altivec_save_offset;      /* offset to save AltiVec regs from initial SP */
94   int lr_save_offset;           /* offset to save LR from initial SP */
95   int cr_save_offset;           /* offset to save CR from initial SP */
96   int vrsave_save_offset;       /* offset to save VRSAVE from initial SP */
97   int spe_gp_save_offset;       /* offset to save spe 64-bit gprs  */
98   int varargs_save_offset;      /* offset to save the varargs registers */
99   int ehrd_offset;              /* offset to EH return data */
100   int reg_size;                 /* register size (4 or 8) */
101   HOST_WIDE_INT vars_size;      /* variable save area size */
102   int parm_size;                /* outgoing parameter size */
103   int save_size;                /* save area size */
104   int fixed_size;               /* fixed size of stack frame */
105   int gp_size;                  /* size of saved GP registers */
106   int fp_size;                  /* size of saved FP registers */
107   int altivec_size;             /* size of saved AltiVec registers */
108   int cr_size;                  /* size to hold CR if not in save_size */
109   int vrsave_size;              /* size to hold VRSAVE if not in save_size */
110   int altivec_padding_size;     /* size of altivec alignment padding if
111                                    not in save_size */
112   int spe_gp_size;              /* size of 64-bit GPR save size for SPE */
113   int spe_padding_size;
114   HOST_WIDE_INT total_size;     /* total bytes allocated for stack */
115   int spe_64bit_regs_used;
116   int savres_strategy;
117 } rs6000_stack_t;
118
119 /* A C structure for machine-specific, per-function data.
120    This is added to the cfun structure.  */
121 typedef struct GTY(()) machine_function
122 {
123   /* Some local-dynamic symbol.  */
124   const char *some_ld_name;
125   /* Whether the instruction chain has been scanned already.  */
126   int insn_chain_scanned_p;
127   /* Flags if __builtin_return_address (n) with n >= 1 was used.  */
128   int ra_needs_full_frame;
129   /* Flags if __builtin_return_address (0) was used.  */
130   int ra_need_lr;
131   /* Cache lr_save_p after expansion of builtin_eh_return.  */
132   int lr_save_state;
133   /* Whether we need to save the TOC to the reserved stack location in the
134      function prologue.  */
135   bool save_toc_in_prologue;
136   /* Offset from virtual_stack_vars_rtx to the start of the ABI_V4
137      varargs save area.  */
138   HOST_WIDE_INT varargs_save_offset;
139   /* Temporary stack slot to use for SDmode copies.  This slot is
140      64-bits wide and is allocated early enough so that the offset
141      does not overflow the 16-bit load/store offset field.  */
142   rtx sdmode_stack_slot;
143 } machine_function;
144
145 /* Support targetm.vectorize.builtin_mask_for_load.  */
146 static GTY(()) tree altivec_builtin_mask_for_load;
147
148 /* Set to nonzero once AIX common-mode calls have been defined.  */
149 static GTY(()) int common_mode_defined;
150
151 /* Label number of label created for -mrelocatable, to call to so we can
152    get the address of the GOT section */
153 static int rs6000_pic_labelno;
154
155 #ifdef USING_ELFOS_H
156 /* Counter for labels which are to be placed in .fixup.  */
157 int fixuplabelno = 0;
158 #endif
159
160 /* Whether to use variant of AIX ABI for PowerPC64 Linux.  */
161 int dot_symbols;
162
163 /* Specify the machine mode that pointers have.  After generation of rtl, the
164    compiler makes no further distinction between pointers and any other objects
165    of this machine mode.  The type is unsigned since not all things that
166    include rs6000.h also include machmode.h.  */
167 unsigned rs6000_pmode;
168
169 /* Width in bits of a pointer.  */
170 unsigned rs6000_pointer_size;
171
172 #ifdef HAVE_AS_GNU_ATTRIBUTE
173 /* Flag whether floating point values have been passed/returned.  */
174 static bool rs6000_passes_float;
175 /* Flag whether vector values have been passed/returned.  */
176 static bool rs6000_passes_vector;
177 /* Flag whether small (<= 8 byte) structures have been returned.  */
178 static bool rs6000_returns_struct;
179 #endif
180
181 /* Value is TRUE if register/mode pair is acceptable.  */
182 bool rs6000_hard_regno_mode_ok_p[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
183
184 /* Maximum number of registers needed for a given register class and mode.  */
185 unsigned char rs6000_class_max_nregs[NUM_MACHINE_MODES][LIM_REG_CLASSES];
186
187 /* How many registers are needed for a given register and mode.  */
188 unsigned char rs6000_hard_regno_nregs[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
189
190 /* Map register number to register class.  */
191 enum reg_class rs6000_regno_regclass[FIRST_PSEUDO_REGISTER];
192
193 /* Reload functions based on the type and the vector unit.  */
194 static enum insn_code rs6000_vector_reload[NUM_MACHINE_MODES][2];
195
196 static int dbg_cost_ctrl;
197
198 /* Built in types.  */
199 tree rs6000_builtin_types[RS6000_BTI_MAX];
200 tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
201
202 /* Flag to say the TOC is initialized */
203 int toc_initialized;
204 char toc_label_name[10];
205
206 /* Cached value of rs6000_variable_issue. This is cached in
207    rs6000_variable_issue hook and returned from rs6000_sched_reorder2.  */
208 static short cached_can_issue_more;
209
210 static GTY(()) section *read_only_data_section;
211 static GTY(()) section *private_data_section;
212 static GTY(()) section *read_only_private_data_section;
213 static GTY(()) section *sdata2_section;
214 static GTY(()) section *toc_section;
215
216 struct builtin_description
217 {
218   /* mask is not const because we're going to alter it below.  This
219      nonsense will go away when we rewrite the -march infrastructure
220      to give us more target flag bits.  */
221   unsigned int mask;
222   const enum insn_code icode;
223   const char *const name;
224   const enum rs6000_builtins code;
225 };
226
227 /* Describe the vector unit used for modes.  */
228 enum rs6000_vector rs6000_vector_unit[NUM_MACHINE_MODES];
229 enum rs6000_vector rs6000_vector_mem[NUM_MACHINE_MODES];
230
231 /* Register classes for various constraints that are based on the target
232    switches.  */
233 enum reg_class rs6000_constraints[RS6000_CONSTRAINT_MAX];
234
235 /* Describe the alignment of a vector.  */
236 int rs6000_vector_align[NUM_MACHINE_MODES];
237
238 /* Map selected modes to types for builtins.  */
239 static GTY(()) tree builtin_mode_to_type[MAX_MACHINE_MODE][2];
240
241 /* What modes to automatically generate reciprocal divide estimate (fre) and
242    reciprocal sqrt (frsqrte) for.  */
243 unsigned char rs6000_recip_bits[MAX_MACHINE_MODE];
244
245 /* Masks to determine which reciprocal esitmate instructions to generate
246    automatically.  */
247 enum rs6000_recip_mask {
248   RECIP_SF_DIV          = 0x001,        /* Use divide estimate */
249   RECIP_DF_DIV          = 0x002,
250   RECIP_V4SF_DIV        = 0x004,
251   RECIP_V2DF_DIV        = 0x008,
252
253   RECIP_SF_RSQRT        = 0x010,        /* Use reciprocal sqrt estimate.  */
254   RECIP_DF_RSQRT        = 0x020,
255   RECIP_V4SF_RSQRT      = 0x040,
256   RECIP_V2DF_RSQRT      = 0x080,
257
258   /* Various combination of flags for -mrecip=xxx.  */
259   RECIP_NONE            = 0,
260   RECIP_ALL             = (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
261                            | RECIP_V2DF_DIV | RECIP_SF_RSQRT | RECIP_DF_RSQRT
262                            | RECIP_V4SF_RSQRT | RECIP_V2DF_RSQRT),
263
264   RECIP_HIGH_PRECISION  = RECIP_ALL,
265
266   /* On low precision machines like the power5, don't enable double precision
267      reciprocal square root estimate, since it isn't accurate enough.  */
268   RECIP_LOW_PRECISION   = (RECIP_ALL & ~(RECIP_DF_RSQRT | RECIP_V2DF_RSQRT))
269 };
270
271 /* -mrecip options.  */
272 static struct
273 {
274   const char *string;           /* option name */
275   unsigned int mask;            /* mask bits to set */
276 } recip_options[] = {
277   { "all",       RECIP_ALL },
278   { "none",      RECIP_NONE },
279   { "div",       (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
280                   | RECIP_V2DF_DIV) },
281   { "divf",      (RECIP_SF_DIV | RECIP_V4SF_DIV) },
282   { "divd",      (RECIP_DF_DIV | RECIP_V2DF_DIV) },
283   { "rsqrt",     (RECIP_SF_RSQRT | RECIP_DF_RSQRT | RECIP_V4SF_RSQRT
284                   | RECIP_V2DF_RSQRT) },
285   { "rsqrtf",    (RECIP_SF_RSQRT | RECIP_V4SF_RSQRT) },
286   { "rsqrtd",    (RECIP_DF_RSQRT | RECIP_V2DF_RSQRT) },
287 };
288
289 /* 2 argument gen function typedef.  */
290 typedef rtx (*gen_2arg_fn_t) (rtx, rtx, rtx);
291
292 \f
293 /* Target cpu costs.  */
294
295 struct processor_costs {
296   const int mulsi;        /* cost of SImode multiplication.  */
297   const int mulsi_const;  /* cost of SImode multiplication by constant.  */
298   const int mulsi_const9; /* cost of SImode mult by short constant.  */
299   const int muldi;        /* cost of DImode multiplication.  */
300   const int divsi;        /* cost of SImode division.  */
301   const int divdi;        /* cost of DImode division.  */
302   const int fp;           /* cost of simple SFmode and DFmode insns.  */
303   const int dmul;         /* cost of DFmode multiplication (and fmadd).  */
304   const int sdiv;         /* cost of SFmode division (fdivs).  */
305   const int ddiv;         /* cost of DFmode division (fdiv).  */
306   const int cache_line_size;    /* cache line size in bytes. */
307   const int l1_cache_size;      /* size of l1 cache, in kilobytes.  */
308   const int l2_cache_size;      /* size of l2 cache, in kilobytes.  */
309   const int simultaneous_prefetches; /* number of parallel prefetch
310                                         operations.  */
311 };
312
313 const struct processor_costs *rs6000_cost;
314
315 /* Processor costs (relative to an add) */
316
317 /* Instruction size costs on 32bit processors.  */
318 static const
319 struct processor_costs size32_cost = {
320   COSTS_N_INSNS (1),    /* mulsi */
321   COSTS_N_INSNS (1),    /* mulsi_const */
322   COSTS_N_INSNS (1),    /* mulsi_const9 */
323   COSTS_N_INSNS (1),    /* muldi */
324   COSTS_N_INSNS (1),    /* divsi */
325   COSTS_N_INSNS (1),    /* divdi */
326   COSTS_N_INSNS (1),    /* fp */
327   COSTS_N_INSNS (1),    /* dmul */
328   COSTS_N_INSNS (1),    /* sdiv */
329   COSTS_N_INSNS (1),    /* ddiv */
330   32,
331   0,
332   0,
333   0,
334 };
335
336 /* Instruction size costs on 64bit processors.  */
337 static const
338 struct processor_costs size64_cost = {
339   COSTS_N_INSNS (1),    /* mulsi */
340   COSTS_N_INSNS (1),    /* mulsi_const */
341   COSTS_N_INSNS (1),    /* mulsi_const9 */
342   COSTS_N_INSNS (1),    /* muldi */
343   COSTS_N_INSNS (1),    /* divsi */
344   COSTS_N_INSNS (1),    /* divdi */
345   COSTS_N_INSNS (1),    /* fp */
346   COSTS_N_INSNS (1),    /* dmul */
347   COSTS_N_INSNS (1),    /* sdiv */
348   COSTS_N_INSNS (1),    /* ddiv */
349   128,
350   0,
351   0,
352   0,
353 };
354
355 /* Instruction costs on RIOS1 processors.  */
356 static const
357 struct processor_costs rios1_cost = {
358   COSTS_N_INSNS (5),    /* mulsi */
359   COSTS_N_INSNS (4),    /* mulsi_const */
360   COSTS_N_INSNS (3),    /* mulsi_const9 */
361   COSTS_N_INSNS (5),    /* muldi */
362   COSTS_N_INSNS (19),   /* divsi */
363   COSTS_N_INSNS (19),   /* divdi */
364   COSTS_N_INSNS (2),    /* fp */
365   COSTS_N_INSNS (2),    /* dmul */
366   COSTS_N_INSNS (19),   /* sdiv */
367   COSTS_N_INSNS (19),   /* ddiv */
368   128,                  /* cache line size */
369   64,                   /* l1 cache */
370   512,                  /* l2 cache */
371   0,                    /* streams */
372 };
373
374 /* Instruction costs on RIOS2 processors.  */
375 static const
376 struct processor_costs rios2_cost = {
377   COSTS_N_INSNS (2),    /* mulsi */
378   COSTS_N_INSNS (2),    /* mulsi_const */
379   COSTS_N_INSNS (2),    /* mulsi_const9 */
380   COSTS_N_INSNS (2),    /* muldi */
381   COSTS_N_INSNS (13),   /* divsi */
382   COSTS_N_INSNS (13),   /* divdi */
383   COSTS_N_INSNS (2),    /* fp */
384   COSTS_N_INSNS (2),    /* dmul */
385   COSTS_N_INSNS (17),   /* sdiv */
386   COSTS_N_INSNS (17),   /* ddiv */
387   256,                  /* cache line size */
388   256,                  /* l1 cache */
389   1024,                 /* l2 cache */
390   0,                    /* streams */
391 };
392
393 /* Instruction costs on RS64A processors.  */
394 static const
395 struct processor_costs rs64a_cost = {
396   COSTS_N_INSNS (20),   /* mulsi */
397   COSTS_N_INSNS (12),   /* mulsi_const */
398   COSTS_N_INSNS (8),    /* mulsi_const9 */
399   COSTS_N_INSNS (34),   /* muldi */
400   COSTS_N_INSNS (65),   /* divsi */
401   COSTS_N_INSNS (67),   /* divdi */
402   COSTS_N_INSNS (4),    /* fp */
403   COSTS_N_INSNS (4),    /* dmul */
404   COSTS_N_INSNS (31),   /* sdiv */
405   COSTS_N_INSNS (31),   /* ddiv */
406   128,                  /* cache line size */
407   128,                  /* l1 cache */
408   2048,                 /* l2 cache */
409   1,                    /* streams */
410 };
411
412 /* Instruction costs on MPCCORE processors.  */
413 static const
414 struct processor_costs mpccore_cost = {
415   COSTS_N_INSNS (2),    /* mulsi */
416   COSTS_N_INSNS (2),    /* mulsi_const */
417   COSTS_N_INSNS (2),    /* mulsi_const9 */
418   COSTS_N_INSNS (2),    /* muldi */
419   COSTS_N_INSNS (6),    /* divsi */
420   COSTS_N_INSNS (6),    /* divdi */
421   COSTS_N_INSNS (4),    /* fp */
422   COSTS_N_INSNS (5),    /* dmul */
423   COSTS_N_INSNS (10),   /* sdiv */
424   COSTS_N_INSNS (17),   /* ddiv */
425   32,                   /* cache line size */
426   4,                    /* l1 cache */
427   16,                   /* l2 cache */
428   1,                    /* streams */
429 };
430
431 /* Instruction costs on PPC403 processors.  */
432 static const
433 struct processor_costs ppc403_cost = {
434   COSTS_N_INSNS (4),    /* mulsi */
435   COSTS_N_INSNS (4),    /* mulsi_const */
436   COSTS_N_INSNS (4),    /* mulsi_const9 */
437   COSTS_N_INSNS (4),    /* muldi */
438   COSTS_N_INSNS (33),   /* divsi */
439   COSTS_N_INSNS (33),   /* divdi */
440   COSTS_N_INSNS (11),   /* fp */
441   COSTS_N_INSNS (11),   /* dmul */
442   COSTS_N_INSNS (11),   /* sdiv */
443   COSTS_N_INSNS (11),   /* ddiv */
444   32,                   /* cache line size */
445   4,                    /* l1 cache */
446   16,                   /* l2 cache */
447   1,                    /* streams */
448 };
449
450 /* Instruction costs on PPC405 processors.  */
451 static const
452 struct processor_costs ppc405_cost = {
453   COSTS_N_INSNS (5),    /* mulsi */
454   COSTS_N_INSNS (4),    /* mulsi_const */
455   COSTS_N_INSNS (3),    /* mulsi_const9 */
456   COSTS_N_INSNS (5),    /* muldi */
457   COSTS_N_INSNS (35),   /* divsi */
458   COSTS_N_INSNS (35),   /* divdi */
459   COSTS_N_INSNS (11),   /* fp */
460   COSTS_N_INSNS (11),   /* dmul */
461   COSTS_N_INSNS (11),   /* sdiv */
462   COSTS_N_INSNS (11),   /* ddiv */
463   32,                   /* cache line size */
464   16,                   /* l1 cache */
465   128,                  /* l2 cache */
466   1,                    /* streams */
467 };
468
469 /* Instruction costs on PPC440 processors.  */
470 static const
471 struct processor_costs ppc440_cost = {
472   COSTS_N_INSNS (3),    /* mulsi */
473   COSTS_N_INSNS (2),    /* mulsi_const */
474   COSTS_N_INSNS (2),    /* mulsi_const9 */
475   COSTS_N_INSNS (3),    /* muldi */
476   COSTS_N_INSNS (34),   /* divsi */
477   COSTS_N_INSNS (34),   /* divdi */
478   COSTS_N_INSNS (5),    /* fp */
479   COSTS_N_INSNS (5),    /* dmul */
480   COSTS_N_INSNS (19),   /* sdiv */
481   COSTS_N_INSNS (33),   /* ddiv */
482   32,                   /* cache line size */
483   32,                   /* l1 cache */
484   256,                  /* l2 cache */
485   1,                    /* streams */
486 };
487
488 /* Instruction costs on PPC476 processors.  */
489 static const
490 struct processor_costs ppc476_cost = {
491   COSTS_N_INSNS (4),    /* mulsi */
492   COSTS_N_INSNS (4),    /* mulsi_const */
493   COSTS_N_INSNS (4),    /* mulsi_const9 */
494   COSTS_N_INSNS (4),    /* muldi */
495   COSTS_N_INSNS (11),   /* divsi */
496   COSTS_N_INSNS (11),   /* divdi */
497   COSTS_N_INSNS (6),    /* fp */
498   COSTS_N_INSNS (6),    /* dmul */
499   COSTS_N_INSNS (19),   /* sdiv */
500   COSTS_N_INSNS (33),   /* ddiv */
501   32,                   /* l1 cache line size */
502   32,                   /* l1 cache */
503   512,                  /* l2 cache */
504   1,                    /* streams */
505 };
506
507 /* Instruction costs on PPC601 processors.  */
508 static const
509 struct processor_costs ppc601_cost = {
510   COSTS_N_INSNS (5),    /* mulsi */
511   COSTS_N_INSNS (5),    /* mulsi_const */
512   COSTS_N_INSNS (5),    /* mulsi_const9 */
513   COSTS_N_INSNS (5),    /* muldi */
514   COSTS_N_INSNS (36),   /* divsi */
515   COSTS_N_INSNS (36),   /* divdi */
516   COSTS_N_INSNS (4),    /* fp */
517   COSTS_N_INSNS (5),    /* dmul */
518   COSTS_N_INSNS (17),   /* sdiv */
519   COSTS_N_INSNS (31),   /* ddiv */
520   32,                   /* cache line size */
521   32,                   /* l1 cache */
522   256,                  /* l2 cache */
523   1,                    /* streams */
524 };
525
526 /* Instruction costs on PPC603 processors.  */
527 static const
528 struct processor_costs ppc603_cost = {
529   COSTS_N_INSNS (5),    /* mulsi */
530   COSTS_N_INSNS (3),    /* mulsi_const */
531   COSTS_N_INSNS (2),    /* mulsi_const9 */
532   COSTS_N_INSNS (5),    /* muldi */
533   COSTS_N_INSNS (37),   /* divsi */
534   COSTS_N_INSNS (37),   /* divdi */
535   COSTS_N_INSNS (3),    /* fp */
536   COSTS_N_INSNS (4),    /* dmul */
537   COSTS_N_INSNS (18),   /* sdiv */
538   COSTS_N_INSNS (33),   /* ddiv */
539   32,                   /* cache line size */
540   8,                    /* l1 cache */
541   64,                   /* l2 cache */
542   1,                    /* streams */
543 };
544
545 /* Instruction costs on PPC604 processors.  */
546 static const
547 struct processor_costs ppc604_cost = {
548   COSTS_N_INSNS (4),    /* mulsi */
549   COSTS_N_INSNS (4),    /* mulsi_const */
550   COSTS_N_INSNS (4),    /* mulsi_const9 */
551   COSTS_N_INSNS (4),    /* muldi */
552   COSTS_N_INSNS (20),   /* divsi */
553   COSTS_N_INSNS (20),   /* divdi */
554   COSTS_N_INSNS (3),    /* fp */
555   COSTS_N_INSNS (3),    /* dmul */
556   COSTS_N_INSNS (18),   /* sdiv */
557   COSTS_N_INSNS (32),   /* ddiv */
558   32,                   /* cache line size */
559   16,                   /* l1 cache */
560   512,                  /* l2 cache */
561   1,                    /* streams */
562 };
563
564 /* Instruction costs on PPC604e processors.  */
565 static const
566 struct processor_costs ppc604e_cost = {
567   COSTS_N_INSNS (2),    /* mulsi */
568   COSTS_N_INSNS (2),    /* mulsi_const */
569   COSTS_N_INSNS (2),    /* mulsi_const9 */
570   COSTS_N_INSNS (2),    /* muldi */
571   COSTS_N_INSNS (20),   /* divsi */
572   COSTS_N_INSNS (20),   /* divdi */
573   COSTS_N_INSNS (3),    /* fp */
574   COSTS_N_INSNS (3),    /* dmul */
575   COSTS_N_INSNS (18),   /* sdiv */
576   COSTS_N_INSNS (32),   /* ddiv */
577   32,                   /* cache line size */
578   32,                   /* l1 cache */
579   1024,                 /* l2 cache */
580   1,                    /* streams */
581 };
582
583 /* Instruction costs on PPC620 processors.  */
584 static const
585 struct processor_costs ppc620_cost = {
586   COSTS_N_INSNS (5),    /* mulsi */
587   COSTS_N_INSNS (4),    /* mulsi_const */
588   COSTS_N_INSNS (3),    /* mulsi_const9 */
589   COSTS_N_INSNS (7),    /* muldi */
590   COSTS_N_INSNS (21),   /* divsi */
591   COSTS_N_INSNS (37),   /* divdi */
592   COSTS_N_INSNS (3),    /* fp */
593   COSTS_N_INSNS (3),    /* dmul */
594   COSTS_N_INSNS (18),   /* sdiv */
595   COSTS_N_INSNS (32),   /* ddiv */
596   128,                  /* cache line size */
597   32,                   /* l1 cache */
598   1024,                 /* l2 cache */
599   1,                    /* streams */
600 };
601
602 /* Instruction costs on PPC630 processors.  */
603 static const
604 struct processor_costs ppc630_cost = {
605   COSTS_N_INSNS (5),    /* mulsi */
606   COSTS_N_INSNS (4),    /* mulsi_const */
607   COSTS_N_INSNS (3),    /* mulsi_const9 */
608   COSTS_N_INSNS (7),    /* muldi */
609   COSTS_N_INSNS (21),   /* divsi */
610   COSTS_N_INSNS (37),   /* divdi */
611   COSTS_N_INSNS (3),    /* fp */
612   COSTS_N_INSNS (3),    /* dmul */
613   COSTS_N_INSNS (17),   /* sdiv */
614   COSTS_N_INSNS (21),   /* ddiv */
615   128,                  /* cache line size */
616   64,                   /* l1 cache */
617   1024,                 /* l2 cache */
618   1,                    /* streams */
619 };
620
621 /* Instruction costs on Cell processor.  */
622 /* COSTS_N_INSNS (1) ~ one add.  */
623 static const
624 struct processor_costs ppccell_cost = {
625   COSTS_N_INSNS (9/2)+2,    /* mulsi */
626   COSTS_N_INSNS (6/2),    /* mulsi_const */
627   COSTS_N_INSNS (6/2),    /* mulsi_const9 */
628   COSTS_N_INSNS (15/2)+2,   /* muldi */
629   COSTS_N_INSNS (38/2),   /* divsi */
630   COSTS_N_INSNS (70/2),   /* divdi */
631   COSTS_N_INSNS (10/2),   /* fp */
632   COSTS_N_INSNS (10/2),   /* dmul */
633   COSTS_N_INSNS (74/2),   /* sdiv */
634   COSTS_N_INSNS (74/2),   /* ddiv */
635   128,                  /* cache line size */
636   32,                   /* l1 cache */
637   512,                  /* l2 cache */
638   6,                    /* streams */
639 };
640
641 /* Instruction costs on PPC750 and PPC7400 processors.  */
642 static const
643 struct processor_costs ppc750_cost = {
644   COSTS_N_INSNS (5),    /* mulsi */
645   COSTS_N_INSNS (3),    /* mulsi_const */
646   COSTS_N_INSNS (2),    /* mulsi_const9 */
647   COSTS_N_INSNS (5),    /* muldi */
648   COSTS_N_INSNS (17),   /* divsi */
649   COSTS_N_INSNS (17),   /* divdi */
650   COSTS_N_INSNS (3),    /* fp */
651   COSTS_N_INSNS (3),    /* dmul */
652   COSTS_N_INSNS (17),   /* sdiv */
653   COSTS_N_INSNS (31),   /* ddiv */
654   32,                   /* cache line size */
655   32,                   /* l1 cache */
656   512,                  /* l2 cache */
657   1,                    /* streams */
658 };
659
660 /* Instruction costs on PPC7450 processors.  */
661 static const
662 struct processor_costs ppc7450_cost = {
663   COSTS_N_INSNS (4),    /* mulsi */
664   COSTS_N_INSNS (3),    /* mulsi_const */
665   COSTS_N_INSNS (3),    /* mulsi_const9 */
666   COSTS_N_INSNS (4),    /* muldi */
667   COSTS_N_INSNS (23),   /* divsi */
668   COSTS_N_INSNS (23),   /* divdi */
669   COSTS_N_INSNS (5),    /* fp */
670   COSTS_N_INSNS (5),    /* dmul */
671   COSTS_N_INSNS (21),   /* sdiv */
672   COSTS_N_INSNS (35),   /* ddiv */
673   32,                   /* cache line size */
674   32,                   /* l1 cache */
675   1024,                 /* l2 cache */
676   1,                    /* streams */
677 };
678
679 /* Instruction costs on PPC8540 processors.  */
680 static const
681 struct processor_costs ppc8540_cost = {
682   COSTS_N_INSNS (4),    /* mulsi */
683   COSTS_N_INSNS (4),    /* mulsi_const */
684   COSTS_N_INSNS (4),    /* mulsi_const9 */
685   COSTS_N_INSNS (4),    /* muldi */
686   COSTS_N_INSNS (19),   /* divsi */
687   COSTS_N_INSNS (19),   /* divdi */
688   COSTS_N_INSNS (4),    /* fp */
689   COSTS_N_INSNS (4),    /* dmul */
690   COSTS_N_INSNS (29),   /* sdiv */
691   COSTS_N_INSNS (29),   /* ddiv */
692   32,                   /* cache line size */
693   32,                   /* l1 cache */
694   256,                  /* l2 cache */
695   1,                    /* prefetch streams /*/
696 };
697
698 /* Instruction costs on E300C2 and E300C3 cores.  */
699 static const
700 struct processor_costs ppce300c2c3_cost = {
701   COSTS_N_INSNS (4),    /* mulsi */
702   COSTS_N_INSNS (4),    /* mulsi_const */
703   COSTS_N_INSNS (4),    /* mulsi_const9 */
704   COSTS_N_INSNS (4),    /* muldi */
705   COSTS_N_INSNS (19),   /* divsi */
706   COSTS_N_INSNS (19),   /* divdi */
707   COSTS_N_INSNS (3),    /* fp */
708   COSTS_N_INSNS (4),    /* dmul */
709   COSTS_N_INSNS (18),   /* sdiv */
710   COSTS_N_INSNS (33),   /* ddiv */
711   32,
712   16,                   /* l1 cache */
713   16,                   /* l2 cache */
714   1,                    /* prefetch streams /*/
715 };
716
717 /* Instruction costs on PPCE500MC processors.  */
718 static const
719 struct processor_costs ppce500mc_cost = {
720   COSTS_N_INSNS (4),    /* mulsi */
721   COSTS_N_INSNS (4),    /* mulsi_const */
722   COSTS_N_INSNS (4),    /* mulsi_const9 */
723   COSTS_N_INSNS (4),    /* muldi */
724   COSTS_N_INSNS (14),   /* divsi */
725   COSTS_N_INSNS (14),   /* divdi */
726   COSTS_N_INSNS (8),    /* fp */
727   COSTS_N_INSNS (10),   /* dmul */
728   COSTS_N_INSNS (36),   /* sdiv */
729   COSTS_N_INSNS (66),   /* ddiv */
730   64,                   /* cache line size */
731   32,                   /* l1 cache */
732   128,                  /* l2 cache */
733   1,                    /* prefetch streams /*/
734 };
735
736 /* Instruction costs on PPCE500MC64 processors.  */
737 static const
738 struct processor_costs ppce500mc64_cost = {
739   COSTS_N_INSNS (4),    /* mulsi */
740   COSTS_N_INSNS (4),    /* mulsi_const */
741   COSTS_N_INSNS (4),    /* mulsi_const9 */
742   COSTS_N_INSNS (4),    /* muldi */
743   COSTS_N_INSNS (14),   /* divsi */
744   COSTS_N_INSNS (14),   /* divdi */
745   COSTS_N_INSNS (4),    /* fp */
746   COSTS_N_INSNS (10),   /* dmul */
747   COSTS_N_INSNS (36),   /* sdiv */
748   COSTS_N_INSNS (66),   /* ddiv */
749   64,                   /* cache line size */
750   32,                   /* l1 cache */
751   128,                  /* l2 cache */
752   1,                    /* prefetch streams /*/
753 };
754
755 /* Instruction costs on AppliedMicro Titan processors.  */
756 static const
757 struct processor_costs titan_cost = {
758   COSTS_N_INSNS (5),    /* mulsi */
759   COSTS_N_INSNS (5),    /* mulsi_const */
760   COSTS_N_INSNS (5),    /* mulsi_const9 */
761   COSTS_N_INSNS (5),    /* muldi */
762   COSTS_N_INSNS (18),   /* divsi */
763   COSTS_N_INSNS (18),   /* divdi */
764   COSTS_N_INSNS (10),   /* fp */
765   COSTS_N_INSNS (10),   /* dmul */
766   COSTS_N_INSNS (46),   /* sdiv */
767   COSTS_N_INSNS (72),   /* ddiv */
768   32,                   /* cache line size */
769   32,                   /* l1 cache */
770   512,                  /* l2 cache */
771   1,                    /* prefetch streams /*/
772 };
773
774 /* Instruction costs on POWER4 and POWER5 processors.  */
775 static const
776 struct processor_costs power4_cost = {
777   COSTS_N_INSNS (3),    /* mulsi */
778   COSTS_N_INSNS (2),    /* mulsi_const */
779   COSTS_N_INSNS (2),    /* mulsi_const9 */
780   COSTS_N_INSNS (4),    /* muldi */
781   COSTS_N_INSNS (18),   /* divsi */
782   COSTS_N_INSNS (34),   /* divdi */
783   COSTS_N_INSNS (3),    /* fp */
784   COSTS_N_INSNS (3),    /* dmul */
785   COSTS_N_INSNS (17),   /* sdiv */
786   COSTS_N_INSNS (17),   /* ddiv */
787   128,                  /* cache line size */
788   32,                   /* l1 cache */
789   1024,                 /* l2 cache */
790   8,                    /* prefetch streams /*/
791 };
792
793 /* Instruction costs on POWER6 processors.  */
794 static const
795 struct processor_costs power6_cost = {
796   COSTS_N_INSNS (8),    /* mulsi */
797   COSTS_N_INSNS (8),    /* mulsi_const */
798   COSTS_N_INSNS (8),    /* mulsi_const9 */
799   COSTS_N_INSNS (8),    /* muldi */
800   COSTS_N_INSNS (22),   /* divsi */
801   COSTS_N_INSNS (28),   /* divdi */
802   COSTS_N_INSNS (3),    /* fp */
803   COSTS_N_INSNS (3),    /* dmul */
804   COSTS_N_INSNS (13),   /* sdiv */
805   COSTS_N_INSNS (16),   /* ddiv */
806   128,                  /* cache line size */
807   64,                   /* l1 cache */
808   2048,                 /* l2 cache */
809   16,                   /* prefetch streams */
810 };
811
812 /* Instruction costs on POWER7 processors.  */
813 static const
814 struct processor_costs power7_cost = {
815   COSTS_N_INSNS (2),    /* mulsi */
816   COSTS_N_INSNS (2),    /* mulsi_const */
817   COSTS_N_INSNS (2),    /* mulsi_const9 */
818   COSTS_N_INSNS (2),    /* muldi */
819   COSTS_N_INSNS (18),   /* divsi */
820   COSTS_N_INSNS (34),   /* divdi */
821   COSTS_N_INSNS (3),    /* fp */
822   COSTS_N_INSNS (3),    /* dmul */
823   COSTS_N_INSNS (13),   /* sdiv */
824   COSTS_N_INSNS (16),   /* ddiv */
825   128,                  /* cache line size */
826   32,                   /* l1 cache */
827   256,                  /* l2 cache */
828   12,                   /* prefetch streams */
829 };
830
831 /* Instruction costs on POWER A2 processors.  */
832 static const
833 struct processor_costs ppca2_cost = {
834   COSTS_N_INSNS (16),    /* mulsi */
835   COSTS_N_INSNS (16),    /* mulsi_const */
836   COSTS_N_INSNS (16),    /* mulsi_const9 */
837   COSTS_N_INSNS (16),   /* muldi */
838   COSTS_N_INSNS (22),   /* divsi */
839   COSTS_N_INSNS (28),   /* divdi */
840   COSTS_N_INSNS (3),    /* fp */
841   COSTS_N_INSNS (3),    /* dmul */
842   COSTS_N_INSNS (59),   /* sdiv */
843   COSTS_N_INSNS (72),   /* ddiv */
844   64,
845   16,                   /* l1 cache */
846   2048,                 /* l2 cache */
847   16,                   /* prefetch streams */
848 };
849
850 \f
851 /* Table that classifies rs6000 builtin functions (pure, const, etc.).  */
852 #undef RS6000_BUILTIN
853 #undef RS6000_BUILTIN_EQUATE
854 #define RS6000_BUILTIN(NAME, TYPE) TYPE,
855 #define RS6000_BUILTIN_EQUATE(NAME, VALUE)
856
857 static const enum rs6000_btc builtin_classify[(int)RS6000_BUILTIN_COUNT] =
858 {
859 #include "rs6000-builtin.def"
860 };
861
862 #undef RS6000_BUILTIN
863 #undef RS6000_BUILTIN_EQUATE
864
865 /* Support for -mveclibabi=<xxx> to control which vector library to use.  */
866 static tree (*rs6000_veclib_handler) (tree, tree, tree);
867
868 \f
869 static bool rs6000_function_ok_for_sibcall (tree, tree);
870 static const char *rs6000_invalid_within_doloop (const_rtx);
871 static bool rs6000_legitimate_address_p (enum machine_mode, rtx, bool);
872 static bool rs6000_debug_legitimate_address_p (enum machine_mode, rtx, bool);
873 static rtx rs6000_generate_compare (rtx, enum machine_mode);
874 static void rs6000_emit_stack_tie (void);
875 static bool spe_func_has_64bit_regs_p (void);
876 static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
877 static unsigned rs6000_hash_constant (rtx);
878 static unsigned toc_hash_function (const void *);
879 static int toc_hash_eq (const void *, const void *);
880 static bool reg_offset_addressing_ok_p (enum machine_mode);
881 static bool virtual_stack_registers_memory_p (rtx);
882 static bool constant_pool_expr_p (rtx);
883 static bool legitimate_small_data_p (enum machine_mode, rtx);
884 static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
885 static struct machine_function * rs6000_init_machine_status (void);
886 static bool rs6000_assemble_integer (rtx, unsigned int, int);
887 static bool no_global_regs_above (int, bool);
888 #if defined (HAVE_GAS_HIDDEN) && !defined (TARGET_MACHO)
889 static void rs6000_assemble_visibility (tree, int);
890 #endif
891 static int rs6000_ra_ever_killed (void);
892 static bool rs6000_attribute_takes_identifier_p (const_tree);
893 static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
894 static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
895 static bool rs6000_ms_bitfield_layout_p (const_tree);
896 static tree rs6000_handle_struct_attribute (tree *, tree, tree, int, bool *);
897 static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
898 static const char *rs6000_mangle_type (const_tree);
899 static void rs6000_set_default_type_attributes (tree);
900 static rtx rs6000_savres_routine_sym (rs6000_stack_t *, bool, bool, bool);
901 static rtx rs6000_emit_stack_reset (rs6000_stack_t *, rtx, rtx, int, bool);
902 static rtx rs6000_make_savres_rtx (rs6000_stack_t *, rtx, int,
903                                    enum machine_mode, bool, bool, bool);
904 static bool rs6000_reg_live_or_pic_offset_p (int);
905 static tree rs6000_builtin_vectorized_libmass (tree, tree, tree);
906 static tree rs6000_builtin_vectorized_function (tree, tree, tree);
907 static void rs6000_restore_saved_cr (rtx, int);
908 static bool rs6000_output_addr_const_extra (FILE *, rtx);
909 static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT);
910 static void rs6000_output_function_epilogue (FILE *, HOST_WIDE_INT);
911 static void rs6000_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
912                                     tree);
913 static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
914 static bool rs6000_return_in_memory (const_tree, const_tree);
915 static rtx rs6000_function_value (const_tree, const_tree, bool);
916 static void rs6000_file_start (void);
917 #if TARGET_ELF
918 static int rs6000_elf_reloc_rw_mask (void);
919 static void rs6000_elf_asm_out_constructor (rtx, int) ATTRIBUTE_UNUSED;
920 static void rs6000_elf_asm_out_destructor (rtx, int) ATTRIBUTE_UNUSED;
921 static void rs6000_elf_file_end (void) ATTRIBUTE_UNUSED;
922 static void rs6000_elf_asm_init_sections (void);
923 static section *rs6000_elf_select_rtx_section (enum machine_mode, rtx,
924                                                unsigned HOST_WIDE_INT);
925 static void rs6000_elf_encode_section_info (tree, rtx, int)
926      ATTRIBUTE_UNUSED;
927 #endif
928 static bool rs6000_use_blocks_for_constant_p (enum machine_mode, const_rtx);
929 static void rs6000_alloc_sdmode_stack_slot (void);
930 static void rs6000_instantiate_decls (void);
931 #if TARGET_XCOFF
932 static void rs6000_xcoff_asm_output_anchor (rtx);
933 static void rs6000_xcoff_asm_globalize_label (FILE *, const char *);
934 static void rs6000_xcoff_asm_init_sections (void);
935 static int rs6000_xcoff_reloc_rw_mask (void);
936 static void rs6000_xcoff_asm_named_section (const char *, unsigned int, tree);
937 static section *rs6000_xcoff_select_section (tree, int,
938                                              unsigned HOST_WIDE_INT);
939 static void rs6000_xcoff_unique_section (tree, int);
940 static section *rs6000_xcoff_select_rtx_section
941   (enum machine_mode, rtx, unsigned HOST_WIDE_INT);
942 static const char * rs6000_xcoff_strip_name_encoding (const char *);
943 static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
944 static void rs6000_xcoff_file_start (void);
945 static void rs6000_xcoff_file_end (void);
946 #endif
947 static int rs6000_variable_issue (FILE *, int, rtx, int);
948 static int rs6000_register_move_cost (enum machine_mode,
949                                       reg_class_t, reg_class_t);
950 static int rs6000_memory_move_cost (enum machine_mode, reg_class_t, bool);
951 static bool rs6000_rtx_costs (rtx, int, int, int *, bool);
952 static bool rs6000_debug_rtx_costs (rtx, int, int, int *, bool);
953 static int rs6000_debug_address_cost (rtx, bool);
954 static int rs6000_adjust_cost (rtx, rtx, rtx, int);
955 static int rs6000_debug_adjust_cost (rtx, rtx, rtx, int);
956 static void rs6000_sched_init (FILE *, int, int);
957 static bool is_microcoded_insn (rtx);
958 static bool is_nonpipeline_insn (rtx);
959 static bool is_cracked_insn (rtx);
960 static bool is_branch_slot_insn (rtx);
961 static bool is_load_insn (rtx);
962 static rtx get_store_dest (rtx pat);
963 static bool is_store_insn (rtx);
964 static bool set_to_load_agen (rtx,rtx);
965 static bool adjacent_mem_locations (rtx,rtx);
966 static int rs6000_adjust_priority (rtx, int);
967 static int rs6000_issue_rate (void);
968 static bool rs6000_is_costly_dependence (dep_t, int, int);
969 static rtx get_next_active_insn (rtx, rtx);
970 static bool insn_terminates_group_p (rtx , enum group_termination);
971 static bool insn_must_be_first_in_group (rtx);
972 static bool insn_must_be_last_in_group (rtx);
973 static bool is_costly_group (rtx *, rtx);
974 static int force_new_group (int, FILE *, rtx *, rtx, bool *, int, int *);
975 static int redefine_groups (FILE *, int, rtx, rtx);
976 static int pad_groups (FILE *, int, rtx, rtx);
977 static void rs6000_sched_finish (FILE *, int);
978 static int rs6000_sched_reorder (FILE *, int, rtx *, int *, int);
979 static int rs6000_sched_reorder2 (FILE *, int, rtx *, int *, int);
980 static int rs6000_use_sched_lookahead (void);
981 static int rs6000_use_sched_lookahead_guard (rtx);
982 static void * rs6000_alloc_sched_context (void);
983 static void rs6000_init_sched_context (void *, bool);
984 static void rs6000_set_sched_context (void *);
985 static void rs6000_free_sched_context (void *);
986 static tree rs6000_builtin_reciprocal (unsigned int, bool, bool);
987 static tree rs6000_builtin_mask_for_load (void);
988 static tree rs6000_builtin_mul_widen_even (tree);
989 static tree rs6000_builtin_mul_widen_odd (tree);
990 static tree rs6000_builtin_conversion (unsigned int, tree, tree);
991 static tree rs6000_builtin_vec_perm (tree, tree *);
992 static bool rs6000_builtin_support_vector_misalignment (enum
993                                                         machine_mode,
994                                                         const_tree,
995                                                         int, bool);
996 static int rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt,
997                                               tree, int);
998 static enum machine_mode rs6000_preferred_simd_mode (enum machine_mode);
999
1000 static void def_builtin (int, const char *, tree, int);
1001 static bool rs6000_vector_alignment_reachable (const_tree, bool);
1002 static void rs6000_init_builtins (void);
1003 static tree rs6000_builtin_decl (unsigned, bool);
1004
1005 static rtx rs6000_expand_unop_builtin (enum insn_code, tree, rtx);
1006 static rtx rs6000_expand_binop_builtin (enum insn_code, tree, rtx);
1007 static rtx rs6000_expand_ternop_builtin (enum insn_code, tree, rtx);
1008 static rtx rs6000_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
1009 static void altivec_init_builtins (void);
1010 static unsigned builtin_hash_function (const void *);
1011 static int builtin_hash_eq (const void *, const void *);
1012 static tree builtin_function_type (enum machine_mode, enum machine_mode,
1013                                    enum machine_mode, enum machine_mode,
1014                                    enum rs6000_builtins, const char *name);
1015 static void rs6000_common_init_builtins (void);
1016 static void rs6000_init_libfuncs (void);
1017
1018 static void paired_init_builtins (void);
1019 static rtx paired_expand_builtin (tree, rtx, bool *);
1020 static rtx paired_expand_lv_builtin (enum insn_code, tree, rtx);
1021 static rtx paired_expand_stv_builtin (enum insn_code, tree);
1022 static rtx paired_expand_predicate_builtin (enum insn_code, tree, rtx);
1023
1024 static void enable_mask_for_builtins (struct builtin_description *, int,
1025                                       enum rs6000_builtins,
1026                                       enum rs6000_builtins);
1027 static void spe_init_builtins (void);
1028 static rtx spe_expand_builtin (tree, rtx, bool *);
1029 static rtx spe_expand_stv_builtin (enum insn_code, tree);
1030 static rtx spe_expand_predicate_builtin (enum insn_code, tree, rtx);
1031 static rtx spe_expand_evsel_builtin (enum insn_code, tree, rtx);
1032 static int rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
1033 static rs6000_stack_t *rs6000_stack_info (void);
1034 static void debug_stack_info (rs6000_stack_t *);
1035
1036 static rtx altivec_expand_builtin (tree, rtx, bool *);
1037 static rtx altivec_expand_ld_builtin (tree, rtx, bool *);
1038 static rtx altivec_expand_st_builtin (tree, rtx, bool *);
1039 static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
1040 static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
1041 static rtx altivec_expand_predicate_builtin (enum insn_code, tree, rtx);
1042 static rtx altivec_expand_stv_builtin (enum insn_code, tree);
1043 static rtx altivec_expand_vec_init_builtin (tree, tree, rtx);
1044 static rtx altivec_expand_vec_set_builtin (tree);
1045 static rtx altivec_expand_vec_ext_builtin (tree, rtx);
1046 static int get_element_number (tree, tree);
1047 static void rs6000_option_override (void);
1048 static int rs6000_loop_align_max_skip (rtx);
1049 static int first_altivec_reg_to_save (void);
1050 static unsigned int compute_vrsave_mask (void);
1051 static void compute_save_world_info (rs6000_stack_t *info_ptr);
1052 static void is_altivec_return_reg (rtx, void *);
1053 static rtx generate_set_vrsave (rtx, rs6000_stack_t *, int);
1054 int easy_vector_constant (rtx, enum machine_mode);
1055 static rtx rs6000_dwarf_register_span (rtx);
1056 static void rs6000_init_dwarf_reg_sizes_extra (tree);
1057 static rtx rs6000_legitimize_address (rtx, rtx, enum machine_mode);
1058 static rtx rs6000_debug_legitimize_address (rtx, rtx, enum machine_mode);
1059 static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
1060 static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
1061 static rtx rs6000_delegitimize_address (rtx);
1062 static rtx rs6000_tls_get_addr (void);
1063 static rtx rs6000_got_sym (void);
1064 static int rs6000_tls_symbol_ref_1 (rtx *, void *);
1065 static const char *rs6000_get_some_local_dynamic_name (void);
1066 static int rs6000_get_some_local_dynamic_name_1 (rtx *, void *);
1067 static rtx rs6000_complex_function_value (enum machine_mode);
1068 static rtx rs6000_spe_function_arg (const CUMULATIVE_ARGS *,
1069                                     enum machine_mode, const_tree);
1070 static void rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *,
1071                                                       HOST_WIDE_INT, int);
1072 static void rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *,
1073                                                         const_tree,
1074                                                         HOST_WIDE_INT);
1075 static void rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *,
1076                                               HOST_WIDE_INT,
1077                                               rtx[], int *);
1078 static void rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *,
1079                                                 const_tree, HOST_WIDE_INT,
1080                                                 rtx[], int *);
1081 static rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, const_tree, bool, bool);
1082 static rtx rs6000_mixed_function_arg (enum machine_mode, const_tree, int);
1083 static void rs6000_function_arg_advance (cumulative_args_t, enum machine_mode,
1084                                          const_tree, bool);
1085 static rtx rs6000_function_arg (cumulative_args_t, enum machine_mode,
1086                                 const_tree, bool);
1087 static unsigned int rs6000_function_arg_boundary (enum machine_mode,
1088                                                   const_tree);
1089 static void rs6000_move_block_from_reg (int regno, rtx x, int nregs);
1090 static void setup_incoming_varargs (cumulative_args_t,
1091                                     enum machine_mode, tree,
1092                                     int *, int);
1093 static bool rs6000_pass_by_reference (cumulative_args_t, enum machine_mode,
1094                                       const_tree, bool);
1095 static int rs6000_arg_partial_bytes (cumulative_args_t, enum machine_mode,
1096                                      tree, bool);
1097 static const char *invalid_arg_for_unprototyped_fn (const_tree, const_tree, const_tree);
1098 #if TARGET_MACHO
1099 static void macho_branch_islands (void);
1100 static int no_previous_def (tree function_name);
1101 static tree get_prev_label (tree function_name);
1102 static void rs6000_darwin_file_start (void);
1103 #endif
1104
1105 static tree rs6000_build_builtin_va_list (void);
1106 static void rs6000_va_start (tree, rtx);
1107 static tree rs6000_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
1108 static bool rs6000_must_pass_in_stack (enum machine_mode, const_tree);
1109 static bool rs6000_scalar_mode_supported_p (enum machine_mode);
1110 static bool rs6000_vector_mode_supported_p (enum machine_mode);
1111 static rtx rs6000_emit_vector_compare_inner (enum rtx_code, rtx, rtx);
1112 static rtx rs6000_emit_vector_compare (enum rtx_code, rtx, rtx,
1113                                        enum machine_mode);
1114 static tree rs6000_stack_protect_fail (void);
1115
1116 static rtx rs6000_legitimize_reload_address (rtx, enum machine_mode, int, int,
1117                                              int, int *);
1118
1119 static rtx rs6000_debug_legitimize_reload_address (rtx, enum machine_mode, int,
1120                                                    int, int, int *);
1121
1122 rtx (*rs6000_legitimize_reload_address_ptr) (rtx, enum machine_mode, int, int,
1123                                              int, int *)
1124   = rs6000_legitimize_reload_address;
1125
1126 static bool rs6000_mode_dependent_address_p (const_rtx);
1127 static bool rs6000_mode_dependent_address (const_rtx);
1128 static bool rs6000_debug_mode_dependent_address (const_rtx);
1129 static bool (*rs6000_mode_dependent_address_ptr) (const_rtx)
1130   = rs6000_mode_dependent_address;
1131
1132 static enum reg_class rs6000_secondary_reload_class (enum reg_class,
1133                                                      enum machine_mode, rtx);
1134 static enum reg_class rs6000_debug_secondary_reload_class (enum reg_class,
1135                                                            enum machine_mode,
1136                                                            rtx);
1137 enum reg_class (*rs6000_secondary_reload_class_ptr) (enum reg_class,
1138                                                      enum machine_mode, rtx)
1139   = rs6000_secondary_reload_class;
1140
1141 static enum reg_class rs6000_preferred_reload_class (rtx, enum reg_class);
1142 static enum reg_class rs6000_debug_preferred_reload_class (rtx,
1143                                                            enum reg_class);
1144 enum reg_class (*rs6000_preferred_reload_class_ptr) (rtx, enum reg_class)
1145   = rs6000_preferred_reload_class;
1146
1147 static bool rs6000_secondary_memory_needed (enum reg_class, enum reg_class,
1148                                             enum machine_mode);
1149
1150 static bool rs6000_debug_secondary_memory_needed (enum reg_class,
1151                                                   enum reg_class,
1152                                                   enum machine_mode);
1153
1154 bool (*rs6000_secondary_memory_needed_ptr) (enum reg_class, enum reg_class,
1155                                             enum machine_mode)
1156   = rs6000_secondary_memory_needed;
1157
1158 static bool rs6000_cannot_change_mode_class (enum machine_mode,
1159                                              enum machine_mode,
1160                                              enum reg_class);
1161 static bool rs6000_debug_cannot_change_mode_class (enum machine_mode,
1162                                                    enum machine_mode,
1163                                                    enum reg_class);
1164
1165 bool (*rs6000_cannot_change_mode_class_ptr) (enum machine_mode,
1166                                              enum machine_mode,
1167                                              enum reg_class)
1168   = rs6000_cannot_change_mode_class;
1169
1170 static reg_class_t rs6000_secondary_reload (bool, rtx, reg_class_t,
1171                                             enum machine_mode,
1172                                             struct secondary_reload_info *);
1173
1174 const int INSN_NOT_AVAILABLE = -1;
1175 static enum machine_mode rs6000_eh_return_filter_mode (void);
1176 static bool rs6000_can_eliminate (const int, const int);
1177 static void rs6000_conditional_register_usage (void);
1178 static void rs6000_trampoline_init (rtx, tree, rtx);
1179 static bool rs6000_cannot_force_const_mem (enum machine_mode, rtx);
1180 static bool rs6000_legitimate_constant_p (enum machine_mode, rtx);
1181 static bool rs6000_save_toc_in_prologue_p (void);
1182
1183 /* Hash table stuff for keeping track of TOC entries.  */
1184
1185 struct GTY(()) toc_hash_struct
1186 {
1187   /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
1188      ASM_OUTPUT_SPECIAL_POOL_ENTRY_P.  */
1189   rtx key;
1190   enum machine_mode key_mode;
1191   int labelno;
1192 };
1193
1194 static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
1195
1196 /* Hash table to keep track of the argument types for builtin functions.  */
1197
1198 struct GTY(()) builtin_hash_struct
1199 {
1200   tree type;
1201   enum machine_mode mode[4];    /* return value + 3 arguments.  */
1202   unsigned char uns_p[4];       /* and whether the types are unsigned.  */
1203 };
1204
1205 static GTY ((param_is (struct builtin_hash_struct))) htab_t builtin_hash_table;
1206
1207 static bool rs6000_valid_attribute_p (tree, tree, tree, int);
1208 static void rs6000_function_specific_save (struct cl_target_option *);
1209 static void rs6000_function_specific_restore (struct cl_target_option *);
1210 static void rs6000_function_specific_print (FILE *, int,
1211                                             struct cl_target_option *);
1212 static bool rs6000_can_inline_p (tree, tree);
1213 static void rs6000_set_current_function (tree);
1214
1215 \f
1216 /* Default register names.  */
1217 char rs6000_reg_names[][8] =
1218 {
1219       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1220       "8",  "9", "10", "11", "12", "13", "14", "15",
1221      "16", "17", "18", "19", "20", "21", "22", "23",
1222      "24", "25", "26", "27", "28", "29", "30", "31",
1223       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1224       "8",  "9", "10", "11", "12", "13", "14", "15",
1225      "16", "17", "18", "19", "20", "21", "22", "23",
1226      "24", "25", "26", "27", "28", "29", "30", "31",
1227      "mq", "lr", "ctr","ap",
1228       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1229       "ca",
1230       /* AltiVec registers.  */
1231       "0",  "1",  "2",  "3",  "4",  "5",  "6", "7",
1232       "8",  "9",  "10", "11", "12", "13", "14", "15",
1233       "16", "17", "18", "19", "20", "21", "22", "23",
1234       "24", "25", "26", "27", "28", "29", "30", "31",
1235       "vrsave", "vscr",
1236       /* SPE registers.  */
1237       "spe_acc", "spefscr",
1238       /* Soft frame pointer.  */
1239       "sfp"
1240 };
1241
1242 #ifdef TARGET_REGNAMES
1243 static const char alt_reg_names[][8] =
1244 {
1245    "%r0",   "%r1",  "%r2",  "%r3",  "%r4",  "%r5",  "%r6",  "%r7",
1246    "%r8",   "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
1247   "%r16",  "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
1248   "%r24",  "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
1249    "%f0",   "%f1",  "%f2",  "%f3",  "%f4",  "%f5",  "%f6",  "%f7",
1250    "%f8",   "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
1251   "%f16",  "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
1252   "%f24",  "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
1253     "mq",    "lr",  "ctr",   "ap",
1254   "%cr0",  "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
1255    "ca",
1256   /* AltiVec registers.  */
1257    "%v0",  "%v1",  "%v2",  "%v3",  "%v4",  "%v5",  "%v6", "%v7",
1258    "%v8",  "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
1259   "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
1260   "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
1261   "vrsave", "vscr",
1262   /* SPE registers.  */
1263   "spe_acc", "spefscr",
1264   /* Soft frame pointer.  */
1265   "sfp"
1266 };
1267 #endif
1268
1269 /* Table of valid machine attributes.  */
1270
1271 static const struct attribute_spec rs6000_attribute_table[] =
1272 {
1273   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
1274        affects_type_identity } */
1275   { "altivec",   1, 1, false, true,  false, rs6000_handle_altivec_attribute,
1276     false },
1277   { "longcall",  0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
1278     false },
1279   { "shortcall", 0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
1280     false },
1281   { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
1282     false },
1283   { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
1284     false },
1285 #ifdef SUBTARGET_ATTRIBUTE_TABLE
1286   SUBTARGET_ATTRIBUTE_TABLE,
1287 #endif
1288   { NULL,        0, 0, false, false, false, NULL, false }
1289 };
1290 \f
1291 #ifndef MASK_STRICT_ALIGN
1292 #define MASK_STRICT_ALIGN 0
1293 #endif
1294 #ifndef TARGET_PROFILE_KERNEL
1295 #define TARGET_PROFILE_KERNEL 0
1296 #endif
1297
1298 /* The VRSAVE bitmask puts bit %v0 as the most significant bit.  */
1299 #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
1300 \f
1301 /* Initialize the GCC target structure.  */
1302 #undef TARGET_ATTRIBUTE_TABLE
1303 #define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
1304 #undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
1305 #define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
1306 #undef TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P
1307 #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P rs6000_attribute_takes_identifier_p
1308
1309 #undef TARGET_ASM_ALIGNED_DI_OP
1310 #define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
1311
1312 /* Default unaligned ops are only provided for ELF.  Find the ops needed
1313    for non-ELF systems.  */
1314 #ifndef OBJECT_FORMAT_ELF
1315 #if TARGET_XCOFF
1316 /* For XCOFF.  rs6000_assemble_integer will handle unaligned DIs on
1317    64-bit targets.  */
1318 #undef TARGET_ASM_UNALIGNED_HI_OP
1319 #define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
1320 #undef TARGET_ASM_UNALIGNED_SI_OP
1321 #define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
1322 #undef TARGET_ASM_UNALIGNED_DI_OP
1323 #define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
1324 #else
1325 /* For Darwin.  */
1326 #undef TARGET_ASM_UNALIGNED_HI_OP
1327 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
1328 #undef TARGET_ASM_UNALIGNED_SI_OP
1329 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
1330 #undef TARGET_ASM_UNALIGNED_DI_OP
1331 #define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
1332 #undef TARGET_ASM_ALIGNED_DI_OP
1333 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
1334 #endif
1335 #endif
1336
1337 /* This hook deals with fixups for relocatable code and DI-mode objects
1338    in 64-bit code.  */
1339 #undef TARGET_ASM_INTEGER
1340 #define TARGET_ASM_INTEGER rs6000_assemble_integer
1341
1342 #if defined (HAVE_GAS_HIDDEN) && !defined (TARGET_MACHO)
1343 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
1344 #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
1345 #endif
1346
1347 #undef TARGET_HAVE_TLS
1348 #define TARGET_HAVE_TLS HAVE_AS_TLS
1349
1350 #undef TARGET_CANNOT_FORCE_CONST_MEM
1351 #define TARGET_CANNOT_FORCE_CONST_MEM rs6000_cannot_force_const_mem
1352
1353 #undef TARGET_DELEGITIMIZE_ADDRESS
1354 #define TARGET_DELEGITIMIZE_ADDRESS rs6000_delegitimize_address
1355
1356 #undef TARGET_ASM_FUNCTION_PROLOGUE
1357 #define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
1358 #undef TARGET_ASM_FUNCTION_EPILOGUE
1359 #define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
1360
1361 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
1362 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA rs6000_output_addr_const_extra
1363
1364 #undef TARGET_LEGITIMIZE_ADDRESS
1365 #define TARGET_LEGITIMIZE_ADDRESS rs6000_legitimize_address
1366
1367 #undef  TARGET_SCHED_VARIABLE_ISSUE
1368 #define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
1369
1370 #undef TARGET_SCHED_ISSUE_RATE
1371 #define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
1372 #undef TARGET_SCHED_ADJUST_COST
1373 #define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
1374 #undef TARGET_SCHED_ADJUST_PRIORITY
1375 #define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
1376 #undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
1377 #define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
1378 #undef TARGET_SCHED_INIT
1379 #define TARGET_SCHED_INIT rs6000_sched_init
1380 #undef TARGET_SCHED_FINISH
1381 #define TARGET_SCHED_FINISH rs6000_sched_finish
1382 #undef TARGET_SCHED_REORDER
1383 #define TARGET_SCHED_REORDER rs6000_sched_reorder
1384 #undef TARGET_SCHED_REORDER2
1385 #define TARGET_SCHED_REORDER2 rs6000_sched_reorder2
1386
1387 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
1388 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
1389
1390 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD
1391 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD rs6000_use_sched_lookahead_guard
1392
1393 #undef TARGET_SCHED_ALLOC_SCHED_CONTEXT
1394 #define TARGET_SCHED_ALLOC_SCHED_CONTEXT rs6000_alloc_sched_context
1395 #undef TARGET_SCHED_INIT_SCHED_CONTEXT
1396 #define TARGET_SCHED_INIT_SCHED_CONTEXT rs6000_init_sched_context
1397 #undef TARGET_SCHED_SET_SCHED_CONTEXT
1398 #define TARGET_SCHED_SET_SCHED_CONTEXT rs6000_set_sched_context
1399 #undef TARGET_SCHED_FREE_SCHED_CONTEXT
1400 #define TARGET_SCHED_FREE_SCHED_CONTEXT rs6000_free_sched_context
1401
1402 #undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD
1403 #define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load
1404 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN
1405 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN rs6000_builtin_mul_widen_even
1406 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD
1407 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD rs6000_builtin_mul_widen_odd
1408 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
1409 #define TARGET_VECTORIZE_BUILTIN_CONVERSION rs6000_builtin_conversion
1410 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM
1411 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM rs6000_builtin_vec_perm
1412 #undef TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
1413 #define TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT            \
1414   rs6000_builtin_support_vector_misalignment
1415 #undef TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE
1416 #define TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE rs6000_vector_alignment_reachable
1417 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
1418 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
1419   rs6000_builtin_vectorization_cost
1420 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
1421 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE \
1422   rs6000_preferred_simd_mode
1423
1424 #undef TARGET_INIT_BUILTINS
1425 #define TARGET_INIT_BUILTINS rs6000_init_builtins
1426 #undef TARGET_BUILTIN_DECL
1427 #define TARGET_BUILTIN_DECL rs6000_builtin_decl
1428
1429 #undef TARGET_EXPAND_BUILTIN
1430 #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
1431
1432 #undef TARGET_MANGLE_TYPE
1433 #define TARGET_MANGLE_TYPE rs6000_mangle_type
1434
1435 #undef TARGET_INIT_LIBFUNCS
1436 #define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
1437
1438 #if TARGET_MACHO
1439 #undef TARGET_BINDS_LOCAL_P
1440 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
1441 #endif
1442
1443 #undef TARGET_MS_BITFIELD_LAYOUT_P
1444 #define TARGET_MS_BITFIELD_LAYOUT_P rs6000_ms_bitfield_layout_p
1445
1446 #undef TARGET_ASM_OUTPUT_MI_THUNK
1447 #define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
1448
1449 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
1450 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
1451
1452 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
1453 #define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
1454
1455 #undef TARGET_INVALID_WITHIN_DOLOOP
1456 #define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop
1457
1458 #undef TARGET_REGISTER_MOVE_COST
1459 #define TARGET_REGISTER_MOVE_COST rs6000_register_move_cost
1460 #undef TARGET_MEMORY_MOVE_COST
1461 #define TARGET_MEMORY_MOVE_COST rs6000_memory_move_cost
1462 #undef TARGET_RTX_COSTS
1463 #define TARGET_RTX_COSTS rs6000_rtx_costs
1464 #undef TARGET_ADDRESS_COST
1465 #define TARGET_ADDRESS_COST hook_int_rtx_bool_0
1466
1467 #undef TARGET_DWARF_REGISTER_SPAN
1468 #define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
1469
1470 #undef TARGET_INIT_DWARF_REG_SIZES_EXTRA
1471 #define TARGET_INIT_DWARF_REG_SIZES_EXTRA rs6000_init_dwarf_reg_sizes_extra
1472
1473 /* On rs6000, function arguments are promoted, as are function return
1474    values.  */
1475 #undef TARGET_PROMOTE_FUNCTION_MODE
1476 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
1477
1478 #undef TARGET_RETURN_IN_MEMORY
1479 #define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
1480
1481 #undef TARGET_SETUP_INCOMING_VARARGS
1482 #define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
1483
1484 /* Always strict argument naming on rs6000.  */
1485 #undef TARGET_STRICT_ARGUMENT_NAMING
1486 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
1487 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
1488 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
1489 #undef TARGET_SPLIT_COMPLEX_ARG
1490 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true
1491 #undef TARGET_MUST_PASS_IN_STACK
1492 #define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
1493 #undef TARGET_PASS_BY_REFERENCE
1494 #define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
1495 #undef TARGET_ARG_PARTIAL_BYTES
1496 #define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes
1497 #undef TARGET_FUNCTION_ARG_ADVANCE
1498 #define TARGET_FUNCTION_ARG_ADVANCE rs6000_function_arg_advance
1499 #undef TARGET_FUNCTION_ARG
1500 #define TARGET_FUNCTION_ARG rs6000_function_arg
1501 #undef TARGET_FUNCTION_ARG_BOUNDARY
1502 #define TARGET_FUNCTION_ARG_BOUNDARY rs6000_function_arg_boundary
1503
1504 #undef TARGET_BUILD_BUILTIN_VA_LIST
1505 #define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
1506
1507 #undef TARGET_EXPAND_BUILTIN_VA_START
1508 #define TARGET_EXPAND_BUILTIN_VA_START rs6000_va_start
1509
1510 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
1511 #define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
1512
1513 #undef TARGET_EH_RETURN_FILTER_MODE
1514 #define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
1515
1516 #undef TARGET_SCALAR_MODE_SUPPORTED_P
1517 #define TARGET_SCALAR_MODE_SUPPORTED_P rs6000_scalar_mode_supported_p
1518
1519 #undef TARGET_VECTOR_MODE_SUPPORTED_P
1520 #define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p
1521
1522 #undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
1523 #define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn
1524
1525 #undef TARGET_ASM_LOOP_ALIGN_MAX_SKIP
1526 #define TARGET_ASM_LOOP_ALIGN_MAX_SKIP rs6000_loop_align_max_skip
1527
1528 #undef TARGET_OPTION_OVERRIDE
1529 #define TARGET_OPTION_OVERRIDE rs6000_option_override
1530
1531 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
1532 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
1533   rs6000_builtin_vectorized_function
1534
1535 #ifndef TARGET_MACHO
1536 #undef TARGET_STACK_PROTECT_FAIL
1537 #define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail
1538 #endif
1539
1540 /* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors
1541    The PowerPC architecture requires only weak consistency among
1542    processors--that is, memory accesses between processors need not be
1543    sequentially consistent and memory accesses among processors can occur
1544    in any order. The ability to order memory accesses weakly provides
1545    opportunities for more efficient use of the system bus. Unless a
1546    dependency exists, the 604e allows read operations to precede store
1547    operations.  */
1548 #undef TARGET_RELAXED_ORDERING
1549 #define TARGET_RELAXED_ORDERING true
1550
1551 #ifdef HAVE_AS_TLS
1552 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
1553 #define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
1554 #endif
1555
1556 /* Use a 32-bit anchor range.  This leads to sequences like:
1557
1558         addis   tmp,anchor,high
1559         add     dest,tmp,low
1560
1561    where tmp itself acts as an anchor, and can be shared between
1562    accesses to the same 64k page.  */
1563 #undef TARGET_MIN_ANCHOR_OFFSET
1564 #define TARGET_MIN_ANCHOR_OFFSET -0x7fffffff - 1
1565 #undef TARGET_MAX_ANCHOR_OFFSET
1566 #define TARGET_MAX_ANCHOR_OFFSET 0x7fffffff
1567 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
1568 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P rs6000_use_blocks_for_constant_p
1569
1570 #undef TARGET_BUILTIN_RECIPROCAL
1571 #define TARGET_BUILTIN_RECIPROCAL rs6000_builtin_reciprocal
1572
1573 #undef TARGET_EXPAND_TO_RTL_HOOK
1574 #define TARGET_EXPAND_TO_RTL_HOOK rs6000_alloc_sdmode_stack_slot
1575
1576 #undef TARGET_INSTANTIATE_DECLS
1577 #define TARGET_INSTANTIATE_DECLS rs6000_instantiate_decls
1578
1579 #undef TARGET_SECONDARY_RELOAD
1580 #define TARGET_SECONDARY_RELOAD rs6000_secondary_reload
1581
1582 #undef TARGET_LEGITIMATE_ADDRESS_P
1583 #define TARGET_LEGITIMATE_ADDRESS_P rs6000_legitimate_address_p
1584
1585 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
1586 #define TARGET_MODE_DEPENDENT_ADDRESS_P rs6000_mode_dependent_address_p
1587
1588 #undef TARGET_CAN_ELIMINATE
1589 #define TARGET_CAN_ELIMINATE rs6000_can_eliminate
1590
1591 #undef TARGET_CONDITIONAL_REGISTER_USAGE
1592 #define TARGET_CONDITIONAL_REGISTER_USAGE rs6000_conditional_register_usage
1593
1594 #undef TARGET_TRAMPOLINE_INIT
1595 #define TARGET_TRAMPOLINE_INIT rs6000_trampoline_init
1596
1597 #undef TARGET_FUNCTION_VALUE
1598 #define TARGET_FUNCTION_VALUE rs6000_function_value
1599
1600 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
1601 #define TARGET_OPTION_VALID_ATTRIBUTE_P rs6000_valid_attribute_p
1602
1603 #undef TARGET_OPTION_SAVE
1604 #define TARGET_OPTION_SAVE rs6000_function_specific_save
1605
1606 #undef TARGET_OPTION_RESTORE
1607 #define TARGET_OPTION_RESTORE rs6000_function_specific_restore
1608
1609 #undef TARGET_OPTION_PRINT
1610 #define TARGET_OPTION_PRINT rs6000_function_specific_print
1611
1612 #undef TARGET_CAN_INLINE_P
1613 #define TARGET_CAN_INLINE_P rs6000_can_inline_p
1614
1615 #undef TARGET_SET_CURRENT_FUNCTION
1616 #define TARGET_SET_CURRENT_FUNCTION rs6000_set_current_function
1617
1618 #undef TARGET_LEGITIMATE_CONSTANT_P
1619 #define TARGET_LEGITIMATE_CONSTANT_P rs6000_legitimate_constant_p
1620
1621 struct gcc_target targetm = TARGET_INITIALIZER;
1622 \f
1623
1624 /* Simplifications for entries below.  */
1625
1626 enum {
1627   POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS,
1628   POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC
1629 };
1630
1631 /* Some OSs don't support saving the high part of 64-bit registers on context
1632    switch.  Other OSs don't support saving Altivec registers.  On those OSs, we
1633    don't touch the MASK_POWERPC64 or MASK_ALTIVEC settings; if the user wants
1634    either, the user must explicitly specify them and we won't interfere with
1635    the user's specification.  */
1636
1637 enum {
1638   POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
1639   POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT | MASK_STRICT_ALIGN
1640                    | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
1641                    | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_MULHW
1642                    | MASK_DLMZB | MASK_CMPB | MASK_MFPGPR | MASK_DFP
1643                    | MASK_POPCNTD | MASK_VSX | MASK_ISEL | MASK_NO_UPDATE
1644                    | MASK_RECIP_PRECISION)
1645 };
1646
1647 /* Masks for instructions set at various powerpc ISAs.  */
1648 enum {
1649   ISA_2_1_MASKS = MASK_MFCRF,
1650   ISA_2_2_MASKS = (ISA_2_1_MASKS | MASK_POPCNTB),
1651   ISA_2_4_MASKS = (ISA_2_2_MASKS | MASK_FPRND),
1652
1653   /* For ISA 2.05, do not add MFPGPR, since it isn't in ISA 2.06, and don't add
1654      ALTIVEC, since in general it isn't a win on power6.  In ISA 2.04, fsel,
1655      fre, fsqrt, etc. were no longer documented as optional.  Group masks by
1656      server and embedded. */
1657   ISA_2_5_MASKS_EMBEDDED = (ISA_2_2_MASKS | MASK_CMPB | MASK_RECIP_PRECISION
1658                             | MASK_PPC_GFXOPT | MASK_PPC_GPOPT),
1659   ISA_2_5_MASKS_SERVER = (ISA_2_5_MASKS_EMBEDDED | MASK_DFP),
1660
1661   /* For ISA 2.06, don't add ISEL, since in general it isn't a win, but
1662      altivec is a win so enable it.  */
1663   ISA_2_6_MASKS_EMBEDDED = (ISA_2_5_MASKS_EMBEDDED | MASK_POPCNTD),
1664   ISA_2_6_MASKS_SERVER = (ISA_2_5_MASKS_SERVER | MASK_POPCNTD | MASK_ALTIVEC
1665                           | MASK_VSX)
1666 };
1667
1668 struct rs6000_ptt
1669 {
1670   const char *const name;               /* Canonical processor name.  */
1671   const enum processor_type processor;  /* Processor type enum value.  */
1672   const int target_enable;              /* Target flags to enable.  */
1673 };
1674
1675 static struct rs6000_ptt const processor_target_table[] =
1676 {
1677 #define RS6000_CPU(NAME, CPU, FLAGS) { NAME, CPU, FLAGS },
1678 #include "rs6000-cpus.def"
1679 #undef RS6000_CPU
1680 };
1681
1682 /* Look up a processor name for -mcpu=xxx and -mtune=xxx.  Return -1 if the
1683    name is invalid.  */
1684
1685 static int
1686 rs6000_cpu_name_lookup (const char *name)
1687 {
1688   size_t i;
1689
1690   if (name != NULL)
1691     {
1692       for (i = 0; i < ARRAY_SIZE (processor_target_table); i++)
1693         if (! strcmp (name, processor_target_table[i].name))
1694           return (int)i;
1695     }
1696
1697   return -1;
1698 }
1699
1700 \f
1701 /* Return number of consecutive hard regs needed starting at reg REGNO
1702    to hold something of mode MODE.
1703    This is ordinarily the length in words of a value of mode MODE
1704    but can be less for certain modes in special long registers.
1705
1706    For the SPE, GPRs are 64 bits but only 32 bits are visible in
1707    scalar instructions.  The upper 32 bits are only available to the
1708    SIMD instructions.
1709
1710    POWER and PowerPC GPRs hold 32 bits worth;
1711    PowerPC64 GPRs and FPRs point register holds 64 bits worth.  */
1712
1713 static int
1714 rs6000_hard_regno_nregs_internal (int regno, enum machine_mode mode)
1715 {
1716   unsigned HOST_WIDE_INT reg_size;
1717
1718   if (FP_REGNO_P (regno))
1719     reg_size = (VECTOR_MEM_VSX_P (mode)
1720                 ? UNITS_PER_VSX_WORD
1721                 : UNITS_PER_FP_WORD);
1722
1723   else if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1724     reg_size = UNITS_PER_SPE_WORD;
1725
1726   else if (ALTIVEC_REGNO_P (regno))
1727     reg_size = UNITS_PER_ALTIVEC_WORD;
1728
1729   /* The value returned for SCmode in the E500 double case is 2 for
1730      ABI compatibility; storing an SCmode value in a single register
1731      would require function_arg and rs6000_spe_function_arg to handle
1732      SCmode so as to pass the value correctly in a pair of
1733      registers.  */
1734   else if (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode) && mode != SCmode
1735            && !DECIMAL_FLOAT_MODE_P (mode))
1736     reg_size = UNITS_PER_FP_WORD;
1737
1738   else
1739     reg_size = UNITS_PER_WORD;
1740
1741   return (GET_MODE_SIZE (mode) + reg_size - 1) / reg_size;
1742 }
1743
1744 /* Value is 1 if hard register REGNO can hold a value of machine-mode
1745    MODE.  */
1746 static int
1747 rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
1748 {
1749   int last_regno = regno + rs6000_hard_regno_nregs[mode][regno] - 1;
1750
1751   /* VSX registers that overlap the FPR registers are larger than for non-VSX
1752      implementations.  Don't allow an item to be split between a FP register
1753      and an Altivec register.  */
1754   if (VECTOR_MEM_VSX_P (mode))
1755     {
1756       if (FP_REGNO_P (regno))
1757         return FP_REGNO_P (last_regno);
1758
1759       if (ALTIVEC_REGNO_P (regno))
1760         return ALTIVEC_REGNO_P (last_regno);
1761     }
1762
1763   /* The GPRs can hold any mode, but values bigger than one register
1764      cannot go past R31.  */
1765   if (INT_REGNO_P (regno))
1766     return INT_REGNO_P (last_regno);
1767
1768   /* The float registers (except for VSX vector modes) can only hold floating
1769      modes and DImode.  This excludes the 32-bit decimal float mode for
1770      now.  */
1771   if (FP_REGNO_P (regno))
1772     {
1773       if (SCALAR_FLOAT_MODE_P (mode)
1774           && (mode != TDmode || (regno % 2) == 0)
1775           && FP_REGNO_P (last_regno))
1776         return 1;
1777
1778       if (GET_MODE_CLASS (mode) == MODE_INT
1779           && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD)
1780         return 1;
1781
1782       if (PAIRED_SIMD_REGNO_P (regno) && TARGET_PAIRED_FLOAT
1783           && PAIRED_VECTOR_MODE (mode))
1784         return 1;
1785
1786       return 0;
1787     }
1788
1789   /* The CR register can only hold CC modes.  */
1790   if (CR_REGNO_P (regno))
1791     return GET_MODE_CLASS (mode) == MODE_CC;
1792
1793   if (CA_REGNO_P (regno))
1794     return mode == BImode;
1795
1796   /* AltiVec only in AldyVec registers.  */
1797   if (ALTIVEC_REGNO_P (regno))
1798     return VECTOR_MEM_ALTIVEC_OR_VSX_P (mode);
1799
1800   /* ...but GPRs can hold SIMD data on the SPE in one register.  */
1801   if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1802     return 1;
1803
1804   /* We cannot put TImode anywhere except general register and it must be able
1805      to fit within the register set.  In the future, allow TImode in the
1806      Altivec or VSX registers.  */
1807
1808   return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
1809 }
1810
1811 /* Print interesting facts about registers.  */
1812 static void
1813 rs6000_debug_reg_print (int first_regno, int last_regno, const char *reg_name)
1814 {
1815   int r, m;
1816
1817   for (r = first_regno; r <= last_regno; ++r)
1818     {
1819       const char *comma = "";
1820       int len;
1821
1822       if (first_regno == last_regno)
1823         fprintf (stderr, "%s:\t", reg_name);
1824       else
1825         fprintf (stderr, "%s%d:\t", reg_name, r - first_regno);
1826
1827       len = 8;
1828       for (m = 0; m < NUM_MACHINE_MODES; ++m)
1829         if (rs6000_hard_regno_mode_ok_p[m][r] && rs6000_hard_regno_nregs[m][r])
1830           {
1831             if (len > 70)
1832               {
1833                 fprintf (stderr, ",\n\t");
1834                 len = 8;
1835                 comma = "";
1836               }
1837
1838             if (rs6000_hard_regno_nregs[m][r] > 1)
1839               len += fprintf (stderr, "%s%s/%d", comma, GET_MODE_NAME (m),
1840                              rs6000_hard_regno_nregs[m][r]);
1841             else
1842               len += fprintf (stderr, "%s%s", comma, GET_MODE_NAME (m));
1843
1844             comma = ", ";
1845           }
1846
1847       if (call_used_regs[r])
1848         {
1849           if (len > 70)
1850             {
1851               fprintf (stderr, ",\n\t");
1852               len = 8;
1853               comma = "";
1854             }
1855
1856           len += fprintf (stderr, "%s%s", comma, "call-used");
1857           comma = ", ";
1858         }
1859
1860       if (fixed_regs[r])
1861         {
1862           if (len > 70)
1863             {
1864               fprintf (stderr, ",\n\t");
1865               len = 8;
1866               comma = "";
1867             }
1868
1869           len += fprintf (stderr, "%s%s", comma, "fixed");
1870           comma = ", ";
1871         }
1872
1873       if (len > 70)
1874         {
1875           fprintf (stderr, ",\n\t");
1876           comma = "";
1877         }
1878
1879       fprintf (stderr, "%sregno = %d\n", comma, r);
1880     }
1881 }
1882
1883 #define DEBUG_FMT_D "%-32s= %d\n"
1884 #define DEBUG_FMT_S "%-32s= %s\n"
1885
1886 /* Print various interesting information with -mdebug=reg.  */
1887 static void
1888 rs6000_debug_reg_global (void)
1889 {
1890   static const char *const tf[2] = { "false", "true" };
1891   const char *nl = (const char *)0;
1892   int m;
1893   char costly_num[20];
1894   char nop_num[20];
1895   const char *costly_str;
1896   const char *nop_str;
1897   const char *trace_str;
1898   const char *abi_str;
1899   const char *cmodel_str;
1900
1901   /* Map enum rs6000_vector to string.  */
1902   static const char *rs6000_debug_vector_unit[] = {
1903     "none",
1904     "altivec",
1905     "vsx",
1906     "paired",
1907     "spe",
1908     "other"
1909   };
1910
1911   fprintf (stderr, "Register information: (last virtual reg = %d)\n",
1912            LAST_VIRTUAL_REGISTER);
1913   rs6000_debug_reg_print (0, 31, "gr");
1914   rs6000_debug_reg_print (32, 63, "fp");
1915   rs6000_debug_reg_print (FIRST_ALTIVEC_REGNO,
1916                           LAST_ALTIVEC_REGNO,
1917                           "vs");
1918   rs6000_debug_reg_print (LR_REGNO, LR_REGNO, "lr");
1919   rs6000_debug_reg_print (CTR_REGNO, CTR_REGNO, "ctr");
1920   rs6000_debug_reg_print (CR0_REGNO, CR7_REGNO, "cr");
1921   rs6000_debug_reg_print (MQ_REGNO, MQ_REGNO, "mq");
1922   rs6000_debug_reg_print (CA_REGNO, CA_REGNO, "ca");
1923   rs6000_debug_reg_print (VRSAVE_REGNO, VRSAVE_REGNO, "vrsave");
1924   rs6000_debug_reg_print (VSCR_REGNO, VSCR_REGNO, "vscr");
1925   rs6000_debug_reg_print (SPE_ACC_REGNO, SPE_ACC_REGNO, "spe_a");
1926   rs6000_debug_reg_print (SPEFSCR_REGNO, SPEFSCR_REGNO, "spe_f");
1927
1928   fprintf (stderr,
1929            "\n"
1930            "d  reg_class = %s\n"
1931            "f  reg_class = %s\n"
1932            "v  reg_class = %s\n"
1933            "wa reg_class = %s\n"
1934            "wd reg_class = %s\n"
1935            "wf reg_class = %s\n"
1936            "ws reg_class = %s\n\n",
1937            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_d]],
1938            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_f]],
1939            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_v]],
1940            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wa]],
1941            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wd]],
1942            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wf]],
1943            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_ws]]);
1944
1945   for (m = 0; m < NUM_MACHINE_MODES; ++m)
1946     if (rs6000_vector_unit[m] || rs6000_vector_mem[m])
1947       {
1948         nl = "\n";
1949         fprintf (stderr, "Vector mode: %-5s arithmetic: %-8s move: %-8s\n",
1950                  GET_MODE_NAME (m),
1951                  rs6000_debug_vector_unit[ rs6000_vector_unit[m] ],
1952                  rs6000_debug_vector_unit[ rs6000_vector_mem[m] ]);
1953       }
1954
1955   if (nl)
1956     fputs (nl, stderr);
1957
1958   if (rs6000_recip_control)
1959     {
1960       fprintf (stderr, "\nReciprocal mask = 0x%x\n", rs6000_recip_control);
1961
1962       for (m = 0; m < NUM_MACHINE_MODES; ++m)
1963         if (rs6000_recip_bits[m])
1964           {
1965             fprintf (stderr,
1966                      "Reciprocal estimate mode: %-5s divide: %s rsqrt: %s\n",
1967                      GET_MODE_NAME (m),
1968                      (RS6000_RECIP_AUTO_RE_P (m)
1969                       ? "auto"
1970                       : (RS6000_RECIP_HAVE_RE_P (m) ? "have" : "none")),
1971                      (RS6000_RECIP_AUTO_RSQRTE_P (m)
1972                       ? "auto"
1973                       : (RS6000_RECIP_HAVE_RSQRTE_P (m) ? "have" : "none")));
1974           }
1975
1976       fputs ("\n", stderr);
1977     }
1978
1979   if (rs6000_cpu_index >= 0)
1980     fprintf (stderr, DEBUG_FMT_S, "cpu",
1981              processor_target_table[rs6000_cpu_index].name);
1982
1983   if (rs6000_tune_index >= 0)
1984     fprintf (stderr, DEBUG_FMT_S, "tune",
1985              processor_target_table[rs6000_tune_index].name);
1986
1987   switch (rs6000_sched_costly_dep)
1988     {
1989     case max_dep_latency:
1990       costly_str = "max_dep_latency";
1991       break;
1992
1993     case no_dep_costly:
1994       costly_str = "no_dep_costly";
1995       break;
1996
1997     case all_deps_costly:
1998       costly_str = "all_deps_costly";
1999       break;
2000
2001     case true_store_to_load_dep_costly:
2002       costly_str = "true_store_to_load_dep_costly";
2003       break;
2004
2005     case store_to_load_dep_costly:
2006       costly_str = "store_to_load_dep_costly";
2007       break;
2008
2009     default:
2010       costly_str = costly_num;
2011       sprintf (costly_num, "%d", (int)rs6000_sched_costly_dep);
2012       break;
2013     }
2014
2015   fprintf (stderr, DEBUG_FMT_S, "sched_costly_dep", costly_str);
2016
2017   switch (rs6000_sched_insert_nops)
2018     {
2019     case sched_finish_regroup_exact:
2020       nop_str = "sched_finish_regroup_exact";
2021       break;
2022
2023     case sched_finish_pad_groups:
2024       nop_str = "sched_finish_pad_groups";
2025       break;
2026
2027     case sched_finish_none:
2028       nop_str = "sched_finish_none";
2029       break;
2030
2031     default:
2032       nop_str = nop_num;
2033       sprintf (nop_num, "%d", (int)rs6000_sched_insert_nops);
2034       break;
2035     }
2036
2037   fprintf (stderr, DEBUG_FMT_S, "sched_insert_nops", nop_str);
2038
2039   switch (rs6000_sdata)
2040     {
2041     default:
2042     case SDATA_NONE:
2043       break;
2044
2045     case SDATA_DATA:
2046       fprintf (stderr, DEBUG_FMT_S, "sdata", "data");
2047       break;
2048
2049     case SDATA_SYSV:
2050       fprintf (stderr, DEBUG_FMT_S, "sdata", "sysv");
2051       break;
2052
2053     case SDATA_EABI:
2054       fprintf (stderr, DEBUG_FMT_S, "sdata", "eabi");
2055       break;
2056
2057     }
2058
2059   switch (rs6000_traceback)
2060     {
2061     case traceback_default:     trace_str = "default";  break;
2062     case traceback_none:        trace_str = "none";     break;
2063     case traceback_part:        trace_str = "part";     break;
2064     case traceback_full:        trace_str = "full";     break;
2065     default:                    trace_str = "unknown";  break;
2066     }
2067
2068   fprintf (stderr, DEBUG_FMT_S, "traceback", trace_str);
2069
2070   switch (rs6000_current_cmodel)
2071     {
2072     case CMODEL_SMALL:  cmodel_str = "small";   break;
2073     case CMODEL_MEDIUM: cmodel_str = "medium";  break;
2074     case CMODEL_LARGE:  cmodel_str = "large";   break;
2075     default:            cmodel_str = "unknown"; break;
2076     }
2077
2078   fprintf (stderr, DEBUG_FMT_S, "cmodel", cmodel_str);
2079
2080   switch (rs6000_current_abi)
2081     {
2082     case ABI_NONE:      abi_str = "none";       break;
2083     case ABI_AIX:       abi_str = "aix";        break;
2084     case ABI_V4:        abi_str = "V4";         break;
2085     case ABI_DARWIN:    abi_str = "darwin";     break;
2086     default:            abi_str = "unknown";    break;
2087     }
2088
2089   fprintf (stderr, DEBUG_FMT_S, "abi", abi_str);
2090
2091   if (rs6000_altivec_abi)
2092     fprintf (stderr, DEBUG_FMT_S, "altivec_abi", "true");
2093
2094   if (rs6000_spe_abi)
2095     fprintf (stderr, DEBUG_FMT_S, "spe_abi", "true");
2096
2097   if (rs6000_darwin64_abi)
2098     fprintf (stderr, DEBUG_FMT_S, "darwin64_abi", "true");
2099
2100   if (rs6000_float_gprs)
2101     fprintf (stderr, DEBUG_FMT_S, "float_gprs", "true");
2102
2103   fprintf (stderr, DEBUG_FMT_S, "always_hint", tf[!!rs6000_always_hint]);
2104   fprintf (stderr, DEBUG_FMT_S, "align_branch",
2105            tf[!!rs6000_align_branch_targets]);
2106   fprintf (stderr, DEBUG_FMT_D, "tls_size", rs6000_tls_size);
2107   fprintf (stderr, DEBUG_FMT_D, "long_double_size",
2108            rs6000_long_double_type_size);
2109   fprintf (stderr, DEBUG_FMT_D, "sched_restricted_insns_priority",
2110            (int)rs6000_sched_restricted_insns_priority);
2111 }
2112
2113 /* Initialize the various global tables that are based on register size.  */
2114 static void
2115 rs6000_init_hard_regno_mode_ok (bool global_init_p)
2116 {
2117   int r, m, c;
2118   int align64;
2119   int align32;
2120
2121   /* Precalculate REGNO_REG_CLASS.  */
2122   rs6000_regno_regclass[0] = GENERAL_REGS;
2123   for (r = 1; r < 32; ++r)
2124     rs6000_regno_regclass[r] = BASE_REGS;
2125
2126   for (r = 32; r < 64; ++r)
2127     rs6000_regno_regclass[r] = FLOAT_REGS;
2128
2129   for (r = 64; r < FIRST_PSEUDO_REGISTER; ++r)
2130     rs6000_regno_regclass[r] = NO_REGS;
2131
2132   for (r = FIRST_ALTIVEC_REGNO; r <= LAST_ALTIVEC_REGNO; ++r)
2133     rs6000_regno_regclass[r] = ALTIVEC_REGS;
2134
2135   rs6000_regno_regclass[CR0_REGNO] = CR0_REGS;
2136   for (r = CR1_REGNO; r <= CR7_REGNO; ++r)
2137     rs6000_regno_regclass[r] = CR_REGS;
2138
2139   rs6000_regno_regclass[MQ_REGNO] = MQ_REGS;
2140   rs6000_regno_regclass[LR_REGNO] = LINK_REGS;
2141   rs6000_regno_regclass[CTR_REGNO] = CTR_REGS;
2142   rs6000_regno_regclass[CA_REGNO] = CA_REGS;
2143   rs6000_regno_regclass[VRSAVE_REGNO] = VRSAVE_REGS;
2144   rs6000_regno_regclass[VSCR_REGNO] = VRSAVE_REGS;
2145   rs6000_regno_regclass[SPE_ACC_REGNO] = SPE_ACC_REGS;
2146   rs6000_regno_regclass[SPEFSCR_REGNO] = SPEFSCR_REGS;
2147   rs6000_regno_regclass[ARG_POINTER_REGNUM] = BASE_REGS;
2148   rs6000_regno_regclass[FRAME_POINTER_REGNUM] = BASE_REGS;
2149
2150   /* Precalculate vector information, this must be set up before the
2151      rs6000_hard_regno_nregs_internal below.  */
2152   for (m = 0; m < NUM_MACHINE_MODES; ++m)
2153     {
2154       rs6000_vector_unit[m] = rs6000_vector_mem[m] = VECTOR_NONE;
2155       rs6000_vector_reload[m][0] = CODE_FOR_nothing;
2156       rs6000_vector_reload[m][1] = CODE_FOR_nothing;
2157     }
2158
2159   for (c = 0; c < (int)(int)RS6000_CONSTRAINT_MAX; c++)
2160     rs6000_constraints[c] = NO_REGS;
2161
2162   /* The VSX hardware allows native alignment for vectors, but control whether the compiler
2163      believes it can use native alignment or still uses 128-bit alignment.  */
2164   if (TARGET_VSX && !TARGET_VSX_ALIGN_128)
2165     {
2166       align64 = 64;
2167       align32 = 32;
2168     }
2169   else
2170     {
2171       align64 = 128;
2172       align32 = 128;
2173     }
2174
2175   /* V2DF mode, VSX only.  */
2176   if (TARGET_VSX)
2177     {
2178       rs6000_vector_unit[V2DFmode] = VECTOR_VSX;
2179       rs6000_vector_mem[V2DFmode] = VECTOR_VSX;
2180       rs6000_vector_align[V2DFmode] = align64;
2181     }
2182
2183   /* V4SF mode, either VSX or Altivec.  */
2184   if (TARGET_VSX)
2185     {
2186       rs6000_vector_unit[V4SFmode] = VECTOR_VSX;
2187       rs6000_vector_mem[V4SFmode] = VECTOR_VSX;
2188       rs6000_vector_align[V4SFmode] = align32;
2189     }
2190   else if (TARGET_ALTIVEC)
2191     {
2192       rs6000_vector_unit[V4SFmode] = VECTOR_ALTIVEC;
2193       rs6000_vector_mem[V4SFmode] = VECTOR_ALTIVEC;
2194       rs6000_vector_align[V4SFmode] = align32;
2195     }
2196
2197   /* V16QImode, V8HImode, V4SImode are Altivec only, but possibly do VSX loads
2198      and stores. */
2199   if (TARGET_ALTIVEC)
2200     {
2201       rs6000_vector_unit[V4SImode] = VECTOR_ALTIVEC;
2202       rs6000_vector_unit[V8HImode] = VECTOR_ALTIVEC;
2203       rs6000_vector_unit[V16QImode] = VECTOR_ALTIVEC;
2204       rs6000_vector_align[V4SImode] = align32;
2205       rs6000_vector_align[V8HImode] = align32;
2206       rs6000_vector_align[V16QImode] = align32;
2207
2208       if (TARGET_VSX)
2209         {
2210           rs6000_vector_mem[V4SImode] = VECTOR_VSX;
2211           rs6000_vector_mem[V8HImode] = VECTOR_VSX;
2212           rs6000_vector_mem[V16QImode] = VECTOR_VSX;
2213         }
2214       else
2215         {
2216           rs6000_vector_mem[V4SImode] = VECTOR_ALTIVEC;
2217           rs6000_vector_mem[V8HImode] = VECTOR_ALTIVEC;
2218           rs6000_vector_mem[V16QImode] = VECTOR_ALTIVEC;
2219         }
2220     }
2221
2222   /* V2DImode, only allow under VSX, which can do V2DI insert/splat/extract.
2223      Altivec doesn't have 64-bit support.  */
2224   if (TARGET_VSX)
2225     {
2226       rs6000_vector_mem[V2DImode] = VECTOR_VSX;
2227       rs6000_vector_unit[V2DImode] = VECTOR_NONE;
2228       rs6000_vector_align[V2DImode] = align64;
2229     }
2230
2231   /* DFmode, see if we want to use the VSX unit.  */
2232   if (TARGET_VSX && TARGET_VSX_SCALAR_DOUBLE)
2233     {
2234       rs6000_vector_unit[DFmode] = VECTOR_VSX;
2235       rs6000_vector_mem[DFmode]
2236         = (TARGET_VSX_SCALAR_MEMORY ? VECTOR_VSX : VECTOR_NONE);
2237       rs6000_vector_align[DFmode] = align64;
2238     }
2239
2240   /* TODO add SPE and paired floating point vector support.  */
2241
2242   /* Register class constaints for the constraints that depend on compile
2243      switches.  */
2244   if (TARGET_HARD_FLOAT && TARGET_FPRS)
2245     rs6000_constraints[RS6000_CONSTRAINT_f] = FLOAT_REGS;
2246
2247   if (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
2248     rs6000_constraints[RS6000_CONSTRAINT_d] = FLOAT_REGS;
2249
2250   if (TARGET_VSX)
2251     {
2252       /* At present, we just use VSX_REGS, but we have different constraints
2253          based on the use, in case we want to fine tune the default register
2254          class used.  wa = any VSX register, wf = register class to use for
2255          V4SF, wd = register class to use for V2DF, and ws = register classs to
2256          use for DF scalars.  */
2257       rs6000_constraints[RS6000_CONSTRAINT_wa] = VSX_REGS;
2258       rs6000_constraints[RS6000_CONSTRAINT_wf] = VSX_REGS;
2259       rs6000_constraints[RS6000_CONSTRAINT_wd] = VSX_REGS;
2260       rs6000_constraints[RS6000_CONSTRAINT_ws] = (TARGET_VSX_SCALAR_MEMORY
2261                                                   ? VSX_REGS
2262                                                   : FLOAT_REGS);
2263     }
2264
2265   if (TARGET_ALTIVEC)
2266     rs6000_constraints[RS6000_CONSTRAINT_v] = ALTIVEC_REGS;
2267
2268   /* Set up the reload helper functions.  */
2269   if (TARGET_VSX || TARGET_ALTIVEC)
2270     {
2271       if (TARGET_64BIT)
2272         {
2273           rs6000_vector_reload[V16QImode][0] = CODE_FOR_reload_v16qi_di_store;
2274           rs6000_vector_reload[V16QImode][1] = CODE_FOR_reload_v16qi_di_load;
2275           rs6000_vector_reload[V8HImode][0]  = CODE_FOR_reload_v8hi_di_store;
2276           rs6000_vector_reload[V8HImode][1]  = CODE_FOR_reload_v8hi_di_load;
2277           rs6000_vector_reload[V4SImode][0]  = CODE_FOR_reload_v4si_di_store;
2278           rs6000_vector_reload[V4SImode][1]  = CODE_FOR_reload_v4si_di_load;
2279           rs6000_vector_reload[V2DImode][0]  = CODE_FOR_reload_v2di_di_store;
2280           rs6000_vector_reload[V2DImode][1]  = CODE_FOR_reload_v2di_di_load;
2281           rs6000_vector_reload[V4SFmode][0]  = CODE_FOR_reload_v4sf_di_store;
2282           rs6000_vector_reload[V4SFmode][1]  = CODE_FOR_reload_v4sf_di_load;
2283           rs6000_vector_reload[V2DFmode][0]  = CODE_FOR_reload_v2df_di_store;
2284           rs6000_vector_reload[V2DFmode][1]  = CODE_FOR_reload_v2df_di_load;
2285         }
2286       else
2287         {
2288           rs6000_vector_reload[V16QImode][0] = CODE_FOR_reload_v16qi_si_store;
2289           rs6000_vector_reload[V16QImode][1] = CODE_FOR_reload_v16qi_si_load;
2290           rs6000_vector_reload[V8HImode][0]  = CODE_FOR_reload_v8hi_si_store;
2291           rs6000_vector_reload[V8HImode][1]  = CODE_FOR_reload_v8hi_si_load;
2292           rs6000_vector_reload[V4SImode][0]  = CODE_FOR_reload_v4si_si_store;
2293           rs6000_vector_reload[V4SImode][1]  = CODE_FOR_reload_v4si_si_load;
2294           rs6000_vector_reload[V2DImode][0]  = CODE_FOR_reload_v2di_si_store;
2295           rs6000_vector_reload[V2DImode][1]  = CODE_FOR_reload_v2di_si_load;
2296           rs6000_vector_reload[V4SFmode][0]  = CODE_FOR_reload_v4sf_si_store;
2297           rs6000_vector_reload[V4SFmode][1]  = CODE_FOR_reload_v4sf_si_load;
2298           rs6000_vector_reload[V2DFmode][0]  = CODE_FOR_reload_v2df_si_store;
2299           rs6000_vector_reload[V2DFmode][1]  = CODE_FOR_reload_v2df_si_load;
2300         }
2301     }
2302
2303   /* Precalculate HARD_REGNO_NREGS.  */
2304   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
2305     for (m = 0; m < NUM_MACHINE_MODES; ++m)
2306       rs6000_hard_regno_nregs[m][r]
2307         = rs6000_hard_regno_nregs_internal (r, (enum machine_mode)m);
2308
2309   /* Precalculate HARD_REGNO_MODE_OK.  */
2310   for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
2311     for (m = 0; m < NUM_MACHINE_MODES; ++m)
2312       if (rs6000_hard_regno_mode_ok (r, (enum machine_mode)m))
2313         rs6000_hard_regno_mode_ok_p[m][r] = true;
2314
2315   /* Precalculate CLASS_MAX_NREGS sizes.  */
2316   for (c = 0; c < LIM_REG_CLASSES; ++c)
2317     {
2318       int reg_size;
2319
2320       if (TARGET_VSX && VSX_REG_CLASS_P (c))
2321         reg_size = UNITS_PER_VSX_WORD;
2322
2323       else if (c == ALTIVEC_REGS)
2324         reg_size = UNITS_PER_ALTIVEC_WORD;
2325
2326       else if (c == FLOAT_REGS)
2327         reg_size = UNITS_PER_FP_WORD;
2328
2329       else
2330         reg_size = UNITS_PER_WORD;
2331
2332       for (m = 0; m < NUM_MACHINE_MODES; ++m)
2333         rs6000_class_max_nregs[m][c]
2334           = (GET_MODE_SIZE (m) + reg_size - 1) / reg_size;
2335     }
2336
2337   if (TARGET_E500_DOUBLE)
2338     rs6000_class_max_nregs[DFmode][GENERAL_REGS] = 1;
2339
2340   /* Calculate which modes to automatically generate code to use a the
2341      reciprocal divide and square root instructions.  In the future, possibly
2342      automatically generate the instructions even if the user did not specify
2343      -mrecip.  The older machines double precision reciprocal sqrt estimate is
2344      not accurate enough.  */
2345   memset (rs6000_recip_bits, 0, sizeof (rs6000_recip_bits));
2346   if (TARGET_FRES)
2347     rs6000_recip_bits[SFmode] = RS6000_RECIP_MASK_HAVE_RE;
2348   if (TARGET_FRE)
2349     rs6000_recip_bits[DFmode] = RS6000_RECIP_MASK_HAVE_RE;
2350   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
2351     rs6000_recip_bits[V4SFmode] = RS6000_RECIP_MASK_HAVE_RE;
2352   if (VECTOR_UNIT_VSX_P (V2DFmode))
2353     rs6000_recip_bits[V2DFmode] = RS6000_RECIP_MASK_HAVE_RE;
2354
2355   if (TARGET_FRSQRTES)
2356     rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2357   if (TARGET_FRSQRTE)
2358     rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2359   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
2360     rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2361   if (VECTOR_UNIT_VSX_P (V2DFmode))
2362     rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2363
2364   if (rs6000_recip_control)
2365     {
2366       if (!flag_finite_math_only)
2367         warning (0, "-mrecip requires -ffinite-math or -ffast-math");
2368       if (flag_trapping_math)
2369         warning (0, "-mrecip requires -fno-trapping-math or -ffast-math");
2370       if (!flag_reciprocal_math)
2371         warning (0, "-mrecip requires -freciprocal-math or -ffast-math");
2372       if (flag_finite_math_only && !flag_trapping_math && flag_reciprocal_math)
2373         {
2374           if (RS6000_RECIP_HAVE_RE_P (SFmode)
2375               && (rs6000_recip_control & RECIP_SF_DIV) != 0)
2376             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2377
2378           if (RS6000_RECIP_HAVE_RE_P (DFmode)
2379               && (rs6000_recip_control & RECIP_DF_DIV) != 0)
2380             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2381
2382           if (RS6000_RECIP_HAVE_RE_P (V4SFmode)
2383               && (rs6000_recip_control & RECIP_V4SF_DIV) != 0)
2384             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2385
2386           if (RS6000_RECIP_HAVE_RE_P (V2DFmode)
2387               && (rs6000_recip_control & RECIP_V2DF_DIV) != 0)
2388             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2389
2390           if (RS6000_RECIP_HAVE_RSQRTE_P (SFmode)
2391               && (rs6000_recip_control & RECIP_SF_RSQRT) != 0)
2392             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2393
2394           if (RS6000_RECIP_HAVE_RSQRTE_P (DFmode)
2395               && (rs6000_recip_control & RECIP_DF_RSQRT) != 0)
2396             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2397
2398           if (RS6000_RECIP_HAVE_RSQRTE_P (V4SFmode)
2399               && (rs6000_recip_control & RECIP_V4SF_RSQRT) != 0)
2400             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2401
2402           if (RS6000_RECIP_HAVE_RSQRTE_P (V2DFmode)
2403               && (rs6000_recip_control & RECIP_V2DF_RSQRT) != 0)
2404             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2405         }
2406     }
2407
2408   if (global_init_p || TARGET_DEBUG_TARGET)
2409     {
2410       if (TARGET_DEBUG_REG)
2411         rs6000_debug_reg_global ();
2412
2413       if (TARGET_DEBUG_COST || TARGET_DEBUG_REG)
2414         fprintf (stderr,
2415                  "SImode variable mult cost       = %d\n"
2416                  "SImode constant mult cost       = %d\n"
2417                  "SImode short constant mult cost = %d\n"
2418                  "DImode multipliciation cost     = %d\n"
2419                  "SImode division cost            = %d\n"
2420                  "DImode division cost            = %d\n"
2421                  "Simple fp operation cost        = %d\n"
2422                  "DFmode multiplication cost      = %d\n"
2423                  "SFmode division cost            = %d\n"
2424                  "DFmode division cost            = %d\n"
2425                  "cache line size                 = %d\n"
2426                  "l1 cache size                   = %d\n"
2427                  "l2 cache size                   = %d\n"
2428                  "simultaneous prefetches         = %d\n"
2429                  "\n",
2430                  rs6000_cost->mulsi,
2431                  rs6000_cost->mulsi_const,
2432                  rs6000_cost->mulsi_const9,
2433                  rs6000_cost->muldi,
2434                  rs6000_cost->divsi,
2435                  rs6000_cost->divdi,
2436                  rs6000_cost->fp,
2437                  rs6000_cost->dmul,
2438                  rs6000_cost->sdiv,
2439                  rs6000_cost->ddiv,
2440                  rs6000_cost->cache_line_size,
2441                  rs6000_cost->l1_cache_size,
2442                  rs6000_cost->l2_cache_size,
2443                  rs6000_cost->simultaneous_prefetches);
2444     }
2445 }
2446
2447 #if TARGET_MACHO
2448 /* The Darwin version of SUBTARGET_OVERRIDE_OPTIONS.  */
2449
2450 static void
2451 darwin_rs6000_override_options (void)
2452 {
2453   /* The Darwin ABI always includes AltiVec, can't be (validly) turned
2454      off.  */
2455   rs6000_altivec_abi = 1;
2456   TARGET_ALTIVEC_VRSAVE = 1;
2457
2458   if (DEFAULT_ABI == ABI_DARWIN
2459       && TARGET_64BIT)
2460       darwin_one_byte_bool = 1;
2461
2462   if (TARGET_64BIT && ! TARGET_POWERPC64)
2463     {
2464       target_flags |= MASK_POWERPC64;
2465       warning (0, "-m64 requires PowerPC64 architecture, enabling");
2466     }
2467   if (flag_mkernel)
2468     {
2469       rs6000_default_long_calls = 1;
2470       target_flags |= MASK_SOFT_FLOAT;
2471     }
2472
2473   /* Make -m64 imply -maltivec.  Darwin's 64-bit ABI includes
2474      Altivec.  */
2475   if (!flag_mkernel && !flag_apple_kext
2476       && TARGET_64BIT
2477       && ! (target_flags_explicit & MASK_ALTIVEC))
2478     target_flags |= MASK_ALTIVEC;
2479
2480   /* Unless the user (not the configurer) has explicitly overridden
2481      it with -mcpu=G3 or -mno-altivec, then 10.5+ targets default to
2482      G4 unless targetting the kernel.  */
2483   if (!flag_mkernel
2484       && !flag_apple_kext
2485       && strverscmp (darwin_macosx_version_min, "10.5") >= 0
2486       && ! (target_flags_explicit & MASK_ALTIVEC)
2487       && ! global_options_set.x_rs6000_cpu_index)
2488     {
2489       target_flags |= MASK_ALTIVEC;
2490     }
2491 }
2492 #endif
2493
2494 /* If not otherwise specified by a target, make 'long double' equivalent to
2495    'double'.  */
2496
2497 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
2498 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
2499 #endif
2500
2501 /* Override command line options.  Mostly we process the processor type and
2502    sometimes adjust other TARGET_ options.  */
2503
2504 static bool
2505 rs6000_option_override_internal (bool global_init_p)
2506 {
2507   bool ret = true;
2508   const char *default_cpu = OPTION_TARGET_CPU_DEFAULT;
2509   int set_masks;
2510   int cpu_index;
2511   int tune_index;
2512   struct cl_target_option *main_target_opt
2513     = ((global_init_p || target_option_default_node == NULL)
2514        ? NULL : TREE_TARGET_OPTION (target_option_default_node));
2515
2516   /* On 64-bit Darwin, power alignment is ABI-incompatible with some C
2517      library functions, so warn about it. The flag may be useful for
2518      performance studies from time to time though, so don't disable it
2519      entirely.  */
2520   if (global_options_set.x_rs6000_alignment_flags
2521       && rs6000_alignment_flags == MASK_ALIGN_POWER
2522       && DEFAULT_ABI == ABI_DARWIN
2523       && TARGET_64BIT)
2524     warning (0, "-malign-power is not supported for 64-bit Darwin;"
2525              " it is incompatible with the installed C and C++ libraries");
2526
2527   if (global_options_set.x_rs6000_spe_abi
2528       && rs6000_spe_abi
2529       && !TARGET_SPE_ABI)
2530     error ("not configured for SPE ABI");
2531
2532   /* Numerous experiment shows that IRA based loop pressure
2533      calculation works better for RTL loop invariant motion on targets
2534      with enough (>= 32) registers.  It is an expensive optimization.
2535      So it is on only for peak performance.  */
2536   if (optimize >= 3 && global_init_p)
2537     flag_ira_loop_pressure = 1;
2538
2539   /* Set the pointer size.  */
2540   if (TARGET_64BIT)
2541     {
2542       rs6000_pmode = (int)DImode;
2543       rs6000_pointer_size = 64;
2544     }
2545   else
2546     {
2547       rs6000_pmode = (int)SImode;
2548       rs6000_pointer_size = 32;
2549     }
2550
2551   set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;
2552 #ifdef OS_MISSING_POWERPC64
2553   if (OS_MISSING_POWERPC64)
2554     set_masks &= ~MASK_POWERPC64;
2555 #endif
2556 #ifdef OS_MISSING_ALTIVEC
2557   if (OS_MISSING_ALTIVEC)
2558     set_masks &= ~MASK_ALTIVEC;
2559 #endif
2560
2561   /* Don't override by the processor default if given explicitly.  */
2562   set_masks &= ~target_flags_explicit;
2563
2564   /* Identify the processor type.  */
2565   if (!default_cpu)
2566     {
2567       if (TARGET_POWERPC64)
2568         default_cpu = "powerpc64";
2569       else if (TARGET_POWERPC)
2570         default_cpu = "powerpc";
2571     }
2572
2573   /* Process the -mcpu=<xxx> and -mtune=<xxx> argument.  If the user changed
2574      the cpu in a target attribute or pragma, but did not specify a tuning
2575      option, use the cpu for the tuning option rather than the option specified
2576      with -mtune on the command line.  */
2577   if (rs6000_cpu_index > 0)
2578     cpu_index = rs6000_cpu_index;
2579   else if (main_target_opt != NULL && main_target_opt->x_rs6000_cpu_index > 0)
2580     rs6000_cpu_index = cpu_index = main_target_opt->x_rs6000_cpu_index;
2581   else
2582     rs6000_cpu_index = cpu_index = rs6000_cpu_name_lookup (default_cpu);
2583
2584   if (rs6000_tune_index > 0)
2585     tune_index = rs6000_tune_index;
2586   else
2587     rs6000_tune_index = tune_index = cpu_index;
2588
2589   if (cpu_index >= 0)
2590     {
2591       target_flags &= ~set_masks;
2592       target_flags |= (processor_target_table[cpu_index].target_enable
2593                        & set_masks);
2594     }
2595
2596   rs6000_cpu = ((tune_index >= 0)
2597                 ? processor_target_table[tune_index].processor
2598                 : (TARGET_POWERPC64
2599                    ? PROCESSOR_DEFAULT64
2600                    : PROCESSOR_DEFAULT));
2601
2602   if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3
2603       || rs6000_cpu == PROCESSOR_PPCE500MC || rs6000_cpu == PROCESSOR_PPCE500MC64)
2604     {
2605       if (TARGET_ALTIVEC)
2606         error ("AltiVec not supported in this target");
2607       if (TARGET_SPE)
2608         error ("SPE not supported in this target");
2609     }
2610
2611   /* Disable Cell microcode if we are optimizing for the Cell
2612      and not optimizing for size.  */
2613   if (rs6000_gen_cell_microcode == -1)
2614     rs6000_gen_cell_microcode = !(rs6000_cpu == PROCESSOR_CELL
2615                                   && !optimize_size);
2616
2617   /* If we are optimizing big endian systems for space and it's OK to
2618      use instructions that would be microcoded on the Cell, use the
2619      load/store multiple and string instructions.  */
2620   if (BYTES_BIG_ENDIAN && optimize_size && rs6000_gen_cell_microcode)
2621     target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
2622
2623   /* Don't allow -mmultiple or -mstring on little endian systems
2624      unless the cpu is a 750, because the hardware doesn't support the
2625      instructions used in little endian mode, and causes an alignment
2626      trap.  The 750 does not cause an alignment trap (except when the
2627      target is unaligned).  */
2628
2629   if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
2630     {
2631       if (TARGET_MULTIPLE)
2632         {
2633           target_flags &= ~MASK_MULTIPLE;
2634           if ((target_flags_explicit & MASK_MULTIPLE) != 0)
2635             warning (0, "-mmultiple is not supported on little endian systems");
2636         }
2637
2638       if (TARGET_STRING)
2639         {
2640           target_flags &= ~MASK_STRING;
2641           if ((target_flags_explicit & MASK_STRING) != 0)
2642             warning (0, "-mstring is not supported on little endian systems");
2643         }
2644     }
2645
2646   /* Add some warnings for VSX.  */
2647   if (TARGET_VSX)
2648     {
2649       const char *msg = NULL;
2650       if (!TARGET_HARD_FLOAT || !TARGET_FPRS
2651           || !TARGET_SINGLE_FLOAT || !TARGET_DOUBLE_FLOAT)
2652         {
2653           if (target_flags_explicit & MASK_VSX)
2654             msg = N_("-mvsx requires hardware floating point");
2655           else
2656             target_flags &= ~ MASK_VSX;
2657         }
2658       else if (TARGET_PAIRED_FLOAT)
2659         msg = N_("-mvsx and -mpaired are incompatible");
2660       /* The hardware will allow VSX and little endian, but until we make sure
2661          things like vector select, etc. work don't allow VSX on little endian
2662          systems at this point.  */
2663       else if (!BYTES_BIG_ENDIAN)
2664         msg = N_("-mvsx used with little endian code");
2665       else if (TARGET_AVOID_XFORM > 0)
2666         msg = N_("-mvsx needs indexed addressing");
2667       else if (!TARGET_ALTIVEC && (target_flags_explicit & MASK_ALTIVEC))
2668         {
2669           if (target_flags_explicit & MASK_VSX)
2670             msg = N_("-mvsx and -mno-altivec are incompatible");
2671           else
2672             msg = N_("-mno-altivec disables vsx");
2673         }
2674
2675       if (msg)
2676         {
2677           warning (0, msg);
2678           target_flags &= ~ MASK_VSX;
2679           target_flags_explicit |= MASK_VSX;
2680         }
2681     }
2682
2683   /* For the newer switches (vsx, dfp, etc.) set some of the older options,
2684      unless the user explicitly used the -mno-<option> to disable the code.  */
2685   if (TARGET_VSX)
2686     target_flags |= (ISA_2_6_MASKS_SERVER & ~target_flags_explicit);
2687   else if (TARGET_POPCNTD)
2688     target_flags |= (ISA_2_6_MASKS_EMBEDDED & ~target_flags_explicit);
2689   else if (TARGET_DFP)
2690     target_flags |= (ISA_2_5_MASKS_SERVER & ~target_flags_explicit);
2691   else if (TARGET_CMPB)
2692     target_flags |= (ISA_2_5_MASKS_EMBEDDED & ~target_flags_explicit);
2693   else if (TARGET_FPRND)
2694     target_flags |= (ISA_2_4_MASKS & ~target_flags_explicit);
2695   else if (TARGET_POPCNTB)
2696     target_flags |= (ISA_2_2_MASKS & ~target_flags_explicit);
2697   else if (TARGET_ALTIVEC)
2698     target_flags |= (MASK_PPC_GFXOPT & ~target_flags_explicit);
2699
2700   /* E500mc does "better" if we inline more aggressively.  Respect the
2701      user's opinion, though.  */
2702   if (rs6000_block_move_inline_limit == 0
2703       && (rs6000_cpu == PROCESSOR_PPCE500MC
2704           || rs6000_cpu == PROCESSOR_PPCE500MC64))
2705     rs6000_block_move_inline_limit = 128;
2706
2707   /* store_one_arg depends on expand_block_move to handle at least the
2708      size of reg_parm_stack_space.  */
2709   if (rs6000_block_move_inline_limit < (TARGET_POWERPC64 ? 64 : 32))
2710     rs6000_block_move_inline_limit = (TARGET_POWERPC64 ? 64 : 32);
2711
2712   if (global_init_p)
2713     {
2714       /* If the appropriate debug option is enabled, replace the target hooks
2715          with debug versions that call the real version and then prints
2716          debugging information.  */
2717       if (TARGET_DEBUG_COST)
2718         {
2719           targetm.rtx_costs = rs6000_debug_rtx_costs;
2720           targetm.address_cost = rs6000_debug_address_cost;
2721           targetm.sched.adjust_cost = rs6000_debug_adjust_cost;
2722         }
2723
2724       if (TARGET_DEBUG_ADDR)
2725         {
2726           targetm.legitimate_address_p = rs6000_debug_legitimate_address_p;
2727           targetm.legitimize_address = rs6000_debug_legitimize_address;
2728           rs6000_secondary_reload_class_ptr
2729             = rs6000_debug_secondary_reload_class;
2730           rs6000_secondary_memory_needed_ptr
2731             = rs6000_debug_secondary_memory_needed;
2732           rs6000_cannot_change_mode_class_ptr
2733             = rs6000_debug_cannot_change_mode_class;
2734           rs6000_preferred_reload_class_ptr
2735             = rs6000_debug_preferred_reload_class;
2736           rs6000_legitimize_reload_address_ptr
2737             = rs6000_debug_legitimize_reload_address;
2738           rs6000_mode_dependent_address_ptr
2739             = rs6000_debug_mode_dependent_address;
2740         }
2741
2742       if (rs6000_veclibabi_name)
2743         {
2744           if (strcmp (rs6000_veclibabi_name, "mass") == 0)
2745             rs6000_veclib_handler = rs6000_builtin_vectorized_libmass;
2746           else
2747             {
2748               error ("unknown vectorization library ABI type (%s) for "
2749                      "-mveclibabi= switch", rs6000_veclibabi_name);
2750               ret = false;
2751             }
2752         }
2753     }
2754
2755   if (!global_options_set.x_rs6000_long_double_type_size)
2756     {
2757       if (main_target_opt != NULL
2758           && (main_target_opt->x_rs6000_long_double_type_size
2759               != RS6000_DEFAULT_LONG_DOUBLE_SIZE))
2760         error ("target attribute or pragma changes long double size");
2761       else
2762         rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
2763     }
2764
2765 #ifndef POWERPC_LINUX
2766   if (!global_options_set.x_rs6000_ieeequad)
2767     rs6000_ieeequad = 1;
2768 #endif
2769
2770   /* Disable VSX and Altivec silently if the user switched cpus to power7 in a
2771      target attribute or pragma which automatically enables both options,
2772      unless the altivec ABI was set.  This is set by default for 64-bit, but
2773      not for 32-bit.  */
2774   if (main_target_opt != NULL && !main_target_opt->x_rs6000_altivec_abi)
2775     target_flags &= ~((MASK_VSX | MASK_ALTIVEC) & ~target_flags_explicit);
2776
2777   /* Enable Altivec ABI for AIX -maltivec.  */
2778   if (TARGET_XCOFF && (TARGET_ALTIVEC || TARGET_VSX))
2779     {
2780       if (main_target_opt != NULL && !main_target_opt->x_rs6000_altivec_abi)
2781         error ("target attribute or pragma changes AltiVec ABI");
2782       else
2783         rs6000_altivec_abi = 1;
2784     }
2785
2786   /* The AltiVec ABI is the default for PowerPC-64 GNU/Linux.  For
2787      PowerPC-32 GNU/Linux, -maltivec implies the AltiVec ABI.  It can
2788      be explicitly overridden in either case.  */
2789   if (TARGET_ELF)
2790     {
2791       if (!global_options_set.x_rs6000_altivec_abi
2792           && (TARGET_64BIT || TARGET_ALTIVEC || TARGET_VSX))
2793         {
2794           if (main_target_opt != NULL &&
2795               !main_target_opt->x_rs6000_altivec_abi)
2796             error ("target attribute or pragma changes AltiVec ABI");
2797           else
2798             rs6000_altivec_abi = 1;
2799         }
2800
2801       /* Enable VRSAVE for AltiVec ABI, unless explicitly overridden.  */
2802       if (!global_options_set.x_TARGET_ALTIVEC_VRSAVE)
2803         TARGET_ALTIVEC_VRSAVE = rs6000_altivec_abi;
2804     }
2805
2806   /* Set the Darwin64 ABI as default for 64-bit Darwin.  
2807      So far, the only darwin64 targets are also MACH-O.  */
2808   if (TARGET_MACHO
2809       && DEFAULT_ABI == ABI_DARWIN 
2810       && TARGET_64BIT)
2811     {
2812       if (main_target_opt != NULL && !main_target_opt->x_rs6000_darwin64_abi)
2813         error ("target attribute or pragma changes darwin64 ABI");
2814       else
2815         {
2816           rs6000_darwin64_abi = 1;
2817           /* Default to natural alignment, for better performance.  */
2818           rs6000_alignment_flags = MASK_ALIGN_NATURAL;
2819         }
2820     }
2821
2822   /* Place FP constants in the constant pool instead of TOC
2823      if section anchors enabled.  */
2824   if (flag_section_anchors)
2825     TARGET_NO_FP_IN_TOC = 1;
2826
2827 #ifdef SUBTARGET_OVERRIDE_OPTIONS
2828   SUBTARGET_OVERRIDE_OPTIONS;
2829 #endif
2830 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
2831   SUBSUBTARGET_OVERRIDE_OPTIONS;
2832 #endif
2833 #ifdef SUB3TARGET_OVERRIDE_OPTIONS
2834   SUB3TARGET_OVERRIDE_OPTIONS;
2835 #endif
2836
2837   if (TARGET_E500 || rs6000_cpu == PROCESSOR_PPCE500MC
2838       || rs6000_cpu == PROCESSOR_PPCE500MC64)
2839     {
2840       /* The e500 and e500mc do not have string instructions, and we set
2841          MASK_STRING above when optimizing for size.  */
2842       if ((target_flags & MASK_STRING) != 0)
2843         target_flags = target_flags & ~MASK_STRING;
2844     }
2845   else if (global_options_set.x_rs6000_cpu_index)
2846     {
2847       /* For the powerpc-eabispe configuration, we set all these by
2848          default, so let's unset them if we manually set another
2849          CPU that is not the E500.  */
2850       if (main_target_opt != NULL
2851           && ((main_target_opt->x_rs6000_spe_abi != rs6000_spe_abi)
2852               || (main_target_opt->x_rs6000_spe != rs6000_spe)
2853               || (main_target_opt->x_rs6000_float_gprs != rs6000_float_gprs)))
2854         error ("target attribute or pragma changes SPE ABI");
2855       else
2856         {
2857           if (!global_options_set.x_rs6000_spe_abi)
2858             rs6000_spe_abi = 0;
2859           if (!global_options_set.x_rs6000_spe)
2860             rs6000_spe = 0;
2861           if (!global_options_set.x_rs6000_float_gprs)
2862             rs6000_float_gprs = 0;
2863         }
2864       if (!(target_flags_explicit & MASK_ISEL))
2865         target_flags &= ~MASK_ISEL;
2866     }
2867
2868   /* Detect invalid option combinations with E500.  */
2869   CHECK_E500_OPTIONS;
2870
2871   rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4
2872                         && rs6000_cpu != PROCESSOR_POWER5
2873                         && rs6000_cpu != PROCESSOR_POWER6
2874                         && rs6000_cpu != PROCESSOR_POWER7
2875                         && rs6000_cpu != PROCESSOR_PPCA2
2876                         && rs6000_cpu != PROCESSOR_CELL);
2877   rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
2878                          || rs6000_cpu == PROCESSOR_POWER5
2879                          || rs6000_cpu == PROCESSOR_POWER7);
2880   rs6000_align_branch_targets = (rs6000_cpu == PROCESSOR_POWER4
2881                                  || rs6000_cpu == PROCESSOR_POWER5
2882                                  || rs6000_cpu == PROCESSOR_POWER6
2883                                  || rs6000_cpu == PROCESSOR_POWER7
2884                                  || rs6000_cpu == PROCESSOR_PPCE500MC
2885                                  || rs6000_cpu == PROCESSOR_PPCE500MC64);
2886
2887   /* Allow debug switches to override the above settings.  These are set to -1
2888      in rs6000.opt to indicate the user hasn't directly set the switch.  */
2889   if (TARGET_ALWAYS_HINT >= 0)
2890     rs6000_always_hint = TARGET_ALWAYS_HINT;
2891
2892   if (TARGET_SCHED_GROUPS >= 0)
2893     rs6000_sched_groups = TARGET_SCHED_GROUPS;
2894
2895   if (TARGET_ALIGN_BRANCH_TARGETS >= 0)
2896     rs6000_align_branch_targets = TARGET_ALIGN_BRANCH_TARGETS;
2897
2898   rs6000_sched_restricted_insns_priority
2899     = (rs6000_sched_groups ? 1 : 0);
2900
2901   /* Handle -msched-costly-dep option.  */
2902   rs6000_sched_costly_dep
2903     = (rs6000_sched_groups ? store_to_load_dep_costly : no_dep_costly);
2904
2905   if (rs6000_sched_costly_dep_str)
2906     {
2907       if (! strcmp (rs6000_sched_costly_dep_str, "no"))
2908         rs6000_sched_costly_dep = no_dep_costly;
2909       else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
2910         rs6000_sched_costly_dep = all_deps_costly;
2911       else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
2912         rs6000_sched_costly_dep = true_store_to_load_dep_costly;
2913       else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
2914         rs6000_sched_costly_dep = store_to_load_dep_costly;
2915       else
2916         rs6000_sched_costly_dep = ((enum rs6000_dependence_cost)
2917                                    atoi (rs6000_sched_costly_dep_str));
2918     }
2919
2920   /* Handle -minsert-sched-nops option.  */
2921   rs6000_sched_insert_nops
2922     = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
2923
2924   if (rs6000_sched_insert_nops_str)
2925     {
2926       if (! strcmp (rs6000_sched_insert_nops_str, "no"))
2927         rs6000_sched_insert_nops = sched_finish_none;
2928       else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
2929         rs6000_sched_insert_nops = sched_finish_pad_groups;
2930       else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
2931         rs6000_sched_insert_nops = sched_finish_regroup_exact;
2932       else
2933         rs6000_sched_insert_nops = ((enum rs6000_nop_insertion)
2934                                     atoi (rs6000_sched_insert_nops_str));
2935     }
2936
2937   if (global_init_p)
2938     {
2939 #ifdef TARGET_REGNAMES
2940       /* If the user desires alternate register names, copy in the
2941          alternate names now.  */
2942       if (TARGET_REGNAMES)
2943         memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
2944 #endif
2945
2946       /* Set aix_struct_return last, after the ABI is determined.
2947          If -maix-struct-return or -msvr4-struct-return was explicitly
2948          used, don't override with the ABI default.  */
2949       if (!global_options_set.x_aix_struct_return)
2950         aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
2951
2952 #if 0
2953       /* IBM XL compiler defaults to unsigned bitfields.  */
2954       if (TARGET_XL_COMPAT)
2955         flag_signed_bitfields = 0;
2956 #endif
2957
2958       if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
2959         REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
2960
2961       if (TARGET_TOC)
2962         ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
2963
2964       /* We can only guarantee the availability of DI pseudo-ops when
2965          assembling for 64-bit targets.  */
2966       if (!TARGET_64BIT)
2967         {
2968           targetm.asm_out.aligned_op.di = NULL;
2969           targetm.asm_out.unaligned_op.di = NULL;
2970         }
2971
2972
2973       /* Set branch target alignment, if not optimizing for size.  */
2974       if (!optimize_size)
2975         {
2976           /* Cell wants to be aligned 8byte for dual issue.  Titan wants to be
2977              aligned 8byte to avoid misprediction by the branch predictor.  */
2978           if (rs6000_cpu == PROCESSOR_TITAN
2979               || rs6000_cpu == PROCESSOR_CELL)
2980             {
2981               if (align_functions <= 0)
2982                 align_functions = 8;
2983               if (align_jumps <= 0)
2984                 align_jumps = 8;
2985               if (align_loops <= 0)
2986                 align_loops = 8;
2987             }
2988           if (rs6000_align_branch_targets)
2989             {
2990               if (align_functions <= 0)
2991                 align_functions = 16;
2992               if (align_jumps <= 0)
2993                 align_jumps = 16;
2994               if (align_loops <= 0)
2995                 {
2996                   can_override_loop_align = 1;
2997                   align_loops = 16;
2998                 }
2999             }
3000           if (align_jumps_max_skip <= 0)
3001             align_jumps_max_skip = 15;
3002           if (align_loops_max_skip <= 0)
3003             align_loops_max_skip = 15;
3004         }
3005
3006       /* Arrange to save and restore machine status around nested functions.  */
3007       init_machine_status = rs6000_init_machine_status;
3008
3009       /* We should always be splitting complex arguments, but we can't break
3010          Linux and Darwin ABIs at the moment.  For now, only AIX is fixed.  */
3011       if (DEFAULT_ABI != ABI_AIX)
3012         targetm.calls.split_complex_arg = NULL;
3013     }
3014
3015   /* Initialize rs6000_cost with the appropriate target costs.  */
3016   if (optimize_size)
3017     rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
3018   else
3019     switch (rs6000_cpu)
3020       {
3021       case PROCESSOR_RIOS1:
3022         rs6000_cost = &rios1_cost;
3023         break;
3024
3025       case PROCESSOR_RIOS2:
3026         rs6000_cost = &rios2_cost;
3027         break;
3028
3029       case PROCESSOR_RS64A:
3030         rs6000_cost = &rs64a_cost;
3031         break;
3032
3033       case PROCESSOR_MPCCORE:
3034         rs6000_cost = &mpccore_cost;
3035         break;
3036
3037       case PROCESSOR_PPC403:
3038         rs6000_cost = &ppc403_cost;
3039         break;
3040
3041       case PROCESSOR_PPC405:
3042         rs6000_cost = &ppc405_cost;
3043         break;
3044
3045       case PROCESSOR_PPC440:
3046         rs6000_cost = &ppc440_cost;
3047         break;
3048
3049       case PROCESSOR_PPC476:
3050         rs6000_cost = &ppc476_cost;
3051         break;
3052
3053       case PROCESSOR_PPC601:
3054         rs6000_cost = &ppc601_cost;
3055         break;
3056
3057       case PROCESSOR_PPC603:
3058         rs6000_cost = &ppc603_cost;
3059         break;
3060
3061       case PROCESSOR_PPC604:
3062         rs6000_cost = &ppc604_cost;
3063         break;
3064
3065       case PROCESSOR_PPC604e:
3066         rs6000_cost = &ppc604e_cost;
3067         break;
3068
3069       case PROCESSOR_PPC620:
3070         rs6000_cost = &ppc620_cost;
3071         break;
3072
3073       case PROCESSOR_PPC630:
3074         rs6000_cost = &ppc630_cost;
3075         break;
3076
3077       case PROCESSOR_CELL:
3078         rs6000_cost = &ppccell_cost;
3079         break;
3080
3081       case PROCESSOR_PPC750:
3082       case PROCESSOR_PPC7400:
3083         rs6000_cost = &ppc750_cost;
3084         break;
3085
3086       case PROCESSOR_PPC7450:
3087         rs6000_cost = &ppc7450_cost;
3088         break;
3089
3090       case PROCESSOR_PPC8540:
3091         rs6000_cost = &ppc8540_cost;
3092         break;
3093
3094       case PROCESSOR_PPCE300C2:
3095       case PROCESSOR_PPCE300C3:
3096         rs6000_cost = &ppce300c2c3_cost;
3097         break;
3098
3099       case PROCESSOR_PPCE500MC:
3100         rs6000_cost = &ppce500mc_cost;
3101         break;
3102
3103       case PROCESSOR_PPCE500MC64:
3104         rs6000_cost = &ppce500mc64_cost;
3105         break;
3106
3107       case PROCESSOR_TITAN:
3108         rs6000_cost = &titan_cost;
3109         break;
3110
3111       case PROCESSOR_POWER4:
3112       case PROCESSOR_POWER5:
3113         rs6000_cost = &power4_cost;
3114         break;
3115
3116       case PROCESSOR_POWER6:
3117         rs6000_cost = &power6_cost;
3118         break;
3119
3120       case PROCESSOR_POWER7:
3121         rs6000_cost = &power7_cost;
3122         break;
3123
3124       case PROCESSOR_PPCA2:
3125         rs6000_cost = &ppca2_cost;
3126         break;
3127
3128       default:
3129         gcc_unreachable ();
3130       }
3131
3132   if (global_init_p)
3133     {
3134       maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
3135                              rs6000_cost->simultaneous_prefetches,
3136                              global_options.x_param_values,
3137                              global_options_set.x_param_values);
3138       maybe_set_param_value (PARAM_L1_CACHE_SIZE, rs6000_cost->l1_cache_size,
3139                              global_options.x_param_values,
3140                              global_options_set.x_param_values);
3141       maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
3142                              rs6000_cost->cache_line_size,
3143                              global_options.x_param_values,
3144                              global_options_set.x_param_values);
3145       maybe_set_param_value (PARAM_L2_CACHE_SIZE, rs6000_cost->l2_cache_size,
3146                              global_options.x_param_values,
3147                              global_options_set.x_param_values);
3148
3149       /* If using typedef char *va_list, signal that
3150          __builtin_va_start (&ap, 0) can be optimized to
3151          ap = __builtin_next_arg (0).  */
3152       if (DEFAULT_ABI != ABI_V4)
3153         targetm.expand_builtin_va_start = NULL;
3154     }
3155
3156   /* Set up single/double float flags.  
3157      If TARGET_HARD_FLOAT is set, but neither single or double is set, 
3158      then set both flags. */
3159   if (TARGET_HARD_FLOAT && TARGET_FPRS 
3160       && rs6000_single_float == 0 && rs6000_double_float == 0)
3161     rs6000_single_float = rs6000_double_float = 1;
3162
3163   /* Reset single and double FP flags if target is E500. */
3164   if (TARGET_E500) 
3165   {
3166     rs6000_single_float = rs6000_double_float = 0;
3167     if (TARGET_E500_SINGLE)
3168       rs6000_single_float = 1; 
3169     if (TARGET_E500_DOUBLE)
3170       rs6000_single_float = rs6000_double_float = 1;
3171   }
3172
3173   if (main_target_opt)
3174     {
3175       if (main_target_opt->x_rs6000_single_float != rs6000_single_float)
3176         error ("target attribute or pragma changes single precision floating "
3177                "point");
3178       if (main_target_opt->x_rs6000_double_float != rs6000_double_float)
3179         error ("target attribute or pragma changes double precision floating "
3180                "point");
3181     }
3182
3183   /* If not explicitly specified via option, decide whether to generate indexed
3184      load/store instructions.  */
3185   if (TARGET_AVOID_XFORM == -1)
3186     /* Avoid indexed addressing when targeting Power6 in order to avoid the
3187      DERAT mispredict penalty.  However the LVE and STVE altivec instructions
3188      need indexed accesses and the type used is the scalar type of the element
3189      being loaded or stored.  */
3190     TARGET_AVOID_XFORM = (rs6000_cpu == PROCESSOR_POWER6 && TARGET_CMPB
3191                           && !TARGET_ALTIVEC);
3192
3193   /* Set the -mrecip options.  */
3194   if (rs6000_recip_name)
3195     {
3196       char *p = ASTRDUP (rs6000_recip_name);
3197       char *q;
3198       unsigned int mask, i;
3199       bool invert;
3200
3201       while ((q = strtok (p, ",")) != NULL)
3202         {
3203           p = NULL;
3204           if (*q == '!')
3205             {
3206               invert = true;
3207               q++;
3208             }
3209           else
3210             invert = false;
3211
3212           if (!strcmp (q, "default"))
3213             mask = ((TARGET_RECIP_PRECISION)
3214                     ? RECIP_HIGH_PRECISION : RECIP_LOW_PRECISION);
3215           else
3216             {
3217               for (i = 0; i < ARRAY_SIZE (recip_options); i++)
3218                 if (!strcmp (q, recip_options[i].string))
3219                   {
3220                     mask = recip_options[i].mask;
3221                     break;
3222                   }
3223
3224               if (i == ARRAY_SIZE (recip_options))
3225                 {
3226                   error ("unknown option for -mrecip=%s", q);
3227                   invert = false;
3228                   mask = 0;
3229                   ret = false;
3230                 }
3231             }
3232
3233           if (invert)
3234             rs6000_recip_control &= ~mask;
3235           else
3236             rs6000_recip_control |= mask;
3237         }
3238     }
3239
3240   rs6000_init_hard_regno_mode_ok (global_init_p);
3241
3242   /* Save the initial options in case the user does function specific options */
3243   if (global_init_p)
3244     target_option_default_node = target_option_current_node
3245       = build_target_option_node ();
3246
3247   return ret;
3248 }
3249
3250 /* Implement TARGET_OPTION_OVERRIDE.  On the RS/6000 this is used to
3251    define the target cpu type.  */
3252
3253 static void
3254 rs6000_option_override (void)
3255 {
3256   (void) rs6000_option_override_internal (true);
3257 }
3258
3259 \f
3260 /* Implement targetm.vectorize.builtin_mask_for_load.  */
3261 static tree
3262 rs6000_builtin_mask_for_load (void)
3263 {
3264   if (TARGET_ALTIVEC || TARGET_VSX)
3265     return altivec_builtin_mask_for_load;
3266   else
3267     return 0;
3268 }
3269
3270 /* Implement LOOP_ALIGN. */
3271 int
3272 rs6000_loop_align (rtx label)
3273 {
3274   basic_block bb;
3275   int ninsns;
3276
3277   /* Don't override loop alignment if -falign-loops was specified. */
3278   if (!can_override_loop_align)
3279     return align_loops_log;
3280
3281   bb = BLOCK_FOR_INSN (label);
3282   ninsns = num_loop_insns(bb->loop_father);
3283
3284   /* Align small loops to 32 bytes to fit in an icache sector, otherwise return default. */
3285   if (ninsns > 4 && ninsns <= 8
3286       && (rs6000_cpu == PROCESSOR_POWER4
3287           || rs6000_cpu == PROCESSOR_POWER5
3288           || rs6000_cpu == PROCESSOR_POWER6
3289           || rs6000_cpu == PROCESSOR_POWER7))
3290     return 5;
3291   else
3292     return align_loops_log;
3293 }
3294
3295 /* Implement TARGET_LOOP_ALIGN_MAX_SKIP. */
3296 static int
3297 rs6000_loop_align_max_skip (rtx label)
3298 {
3299   return (1 << rs6000_loop_align (label)) - 1;
3300 }
3301
3302 /* Implement targetm.vectorize.builtin_conversion.
3303    Returns a decl of a function that implements conversion of an integer vector
3304    into a floating-point vector, or vice-versa.  DEST_TYPE is the
3305    destination type and SRC_TYPE the source type of the conversion.
3306    Return NULL_TREE if it is not available.  */
3307 static tree
3308 rs6000_builtin_conversion (unsigned int tcode, tree dest_type, tree src_type)
3309 {
3310   enum tree_code code = (enum tree_code) tcode;
3311
3312   switch (code)
3313     {
3314     case FIX_TRUNC_EXPR:
3315       switch (TYPE_MODE (dest_type))
3316         {
3317         case V2DImode:
3318           if (!VECTOR_UNIT_VSX_P (V2DFmode))
3319             return NULL_TREE;
3320
3321           return TYPE_UNSIGNED (dest_type)
3322             ? rs6000_builtin_decls[VSX_BUILTIN_XVCVDPUXDS_UNS]
3323             : rs6000_builtin_decls[VSX_BUILTIN_XVCVDPSXDS];
3324
3325         case V4SImode:
3326           if (VECTOR_UNIT_NONE_P (V4SImode) || VECTOR_UNIT_NONE_P (V4SFmode))
3327             return NULL_TREE;
3328
3329           return TYPE_UNSIGNED (dest_type)
3330             ? rs6000_builtin_decls[VECTOR_BUILTIN_FIXUNS_V4SF_V4SI]
3331             : rs6000_builtin_decls[VECTOR_BUILTIN_FIX_V4SF_V4SI];
3332
3333         default:
3334           return NULL_TREE;
3335         }
3336
3337     case FLOAT_EXPR:
3338       switch (TYPE_MODE (src_type))
3339         {
3340         case V2DImode:
3341           if (!VECTOR_UNIT_VSX_P (V2DFmode))
3342             return NULL_TREE;
3343
3344           return TYPE_UNSIGNED (src_type)
3345             ? rs6000_builtin_decls[VSX_BUILTIN_XVCVUXDDP]
3346             : rs6000_builtin_decls[VSX_BUILTIN_XVCVSXDDP];
3347
3348         case V4SImode:
3349           if (VECTOR_UNIT_NONE_P (V4SImode) || VECTOR_UNIT_NONE_P (V4SFmode))
3350             return NULL_TREE;
3351
3352           return TYPE_UNSIGNED (src_type)
3353             ? rs6000_builtin_decls[VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF]
3354             : rs6000_builtin_decls[VECTOR_BUILTIN_FLOAT_V4SI_V4SF];
3355
3356         default:
3357           return NULL_TREE;
3358         }
3359
3360     default:
3361       return NULL_TREE;
3362     }
3363 }
3364
3365 /* Implement targetm.vectorize.builtin_mul_widen_even.  */
3366 static tree
3367 rs6000_builtin_mul_widen_even (tree type)
3368 {
3369   if (!TARGET_ALTIVEC)
3370     return NULL_TREE;
3371
3372   switch (TYPE_MODE (type))
3373     {
3374     case V8HImode:
3375       return TYPE_UNSIGNED (type)
3376             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUH_UNS]
3377             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESH];
3378
3379     case V16QImode:
3380       return TYPE_UNSIGNED (type)
3381             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUB_UNS]
3382             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESB];
3383     default:
3384       return NULL_TREE;
3385     }
3386 }
3387
3388 /* Implement targetm.vectorize.builtin_mul_widen_odd.  */
3389 static tree
3390 rs6000_builtin_mul_widen_odd (tree type)
3391 {
3392   if (!TARGET_ALTIVEC)
3393     return NULL_TREE;
3394
3395   switch (TYPE_MODE (type))
3396     {
3397     case V8HImode:
3398       return TYPE_UNSIGNED (type)
3399             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUH_UNS]
3400             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSH];
3401
3402     case V16QImode:
3403       return TYPE_UNSIGNED (type)
3404             ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUB_UNS]
3405             : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSB];
3406     default:
3407       return NULL_TREE;
3408     }
3409 }
3410
3411
3412 /* Return true iff, data reference of TYPE can reach vector alignment (16)
3413    after applying N number of iterations.  This routine does not determine
3414    how may iterations are required to reach desired alignment.  */
3415
3416 static bool
3417 rs6000_vector_alignment_reachable (const_tree type ATTRIBUTE_UNUSED, bool is_packed)
3418 {
3419   if (is_packed)
3420     return false;
3421
3422   if (TARGET_32BIT)
3423     {
3424       if (rs6000_alignment_flags == MASK_ALIGN_NATURAL)
3425         return true;
3426
3427       if (rs6000_alignment_flags ==  MASK_ALIGN_POWER)
3428         return true;
3429
3430       return false;
3431     }
3432   else
3433     {
3434       if (TARGET_MACHO)
3435         return false;
3436
3437       /* Assuming that all other types are naturally aligned. CHECKME!  */
3438       return true;
3439     }
3440 }
3441
3442 /* Return true if the vector misalignment factor is supported by the
3443    target.  */ 
3444 bool
3445 rs6000_builtin_support_vector_misalignment (enum machine_mode mode,
3446                                             const_tree type,
3447                                             int misalignment,
3448                                             bool is_packed)
3449 {
3450   if (TARGET_VSX)
3451     {
3452       /* Return if movmisalign pattern is not supported for this mode.  */
3453       if (optab_handler (movmisalign_optab, mode) == CODE_FOR_nothing)
3454         return false;
3455
3456       if (misalignment == -1)
3457         {
3458           /* Misalignment factor is unknown at compile time but we know
3459              it's word aligned.  */
3460           if (rs6000_vector_alignment_reachable (type, is_packed))
3461             {
3462               int element_size = TREE_INT_CST_LOW (TYPE_SIZE (type));
3463
3464               if (element_size == 64 || element_size == 32)
3465                return true;
3466             }
3467
3468           return false;
3469         }
3470
3471       /* VSX supports word-aligned vector.  */
3472       if (misalignment % 4 == 0)
3473         return true;
3474     }
3475   return false;
3476 }
3477
3478 /* Implement targetm.vectorize.builtin_vec_perm.  */
3479 tree
3480 rs6000_builtin_vec_perm (tree type, tree *mask_element_type)
3481 {
3482   tree inner_type = TREE_TYPE (type);
3483   bool uns_p = TYPE_UNSIGNED (inner_type);
3484   tree d;
3485
3486   *mask_element_type = unsigned_char_type_node;
3487
3488   switch (TYPE_MODE (type))
3489     {
3490     case V16QImode:
3491       d = (uns_p
3492            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI_UNS]
3493            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI]);
3494       break;
3495
3496     case V8HImode:
3497       d = (uns_p
3498            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI_UNS]
3499            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI]);
3500       break;
3501
3502     case V4SImode:
3503       d = (uns_p
3504            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI_UNS]
3505            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI]);
3506       break;
3507
3508     case V4SFmode:
3509       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SF];
3510       break;
3511
3512     case V2DFmode:
3513       if (!TARGET_ALLOW_DF_PERMUTE)
3514         return NULL_TREE;
3515
3516       d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DF];
3517       break;
3518
3519     case V2DImode:
3520       if (!TARGET_ALLOW_DF_PERMUTE)
3521         return NULL_TREE;
3522
3523       d = (uns_p
3524            ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DI_UNS]
3525            : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DI]);
3526       break;
3527
3528     default:
3529       return NULL_TREE;
3530     }
3531
3532   gcc_assert (d);
3533   return d;
3534 }
3535
3536
3537 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
3538 static int
3539 rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
3540                                    tree vectype, int misalign)
3541 {
3542   unsigned elements;
3543
3544   switch (type_of_cost)
3545     {
3546       case scalar_stmt:
3547       case scalar_load:
3548       case scalar_store:
3549       case vector_stmt:
3550       case vector_load:
3551       case vector_store:
3552       case vec_to_scalar:
3553       case scalar_to_vec:
3554       case cond_branch_not_taken:
3555       case vec_perm:
3556         return 1;
3557
3558       case cond_branch_taken:
3559         return 3;
3560
3561       case unaligned_load:
3562         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
3563           {
3564             elements = TYPE_VECTOR_SUBPARTS (vectype);
3565             if (elements == 2)
3566               /* Double word aligned.  */
3567               return 2;
3568
3569             if (elements == 4)
3570               {
3571                 switch (misalign)
3572                   {
3573                     case 8:
3574                       /* Double word aligned.  */
3575                       return 2;
3576
3577                     case -1:
3578                       /* Unknown misalignment.  */
3579                     case 4:
3580                     case 12:
3581                       /* Word aligned.  */
3582                       return 22;
3583
3584                     default:
3585                       gcc_unreachable ();
3586                   }
3587               }
3588           }
3589
3590         if (TARGET_ALTIVEC)
3591           /* Misaligned loads are not supported.  */
3592           gcc_unreachable ();
3593
3594         return 2;
3595
3596       case unaligned_store:
3597         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
3598           {
3599             elements = TYPE_VECTOR_SUBPARTS (vectype);
3600             if (elements == 2)
3601               /* Double word aligned.  */
3602               return 2;
3603
3604             if (elements == 4)
3605               {
3606                 switch (misalign)
3607                   {
3608                     case 8:
3609                       /* Double word aligned.  */
3610                       return 2;
3611
3612                     case -1:
3613                       /* Unknown misalignment.  */
3614                     case 4:
3615                     case 12:
3616                       /* Word aligned.  */
3617                       return 23;
3618
3619                     default:
3620                       gcc_unreachable ();
3621                   }
3622               }
3623           }
3624
3625         if (TARGET_ALTIVEC)
3626           /* Misaligned stores are not supported.  */
3627           gcc_unreachable ();
3628
3629         return 2;
3630
3631       default:
3632         gcc_unreachable ();
3633     }
3634 }
3635
3636 /* Implement targetm.vectorize.preferred_simd_mode.  */
3637
3638 static enum machine_mode
3639 rs6000_preferred_simd_mode (enum machine_mode mode)
3640 {
3641   if (TARGET_VSX)
3642     switch (mode)
3643       {
3644       case DFmode:
3645         return V2DFmode;
3646       default:;
3647       }
3648   if (TARGET_ALTIVEC || TARGET_VSX)
3649     switch (mode)
3650       {
3651       case SFmode:
3652         return V4SFmode;
3653       case DImode:
3654         return V2DImode;
3655       case SImode:
3656         return V4SImode;
3657       case HImode:
3658         return V8HImode;
3659       case QImode:
3660         return V16QImode;
3661       default:;
3662       }
3663   if (TARGET_SPE)
3664     switch (mode)
3665       {
3666       case SFmode:
3667         return V2SFmode;
3668       case SImode:
3669         return V2SImode;
3670       default:;
3671       }
3672   if (TARGET_PAIRED_FLOAT
3673       && mode == SFmode)
3674     return V2SFmode;
3675   return word_mode;
3676 }
3677
3678 /* Handler for the Mathematical Acceleration Subsystem (mass) interface to a
3679    library with vectorized intrinsics.  */
3680
3681 static tree
3682 rs6000_builtin_vectorized_libmass (tree fndecl, tree type_out, tree type_in)
3683 {
3684   char name[32];
3685   const char *suffix = NULL;
3686   tree fntype, new_fndecl, bdecl = NULL_TREE;
3687   int n_args = 1;
3688   const char *bname;
3689   enum machine_mode el_mode, in_mode;
3690   int n, in_n;
3691
3692   /* Libmass is suitable for unsafe math only as it does not correctly support
3693      parts of IEEE with the required precision such as denormals.  Only support
3694      it if we have VSX to use the simd d2 or f4 functions.
3695      XXX: Add variable length support.  */
3696   if (!flag_unsafe_math_optimizations || !TARGET_VSX)
3697     return NULL_TREE;
3698
3699   el_mode = TYPE_MODE (TREE_TYPE (type_out));
3700   n = TYPE_VECTOR_SUBPARTS (type_out);
3701   in_mode = TYPE_MODE (TREE_TYPE (type_in));
3702   in_n = TYPE_VECTOR_SUBPARTS (type_in);
3703   if (el_mode != in_mode
3704       || n != in_n)
3705     return NULL_TREE;
3706
3707   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
3708     {
3709       enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
3710       switch (fn)
3711         {
3712         case BUILT_IN_ATAN2:
3713         case BUILT_IN_HYPOT:
3714         case BUILT_IN_POW:
3715           n_args = 2;
3716           /* fall through */
3717
3718         case BUILT_IN_ACOS:
3719         case BUILT_IN_ACOSH:
3720         case BUILT_IN_ASIN:
3721         case BUILT_IN_ASINH:
3722         case BUILT_IN_ATAN:
3723         case BUILT_IN_ATANH:
3724         case BUILT_IN_CBRT:
3725         case BUILT_IN_COS:
3726         case BUILT_IN_COSH:
3727         case BUILT_IN_ERF:
3728         case BUILT_IN_ERFC:
3729         case BUILT_IN_EXP2:
3730         case BUILT_IN_EXP:
3731         case BUILT_IN_EXPM1:
3732         case BUILT_IN_LGAMMA:
3733         case BUILT_IN_LOG10:
3734         case BUILT_IN_LOG1P:
3735         case BUILT_IN_LOG2:
3736         case BUILT_IN_LOG:
3737         case BUILT_IN_SIN:
3738         case BUILT_IN_SINH:
3739         case BUILT_IN_SQRT:
3740         case BUILT_IN_TAN:
3741         case BUILT_IN_TANH:
3742           bdecl = implicit_built_in_decls[fn];
3743           suffix = "d2";                                /* pow -> powd2 */
3744           if (el_mode != DFmode
3745               || n != 2)
3746             return NULL_TREE;
3747           break;
3748
3749         case BUILT_IN_ATAN2F:
3750         case BUILT_IN_HYPOTF:
3751         case BUILT_IN_POWF:
3752           n_args = 2;
3753           /* fall through */
3754
3755         case BUILT_IN_ACOSF:
3756         case BUILT_IN_ACOSHF:
3757         case BUILT_IN_ASINF:
3758         case BUILT_IN_ASINHF:
3759         case BUILT_IN_ATANF:
3760         case BUILT_IN_ATANHF:
3761         case BUILT_IN_CBRTF:
3762         case BUILT_IN_COSF:
3763         case BUILT_IN_COSHF:
3764         case BUILT_IN_ERFF:
3765         case BUILT_IN_ERFCF:
3766         case BUILT_IN_EXP2F:
3767         case BUILT_IN_EXPF:
3768         case BUILT_IN_EXPM1F:
3769         case BUILT_IN_LGAMMAF:
3770         case BUILT_IN_LOG10F:
3771         case BUILT_IN_LOG1PF:
3772         case BUILT_IN_LOG2F:
3773         case BUILT_IN_LOGF:
3774         case BUILT_IN_SINF:
3775         case BUILT_IN_SINHF:
3776         case BUILT_IN_SQRTF:
3777         case BUILT_IN_TANF:
3778         case BUILT_IN_TANHF:
3779           bdecl = implicit_built_in_decls[fn];
3780           suffix = "4";                                 /* powf -> powf4 */
3781           if (el_mode != SFmode
3782               || n != 4)
3783             return NULL_TREE;
3784           break;
3785
3786         default:
3787           return NULL_TREE;
3788         }
3789     }
3790   else
3791     return NULL_TREE;
3792
3793   gcc_assert (suffix != NULL);
3794   bname = IDENTIFIER_POINTER (DECL_NAME (bdecl));
3795   strcpy (name, bname + sizeof ("__builtin_") - 1);
3796   strcat (name, suffix);
3797
3798   if (n_args == 1)
3799     fntype = build_function_type_list (type_out, type_in, NULL);
3800   else if (n_args == 2)
3801     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
3802   else
3803     gcc_unreachable ();
3804
3805   /* Build a function declaration for the vectorized function.  */
3806   new_fndecl = build_decl (BUILTINS_LOCATION,
3807                            FUNCTION_DECL, get_identifier (name), fntype);
3808   TREE_PUBLIC (new_fndecl) = 1;
3809   DECL_EXTERNAL (new_fndecl) = 1;
3810   DECL_IS_NOVOPS (new_fndecl) = 1;
3811   TREE_READONLY (new_fndecl) = 1;
3812
3813   return new_fndecl;
3814 }
3815
3816 /* Returns a function decl for a vectorized version of the builtin function
3817    with builtin function code FN and the result vector type TYPE, or NULL_TREE
3818    if it is not available.  */
3819
3820 static tree
3821 rs6000_builtin_vectorized_function (tree fndecl, tree type_out,
3822                                     tree type_in)
3823 {
3824   enum machine_mode in_mode, out_mode;
3825   int in_n, out_n;
3826
3827   if (TREE_CODE (type_out) != VECTOR_TYPE
3828       || TREE_CODE (type_in) != VECTOR_TYPE
3829       || !TARGET_VECTORIZE_BUILTINS)
3830     return NULL_TREE;
3831
3832   out_mode = TYPE_MODE (TREE_TYPE (type_out));
3833   out_n = TYPE_VECTOR_SUBPARTS (type_out);
3834   in_mode = TYPE_MODE (TREE_TYPE (type_in));
3835   in_n = TYPE_VECTOR_SUBPARTS (type_in);
3836
3837   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
3838     {
3839       enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
3840       switch (fn)
3841         {
3842         case BUILT_IN_COPYSIGN:
3843           if (VECTOR_UNIT_VSX_P (V2DFmode)
3844               && out_mode == DFmode && out_n == 2
3845               && in_mode == DFmode && in_n == 2)
3846             return rs6000_builtin_decls[VSX_BUILTIN_CPSGNDP];
3847           break;
3848         case BUILT_IN_COPYSIGNF:
3849           if (out_mode != SFmode || out_n != 4
3850               || in_mode != SFmode || in_n != 4)
3851             break;
3852           if (VECTOR_UNIT_VSX_P (V4SFmode))
3853             return rs6000_builtin_decls[VSX_BUILTIN_CPSGNSP];
3854           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3855             return rs6000_builtin_decls[ALTIVEC_BUILTIN_COPYSIGN_V4SF];
3856           break;
3857         case BUILT_IN_SQRT:
3858           if (VECTOR_UNIT_VSX_P (V2DFmode)
3859               && out_mode == DFmode && out_n == 2
3860               && in_mode == DFmode && in_n == 2)
3861             return rs6000_builtin_decls[VSX_BUILTIN_XVSQRTDP];
3862           break;
3863         case BUILT_IN_SQRTF:
3864           if (VECTOR_UNIT_VSX_P (V4SFmode)
3865               && out_mode == SFmode && out_n == 4
3866               && in_mode == SFmode && in_n == 4)
3867             return rs6000_builtin_decls[VSX_BUILTIN_XVSQRTSP];
3868           break;
3869         case BUILT_IN_CEIL:
3870           if (VECTOR_UNIT_VSX_P (V2DFmode)
3871               && out_mode == DFmode && out_n == 2
3872               && in_mode == DFmode && in_n == 2)
3873             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIP];
3874           break;
3875         case BUILT_IN_CEILF:
3876           if (out_mode != SFmode || out_n != 4
3877               || in_mode != SFmode || in_n != 4)
3878             break;
3879           if (VECTOR_UNIT_VSX_P (V4SFmode))
3880             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIP];
3881           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3882             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIP];
3883           break;
3884         case BUILT_IN_FLOOR:
3885           if (VECTOR_UNIT_VSX_P (V2DFmode)
3886               && out_mode == DFmode && out_n == 2
3887               && in_mode == DFmode && in_n == 2)
3888             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIM];
3889           break;
3890         case BUILT_IN_FLOORF:
3891           if (out_mode != SFmode || out_n != 4
3892               || in_mode != SFmode || in_n != 4)
3893             break;
3894           if (VECTOR_UNIT_VSX_P (V4SFmode))
3895             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIM];
3896           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3897             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIM];
3898           break;
3899         case BUILT_IN_FMA:
3900           if (VECTOR_UNIT_VSX_P (V2DFmode)
3901               && out_mode == DFmode && out_n == 2
3902               && in_mode == DFmode && in_n == 2)
3903             return rs6000_builtin_decls[VSX_BUILTIN_XVMADDDP];
3904           break;
3905         case BUILT_IN_FMAF:
3906           if (VECTOR_UNIT_VSX_P (V4SFmode)
3907               && out_mode == SFmode && out_n == 4
3908               && in_mode == SFmode && in_n == 4)
3909             return rs6000_builtin_decls[VSX_BUILTIN_XVMADDSP];
3910           else if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
3911               && out_mode == SFmode && out_n == 4
3912               && in_mode == SFmode && in_n == 4)
3913             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VMADDFP];
3914           break;
3915         case BUILT_IN_TRUNC:
3916           if (VECTOR_UNIT_VSX_P (V2DFmode)
3917               && out_mode == DFmode && out_n == 2
3918               && in_mode == DFmode && in_n == 2)
3919             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIZ];
3920           break;
3921         case BUILT_IN_TRUNCF:
3922           if (out_mode != SFmode || out_n != 4
3923               || in_mode != SFmode || in_n != 4)
3924             break;
3925           if (VECTOR_UNIT_VSX_P (V4SFmode))
3926             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIZ];
3927           if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
3928             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIZ];
3929           break;
3930         case BUILT_IN_NEARBYINT:
3931           if (VECTOR_UNIT_VSX_P (V2DFmode)
3932               && flag_unsafe_math_optimizations
3933               && out_mode == DFmode && out_n == 2
3934               && in_mode == DFmode && in_n == 2)
3935             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPI];
3936           break;
3937         case BUILT_IN_NEARBYINTF:
3938           if (VECTOR_UNIT_VSX_P (V4SFmode)
3939               && flag_unsafe_math_optimizations
3940               && out_mode == SFmode && out_n == 4
3941               && in_mode == SFmode && in_n == 4)
3942             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPI];
3943           break;
3944         case BUILT_IN_RINT:
3945           if (VECTOR_UNIT_VSX_P (V2DFmode)
3946               && !flag_trapping_math
3947               && out_mode == DFmode && out_n == 2
3948               && in_mode == DFmode && in_n == 2)
3949             return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIC];
3950           break;
3951         case BUILT_IN_RINTF:
3952           if (VECTOR_UNIT_VSX_P (V4SFmode)
3953               && !flag_trapping_math
3954               && out_mode == SFmode && out_n == 4
3955               && in_mode == SFmode && in_n == 4)
3956             return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIC];
3957           break;
3958         default:
3959           break;
3960         }
3961     }
3962
3963   else if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
3964     {
3965       enum rs6000_builtins fn
3966         = (enum rs6000_builtins)DECL_FUNCTION_CODE (fndecl);
3967       switch (fn)
3968         {
3969         case RS6000_BUILTIN_RSQRTF:
3970           if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
3971               && out_mode == SFmode && out_n == 4
3972               && in_mode == SFmode && in_n == 4)
3973             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRSQRTFP];
3974           break;
3975         case RS6000_BUILTIN_RSQRT:
3976           if (VECTOR_UNIT_VSX_P (V2DFmode)
3977               && out_mode == DFmode && out_n == 2
3978               && in_mode == DFmode && in_n == 2)
3979             return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V2DF];
3980           break;
3981         case RS6000_BUILTIN_RECIPF:
3982           if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
3983               && out_mode == SFmode && out_n == 4
3984               && in_mode == SFmode && in_n == 4)
3985             return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRECIPFP];
3986           break;
3987         case RS6000_BUILTIN_RECIP:
3988           if (VECTOR_UNIT_VSX_P (V2DFmode)
3989               && out_mode == DFmode && out_n == 2
3990               && in_mode == DFmode && in_n == 2)
3991             return rs6000_builtin_decls[VSX_BUILTIN_RECIP_V2DF];
3992           break;
3993         default:
3994           break;
3995         }
3996     }
3997
3998   /* Generate calls to libmass if appropriate.  */
3999   if (rs6000_veclib_handler)
4000     return rs6000_veclib_handler (fndecl, type_out, type_in);
4001
4002   return NULL_TREE;
4003 }
4004 \f
4005 /* Default CPU string for rs6000*_file_start functions.  */
4006 static const char *rs6000_default_cpu;
4007
4008 /* Do anything needed at the start of the asm file.  */
4009
4010 static void
4011 rs6000_file_start (void)
4012 {
4013   char buffer[80];
4014   const char *start = buffer;
4015   FILE *file = asm_out_file;
4016
4017   rs6000_default_cpu = TARGET_CPU_DEFAULT;
4018
4019   default_file_start ();
4020
4021 #ifdef TARGET_BI_ARCH
4022   if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
4023     rs6000_default_cpu = 0;
4024 #endif
4025
4026   if (flag_verbose_asm)
4027     {
4028       sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
4029
4030       if (rs6000_default_cpu != 0 && rs6000_default_cpu[0] != '\0')
4031         {
4032           fprintf (file, "%s --with-cpu=%s", start, rs6000_default_cpu);
4033           start = "";
4034         }
4035
4036       if (global_options_set.x_rs6000_cpu_index)
4037         {
4038           fprintf (file, "%s -mcpu=%s", start,
4039                    processor_target_table[rs6000_cpu_index].name);
4040           start = "";
4041         }
4042
4043       if (global_options_set.x_rs6000_tune_index)
4044         {
4045           fprintf (file, "%s -mtune=%s", start,
4046                    processor_target_table[rs6000_tune_index].name);
4047           start = "";
4048         }
4049
4050       if (PPC405_ERRATUM77)
4051         {
4052           fprintf (file, "%s PPC405CR_ERRATUM77", start);
4053           start = "";
4054         }
4055
4056 #ifdef USING_ELFOS_H
4057       switch (rs6000_sdata)
4058         {
4059         case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
4060         case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
4061         case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
4062         case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
4063         }
4064
4065       if (rs6000_sdata && g_switch_value)
4066         {
4067           fprintf (file, "%s -G %d", start,
4068                    g_switch_value);
4069           start = "";
4070         }
4071 #endif
4072
4073       if (*start == '\0')
4074         putc ('\n', file);
4075     }
4076
4077   if (DEFAULT_ABI == ABI_AIX || (TARGET_ELF && flag_pic == 2))
4078     {
4079       switch_to_section (toc_section);
4080       switch_to_section (text_section);
4081     }
4082 }
4083
4084 \f
4085 /* Return nonzero if this function is known to have a null epilogue.  */
4086
4087 int
4088 direct_return (void)
4089 {
4090   if (reload_completed)
4091     {
4092       rs6000_stack_t *info = rs6000_stack_info ();
4093
4094       if (info->first_gp_reg_save == 32
4095           && info->first_fp_reg_save == 64
4096           && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
4097           && ! info->lr_save_p
4098           && ! info->cr_save_p
4099           && info->vrsave_mask == 0
4100           && ! info->push_p)
4101         return 1;
4102     }
4103
4104   return 0;
4105 }
4106
4107 /* Return the number of instructions it takes to form a constant in an
4108    integer register.  */
4109
4110 int
4111 num_insns_constant_wide (HOST_WIDE_INT value)
4112 {
4113   /* signed constant loadable with {cal|addi} */
4114   if ((unsigned HOST_WIDE_INT) (value + 0x8000) < 0x10000)
4115     return 1;
4116
4117   /* constant loadable with {cau|addis} */
4118   else if ((value & 0xffff) == 0
4119            && (value >> 31 == -1 || value >> 31 == 0))
4120     return 1;
4121
4122 #if HOST_BITS_PER_WIDE_INT == 64
4123   else if (TARGET_POWERPC64)
4124     {
4125       HOST_WIDE_INT low  = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
4126       HOST_WIDE_INT high = value >> 31;
4127
4128       if (high == 0 || high == -1)
4129         return 2;
4130
4131       high >>= 1;
4132
4133       if (low == 0)
4134         return num_insns_constant_wide (high) + 1;
4135       else if (high == 0)
4136         return num_insns_constant_wide (low) + 1;
4137       else
4138         return (num_insns_constant_wide (high)
4139                 + num_insns_constant_wide (low) + 1);
4140     }
4141 #endif
4142
4143   else
4144     return 2;
4145 }
4146
4147 int
4148 num_insns_constant (rtx op, enum machine_mode mode)
4149 {
4150   HOST_WIDE_INT low, high;
4151
4152   switch (GET_CODE (op))
4153     {
4154     case CONST_INT:
4155 #if HOST_BITS_PER_WIDE_INT == 64
4156       if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
4157           && mask64_operand (op, mode))
4158         return 2;
4159       else
4160 #endif
4161         return num_insns_constant_wide (INTVAL (op));
4162
4163       case CONST_DOUBLE:
4164         if (mode == SFmode || mode == SDmode)
4165           {
4166             long l;
4167             REAL_VALUE_TYPE rv;
4168
4169             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4170             if (DECIMAL_FLOAT_MODE_P (mode))
4171               REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
4172             else
4173               REAL_VALUE_TO_TARGET_SINGLE (rv, l);
4174             return num_insns_constant_wide ((HOST_WIDE_INT) l);
4175           }
4176
4177         if (mode == VOIDmode || mode == DImode)
4178           {
4179             high = CONST_DOUBLE_HIGH (op);
4180             low  = CONST_DOUBLE_LOW (op);
4181           }
4182         else
4183           {
4184             long l[2];
4185             REAL_VALUE_TYPE rv;
4186
4187             REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4188             if (DECIMAL_FLOAT_MODE_P (mode))
4189               REAL_VALUE_TO_TARGET_DECIMAL64 (rv, l);
4190             else
4191               REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
4192             high = l[WORDS_BIG_ENDIAN == 0];
4193             low  = l[WORDS_BIG_ENDIAN != 0];
4194           }
4195
4196         if (TARGET_32BIT)
4197           return (num_insns_constant_wide (low)
4198                   + num_insns_constant_wide (high));
4199         else
4200           {
4201             if ((high == 0 && low >= 0)
4202                 || (high == -1 && low < 0))
4203               return num_insns_constant_wide (low);
4204
4205             else if (mask64_operand (op, mode))
4206               return 2;
4207
4208             else if (low == 0)
4209               return num_insns_constant_wide (high) + 1;
4210
4211             else
4212               return (num_insns_constant_wide (high)
4213                       + num_insns_constant_wide (low) + 1);
4214           }
4215
4216     default:
4217       gcc_unreachable ();
4218     }
4219 }
4220
4221 /* Interpret element ELT of the CONST_VECTOR OP as an integer value.
4222    If the mode of OP is MODE_VECTOR_INT, this simply returns the
4223    corresponding element of the vector, but for V4SFmode and V2SFmode,
4224    the corresponding "float" is interpreted as an SImode integer.  */
4225
4226 HOST_WIDE_INT
4227 const_vector_elt_as_int (rtx op, unsigned int elt)
4228 {
4229   rtx tmp;
4230
4231   /* We can't handle V2DImode and V2DFmode vector constants here yet.  */
4232   gcc_assert (GET_MODE (op) != V2DImode
4233               && GET_MODE (op) != V2DFmode);
4234
4235   tmp = CONST_VECTOR_ELT (op, elt);
4236   if (GET_MODE (op) == V4SFmode
4237       || GET_MODE (op) == V2SFmode)
4238     tmp = gen_lowpart (SImode, tmp);
4239   return INTVAL (tmp);
4240 }
4241
4242 /* Return true if OP can be synthesized with a particular vspltisb, vspltish
4243    or vspltisw instruction.  OP is a CONST_VECTOR.  Which instruction is used
4244    depends on STEP and COPIES, one of which will be 1.  If COPIES > 1,
4245    all items are set to the same value and contain COPIES replicas of the
4246    vsplt's operand; if STEP > 1, one in STEP elements is set to the vsplt's
4247    operand and the others are set to the value of the operand's msb.  */
4248
4249 static bool
4250 vspltis_constant (rtx op, unsigned step, unsigned copies)
4251 {
4252   enum machine_mode mode = GET_MODE (op);
4253   enum machine_mode inner = GET_MODE_INNER (mode);
4254
4255   unsigned i;
4256   unsigned nunits;
4257   unsigned bitsize;
4258   unsigned mask;
4259
4260   HOST_WIDE_INT val;
4261   HOST_WIDE_INT splat_val;
4262   HOST_WIDE_INT msb_val;
4263
4264   if (mode == V2DImode || mode == V2DFmode)
4265     return false;
4266
4267   nunits = GET_MODE_NUNITS (mode);
4268   bitsize = GET_MODE_BITSIZE (inner);
4269   mask = GET_MODE_MASK (inner);
4270
4271   val = const_vector_elt_as_int (op, nunits - 1);
4272   splat_val = val;
4273   msb_val = val > 0 ? 0 : -1;
4274
4275   /* Construct the value to be splatted, if possible.  If not, return 0.  */
4276   for (i = 2; i <= copies; i *= 2)
4277     {
4278       HOST_WIDE_INT small_val;
4279       bitsize /= 2;
4280       small_val = splat_val >> bitsize;
4281       mask >>= bitsize;
4282       if (splat_val != ((small_val << bitsize) | (small_val & mask)))
4283         return false;
4284       splat_val = small_val;
4285     }
4286
4287   /* Check if SPLAT_VAL can really be the operand of a vspltis[bhw].  */
4288   if (EASY_VECTOR_15 (splat_val))
4289     ;
4290
4291   /* Also check if we can splat, and then add the result to itself.  Do so if
4292      the value is positive, of if the splat instruction is using OP's mode;
4293      for splat_val < 0, the splat and the add should use the same mode.  */
4294   else if (EASY_VECTOR_15_ADD_SELF (splat_val)
4295            && (splat_val >= 0 || (step == 1 && copies == 1)))
4296     ;
4297
4298   /* Also check if are loading up the most significant bit which can be done by
4299      loading up -1 and shifting the value left by -1.  */
4300   else if (EASY_VECTOR_MSB (splat_val, inner))
4301     ;
4302
4303   else
4304     return false;
4305
4306   /* Check if VAL is present in every STEP-th element, and the
4307      other elements are filled with its most significant bit.  */
4308   for (i = 0; i < nunits - 1; ++i)
4309     {
4310       HOST_WIDE_INT desired_val;
4311       if (((i + 1) & (step - 1)) == 0)
4312         desired_val = val;
4313       else
4314         desired_val = msb_val;
4315
4316       if (desired_val != const_vector_elt_as_int (op, i))
4317         return false;
4318     }
4319
4320   return true;
4321 }
4322
4323
4324 /* Return true if OP is of the given MODE and can be synthesized
4325    with a vspltisb, vspltish or vspltisw.  */
4326
4327 bool
4328 easy_altivec_constant (rtx op, enum machine_mode mode)
4329 {
4330   unsigned step, copies;
4331
4332   if (mode == VOIDmode)
4333     mode = GET_MODE (op);
4334   else if (mode != GET_MODE (op))
4335     return false;
4336
4337   /* V2DI/V2DF was added with VSX.  Only allow 0 and all 1's as easy
4338      constants.  */
4339   if (mode == V2DFmode)
4340     return zero_constant (op, mode);
4341
4342   if (mode == V2DImode)
4343     {
4344       /* In case the compiler is built 32-bit, CONST_DOUBLE constants are not
4345          easy.  */
4346       if (GET_CODE (CONST_VECTOR_ELT (op, 0)) != CONST_INT
4347           || GET_CODE (CONST_VECTOR_ELT (op, 1)) != CONST_INT)
4348         return false;
4349
4350       if (zero_constant (op, mode))
4351         return true;
4352
4353       if (INTVAL (CONST_VECTOR_ELT (op, 0)) == -1
4354           && INTVAL (CONST_VECTOR_ELT (op, 1)) == -1)
4355         return true;
4356
4357       return false;
4358     }
4359
4360   /* Start with a vspltisw.  */
4361   step = GET_MODE_NUNITS (mode) / 4;
4362   copies = 1;
4363
4364   if (vspltis_constant (op, step, copies))
4365     return true;
4366
4367   /* Then try with a vspltish.  */
4368   if (step == 1)
4369     copies <<= 1;
4370   else
4371     step >>= 1;
4372
4373   if (vspltis_constant (op, step, copies))
4374     return true;
4375
4376   /* And finally a vspltisb.  */
4377   if (step == 1)
4378     copies <<= 1;
4379   else
4380     step >>= 1;
4381
4382   if (vspltis_constant (op, step, copies))
4383     return true;
4384
4385   return false;
4386 }
4387
4388 /* Generate a VEC_DUPLICATE representing a vspltis[bhw] instruction whose
4389    result is OP.  Abort if it is not possible.  */
4390
4391 rtx
4392 gen_easy_altivec_constant (rtx op)
4393 {
4394   enum machine_mode mode = GET_MODE (op);
4395   int nunits = GET_MODE_NUNITS (mode);
4396   rtx last = CONST_VECTOR_ELT (op, nunits - 1);
4397   unsigned step = nunits / 4;
4398   unsigned copies = 1;
4399
4400   /* Start with a vspltisw.  */
4401   if (vspltis_constant (op, step, copies))
4402     return gen_rtx_VEC_DUPLICATE (V4SImode, gen_lowpart (SImode, last));
4403
4404   /* Then try with a vspltish.  */
4405   if (step == 1)
4406     copies <<= 1;
4407   else
4408     step >>= 1;
4409
4410   if (vspltis_constant (op, step, copies))
4411     return gen_rtx_VEC_DUPLICATE (V8HImode, gen_lowpart (HImode, last));
4412
4413   /* And finally a vspltisb.  */
4414   if (step == 1)
4415     copies <<= 1;
4416   else
4417     step >>= 1;
4418
4419   if (vspltis_constant (op, step, copies))
4420     return gen_rtx_VEC_DUPLICATE (V16QImode, gen_lowpart (QImode, last));
4421
4422   gcc_unreachable ();
4423 }
4424
4425 const char *
4426 output_vec_const_move (rtx *operands)
4427 {
4428   int cst, cst2;
4429   enum machine_mode mode;
4430   rtx dest, vec;
4431
4432   dest = operands[0];
4433   vec = operands[1];
4434   mode = GET_MODE (dest);
4435
4436   if (TARGET_VSX)
4437     {
4438       if (zero_constant (vec, mode))
4439         return "xxlxor %x0,%x0,%x0";
4440
4441       if (mode == V2DImode
4442           && INTVAL (CONST_VECTOR_ELT (vec, 0)) == -1
4443           && INTVAL (CONST_VECTOR_ELT (vec, 1)) == -1)
4444         return "vspltisw %0,-1";
4445     }
4446
4447   if (TARGET_ALTIVEC)
4448     {
4449       rtx splat_vec;
4450       if (zero_constant (vec, mode))
4451         return "vxor %0,%0,%0";
4452
4453       splat_vec = gen_easy_altivec_constant (vec);
4454       gcc_assert (GET_CODE (splat_vec) == VEC_DUPLICATE);
4455       operands[1] = XEXP (splat_vec, 0);
4456       if (!EASY_VECTOR_15 (INTVAL (operands[1])))
4457         return "#";
4458
4459       switch (GET_MODE (splat_vec))
4460         {
4461         case V4SImode:
4462           return "vspltisw %0,%1";
4463
4464         case V8HImode:
4465           return "vspltish %0,%1";
4466
4467         case V16QImode:
4468           return "vspltisb %0,%1";
4469
4470         default:
4471           gcc_unreachable ();
4472         }
4473     }
4474
4475   gcc_assert (TARGET_SPE);
4476
4477   /* Vector constant 0 is handled as a splitter of V2SI, and in the
4478      pattern of V1DI, V4HI, and V2SF.
4479
4480      FIXME: We should probably return # and add post reload
4481      splitters for these, but this way is so easy ;-).  */
4482   cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
4483   cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
4484   operands[1] = CONST_VECTOR_ELT (vec, 0);
4485   operands[2] = CONST_VECTOR_ELT (vec, 1);
4486   if (cst == cst2)
4487     return "li %0,%1\n\tevmergelo %0,%0,%0";
4488   else
4489     return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
4490 }
4491
4492 /* Initialize TARGET of vector PAIRED to VALS.  */
4493
4494 void
4495 paired_expand_vector_init (rtx target, rtx vals)
4496 {
4497   enum machine_mode mode = GET_MODE (target);
4498   int n_elts = GET_MODE_NUNITS (mode);
4499   int n_var = 0;
4500   rtx x, new_rtx, tmp, constant_op, op1, op2;
4501   int i;
4502
4503   for (i = 0; i < n_elts; ++i)
4504     {
4505       x = XVECEXP (vals, 0, i);
4506       if (!CONSTANT_P (x))
4507         ++n_var;
4508     }
4509   if (n_var == 0)
4510     {
4511       /* Load from constant pool.  */
4512       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
4513       return;
4514     }
4515
4516   if (n_var == 2)
4517     {
4518       /* The vector is initialized only with non-constants.  */
4519       new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, XVECEXP (vals, 0, 0),
4520                                 XVECEXP (vals, 0, 1));
4521
4522       emit_move_insn (target, new_rtx);
4523       return;
4524     }
4525   
4526   /* One field is non-constant and the other one is a constant.  Load the
4527      constant from the constant pool and use ps_merge instruction to
4528      construct the whole vector.  */
4529   op1 = XVECEXP (vals, 0, 0);
4530   op2 = XVECEXP (vals, 0, 1);
4531
4532   constant_op = (CONSTANT_P (op1)) ? op1 : op2;
4533
4534   tmp = gen_reg_rtx (GET_MODE (constant_op));
4535   emit_move_insn (tmp, constant_op);
4536
4537   if (CONSTANT_P (op1))
4538     new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, tmp, op2);
4539   else
4540     new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, op1, tmp);
4541
4542   emit_move_insn (target, new_rtx);
4543 }
4544
4545 void
4546 paired_expand_vector_move (rtx operands[])
4547 {
4548   rtx op0 = operands[0], op1 = operands[1];
4549
4550   emit_move_insn (op0, op1);
4551 }
4552
4553 /* Emit vector compare for code RCODE.  DEST is destination, OP1 and
4554    OP2 are two VEC_COND_EXPR operands, CC_OP0 and CC_OP1 are the two
4555    operands for the relation operation COND.  This is a recursive
4556    function.  */
4557
4558 static void
4559 paired_emit_vector_compare (enum rtx_code rcode,
4560                             rtx dest, rtx op0, rtx op1,
4561                             rtx cc_op0, rtx cc_op1)
4562 {
4563   rtx tmp = gen_reg_rtx (V2SFmode);
4564   rtx tmp1, max, min;
4565
4566   gcc_assert (TARGET_PAIRED_FLOAT);
4567   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
4568
4569   switch (rcode)
4570     {
4571     case LT:
4572     case LTU:
4573       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
4574       return;
4575     case GE:
4576     case GEU:
4577       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
4578       emit_insn (gen_selv2sf4 (dest, tmp, op0, op1, CONST0_RTX (SFmode)));
4579       return;
4580     case LE:
4581     case LEU:
4582       paired_emit_vector_compare (GE, dest, op0, op1, cc_op1, cc_op0);
4583       return;
4584     case GT:
4585       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
4586       return;
4587     case EQ:
4588       tmp1 = gen_reg_rtx (V2SFmode);
4589       max = gen_reg_rtx (V2SFmode);
4590       min = gen_reg_rtx (V2SFmode);
4591       gen_reg_rtx (V2SFmode);
4592       
4593       emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
4594       emit_insn (gen_selv2sf4
4595                  (max, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
4596       emit_insn (gen_subv2sf3 (tmp, cc_op1, cc_op0));
4597       emit_insn (gen_selv2sf4
4598                  (min, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
4599       emit_insn (gen_subv2sf3 (tmp1, min, max));
4600       emit_insn (gen_selv2sf4 (dest, tmp1, op0, op1, CONST0_RTX (SFmode)));
4601       return;
4602     case NE:
4603       paired_emit_vector_compare (EQ, dest, op1, op0, cc_op0, cc_op1);
4604       return;
4605     case UNLE:
4606       paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
4607       return;
4608     case UNLT:
4609       paired_emit_vector_compare (LT, dest, op1, op0, cc_op0, cc_op1);
4610       return;
4611     case UNGE:
4612       paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
4613       return;
4614     case UNGT:
4615       paired_emit_vector_compare (GT, dest, op1, op0, cc_op0, cc_op1);
4616       return;
4617     default:
4618       gcc_unreachable ();
4619     }
4620
4621   return;
4622 }
4623
4624 /* Emit vector conditional expression.
4625    DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
4626    CC_OP0 and CC_OP1 are the two operands for the relation operation COND.  */
4627
4628 int
4629 paired_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
4630                               rtx cond, rtx cc_op0, rtx cc_op1)
4631 {
4632   enum rtx_code rcode = GET_CODE (cond);
4633
4634   if (!TARGET_PAIRED_FLOAT)
4635     return 0;
4636
4637   paired_emit_vector_compare (rcode, dest, op1, op2, cc_op0, cc_op1);
4638
4639   return 1;
4640 }
4641
4642 /* Initialize vector TARGET to VALS.  */
4643
4644 void
4645 rs6000_expand_vector_init (rtx target, rtx vals)
4646 {
4647   enum machine_mode mode = GET_MODE (target);
4648   enum machine_mode inner_mode = GET_MODE_INNER (mode);
4649   int n_elts = GET_MODE_NUNITS (mode);
4650   int n_var = 0, one_var = -1;
4651   bool all_same = true, all_const_zero = true;
4652   rtx x, mem;
4653   int i;
4654
4655   for (i = 0; i < n_elts; ++i)
4656     {
4657       x = XVECEXP (vals, 0, i);
4658       if (!CONSTANT_P (x))
4659         ++n_var, one_var = i;
4660       else if (x != CONST0_RTX (inner_mode))
4661         all_const_zero = false;
4662
4663       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
4664         all_same = false;
4665     }
4666
4667   if (n_var == 0)
4668     {
4669       rtx const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0));
4670       bool int_vector_p = (GET_MODE_CLASS (mode) == MODE_VECTOR_INT);
4671       if ((int_vector_p || TARGET_VSX) && all_const_zero)
4672         {
4673           /* Zero register.  */
4674           emit_insn (gen_rtx_SET (VOIDmode, target,
4675                                   gen_rtx_XOR (mode, target, target)));
4676           return;
4677         }
4678       else if (int_vector_p && easy_vector_constant (const_vec, mode))
4679         {
4680           /* Splat immediate.  */
4681           emit_insn (gen_rtx_SET (VOIDmode, target, const_vec));
4682           return;
4683         }
4684       else
4685         {
4686           /* Load from constant pool.  */
4687           emit_move_insn (target, const_vec);
4688           return;
4689         }
4690     }
4691
4692   /* Double word values on VSX can use xxpermdi or lxvdsx.  */
4693   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
4694     {
4695       if (all_same)
4696         {
4697           rtx element = XVECEXP (vals, 0, 0);
4698           if (mode == V2DFmode)
4699             emit_insn (gen_vsx_splat_v2df (target, element));
4700           else
4701             emit_insn (gen_vsx_splat_v2di (target, element));
4702         }
4703       else
4704         {
4705           if (mode == V2DFmode)
4706             {
4707               rtx op0 = copy_to_mode_reg (DFmode, XVECEXP (vals, 0, 0));
4708               rtx op1 = copy_to_mode_reg (DFmode, XVECEXP (vals, 0, 1));
4709               emit_insn (gen_vsx_concat_v2df (target, op0, op1));
4710             }
4711           else
4712             {
4713               rtx op0 = copy_to_mode_reg (DImode, XVECEXP (vals, 0, 0));
4714               rtx op1 = copy_to_mode_reg (DImode, XVECEXP (vals, 0, 1));
4715               emit_insn (gen_vsx_concat_v2di (target, op0, op1));
4716             }
4717         }
4718       return;
4719     }
4720
4721   /* With single precision floating point on VSX, know that internally single
4722      precision is actually represented as a double, and either make 2 V2DF
4723      vectors, and convert these vectors to single precision, or do one
4724      conversion, and splat the result to the other elements.  */
4725   if (mode == V4SFmode && VECTOR_MEM_VSX_P (mode))
4726     {
4727       if (all_same)
4728         {
4729           rtx freg = gen_reg_rtx (V4SFmode);
4730           rtx sreg = copy_to_reg (XVECEXP (vals, 0, 0));
4731
4732           emit_insn (gen_vsx_xscvdpsp_scalar (freg, sreg));
4733           emit_insn (gen_vsx_xxspltw_v4sf (target, freg, const0_rtx));
4734         }
4735       else
4736         {
4737           rtx dbl_even = gen_reg_rtx (V2DFmode);
4738           rtx dbl_odd  = gen_reg_rtx (V2DFmode);
4739           rtx flt_even = gen_reg_rtx (V4SFmode);
4740           rtx flt_odd  = gen_reg_rtx (V4SFmode);
4741
4742           emit_insn (gen_vsx_concat_v2sf (dbl_even,
4743                                           copy_to_reg (XVECEXP (vals, 0, 0)),
4744                                           copy_to_reg (XVECEXP (vals, 0, 1))));
4745           emit_insn (gen_vsx_concat_v2sf (dbl_odd,
4746                                           copy_to_reg (XVECEXP (vals, 0, 2)),
4747                                           copy_to_reg (XVECEXP (vals, 0, 3))));
4748           emit_insn (gen_vsx_xvcvdpsp (flt_even, dbl_even));
4749           emit_insn (gen_vsx_xvcvdpsp (flt_odd, dbl_odd));
4750           emit_insn (gen_vec_extract_evenv4sf (target, flt_even, flt_odd));
4751         }
4752       return;
4753     }
4754
4755   /* Store value to stack temp.  Load vector element.  Splat.  However, splat
4756      of 64-bit items is not supported on Altivec.  */
4757   if (all_same && GET_MODE_SIZE (mode) <= 4)
4758     {
4759       mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
4760       emit_move_insn (adjust_address_nv (mem, inner_mode, 0),
4761                       XVECEXP (vals, 0, 0));
4762       x = gen_rtx_UNSPEC (VOIDmode,
4763                           gen_rtvec (1, const0_rtx), UNSPEC_LVE);
4764       emit_insn (gen_rtx_PARALLEL (VOIDmode,
4765                                    gen_rtvec (2,
4766                                               gen_rtx_SET (VOIDmode,
4767                                                            target, mem),
4768                                               x)));
4769       x = gen_rtx_VEC_SELECT (inner_mode, target,
4770                               gen_rtx_PARALLEL (VOIDmode,
4771                                                 gen_rtvec (1, const0_rtx)));
4772       emit_insn (gen_rtx_SET (VOIDmode, target,
4773                               gen_rtx_VEC_DUPLICATE (mode, x)));
4774       return;
4775     }
4776
4777   /* One field is non-constant.  Load constant then overwrite
4778      varying field.  */
4779   if (n_var == 1)
4780     {
4781       rtx copy = copy_rtx (vals);
4782
4783       /* Load constant part of vector, substitute neighboring value for
4784          varying element.  */
4785       XVECEXP (copy, 0, one_var) = XVECEXP (vals, 0, (one_var + 1) % n_elts);
4786       rs6000_expand_vector_init (target, copy);
4787
4788       /* Insert variable.  */
4789       rs6000_expand_vector_set (target, XVECEXP (vals, 0, one_var), one_var);
4790       return;
4791     }
4792
4793   /* Construct the vector in memory one field at a time
4794      and load the whole vector.  */
4795   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
4796   for (i = 0; i < n_elts; i++)
4797     emit_move_insn (adjust_address_nv (mem, inner_mode,
4798                                     i * GET_MODE_SIZE (inner_mode)),
4799                     XVECEXP (vals, 0, i));
4800   emit_move_insn (target, mem);
4801 }
4802
4803 /* Set field ELT of TARGET to VAL.  */
4804
4805 void
4806 rs6000_expand_vector_set (rtx target, rtx val, int elt)
4807 {
4808   enum machine_mode mode = GET_MODE (target);
4809   enum machine_mode inner_mode = GET_MODE_INNER (mode);
4810   rtx reg = gen_reg_rtx (mode);
4811   rtx mask, mem, x;
4812   int width = GET_MODE_SIZE (inner_mode);
4813   int i;
4814
4815   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
4816     {
4817       rtx (*set_func) (rtx, rtx, rtx, rtx)
4818         = ((mode == V2DFmode) ? gen_vsx_set_v2df : gen_vsx_set_v2di);
4819       emit_insn (set_func (target, target, val, GEN_INT (elt)));
4820       return;
4821     }
4822
4823   /* Load single variable value.  */
4824   mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
4825   emit_move_insn (adjust_address_nv (mem, inner_mode, 0), val);
4826   x = gen_rtx_UNSPEC (VOIDmode,
4827                       gen_rtvec (1, const0_rtx), UNSPEC_LVE);
4828   emit_insn (gen_rtx_PARALLEL (VOIDmode,
4829                                gen_rtvec (2,
4830                                           gen_rtx_SET (VOIDmode,
4831                                                        reg, mem),
4832                                           x)));
4833
4834   /* Linear sequence.  */
4835   mask = gen_rtx_PARALLEL (V16QImode, rtvec_alloc (16));
4836   for (i = 0; i < 16; ++i)
4837     XVECEXP (mask, 0, i) = GEN_INT (i);
4838
4839   /* Set permute mask to insert element into target.  */
4840   for (i = 0; i < width; ++i)
4841     XVECEXP (mask, 0, elt*width + i)
4842       = GEN_INT (i + 0x10);
4843   x = gen_rtx_CONST_VECTOR (V16QImode, XVEC (mask, 0));
4844   x = gen_rtx_UNSPEC (mode,
4845                       gen_rtvec (3, target, reg,
4846                                  force_reg (V16QImode, x)),
4847                       UNSPEC_VPERM);
4848   emit_insn (gen_rtx_SET (VOIDmode, target, x));
4849 }
4850
4851 /* Extract field ELT from VEC into TARGET.  */
4852
4853 void
4854 rs6000_expand_vector_extract (rtx target, rtx vec, int elt)
4855 {
4856   enum machine_mode mode = GET_MODE (vec);
4857   enum machine_mode inner_mode = GET_MODE_INNER (mode);
4858   rtx mem;
4859
4860   if (VECTOR_MEM_VSX_P (mode))
4861     {
4862       switch (mode)
4863         {
4864         default:
4865           break;
4866         case V2DFmode:
4867           emit_insn (gen_vsx_extract_v2df (target, vec, GEN_INT (elt)));
4868           return;
4869         case V2DImode:
4870           emit_insn (gen_vsx_extract_v2di (target, vec, GEN_INT (elt)));
4871           return;
4872         case V4SFmode:
4873           emit_insn (gen_vsx_extract_v4sf (target, vec, GEN_INT (elt)));
4874           return;
4875         }
4876     }
4877
4878   /* Allocate mode-sized buffer.  */
4879   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
4880
4881   emit_move_insn (mem, vec);
4882
4883   /* Add offset to field within buffer matching vector element.  */
4884   mem = adjust_address_nv (mem, inner_mode, elt * GET_MODE_SIZE (inner_mode));
4885
4886   emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0));
4887 }
4888
4889 /* Generates shifts and masks for a pair of rldicl or rldicr insns to
4890    implement ANDing by the mask IN.  */
4891 void
4892 build_mask64_2_operands (rtx in, rtx *out)
4893 {
4894 #if HOST_BITS_PER_WIDE_INT >= 64
4895   unsigned HOST_WIDE_INT c, lsb, m1, m2;
4896   int shift;
4897
4898   gcc_assert (GET_CODE (in) == CONST_INT);
4899
4900   c = INTVAL (in);
4901   if (c & 1)
4902     {
4903       /* Assume c initially something like 0x00fff000000fffff.  The idea
4904          is to rotate the word so that the middle ^^^^^^ group of zeros
4905          is at the MS end and can be cleared with an rldicl mask.  We then
4906          rotate back and clear off the MS    ^^ group of zeros with a
4907          second rldicl.  */
4908       c = ~c;                   /*   c == 0xff000ffffff00000 */
4909       lsb = c & -c;             /* lsb == 0x0000000000100000 */
4910       m1 = -lsb;                /*  m1 == 0xfffffffffff00000 */
4911       c = ~c;                   /*   c == 0x00fff000000fffff */
4912       c &= -lsb;                /*   c == 0x00fff00000000000 */
4913       lsb = c & -c;             /* lsb == 0x0000100000000000 */
4914       c = ~c;                   /*   c == 0xff000fffffffffff */
4915       c &= -lsb;                /*   c == 0xff00000000000000 */
4916       shift = 0;
4917       while ((lsb >>= 1) != 0)
4918         shift++;                /* shift == 44 on exit from loop */
4919       m1 <<= 64 - shift;        /*  m1 == 0xffffff0000000000 */
4920       m1 = ~m1;                 /*  m1 == 0x000000ffffffffff */
4921       m2 = ~c;                  /*  m2 == 0x00ffffffffffffff */
4922     }
4923   else
4924     {
4925       /* Assume c initially something like 0xff000f0000000000.  The idea
4926          is to rotate the word so that the     ^^^  middle group of zeros
4927          is at the LS end and can be cleared with an rldicr mask.  We then
4928          rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
4929          a second rldicr.  */
4930       lsb = c & -c;             /* lsb == 0x0000010000000000 */
4931       m2 = -lsb;                /*  m2 == 0xffffff0000000000 */
4932       c = ~c;                   /*   c == 0x00fff0ffffffffff */
4933       c &= -lsb;                /*   c == 0x00fff00000000000 */
4934       lsb = c & -c;             /* lsb == 0x0000100000000000 */
4935       c = ~c;                   /*   c == 0xff000fffffffffff */
4936       c &= -lsb;                /*   c == 0xff00000000000000 */
4937       shift = 0;
4938       while ((lsb >>= 1) != 0)
4939         shift++;                /* shift == 44 on exit from loop */
4940       m1 = ~c;                  /*  m1 == 0x00ffffffffffffff */
4941       m1 >>= shift;             /*  m1 == 0x0000000000000fff */
4942       m1 = ~m1;                 /*  m1 == 0xfffffffffffff000 */
4943     }
4944
4945   /* Note that when we only have two 0->1 and 1->0 transitions, one of the
4946      masks will be all 1's.  We are guaranteed more than one transition.  */
4947   out[0] = GEN_INT (64 - shift);
4948   out[1] = GEN_INT (m1);
4949   out[2] = GEN_INT (shift);
4950   out[3] = GEN_INT (m2);
4951 #else
4952   (void)in;
4953   (void)out;
4954   gcc_unreachable ();
4955 #endif
4956 }
4957
4958 /* Return TRUE if OP is an invalid SUBREG operation on the e500.  */
4959
4960 bool
4961 invalid_e500_subreg (rtx op, enum machine_mode mode)
4962 {
4963   if (TARGET_E500_DOUBLE)
4964     {
4965       /* Reject (subreg:SI (reg:DF)); likewise with subreg:DI or
4966          subreg:TI and reg:TF.  Decimal float modes are like integer
4967          modes (only low part of each register used) for this
4968          purpose.  */
4969       if (GET_CODE (op) == SUBREG
4970           && (mode == SImode || mode == DImode || mode == TImode
4971               || mode == DDmode || mode == TDmode)
4972           && REG_P (SUBREG_REG (op))
4973           && (GET_MODE (SUBREG_REG (op)) == DFmode
4974               || GET_MODE (SUBREG_REG (op)) == TFmode))
4975         return true;
4976
4977       /* Reject (subreg:DF (reg:DI)); likewise with subreg:TF and
4978          reg:TI.  */
4979       if (GET_CODE (op) == SUBREG
4980           && (mode == DFmode || mode == TFmode)
4981           && REG_P (SUBREG_REG (op))
4982           && (GET_MODE (SUBREG_REG (op)) == DImode
4983               || GET_MODE (SUBREG_REG (op)) == TImode
4984               || GET_MODE (SUBREG_REG (op)) == DDmode
4985               || GET_MODE (SUBREG_REG (op)) == TDmode))
4986         return true;
4987     }
4988
4989   if (TARGET_SPE
4990       && GET_CODE (op) == SUBREG
4991       && mode == SImode
4992       && REG_P (SUBREG_REG (op))
4993       && SPE_VECTOR_MODE (GET_MODE (SUBREG_REG (op))))
4994     return true;
4995
4996   return false;
4997 }
4998
4999 /* AIX increases natural record alignment to doubleword if the first
5000    field is an FP double while the FP fields remain word aligned.  */
5001
5002 unsigned int
5003 rs6000_special_round_type_align (tree type, unsigned int computed,
5004                                  unsigned int specified)
5005 {
5006   unsigned int align = MAX (computed, specified);
5007   tree field = TYPE_FIELDS (type);
5008
5009   /* Skip all non field decls */
5010   while (field != NULL && TREE_CODE (field) != FIELD_DECL)
5011     field = DECL_CHAIN (field);
5012
5013   if (field != NULL && field != type)
5014     {
5015       type = TREE_TYPE (field);
5016       while (TREE_CODE (type) == ARRAY_TYPE)
5017         type = TREE_TYPE (type);
5018
5019       if (type != error_mark_node && TYPE_MODE (type) == DFmode)
5020         align = MAX (align, 64);
5021     }
5022
5023   return align;
5024 }
5025
5026 /* Darwin increases record alignment to the natural alignment of
5027    the first field.  */
5028
5029 unsigned int
5030 darwin_rs6000_special_round_type_align (tree type, unsigned int computed,
5031                                         unsigned int specified)
5032 {
5033   unsigned int align = MAX (computed, specified);
5034
5035   if (TYPE_PACKED (type))
5036     return align;
5037
5038   /* Find the first field, looking down into aggregates.  */
5039   do {
5040     tree field = TYPE_FIELDS (type);
5041     /* Skip all non field decls */
5042     while (field != NULL && TREE_CODE (field) != FIELD_DECL)
5043       field = DECL_CHAIN (field);
5044     if (! field)
5045       break;
5046     /* A packed field does not contribute any extra alignment.  */
5047     if (DECL_PACKED (field))
5048       return align;
5049     type = TREE_TYPE (field);
5050     while (TREE_CODE (type) == ARRAY_TYPE)
5051       type = TREE_TYPE (type);
5052   } while (AGGREGATE_TYPE_P (type));
5053
5054   if (! AGGREGATE_TYPE_P (type) && type != error_mark_node)
5055     align = MAX (align, TYPE_ALIGN (type));
5056
5057   return align;
5058 }
5059
5060 /* Return 1 for an operand in small memory on V.4/eabi.  */
5061
5062 int
5063 small_data_operand (rtx op ATTRIBUTE_UNUSED,
5064                     enum machine_mode mode ATTRIBUTE_UNUSED)
5065 {
5066 #if TARGET_ELF
5067   rtx sym_ref;
5068
5069   if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
5070     return 0;
5071
5072   if (DEFAULT_ABI != ABI_V4)
5073     return 0;
5074
5075   /* Vector and float memory instructions have a limited offset on the
5076      SPE, so using a vector or float variable directly as an operand is
5077      not useful.  */
5078   if (TARGET_SPE
5079       && (SPE_VECTOR_MODE (mode) || FLOAT_MODE_P (mode)))
5080     return 0;
5081
5082   if (GET_CODE (op) == SYMBOL_REF)
5083     sym_ref = op;
5084
5085   else if (GET_CODE (op) != CONST
5086            || GET_CODE (XEXP (op, 0)) != PLUS
5087            || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
5088            || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
5089     return 0;
5090
5091   else
5092     {
5093       rtx sum = XEXP (op, 0);
5094       HOST_WIDE_INT summand;
5095
5096       /* We have to be careful here, because it is the referenced address
5097          that must be 32k from _SDA_BASE_, not just the symbol.  */
5098       summand = INTVAL (XEXP (sum, 1));
5099       if (summand < 0 || summand > g_switch_value)
5100         return 0;
5101
5102       sym_ref = XEXP (sum, 0);
5103     }
5104
5105   return SYMBOL_REF_SMALL_P (sym_ref);
5106 #else
5107   return 0;
5108 #endif
5109 }
5110
5111 /* Return true if either operand is a general purpose register.  */
5112
5113 bool
5114 gpr_or_gpr_p (rtx op0, rtx op1)
5115 {
5116   return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
5117           || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
5118 }
5119
5120 \f
5121 /* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address_p.  */
5122
5123 static bool
5124 reg_offset_addressing_ok_p (enum machine_mode mode)
5125 {
5126   switch (mode)
5127     {
5128     case V16QImode:
5129     case V8HImode:
5130     case V4SFmode:
5131     case V4SImode:
5132     case V2DFmode:
5133     case V2DImode:
5134       /* AltiVec/VSX vector modes.  Only reg+reg addressing is valid.  */
5135       if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
5136         return false;
5137       break;
5138
5139     case V4HImode:
5140     case V2SImode:
5141     case V1DImode:
5142     case V2SFmode:
5143        /* Paired vector modes.  Only reg+reg addressing is valid.  */
5144       if (TARGET_PAIRED_FLOAT)
5145         return false;
5146       break;
5147
5148     default:
5149       break;
5150     }
5151
5152   return true;
5153 }
5154
5155 static bool
5156 virtual_stack_registers_memory_p (rtx op)
5157 {
5158   int regnum;
5159
5160   if (GET_CODE (op) == REG)
5161     regnum = REGNO (op);
5162
5163   else if (GET_CODE (op) == PLUS
5164            && GET_CODE (XEXP (op, 0)) == REG
5165            && GET_CODE (XEXP (op, 1)) == CONST_INT)
5166     regnum = REGNO (XEXP (op, 0));
5167
5168   else
5169     return false;
5170
5171   return (regnum >= FIRST_VIRTUAL_REGISTER
5172           && regnum <= LAST_VIRTUAL_POINTER_REGISTER);
5173 }
5174
5175 /* Return true if memory accesses to OP are known to never straddle
5176    a 32k boundary.  */
5177
5178 static bool
5179 offsettable_ok_by_alignment (rtx op, HOST_WIDE_INT offset,
5180                              enum machine_mode mode)
5181 {
5182   tree decl, type;
5183   unsigned HOST_WIDE_INT dsize, dalign;
5184
5185   if (GET_CODE (op) != SYMBOL_REF)
5186     return false;
5187
5188   decl = SYMBOL_REF_DECL (op);
5189   if (!decl)
5190     {
5191       if (GET_MODE_SIZE (mode) == 0)
5192         return false;
5193
5194       /* -fsection-anchors loses the original SYMBOL_REF_DECL when
5195          replacing memory addresses with an anchor plus offset.  We
5196          could find the decl by rummaging around in the block->objects
5197          VEC for the given offset but that seems like too much work.  */
5198       dalign = 1;
5199       if (SYMBOL_REF_HAS_BLOCK_INFO_P (op)
5200           && SYMBOL_REF_ANCHOR_P (op)
5201           && SYMBOL_REF_BLOCK (op) != NULL)
5202         {
5203           struct object_block *block = SYMBOL_REF_BLOCK (op);
5204           HOST_WIDE_INT lsb, mask;
5205
5206           /* Given the alignment of the block..  */
5207           dalign = block->alignment;
5208           mask = dalign / BITS_PER_UNIT - 1;
5209
5210           /* ..and the combined offset of the anchor and any offset
5211              to this block object..  */
5212           offset += SYMBOL_REF_BLOCK_OFFSET (op);
5213           lsb = offset & -offset;
5214
5215           /* ..find how many bits of the alignment we know for the
5216              object.  */
5217           mask &= lsb - 1;
5218           dalign = mask + 1;
5219         }
5220       return dalign >= GET_MODE_SIZE (mode);
5221     }
5222
5223   if (DECL_P (decl))
5224     {
5225       if (TREE_CODE (decl) == FUNCTION_DECL)
5226         return true;
5227
5228       if (!DECL_SIZE_UNIT (decl))
5229         return false;
5230
5231       if (!host_integerp (DECL_SIZE_UNIT (decl), 1))
5232         return false;
5233
5234       dsize = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
5235       if (dsize > 32768)
5236         return false;
5237
5238       dalign = DECL_ALIGN_UNIT (decl);
5239       return dalign >= dsize;
5240     }
5241
5242   type = TREE_TYPE (decl);
5243
5244   if (TREE_CODE (decl) == STRING_CST)
5245     dsize = TREE_STRING_LENGTH (decl);
5246   else if (TYPE_SIZE_UNIT (type)
5247            && host_integerp (TYPE_SIZE_UNIT (type), 1))
5248     dsize = tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5249   else
5250     return false;
5251   if (dsize > 32768)
5252     return false;
5253
5254   dalign = TYPE_ALIGN (type);
5255   if (CONSTANT_CLASS_P (decl))
5256     dalign = CONSTANT_ALIGNMENT (decl, dalign);
5257   else
5258     dalign = DATA_ALIGNMENT (decl, dalign);
5259   dalign /= BITS_PER_UNIT;
5260   return dalign >= dsize;
5261 }
5262
5263 static bool
5264 constant_pool_expr_p (rtx op)
5265 {
5266   rtx base, offset;
5267
5268   split_const (op, &base, &offset);
5269   return (GET_CODE (base) == SYMBOL_REF
5270           && CONSTANT_POOL_ADDRESS_P (base)
5271           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (base), Pmode));
5272 }
5273
5274 static rtx tocrel_base, tocrel_offset;
5275
5276 bool
5277 toc_relative_expr_p (rtx op)
5278 {
5279   if (GET_CODE (op) != CONST)
5280     return false;
5281
5282   split_const (op, &tocrel_base, &tocrel_offset);
5283   return (GET_CODE (tocrel_base) == UNSPEC
5284           && XINT (tocrel_base, 1) == UNSPEC_TOCREL);
5285 }
5286
5287 /* Return true if X is a constant pool address, and also for cmodel=medium
5288    if X is a toc-relative address known to be offsettable within MODE.  */
5289
5290 bool
5291 legitimate_constant_pool_address_p (const_rtx x, enum machine_mode mode,
5292                                     bool strict)
5293 {
5294   return (TARGET_TOC
5295           && (GET_CODE (x) == PLUS || GET_CODE (x) == LO_SUM)
5296           && GET_CODE (XEXP (x, 0)) == REG
5297           && (REGNO (XEXP (x, 0)) == TOC_REGISTER
5298               || ((TARGET_MINIMAL_TOC
5299                    || TARGET_CMODEL != CMODEL_SMALL)
5300                   && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict)))
5301           && toc_relative_expr_p (XEXP (x, 1))
5302           && (TARGET_CMODEL != CMODEL_MEDIUM
5303               || constant_pool_expr_p (XVECEXP (tocrel_base, 0, 0))
5304               || mode == QImode
5305               || offsettable_ok_by_alignment (XVECEXP (tocrel_base, 0, 0),
5306                                               INTVAL (tocrel_offset), mode)));
5307 }
5308
5309 static bool
5310 legitimate_small_data_p (enum machine_mode mode, rtx x)
5311 {
5312   return (DEFAULT_ABI == ABI_V4
5313           && !flag_pic && !TARGET_TOC
5314           && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
5315           && small_data_operand (x, mode));
5316 }
5317
5318 /* SPE offset addressing is limited to 5-bits worth of double words.  */
5319 #define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
5320
5321 bool
5322 rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
5323 {
5324   unsigned HOST_WIDE_INT offset, extra;
5325
5326   if (GET_CODE (x) != PLUS)
5327     return false;
5328   if (GET_CODE (XEXP (x, 0)) != REG)
5329     return false;
5330   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
5331     return false;
5332   if (!reg_offset_addressing_ok_p (mode))
5333     return virtual_stack_registers_memory_p (x);
5334   if (legitimate_constant_pool_address_p (x, mode, strict))
5335     return true;
5336   if (GET_CODE (XEXP (x, 1)) != CONST_INT)
5337     return false;
5338
5339   offset = INTVAL (XEXP (x, 1));
5340   extra = 0;
5341   switch (mode)
5342     {
5343     case V4HImode:
5344     case V2SImode:
5345     case V1DImode:
5346     case V2SFmode:
5347       /* SPE vector modes.  */
5348       return SPE_CONST_OFFSET_OK (offset);
5349
5350     case DFmode:
5351       if (TARGET_E500_DOUBLE)
5352         return SPE_CONST_OFFSET_OK (offset);
5353
5354       /* If we are using VSX scalar loads, restrict ourselves to reg+reg
5355          addressing.  */
5356       if (VECTOR_MEM_VSX_P (DFmode))
5357         return false;
5358
5359     case DDmode:
5360     case DImode:
5361       /* On e500v2, we may have:
5362
5363            (subreg:DF (mem:DI (plus (reg) (const_int))) 0).
5364
5365          Which gets addressed with evldd instructions.  */
5366       if (TARGET_E500_DOUBLE)
5367         return SPE_CONST_OFFSET_OK (offset);
5368
5369       if (mode == DFmode || mode == DDmode || !TARGET_POWERPC64)
5370         extra = 4;
5371       else if (offset & 3)
5372         return false;
5373       break;
5374
5375     case TFmode:
5376       if (TARGET_E500_DOUBLE)
5377         return (SPE_CONST_OFFSET_OK (offset)
5378                 && SPE_CONST_OFFSET_OK (offset + 8));
5379
5380     case TDmode:
5381     case TImode:
5382       if (mode == TFmode || mode == TDmode || !TARGET_POWERPC64)
5383         extra = 12;
5384       else if (offset & 3)
5385         return false;
5386       else
5387         extra = 8;
5388       break;
5389
5390     default:
5391       break;
5392     }
5393
5394   offset += 0x8000;
5395   return (offset < 0x10000) && (offset + extra < 0x10000);
5396 }
5397
5398 bool
5399 legitimate_indexed_address_p (rtx x, int strict)
5400 {
5401   rtx op0, op1;
5402
5403   if (GET_CODE (x) != PLUS)
5404     return false;
5405
5406   op0 = XEXP (x, 0);
5407   op1 = XEXP (x, 1);
5408
5409   /* Recognize the rtl generated by reload which we know will later be
5410      replaced with proper base and index regs.  */
5411   if (!strict
5412       && reload_in_progress
5413       && (REG_P (op0) || GET_CODE (op0) == PLUS)
5414       && REG_P (op1))
5415     return true;
5416
5417   return (REG_P (op0) && REG_P (op1)
5418           && ((INT_REG_OK_FOR_BASE_P (op0, strict)
5419                && INT_REG_OK_FOR_INDEX_P (op1, strict))
5420               || (INT_REG_OK_FOR_BASE_P (op1, strict)
5421                   && INT_REG_OK_FOR_INDEX_P (op0, strict))));
5422 }
5423
5424 bool
5425 avoiding_indexed_address_p (enum machine_mode mode)
5426 {
5427   /* Avoid indexed addressing for modes that have non-indexed
5428      load/store instruction forms.  */
5429   return (TARGET_AVOID_XFORM && VECTOR_MEM_NONE_P (mode));
5430 }
5431
5432 inline bool
5433 legitimate_indirect_address_p (rtx x, int strict)
5434 {
5435   return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
5436 }
5437
5438 bool
5439 macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
5440 {
5441   if (!TARGET_MACHO || !flag_pic
5442       || mode != SImode || GET_CODE (x) != MEM)
5443     return false;
5444   x = XEXP (x, 0);
5445
5446   if (GET_CODE (x) != LO_SUM)
5447     return false;
5448   if (GET_CODE (XEXP (x, 0)) != REG)
5449     return false;
5450   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
5451     return false;
5452   x = XEXP (x, 1);
5453
5454   return CONSTANT_P (x);
5455 }
5456
5457 static bool
5458 legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
5459 {
5460   if (GET_CODE (x) != LO_SUM)
5461     return false;
5462   if (GET_CODE (XEXP (x, 0)) != REG)
5463     return false;
5464   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
5465     return false;
5466   /* Restrict addressing for DI because of our SUBREG hackery.  */
5467   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5468                              || mode == DDmode || mode == TDmode
5469                              || mode == DImode))
5470     return false;
5471   x = XEXP (x, 1);
5472
5473   if (TARGET_ELF || TARGET_MACHO)
5474     {
5475       if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
5476         return false;
5477       if (TARGET_TOC)
5478         return false;
5479       if (GET_MODE_NUNITS (mode) != 1)
5480         return false;
5481       if (GET_MODE_BITSIZE (mode) > 64
5482           || (GET_MODE_BITSIZE (mode) > 32 && !TARGET_POWERPC64
5483               && !(TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
5484                    && (mode == DFmode || mode == DDmode))))
5485         return false;
5486
5487       return CONSTANT_P (x);
5488     }
5489
5490   return false;
5491 }
5492
5493
5494 /* Try machine-dependent ways of modifying an illegitimate address
5495    to be legitimate.  If we find one, return the new, valid address.
5496    This is used from only one place: `memory_address' in explow.c.
5497
5498    OLDX is the address as it was before break_out_memory_refs was
5499    called.  In some cases it is useful to look at this to decide what
5500    needs to be done.
5501
5502    It is always safe for this function to do nothing.  It exists to
5503    recognize opportunities to optimize the output.
5504
5505    On RS/6000, first check for the sum of a register with a constant
5506    integer that is out of range.  If so, generate code to add the
5507    constant with the low-order 16 bits masked to the register and force
5508    this result into another register (this can be done with `cau').
5509    Then generate an address of REG+(CONST&0xffff), allowing for the
5510    possibility of bit 16 being a one.
5511
5512    Then check for the sum of a register and something not constant, try to
5513    load the other things into a register and return the sum.  */
5514
5515 static rtx
5516 rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
5517                            enum machine_mode mode)
5518 {
5519   unsigned int extra = 0;
5520
5521   if (!reg_offset_addressing_ok_p (mode))
5522     {
5523       if (virtual_stack_registers_memory_p (x))
5524         return x;
5525
5526       /* In theory we should not be seeing addresses of the form reg+0,
5527          but just in case it is generated, optimize it away.  */
5528       if (GET_CODE (x) == PLUS && XEXP (x, 1) == const0_rtx)
5529         return force_reg (Pmode, XEXP (x, 0));
5530
5531       /* Make sure both operands are registers.  */
5532       else if (GET_CODE (x) == PLUS)
5533         return gen_rtx_PLUS (Pmode,
5534                              force_reg (Pmode, XEXP (x, 0)),
5535                              force_reg (Pmode, XEXP (x, 1)));
5536       else
5537         return force_reg (Pmode, x);
5538     }
5539   if (GET_CODE (x) == SYMBOL_REF)
5540     {
5541       enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
5542       if (model != 0)
5543         return rs6000_legitimize_tls_address (x, model);
5544     }
5545
5546   switch (mode)
5547     {
5548     case DFmode:
5549     case DDmode:
5550       extra = 4;
5551       break;
5552     case DImode:
5553       if (!TARGET_POWERPC64)
5554         extra = 4;
5555       break;
5556     case TFmode:
5557     case TDmode:
5558       extra = 12;
5559       break;
5560     case TImode:
5561       extra = TARGET_POWERPC64 ? 8 : 12;
5562       break;
5563     default:
5564       break;
5565     }
5566
5567   if (GET_CODE (x) == PLUS
5568       && GET_CODE (XEXP (x, 0)) == REG
5569       && GET_CODE (XEXP (x, 1)) == CONST_INT
5570       && ((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000)
5571           >= 0x10000 - extra)
5572       && !((TARGET_POWERPC64
5573             && (mode == DImode || mode == TImode)
5574             && (INTVAL (XEXP (x, 1)) & 3) != 0)
5575            || SPE_VECTOR_MODE (mode)
5576            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5577                                       || mode == DImode || mode == DDmode
5578                                       || mode == TDmode))))
5579     {
5580       HOST_WIDE_INT high_int, low_int;
5581       rtx sum;
5582       low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
5583       if (low_int >= 0x8000 - extra)
5584         low_int = 0;
5585       high_int = INTVAL (XEXP (x, 1)) - low_int;
5586       sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
5587                                          GEN_INT (high_int)), 0);
5588       return plus_constant (sum, low_int);
5589     }
5590   else if (GET_CODE (x) == PLUS
5591            && GET_CODE (XEXP (x, 0)) == REG
5592            && GET_CODE (XEXP (x, 1)) != CONST_INT
5593            && GET_MODE_NUNITS (mode) == 1
5594            && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
5595                || TARGET_POWERPC64
5596                || ((mode != DImode && mode != DFmode && mode != DDmode)
5597                    || (TARGET_E500_DOUBLE && mode != DDmode)))
5598            && (TARGET_POWERPC64 || mode != DImode)
5599            && !avoiding_indexed_address_p (mode)
5600            && mode != TImode
5601            && mode != TFmode
5602            && mode != TDmode)
5603     {
5604       return gen_rtx_PLUS (Pmode, XEXP (x, 0),
5605                            force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
5606     }
5607   else if (SPE_VECTOR_MODE (mode)
5608            || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
5609                                       || mode == DDmode || mode == TDmode
5610                                       || mode == DImode)))
5611     {
5612       if (mode == DImode)
5613         return x;
5614       /* We accept [reg + reg] and [reg + OFFSET].  */
5615
5616       if (GET_CODE (x) == PLUS)
5617        {
5618          rtx op1 = XEXP (x, 0);
5619          rtx op2 = XEXP (x, 1);
5620          rtx y;
5621
5622          op1 = force_reg (Pmode, op1);
5623
5624          if (GET_CODE (op2) != REG
5625              && (GET_CODE (op2) != CONST_INT
5626                  || !SPE_CONST_OFFSET_OK (INTVAL (op2))
5627                  || (GET_MODE_SIZE (mode) > 8
5628                      && !SPE_CONST_OFFSET_OK (INTVAL (op2) + 8))))
5629            op2 = force_reg (Pmode, op2);
5630
5631          /* We can't always do [reg + reg] for these, because [reg +
5632             reg + offset] is not a legitimate addressing mode.  */
5633          y = gen_rtx_PLUS (Pmode, op1, op2);
5634
5635          if ((GET_MODE_SIZE (mode) > 8 || mode == DDmode) && REG_P (op2))
5636            return force_reg (Pmode, y);
5637          else
5638            return y;
5639        }
5640
5641       return force_reg (Pmode, x);
5642     }
5643   else if (TARGET_ELF
5644            && TARGET_32BIT
5645            && TARGET_NO_TOC
5646            && ! flag_pic
5647            && GET_CODE (x) != CONST_INT
5648            && GET_CODE (x) != CONST_DOUBLE
5649            && CONSTANT_P (x)
5650            && GET_MODE_NUNITS (mode) == 1
5651            && (GET_MODE_BITSIZE (mode) <= 32
5652                || ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
5653                    && (mode == DFmode || mode == DDmode))))
5654     {
5655       rtx reg = gen_reg_rtx (Pmode);
5656       emit_insn (gen_elf_high (reg, x));
5657       return gen_rtx_LO_SUM (Pmode, reg, x);
5658     }
5659   else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
5660            && ! flag_pic
5661 #if TARGET_MACHO
5662            && ! MACHO_DYNAMIC_NO_PIC_P
5663 #endif
5664            && GET_CODE (x) != CONST_INT
5665            && GET_CODE (x) != CONST_DOUBLE
5666            && CONSTANT_P (x)
5667            && GET_MODE_NUNITS (mode) == 1
5668            && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
5669                || (mode != DFmode && mode != DDmode))
5670            && mode != DImode
5671            && mode != TImode)
5672     {
5673       rtx reg = gen_reg_rtx (Pmode);
5674       emit_insn (gen_macho_high (reg, x));
5675       return gen_rtx_LO_SUM (Pmode, reg, x);
5676     }
5677   else if (TARGET_TOC
5678            && GET_CODE (x) == SYMBOL_REF
5679            && constant_pool_expr_p (x)
5680            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
5681     {
5682       rtx reg = TARGET_CMODEL != CMODEL_SMALL ? gen_reg_rtx (Pmode) : NULL_RTX;
5683       return create_TOC_reference (x, reg);
5684     }
5685   else
5686     return x;
5687 }
5688
5689 /* Debug version of rs6000_legitimize_address.  */
5690 static rtx
5691 rs6000_debug_legitimize_address (rtx x, rtx oldx, enum machine_mode mode)
5692 {
5693   rtx ret;
5694   rtx insns;
5695
5696   start_sequence ();
5697   ret = rs6000_legitimize_address (x, oldx, mode);
5698   insns = get_insns ();
5699   end_sequence ();
5700
5701   if (ret != x)
5702     {
5703       fprintf (stderr,
5704                "\nrs6000_legitimize_address: mode %s, old code %s, "
5705                "new code %s, modified\n",
5706                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)),
5707                GET_RTX_NAME (GET_CODE (ret)));
5708
5709       fprintf (stderr, "Original address:\n");
5710       debug_rtx (x);
5711
5712       fprintf (stderr, "oldx:\n");
5713       debug_rtx (oldx);
5714
5715       fprintf (stderr, "New address:\n");
5716       debug_rtx (ret);
5717
5718       if (insns)
5719         {
5720           fprintf (stderr, "Insns added:\n");
5721           debug_rtx_list (insns, 20);
5722         }
5723     }
5724   else
5725     {
5726       fprintf (stderr,
5727                "\nrs6000_legitimize_address: mode %s, code %s, no change:\n",
5728                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)));
5729
5730       debug_rtx (x);
5731     }
5732
5733   if (insns)
5734     emit_insn (insns);
5735
5736   return ret;
5737 }
5738
5739 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
5740    We need to emit DTP-relative relocations.  */
5741
5742 static void
5743 rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
5744 {
5745   switch (size)
5746     {
5747     case 4:
5748       fputs ("\t.long\t", file);
5749       break;
5750     case 8:
5751       fputs (DOUBLE_INT_ASM_OP, file);
5752       break;
5753     default:
5754       gcc_unreachable ();
5755     }
5756   output_addr_const (file, x);
5757   fputs ("@dtprel+0x8000", file);
5758 }
5759
5760 /* In the name of slightly smaller debug output, and to cater to
5761    general assembler lossage, recognize various UNSPEC sequences
5762    and turn them back into a direct symbol reference.  */
5763
5764 static rtx
5765 rs6000_delegitimize_address (rtx orig_x)
5766 {
5767   rtx x, y;
5768
5769   orig_x = delegitimize_mem_from_attrs (orig_x);
5770   x = orig_x;
5771   if (MEM_P (x))
5772     x = XEXP (x, 0);
5773
5774   if (GET_CODE (x) == (TARGET_CMODEL != CMODEL_SMALL ? LO_SUM : PLUS)
5775       && GET_CODE (XEXP (x, 1)) == CONST)
5776     {
5777       rtx offset = NULL_RTX;
5778
5779       y = XEXP (XEXP (x, 1), 0);
5780       if (GET_CODE (y) == PLUS
5781           && GET_MODE (y) == Pmode
5782           && CONST_INT_P (XEXP (y, 1)))
5783         {
5784           offset = XEXP (y, 1);
5785           y = XEXP (y, 0);
5786         }
5787       if (GET_CODE (y) == UNSPEC
5788           && XINT (y, 1) == UNSPEC_TOCREL
5789           && ((GET_CODE (XEXP (x, 0)) == REG
5790                && (REGNO (XEXP (x, 0)) == TOC_REGISTER
5791                    || TARGET_MINIMAL_TOC
5792                    || TARGET_CMODEL != CMODEL_SMALL))
5793               || (TARGET_CMODEL != CMODEL_SMALL
5794                   && GET_CODE (XEXP (x, 0)) == CONST
5795                   && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS
5796                   && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == REG
5797                   && REGNO (XEXP (XEXP (XEXP (x, 0), 0), 0)) == TOC_REGISTER
5798                   && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == HIGH
5799                   && rtx_equal_p (XEXP (x, 1),
5800                                   XEXP (XEXP (XEXP (XEXP (x, 0), 0), 1), 0)))))
5801         {
5802           y = XVECEXP (y, 0, 0);
5803           if (offset != NULL_RTX)
5804             y = gen_rtx_PLUS (Pmode, y, offset);
5805           if (!MEM_P (orig_x))
5806             return y;
5807           else
5808             return replace_equiv_address_nv (orig_x, y);
5809         }
5810     }
5811
5812   if (TARGET_MACHO
5813       && GET_CODE (orig_x) == LO_SUM
5814       && GET_CODE (XEXP (orig_x, 1)) == CONST)
5815     {
5816       y = XEXP (XEXP (orig_x, 1), 0);
5817       if (GET_CODE (y) == UNSPEC
5818           && XINT (y, 1) == UNSPEC_MACHOPIC_OFFSET)
5819         return XVECEXP (y, 0, 0);
5820     }
5821
5822   return orig_x;
5823 }
5824
5825 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
5826
5827 static GTY(()) rtx rs6000_tls_symbol;
5828 static rtx
5829 rs6000_tls_get_addr (void)
5830 {
5831   if (!rs6000_tls_symbol)
5832     rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
5833
5834   return rs6000_tls_symbol;
5835 }
5836
5837 /* Construct the SYMBOL_REF for TLS GOT references.  */
5838
5839 static GTY(()) rtx rs6000_got_symbol;
5840 static rtx
5841 rs6000_got_sym (void)
5842 {
5843   if (!rs6000_got_symbol)
5844     {
5845       rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
5846       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
5847       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
5848     }
5849
5850   return rs6000_got_symbol;
5851 }
5852
5853 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
5854    this (thread-local) address.  */
5855
5856 static rtx
5857 rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
5858 {
5859   rtx dest, insn;
5860
5861   dest = gen_reg_rtx (Pmode);
5862   if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
5863     {
5864       rtx tlsreg;
5865
5866       if (TARGET_64BIT)
5867         {
5868           tlsreg = gen_rtx_REG (Pmode, 13);
5869           insn = gen_tls_tprel_64 (dest, tlsreg, addr);
5870         }
5871       else
5872         {
5873           tlsreg = gen_rtx_REG (Pmode, 2);
5874           insn = gen_tls_tprel_32 (dest, tlsreg, addr);
5875         }
5876       emit_insn (insn);
5877     }
5878   else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
5879     {
5880       rtx tlsreg, tmp;
5881
5882       tmp = gen_reg_rtx (Pmode);
5883       if (TARGET_64BIT)
5884         {
5885           tlsreg = gen_rtx_REG (Pmode, 13);
5886           insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
5887         }
5888       else
5889         {
5890           tlsreg = gen_rtx_REG (Pmode, 2);
5891           insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
5892         }
5893       emit_insn (insn);
5894       if (TARGET_64BIT)
5895         insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
5896       else
5897         insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
5898       emit_insn (insn);
5899     }
5900   else
5901     {
5902       rtx r3, got, tga, tmp1, tmp2, call_insn;
5903
5904       /* We currently use relocations like @got@tlsgd for tls, which
5905          means the linker will handle allocation of tls entries, placing
5906          them in the .got section.  So use a pointer to the .got section,
5907          not one to secondary TOC sections used by 64-bit -mminimal-toc,
5908          or to secondary GOT sections used by 32-bit -fPIC.  */
5909       if (TARGET_64BIT)
5910         got = gen_rtx_REG (Pmode, 2);
5911       else
5912         {
5913           if (flag_pic == 1)
5914             got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
5915           else
5916             {
5917               rtx gsym = rs6000_got_sym ();
5918               got = gen_reg_rtx (Pmode);
5919               if (flag_pic == 0)
5920                 rs6000_emit_move (got, gsym, Pmode);
5921               else
5922                 {
5923                   rtx mem, lab, last;
5924
5925                   tmp1 = gen_reg_rtx (Pmode);
5926                   tmp2 = gen_reg_rtx (Pmode);
5927                   mem = gen_const_mem (Pmode, tmp1);
5928                   lab = gen_label_rtx ();
5929                   emit_insn (gen_load_toc_v4_PIC_1b (gsym, lab));
5930                   emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
5931                   emit_move_insn (tmp2, mem);
5932                   last = emit_insn (gen_addsi3 (got, tmp1, tmp2));
5933                   set_unique_reg_note (last, REG_EQUAL, gsym);
5934                 }
5935             }
5936         }
5937
5938       if (model == TLS_MODEL_GLOBAL_DYNAMIC)
5939         {
5940           tga = rs6000_tls_get_addr ();
5941           emit_library_call_value (tga, dest, LCT_CONST, Pmode,
5942                                    1, const0_rtx, Pmode);
5943
5944           r3 = gen_rtx_REG (Pmode, 3);
5945           if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
5946             insn = gen_tls_gd_aix64 (r3, got, addr, tga, const0_rtx);
5947           else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
5948             insn = gen_tls_gd_aix32 (r3, got, addr, tga, const0_rtx);
5949           else if (DEFAULT_ABI == ABI_V4)
5950             insn = gen_tls_gd_sysvsi (r3, got, addr, tga, const0_rtx);
5951           else
5952             gcc_unreachable ();
5953           call_insn = last_call_insn ();
5954           PATTERN (call_insn) = insn;
5955           if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
5956             use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
5957                      pic_offset_table_rtx);
5958         }
5959       else if (model == TLS_MODEL_LOCAL_DYNAMIC)
5960         {
5961           tga = rs6000_tls_get_addr ();
5962           tmp1 = gen_reg_rtx (Pmode);
5963           emit_library_call_value (tga, tmp1, LCT_CONST, Pmode,
5964                                    1, const0_rtx, Pmode);
5965
5966           r3 = gen_rtx_REG (Pmode, 3);
5967           if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
5968             insn = gen_tls_ld_aix64 (r3, got, tga, const0_rtx);
5969           else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
5970             insn = gen_tls_ld_aix32 (r3, got, tga, const0_rtx);
5971           else if (DEFAULT_ABI == ABI_V4)
5972             insn = gen_tls_ld_sysvsi (r3, got, tga, const0_rtx);
5973           else
5974             gcc_unreachable ();
5975           call_insn = last_call_insn ();
5976           PATTERN (call_insn) = insn;
5977           if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
5978             use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
5979                      pic_offset_table_rtx);
5980
5981           if (rs6000_tls_size == 16)
5982             {
5983               if (TARGET_64BIT)
5984                 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
5985               else
5986                 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
5987             }
5988           else if (rs6000_tls_size == 32)
5989             {
5990               tmp2 = gen_reg_rtx (Pmode);
5991               if (TARGET_64BIT)
5992                 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
5993               else
5994                 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
5995               emit_insn (insn);
5996               if (TARGET_64BIT)
5997                 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
5998               else
5999                 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
6000             }
6001           else
6002             {
6003               tmp2 = gen_reg_rtx (Pmode);
6004               if (TARGET_64BIT)
6005                 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
6006               else
6007                 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
6008               emit_insn (insn);
6009               insn = gen_rtx_SET (Pmode, dest,
6010                                   gen_rtx_PLUS (Pmode, tmp2, tmp1));
6011             }
6012           emit_insn (insn);
6013         }
6014       else
6015         {
6016           /* IE, or 64-bit offset LE.  */
6017           tmp2 = gen_reg_rtx (Pmode);
6018           if (TARGET_64BIT)
6019             insn = gen_tls_got_tprel_64 (tmp2, got, addr);
6020           else
6021             insn = gen_tls_got_tprel_32 (tmp2, got, addr);
6022           emit_insn (insn);
6023           if (TARGET_64BIT)
6024             insn = gen_tls_tls_64 (dest, tmp2, addr);
6025           else
6026             insn = gen_tls_tls_32 (dest, tmp2, addr);
6027           emit_insn (insn);
6028         }
6029     }
6030
6031   return dest;
6032 }
6033
6034 /* Return 1 if X contains a thread-local symbol.  */
6035
6036 static bool
6037 rs6000_tls_referenced_p (rtx x)
6038 {
6039   if (! TARGET_HAVE_TLS)
6040     return false;
6041
6042   return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
6043 }
6044
6045 /* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
6046
6047 static bool
6048 rs6000_cannot_force_const_mem (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
6049 {
6050   if (GET_CODE (x) == CONST
6051       && GET_CODE (XEXP (x, 0)) == PLUS
6052       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH)
6053     return true;
6054
6055   return rs6000_tls_referenced_p (x);
6056 }
6057
6058 /* Return 1 if *X is a thread-local symbol.  This is the same as
6059    rs6000_tls_symbol_ref except for the type of the unused argument.  */
6060
6061 static int
6062 rs6000_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
6063 {
6064   return RS6000_SYMBOL_REF_TLS_P (*x);
6065 }
6066
6067 /* Our implementation of LEGITIMIZE_RELOAD_ADDRESS.  Returns a value to
6068    replace the input X, or the original X if no replacement is called for.
6069    The output parameter *WIN is 1 if the calling macro should goto WIN,
6070    0 if it should not.
6071
6072    For RS/6000, we wish to handle large displacements off a base
6073    register by splitting the addend across an addiu/addis and the mem insn.
6074    This cuts number of extra insns needed from 3 to 1.
6075
6076    On Darwin, we use this to generate code for floating point constants.
6077    A movsf_low is generated so we wind up with 2 instructions rather than 3.
6078    The Darwin code is inside #if TARGET_MACHO because only then are the
6079    machopic_* functions defined.  */
6080 static rtx
6081 rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
6082                                   int opnum, int type,
6083                                   int ind_levels ATTRIBUTE_UNUSED, int *win)
6084 {
6085   bool reg_offset_p = reg_offset_addressing_ok_p (mode);
6086
6087   /* Nasty hack for vsx_splat_V2DF/V2DI load from mem, which takes a
6088      DFmode/DImode MEM.  */
6089   if (reg_offset_p
6090       && opnum == 1
6091       && ((mode == DFmode && recog_data.operand_mode[0] == V2DFmode)
6092           || (mode == DImode && recog_data.operand_mode[0] == V2DImode)))
6093     reg_offset_p = false;
6094
6095   /* We must recognize output that we have already generated ourselves.  */
6096   if (GET_CODE (x) == PLUS
6097       && GET_CODE (XEXP (x, 0)) == PLUS
6098       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6099       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6100       && GET_CODE (XEXP (x, 1)) == CONST_INT)
6101     {
6102       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6103                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6104                    opnum, (enum reload_type)type);
6105       *win = 1;
6106       return x;
6107     }
6108
6109   /* Likewise for (lo_sum (high ...) ...) output we have generated.  */
6110   if (GET_CODE (x) == LO_SUM
6111       && GET_CODE (XEXP (x, 0)) == HIGH)
6112     {
6113       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6114                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6115                    opnum, (enum reload_type)type);
6116       *win = 1;
6117       return x;
6118     }
6119
6120 #if TARGET_MACHO
6121   if (DEFAULT_ABI == ABI_DARWIN && flag_pic
6122       && GET_CODE (x) == LO_SUM
6123       && GET_CODE (XEXP (x, 0)) == PLUS
6124       && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
6125       && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
6126       && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
6127       && machopic_operand_p (XEXP (x, 1)))
6128     {
6129       /* Result of previous invocation of this function on Darwin
6130          floating point constant.  */
6131       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6132                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6133                    opnum, (enum reload_type)type);
6134       *win = 1;
6135       return x;
6136     }
6137 #endif
6138
6139   if (TARGET_CMODEL != CMODEL_SMALL
6140       && GET_CODE (x) == LO_SUM
6141       && GET_CODE (XEXP (x, 0)) == PLUS
6142       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6143       && REGNO (XEXP (XEXP (x, 0), 0)) == TOC_REGISTER
6144       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST
6145       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 0)) == HIGH
6146       && GET_CODE (XEXP (x, 1)) == CONST
6147       && GET_CODE (XEXP (XEXP (x, 1), 0)) == UNSPEC
6148       && XINT (XEXP (XEXP (x, 1), 0), 1) == UNSPEC_TOCREL
6149       && rtx_equal_p (XEXP (XEXP (XEXP (XEXP (x, 0), 1), 0), 0), XEXP (x, 1)))
6150     {
6151       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6152                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6153                    opnum, (enum reload_type) type);
6154       *win = 1;
6155       return x;
6156     }
6157
6158   /* Force ld/std non-word aligned offset into base register by wrapping
6159      in offset 0.  */
6160   if (GET_CODE (x) == PLUS
6161       && GET_CODE (XEXP (x, 0)) == REG
6162       && REGNO (XEXP (x, 0)) < 32
6163       && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
6164       && GET_CODE (XEXP (x, 1)) == CONST_INT
6165       && reg_offset_p
6166       && (INTVAL (XEXP (x, 1)) & 3) != 0
6167       && VECTOR_MEM_NONE_P (mode)
6168       && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
6169       && TARGET_POWERPC64)
6170     {
6171       x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
6172       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6173                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6174                    opnum, (enum reload_type) type);
6175       *win = 1;
6176       return x;
6177     }
6178
6179   if (GET_CODE (x) == PLUS
6180       && GET_CODE (XEXP (x, 0)) == REG
6181       && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
6182       && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
6183       && GET_CODE (XEXP (x, 1)) == CONST_INT
6184       && reg_offset_p
6185       && !SPE_VECTOR_MODE (mode)
6186       && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
6187                                   || mode == DDmode || mode == TDmode
6188                                   || mode == DImode))
6189       && VECTOR_MEM_NONE_P (mode))
6190     {
6191       HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
6192       HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
6193       HOST_WIDE_INT high
6194         = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
6195
6196       /* Check for 32-bit overflow.  */
6197       if (high + low != val)
6198         {
6199           *win = 0;
6200           return x;
6201         }
6202
6203       /* Reload the high part into a base reg; leave the low part
6204          in the mem directly.  */
6205
6206       x = gen_rtx_PLUS (GET_MODE (x),
6207                         gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
6208                                       GEN_INT (high)),
6209                         GEN_INT (low));
6210
6211       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6212                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6213                    opnum, (enum reload_type)type);
6214       *win = 1;
6215       return x;
6216     }
6217
6218   if (GET_CODE (x) == SYMBOL_REF
6219       && reg_offset_p
6220       && VECTOR_MEM_NONE_P (mode)
6221       && !SPE_VECTOR_MODE (mode)
6222 #if TARGET_MACHO
6223       && DEFAULT_ABI == ABI_DARWIN
6224       && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
6225 #else
6226       && DEFAULT_ABI == ABI_V4
6227       && !flag_pic
6228 #endif
6229       /* Don't do this for TFmode or TDmode, since the result isn't offsettable.
6230          The same goes for DImode without 64-bit gprs and DFmode and DDmode
6231          without fprs.  */
6232       && mode != TFmode
6233       && mode != TDmode
6234       && (mode != DImode || TARGET_POWERPC64)
6235       && ((mode != DFmode && mode != DDmode) || TARGET_POWERPC64
6236           || (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)))
6237     {
6238 #if TARGET_MACHO
6239       if (flag_pic)
6240         {
6241           rtx offset = machopic_gen_offset (x);
6242           x = gen_rtx_LO_SUM (GET_MODE (x),
6243                 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
6244                   gen_rtx_HIGH (Pmode, offset)), offset);
6245         }
6246       else
6247 #endif
6248         x = gen_rtx_LO_SUM (GET_MODE (x),
6249               gen_rtx_HIGH (Pmode, x), x);
6250
6251       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6252                    BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6253                    opnum, (enum reload_type)type);
6254       *win = 1;
6255       return x;
6256     }
6257
6258   /* Reload an offset address wrapped by an AND that represents the
6259      masking of the lower bits.  Strip the outer AND and let reload
6260      convert the offset address into an indirect address.  For VSX,
6261      force reload to create the address with an AND in a separate
6262      register, because we can't guarantee an altivec register will
6263      be used.  */
6264   if (VECTOR_MEM_ALTIVEC_P (mode)
6265       && GET_CODE (x) == AND
6266       && GET_CODE (XEXP (x, 0)) == PLUS
6267       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6268       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6269       && GET_CODE (XEXP (x, 1)) == CONST_INT
6270       && INTVAL (XEXP (x, 1)) == -16)
6271     {
6272       x = XEXP (x, 0);
6273       *win = 1;
6274       return x;
6275     }
6276
6277   if (TARGET_TOC
6278       && reg_offset_p
6279       && GET_CODE (x) == SYMBOL_REF
6280       && constant_pool_expr_p (x)
6281       && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
6282     {
6283       x = create_TOC_reference (x, NULL_RTX);
6284       if (TARGET_CMODEL != CMODEL_SMALL)
6285         push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6286                      BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6287                      opnum, (enum reload_type) type);
6288       *win = 1;
6289       return x;
6290     }
6291   *win = 0;
6292   return x;
6293 }
6294
6295 /* Debug version of rs6000_legitimize_reload_address.  */
6296 static rtx
6297 rs6000_debug_legitimize_reload_address (rtx x, enum machine_mode mode,
6298                                         int opnum, int type,
6299                                         int ind_levels, int *win)
6300 {
6301   rtx ret = rs6000_legitimize_reload_address (x, mode, opnum, type,
6302                                               ind_levels, win);
6303   fprintf (stderr,
6304            "\nrs6000_legitimize_reload_address: mode = %s, opnum = %d, "
6305            "type = %d, ind_levels = %d, win = %d, original addr:\n",
6306            GET_MODE_NAME (mode), opnum, type, ind_levels, *win);
6307   debug_rtx (x);
6308
6309   if (x == ret)
6310     fprintf (stderr, "Same address returned\n");
6311   else if (!ret)
6312     fprintf (stderr, "NULL returned\n");
6313   else
6314     {
6315       fprintf (stderr, "New address:\n");
6316       debug_rtx (ret);
6317     }
6318
6319   return ret;
6320 }
6321
6322 /* TARGET_LEGITIMATE_ADDRESS_P recognizes an RTL expression
6323    that is a valid memory address for an instruction.
6324    The MODE argument is the machine mode for the MEM expression
6325    that wants to use this address.
6326
6327    On the RS/6000, there are four valid address: a SYMBOL_REF that
6328    refers to a constant pool entry of an address (or the sum of it
6329    plus a constant), a short (16-bit signed) constant plus a register,
6330    the sum of two registers, or a register indirect, possibly with an
6331    auto-increment.  For DFmode, DDmode and DImode with a constant plus
6332    register, we must ensure that both words are addressable or PowerPC64
6333    with offset word aligned.
6334
6335    For modes spanning multiple registers (DFmode and DDmode in 32-bit GPRs,
6336    32-bit DImode, TImode, TFmode, TDmode), indexed addressing cannot be used
6337    because adjacent memory cells are accessed by adding word-sized offsets
6338    during assembly output.  */
6339 bool
6340 rs6000_legitimate_address_p (enum machine_mode mode, rtx x, bool reg_ok_strict)
6341 {
6342   bool reg_offset_p = reg_offset_addressing_ok_p (mode);
6343
6344   /* If this is an unaligned stvx/ldvx type address, discard the outer AND.  */
6345   if (VECTOR_MEM_ALTIVEC_P (mode)
6346       && GET_CODE (x) == AND
6347       && GET_CODE (XEXP (x, 1)) == CONST_INT
6348       && INTVAL (XEXP (x, 1)) == -16)
6349     x = XEXP (x, 0);
6350
6351   if (RS6000_SYMBOL_REF_TLS_P (x))
6352     return 0;
6353   if (legitimate_indirect_address_p (x, reg_ok_strict))
6354     return 1;
6355   if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
6356       && !VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
6357       && !SPE_VECTOR_MODE (mode)
6358       && mode != TFmode
6359       && mode != TDmode
6360       /* Restrict addressing for DI because of our SUBREG hackery.  */
6361       && !(TARGET_E500_DOUBLE
6362            && (mode == DFmode || mode == DDmode || mode == DImode))
6363       && TARGET_UPDATE
6364       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
6365     return 1;
6366   if (virtual_stack_registers_memory_p (x))
6367     return 1;
6368   if (reg_offset_p && legitimate_small_data_p (mode, x))
6369     return 1;
6370   if (reg_offset_p
6371       && legitimate_constant_pool_address_p (x, mode, reg_ok_strict))
6372     return 1;
6373   /* If not REG_OK_STRICT (before reload) let pass any stack offset.  */
6374   if (! reg_ok_strict
6375       && reg_offset_p
6376       && GET_CODE (x) == PLUS
6377       && GET_CODE (XEXP (x, 0)) == REG
6378       && (XEXP (x, 0) == virtual_stack_vars_rtx
6379           || XEXP (x, 0) == arg_pointer_rtx)
6380       && GET_CODE (XEXP (x, 1)) == CONST_INT)
6381     return 1;
6382   if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
6383     return 1;
6384   if (mode != TImode
6385       && mode != TFmode
6386       && mode != TDmode
6387       && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6388           || TARGET_POWERPC64
6389           || (mode != DFmode && mode != DDmode)
6390           || (TARGET_E500_DOUBLE && mode != DDmode))
6391       && (TARGET_POWERPC64 || mode != DImode)
6392       && !avoiding_indexed_address_p (mode)
6393       && legitimate_indexed_address_p (x, reg_ok_strict))
6394     return 1;
6395   if (GET_CODE (x) == PRE_MODIFY
6396       && mode != TImode
6397       && mode != TFmode
6398       && mode != TDmode
6399       && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6400           || TARGET_POWERPC64
6401           || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
6402       && (TARGET_POWERPC64 || mode != DImode)
6403       && !VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
6404       && !SPE_VECTOR_MODE (mode)
6405       /* Restrict addressing for DI because of our SUBREG hackery.  */
6406       && !(TARGET_E500_DOUBLE
6407            && (mode == DFmode || mode == DDmode || mode == DImode))
6408       && TARGET_UPDATE
6409       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict)
6410       && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1), reg_ok_strict)
6411           || (!avoiding_indexed_address_p (mode)
6412               && legitimate_indexed_address_p (XEXP (x, 1), reg_ok_strict)))
6413       && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
6414     return 1;
6415   if (reg_offset_p && legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
6416     return 1;
6417   return 0;
6418 }
6419
6420 /* Debug version of rs6000_legitimate_address_p.  */
6421 static bool
6422 rs6000_debug_legitimate_address_p (enum machine_mode mode, rtx x,
6423                                    bool reg_ok_strict)
6424 {
6425   bool ret = rs6000_legitimate_address_p (mode, x, reg_ok_strict);
6426   fprintf (stderr,
6427            "\nrs6000_legitimate_address_p: return = %s, mode = %s, "
6428            "strict = %d, code = %s\n",
6429            ret ? "true" : "false",
6430            GET_MODE_NAME (mode),
6431            reg_ok_strict,
6432            GET_RTX_NAME (GET_CODE (x)));
6433   debug_rtx (x);
6434
6435   return ret;
6436 }
6437
6438 /* Implement TARGET_MODE_DEPENDENT_ADDRESS_P.  */
6439
6440 static bool
6441 rs6000_mode_dependent_address_p (const_rtx addr)
6442 {
6443   return rs6000_mode_dependent_address_ptr (addr);
6444 }
6445
6446 /* Go to LABEL if ADDR (a legitimate address expression)
6447    has an effect that depends on the machine mode it is used for.
6448
6449    On the RS/6000 this is true of all integral offsets (since AltiVec
6450    and VSX modes don't allow them) or is a pre-increment or decrement.
6451
6452    ??? Except that due to conceptual problems in offsettable_address_p
6453    we can't really report the problems of integral offsets.  So leave
6454    this assuming that the adjustable offset must be valid for the
6455    sub-words of a TFmode operand, which is what we had before.  */
6456
6457 static bool
6458 rs6000_mode_dependent_address (const_rtx addr)
6459 {
6460   switch (GET_CODE (addr))
6461     {
6462     case PLUS:
6463       /* Any offset from virtual_stack_vars_rtx and arg_pointer_rtx
6464          is considered a legitimate address before reload, so there
6465          are no offset restrictions in that case.  Note that this
6466          condition is safe in strict mode because any address involving
6467          virtual_stack_vars_rtx or arg_pointer_rtx would already have
6468          been rejected as illegitimate.  */
6469       if (XEXP (addr, 0) != virtual_stack_vars_rtx
6470           && XEXP (addr, 0) != arg_pointer_rtx
6471           && GET_CODE (XEXP (addr, 1)) == CONST_INT)
6472         {
6473           unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
6474           return val + 12 + 0x8000 >= 0x10000;
6475         }
6476       break;
6477
6478     case LO_SUM:
6479       /* Anything in the constant pool is sufficiently aligned that
6480          all bytes have the same high part address.  */
6481       return !legitimate_constant_pool_address_p (addr, QImode, false);
6482
6483     /* Auto-increment cases are now treated generically in recog.c.  */
6484     case PRE_MODIFY:
6485       return TARGET_UPDATE;
6486
6487     /* AND is only allowed in Altivec loads.  */
6488     case AND:
6489       return true;
6490
6491     default:
6492       break;
6493     }
6494
6495   return false;
6496 }
6497
6498 /* Debug version of rs6000_mode_dependent_address.  */
6499 static bool
6500 rs6000_debug_mode_dependent_address (const_rtx addr)
6501 {
6502   bool ret = rs6000_mode_dependent_address (addr);
6503
6504   fprintf (stderr, "\nrs6000_mode_dependent_address: ret = %s\n",
6505            ret ? "true" : "false");
6506   debug_rtx (addr);
6507
6508   return ret;
6509 }
6510
6511 /* Implement FIND_BASE_TERM.  */
6512
6513 rtx
6514 rs6000_find_base_term (rtx op)
6515 {
6516   rtx base, offset;
6517
6518   split_const (op, &base, &offset);
6519   if (GET_CODE (base) == UNSPEC)
6520     switch (XINT (base, 1))
6521       {
6522       case UNSPEC_TOCREL:
6523       case UNSPEC_MACHOPIC_OFFSET:
6524         /* OP represents SYM [+ OFFSET] - ANCHOR.  SYM is the base term
6525            for aliasing purposes.  */
6526         return XVECEXP (base, 0, 0);
6527       }
6528
6529   return op;
6530 }
6531
6532 /* More elaborate version of recog's offsettable_memref_p predicate
6533    that works around the ??? note of rs6000_mode_dependent_address.
6534    In particular it accepts
6535
6536      (mem:DI (plus:SI (reg/f:SI 31 31) (const_int 32760 [0x7ff8])))
6537
6538    in 32-bit mode, that the recog predicate rejects.  */
6539
6540 bool
6541 rs6000_offsettable_memref_p (rtx op)
6542 {
6543   if (!MEM_P (op))
6544     return false;
6545
6546   /* First mimic offsettable_memref_p.  */
6547   if (offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)))
6548     return true;
6549
6550   /* offsettable_address_p invokes rs6000_mode_dependent_address, but
6551      the latter predicate knows nothing about the mode of the memory
6552      reference and, therefore, assumes that it is the largest supported
6553      mode (TFmode).  As a consequence, legitimate offsettable memory
6554      references are rejected.  rs6000_legitimate_offset_address_p contains
6555      the correct logic for the PLUS case of rs6000_mode_dependent_address.  */
6556   return rs6000_legitimate_offset_address_p (GET_MODE (op), XEXP (op, 0), 1);
6557 }
6558
6559 /* Change register usage conditional on target flags.  */
6560 static void
6561 rs6000_conditional_register_usage (void)
6562 {
6563   int i;
6564
6565   if (TARGET_DEBUG_TARGET)
6566     fprintf (stderr, "rs6000_conditional_register_usage called\n");
6567
6568   /* Set MQ register fixed (already call_used) if not POWER
6569      architecture (RIOS1, RIOS2, RSC, and PPC601) so that it will not
6570      be allocated.  */
6571   if (! TARGET_POWER)
6572     fixed_regs[64] = 1;
6573
6574   /* 64-bit AIX and Linux reserve GPR13 for thread-private data.  */
6575   if (TARGET_64BIT)
6576     fixed_regs[13] = call_used_regs[13]
6577       = call_really_used_regs[13] = 1;
6578
6579   /* Conditionally disable FPRs.  */
6580   if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
6581     for (i = 32; i < 64; i++)
6582       fixed_regs[i] = call_used_regs[i]
6583         = call_really_used_regs[i] = 1;
6584
6585   /* The TOC register is not killed across calls in a way that is
6586      visible to the compiler.  */
6587   if (DEFAULT_ABI == ABI_AIX)
6588     call_really_used_regs[2] = 0;
6589
6590   if (DEFAULT_ABI == ABI_V4
6591       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
6592       && flag_pic == 2)
6593     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6594
6595   if (DEFAULT_ABI == ABI_V4
6596       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
6597       && flag_pic == 1)
6598     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6599       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6600       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6601
6602   if (DEFAULT_ABI == ABI_DARWIN
6603       && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
6604       fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6605       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6606       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6607
6608   if (TARGET_TOC && TARGET_MINIMAL_TOC)
6609     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
6610       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
6611
6612   if (TARGET_SPE)
6613     {
6614       global_regs[SPEFSCR_REGNO] = 1;
6615       /* We used to use r14 as FIXED_SCRATCH to address SPE 64-bit
6616          registers in prologues and epilogues.  We no longer use r14
6617          for FIXED_SCRATCH, but we're keeping r14 out of the allocation
6618          pool for link-compatibility with older versions of GCC.  Once
6619          "old" code has died out, we can return r14 to the allocation
6620          pool.  */
6621       fixed_regs[14]
6622         = call_used_regs[14]
6623         = call_really_used_regs[14] = 1;
6624     }
6625
6626   if (!TARGET_ALTIVEC && !TARGET_VSX)
6627     {
6628       for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
6629         fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
6630       call_really_used_regs[VRSAVE_REGNO] = 1;
6631     }
6632
6633   if (TARGET_ALTIVEC || TARGET_VSX)
6634     global_regs[VSCR_REGNO] = 1;
6635
6636   if (TARGET_ALTIVEC_ABI)
6637     {
6638       for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
6639         call_used_regs[i] = call_really_used_regs[i] = 1;
6640
6641       /* AIX reserves VR20:31 in non-extended ABI mode.  */
6642       if (TARGET_XCOFF)
6643         for (i = FIRST_ALTIVEC_REGNO + 20; i < FIRST_ALTIVEC_REGNO + 32; ++i)
6644           fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
6645     }
6646 }
6647 \f
6648 /* Try to output insns to set TARGET equal to the constant C if it can
6649    be done in less than N insns.  Do all computations in MODE.
6650    Returns the place where the output has been placed if it can be
6651    done and the insns have been emitted.  If it would take more than N
6652    insns, zero is returned and no insns and emitted.  */
6653
6654 rtx
6655 rs6000_emit_set_const (rtx dest, enum machine_mode mode,
6656                        rtx source, int n ATTRIBUTE_UNUSED)
6657 {
6658   rtx result, insn, set;
6659   HOST_WIDE_INT c0, c1;
6660
6661   switch (mode)
6662     {
6663       case  QImode:
6664     case HImode:
6665       if (dest == NULL)
6666         dest = gen_reg_rtx (mode);
6667       emit_insn (gen_rtx_SET (VOIDmode, dest, source));
6668       return dest;
6669
6670     case SImode:
6671       result = !can_create_pseudo_p () ? dest : gen_reg_rtx (SImode);
6672
6673       emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (result),
6674                               GEN_INT (INTVAL (source)
6675                                        & (~ (HOST_WIDE_INT) 0xffff))));
6676       emit_insn (gen_rtx_SET (VOIDmode, dest,
6677                               gen_rtx_IOR (SImode, copy_rtx (result),
6678                                            GEN_INT (INTVAL (source) & 0xffff))));
6679       result = dest;
6680       break;
6681
6682     case DImode:
6683       switch (GET_CODE (source))
6684         {
6685         case CONST_INT:
6686           c0 = INTVAL (source);
6687           c1 = -(c0 < 0);
6688           break;
6689
6690         case CONST_DOUBLE:
6691 #if HOST_BITS_PER_WIDE_INT >= 64
6692           c0 = CONST_DOUBLE_LOW (source);
6693           c1 = -(c0 < 0);
6694 #else
6695           c0 = CONST_DOUBLE_LOW (source);
6696           c1 = CONST_DOUBLE_HIGH (source);
6697 #endif
6698           break;
6699
6700         default:
6701           gcc_unreachable ();
6702         }
6703
6704       result = rs6000_emit_set_long_const (dest, c0, c1);
6705       break;
6706
6707     default:
6708       gcc_unreachable ();
6709     }
6710
6711   insn = get_last_insn ();
6712   set = single_set (insn);
6713   if (! CONSTANT_P (SET_SRC (set)))
6714     set_unique_reg_note (insn, REG_EQUAL, source);
6715
6716   return result;
6717 }
6718
6719 /* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
6720    fall back to a straight forward decomposition.  We do this to avoid
6721    exponential run times encountered when looking for longer sequences
6722    with rs6000_emit_set_const.  */
6723 static rtx
6724 rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
6725 {
6726   if (!TARGET_POWERPC64)
6727     {
6728       rtx operand1, operand2;
6729
6730       operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
6731                                         DImode);
6732       operand2 = operand_subword_force (copy_rtx (dest), WORDS_BIG_ENDIAN != 0,
6733                                         DImode);
6734       emit_move_insn (operand1, GEN_INT (c1));
6735       emit_move_insn (operand2, GEN_INT (c2));
6736     }
6737   else
6738     {
6739       HOST_WIDE_INT ud1, ud2, ud3, ud4;
6740
6741       ud1 = c1 & 0xffff;
6742       ud2 = (c1 & 0xffff0000) >> 16;
6743 #if HOST_BITS_PER_WIDE_INT >= 64
6744       c2 = c1 >> 32;
6745 #endif
6746       ud3 = c2 & 0xffff;
6747       ud4 = (c2 & 0xffff0000) >> 16;
6748
6749       if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
6750           || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
6751         {
6752           if (ud1 & 0x8000)
6753             emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) -  0x8000)));
6754           else
6755             emit_move_insn (dest, GEN_INT (ud1));
6756         }
6757
6758       else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
6759                || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
6760         {
6761           if (ud2 & 0x8000)
6762             emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
6763                                            - 0x80000000));
6764           else
6765             emit_move_insn (dest, GEN_INT (ud2 << 16));
6766           if (ud1 != 0)
6767             emit_move_insn (copy_rtx (dest),
6768                             gen_rtx_IOR (DImode, copy_rtx (dest),
6769                                          GEN_INT (ud1)));
6770         }
6771       else if (ud3 == 0 && ud4 == 0)
6772         {
6773           gcc_assert (ud2 & 0x8000);
6774           emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
6775                                          - 0x80000000));
6776           if (ud1 != 0)
6777             emit_move_insn (copy_rtx (dest),
6778                             gen_rtx_IOR (DImode, copy_rtx (dest),
6779                                          GEN_INT (ud1)));
6780           emit_move_insn (copy_rtx (dest),
6781                           gen_rtx_ZERO_EXTEND (DImode,
6782                                                gen_lowpart (SImode,
6783                                                             copy_rtx (dest))));
6784         }
6785       else if ((ud4 == 0xffff && (ud3 & 0x8000))
6786                || (ud4 == 0 && ! (ud3 & 0x8000)))
6787         {
6788           if (ud3 & 0x8000)
6789             emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
6790                                            - 0x80000000));
6791           else
6792             emit_move_insn (dest, GEN_INT (ud3 << 16));
6793
6794           if (ud2 != 0)
6795             emit_move_insn (copy_rtx (dest),
6796                             gen_rtx_IOR (DImode, copy_rtx (dest),
6797                                          GEN_INT (ud2)));
6798           emit_move_insn (copy_rtx (dest),
6799                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
6800                                           GEN_INT (16)));
6801           if (ud1 != 0)
6802             emit_move_insn (copy_rtx (dest),
6803                             gen_rtx_IOR (DImode, copy_rtx (dest),
6804                                          GEN_INT (ud1)));
6805         }
6806       else
6807         {
6808           if (ud4 & 0x8000)
6809             emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
6810                                            - 0x80000000));
6811           else
6812             emit_move_insn (dest, GEN_INT (ud4 << 16));
6813
6814           if (ud3 != 0)
6815             emit_move_insn (copy_rtx (dest),
6816                             gen_rtx_IOR (DImode, copy_rtx (dest),
6817                                          GEN_INT (ud3)));
6818
6819           emit_move_insn (copy_rtx (dest),
6820                           gen_rtx_ASHIFT (DImode, copy_rtx (dest),
6821                                           GEN_INT (32)));
6822           if (ud2 != 0)
6823             emit_move_insn (copy_rtx (dest),
6824                             gen_rtx_IOR (DImode, copy_rtx (dest),
6825                                          GEN_INT (ud2 << 16)));
6826           if (ud1 != 0)
6827             emit_move_insn (copy_rtx (dest),
6828                             gen_rtx_IOR (DImode, copy_rtx (dest), GEN_INT (ud1)));
6829         }
6830     }
6831   return dest;
6832 }
6833
6834 /* Helper for the following.  Get rid of [r+r] memory refs
6835    in cases where it won't work (TImode, TFmode, TDmode).  */
6836
6837 static void
6838 rs6000_eliminate_indexed_memrefs (rtx operands[2])
6839 {
6840   if (reload_in_progress)
6841     return;
6842
6843   if (GET_CODE (operands[0]) == MEM
6844       && GET_CODE (XEXP (operands[0], 0)) != REG
6845       && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0),
6846                                                GET_MODE (operands[0]), false))
6847     operands[0]
6848       = replace_equiv_address (operands[0],
6849                                copy_addr_to_reg (XEXP (operands[0], 0)));
6850
6851   if (GET_CODE (operands[1]) == MEM
6852       && GET_CODE (XEXP (operands[1], 0)) != REG
6853       && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0),
6854                                                GET_MODE (operands[1]), false))
6855     operands[1]
6856       = replace_equiv_address (operands[1],
6857                                copy_addr_to_reg (XEXP (operands[1], 0)));
6858 }
6859
6860 /* Emit a move from SOURCE to DEST in mode MODE.  */
6861 void
6862 rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
6863 {
6864   rtx operands[2];
6865   operands[0] = dest;
6866   operands[1] = source;
6867
6868   if (TARGET_DEBUG_ADDR)
6869     {
6870       fprintf (stderr,
6871                "\nrs6000_emit_move: mode = %s, reload_in_progress = %d, "
6872                "reload_completed = %d, can_create_pseudos = %d.\ndest:\n",
6873                GET_MODE_NAME (mode),
6874                reload_in_progress,
6875                reload_completed,
6876                can_create_pseudo_p ());
6877       debug_rtx (dest);
6878       fprintf (stderr, "source:\n");
6879       debug_rtx (source);
6880     }
6881
6882   /* Sanity checks.  Check that we get CONST_DOUBLE only when we should.  */
6883   if (GET_CODE (operands[1]) == CONST_DOUBLE
6884       && ! FLOAT_MODE_P (mode)
6885       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
6886     {
6887       /* FIXME.  This should never happen.  */
6888       /* Since it seems that it does, do the safe thing and convert
6889          to a CONST_INT.  */
6890       operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
6891     }
6892   gcc_assert (GET_CODE (operands[1]) != CONST_DOUBLE
6893               || FLOAT_MODE_P (mode)
6894               || ((CONST_DOUBLE_HIGH (operands[1]) != 0
6895                    || CONST_DOUBLE_LOW (operands[1]) < 0)
6896                   && (CONST_DOUBLE_HIGH (operands[1]) != -1
6897                       || CONST_DOUBLE_LOW (operands[1]) >= 0)));
6898
6899   /* Check if GCC is setting up a block move that will end up using FP
6900      registers as temporaries.  We must make sure this is acceptable.  */
6901   if (GET_CODE (operands[0]) == MEM
6902       && GET_CODE (operands[1]) == MEM
6903       && mode == DImode
6904       && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
6905           || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
6906       && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
6907                                             ? 32 : MEM_ALIGN (operands[0])))
6908             || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
6909                                                ? 32
6910                                                : MEM_ALIGN (operands[1]))))
6911       && ! MEM_VOLATILE_P (operands [0])
6912       && ! MEM_VOLATILE_P (operands [1]))
6913     {
6914       emit_move_insn (adjust_address (operands[0], SImode, 0),
6915                       adjust_address (operands[1], SImode, 0));
6916       emit_move_insn (adjust_address (copy_rtx (operands[0]), SImode, 4),
6917                       adjust_address (copy_rtx (operands[1]), SImode, 4));
6918       return;
6919     }
6920
6921   if (can_create_pseudo_p () && GET_CODE (operands[0]) == MEM
6922       && !gpc_reg_operand (operands[1], mode))
6923     operands[1] = force_reg (mode, operands[1]);
6924
6925   if (mode == SFmode && ! TARGET_POWERPC
6926       && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT 
6927       && GET_CODE (operands[0]) == MEM)
6928     {
6929       int regnum;
6930
6931       if (reload_in_progress || reload_completed)
6932         regnum = true_regnum (operands[1]);
6933       else if (GET_CODE (operands[1]) == REG)
6934         regnum = REGNO (operands[1]);
6935       else
6936         regnum = -1;
6937
6938       /* If operands[1] is a register, on POWER it may have
6939          double-precision data in it, so truncate it to single
6940          precision.  */
6941       if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
6942         {
6943           rtx newreg;
6944           newreg = (!can_create_pseudo_p () ? copy_rtx (operands[1])
6945                     : gen_reg_rtx (mode));
6946           emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
6947           operands[1] = newreg;
6948         }
6949     }
6950
6951   /* Recognize the case where operand[1] is a reference to thread-local
6952      data and load its address to a register.  */
6953   if (rs6000_tls_referenced_p (operands[1]))
6954     {
6955       enum tls_model model;
6956       rtx tmp = operands[1];
6957       rtx addend = NULL;
6958
6959       if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
6960         {
6961           addend = XEXP (XEXP (tmp, 0), 1);
6962           tmp = XEXP (XEXP (tmp, 0), 0);
6963         }
6964
6965       gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
6966       model = SYMBOL_REF_TLS_MODEL (tmp);
6967       gcc_assert (model != 0);
6968
6969       tmp = rs6000_legitimize_tls_address (tmp, model);
6970       if (addend)
6971         {
6972           tmp = gen_rtx_PLUS (mode, tmp, addend);
6973           tmp = force_operand (tmp, operands[0]);
6974         }
6975       operands[1] = tmp;
6976     }
6977
6978   /* Handle the case where reload calls us with an invalid address.  */
6979   if (reload_in_progress && mode == Pmode
6980       && (! general_operand (operands[1], mode)
6981           || ! nonimmediate_operand (operands[0], mode)))
6982     goto emit_set;
6983
6984   /* 128-bit constant floating-point values on Darwin should really be
6985      loaded as two parts.  */
6986   if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
6987       && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
6988     {
6989       /* DImode is used, not DFmode, because simplify_gen_subreg doesn't
6990          know how to get a DFmode SUBREG of a TFmode.  */
6991       enum machine_mode imode = (TARGET_E500_DOUBLE ? DFmode : DImode);
6992       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode, 0),
6993                         simplify_gen_subreg (imode, operands[1], mode, 0),
6994                         imode);
6995       rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode,
6996                                              GET_MODE_SIZE (imode)),
6997                         simplify_gen_subreg (imode, operands[1], mode,
6998                                              GET_MODE_SIZE (imode)),
6999                         imode);
7000       return;
7001     }
7002
7003   if (reload_in_progress && cfun->machine->sdmode_stack_slot != NULL_RTX)
7004     cfun->machine->sdmode_stack_slot =
7005       eliminate_regs (cfun->machine->sdmode_stack_slot, VOIDmode, NULL_RTX);
7006
7007   if (reload_in_progress
7008       && mode == SDmode
7009       && MEM_P (operands[0])
7010       && rtx_equal_p (operands[0], cfun->machine->sdmode_stack_slot)
7011       && REG_P (operands[1]))
7012     {
7013       if (FP_REGNO_P (REGNO (operands[1])))
7014         {
7015           rtx mem = adjust_address_nv (operands[0], DDmode, 0);
7016           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7017           emit_insn (gen_movsd_store (mem, operands[1]));
7018         }
7019       else if (INT_REGNO_P (REGNO (operands[1])))
7020         {
7021           rtx mem = adjust_address_nv (operands[0], mode, 4);
7022           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7023           emit_insn (gen_movsd_hardfloat (mem, operands[1]));
7024         }
7025       else
7026         gcc_unreachable();
7027       return;
7028     }
7029   if (reload_in_progress
7030       && mode == SDmode
7031       && REG_P (operands[0])
7032       && MEM_P (operands[1])
7033       && rtx_equal_p (operands[1], cfun->machine->sdmode_stack_slot))
7034     {
7035       if (FP_REGNO_P (REGNO (operands[0])))
7036         {
7037           rtx mem = adjust_address_nv (operands[1], DDmode, 0);
7038           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7039           emit_insn (gen_movsd_load (operands[0], mem));
7040         }
7041       else if (INT_REGNO_P (REGNO (operands[0])))
7042         {
7043           rtx mem = adjust_address_nv (operands[1], mode, 4);
7044           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7045           emit_insn (gen_movsd_hardfloat (operands[0], mem));
7046         }
7047       else
7048         gcc_unreachable();
7049       return;
7050     }
7051
7052   /* FIXME:  In the long term, this switch statement should go away
7053      and be replaced by a sequence of tests based on things like
7054      mode == Pmode.  */
7055   switch (mode)
7056     {
7057     case HImode:
7058     case QImode:
7059       if (CONSTANT_P (operands[1])
7060           && GET_CODE (operands[1]) != CONST_INT)
7061         operands[1] = force_const_mem (mode, operands[1]);
7062       break;
7063
7064     case TFmode:
7065     case TDmode:
7066       rs6000_eliminate_indexed_memrefs (operands);
7067       /* fall through */
7068
7069     case DFmode:
7070     case DDmode:
7071     case SFmode:
7072     case SDmode:
7073       if (CONSTANT_P (operands[1])
7074           && ! easy_fp_constant (operands[1], mode))
7075         operands[1] = force_const_mem (mode, operands[1]);
7076       break;
7077
7078     case V16QImode:
7079     case V8HImode:
7080     case V4SFmode:
7081     case V4SImode:
7082     case V4HImode:
7083     case V2SFmode:
7084     case V2SImode:
7085     case V1DImode:
7086     case V2DFmode:
7087     case V2DImode:
7088       if (CONSTANT_P (operands[1])
7089           && !easy_vector_constant (operands[1], mode))
7090         operands[1] = force_const_mem (mode, operands[1]);
7091       break;
7092
7093     case SImode:
7094     case DImode:
7095       /* Use default pattern for address of ELF small data */
7096       if (TARGET_ELF
7097           && mode == Pmode
7098           && DEFAULT_ABI == ABI_V4
7099           && (GET_CODE (operands[1]) == SYMBOL_REF
7100               || GET_CODE (operands[1]) == CONST)
7101           && small_data_operand (operands[1], mode))
7102         {
7103           emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7104           return;
7105         }
7106
7107       if (DEFAULT_ABI == ABI_V4
7108           && mode == Pmode && mode == SImode
7109           && flag_pic == 1 && got_operand (operands[1], mode))
7110         {
7111           emit_insn (gen_movsi_got (operands[0], operands[1]));
7112           return;
7113         }
7114
7115       if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
7116           && TARGET_NO_TOC
7117           && ! flag_pic
7118           && mode == Pmode
7119           && CONSTANT_P (operands[1])
7120           && GET_CODE (operands[1]) != HIGH
7121           && GET_CODE (operands[1]) != CONST_INT)
7122         {
7123           rtx target = (!can_create_pseudo_p ()
7124                         ? operands[0]
7125                         : gen_reg_rtx (mode));
7126
7127           /* If this is a function address on -mcall-aixdesc,
7128              convert it to the address of the descriptor.  */
7129           if (DEFAULT_ABI == ABI_AIX
7130               && GET_CODE (operands[1]) == SYMBOL_REF
7131               && XSTR (operands[1], 0)[0] == '.')
7132             {
7133               const char *name = XSTR (operands[1], 0);
7134               rtx new_ref;
7135               while (*name == '.')
7136                 name++;
7137               new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
7138               CONSTANT_POOL_ADDRESS_P (new_ref)
7139                 = CONSTANT_POOL_ADDRESS_P (operands[1]);
7140               SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
7141               SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
7142               SYMBOL_REF_DATA (new_ref) = SYMBOL_REF_DATA (operands[1]);
7143               operands[1] = new_ref;
7144             }
7145
7146           if (DEFAULT_ABI == ABI_DARWIN)
7147             {
7148 #if TARGET_MACHO
7149               if (MACHO_DYNAMIC_NO_PIC_P)
7150                 {
7151                   /* Take care of any required data indirection.  */
7152                   operands[1] = rs6000_machopic_legitimize_pic_address (
7153                                   operands[1], mode, operands[0]);
7154                   if (operands[0] != operands[1])
7155                     emit_insn (gen_rtx_SET (VOIDmode,
7156                                             operands[0], operands[1]));
7157                   return;
7158                 }
7159 #endif
7160               emit_insn (gen_macho_high (target, operands[1]));
7161               emit_insn (gen_macho_low (operands[0], target, operands[1]));
7162               return;
7163             }
7164
7165           emit_insn (gen_elf_high (target, operands[1]));
7166           emit_insn (gen_elf_low (operands[0], target, operands[1]));
7167           return;
7168         }
7169
7170       /* If this is a SYMBOL_REF that refers to a constant pool entry,
7171          and we have put it in the TOC, we just need to make a TOC-relative
7172          reference to it.  */
7173       if ((TARGET_TOC
7174            && GET_CODE (operands[1]) == SYMBOL_REF
7175            && constant_pool_expr_p (operands[1])
7176            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
7177                                                get_pool_mode (operands[1])))
7178           || (TARGET_CMODEL == CMODEL_MEDIUM
7179               && GET_CODE (operands[1]) == SYMBOL_REF
7180               && !CONSTANT_POOL_ADDRESS_P (operands[1])
7181               && SYMBOL_REF_LOCAL_P (operands[1])))
7182         {
7183           rtx reg = NULL_RTX;
7184           if (TARGET_CMODEL != CMODEL_SMALL)
7185             {
7186               if (can_create_pseudo_p ())
7187                 reg = gen_reg_rtx (Pmode);
7188               else
7189                 reg = operands[0];
7190             }
7191           operands[1] = create_TOC_reference (operands[1], reg);
7192         }
7193       else if (mode == Pmode
7194                && CONSTANT_P (operands[1])
7195                && GET_CODE (operands[1]) != HIGH
7196                && !(TARGET_CMODEL != CMODEL_SMALL
7197                     && GET_CODE (operands[1]) == CONST
7198                     && GET_CODE (XEXP (operands[1], 0)) == PLUS
7199                     && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == HIGH)
7200                && ((GET_CODE (operands[1]) != CONST_INT
7201                     && ! easy_fp_constant (operands[1], mode))
7202                    || (GET_CODE (operands[1]) == CONST_INT
7203                        && (num_insns_constant (operands[1], mode)
7204                            > (TARGET_CMODEL != CMODEL_SMALL ? 3 : 2)))
7205                    || (GET_CODE (operands[0]) == REG
7206                        && FP_REGNO_P (REGNO (operands[0]))))
7207                && ! legitimate_constant_pool_address_p (operands[1], mode,
7208                                                         false)
7209                && ! toc_relative_expr_p (operands[1])
7210                && (TARGET_CMODEL == CMODEL_SMALL
7211                    || can_create_pseudo_p ()
7212                    || (REG_P (operands[0])
7213                        && INT_REG_OK_FOR_BASE_P (operands[0], true))))
7214         {
7215
7216 #if TARGET_MACHO
7217           /* Darwin uses a special PIC legitimizer.  */
7218           if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
7219             {
7220               operands[1] =
7221                 rs6000_machopic_legitimize_pic_address (operands[1], mode,
7222                                                         operands[0]);
7223               if (operands[0] != operands[1])
7224                 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7225               return;
7226             }
7227 #endif
7228
7229           /* If we are to limit the number of things we put in the TOC and
7230              this is a symbol plus a constant we can add in one insn,
7231              just put the symbol in the TOC and add the constant.  Don't do
7232              this if reload is in progress.  */
7233           if (GET_CODE (operands[1]) == CONST
7234               && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
7235               && GET_CODE (XEXP (operands[1], 0)) == PLUS
7236               && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
7237               && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
7238                   || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
7239               && ! side_effects_p (operands[0]))
7240             {
7241               rtx sym =
7242                 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
7243               rtx other = XEXP (XEXP (operands[1], 0), 1);
7244
7245               sym = force_reg (mode, sym);
7246               emit_insn (gen_add3_insn (operands[0], sym, other));
7247               return;
7248             }
7249
7250           operands[1] = force_const_mem (mode, operands[1]);
7251
7252           if (TARGET_TOC
7253               && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
7254               && constant_pool_expr_p (XEXP (operands[1], 0))
7255               && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
7256                         get_pool_constant (XEXP (operands[1], 0)),
7257                         get_pool_mode (XEXP (operands[1], 0))))
7258             {
7259               rtx tocref;
7260               rtx reg = NULL_RTX;
7261               if (TARGET_CMODEL != CMODEL_SMALL)
7262                 {
7263                   if (can_create_pseudo_p ())
7264                     reg = gen_reg_rtx (Pmode);
7265                   else
7266                     reg = operands[0];
7267                 }
7268               tocref = create_TOC_reference (XEXP (operands[1], 0), reg);
7269               operands[1] = gen_const_mem (mode, tocref);
7270               set_mem_alias_set (operands[1], get_TOC_alias_set ());
7271             }
7272         }
7273       break;
7274
7275     case TImode:
7276       rs6000_eliminate_indexed_memrefs (operands);
7277
7278       if (TARGET_POWER)
7279         {
7280           emit_insn (gen_rtx_PARALLEL (VOIDmode,
7281                        gen_rtvec (2,
7282                                   gen_rtx_SET (VOIDmode,
7283                                                operands[0], operands[1]),
7284                                   gen_rtx_CLOBBER (VOIDmode,
7285                                                    gen_rtx_SCRATCH (SImode)))));
7286           return;
7287         }
7288       break;
7289
7290     default:
7291       fatal_insn ("bad move", gen_rtx_SET (VOIDmode, dest, source));
7292     }
7293
7294   /* Above, we may have called force_const_mem which may have returned
7295      an invalid address.  If we can, fix this up; otherwise, reload will
7296      have to deal with it.  */
7297   if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
7298     operands[1] = validize_mem (operands[1]);
7299
7300  emit_set:
7301   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7302 }
7303 \f
7304 /* Nonzero if we can use a floating-point register to pass this arg.  */
7305 #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE)         \
7306   (SCALAR_FLOAT_MODE_P (MODE)                   \
7307    && (CUM)->fregno <= FP_ARG_MAX_REG           \
7308    && TARGET_HARD_FLOAT && TARGET_FPRS)
7309
7310 /* Nonzero if we can use an AltiVec register to pass this arg.  */
7311 #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE,NAMED)              \
7312   (ALTIVEC_OR_VSX_VECTOR_MODE (MODE)                            \
7313    && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG                      \
7314    && TARGET_ALTIVEC_ABI                                        \
7315    && (NAMED))
7316
7317 /* Return a nonzero value to say to return the function value in
7318    memory, just as large structures are always returned.  TYPE will be
7319    the data type of the value, and FNTYPE will be the type of the
7320    function doing the returning, or @code{NULL} for libcalls.
7321
7322    The AIX ABI for the RS/6000 specifies that all structures are
7323    returned in memory.  The Darwin ABI does the same.
7324    
7325    For the Darwin 64 Bit ABI, a function result can be returned in
7326    registers or in memory, depending on the size of the return data
7327    type.  If it is returned in registers, the value occupies the same
7328    registers as it would if it were the first and only function
7329    argument.  Otherwise, the function places its result in memory at
7330    the location pointed to by GPR3.
7331    
7332    The SVR4 ABI specifies that structures <= 8 bytes are returned in r3/r4, 
7333    but a draft put them in memory, and GCC used to implement the draft
7334    instead of the final standard.  Therefore, aix_struct_return
7335    controls this instead of DEFAULT_ABI; V.4 targets needing backward
7336    compatibility can change DRAFT_V4_STRUCT_RET to override the
7337    default, and -m switches get the final word.  See
7338    rs6000_option_override_internal for more details.
7339
7340    The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
7341    long double support is enabled.  These values are returned in memory.
7342
7343    int_size_in_bytes returns -1 for variable size objects, which go in
7344    memory always.  The cast to unsigned makes -1 > 8.  */
7345
7346 static bool
7347 rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
7348 {
7349   /* For the Darwin64 ABI, test if we can fit the return value in regs.  */
7350   if (TARGET_MACHO
7351       && rs6000_darwin64_abi
7352       && TREE_CODE (type) == RECORD_TYPE
7353       && int_size_in_bytes (type) > 0)
7354     {
7355       CUMULATIVE_ARGS valcum;
7356       rtx valret;
7357
7358       valcum.words = 0;
7359       valcum.fregno = FP_ARG_MIN_REG;
7360       valcum.vregno = ALTIVEC_ARG_MIN_REG;
7361       /* Do a trial code generation as if this were going to be passed
7362          as an argument; if any part goes in memory, we return NULL.  */
7363       valret = rs6000_darwin64_record_arg (&valcum, type, true, true);
7364       if (valret)
7365         return false;
7366       /* Otherwise fall through to more conventional ABI rules.  */
7367     }
7368
7369   if (AGGREGATE_TYPE_P (type)
7370       && (aix_struct_return
7371           || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
7372     return true;
7373
7374   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
7375      modes only exist for GCC vector types if -maltivec.  */
7376   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
7377       && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
7378     return false;
7379
7380   /* Return synthetic vectors in memory.  */
7381   if (TREE_CODE (type) == VECTOR_TYPE
7382       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
7383     {
7384       static bool warned_for_return_big_vectors = false;
7385       if (!warned_for_return_big_vectors)
7386         {
7387           warning (0, "GCC vector returned by reference: "
7388                    "non-standard ABI extension with no compatibility guarantee");
7389           warned_for_return_big_vectors = true;
7390         }
7391       return true;
7392     }
7393
7394   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && TYPE_MODE (type) == TFmode)
7395     return true;
7396
7397   return false;
7398 }
7399
7400 #ifdef HAVE_AS_GNU_ATTRIBUTE
7401 /* Return TRUE if a call to function FNDECL may be one that
7402    potentially affects the function calling ABI of the object file.  */
7403
7404 static bool
7405 call_ABI_of_interest (tree fndecl)
7406 {
7407   if (cgraph_state == CGRAPH_STATE_EXPANSION)
7408     {
7409       struct cgraph_node *c_node;
7410
7411       /* Libcalls are always interesting.  */
7412       if (fndecl == NULL_TREE)
7413         return true;
7414
7415       /* Any call to an external function is interesting.  */
7416       if (DECL_EXTERNAL (fndecl))
7417         return true;
7418
7419       /* Interesting functions that we are emitting in this object file.  */
7420       c_node = cgraph_get_node (fndecl);
7421       c_node = cgraph_function_or_thunk_node (c_node, NULL);
7422       return !cgraph_only_called_directly_p (c_node);
7423     }
7424   return false;
7425 }
7426 #endif
7427
7428 /* Initialize a variable CUM of type CUMULATIVE_ARGS
7429    for a call to a function whose data type is FNTYPE.
7430    For a library call, FNTYPE is 0 and RETURN_MODE the return value mode.
7431
7432    For incoming args we set the number of arguments in the prototype large
7433    so we never return a PARALLEL.  */
7434
7435 void
7436 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
7437                       rtx libname ATTRIBUTE_UNUSED, int incoming,
7438                       int libcall, int n_named_args,
7439                       tree fndecl ATTRIBUTE_UNUSED,
7440                       enum machine_mode return_mode ATTRIBUTE_UNUSED)
7441 {
7442   static CUMULATIVE_ARGS zero_cumulative;
7443
7444   *cum = zero_cumulative;
7445   cum->words = 0;
7446   cum->fregno = FP_ARG_MIN_REG;
7447   cum->vregno = ALTIVEC_ARG_MIN_REG;
7448   cum->prototype = (fntype && prototype_p (fntype));
7449   cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
7450                       ? CALL_LIBCALL : CALL_NORMAL);
7451   cum->sysv_gregno = GP_ARG_MIN_REG;
7452   cum->stdarg = stdarg_p (fntype);
7453
7454   cum->nargs_prototype = 0;
7455   if (incoming || cum->prototype)
7456     cum->nargs_prototype = n_named_args;
7457
7458   /* Check for a longcall attribute.  */
7459   if ((!fntype && rs6000_default_long_calls)
7460       || (fntype
7461           && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
7462           && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
7463     cum->call_cookie |= CALL_LONG;
7464
7465   if (TARGET_DEBUG_ARG)
7466     {
7467       fprintf (stderr, "\ninit_cumulative_args:");
7468       if (fntype)
7469         {
7470           tree ret_type = TREE_TYPE (fntype);
7471           fprintf (stderr, " ret code = %s,",
7472                    tree_code_name[ (int)TREE_CODE (ret_type) ]);
7473         }
7474
7475       if (cum->call_cookie & CALL_LONG)
7476         fprintf (stderr, " longcall,");
7477
7478       fprintf (stderr, " proto = %d, nargs = %d\n",
7479                cum->prototype, cum->nargs_prototype);
7480     }
7481
7482 #ifdef HAVE_AS_GNU_ATTRIBUTE
7483   if (DEFAULT_ABI == ABI_V4)
7484     {
7485       cum->escapes = call_ABI_of_interest (fndecl);
7486       if (cum->escapes)
7487         {
7488           tree return_type;
7489
7490           if (fntype)
7491             {
7492               return_type = TREE_TYPE (fntype);
7493               return_mode = TYPE_MODE (return_type);
7494             }
7495           else
7496             return_type = lang_hooks.types.type_for_mode (return_mode, 0);
7497
7498           if (return_type != NULL)
7499             {
7500               if (TREE_CODE (return_type) == RECORD_TYPE
7501                   && TYPE_TRANSPARENT_AGGR (return_type))
7502                 {
7503                   return_type = TREE_TYPE (first_field (return_type));
7504                   return_mode = TYPE_MODE (return_type);
7505                 }
7506               if (AGGREGATE_TYPE_P (return_type)
7507                   && ((unsigned HOST_WIDE_INT) int_size_in_bytes (return_type)
7508                       <= 8))
7509                 rs6000_returns_struct = true;
7510             }
7511           if (SCALAR_FLOAT_MODE_P (return_mode))
7512             rs6000_passes_float = true;
7513           else if (ALTIVEC_OR_VSX_VECTOR_MODE (return_mode)
7514                    || SPE_VECTOR_MODE (return_mode))
7515             rs6000_passes_vector = true;
7516         }
7517     }
7518 #endif
7519
7520   if (fntype
7521       && !TARGET_ALTIVEC
7522       && TARGET_ALTIVEC_ABI
7523       && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
7524     {
7525       error ("cannot return value in vector register because"
7526              " altivec instructions are disabled, use -maltivec"
7527              " to enable them");
7528     }
7529 }
7530 \f
7531 /* Return true if TYPE must be passed on the stack and not in registers.  */
7532
7533 static bool
7534 rs6000_must_pass_in_stack (enum machine_mode mode, const_tree type)
7535 {
7536   if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT)
7537     return must_pass_in_stack_var_size (mode, type);
7538   else
7539     return must_pass_in_stack_var_size_or_pad (mode, type);
7540 }
7541
7542 /* If defined, a C expression which determines whether, and in which
7543    direction, to pad out an argument with extra space.  The value
7544    should be of type `enum direction': either `upward' to pad above
7545    the argument, `downward' to pad below, or `none' to inhibit
7546    padding.
7547
7548    For the AIX ABI structs are always stored left shifted in their
7549    argument slot.  */
7550
7551 enum direction
7552 function_arg_padding (enum machine_mode mode, const_tree type)
7553 {
7554 #ifndef AGGREGATE_PADDING_FIXED
7555 #define AGGREGATE_PADDING_FIXED 0
7556 #endif
7557 #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
7558 #define AGGREGATES_PAD_UPWARD_ALWAYS 0
7559 #endif
7560
7561   if (!AGGREGATE_PADDING_FIXED)
7562     {
7563       /* GCC used to pass structures of the same size as integer types as
7564          if they were in fact integers, ignoring FUNCTION_ARG_PADDING.
7565          i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
7566          passed padded downward, except that -mstrict-align further
7567          muddied the water in that multi-component structures of 2 and 4
7568          bytes in size were passed padded upward.
7569
7570          The following arranges for best compatibility with previous
7571          versions of gcc, but removes the -mstrict-align dependency.  */
7572       if (BYTES_BIG_ENDIAN)
7573         {
7574           HOST_WIDE_INT size = 0;
7575
7576           if (mode == BLKmode)
7577             {
7578               if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
7579                 size = int_size_in_bytes (type);
7580             }
7581           else
7582             size = GET_MODE_SIZE (mode);
7583
7584           if (size == 1 || size == 2 || size == 4)
7585             return downward;
7586         }
7587       return upward;
7588     }
7589
7590   if (AGGREGATES_PAD_UPWARD_ALWAYS)
7591     {
7592       if (type != 0 && AGGREGATE_TYPE_P (type))
7593         return upward;
7594     }
7595
7596   /* Fall back to the default.  */
7597   return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
7598 }
7599
7600 /* If defined, a C expression that gives the alignment boundary, in bits,
7601    of an argument with the specified mode and type.  If it is not defined,
7602    PARM_BOUNDARY is used for all arguments.
7603
7604    V.4 wants long longs and doubles to be double word aligned.  Just
7605    testing the mode size is a boneheaded way to do this as it means
7606    that other types such as complex int are also double word aligned.
7607    However, we're stuck with this because changing the ABI might break
7608    existing library interfaces.
7609
7610    Doubleword align SPE vectors.
7611    Quadword align Altivec/VSX vectors.
7612    Quadword align large synthetic vector types.   */
7613
7614 static unsigned int
7615 rs6000_function_arg_boundary (enum machine_mode mode, const_tree type)
7616 {
7617   if (DEFAULT_ABI == ABI_V4
7618       && (GET_MODE_SIZE (mode) == 8
7619           || (TARGET_HARD_FLOAT
7620               && TARGET_FPRS
7621               && (mode == TFmode || mode == TDmode))))
7622     return 64;
7623   else if (SPE_VECTOR_MODE (mode)
7624            || (type && TREE_CODE (type) == VECTOR_TYPE
7625                && int_size_in_bytes (type) >= 8
7626                && int_size_in_bytes (type) < 16))
7627     return 64;
7628   else if (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
7629            || (type && TREE_CODE (type) == VECTOR_TYPE
7630                && int_size_in_bytes (type) >= 16))
7631     return 128;
7632   else if (TARGET_MACHO
7633            && rs6000_darwin64_abi
7634            && mode == BLKmode
7635            && type && TYPE_ALIGN (type) > 64)
7636     return 128;
7637   else
7638     return PARM_BOUNDARY;
7639 }
7640
7641 /* For a function parm of MODE and TYPE, return the starting word in
7642    the parameter area.  NWORDS of the parameter area are already used.  */
7643
7644 static unsigned int
7645 rs6000_parm_start (enum machine_mode mode, const_tree type,
7646                    unsigned int nwords)
7647 {
7648   unsigned int align;
7649   unsigned int parm_offset;
7650
7651   align = rs6000_function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
7652   parm_offset = DEFAULT_ABI == ABI_V4 ? 2 : 6;
7653   return nwords + (-(parm_offset + nwords) & align);
7654 }
7655
7656 /* Compute the size (in words) of a function argument.  */
7657
7658 static unsigned long
7659 rs6000_arg_size (enum machine_mode mode, const_tree type)
7660 {
7661   unsigned long size;
7662
7663   if (mode != BLKmode)
7664     size = GET_MODE_SIZE (mode);
7665   else
7666     size = int_size_in_bytes (type);
7667
7668   if (TARGET_32BIT)
7669     return (size + 3) >> 2;
7670   else
7671     return (size + 7) >> 3;
7672 }
7673 \f
7674 /* Use this to flush pending int fields.  */
7675
7676 static void
7677 rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
7678                                           HOST_WIDE_INT bitpos, int final)
7679 {
7680   unsigned int startbit, endbit;
7681   int intregs, intoffset;
7682   enum machine_mode mode;
7683
7684   /* Handle the situations where a float is taking up the first half
7685      of the GPR, and the other half is empty (typically due to
7686      alignment restrictions). We can detect this by a 8-byte-aligned
7687      int field, or by seeing that this is the final flush for this
7688      argument. Count the word and continue on.  */
7689   if (cum->floats_in_gpr == 1
7690       && (cum->intoffset % 64 == 0
7691           || (cum->intoffset == -1 && final)))
7692     {
7693       cum->words++;
7694       cum->floats_in_gpr = 0;
7695     }
7696
7697   if (cum->intoffset == -1)
7698     return;
7699
7700   intoffset = cum->intoffset;
7701   cum->intoffset = -1;
7702   cum->floats_in_gpr = 0;
7703
7704   if (intoffset % BITS_PER_WORD != 0)
7705     {
7706       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
7707                             MODE_INT, 0);
7708       if (mode == BLKmode)
7709         {
7710           /* We couldn't find an appropriate mode, which happens,
7711              e.g., in packed structs when there are 3 bytes to load.
7712              Back intoffset back to the beginning of the word in this
7713              case.  */
7714           intoffset = intoffset & -BITS_PER_WORD;
7715         }
7716     }
7717
7718   startbit = intoffset & -BITS_PER_WORD;
7719   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
7720   intregs = (endbit - startbit) / BITS_PER_WORD;
7721   cum->words += intregs;
7722   /* words should be unsigned. */
7723   if ((unsigned)cum->words < (endbit/BITS_PER_WORD))
7724     {
7725       int pad = (endbit/BITS_PER_WORD) - cum->words;
7726       cum->words += pad;
7727     }
7728 }
7729
7730 /* The darwin64 ABI calls for us to recurse down through structs,
7731    looking for elements passed in registers.  Unfortunately, we have
7732    to track int register count here also because of misalignments
7733    in powerpc alignment mode.  */
7734
7735 static void
7736 rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
7737                                             const_tree type,
7738                                             HOST_WIDE_INT startbitpos)
7739 {
7740   tree f;
7741
7742   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
7743     if (TREE_CODE (f) == FIELD_DECL)
7744       {
7745         HOST_WIDE_INT bitpos = startbitpos;
7746         tree ftype = TREE_TYPE (f);
7747         enum machine_mode mode;
7748         if (ftype == error_mark_node)
7749           continue;
7750         mode = TYPE_MODE (ftype);
7751
7752         if (DECL_SIZE (f) != 0
7753             && host_integerp (bit_position (f), 1))
7754           bitpos += int_bit_position (f);
7755
7756         /* ??? FIXME: else assume zero offset.  */
7757
7758         if (TREE_CODE (ftype) == RECORD_TYPE)
7759           rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
7760         else if (USE_FP_FOR_ARG_P (cum, mode, ftype))
7761           {
7762             unsigned n_fpregs = (GET_MODE_SIZE (mode) + 7) >> 3;
7763             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
7764             cum->fregno += n_fpregs;
7765             /* Single-precision floats present a special problem for
7766                us, because they are smaller than an 8-byte GPR, and so
7767                the structure-packing rules combined with the standard
7768                varargs behavior mean that we want to pack float/float
7769                and float/int combinations into a single register's
7770                space. This is complicated by the arg advance flushing,
7771                which works on arbitrarily large groups of int-type
7772                fields.  */
7773             if (mode == SFmode)
7774               {
7775                 if (cum->floats_in_gpr == 1)
7776                   {
7777                     /* Two floats in a word; count the word and reset
7778                        the float count.  */
7779                     cum->words++;
7780                     cum->floats_in_gpr = 0;
7781                   }
7782                 else if (bitpos % 64 == 0)
7783                   {
7784                     /* A float at the beginning of an 8-byte word;
7785                        count it and put off adjusting cum->words until
7786                        we see if a arg advance flush is going to do it
7787                        for us.  */
7788                     cum->floats_in_gpr++;
7789                   }
7790                 else
7791                   {
7792                     /* The float is at the end of a word, preceded
7793                        by integer fields, so the arg advance flush
7794                        just above has already set cum->words and
7795                        everything is taken care of.  */
7796                   }
7797               }
7798             else
7799               cum->words += n_fpregs;
7800           }
7801         else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, 1))
7802           {
7803             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
7804             cum->vregno++;
7805             cum->words += 2;
7806           }
7807         else if (cum->intoffset == -1)
7808           cum->intoffset = bitpos;
7809       }
7810 }
7811
7812 /* Check for an item that needs to be considered specially under the darwin 64
7813    bit ABI.  These are record types where the mode is BLK or the structure is
7814    8 bytes in size.  */
7815 static int
7816 rs6000_darwin64_struct_check_p (enum machine_mode mode, const_tree type)
7817 {
7818   return rs6000_darwin64_abi
7819          && ((mode == BLKmode 
7820               && TREE_CODE (type) == RECORD_TYPE 
7821               && int_size_in_bytes (type) > 0)
7822           || (type && TREE_CODE (type) == RECORD_TYPE 
7823               && int_size_in_bytes (type) == 8)) ? 1 : 0;
7824 }
7825
7826 /* Update the data in CUM to advance over an argument
7827    of mode MODE and data type TYPE.
7828    (TYPE is null for libcalls where that information may not be available.)
7829
7830    Note that for args passed by reference, function_arg will be called
7831    with MODE and TYPE set to that of the pointer to the arg, not the arg
7832    itself.  */
7833
7834 static void
7835 rs6000_function_arg_advance_1 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
7836                                const_tree type, bool named, int depth)
7837 {
7838   /* Only tick off an argument if we're not recursing.  */
7839   if (depth == 0)
7840     cum->nargs_prototype--;
7841
7842 #ifdef HAVE_AS_GNU_ATTRIBUTE
7843   if (DEFAULT_ABI == ABI_V4
7844       && cum->escapes)
7845     {
7846       if (SCALAR_FLOAT_MODE_P (mode))
7847         rs6000_passes_float = true;
7848       else if (named && ALTIVEC_OR_VSX_VECTOR_MODE (mode))
7849         rs6000_passes_vector = true;
7850       else if (SPE_VECTOR_MODE (mode)
7851                && !cum->stdarg
7852                && cum->sysv_gregno <= GP_ARG_MAX_REG)
7853         rs6000_passes_vector = true;
7854     }
7855 #endif
7856
7857   if (TARGET_ALTIVEC_ABI
7858       && (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
7859           || (type && TREE_CODE (type) == VECTOR_TYPE
7860               && int_size_in_bytes (type) == 16)))
7861     {
7862       bool stack = false;
7863
7864       if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
7865         {
7866           cum->vregno++;
7867           if (!TARGET_ALTIVEC)
7868             error ("cannot pass argument in vector register because"
7869                    " altivec instructions are disabled, use -maltivec"
7870                    " to enable them");
7871
7872           /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
7873              even if it is going to be passed in a vector register.
7874              Darwin does the same for variable-argument functions.  */
7875           if ((DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
7876               || (cum->stdarg && DEFAULT_ABI != ABI_V4))
7877             stack = true;
7878         }
7879       else
7880         stack = true;
7881
7882       if (stack)
7883         {
7884           int align;
7885
7886           /* Vector parameters must be 16-byte aligned.  This places
7887              them at 2 mod 4 in terms of words in 32-bit mode, since
7888              the parameter save area starts at offset 24 from the
7889              stack.  In 64-bit mode, they just have to start on an
7890              even word, since the parameter save area is 16-byte
7891              aligned.  Space for GPRs is reserved even if the argument
7892              will be passed in memory.  */
7893           if (TARGET_32BIT)
7894             align = (2 - cum->words) & 3;
7895           else
7896             align = cum->words & 1;
7897           cum->words += align + rs6000_arg_size (mode, type);
7898
7899           if (TARGET_DEBUG_ARG)
7900             {
7901               fprintf (stderr, "function_adv: words = %2d, align=%d, ",
7902                        cum->words, align);
7903               fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
7904                        cum->nargs_prototype, cum->prototype,
7905                        GET_MODE_NAME (mode));
7906             }
7907         }
7908     }
7909   else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
7910            && !cum->stdarg
7911            && cum->sysv_gregno <= GP_ARG_MAX_REG)
7912     cum->sysv_gregno++;
7913
7914   else if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
7915     {
7916       int size = int_size_in_bytes (type);
7917       /* Variable sized types have size == -1 and are
7918          treated as if consisting entirely of ints.
7919          Pad to 16 byte boundary if needed.  */
7920       if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
7921           && (cum->words % 2) != 0)
7922         cum->words++;
7923       /* For varargs, we can just go up by the size of the struct. */
7924       if (!named)
7925         cum->words += (size + 7) / 8;
7926       else
7927         {
7928           /* It is tempting to say int register count just goes up by
7929              sizeof(type)/8, but this is wrong in a case such as
7930              { int; double; int; } [powerpc alignment].  We have to
7931              grovel through the fields for these too.  */
7932           cum->intoffset = 0;
7933           cum->floats_in_gpr = 0;
7934           rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
7935           rs6000_darwin64_record_arg_advance_flush (cum,
7936                                                     size * BITS_PER_UNIT, 1);
7937         }
7938           if (TARGET_DEBUG_ARG)
7939             {
7940               fprintf (stderr, "function_adv: words = %2d, align=%d, size=%d",
7941                        cum->words, TYPE_ALIGN (type), size);
7942               fprintf (stderr, 
7943                    "nargs = %4d, proto = %d, mode = %4s (darwin64 abi)\n",
7944                        cum->nargs_prototype, cum->prototype,
7945                        GET_MODE_NAME (mode));
7946             }
7947     }
7948   else if (DEFAULT_ABI == ABI_V4)
7949     {
7950       if (TARGET_HARD_FLOAT && TARGET_FPRS
7951           && ((TARGET_SINGLE_FLOAT && mode == SFmode)
7952               || (TARGET_DOUBLE_FLOAT && mode == DFmode)
7953               || (mode == TFmode && !TARGET_IEEEQUAD)
7954               || mode == SDmode || mode == DDmode || mode == TDmode))
7955         {
7956           /* _Decimal128 must use an even/odd register pair.  This assumes
7957              that the register number is odd when fregno is odd.  */
7958           if (mode == TDmode && (cum->fregno % 2) == 1)
7959             cum->fregno++;
7960
7961           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
7962               <= FP_ARG_V4_MAX_REG)
7963             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
7964           else
7965             {
7966               cum->fregno = FP_ARG_V4_MAX_REG + 1;
7967               if (mode == DFmode || mode == TFmode
7968                   || mode == DDmode || mode == TDmode)
7969                 cum->words += cum->words & 1;
7970               cum->words += rs6000_arg_size (mode, type);
7971             }
7972         }
7973       else
7974         {
7975           int n_words = rs6000_arg_size (mode, type);
7976           int gregno = cum->sysv_gregno;
7977
7978           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
7979              (r7,r8) or (r9,r10).  As does any other 2 word item such
7980              as complex int due to a historical mistake.  */
7981           if (n_words == 2)
7982             gregno += (1 - gregno) & 1;
7983
7984           /* Multi-reg args are not split between registers and stack.  */
7985           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
7986             {
7987               /* Long long and SPE vectors are aligned on the stack.
7988                  So are other 2 word items such as complex int due to
7989                  a historical mistake.  */
7990               if (n_words == 2)
7991                 cum->words += cum->words & 1;
7992               cum->words += n_words;
7993             }
7994
7995           /* Note: continuing to accumulate gregno past when we've started
7996              spilling to the stack indicates the fact that we've started
7997              spilling to the stack to expand_builtin_saveregs.  */
7998           cum->sysv_gregno = gregno + n_words;
7999         }
8000
8001       if (TARGET_DEBUG_ARG)
8002         {
8003           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
8004                    cum->words, cum->fregno);
8005           fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
8006                    cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
8007           fprintf (stderr, "mode = %4s, named = %d\n",
8008                    GET_MODE_NAME (mode), named);
8009         }
8010     }
8011   else
8012     {
8013       int n_words = rs6000_arg_size (mode, type);
8014       int start_words = cum->words;
8015       int align_words = rs6000_parm_start (mode, type, start_words);
8016
8017       cum->words = align_words + n_words;
8018
8019       if (SCALAR_FLOAT_MODE_P (mode)
8020           && TARGET_HARD_FLOAT && TARGET_FPRS)
8021         {
8022           /* _Decimal128 must be passed in an even/odd float register pair.
8023              This assumes that the register number is odd when fregno is
8024              odd.  */
8025           if (mode == TDmode && (cum->fregno % 2) == 1)
8026             cum->fregno++;
8027           cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
8028         }
8029
8030       if (TARGET_DEBUG_ARG)
8031         {
8032           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
8033                    cum->words, cum->fregno);
8034           fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
8035                    cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
8036           fprintf (stderr, "named = %d, align = %d, depth = %d\n",
8037                    named, align_words - start_words, depth);
8038         }
8039     }
8040 }
8041
8042 static void
8043 rs6000_function_arg_advance (cumulative_args_t cum, enum machine_mode mode,
8044                              const_tree type, bool named)
8045 {
8046   rs6000_function_arg_advance_1 (get_cumulative_args (cum), mode, type, named,
8047                                  0);
8048 }
8049
8050 static rtx
8051 spe_build_register_parallel (enum machine_mode mode, int gregno)
8052 {
8053   rtx r1, r3, r5, r7;
8054
8055   switch (mode)
8056     {
8057     case DFmode:
8058       r1 = gen_rtx_REG (DImode, gregno);
8059       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8060       return gen_rtx_PARALLEL (mode, gen_rtvec (1, r1));
8061
8062     case DCmode:
8063     case TFmode:
8064       r1 = gen_rtx_REG (DImode, gregno);
8065       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8066       r3 = gen_rtx_REG (DImode, gregno + 2);
8067       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
8068       return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r3));
8069
8070     case TCmode:
8071       r1 = gen_rtx_REG (DImode, gregno);
8072       r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8073       r3 = gen_rtx_REG (DImode, gregno + 2);
8074       r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
8075       r5 = gen_rtx_REG (DImode, gregno + 4);
8076       r5 = gen_rtx_EXPR_LIST (VOIDmode, r5, GEN_INT (16));
8077       r7 = gen_rtx_REG (DImode, gregno + 6);
8078       r7 = gen_rtx_EXPR_LIST (VOIDmode, r7, GEN_INT (24));
8079       return gen_rtx_PARALLEL (mode, gen_rtvec (4, r1, r3, r5, r7));
8080
8081     default:
8082       gcc_unreachable ();
8083     }
8084 }
8085
8086 /* Determine where to put a SIMD argument on the SPE.  */
8087 static rtx
8088 rs6000_spe_function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
8089                          const_tree type)
8090 {
8091   int gregno = cum->sysv_gregno;
8092
8093   /* On E500 v2, double arithmetic is done on the full 64-bit GPR, but
8094      are passed and returned in a pair of GPRs for ABI compatibility.  */
8095   if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
8096                              || mode == DCmode || mode == TCmode))
8097     {
8098       int n_words = rs6000_arg_size (mode, type);
8099
8100       /* Doubles go in an odd/even register pair (r5/r6, etc).  */
8101       if (mode == DFmode)
8102         gregno += (1 - gregno) & 1;
8103
8104       /* Multi-reg args are not split between registers and stack.  */
8105       if (gregno + n_words - 1 > GP_ARG_MAX_REG)
8106         return NULL_RTX;
8107
8108       return spe_build_register_parallel (mode, gregno);
8109     }
8110   if (cum->stdarg)
8111     {
8112       int n_words = rs6000_arg_size (mode, type);
8113
8114       /* SPE vectors are put in odd registers.  */
8115       if (n_words == 2 && (gregno & 1) == 0)
8116         gregno += 1;
8117
8118       if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
8119         {
8120           rtx r1, r2;
8121           enum machine_mode m = SImode;
8122
8123           r1 = gen_rtx_REG (m, gregno);
8124           r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
8125           r2 = gen_rtx_REG (m, gregno + 1);
8126           r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
8127           return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
8128         }
8129       else
8130         return NULL_RTX;
8131     }
8132   else
8133     {
8134       if (gregno <= GP_ARG_MAX_REG)
8135         return gen_rtx_REG (mode, gregno);
8136       else
8137         return NULL_RTX;
8138     }
8139 }
8140
8141 /* A subroutine of rs6000_darwin64_record_arg.  Assign the bits of the
8142    structure between cum->intoffset and bitpos to integer registers.  */
8143
8144 static void
8145 rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
8146                                   HOST_WIDE_INT bitpos, rtx rvec[], int *k)
8147 {
8148   enum machine_mode mode;
8149   unsigned int regno;
8150   unsigned int startbit, endbit;
8151   int this_regno, intregs, intoffset;
8152   rtx reg;
8153
8154   if (cum->intoffset == -1)
8155     return;
8156
8157   intoffset = cum->intoffset;
8158   cum->intoffset = -1;
8159
8160   /* If this is the trailing part of a word, try to only load that
8161      much into the register.  Otherwise load the whole register.  Note
8162      that in the latter case we may pick up unwanted bits.  It's not a
8163      problem at the moment but may wish to revisit.  */
8164
8165   if (intoffset % BITS_PER_WORD != 0)
8166     {
8167       mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
8168                           MODE_INT, 0);
8169       if (mode == BLKmode)
8170         {
8171           /* We couldn't find an appropriate mode, which happens,
8172              e.g., in packed structs when there are 3 bytes to load.
8173              Back intoffset back to the beginning of the word in this
8174              case.  */
8175          intoffset = intoffset & -BITS_PER_WORD;
8176          mode = word_mode;
8177         }
8178     }
8179   else
8180     mode = word_mode;
8181
8182   startbit = intoffset & -BITS_PER_WORD;
8183   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
8184   intregs = (endbit - startbit) / BITS_PER_WORD;
8185   this_regno = cum->words + intoffset / BITS_PER_WORD;
8186
8187   if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
8188     cum->use_stack = 1;
8189
8190   intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
8191   if (intregs <= 0)
8192     return;
8193
8194   intoffset /= BITS_PER_UNIT;
8195   do
8196     {
8197       regno = GP_ARG_MIN_REG + this_regno;
8198       reg = gen_rtx_REG (mode, regno);
8199       rvec[(*k)++] =
8200         gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
8201
8202       this_regno += 1;
8203       intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
8204       mode = word_mode;
8205       intregs -= 1;
8206     }
8207   while (intregs > 0);
8208 }
8209
8210 /* Recursive workhorse for the following.  */
8211
8212 static void
8213 rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type,
8214                                     HOST_WIDE_INT startbitpos, rtx rvec[],
8215                                     int *k)
8216 {
8217   tree f;
8218
8219   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
8220     if (TREE_CODE (f) == FIELD_DECL)
8221       {
8222         HOST_WIDE_INT bitpos = startbitpos;
8223         tree ftype = TREE_TYPE (f);
8224         enum machine_mode mode;
8225         if (ftype == error_mark_node)
8226           continue;
8227         mode = TYPE_MODE (ftype);
8228
8229         if (DECL_SIZE (f) != 0
8230             && host_integerp (bit_position (f), 1))
8231           bitpos += int_bit_position (f);
8232
8233         /* ??? FIXME: else assume zero offset.  */
8234
8235         if (TREE_CODE (ftype) == RECORD_TYPE)
8236           rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
8237         else if (cum->named && USE_FP_FOR_ARG_P (cum, mode, ftype))
8238           {
8239             unsigned n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
8240 #if 0
8241             switch (mode)
8242               {
8243               case SCmode: mode = SFmode; break;
8244               case DCmode: mode = DFmode; break;
8245               case TCmode: mode = TFmode; break;
8246               default: break;
8247               }
8248 #endif
8249             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
8250             if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
8251               {
8252                 gcc_assert (cum->fregno == FP_ARG_MAX_REG
8253                             && (mode == TFmode || mode == TDmode));
8254                 /* Long double or _Decimal128 split over regs and memory.  */
8255                 mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : DFmode;
8256                 cum->use_stack=1;
8257               }
8258             rvec[(*k)++]
8259               = gen_rtx_EXPR_LIST (VOIDmode,
8260                                    gen_rtx_REG (mode, cum->fregno++),
8261                                    GEN_INT (bitpos / BITS_PER_UNIT));
8262             if (mode == TFmode || mode == TDmode)
8263               cum->fregno++;
8264           }
8265         else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, ftype, 1))
8266           {
8267             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
8268             rvec[(*k)++]
8269               = gen_rtx_EXPR_LIST (VOIDmode,
8270                                    gen_rtx_REG (mode, cum->vregno++),
8271                                    GEN_INT (bitpos / BITS_PER_UNIT));
8272           }
8273         else if (cum->intoffset == -1)
8274           cum->intoffset = bitpos;
8275       }
8276 }
8277
8278 /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
8279    the register(s) to be used for each field and subfield of a struct
8280    being passed by value, along with the offset of where the
8281    register's value may be found in the block.  FP fields go in FP
8282    register, vector fields go in vector registers, and everything
8283    else goes in int registers, packed as in memory.
8284
8285    This code is also used for function return values.  RETVAL indicates
8286    whether this is the case.
8287
8288    Much of this is taken from the SPARC V9 port, which has a similar
8289    calling convention.  */
8290
8291 static rtx
8292 rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, const_tree type,
8293                             bool named, bool retval)
8294 {
8295   rtx rvec[FIRST_PSEUDO_REGISTER];
8296   int k = 1, kbase = 1;
8297   HOST_WIDE_INT typesize = int_size_in_bytes (type);
8298   /* This is a copy; modifications are not visible to our caller.  */
8299   CUMULATIVE_ARGS copy_cum = *orig_cum;
8300   CUMULATIVE_ARGS *cum = &copy_cum;
8301
8302   /* Pad to 16 byte boundary if needed.  */
8303   if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
8304       && (cum->words % 2) != 0)
8305     cum->words++;
8306
8307   cum->intoffset = 0;
8308   cum->use_stack = 0;
8309   cum->named = named;
8310
8311   /* Put entries into rvec[] for individual FP and vector fields, and
8312      for the chunks of memory that go in int regs.  Note we start at
8313      element 1; 0 is reserved for an indication of using memory, and
8314      may or may not be filled in below. */
8315   rs6000_darwin64_record_arg_recurse (cum, type, /* startbit pos= */ 0, rvec, &k);
8316   rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
8317
8318   /* If any part of the struct went on the stack put all of it there.
8319      This hack is because the generic code for
8320      FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
8321      parts of the struct are not at the beginning.  */
8322   if (cum->use_stack)
8323     {
8324       if (retval)
8325         return NULL_RTX;    /* doesn't go in registers at all */
8326       kbase = 0;
8327       rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8328     }
8329   if (k > 1 || cum->use_stack)
8330     return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
8331   else
8332     return NULL_RTX;
8333 }
8334
8335 /* Determine where to place an argument in 64-bit mode with 32-bit ABI.  */
8336
8337 static rtx
8338 rs6000_mixed_function_arg (enum machine_mode mode, const_tree type,
8339                            int align_words)
8340 {
8341   int n_units;
8342   int i, k;
8343   rtx rvec[GP_ARG_NUM_REG + 1];
8344
8345   if (align_words >= GP_ARG_NUM_REG)
8346     return NULL_RTX;
8347
8348   n_units = rs6000_arg_size (mode, type);
8349
8350   /* Optimize the simple case where the arg fits in one gpr, except in
8351      the case of BLKmode due to assign_parms assuming that registers are
8352      BITS_PER_WORD wide.  */
8353   if (n_units == 0
8354       || (n_units == 1 && mode != BLKmode))
8355     return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8356
8357   k = 0;
8358   if (align_words + n_units > GP_ARG_NUM_REG)
8359     /* Not all of the arg fits in gprs.  Say that it goes in memory too,
8360        using a magic NULL_RTX component.
8361        This is not strictly correct.  Only some of the arg belongs in
8362        memory, not all of it.  However, the normal scheme using
8363        function_arg_partial_nregs can result in unusual subregs, eg.
8364        (subreg:SI (reg:DF) 4), which are not handled well.  The code to
8365        store the whole arg to memory is often more efficient than code
8366        to store pieces, and we know that space is available in the right
8367        place for the whole arg.  */
8368     rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8369
8370   i = 0;
8371   do
8372     {
8373       rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
8374       rtx off = GEN_INT (i++ * 4);
8375       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
8376     }
8377   while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
8378
8379   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
8380 }
8381
8382 /* Determine where to put an argument to a function.
8383    Value is zero to push the argument on the stack,
8384    or a hard register in which to store the argument.
8385
8386    MODE is the argument's machine mode.
8387    TYPE is the data type of the argument (as a tree).
8388     This is null for libcalls where that information may
8389     not be available.
8390    CUM is a variable of type CUMULATIVE_ARGS which gives info about
8391     the preceding args and about the function being called.  It is
8392     not modified in this routine.
8393    NAMED is nonzero if this argument is a named parameter
8394     (otherwise it is an extra parameter matching an ellipsis).
8395
8396    On RS/6000 the first eight words of non-FP are normally in registers
8397    and the rest are pushed.  Under AIX, the first 13 FP args are in registers.
8398    Under V.4, the first 8 FP args are in registers.
8399
8400    If this is floating-point and no prototype is specified, we use
8401    both an FP and integer register (or possibly FP reg and stack).  Library
8402    functions (when CALL_LIBCALL is set) always have the proper types for args,
8403    so we can pass the FP value just in one register.  emit_library_function
8404    doesn't support PARALLEL anyway.
8405
8406    Note that for args passed by reference, function_arg will be called
8407    with MODE and TYPE set to that of the pointer to the arg, not the arg
8408    itself.  */
8409
8410 static rtx
8411 rs6000_function_arg (cumulative_args_t cum_v, enum machine_mode mode,
8412                      const_tree type, bool named)
8413 {
8414   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
8415   enum rs6000_abi abi = DEFAULT_ABI;
8416
8417   /* Return a marker to indicate whether CR1 needs to set or clear the
8418      bit that V.4 uses to say fp args were passed in registers.
8419      Assume that we don't need the marker for software floating point,
8420      or compiler generated library calls.  */
8421   if (mode == VOIDmode)
8422     {
8423       if (abi == ABI_V4
8424           && (cum->call_cookie & CALL_LIBCALL) == 0
8425           && (cum->stdarg
8426               || (cum->nargs_prototype < 0
8427                   && (cum->prototype || TARGET_NO_PROTOTYPE))))
8428         {
8429           /* For the SPE, we need to crxor CR6 always.  */
8430           if (TARGET_SPE_ABI)
8431             return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
8432           else if (TARGET_HARD_FLOAT && TARGET_FPRS)
8433             return GEN_INT (cum->call_cookie
8434                             | ((cum->fregno == FP_ARG_MIN_REG)
8435                                ? CALL_V4_SET_FP_ARGS
8436                                : CALL_V4_CLEAR_FP_ARGS));
8437         }
8438
8439       return GEN_INT (cum->call_cookie & ~CALL_LIBCALL);
8440     }
8441
8442   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
8443     {
8444       rtx rslt = rs6000_darwin64_record_arg (cum, type, named, /*retval= */false);
8445       if (rslt != NULL_RTX)
8446         return rslt;
8447       /* Else fall through to usual handling.  */
8448     }
8449
8450   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
8451     if (TARGET_64BIT && ! cum->prototype)
8452       {
8453         /* Vector parameters get passed in vector register
8454            and also in GPRs or memory, in absence of prototype.  */
8455         int align_words;
8456         rtx slot;
8457         align_words = (cum->words + 1) & ~1;
8458
8459         if (align_words >= GP_ARG_NUM_REG)
8460           {
8461             slot = NULL_RTX;
8462           }
8463         else
8464           {
8465             slot = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8466           }
8467         return gen_rtx_PARALLEL (mode,
8468                  gen_rtvec (2,
8469                             gen_rtx_EXPR_LIST (VOIDmode,
8470                                                slot, const0_rtx),
8471                             gen_rtx_EXPR_LIST (VOIDmode,
8472                                                gen_rtx_REG (mode, cum->vregno),
8473                                                const0_rtx)));
8474       }
8475     else
8476       return gen_rtx_REG (mode, cum->vregno);
8477   else if (TARGET_ALTIVEC_ABI
8478            && (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
8479                || (type && TREE_CODE (type) == VECTOR_TYPE
8480                    && int_size_in_bytes (type) == 16)))
8481     {
8482       if (named || abi == ABI_V4)
8483         return NULL_RTX;
8484       else
8485         {
8486           /* Vector parameters to varargs functions under AIX or Darwin
8487              get passed in memory and possibly also in GPRs.  */
8488           int align, align_words, n_words;
8489           enum machine_mode part_mode;
8490
8491           /* Vector parameters must be 16-byte aligned.  This places them at
8492              2 mod 4 in terms of words in 32-bit mode, since the parameter
8493              save area starts at offset 24 from the stack.  In 64-bit mode,
8494              they just have to start on an even word, since the parameter
8495              save area is 16-byte aligned.  */
8496           if (TARGET_32BIT)
8497             align = (2 - cum->words) & 3;
8498           else
8499             align = cum->words & 1;
8500           align_words = cum->words + align;
8501
8502           /* Out of registers?  Memory, then.  */
8503           if (align_words >= GP_ARG_NUM_REG)
8504             return NULL_RTX;
8505
8506           if (TARGET_32BIT && TARGET_POWERPC64)
8507             return rs6000_mixed_function_arg (mode, type, align_words);
8508
8509           /* The vector value goes in GPRs.  Only the part of the
8510              value in GPRs is reported here.  */
8511           part_mode = mode;
8512           n_words = rs6000_arg_size (mode, type);
8513           if (align_words + n_words > GP_ARG_NUM_REG)
8514             /* Fortunately, there are only two possibilities, the value
8515                is either wholly in GPRs or half in GPRs and half not.  */
8516             part_mode = DImode;
8517
8518           return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
8519         }
8520     }
8521   else if (TARGET_SPE_ABI && TARGET_SPE
8522            && (SPE_VECTOR_MODE (mode)
8523                || (TARGET_E500_DOUBLE && (mode == DFmode
8524                                           || mode == DCmode
8525                                           || mode == TFmode
8526                                           || mode == TCmode))))
8527     return rs6000_spe_function_arg (cum, mode, type);
8528
8529   else if (abi == ABI_V4)
8530     {
8531       if (TARGET_HARD_FLOAT && TARGET_FPRS
8532           && ((TARGET_SINGLE_FLOAT && mode == SFmode)
8533               || (TARGET_DOUBLE_FLOAT && mode == DFmode)
8534               || (mode == TFmode && !TARGET_IEEEQUAD)
8535               || mode == SDmode || mode == DDmode || mode == TDmode))
8536         {
8537           /* _Decimal128 must use an even/odd register pair.  This assumes
8538              that the register number is odd when fregno is odd.  */
8539           if (mode == TDmode && (cum->fregno % 2) == 1)
8540             cum->fregno++;
8541
8542           if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
8543               <= FP_ARG_V4_MAX_REG)
8544             return gen_rtx_REG (mode, cum->fregno);
8545           else
8546             return NULL_RTX;
8547         }
8548       else
8549         {
8550           int n_words = rs6000_arg_size (mode, type);
8551           int gregno = cum->sysv_gregno;
8552
8553           /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
8554              (r7,r8) or (r9,r10).  As does any other 2 word item such
8555              as complex int due to a historical mistake.  */
8556           if (n_words == 2)
8557             gregno += (1 - gregno) & 1;
8558
8559           /* Multi-reg args are not split between registers and stack.  */
8560           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
8561             return NULL_RTX;
8562
8563           if (TARGET_32BIT && TARGET_POWERPC64)
8564             return rs6000_mixed_function_arg (mode, type,
8565                                               gregno - GP_ARG_MIN_REG);
8566           return gen_rtx_REG (mode, gregno);
8567         }
8568     }
8569   else
8570     {
8571       int align_words = rs6000_parm_start (mode, type, cum->words);
8572
8573       /* _Decimal128 must be passed in an even/odd float register pair.
8574          This assumes that the register number is odd when fregno is odd.  */
8575       if (mode == TDmode && (cum->fregno % 2) == 1)
8576         cum->fregno++;
8577
8578       if (USE_FP_FOR_ARG_P (cum, mode, type))
8579         {
8580           rtx rvec[GP_ARG_NUM_REG + 1];
8581           rtx r;
8582           int k;
8583           bool needs_psave;
8584           enum machine_mode fmode = mode;
8585           unsigned long n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
8586
8587           if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
8588             {
8589               /* Currently, we only ever need one reg here because complex
8590                  doubles are split.  */
8591               gcc_assert (cum->fregno == FP_ARG_MAX_REG
8592                           && (fmode == TFmode || fmode == TDmode));
8593
8594               /* Long double or _Decimal128 split over regs and memory.  */
8595               fmode = DECIMAL_FLOAT_MODE_P (fmode) ? DDmode : DFmode;
8596             }
8597
8598           /* Do we also need to pass this arg in the parameter save
8599              area?  */
8600           needs_psave = (type
8601                          && (cum->nargs_prototype <= 0
8602                              || (DEFAULT_ABI == ABI_AIX
8603                                  && TARGET_XL_COMPAT
8604                                  && align_words >= GP_ARG_NUM_REG)));
8605
8606           if (!needs_psave && mode == fmode)
8607             return gen_rtx_REG (fmode, cum->fregno);
8608
8609           k = 0;
8610           if (needs_psave)
8611             {
8612               /* Describe the part that goes in gprs or the stack.
8613                  This piece must come first, before the fprs.  */
8614               if (align_words < GP_ARG_NUM_REG)
8615                 {
8616                   unsigned long n_words = rs6000_arg_size (mode, type);
8617
8618                   if (align_words + n_words > GP_ARG_NUM_REG
8619                       || (TARGET_32BIT && TARGET_POWERPC64))
8620                     {
8621                       /* If this is partially on the stack, then we only
8622                          include the portion actually in registers here.  */
8623                       enum machine_mode rmode = TARGET_32BIT ? SImode : DImode;
8624                       rtx off;
8625                       int i = 0;
8626                       if (align_words + n_words > GP_ARG_NUM_REG)
8627                         /* Not all of the arg fits in gprs.  Say that it
8628                            goes in memory too, using a magic NULL_RTX
8629                            component.  Also see comment in
8630                            rs6000_mixed_function_arg for why the normal
8631                            function_arg_partial_nregs scheme doesn't work
8632                            in this case. */
8633                         rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX,
8634                                                        const0_rtx);
8635                       do
8636                         {
8637                           r = gen_rtx_REG (rmode,
8638                                            GP_ARG_MIN_REG + align_words);
8639                           off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
8640                           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
8641                         }
8642                       while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
8643                     }
8644                   else
8645                     {
8646                       /* The whole arg fits in gprs.  */
8647                       r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8648                       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
8649                     }
8650                 }
8651               else
8652                 /* It's entirely in memory.  */
8653                 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8654             }
8655
8656           /* Describe where this piece goes in the fprs.  */
8657           r = gen_rtx_REG (fmode, cum->fregno);
8658           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
8659
8660           return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
8661         }
8662       else if (align_words < GP_ARG_NUM_REG)
8663         {
8664           if (TARGET_32BIT && TARGET_POWERPC64)
8665             return rs6000_mixed_function_arg (mode, type, align_words);
8666
8667           if (mode == BLKmode)
8668             mode = Pmode;
8669
8670           return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8671         }
8672       else
8673         return NULL_RTX;
8674     }
8675 }
8676 \f
8677 /* For an arg passed partly in registers and partly in memory, this is
8678    the number of bytes passed in registers.  For args passed entirely in
8679    registers or entirely in memory, zero.  When an arg is described by a
8680    PARALLEL, perhaps using more than one register type, this function
8681    returns the number of bytes used by the first element of the PARALLEL.  */
8682
8683 static int
8684 rs6000_arg_partial_bytes (cumulative_args_t cum_v, enum machine_mode mode,
8685                           tree type, bool named)
8686 {
8687   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
8688   int ret = 0;
8689   int align_words;
8690
8691   if (DEFAULT_ABI == ABI_V4)
8692     return 0;
8693
8694   if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)
8695       && cum->nargs_prototype >= 0)
8696     return 0;
8697
8698   /* In this complicated case we just disable the partial_nregs code.  */
8699   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
8700     return 0;
8701
8702   align_words = rs6000_parm_start (mode, type, cum->words);
8703
8704   if (USE_FP_FOR_ARG_P (cum, mode, type))
8705     {
8706       /* If we are passing this arg in the fixed parameter save area
8707          (gprs or memory) as well as fprs, then this function should
8708          return the number of partial bytes passed in the parameter
8709          save area rather than partial bytes passed in fprs.  */
8710       if (type
8711           && (cum->nargs_prototype <= 0
8712               || (DEFAULT_ABI == ABI_AIX
8713                   && TARGET_XL_COMPAT
8714                   && align_words >= GP_ARG_NUM_REG)))
8715         return 0;
8716       else if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3)
8717                > FP_ARG_MAX_REG + 1)
8718         ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8;
8719       else if (cum->nargs_prototype >= 0)
8720         return 0;
8721     }
8722
8723   if (align_words < GP_ARG_NUM_REG
8724       && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
8725     ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
8726
8727   if (ret != 0 && TARGET_DEBUG_ARG)
8728     fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
8729
8730   return ret;
8731 }
8732 \f
8733 /* A C expression that indicates when an argument must be passed by
8734    reference.  If nonzero for an argument, a copy of that argument is
8735    made in memory and a pointer to the argument is passed instead of
8736    the argument itself.  The pointer is passed in whatever way is
8737    appropriate for passing a pointer to that type.
8738
8739    Under V.4, aggregates and long double are passed by reference.
8740
8741    As an extension to all 32-bit ABIs, AltiVec vectors are passed by
8742    reference unless the AltiVec vector extension ABI is in force.
8743
8744    As an extension to all ABIs, variable sized types are passed by
8745    reference.  */
8746
8747 static bool
8748 rs6000_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
8749                           enum machine_mode mode, const_tree type,
8750                           bool named ATTRIBUTE_UNUSED)
8751 {
8752   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && mode == TFmode)
8753     {
8754       if (TARGET_DEBUG_ARG)
8755         fprintf (stderr, "function_arg_pass_by_reference: V4 long double\n");
8756       return 1;
8757     }
8758
8759   if (!type)
8760     return 0;
8761
8762   if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
8763     {
8764       if (TARGET_DEBUG_ARG)
8765         fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
8766       return 1;
8767     }
8768
8769   if (int_size_in_bytes (type) < 0)
8770     {
8771       if (TARGET_DEBUG_ARG)
8772         fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
8773       return 1;
8774     }
8775
8776   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
8777      modes only exist for GCC vector types if -maltivec.  */
8778   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
8779     {
8780       if (TARGET_DEBUG_ARG)
8781         fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
8782       return 1;
8783     }
8784
8785   /* Pass synthetic vectors in memory.  */
8786   if (TREE_CODE (type) == VECTOR_TYPE
8787       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
8788     {
8789       static bool warned_for_pass_big_vectors = false;
8790       if (TARGET_DEBUG_ARG)
8791         fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
8792       if (!warned_for_pass_big_vectors)
8793         {
8794           warning (0, "GCC vector passed by reference: "
8795                    "non-standard ABI extension with no compatibility guarantee");
8796           warned_for_pass_big_vectors = true;
8797         }
8798       return 1;
8799     }
8800
8801   return 0;
8802 }
8803
8804 static void
8805 rs6000_move_block_from_reg (int regno, rtx x, int nregs)
8806 {
8807   int i;
8808   enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
8809
8810   if (nregs == 0)
8811     return;
8812
8813   for (i = 0; i < nregs; i++)
8814     {
8815       rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
8816       if (reload_completed)
8817         {
8818           if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
8819             tem = NULL_RTX;
8820           else
8821             tem = simplify_gen_subreg (reg_mode, x, BLKmode,
8822                                        i * GET_MODE_SIZE (reg_mode));
8823         }
8824       else
8825         tem = replace_equiv_address (tem, XEXP (tem, 0));
8826
8827       gcc_assert (tem);
8828
8829       emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
8830     }
8831 }
8832 \f
8833 /* Perform any needed actions needed for a function that is receiving a
8834    variable number of arguments.
8835
8836    CUM is as above.
8837
8838    MODE and TYPE are the mode and type of the current parameter.
8839
8840    PRETEND_SIZE is a variable that should be set to the amount of stack
8841    that must be pushed by the prolog to pretend that our caller pushed
8842    it.
8843
8844    Normally, this macro will push all remaining incoming registers on the
8845    stack and set PRETEND_SIZE to the length of the registers pushed.  */
8846
8847 static void
8848 setup_incoming_varargs (cumulative_args_t cum, enum machine_mode mode,
8849                         tree type, int *pretend_size ATTRIBUTE_UNUSED,
8850                         int no_rtl)
8851 {
8852   CUMULATIVE_ARGS next_cum;
8853   int reg_size = TARGET_32BIT ? 4 : 8;
8854   rtx save_area = NULL_RTX, mem;
8855   int first_reg_offset;
8856   alias_set_type set;
8857
8858   /* Skip the last named argument.  */
8859   next_cum = *get_cumulative_args (cum);
8860   rs6000_function_arg_advance_1 (&next_cum, mode, type, true, 0);
8861
8862   if (DEFAULT_ABI == ABI_V4)
8863     {
8864       first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
8865
8866       if (! no_rtl)
8867         {
8868           int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
8869           HOST_WIDE_INT offset = 0;
8870
8871           /* Try to optimize the size of the varargs save area.
8872              The ABI requires that ap.reg_save_area is doubleword
8873              aligned, but we don't need to allocate space for all
8874              the bytes, only those to which we actually will save
8875              anything.  */
8876           if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
8877             gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
8878           if (TARGET_HARD_FLOAT && TARGET_FPRS
8879               && next_cum.fregno <= FP_ARG_V4_MAX_REG
8880               && cfun->va_list_fpr_size)
8881             {
8882               if (gpr_reg_num)
8883                 fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
8884                            * UNITS_PER_FP_WORD;
8885               if (cfun->va_list_fpr_size
8886                   < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
8887                 fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
8888               else
8889                 fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
8890                             * UNITS_PER_FP_WORD;
8891             }
8892           if (gpr_reg_num)
8893             {
8894               offset = -((first_reg_offset * reg_size) & ~7);
8895               if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
8896                 {
8897                   gpr_reg_num = cfun->va_list_gpr_size;
8898                   if (reg_size == 4 && (first_reg_offset & 1))
8899                     gpr_reg_num++;
8900                 }
8901               gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
8902             }
8903           else if (fpr_size)
8904             offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
8905                        * UNITS_PER_FP_WORD
8906                      - (int) (GP_ARG_NUM_REG * reg_size);
8907
8908           if (gpr_size + fpr_size)
8909             {
8910               rtx reg_save_area
8911                 = assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
8912               gcc_assert (GET_CODE (reg_save_area) == MEM);
8913               reg_save_area = XEXP (reg_save_area, 0);
8914               if (GET_CODE (reg_save_area) == PLUS)
8915                 {
8916                   gcc_assert (XEXP (reg_save_area, 0)
8917                               == virtual_stack_vars_rtx);
8918                   gcc_assert (GET_CODE (XEXP (reg_save_area, 1)) == CONST_INT);
8919                   offset += INTVAL (XEXP (reg_save_area, 1));
8920                 }
8921               else
8922                 gcc_assert (reg_save_area == virtual_stack_vars_rtx);
8923             }
8924
8925           cfun->machine->varargs_save_offset = offset;
8926           save_area = plus_constant (virtual_stack_vars_rtx, offset);
8927         }
8928     }
8929   else
8930     {
8931       first_reg_offset = next_cum.words;
8932       save_area = virtual_incoming_args_rtx;
8933
8934       if (targetm.calls.must_pass_in_stack (mode, type))
8935         first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
8936     }
8937
8938   set = get_varargs_alias_set ();
8939   if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
8940       && cfun->va_list_gpr_size)
8941     {
8942       int nregs = GP_ARG_NUM_REG - first_reg_offset;
8943
8944       if (va_list_gpr_counter_field)
8945         {
8946           /* V4 va_list_gpr_size counts number of registers needed.  */
8947           if (nregs > cfun->va_list_gpr_size)
8948             nregs = cfun->va_list_gpr_size;
8949         }
8950       else
8951         {
8952           /* char * va_list instead counts number of bytes needed.  */
8953           if (nregs > cfun->va_list_gpr_size / reg_size)
8954             nregs = cfun->va_list_gpr_size / reg_size;
8955         }
8956
8957       mem = gen_rtx_MEM (BLKmode,
8958                          plus_constant (save_area,
8959                                         first_reg_offset * reg_size));
8960       MEM_NOTRAP_P (mem) = 1;
8961       set_mem_alias_set (mem, set);
8962       set_mem_align (mem, BITS_PER_WORD);
8963
8964       rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
8965                                   nregs);
8966     }
8967
8968   /* Save FP registers if needed.  */
8969   if (DEFAULT_ABI == ABI_V4
8970       && TARGET_HARD_FLOAT && TARGET_FPRS
8971       && ! no_rtl
8972       && next_cum.fregno <= FP_ARG_V4_MAX_REG
8973       && cfun->va_list_fpr_size)
8974     {
8975       int fregno = next_cum.fregno, nregs;
8976       rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
8977       rtx lab = gen_label_rtx ();
8978       int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
8979                                                * UNITS_PER_FP_WORD);
8980
8981       emit_jump_insn
8982         (gen_rtx_SET (VOIDmode,
8983                       pc_rtx,
8984                       gen_rtx_IF_THEN_ELSE (VOIDmode,
8985                                             gen_rtx_NE (VOIDmode, cr1,
8986                                                         const0_rtx),
8987                                             gen_rtx_LABEL_REF (VOIDmode, lab),
8988                                             pc_rtx)));
8989
8990       for (nregs = 0;
8991            fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
8992            fregno++, off += UNITS_PER_FP_WORD, nregs++)
8993         {
8994           mem = gen_rtx_MEM ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
8995                               ? DFmode : SFmode, 
8996                              plus_constant (save_area, off));
8997           MEM_NOTRAP_P (mem) = 1;
8998           set_mem_alias_set (mem, set);
8999           set_mem_align (mem, GET_MODE_ALIGNMENT (
9000                          (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9001                           ? DFmode : SFmode));
9002           emit_move_insn (mem, gen_rtx_REG (
9003                           (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9004                            ? DFmode : SFmode, fregno));
9005         }
9006
9007       emit_label (lab);
9008     }
9009 }
9010
9011 /* Create the va_list data type.  */
9012
9013 static tree
9014 rs6000_build_builtin_va_list (void)
9015 {
9016   tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
9017
9018   /* For AIX, prefer 'char *' because that's what the system
9019      header files like.  */
9020   if (DEFAULT_ABI != ABI_V4)
9021     return build_pointer_type (char_type_node);
9022
9023   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
9024   type_decl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
9025                           get_identifier ("__va_list_tag"), record);
9026
9027   f_gpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("gpr"),
9028                       unsigned_char_type_node);
9029   f_fpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("fpr"),
9030                       unsigned_char_type_node);
9031   /* Give the two bytes of padding a name, so that -Wpadded won't warn on
9032      every user file.  */
9033   f_res = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9034                       get_identifier ("reserved"), short_unsigned_type_node);
9035   f_ovf = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9036                       get_identifier ("overflow_arg_area"),
9037                       ptr_type_node);
9038   f_sav = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9039                       get_identifier ("reg_save_area"),
9040                       ptr_type_node);
9041
9042   va_list_gpr_counter_field = f_gpr;
9043   va_list_fpr_counter_field = f_fpr;
9044
9045   DECL_FIELD_CONTEXT (f_gpr) = record;
9046   DECL_FIELD_CONTEXT (f_fpr) = record;
9047   DECL_FIELD_CONTEXT (f_res) = record;
9048   DECL_FIELD_CONTEXT (f_ovf) = record;
9049   DECL_FIELD_CONTEXT (f_sav) = record;
9050
9051   TYPE_STUB_DECL (record) = type_decl;
9052   TYPE_NAME (record) = type_decl;
9053   TYPE_FIELDS (record) = f_gpr;
9054   DECL_CHAIN (f_gpr) = f_fpr;
9055   DECL_CHAIN (f_fpr) = f_res;
9056   DECL_CHAIN (f_res) = f_ovf;
9057   DECL_CHAIN (f_ovf) = f_sav;
9058
9059   layout_type (record);
9060
9061   /* The correct type is an array type of one element.  */
9062   return build_array_type (record, build_index_type (size_zero_node));
9063 }
9064
9065 /* Implement va_start.  */
9066
9067 static void
9068 rs6000_va_start (tree valist, rtx nextarg)
9069 {
9070   HOST_WIDE_INT words, n_gpr, n_fpr;
9071   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
9072   tree gpr, fpr, ovf, sav, t;
9073
9074   /* Only SVR4 needs something special.  */
9075   if (DEFAULT_ABI != ABI_V4)
9076     {
9077       std_expand_builtin_va_start (valist, nextarg);
9078       return;
9079     }
9080
9081   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
9082   f_fpr = DECL_CHAIN (f_gpr);
9083   f_res = DECL_CHAIN (f_fpr);
9084   f_ovf = DECL_CHAIN (f_res);
9085   f_sav = DECL_CHAIN (f_ovf);
9086
9087   valist = build_simple_mem_ref (valist);
9088   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
9089   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
9090                 f_fpr, NULL_TREE);
9091   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
9092                 f_ovf, NULL_TREE);
9093   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
9094                 f_sav, NULL_TREE);
9095
9096   /* Count number of gp and fp argument registers used.  */
9097   words = crtl->args.info.words;
9098   n_gpr = MIN (crtl->args.info.sysv_gregno - GP_ARG_MIN_REG,
9099                GP_ARG_NUM_REG);
9100   n_fpr = MIN (crtl->args.info.fregno - FP_ARG_MIN_REG,
9101                FP_ARG_NUM_REG);
9102
9103   if (TARGET_DEBUG_ARG)
9104     fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
9105              HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
9106              words, n_gpr, n_fpr);
9107
9108   if (cfun->va_list_gpr_size)
9109     {
9110       t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
9111                   build_int_cst (NULL_TREE, n_gpr));
9112       TREE_SIDE_EFFECTS (t) = 1;
9113       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9114     }
9115
9116   if (cfun->va_list_fpr_size)
9117     {
9118       t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
9119                   build_int_cst (NULL_TREE, n_fpr));
9120       TREE_SIDE_EFFECTS (t) = 1;
9121       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9122
9123 #ifdef HAVE_AS_GNU_ATTRIBUTE
9124       if (call_ABI_of_interest (cfun->decl))
9125         rs6000_passes_float = true;
9126 #endif
9127     }
9128
9129   /* Find the overflow area.  */
9130   t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
9131   if (words != 0)
9132     t = fold_build_pointer_plus_hwi (t, words * UNITS_PER_WORD);
9133   t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
9134   TREE_SIDE_EFFECTS (t) = 1;
9135   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9136
9137   /* If there were no va_arg invocations, don't set up the register
9138      save area.  */
9139   if (!cfun->va_list_gpr_size
9140       && !cfun->va_list_fpr_size
9141       && n_gpr < GP_ARG_NUM_REG
9142       && n_fpr < FP_ARG_V4_MAX_REG)
9143     return;
9144
9145   /* Find the register save area.  */
9146   t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
9147   if (cfun->machine->varargs_save_offset)
9148     t = fold_build_pointer_plus_hwi (t, cfun->machine->varargs_save_offset);
9149   t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
9150   TREE_SIDE_EFFECTS (t) = 1;
9151   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9152 }
9153
9154 /* Implement va_arg.  */
9155
9156 tree
9157 rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
9158                         gimple_seq *post_p)
9159 {
9160   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
9161   tree gpr, fpr, ovf, sav, reg, t, u;
9162   int size, rsize, n_reg, sav_ofs, sav_scale;
9163   tree lab_false, lab_over, addr;
9164   int align;
9165   tree ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
9166   int regalign = 0;
9167   gimple stmt;
9168
9169   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
9170     {
9171       t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
9172       return build_va_arg_indirect_ref (t);
9173     }
9174
9175   /* We need to deal with the fact that the darwin ppc64 ABI is defined by an
9176      earlier version of gcc, with the property that it always applied alignment
9177      adjustments to the va-args (even for zero-sized types).  The cheapest way
9178      to deal with this is to replicate the effect of the part of 
9179      std_gimplify_va_arg_expr that carries out the align adjust, for the case 
9180      of relevance.  
9181      We don't need to check for pass-by-reference because of the test above.
9182      We can return a simplifed answer, since we know there's no offset to add.  */
9183
9184   if (TARGET_MACHO
9185       && rs6000_darwin64_abi 
9186       && integer_zerop (TYPE_SIZE (type)))
9187     {
9188       unsigned HOST_WIDE_INT align, boundary;
9189       tree valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
9190       align = PARM_BOUNDARY / BITS_PER_UNIT;
9191       boundary = rs6000_function_arg_boundary (TYPE_MODE (type), type);
9192       if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
9193         boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
9194       boundary /= BITS_PER_UNIT;
9195       if (boundary > align)
9196         {
9197           tree t ;
9198           /* This updates arg ptr by the amount that would be necessary
9199              to align the zero-sized (but not zero-alignment) item.  */
9200           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
9201                       fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
9202           gimplify_and_add (t, pre_p);
9203
9204           t = fold_convert (sizetype, valist_tmp);
9205           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
9206                   fold_convert (TREE_TYPE (valist),
9207                                 fold_build2 (BIT_AND_EXPR, sizetype, t,
9208                                              size_int (-boundary))));
9209           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
9210           gimplify_and_add (t, pre_p);
9211         }
9212       /* Since it is zero-sized there's no increment for the item itself. */
9213       valist_tmp = fold_convert (build_pointer_type (type), valist_tmp);
9214       return build_va_arg_indirect_ref (valist_tmp);
9215     }
9216
9217   if (DEFAULT_ABI != ABI_V4)
9218     {
9219       if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
9220         {
9221           tree elem_type = TREE_TYPE (type);
9222           enum machine_mode elem_mode = TYPE_MODE (elem_type);
9223           int elem_size = GET_MODE_SIZE (elem_mode);
9224
9225           if (elem_size < UNITS_PER_WORD)
9226             {
9227               tree real_part, imag_part;
9228               gimple_seq post = NULL;
9229
9230               real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
9231                                                   &post);
9232               /* Copy the value into a temporary, lest the formal temporary
9233                  be reused out from under us.  */
9234               real_part = get_initialized_tmp_var (real_part, pre_p, &post);
9235               gimple_seq_add_seq (pre_p, post);
9236
9237               imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
9238                                                   post_p);
9239
9240               return build2 (COMPLEX_EXPR, type, real_part, imag_part);
9241             }
9242         }
9243
9244       return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
9245     }
9246
9247   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
9248   f_fpr = DECL_CHAIN (f_gpr);
9249   f_res = DECL_CHAIN (f_fpr);
9250   f_ovf = DECL_CHAIN (f_res);
9251   f_sav = DECL_CHAIN (f_ovf);
9252
9253   valist = build_va_arg_indirect_ref (valist);
9254   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
9255   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
9256                 f_fpr, NULL_TREE);
9257   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
9258                 f_ovf, NULL_TREE);
9259   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
9260                 f_sav, NULL_TREE);
9261
9262   size = int_size_in_bytes (type);
9263   rsize = (size + 3) / 4;
9264   align = 1;
9265
9266   if (TARGET_HARD_FLOAT && TARGET_FPRS
9267       && ((TARGET_SINGLE_FLOAT && TYPE_MODE (type) == SFmode)
9268           || (TARGET_DOUBLE_FLOAT 
9269               && (TYPE_MODE (type) == DFmode 
9270                   || TYPE_MODE (type) == TFmode
9271                   || TYPE_MODE (type) == SDmode
9272                   || TYPE_MODE (type) == DDmode
9273                   || TYPE_MODE (type) == TDmode))))
9274     {
9275       /* FP args go in FP registers, if present.  */
9276       reg = fpr;
9277       n_reg = (size + 7) / 8;
9278       sav_ofs = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4) * 4;
9279       sav_scale = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4);
9280       if (TYPE_MODE (type) != SFmode && TYPE_MODE (type) != SDmode)
9281         align = 8;
9282     }
9283   else
9284     {
9285       /* Otherwise into GP registers.  */
9286       reg = gpr;
9287       n_reg = rsize;
9288       sav_ofs = 0;
9289       sav_scale = 4;
9290       if (n_reg == 2)
9291         align = 8;
9292     }
9293
9294   /* Pull the value out of the saved registers....  */
9295
9296   lab_over = NULL;
9297   addr = create_tmp_var (ptr_type_node, "addr");
9298
9299   /*  AltiVec vectors never go in registers when -mabi=altivec.  */
9300   if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
9301     align = 16;
9302   else
9303     {
9304       lab_false = create_artificial_label (input_location);
9305       lab_over = create_artificial_label (input_location);
9306
9307       /* Long long and SPE vectors are aligned in the registers.
9308          As are any other 2 gpr item such as complex int due to a
9309          historical mistake.  */
9310       u = reg;
9311       if (n_reg == 2 && reg == gpr)
9312         {
9313           regalign = 1;
9314           u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9315                      build_int_cst (TREE_TYPE (reg), n_reg - 1));
9316           u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg),
9317                       unshare_expr (reg), u);
9318         }
9319       /* _Decimal128 is passed in even/odd fpr pairs; the stored
9320          reg number is 0 for f1, so we want to make it odd.  */
9321       else if (reg == fpr && TYPE_MODE (type) == TDmode)
9322         {
9323           t = build2 (BIT_IOR_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9324                       build_int_cst (TREE_TYPE (reg), 1));
9325           u = build2 (MODIFY_EXPR, void_type_node, unshare_expr (reg), t);
9326         }
9327
9328       t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
9329       t = build2 (GE_EXPR, boolean_type_node, u, t);
9330       u = build1 (GOTO_EXPR, void_type_node, lab_false);
9331       t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
9332       gimplify_and_add (t, pre_p);
9333
9334       t = sav;
9335       if (sav_ofs)
9336         t = fold_build_pointer_plus_hwi (sav, sav_ofs);
9337
9338       u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9339                   build_int_cst (TREE_TYPE (reg), n_reg));
9340       u = fold_convert (sizetype, u);
9341       u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
9342       t = fold_build_pointer_plus (t, u);
9343
9344       /* _Decimal32 varargs are located in the second word of the 64-bit
9345          FP register for 32-bit binaries.  */
9346       if (!TARGET_POWERPC64
9347           && TARGET_HARD_FLOAT && TARGET_FPRS
9348           && TYPE_MODE (type) == SDmode)
9349         t = fold_build_pointer_plus_hwi (t, size);
9350
9351       gimplify_assign (addr, t, pre_p);
9352
9353       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
9354
9355       stmt = gimple_build_label (lab_false);
9356       gimple_seq_add_stmt (pre_p, stmt);
9357
9358       if ((n_reg == 2 && !regalign) || n_reg > 2)
9359         {
9360           /* Ensure that we don't find any more args in regs.
9361              Alignment has taken care of for special cases.  */
9362           gimplify_assign (reg, build_int_cst (TREE_TYPE (reg), 8), pre_p);
9363         }
9364     }
9365
9366   /* ... otherwise out of the overflow area.  */
9367
9368   /* Care for on-stack alignment if needed.  */
9369   t = ovf;
9370   if (align != 1)
9371     {
9372       t = fold_build_pointer_plus_hwi (t, align - 1);
9373       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
9374                   build_int_cst (TREE_TYPE (t), -align));
9375     }
9376   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
9377
9378   gimplify_assign (unshare_expr (addr), t, pre_p);
9379
9380   t = fold_build_pointer_plus_hwi (t, size);
9381   gimplify_assign (unshare_expr (ovf), t, pre_p);
9382
9383   if (lab_over)
9384     {
9385       stmt = gimple_build_label (lab_over);
9386       gimple_seq_add_stmt (pre_p, stmt);
9387     }
9388
9389   if (STRICT_ALIGNMENT
9390       && (TYPE_ALIGN (type)
9391           > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align)))
9392     {
9393       /* The value (of type complex double, for example) may not be
9394          aligned in memory in the saved registers, so copy via a
9395          temporary.  (This is the same code as used for SPARC.)  */
9396       tree tmp = create_tmp_var (type, "va_arg_tmp");
9397       tree dest_addr = build_fold_addr_expr (tmp);
9398
9399       tree copy = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY],
9400                                    3, dest_addr, addr, size_int (rsize * 4));
9401
9402       gimplify_and_add (copy, pre_p);
9403       addr = dest_addr;
9404     }
9405
9406   addr = fold_convert (ptrtype, addr);
9407   return build_va_arg_indirect_ref (addr);
9408 }
9409
9410 /* Builtins.  */
9411
9412 static void
9413 def_builtin (int mask, const char *name, tree type, int code)
9414 {
9415   if ((mask & target_flags) || TARGET_PAIRED_FLOAT)
9416     {
9417       tree t;
9418       if (rs6000_builtin_decls[code])
9419         fatal_error ("internal error: builtin function to %s already processed",
9420                      name);
9421
9422       rs6000_builtin_decls[code] = t =
9423         add_builtin_function (name, type, code, BUILT_IN_MD,
9424                               NULL, NULL_TREE);
9425
9426       gcc_assert (code >= 0 && code < (int)RS6000_BUILTIN_COUNT);
9427       switch (builtin_classify[code])
9428         {
9429         default:
9430           gcc_unreachable ();
9431
9432           /* assume builtin can do anything.  */
9433         case RS6000_BTC_MISC:
9434           break;
9435
9436           /* const function, function only depends on the inputs.  */
9437         case RS6000_BTC_CONST:
9438           TREE_READONLY (t) = 1;
9439           TREE_NOTHROW (t) = 1;
9440           break;
9441
9442           /* pure function, function can read global memory.  */
9443         case RS6000_BTC_PURE:
9444           DECL_PURE_P (t) = 1;
9445           TREE_NOTHROW (t) = 1;
9446           break;
9447
9448           /* Function is a math function.  If rounding mode is on, then treat
9449              the function as not reading global memory, but it can have
9450              arbitrary side effects.  If it is off, then assume the function is
9451              a const function.  This mimics the ATTR_MATHFN_FPROUNDING
9452              attribute in builtin-attribute.def that is used for the math
9453              functions. */
9454         case RS6000_BTC_FP_PURE:
9455           TREE_NOTHROW (t) = 1;
9456           if (flag_rounding_math)
9457             {
9458               DECL_PURE_P (t) = 1;
9459               DECL_IS_NOVOPS (t) = 1;
9460             }
9461           else
9462             TREE_READONLY (t) = 1;
9463           break;
9464         }
9465     }
9466 }
9467
9468 /* Simple ternary operations: VECd = foo (VECa, VECb, VECc).  */
9469
9470 static const struct builtin_description bdesc_3arg[] =
9471 {
9472   { MASK_ALTIVEC, CODE_FOR_fmav4sf4, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
9473   { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
9474   { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
9475   { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
9476   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
9477   { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
9478   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
9479   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
9480   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
9481   { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
9482   { MASK_ALTIVEC, CODE_FOR_nfmsv4sf4, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
9483   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2df, "__builtin_altivec_vperm_2df", ALTIVEC_BUILTIN_VPERM_2DF },
9484   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2di, "__builtin_altivec_vperm_2di", ALTIVEC_BUILTIN_VPERM_2DI },
9485   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
9486   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
9487   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
9488   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
9489   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2di_uns, "__builtin_altivec_vperm_2di_uns", ALTIVEC_BUILTIN_VPERM_2DI_UNS },
9490   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si_uns, "__builtin_altivec_vperm_4si_uns", ALTIVEC_BUILTIN_VPERM_4SI_UNS },
9491   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi_uns, "__builtin_altivec_vperm_8hi_uns", ALTIVEC_BUILTIN_VPERM_8HI_UNS },
9492   { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_altivec_vperm_16qi_uns", ALTIVEC_BUILTIN_VPERM_16QI_UNS },
9493   { MASK_ALTIVEC, CODE_FOR_vector_select_v4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
9494   { MASK_ALTIVEC, CODE_FOR_vector_select_v4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
9495   { MASK_ALTIVEC, CODE_FOR_vector_select_v8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
9496   { MASK_ALTIVEC, CODE_FOR_vector_select_v16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
9497   { MASK_ALTIVEC, CODE_FOR_vector_select_v2df, "__builtin_altivec_vsel_2df", ALTIVEC_BUILTIN_VSEL_2DF },
9498   { MASK_ALTIVEC, CODE_FOR_vector_select_v2di, "__builtin_altivec_vsel_2di", ALTIVEC_BUILTIN_VSEL_2DI },
9499   { MASK_ALTIVEC, CODE_FOR_vector_select_v4si_uns, "__builtin_altivec_vsel_4si_uns", ALTIVEC_BUILTIN_VSEL_4SI_UNS },
9500   { MASK_ALTIVEC, CODE_FOR_vector_select_v8hi_uns, "__builtin_altivec_vsel_8hi_uns", ALTIVEC_BUILTIN_VSEL_8HI_UNS },
9501   { MASK_ALTIVEC, CODE_FOR_vector_select_v16qi_uns, "__builtin_altivec_vsel_16qi_uns", ALTIVEC_BUILTIN_VSEL_16QI_UNS },
9502   { MASK_ALTIVEC, CODE_FOR_vector_select_v2di_uns, "__builtin_altivec_vsel_2di_uns", ALTIVEC_BUILTIN_VSEL_2DI_UNS },
9503   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
9504   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
9505   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
9506   { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
9507
9508   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madd", ALTIVEC_BUILTIN_VEC_MADD },
9509   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madds", ALTIVEC_BUILTIN_VEC_MADDS },
9510   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mladd", ALTIVEC_BUILTIN_VEC_MLADD },
9511   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mradds", ALTIVEC_BUILTIN_VEC_MRADDS },
9512   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msum", ALTIVEC_BUILTIN_VEC_MSUM },
9513   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshm", ALTIVEC_BUILTIN_VEC_VMSUMSHM },
9514   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhm", ALTIVEC_BUILTIN_VEC_VMSUMUHM },
9515   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsummbm", ALTIVEC_BUILTIN_VEC_VMSUMMBM },
9516   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumubm", ALTIVEC_BUILTIN_VEC_VMSUMUBM },
9517   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msums", ALTIVEC_BUILTIN_VEC_MSUMS },
9518   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshs", ALTIVEC_BUILTIN_VEC_VMSUMSHS },
9519   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhs", ALTIVEC_BUILTIN_VEC_VMSUMUHS },
9520   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmsub", ALTIVEC_BUILTIN_VEC_NMSUB },
9521   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_perm", ALTIVEC_BUILTIN_VEC_PERM },
9522   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sel", ALTIVEC_BUILTIN_VEC_SEL },
9523
9524   { MASK_VSX, CODE_FOR_fmav2df4, "__builtin_vsx_xvmadddp", VSX_BUILTIN_XVMADDDP },
9525   { MASK_VSX, CODE_FOR_fmsv2df4, "__builtin_vsx_xvmsubdp", VSX_BUILTIN_XVMSUBDP },
9526   { MASK_VSX, CODE_FOR_nfmav2df4, "__builtin_vsx_xvnmadddp", VSX_BUILTIN_XVNMADDDP },
9527   { MASK_VSX, CODE_FOR_nfmsv2df4, "__builtin_vsx_xvnmsubdp", VSX_BUILTIN_XVNMSUBDP },
9528
9529   { MASK_VSX, CODE_FOR_fmav4sf4, "__builtin_vsx_xvmaddsp", VSX_BUILTIN_XVMADDSP },
9530   { MASK_VSX, CODE_FOR_fmsv4sf4, "__builtin_vsx_xvmsubsp", VSX_BUILTIN_XVMSUBSP },
9531   { MASK_VSX, CODE_FOR_nfmav4sf4, "__builtin_vsx_xvnmaddsp", VSX_BUILTIN_XVNMADDSP },
9532   { MASK_VSX, CODE_FOR_nfmsv4sf4, "__builtin_vsx_xvnmsubsp", VSX_BUILTIN_XVNMSUBSP },
9533
9534   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msub", VSX_BUILTIN_VEC_MSUB },
9535   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmadd", VSX_BUILTIN_VEC_NMADD },
9536
9537   { MASK_VSX, CODE_FOR_vector_select_v2di, "__builtin_vsx_xxsel_2di", VSX_BUILTIN_XXSEL_2DI },
9538   { MASK_VSX, CODE_FOR_vector_select_v2df, "__builtin_vsx_xxsel_2df", VSX_BUILTIN_XXSEL_2DF },
9539   { MASK_VSX, CODE_FOR_vector_select_v4sf, "__builtin_vsx_xxsel_4sf", VSX_BUILTIN_XXSEL_4SF },
9540   { MASK_VSX, CODE_FOR_vector_select_v4si, "__builtin_vsx_xxsel_4si", VSX_BUILTIN_XXSEL_4SI },
9541   { MASK_VSX, CODE_FOR_vector_select_v8hi, "__builtin_vsx_xxsel_8hi", VSX_BUILTIN_XXSEL_8HI },
9542   { MASK_VSX, CODE_FOR_vector_select_v16qi, "__builtin_vsx_xxsel_16qi", VSX_BUILTIN_XXSEL_16QI },
9543   { MASK_VSX, CODE_FOR_vector_select_v2di_uns, "__builtin_vsx_xxsel_2di_uns", VSX_BUILTIN_XXSEL_2DI_UNS },
9544   { MASK_VSX, CODE_FOR_vector_select_v4si_uns, "__builtin_vsx_xxsel_4si_uns", VSX_BUILTIN_XXSEL_4SI_UNS },
9545   { MASK_VSX, CODE_FOR_vector_select_v8hi_uns, "__builtin_vsx_xxsel_8hi_uns", VSX_BUILTIN_XXSEL_8HI_UNS },
9546   { MASK_VSX, CODE_FOR_vector_select_v16qi_uns, "__builtin_vsx_xxsel_16qi_uns", VSX_BUILTIN_XXSEL_16QI_UNS },
9547
9548   { MASK_VSX, CODE_FOR_altivec_vperm_v2di, "__builtin_vsx_vperm_2di", VSX_BUILTIN_VPERM_2DI },
9549   { MASK_VSX, CODE_FOR_altivec_vperm_v2df, "__builtin_vsx_vperm_2df", VSX_BUILTIN_VPERM_2DF },
9550   { MASK_VSX, CODE_FOR_altivec_vperm_v4sf, "__builtin_vsx_vperm_4sf", VSX_BUILTIN_VPERM_4SF },
9551   { MASK_VSX, CODE_FOR_altivec_vperm_v4si, "__builtin_vsx_vperm_4si", VSX_BUILTIN_VPERM_4SI },
9552   { MASK_VSX, CODE_FOR_altivec_vperm_v8hi, "__builtin_vsx_vperm_8hi", VSX_BUILTIN_VPERM_8HI },
9553   { MASK_VSX, CODE_FOR_altivec_vperm_v16qi, "__builtin_vsx_vperm_16qi", VSX_BUILTIN_VPERM_16QI },
9554   { MASK_VSX, CODE_FOR_altivec_vperm_v2di_uns, "__builtin_vsx_vperm_2di_uns", VSX_BUILTIN_VPERM_2DI_UNS },
9555   { MASK_VSX, CODE_FOR_altivec_vperm_v4si_uns, "__builtin_vsx_vperm_4si_uns", VSX_BUILTIN_VPERM_4SI_UNS },
9556   { MASK_VSX, CODE_FOR_altivec_vperm_v8hi_uns, "__builtin_vsx_vperm_8hi_uns", VSX_BUILTIN_VPERM_8HI_UNS },
9557   { MASK_VSX, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_vsx_vperm_16qi_uns", VSX_BUILTIN_VPERM_16QI_UNS },
9558
9559   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v2df, "__builtin_vsx_xxpermdi_2df", VSX_BUILTIN_XXPERMDI_2DF },
9560   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v2di, "__builtin_vsx_xxpermdi_2di", VSX_BUILTIN_XXPERMDI_2DI },
9561   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v4sf, "__builtin_vsx_xxpermdi_4sf", VSX_BUILTIN_XXPERMDI_4SF },
9562   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v4si, "__builtin_vsx_xxpermdi_4si", VSX_BUILTIN_XXPERMDI_4SI },
9563   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v8hi, "__builtin_vsx_xxpermdi_8hi", VSX_BUILTIN_XXPERMDI_8HI },
9564   { MASK_VSX, CODE_FOR_vsx_xxpermdi_v16qi, "__builtin_vsx_xxpermdi_16qi", VSX_BUILTIN_XXPERMDI_16QI },
9565   { MASK_VSX, CODE_FOR_nothing, "__builtin_vsx_xxpermdi", VSX_BUILTIN_VEC_XXPERMDI },
9566   { MASK_VSX, CODE_FOR_vsx_set_v2df, "__builtin_vsx_set_2df", VSX_BUILTIN_SET_2DF },
9567   { MASK_VSX, CODE_FOR_vsx_set_v2di, "__builtin_vsx_set_2di", VSX_BUILTIN_SET_2DI },
9568
9569   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v2di, "__builtin_vsx_xxsldwi_2di", VSX_BUILTIN_XXSLDWI_2DI },
9570   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v2df, "__builtin_vsx_xxsldwi_2df", VSX_BUILTIN_XXSLDWI_2DF },
9571   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v4sf, "__builtin_vsx_xxsldwi_4sf", VSX_BUILTIN_XXSLDWI_4SF },
9572   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v4si, "__builtin_vsx_xxsldwi_4si", VSX_BUILTIN_XXSLDWI_4SI },
9573   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v8hi, "__builtin_vsx_xxsldwi_8hi", VSX_BUILTIN_XXSLDWI_8HI },
9574   { MASK_VSX, CODE_FOR_vsx_xxsldwi_v16qi, "__builtin_vsx_xxsldwi_16qi", VSX_BUILTIN_XXSLDWI_16QI },
9575   { MASK_VSX, CODE_FOR_nothing, "__builtin_vsx_xxsldwi", VSX_BUILTIN_VEC_XXSLDWI },
9576
9577   { 0, CODE_FOR_fmsv2sf4, "__builtin_paired_msub", PAIRED_BUILTIN_MSUB },
9578   { 0, CODE_FOR_fmav2sf4, "__builtin_paired_madd", PAIRED_BUILTIN_MADD },
9579   { 0, CODE_FOR_paired_madds0, "__builtin_paired_madds0", PAIRED_BUILTIN_MADDS0 },
9580   { 0, CODE_FOR_paired_madds1, "__builtin_paired_madds1", PAIRED_BUILTIN_MADDS1 },
9581   { 0, CODE_FOR_nfmsv2sf4, "__builtin_paired_nmsub", PAIRED_BUILTIN_NMSUB },
9582   { 0, CODE_FOR_nfmav2sf4, "__builtin_paired_nmadd", PAIRED_BUILTIN_NMADD },
9583   { 0, CODE_FOR_paired_sum0, "__builtin_paired_sum0", PAIRED_BUILTIN_SUM0 },
9584   { 0, CODE_FOR_paired_sum1, "__builtin_paired_sum1", PAIRED_BUILTIN_SUM1 },
9585   { 0, CODE_FOR_selv2sf4, "__builtin_paired_selv2sf4", PAIRED_BUILTIN_SELV2SF4 },
9586 };
9587
9588 /* DST operations: void foo (void *, const int, const char).  */
9589
9590 static const struct builtin_description bdesc_dst[] =
9591 {
9592   { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
9593   { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
9594   { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
9595   { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT },
9596
9597   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dst", ALTIVEC_BUILTIN_VEC_DST },
9598   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstt", ALTIVEC_BUILTIN_VEC_DSTT },
9599   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstst", ALTIVEC_BUILTIN_VEC_DSTST },
9600   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dststt", ALTIVEC_BUILTIN_VEC_DSTSTT }
9601 };
9602
9603 /* Simple binary operations: VECc = foo (VECa, VECb).  */
9604
9605 static struct builtin_description bdesc_2arg[] =
9606 {
9607   { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
9608   { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
9609   { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
9610   { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
9611   { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
9612   { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
9613   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
9614   { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
9615   { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
9616   { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
9617   { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
9618   { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
9619   { MASK_ALTIVEC, CODE_FOR_andcv4si3, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
9620   { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
9621   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
9622   { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
9623   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
9624   { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
9625   { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
9626   { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
9627   { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
9628   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
9629   { MASK_ALTIVEC, CODE_FOR_vector_eqv16qi, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
9630   { MASK_ALTIVEC, CODE_FOR_vector_eqv8hi, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
9631   { MASK_ALTIVEC, CODE_FOR_vector_eqv4si, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
9632   { MASK_ALTIVEC, CODE_FOR_vector_eqv4sf, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
9633   { MASK_ALTIVEC, CODE_FOR_vector_gev4sf, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
9634   { MASK_ALTIVEC, CODE_FOR_vector_gtuv16qi, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
9635   { MASK_ALTIVEC, CODE_FOR_vector_gtv16qi, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
9636   { MASK_ALTIVEC, CODE_FOR_vector_gtuv8hi, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
9637   { MASK_ALTIVEC, CODE_FOR_vector_gtv8hi, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
9638   { MASK_ALTIVEC, CODE_FOR_vector_gtuv4si, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
9639   { MASK_ALTIVEC, CODE_FOR_vector_gtv4si, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
9640   { MASK_ALTIVEC, CODE_FOR_vector_gtv4sf, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
9641   { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
9642   { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
9643   { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
9644   { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
9645   { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
9646   { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
9647   { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
9648   { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
9649   { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
9650   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
9651   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
9652   { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
9653   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
9654   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
9655   { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
9656   { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
9657   { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
9658   { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
9659   { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
9660   { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
9661   { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
9662   { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
9663   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
9664   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub_uns", ALTIVEC_BUILTIN_VMULEUB_UNS },
9665   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
9666   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
9667   { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh_uns", ALTIVEC_BUILTIN_VMULEUH_UNS },
9668   { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
9669   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
9670   { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub_uns", ALTIVEC_BUILTIN_VMULOUB_UNS },
9671   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
9672   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
9673   { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh_uns", ALTIVEC_BUILTIN_VMULOUH_UNS },
9674   { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
9675   { MASK_ALTIVEC, CODE_FOR_norv4si3, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
9676   { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
9677   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
9678   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
9679   { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
9680   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
9681   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
9682   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
9683   { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
9684   { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
9685   { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
9686   { MASK_ALTIVEC, CODE_FOR_recipv4sf3, "__builtin_altivec_vrecipdivfp", ALTIVEC_BUILTIN_VRECIPFP },
9687   { MASK_ALTIVEC, CODE_FOR_vrotlv16qi3, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
9688   { MASK_ALTIVEC, CODE_FOR_vrotlv8hi3, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
9689   { MASK_ALTIVEC, CODE_FOR_vrotlv4si3, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
9690   { MASK_ALTIVEC, CODE_FOR_vashlv16qi3, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
9691   { MASK_ALTIVEC, CODE_FOR_vashlv8hi3, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
9692   { MASK_ALTIVEC, CODE_FOR_vashlv4si3, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
9693   { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
9694   { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
9695   { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
9696   { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
9697   { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
9698   { MASK_ALTIVEC, CODE_FOR_vlshrv16qi3, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
9699   { MASK_ALTIVEC, CODE_FOR_vlshrv8hi3, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
9700   { MASK_ALTIVEC, CODE_FOR_vlshrv4si3, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
9701   { MASK_ALTIVEC, CODE_FOR_vashrv16qi3, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
9702   { MASK_ALTIVEC, CODE_FOR_vashrv8hi3, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
9703   { MASK_ALTIVEC, CODE_FOR_vashrv4si3, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
9704   { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
9705   { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
9706   { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
9707   { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
9708   { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
9709   { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
9710   { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
9711   { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
9712   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
9713   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
9714   { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
9715   { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
9716   { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
9717   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
9718   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
9719   { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
9720   { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
9721   { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
9722   { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
9723   { MASK_ALTIVEC, CODE_FOR_vector_copysignv4sf3, "__builtin_altivec_copysignfp", ALTIVEC_BUILTIN_COPYSIGN_V4SF },
9724
9725   { MASK_VSX, CODE_FOR_addv2df3, "__builtin_vsx_xvadddp", VSX_BUILTIN_XVADDDP },
9726   { MASK_VSX, CODE_FOR_subv2df3, "__builtin_vsx_xvsubdp", VSX_BUILTIN_XVSUBDP },
9727   { MASK_VSX, CODE_FOR_mulv2df3, "__builtin_vsx_xvmuldp", VSX_BUILTIN_XVMULDP },
9728   { MASK_VSX, CODE_FOR_divv2df3, "__builtin_vsx_xvdivdp", VSX_BUILTIN_XVDIVDP },
9729   { MASK_VSX, CODE_FOR_recipv2df3, "__builtin_vsx_xvrecipdivdp", VSX_BUILTIN_RECIP_V2DF },
9730   { MASK_VSX, CODE_FOR_sminv2df3, "__builtin_vsx_xvmindp", VSX_BUILTIN_XVMINDP },
9731   { MASK_VSX, CODE_FOR_smaxv2df3, "__builtin_vsx_xvmaxdp", VSX_BUILTIN_XVMAXDP },
9732   { MASK_VSX, CODE_FOR_vsx_tdivv2df3_fe, "__builtin_vsx_xvtdivdp_fe", VSX_BUILTIN_XVTDIVDP_FE },
9733   { MASK_VSX, CODE_FOR_vsx_tdivv2df3_fg, "__builtin_vsx_xvtdivdp_fg", VSX_BUILTIN_XVTDIVDP_FG },
9734   { MASK_VSX, CODE_FOR_vector_eqv2df, "__builtin_vsx_xvcmpeqdp", VSX_BUILTIN_XVCMPEQDP },
9735   { MASK_VSX, CODE_FOR_vector_gtv2df, "__builtin_vsx_xvcmpgtdp", VSX_BUILTIN_XVCMPGTDP },
9736   { MASK_VSX, CODE_FOR_vector_gev2df, "__builtin_vsx_xvcmpgedp", VSX_BUILTIN_XVCMPGEDP },
9737
9738   { MASK_VSX, CODE_FOR_addv4sf3, "__builtin_vsx_xvaddsp", VSX_BUILTIN_XVADDSP },
9739   { MASK_VSX, CODE_FOR_subv4sf3, "__builtin_vsx_xvsubsp", VSX_BUILTIN_XVSUBSP },
9740   { MASK_VSX, CODE_FOR_mulv4sf3, "__builtin_vsx_xvmulsp", VSX_BUILTIN_XVMULSP },
9741   { MASK_VSX, CODE_FOR_divv4sf3, "__builtin_vsx_xvdivsp", VSX_BUILTIN_XVDIVSP },
9742   { MASK_VSX, CODE_FOR_recipv4sf3, "__builtin_vsx_xvrecipdivsp", VSX_BUILTIN_RECIP_V4SF },
9743   { MASK_VSX, CODE_FOR_sminv4sf3, "__builtin_vsx_xvminsp", VSX_BUILTIN_XVMINSP },
9744   { MASK_VSX, CODE_FOR_smaxv4sf3, "__builtin_vsx_xvmaxsp", VSX_BUILTIN_XVMAXSP },
9745   { MASK_VSX, CODE_FOR_vsx_tdivv4sf3_fe, "__builtin_vsx_xvtdivsp_fe", VSX_BUILTIN_XVTDIVSP_FE },
9746   { MASK_VSX, CODE_FOR_vsx_tdivv4sf3_fg, "__builtin_vsx_xvtdivsp_fg", VSX_BUILTIN_XVTDIVSP_FG },
9747   { MASK_VSX, CODE_FOR_vector_eqv4sf, "__builtin_vsx_xvcmpeqsp", VSX_BUILTIN_XVCMPEQSP },
9748   { MASK_VSX, CODE_FOR_vector_gtv4sf, "__builtin_vsx_xvcmpgtsp", VSX_BUILTIN_XVCMPGTSP },
9749   { MASK_VSX, CODE_FOR_vector_gev4sf, "__builtin_vsx_xvcmpgesp", VSX_BUILTIN_XVCMPGESP },
9750
9751   { MASK_VSX, CODE_FOR_smindf3, "__builtin_vsx_xsmindp", VSX_BUILTIN_XSMINDP },
9752   { MASK_VSX, CODE_FOR_smaxdf3, "__builtin_vsx_xsmaxdp", VSX_BUILTIN_XSMAXDP },
9753   { MASK_VSX, CODE_FOR_vsx_tdivdf3_fe, "__builtin_vsx_xstdivdp_fe", VSX_BUILTIN_XSTDIVDP_FE },
9754   { MASK_VSX, CODE_FOR_vsx_tdivdf3_fg, "__builtin_vsx_xstdivdp_fg", VSX_BUILTIN_XSTDIVDP_FG },
9755   { MASK_VSX, CODE_FOR_vector_copysignv2df3, "__builtin_vsx_cpsgndp", VSX_BUILTIN_CPSGNDP },
9756   { MASK_VSX, CODE_FOR_vector_copysignv4sf3, "__builtin_vsx_cpsgnsp", VSX_BUILTIN_CPSGNSP },
9757
9758   { MASK_VSX, CODE_FOR_vsx_concat_v2df, "__builtin_vsx_concat_2df", VSX_BUILTIN_CONCAT_2DF },
9759   { MASK_VSX, CODE_FOR_vsx_concat_v2di, "__builtin_vsx_concat_2di", VSX_BUILTIN_CONCAT_2DI },
9760   { MASK_VSX, CODE_FOR_vsx_splat_v2df, "__builtin_vsx_splat_2df", VSX_BUILTIN_SPLAT_2DF },
9761   { MASK_VSX, CODE_FOR_vsx_splat_v2di, "__builtin_vsx_splat_2di", VSX_BUILTIN_SPLAT_2DI },
9762   { MASK_VSX, CODE_FOR_vsx_xxmrghw_v4sf, "__builtin_vsx_xxmrghw", VSX_BUILTIN_XXMRGHW_4SF },
9763   { MASK_VSX, CODE_FOR_vsx_xxmrghw_v4si, "__builtin_vsx_xxmrghw_4si", VSX_BUILTIN_XXMRGHW_4SI },
9764   { MASK_VSX, CODE_FOR_vsx_xxmrglw_v4sf, "__builtin_vsx_xxmrglw", VSX_BUILTIN_XXMRGLW_4SF },
9765   { MASK_VSX, CODE_FOR_vsx_xxmrglw_v4si, "__builtin_vsx_xxmrglw_4si", VSX_BUILTIN_XXMRGLW_4SI },
9766   { MASK_VSX, CODE_FOR_vec_interleave_lowv2df, "__builtin_vsx_mergel_2df", VSX_BUILTIN_VEC_MERGEL_V2DF },
9767   { MASK_VSX, CODE_FOR_vec_interleave_lowv2di, "__builtin_vsx_mergel_2di", VSX_BUILTIN_VEC_MERGEL_V2DI },
9768   { MASK_VSX, CODE_FOR_vec_interleave_highv2df, "__builtin_vsx_mergeh_2df", VSX_BUILTIN_VEC_MERGEH_V2DF },
9769   { MASK_VSX, CODE_FOR_vec_interleave_highv2di, "__builtin_vsx_mergeh_2di", VSX_BUILTIN_VEC_MERGEH_V2DI },
9770
9771   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_add", ALTIVEC_BUILTIN_VEC_ADD },
9772   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vaddfp", ALTIVEC_BUILTIN_VEC_VADDFP },
9773   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduwm", ALTIVEC_BUILTIN_VEC_VADDUWM },
9774   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhm", ALTIVEC_BUILTIN_VEC_VADDUHM },
9775   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubm", ALTIVEC_BUILTIN_VEC_VADDUBM },
9776   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_addc", ALTIVEC_BUILTIN_VEC_ADDC },
9777   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_adds", ALTIVEC_BUILTIN_VEC_ADDS },
9778   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsws", ALTIVEC_BUILTIN_VEC_VADDSWS },
9779   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduws", ALTIVEC_BUILTIN_VEC_VADDUWS },
9780   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddshs", ALTIVEC_BUILTIN_VEC_VADDSHS },
9781   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhs", ALTIVEC_BUILTIN_VEC_VADDUHS },
9782   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsbs", ALTIVEC_BUILTIN_VEC_VADDSBS },
9783   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubs", ALTIVEC_BUILTIN_VEC_VADDUBS },
9784   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_and", ALTIVEC_BUILTIN_VEC_AND },
9785   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_andc", ALTIVEC_BUILTIN_VEC_ANDC },
9786   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_avg", ALTIVEC_BUILTIN_VEC_AVG },
9787   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsw", ALTIVEC_BUILTIN_VEC_VAVGSW },
9788   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguw", ALTIVEC_BUILTIN_VEC_VAVGUW },
9789   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsh", ALTIVEC_BUILTIN_VEC_VAVGSH },
9790   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguh", ALTIVEC_BUILTIN_VEC_VAVGUH },
9791   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsb", ALTIVEC_BUILTIN_VEC_VAVGSB },
9792   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgub", ALTIVEC_BUILTIN_VEC_VAVGUB },
9793   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpb", ALTIVEC_BUILTIN_VEC_CMPB },
9794   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpeq", ALTIVEC_BUILTIN_VEC_CMPEQ },
9795   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpeqfp", ALTIVEC_BUILTIN_VEC_VCMPEQFP },
9796   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequw", ALTIVEC_BUILTIN_VEC_VCMPEQUW },
9797   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequh", ALTIVEC_BUILTIN_VEC_VCMPEQUH },
9798   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequb", ALTIVEC_BUILTIN_VEC_VCMPEQUB },
9799   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpge", ALTIVEC_BUILTIN_VEC_CMPGE },
9800   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpgt", ALTIVEC_BUILTIN_VEC_CMPGT },
9801   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtfp", ALTIVEC_BUILTIN_VEC_VCMPGTFP },
9802   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsw", ALTIVEC_BUILTIN_VEC_VCMPGTSW },
9803   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuw", ALTIVEC_BUILTIN_VEC_VCMPGTUW },
9804   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsh", ALTIVEC_BUILTIN_VEC_VCMPGTSH },
9805   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuh", ALTIVEC_BUILTIN_VEC_VCMPGTUH },
9806   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsb", ALTIVEC_BUILTIN_VEC_VCMPGTSB },
9807   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtub", ALTIVEC_BUILTIN_VEC_VCMPGTUB },
9808   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmple", ALTIVEC_BUILTIN_VEC_CMPLE },
9809   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmplt", ALTIVEC_BUILTIN_VEC_CMPLT },
9810   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_copysign", ALTIVEC_BUILTIN_VEC_COPYSIGN },
9811   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_max", ALTIVEC_BUILTIN_VEC_MAX },
9812   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vmaxfp", ALTIVEC_BUILTIN_VEC_VMAXFP },
9813   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsw", ALTIVEC_BUILTIN_VEC_VMAXSW },
9814   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuw", ALTIVEC_BUILTIN_VEC_VMAXUW },
9815   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsh", ALTIVEC_BUILTIN_VEC_VMAXSH },
9816   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuh", ALTIVEC_BUILTIN_VEC_VMAXUH },
9817   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsb", ALTIVEC_BUILTIN_VEC_VMAXSB },
9818   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxub", ALTIVEC_BUILTIN_VEC_VMAXUB },
9819   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergeh", ALTIVEC_BUILTIN_VEC_MERGEH },
9820   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghw", ALTIVEC_BUILTIN_VEC_VMRGHW },
9821   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghh", ALTIVEC_BUILTIN_VEC_VMRGHH },
9822   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghb", ALTIVEC_BUILTIN_VEC_VMRGHB },
9823   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergel", ALTIVEC_BUILTIN_VEC_MERGEL },
9824   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglw", ALTIVEC_BUILTIN_VEC_VMRGLW },
9825   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglh", ALTIVEC_BUILTIN_VEC_VMRGLH },
9826   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglb", ALTIVEC_BUILTIN_VEC_VMRGLB },
9827   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_min", ALTIVEC_BUILTIN_VEC_MIN },
9828   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vminfp", ALTIVEC_BUILTIN_VEC_VMINFP },
9829   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsw", ALTIVEC_BUILTIN_VEC_VMINSW },
9830   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuw", ALTIVEC_BUILTIN_VEC_VMINUW },
9831   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsh", ALTIVEC_BUILTIN_VEC_VMINSH },
9832   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuh", ALTIVEC_BUILTIN_VEC_VMINUH },
9833   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsb", ALTIVEC_BUILTIN_VEC_VMINSB },
9834   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminub", ALTIVEC_BUILTIN_VEC_VMINUB },
9835   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mule", ALTIVEC_BUILTIN_VEC_MULE },
9836   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleub", ALTIVEC_BUILTIN_VEC_VMULEUB },
9837   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesb", ALTIVEC_BUILTIN_VEC_VMULESB },
9838   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleuh", ALTIVEC_BUILTIN_VEC_VMULEUH },
9839   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesh", ALTIVEC_BUILTIN_VEC_VMULESH },
9840   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mulo", ALTIVEC_BUILTIN_VEC_MULO },
9841   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosh", ALTIVEC_BUILTIN_VEC_VMULOSH },
9842   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulouh", ALTIVEC_BUILTIN_VEC_VMULOUH },
9843   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosb", ALTIVEC_BUILTIN_VEC_VMULOSB },
9844   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuloub", ALTIVEC_BUILTIN_VEC_VMULOUB },
9845   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_nor", ALTIVEC_BUILTIN_VEC_NOR },
9846   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_or", ALTIVEC_BUILTIN_VEC_OR },
9847   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_pack", ALTIVEC_BUILTIN_VEC_PACK },
9848   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwum", ALTIVEC_BUILTIN_VEC_VPKUWUM },
9849   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhum", ALTIVEC_BUILTIN_VEC_VPKUHUM },
9850   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packpx", ALTIVEC_BUILTIN_VEC_PACKPX },
9851   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packs", ALTIVEC_BUILTIN_VEC_PACKS },
9852   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswss", ALTIVEC_BUILTIN_VEC_VPKSWSS },
9853   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwus", ALTIVEC_BUILTIN_VEC_VPKUWUS },
9854   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshss", ALTIVEC_BUILTIN_VEC_VPKSHSS },
9855   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhus", ALTIVEC_BUILTIN_VEC_VPKUHUS },
9856   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packsu", ALTIVEC_BUILTIN_VEC_PACKSU },
9857   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswus", ALTIVEC_BUILTIN_VEC_VPKSWUS },
9858   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshus", ALTIVEC_BUILTIN_VEC_VPKSHUS },
9859   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_recipdiv", ALTIVEC_BUILTIN_VEC_RECIP },
9860   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rl", ALTIVEC_BUILTIN_VEC_RL },
9861   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlw", ALTIVEC_BUILTIN_VEC_VRLW },
9862   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlh", ALTIVEC_BUILTIN_VEC_VRLH },
9863   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlb", ALTIVEC_BUILTIN_VEC_VRLB },
9864   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sl", ALTIVEC_BUILTIN_VEC_SL },
9865   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslw", ALTIVEC_BUILTIN_VEC_VSLW },
9866   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslh", ALTIVEC_BUILTIN_VEC_VSLH },
9867   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslb", ALTIVEC_BUILTIN_VEC_VSLB },
9868   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sll", ALTIVEC_BUILTIN_VEC_SLL },
9869   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_slo", ALTIVEC_BUILTIN_VEC_SLO },
9870   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sr", ALTIVEC_BUILTIN_VEC_SR },
9871   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrw", ALTIVEC_BUILTIN_VEC_VSRW },
9872   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrh", ALTIVEC_BUILTIN_VEC_VSRH },
9873   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrb", ALTIVEC_BUILTIN_VEC_VSRB },
9874   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sra", ALTIVEC_BUILTIN_VEC_SRA },
9875   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsraw", ALTIVEC_BUILTIN_VEC_VSRAW },
9876   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrah", ALTIVEC_BUILTIN_VEC_VSRAH },
9877   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrab", ALTIVEC_BUILTIN_VEC_VSRAB },
9878   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_srl", ALTIVEC_BUILTIN_VEC_SRL },
9879   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sro", ALTIVEC_BUILTIN_VEC_SRO },
9880   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_sub", ALTIVEC_BUILTIN_VEC_SUB },
9881   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vsubfp", ALTIVEC_BUILTIN_VEC_VSUBFP },
9882   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuwm", ALTIVEC_BUILTIN_VEC_VSUBUWM },
9883   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhm", ALTIVEC_BUILTIN_VEC_VSUBUHM },
9884   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububm", ALTIVEC_BUILTIN_VEC_VSUBUBM },
9885   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subc", ALTIVEC_BUILTIN_VEC_SUBC },
9886   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subs", ALTIVEC_BUILTIN_VEC_SUBS },
9887   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsws", ALTIVEC_BUILTIN_VEC_VSUBSWS },
9888   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuws", ALTIVEC_BUILTIN_VEC_VSUBUWS },
9889   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubshs", ALTIVEC_BUILTIN_VEC_VSUBSHS },
9890   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhs", ALTIVEC_BUILTIN_VEC_VSUBUHS },
9891   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsbs", ALTIVEC_BUILTIN_VEC_VSUBSBS },
9892   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububs", ALTIVEC_BUILTIN_VEC_VSUBUBS },
9893   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum4s", ALTIVEC_BUILTIN_VEC_SUM4S },
9894   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4shs", ALTIVEC_BUILTIN_VEC_VSUM4SHS },
9895   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4sbs", ALTIVEC_BUILTIN_VEC_VSUM4SBS },
9896   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4ubs", ALTIVEC_BUILTIN_VEC_VSUM4UBS },
9897   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum2s", ALTIVEC_BUILTIN_VEC_SUM2S },
9898   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sums", ALTIVEC_BUILTIN_VEC_SUMS },
9899   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_xor", ALTIVEC_BUILTIN_VEC_XOR },
9900
9901   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_mul", VSX_BUILTIN_VEC_MUL },
9902   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_div", VSX_BUILTIN_VEC_DIV },
9903
9904   { 0, CODE_FOR_paired_divv2sf3, "__builtin_paired_divv2sf3", PAIRED_BUILTIN_DIVV2SF3 },
9905   { 0, CODE_FOR_paired_addv2sf3, "__builtin_paired_addv2sf3", PAIRED_BUILTIN_ADDV2SF3 },
9906   { 0, CODE_FOR_paired_subv2sf3, "__builtin_paired_subv2sf3", PAIRED_BUILTIN_SUBV2SF3 },
9907   { 0, CODE_FOR_paired_mulv2sf3, "__builtin_paired_mulv2sf3", PAIRED_BUILTIN_MULV2SF3 },
9908   { 0, CODE_FOR_paired_muls0, "__builtin_paired_muls0", PAIRED_BUILTIN_MULS0 },
9909   { 0, CODE_FOR_paired_muls1, "__builtin_paired_muls1", PAIRED_BUILTIN_MULS1 },
9910   { 0, CODE_FOR_paired_merge00, "__builtin_paired_merge00", PAIRED_BUILTIN_MERGE00 },
9911   { 0, CODE_FOR_paired_merge01, "__builtin_paired_merge01", PAIRED_BUILTIN_MERGE01 },
9912   { 0, CODE_FOR_paired_merge10, "__builtin_paired_merge10", PAIRED_BUILTIN_MERGE10 },
9913   { 0, CODE_FOR_paired_merge11, "__builtin_paired_merge11", PAIRED_BUILTIN_MERGE11 },
9914
9915   /* Place holder, leave as first spe builtin.  */
9916   { 0, CODE_FOR_addv2si3, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
9917   { 0, CODE_FOR_andv2si3, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
9918   { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
9919   { 0, CODE_FOR_divv2si3, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
9920   { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
9921   { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
9922   { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
9923   { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
9924   { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
9925   { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
9926   { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
9927   { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
9928   { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
9929   { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
9930   { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
9931   { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
9932   { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
9933   { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
9934   { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
9935   { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
9936   { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
9937   { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
9938   { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
9939   { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
9940   { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
9941   { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
9942   { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
9943   { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
9944   { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
9945   { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
9946   { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
9947   { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
9948   { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
9949   { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
9950   { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
9951   { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
9952   { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
9953   { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
9954   { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
9955   { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
9956   { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
9957   { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
9958   { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
9959   { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
9960   { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
9961   { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
9962   { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
9963   { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
9964   { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
9965   { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
9966   { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
9967   { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
9968   { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
9969   { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
9970   { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
9971   { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
9972   { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
9973   { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
9974   { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
9975   { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
9976   { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
9977   { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
9978   { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
9979   { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
9980   { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
9981   { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
9982   { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
9983   { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
9984   { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
9985   { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
9986   { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
9987   { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
9988   { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
9989   { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
9990   { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
9991   { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
9992   { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
9993   { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
9994   { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
9995   { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
9996   { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
9997   { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
9998   { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
9999   { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
10000   { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
10001   { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
10002   { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
10003   { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
10004   { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
10005   { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
10006   { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
10007   { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
10008   { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
10009   { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
10010   { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
10011   { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
10012   { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
10013   { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
10014   { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
10015   { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
10016   { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
10017   { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
10018   { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
10019   { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
10020   { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
10021   { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
10022   { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
10023   { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
10024   { 0, CODE_FOR_subv2si3, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
10025
10026   /* SPE binary operations expecting a 5-bit unsigned literal.  */
10027   { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
10028
10029   { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
10030   { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
10031   { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
10032   { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
10033   { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
10034   { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
10035   { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
10036   { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
10037   { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
10038   { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
10039   { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
10040   { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
10041   { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
10042   { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
10043   { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
10044   { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
10045   { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
10046   { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
10047   { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
10048   { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
10049   { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
10050   { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
10051   { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
10052   { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
10053   { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
10054   { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
10055
10056   /* Place-holder.  Leave as last binary SPE builtin.  */
10057   { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR }
10058 };
10059
10060 /* AltiVec predicates.  */
10061
10062 struct builtin_description_predicates
10063 {
10064   const unsigned int mask;
10065   const enum insn_code icode;
10066   const char *const name;
10067   const enum rs6000_builtins code;
10068 };
10069
10070 static const struct builtin_description_predicates bdesc_altivec_preds[] =
10071 {
10072   { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp_p, "__builtin_altivec_vcmpbfp_p",
10073     ALTIVEC_BUILTIN_VCMPBFP_P },
10074   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_eq_v4sf_p,
10075     "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
10076   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_ge_v4sf_p,
10077     "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
10078   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_gt_v4sf_p,
10079     "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
10080   { MASK_ALTIVEC, CODE_FOR_vector_eq_v4si_p, "__builtin_altivec_vcmpequw_p",
10081     ALTIVEC_BUILTIN_VCMPEQUW_P },
10082   { MASK_ALTIVEC, CODE_FOR_vector_gt_v4si_p, "__builtin_altivec_vcmpgtsw_p",
10083     ALTIVEC_BUILTIN_VCMPGTSW_P },
10084   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v4si_p, "__builtin_altivec_vcmpgtuw_p",
10085     ALTIVEC_BUILTIN_VCMPGTUW_P },
10086   { MASK_ALTIVEC, CODE_FOR_vector_eq_v8hi_p, "__builtin_altivec_vcmpequh_p",
10087     ALTIVEC_BUILTIN_VCMPEQUH_P },
10088   { MASK_ALTIVEC, CODE_FOR_vector_gt_v8hi_p, "__builtin_altivec_vcmpgtsh_p",
10089     ALTIVEC_BUILTIN_VCMPGTSH_P },
10090   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v8hi_p, "__builtin_altivec_vcmpgtuh_p",
10091     ALTIVEC_BUILTIN_VCMPGTUH_P },
10092   { MASK_ALTIVEC, CODE_FOR_vector_eq_v16qi_p, "__builtin_altivec_vcmpequb_p",
10093     ALTIVEC_BUILTIN_VCMPEQUB_P },
10094   { MASK_ALTIVEC, CODE_FOR_vector_gt_v16qi_p, "__builtin_altivec_vcmpgtsb_p",
10095     ALTIVEC_BUILTIN_VCMPGTSB_P },
10096   { MASK_ALTIVEC, CODE_FOR_vector_gtu_v16qi_p, "__builtin_altivec_vcmpgtub_p",
10097     ALTIVEC_BUILTIN_VCMPGTUB_P },
10098
10099   { MASK_VSX, CODE_FOR_vector_eq_v4sf_p, "__builtin_vsx_xvcmpeqsp_p",
10100     VSX_BUILTIN_XVCMPEQSP_P },
10101   { MASK_VSX, CODE_FOR_vector_ge_v4sf_p, "__builtin_vsx_xvcmpgesp_p",
10102     VSX_BUILTIN_XVCMPGESP_P },
10103   { MASK_VSX, CODE_FOR_vector_gt_v4sf_p, "__builtin_vsx_xvcmpgtsp_p",
10104     VSX_BUILTIN_XVCMPGTSP_P },
10105   { MASK_VSX, CODE_FOR_vector_eq_v2df_p, "__builtin_vsx_xvcmpeqdp_p",
10106     VSX_BUILTIN_XVCMPEQDP_P },
10107   { MASK_VSX, CODE_FOR_vector_ge_v2df_p, "__builtin_vsx_xvcmpgedp_p",
10108     VSX_BUILTIN_XVCMPGEDP_P },
10109   { MASK_VSX, CODE_FOR_vector_gt_v2df_p, "__builtin_vsx_xvcmpgtdp_p",
10110     VSX_BUILTIN_XVCMPGTDP_P },
10111
10112   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpeq_p",
10113     ALTIVEC_BUILTIN_VCMPEQ_P },
10114   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpgt_p",
10115     ALTIVEC_BUILTIN_VCMPGT_P },
10116   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpge_p",
10117     ALTIVEC_BUILTIN_VCMPGE_P }
10118 };
10119
10120 /* SPE predicates.  */
10121 static struct builtin_description bdesc_spe_predicates[] =
10122 {
10123   /* Place-holder.  Leave as first.  */
10124   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
10125   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
10126   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
10127   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
10128   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
10129   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
10130   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
10131   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
10132   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
10133   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
10134   /* Place-holder.  Leave as last.  */
10135   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
10136 };
10137
10138 /* SPE evsel predicates.  */
10139 static struct builtin_description bdesc_spe_evsel[] =
10140 {
10141   /* Place-holder.  Leave as first.  */
10142   { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
10143   { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
10144   { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
10145   { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
10146   { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
10147   { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
10148   { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
10149   { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
10150   { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
10151   { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
10152   /* Place-holder.  Leave as last.  */
10153   { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
10154 };
10155
10156 /* PAIRED predicates.  */
10157 static const struct builtin_description bdesc_paired_preds[] =
10158 {
10159   /* Place-holder.  Leave as first.  */
10160   { 0, CODE_FOR_paired_cmpu0, "__builtin_paired_cmpu0", PAIRED_BUILTIN_CMPU0 },
10161   /* Place-holder.  Leave as last.  */
10162   { 0, CODE_FOR_paired_cmpu1, "__builtin_paired_cmpu1", PAIRED_BUILTIN_CMPU1 },
10163 };
10164
10165 /* ABS* operations.  */
10166
10167 static const struct builtin_description bdesc_abs[] =
10168 {
10169   { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
10170   { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
10171   { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
10172   { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
10173   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
10174   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
10175   { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI },
10176   { MASK_VSX, CODE_FOR_absv2df2, "__builtin_vsx_xvabsdp", VSX_BUILTIN_XVABSDP },
10177   { MASK_VSX, CODE_FOR_vsx_nabsv2df2, "__builtin_vsx_xvnabsdp", VSX_BUILTIN_XVNABSDP },
10178   { MASK_VSX, CODE_FOR_absv4sf2, "__builtin_vsx_xvabssp", VSX_BUILTIN_XVABSSP },
10179   { MASK_VSX, CODE_FOR_vsx_nabsv4sf2, "__builtin_vsx_xvnabssp", VSX_BUILTIN_XVNABSSP },
10180 };
10181
10182 /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
10183    foo (VECa).  */
10184
10185 static struct builtin_description bdesc_1arg[] =
10186 {
10187   { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
10188   { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
10189   { MASK_ALTIVEC, CODE_FOR_rev4sf2, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
10190   { MASK_ALTIVEC, CODE_FOR_vector_floorv4sf2, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
10191   { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
10192   { MASK_ALTIVEC, CODE_FOR_vector_ceilv4sf2, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
10193   { MASK_ALTIVEC, CODE_FOR_vector_btruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
10194   { MASK_ALTIVEC, CODE_FOR_rsqrtv4sf2, "__builtin_altivec_vrsqrtfp", ALTIVEC_BUILTIN_VRSQRTFP },
10195   { MASK_ALTIVEC, CODE_FOR_rsqrtev4sf2, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
10196   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
10197   { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
10198   { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
10199   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
10200   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
10201   { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
10202   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
10203   { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
10204   { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
10205
10206   { MASK_VSX, CODE_FOR_negv2df2, "__builtin_vsx_xvnegdp", VSX_BUILTIN_XVNEGDP },
10207   { MASK_VSX, CODE_FOR_sqrtv2df2, "__builtin_vsx_xvsqrtdp", VSX_BUILTIN_XVSQRTDP },
10208   { MASK_VSX, CODE_FOR_rsqrtv2df2, "__builtin_vsx_xvrsqrtdp", VSX_BUILTIN_VEC_RSQRT_V2DF },
10209   { MASK_VSX, CODE_FOR_rsqrtev2df2, "__builtin_vsx_xvrsqrtedp", VSX_BUILTIN_XVRSQRTEDP },
10210   { MASK_VSX, CODE_FOR_vsx_tsqrtv2df2_fe, "__builtin_vsx_xvtsqrtdp_fe", VSX_BUILTIN_XVTSQRTDP_FE },
10211   { MASK_VSX, CODE_FOR_vsx_tsqrtv2df2_fg, "__builtin_vsx_xvtsqrtdp_fg", VSX_BUILTIN_XVTSQRTDP_FG },
10212   { MASK_VSX, CODE_FOR_vsx_frev2df2, "__builtin_vsx_xvredp", VSX_BUILTIN_XVREDP },
10213
10214   { MASK_VSX, CODE_FOR_negv4sf2, "__builtin_vsx_xvnegsp", VSX_BUILTIN_XVNEGSP },
10215   { MASK_VSX, CODE_FOR_sqrtv4sf2, "__builtin_vsx_xvsqrtsp", VSX_BUILTIN_XVSQRTSP },
10216   { MASK_VSX, CODE_FOR_rsqrtv4sf2, "__builtin_vsx_xvrsqrtsp", VSX_BUILTIN_VEC_RSQRT_V4SF },
10217   { MASK_VSX, CODE_FOR_rsqrtev4sf2, "__builtin_vsx_xvrsqrtesp", VSX_BUILTIN_XVRSQRTESP },
10218   { MASK_VSX, CODE_FOR_vsx_tsqrtv4sf2_fe, "__builtin_vsx_xvtsqrtsp_fe", VSX_BUILTIN_XVTSQRTSP_FE },
10219   { MASK_VSX, CODE_FOR_vsx_tsqrtv4sf2_fg, "__builtin_vsx_xvtsqrtsp_fg", VSX_BUILTIN_XVTSQRTSP_FG },
10220   { MASK_VSX, CODE_FOR_vsx_frev4sf2, "__builtin_vsx_xvresp", VSX_BUILTIN_XVRESP },
10221
10222   { MASK_VSX, CODE_FOR_vsx_xscvdpsp, "__builtin_vsx_xscvdpsp", VSX_BUILTIN_XSCVDPSP },
10223   { MASK_VSX, CODE_FOR_vsx_xscvdpsp, "__builtin_vsx_xscvspdp", VSX_BUILTIN_XSCVSPDP },
10224   { MASK_VSX, CODE_FOR_vsx_xvcvdpsp, "__builtin_vsx_xvcvdpsp", VSX_BUILTIN_XVCVDPSP },
10225   { MASK_VSX, CODE_FOR_vsx_xvcvspdp, "__builtin_vsx_xvcvspdp", VSX_BUILTIN_XVCVSPDP },
10226   { MASK_VSX, CODE_FOR_vsx_tsqrtdf2_fe, "__builtin_vsx_xstsqrtdp_fe", VSX_BUILTIN_XSTSQRTDP_FE },
10227   { MASK_VSX, CODE_FOR_vsx_tsqrtdf2_fg, "__builtin_vsx_xstsqrtdp_fg", VSX_BUILTIN_XSTSQRTDP_FG },
10228
10229   { MASK_VSX, CODE_FOR_vsx_fix_truncv2dfv2di2, "__builtin_vsx_xvcvdpsxds", VSX_BUILTIN_XVCVDPSXDS },
10230   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv2dfv2di2, "__builtin_vsx_xvcvdpuxds", VSX_BUILTIN_XVCVDPUXDS },
10231   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv2dfv2di2, "__builtin_vsx_xvcvdpuxds_uns", VSX_BUILTIN_XVCVDPUXDS_UNS },
10232   { MASK_VSX, CODE_FOR_vsx_floatv2div2df2, "__builtin_vsx_xvcvsxddp", VSX_BUILTIN_XVCVSXDDP },
10233   { MASK_VSX, CODE_FOR_vsx_floatunsv2div2df2, "__builtin_vsx_xvcvuxddp", VSX_BUILTIN_XVCVUXDDP },
10234   { MASK_VSX, CODE_FOR_vsx_floatunsv2div2df2, "__builtin_vsx_xvcvuxddp_uns", VSX_BUILTIN_XVCVUXDDP_UNS },
10235
10236   { MASK_VSX, CODE_FOR_vsx_fix_truncv4sfv4si2, "__builtin_vsx_xvcvspsxws", VSX_BUILTIN_XVCVSPSXWS },
10237   { MASK_VSX, CODE_FOR_vsx_fixuns_truncv4sfv4si2, "__builtin_vsx_xvcvspuxws", VSX_BUILTIN_XVCVSPUXWS },
10238   { MASK_VSX, CODE_FOR_vsx_floatv4siv4sf2, "__builtin_vsx_xvcvsxwsp", VSX_BUILTIN_XVCVSXWSP },
10239   { MASK_VSX, CODE_FOR_vsx_floatunsv4siv4sf2, "__builtin_vsx_xvcvuxwsp", VSX_BUILTIN_XVCVUXWSP },
10240
10241   { MASK_VSX, CODE_FOR_vsx_xvcvdpsxws, "__builtin_vsx_xvcvdpsxws", VSX_BUILTIN_XVCVDPSXWS },
10242   { MASK_VSX, CODE_FOR_vsx_xvcvdpuxws, "__builtin_vsx_xvcvdpuxws", VSX_BUILTIN_XVCVDPUXWS },
10243   { MASK_VSX, CODE_FOR_vsx_xvcvsxwdp, "__builtin_vsx_xvcvsxwdp", VSX_BUILTIN_XVCVSXWDP },
10244   { MASK_VSX, CODE_FOR_vsx_xvcvuxwdp, "__builtin_vsx_xvcvuxwdp", VSX_BUILTIN_XVCVUXWDP },
10245   { MASK_VSX, CODE_FOR_vsx_xvrdpi, "__builtin_vsx_xvrdpi", VSX_BUILTIN_XVRDPI },
10246   { MASK_VSX, CODE_FOR_vsx_xvrdpic, "__builtin_vsx_xvrdpic", VSX_BUILTIN_XVRDPIC },
10247   { MASK_VSX, CODE_FOR_vsx_floorv2df2, "__builtin_vsx_xvrdpim", VSX_BUILTIN_XVRDPIM },
10248   { MASK_VSX, CODE_FOR_vsx_ceilv2df2, "__builtin_vsx_xvrdpip", VSX_BUILTIN_XVRDPIP },
10249   { MASK_VSX, CODE_FOR_vsx_btruncv2df2, "__builtin_vsx_xvrdpiz", VSX_BUILTIN_XVRDPIZ },
10250
10251   { MASK_VSX, CODE_FOR_vsx_xvcvspsxds, "__builtin_vsx_xvcvspsxds", VSX_BUILTIN_XVCVSPSXDS },
10252   { MASK_VSX, CODE_FOR_vsx_xvcvspuxds, "__builtin_vsx_xvcvspuxds", VSX_BUILTIN_XVCVSPUXDS },
10253   { MASK_VSX, CODE_FOR_vsx_xvcvsxdsp, "__builtin_vsx_xvcvsxdsp", VSX_BUILTIN_XVCVSXDSP },
10254   { MASK_VSX, CODE_FOR_vsx_xvcvuxdsp, "__builtin_vsx_xvcvuxdsp", VSX_BUILTIN_XVCVUXDSP },
10255   { MASK_VSX, CODE_FOR_vsx_xvrspi, "__builtin_vsx_xvrspi", VSX_BUILTIN_XVRSPI },
10256   { MASK_VSX, CODE_FOR_vsx_xvrspic, "__builtin_vsx_xvrspic", VSX_BUILTIN_XVRSPIC },
10257   { MASK_VSX, CODE_FOR_vsx_floorv4sf2, "__builtin_vsx_xvrspim", VSX_BUILTIN_XVRSPIM },
10258   { MASK_VSX, CODE_FOR_vsx_ceilv4sf2, "__builtin_vsx_xvrspip", VSX_BUILTIN_XVRSPIP },
10259   { MASK_VSX, CODE_FOR_vsx_btruncv4sf2, "__builtin_vsx_xvrspiz", VSX_BUILTIN_XVRSPIZ },
10260
10261   { MASK_VSX, CODE_FOR_vsx_xsrdpi, "__builtin_vsx_xsrdpi", VSX_BUILTIN_XSRDPI },
10262   { MASK_VSX, CODE_FOR_vsx_xsrdpic, "__builtin_vsx_xsrdpic", VSX_BUILTIN_XSRDPIC },
10263   { MASK_VSX, CODE_FOR_vsx_floordf2, "__builtin_vsx_xsrdpim", VSX_BUILTIN_XSRDPIM },
10264   { MASK_VSX, CODE_FOR_vsx_ceildf2, "__builtin_vsx_xsrdpip", VSX_BUILTIN_XSRDPIP },
10265   { MASK_VSX, CODE_FOR_vsx_btruncdf2, "__builtin_vsx_xsrdpiz", VSX_BUILTIN_XSRDPIZ },
10266
10267   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abs", ALTIVEC_BUILTIN_VEC_ABS },
10268   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abss", ALTIVEC_BUILTIN_VEC_ABSS },
10269   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_ceil", ALTIVEC_BUILTIN_VEC_CEIL },
10270   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_expte", ALTIVEC_BUILTIN_VEC_EXPTE },
10271   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_floor", ALTIVEC_BUILTIN_VEC_FLOOR },
10272   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_loge", ALTIVEC_BUILTIN_VEC_LOGE },
10273   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mtvscr", ALTIVEC_BUILTIN_VEC_MTVSCR },
10274   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_re", ALTIVEC_BUILTIN_VEC_RE },
10275   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_round", ALTIVEC_BUILTIN_VEC_ROUND },
10276   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrt", ALTIVEC_BUILTIN_VEC_RSQRT },
10277   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrte", ALTIVEC_BUILTIN_VEC_RSQRTE },
10278   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_trunc", ALTIVEC_BUILTIN_VEC_TRUNC },
10279   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackh", ALTIVEC_BUILTIN_VEC_UNPACKH },
10280   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsh", ALTIVEC_BUILTIN_VEC_VUPKHSH },
10281   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhpx", ALTIVEC_BUILTIN_VEC_VUPKHPX },
10282   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsb", ALTIVEC_BUILTIN_VEC_VUPKHSB },
10283   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackl", ALTIVEC_BUILTIN_VEC_UNPACKL },
10284   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklpx", ALTIVEC_BUILTIN_VEC_VUPKLPX },
10285   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsh", ALTIVEC_BUILTIN_VEC_VUPKLSH },
10286   { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsb", ALTIVEC_BUILTIN_VEC_VUPKLSB },
10287
10288   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_nearbyint", ALTIVEC_BUILTIN_VEC_NEARBYINT },
10289   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_rint", ALTIVEC_BUILTIN_VEC_RINT },
10290   { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_sqrt", ALTIVEC_BUILTIN_VEC_SQRT },
10291
10292   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_floatv4siv4sf2, "__builtin_vec_float_sisf", VECTOR_BUILTIN_FLOAT_V4SI_V4SF },
10293   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_unsigned_floatv4siv4sf2, "__builtin_vec_uns_float_sisf", VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF },
10294   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_fix_truncv4sfv4si2, "__builtin_vec_fix_sfsi", VECTOR_BUILTIN_FIX_V4SF_V4SI },
10295   { MASK_ALTIVEC|MASK_VSX, CODE_FOR_fixuns_truncv4sfv4si2, "__builtin_vec_fixuns_sfsi", VECTOR_BUILTIN_FIXUNS_V4SF_V4SI },
10296
10297   /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
10298      end with SPE_BUILTIN_EVSUBFUSIAAW.  */
10299   { 0, CODE_FOR_absv2si2, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
10300   { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
10301   { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
10302   { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
10303   { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
10304   { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
10305   { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
10306   { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
10307   { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
10308   { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
10309   { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
10310   { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
10311   { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
10312   { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
10313   { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
10314   { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
10315   { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
10316   { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
10317   { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
10318   { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
10319   { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
10320   { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
10321   { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
10322   { 0, CODE_FOR_negv2si2, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
10323   { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
10324   { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
10325   { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
10326   { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
10327
10328   /* Place-holder.  Leave as last unary SPE builtin.  */
10329   { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
10330
10331   { 0, CODE_FOR_paired_absv2sf2, "__builtin_paired_absv2sf2", PAIRED_BUILTIN_ABSV2SF2 },
10332   { 0, CODE_FOR_nabsv2sf2, "__builtin_paired_nabsv2sf2", PAIRED_BUILTIN_NABSV2SF2 },
10333   { 0, CODE_FOR_paired_negv2sf2, "__builtin_paired_negv2sf2", PAIRED_BUILTIN_NEGV2SF2 },
10334   { 0, CODE_FOR_sqrtv2sf2, "__builtin_paired_sqrtv2sf2", PAIRED_BUILTIN_SQRTV2SF2 },
10335   { 0, CODE_FOR_resv2sf2, "__builtin_paired_resv2sf2", PAIRED_BUILTIN_RESV2SF2 }
10336 };
10337
10338 static rtx
10339 rs6000_expand_unop_builtin (enum insn_code icode, tree exp, rtx target)
10340 {
10341   rtx pat;
10342   tree arg0 = CALL_EXPR_ARG (exp, 0);
10343   rtx op0 = expand_normal (arg0);
10344   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10345   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10346
10347   if (icode == CODE_FOR_nothing)
10348     /* Builtin not supported on this processor.  */
10349     return 0;
10350
10351   /* If we got invalid arguments bail out before generating bad rtl.  */
10352   if (arg0 == error_mark_node)
10353     return const0_rtx;
10354
10355   if (icode == CODE_FOR_altivec_vspltisb
10356       || icode == CODE_FOR_altivec_vspltish
10357       || icode == CODE_FOR_altivec_vspltisw
10358       || icode == CODE_FOR_spe_evsplatfi
10359       || icode == CODE_FOR_spe_evsplati)
10360     {
10361       /* Only allow 5-bit *signed* literals.  */
10362       if (GET_CODE (op0) != CONST_INT
10363           || INTVAL (op0) > 15
10364           || INTVAL (op0) < -16)
10365         {
10366           error ("argument 1 must be a 5-bit signed literal");
10367           return const0_rtx;
10368         }
10369     }
10370
10371   if (target == 0
10372       || GET_MODE (target) != tmode
10373       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10374     target = gen_reg_rtx (tmode);
10375
10376   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10377     op0 = copy_to_mode_reg (mode0, op0);
10378
10379   pat = GEN_FCN (icode) (target, op0);
10380   if (! pat)
10381     return 0;
10382   emit_insn (pat);
10383
10384   return target;
10385 }
10386
10387 static rtx
10388 altivec_expand_abs_builtin (enum insn_code icode, tree exp, rtx target)
10389 {
10390   rtx pat, scratch1, scratch2;
10391   tree arg0 = CALL_EXPR_ARG (exp, 0);
10392   rtx op0 = expand_normal (arg0);
10393   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10394   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10395
10396   /* If we have invalid arguments, bail out before generating bad rtl.  */
10397   if (arg0 == error_mark_node)
10398     return const0_rtx;
10399
10400   if (target == 0
10401       || GET_MODE (target) != tmode
10402       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10403     target = gen_reg_rtx (tmode);
10404
10405   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10406     op0 = copy_to_mode_reg (mode0, op0);
10407
10408   scratch1 = gen_reg_rtx (mode0);
10409   scratch2 = gen_reg_rtx (mode0);
10410
10411   pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
10412   if (! pat)
10413     return 0;
10414   emit_insn (pat);
10415
10416   return target;
10417 }
10418
10419 static rtx
10420 rs6000_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
10421 {
10422   rtx pat;
10423   tree arg0 = CALL_EXPR_ARG (exp, 0);
10424   tree arg1 = CALL_EXPR_ARG (exp, 1);
10425   rtx op0 = expand_normal (arg0);
10426   rtx op1 = expand_normal (arg1);
10427   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10428   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10429   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10430
10431   if (icode == CODE_FOR_nothing)
10432     /* Builtin not supported on this processor.  */
10433     return 0;
10434
10435   /* If we got invalid arguments bail out before generating bad rtl.  */
10436   if (arg0 == error_mark_node || arg1 == error_mark_node)
10437     return const0_rtx;
10438
10439   if (icode == CODE_FOR_altivec_vcfux
10440       || icode == CODE_FOR_altivec_vcfsx
10441       || icode == CODE_FOR_altivec_vctsxs
10442       || icode == CODE_FOR_altivec_vctuxs
10443       || icode == CODE_FOR_altivec_vspltb
10444       || icode == CODE_FOR_altivec_vsplth
10445       || icode == CODE_FOR_altivec_vspltw
10446       || icode == CODE_FOR_spe_evaddiw
10447       || icode == CODE_FOR_spe_evldd
10448       || icode == CODE_FOR_spe_evldh
10449       || icode == CODE_FOR_spe_evldw
10450       || icode == CODE_FOR_spe_evlhhesplat
10451       || icode == CODE_FOR_spe_evlhhossplat
10452       || icode == CODE_FOR_spe_evlhhousplat
10453       || icode == CODE_FOR_spe_evlwhe
10454       || icode == CODE_FOR_spe_evlwhos
10455       || icode == CODE_FOR_spe_evlwhou
10456       || icode == CODE_FOR_spe_evlwhsplat
10457       || icode == CODE_FOR_spe_evlwwsplat
10458       || icode == CODE_FOR_spe_evrlwi
10459       || icode == CODE_FOR_spe_evslwi
10460       || icode == CODE_FOR_spe_evsrwis
10461       || icode == CODE_FOR_spe_evsubifw
10462       || icode == CODE_FOR_spe_evsrwiu)
10463     {
10464       /* Only allow 5-bit unsigned literals.  */
10465       STRIP_NOPS (arg1);
10466       if (TREE_CODE (arg1) != INTEGER_CST
10467           || TREE_INT_CST_LOW (arg1) & ~0x1f)
10468         {
10469           error ("argument 2 must be a 5-bit unsigned literal");
10470           return const0_rtx;
10471         }
10472     }
10473
10474   if (target == 0
10475       || GET_MODE (target) != tmode
10476       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10477     target = gen_reg_rtx (tmode);
10478
10479   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10480     op0 = copy_to_mode_reg (mode0, op0);
10481   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
10482     op1 = copy_to_mode_reg (mode1, op1);
10483
10484   pat = GEN_FCN (icode) (target, op0, op1);
10485   if (! pat)
10486     return 0;
10487   emit_insn (pat);
10488
10489   return target;
10490 }
10491
10492 static rtx
10493 altivec_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
10494 {
10495   rtx pat, scratch;
10496   tree cr6_form = CALL_EXPR_ARG (exp, 0);
10497   tree arg0 = CALL_EXPR_ARG (exp, 1);
10498   tree arg1 = CALL_EXPR_ARG (exp, 2);
10499   rtx op0 = expand_normal (arg0);
10500   rtx op1 = expand_normal (arg1);
10501   enum machine_mode tmode = SImode;
10502   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10503   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10504   int cr6_form_int;
10505
10506   if (TREE_CODE (cr6_form) != INTEGER_CST)
10507     {
10508       error ("argument 1 of __builtin_altivec_predicate must be a constant");
10509       return const0_rtx;
10510     }
10511   else
10512     cr6_form_int = TREE_INT_CST_LOW (cr6_form);
10513
10514   gcc_assert (mode0 == mode1);
10515
10516   /* If we have invalid arguments, bail out before generating bad rtl.  */
10517   if (arg0 == error_mark_node || arg1 == error_mark_node)
10518     return const0_rtx;
10519
10520   if (target == 0
10521       || GET_MODE (target) != tmode
10522       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10523     target = gen_reg_rtx (tmode);
10524
10525   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10526     op0 = copy_to_mode_reg (mode0, op0);
10527   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
10528     op1 = copy_to_mode_reg (mode1, op1);
10529
10530   scratch = gen_reg_rtx (mode0);
10531
10532   pat = GEN_FCN (icode) (scratch, op0, op1);
10533   if (! pat)
10534     return 0;
10535   emit_insn (pat);
10536
10537   /* The vec_any* and vec_all* predicates use the same opcodes for two
10538      different operations, but the bits in CR6 will be different
10539      depending on what information we want.  So we have to play tricks
10540      with CR6 to get the right bits out.
10541
10542      If you think this is disgusting, look at the specs for the
10543      AltiVec predicates.  */
10544
10545   switch (cr6_form_int)
10546     {
10547     case 0:
10548       emit_insn (gen_cr6_test_for_zero (target));
10549       break;
10550     case 1:
10551       emit_insn (gen_cr6_test_for_zero_reverse (target));
10552       break;
10553     case 2:
10554       emit_insn (gen_cr6_test_for_lt (target));
10555       break;
10556     case 3:
10557       emit_insn (gen_cr6_test_for_lt_reverse (target));
10558       break;
10559     default:
10560       error ("argument 1 of __builtin_altivec_predicate is out of range");
10561       break;
10562     }
10563
10564   return target;
10565 }
10566
10567 static rtx
10568 paired_expand_lv_builtin (enum insn_code icode, tree exp, rtx target)
10569 {
10570   rtx pat, addr;
10571   tree arg0 = CALL_EXPR_ARG (exp, 0);
10572   tree arg1 = CALL_EXPR_ARG (exp, 1);
10573   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10574   enum machine_mode mode0 = Pmode;
10575   enum machine_mode mode1 = Pmode;
10576   rtx op0 = expand_normal (arg0);
10577   rtx op1 = expand_normal (arg1);
10578
10579   if (icode == CODE_FOR_nothing)
10580     /* Builtin not supported on this processor.  */
10581     return 0;
10582
10583   /* If we got invalid arguments bail out before generating bad rtl.  */
10584   if (arg0 == error_mark_node || arg1 == error_mark_node)
10585     return const0_rtx;
10586
10587   if (target == 0
10588       || GET_MODE (target) != tmode
10589       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10590     target = gen_reg_rtx (tmode);
10591
10592   op1 = copy_to_mode_reg (mode1, op1);
10593
10594   if (op0 == const0_rtx)
10595     {
10596       addr = gen_rtx_MEM (tmode, op1);
10597     }
10598   else
10599     {
10600       op0 = copy_to_mode_reg (mode0, op0);
10601       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
10602     }
10603
10604   pat = GEN_FCN (icode) (target, addr);
10605
10606   if (! pat)
10607     return 0;
10608   emit_insn (pat);
10609
10610   return target;
10611 }
10612
10613 static rtx
10614 altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target, bool blk)
10615 {
10616   rtx pat, addr;
10617   tree arg0 = CALL_EXPR_ARG (exp, 0);
10618   tree arg1 = CALL_EXPR_ARG (exp, 1);
10619   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10620   enum machine_mode mode0 = Pmode;
10621   enum machine_mode mode1 = Pmode;
10622   rtx op0 = expand_normal (arg0);
10623   rtx op1 = expand_normal (arg1);
10624
10625   if (icode == CODE_FOR_nothing)
10626     /* Builtin not supported on this processor.  */
10627     return 0;
10628
10629   /* If we got invalid arguments bail out before generating bad rtl.  */
10630   if (arg0 == error_mark_node || arg1 == error_mark_node)
10631     return const0_rtx;
10632
10633   if (target == 0
10634       || GET_MODE (target) != tmode
10635       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10636     target = gen_reg_rtx (tmode);
10637
10638   op1 = copy_to_mode_reg (mode1, op1);
10639
10640   if (op0 == const0_rtx)
10641     {
10642       addr = gen_rtx_MEM (blk ? BLKmode : tmode, op1);
10643     }
10644   else
10645     {
10646       op0 = copy_to_mode_reg (mode0, op0);
10647       addr = gen_rtx_MEM (blk ? BLKmode : tmode, gen_rtx_PLUS (Pmode, op0, op1));
10648     }
10649
10650   pat = GEN_FCN (icode) (target, addr);
10651
10652   if (! pat)
10653     return 0;
10654   emit_insn (pat);
10655
10656   return target;
10657 }
10658
10659 static rtx
10660 spe_expand_stv_builtin (enum insn_code icode, tree exp)
10661 {
10662   tree arg0 = CALL_EXPR_ARG (exp, 0);
10663   tree arg1 = CALL_EXPR_ARG (exp, 1);
10664   tree arg2 = CALL_EXPR_ARG (exp, 2);
10665   rtx op0 = expand_normal (arg0);
10666   rtx op1 = expand_normal (arg1);
10667   rtx op2 = expand_normal (arg2);
10668   rtx pat;
10669   enum machine_mode mode0 = insn_data[icode].operand[0].mode;
10670   enum machine_mode mode1 = insn_data[icode].operand[1].mode;
10671   enum machine_mode mode2 = insn_data[icode].operand[2].mode;
10672
10673   /* Invalid arguments.  Bail before doing anything stoopid!  */
10674   if (arg0 == error_mark_node
10675       || arg1 == error_mark_node
10676       || arg2 == error_mark_node)
10677     return const0_rtx;
10678
10679   if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
10680     op0 = copy_to_mode_reg (mode2, op0);
10681   if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
10682     op1 = copy_to_mode_reg (mode0, op1);
10683   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
10684     op2 = copy_to_mode_reg (mode1, op2);
10685
10686   pat = GEN_FCN (icode) (op1, op2, op0);
10687   if (pat)
10688     emit_insn (pat);
10689   return NULL_RTX;
10690 }
10691
10692 static rtx
10693 paired_expand_stv_builtin (enum insn_code icode, tree exp)
10694 {
10695   tree arg0 = CALL_EXPR_ARG (exp, 0);
10696   tree arg1 = CALL_EXPR_ARG (exp, 1);
10697   tree arg2 = CALL_EXPR_ARG (exp, 2);
10698   rtx op0 = expand_normal (arg0);
10699   rtx op1 = expand_normal (arg1);
10700   rtx op2 = expand_normal (arg2);
10701   rtx pat, addr;
10702   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10703   enum machine_mode mode1 = Pmode;
10704   enum machine_mode mode2 = Pmode;
10705
10706   /* Invalid arguments.  Bail before doing anything stoopid!  */
10707   if (arg0 == error_mark_node
10708       || arg1 == error_mark_node
10709       || arg2 == error_mark_node)
10710     return const0_rtx;
10711
10712   if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
10713     op0 = copy_to_mode_reg (tmode, op0);
10714
10715   op2 = copy_to_mode_reg (mode2, op2);
10716
10717   if (op1 == const0_rtx)
10718     {
10719       addr = gen_rtx_MEM (tmode, op2);
10720     }
10721   else
10722     {
10723       op1 = copy_to_mode_reg (mode1, op1);
10724       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
10725     }
10726
10727   pat = GEN_FCN (icode) (addr, op0);
10728   if (pat)
10729     emit_insn (pat);
10730   return NULL_RTX;
10731 }
10732
10733 static rtx
10734 altivec_expand_stv_builtin (enum insn_code icode, tree exp)
10735 {
10736   tree arg0 = CALL_EXPR_ARG (exp, 0);
10737   tree arg1 = CALL_EXPR_ARG (exp, 1);
10738   tree arg2 = CALL_EXPR_ARG (exp, 2);
10739   rtx op0 = expand_normal (arg0);
10740   rtx op1 = expand_normal (arg1);
10741   rtx op2 = expand_normal (arg2);
10742   rtx pat, addr;
10743   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10744   enum machine_mode smode = insn_data[icode].operand[1].mode;
10745   enum machine_mode mode1 = Pmode;
10746   enum machine_mode mode2 = Pmode;
10747
10748   /* Invalid arguments.  Bail before doing anything stoopid!  */
10749   if (arg0 == error_mark_node
10750       || arg1 == error_mark_node
10751       || arg2 == error_mark_node)
10752     return const0_rtx;
10753
10754   if (! (*insn_data[icode].operand[1].predicate) (op0, smode))
10755     op0 = copy_to_mode_reg (smode, op0);
10756
10757   op2 = copy_to_mode_reg (mode2, op2);
10758
10759   if (op1 == const0_rtx)
10760     {
10761       addr = gen_rtx_MEM (tmode, op2);
10762     }
10763   else
10764     {
10765       op1 = copy_to_mode_reg (mode1, op1);
10766       addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
10767     }
10768
10769   pat = GEN_FCN (icode) (addr, op0);
10770   if (pat)
10771     emit_insn (pat);
10772   return NULL_RTX;
10773 }
10774
10775 static rtx
10776 rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
10777 {
10778   rtx pat;
10779   tree arg0 = CALL_EXPR_ARG (exp, 0);
10780   tree arg1 = CALL_EXPR_ARG (exp, 1);
10781   tree arg2 = CALL_EXPR_ARG (exp, 2);
10782   rtx op0 = expand_normal (arg0);
10783   rtx op1 = expand_normal (arg1);
10784   rtx op2 = expand_normal (arg2);
10785   enum machine_mode tmode = insn_data[icode].operand[0].mode;
10786   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10787   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10788   enum machine_mode mode2 = insn_data[icode].operand[3].mode;
10789
10790   if (icode == CODE_FOR_nothing)
10791     /* Builtin not supported on this processor.  */
10792     return 0;
10793
10794   /* If we got invalid arguments bail out before generating bad rtl.  */
10795   if (arg0 == error_mark_node
10796       || arg1 == error_mark_node
10797       || arg2 == error_mark_node)
10798     return const0_rtx;
10799
10800   /* Check and prepare argument depending on the instruction code.
10801
10802      Note that a switch statement instead of the sequence of tests
10803      would be incorrect as many of the CODE_FOR values could be
10804      CODE_FOR_nothing and that would yield multiple alternatives
10805      with identical values.  We'd never reach here at runtime in
10806      this case.  */
10807   if (icode == CODE_FOR_altivec_vsldoi_v4sf
10808       || icode == CODE_FOR_altivec_vsldoi_v4si
10809       || icode == CODE_FOR_altivec_vsldoi_v8hi
10810       || icode == CODE_FOR_altivec_vsldoi_v16qi)
10811     {
10812       /* Only allow 4-bit unsigned literals.  */
10813       STRIP_NOPS (arg2);
10814       if (TREE_CODE (arg2) != INTEGER_CST
10815           || TREE_INT_CST_LOW (arg2) & ~0xf)
10816         {
10817           error ("argument 3 must be a 4-bit unsigned literal");
10818           return const0_rtx;
10819         }
10820     }
10821   else if (icode == CODE_FOR_vsx_xxpermdi_v2df
10822            || icode == CODE_FOR_vsx_xxpermdi_v2di
10823            || icode == CODE_FOR_vsx_xxsldwi_v16qi
10824            || icode == CODE_FOR_vsx_xxsldwi_v8hi
10825            || icode == CODE_FOR_vsx_xxsldwi_v4si
10826            || icode == CODE_FOR_vsx_xxsldwi_v4sf
10827            || icode == CODE_FOR_vsx_xxsldwi_v2di
10828            || icode == CODE_FOR_vsx_xxsldwi_v2df)
10829     {
10830       /* Only allow 2-bit unsigned literals.  */
10831       STRIP_NOPS (arg2);
10832       if (TREE_CODE (arg2) != INTEGER_CST
10833           || TREE_INT_CST_LOW (arg2) & ~0x3)
10834         {
10835           error ("argument 3 must be a 2-bit unsigned literal");
10836           return const0_rtx;
10837         }
10838     }
10839   else if (icode == CODE_FOR_vsx_set_v2df
10840            || icode == CODE_FOR_vsx_set_v2di)
10841     {
10842       /* Only allow 1-bit unsigned literals.  */
10843       STRIP_NOPS (arg2);
10844       if (TREE_CODE (arg2) != INTEGER_CST
10845           || TREE_INT_CST_LOW (arg2) & ~0x1)
10846         {
10847           error ("argument 3 must be a 1-bit unsigned literal");
10848           return const0_rtx;
10849         }
10850     }
10851
10852   if (target == 0
10853       || GET_MODE (target) != tmode
10854       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10855     target = gen_reg_rtx (tmode);
10856
10857   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10858     op0 = copy_to_mode_reg (mode0, op0);
10859   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
10860     op1 = copy_to_mode_reg (mode1, op1);
10861   if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
10862     op2 = copy_to_mode_reg (mode2, op2);
10863
10864   if (TARGET_PAIRED_FLOAT && icode == CODE_FOR_selv2sf4)
10865     pat = GEN_FCN (icode) (target, op0, op1, op2, CONST0_RTX (SFmode));
10866   else 
10867     pat = GEN_FCN (icode) (target, op0, op1, op2);
10868   if (! pat)
10869     return 0;
10870   emit_insn (pat);
10871
10872   return target;
10873 }
10874
10875 /* Expand the lvx builtins.  */
10876 static rtx
10877 altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp)
10878 {
10879   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10880   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
10881   tree arg0;
10882   enum machine_mode tmode, mode0;
10883   rtx pat, op0;
10884   enum insn_code icode;
10885
10886   switch (fcode)
10887     {
10888     case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
10889       icode = CODE_FOR_vector_altivec_load_v16qi;
10890       break;
10891     case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
10892       icode = CODE_FOR_vector_altivec_load_v8hi;
10893       break;
10894     case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
10895       icode = CODE_FOR_vector_altivec_load_v4si;
10896       break;
10897     case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
10898       icode = CODE_FOR_vector_altivec_load_v4sf;
10899       break;
10900     case ALTIVEC_BUILTIN_LD_INTERNAL_2df:
10901       icode = CODE_FOR_vector_altivec_load_v2df;
10902       break;
10903     case ALTIVEC_BUILTIN_LD_INTERNAL_2di:
10904       icode = CODE_FOR_vector_altivec_load_v2di;
10905       break;
10906     default:
10907       *expandedp = false;
10908       return NULL_RTX;
10909     }
10910
10911   *expandedp = true;
10912
10913   arg0 = CALL_EXPR_ARG (exp, 0);
10914   op0 = expand_normal (arg0);
10915   tmode = insn_data[icode].operand[0].mode;
10916   mode0 = insn_data[icode].operand[1].mode;
10917
10918   if (target == 0
10919       || GET_MODE (target) != tmode
10920       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10921     target = gen_reg_rtx (tmode);
10922
10923   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10924     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
10925
10926   pat = GEN_FCN (icode) (target, op0);
10927   if (! pat)
10928     return 0;
10929   emit_insn (pat);
10930   return target;
10931 }
10932
10933 /* Expand the stvx builtins.  */
10934 static rtx
10935 altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
10936                            bool *expandedp)
10937 {
10938   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10939   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
10940   tree arg0, arg1;
10941   enum machine_mode mode0, mode1;
10942   rtx pat, op0, op1;
10943   enum insn_code icode;
10944
10945   switch (fcode)
10946     {
10947     case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
10948       icode = CODE_FOR_vector_altivec_store_v16qi;
10949       break;
10950     case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
10951       icode = CODE_FOR_vector_altivec_store_v8hi;
10952       break;
10953     case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
10954       icode = CODE_FOR_vector_altivec_store_v4si;
10955       break;
10956     case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
10957       icode = CODE_FOR_vector_altivec_store_v4sf;
10958       break;
10959     case ALTIVEC_BUILTIN_ST_INTERNAL_2df:
10960       icode = CODE_FOR_vector_altivec_store_v2df;
10961       break;
10962     case ALTIVEC_BUILTIN_ST_INTERNAL_2di:
10963       icode = CODE_FOR_vector_altivec_store_v2di;
10964       break;
10965     default:
10966       *expandedp = false;
10967       return NULL_RTX;
10968     }
10969
10970   arg0 = CALL_EXPR_ARG (exp, 0);
10971   arg1 = CALL_EXPR_ARG (exp, 1);
10972   op0 = expand_normal (arg0);
10973   op1 = expand_normal (arg1);
10974   mode0 = insn_data[icode].operand[0].mode;
10975   mode1 = insn_data[icode].operand[1].mode;
10976
10977   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
10978     op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
10979   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
10980     op1 = copy_to_mode_reg (mode1, op1);
10981
10982   pat = GEN_FCN (icode) (op0, op1);
10983   if (pat)
10984     emit_insn (pat);
10985
10986   *expandedp = true;
10987   return NULL_RTX;
10988 }
10989
10990 /* Expand the dst builtins.  */
10991 static rtx
10992 altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
10993                             bool *expandedp)
10994 {
10995   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10996   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
10997   tree arg0, arg1, arg2;
10998   enum machine_mode mode0, mode1;
10999   rtx pat, op0, op1, op2;
11000   const struct builtin_description *d;
11001   size_t i;
11002
11003   *expandedp = false;
11004
11005   /* Handle DST variants.  */
11006   d = bdesc_dst;
11007   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
11008     if (d->code == fcode)
11009       {
11010         arg0 = CALL_EXPR_ARG (exp, 0);
11011         arg1 = CALL_EXPR_ARG (exp, 1);
11012         arg2 = CALL_EXPR_ARG (exp, 2);
11013         op0 = expand_normal (arg0);
11014         op1 = expand_normal (arg1);
11015         op2 = expand_normal (arg2);
11016         mode0 = insn_data[d->icode].operand[0].mode;
11017         mode1 = insn_data[d->icode].operand[1].mode;
11018
11019         /* Invalid arguments, bail out before generating bad rtl.  */
11020         if (arg0 == error_mark_node
11021             || arg1 == error_mark_node
11022             || arg2 == error_mark_node)
11023           return const0_rtx;
11024
11025         *expandedp = true;
11026         STRIP_NOPS (arg2);
11027         if (TREE_CODE (arg2) != INTEGER_CST
11028             || TREE_INT_CST_LOW (arg2) & ~0x3)
11029           {
11030             error ("argument to %qs must be a 2-bit unsigned literal", d->name);
11031             return const0_rtx;
11032           }
11033
11034         if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
11035           op0 = copy_to_mode_reg (Pmode, op0);
11036         if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
11037           op1 = copy_to_mode_reg (mode1, op1);
11038
11039         pat = GEN_FCN (d->icode) (op0, op1, op2);
11040         if (pat != 0)
11041           emit_insn (pat);
11042
11043         return NULL_RTX;
11044       }
11045
11046   return NULL_RTX;
11047 }
11048
11049 /* Expand vec_init builtin.  */
11050 static rtx
11051 altivec_expand_vec_init_builtin (tree type, tree exp, rtx target)
11052 {
11053   enum machine_mode tmode = TYPE_MODE (type);
11054   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
11055   int i, n_elt = GET_MODE_NUNITS (tmode);
11056   rtvec v = rtvec_alloc (n_elt);
11057
11058   gcc_assert (VECTOR_MODE_P (tmode));
11059   gcc_assert (n_elt == call_expr_nargs (exp));
11060
11061   for (i = 0; i < n_elt; ++i)
11062     {
11063       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
11064       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
11065     }
11066
11067   if (!target || !register_operand (target, tmode))
11068     target = gen_reg_rtx (tmode);
11069
11070   rs6000_expand_vector_init (target, gen_rtx_PARALLEL (tmode, v));
11071   return target;
11072 }
11073
11074 /* Return the integer constant in ARG.  Constrain it to be in the range
11075    of the subparts of VEC_TYPE; issue an error if not.  */
11076
11077 static int
11078 get_element_number (tree vec_type, tree arg)
11079 {
11080   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
11081
11082   if (!host_integerp (arg, 1)
11083       || (elt = tree_low_cst (arg, 1), elt > max))
11084     {
11085       error ("selector must be an integer constant in the range 0..%wi", max);
11086       return 0;
11087     }
11088
11089   return elt;
11090 }
11091
11092 /* Expand vec_set builtin.  */
11093 static rtx
11094 altivec_expand_vec_set_builtin (tree exp)
11095 {
11096   enum machine_mode tmode, mode1;
11097   tree arg0, arg1, arg2;
11098   int elt;
11099   rtx op0, op1;
11100
11101   arg0 = CALL_EXPR_ARG (exp, 0);
11102   arg1 = CALL_EXPR_ARG (exp, 1);
11103   arg2 = CALL_EXPR_ARG (exp, 2);
11104
11105   tmode = TYPE_MODE (TREE_TYPE (arg0));
11106   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
11107   gcc_assert (VECTOR_MODE_P (tmode));
11108
11109   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
11110   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
11111   elt = get_element_number (TREE_TYPE (arg0), arg2);
11112
11113   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
11114     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
11115
11116   op0 = force_reg (tmode, op0);
11117   op1 = force_reg (mode1, op1);
11118
11119   rs6000_expand_vector_set (op0, op1, elt);
11120
11121   return op0;
11122 }
11123
11124 /* Expand vec_ext builtin.  */
11125 static rtx
11126 altivec_expand_vec_ext_builtin (tree exp, rtx target)
11127 {
11128   enum machine_mode tmode, mode0;
11129   tree arg0, arg1;
11130   int elt;
11131   rtx op0;
11132
11133   arg0 = CALL_EXPR_ARG (exp, 0);
11134   arg1 = CALL_EXPR_ARG (exp, 1);
11135
11136   op0 = expand_normal (arg0);
11137   elt = get_element_number (TREE_TYPE (arg0), arg1);
11138
11139   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
11140   mode0 = TYPE_MODE (TREE_TYPE (arg0));
11141   gcc_assert (VECTOR_MODE_P (mode0));
11142
11143   op0 = force_reg (mode0, op0);
11144
11145   if (optimize || !target || !register_operand (target, tmode))
11146     target = gen_reg_rtx (tmode);
11147
11148   rs6000_expand_vector_extract (target, op0, elt);
11149
11150   return target;
11151 }
11152
11153 /* Expand the builtin in EXP and store the result in TARGET.  Store
11154    true in *EXPANDEDP if we found a builtin to expand.  */
11155 static rtx
11156 altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
11157 {
11158   const struct builtin_description *d;
11159   const struct builtin_description_predicates *dp;
11160   size_t i;
11161   enum insn_code icode;
11162   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11163   tree arg0;
11164   rtx op0, pat;
11165   enum machine_mode tmode, mode0;
11166   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11167
11168   if ((fcode >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
11169        && fcode <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
11170       || (fcode >= VSX_BUILTIN_OVERLOADED_FIRST
11171           && fcode <= VSX_BUILTIN_OVERLOADED_LAST))
11172     {
11173       *expandedp = true;
11174       error ("unresolved overload for Altivec builtin %qF", fndecl);
11175       return const0_rtx;
11176     }
11177
11178   target = altivec_expand_ld_builtin (exp, target, expandedp);
11179   if (*expandedp)
11180     return target;
11181
11182   target = altivec_expand_st_builtin (exp, target, expandedp);
11183   if (*expandedp)
11184     return target;
11185
11186   target = altivec_expand_dst_builtin (exp, target, expandedp);
11187   if (*expandedp)
11188     return target;
11189
11190   *expandedp = true;
11191
11192   switch (fcode)
11193     {
11194     case ALTIVEC_BUILTIN_STVX:
11195       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v4si, exp);
11196     case ALTIVEC_BUILTIN_STVEBX:
11197       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, exp);
11198     case ALTIVEC_BUILTIN_STVEHX:
11199       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, exp);
11200     case ALTIVEC_BUILTIN_STVEWX:
11201       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, exp);
11202     case ALTIVEC_BUILTIN_STVXL:
11203       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, exp);
11204
11205     case ALTIVEC_BUILTIN_STVLX:
11206       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlx, exp);
11207     case ALTIVEC_BUILTIN_STVLXL:
11208       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlxl, exp);
11209     case ALTIVEC_BUILTIN_STVRX:
11210       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrx, exp);
11211     case ALTIVEC_BUILTIN_STVRXL:
11212       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrxl, exp);
11213
11214     case VSX_BUILTIN_STXVD2X_V2DF:
11215       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v2df, exp);
11216     case VSX_BUILTIN_STXVD2X_V2DI:
11217       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v2di, exp);
11218     case VSX_BUILTIN_STXVW4X_V4SF:
11219       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v4sf, exp);
11220     case VSX_BUILTIN_STXVW4X_V4SI:
11221       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v4si, exp);
11222     case VSX_BUILTIN_STXVW4X_V8HI:
11223       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v8hi, exp);
11224     case VSX_BUILTIN_STXVW4X_V16QI:
11225       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v16qi, exp);
11226
11227     case ALTIVEC_BUILTIN_MFVSCR:
11228       icode = CODE_FOR_altivec_mfvscr;
11229       tmode = insn_data[icode].operand[0].mode;
11230
11231       if (target == 0
11232           || GET_MODE (target) != tmode
11233           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11234         target = gen_reg_rtx (tmode);
11235
11236       pat = GEN_FCN (icode) (target);
11237       if (! pat)
11238         return 0;
11239       emit_insn (pat);
11240       return target;
11241
11242     case ALTIVEC_BUILTIN_MTVSCR:
11243       icode = CODE_FOR_altivec_mtvscr;
11244       arg0 = CALL_EXPR_ARG (exp, 0);
11245       op0 = expand_normal (arg0);
11246       mode0 = insn_data[icode].operand[0].mode;
11247
11248       /* If we got invalid arguments bail out before generating bad rtl.  */
11249       if (arg0 == error_mark_node)
11250         return const0_rtx;
11251
11252       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11253         op0 = copy_to_mode_reg (mode0, op0);
11254
11255       pat = GEN_FCN (icode) (op0);
11256       if (pat)
11257         emit_insn (pat);
11258       return NULL_RTX;
11259
11260     case ALTIVEC_BUILTIN_DSSALL:
11261       emit_insn (gen_altivec_dssall ());
11262       return NULL_RTX;
11263
11264     case ALTIVEC_BUILTIN_DSS:
11265       icode = CODE_FOR_altivec_dss;
11266       arg0 = CALL_EXPR_ARG (exp, 0);
11267       STRIP_NOPS (arg0);
11268       op0 = expand_normal (arg0);
11269       mode0 = insn_data[icode].operand[0].mode;
11270
11271       /* If we got invalid arguments bail out before generating bad rtl.  */
11272       if (arg0 == error_mark_node)
11273         return const0_rtx;
11274
11275       if (TREE_CODE (arg0) != INTEGER_CST
11276           || TREE_INT_CST_LOW (arg0) & ~0x3)
11277         {
11278           error ("argument to dss must be a 2-bit unsigned literal");
11279           return const0_rtx;
11280         }
11281
11282       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11283         op0 = copy_to_mode_reg (mode0, op0);
11284
11285       emit_insn (gen_altivec_dss (op0));
11286       return NULL_RTX;
11287
11288     case ALTIVEC_BUILTIN_VEC_INIT_V4SI:
11289     case ALTIVEC_BUILTIN_VEC_INIT_V8HI:
11290     case ALTIVEC_BUILTIN_VEC_INIT_V16QI:
11291     case ALTIVEC_BUILTIN_VEC_INIT_V4SF:
11292     case VSX_BUILTIN_VEC_INIT_V2DF:
11293     case VSX_BUILTIN_VEC_INIT_V2DI:
11294       return altivec_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
11295
11296     case ALTIVEC_BUILTIN_VEC_SET_V4SI:
11297     case ALTIVEC_BUILTIN_VEC_SET_V8HI:
11298     case ALTIVEC_BUILTIN_VEC_SET_V16QI:
11299     case ALTIVEC_BUILTIN_VEC_SET_V4SF:
11300     case VSX_BUILTIN_VEC_SET_V2DF:
11301     case VSX_BUILTIN_VEC_SET_V2DI:
11302       return altivec_expand_vec_set_builtin (exp);
11303
11304     case ALTIVEC_BUILTIN_VEC_EXT_V4SI:
11305     case ALTIVEC_BUILTIN_VEC_EXT_V8HI:
11306     case ALTIVEC_BUILTIN_VEC_EXT_V16QI:
11307     case ALTIVEC_BUILTIN_VEC_EXT_V4SF:
11308     case VSX_BUILTIN_VEC_EXT_V2DF:
11309     case VSX_BUILTIN_VEC_EXT_V2DI:
11310       return altivec_expand_vec_ext_builtin (exp, target);
11311
11312     default:
11313       break;
11314       /* Fall through.  */
11315     }
11316
11317   /* Expand abs* operations.  */
11318   d = bdesc_abs;
11319   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
11320     if (d->code == fcode)
11321       return altivec_expand_abs_builtin (d->icode, exp, target);
11322
11323   /* Expand the AltiVec predicates.  */
11324   dp = bdesc_altivec_preds;
11325   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
11326     if (dp->code == fcode)
11327       return altivec_expand_predicate_builtin (dp->icode, exp, target);
11328
11329   /* LV* are funky.  We initialized them differently.  */
11330   switch (fcode)
11331     {
11332     case ALTIVEC_BUILTIN_LVSL:
11333       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
11334                                         exp, target, false);
11335     case ALTIVEC_BUILTIN_LVSR:
11336       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
11337                                         exp, target, false);
11338     case ALTIVEC_BUILTIN_LVEBX:
11339       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
11340                                         exp, target, false);
11341     case ALTIVEC_BUILTIN_LVEHX:
11342       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
11343                                         exp, target, false);
11344     case ALTIVEC_BUILTIN_LVEWX:
11345       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
11346                                         exp, target, false);
11347     case ALTIVEC_BUILTIN_LVXL:
11348       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
11349                                         exp, target, false);
11350     case ALTIVEC_BUILTIN_LVX:
11351       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v4si,
11352                                         exp, target, false);
11353     case ALTIVEC_BUILTIN_LVLX:
11354       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlx,
11355                                         exp, target, true);
11356     case ALTIVEC_BUILTIN_LVLXL:
11357       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlxl,
11358                                         exp, target, true);
11359     case ALTIVEC_BUILTIN_LVRX:
11360       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrx,
11361                                         exp, target, true);
11362     case ALTIVEC_BUILTIN_LVRXL:
11363       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrxl,
11364                                         exp, target, true);
11365     case VSX_BUILTIN_LXVD2X_V2DF:
11366       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v2df,
11367                                         exp, target, false);
11368     case VSX_BUILTIN_LXVD2X_V2DI:
11369       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v2di,
11370                                         exp, target, false);
11371     case VSX_BUILTIN_LXVW4X_V4SF:
11372       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v4sf,
11373                                         exp, target, false);
11374     case VSX_BUILTIN_LXVW4X_V4SI:
11375       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v4si,
11376                                         exp, target, false);
11377     case VSX_BUILTIN_LXVW4X_V8HI:
11378       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v8hi,
11379                                         exp, target, false);
11380     case VSX_BUILTIN_LXVW4X_V16QI:
11381       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v16qi,
11382                                         exp, target, false);
11383       break;
11384     default:
11385       break;
11386       /* Fall through.  */
11387     }
11388
11389   *expandedp = false;
11390   return NULL_RTX;
11391 }
11392
11393 /* Expand the builtin in EXP and store the result in TARGET.  Store
11394    true in *EXPANDEDP if we found a builtin to expand.  */
11395 static rtx
11396 paired_expand_builtin (tree exp, rtx target, bool * expandedp)
11397 {
11398   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11399   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11400   const struct builtin_description *d;
11401   size_t i;
11402
11403   *expandedp = true;
11404
11405   switch (fcode)
11406     {
11407     case PAIRED_BUILTIN_STX:
11408       return paired_expand_stv_builtin (CODE_FOR_paired_stx, exp);
11409     case PAIRED_BUILTIN_LX:
11410       return paired_expand_lv_builtin (CODE_FOR_paired_lx, exp, target);
11411     default:
11412       break;
11413       /* Fall through.  */
11414     }
11415
11416   /* Expand the paired predicates.  */
11417   d = bdesc_paired_preds;
11418   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); i++, d++)
11419     if (d->code == fcode)
11420       return paired_expand_predicate_builtin (d->icode, exp, target);
11421
11422   *expandedp = false;
11423   return NULL_RTX;
11424 }
11425
11426 /* Binops that need to be initialized manually, but can be expanded
11427    automagically by rs6000_expand_binop_builtin.  */
11428 static struct builtin_description bdesc_2arg_spe[] =
11429 {
11430   { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
11431   { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
11432   { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
11433   { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
11434   { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
11435   { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
11436   { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
11437   { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
11438   { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
11439   { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
11440   { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
11441   { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
11442   { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
11443   { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
11444   { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
11445   { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
11446   { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
11447   { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
11448   { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
11449   { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
11450   { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
11451   { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
11452 };
11453
11454 /* Expand the builtin in EXP and store the result in TARGET.  Store
11455    true in *EXPANDEDP if we found a builtin to expand.
11456
11457    This expands the SPE builtins that are not simple unary and binary
11458    operations.  */
11459 static rtx
11460 spe_expand_builtin (tree exp, rtx target, bool *expandedp)
11461 {
11462   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11463   tree arg1, arg0;
11464   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11465   enum insn_code icode;
11466   enum machine_mode tmode, mode0;
11467   rtx pat, op0;
11468   struct builtin_description *d;
11469   size_t i;
11470
11471   *expandedp = true;
11472
11473   /* Syntax check for a 5-bit unsigned immediate.  */
11474   switch (fcode)
11475     {
11476     case SPE_BUILTIN_EVSTDD:
11477     case SPE_BUILTIN_EVSTDH:
11478     case SPE_BUILTIN_EVSTDW:
11479     case SPE_BUILTIN_EVSTWHE:
11480     case SPE_BUILTIN_EVSTWHO:
11481     case SPE_BUILTIN_EVSTWWE:
11482     case SPE_BUILTIN_EVSTWWO:
11483       arg1 = CALL_EXPR_ARG (exp, 2);
11484       if (TREE_CODE (arg1) != INTEGER_CST
11485           || TREE_INT_CST_LOW (arg1) & ~0x1f)
11486         {
11487           error ("argument 2 must be a 5-bit unsigned literal");
11488           return const0_rtx;
11489         }
11490       break;
11491     default:
11492       break;
11493     }
11494
11495   /* The evsplat*i instructions are not quite generic.  */
11496   switch (fcode)
11497     {
11498     case SPE_BUILTIN_EVSPLATFI:
11499       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
11500                                          exp, target);
11501     case SPE_BUILTIN_EVSPLATI:
11502       return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
11503                                          exp, target);
11504     default:
11505       break;
11506     }
11507
11508   d = (struct builtin_description *) bdesc_2arg_spe;
11509   for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
11510     if (d->code == fcode)
11511       return rs6000_expand_binop_builtin (d->icode, exp, target);
11512
11513   d = (struct builtin_description *) bdesc_spe_predicates;
11514   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
11515     if (d->code == fcode)
11516       return spe_expand_predicate_builtin (d->icode, exp, target);
11517
11518   d = (struct builtin_description *) bdesc_spe_evsel;
11519   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
11520     if (d->code == fcode)
11521       return spe_expand_evsel_builtin (d->icode, exp, target);
11522
11523   switch (fcode)
11524     {
11525     case SPE_BUILTIN_EVSTDDX:
11526       return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, exp);
11527     case SPE_BUILTIN_EVSTDHX:
11528       return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, exp);
11529     case SPE_BUILTIN_EVSTDWX:
11530       return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, exp);
11531     case SPE_BUILTIN_EVSTWHEX:
11532       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, exp);
11533     case SPE_BUILTIN_EVSTWHOX:
11534       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, exp);
11535     case SPE_BUILTIN_EVSTWWEX:
11536       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, exp);
11537     case SPE_BUILTIN_EVSTWWOX:
11538       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, exp);
11539     case SPE_BUILTIN_EVSTDD:
11540       return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, exp);
11541     case SPE_BUILTIN_EVSTDH:
11542       return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, exp);
11543     case SPE_BUILTIN_EVSTDW:
11544       return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, exp);
11545     case SPE_BUILTIN_EVSTWHE:
11546       return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, exp);
11547     case SPE_BUILTIN_EVSTWHO:
11548       return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, exp);
11549     case SPE_BUILTIN_EVSTWWE:
11550       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, exp);
11551     case SPE_BUILTIN_EVSTWWO:
11552       return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, exp);
11553     case SPE_BUILTIN_MFSPEFSCR:
11554       icode = CODE_FOR_spe_mfspefscr;
11555       tmode = insn_data[icode].operand[0].mode;
11556
11557       if (target == 0
11558           || GET_MODE (target) != tmode
11559           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11560         target = gen_reg_rtx (tmode);
11561
11562       pat = GEN_FCN (icode) (target);
11563       if (! pat)
11564         return 0;
11565       emit_insn (pat);
11566       return target;
11567     case SPE_BUILTIN_MTSPEFSCR:
11568       icode = CODE_FOR_spe_mtspefscr;
11569       arg0 = CALL_EXPR_ARG (exp, 0);
11570       op0 = expand_normal (arg0);
11571       mode0 = insn_data[icode].operand[0].mode;
11572
11573       if (arg0 == error_mark_node)
11574         return const0_rtx;
11575
11576       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11577         op0 = copy_to_mode_reg (mode0, op0);
11578
11579       pat = GEN_FCN (icode) (op0);
11580       if (pat)
11581         emit_insn (pat);
11582       return NULL_RTX;
11583     default:
11584       break;
11585     }
11586
11587   *expandedp = false;
11588   return NULL_RTX;
11589 }
11590
11591 static rtx
11592 paired_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
11593 {
11594   rtx pat, scratch, tmp;
11595   tree form = CALL_EXPR_ARG (exp, 0);
11596   tree arg0 = CALL_EXPR_ARG (exp, 1);
11597   tree arg1 = CALL_EXPR_ARG (exp, 2);
11598   rtx op0 = expand_normal (arg0);
11599   rtx op1 = expand_normal (arg1);
11600   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11601   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11602   int form_int;
11603   enum rtx_code code;
11604
11605   if (TREE_CODE (form) != INTEGER_CST)
11606     {
11607       error ("argument 1 of __builtin_paired_predicate must be a constant");
11608       return const0_rtx;
11609     }
11610   else
11611     form_int = TREE_INT_CST_LOW (form);
11612
11613   gcc_assert (mode0 == mode1);
11614
11615   if (arg0 == error_mark_node || arg1 == error_mark_node)
11616     return const0_rtx;
11617
11618   if (target == 0
11619       || GET_MODE (target) != SImode
11620       || !(*insn_data[icode].operand[0].predicate) (target, SImode))
11621     target = gen_reg_rtx (SImode);
11622   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
11623     op0 = copy_to_mode_reg (mode0, op0);
11624   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
11625     op1 = copy_to_mode_reg (mode1, op1);
11626
11627   scratch = gen_reg_rtx (CCFPmode);
11628
11629   pat = GEN_FCN (icode) (scratch, op0, op1);
11630   if (!pat)
11631     return const0_rtx;
11632
11633   emit_insn (pat);
11634
11635   switch (form_int)
11636     {
11637       /* LT bit.  */
11638     case 0:
11639       code = LT;
11640       break;
11641       /* GT bit.  */
11642     case 1:
11643       code = GT;
11644       break;
11645       /* EQ bit.  */
11646     case 2:
11647       code = EQ;
11648       break;
11649       /* UN bit.  */
11650     case 3:
11651       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
11652       return target;
11653     default:
11654       error ("argument 1 of __builtin_paired_predicate is out of range");
11655       return const0_rtx;
11656     }
11657
11658   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
11659   emit_move_insn (target, tmp);
11660   return target;
11661 }
11662
11663 static rtx
11664 spe_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
11665 {
11666   rtx pat, scratch, tmp;
11667   tree form = CALL_EXPR_ARG (exp, 0);
11668   tree arg0 = CALL_EXPR_ARG (exp, 1);
11669   tree arg1 = CALL_EXPR_ARG (exp, 2);
11670   rtx op0 = expand_normal (arg0);
11671   rtx op1 = expand_normal (arg1);
11672   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11673   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11674   int form_int;
11675   enum rtx_code code;
11676
11677   if (TREE_CODE (form) != INTEGER_CST)
11678     {
11679       error ("argument 1 of __builtin_spe_predicate must be a constant");
11680       return const0_rtx;
11681     }
11682   else
11683     form_int = TREE_INT_CST_LOW (form);
11684
11685   gcc_assert (mode0 == mode1);
11686
11687   if (arg0 == error_mark_node || arg1 == error_mark_node)
11688     return const0_rtx;
11689
11690   if (target == 0
11691       || GET_MODE (target) != SImode
11692       || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
11693     target = gen_reg_rtx (SImode);
11694
11695   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11696     op0 = copy_to_mode_reg (mode0, op0);
11697   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
11698     op1 = copy_to_mode_reg (mode1, op1);
11699
11700   scratch = gen_reg_rtx (CCmode);
11701
11702   pat = GEN_FCN (icode) (scratch, op0, op1);
11703   if (! pat)
11704     return const0_rtx;
11705   emit_insn (pat);
11706
11707   /* There are 4 variants for each predicate: _any_, _all_, _upper_,
11708      _lower_.  We use one compare, but look in different bits of the
11709      CR for each variant.
11710
11711      There are 2 elements in each SPE simd type (upper/lower).  The CR
11712      bits are set as follows:
11713
11714      BIT0  | BIT 1  | BIT 2   | BIT 3
11715      U     |   L    | (U | L) | (U & L)
11716
11717      So, for an "all" relationship, BIT 3 would be set.
11718      For an "any" relationship, BIT 2 would be set.  Etc.
11719
11720      Following traditional nomenclature, these bits map to:
11721
11722      BIT0  | BIT 1  | BIT 2   | BIT 3
11723      LT    | GT     | EQ      | OV
11724
11725      Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
11726   */
11727
11728   switch (form_int)
11729     {
11730       /* All variant.  OV bit.  */
11731     case 0:
11732       /* We need to get to the OV bit, which is the ORDERED bit.  We
11733          could generate (ordered:SI (reg:CC xx) (const_int 0)), but
11734          that's ugly and will make validate_condition_mode die.
11735          So let's just use another pattern.  */
11736       emit_insn (gen_move_from_CR_ov_bit (target, scratch));
11737       return target;
11738       /* Any variant.  EQ bit.  */
11739     case 1:
11740       code = EQ;
11741       break;
11742       /* Upper variant.  LT bit.  */
11743     case 2:
11744       code = LT;
11745       break;
11746       /* Lower variant.  GT bit.  */
11747     case 3:
11748       code = GT;
11749       break;
11750     default:
11751       error ("argument 1 of __builtin_spe_predicate is out of range");
11752       return const0_rtx;
11753     }
11754
11755   tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
11756   emit_move_insn (target, tmp);
11757
11758   return target;
11759 }
11760
11761 /* The evsel builtins look like this:
11762
11763      e = __builtin_spe_evsel_OP (a, b, c, d);
11764
11765    and work like this:
11766
11767      e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
11768      e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
11769 */
11770
11771 static rtx
11772 spe_expand_evsel_builtin (enum insn_code icode, tree exp, rtx target)
11773 {
11774   rtx pat, scratch;
11775   tree arg0 = CALL_EXPR_ARG (exp, 0);
11776   tree arg1 = CALL_EXPR_ARG (exp, 1);
11777   tree arg2 = CALL_EXPR_ARG (exp, 2);
11778   tree arg3 = CALL_EXPR_ARG (exp, 3);
11779   rtx op0 = expand_normal (arg0);
11780   rtx op1 = expand_normal (arg1);
11781   rtx op2 = expand_normal (arg2);
11782   rtx op3 = expand_normal (arg3);
11783   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11784   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11785
11786   gcc_assert (mode0 == mode1);
11787
11788   if (arg0 == error_mark_node || arg1 == error_mark_node
11789       || arg2 == error_mark_node || arg3 == error_mark_node)
11790     return const0_rtx;
11791
11792   if (target == 0
11793       || GET_MODE (target) != mode0
11794       || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
11795     target = gen_reg_rtx (mode0);
11796
11797   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11798     op0 = copy_to_mode_reg (mode0, op0);
11799   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
11800     op1 = copy_to_mode_reg (mode0, op1);
11801   if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
11802     op2 = copy_to_mode_reg (mode0, op2);
11803   if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
11804     op3 = copy_to_mode_reg (mode0, op3);
11805
11806   /* Generate the compare.  */
11807   scratch = gen_reg_rtx (CCmode);
11808   pat = GEN_FCN (icode) (scratch, op0, op1);
11809   if (! pat)
11810     return const0_rtx;
11811   emit_insn (pat);
11812
11813   if (mode0 == V2SImode)
11814     emit_insn (gen_spe_evsel (target, op2, op3, scratch));
11815   else
11816     emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
11817
11818   return target;
11819 }
11820
11821 /* Expand an expression EXP that calls a built-in function,
11822    with result going to TARGET if that's convenient
11823    (and in mode MODE if that's convenient).
11824    SUBTARGET may be used as the target for computing one of EXP's operands.
11825    IGNORE is nonzero if the value is to be ignored.  */
11826
11827 static rtx
11828 rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
11829                        enum machine_mode mode ATTRIBUTE_UNUSED,
11830                        int ignore ATTRIBUTE_UNUSED)
11831 {
11832   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11833   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11834   const struct builtin_description *d;
11835   size_t i;
11836   rtx ret;
11837   bool success;
11838
11839   switch (fcode)
11840     {
11841     case RS6000_BUILTIN_RECIP:
11842       return rs6000_expand_binop_builtin (CODE_FOR_recipdf3, exp, target);
11843
11844     case RS6000_BUILTIN_RECIPF:
11845       return rs6000_expand_binop_builtin (CODE_FOR_recipsf3, exp, target);
11846
11847     case RS6000_BUILTIN_RSQRTF:
11848       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtsf2, exp, target);
11849
11850     case RS6000_BUILTIN_RSQRT:
11851       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtdf2, exp, target);
11852
11853     case RS6000_BUILTIN_BSWAP_HI:
11854       return rs6000_expand_unop_builtin (CODE_FOR_bswaphi2, exp, target);
11855
11856     case POWER7_BUILTIN_BPERMD:
11857       return rs6000_expand_binop_builtin (((TARGET_64BIT)
11858                                            ? CODE_FOR_bpermd_di
11859                                            : CODE_FOR_bpermd_si), exp, target);
11860
11861     case ALTIVEC_BUILTIN_MASK_FOR_LOAD:
11862     case ALTIVEC_BUILTIN_MASK_FOR_STORE:
11863       {
11864         int icode = (int) CODE_FOR_altivec_lvsr;
11865         enum machine_mode tmode = insn_data[icode].operand[0].mode;
11866         enum machine_mode mode = insn_data[icode].operand[1].mode;
11867         tree arg;
11868         rtx op, addr, pat;
11869
11870         gcc_assert (TARGET_ALTIVEC);
11871
11872         arg = CALL_EXPR_ARG (exp, 0);
11873         gcc_assert (POINTER_TYPE_P (TREE_TYPE (arg)));
11874         op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
11875         addr = memory_address (mode, op);
11876         if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
11877           op = addr;
11878         else
11879           {
11880             /* For the load case need to negate the address.  */
11881             op = gen_reg_rtx (GET_MODE (addr));
11882             emit_insn (gen_rtx_SET (VOIDmode, op,
11883                                     gen_rtx_NEG (GET_MODE (addr), addr)));
11884           }
11885         op = gen_rtx_MEM (mode, op);
11886
11887         if (target == 0
11888             || GET_MODE (target) != tmode
11889             || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11890           target = gen_reg_rtx (tmode);
11891
11892         /*pat = gen_altivec_lvsr (target, op);*/
11893         pat = GEN_FCN (icode) (target, op);
11894         if (!pat)
11895           return 0;
11896         emit_insn (pat);
11897
11898         return target;
11899       }
11900
11901     case ALTIVEC_BUILTIN_VCFUX:
11902     case ALTIVEC_BUILTIN_VCFSX:
11903     case ALTIVEC_BUILTIN_VCTUXS:
11904     case ALTIVEC_BUILTIN_VCTSXS:
11905   /* FIXME: There's got to be a nicer way to handle this case than
11906      constructing a new CALL_EXPR.  */
11907       if (call_expr_nargs (exp) == 1)
11908         {
11909           exp = build_call_nary (TREE_TYPE (exp), CALL_EXPR_FN (exp),
11910                                  2, CALL_EXPR_ARG (exp, 0), integer_zero_node);
11911         }
11912       break;
11913
11914     default:
11915       break;
11916     }
11917
11918   if (TARGET_ALTIVEC)
11919     {
11920       ret = altivec_expand_builtin (exp, target, &success);
11921
11922       if (success)
11923         return ret;
11924     }
11925   if (TARGET_SPE)
11926     {
11927       ret = spe_expand_builtin (exp, target, &success);
11928
11929       if (success)
11930         return ret;
11931     }
11932   if (TARGET_PAIRED_FLOAT)
11933     {
11934       ret = paired_expand_builtin (exp, target, &success);
11935
11936       if (success)
11937         return ret;
11938     }  
11939
11940   gcc_assert (TARGET_ALTIVEC || TARGET_VSX || TARGET_SPE || TARGET_PAIRED_FLOAT);
11941
11942   /* Handle simple unary operations.  */
11943   d = (struct builtin_description *) bdesc_1arg;
11944   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
11945     if (d->code == fcode)
11946       return rs6000_expand_unop_builtin (d->icode, exp, target);
11947
11948   /* Handle simple binary operations.  */
11949   d = (struct builtin_description *) bdesc_2arg;
11950   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
11951     if (d->code == fcode)
11952       return rs6000_expand_binop_builtin (d->icode, exp, target);
11953
11954   /* Handle simple ternary operations.  */
11955   d = bdesc_3arg;
11956   for (i = 0; i < ARRAY_SIZE  (bdesc_3arg); i++, d++)
11957     if (d->code == fcode)
11958       return rs6000_expand_ternop_builtin (d->icode, exp, target);
11959
11960   gcc_unreachable ();
11961 }
11962
11963 static void
11964 rs6000_init_builtins (void)
11965 {
11966   tree tdecl;
11967   tree ftype;
11968
11969   V2SI_type_node = build_vector_type (intSI_type_node, 2);
11970   V2SF_type_node = build_vector_type (float_type_node, 2);
11971   V2DI_type_node = build_vector_type (intDI_type_node, 2);
11972   V2DF_type_node = build_vector_type (double_type_node, 2);
11973   V4HI_type_node = build_vector_type (intHI_type_node, 4);
11974   V4SI_type_node = build_vector_type (intSI_type_node, 4);
11975   V4SF_type_node = build_vector_type (float_type_node, 4);
11976   V8HI_type_node = build_vector_type (intHI_type_node, 8);
11977   V16QI_type_node = build_vector_type (intQI_type_node, 16);
11978
11979   unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16);
11980   unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8);
11981   unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4);
11982   unsigned_V2DI_type_node = build_vector_type (unsigned_intDI_type_node, 2);
11983
11984   opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2);
11985   opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2);
11986   opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
11987   opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4);
11988
11989   /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
11990      types, especially in C++ land.  Similarly, 'vector pixel' is distinct from
11991      'vector unsigned short'.  */
11992
11993   bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
11994   bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
11995   bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
11996   bool_long_type_node = build_distinct_type_copy (unsigned_intDI_type_node);
11997   pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
11998
11999   long_integer_type_internal_node = long_integer_type_node;
12000   long_unsigned_type_internal_node = long_unsigned_type_node;
12001   long_long_integer_type_internal_node = long_long_integer_type_node;
12002   long_long_unsigned_type_internal_node = long_long_unsigned_type_node;
12003   intQI_type_internal_node = intQI_type_node;
12004   uintQI_type_internal_node = unsigned_intQI_type_node;
12005   intHI_type_internal_node = intHI_type_node;
12006   uintHI_type_internal_node = unsigned_intHI_type_node;
12007   intSI_type_internal_node = intSI_type_node;
12008   uintSI_type_internal_node = unsigned_intSI_type_node;
12009   intDI_type_internal_node = intDI_type_node;
12010   uintDI_type_internal_node = unsigned_intDI_type_node;
12011   float_type_internal_node = float_type_node;
12012   double_type_internal_node = double_type_node;
12013   void_type_internal_node = void_type_node;
12014
12015   /* Initialize the modes for builtin_function_type, mapping a machine mode to
12016      tree type node.  */
12017   builtin_mode_to_type[QImode][0] = integer_type_node;
12018   builtin_mode_to_type[HImode][0] = integer_type_node;
12019   builtin_mode_to_type[SImode][0] = intSI_type_node;
12020   builtin_mode_to_type[SImode][1] = unsigned_intSI_type_node;
12021   builtin_mode_to_type[DImode][0] = intDI_type_node;
12022   builtin_mode_to_type[DImode][1] = unsigned_intDI_type_node;
12023   builtin_mode_to_type[SFmode][0] = float_type_node;
12024   builtin_mode_to_type[DFmode][0] = double_type_node;
12025   builtin_mode_to_type[V2SImode][0] = V2SI_type_node;
12026   builtin_mode_to_type[V2SFmode][0] = V2SF_type_node;
12027   builtin_mode_to_type[V2DImode][0] = V2DI_type_node;
12028   builtin_mode_to_type[V2DImode][1] = unsigned_V2DI_type_node;
12029   builtin_mode_to_type[V2DFmode][0] = V2DF_type_node;
12030   builtin_mode_to_type[V4HImode][0] = V4HI_type_node;
12031   builtin_mode_to_type[V4SImode][0] = V4SI_type_node;
12032   builtin_mode_to_type[V4SImode][1] = unsigned_V4SI_type_node;
12033   builtin_mode_to_type[V4SFmode][0] = V4SF_type_node;
12034   builtin_mode_to_type[V8HImode][0] = V8HI_type_node;
12035   builtin_mode_to_type[V8HImode][1] = unsigned_V8HI_type_node;
12036   builtin_mode_to_type[V16QImode][0] = V16QI_type_node;
12037   builtin_mode_to_type[V16QImode][1] = unsigned_V16QI_type_node;
12038
12039   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12040                       get_identifier ("__bool char"),
12041                       bool_char_type_node);
12042   TYPE_NAME (bool_char_type_node) = tdecl;
12043   (*lang_hooks.decls.pushdecl) (tdecl);
12044   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12045                       get_identifier ("__bool short"),
12046                       bool_short_type_node);
12047   TYPE_NAME (bool_short_type_node) = tdecl;
12048   (*lang_hooks.decls.pushdecl) (tdecl);
12049   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12050                       get_identifier ("__bool int"),
12051                       bool_int_type_node);
12052   TYPE_NAME (bool_int_type_node) = tdecl;
12053   (*lang_hooks.decls.pushdecl) (tdecl);
12054   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("__pixel"),
12055                       pixel_type_node);
12056   TYPE_NAME (pixel_type_node) = tdecl;
12057   (*lang_hooks.decls.pushdecl) (tdecl);
12058
12059   bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
12060   bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
12061   bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
12062   bool_V2DI_type_node = build_vector_type (bool_long_type_node, 2);
12063   pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
12064
12065   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12066                       get_identifier ("__vector unsigned char"),
12067                       unsigned_V16QI_type_node);
12068   TYPE_NAME (unsigned_V16QI_type_node) = tdecl;
12069   (*lang_hooks.decls.pushdecl) (tdecl);
12070   tdecl = build_decl (BUILTINS_LOCATION,
12071                       TYPE_DECL, get_identifier ("__vector signed char"),
12072                       V16QI_type_node);
12073   TYPE_NAME (V16QI_type_node) = tdecl;
12074   (*lang_hooks.decls.pushdecl) (tdecl);
12075   tdecl = build_decl (BUILTINS_LOCATION,
12076                       TYPE_DECL, get_identifier ("__vector __bool char"),
12077                       bool_V16QI_type_node);
12078   TYPE_NAME ( bool_V16QI_type_node) = tdecl;
12079   (*lang_hooks.decls.pushdecl) (tdecl);
12080
12081   tdecl = build_decl (BUILTINS_LOCATION,
12082                       TYPE_DECL, get_identifier ("__vector unsigned short"),
12083                       unsigned_V8HI_type_node);
12084   TYPE_NAME (unsigned_V8HI_type_node) = tdecl;
12085   (*lang_hooks.decls.pushdecl) (tdecl);
12086   tdecl = build_decl (BUILTINS_LOCATION,
12087                       TYPE_DECL, get_identifier ("__vector signed short"),
12088                       V8HI_type_node);
12089   TYPE_NAME (V8HI_type_node) = tdecl;
12090   (*lang_hooks.decls.pushdecl) (tdecl);
12091   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12092                       get_identifier ("__vector __bool short"),
12093                       bool_V8HI_type_node);
12094   TYPE_NAME (bool_V8HI_type_node) = tdecl;
12095   (*lang_hooks.decls.pushdecl) (tdecl);
12096
12097   tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12098                       get_identifier ("__vector unsigned int"),
12099                       unsigned_V4SI_type_node);
12100   TYPE_NAME (unsigned_V4SI_type_node) = tdecl;
12101   (*lang_hooks.decls.pushdecl) (tdecl);
12102   tdecl = build_decl (BUILTINS_LOCATION,
12103                       TYPE_DECL, get_identifier ("__vector signed int"),
12104                       V4SI_type_node);
12105   TYPE_NAME (V4SI_type_node) = tdecl;
12106   (*lang_hooks.decls.pushdecl) (tdecl);
12107   tdecl = build_decl (BUILTINS_LOCATION,
12108                       TYPE_DECL, get_identifier ("__vector __bool int"),
12109                       bool_V4SI_type_node);
12110   TYPE_NAME (bool_V4SI_type_node) = tdecl;
12111   (*lang_hooks.decls.pushdecl) (tdecl);
12112
12113   tdecl = build_decl (BUILTINS_LOCATION,
12114                       TYPE_DECL, get_identifier ("__vector float"),
12115                       V4SF_type_node);
12116   TYPE_NAME (V4SF_type_node) = tdecl;
12117   (*lang_hooks.decls.pushdecl) (tdecl);
12118   tdecl = build_decl (BUILTINS_LOCATION,
12119                       TYPE_DECL, get_identifier ("__vector __pixel"),
12120                       pixel_V8HI_type_node);
12121   TYPE_NAME (pixel_V8HI_type_node) = tdecl;
12122   (*lang_hooks.decls.pushdecl) (tdecl);
12123
12124   if (TARGET_VSX)
12125     {
12126       tdecl = build_decl (BUILTINS_LOCATION,
12127                           TYPE_DECL, get_identifier ("__vector double"),
12128                           V2DF_type_node);
12129       TYPE_NAME (V2DF_type_node) = tdecl;
12130       (*lang_hooks.decls.pushdecl) (tdecl);
12131
12132       tdecl = build_decl (BUILTINS_LOCATION,
12133                           TYPE_DECL, get_identifier ("__vector long"),
12134                           V2DI_type_node);
12135       TYPE_NAME (V2DI_type_node) = tdecl;
12136       (*lang_hooks.decls.pushdecl) (tdecl);
12137
12138       tdecl = build_decl (BUILTINS_LOCATION,
12139                           TYPE_DECL, get_identifier ("__vector unsigned long"),
12140                           unsigned_V2DI_type_node);
12141       TYPE_NAME (unsigned_V2DI_type_node) = tdecl;
12142       (*lang_hooks.decls.pushdecl) (tdecl);
12143
12144       tdecl = build_decl (BUILTINS_LOCATION,
12145                           TYPE_DECL, get_identifier ("__vector __bool long"),
12146                           bool_V2DI_type_node);
12147       TYPE_NAME (bool_V2DI_type_node) = tdecl;
12148       (*lang_hooks.decls.pushdecl) (tdecl);
12149     }
12150
12151   if (TARGET_PAIRED_FLOAT)
12152     paired_init_builtins ();
12153   if (TARGET_SPE)
12154     spe_init_builtins ();
12155   if (TARGET_ALTIVEC)
12156     altivec_init_builtins ();
12157   if (TARGET_ALTIVEC || TARGET_SPE || TARGET_PAIRED_FLOAT || TARGET_VSX)
12158     rs6000_common_init_builtins ();
12159   if (TARGET_FRE)
12160     {
12161       ftype = builtin_function_type (DFmode, DFmode, DFmode, VOIDmode,
12162                                      RS6000_BUILTIN_RECIP,
12163                                      "__builtin_recipdiv");
12164       def_builtin (MASK_POPCNTB, "__builtin_recipdiv", ftype,
12165                    RS6000_BUILTIN_RECIP);
12166     }
12167   if (TARGET_FRES)
12168     {
12169       ftype = builtin_function_type (SFmode, SFmode, SFmode, VOIDmode,
12170                                      RS6000_BUILTIN_RECIPF,
12171                                      "__builtin_recipdivf");
12172       def_builtin (MASK_PPC_GFXOPT, "__builtin_recipdivf", ftype,
12173                    RS6000_BUILTIN_RECIPF);
12174     }
12175   if (TARGET_FRSQRTE)
12176     {
12177       ftype = builtin_function_type (DFmode, DFmode, VOIDmode, VOIDmode,
12178                                      RS6000_BUILTIN_RSQRT,
12179                                      "__builtin_rsqrt");
12180       def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrt", ftype,
12181                    RS6000_BUILTIN_RSQRT);
12182     }
12183   if (TARGET_FRSQRTES)
12184     {
12185       ftype = builtin_function_type (SFmode, SFmode, VOIDmode, VOIDmode,
12186                                      RS6000_BUILTIN_RSQRTF,
12187                                      "__builtin_rsqrtf");
12188       def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrtf", ftype,
12189                    RS6000_BUILTIN_RSQRTF);
12190     }
12191   if (TARGET_POPCNTD)
12192     {
12193       enum machine_mode mode = (TARGET_64BIT) ? DImode : SImode;
12194       tree ftype = builtin_function_type (mode, mode, mode, VOIDmode,
12195                                           POWER7_BUILTIN_BPERMD,
12196                                           "__builtin_bpermd");
12197       def_builtin (MASK_POPCNTD, "__builtin_bpermd", ftype,
12198                    POWER7_BUILTIN_BPERMD);
12199     }
12200   if (TARGET_POWERPC)
12201     {
12202       /* Don't use builtin_function_type here, as it maps HI/QI to SI.  */
12203       tree ftype = build_function_type_list (unsigned_intHI_type_node,
12204                                              unsigned_intHI_type_node,
12205                                              NULL_TREE);
12206       def_builtin (MASK_POWERPC, "__builtin_bswap16", ftype,
12207                    RS6000_BUILTIN_BSWAP_HI);
12208     }
12209
12210 #if TARGET_XCOFF
12211   /* AIX libm provides clog as __clog.  */
12212   if (built_in_decls [BUILT_IN_CLOG])
12213     set_user_assembler_name (built_in_decls [BUILT_IN_CLOG], "__clog");
12214 #endif
12215
12216 #ifdef SUBTARGET_INIT_BUILTINS
12217   SUBTARGET_INIT_BUILTINS;
12218 #endif
12219 }
12220
12221 /* Returns the rs6000 builtin decl for CODE.  */
12222
12223 static tree
12224 rs6000_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
12225 {
12226   if (code >= RS6000_BUILTIN_COUNT)
12227     return error_mark_node;
12228
12229   return rs6000_builtin_decls[code];
12230 }
12231
12232 /* Search through a set of builtins and enable the mask bits.
12233    DESC is an array of builtins.
12234    SIZE is the total number of builtins.
12235    START is the builtin enum at which to start.
12236    END is the builtin enum at which to end.  */
12237 static void
12238 enable_mask_for_builtins (struct builtin_description *desc, int size,
12239                           enum rs6000_builtins start,
12240                           enum rs6000_builtins end)
12241 {
12242   int i;
12243
12244   for (i = 0; i < size; ++i)
12245     if (desc[i].code == start)
12246       break;
12247
12248   if (i == size)
12249     return;
12250
12251   for (; i < size; ++i)
12252     {
12253       /* Flip all the bits on.  */
12254       desc[i].mask = target_flags;
12255       if (desc[i].code == end)
12256         break;
12257     }
12258 }
12259
12260 static void
12261 spe_init_builtins (void)
12262 {
12263   tree puint_type_node = build_pointer_type (unsigned_type_node);
12264   tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
12265   struct builtin_description *d;
12266   size_t i;
12267
12268   tree v2si_ftype_4_v2si
12269     = build_function_type_list (opaque_V2SI_type_node,
12270                                 opaque_V2SI_type_node,
12271                                 opaque_V2SI_type_node,
12272                                 opaque_V2SI_type_node,
12273                                 opaque_V2SI_type_node,
12274                                 NULL_TREE);
12275
12276   tree v2sf_ftype_4_v2sf
12277     = build_function_type_list (opaque_V2SF_type_node,
12278                                 opaque_V2SF_type_node,
12279                                 opaque_V2SF_type_node,
12280                                 opaque_V2SF_type_node,
12281                                 opaque_V2SF_type_node,
12282                                 NULL_TREE);
12283
12284   tree int_ftype_int_v2si_v2si
12285     = build_function_type_list (integer_type_node,
12286                                 integer_type_node,
12287                                 opaque_V2SI_type_node,
12288                                 opaque_V2SI_type_node,
12289                                 NULL_TREE);
12290
12291   tree int_ftype_int_v2sf_v2sf
12292     = build_function_type_list (integer_type_node,
12293                                 integer_type_node,
12294                                 opaque_V2SF_type_node,
12295                                 opaque_V2SF_type_node,
12296                                 NULL_TREE);
12297
12298   tree void_ftype_v2si_puint_int
12299     = build_function_type_list (void_type_node,
12300                                 opaque_V2SI_type_node,
12301                                 puint_type_node,
12302                                 integer_type_node,
12303                                 NULL_TREE);
12304
12305   tree void_ftype_v2si_puint_char
12306     = build_function_type_list (void_type_node,
12307                                 opaque_V2SI_type_node,
12308                                 puint_type_node,
12309                                 char_type_node,
12310                                 NULL_TREE);
12311
12312   tree void_ftype_v2si_pv2si_int
12313     = build_function_type_list (void_type_node,
12314                                 opaque_V2SI_type_node,
12315                                 opaque_p_V2SI_type_node,
12316                                 integer_type_node,
12317                                 NULL_TREE);
12318
12319   tree void_ftype_v2si_pv2si_char
12320     = build_function_type_list (void_type_node,
12321                                 opaque_V2SI_type_node,
12322                                 opaque_p_V2SI_type_node,
12323                                 char_type_node,
12324                                 NULL_TREE);
12325
12326   tree void_ftype_int
12327     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
12328
12329   tree int_ftype_void
12330     = build_function_type_list (integer_type_node, NULL_TREE);
12331
12332   tree v2si_ftype_pv2si_int
12333     = build_function_type_list (opaque_V2SI_type_node,
12334                                 opaque_p_V2SI_type_node,
12335                                 integer_type_node,
12336                                 NULL_TREE);
12337
12338   tree v2si_ftype_puint_int
12339     = build_function_type_list (opaque_V2SI_type_node,
12340                                 puint_type_node,
12341                                 integer_type_node,
12342                                 NULL_TREE);
12343
12344   tree v2si_ftype_pushort_int
12345     = build_function_type_list (opaque_V2SI_type_node,
12346                                 pushort_type_node,
12347                                 integer_type_node,
12348                                 NULL_TREE);
12349
12350   tree v2si_ftype_signed_char
12351     = build_function_type_list (opaque_V2SI_type_node,
12352                                 signed_char_type_node,
12353                                 NULL_TREE);
12354
12355   /* The initialization of the simple binary and unary builtins is
12356      done in rs6000_common_init_builtins, but we have to enable the
12357      mask bits here manually because we have run out of `target_flags'
12358      bits.  We really need to redesign this mask business.  */
12359
12360   enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
12361                             ARRAY_SIZE (bdesc_2arg),
12362                             SPE_BUILTIN_EVADDW,
12363                             SPE_BUILTIN_EVXOR);
12364   enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
12365                             ARRAY_SIZE (bdesc_1arg),
12366                             SPE_BUILTIN_EVABS,
12367                             SPE_BUILTIN_EVSUBFUSIAAW);
12368   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
12369                             ARRAY_SIZE (bdesc_spe_predicates),
12370                             SPE_BUILTIN_EVCMPEQ,
12371                             SPE_BUILTIN_EVFSTSTLT);
12372   enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
12373                             ARRAY_SIZE (bdesc_spe_evsel),
12374                             SPE_BUILTIN_EVSEL_CMPGTS,
12375                             SPE_BUILTIN_EVSEL_FSTSTEQ);
12376
12377   (*lang_hooks.decls.pushdecl)
12378     (build_decl (BUILTINS_LOCATION, TYPE_DECL,
12379                  get_identifier ("__ev64_opaque__"),
12380                  opaque_V2SI_type_node));
12381
12382   /* Initialize irregular SPE builtins.  */
12383
12384   def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
12385   def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
12386   def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
12387   def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
12388   def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
12389   def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
12390   def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
12391   def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
12392   def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
12393   def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
12394   def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
12395   def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
12396   def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
12397   def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
12398   def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
12399   def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
12400   def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
12401   def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
12402
12403   /* Loads.  */
12404   def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
12405   def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
12406   def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
12407   def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
12408   def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
12409   def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
12410   def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
12411   def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
12412   def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
12413   def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
12414   def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
12415   def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
12416   def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
12417   def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
12418   def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
12419   def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
12420   def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
12421   def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
12422   def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
12423   def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
12424   def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
12425   def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
12426
12427   /* Predicates.  */
12428   d = (struct builtin_description *) bdesc_spe_predicates;
12429   for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
12430     {
12431       tree type;
12432
12433       switch (insn_data[d->icode].operand[1].mode)
12434         {
12435         case V2SImode:
12436           type = int_ftype_int_v2si_v2si;
12437           break;
12438         case V2SFmode:
12439           type = int_ftype_int_v2sf_v2sf;
12440           break;
12441         default:
12442           gcc_unreachable ();
12443         }
12444
12445       def_builtin (d->mask, d->name, type, d->code);
12446     }
12447
12448   /* Evsel predicates.  */
12449   d = (struct builtin_description *) bdesc_spe_evsel;
12450   for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
12451     {
12452       tree type;
12453
12454       switch (insn_data[d->icode].operand[1].mode)
12455         {
12456         case V2SImode:
12457           type = v2si_ftype_4_v2si;
12458           break;
12459         case V2SFmode:
12460           type = v2sf_ftype_4_v2sf;
12461           break;
12462         default:
12463           gcc_unreachable ();
12464         }
12465
12466       def_builtin (d->mask, d->name, type, d->code);
12467     }
12468 }
12469
12470 static void
12471 paired_init_builtins (void)
12472 {
12473   const struct builtin_description *d;
12474   size_t i;
12475
12476    tree int_ftype_int_v2sf_v2sf
12477     = build_function_type_list (integer_type_node,
12478                                 integer_type_node,
12479                                 V2SF_type_node,
12480                                 V2SF_type_node,
12481                                 NULL_TREE);
12482   tree pcfloat_type_node =
12483     build_pointer_type (build_qualified_type
12484                         (float_type_node, TYPE_QUAL_CONST));
12485
12486   tree v2sf_ftype_long_pcfloat = build_function_type_list (V2SF_type_node,
12487                                                            long_integer_type_node,
12488                                                            pcfloat_type_node,
12489                                                            NULL_TREE);
12490   tree void_ftype_v2sf_long_pcfloat =
12491     build_function_type_list (void_type_node,
12492                               V2SF_type_node,
12493                               long_integer_type_node,
12494                               pcfloat_type_node,
12495                               NULL_TREE);
12496
12497
12498   def_builtin (0, "__builtin_paired_lx", v2sf_ftype_long_pcfloat,
12499                PAIRED_BUILTIN_LX);
12500
12501
12502   def_builtin (0, "__builtin_paired_stx", void_ftype_v2sf_long_pcfloat,
12503                PAIRED_BUILTIN_STX);
12504
12505   /* Predicates.  */
12506   d = bdesc_paired_preds;
12507   for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); ++i, d++)
12508     {
12509       tree type;
12510
12511       switch (insn_data[d->icode].operand[1].mode)
12512         {
12513         case V2SFmode:
12514           type = int_ftype_int_v2sf_v2sf;
12515           break;
12516         default:
12517           gcc_unreachable ();
12518         }
12519
12520       def_builtin (d->mask, d->name, type, d->code);
12521     }
12522 }
12523
12524 static void
12525 altivec_init_builtins (void)
12526 {
12527   const struct builtin_description *d;
12528   const struct builtin_description_predicates *dp;
12529   size_t i;
12530   tree ftype;
12531
12532   tree pvoid_type_node = build_pointer_type (void_type_node);
12533
12534   tree pcvoid_type_node
12535     = build_pointer_type (build_qualified_type (void_type_node,
12536                                                 TYPE_QUAL_CONST));
12537
12538   tree int_ftype_opaque
12539     = build_function_type_list (integer_type_node,
12540                                 opaque_V4SI_type_node, NULL_TREE);
12541   tree opaque_ftype_opaque
12542     = build_function_type_list (integer_type_node, NULL_TREE);
12543   tree opaque_ftype_opaque_int
12544     = build_function_type_list (opaque_V4SI_type_node,
12545                                 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
12546   tree opaque_ftype_opaque_opaque_int
12547     = build_function_type_list (opaque_V4SI_type_node,
12548                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
12549                                 integer_type_node, NULL_TREE);
12550   tree int_ftype_int_opaque_opaque
12551     = build_function_type_list (integer_type_node,
12552                                 integer_type_node, opaque_V4SI_type_node,
12553                                 opaque_V4SI_type_node, NULL_TREE);
12554   tree int_ftype_int_v4si_v4si
12555     = build_function_type_list (integer_type_node,
12556                                 integer_type_node, V4SI_type_node,
12557                                 V4SI_type_node, NULL_TREE);
12558   tree void_ftype_v4si
12559     = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
12560   tree v8hi_ftype_void
12561     = build_function_type_list (V8HI_type_node, NULL_TREE);
12562   tree void_ftype_void
12563     = build_function_type_list (void_type_node, NULL_TREE);
12564   tree void_ftype_int
12565     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
12566
12567   tree opaque_ftype_long_pcvoid
12568     = build_function_type_list (opaque_V4SI_type_node,
12569                                 long_integer_type_node, pcvoid_type_node,
12570                                 NULL_TREE);
12571   tree v16qi_ftype_long_pcvoid
12572     = build_function_type_list (V16QI_type_node,
12573                                 long_integer_type_node, pcvoid_type_node,
12574                                 NULL_TREE);
12575   tree v8hi_ftype_long_pcvoid
12576     = build_function_type_list (V8HI_type_node,
12577                                 long_integer_type_node, pcvoid_type_node,
12578                                 NULL_TREE);
12579   tree v4si_ftype_long_pcvoid
12580     = build_function_type_list (V4SI_type_node,
12581                                 long_integer_type_node, pcvoid_type_node,
12582                                 NULL_TREE);
12583   tree v4sf_ftype_long_pcvoid
12584     = build_function_type_list (V4SF_type_node,
12585                                 long_integer_type_node, pcvoid_type_node,
12586                                 NULL_TREE);
12587   tree v2df_ftype_long_pcvoid
12588     = build_function_type_list (V2DF_type_node,
12589                                 long_integer_type_node, pcvoid_type_node,
12590                                 NULL_TREE);
12591   tree v2di_ftype_long_pcvoid
12592     = build_function_type_list (V2DI_type_node,
12593                                 long_integer_type_node, pcvoid_type_node,
12594                                 NULL_TREE);
12595
12596   tree void_ftype_opaque_long_pvoid
12597     = build_function_type_list (void_type_node,
12598                                 opaque_V4SI_type_node, long_integer_type_node,
12599                                 pvoid_type_node, NULL_TREE);
12600   tree void_ftype_v4si_long_pvoid
12601     = build_function_type_list (void_type_node,
12602                                 V4SI_type_node, long_integer_type_node,
12603                                 pvoid_type_node, NULL_TREE);
12604   tree void_ftype_v16qi_long_pvoid
12605     = build_function_type_list (void_type_node,
12606                                 V16QI_type_node, long_integer_type_node,
12607                                 pvoid_type_node, NULL_TREE);
12608   tree void_ftype_v8hi_long_pvoid
12609     = build_function_type_list (void_type_node,
12610                                 V8HI_type_node, long_integer_type_node,
12611                                 pvoid_type_node, NULL_TREE);
12612   tree void_ftype_v4sf_long_pvoid
12613     = build_function_type_list (void_type_node,
12614                                 V4SF_type_node, long_integer_type_node,
12615                                 pvoid_type_node, NULL_TREE);
12616   tree void_ftype_v2df_long_pvoid
12617     = build_function_type_list (void_type_node,
12618                                 V2DF_type_node, long_integer_type_node,
12619                                 pvoid_type_node, NULL_TREE);
12620   tree void_ftype_v2di_long_pvoid
12621     = build_function_type_list (void_type_node,
12622                                 V2DI_type_node, long_integer_type_node,
12623                                 pvoid_type_node, NULL_TREE);
12624   tree int_ftype_int_v8hi_v8hi
12625     = build_function_type_list (integer_type_node,
12626                                 integer_type_node, V8HI_type_node,
12627                                 V8HI_type_node, NULL_TREE);
12628   tree int_ftype_int_v16qi_v16qi
12629     = build_function_type_list (integer_type_node,
12630                                 integer_type_node, V16QI_type_node,
12631                                 V16QI_type_node, NULL_TREE);
12632   tree int_ftype_int_v4sf_v4sf
12633     = build_function_type_list (integer_type_node,
12634                                 integer_type_node, V4SF_type_node,
12635                                 V4SF_type_node, NULL_TREE);
12636   tree int_ftype_int_v2df_v2df
12637     = build_function_type_list (integer_type_node,
12638                                 integer_type_node, V2DF_type_node,
12639                                 V2DF_type_node, NULL_TREE);
12640   tree v4si_ftype_v4si
12641     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
12642   tree v8hi_ftype_v8hi
12643     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
12644   tree v16qi_ftype_v16qi
12645     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
12646   tree v4sf_ftype_v4sf
12647     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
12648   tree v2df_ftype_v2df
12649     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
12650   tree void_ftype_pcvoid_int_int
12651     = build_function_type_list (void_type_node,
12652                                 pcvoid_type_node, integer_type_node,
12653                                 integer_type_node, NULL_TREE);
12654
12655   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
12656   def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
12657   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
12658   def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
12659   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
12660   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
12661   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
12662   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
12663   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
12664   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
12665   def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
12666   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
12667   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
12668   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
12669   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
12670   def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
12671   def_builtin (MASK_ALTIVEC, "__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
12672   def_builtin (MASK_ALTIVEC, "__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
12673   def_builtin (MASK_ALTIVEC, "__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
12674   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
12675   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
12676   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
12677   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
12678   def_builtin (MASK_ALTIVEC, "__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
12679   def_builtin (MASK_ALTIVEC, "__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
12680   def_builtin (MASK_ALTIVEC, "__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
12681   def_builtin (MASK_ALTIVEC, "__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
12682   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
12683   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
12684   def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
12685
12686   def_builtin (MASK_VSX, "__builtin_vsx_lxvd2x_v2df", v2df_ftype_long_pcvoid,
12687                VSX_BUILTIN_LXVD2X_V2DF);
12688   def_builtin (MASK_VSX, "__builtin_vsx_lxvd2x_v2di", v2di_ftype_long_pcvoid,
12689                VSX_BUILTIN_LXVD2X_V2DI);
12690   def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v4sf", v4sf_ftype_long_pcvoid,
12691                VSX_BUILTIN_LXVW4X_V4SF);
12692   def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v4si", v4si_ftype_long_pcvoid,
12693                VSX_BUILTIN_LXVW4X_V4SI);
12694   def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v8hi",
12695                v8hi_ftype_long_pcvoid, VSX_BUILTIN_LXVW4X_V8HI);
12696   def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v16qi",
12697                v16qi_ftype_long_pcvoid, VSX_BUILTIN_LXVW4X_V16QI);
12698   def_builtin (MASK_VSX, "__builtin_vsx_stxvd2x_v2df",
12699                void_ftype_v2df_long_pvoid, VSX_BUILTIN_STXVD2X_V2DF);
12700   def_builtin (MASK_VSX, "__builtin_vsx_stxvd2x_v2di",
12701                void_ftype_v2di_long_pvoid, VSX_BUILTIN_STXVD2X_V2DI);
12702   def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v4sf",
12703                void_ftype_v4sf_long_pvoid, VSX_BUILTIN_STXVW4X_V4SF);
12704   def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v4si",
12705                void_ftype_v4si_long_pvoid, VSX_BUILTIN_STXVW4X_V4SI);
12706   def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v8hi",
12707                void_ftype_v8hi_long_pvoid, VSX_BUILTIN_STXVW4X_V8HI);
12708   def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v16qi",
12709                void_ftype_v16qi_long_pvoid, VSX_BUILTIN_STXVW4X_V16QI);
12710   def_builtin (MASK_VSX, "__builtin_vec_vsx_ld", opaque_ftype_long_pcvoid,
12711                VSX_BUILTIN_VEC_LD);
12712   def_builtin (MASK_VSX, "__builtin_vec_vsx_st", void_ftype_opaque_long_pvoid,
12713                VSX_BUILTIN_VEC_ST);
12714
12715   if (rs6000_cpu == PROCESSOR_CELL)
12716     {
12717       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLX);
12718       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLXL);
12719       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRX);
12720       def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRXL);
12721
12722       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLX);
12723       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLXL);
12724       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRX);
12725       def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRXL);
12726
12727       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLX);
12728       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLXL);
12729       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRX);
12730       def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRXL);
12731
12732       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLX);
12733       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLXL);
12734       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRX);
12735       def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRXL);
12736     }
12737   def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
12738   def_builtin (MASK_ALTIVEC, "__builtin_vec_splats", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_SPLATS);
12739   def_builtin (MASK_ALTIVEC, "__builtin_vec_promote", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_PROMOTE);
12740
12741   def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
12742   def_builtin (MASK_ALTIVEC, "__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
12743   def_builtin (MASK_ALTIVEC, "__builtin_vec_extract", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_EXTRACT);
12744   def_builtin (MASK_ALTIVEC, "__builtin_vec_insert", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_INSERT);
12745   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
12746   def_builtin (MASK_ALTIVEC, "__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
12747   def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
12748   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
12749   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
12750   def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
12751   def_builtin (MASK_ALTIVEC, "__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
12752   def_builtin (MASK_ALTIVEC, "__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
12753
12754   /* Add the DST variants.  */
12755   d = bdesc_dst;
12756   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
12757     def_builtin (d->mask, d->name, void_ftype_pcvoid_int_int, d->code);
12758
12759   /* Initialize the predicates.  */
12760   dp = bdesc_altivec_preds;
12761   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
12762     {
12763       enum machine_mode mode1;
12764       tree type;
12765       bool is_overloaded = ((dp->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
12766                              && dp->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
12767                             || (dp->code >= VSX_BUILTIN_OVERLOADED_FIRST
12768                                 && dp->code <= VSX_BUILTIN_OVERLOADED_LAST));
12769
12770       if (is_overloaded)
12771         mode1 = VOIDmode;
12772       else
12773         mode1 = insn_data[dp->icode].operand[1].mode;
12774
12775       switch (mode1)
12776         {
12777         case VOIDmode:
12778           type = int_ftype_int_opaque_opaque;
12779           break;
12780         case V4SImode:
12781           type = int_ftype_int_v4si_v4si;
12782           break;
12783         case V8HImode:
12784           type = int_ftype_int_v8hi_v8hi;
12785           break;
12786         case V16QImode:
12787           type = int_ftype_int_v16qi_v16qi;
12788           break;
12789         case V4SFmode:
12790           type = int_ftype_int_v4sf_v4sf;
12791           break;
12792         case V2DFmode:
12793           type = int_ftype_int_v2df_v2df;
12794           break;
12795         default:
12796           gcc_unreachable ();
12797         }
12798
12799       def_builtin (dp->mask, dp->name, type, dp->code);
12800     }
12801
12802   /* Initialize the abs* operators.  */
12803   d = bdesc_abs;
12804   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
12805     {
12806       enum machine_mode mode0;
12807       tree type;
12808
12809       mode0 = insn_data[d->icode].operand[0].mode;
12810
12811       switch (mode0)
12812         {
12813         case V4SImode:
12814           type = v4si_ftype_v4si;
12815           break;
12816         case V8HImode:
12817           type = v8hi_ftype_v8hi;
12818           break;
12819         case V16QImode:
12820           type = v16qi_ftype_v16qi;
12821           break;
12822         case V4SFmode:
12823           type = v4sf_ftype_v4sf;
12824           break;
12825         case V2DFmode:
12826           type = v2df_ftype_v2df;
12827           break;
12828         default:
12829           gcc_unreachable ();
12830         }
12831
12832       def_builtin (d->mask, d->name, type, d->code);
12833     }
12834
12835   if (TARGET_ALTIVEC)
12836     {
12837       tree decl;
12838
12839       /* Initialize target builtin that implements
12840          targetm.vectorize.builtin_mask_for_load.  */
12841
12842       decl = add_builtin_function ("__builtin_altivec_mask_for_load",
12843                                    v16qi_ftype_long_pcvoid,
12844                                    ALTIVEC_BUILTIN_MASK_FOR_LOAD,
12845                                    BUILT_IN_MD, NULL, NULL_TREE);
12846       TREE_READONLY (decl) = 1;
12847       /* Record the decl. Will be used by rs6000_builtin_mask_for_load.  */
12848       altivec_builtin_mask_for_load = decl;
12849     }
12850
12851   /* Access to the vec_init patterns.  */
12852   ftype = build_function_type_list (V4SI_type_node, integer_type_node,
12853                                     integer_type_node, integer_type_node,
12854                                     integer_type_node, NULL_TREE);
12855   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4si", ftype,
12856                ALTIVEC_BUILTIN_VEC_INIT_V4SI);
12857
12858   ftype = build_function_type_list (V8HI_type_node, short_integer_type_node,
12859                                     short_integer_type_node,
12860                                     short_integer_type_node,
12861                                     short_integer_type_node,
12862                                     short_integer_type_node,
12863                                     short_integer_type_node,
12864                                     short_integer_type_node,
12865                                     short_integer_type_node, NULL_TREE);
12866   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v8hi", ftype,
12867                ALTIVEC_BUILTIN_VEC_INIT_V8HI);
12868
12869   ftype = build_function_type_list (V16QI_type_node, char_type_node,
12870                                     char_type_node, char_type_node,
12871                                     char_type_node, char_type_node,
12872                                     char_type_node, char_type_node,
12873                                     char_type_node, char_type_node,
12874                                     char_type_node, char_type_node,
12875                                     char_type_node, char_type_node,
12876                                     char_type_node, char_type_node,
12877                                     char_type_node, NULL_TREE);
12878   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v16qi", ftype,
12879                ALTIVEC_BUILTIN_VEC_INIT_V16QI);
12880
12881   ftype = build_function_type_list (V4SF_type_node, float_type_node,
12882                                     float_type_node, float_type_node,
12883                                     float_type_node, NULL_TREE);
12884   def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4sf", ftype,
12885                ALTIVEC_BUILTIN_VEC_INIT_V4SF);
12886
12887   if (TARGET_VSX)
12888     {
12889       ftype = build_function_type_list (V2DF_type_node, double_type_node,
12890                                         double_type_node, NULL_TREE);
12891       def_builtin (MASK_VSX, "__builtin_vec_init_v2df", ftype,
12892                    VSX_BUILTIN_VEC_INIT_V2DF);
12893
12894       ftype = build_function_type_list (V2DI_type_node, intDI_type_node,
12895                                         intDI_type_node, NULL_TREE);
12896       def_builtin (MASK_VSX, "__builtin_vec_init_v2di", ftype,
12897                    VSX_BUILTIN_VEC_INIT_V2DI);
12898     }
12899
12900   /* Access to the vec_set patterns.  */
12901   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
12902                                     intSI_type_node,
12903                                     integer_type_node, NULL_TREE);
12904   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v4si", ftype,
12905                ALTIVEC_BUILTIN_VEC_SET_V4SI);
12906
12907   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
12908                                     intHI_type_node,
12909                                     integer_type_node, NULL_TREE);
12910   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v8hi", ftype,
12911                ALTIVEC_BUILTIN_VEC_SET_V8HI);
12912
12913   ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
12914                                     intQI_type_node,
12915                                     integer_type_node, NULL_TREE);
12916   def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v16qi", ftype,
12917                ALTIVEC_BUILTIN_VEC_SET_V16QI);
12918
12919   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
12920                                     float_type_node,
12921                                     integer_type_node, NULL_TREE);
12922   def_builtin (MASK_ALTIVEC|MASK_VSX, "__builtin_vec_set_v4sf", ftype,
12923                ALTIVEC_BUILTIN_VEC_SET_V4SF);
12924
12925   if (TARGET_VSX)
12926     {
12927       ftype = build_function_type_list (V2DF_type_node, V2DF_type_node,
12928                                         double_type_node,
12929                                         integer_type_node, NULL_TREE);
12930       def_builtin (MASK_VSX, "__builtin_vec_set_v2df", ftype,
12931                    VSX_BUILTIN_VEC_SET_V2DF);
12932
12933       ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
12934                                         intDI_type_node,
12935                                         integer_type_node, NULL_TREE);
12936       def_builtin (MASK_VSX, "__builtin_vec_set_v2di", ftype,
12937                    VSX_BUILTIN_VEC_SET_V2DI);
12938     }
12939
12940   /* Access to the vec_extract patterns.  */
12941   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
12942                                     integer_type_node, NULL_TREE);
12943   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v4si", ftype,
12944                ALTIVEC_BUILTIN_VEC_EXT_V4SI);
12945
12946   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
12947                                     integer_type_node, NULL_TREE);
12948   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v8hi", ftype,
12949                ALTIVEC_BUILTIN_VEC_EXT_V8HI);
12950
12951   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
12952                                     integer_type_node, NULL_TREE);
12953   def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v16qi", ftype,
12954                ALTIVEC_BUILTIN_VEC_EXT_V16QI);
12955
12956   ftype = build_function_type_list (float_type_node, V4SF_type_node,
12957                                     integer_type_node, NULL_TREE);
12958   def_builtin (MASK_ALTIVEC|MASK_VSX, "__builtin_vec_ext_v4sf", ftype,
12959                ALTIVEC_BUILTIN_VEC_EXT_V4SF);
12960
12961   if (TARGET_VSX)
12962     {
12963       ftype = build_function_type_list (double_type_node, V2DF_type_node,
12964                                         integer_type_node, NULL_TREE);
12965       def_builtin (MASK_VSX, "__builtin_vec_ext_v2df", ftype,
12966                    VSX_BUILTIN_VEC_EXT_V2DF);
12967
12968       ftype = build_function_type_list (intDI_type_node, V2DI_type_node,
12969                                         integer_type_node, NULL_TREE);
12970       def_builtin (MASK_VSX, "__builtin_vec_ext_v2di", ftype,
12971                    VSX_BUILTIN_VEC_EXT_V2DI);
12972     }
12973 }
12974
12975 /* Hash function for builtin functions with up to 3 arguments and a return
12976    type.  */
12977 static unsigned
12978 builtin_hash_function (const void *hash_entry)
12979 {
12980   unsigned ret = 0;
12981   int i;
12982   const struct builtin_hash_struct *bh =
12983     (const struct builtin_hash_struct *) hash_entry;
12984
12985   for (i = 0; i < 4; i++)
12986     {
12987       ret = (ret * (unsigned)MAX_MACHINE_MODE) + ((unsigned)bh->mode[i]);
12988       ret = (ret * 2) + bh->uns_p[i];
12989     }
12990
12991   return ret;
12992 }
12993
12994 /* Compare builtin hash entries H1 and H2 for equivalence.  */
12995 static int
12996 builtin_hash_eq (const void *h1, const void *h2)
12997 {
12998   const struct builtin_hash_struct *p1 = (const struct builtin_hash_struct *) h1;
12999   const struct builtin_hash_struct *p2 = (const struct builtin_hash_struct *) h2;
13000
13001   return ((p1->mode[0] == p2->mode[0])
13002           && (p1->mode[1] == p2->mode[1])
13003           && (p1->mode[2] == p2->mode[2])
13004           && (p1->mode[3] == p2->mode[3])
13005           && (p1->uns_p[0] == p2->uns_p[0])
13006           && (p1->uns_p[1] == p2->uns_p[1])
13007           && (p1->uns_p[2] == p2->uns_p[2])
13008           && (p1->uns_p[3] == p2->uns_p[3]));
13009 }
13010
13011 /* Map types for builtin functions with an explicit return type and up to 3
13012    arguments.  Functions with fewer than 3 arguments use VOIDmode as the type
13013    of the argument.  */
13014 static tree
13015 builtin_function_type (enum machine_mode mode_ret, enum machine_mode mode_arg0,
13016                        enum machine_mode mode_arg1, enum machine_mode mode_arg2,
13017                        enum rs6000_builtins builtin, const char *name)
13018 {
13019   struct builtin_hash_struct h;
13020   struct builtin_hash_struct *h2;
13021   void **found;
13022   int num_args = 3;
13023   int i;
13024   tree ret_type = NULL_TREE;
13025   tree arg_type[3] = { NULL_TREE, NULL_TREE, NULL_TREE };
13026
13027   /* Create builtin_hash_table.  */
13028   if (builtin_hash_table == NULL)
13029     builtin_hash_table = htab_create_ggc (1500, builtin_hash_function,
13030                                           builtin_hash_eq, NULL);
13031
13032   h.type = NULL_TREE;
13033   h.mode[0] = mode_ret;
13034   h.mode[1] = mode_arg0;
13035   h.mode[2] = mode_arg1;
13036   h.mode[3] = mode_arg2;
13037   h.uns_p[0] = 0;
13038   h.uns_p[1] = 0;
13039   h.uns_p[2] = 0;
13040   h.uns_p[3] = 0;
13041
13042   /* If the builtin is a type that produces unsigned results or takes unsigned
13043      arguments, and it is returned as a decl for the vectorizer (such as
13044      widening multiplies, permute), make sure the arguments and return value
13045      are type correct.  */
13046   switch (builtin)
13047     {
13048       /* unsigned 2 argument functions.  */
13049     case ALTIVEC_BUILTIN_VMULEUB_UNS:
13050     case ALTIVEC_BUILTIN_VMULEUH_UNS:
13051     case ALTIVEC_BUILTIN_VMULOUB_UNS:
13052     case ALTIVEC_BUILTIN_VMULOUH_UNS:
13053       h.uns_p[0] = 1;
13054       h.uns_p[1] = 1;
13055       h.uns_p[2] = 1;
13056       break;
13057
13058       /* unsigned 3 argument functions.  */
13059     case ALTIVEC_BUILTIN_VPERM_16QI_UNS:
13060     case ALTIVEC_BUILTIN_VPERM_8HI_UNS:
13061     case ALTIVEC_BUILTIN_VPERM_4SI_UNS:
13062     case ALTIVEC_BUILTIN_VPERM_2DI_UNS:
13063     case ALTIVEC_BUILTIN_VSEL_16QI_UNS:
13064     case ALTIVEC_BUILTIN_VSEL_8HI_UNS:
13065     case ALTIVEC_BUILTIN_VSEL_4SI_UNS:
13066     case ALTIVEC_BUILTIN_VSEL_2DI_UNS:
13067     case VSX_BUILTIN_VPERM_16QI_UNS:
13068     case VSX_BUILTIN_VPERM_8HI_UNS:
13069     case VSX_BUILTIN_VPERM_4SI_UNS:
13070     case VSX_BUILTIN_VPERM_2DI_UNS:
13071     case VSX_BUILTIN_XXSEL_16QI_UNS:
13072     case VSX_BUILTIN_XXSEL_8HI_UNS:
13073     case VSX_BUILTIN_XXSEL_4SI_UNS:
13074     case VSX_BUILTIN_XXSEL_2DI_UNS:
13075       h.uns_p[0] = 1;
13076       h.uns_p[1] = 1;
13077       h.uns_p[2] = 1;
13078       h.uns_p[3] = 1;
13079       break;
13080
13081       /* signed permute functions with unsigned char mask.  */
13082     case ALTIVEC_BUILTIN_VPERM_16QI:
13083     case ALTIVEC_BUILTIN_VPERM_8HI:
13084     case ALTIVEC_BUILTIN_VPERM_4SI:
13085     case ALTIVEC_BUILTIN_VPERM_4SF:
13086     case ALTIVEC_BUILTIN_VPERM_2DI:
13087     case ALTIVEC_BUILTIN_VPERM_2DF:
13088     case VSX_BUILTIN_VPERM_16QI:
13089     case VSX_BUILTIN_VPERM_8HI:
13090     case VSX_BUILTIN_VPERM_4SI:
13091     case VSX_BUILTIN_VPERM_4SF:
13092     case VSX_BUILTIN_VPERM_2DI:
13093     case VSX_BUILTIN_VPERM_2DF:
13094       h.uns_p[3] = 1;
13095       break;
13096
13097       /* unsigned args, signed return.  */
13098     case VSX_BUILTIN_XVCVUXDDP_UNS:
13099     case VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF:
13100       h.uns_p[1] = 1;
13101       break;
13102
13103       /* signed args, unsigned return.  */
13104     case VSX_BUILTIN_XVCVDPUXDS_UNS:
13105     case VECTOR_BUILTIN_FIXUNS_V4SF_V4SI:
13106       h.uns_p[0] = 1;
13107       break;
13108
13109     default:
13110       break;
13111     }
13112
13113   /* Figure out how many args are present.  */
13114   while (num_args > 0 && h.mode[num_args] == VOIDmode)
13115     num_args--;
13116
13117   if (num_args == 0)
13118     fatal_error ("internal error: builtin function %s had no type", name);
13119
13120   ret_type = builtin_mode_to_type[h.mode[0]][h.uns_p[0]];
13121   if (!ret_type && h.uns_p[0])
13122     ret_type = builtin_mode_to_type[h.mode[0]][0];
13123
13124   if (!ret_type)
13125     fatal_error ("internal error: builtin function %s had an unexpected "
13126                  "return type %s", name, GET_MODE_NAME (h.mode[0]));
13127
13128   for (i = 0; i < (int) ARRAY_SIZE (arg_type); i++)
13129     arg_type[i] = NULL_TREE;
13130
13131   for (i = 0; i < num_args; i++)
13132     {
13133       int m = (int) h.mode[i+1];
13134       int uns_p = h.uns_p[i+1];
13135
13136       arg_type[i] = builtin_mode_to_type[m][uns_p];
13137       if (!arg_type[i] && uns_p)
13138         arg_type[i] = builtin_mode_to_type[m][0];
13139
13140       if (!arg_type[i])
13141         fatal_error ("internal error: builtin function %s, argument %d "
13142                      "had unexpected argument type %s", name, i,
13143                      GET_MODE_NAME (m));
13144     }
13145
13146   found = htab_find_slot (builtin_hash_table, &h, INSERT);
13147   if (*found == NULL)
13148     {
13149       h2 = ggc_alloc_builtin_hash_struct ();
13150       *h2 = h;
13151       *found = (void *)h2;
13152
13153       h2->type = build_function_type_list (ret_type, arg_type[0], arg_type[1],
13154                                            arg_type[2], NULL_TREE);
13155     }
13156
13157   return ((struct builtin_hash_struct *)(*found))->type;
13158 }
13159
13160 static void
13161 rs6000_common_init_builtins (void)
13162 {
13163   const struct builtin_description *d;
13164   size_t i;
13165
13166   tree opaque_ftype_opaque = NULL_TREE;
13167   tree opaque_ftype_opaque_opaque = NULL_TREE;
13168   tree opaque_ftype_opaque_opaque_opaque = NULL_TREE;
13169   tree v2si_ftype_qi = NULL_TREE;
13170   tree v2si_ftype_v2si_qi = NULL_TREE;
13171   tree v2si_ftype_int_qi = NULL_TREE;
13172
13173   if (!TARGET_PAIRED_FLOAT)
13174     {
13175       builtin_mode_to_type[V2SImode][0] = opaque_V2SI_type_node;
13176       builtin_mode_to_type[V2SFmode][0] = opaque_V2SF_type_node;
13177     }
13178
13179   /* Add the ternary operators.  */
13180   d = bdesc_3arg;
13181   for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
13182     {
13183       tree type;
13184       int mask = d->mask;
13185
13186       if ((mask != 0 && (mask & target_flags) == 0)
13187           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13188         continue;
13189
13190       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13191            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13192           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13193               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13194         {
13195           if (! (type = opaque_ftype_opaque_opaque_opaque))
13196             type = opaque_ftype_opaque_opaque_opaque
13197               = build_function_type_list (opaque_V4SI_type_node,
13198                                           opaque_V4SI_type_node,
13199                                           opaque_V4SI_type_node,
13200                                           opaque_V4SI_type_node,
13201                                           NULL_TREE);
13202         }
13203       else
13204         {
13205           enum insn_code icode = d->icode;
13206           if (d->name == 0 || icode == CODE_FOR_nothing)
13207             continue;
13208
13209           type = builtin_function_type (insn_data[icode].operand[0].mode,
13210                                         insn_data[icode].operand[1].mode,
13211                                         insn_data[icode].operand[2].mode,
13212                                         insn_data[icode].operand[3].mode,
13213                                         d->code, d->name);
13214         }
13215
13216       def_builtin (d->mask, d->name, type, d->code);
13217     }
13218
13219   /* Add the binary operators.  */
13220   d = bdesc_2arg;
13221   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
13222     {
13223       enum machine_mode mode0, mode1, mode2;
13224       tree type;
13225       int mask = d->mask;
13226
13227       if ((mask != 0 && (mask & target_flags) == 0)
13228           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13229         continue;
13230
13231       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13232            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13233           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13234               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13235         {
13236           if (! (type = opaque_ftype_opaque_opaque))
13237             type = opaque_ftype_opaque_opaque
13238               = build_function_type_list (opaque_V4SI_type_node,
13239                                           opaque_V4SI_type_node,
13240                                           opaque_V4SI_type_node,
13241                                           NULL_TREE);
13242         }
13243       else
13244         {
13245           enum insn_code icode = d->icode;
13246           if (d->name == 0 || icode == CODE_FOR_nothing)
13247             continue;
13248
13249           mode0 = insn_data[icode].operand[0].mode;
13250           mode1 = insn_data[icode].operand[1].mode;
13251           mode2 = insn_data[icode].operand[2].mode;
13252
13253           if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
13254             {
13255               if (! (type = v2si_ftype_v2si_qi))
13256                 type = v2si_ftype_v2si_qi
13257                   = build_function_type_list (opaque_V2SI_type_node,
13258                                               opaque_V2SI_type_node,
13259                                               char_type_node,
13260                                               NULL_TREE);
13261             }
13262
13263           else if (mode0 == V2SImode && GET_MODE_CLASS (mode1) == MODE_INT
13264                    && mode2 == QImode)
13265             {
13266               if (! (type = v2si_ftype_int_qi))
13267                 type = v2si_ftype_int_qi
13268                   = build_function_type_list (opaque_V2SI_type_node,
13269                                               integer_type_node,
13270                                               char_type_node,
13271                                               NULL_TREE);
13272             }
13273
13274           else
13275             type = builtin_function_type (mode0, mode1, mode2, VOIDmode,
13276                                           d->code, d->name);
13277         }
13278
13279       def_builtin (d->mask, d->name, type, d->code);
13280     }
13281
13282   /* Add the simple unary operators.  */
13283   d = (struct builtin_description *) bdesc_1arg;
13284   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
13285     {
13286       enum machine_mode mode0, mode1;
13287       tree type;
13288       int mask = d->mask;
13289
13290       if ((mask != 0 && (mask & target_flags) == 0)
13291           || (mask == 0 && !TARGET_PAIRED_FLOAT))
13292         continue;
13293
13294       if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13295            && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13296           || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13297               && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13298         {
13299           if (! (type = opaque_ftype_opaque))
13300             type = opaque_ftype_opaque
13301               = build_function_type_list (opaque_V4SI_type_node,
13302                                           opaque_V4SI_type_node,
13303                                           NULL_TREE);
13304         }
13305       else
13306         {
13307           enum insn_code icode = d->icode;
13308           if (d->name == 0 || icode == CODE_FOR_nothing)
13309             continue;
13310
13311           mode0 = insn_data[icode].operand[0].mode;
13312           mode1 = insn_data[icode].operand[1].mode;
13313
13314           if (mode0 == V2SImode && mode1 == QImode)
13315             {
13316               if (! (type = v2si_ftype_qi))
13317                 type = v2si_ftype_qi
13318                   = build_function_type_list (opaque_V2SI_type_node,
13319                                               char_type_node,
13320                                               NULL_TREE);
13321             }
13322
13323           else
13324             type = builtin_function_type (mode0, mode1, VOIDmode, VOIDmode,
13325                                           d->code, d->name);
13326         }
13327
13328       def_builtin (d->mask, d->name, type, d->code);
13329     }
13330 }
13331
13332 static void
13333 rs6000_init_libfuncs (void)
13334 {
13335   if (DEFAULT_ABI != ABI_V4 && TARGET_XCOFF
13336       && !TARGET_POWER2 && !TARGET_POWERPC)
13337     {
13338       /* AIX library routines for float->int conversion.  */
13339       set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc");
13340       set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc");
13341       set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc");
13342       set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc");
13343     }
13344
13345   if (!TARGET_IEEEQUAD)
13346       /* AIX/Darwin/64-bit Linux quad floating point routines.  */
13347     if (!TARGET_XL_COMPAT)
13348       {
13349         set_optab_libfunc (add_optab, TFmode, "__gcc_qadd");
13350         set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
13351         set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
13352         set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
13353
13354         if (!(TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)))
13355           {
13356             set_optab_libfunc (neg_optab, TFmode, "__gcc_qneg");
13357             set_optab_libfunc (eq_optab, TFmode, "__gcc_qeq");
13358             set_optab_libfunc (ne_optab, TFmode, "__gcc_qne");
13359             set_optab_libfunc (gt_optab, TFmode, "__gcc_qgt");
13360             set_optab_libfunc (ge_optab, TFmode, "__gcc_qge");
13361             set_optab_libfunc (lt_optab, TFmode, "__gcc_qlt");
13362             set_optab_libfunc (le_optab, TFmode, "__gcc_qle");
13363
13364             set_conv_libfunc (sext_optab, TFmode, SFmode, "__gcc_stoq");
13365             set_conv_libfunc (sext_optab, TFmode, DFmode, "__gcc_dtoq");
13366             set_conv_libfunc (trunc_optab, SFmode, TFmode, "__gcc_qtos");
13367             set_conv_libfunc (trunc_optab, DFmode, TFmode, "__gcc_qtod");
13368             set_conv_libfunc (sfix_optab, SImode, TFmode, "__gcc_qtoi");
13369             set_conv_libfunc (ufix_optab, SImode, TFmode, "__gcc_qtou");
13370             set_conv_libfunc (sfloat_optab, TFmode, SImode, "__gcc_itoq");
13371             set_conv_libfunc (ufloat_optab, TFmode, SImode, "__gcc_utoq");
13372           }
13373
13374         if (!(TARGET_HARD_FLOAT && TARGET_FPRS))
13375           set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord");
13376       }
13377     else
13378       {
13379         set_optab_libfunc (add_optab, TFmode, "_xlqadd");
13380         set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
13381         set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
13382         set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
13383       }
13384   else
13385     {
13386       /* 32-bit SVR4 quad floating point routines.  */
13387
13388       set_optab_libfunc (add_optab, TFmode, "_q_add");
13389       set_optab_libfunc (sub_optab, TFmode, "_q_sub");
13390       set_optab_libfunc (neg_optab, TFmode, "_q_neg");
13391       set_optab_libfunc (smul_optab, TFmode, "_q_mul");
13392       set_optab_libfunc (sdiv_optab, TFmode, "_q_div");
13393       if (TARGET_PPC_GPOPT || TARGET_POWER2)
13394         set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
13395
13396       set_optab_libfunc (eq_optab, TFmode, "_q_feq");
13397       set_optab_libfunc (ne_optab, TFmode, "_q_fne");
13398       set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
13399       set_optab_libfunc (ge_optab, TFmode, "_q_fge");
13400       set_optab_libfunc (lt_optab, TFmode, "_q_flt");
13401       set_optab_libfunc (le_optab, TFmode, "_q_fle");
13402
13403       set_conv_libfunc (sext_optab, TFmode, SFmode, "_q_stoq");
13404       set_conv_libfunc (sext_optab, TFmode, DFmode, "_q_dtoq");
13405       set_conv_libfunc (trunc_optab, SFmode, TFmode, "_q_qtos");
13406       set_conv_libfunc (trunc_optab, DFmode, TFmode, "_q_qtod");
13407       set_conv_libfunc (sfix_optab, SImode, TFmode, "_q_qtoi");
13408       set_conv_libfunc (ufix_optab, SImode, TFmode, "_q_qtou");
13409       set_conv_libfunc (sfloat_optab, TFmode, SImode, "_q_itoq");
13410       set_conv_libfunc (ufloat_optab, TFmode, SImode, "_q_utoq");
13411     }
13412 }
13413
13414 \f
13415 /* Expand a block clear operation, and return 1 if successful.  Return 0
13416    if we should let the compiler generate normal code.
13417
13418    operands[0] is the destination
13419    operands[1] is the length
13420    operands[3] is the alignment */
13421
13422 int
13423 expand_block_clear (rtx operands[])
13424 {
13425   rtx orig_dest = operands[0];
13426   rtx bytes_rtx = operands[1];
13427   rtx align_rtx = operands[3];
13428   bool constp   = (GET_CODE (bytes_rtx) == CONST_INT);
13429   HOST_WIDE_INT align;
13430   HOST_WIDE_INT bytes;
13431   int offset;
13432   int clear_bytes;
13433   int clear_step;
13434
13435   /* If this is not a fixed size move, just call memcpy */
13436   if (! constp)
13437     return 0;
13438
13439   /* This must be a fixed size alignment  */
13440   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
13441   align = INTVAL (align_rtx) * BITS_PER_UNIT;
13442
13443   /* Anything to clear? */
13444   bytes = INTVAL (bytes_rtx);
13445   if (bytes <= 0)
13446     return 1;
13447
13448   /* Use the builtin memset after a point, to avoid huge code bloat.
13449      When optimize_size, avoid any significant code bloat; calling
13450      memset is about 4 instructions, so allow for one instruction to
13451      load zero and three to do clearing.  */
13452   if (TARGET_ALTIVEC && align >= 128)
13453     clear_step = 16;
13454   else if (TARGET_POWERPC64 && align >= 32)
13455     clear_step = 8;
13456   else if (TARGET_SPE && align >= 64)
13457     clear_step = 8;
13458   else
13459     clear_step = 4;
13460
13461   if (optimize_size && bytes > 3 * clear_step)
13462     return 0;
13463   if (! optimize_size && bytes > 8 * clear_step)
13464     return 0;
13465
13466   for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes)
13467     {
13468       enum machine_mode mode = BLKmode;
13469       rtx dest;
13470
13471       if (bytes >= 16 && TARGET_ALTIVEC && align >= 128)
13472         {
13473           clear_bytes = 16;
13474           mode = V4SImode;
13475         }
13476       else if (bytes >= 8 && TARGET_SPE && align >= 64)
13477         {
13478           clear_bytes = 8;
13479           mode = V2SImode;
13480         }
13481       else if (bytes >= 8 && TARGET_POWERPC64
13482                /* 64-bit loads and stores require word-aligned
13483                   displacements.  */
13484                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
13485         {
13486           clear_bytes = 8;
13487           mode = DImode;
13488         }
13489       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
13490         {                       /* move 4 bytes */
13491           clear_bytes = 4;
13492           mode = SImode;
13493         }
13494       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
13495         {                       /* move 2 bytes */
13496           clear_bytes = 2;
13497           mode = HImode;
13498         }
13499       else /* move 1 byte at a time */
13500         {
13501           clear_bytes = 1;
13502           mode = QImode;
13503         }
13504
13505       dest = adjust_address (orig_dest, mode, offset);
13506
13507       emit_move_insn (dest, CONST0_RTX (mode));
13508     }
13509
13510   return 1;
13511 }
13512
13513 \f
13514 /* Expand a block move operation, and return 1 if successful.  Return 0
13515    if we should let the compiler generate normal code.
13516
13517    operands[0] is the destination
13518    operands[1] is the source
13519    operands[2] is the length
13520    operands[3] is the alignment */
13521
13522 #define MAX_MOVE_REG 4
13523
13524 int
13525 expand_block_move (rtx operands[])
13526 {
13527   rtx orig_dest = operands[0];
13528   rtx orig_src  = operands[1];
13529   rtx bytes_rtx = operands[2];
13530   rtx align_rtx = operands[3];
13531   int constp    = (GET_CODE (bytes_rtx) == CONST_INT);
13532   int align;
13533   int bytes;
13534   int offset;
13535   int move_bytes;
13536   rtx stores[MAX_MOVE_REG];
13537   int num_reg = 0;
13538
13539   /* If this is not a fixed size move, just call memcpy */
13540   if (! constp)
13541     return 0;
13542
13543   /* This must be a fixed size alignment */
13544   gcc_assert (GET_CODE (align_rtx) == CONST_INT);
13545   align = INTVAL (align_rtx) * BITS_PER_UNIT;
13546
13547   /* Anything to move? */
13548   bytes = INTVAL (bytes_rtx);
13549   if (bytes <= 0)
13550     return 1;
13551
13552   if (bytes > rs6000_block_move_inline_limit)
13553     return 0;
13554
13555   for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
13556     {
13557       union {
13558         rtx (*movmemsi) (rtx, rtx, rtx, rtx);
13559         rtx (*mov) (rtx, rtx);
13560       } gen_func;
13561       enum machine_mode mode = BLKmode;
13562       rtx src, dest;
13563
13564       /* Altivec first, since it will be faster than a string move
13565          when it applies, and usually not significantly larger.  */
13566       if (TARGET_ALTIVEC && bytes >= 16 && align >= 128)
13567         {
13568           move_bytes = 16;
13569           mode = V4SImode;
13570           gen_func.mov = gen_movv4si;
13571         }
13572       else if (TARGET_SPE && bytes >= 8 && align >= 64)
13573         {
13574           move_bytes = 8;
13575           mode = V2SImode;
13576           gen_func.mov = gen_movv2si;
13577         }
13578       else if (TARGET_STRING
13579           && bytes > 24         /* move up to 32 bytes at a time */
13580           && ! fixed_regs[5]
13581           && ! fixed_regs[6]
13582           && ! fixed_regs[7]
13583           && ! fixed_regs[8]
13584           && ! fixed_regs[9]
13585           && ! fixed_regs[10]
13586           && ! fixed_regs[11]
13587           && ! fixed_regs[12])
13588         {
13589           move_bytes = (bytes > 32) ? 32 : bytes;
13590           gen_func.movmemsi = gen_movmemsi_8reg;
13591         }
13592       else if (TARGET_STRING
13593                && bytes > 16    /* move up to 24 bytes at a time */
13594                && ! fixed_regs[5]
13595                && ! fixed_regs[6]
13596                && ! fixed_regs[7]
13597                && ! fixed_regs[8]
13598                && ! fixed_regs[9]
13599                && ! fixed_regs[10])
13600         {
13601           move_bytes = (bytes > 24) ? 24 : bytes;
13602           gen_func.movmemsi = gen_movmemsi_6reg;
13603         }
13604       else if (TARGET_STRING
13605                && bytes > 8     /* move up to 16 bytes at a time */
13606                && ! fixed_regs[5]
13607                && ! fixed_regs[6]
13608                && ! fixed_regs[7]
13609                && ! fixed_regs[8])
13610         {
13611           move_bytes = (bytes > 16) ? 16 : bytes;
13612           gen_func.movmemsi = gen_movmemsi_4reg;
13613         }
13614       else if (bytes >= 8 && TARGET_POWERPC64
13615                /* 64-bit loads and stores require word-aligned
13616                   displacements.  */
13617                && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
13618         {
13619           move_bytes = 8;
13620           mode = DImode;
13621           gen_func.mov = gen_movdi;
13622         }
13623       else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
13624         {                       /* move up to 8 bytes at a time */
13625           move_bytes = (bytes > 8) ? 8 : bytes;
13626           gen_func.movmemsi = gen_movmemsi_2reg;
13627         }
13628       else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
13629         {                       /* move 4 bytes */
13630           move_bytes = 4;
13631           mode = SImode;
13632           gen_func.mov = gen_movsi;
13633         }
13634       else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
13635         {                       /* move 2 bytes */
13636           move_bytes = 2;
13637           mode = HImode;
13638           gen_func.mov = gen_movhi;
13639         }
13640       else if (TARGET_STRING && bytes > 1)
13641         {                       /* move up to 4 bytes at a time */
13642           move_bytes = (bytes > 4) ? 4 : bytes;
13643           gen_func.movmemsi = gen_movmemsi_1reg;
13644         }
13645       else /* move 1 byte at a time */
13646         {
13647           move_bytes = 1;
13648           mode = QImode;
13649           gen_func.mov = gen_movqi;
13650         }
13651
13652       src = adjust_address (orig_src, mode, offset);
13653       dest = adjust_address (orig_dest, mode, offset);
13654
13655       if (mode != BLKmode)
13656         {
13657           rtx tmp_reg = gen_reg_rtx (mode);
13658
13659           emit_insn ((*gen_func.mov) (tmp_reg, src));
13660           stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
13661         }
13662
13663       if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
13664         {
13665           int i;
13666           for (i = 0; i < num_reg; i++)
13667             emit_insn (stores[i]);
13668           num_reg = 0;
13669         }
13670
13671       if (mode == BLKmode)
13672         {
13673           /* Move the address into scratch registers.  The movmemsi
13674              patterns require zero offset.  */
13675           if (!REG_P (XEXP (src, 0)))
13676             {
13677               rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
13678               src = replace_equiv_address (src, src_reg);
13679             }
13680           set_mem_size (src, move_bytes);
13681
13682           if (!REG_P (XEXP (dest, 0)))
13683             {
13684               rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
13685               dest = replace_equiv_address (dest, dest_reg);
13686             }
13687           set_mem_size (dest, move_bytes);
13688
13689           emit_insn ((*gen_func.movmemsi) (dest, src,
13690                                            GEN_INT (move_bytes & 31),
13691                                            align_rtx));
13692         }
13693     }
13694
13695   return 1;
13696 }
13697
13698 \f
13699 /* Return a string to perform a load_multiple operation.
13700    operands[0] is the vector.
13701    operands[1] is the source address.
13702    operands[2] is the first destination register.  */
13703
13704 const char *
13705 rs6000_output_load_multiple (rtx operands[3])
13706 {
13707   /* We have to handle the case where the pseudo used to contain the address
13708      is assigned to one of the output registers.  */
13709   int i, j;
13710   int words = XVECLEN (operands[0], 0);
13711   rtx xop[10];
13712
13713   if (XVECLEN (operands[0], 0) == 1)
13714     return "{l|lwz} %2,0(%1)";
13715
13716   for (i = 0; i < words; i++)
13717     if (refers_to_regno_p (REGNO (operands[2]) + i,
13718                            REGNO (operands[2]) + i + 1, operands[1], 0))
13719       {
13720         if (i == words-1)
13721           {
13722             xop[0] = GEN_INT (4 * (words-1));
13723             xop[1] = operands[1];
13724             xop[2] = operands[2];
13725             output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
13726             return "";
13727           }
13728         else if (i == 0)
13729           {
13730             xop[0] = GEN_INT (4 * (words-1));
13731             xop[1] = operands[1];
13732             xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
13733             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);
13734             return "";
13735           }
13736         else
13737           {
13738             for (j = 0; j < words; j++)
13739               if (j != i)
13740                 {
13741                   xop[0] = GEN_INT (j * 4);
13742                   xop[1] = operands[1];
13743                   xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
13744                   output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
13745                 }
13746             xop[0] = GEN_INT (i * 4);
13747             xop[1] = operands[1];
13748             output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
13749             return "";
13750           }
13751       }
13752
13753   return "{lsi|lswi} %2,%1,%N0";
13754 }
13755
13756 \f
13757 /* A validation routine: say whether CODE, a condition code, and MODE
13758    match.  The other alternatives either don't make sense or should
13759    never be generated.  */
13760
13761 void
13762 validate_condition_mode (enum rtx_code code, enum machine_mode mode)
13763 {
13764   gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
13765                || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
13766               && GET_MODE_CLASS (mode) == MODE_CC);
13767
13768   /* These don't make sense.  */
13769   gcc_assert ((code != GT && code != LT && code != GE && code != LE)
13770               || mode != CCUNSmode);
13771
13772   gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
13773               || mode == CCUNSmode);
13774
13775   gcc_assert (mode == CCFPmode
13776               || (code != ORDERED && code != UNORDERED
13777                   && code != UNEQ && code != LTGT
13778                   && code != UNGT && code != UNLT
13779                   && code != UNGE && code != UNLE));
13780
13781   /* These should never be generated except for
13782      flag_finite_math_only.  */
13783   gcc_assert (mode != CCFPmode
13784               || flag_finite_math_only
13785               || (code != LE && code != GE
13786                   && code != UNEQ && code != LTGT
13787                   && code != UNGT && code != UNLT));
13788
13789   /* These are invalid; the information is not there.  */
13790   gcc_assert (mode != CCEQmode || code == EQ || code == NE);
13791 }
13792
13793 \f
13794 /* Return 1 if ANDOP is a mask that has no bits on that are not in the
13795    mask required to convert the result of a rotate insn into a shift
13796    left insn of SHIFTOP bits.  Both are known to be SImode CONST_INT.  */
13797
13798 int
13799 includes_lshift_p (rtx shiftop, rtx andop)
13800 {
13801   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
13802
13803   shift_mask <<= INTVAL (shiftop);
13804
13805   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
13806 }
13807
13808 /* Similar, but for right shift.  */
13809
13810 int
13811 includes_rshift_p (rtx shiftop, rtx andop)
13812 {
13813   unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
13814
13815   shift_mask >>= INTVAL (shiftop);
13816
13817   return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
13818 }
13819
13820 /* Return 1 if ANDOP is a mask suitable for use with an rldic insn
13821    to perform a left shift.  It must have exactly SHIFTOP least
13822    significant 0's, then one or more 1's, then zero or more 0's.  */
13823
13824 int
13825 includes_rldic_lshift_p (rtx shiftop, rtx andop)
13826 {
13827   if (GET_CODE (andop) == CONST_INT)
13828     {
13829       HOST_WIDE_INT c, lsb, shift_mask;
13830
13831       c = INTVAL (andop);
13832       if (c == 0 || c == ~0)
13833         return 0;
13834
13835       shift_mask = ~0;
13836       shift_mask <<= INTVAL (shiftop);
13837
13838       /* Find the least significant one bit.  */
13839       lsb = c & -c;
13840
13841       /* It must coincide with the LSB of the shift mask.  */
13842       if (-lsb != shift_mask)
13843         return 0;
13844
13845       /* Invert to look for the next transition (if any).  */
13846       c = ~c;
13847
13848       /* Remove the low group of ones (originally low group of zeros).  */
13849       c &= -lsb;
13850
13851       /* Again find the lsb, and check we have all 1's above.  */
13852       lsb = c & -c;
13853       return c == -lsb;
13854     }
13855   else if (GET_CODE (andop) == CONST_DOUBLE
13856            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
13857     {
13858       HOST_WIDE_INT low, high, lsb;
13859       HOST_WIDE_INT shift_mask_low, shift_mask_high;
13860
13861       low = CONST_DOUBLE_LOW (andop);
13862       if (HOST_BITS_PER_WIDE_INT < 64)
13863         high = CONST_DOUBLE_HIGH (andop);
13864
13865       if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
13866           || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
13867         return 0;
13868
13869       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
13870         {
13871           shift_mask_high = ~0;
13872           if (INTVAL (shiftop) > 32)
13873             shift_mask_high <<= INTVAL (shiftop) - 32;
13874
13875           lsb = high & -high;
13876
13877           if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
13878             return 0;
13879
13880           high = ~high;
13881           high &= -lsb;
13882
13883           lsb = high & -high;
13884           return high == -lsb;
13885         }
13886
13887       shift_mask_low = ~0;
13888       shift_mask_low <<= INTVAL (shiftop);
13889
13890       lsb = low & -low;
13891
13892       if (-lsb != shift_mask_low)
13893         return 0;
13894
13895       if (HOST_BITS_PER_WIDE_INT < 64)
13896         high = ~high;
13897       low = ~low;
13898       low &= -lsb;
13899
13900       if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
13901         {
13902           lsb = high & -high;
13903           return high == -lsb;
13904         }
13905
13906       lsb = low & -low;
13907       return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
13908     }
13909   else
13910     return 0;
13911 }
13912
13913 /* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
13914    to perform a left shift.  It must have SHIFTOP or more least
13915    significant 0's, with the remainder of the word 1's.  */
13916
13917 int
13918 includes_rldicr_lshift_p (rtx shiftop, rtx andop)
13919 {
13920   if (GET_CODE (andop) == CONST_INT)
13921     {
13922       HOST_WIDE_INT c, lsb, shift_mask;
13923
13924       shift_mask = ~0;
13925       shift_mask <<= INTVAL (shiftop);
13926       c = INTVAL (andop);
13927
13928       /* Find the least significant one bit.  */
13929       lsb = c & -c;
13930
13931       /* It must be covered by the shift mask.
13932          This test also rejects c == 0.  */
13933       if ((lsb & shift_mask) == 0)
13934         return 0;
13935
13936       /* Check we have all 1's above the transition, and reject all 1's.  */
13937       return c == -lsb && lsb != 1;
13938     }
13939   else if (GET_CODE (andop) == CONST_DOUBLE
13940            && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
13941     {
13942       HOST_WIDE_INT low, lsb, shift_mask_low;
13943
13944       low = CONST_DOUBLE_LOW (andop);
13945
13946       if (HOST_BITS_PER_WIDE_INT < 64)
13947         {
13948           HOST_WIDE_INT high, shift_mask_high;
13949
13950           high = CONST_DOUBLE_HIGH (andop);
13951
13952           if (low == 0)
13953             {
13954               shift_mask_high = ~0;
13955               if (INTVAL (shiftop) > 32)
13956                 shift_mask_high <<= INTVAL (shiftop) - 32;
13957
13958               lsb = high & -high;
13959
13960               if ((lsb & shift_mask_high) == 0)
13961                 return 0;
13962
13963               return high == -lsb;
13964             }
13965           if (high != ~0)
13966             return 0;
13967         }
13968
13969       shift_mask_low = ~0;
13970       shift_mask_low <<= INTVAL (shiftop);
13971
13972       lsb = low & -low;
13973
13974       if ((lsb & shift_mask_low) == 0)
13975         return 0;
13976
13977       return low == -lsb && lsb != 1;
13978     }
13979   else
13980     return 0;
13981 }
13982
13983 /* Return 1 if operands will generate a valid arguments to rlwimi
13984 instruction for insert with right shift in 64-bit mode.  The mask may
13985 not start on the first bit or stop on the last bit because wrap-around
13986 effects of instruction do not correspond to semantics of RTL insn.  */
13987
13988 int
13989 insvdi_rshift_rlwimi_p (rtx sizeop, rtx startop, rtx shiftop)
13990 {
13991   if (INTVAL (startop) > 32
13992       && INTVAL (startop) < 64
13993       && INTVAL (sizeop) > 1
13994       && INTVAL (sizeop) + INTVAL (startop) < 64
13995       && INTVAL (shiftop) > 0
13996       && INTVAL (sizeop) + INTVAL (shiftop) < 32
13997       && (64 - (INTVAL (shiftop) & 63)) >= INTVAL (sizeop))
13998     return 1;
13999
14000   return 0;
14001 }
14002
14003 /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
14004    for lfq and stfq insns iff the registers are hard registers.   */
14005
14006 int
14007 registers_ok_for_quad_peep (rtx reg1, rtx reg2)
14008 {
14009   /* We might have been passed a SUBREG.  */
14010   if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
14011     return 0;
14012
14013   /* We might have been passed non floating point registers.  */
14014   if (!FP_REGNO_P (REGNO (reg1))
14015       || !FP_REGNO_P (REGNO (reg2)))
14016     return 0;
14017
14018   return (REGNO (reg1) == REGNO (reg2) - 1);
14019 }
14020
14021 /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
14022    addr1 and addr2 must be in consecutive memory locations
14023    (addr2 == addr1 + 8).  */
14024
14025 int
14026 mems_ok_for_quad_peep (rtx mem1, rtx mem2)
14027 {
14028   rtx addr1, addr2;
14029   unsigned int reg1, reg2;
14030   int offset1, offset2;
14031
14032   /* The mems cannot be volatile.  */
14033   if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
14034     return 0;
14035
14036   addr1 = XEXP (mem1, 0);
14037   addr2 = XEXP (mem2, 0);
14038
14039   /* Extract an offset (if used) from the first addr.  */
14040   if (GET_CODE (addr1) == PLUS)
14041     {
14042       /* If not a REG, return zero.  */
14043       if (GET_CODE (XEXP (addr1, 0)) != REG)
14044         return 0;
14045       else
14046         {
14047           reg1 = REGNO (XEXP (addr1, 0));
14048           /* The offset must be constant!  */
14049           if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
14050             return 0;
14051           offset1 = INTVAL (XEXP (addr1, 1));
14052         }
14053     }
14054   else if (GET_CODE (addr1) != REG)
14055     return 0;
14056   else
14057     {
14058       reg1 = REGNO (addr1);
14059       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
14060       offset1 = 0;
14061     }
14062
14063   /* And now for the second addr.  */
14064   if (GET_CODE (addr2) == PLUS)
14065     {
14066       /* If not a REG, return zero.  */
14067       if (GET_CODE (XEXP (addr2, 0)) != REG)
14068         return 0;
14069       else
14070         {
14071           reg2 = REGNO (XEXP (addr2, 0));
14072           /* The offset must be constant. */
14073           if (GET_CODE (XEXP (addr2, 1)) != CONST_INT)
14074             return 0;
14075           offset2 = INTVAL (XEXP (addr2, 1));
14076         }
14077     }
14078   else if (GET_CODE (addr2) != REG)
14079     return 0;
14080   else
14081     {
14082       reg2 = REGNO (addr2);
14083       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
14084       offset2 = 0;
14085     }
14086
14087   /* Both of these must have the same base register.  */
14088   if (reg1 != reg2)
14089     return 0;
14090
14091   /* The offset for the second addr must be 8 more than the first addr.  */
14092   if (offset2 != offset1 + 8)
14093     return 0;
14094
14095   /* All the tests passed.  addr1 and addr2 are valid for lfq or stfq
14096      instructions.  */
14097   return 1;
14098 }
14099 \f
14100
14101 rtx
14102 rs6000_secondary_memory_needed_rtx (enum machine_mode mode)
14103 {
14104   static bool eliminated = false;
14105   rtx ret;
14106
14107   if (mode != SDmode)
14108     ret = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
14109   else
14110     {
14111       rtx mem = cfun->machine->sdmode_stack_slot;
14112       gcc_assert (mem != NULL_RTX);
14113
14114       if (!eliminated)
14115         {
14116           mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
14117           cfun->machine->sdmode_stack_slot = mem;
14118           eliminated = true;
14119         }
14120       ret = mem;
14121     }
14122
14123   if (TARGET_DEBUG_ADDR)
14124     {
14125       fprintf (stderr, "\nrs6000_secondary_memory_needed_rtx, mode %s, rtx:\n",
14126                GET_MODE_NAME (mode));
14127       if (!ret)
14128         fprintf (stderr, "\tNULL_RTX\n");
14129       else
14130         debug_rtx (ret);
14131     }
14132
14133   return ret;
14134 }
14135
14136 static tree
14137 rs6000_check_sdmode (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
14138 {
14139   /* Don't walk into types.  */
14140   if (*tp == NULL_TREE || *tp == error_mark_node || TYPE_P (*tp))
14141     {
14142       *walk_subtrees = 0;
14143       return NULL_TREE;
14144     }
14145
14146   switch (TREE_CODE (*tp))
14147     {
14148     case VAR_DECL:
14149     case PARM_DECL:
14150     case FIELD_DECL:
14151     case RESULT_DECL:
14152     case SSA_NAME:
14153     case REAL_CST:
14154     case MEM_REF:
14155     case VIEW_CONVERT_EXPR:
14156       if (TYPE_MODE (TREE_TYPE (*tp)) == SDmode)
14157         return *tp;
14158       break;
14159     default:
14160       break;
14161     }
14162
14163   return NULL_TREE;
14164 }
14165
14166 enum reload_reg_type {
14167   GPR_REGISTER_TYPE,
14168   VECTOR_REGISTER_TYPE,
14169   OTHER_REGISTER_TYPE
14170 };
14171
14172 static enum reload_reg_type
14173 rs6000_reload_register_type (enum reg_class rclass)
14174 {
14175   switch (rclass)
14176     {
14177     case GENERAL_REGS:
14178     case BASE_REGS:
14179       return GPR_REGISTER_TYPE;
14180
14181     case FLOAT_REGS:
14182     case ALTIVEC_REGS:
14183     case VSX_REGS:
14184       return VECTOR_REGISTER_TYPE;
14185
14186     default:
14187       return OTHER_REGISTER_TYPE;
14188     }
14189 }
14190
14191 /* Inform reload about cases where moving X with a mode MODE to a register in
14192    RCLASS requires an extra scratch or immediate register.  Return the class
14193    needed for the immediate register.
14194
14195    For VSX and Altivec, we may need a register to convert sp+offset into
14196    reg+sp.
14197
14198    For misaligned 64-bit gpr loads and stores we need a register to
14199    convert an offset address to indirect.  */
14200
14201 static reg_class_t
14202 rs6000_secondary_reload (bool in_p,
14203                          rtx x,
14204                          reg_class_t rclass_i,
14205                          enum machine_mode mode,
14206                          secondary_reload_info *sri)
14207 {
14208   enum reg_class rclass = (enum reg_class) rclass_i;
14209   reg_class_t ret = ALL_REGS;
14210   enum insn_code icode;
14211   bool default_p = false;
14212
14213   sri->icode = CODE_FOR_nothing;
14214
14215   /* Convert vector loads and stores into gprs to use an additional base
14216      register.  */
14217   icode = rs6000_vector_reload[mode][in_p != false];
14218   if (icode != CODE_FOR_nothing)
14219     {
14220       ret = NO_REGS;
14221       sri->icode = CODE_FOR_nothing;
14222       sri->extra_cost = 0;
14223
14224       if (GET_CODE (x) == MEM)
14225         {
14226           rtx addr = XEXP (x, 0);
14227
14228           /* Loads to and stores from gprs can do reg+offset, and wouldn't need
14229              an extra register in that case, but it would need an extra
14230              register if the addressing is reg+reg or (reg+reg)&(-16).  */
14231           if (rclass == GENERAL_REGS || rclass == BASE_REGS)
14232             {
14233               if (!legitimate_indirect_address_p (addr, false)
14234                   && !rs6000_legitimate_offset_address_p (TImode, addr, false))
14235                 {
14236                   sri->icode = icode;
14237                   /* account for splitting the loads, and converting the
14238                      address from reg+reg to reg.  */
14239                   sri->extra_cost = (((TARGET_64BIT) ? 3 : 5)
14240                                      + ((GET_CODE (addr) == AND) ? 1 : 0));
14241                 }
14242             }
14243           /* Loads to and stores from vector registers can only do reg+reg
14244              addressing.  Altivec registers can also do (reg+reg)&(-16).  */
14245           else if (rclass == VSX_REGS || rclass == ALTIVEC_REGS
14246                    || rclass == FLOAT_REGS || rclass == NO_REGS)
14247             {
14248               if (!VECTOR_MEM_ALTIVEC_P (mode)
14249                   && GET_CODE (addr) == AND
14250                   && GET_CODE (XEXP (addr, 1)) == CONST_INT
14251                   && INTVAL (XEXP (addr, 1)) == -16
14252                   && (legitimate_indirect_address_p (XEXP (addr, 0), false)
14253                       || legitimate_indexed_address_p (XEXP (addr, 0), false)))
14254                 {
14255                   sri->icode = icode;
14256                   sri->extra_cost = ((GET_CODE (XEXP (addr, 0)) == PLUS)
14257                                      ? 2 : 1);
14258                 }
14259               else if (!legitimate_indirect_address_p (addr, false)
14260                        && (rclass == NO_REGS
14261                            || !legitimate_indexed_address_p (addr, false)))
14262                 {
14263                   sri->icode = icode;
14264                   sri->extra_cost = 1;
14265                 }
14266               else
14267                 icode = CODE_FOR_nothing;
14268             }
14269           /* Any other loads, including to pseudo registers which haven't been
14270              assigned to a register yet, default to require a scratch
14271              register.  */
14272           else
14273             {
14274               sri->icode = icode;
14275               sri->extra_cost = 2;
14276             }
14277         }
14278       else if (REG_P (x))
14279         {
14280           int regno = true_regnum (x);
14281
14282           icode = CODE_FOR_nothing;
14283           if (regno < 0 || regno >= FIRST_PSEUDO_REGISTER)
14284             default_p = true;
14285           else
14286             {
14287               enum reg_class xclass = REGNO_REG_CLASS (regno);
14288               enum reload_reg_type rtype1 = rs6000_reload_register_type (rclass);
14289               enum reload_reg_type rtype2 = rs6000_reload_register_type (xclass);
14290
14291               /* If memory is needed, use default_secondary_reload to create the
14292                  stack slot.  */
14293               if (rtype1 != rtype2 || rtype1 == OTHER_REGISTER_TYPE)
14294                 default_p = true;
14295               else
14296                 ret = NO_REGS;
14297             }
14298         }
14299       else
14300         default_p = true;
14301     }
14302   else if (TARGET_POWERPC64
14303            && rs6000_reload_register_type (rclass) == GPR_REGISTER_TYPE
14304            && MEM_P (x)
14305            && GET_MODE_SIZE (GET_MODE (x)) >= UNITS_PER_WORD)
14306     {
14307       rtx addr = XEXP (x, 0);
14308
14309       if (GET_CODE (addr) == PRE_MODIFY)
14310         addr = XEXP (addr, 1);
14311       else if (GET_CODE (addr) == LO_SUM
14312                && GET_CODE (XEXP (addr, 0)) == REG
14313                && GET_CODE (XEXP (addr, 1)) == CONST)
14314         addr = XEXP (XEXP (addr, 1), 0);
14315
14316       if (GET_CODE (addr) == PLUS
14317           && GET_CODE (XEXP (addr, 1)) == CONST_INT
14318           && (INTVAL (XEXP (addr, 1)) & 3) != 0)
14319         {
14320           if (in_p)
14321             sri->icode = CODE_FOR_reload_di_load;
14322           else
14323             sri->icode = CODE_FOR_reload_di_store;
14324           sri->extra_cost = 2;
14325           ret = NO_REGS;
14326         }
14327       else
14328         default_p = true;
14329     }
14330   else
14331     default_p = true;
14332
14333   if (default_p)
14334     ret = default_secondary_reload (in_p, x, rclass, mode, sri);
14335
14336   gcc_assert (ret != ALL_REGS);
14337
14338   if (TARGET_DEBUG_ADDR)
14339     {
14340       fprintf (stderr,
14341                "\nrs6000_secondary_reload, return %s, in_p = %s, rclass = %s, "
14342                "mode = %s",
14343                reg_class_names[ret],
14344                in_p ? "true" : "false",
14345                reg_class_names[rclass],
14346                GET_MODE_NAME (mode));
14347
14348       if (default_p)
14349         fprintf (stderr, ", default secondary reload");
14350
14351       if (sri->icode != CODE_FOR_nothing)
14352         fprintf (stderr, ", reload func = %s, extra cost = %d\n",
14353                  insn_data[sri->icode].name, sri->extra_cost);
14354       else
14355         fprintf (stderr, "\n");
14356
14357       debug_rtx (x);
14358     }
14359
14360   return ret;
14361 }
14362
14363 /* Fixup reload addresses for Altivec or VSX loads/stores to change SP+offset
14364    to SP+reg addressing.  */
14365
14366 void
14367 rs6000_secondary_reload_inner (rtx reg, rtx mem, rtx scratch, bool store_p)
14368 {
14369   int regno = true_regnum (reg);
14370   enum machine_mode mode = GET_MODE (reg);
14371   enum reg_class rclass;
14372   rtx addr;
14373   rtx and_op2 = NULL_RTX;
14374   rtx addr_op1;
14375   rtx addr_op2;
14376   rtx scratch_or_premodify = scratch;
14377   rtx and_rtx;
14378   rtx cc_clobber;
14379
14380   if (TARGET_DEBUG_ADDR)
14381     {
14382       fprintf (stderr, "\nrs6000_secondary_reload_inner, type = %s\n",
14383                store_p ? "store" : "load");
14384       fprintf (stderr, "reg:\n");
14385       debug_rtx (reg);
14386       fprintf (stderr, "mem:\n");
14387       debug_rtx (mem);
14388       fprintf (stderr, "scratch:\n");
14389       debug_rtx (scratch);
14390     }
14391
14392   gcc_assert (regno >= 0 && regno < FIRST_PSEUDO_REGISTER);
14393   gcc_assert (GET_CODE (mem) == MEM);
14394   rclass = REGNO_REG_CLASS (regno);
14395   addr = XEXP (mem, 0);
14396
14397   switch (rclass)
14398     {
14399       /* GPRs can handle reg + small constant, all other addresses need to use
14400          the scratch register.  */
14401     case GENERAL_REGS:
14402     case BASE_REGS:
14403       if (GET_CODE (addr) == AND)
14404         {
14405           and_op2 = XEXP (addr, 1);
14406           addr = XEXP (addr, 0);
14407         }
14408
14409       if (GET_CODE (addr) == PRE_MODIFY)
14410         {
14411           scratch_or_premodify = XEXP (addr, 0);
14412           gcc_assert (REG_P (scratch_or_premodify));
14413           gcc_assert (GET_CODE (XEXP (addr, 1)) == PLUS);
14414           addr = XEXP (addr, 1);
14415         }
14416
14417       if (GET_CODE (addr) == PLUS
14418           && (!rs6000_legitimate_offset_address_p (TImode, addr, false)
14419               || and_op2 != NULL_RTX))
14420         {
14421           addr_op1 = XEXP (addr, 0);
14422           addr_op2 = XEXP (addr, 1);
14423           gcc_assert (legitimate_indirect_address_p (addr_op1, false));
14424
14425           if (!REG_P (addr_op2)
14426               && (GET_CODE (addr_op2) != CONST_INT
14427                   || !satisfies_constraint_I (addr_op2)))
14428             {
14429               if (TARGET_DEBUG_ADDR)
14430                 {
14431                   fprintf (stderr,
14432                            "\nMove plus addr to register %s, mode = %s: ",
14433                            rs6000_reg_names[REGNO (scratch)],
14434                            GET_MODE_NAME (mode));
14435                   debug_rtx (addr_op2);
14436                 }
14437               rs6000_emit_move (scratch, addr_op2, Pmode);
14438               addr_op2 = scratch;
14439             }
14440
14441           emit_insn (gen_rtx_SET (VOIDmode,
14442                                   scratch_or_premodify,
14443                                   gen_rtx_PLUS (Pmode,
14444                                                 addr_op1,
14445                                                 addr_op2)));
14446
14447           addr = scratch_or_premodify;
14448           scratch_or_premodify = scratch;
14449         }
14450       else if (!legitimate_indirect_address_p (addr, false)
14451                && !rs6000_legitimate_offset_address_p (TImode, addr, false))
14452         {
14453           if (TARGET_DEBUG_ADDR)
14454             {
14455               fprintf (stderr, "\nMove addr to register %s, mode = %s: ",
14456                        rs6000_reg_names[REGNO (scratch_or_premodify)],
14457                        GET_MODE_NAME (mode));
14458               debug_rtx (addr);
14459             }
14460           rs6000_emit_move (scratch_or_premodify, addr, Pmode);
14461           addr = scratch_or_premodify;
14462           scratch_or_premodify = scratch;
14463         }
14464       break;
14465
14466       /* Float/Altivec registers can only handle reg+reg addressing.  Move
14467          other addresses into a scratch register.  */
14468     case FLOAT_REGS:
14469     case VSX_REGS:
14470     case ALTIVEC_REGS:
14471
14472       /* With float regs, we need to handle the AND ourselves, since we can't
14473          use the Altivec instruction with an implicit AND -16.  Allow scalar
14474          loads to float registers to use reg+offset even if VSX.  */
14475       if (GET_CODE (addr) == AND
14476           && (rclass != ALTIVEC_REGS || GET_MODE_SIZE (mode) != 16
14477               || GET_CODE (XEXP (addr, 1)) != CONST_INT
14478               || INTVAL (XEXP (addr, 1)) != -16
14479               || !VECTOR_MEM_ALTIVEC_P (mode)))
14480         {
14481           and_op2 = XEXP (addr, 1);
14482           addr = XEXP (addr, 0);
14483         }
14484
14485       /* If we aren't using a VSX load, save the PRE_MODIFY register and use it
14486          as the address later.  */
14487       if (GET_CODE (addr) == PRE_MODIFY
14488           && (!VECTOR_MEM_VSX_P (mode)
14489               || and_op2 != NULL_RTX
14490               || !legitimate_indexed_address_p (XEXP (addr, 1), false)))
14491         {
14492           scratch_or_premodify = XEXP (addr, 0);
14493           gcc_assert (legitimate_indirect_address_p (scratch_or_premodify,
14494                                                      false));
14495           gcc_assert (GET_CODE (XEXP (addr, 1)) == PLUS);
14496           addr = XEXP (addr, 1);
14497         }
14498
14499       if (legitimate_indirect_address_p (addr, false)   /* reg */
14500           || legitimate_indexed_address_p (addr, false) /* reg+reg */
14501           || GET_CODE (addr) == PRE_MODIFY              /* VSX pre-modify */
14502           || (GET_CODE (addr) == AND                    /* Altivec memory */
14503               && GET_CODE (XEXP (addr, 1)) == CONST_INT
14504               && INTVAL (XEXP (addr, 1)) == -16
14505               && VECTOR_MEM_ALTIVEC_P (mode))
14506           || (rclass == FLOAT_REGS                      /* legacy float mem */
14507               && GET_MODE_SIZE (mode) == 8
14508               && and_op2 == NULL_RTX
14509               && scratch_or_premodify == scratch
14510               && rs6000_legitimate_offset_address_p (mode, addr, false)))
14511         ;
14512
14513       else if (GET_CODE (addr) == PLUS)
14514         {
14515           addr_op1 = XEXP (addr, 0);
14516           addr_op2 = XEXP (addr, 1);
14517           gcc_assert (REG_P (addr_op1));
14518
14519           if (TARGET_DEBUG_ADDR)
14520             {
14521               fprintf (stderr, "\nMove plus addr to register %s, mode = %s: ",
14522                        rs6000_reg_names[REGNO (scratch)], GET_MODE_NAME (mode));
14523               debug_rtx (addr_op2);
14524             }
14525           rs6000_emit_move (scratch, addr_op2, Pmode);
14526           emit_insn (gen_rtx_SET (VOIDmode,
14527                                   scratch_or_premodify,
14528                                   gen_rtx_PLUS (Pmode,
14529                                                 addr_op1,
14530                                                 scratch)));
14531           addr = scratch_or_premodify;
14532           scratch_or_premodify = scratch;
14533         }
14534
14535       else if (GET_CODE (addr) == SYMBOL_REF || GET_CODE (addr) == CONST
14536                || GET_CODE (addr) == CONST_INT || REG_P (addr))
14537         {
14538           if (TARGET_DEBUG_ADDR)
14539             {
14540               fprintf (stderr, "\nMove addr to register %s, mode = %s: ",
14541                        rs6000_reg_names[REGNO (scratch_or_premodify)],
14542                        GET_MODE_NAME (mode));
14543               debug_rtx (addr);
14544             }
14545
14546           rs6000_emit_move (scratch_or_premodify, addr, Pmode);
14547           addr = scratch_or_premodify;
14548           scratch_or_premodify = scratch;
14549         }
14550
14551       else
14552         gcc_unreachable ();
14553
14554       break;
14555
14556     default:
14557       gcc_unreachable ();
14558     }
14559
14560   /* If the original address involved a pre-modify that we couldn't use the VSX
14561      memory instruction with update, and we haven't taken care of already,
14562      store the address in the pre-modify register and use that as the
14563      address.  */
14564   if (scratch_or_premodify != scratch && scratch_or_premodify != addr)
14565     {
14566       emit_insn (gen_rtx_SET (VOIDmode, scratch_or_premodify, addr));
14567       addr = scratch_or_premodify;
14568     }
14569
14570   /* If the original address involved an AND -16 and we couldn't use an ALTIVEC
14571      memory instruction, recreate the AND now, including the clobber which is
14572      generated by the general ANDSI3/ANDDI3 patterns for the
14573      andi. instruction.  */
14574   if (and_op2 != NULL_RTX)
14575     {
14576       if (! legitimate_indirect_address_p (addr, false))
14577         {
14578           emit_insn (gen_rtx_SET (VOIDmode, scratch, addr));
14579           addr = scratch;
14580         }
14581
14582       if (TARGET_DEBUG_ADDR)
14583         {
14584           fprintf (stderr, "\nAnd addr to register %s, mode = %s: ",
14585                    rs6000_reg_names[REGNO (scratch)], GET_MODE_NAME (mode));
14586           debug_rtx (and_op2);
14587         }
14588
14589       and_rtx = gen_rtx_SET (VOIDmode,
14590                              scratch,
14591                              gen_rtx_AND (Pmode,
14592                                           addr,
14593                                           and_op2));
14594
14595       cc_clobber = gen_rtx_CLOBBER (CCmode, gen_rtx_SCRATCH (CCmode));
14596       emit_insn (gen_rtx_PARALLEL (VOIDmode,
14597                                    gen_rtvec (2, and_rtx, cc_clobber)));
14598       addr = scratch;
14599     }
14600
14601   /* Adjust the address if it changed.  */
14602   if (addr != XEXP (mem, 0))
14603     {
14604       mem = change_address (mem, mode, addr);
14605       if (TARGET_DEBUG_ADDR)
14606         fprintf (stderr, "\nrs6000_secondary_reload_inner, mem adjusted.\n");
14607     }
14608
14609   /* Now create the move.  */
14610   if (store_p)
14611     emit_insn (gen_rtx_SET (VOIDmode, mem, reg));
14612   else
14613     emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
14614
14615   return;
14616 }
14617
14618 /* Convert reloads involving 64-bit gprs and misaligned offset
14619    addressing to use indirect addressing.  */
14620
14621 void
14622 rs6000_secondary_reload_ppc64 (rtx reg, rtx mem, rtx scratch, bool store_p)
14623 {
14624   int regno = true_regnum (reg);
14625   enum reg_class rclass;
14626   rtx addr;
14627   rtx scratch_or_premodify = scratch;
14628
14629   if (TARGET_DEBUG_ADDR)
14630     {
14631       fprintf (stderr, "\nrs6000_secondary_reload_ppc64, type = %s\n",
14632                store_p ? "store" : "load");
14633       fprintf (stderr, "reg:\n");
14634       debug_rtx (reg);
14635       fprintf (stderr, "mem:\n");
14636       debug_rtx (mem);
14637       fprintf (stderr, "scratch:\n");
14638       debug_rtx (scratch);
14639     }
14640
14641   gcc_assert (regno >= 0 && regno < FIRST_PSEUDO_REGISTER);
14642   gcc_assert (GET_CODE (mem) == MEM);
14643   rclass = REGNO_REG_CLASS (regno);
14644   gcc_assert (rclass == GENERAL_REGS || rclass == BASE_REGS);
14645   addr = XEXP (mem, 0);
14646
14647   if (GET_CODE (addr) == PRE_MODIFY)
14648     {
14649       scratch_or_premodify = XEXP (addr, 0);
14650       gcc_assert (REG_P (scratch_or_premodify));
14651       addr = XEXP (addr, 1);
14652     }
14653   gcc_assert (GET_CODE (addr) == PLUS || GET_CODE (addr) == LO_SUM);
14654
14655   rs6000_emit_move (scratch_or_premodify, addr, Pmode);
14656
14657   mem = replace_equiv_address_nv (mem, scratch_or_premodify);
14658
14659   /* Now create the move.  */
14660   if (store_p)
14661     emit_insn (gen_rtx_SET (VOIDmode, mem, reg));
14662   else
14663     emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
14664
14665   return;
14666 }
14667
14668 /* Allocate a 64-bit stack slot to be used for copying SDmode
14669    values through if this function has any SDmode references.  */
14670
14671 static void
14672 rs6000_alloc_sdmode_stack_slot (void)
14673 {
14674   tree t;
14675   basic_block bb;
14676   gimple_stmt_iterator gsi;
14677
14678   gcc_assert (cfun->machine->sdmode_stack_slot == NULL_RTX);
14679
14680   FOR_EACH_BB (bb)
14681     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
14682       {
14683         tree ret = walk_gimple_op (gsi_stmt (gsi), rs6000_check_sdmode, NULL);
14684         if (ret)
14685           {
14686             rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
14687             cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
14688                                                                   SDmode, 0);
14689             return;
14690           }
14691       }
14692
14693   /* Check for any SDmode parameters of the function.  */
14694   for (t = DECL_ARGUMENTS (cfun->decl); t; t = DECL_CHAIN (t))
14695     {
14696       if (TREE_TYPE (t) == error_mark_node)
14697         continue;
14698
14699       if (TYPE_MODE (TREE_TYPE (t)) == SDmode
14700           || TYPE_MODE (DECL_ARG_TYPE (t)) == SDmode)
14701         {
14702           rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
14703           cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
14704                                                                 SDmode, 0);
14705           return;
14706         }
14707     }
14708 }
14709
14710 static void
14711 rs6000_instantiate_decls (void)
14712 {
14713   if (cfun->machine->sdmode_stack_slot != NULL_RTX)
14714     instantiate_decl_rtl (cfun->machine->sdmode_stack_slot);
14715 }
14716
14717 /* Given an rtx X being reloaded into a reg required to be
14718    in class CLASS, return the class of reg to actually use.
14719    In general this is just CLASS; but on some machines
14720    in some cases it is preferable to use a more restrictive class.
14721
14722    On the RS/6000, we have to return NO_REGS when we want to reload a
14723    floating-point CONST_DOUBLE to force it to be copied to memory.
14724
14725    We also don't want to reload integer values into floating-point
14726    registers if we can at all help it.  In fact, this can
14727    cause reload to die, if it tries to generate a reload of CTR
14728    into a FP register and discovers it doesn't have the memory location
14729    required.
14730
14731    ??? Would it be a good idea to have reload do the converse, that is
14732    try to reload floating modes into FP registers if possible?
14733  */
14734
14735 static enum reg_class
14736 rs6000_preferred_reload_class (rtx x, enum reg_class rclass)
14737 {
14738   enum machine_mode mode = GET_MODE (x);
14739
14740   if (VECTOR_UNIT_VSX_P (mode)
14741       && x == CONST0_RTX (mode) && VSX_REG_CLASS_P (rclass))
14742     return rclass;
14743
14744   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode)
14745       && (rclass == ALTIVEC_REGS || rclass == VSX_REGS)
14746       && easy_vector_constant (x, mode))
14747     return ALTIVEC_REGS;
14748
14749   if (CONSTANT_P (x) && reg_classes_intersect_p (rclass, FLOAT_REGS))
14750     return NO_REGS;
14751
14752   if (GET_MODE_CLASS (mode) == MODE_INT && rclass == NON_SPECIAL_REGS)
14753     return GENERAL_REGS;
14754
14755   /* For VSX, prefer the traditional registers for 64-bit values because we can
14756      use the non-VSX loads.  Prefer the Altivec registers if Altivec is
14757      handling the vector operations (i.e. V16QI, V8HI, and V4SI), or if we
14758      prefer Altivec loads..  */
14759   if (rclass == VSX_REGS)
14760     {
14761       if (GET_MODE_SIZE (mode) <= 8)
14762         return FLOAT_REGS;
14763
14764       if (VECTOR_UNIT_ALTIVEC_P (mode) || VECTOR_MEM_ALTIVEC_P (mode))
14765         return ALTIVEC_REGS;
14766
14767       return rclass;
14768     }
14769
14770   return rclass;
14771 }
14772
14773 /* Debug version of rs6000_preferred_reload_class.  */
14774 static enum reg_class
14775 rs6000_debug_preferred_reload_class (rtx x, enum reg_class rclass)
14776 {
14777   enum reg_class ret = rs6000_preferred_reload_class (x, rclass);
14778
14779   fprintf (stderr,
14780            "\nrs6000_preferred_reload_class, return %s, rclass = %s, "
14781            "mode = %s, x:\n",
14782            reg_class_names[ret], reg_class_names[rclass],
14783            GET_MODE_NAME (GET_MODE (x)));
14784   debug_rtx (x);
14785
14786   return ret;
14787 }
14788
14789 /* If we are copying between FP or AltiVec registers and anything else, we need
14790    a memory location.  The exception is when we are targeting ppc64 and the
14791    move to/from fpr to gpr instructions are available.  Also, under VSX, you
14792    can copy vector registers from the FP register set to the Altivec register
14793    set and vice versa.  */
14794
14795 static bool
14796 rs6000_secondary_memory_needed (enum reg_class class1,
14797                                 enum reg_class class2,
14798                                 enum machine_mode mode)
14799 {
14800   if (class1 == class2)
14801     return false;
14802
14803   /* Under VSX, there are 3 register classes that values could be in (VSX_REGS,
14804      ALTIVEC_REGS, and FLOAT_REGS).  We don't need to use memory to copy
14805      between these classes.  But we need memory for other things that can go in
14806      FLOAT_REGS like SFmode.  */
14807   if (TARGET_VSX
14808       && (VECTOR_MEM_VSX_P (mode) || VECTOR_UNIT_VSX_P (mode))
14809       && (class1 == VSX_REGS || class1 == ALTIVEC_REGS
14810           || class1 == FLOAT_REGS))
14811     return (class2 != VSX_REGS && class2 != ALTIVEC_REGS
14812             && class2 != FLOAT_REGS);
14813
14814   if (class1 == VSX_REGS || class2 == VSX_REGS)
14815     return true;
14816
14817   if (class1 == FLOAT_REGS
14818       && (!TARGET_MFPGPR || !TARGET_POWERPC64
14819           || ((mode != DFmode)
14820               && (mode != DDmode)
14821               && (mode != DImode))))
14822     return true;
14823
14824   if (class2 == FLOAT_REGS
14825       && (!TARGET_MFPGPR || !TARGET_POWERPC64
14826           || ((mode != DFmode)
14827               && (mode != DDmode)
14828               && (mode != DImode))))
14829     return true;
14830
14831   if (class1 == ALTIVEC_REGS || class2 == ALTIVEC_REGS)
14832     return true;
14833
14834   return false;
14835 }
14836
14837 /* Debug version of rs6000_secondary_memory_needed.  */
14838 static bool
14839 rs6000_debug_secondary_memory_needed (enum reg_class class1,
14840                                       enum reg_class class2,
14841                                       enum machine_mode mode)
14842 {
14843   bool ret = rs6000_secondary_memory_needed (class1, class2, mode);
14844
14845   fprintf (stderr,
14846            "rs6000_secondary_memory_needed, return: %s, class1 = %s, "
14847            "class2 = %s, mode = %s\n",
14848            ret ? "true" : "false", reg_class_names[class1],
14849            reg_class_names[class2], GET_MODE_NAME (mode));
14850
14851   return ret;
14852 }
14853
14854 /* Return the register class of a scratch register needed to copy IN into
14855    or out of a register in RCLASS in MODE.  If it can be done directly,
14856    NO_REGS is returned.  */
14857
14858 static enum reg_class
14859 rs6000_secondary_reload_class (enum reg_class rclass, enum machine_mode mode,
14860                                rtx in)
14861 {
14862   int regno;
14863
14864   if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
14865 #if TARGET_MACHO
14866                      && MACHOPIC_INDIRECT
14867 #endif
14868                      ))
14869     {
14870       /* We cannot copy a symbolic operand directly into anything
14871          other than BASE_REGS for TARGET_ELF.  So indicate that a
14872          register from BASE_REGS is needed as an intermediate
14873          register.
14874
14875          On Darwin, pic addresses require a load from memory, which
14876          needs a base register.  */
14877       if (rclass != BASE_REGS
14878           && (GET_CODE (in) == SYMBOL_REF
14879               || GET_CODE (in) == HIGH
14880               || GET_CODE (in) == LABEL_REF
14881               || GET_CODE (in) == CONST))
14882         return BASE_REGS;
14883     }
14884
14885   if (GET_CODE (in) == REG)
14886     {
14887       regno = REGNO (in);
14888       if (regno >= FIRST_PSEUDO_REGISTER)
14889         {
14890           regno = true_regnum (in);
14891           if (regno >= FIRST_PSEUDO_REGISTER)
14892             regno = -1;
14893         }
14894     }
14895   else if (GET_CODE (in) == SUBREG)
14896     {
14897       regno = true_regnum (in);
14898       if (regno >= FIRST_PSEUDO_REGISTER)
14899         regno = -1;
14900     }
14901   else
14902     regno = -1;
14903
14904   /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
14905      into anything.  */
14906   if (rclass == GENERAL_REGS || rclass == BASE_REGS
14907       || (regno >= 0 && INT_REGNO_P (regno)))
14908     return NO_REGS;
14909
14910   /* Constants, memory, and FP registers can go into FP registers.  */
14911   if ((regno == -1 || FP_REGNO_P (regno))
14912       && (rclass == FLOAT_REGS || rclass == NON_SPECIAL_REGS))
14913     return (mode != SDmode) ? NO_REGS : GENERAL_REGS;
14914
14915   /* Memory, and FP/altivec registers can go into fp/altivec registers under
14916      VSX.  */
14917   if (TARGET_VSX
14918       && (regno == -1 || VSX_REGNO_P (regno))
14919       && VSX_REG_CLASS_P (rclass))
14920     return NO_REGS;
14921
14922   /* Memory, and AltiVec registers can go into AltiVec registers.  */
14923   if ((regno == -1 || ALTIVEC_REGNO_P (regno))
14924       && rclass == ALTIVEC_REGS)
14925     return NO_REGS;
14926
14927   /* We can copy among the CR registers.  */
14928   if ((rclass == CR_REGS || rclass == CR0_REGS)
14929       && regno >= 0 && CR_REGNO_P (regno))
14930     return NO_REGS;
14931
14932   /* Otherwise, we need GENERAL_REGS.  */
14933   return GENERAL_REGS;
14934 }
14935
14936 /* Debug version of rs6000_secondary_reload_class.  */
14937 static enum reg_class
14938 rs6000_debug_secondary_reload_class (enum reg_class rclass,
14939                                      enum machine_mode mode, rtx in)
14940 {
14941   enum reg_class ret = rs6000_secondary_reload_class (rclass, mode, in);
14942   fprintf (stderr,
14943            "\nrs6000_secondary_reload_class, return %s, rclass = %s, "
14944            "mode = %s, input rtx:\n",
14945            reg_class_names[ret], reg_class_names[rclass],
14946            GET_MODE_NAME (mode));
14947   debug_rtx (in);
14948
14949   return ret;
14950 }
14951
14952 /* Return nonzero if for CLASS a mode change from FROM to TO is invalid.  */
14953
14954 static bool
14955 rs6000_cannot_change_mode_class (enum machine_mode from,
14956                                  enum machine_mode to,
14957                                  enum reg_class rclass)
14958 {
14959   unsigned from_size = GET_MODE_SIZE (from);
14960   unsigned to_size = GET_MODE_SIZE (to);
14961
14962   if (from_size != to_size)
14963     {
14964       enum reg_class xclass = (TARGET_VSX) ? VSX_REGS : FLOAT_REGS;
14965       return ((from_size < 8 || to_size < 8 || TARGET_IEEEQUAD)
14966               && reg_classes_intersect_p (xclass, rclass));
14967     }
14968
14969   if (TARGET_E500_DOUBLE
14970       && ((((to) == DFmode) + ((from) == DFmode)) == 1
14971           || (((to) == TFmode) + ((from) == TFmode)) == 1
14972           || (((to) == DDmode) + ((from) == DDmode)) == 1
14973           || (((to) == TDmode) + ((from) == TDmode)) == 1
14974           || (((to) == DImode) + ((from) == DImode)) == 1))
14975     return true;
14976
14977   /* Since the VSX register set includes traditional floating point registers
14978      and altivec registers, just check for the size being different instead of
14979      trying to check whether the modes are vector modes.  Otherwise it won't
14980      allow say DF and DI to change classes.  */
14981   if (TARGET_VSX && VSX_REG_CLASS_P (rclass))
14982     return (from_size != 8 && from_size != 16);
14983
14984   if (TARGET_ALTIVEC && rclass == ALTIVEC_REGS
14985       && (ALTIVEC_VECTOR_MODE (from) + ALTIVEC_VECTOR_MODE (to)) == 1)
14986     return true;
14987
14988   if (TARGET_SPE && (SPE_VECTOR_MODE (from) + SPE_VECTOR_MODE (to)) == 1
14989       && reg_classes_intersect_p (GENERAL_REGS, rclass))
14990     return true;
14991
14992   return false;
14993 }
14994
14995 /* Debug version of rs6000_cannot_change_mode_class.  */
14996 static bool
14997 rs6000_debug_cannot_change_mode_class (enum machine_mode from,
14998                                        enum machine_mode to,
14999                                        enum reg_class rclass)
15000 {
15001   bool ret = rs6000_cannot_change_mode_class (from, to, rclass);
15002
15003   fprintf (stderr,
15004            "rs6000_cannot_change_mode_class, return %s, from = %s, "
15005            "to = %s, rclass = %s\n",
15006            ret ? "true" : "false",
15007            GET_MODE_NAME (from), GET_MODE_NAME (to),
15008            reg_class_names[rclass]);
15009
15010   return ret;
15011 }
15012 \f
15013 /* Given a comparison operation, return the bit number in CCR to test.  We
15014    know this is a valid comparison.
15015
15016    SCC_P is 1 if this is for an scc.  That means that %D will have been
15017    used instead of %C, so the bits will be in different places.
15018
15019    Return -1 if OP isn't a valid comparison for some reason.  */
15020
15021 int
15022 ccr_bit (rtx op, int scc_p)
15023 {
15024   enum rtx_code code = GET_CODE (op);
15025   enum machine_mode cc_mode;
15026   int cc_regnum;
15027   int base_bit;
15028   rtx reg;
15029
15030   if (!COMPARISON_P (op))
15031     return -1;
15032
15033   reg = XEXP (op, 0);
15034
15035   gcc_assert (GET_CODE (reg) == REG && CR_REGNO_P (REGNO (reg)));
15036
15037   cc_mode = GET_MODE (reg);
15038   cc_regnum = REGNO (reg);
15039   base_bit = 4 * (cc_regnum - CR0_REGNO);
15040
15041   validate_condition_mode (code, cc_mode);
15042
15043   /* When generating a sCOND operation, only positive conditions are
15044      allowed.  */
15045   gcc_assert (!scc_p
15046               || code == EQ || code == GT || code == LT || code == UNORDERED
15047               || code == GTU || code == LTU);
15048
15049   switch (code)
15050     {
15051     case NE:
15052       return scc_p ? base_bit + 3 : base_bit + 2;
15053     case EQ:
15054       return base_bit + 2;
15055     case GT:  case GTU:  case UNLE:
15056       return base_bit + 1;
15057     case LT:  case LTU:  case UNGE:
15058       return base_bit;
15059     case ORDERED:  case UNORDERED:
15060       return base_bit + 3;
15061
15062     case GE:  case GEU:
15063       /* If scc, we will have done a cror to put the bit in the
15064          unordered position.  So test that bit.  For integer, this is ! LT
15065          unless this is an scc insn.  */
15066       return scc_p ? base_bit + 3 : base_bit;
15067
15068     case LE:  case LEU:
15069       return scc_p ? base_bit + 3 : base_bit + 1;
15070
15071     default:
15072       gcc_unreachable ();
15073     }
15074 }
15075 \f
15076 /* Return the GOT register.  */
15077
15078 rtx
15079 rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
15080 {
15081   /* The second flow pass currently (June 1999) can't update
15082      regs_ever_live without disturbing other parts of the compiler, so
15083      update it here to make the prolog/epilogue code happy.  */
15084   if (!can_create_pseudo_p ()
15085       && !df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
15086     df_set_regs_ever_live (RS6000_PIC_OFFSET_TABLE_REGNUM, true);
15087
15088   crtl->uses_pic_offset_table = 1;
15089
15090   return pic_offset_table_rtx;
15091 }
15092 \f
15093 static rs6000_stack_t stack_info;
15094
15095 /* Function to init struct machine_function.
15096    This will be called, via a pointer variable,
15097    from push_function_context.  */
15098
15099 static struct machine_function *
15100 rs6000_init_machine_status (void)
15101 {
15102   stack_info.reload_completed = 0;
15103   return ggc_alloc_cleared_machine_function ();
15104 }
15105 \f
15106 /* These macros test for integers and extract the low-order bits.  */
15107 #define INT_P(X)  \
15108 ((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE)    \
15109  && GET_MODE (X) == VOIDmode)
15110
15111 #define INT_LOWPART(X) \
15112   (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
15113
15114 int
15115 extract_MB (rtx op)
15116 {
15117   int i;
15118   unsigned long val = INT_LOWPART (op);
15119
15120   /* If the high bit is zero, the value is the first 1 bit we find
15121      from the left.  */
15122   if ((val & 0x80000000) == 0)
15123     {
15124       gcc_assert (val & 0xffffffff);
15125
15126       i = 1;
15127       while (((val <<= 1) & 0x80000000) == 0)
15128         ++i;
15129       return i;
15130     }
15131
15132   /* If the high bit is set and the low bit is not, or the mask is all
15133      1's, the value is zero.  */
15134   if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
15135     return 0;
15136
15137   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
15138      from the right.  */
15139   i = 31;
15140   while (((val >>= 1) & 1) != 0)
15141     --i;
15142
15143   return i;
15144 }
15145
15146 int
15147 extract_ME (rtx op)
15148 {
15149   int i;
15150   unsigned long val = INT_LOWPART (op);
15151
15152   /* If the low bit is zero, the value is the first 1 bit we find from
15153      the right.  */
15154   if ((val & 1) == 0)
15155     {
15156       gcc_assert (val & 0xffffffff);
15157
15158       i = 30;
15159       while (((val >>= 1) & 1) == 0)
15160         --i;
15161
15162       return i;
15163     }
15164
15165   /* If the low bit is set and the high bit is not, or the mask is all
15166      1's, the value is 31.  */
15167   if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
15168     return 31;
15169
15170   /* Otherwise we have a wrap-around mask.  Look for the first 0 bit
15171      from the left.  */
15172   i = 0;
15173   while (((val <<= 1) & 0x80000000) != 0)
15174     ++i;
15175
15176   return i;
15177 }
15178
15179 /* Locate some local-dynamic symbol still in use by this function
15180    so that we can print its name in some tls_ld pattern.  */
15181
15182 static const char *
15183 rs6000_get_some_local_dynamic_name (void)
15184 {
15185   rtx insn;
15186
15187   if (cfun->machine->some_ld_name)
15188     return cfun->machine->some_ld_name;
15189
15190   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
15191     if (INSN_P (insn)
15192         && for_each_rtx (&PATTERN (insn),
15193                          rs6000_get_some_local_dynamic_name_1, 0))
15194       return cfun->machine->some_ld_name;
15195
15196   gcc_unreachable ();
15197 }
15198
15199 /* Helper function for rs6000_get_some_local_dynamic_name.  */
15200
15201 static int
15202 rs6000_get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
15203 {
15204   rtx x = *px;
15205
15206   if (GET_CODE (x) == SYMBOL_REF)
15207     {
15208       const char *str = XSTR (x, 0);
15209       if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
15210         {
15211           cfun->machine->some_ld_name = str;
15212           return 1;
15213         }
15214     }
15215
15216   return 0;
15217 }
15218
15219 /* Write out a function code label.  */
15220
15221 void
15222 rs6000_output_function_entry (FILE *file, const char *fname)
15223 {
15224   if (fname[0] != '.')
15225     {
15226       switch (DEFAULT_ABI)
15227         {
15228         default:
15229           gcc_unreachable ();
15230
15231         case ABI_AIX:
15232           if (DOT_SYMBOLS)
15233             putc ('.', file);
15234           else
15235             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
15236           break;
15237
15238         case ABI_V4:
15239         case ABI_DARWIN:
15240           break;
15241         }
15242     }
15243
15244   RS6000_OUTPUT_BASENAME (file, fname);
15245 }
15246
15247 /* Print an operand.  Recognize special options, documented below.  */
15248
15249 #if TARGET_ELF
15250 #define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
15251 #define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
15252 #else
15253 #define SMALL_DATA_RELOC "sda21"
15254 #define SMALL_DATA_REG 0
15255 #endif
15256
15257 void
15258 print_operand (FILE *file, rtx x, int code)
15259 {
15260   int i;
15261   HOST_WIDE_INT val;
15262   unsigned HOST_WIDE_INT uval;
15263
15264   switch (code)
15265     {
15266     case '.':
15267       /* Write out an instruction after the call which may be replaced
15268          with glue code by the loader.  This depends on the AIX version.  */
15269       asm_fprintf (file, RS6000_CALL_GLUE);
15270       return;
15271
15272       /* %a is output_address.  */
15273
15274     case 'A':
15275       /* If X is a constant integer whose low-order 5 bits are zero,
15276          write 'l'.  Otherwise, write 'r'.  This is a kludge to fix a bug
15277          in the AIX assembler where "sri" with a zero shift count
15278          writes a trash instruction.  */
15279       if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
15280         putc ('l', file);
15281       else
15282         putc ('r', file);
15283       return;
15284
15285     case 'b':
15286       /* If constant, low-order 16 bits of constant, unsigned.
15287          Otherwise, write normally.  */
15288       if (INT_P (x))
15289         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
15290       else
15291         print_operand (file, x, 0);
15292       return;
15293
15294     case 'B':
15295       /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
15296          for 64-bit mask direction.  */
15297       putc (((INT_LOWPART (x) & 1) == 0 ? 'r' : 'l'), file);
15298       return;
15299
15300       /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
15301          output_operand.  */
15302
15303     case 'c':
15304       /* X is a CR register.  Print the number of the GT bit of the CR.  */
15305       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15306         output_operand_lossage ("invalid %%c value");
15307       else
15308         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 1);
15309       return;
15310
15311     case 'D':
15312       /* Like 'J' but get to the GT bit only.  */
15313       gcc_assert (GET_CODE (x) == REG);
15314
15315       /* Bit 1 is GT bit.  */
15316       i = 4 * (REGNO (x) - CR0_REGNO) + 1;
15317
15318       /* Add one for shift count in rlinm for scc.  */
15319       fprintf (file, "%d", i + 1);
15320       return;
15321
15322     case 'E':
15323       /* X is a CR register.  Print the number of the EQ bit of the CR */
15324       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15325         output_operand_lossage ("invalid %%E value");
15326       else
15327         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
15328       return;
15329
15330     case 'f':
15331       /* X is a CR register.  Print the shift count needed to move it
15332          to the high-order four bits.  */
15333       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15334         output_operand_lossage ("invalid %%f value");
15335       else
15336         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
15337       return;
15338
15339     case 'F':
15340       /* Similar, but print the count for the rotate in the opposite
15341          direction.  */
15342       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15343         output_operand_lossage ("invalid %%F value");
15344       else
15345         fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
15346       return;
15347
15348     case 'G':
15349       /* X is a constant integer.  If it is negative, print "m",
15350          otherwise print "z".  This is to make an aze or ame insn.  */
15351       if (GET_CODE (x) != CONST_INT)
15352         output_operand_lossage ("invalid %%G value");
15353       else if (INTVAL (x) >= 0)
15354         putc ('z', file);
15355       else
15356         putc ('m', file);
15357       return;
15358
15359     case 'h':
15360       /* If constant, output low-order five bits.  Otherwise, write
15361          normally.  */
15362       if (INT_P (x))
15363         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
15364       else
15365         print_operand (file, x, 0);
15366       return;
15367
15368     case 'H':
15369       /* If constant, output low-order six bits.  Otherwise, write
15370          normally.  */
15371       if (INT_P (x))
15372         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
15373       else
15374         print_operand (file, x, 0);
15375       return;
15376
15377     case 'I':
15378       /* Print `i' if this is a constant, else nothing.  */
15379       if (INT_P (x))
15380         putc ('i', file);
15381       return;
15382
15383     case 'j':
15384       /* Write the bit number in CCR for jump.  */
15385       i = ccr_bit (x, 0);
15386       if (i == -1)
15387         output_operand_lossage ("invalid %%j code");
15388       else
15389         fprintf (file, "%d", i);
15390       return;
15391
15392     case 'J':
15393       /* Similar, but add one for shift count in rlinm for scc and pass
15394          scc flag to `ccr_bit'.  */
15395       i = ccr_bit (x, 1);
15396       if (i == -1)
15397         output_operand_lossage ("invalid %%J code");
15398       else
15399         /* If we want bit 31, write a shift count of zero, not 32.  */
15400         fprintf (file, "%d", i == 31 ? 0 : i + 1);
15401       return;
15402
15403     case 'k':
15404       /* X must be a constant.  Write the 1's complement of the
15405          constant.  */
15406       if (! INT_P (x))
15407         output_operand_lossage ("invalid %%k value");
15408       else
15409         fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
15410       return;
15411
15412     case 'K':
15413       /* X must be a symbolic constant on ELF.  Write an
15414          expression suitable for an 'addi' that adds in the low 16
15415          bits of the MEM.  */
15416       if (GET_CODE (x) == CONST)
15417         {
15418           if (GET_CODE (XEXP (x, 0)) != PLUS
15419               || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
15420                   && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
15421               || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
15422             output_operand_lossage ("invalid %%K value");
15423         }
15424       print_operand_address (file, x);
15425       fputs ("@l", file);
15426       return;
15427
15428       /* %l is output_asm_label.  */
15429
15430     case 'L':
15431       /* Write second word of DImode or DFmode reference.  Works on register
15432          or non-indexed memory only.  */
15433       if (GET_CODE (x) == REG)
15434         fputs (reg_names[REGNO (x) + 1], file);
15435       else if (GET_CODE (x) == MEM)
15436         {
15437           /* Handle possible auto-increment.  Since it is pre-increment and
15438              we have already done it, we can just use an offset of word.  */
15439           if (GET_CODE (XEXP (x, 0)) == PRE_INC
15440               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
15441             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
15442                                            UNITS_PER_WORD));
15443           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15444             output_address (plus_constant (XEXP (XEXP (x, 0), 0),
15445                                            UNITS_PER_WORD));
15446           else
15447             output_address (XEXP (adjust_address_nv (x, SImode,
15448                                                      UNITS_PER_WORD),
15449                                   0));
15450
15451           if (small_data_operand (x, GET_MODE (x)))
15452             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15453                      reg_names[SMALL_DATA_REG]);
15454         }
15455       return;
15456
15457     case 'm':
15458       /* MB value for a mask operand.  */
15459       if (! mask_operand (x, SImode))
15460         output_operand_lossage ("invalid %%m value");
15461
15462       fprintf (file, "%d", extract_MB (x));
15463       return;
15464
15465     case 'M':
15466       /* ME value for a mask operand.  */
15467       if (! mask_operand (x, SImode))
15468         output_operand_lossage ("invalid %%M value");
15469
15470       fprintf (file, "%d", extract_ME (x));
15471       return;
15472
15473       /* %n outputs the negative of its operand.  */
15474
15475     case 'N':
15476       /* Write the number of elements in the vector times 4.  */
15477       if (GET_CODE (x) != PARALLEL)
15478         output_operand_lossage ("invalid %%N value");
15479       else
15480         fprintf (file, "%d", XVECLEN (x, 0) * 4);
15481       return;
15482
15483     case 'O':
15484       /* Similar, but subtract 1 first.  */
15485       if (GET_CODE (x) != PARALLEL)
15486         output_operand_lossage ("invalid %%O value");
15487       else
15488         fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
15489       return;
15490
15491     case 'p':
15492       /* X is a CONST_INT that is a power of two.  Output the logarithm.  */
15493       if (! INT_P (x)
15494           || INT_LOWPART (x) < 0
15495           || (i = exact_log2 (INT_LOWPART (x))) < 0)
15496         output_operand_lossage ("invalid %%p value");
15497       else
15498         fprintf (file, "%d", i);
15499       return;
15500
15501     case 'P':
15502       /* The operand must be an indirect memory reference.  The result
15503          is the register name.  */
15504       if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
15505           || REGNO (XEXP (x, 0)) >= 32)
15506         output_operand_lossage ("invalid %%P value");
15507       else
15508         fputs (reg_names[REGNO (XEXP (x, 0))], file);
15509       return;
15510
15511     case 'q':
15512       /* This outputs the logical code corresponding to a boolean
15513          expression.  The expression may have one or both operands
15514          negated (if one, only the first one).  For condition register
15515          logical operations, it will also treat the negated
15516          CR codes as NOTs, but not handle NOTs of them.  */
15517       {
15518         const char *const *t = 0;
15519         const char *s;
15520         enum rtx_code code = GET_CODE (x);
15521         static const char * const tbl[3][3] = {
15522           { "and", "andc", "nor" },
15523           { "or", "orc", "nand" },
15524           { "xor", "eqv", "xor" } };
15525
15526         if (code == AND)
15527           t = tbl[0];
15528         else if (code == IOR)
15529           t = tbl[1];
15530         else if (code == XOR)
15531           t = tbl[2];
15532         else
15533           output_operand_lossage ("invalid %%q value");
15534
15535         if (GET_CODE (XEXP (x, 0)) != NOT)
15536           s = t[0];
15537         else
15538           {
15539             if (GET_CODE (XEXP (x, 1)) == NOT)
15540               s = t[2];
15541             else
15542               s = t[1];
15543           }
15544
15545         fputs (s, file);
15546       }
15547       return;
15548
15549     case 'Q':
15550       if (TARGET_MFCRF)
15551         fputc (',', file);
15552         /* FALLTHRU */
15553       else
15554         return;
15555
15556     case 'R':
15557       /* X is a CR register.  Print the mask for `mtcrf'.  */
15558       if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15559         output_operand_lossage ("invalid %%R value");
15560       else
15561         fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
15562       return;
15563
15564     case 's':
15565       /* Low 5 bits of 32 - value */
15566       if (! INT_P (x))
15567         output_operand_lossage ("invalid %%s value");
15568       else
15569         fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
15570       return;
15571
15572     case 'S':
15573       /* PowerPC64 mask position.  All 0's is excluded.
15574          CONST_INT 32-bit mask is considered sign-extended so any
15575          transition must occur within the CONST_INT, not on the boundary.  */
15576       if (! mask64_operand (x, DImode))
15577         output_operand_lossage ("invalid %%S value");
15578
15579       uval = INT_LOWPART (x);
15580
15581       if (uval & 1)     /* Clear Left */
15582         {
15583 #if HOST_BITS_PER_WIDE_INT > 64
15584           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
15585 #endif
15586           i = 64;
15587         }
15588       else              /* Clear Right */
15589         {
15590           uval = ~uval;
15591 #if HOST_BITS_PER_WIDE_INT > 64
15592           uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
15593 #endif
15594           i = 63;
15595         }
15596       while (uval != 0)
15597         --i, uval >>= 1;
15598       gcc_assert (i >= 0);
15599       fprintf (file, "%d", i);
15600       return;
15601
15602     case 't':
15603       /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
15604       gcc_assert (GET_CODE (x) == REG && GET_MODE (x) == CCmode);
15605
15606       /* Bit 3 is OV bit.  */
15607       i = 4 * (REGNO (x) - CR0_REGNO) + 3;
15608
15609       /* If we want bit 31, write a shift count of zero, not 32.  */
15610       fprintf (file, "%d", i == 31 ? 0 : i + 1);
15611       return;
15612
15613     case 'T':
15614       /* Print the symbolic name of a branch target register.  */
15615       if (GET_CODE (x) != REG || (REGNO (x) != LR_REGNO
15616                                   && REGNO (x) != CTR_REGNO))
15617         output_operand_lossage ("invalid %%T value");
15618       else if (REGNO (x) == LR_REGNO)
15619         fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
15620       else
15621         fputs ("ctr", file);
15622       return;
15623
15624     case 'u':
15625       /* High-order 16 bits of constant for use in unsigned operand.  */
15626       if (! INT_P (x))
15627         output_operand_lossage ("invalid %%u value");
15628       else
15629         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
15630                  (INT_LOWPART (x) >> 16) & 0xffff);
15631       return;
15632
15633     case 'v':
15634       /* High-order 16 bits of constant for use in signed operand.  */
15635       if (! INT_P (x))
15636         output_operand_lossage ("invalid %%v value");
15637       else
15638         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
15639                  (INT_LOWPART (x) >> 16) & 0xffff);
15640       return;
15641
15642     case 'U':
15643       /* Print `u' if this has an auto-increment or auto-decrement.  */
15644       if (GET_CODE (x) == MEM
15645           && (GET_CODE (XEXP (x, 0)) == PRE_INC
15646               || GET_CODE (XEXP (x, 0)) == PRE_DEC
15647               || GET_CODE (XEXP (x, 0)) == PRE_MODIFY))
15648         putc ('u', file);
15649       return;
15650
15651     case 'V':
15652       /* Print the trap code for this operand.  */
15653       switch (GET_CODE (x))
15654         {
15655         case EQ:
15656           fputs ("eq", file);   /* 4 */
15657           break;
15658         case NE:
15659           fputs ("ne", file);   /* 24 */
15660           break;
15661         case LT:
15662           fputs ("lt", file);   /* 16 */
15663           break;
15664         case LE:
15665           fputs ("le", file);   /* 20 */
15666           break;
15667         case GT:
15668           fputs ("gt", file);   /* 8 */
15669           break;
15670         case GE:
15671           fputs ("ge", file);   /* 12 */
15672           break;
15673         case LTU:
15674           fputs ("llt", file);  /* 2 */
15675           break;
15676         case LEU:
15677           fputs ("lle", file);  /* 6 */
15678           break;
15679         case GTU:
15680           fputs ("lgt", file);  /* 1 */
15681           break;
15682         case GEU:
15683           fputs ("lge", file);  /* 5 */
15684           break;
15685         default:
15686           gcc_unreachable ();
15687         }
15688       break;
15689
15690     case 'w':
15691       /* If constant, low-order 16 bits of constant, signed.  Otherwise, write
15692          normally.  */
15693       if (INT_P (x))
15694         fprintf (file, HOST_WIDE_INT_PRINT_DEC,
15695                  ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
15696       else
15697         print_operand (file, x, 0);
15698       return;
15699
15700     case 'W':
15701       /* MB value for a PowerPC64 rldic operand.  */
15702       val = (GET_CODE (x) == CONST_INT
15703              ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
15704
15705       if (val < 0)
15706         i = -1;
15707       else
15708         for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
15709           if ((val <<= 1) < 0)
15710             break;
15711
15712 #if HOST_BITS_PER_WIDE_INT == 32
15713       if (GET_CODE (x) == CONST_INT && i >= 0)
15714         i += 32;  /* zero-extend high-part was all 0's */
15715       else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
15716         {
15717           val = CONST_DOUBLE_LOW (x);
15718
15719           gcc_assert (val);
15720           if (val < 0)
15721             --i;
15722           else
15723             for ( ; i < 64; i++)
15724               if ((val <<= 1) < 0)
15725                 break;
15726         }
15727 #endif
15728
15729       fprintf (file, "%d", i + 1);
15730       return;
15731
15732     case 'x':
15733       /* X is a FPR or Altivec register used in a VSX context.  */
15734       if (GET_CODE (x) != REG || !VSX_REGNO_P (REGNO (x)))
15735         output_operand_lossage ("invalid %%x value");
15736       else
15737         {
15738           int reg = REGNO (x);
15739           int vsx_reg = (FP_REGNO_P (reg)
15740                          ? reg - 32
15741                          : reg - FIRST_ALTIVEC_REGNO + 32);
15742
15743 #ifdef TARGET_REGNAMES      
15744           if (TARGET_REGNAMES)
15745             fprintf (file, "%%vs%d", vsx_reg);
15746           else
15747 #endif
15748             fprintf (file, "%d", vsx_reg);
15749         }
15750       return;
15751
15752     case 'X':
15753       if (GET_CODE (x) == MEM
15754           && (legitimate_indexed_address_p (XEXP (x, 0), 0)
15755               || (GET_CODE (XEXP (x, 0)) == PRE_MODIFY
15756                   && legitimate_indexed_address_p (XEXP (XEXP (x, 0), 1), 0))))
15757         putc ('x', file);
15758       return;
15759
15760     case 'Y':
15761       /* Like 'L', for third word of TImode  */
15762       if (GET_CODE (x) == REG)
15763         fputs (reg_names[REGNO (x) + 2], file);
15764       else if (GET_CODE (x) == MEM)
15765         {
15766           if (GET_CODE (XEXP (x, 0)) == PRE_INC
15767               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
15768             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
15769           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15770             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
15771           else
15772             output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
15773           if (small_data_operand (x, GET_MODE (x)))
15774             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15775                      reg_names[SMALL_DATA_REG]);
15776         }
15777       return;
15778
15779     case 'z':
15780       /* X is a SYMBOL_REF.  Write out the name preceded by a
15781          period and without any trailing data in brackets.  Used for function
15782          names.  If we are configured for System V (or the embedded ABI) on
15783          the PowerPC, do not emit the period, since those systems do not use
15784          TOCs and the like.  */
15785       gcc_assert (GET_CODE (x) == SYMBOL_REF);
15786
15787       /* Mark the decl as referenced so that cgraph will output the
15788          function.  */
15789       if (SYMBOL_REF_DECL (x))
15790         mark_decl_referenced (SYMBOL_REF_DECL (x));
15791
15792       /* For macho, check to see if we need a stub.  */
15793       if (TARGET_MACHO)
15794         {
15795           const char *name = XSTR (x, 0);
15796 #if TARGET_MACHO
15797           if (darwin_emit_branch_islands
15798               && MACHOPIC_INDIRECT
15799               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
15800             name = machopic_indirection_name (x, /*stub_p=*/true);
15801 #endif
15802           assemble_name (file, name);
15803         }
15804       else if (!DOT_SYMBOLS)
15805         assemble_name (file, XSTR (x, 0));
15806       else
15807         rs6000_output_function_entry (file, XSTR (x, 0));
15808       return;
15809
15810     case 'Z':
15811       /* Like 'L', for last word of TImode.  */
15812       if (GET_CODE (x) == REG)
15813         fputs (reg_names[REGNO (x) + 3], file);
15814       else if (GET_CODE (x) == MEM)
15815         {
15816           if (GET_CODE (XEXP (x, 0)) == PRE_INC
15817               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
15818             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
15819           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15820             output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
15821           else
15822             output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
15823           if (small_data_operand (x, GET_MODE (x)))
15824             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15825                      reg_names[SMALL_DATA_REG]);
15826         }
15827       return;
15828
15829       /* Print AltiVec or SPE memory operand.  */
15830     case 'y':
15831       {
15832         rtx tmp;
15833
15834         gcc_assert (GET_CODE (x) == MEM);
15835
15836         tmp = XEXP (x, 0);
15837
15838         /* Ugly hack because %y is overloaded.  */
15839         if ((TARGET_SPE || TARGET_E500_DOUBLE)
15840             && (GET_MODE_SIZE (GET_MODE (x)) == 8
15841                 || GET_MODE (x) == TFmode
15842                 || GET_MODE (x) == TImode))
15843           {
15844             /* Handle [reg].  */
15845             if (GET_CODE (tmp) == REG)
15846               {
15847                 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
15848                 break;
15849               }
15850             /* Handle [reg+UIMM].  */
15851             else if (GET_CODE (tmp) == PLUS &&
15852                      GET_CODE (XEXP (tmp, 1)) == CONST_INT)
15853               {
15854                 int x;
15855
15856                 gcc_assert (GET_CODE (XEXP (tmp, 0)) == REG);
15857
15858                 x = INTVAL (XEXP (tmp, 1));
15859                 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
15860                 break;
15861               }
15862
15863             /* Fall through.  Must be [reg+reg].  */
15864           }
15865         if (VECTOR_MEM_ALTIVEC_P (GET_MODE (x))
15866             && GET_CODE (tmp) == AND
15867             && GET_CODE (XEXP (tmp, 1)) == CONST_INT
15868             && INTVAL (XEXP (tmp, 1)) == -16)
15869           tmp = XEXP (tmp, 0);
15870         else if (VECTOR_MEM_VSX_P (GET_MODE (x))
15871                  && GET_CODE (tmp) == PRE_MODIFY)
15872           tmp = XEXP (tmp, 1);
15873         if (GET_CODE (tmp) == REG)
15874           fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
15875         else
15876           {
15877             if (!GET_CODE (tmp) == PLUS
15878                 || !REG_P (XEXP (tmp, 0))
15879                 || !REG_P (XEXP (tmp, 1)))
15880               {
15881                 output_operand_lossage ("invalid %%y value, try using the 'Z' constraint");
15882                 break;
15883               }
15884
15885             if (REGNO (XEXP (tmp, 0)) == 0)
15886               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
15887                        reg_names[ REGNO (XEXP (tmp, 0)) ]);
15888             else
15889               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
15890                        reg_names[ REGNO (XEXP (tmp, 1)) ]);
15891           }
15892         break;
15893       }
15894
15895     case 0:
15896       if (GET_CODE (x) == REG)
15897         fprintf (file, "%s", reg_names[REGNO (x)]);
15898       else if (GET_CODE (x) == MEM)
15899         {
15900           /* We need to handle PRE_INC and PRE_DEC here, since we need to
15901              know the width from the mode.  */
15902           if (GET_CODE (XEXP (x, 0)) == PRE_INC)
15903             fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
15904                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
15905           else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
15906             fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
15907                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
15908           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
15909             output_address (XEXP (XEXP (x, 0), 1));
15910           else
15911             output_address (XEXP (x, 0));
15912         }
15913       else
15914         {
15915           if (toc_relative_expr_p (x))
15916             /* This hack along with a corresponding hack in
15917                rs6000_output_addr_const_extra arranges to output addends
15918                where the assembler expects to find them.  eg.
15919                (const (plus (unspec [symbol_ref ("x") tocrel]) 4))
15920                without this hack would be output as "x@toc+4".  We
15921                want "x+4@toc".  */
15922             output_addr_const (file, tocrel_base);
15923           else
15924             output_addr_const (file, x);
15925         }
15926       return;
15927
15928     case '&':
15929       assemble_name (file, rs6000_get_some_local_dynamic_name ());
15930       return;
15931
15932     default:
15933       output_operand_lossage ("invalid %%xn code");
15934     }
15935 }
15936 \f
15937 /* Print the address of an operand.  */
15938
15939 void
15940 print_operand_address (FILE *file, rtx x)
15941 {
15942   if (GET_CODE (x) == REG)
15943     fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
15944   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
15945            || GET_CODE (x) == LABEL_REF)
15946     {
15947       output_addr_const (file, x);
15948       if (small_data_operand (x, GET_MODE (x)))
15949         fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
15950                  reg_names[SMALL_DATA_REG]);
15951       else
15952         gcc_assert (!TARGET_TOC);
15953     }
15954   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
15955     {
15956       gcc_assert (REG_P (XEXP (x, 0)));
15957       if (REGNO (XEXP (x, 0)) == 0)
15958         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
15959                  reg_names[ REGNO (XEXP (x, 0)) ]);
15960       else
15961         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
15962                  reg_names[ REGNO (XEXP (x, 1)) ]);
15963     }
15964   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
15965     fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
15966              INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
15967 #if TARGET_MACHO
15968   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
15969            && CONSTANT_P (XEXP (x, 1)))
15970     {
15971       fprintf (file, "lo16(");
15972       output_addr_const (file, XEXP (x, 1));
15973       fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
15974     }
15975 #endif
15976   else if (legitimate_constant_pool_address_p (x, QImode, true))
15977     {
15978       /* This hack along with a corresponding hack in
15979          rs6000_output_addr_const_extra arranges to output addends
15980          where the assembler expects to find them.  eg.
15981          (lo_sum (reg 9)
15982          .       (const (plus (unspec [symbol_ref ("x") tocrel]) 8)))
15983          without this hack would be output as "x@toc+8@l(9)".  We
15984          want "x+8@toc@l(9)".  */
15985       output_addr_const (file, tocrel_base);
15986       if (GET_CODE (x) == LO_SUM)
15987         fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
15988       else
15989         fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
15990     }
15991 #if TARGET_ELF
15992   else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
15993            && CONSTANT_P (XEXP (x, 1)))
15994     {
15995       output_addr_const (file, XEXP (x, 1));
15996       fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
15997     }
15998 #endif
15999   else
16000     gcc_unreachable ();
16001 }
16002 \f
16003 /* Implement TARGET_OUTPUT_ADDR_CONST_EXTRA.  */
16004
16005 static bool
16006 rs6000_output_addr_const_extra (FILE *file, rtx x)
16007 {
16008   if (GET_CODE (x) == UNSPEC)
16009     switch (XINT (x, 1))
16010       {
16011       case UNSPEC_TOCREL:
16012         gcc_assert (GET_CODE (XVECEXP (x, 0, 0)) == SYMBOL_REF);
16013         output_addr_const (file, XVECEXP (x, 0, 0));
16014         if (x == tocrel_base && tocrel_offset != const0_rtx)
16015           {
16016             if (INTVAL (tocrel_offset) >= 0)
16017               fprintf (file, "+");
16018             output_addr_const (file, tocrel_offset);
16019           }
16020         if (!TARGET_AIX || (TARGET_ELF && TARGET_MINIMAL_TOC))
16021           {
16022             putc ('-', file);
16023             assemble_name (file, toc_label_name);
16024           }
16025         else if (TARGET_ELF)
16026           fputs ("@toc", file);
16027         return true;
16028
16029 #if TARGET_MACHO
16030       case UNSPEC_MACHOPIC_OFFSET:
16031         output_addr_const (file, XVECEXP (x, 0, 0));
16032         putc ('-', file);
16033         machopic_output_function_base_name (file);
16034         return true;
16035 #endif
16036       }
16037   return false;
16038 }
16039 \f
16040 /* Target hook for assembling integer objects.  The PowerPC version has
16041    to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
16042    is defined.  It also needs to handle DI-mode objects on 64-bit
16043    targets.  */
16044
16045 static bool
16046 rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
16047 {
16048 #ifdef RELOCATABLE_NEEDS_FIXUP
16049   /* Special handling for SI values.  */
16050   if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
16051     {
16052       static int recurse = 0;
16053
16054       /* For -mrelocatable, we mark all addresses that need to be fixed up
16055          in the .fixup section.  */
16056       if (TARGET_RELOCATABLE
16057           && in_section != toc_section
16058           && in_section != text_section
16059           && !unlikely_text_section_p (in_section)
16060           && !recurse
16061           && GET_CODE (x) != CONST_INT
16062           && GET_CODE (x) != CONST_DOUBLE
16063           && CONSTANT_P (x))
16064         {
16065           char buf[256];
16066
16067           recurse = 1;
16068           ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
16069           fixuplabelno++;
16070           ASM_OUTPUT_LABEL (asm_out_file, buf);
16071           fprintf (asm_out_file, "\t.long\t(");
16072           output_addr_const (asm_out_file, x);
16073           fprintf (asm_out_file, ")@fixup\n");
16074           fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
16075           ASM_OUTPUT_ALIGN (asm_out_file, 2);
16076           fprintf (asm_out_file, "\t.long\t");
16077           assemble_name (asm_out_file, buf);
16078           fprintf (asm_out_file, "\n\t.previous\n");
16079           recurse = 0;
16080           return true;
16081         }
16082       /* Remove initial .'s to turn a -mcall-aixdesc function
16083          address into the address of the descriptor, not the function
16084          itself.  */
16085       else if (GET_CODE (x) == SYMBOL_REF
16086                && XSTR (x, 0)[0] == '.'
16087                && DEFAULT_ABI == ABI_AIX)
16088         {
16089           const char *name = XSTR (x, 0);
16090           while (*name == '.')
16091             name++;
16092
16093           fprintf (asm_out_file, "\t.long\t%s\n", name);
16094           return true;
16095         }
16096     }
16097 #endif /* RELOCATABLE_NEEDS_FIXUP */
16098   return default_assemble_integer (x, size, aligned_p);
16099 }
16100
16101 #if defined (HAVE_GAS_HIDDEN) && !defined (TARGET_MACHO)
16102 /* Emit an assembler directive to set symbol visibility for DECL to
16103    VISIBILITY_TYPE.  */
16104
16105 static void
16106 rs6000_assemble_visibility (tree decl, int vis)
16107 {
16108   /* Functions need to have their entry point symbol visibility set as
16109      well as their descriptor symbol visibility.  */
16110   if (DEFAULT_ABI == ABI_AIX
16111       && DOT_SYMBOLS
16112       && TREE_CODE (decl) == FUNCTION_DECL)
16113     {
16114       static const char * const visibility_types[] = {
16115         NULL, "internal", "hidden", "protected"
16116       };
16117
16118       const char *name, *type;
16119
16120       name = ((* targetm.strip_name_encoding)
16121               (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
16122       type = visibility_types[vis];
16123
16124       fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
16125       fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
16126     }
16127   else
16128     default_assemble_visibility (decl, vis);
16129 }
16130 #endif
16131 \f
16132 enum rtx_code
16133 rs6000_reverse_condition (enum machine_mode mode, enum rtx_code code)
16134 {
16135   /* Reversal of FP compares takes care -- an ordered compare
16136      becomes an unordered compare and vice versa.  */
16137   if (mode == CCFPmode
16138       && (!flag_finite_math_only
16139           || code == UNLT || code == UNLE || code == UNGT || code == UNGE
16140           || code == UNEQ || code == LTGT))
16141     return reverse_condition_maybe_unordered (code);
16142   else
16143     return reverse_condition (code);
16144 }
16145
16146 /* Generate a compare for CODE.  Return a brand-new rtx that
16147    represents the result of the compare.  */
16148
16149 static rtx
16150 rs6000_generate_compare (rtx cmp, enum machine_mode mode)
16151 {
16152   enum machine_mode comp_mode;
16153   rtx compare_result;
16154   enum rtx_code code = GET_CODE (cmp);
16155   rtx op0 = XEXP (cmp, 0);
16156   rtx op1 = XEXP (cmp, 1);
16157
16158   if (FLOAT_MODE_P (mode))
16159     comp_mode = CCFPmode;
16160   else if (code == GTU || code == LTU
16161            || code == GEU || code == LEU)
16162     comp_mode = CCUNSmode;
16163   else if ((code == EQ || code == NE)
16164            && GET_CODE (op0) == SUBREG
16165            && GET_CODE (op1) == SUBREG
16166            && SUBREG_PROMOTED_UNSIGNED_P (op0)
16167            && SUBREG_PROMOTED_UNSIGNED_P (op1))
16168     /* These are unsigned values, perhaps there will be a later
16169        ordering compare that can be shared with this one.
16170        Unfortunately we cannot detect the signedness of the operands
16171        for non-subregs.  */
16172     comp_mode = CCUNSmode;
16173   else
16174     comp_mode = CCmode;
16175
16176   /* First, the compare.  */
16177   compare_result = gen_reg_rtx (comp_mode);
16178
16179   /* E500 FP compare instructions on the GPRs.  Yuck!  */
16180   if ((!TARGET_FPRS && TARGET_HARD_FLOAT)
16181       && FLOAT_MODE_P (mode))
16182     {
16183       rtx cmp, or_result, compare_result2;
16184       enum machine_mode op_mode = GET_MODE (op0);
16185
16186       if (op_mode == VOIDmode)
16187         op_mode = GET_MODE (op1);
16188
16189       /* The E500 FP compare instructions toggle the GT bit (CR bit 1) only.
16190          This explains the following mess.  */
16191
16192       switch (code)
16193         {
16194         case EQ: case UNEQ: case NE: case LTGT:
16195           switch (op_mode)
16196             {
16197             case SFmode:
16198               cmp = (flag_finite_math_only && !flag_trapping_math)
16199                 ? gen_tstsfeq_gpr (compare_result, op0, op1)
16200                 : gen_cmpsfeq_gpr (compare_result, op0, op1);
16201               break;
16202
16203             case DFmode:
16204               cmp = (flag_finite_math_only && !flag_trapping_math)
16205                 ? gen_tstdfeq_gpr (compare_result, op0, op1)
16206                 : gen_cmpdfeq_gpr (compare_result, op0, op1);
16207               break;
16208
16209             case TFmode:
16210               cmp = (flag_finite_math_only && !flag_trapping_math)
16211                 ? gen_tsttfeq_gpr (compare_result, op0, op1)
16212                 : gen_cmptfeq_gpr (compare_result, op0, op1);
16213               break;
16214
16215             default:
16216               gcc_unreachable ();
16217             }
16218           break;
16219
16220         case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
16221           switch (op_mode)
16222             {
16223             case SFmode:
16224               cmp = (flag_finite_math_only && !flag_trapping_math)
16225                 ? gen_tstsfgt_gpr (compare_result, op0, op1)
16226                 : gen_cmpsfgt_gpr (compare_result, op0, op1);
16227               break;
16228
16229             case DFmode:
16230               cmp = (flag_finite_math_only && !flag_trapping_math)
16231                 ? gen_tstdfgt_gpr (compare_result, op0, op1)
16232                 : gen_cmpdfgt_gpr (compare_result, op0, op1);
16233               break;
16234
16235             case TFmode:
16236               cmp = (flag_finite_math_only && !flag_trapping_math)
16237                 ? gen_tsttfgt_gpr (compare_result, op0, op1)
16238                 : gen_cmptfgt_gpr (compare_result, op0, op1);
16239               break;
16240
16241             default:
16242               gcc_unreachable ();
16243             }
16244           break;
16245
16246         case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
16247           switch (op_mode)
16248             {
16249             case SFmode:
16250               cmp = (flag_finite_math_only && !flag_trapping_math)
16251                 ? gen_tstsflt_gpr (compare_result, op0, op1)
16252                 : gen_cmpsflt_gpr (compare_result, op0, op1);
16253               break;
16254
16255             case DFmode:
16256               cmp = (flag_finite_math_only && !flag_trapping_math)
16257                 ? gen_tstdflt_gpr (compare_result, op0, op1)
16258                 : gen_cmpdflt_gpr (compare_result, op0, op1);
16259               break;
16260
16261             case TFmode:
16262               cmp = (flag_finite_math_only && !flag_trapping_math)
16263                 ? gen_tsttflt_gpr (compare_result, op0, op1)
16264                 : gen_cmptflt_gpr (compare_result, op0, op1);
16265               break;
16266
16267             default:
16268               gcc_unreachable ();
16269             }
16270           break;
16271         default:
16272           gcc_unreachable ();
16273         }
16274
16275       /* Synthesize LE and GE from LT/GT || EQ.  */
16276       if (code == LE || code == GE || code == LEU || code == GEU)
16277         {
16278           emit_insn (cmp);
16279
16280           switch (code)
16281             {
16282             case LE: code = LT; break;
16283             case GE: code = GT; break;
16284             case LEU: code = LT; break;
16285             case GEU: code = GT; break;
16286             default: gcc_unreachable ();
16287             }
16288
16289           compare_result2 = gen_reg_rtx (CCFPmode);
16290
16291           /* Do the EQ.  */
16292           switch (op_mode)
16293             {
16294             case SFmode:
16295               cmp = (flag_finite_math_only && !flag_trapping_math)
16296                 ? gen_tstsfeq_gpr (compare_result2, op0, op1)
16297                 : gen_cmpsfeq_gpr (compare_result2, op0, op1);
16298               break;
16299
16300             case DFmode:
16301               cmp = (flag_finite_math_only && !flag_trapping_math)
16302                 ? gen_tstdfeq_gpr (compare_result2, op0, op1)
16303                 : gen_cmpdfeq_gpr (compare_result2, op0, op1);
16304               break;
16305
16306             case TFmode:
16307               cmp = (flag_finite_math_only && !flag_trapping_math)
16308                 ? gen_tsttfeq_gpr (compare_result2, op0, op1)
16309                 : gen_cmptfeq_gpr (compare_result2, op0, op1);
16310               break;
16311
16312             default:
16313               gcc_unreachable ();
16314             }
16315           emit_insn (cmp);
16316
16317           /* OR them together.  */
16318           or_result = gen_reg_rtx (CCFPmode);
16319           cmp = gen_e500_cr_ior_compare (or_result, compare_result,
16320                                            compare_result2);
16321           compare_result = or_result;
16322           code = EQ;
16323         }
16324       else
16325         {
16326           if (code == NE || code == LTGT)
16327             code = NE;
16328           else
16329             code = EQ;
16330         }
16331
16332       emit_insn (cmp);
16333     }
16334   else
16335     {
16336       /* Generate XLC-compatible TFmode compare as PARALLEL with extra
16337          CLOBBERs to match cmptf_internal2 pattern.  */
16338       if (comp_mode == CCFPmode && TARGET_XL_COMPAT
16339           && GET_MODE (op0) == TFmode
16340           && !TARGET_IEEEQUAD
16341           && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128)
16342         emit_insn (gen_rtx_PARALLEL (VOIDmode,
16343           gen_rtvec (10,
16344                      gen_rtx_SET (VOIDmode,
16345                                   compare_result,
16346                                   gen_rtx_COMPARE (comp_mode, op0, op1)),
16347                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16348                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16349                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16350                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16351                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16352                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16353                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16354                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16355                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (Pmode)))));
16356       else if (GET_CODE (op1) == UNSPEC
16357                && XINT (op1, 1) == UNSPEC_SP_TEST)
16358         {
16359           rtx op1b = XVECEXP (op1, 0, 0);
16360           comp_mode = CCEQmode;
16361           compare_result = gen_reg_rtx (CCEQmode);
16362           if (TARGET_64BIT)
16363             emit_insn (gen_stack_protect_testdi (compare_result, op0, op1b));
16364           else
16365             emit_insn (gen_stack_protect_testsi (compare_result, op0, op1b));
16366         }
16367       else
16368         emit_insn (gen_rtx_SET (VOIDmode, compare_result,
16369                                 gen_rtx_COMPARE (comp_mode, op0, op1)));
16370     }
16371
16372   /* Some kinds of FP comparisons need an OR operation;
16373      under flag_finite_math_only we don't bother.  */
16374   if (FLOAT_MODE_P (mode)
16375       && !flag_finite_math_only
16376       && !(TARGET_HARD_FLOAT && !TARGET_FPRS)
16377       && (code == LE || code == GE
16378           || code == UNEQ || code == LTGT
16379           || code == UNGT || code == UNLT))
16380     {
16381       enum rtx_code or1, or2;
16382       rtx or1_rtx, or2_rtx, compare2_rtx;
16383       rtx or_result = gen_reg_rtx (CCEQmode);
16384
16385       switch (code)
16386         {
16387         case LE: or1 = LT;  or2 = EQ;  break;
16388         case GE: or1 = GT;  or2 = EQ;  break;
16389         case UNEQ: or1 = UNORDERED;  or2 = EQ;  break;
16390         case LTGT: or1 = LT;  or2 = GT;  break;
16391         case UNGT: or1 = UNORDERED;  or2 = GT;  break;
16392         case UNLT: or1 = UNORDERED;  or2 = LT;  break;
16393         default:  gcc_unreachable ();
16394         }
16395       validate_condition_mode (or1, comp_mode);
16396       validate_condition_mode (or2, comp_mode);
16397       or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
16398       or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
16399       compare2_rtx = gen_rtx_COMPARE (CCEQmode,
16400                                       gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
16401                                       const_true_rtx);
16402       emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
16403
16404       compare_result = or_result;
16405       code = EQ;
16406     }
16407
16408   validate_condition_mode (code, GET_MODE (compare_result));
16409
16410   return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
16411 }
16412
16413
16414 /* Emit the RTL for an sISEL pattern.  */
16415
16416 void
16417 rs6000_emit_sISEL (enum machine_mode mode ATTRIBUTE_UNUSED, rtx operands[])
16418 {
16419   rs6000_emit_int_cmove (operands[0], operands[1], const1_rtx, const0_rtx);
16420 }
16421
16422 void
16423 rs6000_emit_sCOND (enum machine_mode mode, rtx operands[])
16424 {
16425   rtx condition_rtx;
16426   enum machine_mode op_mode;
16427   enum rtx_code cond_code;
16428   rtx result = operands[0];
16429
16430   if (TARGET_ISEL && (mode == SImode || mode == DImode))
16431     {
16432       rs6000_emit_sISEL (mode, operands);
16433       return;
16434     }
16435
16436   condition_rtx = rs6000_generate_compare (operands[1], mode);
16437   cond_code = GET_CODE (condition_rtx);
16438
16439   if (FLOAT_MODE_P (mode)
16440       && !TARGET_FPRS && TARGET_HARD_FLOAT)
16441     {
16442       rtx t;
16443
16444       PUT_MODE (condition_rtx, SImode);
16445       t = XEXP (condition_rtx, 0);
16446
16447       gcc_assert (cond_code == NE || cond_code == EQ);
16448
16449       if (cond_code == NE)
16450         emit_insn (gen_e500_flip_gt_bit (t, t));
16451
16452       emit_insn (gen_move_from_CR_gt_bit (result, t));
16453       return;
16454     }
16455
16456   if (cond_code == NE
16457       || cond_code == GE || cond_code == LE
16458       || cond_code == GEU || cond_code == LEU
16459       || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
16460     {
16461       rtx not_result = gen_reg_rtx (CCEQmode);
16462       rtx not_op, rev_cond_rtx;
16463       enum machine_mode cc_mode;
16464
16465       cc_mode = GET_MODE (XEXP (condition_rtx, 0));
16466
16467       rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
16468                                      SImode, XEXP (condition_rtx, 0), const0_rtx);
16469       not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
16470       emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
16471       condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
16472     }
16473
16474   op_mode = GET_MODE (XEXP (operands[1], 0));
16475   if (op_mode == VOIDmode)
16476     op_mode = GET_MODE (XEXP (operands[1], 1));
16477
16478   if (TARGET_POWERPC64 && (op_mode == DImode || FLOAT_MODE_P (mode)))
16479     {
16480       PUT_MODE (condition_rtx, DImode);
16481       convert_move (result, condition_rtx, 0);
16482     }
16483   else
16484     {
16485       PUT_MODE (condition_rtx, SImode);
16486       emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
16487     }
16488 }
16489
16490 /* Emit a branch of kind CODE to location LOC.  */
16491
16492 void
16493 rs6000_emit_cbranch (enum machine_mode mode, rtx operands[])
16494 {
16495   rtx condition_rtx, loc_ref;
16496
16497   condition_rtx = rs6000_generate_compare (operands[0], mode);
16498   loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
16499   emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
16500                                gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
16501                                                      loc_ref, pc_rtx)));
16502 }
16503
16504 /* Return the string to output a conditional branch to LABEL, which is
16505    the operand number of the label, or -1 if the branch is really a
16506    conditional return.
16507
16508    OP is the conditional expression.  XEXP (OP, 0) is assumed to be a
16509    condition code register and its mode specifies what kind of
16510    comparison we made.
16511
16512    REVERSED is nonzero if we should reverse the sense of the comparison.
16513
16514    INSN is the insn.  */
16515
16516 char *
16517 output_cbranch (rtx op, const char *label, int reversed, rtx insn)
16518 {
16519   static char string[64];
16520   enum rtx_code code = GET_CODE (op);
16521   rtx cc_reg = XEXP (op, 0);
16522   enum machine_mode mode = GET_MODE (cc_reg);
16523   int cc_regno = REGNO (cc_reg) - CR0_REGNO;
16524   int need_longbranch = label != NULL && get_attr_length (insn) == 8;
16525   int really_reversed = reversed ^ need_longbranch;
16526   char *s = string;
16527   const char *ccode;
16528   const char *pred;
16529   rtx note;
16530
16531   validate_condition_mode (code, mode);
16532
16533   /* Work out which way this really branches.  We could use
16534      reverse_condition_maybe_unordered here always but this
16535      makes the resulting assembler clearer.  */
16536   if (really_reversed)
16537     {
16538       /* Reversal of FP compares takes care -- an ordered compare
16539          becomes an unordered compare and vice versa.  */
16540       if (mode == CCFPmode)
16541         code = reverse_condition_maybe_unordered (code);
16542       else
16543         code = reverse_condition (code);
16544     }
16545
16546   if ((!TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
16547     {
16548       /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
16549          to the GT bit.  */
16550       switch (code)
16551         {
16552         case EQ:
16553           /* Opposite of GT.  */
16554           code = GT;
16555           break;
16556
16557         case NE:
16558           code = UNLE;
16559           break;
16560
16561         default:
16562           gcc_unreachable ();
16563         }
16564     }
16565
16566   switch (code)
16567     {
16568       /* Not all of these are actually distinct opcodes, but
16569          we distinguish them for clarity of the resulting assembler.  */
16570     case NE: case LTGT:
16571       ccode = "ne"; break;
16572     case EQ: case UNEQ:
16573       ccode = "eq"; break;
16574     case GE: case GEU:
16575       ccode = "ge"; break;
16576     case GT: case GTU: case UNGT:
16577       ccode = "gt"; break;
16578     case LE: case LEU:
16579       ccode = "le"; break;
16580     case LT: case LTU: case UNLT:
16581       ccode = "lt"; break;
16582     case UNORDERED: ccode = "un"; break;
16583     case ORDERED: ccode = "nu"; break;
16584     case UNGE: ccode = "nl"; break;
16585     case UNLE: ccode = "ng"; break;
16586     default:
16587       gcc_unreachable ();
16588     }
16589
16590   /* Maybe we have a guess as to how likely the branch is.
16591      The old mnemonics don't have a way to specify this information.  */
16592   pred = "";
16593   note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
16594   if (note != NULL_RTX)
16595     {
16596       /* PROB is the difference from 50%.  */
16597       int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
16598
16599       /* Only hint for highly probable/improbable branches on newer
16600          cpus as static prediction overrides processor dynamic
16601          prediction.  For older cpus we may as well always hint, but
16602          assume not taken for branches that are very close to 50% as a
16603          mispredicted taken branch is more expensive than a
16604          mispredicted not-taken branch.  */
16605       if (rs6000_always_hint
16606           || (abs (prob) > REG_BR_PROB_BASE / 100 * 48
16607               && br_prob_note_reliable_p (note)))
16608         {
16609           if (abs (prob) > REG_BR_PROB_BASE / 20
16610               && ((prob > 0) ^ need_longbranch))
16611             pred = "+";
16612           else
16613             pred = "-";
16614         }
16615     }
16616
16617   if (label == NULL)
16618     s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
16619   else
16620     s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
16621
16622   /* We need to escape any '%' characters in the reg_names string.
16623      Assume they'd only be the first character....  */
16624   if (reg_names[cc_regno + CR0_REGNO][0] == '%')
16625     *s++ = '%';
16626   s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
16627
16628   if (label != NULL)
16629     {
16630       /* If the branch distance was too far, we may have to use an
16631          unconditional branch to go the distance.  */
16632       if (need_longbranch)
16633         s += sprintf (s, ",$+8\n\tb %s", label);
16634       else
16635         s += sprintf (s, ",%s", label);
16636     }
16637
16638   return string;
16639 }
16640
16641 /* Return the string to flip the GT bit on a CR.  */
16642 char *
16643 output_e500_flip_gt_bit (rtx dst, rtx src)
16644 {
16645   static char string[64];
16646   int a, b;
16647
16648   gcc_assert (GET_CODE (dst) == REG && CR_REGNO_P (REGNO (dst))
16649               && GET_CODE (src) == REG && CR_REGNO_P (REGNO (src)));
16650
16651   /* GT bit.  */
16652   a = 4 * (REGNO (dst) - CR0_REGNO) + 1;
16653   b = 4 * (REGNO (src) - CR0_REGNO) + 1;
16654
16655   sprintf (string, "crnot %d,%d", a, b);
16656   return string;
16657 }
16658
16659 /* Return insn for VSX or Altivec comparisons.  */
16660
16661 static rtx
16662 rs6000_emit_vector_compare_inner (enum rtx_code code, rtx op0, rtx op1)
16663 {
16664   rtx mask;
16665   enum machine_mode mode = GET_MODE (op0);
16666
16667   switch (code)
16668     {
16669     default:
16670       break;
16671
16672     case GE:
16673       if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
16674         return NULL_RTX;
16675
16676     case EQ:
16677     case GT:
16678     case GTU:
16679       mask = gen_reg_rtx (mode);
16680       emit_insn (gen_rtx_SET (VOIDmode,
16681                               mask,
16682                               gen_rtx_fmt_ee (code, mode, op0, op1)));
16683       return mask;
16684     }
16685
16686   return NULL_RTX;
16687 }
16688
16689 /* Emit vector compare for operands OP0 and OP1 using code RCODE.
16690    DMODE is expected destination mode. This is a recursive function.  */
16691
16692 static rtx
16693 rs6000_emit_vector_compare (enum rtx_code rcode,
16694                             rtx op0, rtx op1,
16695                             enum machine_mode dmode)
16696 {
16697   rtx mask;
16698   bool swap_operands = false;
16699   bool try_again = false;
16700
16701   gcc_assert (VECTOR_UNIT_ALTIVEC_OR_VSX_P (dmode));
16702   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
16703
16704   /* See if the comparison works as is.  */
16705   mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
16706   if (mask)
16707     return mask;
16708
16709   switch (rcode)
16710     {
16711     case LT:
16712       rcode = GT;
16713       swap_operands = true;
16714       try_again = true;
16715       break;
16716     case LTU:
16717       rcode = GTU;
16718       swap_operands = true;
16719       try_again = true;
16720       break;
16721     case NE:
16722     case UNLE:
16723     case UNLT:
16724     case UNGE:
16725     case UNGT:
16726       /* Invert condition and try again.
16727          e.g., A != B becomes ~(A==B).  */
16728       {
16729         enum rtx_code rev_code;
16730         enum insn_code nor_code;
16731         rtx mask2;
16732
16733         rev_code = reverse_condition_maybe_unordered (rcode);
16734         if (rev_code == UNKNOWN)
16735           return NULL_RTX;
16736
16737         nor_code = optab_handler (one_cmpl_optab, dmode);
16738         if (nor_code == CODE_FOR_nothing)
16739           return NULL_RTX;
16740
16741         mask2 = rs6000_emit_vector_compare (rev_code, op0, op1, dmode);
16742         if (!mask2)
16743           return NULL_RTX;
16744
16745         mask = gen_reg_rtx (dmode);
16746         emit_insn (GEN_FCN (nor_code) (mask, mask2));
16747         return mask;
16748       }
16749       break;
16750     case GE:
16751     case GEU:
16752     case LE:
16753     case LEU:
16754       /* Try GT/GTU/LT/LTU OR EQ */
16755       {
16756         rtx c_rtx, eq_rtx;
16757         enum insn_code ior_code;
16758         enum rtx_code new_code;
16759
16760         switch (rcode)
16761           {
16762           case  GE:
16763             new_code = GT;
16764             break;
16765
16766           case GEU:
16767             new_code = GTU;
16768             break;
16769
16770           case LE:
16771             new_code = LT;
16772             break;
16773
16774           case LEU:
16775             new_code = LTU;
16776             break;
16777
16778           default:
16779             gcc_unreachable ();
16780           }
16781
16782         ior_code = optab_handler (ior_optab, dmode);
16783         if (ior_code == CODE_FOR_nothing)
16784           return NULL_RTX;
16785
16786         c_rtx = rs6000_emit_vector_compare (new_code, op0, op1, dmode);
16787         if (!c_rtx)
16788           return NULL_RTX;
16789
16790         eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1, dmode);
16791         if (!eq_rtx)
16792           return NULL_RTX;
16793
16794         mask = gen_reg_rtx (dmode);
16795         emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
16796         return mask;
16797       }
16798       break;
16799     default:
16800       return NULL_RTX;
16801     }
16802
16803   if (try_again)
16804     {
16805       if (swap_operands)
16806         {
16807           rtx tmp;
16808           tmp = op0;
16809           op0 = op1;
16810           op1 = tmp;
16811         }
16812
16813       mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
16814       if (mask)
16815         return mask;
16816     }
16817
16818   /* You only get two chances.  */
16819   return NULL_RTX;
16820 }
16821
16822 /* Emit vector conditional expression.  DEST is destination. OP_TRUE and
16823    OP_FALSE are two VEC_COND_EXPR operands.  CC_OP0 and CC_OP1 are the two
16824    operands for the relation operation COND.  */
16825
16826 int
16827 rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false,
16828                               rtx cond, rtx cc_op0, rtx cc_op1)
16829 {
16830   enum machine_mode dest_mode = GET_MODE (dest);
16831   enum rtx_code rcode = GET_CODE (cond);
16832   enum machine_mode cc_mode = CCmode;
16833   rtx mask;
16834   rtx cond2;
16835   rtx tmp;
16836   bool invert_move = false;
16837
16838   if (VECTOR_UNIT_NONE_P (dest_mode))
16839     return 0;
16840
16841   switch (rcode)
16842     {
16843       /* Swap operands if we can, and fall back to doing the operation as
16844          specified, and doing a NOR to invert the test.  */
16845     case NE:
16846     case UNLE:
16847     case UNLT:
16848     case UNGE:
16849     case UNGT:
16850       /* Invert condition and try again.
16851          e.g., A  = (B != C) ? D : E becomes A = (B == C) ? E : D.  */
16852       invert_move = true;
16853       rcode = reverse_condition_maybe_unordered (rcode);
16854       if (rcode == UNKNOWN)
16855         return 0;
16856       break;
16857
16858       /* Mark unsigned tests with CCUNSmode.  */
16859     case GTU:
16860     case GEU:
16861     case LTU:
16862     case LEU:
16863       cc_mode = CCUNSmode;
16864       break;
16865
16866     default:
16867       break;
16868     }
16869
16870   /* Get the vector mask for the given relational operations.  */
16871   mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode);
16872
16873   if (!mask)
16874     return 0;
16875
16876   if (invert_move)
16877     {
16878       tmp = op_true;
16879       op_true = op_false;
16880       op_false = tmp;
16881     }
16882
16883   cond2 = gen_rtx_fmt_ee (NE, cc_mode, mask, CONST0_RTX (dest_mode));
16884   emit_insn (gen_rtx_SET (VOIDmode,
16885                           dest,
16886                           gen_rtx_IF_THEN_ELSE (dest_mode,
16887                                                 cond2,
16888                                                 op_true,
16889                                                 op_false)));
16890   return 1;
16891 }
16892
16893 /* Emit a conditional move: move TRUE_COND to DEST if OP of the
16894    operands of the last comparison is nonzero/true, FALSE_COND if it
16895    is zero/false.  Return 0 if the hardware has no such operation.  */
16896
16897 int
16898 rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
16899 {
16900   enum rtx_code code = GET_CODE (op);
16901   rtx op0 = XEXP (op, 0);
16902   rtx op1 = XEXP (op, 1);
16903   REAL_VALUE_TYPE c1;
16904   enum machine_mode compare_mode = GET_MODE (op0);
16905   enum machine_mode result_mode = GET_MODE (dest);
16906   rtx temp;
16907   bool is_against_zero;
16908
16909   /* These modes should always match.  */
16910   if (GET_MODE (op1) != compare_mode
16911       /* In the isel case however, we can use a compare immediate, so
16912          op1 may be a small constant.  */
16913       && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
16914     return 0;
16915   if (GET_MODE (true_cond) != result_mode)
16916     return 0;
16917   if (GET_MODE (false_cond) != result_mode)
16918     return 0;
16919
16920   /* First, work out if the hardware can do this at all, or
16921      if it's too slow....  */
16922   if (!FLOAT_MODE_P (compare_mode))
16923     {
16924       if (TARGET_ISEL)
16925         return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
16926       return 0;
16927     }
16928   else if (TARGET_HARD_FLOAT && !TARGET_FPRS
16929            && SCALAR_FLOAT_MODE_P (compare_mode))
16930     return 0;
16931
16932   is_against_zero = op1 == CONST0_RTX (compare_mode);
16933
16934   /* A floating-point subtract might overflow, underflow, or produce
16935      an inexact result, thus changing the floating-point flags, so it
16936      can't be generated if we care about that.  It's safe if one side
16937      of the construct is zero, since then no subtract will be
16938      generated.  */
16939   if (SCALAR_FLOAT_MODE_P (compare_mode)
16940       && flag_trapping_math && ! is_against_zero)
16941     return 0;
16942
16943   /* Eliminate half of the comparisons by switching operands, this
16944      makes the remaining code simpler.  */
16945   if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
16946       || code == LTGT || code == LT || code == UNLE)
16947     {
16948       code = reverse_condition_maybe_unordered (code);
16949       temp = true_cond;
16950       true_cond = false_cond;
16951       false_cond = temp;
16952     }
16953
16954   /* UNEQ and LTGT take four instructions for a comparison with zero,
16955      it'll probably be faster to use a branch here too.  */
16956   if (code == UNEQ && HONOR_NANS (compare_mode))
16957     return 0;
16958
16959   if (GET_CODE (op1) == CONST_DOUBLE)
16960     REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
16961
16962   /* We're going to try to implement comparisons by performing
16963      a subtract, then comparing against zero.  Unfortunately,
16964      Inf - Inf is NaN which is not zero, and so if we don't
16965      know that the operand is finite and the comparison
16966      would treat EQ different to UNORDERED, we can't do it.  */
16967   if (HONOR_INFINITIES (compare_mode)
16968       && code != GT && code != UNGE
16969       && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
16970       /* Constructs of the form (a OP b ? a : b) are safe.  */
16971       && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
16972           || (! rtx_equal_p (op0, true_cond)
16973               && ! rtx_equal_p (op1, true_cond))))
16974     return 0;
16975
16976   /* At this point we know we can use fsel.  */
16977
16978   /* Reduce the comparison to a comparison against zero.  */
16979   if (! is_against_zero)
16980     {
16981       temp = gen_reg_rtx (compare_mode);
16982       emit_insn (gen_rtx_SET (VOIDmode, temp,
16983                               gen_rtx_MINUS (compare_mode, op0, op1)));
16984       op0 = temp;
16985       op1 = CONST0_RTX (compare_mode);
16986     }
16987
16988   /* If we don't care about NaNs we can reduce some of the comparisons
16989      down to faster ones.  */
16990   if (! HONOR_NANS (compare_mode))
16991     switch (code)
16992       {
16993       case GT:
16994         code = LE;
16995         temp = true_cond;
16996         true_cond = false_cond;
16997         false_cond = temp;
16998         break;
16999       case UNGE:
17000         code = GE;
17001         break;
17002       case UNEQ:
17003         code = EQ;
17004         break;
17005       default:
17006         break;
17007       }
17008
17009   /* Now, reduce everything down to a GE.  */
17010   switch (code)
17011     {
17012     case GE:
17013       break;
17014
17015     case LE:
17016       temp = gen_reg_rtx (compare_mode);
17017       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17018       op0 = temp;
17019       break;
17020
17021     case ORDERED:
17022       temp = gen_reg_rtx (compare_mode);
17023       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
17024       op0 = temp;
17025       break;
17026
17027     case EQ:
17028       temp = gen_reg_rtx (compare_mode);
17029       emit_insn (gen_rtx_SET (VOIDmode, temp,
17030                               gen_rtx_NEG (compare_mode,
17031                                            gen_rtx_ABS (compare_mode, op0))));
17032       op0 = temp;
17033       break;
17034
17035     case UNGE:
17036       /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
17037       temp = gen_reg_rtx (result_mode);
17038       emit_insn (gen_rtx_SET (VOIDmode, temp,
17039                               gen_rtx_IF_THEN_ELSE (result_mode,
17040                                                     gen_rtx_GE (VOIDmode,
17041                                                                 op0, op1),
17042                                                     true_cond, false_cond)));
17043       false_cond = true_cond;
17044       true_cond = temp;
17045
17046       temp = gen_reg_rtx (compare_mode);
17047       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17048       op0 = temp;
17049       break;
17050
17051     case GT:
17052       /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
17053       temp = gen_reg_rtx (result_mode);
17054       emit_insn (gen_rtx_SET (VOIDmode, temp,
17055                               gen_rtx_IF_THEN_ELSE (result_mode,
17056                                                     gen_rtx_GE (VOIDmode,
17057                                                                 op0, op1),
17058                                                     true_cond, false_cond)));
17059       true_cond = false_cond;
17060       false_cond = temp;
17061
17062       temp = gen_reg_rtx (compare_mode);
17063       emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17064       op0 = temp;
17065       break;
17066
17067     default:
17068       gcc_unreachable ();
17069     }
17070
17071   emit_insn (gen_rtx_SET (VOIDmode, dest,
17072                           gen_rtx_IF_THEN_ELSE (result_mode,
17073                                                 gen_rtx_GE (VOIDmode,
17074                                                             op0, op1),
17075                                                 true_cond, false_cond)));
17076   return 1;
17077 }
17078
17079 /* Same as above, but for ints (isel).  */
17080
17081 static int
17082 rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
17083 {
17084   rtx condition_rtx, cr;
17085   enum machine_mode mode = GET_MODE (dest);
17086   enum rtx_code cond_code;
17087   rtx (*isel_func) (rtx, rtx, rtx, rtx, rtx);
17088   bool signedp;
17089
17090   if (mode != SImode && (!TARGET_POWERPC64 || mode != DImode))
17091     return 0;
17092
17093   /* We still have to do the compare, because isel doesn't do a
17094      compare, it just looks at the CRx bits set by a previous compare
17095      instruction.  */
17096   condition_rtx = rs6000_generate_compare (op, mode);
17097   cond_code = GET_CODE (condition_rtx);
17098   cr = XEXP (condition_rtx, 0);
17099   signedp = GET_MODE (cr) == CCmode;
17100
17101   isel_func = (mode == SImode
17102                ? (signedp ? gen_isel_signed_si : gen_isel_unsigned_si)
17103                : (signedp ? gen_isel_signed_di : gen_isel_unsigned_di));
17104
17105   switch (cond_code)
17106     {
17107     case LT: case GT: case LTU: case GTU: case EQ:
17108       /* isel handles these directly.  */
17109       break;
17110
17111     default:
17112       /* We need to swap the sense of the comparison.  */
17113       {
17114         rtx t = true_cond;
17115         true_cond = false_cond;
17116         false_cond = t;
17117         PUT_CODE (condition_rtx, reverse_condition (cond_code));
17118       }
17119       break;
17120     }
17121
17122   false_cond = force_reg (mode, false_cond);
17123   if (true_cond != const0_rtx)
17124     true_cond = force_reg (mode, true_cond);
17125
17126   emit_insn (isel_func (dest, condition_rtx, true_cond, false_cond, cr));
17127
17128   return 1;
17129 }
17130
17131 const char *
17132 output_isel (rtx *operands)
17133 {
17134   enum rtx_code code;
17135
17136   code = GET_CODE (operands[1]);
17137
17138   if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
17139     {
17140       gcc_assert (GET_CODE (operands[2]) == REG
17141                   && GET_CODE (operands[3]) == REG);
17142       PUT_CODE (operands[1], reverse_condition (code));
17143       return "isel %0,%3,%2,%j1";
17144     }
17145
17146   return "isel %0,%2,%3,%j1";
17147 }
17148
17149 void
17150 rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
17151 {
17152   enum machine_mode mode = GET_MODE (op0);
17153   enum rtx_code c;
17154   rtx target;
17155
17156   /* VSX/altivec have direct min/max insns.  */
17157   if ((code == SMAX || code == SMIN)
17158       && (VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode)
17159           || (mode == SFmode && VECTOR_UNIT_VSX_P (DFmode))))
17160     {
17161       emit_insn (gen_rtx_SET (VOIDmode,
17162                               dest,
17163                               gen_rtx_fmt_ee (code, mode, op0, op1)));
17164       return;
17165     }
17166
17167   if (code == SMAX || code == SMIN)
17168     c = GE;
17169   else
17170     c = GEU;
17171
17172   if (code == SMAX || code == UMAX)
17173     target = emit_conditional_move (dest, c, op0, op1, mode,
17174                                     op0, op1, mode, 0);
17175   else
17176     target = emit_conditional_move (dest, c, op0, op1, mode,
17177                                     op1, op0, mode, 0);
17178   gcc_assert (target);
17179   if (target != dest)
17180     emit_move_insn (dest, target);
17181 }
17182
17183 /* Emit instructions to perform a load-reserved/store-conditional operation.
17184    The operation performed is an atomic
17185    (set M (CODE:MODE M OP))
17186    If not NULL, BEFORE is atomically set to M before the operation, and
17187    AFTER is set to M after the operation (that is, (CODE:MODE M OP)).
17188    If SYNC_P then a memory barrier is emitted before the operation.
17189    Either OP or M may be wrapped in a NOT operation.  */
17190
17191 void
17192 rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
17193                   rtx m, rtx op, rtx before_param, rtx after_param,
17194                   bool sync_p)
17195 {
17196   enum machine_mode used_mode;
17197   rtx the_op, set_before, set_after, set_atomic, cc_scratch, before, after;
17198   rtx used_m;
17199   rtvec vec;
17200   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
17201   rtx shift = NULL_RTX;
17202
17203   if (sync_p)
17204     emit_insn (gen_lwsync ());
17205
17206     used_m = m;
17207
17208   /* If this is smaller than SImode, we'll have to use SImode with
17209      adjustments.  */
17210   if (mode == QImode || mode == HImode)
17211     {
17212       rtx newop, oldop;
17213
17214       if (MEM_ALIGN (used_m) >= 32)
17215         {
17216           int ishift = 0;
17217           if (BYTES_BIG_ENDIAN)
17218             ishift = GET_MODE_BITSIZE (SImode) - GET_MODE_BITSIZE (mode);
17219
17220           shift = GEN_INT (ishift);
17221           used_m = change_address (used_m, SImode, 0);
17222         }
17223       else
17224         {
17225           rtx addrSI, aligned_addr;
17226           int shift_mask = mode == QImode ? 0x18 : 0x10;
17227
17228           addrSI = gen_lowpart_common (SImode,
17229                                        force_reg (Pmode, XEXP (used_m, 0)));
17230           addrSI = force_reg (SImode, addrSI);
17231           shift = gen_reg_rtx (SImode);
17232
17233           emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
17234                                  GEN_INT (shift_mask)));
17235           emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
17236
17237           aligned_addr = expand_binop (Pmode, and_optab,
17238                                        XEXP (used_m, 0),
17239                                        GEN_INT (-4), NULL_RTX,
17240                                        1, OPTAB_LIB_WIDEN);
17241           used_m = change_address (used_m, SImode, aligned_addr);
17242           set_mem_align (used_m, 32);
17243         }
17244       /* It's safe to keep the old alias set of USED_M, because
17245          the operation is atomic and only affects the original
17246          USED_M.  */
17247       m = used_m;
17248
17249       if (GET_CODE (op) == NOT)
17250         {
17251           oldop = lowpart_subreg (SImode, XEXP (op, 0), mode);
17252           oldop = gen_rtx_NOT (SImode, oldop);
17253         }
17254       else
17255         oldop = lowpart_subreg (SImode, op, mode);
17256
17257       switch (code)
17258         {
17259         case IOR:
17260         case XOR:
17261           newop = expand_binop (SImode, and_optab,
17262                                 oldop, GEN_INT (imask), NULL_RTX,
17263                                 1, OPTAB_LIB_WIDEN);
17264           emit_insn (gen_ashlsi3 (newop, newop, shift));
17265           break;
17266
17267         case NOT: /* NAND */
17268           newop = expand_binop (SImode, ior_optab,
17269                                 oldop, GEN_INT (~imask), NULL_RTX,
17270                                 1, OPTAB_LIB_WIDEN);
17271           emit_insn (gen_rotlsi3 (newop, newop, shift));
17272           break;
17273
17274         case AND:
17275           newop = expand_binop (SImode, ior_optab,
17276                                 oldop, GEN_INT (~imask), NULL_RTX,
17277                                 1, OPTAB_LIB_WIDEN);
17278           emit_insn (gen_rotlsi3 (newop, newop, shift));
17279           break;
17280
17281         case PLUS:
17282         case MINUS:
17283           {
17284             rtx mask;
17285
17286             newop = expand_binop (SImode, and_optab,
17287                                   oldop, GEN_INT (imask), NULL_RTX,
17288                                   1, OPTAB_LIB_WIDEN);
17289             emit_insn (gen_ashlsi3 (newop, newop, shift));
17290
17291             mask = gen_reg_rtx (SImode);
17292             emit_move_insn (mask, GEN_INT (imask));
17293             emit_insn (gen_ashlsi3 (mask, mask, shift));
17294
17295             if (code == PLUS)
17296               newop = gen_rtx_PLUS (SImode, m, newop);
17297             else
17298               newop = gen_rtx_MINUS (SImode, m, newop);
17299             newop = gen_rtx_AND (SImode, newop, mask);
17300             newop = gen_rtx_IOR (SImode, newop,
17301                                  gen_rtx_AND (SImode,
17302                                               gen_rtx_NOT (SImode, mask),
17303                                               m));
17304             break;
17305           }
17306
17307         default:
17308           gcc_unreachable ();
17309         }
17310
17311       op = newop;
17312       used_mode = SImode;
17313       before = gen_reg_rtx (used_mode);
17314       after = gen_reg_rtx (used_mode);
17315     }
17316   else
17317     {
17318       used_mode = mode;
17319       before = before_param;
17320       after = after_param;
17321
17322       if (before == NULL_RTX)
17323         before = gen_reg_rtx (used_mode);
17324       if (after == NULL_RTX)
17325         after = gen_reg_rtx (used_mode);
17326     }
17327
17328   if ((code == PLUS || code == MINUS)
17329       && used_mode != mode)
17330     the_op = op;  /* Computed above.  */
17331   else if (GET_CODE (op) == NOT && GET_CODE (m) != NOT)
17332     the_op = gen_rtx_fmt_ee (code, used_mode, op, m);
17333   else if (code == NOT)
17334     the_op = gen_rtx_fmt_ee (IOR, used_mode,
17335                              gen_rtx_NOT (used_mode, m),
17336                              gen_rtx_NOT (used_mode, op));
17337   else
17338     the_op = gen_rtx_fmt_ee (code, used_mode, m, op);
17339
17340   set_after = gen_rtx_SET (VOIDmode, after, the_op);
17341   set_before = gen_rtx_SET (VOIDmode, before, used_m);
17342   set_atomic = gen_rtx_SET (VOIDmode, used_m,
17343                             gen_rtx_UNSPEC (used_mode,
17344                                             gen_rtvec (1, the_op),
17345                                             UNSPEC_SYNC_OP));
17346   cc_scratch = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
17347
17348   if ((code == PLUS || code == MINUS) && used_mode != mode)
17349     vec = gen_rtvec (5, set_after, set_before, set_atomic, cc_scratch,
17350                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
17351   else
17352     vec = gen_rtvec (4, set_after, set_before, set_atomic, cc_scratch);
17353   emit_insn (gen_rtx_PARALLEL (VOIDmode, vec));
17354
17355   /* Shift and mask the return values properly.  */
17356   if (used_mode != mode && before_param)
17357     {
17358       emit_insn (gen_lshrsi3 (before, before, shift));
17359       convert_move (before_param, before, 1);
17360     }
17361
17362   if (used_mode != mode && after_param)
17363     {
17364       emit_insn (gen_lshrsi3 (after, after, shift));
17365       convert_move (after_param, after, 1);
17366     }
17367
17368   /* The previous sequence will end with a branch that's dependent on
17369      the conditional store, so placing an isync will ensure that no
17370      other instructions (especially, no load or store instructions)
17371      can start before the atomic operation completes.  */
17372   if (sync_p)
17373     emit_insn (gen_isync ());
17374 }
17375
17376 /* A subroutine of the atomic operation splitters.  Jump to LABEL if
17377    COND is true.  Mark the jump as unlikely to be taken.  */
17378
17379 static void
17380 emit_unlikely_jump (rtx cond, rtx label)
17381 {
17382   rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
17383   rtx x;
17384
17385   x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
17386   x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
17387   add_reg_note (x, REG_BR_PROB, very_unlikely);
17388 }
17389
17390 /* A subroutine of the atomic operation splitters.  Emit a load-locked
17391    instruction in MODE.  */
17392
17393 static void
17394 emit_load_locked (enum machine_mode mode, rtx reg, rtx mem)
17395 {
17396   rtx (*fn) (rtx, rtx) = NULL;
17397   if (mode == SImode)
17398     fn = gen_load_locked_si;
17399   else if (mode == DImode)
17400     fn = gen_load_locked_di;
17401   emit_insn (fn (reg, mem));
17402 }
17403
17404 /* A subroutine of the atomic operation splitters.  Emit a store-conditional
17405    instruction in MODE.  */
17406
17407 static void
17408 emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
17409 {
17410   rtx (*fn) (rtx, rtx, rtx) = NULL;
17411   if (mode == SImode)
17412     fn = gen_store_conditional_si;
17413   else if (mode == DImode)
17414     fn = gen_store_conditional_di;
17415
17416   /* Emit sync before stwcx. to address PPC405 Erratum.  */
17417   if (PPC405_ERRATUM77)
17418     emit_insn (gen_memory_barrier ());
17419
17420   emit_insn (fn (res, mem, val));
17421 }
17422
17423 /* Expand an atomic fetch-and-operate pattern.  CODE is the binary operation
17424    to perform.  MEM is the memory on which to operate.  VAL is the second
17425    operand of the binary operator.  BEFORE and AFTER are optional locations to
17426    return the value of MEM either before of after the operation.  SCRATCH is
17427    a scratch register.  */
17428
17429 void
17430 rs6000_split_atomic_op (enum rtx_code code, rtx mem, rtx val,
17431                        rtx before, rtx after, rtx scratch)
17432 {
17433   enum machine_mode mode = GET_MODE (mem);
17434   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17435
17436   emit_insn (gen_lwsync ());
17437
17438   label = gen_label_rtx ();
17439   emit_label (label);
17440   label = gen_rtx_LABEL_REF (VOIDmode, label);
17441
17442   if (before == NULL_RTX)
17443     before = scratch;
17444   emit_load_locked (mode, before, mem);
17445
17446   if (code == NOT)
17447     x = gen_rtx_IOR (mode,
17448                      gen_rtx_NOT (mode, before),
17449                      gen_rtx_NOT (mode, val));
17450   else if (code == AND)
17451     x = gen_rtx_UNSPEC (mode, gen_rtvec (2, before, val), UNSPEC_AND);
17452   else
17453     x = gen_rtx_fmt_ee (code, mode, before, val);
17454
17455   if (after != NULL_RTX)
17456     emit_insn (gen_rtx_SET (VOIDmode, after, copy_rtx (x)));
17457   emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
17458
17459   emit_store_conditional (mode, cond, mem, scratch);
17460
17461   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17462   emit_unlikely_jump (x, label);
17463
17464   emit_insn (gen_isync ());
17465 }
17466
17467 /* Expand an atomic compare and swap operation.  MEM is the memory on which
17468    to operate.  OLDVAL is the old value to be compared.  NEWVAL is the new
17469    value to be stored.  SCRATCH is a scratch GPR.  */
17470
17471 void
17472 rs6000_split_compare_and_swap (rtx retval, rtx mem, rtx oldval, rtx newval,
17473                                rtx scratch)
17474 {
17475   enum machine_mode mode = GET_MODE (mem);
17476   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17477
17478   emit_insn (gen_lwsync ());
17479
17480   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17481   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17482   emit_label (XEXP (label1, 0));
17483
17484   emit_load_locked (mode, retval, mem);
17485
17486   x = gen_rtx_COMPARE (CCmode, retval, oldval);
17487   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
17488
17489   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17490   emit_unlikely_jump (x, label2);
17491
17492   emit_move_insn (scratch, newval);
17493   emit_store_conditional (mode, cond, mem, scratch);
17494
17495   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17496   emit_unlikely_jump (x, label1);
17497
17498   emit_insn (gen_isync ());
17499   emit_label (XEXP (label2, 0));
17500 }
17501
17502 /* Expand an atomic test and set operation.  MEM is the memory on which
17503    to operate.  VAL is the value set.  SCRATCH is a scratch GPR.  */
17504
17505 void
17506 rs6000_split_lock_test_and_set (rtx retval, rtx mem, rtx val, rtx scratch)
17507 {
17508   enum machine_mode mode = GET_MODE (mem);
17509   rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17510
17511   label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17512   emit_label (XEXP (label, 0));
17513
17514   emit_load_locked (mode, retval, mem);
17515   emit_move_insn (scratch, val);
17516   emit_store_conditional (mode, cond, mem, scratch);
17517
17518   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17519   emit_unlikely_jump (x, label);
17520
17521   emit_insn (gen_isync ());
17522 }
17523
17524 void
17525 rs6000_expand_compare_and_swapqhi (rtx dst, rtx mem, rtx oldval, rtx newval)
17526 {
17527   enum machine_mode mode = GET_MODE (mem);
17528   rtx addrSI, align, wdst, shift, mask;
17529   HOST_WIDE_INT shift_mask = mode == QImode ? 0x18 : 0x10;
17530   HOST_WIDE_INT imask = GET_MODE_MASK (mode);
17531
17532   /* Shift amount for subword relative to aligned word.  */
17533   addrSI = force_reg (GET_MODE (XEXP (mem, 0)), XEXP (mem, 0));
17534   addrSI = force_reg (SImode, gen_lowpart_common (SImode, addrSI));
17535   shift = gen_reg_rtx (SImode);
17536   emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
17537                          GEN_INT (shift_mask)));
17538   emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
17539
17540   /* Shift and mask old value into position within word.  */
17541   oldval = convert_modes (SImode, mode, oldval, 1);
17542   oldval = expand_binop (SImode, and_optab,
17543                          oldval, GEN_INT (imask), NULL_RTX,
17544                          1, OPTAB_LIB_WIDEN);
17545   emit_insn (gen_ashlsi3 (oldval, oldval, shift));
17546
17547   /* Shift and mask new value into position within word.  */
17548   newval = convert_modes (SImode, mode, newval, 1);
17549   newval = expand_binop (SImode, and_optab,
17550                          newval, GEN_INT (imask), NULL_RTX,
17551                          1, OPTAB_LIB_WIDEN);
17552   emit_insn (gen_ashlsi3 (newval, newval, shift));
17553
17554   /* Mask for insertion.  */
17555   mask = gen_reg_rtx (SImode);
17556   emit_move_insn (mask, GEN_INT (imask));
17557   emit_insn (gen_ashlsi3 (mask, mask, shift));
17558
17559   /* Address of aligned word containing subword.  */
17560   align = expand_binop (Pmode, and_optab, XEXP (mem, 0), GEN_INT (-4),
17561                         NULL_RTX, 1, OPTAB_LIB_WIDEN);
17562   mem = change_address (mem, SImode, align);
17563   set_mem_align (mem, 32);
17564   MEM_VOLATILE_P (mem) = 1;
17565
17566   wdst = gen_reg_rtx (SImode);
17567   emit_insn (gen_sync_compare_and_swapqhi_internal (wdst, mask,
17568                                                     oldval, newval, mem));
17569
17570   /* Shift the result back.  */
17571   emit_insn (gen_lshrsi3 (wdst, wdst, shift));
17572
17573   emit_move_insn (dst, gen_lowpart (mode, wdst));
17574 }
17575
17576 void
17577 rs6000_split_compare_and_swapqhi (rtx dest, rtx mask,
17578                                   rtx oldval, rtx newval, rtx mem,
17579                                   rtx scratch)
17580 {
17581   rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
17582
17583   emit_insn (gen_lwsync ());
17584   label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17585   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
17586   emit_label (XEXP (label1, 0));
17587
17588   emit_load_locked (SImode, scratch, mem);
17589
17590   /* Mask subword within loaded value for comparison with oldval.
17591      Use UNSPEC_AND to avoid clobber.*/
17592   emit_insn (gen_rtx_SET (SImode, dest,
17593                           gen_rtx_UNSPEC (SImode,
17594                                           gen_rtvec (2, scratch, mask),
17595                                           UNSPEC_AND)));
17596
17597   x = gen_rtx_COMPARE (CCmode, dest, oldval);
17598   emit_insn (gen_rtx_SET (VOIDmode, cond, x));
17599
17600   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17601   emit_unlikely_jump (x, label2);
17602
17603   /* Clear subword within loaded value for insertion of new value.  */
17604   emit_insn (gen_rtx_SET (SImode, scratch,
17605                           gen_rtx_AND (SImode,
17606                                        gen_rtx_NOT (SImode, mask), scratch)));
17607   emit_insn (gen_iorsi3 (scratch, scratch, newval));
17608   emit_store_conditional (SImode, cond, mem, scratch);
17609
17610   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
17611   emit_unlikely_jump (x, label1);
17612
17613   emit_insn (gen_isync ());
17614   emit_label (XEXP (label2, 0));
17615 }
17616
17617
17618   /* Emit instructions to move SRC to DST.  Called by splitters for
17619    multi-register moves.  It will emit at most one instruction for
17620    each register that is accessed; that is, it won't emit li/lis pairs
17621    (or equivalent for 64-bit code).  One of SRC or DST must be a hard
17622    register.  */
17623
17624 void
17625 rs6000_split_multireg_move (rtx dst, rtx src)
17626 {
17627   /* The register number of the first register being moved.  */
17628   int reg;
17629   /* The mode that is to be moved.  */
17630   enum machine_mode mode;
17631   /* The mode that the move is being done in, and its size.  */
17632   enum machine_mode reg_mode;
17633   int reg_mode_size;
17634   /* The number of registers that will be moved.  */
17635   int nregs;
17636
17637   reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
17638   mode = GET_MODE (dst);
17639   nregs = hard_regno_nregs[reg][mode];
17640   if (FP_REGNO_P (reg))
17641     reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : 
17642         ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? DFmode : SFmode);
17643   else if (ALTIVEC_REGNO_P (reg))
17644     reg_mode = V16QImode;
17645   else if (TARGET_E500_DOUBLE && mode == TFmode)
17646     reg_mode = DFmode;
17647   else
17648     reg_mode = word_mode;
17649   reg_mode_size = GET_MODE_SIZE (reg_mode);
17650
17651   gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
17652
17653   if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
17654     {
17655       /* Move register range backwards, if we might have destructive
17656          overlap.  */
17657       int i;
17658       for (i = nregs - 1; i >= 0; i--)
17659         emit_insn (gen_rtx_SET (VOIDmode,
17660                                 simplify_gen_subreg (reg_mode, dst, mode,
17661                                                      i * reg_mode_size),
17662                                 simplify_gen_subreg (reg_mode, src, mode,
17663                                                      i * reg_mode_size)));
17664     }
17665   else
17666     {
17667       int i;
17668       int j = -1;
17669       bool used_update = false;
17670       rtx restore_basereg = NULL_RTX;
17671
17672       if (MEM_P (src) && INT_REGNO_P (reg))
17673         {
17674           rtx breg;
17675
17676           if (GET_CODE (XEXP (src, 0)) == PRE_INC
17677               || GET_CODE (XEXP (src, 0)) == PRE_DEC)
17678             {
17679               rtx delta_rtx;
17680               breg = XEXP (XEXP (src, 0), 0);
17681               delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
17682                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
17683                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
17684               emit_insn (gen_add3_insn (breg, breg, delta_rtx));
17685               src = replace_equiv_address (src, breg);
17686             }
17687           else if (! rs6000_offsettable_memref_p (src))
17688             {
17689               if (GET_CODE (XEXP (src, 0)) == PRE_MODIFY)
17690                 {
17691                   rtx basereg = XEXP (XEXP (src, 0), 0);
17692                   if (TARGET_UPDATE)
17693                     {
17694                       rtx ndst = simplify_gen_subreg (reg_mode, dst, mode, 0);
17695                       emit_insn (gen_rtx_SET (VOIDmode, ndst,
17696                                  gen_rtx_MEM (reg_mode, XEXP (src, 0))));
17697                       used_update = true;
17698                     }
17699                   else
17700                     emit_insn (gen_rtx_SET (VOIDmode, basereg,
17701                                XEXP (XEXP (src, 0), 1)));
17702                   src = replace_equiv_address (src, basereg);
17703                 }
17704               else
17705                 {
17706                   rtx basereg = gen_rtx_REG (Pmode, reg);
17707                   emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0)));
17708                   src = replace_equiv_address (src, basereg);
17709                 }
17710             }
17711
17712           breg = XEXP (src, 0);
17713           if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
17714             breg = XEXP (breg, 0);
17715
17716           /* If the base register we are using to address memory is
17717              also a destination reg, then change that register last.  */
17718           if (REG_P (breg)
17719               && REGNO (breg) >= REGNO (dst)
17720               && REGNO (breg) < REGNO (dst) + nregs)
17721             j = REGNO (breg) - REGNO (dst);
17722         }
17723       else if (MEM_P (dst) && INT_REGNO_P (reg))
17724         {
17725           rtx breg;
17726
17727           if (GET_CODE (XEXP (dst, 0)) == PRE_INC
17728               || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
17729             {
17730               rtx delta_rtx;
17731               breg = XEXP (XEXP (dst, 0), 0);
17732               delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
17733                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
17734                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
17735
17736               /* We have to update the breg before doing the store.
17737                  Use store with update, if available.  */
17738
17739               if (TARGET_UPDATE)
17740                 {
17741                   rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
17742                   emit_insn (TARGET_32BIT
17743                              ? (TARGET_POWERPC64
17744                                 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
17745                                 : gen_movsi_update (breg, breg, delta_rtx, nsrc))
17746                              : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
17747                   used_update = true;
17748                 }
17749               else
17750                 emit_insn (gen_add3_insn (breg, breg, delta_rtx));
17751               dst = replace_equiv_address (dst, breg);
17752             }
17753           else if (!rs6000_offsettable_memref_p (dst)
17754                    && GET_CODE (XEXP (dst, 0)) != LO_SUM)
17755             {
17756               if (GET_CODE (XEXP (dst, 0)) == PRE_MODIFY)
17757                 {
17758                   rtx basereg = XEXP (XEXP (dst, 0), 0);
17759                   if (TARGET_UPDATE)
17760                     {
17761                       rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
17762                       emit_insn (gen_rtx_SET (VOIDmode,
17763                                  gen_rtx_MEM (reg_mode, XEXP (dst, 0)), nsrc));
17764                       used_update = true;
17765                     }
17766                   else
17767                     emit_insn (gen_rtx_SET (VOIDmode, basereg,
17768                                XEXP (XEXP (dst, 0), 1)));
17769                   dst = replace_equiv_address (dst, basereg);
17770                 }
17771               else
17772                 {
17773                   rtx basereg = XEXP (XEXP (dst, 0), 0);
17774                   rtx offsetreg = XEXP (XEXP (dst, 0), 1);
17775                   gcc_assert (GET_CODE (XEXP (dst, 0)) == PLUS
17776                               && REG_P (basereg)
17777                               && REG_P (offsetreg)
17778                               && REGNO (basereg) != REGNO (offsetreg));
17779                   if (REGNO (basereg) == 0)
17780                     {
17781                       rtx tmp = offsetreg;
17782                       offsetreg = basereg;
17783                       basereg = tmp;
17784                     }
17785                   emit_insn (gen_add3_insn (basereg, basereg, offsetreg));
17786                   restore_basereg = gen_sub3_insn (basereg, basereg, offsetreg);
17787                   dst = replace_equiv_address (dst, basereg);
17788                 }
17789             }
17790           else if (GET_CODE (XEXP (dst, 0)) != LO_SUM)
17791             gcc_assert (rs6000_offsettable_memref_p (dst));
17792         }
17793
17794       for (i = 0; i < nregs; i++)
17795         {
17796           /* Calculate index to next subword.  */
17797           ++j;
17798           if (j == nregs)
17799             j = 0;
17800
17801           /* If compiler already emitted move of first word by
17802              store with update, no need to do anything.  */
17803           if (j == 0 && used_update)
17804             continue;
17805
17806           emit_insn (gen_rtx_SET (VOIDmode,
17807                                   simplify_gen_subreg (reg_mode, dst, mode,
17808                                                        j * reg_mode_size),
17809                                   simplify_gen_subreg (reg_mode, src, mode,
17810                                                        j * reg_mode_size)));
17811         }
17812       if (restore_basereg != NULL_RTX)
17813         emit_insn (restore_basereg);
17814     }
17815 }
17816
17817 \f
17818 /* This page contains routines that are used to determine what the
17819    function prologue and epilogue code will do and write them out.  */
17820
17821 /* Return the first fixed-point register that is required to be
17822    saved. 32 if none.  */
17823
17824 int
17825 first_reg_to_save (void)
17826 {
17827   int first_reg;
17828
17829   /* Find lowest numbered live register.  */
17830   for (first_reg = 13; first_reg <= 31; first_reg++)
17831     if (df_regs_ever_live_p (first_reg)
17832         && (! call_used_regs[first_reg]
17833             || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
17834                 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
17835                     || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
17836                     || (TARGET_TOC && TARGET_MINIMAL_TOC)))))
17837       break;
17838
17839 #if TARGET_MACHO
17840   if (flag_pic
17841       && crtl->uses_pic_offset_table
17842       && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
17843     return RS6000_PIC_OFFSET_TABLE_REGNUM;
17844 #endif
17845
17846   return first_reg;
17847 }
17848
17849 /* Similar, for FP regs.  */
17850
17851 int
17852 first_fp_reg_to_save (void)
17853 {
17854   int first_reg;
17855
17856   /* Find lowest numbered live register.  */
17857   for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
17858     if (df_regs_ever_live_p (first_reg))
17859       break;
17860
17861   return first_reg;
17862 }
17863
17864 /* Similar, for AltiVec regs.  */
17865
17866 static int
17867 first_altivec_reg_to_save (void)
17868 {
17869   int i;
17870
17871   /* Stack frame remains as is unless we are in AltiVec ABI.  */
17872   if (! TARGET_ALTIVEC_ABI)
17873     return LAST_ALTIVEC_REGNO + 1;
17874
17875   /* On Darwin, the unwind routines are compiled without
17876      TARGET_ALTIVEC, and use save_world to save/restore the
17877      altivec registers when necessary.  */
17878   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
17879       && ! TARGET_ALTIVEC)
17880     return FIRST_ALTIVEC_REGNO + 20;
17881
17882   /* Find lowest numbered live register.  */
17883   for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
17884     if (df_regs_ever_live_p (i))
17885       break;
17886
17887   return i;
17888 }
17889
17890 /* Return a 32-bit mask of the AltiVec registers we need to set in
17891    VRSAVE.  Bit n of the return value is 1 if Vn is live.  The MSB in
17892    the 32-bit word is 0.  */
17893
17894 static unsigned int
17895 compute_vrsave_mask (void)
17896 {
17897   unsigned int i, mask = 0;
17898
17899   /* On Darwin, the unwind routines are compiled without
17900      TARGET_ALTIVEC, and use save_world to save/restore the
17901      call-saved altivec registers when necessary.  */
17902   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
17903       && ! TARGET_ALTIVEC)
17904     mask |= 0xFFF;
17905
17906   /* First, find out if we use _any_ altivec registers.  */
17907   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
17908     if (df_regs_ever_live_p (i))
17909       mask |= ALTIVEC_REG_BIT (i);
17910
17911   if (mask == 0)
17912     return mask;
17913
17914   /* Next, remove the argument registers from the set.  These must
17915      be in the VRSAVE mask set by the caller, so we don't need to add
17916      them in again.  More importantly, the mask we compute here is
17917      used to generate CLOBBERs in the set_vrsave insn, and we do not
17918      wish the argument registers to die.  */
17919   for (i = crtl->args.info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
17920     mask &= ~ALTIVEC_REG_BIT (i);
17921
17922   /* Similarly, remove the return value from the set.  */
17923   {
17924     bool yes = false;
17925     diddle_return_value (is_altivec_return_reg, &yes);
17926     if (yes)
17927       mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
17928   }
17929
17930   return mask;
17931 }
17932
17933 /* For a very restricted set of circumstances, we can cut down the
17934    size of prologues/epilogues by calling our own save/restore-the-world
17935    routines.  */
17936
17937 static void
17938 compute_save_world_info (rs6000_stack_t *info_ptr)
17939 {
17940   info_ptr->world_save_p = 1;
17941   info_ptr->world_save_p
17942     = (WORLD_SAVE_P (info_ptr)
17943        && DEFAULT_ABI == ABI_DARWIN
17944        && ! (cfun->calls_setjmp && flag_exceptions)
17945        && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
17946        && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
17947        && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
17948        && info_ptr->cr_save_p);
17949
17950   /* This will not work in conjunction with sibcalls.  Make sure there
17951      are none.  (This check is expensive, but seldom executed.) */
17952   if (WORLD_SAVE_P (info_ptr))
17953     {
17954       rtx insn;
17955       for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
17956         if ( GET_CODE (insn) == CALL_INSN
17957              && SIBLING_CALL_P (insn))
17958           {
17959             info_ptr->world_save_p = 0;
17960             break;
17961           }
17962     }
17963
17964   if (WORLD_SAVE_P (info_ptr))
17965     {
17966       /* Even if we're not touching VRsave, make sure there's room on the
17967          stack for it, if it looks like we're calling SAVE_WORLD, which
17968          will attempt to save it. */
17969       info_ptr->vrsave_size  = 4;
17970
17971       /* If we are going to save the world, we need to save the link register too.  */
17972       info_ptr->lr_save_p = 1;
17973
17974       /* "Save" the VRsave register too if we're saving the world.  */
17975       if (info_ptr->vrsave_mask == 0)
17976         info_ptr->vrsave_mask = compute_vrsave_mask ();
17977
17978       /* Because the Darwin register save/restore routines only handle
17979          F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
17980          check.  */
17981       gcc_assert (info_ptr->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
17982                   && (info_ptr->first_altivec_reg_save
17983                       >= FIRST_SAVED_ALTIVEC_REGNO));
17984     }
17985   return;
17986 }
17987
17988
17989 static void
17990 is_altivec_return_reg (rtx reg, void *xyes)
17991 {
17992   bool *yes = (bool *) xyes;
17993   if (REGNO (reg) == ALTIVEC_ARG_RETURN)
17994     *yes = true;
17995 }
17996
17997 \f
17998 /* Determine the strategy for savings/restoring registers.  */
17999
18000 enum {
18001   SAVRES_MULTIPLE = 0x1,
18002   SAVE_INLINE_FPRS = 0x2,
18003   SAVE_INLINE_GPRS = 0x4,
18004   REST_INLINE_FPRS = 0x8,
18005   REST_INLINE_GPRS = 0x10,
18006   SAVE_NOINLINE_GPRS_SAVES_LR = 0x20,
18007   SAVE_NOINLINE_FPRS_SAVES_LR = 0x40,
18008   REST_NOINLINE_FPRS_DOESNT_RESTORE_LR = 0x80
18009 };
18010
18011 static int
18012 rs6000_savres_strategy (rs6000_stack_t *info,
18013                         bool using_static_chain_p)
18014 {
18015   int strategy = 0;
18016
18017   if (TARGET_MULTIPLE
18018       && !TARGET_POWERPC64
18019       && !(TARGET_SPE_ABI && info->spe_64bit_regs_used)
18020       && info->first_gp_reg_save < 31
18021       && no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true))
18022     strategy |= SAVRES_MULTIPLE;
18023
18024   if (crtl->calls_eh_return
18025       || cfun->machine->ra_need_lr
18026       || info->total_size > 32767)
18027     strategy |= (SAVE_INLINE_FPRS | REST_INLINE_FPRS
18028                  | SAVE_INLINE_GPRS | REST_INLINE_GPRS);
18029
18030   if (info->first_fp_reg_save == 64
18031       || FP_SAVE_INLINE (info->first_fp_reg_save)
18032       /* The out-of-line FP routines use double-precision stores;
18033          we can't use those routines if we don't have such stores.  */
18034       || (TARGET_HARD_FLOAT && !TARGET_DOUBLE_FLOAT)
18035       || !no_global_regs_above (info->first_fp_reg_save, /*gpr=*/false))
18036     strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
18037
18038   if (info->first_gp_reg_save == 32
18039       || GP_SAVE_INLINE (info->first_gp_reg_save)
18040       || !((strategy & SAVRES_MULTIPLE)
18041            || no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true)))
18042     strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
18043
18044   /* Don't bother to try to save things out-of-line if r11 is occupied
18045      by the static chain.  It would require too much fiddling and the
18046      static chain is rarely used anyway.  */
18047   if (using_static_chain_p)
18048     strategy |= SAVE_INLINE_FPRS | SAVE_INLINE_GPRS;
18049
18050   /* If we are going to use store multiple, then don't even bother
18051      with the out-of-line routines, since the store-multiple
18052      instruction will always be smaller.  */
18053   if ((strategy & SAVRES_MULTIPLE))
18054     strategy |= SAVE_INLINE_GPRS;
18055
18056   /* The situation is more complicated with load multiple.  We'd
18057      prefer to use the out-of-line routines for restores, since the
18058      "exit" out-of-line routines can handle the restore of LR and the
18059      frame teardown.  However if doesn't make sense to use the
18060      out-of-line routine if that is the only reason we'd need to save
18061      LR, and we can't use the "exit" out-of-line gpr restore if we
18062      have saved some fprs; In those cases it is advantageous to use
18063      load multiple when available.  */
18064   if ((strategy & SAVRES_MULTIPLE)
18065       && (!info->lr_save_p
18066           || info->first_fp_reg_save != 64))
18067     strategy |= REST_INLINE_GPRS;
18068
18069   /* We can only use load multiple or the out-of-line routines to
18070      restore if we've used store multiple or out-of-line routines
18071      in the prologue, i.e. if we've saved all the registers from
18072      first_gp_reg_save.  Otherwise, we risk loading garbage.  */
18073   if ((strategy & (SAVE_INLINE_GPRS | SAVRES_MULTIPLE)) == SAVE_INLINE_GPRS)
18074     strategy |= REST_INLINE_GPRS;
18075
18076   /* Saving CR interferes with the exit routines used on the SPE, so
18077      just punt here.  */
18078   if (TARGET_SPE_ABI
18079       && info->spe_64bit_regs_used
18080       && info->cr_save_p)
18081     strategy |= REST_INLINE_GPRS;
18082
18083 #ifdef POWERPC_LINUX
18084   if (TARGET_64BIT)
18085     {
18086       if (!(strategy & SAVE_INLINE_FPRS))
18087         strategy |= SAVE_NOINLINE_FPRS_SAVES_LR;
18088       else if (!(strategy & SAVE_INLINE_GPRS)
18089                && info->first_fp_reg_save == 64)
18090         strategy |= SAVE_NOINLINE_GPRS_SAVES_LR;
18091     }
18092 #else
18093   if (TARGET_AIX && !(strategy & REST_INLINE_FPRS))
18094     strategy |= REST_NOINLINE_FPRS_DOESNT_RESTORE_LR;
18095 #endif
18096   return strategy;
18097 }
18098
18099 /* Calculate the stack information for the current function.  This is
18100    complicated by having two separate calling sequences, the AIX calling
18101    sequence and the V.4 calling sequence.
18102
18103    AIX (and Darwin/Mac OS X) stack frames look like:
18104                                                           32-bit  64-bit
18105         SP----> +---------------------------------------+
18106                 | back chain to caller                  | 0       0
18107                 +---------------------------------------+
18108                 | saved CR                              | 4       8 (8-11)
18109                 +---------------------------------------+
18110                 | saved LR                              | 8       16
18111                 +---------------------------------------+
18112                 | reserved for compilers                | 12      24
18113                 +---------------------------------------+
18114                 | reserved for binders                  | 16      32
18115                 +---------------------------------------+
18116                 | saved TOC pointer                     | 20      40
18117                 +---------------------------------------+
18118                 | Parameter save area (P)               | 24      48
18119                 +---------------------------------------+
18120                 | Alloca space (A)                      | 24+P    etc.
18121                 +---------------------------------------+
18122                 | Local variable space (L)              | 24+P+A
18123                 +---------------------------------------+
18124                 | Float/int conversion temporary (X)    | 24+P+A+L
18125                 +---------------------------------------+
18126                 | Save area for AltiVec registers (W)   | 24+P+A+L+X
18127                 +---------------------------------------+
18128                 | AltiVec alignment padding (Y)         | 24+P+A+L+X+W
18129                 +---------------------------------------+
18130                 | Save area for VRSAVE register (Z)     | 24+P+A+L+X+W+Y
18131                 +---------------------------------------+
18132                 | Save area for GP registers (G)        | 24+P+A+X+L+X+W+Y+Z
18133                 +---------------------------------------+
18134                 | Save area for FP registers (F)        | 24+P+A+X+L+X+W+Y+Z+G
18135                 +---------------------------------------+
18136         old SP->| back chain to caller's caller         |
18137                 +---------------------------------------+
18138
18139    The required alignment for AIX configurations is two words (i.e., 8
18140    or 16 bytes).
18141
18142
18143    V.4 stack frames look like:
18144
18145         SP----> +---------------------------------------+
18146                 | back chain to caller                  | 0
18147                 +---------------------------------------+
18148                 | caller's saved LR                     | 4
18149                 +---------------------------------------+
18150                 | Parameter save area (P)               | 8
18151                 +---------------------------------------+
18152                 | Alloca space (A)                      | 8+P
18153                 +---------------------------------------+
18154                 | Varargs save area (V)                 | 8+P+A
18155                 +---------------------------------------+
18156                 | Local variable space (L)              | 8+P+A+V
18157                 +---------------------------------------+
18158                 | Float/int conversion temporary (X)    | 8+P+A+V+L
18159                 +---------------------------------------+
18160                 | Save area for AltiVec registers (W)   | 8+P+A+V+L+X
18161                 +---------------------------------------+
18162                 | AltiVec alignment padding (Y)         | 8+P+A+V+L+X+W
18163                 +---------------------------------------+
18164                 | Save area for VRSAVE register (Z)     | 8+P+A+V+L+X+W+Y
18165                 +---------------------------------------+
18166                 | SPE: area for 64-bit GP registers     |
18167                 +---------------------------------------+
18168                 | SPE alignment padding                 |
18169                 +---------------------------------------+
18170                 | saved CR (C)                          | 8+P+A+V+L+X+W+Y+Z
18171                 +---------------------------------------+
18172                 | Save area for GP registers (G)        | 8+P+A+V+L+X+W+Y+Z+C
18173                 +---------------------------------------+
18174                 | Save area for FP registers (F)        | 8+P+A+V+L+X+W+Y+Z+C+G
18175                 +---------------------------------------+
18176         old SP->| back chain to caller's caller         |
18177                 +---------------------------------------+
18178
18179    The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
18180    given.  (But note below and in sysv4.h that we require only 8 and
18181    may round up the size of our stack frame anyways.  The historical
18182    reason is early versions of powerpc-linux which didn't properly
18183    align the stack at program startup.  A happy side-effect is that
18184    -mno-eabi libraries can be used with -meabi programs.)
18185
18186    The EABI configuration defaults to the V.4 layout.  However,
18187    the stack alignment requirements may differ.  If -mno-eabi is not
18188    given, the required stack alignment is 8 bytes; if -mno-eabi is
18189    given, the required alignment is 16 bytes.  (But see V.4 comment
18190    above.)  */
18191
18192 #ifndef ABI_STACK_BOUNDARY
18193 #define ABI_STACK_BOUNDARY STACK_BOUNDARY
18194 #endif
18195
18196 static rs6000_stack_t *
18197 rs6000_stack_info (void)
18198 {
18199   rs6000_stack_t *info_ptr = &stack_info;
18200   int reg_size = TARGET_32BIT ? 4 : 8;
18201   int ehrd_size;
18202   int save_align;
18203   int first_gp;
18204   HOST_WIDE_INT non_fixed_size;
18205   bool using_static_chain_p;
18206
18207   if (reload_completed && info_ptr->reload_completed)
18208     return info_ptr;
18209
18210   memset (info_ptr, 0, sizeof (*info_ptr));
18211   info_ptr->reload_completed = reload_completed;
18212
18213   if (TARGET_SPE)
18214     {
18215       /* Cache value so we don't rescan instruction chain over and over.  */
18216       if (cfun->machine->insn_chain_scanned_p == 0)
18217         cfun->machine->insn_chain_scanned_p
18218           = spe_func_has_64bit_regs_p () + 1;
18219       info_ptr->spe_64bit_regs_used = cfun->machine->insn_chain_scanned_p - 1;
18220     }
18221
18222   /* Select which calling sequence.  */
18223   info_ptr->abi = DEFAULT_ABI;
18224
18225   /* Calculate which registers need to be saved & save area size.  */
18226   info_ptr->first_gp_reg_save = first_reg_to_save ();
18227   /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
18228      even if it currently looks like we won't.  Reload may need it to
18229      get at a constant; if so, it will have already created a constant
18230      pool entry for it.  */
18231   if (((TARGET_TOC && TARGET_MINIMAL_TOC)
18232        || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
18233        || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
18234       && crtl->uses_const_pool
18235       && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
18236     first_gp = RS6000_PIC_OFFSET_TABLE_REGNUM;
18237   else
18238     first_gp = info_ptr->first_gp_reg_save;
18239
18240   info_ptr->gp_size = reg_size * (32 - first_gp);
18241
18242   /* For the SPE, we have an additional upper 32-bits on each GPR.
18243      Ideally we should save the entire 64-bits only when the upper
18244      half is used in SIMD instructions.  Since we only record
18245      registers live (not the size they are used in), this proves
18246      difficult because we'd have to traverse the instruction chain at
18247      the right time, taking reload into account.  This is a real pain,
18248      so we opt to save the GPRs in 64-bits always if but one register
18249      gets used in 64-bits.  Otherwise, all the registers in the frame
18250      get saved in 32-bits.
18251
18252      So... since when we save all GPRs (except the SP) in 64-bits, the
18253      traditional GP save area will be empty.  */
18254   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18255     info_ptr->gp_size = 0;
18256
18257   info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
18258   info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
18259
18260   info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
18261   info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
18262                                  - info_ptr->first_altivec_reg_save);
18263
18264   /* Does this function call anything?  */
18265   info_ptr->calls_p = (! current_function_is_leaf
18266                        || cfun->machine->ra_needs_full_frame);
18267
18268   /* Determine if we need to save the condition code registers.  */
18269   if (df_regs_ever_live_p (CR2_REGNO)
18270       || df_regs_ever_live_p (CR3_REGNO)
18271       || df_regs_ever_live_p (CR4_REGNO))
18272     {
18273       info_ptr->cr_save_p = 1;
18274       if (DEFAULT_ABI == ABI_V4)
18275         info_ptr->cr_size = reg_size;
18276     }
18277
18278   /* If the current function calls __builtin_eh_return, then we need
18279      to allocate stack space for registers that will hold data for
18280      the exception handler.  */
18281   if (crtl->calls_eh_return)
18282     {
18283       unsigned int i;
18284       for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
18285         continue;
18286
18287       /* SPE saves EH registers in 64-bits.  */
18288       ehrd_size = i * (TARGET_SPE_ABI
18289                        && info_ptr->spe_64bit_regs_used != 0
18290                        ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
18291     }
18292   else
18293     ehrd_size = 0;
18294
18295   /* Determine various sizes.  */
18296   info_ptr->reg_size     = reg_size;
18297   info_ptr->fixed_size   = RS6000_SAVE_AREA;
18298   info_ptr->vars_size    = RS6000_ALIGN (get_frame_size (), 8);
18299   info_ptr->parm_size    = RS6000_ALIGN (crtl->outgoing_args_size,
18300                                          TARGET_ALTIVEC ? 16 : 8);
18301   if (FRAME_GROWS_DOWNWARD)
18302     info_ptr->vars_size
18303       += RS6000_ALIGN (info_ptr->fixed_size + info_ptr->vars_size
18304                        + info_ptr->parm_size,
18305                        ABI_STACK_BOUNDARY / BITS_PER_UNIT)
18306          - (info_ptr->fixed_size + info_ptr->vars_size
18307             + info_ptr->parm_size);
18308
18309   if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18310     info_ptr->spe_gp_size = 8 * (32 - first_gp);
18311   else
18312     info_ptr->spe_gp_size = 0;
18313
18314   if (TARGET_ALTIVEC_ABI)
18315     info_ptr->vrsave_mask = compute_vrsave_mask ();
18316   else
18317     info_ptr->vrsave_mask = 0;
18318
18319   if (TARGET_ALTIVEC_VRSAVE && info_ptr->vrsave_mask)
18320     info_ptr->vrsave_size  = 4;
18321   else
18322     info_ptr->vrsave_size  = 0;
18323
18324   compute_save_world_info (info_ptr);
18325
18326   /* Calculate the offsets.  */
18327   switch (DEFAULT_ABI)
18328     {
18329     case ABI_NONE:
18330     default:
18331       gcc_unreachable ();
18332
18333     case ABI_AIX:
18334     case ABI_DARWIN:
18335       info_ptr->fp_save_offset   = - info_ptr->fp_size;
18336       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
18337
18338       if (TARGET_ALTIVEC_ABI)
18339         {
18340           info_ptr->vrsave_save_offset
18341             = info_ptr->gp_save_offset - info_ptr->vrsave_size;
18342
18343           /* Align stack so vector save area is on a quadword boundary.
18344              The padding goes above the vectors.  */
18345           if (info_ptr->altivec_size != 0)
18346             info_ptr->altivec_padding_size
18347               = info_ptr->vrsave_save_offset & 0xF;
18348           else
18349             info_ptr->altivec_padding_size = 0;
18350
18351           info_ptr->altivec_save_offset
18352             = info_ptr->vrsave_save_offset
18353             - info_ptr->altivec_padding_size
18354             - info_ptr->altivec_size;
18355           gcc_assert (info_ptr->altivec_size == 0
18356                       || info_ptr->altivec_save_offset % 16 == 0);
18357
18358           /* Adjust for AltiVec case.  */
18359           info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
18360         }
18361       else
18362         info_ptr->ehrd_offset      = info_ptr->gp_save_offset - ehrd_size;
18363       info_ptr->cr_save_offset   = reg_size; /* first word when 64-bit.  */
18364       info_ptr->lr_save_offset   = 2*reg_size;
18365       break;
18366
18367     case ABI_V4:
18368       info_ptr->fp_save_offset   = - info_ptr->fp_size;
18369       info_ptr->gp_save_offset   = info_ptr->fp_save_offset - info_ptr->gp_size;
18370       info_ptr->cr_save_offset   = info_ptr->gp_save_offset - info_ptr->cr_size;
18371
18372       if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18373         {
18374           /* Align stack so SPE GPR save area is aligned on a
18375              double-word boundary.  */
18376           if (info_ptr->spe_gp_size != 0 && info_ptr->cr_save_offset != 0)
18377             info_ptr->spe_padding_size
18378               = 8 - (-info_ptr->cr_save_offset % 8);
18379           else
18380             info_ptr->spe_padding_size = 0;
18381
18382           info_ptr->spe_gp_save_offset
18383             = info_ptr->cr_save_offset
18384             - info_ptr->spe_padding_size
18385             - info_ptr->spe_gp_size;
18386
18387           /* Adjust for SPE case.  */
18388           info_ptr->ehrd_offset = info_ptr->spe_gp_save_offset;
18389         }
18390       else if (TARGET_ALTIVEC_ABI)
18391         {
18392           info_ptr->vrsave_save_offset
18393             = info_ptr->cr_save_offset - info_ptr->vrsave_size;
18394
18395           /* Align stack so vector save area is on a quadword boundary.  */
18396           if (info_ptr->altivec_size != 0)
18397             info_ptr->altivec_padding_size
18398               = 16 - (-info_ptr->vrsave_save_offset % 16);
18399           else
18400             info_ptr->altivec_padding_size = 0;
18401
18402           info_ptr->altivec_save_offset
18403             = info_ptr->vrsave_save_offset
18404             - info_ptr->altivec_padding_size
18405             - info_ptr->altivec_size;
18406
18407           /* Adjust for AltiVec case.  */
18408           info_ptr->ehrd_offset = info_ptr->altivec_save_offset;
18409         }
18410       else
18411         info_ptr->ehrd_offset    = info_ptr->cr_save_offset;
18412       info_ptr->ehrd_offset      -= ehrd_size;
18413       info_ptr->lr_save_offset   = reg_size;
18414       break;
18415     }
18416
18417   save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
18418   info_ptr->save_size    = RS6000_ALIGN (info_ptr->fp_size
18419                                          + info_ptr->gp_size
18420                                          + info_ptr->altivec_size
18421                                          + info_ptr->altivec_padding_size
18422                                          + info_ptr->spe_gp_size
18423                                          + info_ptr->spe_padding_size
18424                                          + ehrd_size
18425                                          + info_ptr->cr_size
18426                                          + info_ptr->vrsave_size,
18427                                          save_align);
18428
18429   non_fixed_size         = (info_ptr->vars_size
18430                             + info_ptr->parm_size
18431                             + info_ptr->save_size);
18432
18433   info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size,
18434                                        ABI_STACK_BOUNDARY / BITS_PER_UNIT);
18435
18436   /* Determine if we need to save the link register.  */
18437   if (info_ptr->calls_p
18438       || (DEFAULT_ABI == ABI_AIX
18439           && crtl->profile
18440           && !TARGET_PROFILE_KERNEL)
18441       || (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca)
18442 #ifdef TARGET_RELOCATABLE
18443       || (TARGET_RELOCATABLE && (get_pool_size () != 0))
18444 #endif
18445       || rs6000_ra_ever_killed ())
18446     info_ptr->lr_save_p = 1;
18447
18448   using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
18449                           && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
18450                           && call_used_regs[STATIC_CHAIN_REGNUM]);
18451   info_ptr->savres_strategy = rs6000_savres_strategy (info_ptr,
18452                                                       using_static_chain_p);
18453
18454   if (!(info_ptr->savres_strategy & SAVE_INLINE_GPRS)
18455       || !(info_ptr->savres_strategy & SAVE_INLINE_FPRS)
18456       || !(info_ptr->savres_strategy & REST_INLINE_GPRS)
18457       || !(info_ptr->savres_strategy & REST_INLINE_FPRS))
18458     info_ptr->lr_save_p = 1;
18459
18460   if (info_ptr->lr_save_p)
18461     df_set_regs_ever_live (LR_REGNO, true);
18462
18463   /* Determine if we need to allocate any stack frame:
18464
18465      For AIX we need to push the stack if a frame pointer is needed
18466      (because the stack might be dynamically adjusted), if we are
18467      debugging, if we make calls, or if the sum of fp_save, gp_save,
18468      and local variables are more than the space needed to save all
18469      non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
18470      + 18*8 = 288 (GPR13 reserved).
18471
18472      For V.4 we don't have the stack cushion that AIX uses, but assume
18473      that the debugger can handle stackless frames.  */
18474
18475   if (info_ptr->calls_p)
18476     info_ptr->push_p = 1;
18477
18478   else if (DEFAULT_ABI == ABI_V4)
18479     info_ptr->push_p = non_fixed_size != 0;
18480
18481   else if (frame_pointer_needed)
18482     info_ptr->push_p = 1;
18483
18484   else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
18485     info_ptr->push_p = 1;
18486
18487   else
18488     info_ptr->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
18489
18490   /* Zero offsets if we're not saving those registers.  */
18491   if (info_ptr->fp_size == 0)
18492     info_ptr->fp_save_offset = 0;
18493
18494   if (info_ptr->gp_size == 0)
18495     info_ptr->gp_save_offset = 0;
18496
18497   if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
18498     info_ptr->altivec_save_offset = 0;
18499
18500   if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
18501     info_ptr->vrsave_save_offset = 0;
18502
18503   if (! TARGET_SPE_ABI
18504       || info_ptr->spe_64bit_regs_used == 0
18505       || info_ptr->spe_gp_size == 0)
18506     info_ptr->spe_gp_save_offset = 0;
18507
18508   if (! info_ptr->lr_save_p)
18509     info_ptr->lr_save_offset = 0;
18510
18511   if (! info_ptr->cr_save_p)
18512     info_ptr->cr_save_offset = 0;
18513
18514   return info_ptr;
18515 }
18516
18517 /* Return true if the current function uses any GPRs in 64-bit SIMD
18518    mode.  */
18519
18520 static bool
18521 spe_func_has_64bit_regs_p (void)
18522 {
18523   rtx insns, insn;
18524
18525   /* Functions that save and restore all the call-saved registers will
18526      need to save/restore the registers in 64-bits.  */
18527   if (crtl->calls_eh_return
18528       || cfun->calls_setjmp
18529       || crtl->has_nonlocal_goto)
18530     return true;
18531
18532   insns = get_insns ();
18533
18534   for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
18535     {
18536       if (INSN_P (insn))
18537         {
18538           rtx i;
18539
18540           /* FIXME: This should be implemented with attributes...
18541
18542                  (set_attr "spe64" "true")....then,
18543                  if (get_spe64(insn)) return true;
18544
18545              It's the only reliable way to do the stuff below.  */
18546
18547           i = PATTERN (insn);
18548           if (GET_CODE (i) == SET)
18549             {
18550               enum machine_mode mode = GET_MODE (SET_SRC (i));
18551
18552               if (SPE_VECTOR_MODE (mode))
18553                 return true;
18554               if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode))
18555                 return true;
18556             }
18557         }
18558     }
18559
18560   return false;
18561 }
18562
18563 static void
18564 debug_stack_info (rs6000_stack_t *info)
18565 {
18566   const char *abi_string;
18567
18568   if (! info)
18569     info = rs6000_stack_info ();
18570
18571   fprintf (stderr, "\nStack information for function %s:\n",
18572            ((current_function_decl && DECL_NAME (current_function_decl))
18573             ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
18574             : "<unknown>"));
18575
18576   switch (info->abi)
18577     {
18578     default:             abi_string = "Unknown";        break;
18579     case ABI_NONE:       abi_string = "NONE";           break;
18580     case ABI_AIX:        abi_string = "AIX";            break;
18581     case ABI_DARWIN:     abi_string = "Darwin";         break;
18582     case ABI_V4:         abi_string = "V.4";            break;
18583     }
18584
18585   fprintf (stderr, "\tABI                 = %5s\n", abi_string);
18586
18587   if (TARGET_ALTIVEC_ABI)
18588     fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
18589
18590   if (TARGET_SPE_ABI)
18591     fprintf (stderr, "\tSPE ABI extensions enabled.\n");
18592
18593   if (info->first_gp_reg_save != 32)
18594     fprintf (stderr, "\tfirst_gp_reg_save   = %5d\n", info->first_gp_reg_save);
18595
18596   if (info->first_fp_reg_save != 64)
18597     fprintf (stderr, "\tfirst_fp_reg_save   = %5d\n", info->first_fp_reg_save);
18598
18599   if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
18600     fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
18601              info->first_altivec_reg_save);
18602
18603   if (info->lr_save_p)
18604     fprintf (stderr, "\tlr_save_p           = %5d\n", info->lr_save_p);
18605
18606   if (info->cr_save_p)
18607     fprintf (stderr, "\tcr_save_p           = %5d\n", info->cr_save_p);
18608
18609   if (info->vrsave_mask)
18610     fprintf (stderr, "\tvrsave_mask         = 0x%x\n", info->vrsave_mask);
18611
18612   if (info->push_p)
18613     fprintf (stderr, "\tpush_p              = %5d\n", info->push_p);
18614
18615   if (info->calls_p)
18616     fprintf (stderr, "\tcalls_p             = %5d\n", info->calls_p);
18617
18618   if (info->gp_save_offset)
18619     fprintf (stderr, "\tgp_save_offset      = %5d\n", info->gp_save_offset);
18620
18621   if (info->fp_save_offset)
18622     fprintf (stderr, "\tfp_save_offset      = %5d\n", info->fp_save_offset);
18623
18624   if (info->altivec_save_offset)
18625     fprintf (stderr, "\taltivec_save_offset = %5d\n",
18626              info->altivec_save_offset);
18627
18628   if (info->spe_gp_save_offset)
18629     fprintf (stderr, "\tspe_gp_save_offset  = %5d\n",
18630              info->spe_gp_save_offset);
18631
18632   if (info->vrsave_save_offset)
18633     fprintf (stderr, "\tvrsave_save_offset  = %5d\n",
18634              info->vrsave_save_offset);
18635
18636   if (info->lr_save_offset)
18637     fprintf (stderr, "\tlr_save_offset      = %5d\n", info->lr_save_offset);
18638
18639   if (info->cr_save_offset)
18640     fprintf (stderr, "\tcr_save_offset      = %5d\n", info->cr_save_offset);
18641
18642   if (info->varargs_save_offset)
18643     fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
18644
18645   if (info->total_size)
18646     fprintf (stderr, "\ttotal_size          = "HOST_WIDE_INT_PRINT_DEC"\n",
18647              info->total_size);
18648
18649   if (info->vars_size)
18650     fprintf (stderr, "\tvars_size           = "HOST_WIDE_INT_PRINT_DEC"\n",
18651              info->vars_size);
18652
18653   if (info->parm_size)
18654     fprintf (stderr, "\tparm_size           = %5d\n", info->parm_size);
18655
18656   if (info->fixed_size)
18657     fprintf (stderr, "\tfixed_size          = %5d\n", info->fixed_size);
18658
18659   if (info->gp_size)
18660     fprintf (stderr, "\tgp_size             = %5d\n", info->gp_size);
18661
18662   if (info->spe_gp_size)
18663     fprintf (stderr, "\tspe_gp_size         = %5d\n", info->spe_gp_size);
18664
18665   if (info->fp_size)
18666     fprintf (stderr, "\tfp_size             = %5d\n", info->fp_size);
18667
18668   if (info->altivec_size)
18669     fprintf (stderr, "\taltivec_size        = %5d\n", info->altivec_size);
18670
18671   if (info->vrsave_size)
18672     fprintf (stderr, "\tvrsave_size         = %5d\n", info->vrsave_size);
18673
18674   if (info->altivec_padding_size)
18675     fprintf (stderr, "\taltivec_padding_size= %5d\n",
18676              info->altivec_padding_size);
18677
18678   if (info->spe_padding_size)
18679     fprintf (stderr, "\tspe_padding_size    = %5d\n",
18680              info->spe_padding_size);
18681
18682   if (info->cr_size)
18683     fprintf (stderr, "\tcr_size             = %5d\n", info->cr_size);
18684
18685   if (info->save_size)
18686     fprintf (stderr, "\tsave_size           = %5d\n", info->save_size);
18687
18688   if (info->reg_size != 4)
18689     fprintf (stderr, "\treg_size            = %5d\n", info->reg_size);
18690
18691   fprintf (stderr, "\n");
18692 }
18693
18694 rtx
18695 rs6000_return_addr (int count, rtx frame)
18696 {
18697   /* Currently we don't optimize very well between prolog and body
18698      code and for PIC code the code can be actually quite bad, so
18699      don't try to be too clever here.  */
18700   if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
18701     {
18702       cfun->machine->ra_needs_full_frame = 1;
18703
18704       return
18705         gen_rtx_MEM
18706           (Pmode,
18707            memory_address
18708            (Pmode,
18709             plus_constant (copy_to_reg
18710                            (gen_rtx_MEM (Pmode,
18711                                          memory_address (Pmode, frame))),
18712                            RETURN_ADDRESS_OFFSET)));
18713     }
18714
18715   cfun->machine->ra_need_lr = 1;
18716   return get_hard_reg_initial_val (Pmode, LR_REGNO);
18717 }
18718
18719 /* Say whether a function is a candidate for sibcall handling or not.  */
18720
18721 static bool
18722 rs6000_function_ok_for_sibcall (tree decl, tree exp)
18723 {
18724   tree fntype;
18725
18726   if (decl)
18727     fntype = TREE_TYPE (decl);
18728   else
18729     fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (exp)));
18730
18731   /* We can't do it if the called function has more vector parameters
18732      than the current function; there's nowhere to put the VRsave code.  */
18733   if (TARGET_ALTIVEC_ABI
18734       && TARGET_ALTIVEC_VRSAVE
18735       && !(decl && decl == current_function_decl))
18736     {
18737       function_args_iterator args_iter;
18738       tree type;
18739       int nvreg = 0;
18740
18741       /* Functions with vector parameters are required to have a
18742          prototype, so the argument type info must be available
18743          here.  */
18744       FOREACH_FUNCTION_ARGS(fntype, type, args_iter)
18745         if (TREE_CODE (type) == VECTOR_TYPE
18746             && ALTIVEC_OR_VSX_VECTOR_MODE (TYPE_MODE (type)))
18747           nvreg++;
18748
18749       FOREACH_FUNCTION_ARGS(TREE_TYPE (current_function_decl), type, args_iter)
18750         if (TREE_CODE (type) == VECTOR_TYPE
18751             && ALTIVEC_OR_VSX_VECTOR_MODE (TYPE_MODE (type)))
18752           nvreg--;
18753
18754       if (nvreg > 0)
18755         return false;
18756     }
18757
18758   /* Under the AIX ABI we can't allow calls to non-local functions,
18759      because the callee may have a different TOC pointer to the
18760      caller and there's no way to ensure we restore the TOC when we
18761      return.  With the secure-plt SYSV ABI we can't make non-local
18762      calls when -fpic/PIC because the plt call stubs use r30.  */
18763   if (DEFAULT_ABI == ABI_DARWIN
18764       || (DEFAULT_ABI == ABI_AIX
18765           && decl
18766           && !DECL_EXTERNAL (decl)
18767           && (*targetm.binds_local_p) (decl))
18768       || (DEFAULT_ABI == ABI_V4
18769           && (!TARGET_SECURE_PLT
18770               || !flag_pic
18771               || (decl
18772                   && (*targetm.binds_local_p) (decl)))))
18773     {
18774       tree attr_list = TYPE_ATTRIBUTES (fntype);
18775
18776       if (!lookup_attribute ("longcall", attr_list)
18777           || lookup_attribute ("shortcall", attr_list))
18778         return true;
18779     }
18780
18781   return false;
18782 }
18783
18784 /* NULL if INSN insn is valid within a low-overhead loop.
18785    Otherwise return why doloop cannot be applied.
18786    PowerPC uses the COUNT register for branch on table instructions.  */
18787
18788 static const char *
18789 rs6000_invalid_within_doloop (const_rtx insn)
18790 {
18791   if (CALL_P (insn))
18792     return "Function call in the loop.";
18793
18794   if (JUMP_P (insn)
18795       && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
18796           || GET_CODE (PATTERN (insn)) == ADDR_VEC))
18797     return "Computed branch in the loop.";
18798
18799   return NULL;
18800 }
18801
18802 static int
18803 rs6000_ra_ever_killed (void)
18804 {
18805   rtx top;
18806   rtx reg;
18807   rtx insn;
18808
18809   if (cfun->is_thunk)
18810     return 0;
18811
18812   if (cfun->machine->lr_save_state)
18813     return cfun->machine->lr_save_state - 1;
18814
18815   /* regs_ever_live has LR marked as used if any sibcalls are present,
18816      but this should not force saving and restoring in the
18817      pro/epilogue.  Likewise, reg_set_between_p thinks a sibcall
18818      clobbers LR, so that is inappropriate.  */
18819
18820   /* Also, the prologue can generate a store into LR that
18821      doesn't really count, like this:
18822
18823         move LR->R0
18824         bcl to set PIC register
18825         move LR->R31
18826         move R0->LR
18827
18828      When we're called from the epilogue, we need to avoid counting
18829      this as a store.  */
18830
18831   push_topmost_sequence ();
18832   top = get_insns ();
18833   pop_topmost_sequence ();
18834   reg = gen_rtx_REG (Pmode, LR_REGNO);
18835
18836   for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
18837     {
18838       if (INSN_P (insn))
18839         {
18840           if (CALL_P (insn))
18841             {
18842               if (!SIBLING_CALL_P (insn))
18843                 return 1;
18844             }
18845           else if (find_regno_note (insn, REG_INC, LR_REGNO))
18846             return 1;
18847           else if (set_of (reg, insn) != NULL_RTX
18848                    && !prologue_epilogue_contains (insn))
18849             return 1;
18850         }
18851     }
18852   return 0;
18853 }
18854 \f
18855 /* Emit instructions needed to load the TOC register.
18856    This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
18857    a constant pool; or for SVR4 -fpic.  */
18858
18859 void
18860 rs6000_emit_load_toc_table (int fromprolog)
18861 {
18862   rtx dest;
18863   dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
18864
18865   if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
18866     {
18867       char buf[30];
18868       rtx lab, tmp1, tmp2, got;
18869
18870       lab = gen_label_rtx ();
18871       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (lab));
18872       lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18873       if (flag_pic == 2)
18874         got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
18875       else
18876         got = rs6000_got_sym ();
18877       tmp1 = tmp2 = dest;
18878       if (!fromprolog)
18879         {
18880           tmp1 = gen_reg_rtx (Pmode);
18881           tmp2 = gen_reg_rtx (Pmode);
18882         }
18883       emit_insn (gen_load_toc_v4_PIC_1 (lab));
18884       emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
18885       emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
18886       emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
18887     }
18888   else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
18889     {
18890       emit_insn (gen_load_toc_v4_pic_si ());
18891       emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
18892     }
18893   else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
18894     {
18895       char buf[30];
18896       rtx temp0 = (fromprolog
18897                    ? gen_rtx_REG (Pmode, 0)
18898                    : gen_reg_rtx (Pmode));
18899
18900       if (fromprolog)
18901         {
18902           rtx symF, symL;
18903
18904           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
18905           symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18906
18907           ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
18908           symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18909
18910           emit_insn (gen_load_toc_v4_PIC_1 (symF));
18911           emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
18912           emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest, symL, symF));
18913         }
18914       else
18915         {
18916           rtx tocsym, lab;
18917
18918           tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
18919           lab = gen_label_rtx ();
18920           emit_insn (gen_load_toc_v4_PIC_1b (tocsym, lab));
18921           emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
18922           emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
18923         }
18924       emit_insn (gen_addsi3 (dest, temp0, dest));
18925     }
18926   else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
18927     {
18928       /* This is for AIX code running in non-PIC ELF32.  */
18929       char buf[30];
18930       rtx realsym;
18931       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
18932       realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
18933
18934       emit_insn (gen_elf_high (dest, realsym));
18935       emit_insn (gen_elf_low (dest, dest, realsym));
18936     }
18937   else
18938     {
18939       gcc_assert (DEFAULT_ABI == ABI_AIX);
18940
18941       if (TARGET_32BIT)
18942         emit_insn (gen_load_toc_aix_si (dest));
18943       else
18944         emit_insn (gen_load_toc_aix_di (dest));
18945     }
18946 }
18947
18948 /* Emit instructions to restore the link register after determining where
18949    its value has been stored.  */
18950
18951 void
18952 rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
18953 {
18954   rs6000_stack_t *info = rs6000_stack_info ();
18955   rtx operands[2];
18956
18957   operands[0] = source;
18958   operands[1] = scratch;
18959
18960   if (info->lr_save_p)
18961     {
18962       rtx frame_rtx = stack_pointer_rtx;
18963       HOST_WIDE_INT sp_offset = 0;
18964       rtx tmp;
18965
18966       if (frame_pointer_needed
18967           || cfun->calls_alloca
18968           || info->total_size > 32767)
18969         {
18970           tmp = gen_frame_mem (Pmode, frame_rtx);
18971           emit_move_insn (operands[1], tmp);
18972           frame_rtx = operands[1];
18973         }
18974       else if (info->push_p)
18975         sp_offset = info->total_size;
18976
18977       tmp = plus_constant (frame_rtx, info->lr_save_offset + sp_offset);
18978       tmp = gen_frame_mem (Pmode, tmp);
18979       emit_move_insn (tmp, operands[0]);
18980     }
18981   else
18982     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO), operands[0]);
18983
18984   /* Freeze lr_save_p.  We've just emitted rtl that depends on the
18985      state of lr_save_p so any change from here on would be a bug.  In
18986      particular, stop rs6000_ra_ever_killed from considering the SET
18987      of lr we may have added just above.  */ 
18988   cfun->machine->lr_save_state = info->lr_save_p + 1;
18989 }
18990
18991 static GTY(()) alias_set_type set = -1;
18992
18993 alias_set_type
18994 get_TOC_alias_set (void)
18995 {
18996   if (set == -1)
18997     set = new_alias_set ();
18998   return set;
18999 }
19000
19001 /* This returns nonzero if the current function uses the TOC.  This is
19002    determined by the presence of (use (unspec ... UNSPEC_TOC)), which
19003    is generated by the ABI_V4 load_toc_* patterns.  */
19004 #if TARGET_ELF
19005 static int
19006 uses_TOC (void)
19007 {
19008   rtx insn;
19009
19010   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
19011     if (INSN_P (insn))
19012       {
19013         rtx pat = PATTERN (insn);
19014         int i;
19015
19016         if (GET_CODE (pat) == PARALLEL)
19017           for (i = 0; i < XVECLEN (pat, 0); i++)
19018             {
19019               rtx sub = XVECEXP (pat, 0, i);
19020               if (GET_CODE (sub) == USE)
19021                 {
19022                   sub = XEXP (sub, 0);
19023                   if (GET_CODE (sub) == UNSPEC
19024                       && XINT (sub, 1) == UNSPEC_TOC)
19025                     return 1;
19026                 }
19027             }
19028       }
19029   return 0;
19030 }
19031 #endif
19032
19033 rtx
19034 create_TOC_reference (rtx symbol, rtx largetoc_reg)
19035 {
19036   rtx tocrel, tocreg;
19037
19038   if (TARGET_DEBUG_ADDR)
19039     {
19040       if (GET_CODE (symbol) == SYMBOL_REF)
19041         fprintf (stderr, "\ncreate_TOC_reference, (symbol_ref %s)\n",
19042                  XSTR (symbol, 0));
19043       else
19044         {
19045           fprintf (stderr, "\ncreate_TOC_reference, code %s:\n",
19046                    GET_RTX_NAME (GET_CODE (symbol)));
19047           debug_rtx (symbol);
19048         }
19049     }
19050
19051   if (!can_create_pseudo_p ())
19052     df_set_regs_ever_live (TOC_REGISTER, true);
19053
19054   tocrel = gen_rtx_CONST (Pmode,
19055                           gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol),
19056                                           UNSPEC_TOCREL));
19057   tocreg = gen_rtx_REG (Pmode, TOC_REGISTER);
19058   if (TARGET_CMODEL != CMODEL_SMALL)
19059     {
19060       rtx hi = gen_rtx_CONST (Pmode,
19061                               gen_rtx_PLUS (Pmode, tocreg, 
19062                                             gen_rtx_HIGH (Pmode, tocrel)));
19063       if (largetoc_reg != NULL)
19064         {
19065           emit_move_insn (largetoc_reg, hi);
19066           hi = largetoc_reg;
19067         }
19068       return gen_rtx_LO_SUM (Pmode, hi, copy_rtx (tocrel));
19069     }
19070   else
19071     return gen_rtx_PLUS (Pmode, tocreg, tocrel);
19072 }
19073
19074 /* Issue assembly directives that create a reference to the given DWARF
19075    FRAME_TABLE_LABEL from the current function section.  */
19076 void
19077 rs6000_aix_asm_output_dwarf_table_ref (char * frame_table_label)
19078 {
19079   fprintf (asm_out_file, "\t.ref %s\n",
19080            TARGET_STRIP_NAME_ENCODING (frame_table_label));
19081 }
19082 \f
19083 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
19084    and the change to the stack pointer.  */
19085
19086 static void
19087 rs6000_emit_stack_tie (void)
19088 {
19089   rtx mem = gen_frame_mem (BLKmode,
19090                            gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
19091
19092   emit_insn (gen_stack_tie (mem));
19093 }
19094
19095 /* Emit the correct code for allocating stack space, as insns.
19096    If COPY_REG, make sure a copy of the old frame is left there.
19097    The generated code may use hard register 0 as a temporary.  */
19098
19099 static void
19100 rs6000_emit_allocate_stack (HOST_WIDE_INT size, rtx copy_reg)
19101 {
19102   rtx insn;
19103   rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
19104   rtx tmp_reg = gen_rtx_REG (Pmode, 0);
19105   rtx todec = gen_int_mode (-size, Pmode);
19106   rtx par, set, mem;
19107
19108   if (INTVAL (todec) != -size)
19109     {
19110       warning (0, "stack frame too large");
19111       emit_insn (gen_trap ());
19112       return;
19113     }
19114
19115   if (crtl->limit_stack)
19116     {
19117       if (REG_P (stack_limit_rtx)
19118           && REGNO (stack_limit_rtx) > 1
19119           && REGNO (stack_limit_rtx) <= 31)
19120         {
19121           emit_insn (gen_add3_insn (tmp_reg, stack_limit_rtx, GEN_INT (size)));
19122           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
19123                                     const0_rtx));
19124         }
19125       else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
19126                && TARGET_32BIT
19127                && DEFAULT_ABI == ABI_V4)
19128         {
19129           rtx toload = gen_rtx_CONST (VOIDmode,
19130                                       gen_rtx_PLUS (Pmode,
19131                                                     stack_limit_rtx,
19132                                                     GEN_INT (size)));
19133
19134           emit_insn (gen_elf_high (tmp_reg, toload));
19135           emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
19136           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
19137                                     const0_rtx));
19138         }
19139       else
19140         warning (0, "stack limit expression is not supported");
19141     }
19142
19143   if (copy_reg)
19144     emit_move_insn (copy_reg, stack_reg);
19145
19146   if (size > 32767)
19147     {
19148       /* Need a note here so that try_split doesn't get confused.  */
19149       if (get_last_insn () == NULL_RTX)
19150         emit_note (NOTE_INSN_DELETED);
19151       insn = emit_move_insn (tmp_reg, todec);
19152       try_split (PATTERN (insn), insn, 0);
19153       todec = tmp_reg;
19154     }
19155   
19156   insn = emit_insn (TARGET_32BIT
19157                     ? gen_movsi_update_stack (stack_reg, stack_reg,
19158                                         todec, stack_reg)
19159                     : gen_movdi_di_update_stack (stack_reg, stack_reg,
19160                                            todec, stack_reg));
19161   /* Since we didn't use gen_frame_mem to generate the MEM, grab
19162      it now and set the alias set/attributes. The above gen_*_update
19163      calls will generate a PARALLEL with the MEM set being the first
19164      operation. */
19165   par = PATTERN (insn);
19166   gcc_assert (GET_CODE (par) == PARALLEL);
19167   set = XVECEXP (par, 0, 0);
19168   gcc_assert (GET_CODE (set) == SET);
19169   mem = SET_DEST (set);
19170   gcc_assert (MEM_P (mem));
19171   MEM_NOTRAP_P (mem) = 1;
19172   set_mem_alias_set (mem, get_frame_alias_set ());
19173
19174   RTX_FRAME_RELATED_P (insn) = 1;
19175   add_reg_note (insn, REG_FRAME_RELATED_EXPR,
19176                 gen_rtx_SET (VOIDmode, stack_reg,
19177                              gen_rtx_PLUS (Pmode, stack_reg,
19178                                            GEN_INT (-size))));
19179 }
19180
19181 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
19182
19183 #if PROBE_INTERVAL > 32768
19184 #error Cannot use indexed addressing mode for stack probing
19185 #endif
19186
19187 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
19188    inclusive.  These are offsets from the current stack pointer.  */
19189
19190 static void
19191 rs6000_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
19192 {
19193   /* See if we have a constant small number of probes to generate.  If so,
19194      that's the easy case.  */
19195   if (first + size <= 32768)
19196     {
19197       HOST_WIDE_INT i;
19198
19199       /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
19200          it exceeds SIZE.  If only one probe is needed, this will not
19201          generate any code.  Then probe at FIRST + SIZE.  */
19202       for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
19203         emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + i)));
19204
19205       emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + size)));
19206     }
19207
19208   /* Otherwise, do the same as above, but in a loop.  Note that we must be
19209      extra careful with variables wrapping around because we might be at
19210      the very top (or the very bottom) of the address space and we have
19211      to be able to handle this case properly; in particular, we use an
19212      equality test for the loop condition.  */
19213   else
19214     {
19215       HOST_WIDE_INT rounded_size;
19216       rtx r12 = gen_rtx_REG (Pmode, 12);
19217       rtx r0 = gen_rtx_REG (Pmode, 0);
19218
19219       /* Sanity check for the addressing mode we're going to use.  */
19220       gcc_assert (first <= 32768);
19221
19222       /* Step 1: round SIZE to the previous multiple of the interval.  */
19223
19224       rounded_size = size & -PROBE_INTERVAL;
19225
19226
19227       /* Step 2: compute initial and final value of the loop counter.  */
19228
19229       /* TEST_ADDR = SP + FIRST.  */
19230       emit_insn (gen_rtx_SET (VOIDmode, r12,
19231                               plus_constant (stack_pointer_rtx, -first)));
19232
19233       /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE.  */
19234       if (rounded_size > 32768)
19235         {
19236           emit_move_insn (r0, GEN_INT (-rounded_size));
19237           emit_insn (gen_rtx_SET (VOIDmode, r0,
19238                                   gen_rtx_PLUS (Pmode, r12, r0)));
19239         }
19240       else
19241         emit_insn (gen_rtx_SET (VOIDmode, r0,
19242                                 plus_constant (r12, -rounded_size)));
19243
19244
19245       /* Step 3: the loop
19246
19247          while (TEST_ADDR != LAST_ADDR)
19248            {
19249              TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
19250              probe at TEST_ADDR
19251            }
19252
19253          probes at FIRST + N * PROBE_INTERVAL for values of N from 1
19254          until it is equal to ROUNDED_SIZE.  */
19255
19256       if (TARGET_64BIT)
19257         emit_insn (gen_probe_stack_rangedi (r12, r12, r0));
19258       else
19259         emit_insn (gen_probe_stack_rangesi (r12, r12, r0));
19260
19261
19262       /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
19263          that SIZE is equal to ROUNDED_SIZE.  */
19264
19265       if (size != rounded_size)
19266         emit_stack_probe (plus_constant (r12, rounded_size - size));
19267     }
19268 }
19269
19270 /* Probe a range of stack addresses from REG1 to REG2 inclusive.  These are
19271    absolute addresses.  */
19272
19273 const char *
19274 output_probe_stack_range (rtx reg1, rtx reg2)
19275 {
19276   static int labelno = 0;
19277   char loop_lab[32], end_lab[32];
19278   rtx xops[2];
19279
19280   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
19281   ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
19282
19283   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
19284
19285   /* Jump to END_LAB if TEST_ADDR == LAST_ADDR.  */
19286   xops[0] = reg1;
19287   xops[1] = reg2;
19288   if (TARGET_64BIT)
19289     output_asm_insn ("{cmp|cmpd} 0,%0,%1", xops);
19290   else
19291     output_asm_insn ("{cmp|cmpw} 0,%0,%1", xops);
19292
19293   fputs ("\tbeq 0,", asm_out_file);
19294   assemble_name_raw (asm_out_file, end_lab);
19295   fputc ('\n', asm_out_file);
19296
19297   /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
19298   xops[1] = GEN_INT (-PROBE_INTERVAL);
19299   output_asm_insn ("{cal %0,%1(%0)|addi %0,%0,%1}", xops);
19300
19301   /* Probe at TEST_ADDR and branch.  */
19302   output_asm_insn ("{st|stw} 0,0(%0)", xops);
19303   fprintf (asm_out_file, "\tb ");
19304   assemble_name_raw (asm_out_file, loop_lab);
19305   fputc ('\n', asm_out_file);
19306
19307   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
19308
19309   return "";
19310 }
19311
19312 /* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
19313    with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
19314    is not NULL.  It would be nice if dwarf2out_frame_debug_expr could
19315    deduce these equivalences by itself so it wasn't necessary to hold
19316    its hand so much.  */
19317
19318 static rtx
19319 rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
19320                       rtx reg2, rtx rreg)
19321 {
19322   rtx real, temp;
19323
19324   /* copy_rtx will not make unique copies of registers, so we need to
19325      ensure we don't have unwanted sharing here.  */
19326   if (reg == reg2)
19327     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
19328
19329   if (reg == rreg)
19330     reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
19331
19332   real = copy_rtx (PATTERN (insn));
19333
19334   if (reg2 != NULL_RTX)
19335     real = replace_rtx (real, reg2, rreg);
19336
19337   real = replace_rtx (real, reg,
19338                       gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
19339                                                         STACK_POINTER_REGNUM),
19340                                     GEN_INT (val)));
19341
19342   /* We expect that 'real' is either a SET or a PARALLEL containing
19343      SETs (and possibly other stuff).  In a PARALLEL, all the SETs
19344      are important so they all have to be marked RTX_FRAME_RELATED_P.  */
19345
19346   if (GET_CODE (real) == SET)
19347     {
19348       rtx set = real;
19349
19350       temp = simplify_rtx (SET_SRC (set));
19351       if (temp)
19352         SET_SRC (set) = temp;
19353       temp = simplify_rtx (SET_DEST (set));
19354       if (temp)
19355         SET_DEST (set) = temp;
19356       if (GET_CODE (SET_DEST (set)) == MEM)
19357         {
19358           temp = simplify_rtx (XEXP (SET_DEST (set), 0));
19359           if (temp)
19360             XEXP (SET_DEST (set), 0) = temp;
19361         }
19362     }
19363   else
19364     {
19365       int i;
19366
19367       gcc_assert (GET_CODE (real) == PARALLEL);
19368       for (i = 0; i < XVECLEN (real, 0); i++)
19369         if (GET_CODE (XVECEXP (real, 0, i)) == SET)
19370           {
19371             rtx set = XVECEXP (real, 0, i);
19372
19373             temp = simplify_rtx (SET_SRC (set));
19374             if (temp)
19375               SET_SRC (set) = temp;
19376             temp = simplify_rtx (SET_DEST (set));
19377             if (temp)
19378               SET_DEST (set) = temp;
19379             if (GET_CODE (SET_DEST (set)) == MEM)
19380               {
19381                 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
19382                 if (temp)
19383                   XEXP (SET_DEST (set), 0) = temp;
19384               }
19385             RTX_FRAME_RELATED_P (set) = 1;
19386           }
19387     }
19388
19389   RTX_FRAME_RELATED_P (insn) = 1;
19390   add_reg_note (insn, REG_FRAME_RELATED_EXPR, real);
19391
19392   return insn;
19393 }
19394
19395 /* Returns an insn that has a vrsave set operation with the
19396    appropriate CLOBBERs.  */
19397
19398 static rtx
19399 generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
19400 {
19401   int nclobs, i;
19402   rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
19403   rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
19404
19405   clobs[0]
19406     = gen_rtx_SET (VOIDmode,
19407                    vrsave,
19408                    gen_rtx_UNSPEC_VOLATILE (SImode,
19409                                             gen_rtvec (2, reg, vrsave),
19410                                             UNSPECV_SET_VRSAVE));
19411
19412   nclobs = 1;
19413
19414   /* We need to clobber the registers in the mask so the scheduler
19415      does not move sets to VRSAVE before sets of AltiVec registers.
19416
19417      However, if the function receives nonlocal gotos, reload will set
19418      all call saved registers live.  We will end up with:
19419
19420         (set (reg 999) (mem))
19421         (parallel [ (set (reg vrsave) (unspec blah))
19422                     (clobber (reg 999))])
19423
19424      The clobber will cause the store into reg 999 to be dead, and
19425      flow will attempt to delete an epilogue insn.  In this case, we
19426      need an unspec use/set of the register.  */
19427
19428   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
19429     if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
19430       {
19431         if (!epiloguep || call_used_regs [i])
19432           clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
19433                                              gen_rtx_REG (V4SImode, i));
19434         else
19435           {
19436             rtx reg = gen_rtx_REG (V4SImode, i);
19437
19438             clobs[nclobs++]
19439               = gen_rtx_SET (VOIDmode,
19440                              reg,
19441                              gen_rtx_UNSPEC (V4SImode,
19442                                              gen_rtvec (1, reg), 27));
19443           }
19444       }
19445
19446   insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
19447
19448   for (i = 0; i < nclobs; ++i)
19449     XVECEXP (insn, 0, i) = clobs[i];
19450
19451   return insn;
19452 }
19453
19454 /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
19455    Save REGNO into [FRAME_REG + OFFSET] in mode MODE.  */
19456
19457 static rtx
19458 emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
19459                  unsigned int regno, int offset, HOST_WIDE_INT total_size)
19460 {
19461   rtx reg, offset_rtx, insn, mem, addr, int_rtx;
19462   rtx replacea, replaceb;
19463
19464   int_rtx = GEN_INT (offset);
19465
19466   /* Some cases that need register indexed addressing.  */
19467   if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
19468       || (TARGET_VSX && ALTIVEC_OR_VSX_VECTOR_MODE (mode))
19469       || (TARGET_E500_DOUBLE && mode == DFmode)
19470       || (TARGET_SPE_ABI
19471           && SPE_VECTOR_MODE (mode)
19472           && !SPE_CONST_OFFSET_OK (offset)))
19473     {
19474       /* Whomever calls us must make sure r11 is available in the
19475          flow path of instructions in the prologue.  */
19476       offset_rtx = gen_rtx_REG (Pmode, 11);
19477       emit_move_insn (offset_rtx, int_rtx);
19478
19479       replacea = offset_rtx;
19480       replaceb = int_rtx;
19481     }
19482   else
19483     {
19484       offset_rtx = int_rtx;
19485       replacea = NULL_RTX;
19486       replaceb = NULL_RTX;
19487     }
19488
19489   reg = gen_rtx_REG (mode, regno);
19490   addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
19491   mem = gen_frame_mem (mode, addr);
19492
19493   insn = emit_move_insn (mem, reg);
19494
19495   return rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
19496 }
19497
19498 /* Emit an offset memory reference suitable for a frame store, while
19499    converting to a valid addressing mode.  */
19500
19501 static rtx
19502 gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
19503 {
19504   rtx int_rtx, offset_rtx;
19505
19506   int_rtx = GEN_INT (offset);
19507
19508   if ((TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
19509       || (TARGET_E500_DOUBLE && mode == DFmode))
19510     {
19511       offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
19512       emit_move_insn (offset_rtx, int_rtx);
19513     }
19514   else
19515     offset_rtx = int_rtx;
19516
19517   return gen_frame_mem (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
19518 }
19519
19520 /* Look for user-defined global regs.  We should not save and restore these,
19521    and cannot use stmw/lmw if there are any in its range.  */
19522
19523 static bool
19524 no_global_regs_above (int first, bool gpr)
19525 {
19526   int i;
19527   int last = gpr ? 32 : 64;
19528   for (i = first; i < last; i++)
19529     if (global_regs[i])
19530       return false;
19531   return true;
19532 }
19533
19534 #ifndef TARGET_FIX_AND_CONTINUE
19535 #define TARGET_FIX_AND_CONTINUE 0
19536 #endif
19537
19538 /* It's really GPR 13 and FPR 14, but we need the smaller of the two.  */
19539 #define FIRST_SAVRES_REGISTER FIRST_SAVED_GP_REGNO
19540 #define LAST_SAVRES_REGISTER 31
19541 #define N_SAVRES_REGISTERS (LAST_SAVRES_REGISTER - FIRST_SAVRES_REGISTER + 1)
19542
19543 static GTY(()) rtx savres_routine_syms[N_SAVRES_REGISTERS][8];
19544
19545 /* Temporary holding space for an out-of-line register save/restore
19546    routine name.  */
19547 static char savres_routine_name[30];
19548
19549 /* Return the name for an out-of-line register save/restore routine.
19550    We are saving/restoring GPRs if GPR is true.  */
19551
19552 static char *
19553 rs6000_savres_routine_name (rs6000_stack_t *info, int regno,
19554                             bool savep, bool gpr, bool lr)
19555 {
19556   const char *prefix = "";
19557   const char *suffix = "";
19558
19559   /* Different targets are supposed to define
19560      {SAVE,RESTORE}_FP_{PREFIX,SUFFIX} with the idea that the needed
19561      routine name could be defined with:
19562
19563      sprintf (name, "%s%d%s", SAVE_FP_PREFIX, regno, SAVE_FP_SUFFIX)
19564
19565      This is a nice idea in practice, but in reality, things are
19566      complicated in several ways:
19567
19568      - ELF targets have save/restore routines for GPRs.
19569
19570      - SPE targets use different prefixes for 32/64-bit registers, and
19571        neither of them fit neatly in the FOO_{PREFIX,SUFFIX} regimen.
19572
19573      - PPC64 ELF targets have routines for save/restore of GPRs that
19574        differ in what they do with the link register, so having a set
19575        prefix doesn't work.  (We only use one of the save routines at
19576        the moment, though.)
19577
19578      - PPC32 elf targets have "exit" versions of the restore routines
19579        that restore the link register and can save some extra space.
19580        These require an extra suffix.  (There are also "tail" versions
19581        of the restore routines and "GOT" versions of the save routines,
19582        but we don't generate those at present.  Same problems apply,
19583        though.)
19584
19585      We deal with all this by synthesizing our own prefix/suffix and
19586      using that for the simple sprintf call shown above.  */
19587   if (TARGET_SPE)
19588     {
19589       /* No floating point saves on the SPE.  */
19590       gcc_assert (gpr);
19591
19592       if (savep)
19593         prefix = info->spe_64bit_regs_used ? "_save64gpr_" : "_save32gpr_";
19594       else
19595         prefix = info->spe_64bit_regs_used ? "_rest64gpr_" : "_rest32gpr_";
19596
19597       if (lr)
19598         suffix = "_x";
19599     }
19600   else if (DEFAULT_ABI == ABI_V4)
19601     {
19602       if (TARGET_64BIT)
19603         goto aix_names;
19604
19605       if (gpr)
19606         prefix = savep ? "_savegpr_" : "_restgpr_";
19607       else
19608         prefix = savep ? "_savefpr_" : "_restfpr_";
19609
19610       if (lr)
19611         suffix = "_x";
19612     }
19613   else if (DEFAULT_ABI == ABI_AIX)
19614     {
19615 #ifndef POWERPC_LINUX
19616       /* No out-of-line save/restore routines for GPRs on AIX.  */
19617       gcc_assert (!TARGET_AIX || !gpr);
19618 #endif
19619
19620     aix_names:
19621       if (gpr)
19622         prefix = (savep
19623                   ? (lr ? "_savegpr0_" : "_savegpr1_")
19624                   : (lr ? "_restgpr0_" : "_restgpr1_"));
19625 #ifdef POWERPC_LINUX
19626       else if (lr)
19627         prefix = (savep ? "_savefpr_" : "_restfpr_");
19628 #endif
19629       else
19630         {
19631           prefix = savep ? SAVE_FP_PREFIX : RESTORE_FP_PREFIX;
19632           suffix = savep ? SAVE_FP_SUFFIX : RESTORE_FP_SUFFIX;
19633         }
19634     }
19635   else if (DEFAULT_ABI == ABI_DARWIN)
19636     sorry ("out-of-line save/restore routines not supported on Darwin");
19637
19638   sprintf (savres_routine_name, "%s%d%s", prefix, regno, suffix);
19639
19640   return savres_routine_name;
19641 }
19642
19643 /* Return an RTL SYMBOL_REF for an out-of-line register save/restore routine.
19644    We are saving/restoring GPRs if GPR is true.  */
19645
19646 static rtx
19647 rs6000_savres_routine_sym (rs6000_stack_t *info, bool savep,
19648                            bool gpr, bool lr)
19649 {
19650   int regno = gpr ? info->first_gp_reg_save : (info->first_fp_reg_save - 32);
19651   rtx sym;
19652   int select = ((savep ? 1 : 0) << 2
19653                 | ((TARGET_SPE_ABI
19654                     /* On the SPE, we never have any FPRs, but we do have
19655                        32/64-bit versions of the routines.  */
19656                     ? (info->spe_64bit_regs_used ? 1 : 0)
19657                     : (gpr ? 1 : 0)) << 1)
19658                 | (lr ? 1: 0));
19659
19660   /* Don't generate bogus routine names.  */
19661   gcc_assert (FIRST_SAVRES_REGISTER <= regno
19662               && regno <= LAST_SAVRES_REGISTER);
19663
19664   sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select];
19665
19666   if (sym == NULL)
19667     {
19668       char *name;
19669
19670       name = rs6000_savres_routine_name (info, regno, savep, gpr, lr);
19671
19672       sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select]
19673         = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
19674       SYMBOL_REF_FLAGS (sym) |= SYMBOL_FLAG_FUNCTION;
19675     }
19676
19677   return sym;
19678 }
19679
19680 /* Emit a sequence of insns, including a stack tie if needed, for
19681    resetting the stack pointer.  If SAVRES is true, then don't reset the
19682    stack pointer, but move the base of the frame into r11 for use by
19683    out-of-line register restore routines.  */
19684
19685 static rtx
19686 rs6000_emit_stack_reset (rs6000_stack_t *info,
19687                          rtx sp_reg_rtx, rtx frame_reg_rtx,
19688                          int sp_offset, bool savres)
19689 {
19690   /* This blockage is needed so that sched doesn't decide to move
19691      the sp change before the register restores.  */
19692   if (frame_reg_rtx != sp_reg_rtx
19693       || (TARGET_SPE_ABI
19694           && info->spe_64bit_regs_used != 0
19695           && info->first_gp_reg_save != 32))
19696     rs6000_emit_stack_tie ();
19697   
19698   if (frame_reg_rtx != sp_reg_rtx)
19699     {
19700       if (sp_offset != 0)
19701         {
19702           rtx dest_reg = savres ? gen_rtx_REG (Pmode, 11) : sp_reg_rtx;
19703           return emit_insn (gen_add3_insn (dest_reg, frame_reg_rtx,
19704                                            GEN_INT (sp_offset)));
19705         }
19706       else if (!savres)
19707         return emit_move_insn (sp_reg_rtx, frame_reg_rtx);
19708     }
19709   else if (sp_offset != 0)
19710     {
19711       /* If we are restoring registers out-of-line, we will be using the
19712          "exit" variants of the restore routines, which will reset the
19713          stack for us.  But we do need to point r11 into the right place
19714          for those routines.  */
19715       rtx dest_reg = (savres
19716                       ? gen_rtx_REG (Pmode, 11)
19717                       : sp_reg_rtx);
19718
19719       rtx insn = emit_insn (gen_add3_insn (dest_reg, sp_reg_rtx,
19720                                            GEN_INT (sp_offset)));
19721       if (!savres)
19722         return insn;
19723     }
19724   return NULL_RTX;
19725 }
19726
19727 /* Construct a parallel rtx describing the effect of a call to an
19728    out-of-line register save/restore routine.  */
19729
19730 static rtx
19731 rs6000_make_savres_rtx (rs6000_stack_t *info,
19732                         rtx frame_reg_rtx, int save_area_offset,
19733                         enum machine_mode reg_mode,
19734                         bool savep, bool gpr, bool lr)
19735 {
19736   int i;
19737   int offset, start_reg, end_reg, n_regs;
19738   int reg_size = GET_MODE_SIZE (reg_mode);
19739   rtx sym;
19740   rtvec p;
19741
19742   offset = 0;
19743   start_reg = (gpr
19744                ? info->first_gp_reg_save
19745                : info->first_fp_reg_save);
19746   end_reg = gpr ? 32 : 64;
19747   n_regs = end_reg - start_reg;
19748   p = rtvec_alloc ((lr ? 4 : 3) + n_regs);
19749
19750   if (!savep && lr)
19751     RTVEC_ELT (p, offset++) = ret_rtx;
19752
19753   RTVEC_ELT (p, offset++)
19754     = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 65));
19755
19756   sym = rs6000_savres_routine_sym (info, savep, gpr, lr);
19757   RTVEC_ELT (p, offset++) = gen_rtx_USE (VOIDmode, sym);
19758   RTVEC_ELT (p, offset++)
19759     = gen_rtx_USE (VOIDmode,
19760                    gen_rtx_REG (Pmode, DEFAULT_ABI != ABI_AIX ? 11
19761                                        : gpr && !lr ? 12
19762                                        : 1));
19763
19764   for (i = 0; i < end_reg - start_reg; i++)
19765     {
19766       rtx addr, reg, mem;
19767       reg = gen_rtx_REG (reg_mode, start_reg + i);
19768       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19769                            GEN_INT (save_area_offset + reg_size*i));
19770       mem = gen_frame_mem (reg_mode, addr);
19771
19772       RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode,
19773                                                savep ? mem : reg,
19774                                                savep ? reg : mem);
19775     }
19776
19777   if (savep && lr)
19778     {
19779       rtx addr, reg, mem;
19780       reg = gen_rtx_REG (Pmode, 0);
19781       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19782                            GEN_INT (info->lr_save_offset));
19783       mem = gen_frame_mem (Pmode, addr);
19784       RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode, mem, reg);
19785     }
19786
19787   return gen_rtx_PARALLEL (VOIDmode, p);
19788 }
19789
19790 /* Determine whether the gp REG is really used.  */
19791
19792 static bool
19793 rs6000_reg_live_or_pic_offset_p (int reg)
19794 {
19795   /* If the function calls eh_return, claim used all the registers that would
19796      be checked for liveness otherwise.  This is required for the PIC offset
19797      register with -mminimal-toc on AIX, as it is advertised as "fixed" for
19798      register allocation purposes in this case.  */
19799
19800   return (((crtl->calls_eh_return || df_regs_ever_live_p (reg))
19801            && (!call_used_regs[reg]
19802                || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
19803                    && !TARGET_SINGLE_PIC_BASE
19804                    && TARGET_TOC && TARGET_MINIMAL_TOC)))
19805           || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
19806               && !TARGET_SINGLE_PIC_BASE
19807               && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
19808                   || (DEFAULT_ABI == ABI_DARWIN && flag_pic))));
19809 }
19810
19811 /* Emit function prologue as insns.  */
19812
19813 void
19814 rs6000_emit_prologue (void)
19815 {
19816   rs6000_stack_t *info = rs6000_stack_info ();
19817   enum machine_mode reg_mode = Pmode;
19818   int reg_size = TARGET_32BIT ? 4 : 8;
19819   rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
19820   rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
19821   rtx frame_reg_rtx = sp_reg_rtx;
19822   rtx cr_save_rtx = NULL_RTX;
19823   rtx insn;
19824   int strategy;
19825   int saving_FPRs_inline;
19826   int saving_GPRs_inline;
19827   int using_store_multiple;
19828   int using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
19829                               && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
19830                               && call_used_regs[STATIC_CHAIN_REGNUM]);
19831   HOST_WIDE_INT sp_offset = 0;
19832
19833   if (flag_stack_usage_info)
19834     current_function_static_stack_size = info->total_size;
19835
19836   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK && info->total_size)
19837     rs6000_emit_probe_stack_range (STACK_CHECK_PROTECT, info->total_size);
19838
19839   if (TARGET_FIX_AND_CONTINUE)
19840     {
19841       /* gdb on darwin arranges to forward a function from the old
19842          address by modifying the first 5 instructions of the function
19843          to branch to the overriding function.  This is necessary to
19844          permit function pointers that point to the old function to
19845          actually forward to the new function.  */
19846       emit_insn (gen_nop ());
19847       emit_insn (gen_nop ());
19848       emit_insn (gen_nop ());
19849       emit_insn (gen_nop ());
19850       emit_insn (gen_nop ());
19851     }
19852
19853   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
19854     {
19855       reg_mode = V2SImode;
19856       reg_size = 8;
19857     }
19858
19859   strategy = info->savres_strategy;
19860   using_store_multiple = strategy & SAVRES_MULTIPLE;
19861   saving_FPRs_inline = strategy & SAVE_INLINE_FPRS;
19862   saving_GPRs_inline = strategy & SAVE_INLINE_GPRS;
19863
19864   /* For V.4, update stack before we do any saving and set back pointer.  */
19865   if (! WORLD_SAVE_P (info)
19866       && info->push_p
19867       && (DEFAULT_ABI == ABI_V4
19868           || crtl->calls_eh_return))
19869     {
19870       bool need_r11 = (TARGET_SPE
19871                        ? (!saving_GPRs_inline
19872                           && info->spe_64bit_regs_used == 0)
19873                        : (!saving_FPRs_inline || !saving_GPRs_inline));
19874       rtx copy_reg = need_r11 ? gen_rtx_REG (Pmode, 11) : NULL;
19875
19876       if (info->total_size < 32767)
19877         sp_offset = info->total_size;
19878       else if (need_r11)
19879         frame_reg_rtx = copy_reg;
19880       else if (info->cr_save_p
19881                || info->lr_save_p
19882                || info->first_fp_reg_save < 64
19883                || info->first_gp_reg_save < 32
19884                || info->altivec_size != 0
19885                || info->vrsave_mask != 0
19886                || crtl->calls_eh_return)
19887         {
19888           copy_reg = frame_ptr_rtx;
19889           frame_reg_rtx = copy_reg;
19890         }
19891       else
19892         {
19893           /* The prologue won't be saving any regs so there is no need
19894              to set up a frame register to access any frame save area.
19895              We also won't be using sp_offset anywhere below, but set
19896              the correct value anyway to protect against future
19897              changes to this function.  */
19898           sp_offset = info->total_size;
19899         }
19900       rs6000_emit_allocate_stack (info->total_size, copy_reg);
19901       if (frame_reg_rtx != sp_reg_rtx)
19902         rs6000_emit_stack_tie ();
19903     }
19904
19905   /* Handle world saves specially here.  */
19906   if (WORLD_SAVE_P (info))
19907     {
19908       int i, j, sz;
19909       rtx treg;
19910       rtvec p;
19911       rtx reg0;
19912
19913       /* save_world expects lr in r0. */
19914       reg0 = gen_rtx_REG (Pmode, 0);
19915       if (info->lr_save_p)
19916         {
19917           insn = emit_move_insn (reg0,
19918                                  gen_rtx_REG (Pmode, LR_REGNO));
19919           RTX_FRAME_RELATED_P (insn) = 1;
19920         }
19921
19922       /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
19923          assumptions about the offsets of various bits of the stack
19924          frame.  */
19925       gcc_assert (info->gp_save_offset == -220
19926                   && info->fp_save_offset == -144
19927                   && info->lr_save_offset == 8
19928                   && info->cr_save_offset == 4
19929                   && info->push_p
19930                   && info->lr_save_p
19931                   && (!crtl->calls_eh_return
19932                        || info->ehrd_offset == -432)
19933                   && info->vrsave_save_offset == -224
19934                   && info->altivec_save_offset == -416);
19935
19936       treg = gen_rtx_REG (SImode, 11);
19937       emit_move_insn (treg, GEN_INT (-info->total_size));
19938
19939       /* SAVE_WORLD takes the caller's LR in R0 and the frame size
19940          in R11.  It also clobbers R12, so beware!  */
19941
19942       /* Preserve CR2 for save_world prologues */
19943       sz = 5;
19944       sz += 32 - info->first_gp_reg_save;
19945       sz += 64 - info->first_fp_reg_save;
19946       sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
19947       p = rtvec_alloc (sz);
19948       j = 0;
19949       RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode,
19950                                             gen_rtx_REG (SImode,
19951                                                          LR_REGNO));
19952       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
19953                                         gen_rtx_SYMBOL_REF (Pmode,
19954                                                             "*save_world"));
19955       /* We do floats first so that the instruction pattern matches
19956          properly.  */
19957       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
19958         {
19959           rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
19960                                    ? DFmode : SFmode), 
19961                                  info->first_fp_reg_save + i);
19962           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19963                                    GEN_INT (info->fp_save_offset
19964                                             + sp_offset + 8 * i));
19965           rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
19966                                      ? DFmode : SFmode), addr);
19967
19968           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
19969         }
19970       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
19971         {
19972           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
19973           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19974                                    GEN_INT (info->altivec_save_offset
19975                                             + sp_offset + 16 * i));
19976           rtx mem = gen_frame_mem (V4SImode, addr);
19977
19978           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
19979         }
19980       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
19981         {
19982           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
19983           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19984                                    GEN_INT (info->gp_save_offset
19985                                             + sp_offset + reg_size * i));
19986           rtx mem = gen_frame_mem (reg_mode, addr);
19987
19988           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
19989         }
19990
19991       {
19992         /* CR register traditionally saved as CR2.  */
19993         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
19994         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
19995                                  GEN_INT (info->cr_save_offset
19996                                           + sp_offset));
19997         rtx mem = gen_frame_mem (reg_mode, addr);
19998
19999         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20000       }
20001       /* Explain about use of R0.  */
20002       if (info->lr_save_p)
20003         {
20004           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20005                                    GEN_INT (info->lr_save_offset
20006                                             + sp_offset));
20007           rtx mem = gen_frame_mem (reg_mode, addr);
20008
20009           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg0);
20010         }
20011       /* Explain what happens to the stack pointer.  */
20012       {
20013         rtx newval = gen_rtx_PLUS (Pmode, sp_reg_rtx, treg);
20014         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, sp_reg_rtx, newval);
20015       }
20016
20017       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20018       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20019                             treg, GEN_INT (-info->total_size));
20020       sp_offset = info->total_size;
20021     }
20022
20023   /* If we use the link register, get it into r0.  */
20024   if (!WORLD_SAVE_P (info) && info->lr_save_p)
20025     {
20026       rtx addr, reg, mem;
20027
20028       insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
20029                              gen_rtx_REG (Pmode, LR_REGNO));
20030       RTX_FRAME_RELATED_P (insn) = 1;
20031
20032       if (!(strategy & (SAVE_NOINLINE_GPRS_SAVES_LR
20033                         | SAVE_NOINLINE_FPRS_SAVES_LR)))
20034         {
20035           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20036                                GEN_INT (info->lr_save_offset + sp_offset));
20037           reg = gen_rtx_REG (Pmode, 0);
20038           mem = gen_rtx_MEM (Pmode, addr);
20039           /* This should not be of rs6000_sr_alias_set, because of
20040              __builtin_return_address.  */
20041
20042           insn = emit_move_insn (mem, reg);
20043           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20044                                 NULL_RTX, NULL_RTX);
20045         }
20046     }
20047
20048   /* If we need to save CR, put it into r12 or r11.  */
20049   if (!WORLD_SAVE_P (info) && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
20050     {
20051       rtx set;
20052
20053       cr_save_rtx
20054         = gen_rtx_REG (SImode, DEFAULT_ABI == ABI_AIX && !saving_GPRs_inline
20055                        ? 11 : 12);
20056       insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
20057       RTX_FRAME_RELATED_P (insn) = 1;
20058       /* Now, there's no way that dwarf2out_frame_debug_expr is going
20059          to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
20060          But that's OK.  All we have to do is specify that _one_ condition
20061          code register is saved in this stack slot.  The thrower's epilogue
20062          will then restore all the call-saved registers.
20063          We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux.  */
20064       set = gen_rtx_SET (VOIDmode, cr_save_rtx,
20065                          gen_rtx_REG (SImode, CR2_REGNO));
20066       add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
20067     }
20068
20069   /* Do any required saving of fpr's.  If only one or two to save, do
20070      it ourselves.  Otherwise, call function.  */
20071   if (!WORLD_SAVE_P (info) && saving_FPRs_inline)
20072     {
20073       int i;
20074       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
20075         if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
20076              && ! call_used_regs[info->first_fp_reg_save+i]))
20077           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, 
20078                            (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20079                             ? DFmode : SFmode,
20080                            info->first_fp_reg_save + i,
20081                            info->fp_save_offset + sp_offset + 8 * i,
20082                            info->total_size);
20083     }
20084   else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
20085     {
20086       rtx par;
20087
20088       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
20089                                     info->fp_save_offset + sp_offset,
20090                                     DFmode,
20091                                     /*savep=*/true, /*gpr=*/false,
20092                                     /*lr=*/(strategy
20093                                             & SAVE_NOINLINE_FPRS_SAVES_LR)
20094                                            != 0);
20095       insn = emit_insn (par);
20096       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20097                             NULL_RTX, NULL_RTX);
20098     }
20099
20100   /* Save GPRs.  This is done as a PARALLEL if we are using
20101      the store-multiple instructions.  */
20102   if (!WORLD_SAVE_P (info)
20103       && TARGET_SPE_ABI
20104       && info->spe_64bit_regs_used != 0
20105       && info->first_gp_reg_save != 32)
20106     {
20107       int i;
20108       rtx spe_save_area_ptr;
20109  
20110       /* Determine whether we can address all of the registers that need
20111          to be saved with an offset from the stack pointer that fits in
20112          the small const field for SPE memory instructions.  */
20113       int spe_regs_addressable_via_sp
20114         = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
20115                                + (32 - info->first_gp_reg_save - 1) * reg_size)
20116            && saving_GPRs_inline);
20117       int spe_offset;
20118  
20119       if (spe_regs_addressable_via_sp)
20120         {
20121           spe_save_area_ptr = frame_reg_rtx;
20122           spe_offset = info->spe_gp_save_offset + sp_offset;
20123         }
20124       else
20125         {
20126           /* Make r11 point to the start of the SPE save area.  We need
20127              to be careful here if r11 is holding the static chain.  If
20128              it is, then temporarily save it in r0.  We would use r0 as
20129              our base register here, but using r0 as a base register in
20130              loads and stores means something different from what we
20131              would like.  */
20132           int ool_adjust = (saving_GPRs_inline
20133                             ? 0
20134                             : (info->first_gp_reg_save
20135                                - (FIRST_SAVRES_REGISTER+1))*8);
20136           HOST_WIDE_INT offset = (info->spe_gp_save_offset
20137                                   + sp_offset - ool_adjust);
20138
20139           if (using_static_chain_p)
20140             {
20141               rtx r0 = gen_rtx_REG (Pmode, 0);
20142               gcc_assert (info->first_gp_reg_save > 11);
20143  
20144               emit_move_insn (r0, gen_rtx_REG (Pmode, 11));
20145             }
20146  
20147           spe_save_area_ptr = gen_rtx_REG (Pmode, 11);
20148           insn = emit_insn (gen_addsi3 (spe_save_area_ptr,
20149                                         frame_reg_rtx,
20150                                         GEN_INT (offset)));
20151           /* We need to make sure the move to r11 gets noted for
20152              properly outputting unwind information.  */
20153           if (!saving_GPRs_inline)
20154             rs6000_frame_related (insn, frame_reg_rtx, offset,
20155                                   NULL_RTX, NULL_RTX);
20156           spe_offset = 0;
20157         }
20158  
20159       if (saving_GPRs_inline)
20160         {
20161           for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20162             if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
20163               {
20164                 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20165                 rtx offset, addr, mem;
20166
20167                 /* We're doing all this to ensure that the offset fits into
20168                    the immediate offset of 'evstdd'.  */
20169                 gcc_assert (SPE_CONST_OFFSET_OK (reg_size * i + spe_offset));
20170  
20171                 offset = GEN_INT (reg_size * i + spe_offset);
20172                 addr = gen_rtx_PLUS (Pmode, spe_save_area_ptr, offset);
20173                 mem = gen_rtx_MEM (V2SImode, addr);
20174   
20175                 insn = emit_move_insn (mem, reg);
20176            
20177                 rs6000_frame_related (insn, spe_save_area_ptr,
20178                                       info->spe_gp_save_offset
20179                                       + sp_offset + reg_size * i,
20180                                       offset, const0_rtx);
20181               }
20182         }
20183       else
20184         {
20185           rtx par;
20186
20187           par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
20188                                         0, reg_mode,
20189                                         /*savep=*/true, /*gpr=*/true,
20190                                         /*lr=*/false);
20191           insn = emit_insn (par);
20192           rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20193                                 NULL_RTX, NULL_RTX);
20194         }
20195                                         
20196  
20197       /* Move the static chain pointer back.  */
20198       if (using_static_chain_p && !spe_regs_addressable_via_sp)
20199         emit_move_insn (gen_rtx_REG (Pmode, 11), gen_rtx_REG (Pmode, 0));
20200     }
20201   else if (!WORLD_SAVE_P (info) && !saving_GPRs_inline)
20202     {
20203       rtx par;
20204
20205       /* Need to adjust r11 (r12) if we saved any FPRs.  */
20206       if (info->first_fp_reg_save != 64)
20207         {
20208           rtx dest_reg = gen_rtx_REG (reg_mode, DEFAULT_ABI == ABI_AIX
20209                                       ? 12 : 11);
20210           rtx offset = GEN_INT (sp_offset
20211                                 + (-8 * (64-info->first_fp_reg_save)));
20212           emit_insn (gen_add3_insn (dest_reg, frame_reg_rtx, offset));
20213         }
20214
20215       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
20216                                     info->gp_save_offset + sp_offset,
20217                                     reg_mode,
20218                                     /*savep=*/true, /*gpr=*/true,
20219                                     /*lr=*/(strategy
20220                                             & SAVE_NOINLINE_GPRS_SAVES_LR)
20221                                            != 0);
20222       insn = emit_insn (par);
20223       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20224                             NULL_RTX, NULL_RTX);
20225     }
20226   else if (!WORLD_SAVE_P (info) && using_store_multiple)
20227     {
20228       rtvec p;
20229       int i;
20230       p = rtvec_alloc (32 - info->first_gp_reg_save);
20231       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20232         {
20233           rtx addr, reg, mem;
20234           reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20235           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20236                                GEN_INT (info->gp_save_offset
20237                                         + sp_offset
20238                                         + reg_size * i));
20239           mem = gen_frame_mem (reg_mode, addr);
20240
20241           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
20242         }
20243       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20244       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20245                             NULL_RTX, NULL_RTX);
20246     }
20247   else if (!WORLD_SAVE_P (info))
20248     {
20249       int i;
20250       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20251         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
20252           {
20253             rtx addr, reg, mem;
20254             reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20255
20256             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20257                                  GEN_INT (info->gp_save_offset
20258                                           + sp_offset
20259                                           + reg_size * i));
20260             mem = gen_frame_mem (reg_mode, addr);
20261
20262             insn = emit_move_insn (mem, reg);
20263             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20264                                   NULL_RTX, NULL_RTX);
20265           }
20266     }
20267
20268   /* ??? There's no need to emit actual instructions here, but it's the
20269      easiest way to get the frame unwind information emitted.  */
20270   if (crtl->calls_eh_return)
20271     {
20272       unsigned int i, regno;
20273
20274       for (i = 0; ; ++i)
20275         {
20276           regno = EH_RETURN_DATA_REGNO (i);
20277           if (regno == INVALID_REGNUM)
20278             break;
20279
20280           emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
20281                            info->ehrd_offset + sp_offset
20282                            + reg_size * (int) i,
20283                            info->total_size);
20284         }
20285     }
20286
20287   /* In AIX ABI we need to make sure r2 is really saved.  */
20288   if (TARGET_AIX && crtl->calls_eh_return)
20289     {
20290       rtx tmp_reg, tmp_reg_si, hi, lo, compare_result, toc_save_done, jump;
20291       rtx save_insn, join_insn, note;
20292       long toc_restore_insn;
20293
20294       gcc_assert (frame_reg_rtx == frame_ptr_rtx
20295                   || frame_reg_rtx == sp_reg_rtx);
20296       tmp_reg = gen_rtx_REG (Pmode, 11);
20297       tmp_reg_si = gen_rtx_REG (SImode, 11);
20298       if (using_static_chain_p)
20299         emit_move_insn (gen_rtx_REG (Pmode, 0), tmp_reg);
20300       gcc_assert (saving_GPRs_inline && saving_FPRs_inline);
20301       emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, LR_REGNO));
20302       /* Peek at instruction to which this function returns.  If it's
20303          restoring r2, then we know we've already saved r2.  We can't
20304          unconditionally save r2 because the value we have will already
20305          be updated if we arrived at this function via a plt call or
20306          toc adjusting stub.  */
20307       emit_move_insn (tmp_reg_si, gen_rtx_MEM (SImode, tmp_reg));
20308       toc_restore_insn = TARGET_32BIT ? 0x80410014 : 0xE8410028;
20309       hi = gen_int_mode (toc_restore_insn & ~0xffff, SImode);
20310       emit_insn (gen_xorsi3 (tmp_reg_si, tmp_reg_si, hi));
20311       compare_result = gen_rtx_REG (CCUNSmode, CR0_REGNO);
20312       validate_condition_mode (EQ, CCUNSmode);
20313       lo = gen_int_mode (toc_restore_insn & 0xffff, SImode);
20314       emit_insn (gen_rtx_SET (VOIDmode, compare_result,
20315                               gen_rtx_COMPARE (CCUNSmode, tmp_reg_si, lo)));
20316       toc_save_done = gen_label_rtx ();
20317       jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
20318                                    gen_rtx_EQ (VOIDmode, compare_result,
20319                                                const0_rtx),
20320                                    gen_rtx_LABEL_REF (VOIDmode, toc_save_done),
20321                                    pc_rtx);
20322       jump = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, jump));
20323       JUMP_LABEL (jump) = toc_save_done;
20324       LABEL_NUSES (toc_save_done) += 1;
20325
20326       save_insn = emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode,
20327                                    TOC_REGNUM, sp_offset + 5 * reg_size,
20328                                    info->total_size);
20329
20330       emit_label (toc_save_done);
20331
20332       /* ??? If we leave SAVE_INSN as marked as saving R2, then we'll
20333          have a CFG that has different saves along different paths.
20334          Move the note to a dummy blockage insn, which describes that
20335          R2 is unconditionally saved after the label.  */
20336       /* ??? An alternate representation might be a special insn pattern
20337          containing both the branch and the store.  That might let the
20338          code that minimizes the number of DW_CFA_advance opcodes better
20339          freedom in placing the annotations.  */
20340       note = find_reg_note (save_insn, REG_FRAME_RELATED_EXPR, NULL);
20341       gcc_assert (note);
20342       remove_note (save_insn, note);
20343       RTX_FRAME_RELATED_P (save_insn) = 0;
20344
20345       join_insn = emit_insn (gen_blockage ());
20346       REG_NOTES (join_insn) = note;
20347       RTX_FRAME_RELATED_P (join_insn) = 1;
20348
20349       if (using_static_chain_p)
20350         emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, 0));
20351     }
20352
20353   /* Save CR if we use any that must be preserved.  */
20354   if (!WORLD_SAVE_P (info) && info->cr_save_p)
20355     {
20356       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20357                                GEN_INT (info->cr_save_offset + sp_offset));
20358       rtx mem = gen_frame_mem (SImode, addr);
20359       /* See the large comment above about why CR2_REGNO is used.  */
20360       rtx magic_eh_cr_reg = gen_rtx_REG (SImode, CR2_REGNO);
20361
20362       /* If r12 was used to hold the original sp, copy cr into r0 now
20363          that it's free.  */
20364       if (REGNO (frame_reg_rtx) == 12)
20365         {
20366           rtx set;
20367
20368           cr_save_rtx = gen_rtx_REG (SImode, 0);
20369           insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
20370           RTX_FRAME_RELATED_P (insn) = 1;
20371           set = gen_rtx_SET (VOIDmode, cr_save_rtx, magic_eh_cr_reg);
20372           add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
20373         }
20374       insn = emit_move_insn (mem, cr_save_rtx);
20375
20376       rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20377                             NULL_RTX, NULL_RTX);
20378     }
20379
20380   /* Update stack and set back pointer unless this is V.4,
20381      for which it was done previously.  */
20382   if (!WORLD_SAVE_P (info) && info->push_p
20383       && !(DEFAULT_ABI == ABI_V4 || crtl->calls_eh_return))
20384     {
20385       rtx copy_reg = NULL;
20386
20387       if (info->total_size < 32767)
20388         sp_offset = info->total_size;
20389       else if (info->altivec_size != 0
20390                || info->vrsave_mask != 0)
20391         {
20392           copy_reg = frame_ptr_rtx;
20393           frame_reg_rtx = copy_reg;
20394         }
20395       else
20396         sp_offset = info->total_size;
20397       rs6000_emit_allocate_stack (info->total_size, copy_reg);
20398       if (frame_reg_rtx != sp_reg_rtx)
20399         rs6000_emit_stack_tie ();
20400     }
20401
20402   /* Set frame pointer, if needed.  */
20403   if (frame_pointer_needed)
20404     {
20405       insn = emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
20406                              sp_reg_rtx);
20407       RTX_FRAME_RELATED_P (insn) = 1;
20408     }
20409
20410   /* Save AltiVec registers if needed.  Save here because the red zone does
20411      not include AltiVec registers.  */
20412   if (!WORLD_SAVE_P (info) && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
20413     {
20414       int i;
20415
20416       /* There should be a non inline version of this, for when we
20417          are saving lots of vector registers.  */
20418       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
20419         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
20420           {
20421             rtx areg, savereg, mem;
20422             int offset;
20423
20424             offset = info->altivec_save_offset + sp_offset
20425               + 16 * (i - info->first_altivec_reg_save);
20426
20427             savereg = gen_rtx_REG (V4SImode, i);
20428
20429             areg = gen_rtx_REG (Pmode, 0);
20430             emit_move_insn (areg, GEN_INT (offset));
20431
20432             /* AltiVec addressing mode is [reg+reg].  */
20433             mem = gen_frame_mem (V4SImode,
20434                                  gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
20435
20436             insn = emit_move_insn (mem, savereg);
20437
20438             rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20439                                   areg, GEN_INT (offset));
20440           }
20441     }
20442
20443   /* VRSAVE is a bit vector representing which AltiVec registers
20444      are used.  The OS uses this to determine which vector
20445      registers to save on a context switch.  We need to save
20446      VRSAVE on the stack frame, add whatever AltiVec registers we
20447      used in this function, and do the corresponding magic in the
20448      epilogue.  */
20449
20450   if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
20451       && info->vrsave_mask != 0)
20452     {
20453       rtx reg, mem, vrsave;
20454       int offset;
20455
20456       /* Get VRSAVE onto a GPR.  Note that ABI_V4 might be using r12
20457          as frame_reg_rtx and r11 as the static chain pointer for
20458          nested functions.  */
20459       reg = gen_rtx_REG (SImode, 0);
20460       vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
20461       if (TARGET_MACHO)
20462         emit_insn (gen_get_vrsave_internal (reg));
20463       else
20464         emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
20465
20466       if (!WORLD_SAVE_P (info))
20467         {
20468           /* Save VRSAVE.  */
20469           offset = info->vrsave_save_offset + sp_offset;
20470           mem = gen_frame_mem (SImode,
20471                                gen_rtx_PLUS (Pmode, frame_reg_rtx,
20472                                              GEN_INT (offset)));
20473           insn = emit_move_insn (mem, reg);
20474         }
20475
20476       /* Include the registers in the mask.  */
20477       emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
20478
20479       insn = emit_insn (generate_set_vrsave (reg, info, 0));
20480     }
20481
20482   /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up.  */
20483   if (!TARGET_SINGLE_PIC_BASE
20484       && ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
20485           || (DEFAULT_ABI == ABI_V4
20486               && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
20487               && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))))
20488     {
20489       /* If emit_load_toc_table will use the link register, we need to save
20490          it.  We use R12 for this purpose because emit_load_toc_table
20491          can use register 0.  This allows us to use a plain 'blr' to return
20492          from the procedure more often.  */
20493       int save_LR_around_toc_setup = (TARGET_ELF
20494                                       && DEFAULT_ABI != ABI_AIX
20495                                       && flag_pic
20496                                       && ! info->lr_save_p
20497                                       && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0);
20498       if (save_LR_around_toc_setup)
20499         {
20500           rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
20501
20502           insn = emit_move_insn (frame_ptr_rtx, lr);
20503           RTX_FRAME_RELATED_P (insn) = 1;
20504
20505           rs6000_emit_load_toc_table (TRUE);
20506
20507           insn = emit_move_insn (lr, frame_ptr_rtx);
20508           add_reg_note (insn, REG_CFA_RESTORE, lr);
20509           RTX_FRAME_RELATED_P (insn) = 1;
20510         }
20511       else
20512         rs6000_emit_load_toc_table (TRUE);
20513     }
20514
20515 #if TARGET_MACHO
20516   if (!TARGET_SINGLE_PIC_BASE
20517       && DEFAULT_ABI == ABI_DARWIN
20518       && flag_pic && crtl->uses_pic_offset_table)
20519     {
20520       rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
20521       rtx src = gen_rtx_SYMBOL_REF (Pmode, MACHOPIC_FUNCTION_BASE_NAME);
20522
20523       /* Save and restore LR locally around this call (in R0).  */
20524       if (!info->lr_save_p)
20525         emit_move_insn (gen_rtx_REG (Pmode, 0), lr);
20526
20527       emit_insn (gen_load_macho_picbase (src));
20528
20529       emit_move_insn (gen_rtx_REG (Pmode,
20530                                    RS6000_PIC_OFFSET_TABLE_REGNUM),
20531                       lr);
20532
20533       if (!info->lr_save_p)
20534         emit_move_insn (lr, gen_rtx_REG (Pmode, 0));
20535     }
20536 #endif
20537
20538   /* If we need to, save the TOC register after doing the stack setup.
20539      Do not emit eh frame info for this save.  The unwinder wants info,
20540      conceptually attached to instructions in this function, about
20541      register values in the caller of this function.  This R2 may have
20542      already been changed from the value in the caller.
20543      We don't attempt to write accurate DWARF EH frame info for R2
20544      because code emitted by gcc for a (non-pointer) function call
20545      doesn't save and restore R2.  Instead, R2 is managed out-of-line
20546      by a linker generated plt call stub when the function resides in
20547      a shared library.  This behaviour is costly to describe in DWARF,
20548      both in terms of the size of DWARF info and the time taken in the
20549      unwinder to interpret it.  R2 changes, apart from the
20550      calls_eh_return case earlier in this function, are handled by
20551      linux-unwind.h frob_update_context.  */ 
20552   if (rs6000_save_toc_in_prologue_p ())
20553     {
20554       rtx addr = gen_rtx_PLUS (Pmode, sp_reg_rtx, GEN_INT (5 * reg_size));
20555       rtx mem = gen_frame_mem (reg_mode, addr);
20556       emit_move_insn (mem, gen_rtx_REG (reg_mode, TOC_REGNUM));
20557     }
20558 }
20559
20560 /* Write function prologue.  */
20561
20562 static void
20563 rs6000_output_function_prologue (FILE *file,
20564                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
20565 {
20566   rs6000_stack_t *info = rs6000_stack_info ();
20567
20568   if (TARGET_DEBUG_STACK)
20569     debug_stack_info (info);
20570
20571   /* Write .extern for any function we will call to save and restore
20572      fp values.  */
20573   if (info->first_fp_reg_save < 64)
20574     {
20575       char *name;
20576       int regno = info->first_fp_reg_save - 32;
20577
20578       if ((info->savres_strategy & SAVE_INLINE_FPRS) == 0)
20579         {
20580           name = rs6000_savres_routine_name (info, regno, /*savep=*/true,
20581                                              /*gpr=*/false, /*lr=*/false);
20582           fprintf (file, "\t.extern %s\n", name);
20583         }
20584       if ((info->savres_strategy & REST_INLINE_FPRS) == 0)
20585         {
20586           name = rs6000_savres_routine_name (info, regno, /*savep=*/false,
20587                                              /*gpr=*/false, /*lr=*/true);
20588           fprintf (file, "\t.extern %s\n", name);
20589         }
20590     }
20591
20592   /* Write .extern for AIX common mode routines, if needed.  */
20593   if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
20594     {
20595       fputs ("\t.extern __mulh\n", file);
20596       fputs ("\t.extern __mull\n", file);
20597       fputs ("\t.extern __divss\n", file);
20598       fputs ("\t.extern __divus\n", file);
20599       fputs ("\t.extern __quoss\n", file);
20600       fputs ("\t.extern __quous\n", file);
20601       common_mode_defined = 1;
20602     }
20603
20604   rs6000_pic_labelno++;
20605 }
20606
20607 /* Non-zero if vmx regs are restored before the frame pop, zero if
20608    we restore after the pop when possible.  */
20609 #define ALWAYS_RESTORE_ALTIVEC_BEFORE_POP 0
20610
20611 /* Reload CR from REG.  */
20612
20613 static void
20614 rs6000_restore_saved_cr (rtx reg, int using_mfcr_multiple)
20615 {
20616   int count = 0;
20617   int i;
20618
20619   if (using_mfcr_multiple)
20620     {
20621       for (i = 0; i < 8; i++)
20622         if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
20623           count++;
20624       gcc_assert (count);
20625     }
20626
20627   if (using_mfcr_multiple && count > 1)
20628     {
20629       rtvec p;
20630       int ndx;
20631
20632       p = rtvec_alloc (count);
20633
20634       ndx = 0;
20635       for (i = 0; i < 8; i++)
20636         if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
20637           {
20638             rtvec r = rtvec_alloc (2);
20639             RTVEC_ELT (r, 0) = reg;
20640             RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
20641             RTVEC_ELT (p, ndx) =
20642               gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
20643                            gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
20644             ndx++;
20645           }
20646       emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20647       gcc_assert (ndx == count);
20648     }
20649   else
20650     for (i = 0; i < 8; i++)
20651       if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
20652         {
20653           emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
20654                                                        CR0_REGNO+i),
20655                                           reg));
20656         }
20657 }
20658
20659 /* Return true if OFFSET from stack pointer can be clobbered by signals.
20660    V.4 doesn't have any stack cushion, AIX ABIs have 220 or 288 bytes
20661    below stack pointer not cloberred by signals.  */
20662
20663 static inline bool
20664 offset_below_red_zone_p (HOST_WIDE_INT offset)
20665 {
20666   return offset < (DEFAULT_ABI == ABI_V4
20667                    ? 0
20668                    : TARGET_32BIT ? -220 : -288);
20669 }
20670
20671 /* Emit function epilogue as insns.  */
20672
20673 void
20674 rs6000_emit_epilogue (int sibcall)
20675 {
20676   rs6000_stack_t *info;
20677   int restoring_GPRs_inline;
20678   int restoring_FPRs_inline;
20679   int using_load_multiple;
20680   int using_mtcr_multiple;
20681   int use_backchain_to_restore_sp;
20682   int restore_lr;
20683   int strategy;
20684   int sp_offset = 0;
20685   rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
20686   rtx frame_reg_rtx = sp_reg_rtx;
20687   rtx cfa_restores = NULL_RTX;
20688   rtx insn;
20689   rtx cr_save_reg = NULL_RTX;
20690   enum machine_mode reg_mode = Pmode;
20691   int reg_size = TARGET_32BIT ? 4 : 8;
20692   int i;
20693
20694   info = rs6000_stack_info ();
20695
20696   if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
20697     {
20698       reg_mode = V2SImode;
20699       reg_size = 8;
20700     }
20701
20702   strategy = info->savres_strategy;
20703   using_load_multiple = strategy & SAVRES_MULTIPLE;
20704   restoring_FPRs_inline = sibcall || (strategy & REST_INLINE_FPRS);
20705   restoring_GPRs_inline = sibcall || (strategy & REST_INLINE_GPRS);
20706   using_mtcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
20707                          || rs6000_cpu == PROCESSOR_PPC603
20708                          || rs6000_cpu == PROCESSOR_PPC750
20709                          || optimize_size);
20710   /* Restore via the backchain when we have a large frame, since this
20711      is more efficient than an addis, addi pair.  The second condition
20712      here will not trigger at the moment;  We don't actually need a
20713      frame pointer for alloca, but the generic parts of the compiler
20714      give us one anyway.  */
20715   use_backchain_to_restore_sp = (info->total_size > 32767
20716                                  || info->total_size
20717                                      + (info->lr_save_p ? info->lr_save_offset : 0)
20718                                        > 32767
20719                                  || (cfun->calls_alloca
20720                                      && !frame_pointer_needed));
20721   restore_lr = (info->lr_save_p
20722                 && (restoring_FPRs_inline
20723                     || (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR))
20724                 && (restoring_GPRs_inline
20725                     || info->first_fp_reg_save < 64));
20726
20727   if (WORLD_SAVE_P (info))
20728     {
20729       int i, j;
20730       char rname[30];
20731       const char *alloc_rname;
20732       rtvec p;
20733
20734       /* eh_rest_world_r10 will return to the location saved in the LR
20735          stack slot (which is not likely to be our caller.)
20736          Input: R10 -- stack adjustment.  Clobbers R0, R11, R12, R7, R8.
20737          rest_world is similar, except any R10 parameter is ignored.
20738          The exception-handling stuff that was here in 2.95 is no
20739          longer necessary.  */
20740
20741       p = rtvec_alloc (9
20742                        + 1
20743                        + 32 - info->first_gp_reg_save
20744                        + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
20745                        + 63 + 1 - info->first_fp_reg_save);
20746
20747       strcpy (rname, ((crtl->calls_eh_return) ?
20748                       "*eh_rest_world_r10" : "*rest_world"));
20749       alloc_rname = ggc_strdup (rname);
20750
20751       j = 0;
20752       RTVEC_ELT (p, j++) = ret_rtx;
20753       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
20754                                         gen_rtx_REG (Pmode,
20755                                                      LR_REGNO));
20756       RTVEC_ELT (p, j++)
20757         = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, alloc_rname));
20758       /* The instruction pattern requires a clobber here;
20759          it is shared with the restVEC helper. */
20760       RTVEC_ELT (p, j++)
20761         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
20762
20763       {
20764         /* CR register traditionally saved as CR2.  */
20765         rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
20766         rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20767                                  GEN_INT (info->cr_save_offset));
20768         rtx mem = gen_frame_mem (reg_mode, addr);
20769
20770         RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20771       }
20772
20773       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20774         {
20775           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20776           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20777                                    GEN_INT (info->gp_save_offset
20778                                             + reg_size * i));
20779           rtx mem = gen_frame_mem (reg_mode, addr);
20780
20781           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20782         }
20783       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
20784         {
20785           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
20786           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20787                                    GEN_INT (info->altivec_save_offset
20788                                             + 16 * i));
20789           rtx mem = gen_frame_mem (V4SImode, addr);
20790
20791           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20792         }
20793       for (i = 0; info->first_fp_reg_save + i <= 63; i++)
20794         {
20795           rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20796                                    ? DFmode : SFmode), 
20797                                  info->first_fp_reg_save + i);
20798           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20799                                    GEN_INT (info->fp_save_offset
20800                                             + 8 * i));
20801           rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20802                                      ? DFmode : SFmode), addr);
20803
20804           RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
20805         }
20806       RTVEC_ELT (p, j++)
20807         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 0));
20808       RTVEC_ELT (p, j++)
20809         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 12));
20810       RTVEC_ELT (p, j++)
20811         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 7));
20812       RTVEC_ELT (p, j++)
20813         = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 8));
20814       RTVEC_ELT (p, j++)
20815         = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
20816       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
20817
20818       return;
20819     }
20820
20821   /* frame_reg_rtx + sp_offset points to the top of this stack frame.  */
20822   if (info->push_p)
20823     sp_offset = info->total_size;
20824
20825   /* Restore AltiVec registers if we must do so before adjusting the
20826      stack.  */
20827   if (TARGET_ALTIVEC_ABI
20828       && info->altivec_size != 0
20829       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20830           || (DEFAULT_ABI != ABI_V4
20831               && offset_below_red_zone_p (info->altivec_save_offset))))
20832     {
20833       int i;
20834
20835       if (use_backchain_to_restore_sp)
20836         {
20837           frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20838           emit_move_insn (frame_reg_rtx,
20839                           gen_rtx_MEM (Pmode, sp_reg_rtx));
20840           sp_offset = 0;
20841         }
20842       else if (frame_pointer_needed)
20843         frame_reg_rtx = hard_frame_pointer_rtx;
20844
20845       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
20846         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
20847           {
20848             rtx addr, areg, mem, reg;
20849
20850             areg = gen_rtx_REG (Pmode, 0);
20851             emit_move_insn
20852               (areg, GEN_INT (info->altivec_save_offset
20853                               + sp_offset
20854                               + 16 * (i - info->first_altivec_reg_save)));
20855
20856             /* AltiVec addressing mode is [reg+reg].  */
20857             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
20858             mem = gen_frame_mem (V4SImode, addr);
20859
20860             reg = gen_rtx_REG (V4SImode, i);
20861             emit_move_insn (reg, mem);
20862             if (offset_below_red_zone_p (info->altivec_save_offset
20863                                          + (i - info->first_altivec_reg_save)
20864                                            * 16))
20865               cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
20866                                              cfa_restores);
20867           }
20868     }
20869
20870   /* Restore VRSAVE if we must do so before adjusting the stack.  */
20871   if (TARGET_ALTIVEC
20872       && TARGET_ALTIVEC_VRSAVE
20873       && info->vrsave_mask != 0
20874       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20875           || (DEFAULT_ABI != ABI_V4
20876               && offset_below_red_zone_p (info->vrsave_save_offset))))
20877     {
20878       rtx addr, mem, reg;
20879
20880       if (frame_reg_rtx == sp_reg_rtx)
20881         {
20882           if (use_backchain_to_restore_sp)
20883             {
20884               frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20885               emit_move_insn (frame_reg_rtx,
20886                               gen_rtx_MEM (Pmode, sp_reg_rtx));
20887               sp_offset = 0;
20888             }
20889           else if (frame_pointer_needed)
20890             frame_reg_rtx = hard_frame_pointer_rtx;
20891         }
20892
20893       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20894                            GEN_INT (info->vrsave_save_offset + sp_offset));
20895       mem = gen_frame_mem (SImode, addr);
20896       reg = gen_rtx_REG (SImode, 12);
20897       emit_move_insn (reg, mem);
20898
20899       emit_insn (generate_set_vrsave (reg, info, 1));
20900     }
20901
20902   insn = NULL_RTX;
20903   /* If we have a large stack frame, restore the old stack pointer
20904      using the backchain.  */
20905   if (use_backchain_to_restore_sp)
20906     {
20907       if (frame_reg_rtx == sp_reg_rtx)
20908         {
20909           /* Under V.4, don't reset the stack pointer until after we're done
20910              loading the saved registers.  */
20911           if (DEFAULT_ABI == ABI_V4)
20912             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20913
20914           insn = emit_move_insn (frame_reg_rtx,
20915                                  gen_rtx_MEM (Pmode, sp_reg_rtx));
20916           sp_offset = 0;
20917         }
20918       else if (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20919                && DEFAULT_ABI == ABI_V4)
20920         /* frame_reg_rtx has been set up by the altivec restore.  */
20921         ;
20922       else
20923         {
20924           insn = emit_move_insn (sp_reg_rtx, frame_reg_rtx);
20925           frame_reg_rtx = sp_reg_rtx;
20926         }
20927     }
20928   /* If we have a frame pointer, we can restore the old stack pointer
20929      from it.  */
20930   else if (frame_pointer_needed)
20931     {
20932       frame_reg_rtx = sp_reg_rtx;
20933       if (DEFAULT_ABI == ABI_V4)
20934         frame_reg_rtx = gen_rtx_REG (Pmode, 11);
20935       /* Prevent reordering memory accesses against stack pointer restore.  */
20936       else if (cfun->calls_alloca
20937                || offset_below_red_zone_p (-info->total_size))
20938         {
20939           rtx mem1 = gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx);
20940           rtx mem2 = gen_rtx_MEM (BLKmode, sp_reg_rtx);
20941           MEM_NOTRAP_P (mem1) = 1;
20942           MEM_NOTRAP_P (mem2) = 1;
20943           emit_insn (gen_frame_tie (mem1, mem2));
20944         }
20945
20946       insn = emit_insn (gen_add3_insn (frame_reg_rtx, hard_frame_pointer_rtx,
20947                                        GEN_INT (info->total_size)));
20948       sp_offset = 0;
20949     }
20950   else if (info->push_p
20951            && DEFAULT_ABI != ABI_V4
20952            && !crtl->calls_eh_return)
20953     {
20954       /* Prevent reordering memory accesses against stack pointer restore.  */
20955       if (cfun->calls_alloca
20956           || offset_below_red_zone_p (-info->total_size))
20957         {
20958           rtx mem = gen_rtx_MEM (BLKmode, sp_reg_rtx);
20959           MEM_NOTRAP_P (mem) = 1;
20960           emit_insn (gen_stack_tie (mem));
20961         }
20962       insn = emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx,
20963                                        GEN_INT (info->total_size)));
20964       sp_offset = 0;
20965     }
20966   if (insn && frame_reg_rtx == sp_reg_rtx)
20967     {
20968       if (cfa_restores)
20969         {
20970           REG_NOTES (insn) = cfa_restores;
20971           cfa_restores = NULL_RTX;
20972         }
20973       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
20974       RTX_FRAME_RELATED_P (insn) = 1;
20975     }
20976
20977   /* Restore AltiVec registers if we have not done so already.  */
20978   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
20979       && TARGET_ALTIVEC_ABI
20980       && info->altivec_size != 0
20981       && (DEFAULT_ABI == ABI_V4
20982           || !offset_below_red_zone_p (info->altivec_save_offset)))
20983     {
20984       int i;
20985
20986       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
20987         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
20988           {
20989             rtx addr, areg, mem, reg;
20990
20991             areg = gen_rtx_REG (Pmode, 0);
20992             emit_move_insn
20993               (areg, GEN_INT (info->altivec_save_offset
20994                               + sp_offset
20995                               + 16 * (i - info->first_altivec_reg_save)));
20996
20997             /* AltiVec addressing mode is [reg+reg].  */
20998             addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
20999             mem = gen_frame_mem (V4SImode, addr);
21000
21001             reg = gen_rtx_REG (V4SImode, i);
21002             emit_move_insn (reg, mem);
21003             if (DEFAULT_ABI == ABI_V4)
21004               cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21005                                              cfa_restores);
21006           }
21007     }
21008
21009   /* Restore VRSAVE if we have not done so already.  */
21010   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
21011       && TARGET_ALTIVEC
21012       && TARGET_ALTIVEC_VRSAVE
21013       && info->vrsave_mask != 0
21014       && (DEFAULT_ABI == ABI_V4
21015           || !offset_below_red_zone_p (info->vrsave_save_offset)))
21016     {
21017       rtx addr, mem, reg;
21018
21019       addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21020                            GEN_INT (info->vrsave_save_offset + sp_offset));
21021       mem = gen_frame_mem (SImode, addr);
21022       reg = gen_rtx_REG (SImode, 12);
21023       emit_move_insn (reg, mem);
21024
21025       emit_insn (generate_set_vrsave (reg, info, 1));
21026     }
21027
21028   /* Get the old lr if we saved it.  If we are restoring registers
21029      out-of-line, then the out-of-line routines can do this for us.  */
21030   if (restore_lr && restoring_GPRs_inline)
21031     {
21032       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
21033                                       info->lr_save_offset + sp_offset);
21034
21035       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
21036     }
21037
21038   /* Get the old cr if we saved it.  */
21039   if (info->cr_save_p)
21040     {
21041       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21042                                GEN_INT (info->cr_save_offset + sp_offset));
21043       rtx mem = gen_frame_mem (SImode, addr);
21044
21045       cr_save_reg = gen_rtx_REG (SImode,
21046                                  DEFAULT_ABI == ABI_AIX
21047                                  && !restoring_GPRs_inline
21048                                  && info->first_fp_reg_save < 64
21049                                  ? 11 : 12);
21050       emit_move_insn (cr_save_reg, mem);
21051     }
21052
21053   /* Set LR here to try to overlap restores below.  LR is always saved
21054      above incoming stack, so it never needs REG_CFA_RESTORE.  */
21055   if (restore_lr && restoring_GPRs_inline)
21056     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
21057                     gen_rtx_REG (Pmode, 0));
21058
21059   /* Load exception handler data registers, if needed.  */
21060   if (crtl->calls_eh_return)
21061     {
21062       unsigned int i, regno;
21063
21064       if (TARGET_AIX)
21065         {
21066           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21067                                    GEN_INT (sp_offset + 5 * reg_size));
21068           rtx mem = gen_frame_mem (reg_mode, addr);
21069
21070           emit_move_insn (gen_rtx_REG (reg_mode, 2), mem);
21071         }
21072
21073       for (i = 0; ; ++i)
21074         {
21075           rtx mem;
21076
21077           regno = EH_RETURN_DATA_REGNO (i);
21078           if (regno == INVALID_REGNUM)
21079             break;
21080
21081           mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
21082                                       info->ehrd_offset + sp_offset
21083                                       + reg_size * (int) i);
21084
21085           emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
21086         }
21087     }
21088
21089   /* Restore GPRs.  This is done as a PARALLEL if we are using
21090      the load-multiple instructions.  */
21091   if (TARGET_SPE_ABI
21092       && info->spe_64bit_regs_used != 0
21093       && info->first_gp_reg_save != 32)
21094     {
21095       /* Determine whether we can address all of the registers that need
21096          to be saved with an offset from the stack pointer that fits in
21097          the small const field for SPE memory instructions.  */
21098       int spe_regs_addressable_via_sp
21099         = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
21100                                + (32 - info->first_gp_reg_save - 1) * reg_size)
21101            && restoring_GPRs_inline);
21102       int spe_offset;
21103
21104       if (spe_regs_addressable_via_sp)
21105         spe_offset = info->spe_gp_save_offset + sp_offset;
21106       else
21107         {
21108           rtx old_frame_reg_rtx = frame_reg_rtx;
21109           /* Make r11 point to the start of the SPE save area.  We worried about
21110              not clobbering it when we were saving registers in the prologue.
21111              There's no need to worry here because the static chain is passed
21112              anew to every function.  */
21113           int ool_adjust = (restoring_GPRs_inline
21114                             ? 0
21115                             : (info->first_gp_reg_save
21116                                - (FIRST_SAVRES_REGISTER+1))*8);
21117
21118           if (frame_reg_rtx == sp_reg_rtx)
21119             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21120           emit_insn (gen_addsi3 (frame_reg_rtx, old_frame_reg_rtx,
21121                                  GEN_INT (info->spe_gp_save_offset
21122                                           + sp_offset
21123                                           - ool_adjust)));
21124           /* Keep the invariant that frame_reg_rtx + sp_offset points
21125              at the top of the stack frame.  */
21126           sp_offset = -info->spe_gp_save_offset;
21127
21128           spe_offset = 0;
21129         }
21130
21131       if (restoring_GPRs_inline)
21132         {
21133           for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21134             if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
21135               {
21136                 rtx offset, addr, mem, reg;
21137
21138                 /* We're doing all this to ensure that the immediate offset
21139                    fits into the immediate field of 'evldd'.  */
21140                 gcc_assert (SPE_CONST_OFFSET_OK (spe_offset + reg_size * i));
21141
21142                 offset = GEN_INT (spe_offset + reg_size * i);
21143                 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, offset);
21144                 mem = gen_rtx_MEM (V2SImode, addr);
21145                 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21146
21147                 insn = emit_move_insn (reg, mem);
21148                 if (DEFAULT_ABI == ABI_V4)
21149                   {
21150                     if (frame_pointer_needed
21151                         && info->first_gp_reg_save + i
21152                            == HARD_FRAME_POINTER_REGNUM)
21153                       {
21154                         add_reg_note (insn, REG_CFA_DEF_CFA,
21155                                       plus_constant (frame_reg_rtx,
21156                                                      sp_offset));
21157                         RTX_FRAME_RELATED_P (insn) = 1;
21158                       }
21159
21160                     cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21161                                                    cfa_restores);
21162                   }
21163               }
21164         }
21165       else
21166         {
21167           rtx par;
21168
21169           par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
21170                                         0, reg_mode,
21171                                         /*savep=*/false, /*gpr=*/true,
21172                                         /*lr=*/true);
21173           emit_jump_insn (par);
21174           /* We don't want anybody else emitting things after we jumped
21175              back.  */
21176           return;
21177         }
21178     }
21179   else if (!restoring_GPRs_inline)
21180     {
21181       /* We are jumping to an out-of-line function.  */
21182       bool can_use_exit = info->first_fp_reg_save == 64;
21183       rtx par;
21184
21185       /* Emit stack reset code if we need it.  */
21186       if (can_use_exit)
21187         rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
21188                                  sp_offset, can_use_exit);
21189       else
21190         {
21191           emit_insn (gen_add3_insn (gen_rtx_REG (Pmode, DEFAULT_ABI == ABI_AIX
21192                                                         ? 12 : 11),
21193                                     frame_reg_rtx,
21194                                     GEN_INT (sp_offset - info->fp_size)));
21195           if (REGNO (frame_reg_rtx) == 11)
21196             sp_offset += info->fp_size;
21197         }
21198
21199       par = rs6000_make_savres_rtx (info, frame_reg_rtx,
21200                                     info->gp_save_offset, reg_mode,
21201                                     /*savep=*/false, /*gpr=*/true,
21202                                     /*lr=*/can_use_exit);
21203
21204       if (can_use_exit)
21205         {
21206           if (info->cr_save_p)
21207             {
21208               rs6000_restore_saved_cr (cr_save_reg, using_mtcr_multiple);
21209               if (DEFAULT_ABI == ABI_V4)
21210                 cfa_restores
21211                   = alloc_reg_note (REG_CFA_RESTORE,
21212                                     gen_rtx_REG (SImode, CR2_REGNO),
21213                                     cfa_restores);
21214             }
21215
21216           emit_jump_insn (par);
21217
21218           /* We don't want anybody else emitting things after we jumped
21219              back.  */
21220           return;
21221         }
21222
21223       insn = emit_insn (par);
21224       if (DEFAULT_ABI == ABI_V4)
21225         {
21226           if (frame_pointer_needed)
21227             {
21228               add_reg_note (insn, REG_CFA_DEF_CFA,
21229                             plus_constant (frame_reg_rtx, sp_offset));
21230               RTX_FRAME_RELATED_P (insn) = 1;
21231             }
21232
21233           for (i = info->first_gp_reg_save; i < 32; i++)
21234             cfa_restores
21235               = alloc_reg_note (REG_CFA_RESTORE,
21236                                 gen_rtx_REG (reg_mode, i), cfa_restores);
21237         }
21238     }
21239   else if (using_load_multiple)
21240     {
21241       rtvec p;
21242       p = rtvec_alloc (32 - info->first_gp_reg_save);
21243       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21244         {
21245           rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21246                                    GEN_INT (info->gp_save_offset
21247                                             + sp_offset
21248                                             + reg_size * i));
21249           rtx mem = gen_frame_mem (reg_mode, addr);
21250           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21251
21252           RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, reg, mem);
21253           if (DEFAULT_ABI == ABI_V4)
21254             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21255                                            cfa_restores);
21256         }
21257       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
21258       if (DEFAULT_ABI == ABI_V4 && frame_pointer_needed)
21259         {
21260           add_reg_note (insn, REG_CFA_DEF_CFA,
21261                         plus_constant (frame_reg_rtx, sp_offset));
21262           RTX_FRAME_RELATED_P (insn) = 1;
21263         }
21264     }
21265   else
21266     {
21267       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21268         if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
21269           {
21270             rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21271                                      GEN_INT (info->gp_save_offset
21272                                               + sp_offset
21273                                               + reg_size * i));
21274             rtx mem = gen_frame_mem (reg_mode, addr);
21275             rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21276
21277             insn = emit_move_insn (reg, mem);
21278             if (DEFAULT_ABI == ABI_V4)
21279               {
21280                 if (frame_pointer_needed
21281                     && info->first_gp_reg_save + i
21282                        == HARD_FRAME_POINTER_REGNUM)
21283                   {
21284                     add_reg_note (insn, REG_CFA_DEF_CFA,
21285                                   plus_constant (frame_reg_rtx, sp_offset));
21286                     RTX_FRAME_RELATED_P (insn) = 1;
21287                   }
21288
21289                 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21290                                                cfa_restores);
21291               }
21292           }
21293     }
21294
21295   if (restore_lr && !restoring_GPRs_inline)
21296     {
21297       rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
21298                                      info->lr_save_offset + sp_offset);
21299
21300       emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
21301       emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
21302                       gen_rtx_REG (Pmode, 0));
21303     }
21304
21305   /* Restore fpr's if we need to do it without calling a function.  */
21306   if (restoring_FPRs_inline)
21307     for (i = 0; i < 64 - info->first_fp_reg_save; i++)
21308       if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
21309            && ! call_used_regs[info->first_fp_reg_save+i]))
21310         {
21311           rtx addr, mem, reg;
21312           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21313                                GEN_INT (info->fp_save_offset
21314                                         + sp_offset
21315                                         + 8 * i));
21316           mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21317                                  ? DFmode : SFmode), addr);
21318           reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21319                                ? DFmode : SFmode),
21320                              info->first_fp_reg_save + i);
21321
21322           emit_move_insn (reg, mem);
21323           if (DEFAULT_ABI == ABI_V4)
21324             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21325                                            cfa_restores);
21326         }
21327
21328   /* If we saved cr, restore it here.  Just those that were used.  */
21329   if (info->cr_save_p)
21330     {
21331       rs6000_restore_saved_cr (cr_save_reg, using_mtcr_multiple);
21332       if (DEFAULT_ABI == ABI_V4)
21333         cfa_restores
21334           = alloc_reg_note (REG_CFA_RESTORE, gen_rtx_REG (SImode, CR2_REGNO),
21335                             cfa_restores);
21336     }
21337
21338   /* If this is V.4, unwind the stack pointer after all of the loads
21339      have been done.  */
21340   insn = rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
21341                                   sp_offset, !restoring_FPRs_inline);
21342   if (insn)
21343     {
21344       if (cfa_restores)
21345         {
21346           REG_NOTES (insn) = cfa_restores;
21347           cfa_restores = NULL_RTX;
21348         }
21349       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
21350       RTX_FRAME_RELATED_P (insn) = 1;
21351     }
21352
21353   if (crtl->calls_eh_return)
21354     {
21355       rtx sa = EH_RETURN_STACKADJ_RTX;
21356       emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx, sa));
21357     }
21358
21359   if (!sibcall)
21360     {
21361       rtvec p;
21362       bool lr = (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0;
21363       if (! restoring_FPRs_inline)
21364         p = rtvec_alloc (4 + 64 - info->first_fp_reg_save);
21365       else
21366         p = rtvec_alloc (2);
21367
21368       RTVEC_ELT (p, 0) = ret_rtx;
21369       RTVEC_ELT (p, 1) = ((restoring_FPRs_inline || !lr)
21370                           ? gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 65))
21371                           : gen_rtx_CLOBBER (VOIDmode,
21372                                              gen_rtx_REG (Pmode, 65)));
21373
21374       /* If we have to restore more than two FP registers, branch to the
21375          restore function.  It will return to our caller.  */
21376       if (! restoring_FPRs_inline)
21377         {
21378           int i;
21379           rtx sym;
21380
21381           sym = rs6000_savres_routine_sym (info,
21382                                            /*savep=*/false,
21383                                            /*gpr=*/false,
21384                                            /*lr=*/lr);
21385           RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode, sym);
21386           RTVEC_ELT (p, 3) = gen_rtx_USE (VOIDmode,
21387                                           gen_rtx_REG (Pmode,
21388                                                        DEFAULT_ABI == ABI_AIX
21389                                                        ? 1 : 11));
21390           for (i = 0; i < 64 - info->first_fp_reg_save; i++)
21391             {
21392               rtx addr, mem;
21393               addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
21394                                    GEN_INT (info->fp_save_offset + 8*i));
21395               mem = gen_frame_mem (DFmode, addr);
21396
21397               RTVEC_ELT (p, i+4) =
21398                 gen_rtx_SET (VOIDmode,
21399                              gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
21400                              mem);
21401             }
21402         }
21403
21404       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
21405     }
21406 }
21407
21408 /* Write function epilogue.  */
21409
21410 static void
21411 rs6000_output_function_epilogue (FILE *file,
21412                                  HOST_WIDE_INT size ATTRIBUTE_UNUSED)
21413 {
21414 #if TARGET_MACHO
21415   macho_branch_islands ();
21416   /* Mach-O doesn't support labels at the end of objects, so if
21417      it looks like we might want one, insert a NOP.  */
21418   {
21419     rtx insn = get_last_insn ();
21420     while (insn
21421            && NOTE_P (insn)
21422            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
21423       insn = PREV_INSN (insn);
21424     if (insn
21425         && (LABEL_P (insn)
21426             || (NOTE_P (insn)
21427                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
21428       fputs ("\tnop\n", file);
21429   }
21430 #endif
21431
21432   /* Output a traceback table here.  See /usr/include/sys/debug.h for info
21433      on its format.
21434
21435      We don't output a traceback table if -finhibit-size-directive was
21436      used.  The documentation for -finhibit-size-directive reads
21437      ``don't output a @code{.size} assembler directive, or anything
21438      else that would cause trouble if the function is split in the
21439      middle, and the two halves are placed at locations far apart in
21440      memory.''  The traceback table has this property, since it
21441      includes the offset from the start of the function to the
21442      traceback table itself.
21443
21444      System V.4 Powerpc's (and the embedded ABI derived from it) use a
21445      different traceback table.  */
21446   if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
21447       && rs6000_traceback != traceback_none && !cfun->is_thunk)
21448     {
21449       const char *fname = NULL;
21450       const char *language_string = lang_hooks.name;
21451       int fixed_parms = 0, float_parms = 0, parm_info = 0;
21452       int i;
21453       int optional_tbtab;
21454       rs6000_stack_t *info = rs6000_stack_info ();
21455
21456       if (rs6000_traceback == traceback_full)
21457         optional_tbtab = 1;
21458       else if (rs6000_traceback == traceback_part)
21459         optional_tbtab = 0;
21460       else
21461         optional_tbtab = !optimize_size && !TARGET_ELF;
21462
21463       if (optional_tbtab)
21464         {
21465           fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
21466           while (*fname == '.') /* V.4 encodes . in the name */
21467             fname++;
21468
21469           /* Need label immediately before tbtab, so we can compute
21470              its offset from the function start.  */
21471           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
21472           ASM_OUTPUT_LABEL (file, fname);
21473         }
21474
21475       /* The .tbtab pseudo-op can only be used for the first eight
21476          expressions, since it can't handle the possibly variable
21477          length fields that follow.  However, if you omit the optional
21478          fields, the assembler outputs zeros for all optional fields
21479          anyways, giving each variable length field is minimum length
21480          (as defined in sys/debug.h).  Thus we can not use the .tbtab
21481          pseudo-op at all.  */
21482
21483       /* An all-zero word flags the start of the tbtab, for debuggers
21484          that have to find it by searching forward from the entry
21485          point or from the current pc.  */
21486       fputs ("\t.long 0\n", file);
21487
21488       /* Tbtab format type.  Use format type 0.  */
21489       fputs ("\t.byte 0,", file);
21490
21491       /* Language type.  Unfortunately, there does not seem to be any
21492          official way to discover the language being compiled, so we
21493          use language_string.
21494          C is 0.  Fortran is 1.  Pascal is 2.  Ada is 3.  C++ is 9.
21495          Java is 13.  Objective-C is 14.  Objective-C++ isn't assigned
21496          a number, so for now use 9.  LTO and Go aren't assigned numbers
21497          either, so for now use 0.  */
21498       if (! strcmp (language_string, "GNU C")
21499           || ! strcmp (language_string, "GNU GIMPLE")
21500           || ! strcmp (language_string, "GNU Go"))
21501         i = 0;
21502       else if (! strcmp (language_string, "GNU F77")
21503                || ! strcmp (language_string, "GNU Fortran"))
21504         i = 1;
21505       else if (! strcmp (language_string, "GNU Pascal"))
21506         i = 2;
21507       else if (! strcmp (language_string, "GNU Ada"))
21508         i = 3;
21509       else if (! strcmp (language_string, "GNU C++")
21510                || ! strcmp (language_string, "GNU Objective-C++"))
21511         i = 9;
21512       else if (! strcmp (language_string, "GNU Java"))
21513         i = 13;
21514       else if (! strcmp (language_string, "GNU Objective-C"))
21515         i = 14;
21516       else
21517         gcc_unreachable ();
21518       fprintf (file, "%d,", i);
21519
21520       /* 8 single bit fields: global linkage (not set for C extern linkage,
21521          apparently a PL/I convention?), out-of-line epilogue/prologue, offset
21522          from start of procedure stored in tbtab, internal function, function
21523          has controlled storage, function has no toc, function uses fp,
21524          function logs/aborts fp operations.  */
21525       /* Assume that fp operations are used if any fp reg must be saved.  */
21526       fprintf (file, "%d,",
21527                (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
21528
21529       /* 6 bitfields: function is interrupt handler, name present in
21530          proc table, function calls alloca, on condition directives
21531          (controls stack walks, 3 bits), saves condition reg, saves
21532          link reg.  */
21533       /* The `function calls alloca' bit seems to be set whenever reg 31 is
21534          set up as a frame pointer, even when there is no alloca call.  */
21535       fprintf (file, "%d,",
21536                ((optional_tbtab << 6)
21537                 | ((optional_tbtab & frame_pointer_needed) << 5)
21538                 | (info->cr_save_p << 1)
21539                 | (info->lr_save_p)));
21540
21541       /* 3 bitfields: saves backchain, fixup code, number of fpr saved
21542          (6 bits).  */
21543       fprintf (file, "%d,",
21544                (info->push_p << 7) | (64 - info->first_fp_reg_save));
21545
21546       /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits).  */
21547       fprintf (file, "%d,", (32 - first_reg_to_save ()));
21548
21549       if (optional_tbtab)
21550         {
21551           /* Compute the parameter info from the function decl argument
21552              list.  */
21553           tree decl;
21554           int next_parm_info_bit = 31;
21555
21556           for (decl = DECL_ARGUMENTS (current_function_decl);
21557                decl; decl = DECL_CHAIN (decl))
21558             {
21559               rtx parameter = DECL_INCOMING_RTL (decl);
21560               enum machine_mode mode = GET_MODE (parameter);
21561
21562               if (GET_CODE (parameter) == REG)
21563                 {
21564                   if (SCALAR_FLOAT_MODE_P (mode))
21565                     {
21566                       int bits;
21567
21568                       float_parms++;
21569
21570                       switch (mode)
21571                         {
21572                         case SFmode:
21573                         case SDmode:
21574                           bits = 0x2;
21575                           break;
21576
21577                         case DFmode:
21578                         case DDmode:
21579                         case TFmode:
21580                         case TDmode:
21581                           bits = 0x3;
21582                           break;
21583
21584                         default:
21585                           gcc_unreachable ();
21586                         }
21587
21588                       /* If only one bit will fit, don't or in this entry.  */
21589                       if (next_parm_info_bit > 0)
21590                         parm_info |= (bits << (next_parm_info_bit - 1));
21591                       next_parm_info_bit -= 2;
21592                     }
21593                   else
21594                     {
21595                       fixed_parms += ((GET_MODE_SIZE (mode)
21596                                        + (UNITS_PER_WORD - 1))
21597                                       / UNITS_PER_WORD);
21598                       next_parm_info_bit -= 1;
21599                     }
21600                 }
21601             }
21602         }
21603
21604       /* Number of fixed point parameters.  */
21605       /* This is actually the number of words of fixed point parameters; thus
21606          an 8 byte struct counts as 2; and thus the maximum value is 8.  */
21607       fprintf (file, "%d,", fixed_parms);
21608
21609       /* 2 bitfields: number of floating point parameters (7 bits), parameters
21610          all on stack.  */
21611       /* This is actually the number of fp registers that hold parameters;
21612          and thus the maximum value is 13.  */
21613       /* Set parameters on stack bit if parameters are not in their original
21614          registers, regardless of whether they are on the stack?  Xlc
21615          seems to set the bit when not optimizing.  */
21616       fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
21617
21618       if (! optional_tbtab)
21619         return;
21620
21621       /* Optional fields follow.  Some are variable length.  */
21622
21623       /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
21624          11 double float.  */
21625       /* There is an entry for each parameter in a register, in the order that
21626          they occur in the parameter list.  Any intervening arguments on the
21627          stack are ignored.  If the list overflows a long (max possible length
21628          34 bits) then completely leave off all elements that don't fit.  */
21629       /* Only emit this long if there was at least one parameter.  */
21630       if (fixed_parms || float_parms)
21631         fprintf (file, "\t.long %d\n", parm_info);
21632
21633       /* Offset from start of code to tb table.  */
21634       fputs ("\t.long ", file);
21635       ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
21636       RS6000_OUTPUT_BASENAME (file, fname);
21637       putc ('-', file);
21638       rs6000_output_function_entry (file, fname);
21639       putc ('\n', file);
21640
21641       /* Interrupt handler mask.  */
21642       /* Omit this long, since we never set the interrupt handler bit
21643          above.  */
21644
21645       /* Number of CTL (controlled storage) anchors.  */
21646       /* Omit this long, since the has_ctl bit is never set above.  */
21647
21648       /* Displacement into stack of each CTL anchor.  */
21649       /* Omit this list of longs, because there are no CTL anchors.  */
21650
21651       /* Length of function name.  */
21652       if (*fname == '*')
21653         ++fname;
21654       fprintf (file, "\t.short %d\n", (int) strlen (fname));
21655
21656       /* Function name.  */
21657       assemble_string (fname, strlen (fname));
21658
21659       /* Register for alloca automatic storage; this is always reg 31.
21660          Only emit this if the alloca bit was set above.  */
21661       if (frame_pointer_needed)
21662         fputs ("\t.byte 31\n", file);
21663
21664       fputs ("\t.align 2\n", file);
21665     }
21666 }
21667 \f
21668 /* A C compound statement that outputs the assembler code for a thunk
21669    function, used to implement C++ virtual function calls with
21670    multiple inheritance.  The thunk acts as a wrapper around a virtual
21671    function, adjusting the implicit object parameter before handing
21672    control off to the real function.
21673
21674    First, emit code to add the integer DELTA to the location that
21675    contains the incoming first argument.  Assume that this argument
21676    contains a pointer, and is the one used to pass the `this' pointer
21677    in C++.  This is the incoming argument *before* the function
21678    prologue, e.g. `%o0' on a sparc.  The addition must preserve the
21679    values of all other incoming arguments.
21680
21681    After the addition, emit code to jump to FUNCTION, which is a
21682    `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
21683    not touch the return address.  Hence returning from FUNCTION will
21684    return to whoever called the current `thunk'.
21685
21686    The effect must be as if FUNCTION had been called directly with the
21687    adjusted first argument.  This macro is responsible for emitting
21688    all of the code for a thunk function; output_function_prologue()
21689    and output_function_epilogue() are not invoked.
21690
21691    The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
21692    been extracted from it.)  It might possibly be useful on some
21693    targets, but probably not.
21694
21695    If you do not define this macro, the target-independent code in the
21696    C++ frontend will generate a less efficient heavyweight thunk that
21697    calls FUNCTION instead of jumping to it.  The generic approach does
21698    not support varargs.  */
21699
21700 static void
21701 rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
21702                         HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
21703                         tree function)
21704 {
21705   rtx this_rtx, insn, funexp;
21706
21707   reload_completed = 1;
21708   epilogue_completed = 1;
21709
21710   /* Mark the end of the (empty) prologue.  */
21711   emit_note (NOTE_INSN_PROLOGUE_END);
21712
21713   /* Find the "this" pointer.  If the function returns a structure,
21714      the structure return pointer is in r3.  */
21715   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
21716     this_rtx = gen_rtx_REG (Pmode, 4);
21717   else
21718     this_rtx = gen_rtx_REG (Pmode, 3);
21719
21720   /* Apply the constant offset, if required.  */
21721   if (delta)
21722     emit_insn (gen_add3_insn (this_rtx, this_rtx, GEN_INT (delta)));
21723
21724   /* Apply the offset from the vtable, if required.  */
21725   if (vcall_offset)
21726     {
21727       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
21728       rtx tmp = gen_rtx_REG (Pmode, 12);
21729
21730       emit_move_insn (tmp, gen_rtx_MEM (Pmode, this_rtx));
21731       if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
21732         {
21733           emit_insn (gen_add3_insn (tmp, tmp, vcall_offset_rtx));
21734           emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
21735         }
21736       else
21737         {
21738           rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
21739
21740           emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
21741         }
21742       emit_insn (gen_add3_insn (this_rtx, this_rtx, tmp));
21743     }
21744
21745   /* Generate a tail call to the target function.  */
21746   if (!TREE_USED (function))
21747     {
21748       assemble_external (function);
21749       TREE_USED (function) = 1;
21750     }
21751   funexp = XEXP (DECL_RTL (function), 0);
21752   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
21753
21754 #if TARGET_MACHO
21755   if (MACHOPIC_INDIRECT)
21756     funexp = machopic_indirect_call_target (funexp);
21757 #endif
21758
21759   /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
21760      generate sibcall RTL explicitly.  */
21761   insn = emit_call_insn (
21762            gen_rtx_PARALLEL (VOIDmode,
21763              gen_rtvec (4,
21764                         gen_rtx_CALL (VOIDmode,
21765                                       funexp, const0_rtx),
21766                         gen_rtx_USE (VOIDmode, const0_rtx),
21767                         gen_rtx_USE (VOIDmode,
21768                                      gen_rtx_REG (SImode,
21769                                                   LR_REGNO)),
21770                         ret_rtx)));
21771   SIBLING_CALL_P (insn) = 1;
21772   emit_barrier ();
21773
21774   /* Run just enough of rest_of_compilation to get the insns emitted.
21775      There's not really enough bulk here to make other passes such as
21776      instruction scheduling worth while.  Note that use_thunk calls
21777      assemble_start_function and assemble_end_function.  */
21778   insn = get_insns ();
21779   insn_locators_alloc ();
21780   shorten_branches (insn);
21781   final_start_function (insn, file, 1);
21782   final (insn, file, 1);
21783   final_end_function ();
21784
21785   reload_completed = 0;
21786   epilogue_completed = 0;
21787 }
21788 \f
21789 /* A quick summary of the various types of 'constant-pool tables'
21790    under PowerPC:
21791
21792    Target       Flags           Name            One table per
21793    AIX          (none)          AIX TOC         object file
21794    AIX          -mfull-toc      AIX TOC         object file
21795    AIX          -mminimal-toc   AIX minimal TOC translation unit
21796    SVR4/EABI    (none)          SVR4 SDATA      object file
21797    SVR4/EABI    -fpic           SVR4 pic        object file
21798    SVR4/EABI    -fPIC           SVR4 PIC        translation unit
21799    SVR4/EABI    -mrelocatable   EABI TOC        function
21800    SVR4/EABI    -maix           AIX TOC         object file
21801    SVR4/EABI    -maix -mminimal-toc
21802                                 AIX minimal TOC translation unit
21803
21804    Name                 Reg.    Set by  entries       contains:
21805                                         made by  addrs? fp?     sum?
21806
21807    AIX TOC              2       crt0    as       Y      option  option
21808    AIX minimal TOC      30      prolog  gcc      Y      Y       option
21809    SVR4 SDATA           13      crt0    gcc      N      Y       N
21810    SVR4 pic             30      prolog  ld       Y      not yet N
21811    SVR4 PIC             30      prolog  gcc      Y      option  option
21812    EABI TOC             30      prolog  gcc      Y      option  option
21813
21814 */
21815
21816 /* Hash functions for the hash table.  */
21817
21818 static unsigned
21819 rs6000_hash_constant (rtx k)
21820 {
21821   enum rtx_code code = GET_CODE (k);
21822   enum machine_mode mode = GET_MODE (k);
21823   unsigned result = (code << 3) ^ mode;
21824   const char *format;
21825   int flen, fidx;
21826
21827   format = GET_RTX_FORMAT (code);
21828   flen = strlen (format);
21829   fidx = 0;
21830
21831   switch (code)
21832     {
21833     case LABEL_REF:
21834       return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
21835
21836     case CONST_DOUBLE:
21837       if (mode != VOIDmode)
21838         return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
21839       flen = 2;
21840       break;
21841
21842     case CODE_LABEL:
21843       fidx = 3;
21844       break;
21845
21846     default:
21847       break;
21848     }
21849
21850   for (; fidx < flen; fidx++)
21851     switch (format[fidx])
21852       {
21853       case 's':
21854         {
21855           unsigned i, len;
21856           const char *str = XSTR (k, fidx);
21857           len = strlen (str);
21858           result = result * 613 + len;
21859           for (i = 0; i < len; i++)
21860             result = result * 613 + (unsigned) str[i];
21861           break;
21862         }
21863       case 'u':
21864       case 'e':
21865         result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
21866         break;
21867       case 'i':
21868       case 'n':
21869         result = result * 613 + (unsigned) XINT (k, fidx);
21870         break;
21871       case 'w':
21872         if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
21873           result = result * 613 + (unsigned) XWINT (k, fidx);
21874         else
21875           {
21876             size_t i;
21877             for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
21878               result = result * 613 + (unsigned) (XWINT (k, fidx)
21879                                                   >> CHAR_BIT * i);
21880           }
21881         break;
21882       case '0':
21883         break;
21884       default:
21885         gcc_unreachable ();
21886       }
21887
21888   return result;
21889 }
21890
21891 static unsigned
21892 toc_hash_function (const void *hash_entry)
21893 {
21894   const struct toc_hash_struct *thc =
21895     (const struct toc_hash_struct *) hash_entry;
21896   return rs6000_hash_constant (thc->key) ^ thc->key_mode;
21897 }
21898
21899 /* Compare H1 and H2 for equivalence.  */
21900
21901 static int
21902 toc_hash_eq (const void *h1, const void *h2)
21903 {
21904   rtx r1 = ((const struct toc_hash_struct *) h1)->key;
21905   rtx r2 = ((const struct toc_hash_struct *) h2)->key;
21906
21907   if (((const struct toc_hash_struct *) h1)->key_mode
21908       != ((const struct toc_hash_struct *) h2)->key_mode)
21909     return 0;
21910
21911   return rtx_equal_p (r1, r2);
21912 }
21913
21914 /* These are the names given by the C++ front-end to vtables, and
21915    vtable-like objects.  Ideally, this logic should not be here;
21916    instead, there should be some programmatic way of inquiring as
21917    to whether or not an object is a vtable.  */
21918
21919 #define VTABLE_NAME_P(NAME)                             \
21920   (strncmp ("_vt.", name, strlen ("_vt.")) == 0         \
21921   || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0       \
21922   || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0       \
21923   || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0       \
21924   || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
21925
21926 #ifdef NO_DOLLAR_IN_LABEL
21927 /* Return a GGC-allocated character string translating dollar signs in
21928    input NAME to underscores.  Used by XCOFF ASM_OUTPUT_LABELREF.  */
21929
21930 const char *
21931 rs6000_xcoff_strip_dollar (const char *name)
21932 {
21933   char *strip, *p;
21934   const char *q;
21935   size_t len;
21936
21937   q = (const char *) strchr (name, '$');
21938
21939   if (q == 0 || q == name)
21940     return name;
21941
21942   len = strlen (name);
21943   strip = XALLOCAVEC (char, len + 1);
21944   strcpy (strip, name);
21945   p = strip + (q - name);
21946   while (p)
21947     {
21948       *p = '_';
21949       p = strchr (p + 1, '$');
21950     }
21951
21952   return ggc_alloc_string (strip, len);
21953 }
21954 #endif
21955
21956 void
21957 rs6000_output_symbol_ref (FILE *file, rtx x)
21958 {
21959   /* Currently C++ toc references to vtables can be emitted before it
21960      is decided whether the vtable is public or private.  If this is
21961      the case, then the linker will eventually complain that there is
21962      a reference to an unknown section.  Thus, for vtables only,
21963      we emit the TOC reference to reference the symbol and not the
21964      section.  */
21965   const char *name = XSTR (x, 0);
21966
21967   if (VTABLE_NAME_P (name))
21968     {
21969       RS6000_OUTPUT_BASENAME (file, name);
21970     }
21971   else
21972     assemble_name (file, name);
21973 }
21974
21975 /* Output a TOC entry.  We derive the entry name from what is being
21976    written.  */
21977
21978 void
21979 output_toc (FILE *file, rtx x, int labelno, enum machine_mode mode)
21980 {
21981   char buf[256];
21982   const char *name = buf;
21983   rtx base = x;
21984   HOST_WIDE_INT offset = 0;
21985
21986   gcc_assert (!TARGET_NO_TOC);
21987
21988   /* When the linker won't eliminate them, don't output duplicate
21989      TOC entries (this happens on AIX if there is any kind of TOC,
21990      and on SVR4 under -fPIC or -mrelocatable).  Don't do this for
21991      CODE_LABELs.  */
21992   if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
21993     {
21994       struct toc_hash_struct *h;
21995       void * * found;
21996
21997       /* Create toc_hash_table.  This can't be done at TARGET_OPTION_OVERRIDE
21998          time because GGC is not initialized at that point.  */
21999       if (toc_hash_table == NULL)
22000         toc_hash_table = htab_create_ggc (1021, toc_hash_function,
22001                                           toc_hash_eq, NULL);
22002
22003       h = ggc_alloc_toc_hash_struct ();
22004       h->key = x;
22005       h->key_mode = mode;
22006       h->labelno = labelno;
22007
22008       found = htab_find_slot (toc_hash_table, h, INSERT);
22009       if (*found == NULL)
22010         *found = h;
22011       else  /* This is indeed a duplicate.
22012                Set this label equal to that label.  */
22013         {
22014           fputs ("\t.set ", file);
22015           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
22016           fprintf (file, "%d,", labelno);
22017           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
22018           fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
22019                                               found)->labelno));
22020           return;
22021         }
22022     }
22023
22024   /* If we're going to put a double constant in the TOC, make sure it's
22025      aligned properly when strict alignment is on.  */
22026   if (GET_CODE (x) == CONST_DOUBLE
22027       && STRICT_ALIGNMENT
22028       && GET_MODE_BITSIZE (mode) >= 64
22029       && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
22030     ASM_OUTPUT_ALIGN (file, 3);
22031   }
22032
22033   (*targetm.asm_out.internal_label) (file, "LC", labelno);
22034
22035   /* Handle FP constants specially.  Note that if we have a minimal
22036      TOC, things we put here aren't actually in the TOC, so we can allow
22037      FP constants.  */
22038   if (GET_CODE (x) == CONST_DOUBLE &&
22039       (GET_MODE (x) == TFmode || GET_MODE (x) == TDmode))
22040     {
22041       REAL_VALUE_TYPE rv;
22042       long k[4];
22043
22044       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22045       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22046         REAL_VALUE_TO_TARGET_DECIMAL128 (rv, k);
22047       else
22048         REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
22049
22050       if (TARGET_64BIT)
22051         {
22052           if (TARGET_MINIMAL_TOC)
22053             fputs (DOUBLE_INT_ASM_OP, file);
22054           else
22055             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
22056                      k[0] & 0xffffffff, k[1] & 0xffffffff,
22057                      k[2] & 0xffffffff, k[3] & 0xffffffff);
22058           fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
22059                    k[0] & 0xffffffff, k[1] & 0xffffffff,
22060                    k[2] & 0xffffffff, k[3] & 0xffffffff);
22061           return;
22062         }
22063       else
22064         {
22065           if (TARGET_MINIMAL_TOC)
22066             fputs ("\t.long ", file);
22067           else
22068             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
22069                      k[0] & 0xffffffff, k[1] & 0xffffffff,
22070                      k[2] & 0xffffffff, k[3] & 0xffffffff);
22071           fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
22072                    k[0] & 0xffffffff, k[1] & 0xffffffff,
22073                    k[2] & 0xffffffff, k[3] & 0xffffffff);
22074           return;
22075         }
22076     }
22077   else if (GET_CODE (x) == CONST_DOUBLE &&
22078            (GET_MODE (x) == DFmode || GET_MODE (x) == DDmode))
22079     {
22080       REAL_VALUE_TYPE rv;
22081       long k[2];
22082
22083       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22084
22085       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22086         REAL_VALUE_TO_TARGET_DECIMAL64 (rv, k);
22087       else
22088         REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
22089
22090       if (TARGET_64BIT)
22091         {
22092           if (TARGET_MINIMAL_TOC)
22093             fputs (DOUBLE_INT_ASM_OP, file);
22094           else
22095             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
22096                      k[0] & 0xffffffff, k[1] & 0xffffffff);
22097           fprintf (file, "0x%lx%08lx\n",
22098                    k[0] & 0xffffffff, k[1] & 0xffffffff);
22099           return;
22100         }
22101       else
22102         {
22103           if (TARGET_MINIMAL_TOC)
22104             fputs ("\t.long ", file);
22105           else
22106             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
22107                      k[0] & 0xffffffff, k[1] & 0xffffffff);
22108           fprintf (file, "0x%lx,0x%lx\n",
22109                    k[0] & 0xffffffff, k[1] & 0xffffffff);
22110           return;
22111         }
22112     }
22113   else if (GET_CODE (x) == CONST_DOUBLE &&
22114            (GET_MODE (x) == SFmode || GET_MODE (x) == SDmode))
22115     {
22116       REAL_VALUE_TYPE rv;
22117       long l;
22118
22119       REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22120       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22121         REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
22122       else
22123         REAL_VALUE_TO_TARGET_SINGLE (rv, l);
22124
22125       if (TARGET_64BIT)
22126         {
22127           if (TARGET_MINIMAL_TOC)
22128             fputs (DOUBLE_INT_ASM_OP, file);
22129           else
22130             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
22131           fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
22132           return;
22133         }
22134       else
22135         {
22136           if (TARGET_MINIMAL_TOC)
22137             fputs ("\t.long ", file);
22138           else
22139             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
22140           fprintf (file, "0x%lx\n", l & 0xffffffff);
22141           return;
22142         }
22143     }
22144   else if (GET_MODE (x) == VOIDmode
22145            && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
22146     {
22147       unsigned HOST_WIDE_INT low;
22148       HOST_WIDE_INT high;
22149
22150       if (GET_CODE (x) == CONST_DOUBLE)
22151         {
22152           low = CONST_DOUBLE_LOW (x);
22153           high = CONST_DOUBLE_HIGH (x);
22154         }
22155       else
22156 #if HOST_BITS_PER_WIDE_INT == 32
22157         {
22158           low = INTVAL (x);
22159           high = (low & 0x80000000) ? ~0 : 0;
22160         }
22161 #else
22162         {
22163           low = INTVAL (x) & 0xffffffff;
22164           high = (HOST_WIDE_INT) INTVAL (x) >> 32;
22165         }
22166 #endif
22167
22168       /* TOC entries are always Pmode-sized, but since this
22169          is a bigendian machine then if we're putting smaller
22170          integer constants in the TOC we have to pad them.
22171          (This is still a win over putting the constants in
22172          a separate constant pool, because then we'd have
22173          to have both a TOC entry _and_ the actual constant.)
22174
22175          For a 32-bit target, CONST_INT values are loaded and shifted
22176          entirely within `low' and can be stored in one TOC entry.  */
22177
22178       /* It would be easy to make this work, but it doesn't now.  */
22179       gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
22180
22181       if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
22182         {
22183 #if HOST_BITS_PER_WIDE_INT == 32
22184           lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
22185                          POINTER_SIZE, &low, &high, 0);
22186 #else
22187           low |= high << 32;
22188           low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
22189           high = (HOST_WIDE_INT) low >> 32;
22190           low &= 0xffffffff;
22191 #endif
22192         }
22193
22194       if (TARGET_64BIT)
22195         {
22196           if (TARGET_MINIMAL_TOC)
22197             fputs (DOUBLE_INT_ASM_OP, file);
22198           else
22199             fprintf (file, "\t.tc ID_%lx_%lx[TC],",
22200                      (long) high & 0xffffffff, (long) low & 0xffffffff);
22201           fprintf (file, "0x%lx%08lx\n",
22202                    (long) high & 0xffffffff, (long) low & 0xffffffff);
22203           return;
22204         }
22205       else
22206         {
22207           if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
22208             {
22209               if (TARGET_MINIMAL_TOC)
22210                 fputs ("\t.long ", file);
22211               else
22212                 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
22213                          (long) high & 0xffffffff, (long) low & 0xffffffff);
22214               fprintf (file, "0x%lx,0x%lx\n",
22215                        (long) high & 0xffffffff, (long) low & 0xffffffff);
22216             }
22217           else
22218             {
22219               if (TARGET_MINIMAL_TOC)
22220                 fputs ("\t.long ", file);
22221               else
22222                 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
22223               fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
22224             }
22225           return;
22226         }
22227     }
22228
22229   if (GET_CODE (x) == CONST)
22230     {
22231       gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS
22232                   && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT);
22233
22234       base = XEXP (XEXP (x, 0), 0);
22235       offset = INTVAL (XEXP (XEXP (x, 0), 1));
22236     }
22237
22238   switch (GET_CODE (base))
22239     {
22240     case SYMBOL_REF:
22241       name = XSTR (base, 0);
22242       break;
22243
22244     case LABEL_REF:
22245       ASM_GENERATE_INTERNAL_LABEL (buf, "L",
22246                                    CODE_LABEL_NUMBER (XEXP (base, 0)));
22247       break;
22248
22249     case CODE_LABEL:
22250       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
22251       break;
22252
22253     default:
22254       gcc_unreachable ();
22255     }
22256
22257   if (TARGET_MINIMAL_TOC)
22258     fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
22259   else
22260     {
22261       fputs ("\t.tc ", file);
22262       RS6000_OUTPUT_BASENAME (file, name);
22263
22264       if (offset < 0)
22265         fprintf (file, ".N" HOST_WIDE_INT_PRINT_UNSIGNED, - offset);
22266       else if (offset)
22267         fprintf (file, ".P" HOST_WIDE_INT_PRINT_UNSIGNED, offset);
22268
22269       fputs ("[TC],", file);
22270     }
22271
22272   /* Currently C++ toc references to vtables can be emitted before it
22273      is decided whether the vtable is public or private.  If this is
22274      the case, then the linker will eventually complain that there is
22275      a TOC reference to an unknown section.  Thus, for vtables only,
22276      we emit the TOC reference to reference the symbol and not the
22277      section.  */
22278   if (VTABLE_NAME_P (name))
22279     {
22280       RS6000_OUTPUT_BASENAME (file, name);
22281       if (offset < 0)
22282         fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset);
22283       else if (offset > 0)
22284         fprintf (file, "+" HOST_WIDE_INT_PRINT_DEC, offset);
22285     }
22286   else
22287     output_addr_const (file, x);
22288   putc ('\n', file);
22289 }
22290 \f
22291 /* Output an assembler pseudo-op to write an ASCII string of N characters
22292    starting at P to FILE.
22293
22294    On the RS/6000, we have to do this using the .byte operation and
22295    write out special characters outside the quoted string.
22296    Also, the assembler is broken; very long strings are truncated,
22297    so we must artificially break them up early.  */
22298
22299 void
22300 output_ascii (FILE *file, const char *p, int n)
22301 {
22302   char c;
22303   int i, count_string;
22304   const char *for_string = "\t.byte \"";
22305   const char *for_decimal = "\t.byte ";
22306   const char *to_close = NULL;
22307
22308   count_string = 0;
22309   for (i = 0; i < n; i++)
22310     {
22311       c = *p++;
22312       if (c >= ' ' && c < 0177)
22313         {
22314           if (for_string)
22315             fputs (for_string, file);
22316           putc (c, file);
22317
22318           /* Write two quotes to get one.  */
22319           if (c == '"')
22320             {
22321               putc (c, file);
22322               ++count_string;
22323             }
22324
22325           for_string = NULL;
22326           for_decimal = "\"\n\t.byte ";
22327           to_close = "\"\n";
22328           ++count_string;
22329
22330           if (count_string >= 512)
22331             {
22332               fputs (to_close, file);
22333
22334               for_string = "\t.byte \"";
22335               for_decimal = "\t.byte ";
22336               to_close = NULL;
22337               count_string = 0;
22338             }
22339         }
22340       else
22341         {
22342           if (for_decimal)
22343             fputs (for_decimal, file);
22344           fprintf (file, "%d", c);
22345
22346           for_string = "\n\t.byte \"";
22347           for_decimal = ", ";
22348           to_close = "\n";
22349           count_string = 0;
22350         }
22351     }
22352
22353   /* Now close the string if we have written one.  Then end the line.  */
22354   if (to_close)
22355     fputs (to_close, file);
22356 }
22357 \f
22358 /* Generate a unique section name for FILENAME for a section type
22359    represented by SECTION_DESC.  Output goes into BUF.
22360
22361    SECTION_DESC can be any string, as long as it is different for each
22362    possible section type.
22363
22364    We name the section in the same manner as xlc.  The name begins with an
22365    underscore followed by the filename (after stripping any leading directory
22366    names) with the last period replaced by the string SECTION_DESC.  If
22367    FILENAME does not contain a period, SECTION_DESC is appended to the end of
22368    the name.  */
22369
22370 void
22371 rs6000_gen_section_name (char **buf, const char *filename,
22372                          const char *section_desc)
22373 {
22374   const char *q, *after_last_slash, *last_period = 0;
22375   char *p;
22376   int len;
22377
22378   after_last_slash = filename;
22379   for (q = filename; *q; q++)
22380     {
22381       if (*q == '/')
22382         after_last_slash = q + 1;
22383       else if (*q == '.')
22384         last_period = q;
22385     }
22386
22387   len = strlen (after_last_slash) + strlen (section_desc) + 2;
22388   *buf = (char *) xmalloc (len);
22389
22390   p = *buf;
22391   *p++ = '_';
22392
22393   for (q = after_last_slash; *q; q++)
22394     {
22395       if (q == last_period)
22396         {
22397           strcpy (p, section_desc);
22398           p += strlen (section_desc);
22399           break;
22400         }
22401
22402       else if (ISALNUM (*q))
22403         *p++ = *q;
22404     }
22405
22406   if (last_period == 0)
22407     strcpy (p, section_desc);
22408   else
22409     *p = '\0';
22410 }
22411 \f
22412 /* Emit profile function.  */
22413
22414 void
22415 output_profile_hook (int labelno ATTRIBUTE_UNUSED)
22416 {
22417   /* Non-standard profiling for kernels, which just saves LR then calls
22418      _mcount without worrying about arg saves.  The idea is to change
22419      the function prologue as little as possible as it isn't easy to
22420      account for arg save/restore code added just for _mcount.  */
22421   if (TARGET_PROFILE_KERNEL)
22422     return;
22423
22424   if (DEFAULT_ABI == ABI_AIX)
22425     {
22426 #ifndef NO_PROFILE_COUNTERS
22427 # define NO_PROFILE_COUNTERS 0
22428 #endif
22429       if (NO_PROFILE_COUNTERS)
22430         emit_library_call (init_one_libfunc (RS6000_MCOUNT),
22431                            LCT_NORMAL, VOIDmode, 0);
22432       else
22433         {
22434           char buf[30];
22435           const char *label_name;
22436           rtx fun;
22437
22438           ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
22439           label_name = ggc_strdup ((*targetm.strip_name_encoding) (buf));
22440           fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
22441
22442           emit_library_call (init_one_libfunc (RS6000_MCOUNT),
22443                              LCT_NORMAL, VOIDmode, 1, fun, Pmode);
22444         }
22445     }
22446   else if (DEFAULT_ABI == ABI_DARWIN)
22447     {
22448       const char *mcount_name = RS6000_MCOUNT;
22449       int caller_addr_regno = LR_REGNO;
22450
22451       /* Be conservative and always set this, at least for now.  */
22452       crtl->uses_pic_offset_table = 1;
22453
22454 #if TARGET_MACHO
22455       /* For PIC code, set up a stub and collect the caller's address
22456          from r0, which is where the prologue puts it.  */
22457       if (MACHOPIC_INDIRECT
22458           && crtl->uses_pic_offset_table)
22459         caller_addr_regno = 0;
22460 #endif
22461       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
22462                          LCT_NORMAL, VOIDmode, 1,
22463                          gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
22464     }
22465 }
22466
22467 /* Write function profiler code.  */
22468
22469 void
22470 output_function_profiler (FILE *file, int labelno)
22471 {
22472   char buf[100];
22473
22474   switch (DEFAULT_ABI)
22475     {
22476     default:
22477       gcc_unreachable ();
22478
22479     case ABI_V4:
22480       if (!TARGET_32BIT)
22481         {
22482           warning (0, "no profiling of 64-bit code for this ABI");
22483           return;
22484         }
22485       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
22486       fprintf (file, "\tmflr %s\n", reg_names[0]);
22487       if (NO_PROFILE_COUNTERS)
22488         {
22489           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22490                        reg_names[0], reg_names[1]);
22491         }
22492       else if (TARGET_SECURE_PLT && flag_pic)
22493         {
22494           asm_fprintf (file, "\tbcl 20,31,1f\n1:\n\t{st|stw} %s,4(%s)\n",
22495                        reg_names[0], reg_names[1]);
22496           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
22497           asm_fprintf (file, "\t{cau|addis} %s,%s,",
22498                        reg_names[12], reg_names[12]);
22499           assemble_name (file, buf);
22500           asm_fprintf (file, "-1b@ha\n\t{cal|la} %s,", reg_names[0]);
22501           assemble_name (file, buf);
22502           asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
22503         }
22504       else if (flag_pic == 1)
22505         {
22506           fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
22507           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22508                        reg_names[0], reg_names[1]);
22509           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
22510           asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
22511           assemble_name (file, buf);
22512           asm_fprintf (file, "@got(%s)\n", reg_names[12]);
22513         }
22514       else if (flag_pic > 1)
22515         {
22516           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22517                        reg_names[0], reg_names[1]);
22518           /* Now, we need to get the address of the label.  */
22519           fputs ("\tbcl 20,31,1f\n\t.long ", file);
22520           assemble_name (file, buf);
22521           fputs ("-.\n1:", file);
22522           asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
22523           asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
22524                        reg_names[0], reg_names[11]);
22525           asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
22526                        reg_names[0], reg_names[0], reg_names[11]);
22527         }
22528       else
22529         {
22530           asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
22531           assemble_name (file, buf);
22532           fputs ("@ha\n", file);
22533           asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
22534                        reg_names[0], reg_names[1]);
22535           asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
22536           assemble_name (file, buf);
22537           asm_fprintf (file, "@l(%s)\n", reg_names[12]);
22538         }
22539
22540       /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH.  */
22541       fprintf (file, "\tbl %s%s\n",
22542                RS6000_MCOUNT, flag_pic ? "@plt" : "");
22543       break;
22544
22545     case ABI_AIX:
22546     case ABI_DARWIN:
22547       if (!TARGET_PROFILE_KERNEL)
22548         {
22549           /* Don't do anything, done in output_profile_hook ().  */
22550         }
22551       else
22552         {
22553           gcc_assert (!TARGET_32BIT);
22554
22555           asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
22556           asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
22557
22558           if (cfun->static_chain_decl != NULL)
22559             {
22560               asm_fprintf (file, "\tstd %s,24(%s)\n",
22561                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
22562               fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
22563               asm_fprintf (file, "\tld %s,24(%s)\n",
22564                            reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
22565             }
22566           else
22567             fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
22568         }
22569       break;
22570     }
22571 }
22572
22573 \f
22574
22575 /* The following variable value is the last issued insn.  */
22576
22577 static rtx last_scheduled_insn;
22578
22579 /* The following variable helps to balance issuing of load and
22580    store instructions */
22581
22582 static int load_store_pendulum;
22583
22584 /* Power4 load update and store update instructions are cracked into a
22585    load or store and an integer insn which are executed in the same cycle.
22586    Branches have their own dispatch slot which does not count against the
22587    GCC issue rate, but it changes the program flow so there are no other
22588    instructions to issue in this cycle.  */
22589
22590 static int
22591 rs6000_variable_issue_1 (rtx insn, int more)
22592 {
22593   last_scheduled_insn = insn;
22594   if (GET_CODE (PATTERN (insn)) == USE
22595       || GET_CODE (PATTERN (insn)) == CLOBBER)
22596     {
22597       cached_can_issue_more = more;
22598       return cached_can_issue_more;
22599     }
22600
22601   if (insn_terminates_group_p (insn, current_group))
22602     {
22603       cached_can_issue_more = 0;
22604       return cached_can_issue_more;
22605     }
22606
22607   /* If no reservation, but reach here */
22608   if (recog_memoized (insn) < 0)
22609     return more;
22610
22611   if (rs6000_sched_groups)
22612     {
22613       if (is_microcoded_insn (insn))
22614         cached_can_issue_more = 0;
22615       else if (is_cracked_insn (insn))
22616         cached_can_issue_more = more > 2 ? more - 2 : 0;
22617       else
22618         cached_can_issue_more = more - 1;
22619
22620       return cached_can_issue_more;
22621     }
22622
22623   if (rs6000_cpu_attr == CPU_CELL && is_nonpipeline_insn (insn))
22624     return 0;
22625
22626   cached_can_issue_more = more - 1;
22627   return cached_can_issue_more;
22628 }
22629
22630 static int
22631 rs6000_variable_issue (FILE *stream, int verbose, rtx insn, int more)
22632 {
22633   int r = rs6000_variable_issue_1 (insn, more);
22634   if (verbose)
22635     fprintf (stream, "// rs6000_variable_issue (more = %d) = %d\n", more, r);
22636   return r;
22637 }
22638
22639 /* Adjust the cost of a scheduling dependency.  Return the new cost of
22640    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
22641
22642 static int
22643 rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
22644 {
22645   enum attr_type attr_type;
22646
22647   if (! recog_memoized (insn))
22648     return 0;
22649
22650   switch (REG_NOTE_KIND (link))
22651     {
22652     case REG_DEP_TRUE:
22653       {
22654         /* Data dependency; DEP_INSN writes a register that INSN reads
22655            some cycles later.  */
22656
22657         /* Separate a load from a narrower, dependent store.  */
22658         if (rs6000_sched_groups
22659             && GET_CODE (PATTERN (insn)) == SET
22660             && GET_CODE (PATTERN (dep_insn)) == SET
22661             && GET_CODE (XEXP (PATTERN (insn), 1)) == MEM
22662             && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == MEM
22663             && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
22664                 > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
22665           return cost + 14;
22666
22667         attr_type = get_attr_type (insn);
22668
22669         switch (attr_type)
22670           {
22671           case TYPE_JMPREG:
22672             /* Tell the first scheduling pass about the latency between
22673                a mtctr and bctr (and mtlr and br/blr).  The first
22674                scheduling pass will not know about this latency since
22675                the mtctr instruction, which has the latency associated
22676                to it, will be generated by reload.  */
22677             return TARGET_POWER ? 5 : 4;
22678           case TYPE_BRANCH:
22679             /* Leave some extra cycles between a compare and its
22680                dependent branch, to inhibit expensive mispredicts.  */
22681             if ((rs6000_cpu_attr == CPU_PPC603
22682                  || rs6000_cpu_attr == CPU_PPC604
22683                  || rs6000_cpu_attr == CPU_PPC604E
22684                  || rs6000_cpu_attr == CPU_PPC620
22685                  || rs6000_cpu_attr == CPU_PPC630
22686                  || rs6000_cpu_attr == CPU_PPC750
22687                  || rs6000_cpu_attr == CPU_PPC7400
22688                  || rs6000_cpu_attr == CPU_PPC7450
22689                  || rs6000_cpu_attr == CPU_POWER4
22690                  || rs6000_cpu_attr == CPU_POWER5
22691                  || rs6000_cpu_attr == CPU_POWER7
22692                  || rs6000_cpu_attr == CPU_CELL)
22693                 && recog_memoized (dep_insn)
22694                 && (INSN_CODE (dep_insn) >= 0))
22695
22696               switch (get_attr_type (dep_insn))
22697                 {
22698                 case TYPE_CMP:
22699                 case TYPE_COMPARE:
22700                 case TYPE_DELAYED_COMPARE:
22701                 case TYPE_IMUL_COMPARE:
22702                 case TYPE_LMUL_COMPARE:
22703                 case TYPE_FPCOMPARE:
22704                 case TYPE_CR_LOGICAL:
22705                 case TYPE_DELAYED_CR:
22706                   return cost + 2;
22707                 default:
22708                   break;
22709                 }
22710             break;
22711
22712           case TYPE_STORE:
22713           case TYPE_STORE_U:
22714           case TYPE_STORE_UX:
22715           case TYPE_FPSTORE:
22716           case TYPE_FPSTORE_U:
22717           case TYPE_FPSTORE_UX:
22718             if ((rs6000_cpu == PROCESSOR_POWER6)
22719                 && recog_memoized (dep_insn)
22720                 && (INSN_CODE (dep_insn) >= 0))
22721               {
22722
22723                 if (GET_CODE (PATTERN (insn)) != SET)
22724                   /* If this happens, we have to extend this to schedule
22725                      optimally.  Return default for now.  */
22726                   return cost;
22727
22728                 /* Adjust the cost for the case where the value written
22729                    by a fixed point operation is used as the address
22730                    gen value on a store. */
22731                 switch (get_attr_type (dep_insn))
22732                   {
22733                   case TYPE_LOAD:
22734                   case TYPE_LOAD_U:
22735                   case TYPE_LOAD_UX:
22736                   case TYPE_CNTLZ:
22737                     {
22738                       if (! store_data_bypass_p (dep_insn, insn))
22739                         return 4;
22740                       break;
22741                     }
22742                   case TYPE_LOAD_EXT:
22743                   case TYPE_LOAD_EXT_U:
22744                   case TYPE_LOAD_EXT_UX:
22745                   case TYPE_VAR_SHIFT_ROTATE:
22746                   case TYPE_VAR_DELAYED_COMPARE:
22747                     {
22748                       if (! store_data_bypass_p (dep_insn, insn))
22749                         return 6;
22750                       break;
22751                     }
22752                   case TYPE_INTEGER:
22753                   case TYPE_COMPARE:
22754                   case TYPE_FAST_COMPARE:
22755                   case TYPE_EXTS:
22756                   case TYPE_SHIFT:
22757                   case TYPE_INSERT_WORD:
22758                   case TYPE_INSERT_DWORD:
22759                   case TYPE_FPLOAD_U:
22760                   case TYPE_FPLOAD_UX:
22761                   case TYPE_STORE_U:
22762                   case TYPE_STORE_UX:
22763                   case TYPE_FPSTORE_U:
22764                   case TYPE_FPSTORE_UX:
22765                     {
22766                       if (! store_data_bypass_p (dep_insn, insn))
22767                         return 3;
22768                       break;
22769                     }
22770                   case TYPE_IMUL:
22771                   case TYPE_IMUL2:
22772                   case TYPE_IMUL3:
22773                   case TYPE_LMUL:
22774                   case TYPE_IMUL_COMPARE:
22775                   case TYPE_LMUL_COMPARE:
22776                     {
22777                       if (! store_data_bypass_p (dep_insn, insn))
22778                         return 17;
22779                       break;
22780                     }
22781                   case TYPE_IDIV:
22782                     {
22783                       if (! store_data_bypass_p (dep_insn, insn))
22784                         return 45;
22785                       break;
22786                     }
22787                   case TYPE_LDIV:
22788                     {
22789                       if (! store_data_bypass_p (dep_insn, insn))
22790                         return 57;
22791                       break;
22792                     }
22793                   default:
22794                     break;
22795                   }
22796               }
22797             break;
22798
22799           case TYPE_LOAD:
22800           case TYPE_LOAD_U:
22801           case TYPE_LOAD_UX:
22802           case TYPE_LOAD_EXT:
22803           case TYPE_LOAD_EXT_U:
22804           case TYPE_LOAD_EXT_UX:
22805             if ((rs6000_cpu == PROCESSOR_POWER6)
22806                 && recog_memoized (dep_insn)
22807                 && (INSN_CODE (dep_insn) >= 0))
22808               {
22809
22810                 /* Adjust the cost for the case where the value written
22811                    by a fixed point instruction is used within the address
22812                    gen portion of a subsequent load(u)(x) */
22813                 switch (get_attr_type (dep_insn))
22814                   {
22815                   case TYPE_LOAD:
22816                   case TYPE_LOAD_U:
22817                   case TYPE_LOAD_UX:
22818                   case TYPE_CNTLZ:
22819                     {
22820                       if (set_to_load_agen (dep_insn, insn))
22821                         return 4;
22822                       break;
22823                     }
22824                   case TYPE_LOAD_EXT:
22825                   case TYPE_LOAD_EXT_U:
22826                   case TYPE_LOAD_EXT_UX:
22827                   case TYPE_VAR_SHIFT_ROTATE:
22828                   case TYPE_VAR_DELAYED_COMPARE:
22829                     {
22830                       if (set_to_load_agen (dep_insn, insn))
22831                         return 6;
22832                       break;
22833                     }
22834                   case TYPE_INTEGER:
22835                   case TYPE_COMPARE:
22836                   case TYPE_FAST_COMPARE:
22837                   case TYPE_EXTS:
22838                   case TYPE_SHIFT:
22839                   case TYPE_INSERT_WORD:
22840                   case TYPE_INSERT_DWORD:
22841                   case TYPE_FPLOAD_U:
22842                   case TYPE_FPLOAD_UX:
22843                   case TYPE_STORE_U:
22844                   case TYPE_STORE_UX:
22845                   case TYPE_FPSTORE_U:
22846                   case TYPE_FPSTORE_UX:
22847                     {
22848                       if (set_to_load_agen (dep_insn, insn))
22849                         return 3;
22850                       break;
22851                     }
22852                   case TYPE_IMUL:
22853                   case TYPE_IMUL2:
22854                   case TYPE_IMUL3:
22855                   case TYPE_LMUL:
22856                   case TYPE_IMUL_COMPARE:
22857                   case TYPE_LMUL_COMPARE:
22858                     {
22859                       if (set_to_load_agen (dep_insn, insn))
22860                         return 17;
22861                       break;
22862                     }
22863                   case TYPE_IDIV:
22864                     {
22865                       if (set_to_load_agen (dep_insn, insn))
22866                         return 45;
22867                       break;
22868                     }
22869                   case TYPE_LDIV:
22870                     {
22871                       if (set_to_load_agen (dep_insn, insn))
22872                         return 57;
22873                       break;
22874                     }
22875                   default:
22876                     break;
22877                   }
22878               }
22879             break;
22880
22881           case TYPE_FPLOAD:
22882             if ((rs6000_cpu == PROCESSOR_POWER6)
22883                 && recog_memoized (dep_insn)
22884                 && (INSN_CODE (dep_insn) >= 0)
22885                 && (get_attr_type (dep_insn) == TYPE_MFFGPR))
22886               return 2;
22887
22888           default:
22889             break;
22890           }
22891
22892         /* Fall out to return default cost.  */
22893       }
22894       break;
22895
22896     case REG_DEP_OUTPUT:
22897       /* Output dependency; DEP_INSN writes a register that INSN writes some
22898          cycles later.  */
22899       if ((rs6000_cpu == PROCESSOR_POWER6)
22900           && recog_memoized (dep_insn)
22901           && (INSN_CODE (dep_insn) >= 0))
22902         {
22903           attr_type = get_attr_type (insn);
22904
22905           switch (attr_type)
22906             {
22907             case TYPE_FP:
22908               if (get_attr_type (dep_insn) == TYPE_FP)
22909                 return 1;
22910               break;
22911             case TYPE_FPLOAD:
22912               if (get_attr_type (dep_insn) == TYPE_MFFGPR)
22913                 return 2;
22914               break;
22915             default:
22916               break;
22917             }
22918         }
22919     case REG_DEP_ANTI:
22920       /* Anti dependency; DEP_INSN reads a register that INSN writes some
22921          cycles later.  */
22922       return 0;
22923
22924     default:
22925       gcc_unreachable ();
22926     }
22927
22928   return cost;
22929 }
22930
22931 /* Debug version of rs6000_adjust_cost.  */
22932
22933 static int
22934 rs6000_debug_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
22935 {
22936   int ret = rs6000_adjust_cost (insn, link, dep_insn, cost);
22937
22938   if (ret != cost)
22939     {
22940       const char *dep;
22941
22942       switch (REG_NOTE_KIND (link))
22943         {
22944         default:             dep = "unknown depencency"; break;
22945         case REG_DEP_TRUE:   dep = "data dependency";    break;
22946         case REG_DEP_OUTPUT: dep = "output dependency";  break;
22947         case REG_DEP_ANTI:   dep = "anti depencency";    break;
22948         }
22949
22950       fprintf (stderr,
22951                "\nrs6000_adjust_cost, final cost = %d, orig cost = %d, "
22952                "%s, insn:\n", ret, cost, dep);
22953
22954       debug_rtx (insn);
22955     }
22956
22957   return ret;
22958 }
22959
22960 /* The function returns a true if INSN is microcoded.
22961    Return false otherwise.  */
22962
22963 static bool
22964 is_microcoded_insn (rtx insn)
22965 {
22966   if (!insn || !NONDEBUG_INSN_P (insn)
22967       || GET_CODE (PATTERN (insn)) == USE
22968       || GET_CODE (PATTERN (insn)) == CLOBBER)
22969     return false;
22970
22971   if (rs6000_cpu_attr == CPU_CELL)
22972     return get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS;
22973
22974   if (rs6000_sched_groups)
22975     {
22976       enum attr_type type = get_attr_type (insn);
22977       if (type == TYPE_LOAD_EXT_U
22978           || type == TYPE_LOAD_EXT_UX
22979           || type == TYPE_LOAD_UX
22980           || type == TYPE_STORE_UX
22981           || type == TYPE_MFCR)
22982         return true;
22983     }
22984
22985   return false;
22986 }
22987
22988 /* The function returns true if INSN is cracked into 2 instructions
22989    by the processor (and therefore occupies 2 issue slots).  */
22990
22991 static bool
22992 is_cracked_insn (rtx insn)
22993 {
22994   if (!insn || !NONDEBUG_INSN_P (insn)
22995       || GET_CODE (PATTERN (insn)) == USE
22996       || GET_CODE (PATTERN (insn)) == CLOBBER)
22997     return false;
22998
22999   if (rs6000_sched_groups)
23000     {
23001       enum attr_type type = get_attr_type (insn);
23002       if (type == TYPE_LOAD_U || type == TYPE_STORE_U
23003           || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
23004           || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
23005           || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
23006           || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
23007           || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
23008           || type == TYPE_IDIV || type == TYPE_LDIV
23009           || type == TYPE_INSERT_WORD)
23010         return true;
23011     }
23012
23013   return false;
23014 }
23015
23016 /* The function returns true if INSN can be issued only from
23017    the branch slot.  */
23018
23019 static bool
23020 is_branch_slot_insn (rtx insn)
23021 {
23022   if (!insn || !NONDEBUG_INSN_P (insn)
23023       || GET_CODE (PATTERN (insn)) == USE
23024       || GET_CODE (PATTERN (insn)) == CLOBBER)
23025     return false;
23026
23027   if (rs6000_sched_groups)
23028     {
23029       enum attr_type type = get_attr_type (insn);
23030       if (type == TYPE_BRANCH || type == TYPE_JMPREG)
23031         return true;
23032       return false;
23033     }
23034
23035   return false;
23036 }
23037
23038 /* The function returns true if out_inst sets a value that is
23039    used in the address generation computation of in_insn */
23040 static bool
23041 set_to_load_agen (rtx out_insn, rtx in_insn)
23042 {
23043   rtx out_set, in_set;
23044
23045   /* For performance reasons, only handle the simple case where
23046      both loads are a single_set. */
23047   out_set = single_set (out_insn);
23048   if (out_set)
23049     {
23050       in_set = single_set (in_insn);
23051       if (in_set)
23052         return reg_mentioned_p (SET_DEST (out_set), SET_SRC (in_set));
23053     }
23054
23055   return false;
23056 }
23057
23058 /* The function returns true if the target storage location of
23059    out_insn is adjacent to the target storage location of in_insn */
23060 /* Return 1 if memory locations are adjacent.  */
23061
23062 static bool
23063 adjacent_mem_locations (rtx insn1, rtx insn2)
23064 {
23065
23066   rtx a = get_store_dest (PATTERN (insn1));
23067   rtx b = get_store_dest (PATTERN (insn2));
23068
23069   if ((GET_CODE (XEXP (a, 0)) == REG
23070        || (GET_CODE (XEXP (a, 0)) == PLUS
23071            && GET_CODE (XEXP (XEXP (a, 0), 1)) == CONST_INT))
23072       && (GET_CODE (XEXP (b, 0)) == REG
23073           || (GET_CODE (XEXP (b, 0)) == PLUS
23074               && GET_CODE (XEXP (XEXP (b, 0), 1)) == CONST_INT)))
23075     {
23076       HOST_WIDE_INT val0 = 0, val1 = 0, val_diff;
23077       rtx reg0, reg1;
23078
23079       if (GET_CODE (XEXP (a, 0)) == PLUS)
23080         {
23081           reg0 = XEXP (XEXP (a, 0), 0);
23082           val0 = INTVAL (XEXP (XEXP (a, 0), 1));
23083         }
23084       else
23085         reg0 = XEXP (a, 0);
23086
23087       if (GET_CODE (XEXP (b, 0)) == PLUS)
23088         {
23089           reg1 = XEXP (XEXP (b, 0), 0);
23090           val1 = INTVAL (XEXP (XEXP (b, 0), 1));
23091         }
23092       else
23093         reg1 = XEXP (b, 0);
23094
23095       val_diff = val1 - val0;
23096
23097       return ((REGNO (reg0) == REGNO (reg1))
23098               && ((MEM_SIZE_KNOWN_P (a) && val_diff == MEM_SIZE (a))
23099                   || (MEM_SIZE_KNOWN_P (b) && val_diff == -MEM_SIZE (b))));
23100     }
23101
23102   return false;
23103 }
23104
23105 /* A C statement (sans semicolon) to update the integer scheduling
23106    priority INSN_PRIORITY (INSN). Increase the priority to execute the
23107    INSN earlier, reduce the priority to execute INSN later.  Do not
23108    define this macro if you do not need to adjust the scheduling
23109    priorities of insns.  */
23110
23111 static int
23112 rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
23113 {
23114   /* On machines (like the 750) which have asymmetric integer units,
23115      where one integer unit can do multiply and divides and the other
23116      can't, reduce the priority of multiply/divide so it is scheduled
23117      before other integer operations.  */
23118
23119 #if 0
23120   if (! INSN_P (insn))
23121     return priority;
23122
23123   if (GET_CODE (PATTERN (insn)) == USE)
23124     return priority;
23125
23126   switch (rs6000_cpu_attr) {
23127   case CPU_PPC750:
23128     switch (get_attr_type (insn))
23129       {
23130       default:
23131         break;
23132
23133       case TYPE_IMUL:
23134       case TYPE_IDIV:
23135         fprintf (stderr, "priority was %#x (%d) before adjustment\n",
23136                  priority, priority);
23137         if (priority >= 0 && priority < 0x01000000)
23138           priority >>= 3;
23139         break;
23140       }
23141   }
23142 #endif
23143
23144   if (insn_must_be_first_in_group (insn)
23145       && reload_completed
23146       && current_sched_info->sched_max_insns_priority
23147       && rs6000_sched_restricted_insns_priority)
23148     {
23149
23150       /* Prioritize insns that can be dispatched only in the first
23151          dispatch slot.  */
23152       if (rs6000_sched_restricted_insns_priority == 1)
23153         /* Attach highest priority to insn. This means that in
23154            haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
23155            precede 'priority' (critical path) considerations.  */
23156         return current_sched_info->sched_max_insns_priority;
23157       else if (rs6000_sched_restricted_insns_priority == 2)
23158         /* Increase priority of insn by a minimal amount. This means that in
23159            haifa-sched.c:ready_sort(), only 'priority' (critical path)
23160            considerations precede dispatch-slot restriction considerations.  */
23161         return (priority + 1);
23162     }
23163
23164   if (rs6000_cpu == PROCESSOR_POWER6
23165       && ((load_store_pendulum == -2 && is_load_insn (insn))
23166           || (load_store_pendulum == 2 && is_store_insn (insn))))
23167     /* Attach highest priority to insn if the scheduler has just issued two
23168        stores and this instruction is a load, or two loads and this instruction
23169        is a store. Power6 wants loads and stores scheduled alternately
23170        when possible */
23171     return current_sched_info->sched_max_insns_priority;
23172
23173   return priority;
23174 }
23175
23176 /* Return true if the instruction is nonpipelined on the Cell. */
23177 static bool
23178 is_nonpipeline_insn (rtx insn)
23179 {
23180   enum attr_type type;
23181   if (!insn || !NONDEBUG_INSN_P (insn)
23182       || GET_CODE (PATTERN (insn)) == USE
23183       || GET_CODE (PATTERN (insn)) == CLOBBER)
23184     return false;
23185
23186   type = get_attr_type (insn);
23187   if (type == TYPE_IMUL
23188       || type == TYPE_IMUL2
23189       || type == TYPE_IMUL3
23190       || type == TYPE_LMUL
23191       || type == TYPE_IDIV
23192       || type == TYPE_LDIV
23193       || type == TYPE_SDIV
23194       || type == TYPE_DDIV
23195       || type == TYPE_SSQRT
23196       || type == TYPE_DSQRT
23197       || type == TYPE_MFCR
23198       || type == TYPE_MFCRF
23199       || type == TYPE_MFJMPR)
23200     {
23201       return true;
23202     }
23203   return false;
23204 }
23205
23206
23207 /* Return how many instructions the machine can issue per cycle.  */
23208
23209 static int
23210 rs6000_issue_rate (void)
23211 {
23212   /* Unless scheduling for register pressure, use issue rate of 1 for
23213      first scheduling pass to decrease degradation.  */
23214   if (!reload_completed && !flag_sched_pressure)
23215     return 1;
23216
23217   switch (rs6000_cpu_attr) {
23218   case CPU_RIOS1:  /* ? */
23219   case CPU_RS64A:
23220   case CPU_PPC601: /* ? */
23221   case CPU_PPC7450:
23222     return 3;
23223   case CPU_PPC440:
23224   case CPU_PPC603:
23225   case CPU_PPC750:
23226   case CPU_PPC7400:
23227   case CPU_PPC8540:
23228   case CPU_CELL:
23229   case CPU_PPCE300C2:
23230   case CPU_PPCE300C3:
23231   case CPU_PPCE500MC:
23232   case CPU_PPCE500MC64:
23233   case CPU_TITAN:
23234     return 2;
23235   case CPU_RIOS2:
23236   case CPU_PPC476:
23237   case CPU_PPC604:
23238   case CPU_PPC604E:
23239   case CPU_PPC620:
23240   case CPU_PPC630:
23241     return 4;
23242   case CPU_POWER4:
23243   case CPU_POWER5:
23244   case CPU_POWER6:
23245   case CPU_POWER7:
23246     return 5;
23247   default:
23248     return 1;
23249   }
23250 }
23251
23252 /* Return how many instructions to look ahead for better insn
23253    scheduling.  */
23254
23255 static int
23256 rs6000_use_sched_lookahead (void)
23257 {
23258   if (rs6000_cpu_attr == CPU_PPC8540)
23259     return 4;
23260   if (rs6000_cpu_attr == CPU_CELL)
23261     return (reload_completed ? 8 : 0);
23262   return 0;
23263 }
23264
23265 /* We are choosing insn from the ready queue.  Return nonzero if INSN can be chosen.  */
23266 static int
23267 rs6000_use_sched_lookahead_guard (rtx insn)
23268 {
23269   if (rs6000_cpu_attr != CPU_CELL)
23270     return 1;
23271
23272    if (insn == NULL_RTX || !INSN_P (insn))
23273      abort ();
23274
23275   if (!reload_completed
23276       || is_nonpipeline_insn (insn)
23277       || is_microcoded_insn (insn))
23278     return 0;
23279
23280   return 1;
23281 }
23282
23283 /* Determine is PAT refers to memory.  */
23284
23285 static bool
23286 is_mem_ref (rtx pat)
23287 {
23288   const char * fmt;
23289   int i, j;
23290   bool ret = false;
23291
23292   /* stack_tie does not produce any real memory traffic.  */
23293   if (GET_CODE (pat) == UNSPEC
23294       && XINT (pat, 1) == UNSPEC_TIE)
23295     return false;
23296
23297   if (GET_CODE (pat) == MEM)
23298     return true;
23299
23300   /* Recursively process the pattern.  */
23301   fmt = GET_RTX_FORMAT (GET_CODE (pat));
23302
23303   for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0 && !ret; i--)
23304     {
23305       if (fmt[i] == 'e')
23306         ret |= is_mem_ref (XEXP (pat, i));
23307       else if (fmt[i] == 'E')
23308         for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
23309           ret |= is_mem_ref (XVECEXP (pat, i, j));
23310     }
23311
23312   return ret;
23313 }
23314
23315 /* Determine if PAT is a PATTERN of a load insn.  */
23316
23317 static bool
23318 is_load_insn1 (rtx pat)
23319 {
23320   if (!pat || pat == NULL_RTX)
23321     return false;
23322
23323   if (GET_CODE (pat) == SET)
23324     return is_mem_ref (SET_SRC (pat));
23325
23326   if (GET_CODE (pat) == PARALLEL)
23327     {
23328       int i;
23329
23330       for (i = 0; i < XVECLEN (pat, 0); i++)
23331         if (is_load_insn1 (XVECEXP (pat, 0, i)))
23332           return true;
23333     }
23334
23335   return false;
23336 }
23337
23338 /* Determine if INSN loads from memory.  */
23339
23340 static bool
23341 is_load_insn (rtx insn)
23342 {
23343   if (!insn || !INSN_P (insn))
23344     return false;
23345
23346   if (GET_CODE (insn) == CALL_INSN)
23347     return false;
23348
23349   return is_load_insn1 (PATTERN (insn));
23350 }
23351
23352 /* Determine if PAT is a PATTERN of a store insn.  */
23353
23354 static bool
23355 is_store_insn1 (rtx pat)
23356 {
23357   if (!pat || pat == NULL_RTX)
23358     return false;
23359
23360   if (GET_CODE (pat) == SET)
23361     return is_mem_ref (SET_DEST (pat));
23362
23363   if (GET_CODE (pat) == PARALLEL)
23364     {
23365       int i;
23366
23367       for (i = 0; i < XVECLEN (pat, 0); i++)
23368         if (is_store_insn1 (XVECEXP (pat, 0, i)))
23369           return true;
23370     }
23371
23372   return false;
23373 }
23374
23375 /* Determine if INSN stores to memory.  */
23376
23377 static bool
23378 is_store_insn (rtx insn)
23379 {
23380   if (!insn || !INSN_P (insn))
23381     return false;
23382
23383   return is_store_insn1 (PATTERN (insn));
23384 }
23385
23386 /* Return the dest of a store insn.  */
23387
23388 static rtx
23389 get_store_dest (rtx pat)
23390 {
23391   gcc_assert (is_store_insn1 (pat));
23392
23393   if (GET_CODE (pat) == SET)
23394     return SET_DEST (pat);
23395   else if (GET_CODE (pat) == PARALLEL)
23396     {
23397       int i;
23398
23399       for (i = 0; i < XVECLEN (pat, 0); i++)
23400         {
23401           rtx inner_pat = XVECEXP (pat, 0, i);
23402           if (GET_CODE (inner_pat) == SET
23403               && is_mem_ref (SET_DEST (inner_pat)))
23404             return inner_pat;
23405         }
23406     }
23407   /* We shouldn't get here, because we should have either a simple
23408      store insn or a store with update which are covered above.  */
23409   gcc_unreachable();
23410 }
23411
23412 /* Returns whether the dependence between INSN and NEXT is considered
23413    costly by the given target.  */
23414
23415 static bool
23416 rs6000_is_costly_dependence (dep_t dep, int cost, int distance)
23417 {
23418   rtx insn;
23419   rtx next;
23420
23421   /* If the flag is not enabled - no dependence is considered costly;
23422      allow all dependent insns in the same group.
23423      This is the most aggressive option.  */
23424   if (rs6000_sched_costly_dep == no_dep_costly)
23425     return false;
23426
23427   /* If the flag is set to 1 - a dependence is always considered costly;
23428      do not allow dependent instructions in the same group.
23429      This is the most conservative option.  */
23430   if (rs6000_sched_costly_dep == all_deps_costly)
23431     return true;
23432
23433   insn = DEP_PRO (dep);
23434   next = DEP_CON (dep);
23435
23436   if (rs6000_sched_costly_dep == store_to_load_dep_costly
23437       && is_load_insn (next)
23438       && is_store_insn (insn))
23439     /* Prevent load after store in the same group.  */
23440     return true;
23441
23442   if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
23443       && is_load_insn (next)
23444       && is_store_insn (insn)
23445       && DEP_TYPE (dep) == REG_DEP_TRUE)
23446      /* Prevent load after store in the same group if it is a true
23447         dependence.  */
23448      return true;
23449
23450   /* The flag is set to X; dependences with latency >= X are considered costly,
23451      and will not be scheduled in the same group.  */
23452   if (rs6000_sched_costly_dep <= max_dep_latency
23453       && ((cost - distance) >= (int)rs6000_sched_costly_dep))
23454     return true;
23455
23456   return false;
23457 }
23458
23459 /* Return the next insn after INSN that is found before TAIL is reached,
23460    skipping any "non-active" insns - insns that will not actually occupy
23461    an issue slot.  Return NULL_RTX if such an insn is not found.  */
23462
23463 static rtx
23464 get_next_active_insn (rtx insn, rtx tail)
23465 {
23466   if (insn == NULL_RTX || insn == tail)
23467     return NULL_RTX;
23468
23469   while (1)
23470     {
23471       insn = NEXT_INSN (insn);
23472       if (insn == NULL_RTX || insn == tail)
23473         return NULL_RTX;
23474
23475       if (CALL_P (insn)
23476           || JUMP_P (insn)
23477           || (NONJUMP_INSN_P (insn)
23478               && GET_CODE (PATTERN (insn)) != USE
23479               && GET_CODE (PATTERN (insn)) != CLOBBER
23480               && INSN_CODE (insn) != CODE_FOR_stack_tie))
23481         break;
23482     }
23483   return insn;
23484 }
23485
23486 /* We are about to begin issuing insns for this clock cycle. */
23487
23488 static int
23489 rs6000_sched_reorder (FILE *dump ATTRIBUTE_UNUSED, int sched_verbose,
23490                         rtx *ready ATTRIBUTE_UNUSED,
23491                         int *pn_ready ATTRIBUTE_UNUSED,
23492                         int clock_var ATTRIBUTE_UNUSED)
23493 {
23494   int n_ready = *pn_ready;
23495
23496   if (sched_verbose)
23497     fprintf (dump, "// rs6000_sched_reorder :\n");
23498
23499   /* Reorder the ready list, if the second to last ready insn
23500      is a nonepipeline insn.  */
23501   if (rs6000_cpu_attr == CPU_CELL && n_ready > 1)
23502   {
23503     if (is_nonpipeline_insn (ready[n_ready - 1])
23504         && (recog_memoized (ready[n_ready - 2]) > 0))
23505       /* Simply swap first two insns.  */
23506       {
23507         rtx tmp = ready[n_ready - 1];
23508         ready[n_ready - 1] = ready[n_ready - 2];
23509         ready[n_ready - 2] = tmp;
23510       }
23511   }
23512
23513   if (rs6000_cpu == PROCESSOR_POWER6)
23514     load_store_pendulum = 0;
23515
23516   return rs6000_issue_rate ();
23517 }
23518
23519 /* Like rs6000_sched_reorder, but called after issuing each insn.  */
23520
23521 static int
23522 rs6000_sched_reorder2 (FILE *dump, int sched_verbose, rtx *ready,
23523                          int *pn_ready, int clock_var ATTRIBUTE_UNUSED)
23524 {
23525   if (sched_verbose)
23526     fprintf (dump, "// rs6000_sched_reorder2 :\n");
23527
23528   /* For Power6, we need to handle some special cases to try and keep the
23529      store queue from overflowing and triggering expensive flushes.
23530
23531      This code monitors how load and store instructions are being issued
23532      and skews the ready list one way or the other to increase the likelihood
23533      that a desired instruction is issued at the proper time.
23534
23535      A couple of things are done.  First, we maintain a "load_store_pendulum"
23536      to track the current state of load/store issue.
23537
23538        - If the pendulum is at zero, then no loads or stores have been
23539          issued in the current cycle so we do nothing.
23540
23541        - If the pendulum is 1, then a single load has been issued in this
23542          cycle and we attempt to locate another load in the ready list to
23543          issue with it.
23544
23545        - If the pendulum is -2, then two stores have already been
23546          issued in this cycle, so we increase the priority of the first load
23547          in the ready list to increase it's likelihood of being chosen first
23548          in the next cycle.
23549
23550        - If the pendulum is -1, then a single store has been issued in this
23551          cycle and we attempt to locate another store in the ready list to
23552          issue with it, preferring a store to an adjacent memory location to
23553          facilitate store pairing in the store queue.
23554
23555        - If the pendulum is 2, then two loads have already been
23556          issued in this cycle, so we increase the priority of the first store
23557          in the ready list to increase it's likelihood of being chosen first
23558          in the next cycle.
23559
23560        - If the pendulum < -2 or > 2, then do nothing.
23561
23562        Note: This code covers the most common scenarios.  There exist non
23563              load/store instructions which make use of the LSU and which
23564              would need to be accounted for to strictly model the behavior
23565              of the machine.  Those instructions are currently unaccounted
23566              for to help minimize compile time overhead of this code.
23567    */
23568   if (rs6000_cpu == PROCESSOR_POWER6 && last_scheduled_insn)
23569     {
23570       int pos;
23571       int i;
23572       rtx tmp;
23573
23574       if (is_store_insn (last_scheduled_insn))
23575         /* Issuing a store, swing the load_store_pendulum to the left */
23576         load_store_pendulum--;
23577       else if (is_load_insn (last_scheduled_insn))
23578         /* Issuing a load, swing the load_store_pendulum to the right */
23579         load_store_pendulum++;
23580       else
23581         return cached_can_issue_more;
23582
23583       /* If the pendulum is balanced, or there is only one instruction on
23584          the ready list, then all is well, so return. */
23585       if ((load_store_pendulum == 0) || (*pn_ready <= 1))
23586         return cached_can_issue_more;
23587
23588       if (load_store_pendulum == 1)
23589         {
23590           /* A load has been issued in this cycle.  Scan the ready list
23591              for another load to issue with it */
23592           pos = *pn_ready-1;
23593
23594           while (pos >= 0)
23595             {
23596               if (is_load_insn (ready[pos]))
23597                 {
23598                   /* Found a load.  Move it to the head of the ready list,
23599                      and adjust it's priority so that it is more likely to
23600                      stay there */
23601                   tmp = ready[pos];
23602                   for (i=pos; i<*pn_ready-1; i++)
23603                     ready[i] = ready[i + 1];
23604                   ready[*pn_ready-1] = tmp;
23605
23606                   if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
23607                     INSN_PRIORITY (tmp)++;
23608                   break;
23609                 }
23610               pos--;
23611             }
23612         }
23613       else if (load_store_pendulum == -2)
23614         {
23615           /* Two stores have been issued in this cycle.  Increase the
23616              priority of the first load in the ready list to favor it for
23617              issuing in the next cycle. */
23618           pos = *pn_ready-1;
23619
23620           while (pos >= 0)
23621             {
23622               if (is_load_insn (ready[pos])
23623                   && !sel_sched_p ()
23624                   && INSN_PRIORITY_KNOWN (ready[pos]))
23625                 {
23626                   INSN_PRIORITY (ready[pos])++;
23627
23628                   /* Adjust the pendulum to account for the fact that a load
23629                      was found and increased in priority.  This is to prevent
23630                      increasing the priority of multiple loads */
23631                   load_store_pendulum--;
23632
23633                   break;
23634                 }
23635               pos--;
23636             }
23637         }
23638       else if (load_store_pendulum == -1)
23639         {
23640           /* A store has been issued in this cycle.  Scan the ready list for
23641              another store to issue with it, preferring a store to an adjacent
23642              memory location */
23643           int first_store_pos = -1;
23644
23645           pos = *pn_ready-1;
23646
23647           while (pos >= 0)
23648             {
23649               if (is_store_insn (ready[pos]))
23650                 {
23651                   /* Maintain the index of the first store found on the
23652                      list */
23653                   if (first_store_pos == -1)
23654                     first_store_pos = pos;
23655
23656                   if (is_store_insn (last_scheduled_insn)
23657                       && adjacent_mem_locations (last_scheduled_insn,ready[pos]))
23658                     {
23659                       /* Found an adjacent store.  Move it to the head of the
23660                          ready list, and adjust it's priority so that it is
23661                          more likely to stay there */
23662                       tmp = ready[pos];
23663                       for (i=pos; i<*pn_ready-1; i++)
23664                         ready[i] = ready[i + 1];
23665                       ready[*pn_ready-1] = tmp;
23666
23667                       if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
23668                         INSN_PRIORITY (tmp)++;
23669
23670                       first_store_pos = -1;
23671
23672                       break;
23673                     };
23674                 }
23675               pos--;
23676             }
23677
23678           if (first_store_pos >= 0)
23679             {
23680               /* An adjacent store wasn't found, but a non-adjacent store was,
23681                  so move the non-adjacent store to the front of the ready
23682                  list, and adjust its priority so that it is more likely to
23683                  stay there. */
23684               tmp = ready[first_store_pos];
23685               for (i=first_store_pos; i<*pn_ready-1; i++)
23686                 ready[i] = ready[i + 1];
23687               ready[*pn_ready-1] = tmp;
23688               if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
23689                 INSN_PRIORITY (tmp)++;
23690             }
23691         }
23692       else if (load_store_pendulum == 2)
23693        {
23694            /* Two loads have been issued in this cycle.  Increase the priority
23695               of the first store in the ready list to favor it for issuing in
23696               the next cycle. */
23697           pos = *pn_ready-1;
23698
23699           while (pos >= 0)
23700             {
23701               if (is_store_insn (ready[pos])
23702                   && !sel_sched_p ()
23703                   && INSN_PRIORITY_KNOWN (ready[pos]))
23704                 {
23705                   INSN_PRIORITY (ready[pos])++;
23706
23707                   /* Adjust the pendulum to account for the fact that a store
23708                      was found and increased in priority.  This is to prevent
23709                      increasing the priority of multiple stores */
23710                   load_store_pendulum++;
23711
23712                   break;
23713                 }
23714               pos--;
23715             }
23716         }
23717     }
23718
23719   return cached_can_issue_more;
23720 }
23721
23722 /* Return whether the presence of INSN causes a dispatch group termination
23723    of group WHICH_GROUP.
23724
23725    If WHICH_GROUP == current_group, this function will return true if INSN
23726    causes the termination of the current group (i.e, the dispatch group to
23727    which INSN belongs). This means that INSN will be the last insn in the
23728    group it belongs to.
23729
23730    If WHICH_GROUP == previous_group, this function will return true if INSN
23731    causes the termination of the previous group (i.e, the dispatch group that
23732    precedes the group to which INSN belongs).  This means that INSN will be
23733    the first insn in the group it belongs to).  */
23734
23735 static bool
23736 insn_terminates_group_p (rtx insn, enum group_termination which_group)
23737 {
23738   bool first, last;
23739
23740   if (! insn)
23741     return false;
23742
23743   first = insn_must_be_first_in_group (insn);
23744   last = insn_must_be_last_in_group (insn);
23745
23746   if (first && last)
23747     return true;
23748
23749   if (which_group == current_group)
23750     return last;
23751   else if (which_group == previous_group)
23752     return first;
23753
23754   return false;
23755 }
23756
23757
23758 static bool
23759 insn_must_be_first_in_group (rtx insn)
23760 {
23761   enum attr_type type;
23762
23763   if (!insn
23764       || GET_CODE (insn) == NOTE
23765       || DEBUG_INSN_P (insn)
23766       || GET_CODE (PATTERN (insn)) == USE
23767       || GET_CODE (PATTERN (insn)) == CLOBBER)
23768     return false;
23769
23770   switch (rs6000_cpu)
23771     {
23772     case PROCESSOR_POWER5:
23773       if (is_cracked_insn (insn))
23774         return true;
23775     case PROCESSOR_POWER4:
23776       if (is_microcoded_insn (insn))
23777         return true;
23778
23779       if (!rs6000_sched_groups)
23780         return false;
23781
23782       type = get_attr_type (insn);
23783
23784       switch (type)
23785         {
23786         case TYPE_MFCR:
23787         case TYPE_MFCRF:
23788         case TYPE_MTCR:
23789         case TYPE_DELAYED_CR:
23790         case TYPE_CR_LOGICAL:
23791         case TYPE_MTJMPR:
23792         case TYPE_MFJMPR:
23793         case TYPE_IDIV:
23794         case TYPE_LDIV:
23795         case TYPE_LOAD_L:
23796         case TYPE_STORE_C:
23797         case TYPE_ISYNC:
23798         case TYPE_SYNC:
23799           return true;
23800         default:
23801           break;
23802         }
23803       break;
23804     case PROCESSOR_POWER6:
23805       type = get_attr_type (insn);
23806
23807       switch (type)
23808         {
23809         case TYPE_INSERT_DWORD:
23810         case TYPE_EXTS:
23811         case TYPE_CNTLZ:
23812         case TYPE_SHIFT:
23813         case TYPE_VAR_SHIFT_ROTATE:
23814         case TYPE_TRAP:
23815         case TYPE_IMUL:
23816         case TYPE_IMUL2:
23817         case TYPE_IMUL3:
23818         case TYPE_LMUL:
23819         case TYPE_IDIV:
23820         case TYPE_INSERT_WORD:
23821         case TYPE_DELAYED_COMPARE:
23822         case TYPE_IMUL_COMPARE:
23823         case TYPE_LMUL_COMPARE:
23824         case TYPE_FPCOMPARE:
23825         case TYPE_MFCR:
23826         case TYPE_MTCR:
23827         case TYPE_MFJMPR:
23828         case TYPE_MTJMPR:
23829         case TYPE_ISYNC:
23830         case TYPE_SYNC:
23831         case TYPE_LOAD_L:
23832         case TYPE_STORE_C:
23833         case TYPE_LOAD_U:
23834         case TYPE_LOAD_UX:
23835         case TYPE_LOAD_EXT_UX:
23836         case TYPE_STORE_U:
23837         case TYPE_STORE_UX:
23838         case TYPE_FPLOAD_U:
23839         case TYPE_FPLOAD_UX:
23840         case TYPE_FPSTORE_U:
23841         case TYPE_FPSTORE_UX:
23842           return true;
23843         default:
23844           break;
23845         }
23846       break;
23847     case PROCESSOR_POWER7:
23848       type = get_attr_type (insn);
23849
23850       switch (type)
23851         {
23852         case TYPE_CR_LOGICAL:
23853         case TYPE_MFCR:
23854         case TYPE_MFCRF:
23855         case TYPE_MTCR:
23856         case TYPE_IDIV:
23857         case TYPE_LDIV:
23858         case TYPE_COMPARE:
23859         case TYPE_DELAYED_COMPARE:
23860         case TYPE_VAR_DELAYED_COMPARE:
23861         case TYPE_ISYNC:
23862         case TYPE_LOAD_L:
23863         case TYPE_STORE_C:
23864         case TYPE_LOAD_U:
23865         case TYPE_LOAD_UX:
23866         case TYPE_LOAD_EXT:
23867         case TYPE_LOAD_EXT_U:
23868         case TYPE_LOAD_EXT_UX:
23869         case TYPE_STORE_U:
23870         case TYPE_STORE_UX:
23871         case TYPE_FPLOAD_U:
23872         case TYPE_FPLOAD_UX:
23873         case TYPE_FPSTORE_U:
23874         case TYPE_FPSTORE_UX:
23875         case TYPE_MFJMPR:
23876         case TYPE_MTJMPR:
23877           return true;
23878         default:
23879           break;
23880         }
23881       break;
23882     default:
23883       break;
23884     }
23885
23886   return false;
23887 }
23888
23889 static bool
23890 insn_must_be_last_in_group (rtx insn)
23891 {
23892   enum attr_type type;
23893
23894   if (!insn
23895       || GET_CODE (insn) == NOTE
23896       || DEBUG_INSN_P (insn)
23897       || GET_CODE (PATTERN (insn)) == USE
23898       || GET_CODE (PATTERN (insn)) == CLOBBER)
23899     return false;
23900
23901   switch (rs6000_cpu) {
23902   case PROCESSOR_POWER4:
23903   case PROCESSOR_POWER5:
23904     if (is_microcoded_insn (insn))
23905       return true;
23906
23907     if (is_branch_slot_insn (insn))
23908       return true;
23909
23910     break;
23911   case PROCESSOR_POWER6:
23912     type = get_attr_type (insn);
23913
23914     switch (type)
23915       {
23916       case TYPE_EXTS:
23917       case TYPE_CNTLZ:
23918       case TYPE_SHIFT:
23919       case TYPE_VAR_SHIFT_ROTATE:
23920       case TYPE_TRAP:
23921       case TYPE_IMUL:
23922       case TYPE_IMUL2:
23923       case TYPE_IMUL3:
23924       case TYPE_LMUL:
23925       case TYPE_IDIV:
23926       case TYPE_DELAYED_COMPARE:
23927       case TYPE_IMUL_COMPARE:
23928       case TYPE_LMUL_COMPARE:
23929       case TYPE_FPCOMPARE:
23930       case TYPE_MFCR:
23931       case TYPE_MTCR:
23932       case TYPE_MFJMPR:
23933       case TYPE_MTJMPR:
23934       case TYPE_ISYNC:
23935       case TYPE_SYNC:
23936       case TYPE_LOAD_L:
23937       case TYPE_STORE_C:
23938         return true;
23939       default:
23940         break;
23941     }
23942     break;
23943   case PROCESSOR_POWER7:
23944     type = get_attr_type (insn);
23945
23946     switch (type)
23947       {
23948       case TYPE_ISYNC:
23949       case TYPE_SYNC:
23950       case TYPE_LOAD_L:
23951       case TYPE_STORE_C:
23952       case TYPE_LOAD_EXT_U:
23953       case TYPE_LOAD_EXT_UX:
23954       case TYPE_STORE_UX:
23955         return true;
23956       default:
23957         break;
23958     }
23959     break;
23960   default:
23961     break;
23962   }
23963
23964   return false;
23965 }
23966
23967 /* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
23968    dispatch group) from the insns in GROUP_INSNS.  Return false otherwise.  */
23969
23970 static bool
23971 is_costly_group (rtx *group_insns, rtx next_insn)
23972 {
23973   int i;
23974   int issue_rate = rs6000_issue_rate ();
23975
23976   for (i = 0; i < issue_rate; i++)
23977     {
23978       sd_iterator_def sd_it;
23979       dep_t dep;
23980       rtx insn = group_insns[i];
23981
23982       if (!insn)
23983         continue;
23984
23985       FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
23986         {
23987           rtx next = DEP_CON (dep);
23988
23989           if (next == next_insn
23990               && rs6000_is_costly_dependence (dep, dep_cost (dep), 0))
23991             return true;
23992         }
23993     }
23994
23995   return false;
23996 }
23997
23998 /* Utility of the function redefine_groups.
23999    Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
24000    in the same dispatch group.  If so, insert nops before NEXT_INSN, in order
24001    to keep it "far" (in a separate group) from GROUP_INSNS, following
24002    one of the following schemes, depending on the value of the flag
24003    -minsert_sched_nops = X:
24004    (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
24005        in order to force NEXT_INSN into a separate group.
24006    (2) X < sched_finish_regroup_exact: insert exactly X nops.
24007    GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
24008    insertion (has a group just ended, how many vacant issue slots remain in the
24009    last group, and how many dispatch groups were encountered so far).  */
24010
24011 static int
24012 force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
24013                  rtx next_insn, bool *group_end, int can_issue_more,
24014                  int *group_count)
24015 {
24016   rtx nop;
24017   bool force;
24018   int issue_rate = rs6000_issue_rate ();
24019   bool end = *group_end;
24020   int i;
24021
24022   if (next_insn == NULL_RTX || DEBUG_INSN_P (next_insn))
24023     return can_issue_more;
24024
24025   if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
24026     return can_issue_more;
24027
24028   force = is_costly_group (group_insns, next_insn);
24029   if (!force)
24030     return can_issue_more;
24031
24032   if (sched_verbose > 6)
24033     fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
24034              *group_count ,can_issue_more);
24035
24036   if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
24037     {
24038       if (*group_end)
24039         can_issue_more = 0;
24040
24041       /* Since only a branch can be issued in the last issue_slot, it is
24042          sufficient to insert 'can_issue_more - 1' nops if next_insn is not
24043          a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
24044          in this case the last nop will start a new group and the branch
24045          will be forced to the new group.  */
24046       if (can_issue_more && !is_branch_slot_insn (next_insn))
24047         can_issue_more--;
24048
24049       while (can_issue_more > 0)
24050         {
24051           nop = gen_nop ();
24052           emit_insn_before (nop, next_insn);
24053           can_issue_more--;
24054         }
24055
24056       *group_end = true;
24057       return 0;
24058     }
24059
24060   if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
24061     {
24062       int n_nops = rs6000_sched_insert_nops;
24063
24064       /* Nops can't be issued from the branch slot, so the effective
24065          issue_rate for nops is 'issue_rate - 1'.  */
24066       if (can_issue_more == 0)
24067         can_issue_more = issue_rate;
24068       can_issue_more--;
24069       if (can_issue_more == 0)
24070         {
24071           can_issue_more = issue_rate - 1;
24072           (*group_count)++;
24073           end = true;
24074           for (i = 0; i < issue_rate; i++)
24075             {
24076               group_insns[i] = 0;
24077             }
24078         }
24079
24080       while (n_nops > 0)
24081         {
24082           nop = gen_nop ();
24083           emit_insn_before (nop, next_insn);
24084           if (can_issue_more == issue_rate - 1) /* new group begins */
24085             end = false;
24086           can_issue_more--;
24087           if (can_issue_more == 0)
24088             {
24089               can_issue_more = issue_rate - 1;
24090               (*group_count)++;
24091               end = true;
24092               for (i = 0; i < issue_rate; i++)
24093                 {
24094                   group_insns[i] = 0;
24095                 }
24096             }
24097           n_nops--;
24098         }
24099
24100       /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1').  */
24101       can_issue_more++;
24102
24103       /* Is next_insn going to start a new group?  */
24104       *group_end
24105         = (end
24106            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
24107            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
24108            || (can_issue_more < issue_rate &&
24109                insn_terminates_group_p (next_insn, previous_group)));
24110       if (*group_end && end)
24111         (*group_count)--;
24112
24113       if (sched_verbose > 6)
24114         fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
24115                  *group_count, can_issue_more);
24116       return can_issue_more;
24117     }
24118
24119   return can_issue_more;
24120 }
24121
24122 /* This function tries to synch the dispatch groups that the compiler "sees"
24123    with the dispatch groups that the processor dispatcher is expected to
24124    form in practice.  It tries to achieve this synchronization by forcing the
24125    estimated processor grouping on the compiler (as opposed to the function
24126    'pad_goups' which tries to force the scheduler's grouping on the processor).
24127
24128    The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
24129    examines the (estimated) dispatch groups that will be formed by the processor
24130    dispatcher.  It marks these group boundaries to reflect the estimated
24131    processor grouping, overriding the grouping that the scheduler had marked.
24132    Depending on the value of the flag '-minsert-sched-nops' this function can
24133    force certain insns into separate groups or force a certain distance between
24134    them by inserting nops, for example, if there exists a "costly dependence"
24135    between the insns.
24136
24137    The function estimates the group boundaries that the processor will form as
24138    follows:  It keeps track of how many vacant issue slots are available after
24139    each insn.  A subsequent insn will start a new group if one of the following
24140    4 cases applies:
24141    - no more vacant issue slots remain in the current dispatch group.
24142    - only the last issue slot, which is the branch slot, is vacant, but the next
24143      insn is not a branch.
24144    - only the last 2 or less issue slots, including the branch slot, are vacant,
24145      which means that a cracked insn (which occupies two issue slots) can't be
24146      issued in this group.
24147    - less than 'issue_rate' slots are vacant, and the next insn always needs to
24148      start a new group.  */
24149
24150 static int
24151 redefine_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
24152 {
24153   rtx insn, next_insn;
24154   int issue_rate;
24155   int can_issue_more;
24156   int slot, i;
24157   bool group_end;
24158   int group_count = 0;
24159   rtx *group_insns;
24160
24161   /* Initialize.  */
24162   issue_rate = rs6000_issue_rate ();
24163   group_insns = XALLOCAVEC (rtx, issue_rate);
24164   for (i = 0; i < issue_rate; i++)
24165     {
24166       group_insns[i] = 0;
24167     }
24168   can_issue_more = issue_rate;
24169   slot = 0;
24170   insn = get_next_active_insn (prev_head_insn, tail);
24171   group_end = false;
24172
24173   while (insn != NULL_RTX)
24174     {
24175       slot = (issue_rate - can_issue_more);
24176       group_insns[slot] = insn;
24177       can_issue_more =
24178         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
24179       if (insn_terminates_group_p (insn, current_group))
24180         can_issue_more = 0;
24181
24182       next_insn = get_next_active_insn (insn, tail);
24183       if (next_insn == NULL_RTX)
24184         return group_count + 1;
24185
24186       /* Is next_insn going to start a new group?  */
24187       group_end
24188         = (can_issue_more == 0
24189            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
24190            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
24191            || (can_issue_more < issue_rate &&
24192                insn_terminates_group_p (next_insn, previous_group)));
24193
24194       can_issue_more = force_new_group (sched_verbose, dump, group_insns,
24195                                         next_insn, &group_end, can_issue_more,
24196                                         &group_count);
24197
24198       if (group_end)
24199         {
24200           group_count++;
24201           can_issue_more = 0;
24202           for (i = 0; i < issue_rate; i++)
24203             {
24204               group_insns[i] = 0;
24205             }
24206         }
24207
24208       if (GET_MODE (next_insn) == TImode && can_issue_more)
24209         PUT_MODE (next_insn, VOIDmode);
24210       else if (!can_issue_more && GET_MODE (next_insn) != TImode)
24211         PUT_MODE (next_insn, TImode);
24212
24213       insn = next_insn;
24214       if (can_issue_more == 0)
24215         can_issue_more = issue_rate;
24216     } /* while */
24217
24218   return group_count;
24219 }
24220
24221 /* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
24222    dispatch group boundaries that the scheduler had marked.  Pad with nops
24223    any dispatch groups which have vacant issue slots, in order to force the
24224    scheduler's grouping on the processor dispatcher.  The function
24225    returns the number of dispatch groups found.  */
24226
24227 static int
24228 pad_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
24229 {
24230   rtx insn, next_insn;
24231   rtx nop;
24232   int issue_rate;
24233   int can_issue_more;
24234   int group_end;
24235   int group_count = 0;
24236
24237   /* Initialize issue_rate.  */
24238   issue_rate = rs6000_issue_rate ();
24239   can_issue_more = issue_rate;
24240
24241   insn = get_next_active_insn (prev_head_insn, tail);
24242   next_insn = get_next_active_insn (insn, tail);
24243
24244   while (insn != NULL_RTX)
24245     {
24246       can_issue_more =
24247         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
24248
24249       group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
24250
24251       if (next_insn == NULL_RTX)
24252         break;
24253
24254       if (group_end)
24255         {
24256           /* If the scheduler had marked group termination at this location
24257              (between insn and next_insn), and neither insn nor next_insn will
24258              force group termination, pad the group with nops to force group
24259              termination.  */
24260           if (can_issue_more
24261               && (rs6000_sched_insert_nops == sched_finish_pad_groups)
24262               && !insn_terminates_group_p (insn, current_group)
24263               && !insn_terminates_group_p (next_insn, previous_group))
24264             {
24265               if (!is_branch_slot_insn (next_insn))
24266                 can_issue_more--;
24267
24268               while (can_issue_more)
24269                 {
24270                   nop = gen_nop ();
24271                   emit_insn_before (nop, next_insn);
24272                   can_issue_more--;
24273                 }
24274             }
24275
24276           can_issue_more = issue_rate;
24277           group_count++;
24278         }
24279
24280       insn = next_insn;
24281       next_insn = get_next_active_insn (insn, tail);
24282     }
24283
24284   return group_count;
24285 }
24286
24287 /* We're beginning a new block.  Initialize data structures as necessary.  */
24288
24289 static void
24290 rs6000_sched_init (FILE *dump ATTRIBUTE_UNUSED,
24291                      int sched_verbose ATTRIBUTE_UNUSED,
24292                      int max_ready ATTRIBUTE_UNUSED)
24293 {
24294   last_scheduled_insn = NULL_RTX;
24295   load_store_pendulum = 0;
24296 }
24297
24298 /* The following function is called at the end of scheduling BB.
24299    After reload, it inserts nops at insn group bundling.  */
24300
24301 static void
24302 rs6000_sched_finish (FILE *dump, int sched_verbose)
24303 {
24304   int n_groups;
24305
24306   if (sched_verbose)
24307     fprintf (dump, "=== Finishing schedule.\n");
24308
24309   if (reload_completed && rs6000_sched_groups)
24310     {
24311       /* Do not run sched_finish hook when selective scheduling enabled.  */
24312       if (sel_sched_p ())
24313         return;
24314
24315       if (rs6000_sched_insert_nops == sched_finish_none)
24316         return;
24317
24318       if (rs6000_sched_insert_nops == sched_finish_pad_groups)
24319         n_groups = pad_groups (dump, sched_verbose,
24320                                current_sched_info->prev_head,
24321                                current_sched_info->next_tail);
24322       else
24323         n_groups = redefine_groups (dump, sched_verbose,
24324                                     current_sched_info->prev_head,
24325                                     current_sched_info->next_tail);
24326
24327       if (sched_verbose >= 6)
24328         {
24329           fprintf (dump, "ngroups = %d\n", n_groups);
24330           print_rtl (dump, current_sched_info->prev_head);
24331           fprintf (dump, "Done finish_sched\n");
24332         }
24333     }
24334 }
24335
24336 struct _rs6000_sched_context
24337 {
24338   short cached_can_issue_more;
24339   rtx last_scheduled_insn;
24340   int load_store_pendulum;
24341 };
24342
24343 typedef struct _rs6000_sched_context rs6000_sched_context_def;
24344 typedef rs6000_sched_context_def *rs6000_sched_context_t;
24345
24346 /* Allocate store for new scheduling context.  */
24347 static void *
24348 rs6000_alloc_sched_context (void)
24349 {
24350   return xmalloc (sizeof (rs6000_sched_context_def));
24351 }
24352
24353 /* If CLEAN_P is true then initializes _SC with clean data,
24354    and from the global context otherwise.  */
24355 static void
24356 rs6000_init_sched_context (void *_sc, bool clean_p)
24357 {
24358   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
24359
24360   if (clean_p)
24361     {
24362       sc->cached_can_issue_more = 0;
24363       sc->last_scheduled_insn = NULL_RTX;
24364       sc->load_store_pendulum = 0;
24365     }
24366   else
24367     {
24368       sc->cached_can_issue_more = cached_can_issue_more;
24369       sc->last_scheduled_insn = last_scheduled_insn;
24370       sc->load_store_pendulum = load_store_pendulum;
24371     }
24372 }
24373
24374 /* Sets the global scheduling context to the one pointed to by _SC.  */
24375 static void
24376 rs6000_set_sched_context (void *_sc)
24377 {
24378   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
24379
24380   gcc_assert (sc != NULL);
24381
24382   cached_can_issue_more = sc->cached_can_issue_more;
24383   last_scheduled_insn = sc->last_scheduled_insn;
24384   load_store_pendulum = sc->load_store_pendulum;
24385 }
24386
24387 /* Free _SC.  */
24388 static void
24389 rs6000_free_sched_context (void *_sc)
24390 {
24391   gcc_assert (_sc != NULL);
24392
24393   free (_sc);
24394 }
24395
24396 \f
24397 /* Length in units of the trampoline for entering a nested function.  */
24398
24399 int
24400 rs6000_trampoline_size (void)
24401 {
24402   int ret = 0;
24403
24404   switch (DEFAULT_ABI)
24405     {
24406     default:
24407       gcc_unreachable ();
24408
24409     case ABI_AIX:
24410       ret = (TARGET_32BIT) ? 12 : 24;
24411       break;
24412
24413     case ABI_DARWIN:
24414     case ABI_V4:
24415       ret = (TARGET_32BIT) ? 40 : 48;
24416       break;
24417     }
24418
24419   return ret;
24420 }
24421
24422 /* Emit RTL insns to initialize the variable parts of a trampoline.
24423    FNADDR is an RTX for the address of the function's pure code.
24424    CXT is an RTX for the static chain value for the function.  */
24425
24426 static void
24427 rs6000_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
24428 {
24429   int regsize = (TARGET_32BIT) ? 4 : 8;
24430   rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
24431   rtx ctx_reg = force_reg (Pmode, cxt);
24432   rtx addr = force_reg (Pmode, XEXP (m_tramp, 0));
24433
24434   switch (DEFAULT_ABI)
24435     {
24436     default:
24437       gcc_unreachable ();
24438
24439     /* Under AIX, just build the 3 word function descriptor */
24440     case ABI_AIX:
24441       {
24442         rtx fnmem, fn_reg, toc_reg;
24443
24444         if (!TARGET_POINTERS_TO_NESTED_FUNCTIONS)
24445           error ("-mno-r11 must not be used if you have trampolines");
24446
24447         fnmem = gen_const_mem (Pmode, force_reg (Pmode, fnaddr));
24448         fn_reg = gen_reg_rtx (Pmode);
24449         toc_reg = gen_reg_rtx (Pmode);
24450
24451   /* Macro to shorten the code expansions below.  */
24452 # define MEM_PLUS(MEM, OFFSET) adjust_address (MEM, Pmode, OFFSET)
24453
24454         m_tramp = replace_equiv_address (m_tramp, addr);
24455
24456         emit_move_insn (fn_reg, MEM_PLUS (fnmem, 0));
24457         emit_move_insn (toc_reg, MEM_PLUS (fnmem, regsize));
24458         emit_move_insn (MEM_PLUS (m_tramp, 0), fn_reg);
24459         emit_move_insn (MEM_PLUS (m_tramp, regsize), toc_reg);
24460         emit_move_insn (MEM_PLUS (m_tramp, 2*regsize), ctx_reg);
24461
24462 # undef MEM_PLUS
24463       }
24464       break;
24465
24466     /* Under V.4/eabi/darwin, __trampoline_setup does the real work.  */
24467     case ABI_DARWIN:
24468     case ABI_V4:
24469       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
24470                          LCT_NORMAL, VOIDmode, 4,
24471                          addr, Pmode,
24472                          GEN_INT (rs6000_trampoline_size ()), SImode,
24473                          fnaddr, Pmode,
24474                          ctx_reg, Pmode);
24475       break;
24476     }
24477 }
24478
24479 \f
24480 /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain
24481    identifier as an argument, so the front end shouldn't look it up.  */
24482
24483 static bool
24484 rs6000_attribute_takes_identifier_p (const_tree attr_id)
24485 {
24486   return is_attribute_p ("altivec", attr_id);
24487 }
24488
24489 /* Handle the "altivec" attribute.  The attribute may have
24490    arguments as follows:
24491
24492         __attribute__((altivec(vector__)))
24493         __attribute__((altivec(pixel__)))       (always followed by 'unsigned short')
24494         __attribute__((altivec(bool__)))        (always followed by 'unsigned')
24495
24496   and may appear more than once (e.g., 'vector bool char') in a
24497   given declaration.  */
24498
24499 static tree
24500 rs6000_handle_altivec_attribute (tree *node,
24501                                  tree name ATTRIBUTE_UNUSED,
24502                                  tree args,
24503                                  int flags ATTRIBUTE_UNUSED,
24504                                  bool *no_add_attrs)
24505 {
24506   tree type = *node, result = NULL_TREE;
24507   enum machine_mode mode;
24508   int unsigned_p;
24509   char altivec_type
24510     = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
24511         && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
24512        ? *IDENTIFIER_POINTER (TREE_VALUE (args))
24513        : '?');
24514
24515   while (POINTER_TYPE_P (type)
24516          || TREE_CODE (type) == FUNCTION_TYPE
24517          || TREE_CODE (type) == METHOD_TYPE
24518          || TREE_CODE (type) == ARRAY_TYPE)
24519     type = TREE_TYPE (type);
24520
24521   mode = TYPE_MODE (type);
24522
24523   /* Check for invalid AltiVec type qualifiers.  */
24524   if (type == long_double_type_node)
24525     error ("use of %<long double%> in AltiVec types is invalid");
24526   else if (type == boolean_type_node)
24527     error ("use of boolean types in AltiVec types is invalid");
24528   else if (TREE_CODE (type) == COMPLEX_TYPE)
24529     error ("use of %<complex%> in AltiVec types is invalid");
24530   else if (DECIMAL_FLOAT_MODE_P (mode))
24531     error ("use of decimal floating point types in AltiVec types is invalid");
24532   else if (!TARGET_VSX)
24533     {
24534       if (type == long_unsigned_type_node || type == long_integer_type_node)
24535         {
24536           if (TARGET_64BIT)
24537             error ("use of %<long%> in AltiVec types is invalid for "
24538                    "64-bit code without -mvsx");
24539           else if (rs6000_warn_altivec_long)
24540             warning (0, "use of %<long%> in AltiVec types is deprecated; "
24541                      "use %<int%>");
24542         }
24543       else if (type == long_long_unsigned_type_node
24544                || type == long_long_integer_type_node)
24545         error ("use of %<long long%> in AltiVec types is invalid without "
24546                "-mvsx");
24547       else if (type == double_type_node)
24548         error ("use of %<double%> in AltiVec types is invalid without -mvsx");
24549     }
24550
24551   switch (altivec_type)
24552     {
24553     case 'v':
24554       unsigned_p = TYPE_UNSIGNED (type);
24555       switch (mode)
24556         {
24557         case DImode:
24558           result = (unsigned_p ? unsigned_V2DI_type_node : V2DI_type_node);
24559           break;
24560         case SImode:
24561           result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
24562           break;
24563         case HImode:
24564           result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
24565           break;
24566         case QImode:
24567           result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
24568           break;
24569         case SFmode: result = V4SF_type_node; break;
24570         case DFmode: result = V2DF_type_node; break;
24571           /* If the user says 'vector int bool', we may be handed the 'bool'
24572              attribute _before_ the 'vector' attribute, and so select the
24573              proper type in the 'b' case below.  */
24574         case V4SImode: case V8HImode: case V16QImode: case V4SFmode:
24575         case V2DImode: case V2DFmode:
24576           result = type;
24577         default: break;
24578         }
24579       break;
24580     case 'b':
24581       switch (mode)
24582         {
24583         case DImode: case V2DImode: result = bool_V2DI_type_node; break;
24584         case SImode: case V4SImode: result = bool_V4SI_type_node; break;
24585         case HImode: case V8HImode: result = bool_V8HI_type_node; break;
24586         case QImode: case V16QImode: result = bool_V16QI_type_node;
24587         default: break;
24588         }
24589       break;
24590     case 'p':
24591       switch (mode)
24592         {
24593         case V8HImode: result = pixel_V8HI_type_node;
24594         default: break;
24595         }
24596     default: break;
24597     }
24598
24599   /* Propagate qualifiers attached to the element type
24600      onto the vector type.  */
24601   if (result && result != type && TYPE_QUALS (type))
24602     result = build_qualified_type (result, TYPE_QUALS (type));
24603
24604   *no_add_attrs = true;  /* No need to hang on to the attribute.  */
24605
24606   if (result)
24607     *node = lang_hooks.types.reconstruct_complex_type (*node, result);
24608
24609   return NULL_TREE;
24610 }
24611
24612 /* AltiVec defines four built-in scalar types that serve as vector
24613    elements; we must teach the compiler how to mangle them.  */
24614
24615 static const char *
24616 rs6000_mangle_type (const_tree type)
24617 {
24618   type = TYPE_MAIN_VARIANT (type);
24619
24620   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
24621       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
24622     return NULL;
24623
24624   if (type == bool_char_type_node) return "U6__boolc";
24625   if (type == bool_short_type_node) return "U6__bools";
24626   if (type == pixel_type_node) return "u7__pixel";
24627   if (type == bool_int_type_node) return "U6__booli";
24628   if (type == bool_long_type_node) return "U6__booll";
24629
24630   /* Mangle IBM extended float long double as `g' (__float128) on
24631      powerpc*-linux where long-double-64 previously was the default.  */
24632   if (TYPE_MAIN_VARIANT (type) == long_double_type_node
24633       && TARGET_ELF
24634       && TARGET_LONG_DOUBLE_128
24635       && !TARGET_IEEEQUAD)
24636     return "g";
24637
24638   /* For all other types, use normal C++ mangling.  */
24639   return NULL;
24640 }
24641
24642 /* Handle a "longcall" or "shortcall" attribute; arguments as in
24643    struct attribute_spec.handler.  */
24644
24645 static tree
24646 rs6000_handle_longcall_attribute (tree *node, tree name,
24647                                   tree args ATTRIBUTE_UNUSED,
24648                                   int flags ATTRIBUTE_UNUSED,
24649                                   bool *no_add_attrs)
24650 {
24651   if (TREE_CODE (*node) != FUNCTION_TYPE
24652       && TREE_CODE (*node) != FIELD_DECL
24653       && TREE_CODE (*node) != TYPE_DECL)
24654     {
24655       warning (OPT_Wattributes, "%qE attribute only applies to functions",
24656                name);
24657       *no_add_attrs = true;
24658     }
24659
24660   return NULL_TREE;
24661 }
24662
24663 /* Set longcall attributes on all functions declared when
24664    rs6000_default_long_calls is true.  */
24665 static void
24666 rs6000_set_default_type_attributes (tree type)
24667 {
24668   if (rs6000_default_long_calls
24669       && (TREE_CODE (type) == FUNCTION_TYPE
24670           || TREE_CODE (type) == METHOD_TYPE))
24671     TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
24672                                         NULL_TREE,
24673                                         TYPE_ATTRIBUTES (type));
24674
24675 #if TARGET_MACHO
24676   darwin_set_default_type_attributes (type);
24677 #endif
24678 }
24679
24680 /* Return a reference suitable for calling a function with the
24681    longcall attribute.  */
24682
24683 rtx
24684 rs6000_longcall_ref (rtx call_ref)
24685 {
24686   const char *call_name;
24687   tree node;
24688
24689   if (GET_CODE (call_ref) != SYMBOL_REF)
24690     return call_ref;
24691
24692   /* System V adds '.' to the internal name, so skip them.  */
24693   call_name = XSTR (call_ref, 0);
24694   if (*call_name == '.')
24695     {
24696       while (*call_name == '.')
24697         call_name++;
24698
24699       node = get_identifier (call_name);
24700       call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
24701     }
24702
24703   return force_reg (Pmode, call_ref);
24704 }
24705 \f
24706 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
24707 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
24708 #endif
24709
24710 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
24711    struct attribute_spec.handler.  */
24712 static tree
24713 rs6000_handle_struct_attribute (tree *node, tree name,
24714                                 tree args ATTRIBUTE_UNUSED,
24715                                 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
24716 {
24717   tree *type = NULL;
24718   if (DECL_P (*node))
24719     {
24720       if (TREE_CODE (*node) == TYPE_DECL)
24721         type = &TREE_TYPE (*node);
24722     }
24723   else
24724     type = node;
24725
24726   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
24727                  || TREE_CODE (*type) == UNION_TYPE)))
24728     {
24729       warning (OPT_Wattributes, "%qE attribute ignored", name);
24730       *no_add_attrs = true;
24731     }
24732
24733   else if ((is_attribute_p ("ms_struct", name)
24734             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
24735            || ((is_attribute_p ("gcc_struct", name)
24736                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
24737     {
24738       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
24739                name);
24740       *no_add_attrs = true;
24741     }
24742
24743   return NULL_TREE;
24744 }
24745
24746 static bool
24747 rs6000_ms_bitfield_layout_p (const_tree record_type)
24748 {
24749   return (TARGET_USE_MS_BITFIELD_LAYOUT &&
24750           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
24751     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
24752 }
24753 \f
24754 #ifdef USING_ELFOS_H
24755
24756 /* A get_unnamed_section callback, used for switching to toc_section.  */
24757
24758 static void
24759 rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
24760 {
24761   if (DEFAULT_ABI == ABI_AIX
24762       && TARGET_MINIMAL_TOC
24763       && !TARGET_RELOCATABLE)
24764     {
24765       if (!toc_initialized)
24766         {
24767           toc_initialized = 1;
24768           fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
24769           (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0);
24770           fprintf (asm_out_file, "\t.tc ");
24771           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],");
24772           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
24773           fprintf (asm_out_file, "\n");
24774
24775           fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24776           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
24777           fprintf (asm_out_file, " = .+32768\n");
24778         }
24779       else
24780         fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24781     }
24782   else if (DEFAULT_ABI == ABI_AIX && !TARGET_RELOCATABLE)
24783     fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
24784   else
24785     {
24786       fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
24787       if (!toc_initialized)
24788         {
24789           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
24790           fprintf (asm_out_file, " = .+32768\n");
24791           toc_initialized = 1;
24792         }
24793     }
24794 }
24795
24796 /* Implement TARGET_ASM_INIT_SECTIONS.  */
24797
24798 static void
24799 rs6000_elf_asm_init_sections (void)
24800 {
24801   toc_section
24802     = get_unnamed_section (0, rs6000_elf_output_toc_section_asm_op, NULL);
24803
24804   sdata2_section
24805     = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
24806                            SDATA2_SECTION_ASM_OP);
24807 }
24808
24809 /* Implement TARGET_SELECT_RTX_SECTION.  */
24810
24811 static section *
24812 rs6000_elf_select_rtx_section (enum machine_mode mode, rtx x,
24813                                unsigned HOST_WIDE_INT align)
24814 {
24815   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
24816     return toc_section;
24817   else
24818     return default_elf_select_rtx_section (mode, x, align);
24819 }
24820 \f
24821 /* For a SYMBOL_REF, set generic flags and then perform some
24822    target-specific processing.
24823
24824    When the AIX ABI is requested on a non-AIX system, replace the
24825    function name with the real name (with a leading .) rather than the
24826    function descriptor name.  This saves a lot of overriding code to
24827    read the prefixes.  */
24828
24829 static void
24830 rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
24831 {
24832   default_encode_section_info (decl, rtl, first);
24833
24834   if (first
24835       && TREE_CODE (decl) == FUNCTION_DECL
24836       && !TARGET_AIX
24837       && DEFAULT_ABI == ABI_AIX)
24838     {
24839       rtx sym_ref = XEXP (rtl, 0);
24840       size_t len = strlen (XSTR (sym_ref, 0));
24841       char *str = XALLOCAVEC (char, len + 2);
24842       str[0] = '.';
24843       memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
24844       XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
24845     }
24846 }
24847
24848 static inline bool
24849 compare_section_name (const char *section, const char *templ)
24850 {
24851   int len;
24852
24853   len = strlen (templ);
24854   return (strncmp (section, templ, len) == 0
24855           && (section[len] == 0 || section[len] == '.'));
24856 }
24857
24858 bool
24859 rs6000_elf_in_small_data_p (const_tree decl)
24860 {
24861   if (rs6000_sdata == SDATA_NONE)
24862     return false;
24863
24864   /* We want to merge strings, so we never consider them small data.  */
24865   if (TREE_CODE (decl) == STRING_CST)
24866     return false;
24867
24868   /* Functions are never in the small data area.  */
24869   if (TREE_CODE (decl) == FUNCTION_DECL)
24870     return false;
24871
24872   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
24873     {
24874       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
24875       if (compare_section_name (section, ".sdata")
24876           || compare_section_name (section, ".sdata2")
24877           || compare_section_name (section, ".gnu.linkonce.s")
24878           || compare_section_name (section, ".sbss")
24879           || compare_section_name (section, ".sbss2")
24880           || compare_section_name (section, ".gnu.linkonce.sb")
24881           || strcmp (section, ".PPC.EMB.sdata0") == 0
24882           || strcmp (section, ".PPC.EMB.sbss0") == 0)
24883         return true;
24884     }
24885   else
24886     {
24887       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
24888
24889       if (size > 0
24890           && size <= g_switch_value
24891           /* If it's not public, and we're not going to reference it there,
24892              there's no need to put it in the small data section.  */
24893           && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
24894         return true;
24895     }
24896
24897   return false;
24898 }
24899
24900 #endif /* USING_ELFOS_H */
24901 \f
24902 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  */
24903
24904 static bool
24905 rs6000_use_blocks_for_constant_p (enum machine_mode mode, const_rtx x)
24906 {
24907   return !ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode);
24908 }
24909 \f
24910 /* Return a REG that occurs in ADDR with coefficient 1.
24911    ADDR can be effectively incremented by incrementing REG.
24912
24913    r0 is special and we must not select it as an address
24914    register by this routine since our caller will try to
24915    increment the returned register via an "la" instruction.  */
24916
24917 rtx
24918 find_addr_reg (rtx addr)
24919 {
24920   while (GET_CODE (addr) == PLUS)
24921     {
24922       if (GET_CODE (XEXP (addr, 0)) == REG
24923           && REGNO (XEXP (addr, 0)) != 0)
24924         addr = XEXP (addr, 0);
24925       else if (GET_CODE (XEXP (addr, 1)) == REG
24926                && REGNO (XEXP (addr, 1)) != 0)
24927         addr = XEXP (addr, 1);
24928       else if (CONSTANT_P (XEXP (addr, 0)))
24929         addr = XEXP (addr, 1);
24930       else if (CONSTANT_P (XEXP (addr, 1)))
24931         addr = XEXP (addr, 0);
24932       else
24933         gcc_unreachable ();
24934     }
24935   gcc_assert (GET_CODE (addr) == REG && REGNO (addr) != 0);
24936   return addr;
24937 }
24938
24939 void
24940 rs6000_fatal_bad_address (rtx op)
24941 {
24942   fatal_insn ("bad address", op);
24943 }
24944
24945 #if TARGET_MACHO
24946
24947 typedef struct branch_island_d {
24948   tree function_name;
24949   tree label_name;
24950   int line_number;
24951 } branch_island;
24952
24953 DEF_VEC_O(branch_island);
24954 DEF_VEC_ALLOC_O(branch_island,gc);
24955
24956 static VEC(branch_island,gc) *branch_islands;
24957
24958 /* Remember to generate a branch island for far calls to the given
24959    function.  */
24960
24961 static void
24962 add_compiler_branch_island (tree label_name, tree function_name,
24963                             int line_number)
24964 {
24965   branch_island *bi = VEC_safe_push (branch_island, gc, branch_islands, NULL);
24966
24967   bi->function_name = function_name;
24968   bi->label_name = label_name;
24969   bi->line_number = line_number;
24970 }
24971
24972 /* Generate far-jump branch islands for everything recorded in
24973    branch_islands.  Invoked immediately after the last instruction of
24974    the epilogue has been emitted; the branch islands must be appended
24975    to, and contiguous with, the function body.  Mach-O stubs are
24976    generated in machopic_output_stub().  */
24977
24978 static void
24979 macho_branch_islands (void)
24980 {
24981   char tmp_buf[512];
24982
24983   while (!VEC_empty (branch_island, branch_islands))
24984     {
24985       branch_island *bi = VEC_last (branch_island, branch_islands);
24986       const char *label = IDENTIFIER_POINTER (bi->label_name);
24987       const char *name = IDENTIFIER_POINTER (bi->function_name);
24988       char name_buf[512];
24989       /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF().  */
24990       if (name[0] == '*' || name[0] == '&')
24991         strcpy (name_buf, name+1);
24992       else
24993         {
24994           name_buf[0] = '_';
24995           strcpy (name_buf+1, name);
24996         }
24997       strcpy (tmp_buf, "\n");
24998       strcat (tmp_buf, label);
24999 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
25000       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
25001         dbxout_stabd (N_SLINE, bi->line_number);
25002 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
25003       if (flag_pic)
25004         {
25005           strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
25006           strcat (tmp_buf, label);
25007           strcat (tmp_buf, "_pic\n");
25008           strcat (tmp_buf, label);
25009           strcat (tmp_buf, "_pic:\n\tmflr r11\n");
25010
25011           strcat (tmp_buf, "\taddis r11,r11,ha16(");
25012           strcat (tmp_buf, name_buf);
25013           strcat (tmp_buf, " - ");
25014           strcat (tmp_buf, label);
25015           strcat (tmp_buf, "_pic)\n");
25016
25017           strcat (tmp_buf, "\tmtlr r0\n");
25018
25019           strcat (tmp_buf, "\taddi r12,r11,lo16(");
25020           strcat (tmp_buf, name_buf);
25021           strcat (tmp_buf, " - ");
25022           strcat (tmp_buf, label);
25023           strcat (tmp_buf, "_pic)\n");
25024
25025           strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
25026         }
25027       else
25028         {
25029           strcat (tmp_buf, ":\nlis r12,hi16(");
25030           strcat (tmp_buf, name_buf);
25031           strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
25032           strcat (tmp_buf, name_buf);
25033           strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
25034         }
25035       output_asm_insn (tmp_buf, 0);
25036 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
25037       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
25038         dbxout_stabd (N_SLINE, bi->line_number);
25039 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
25040       VEC_pop (branch_island, branch_islands);
25041     }
25042 }
25043
25044 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
25045    already there or not.  */
25046
25047 static int
25048 no_previous_def (tree function_name)
25049 {
25050   branch_island *bi;
25051   unsigned ix;
25052
25053   FOR_EACH_VEC_ELT (branch_island, branch_islands, ix, bi)
25054     if (function_name == bi->function_name)
25055       return 0;
25056   return 1;
25057 }
25058
25059 /* GET_PREV_LABEL gets the label name from the previous definition of
25060    the function.  */
25061
25062 static tree
25063 get_prev_label (tree function_name)
25064 {
25065   branch_island *bi;
25066   unsigned ix;
25067
25068   FOR_EACH_VEC_ELT (branch_island, branch_islands, ix, bi)
25069     if (function_name == bi->function_name)
25070       return bi->label_name;
25071   return NULL_TREE;
25072 }
25073
25074 /* INSN is either a function call or a millicode call.  It may have an
25075    unconditional jump in its delay slot.
25076
25077    CALL_DEST is the routine we are calling.  */
25078
25079 char *
25080 output_call (rtx insn, rtx *operands, int dest_operand_number,
25081              int cookie_operand_number)
25082 {
25083   static char buf[256];
25084   if (darwin_emit_branch_islands
25085       && GET_CODE (operands[dest_operand_number]) == SYMBOL_REF
25086       && (INTVAL (operands[cookie_operand_number]) & CALL_LONG))
25087     {
25088       tree labelname;
25089       tree funname = get_identifier (XSTR (operands[dest_operand_number], 0));
25090
25091       if (no_previous_def (funname))
25092         {
25093           rtx label_rtx = gen_label_rtx ();
25094           char *label_buf, temp_buf[256];
25095           ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
25096                                        CODE_LABEL_NUMBER (label_rtx));
25097           label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
25098           labelname = get_identifier (label_buf);
25099           add_compiler_branch_island (labelname, funname, insn_line (insn));
25100         }
25101       else
25102         labelname = get_prev_label (funname);
25103
25104       /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
25105          instruction will reach 'foo', otherwise link as 'bl L42'".
25106          "L42" should be a 'branch island', that will do a far jump to
25107          'foo'.  Branch islands are generated in
25108          macho_branch_islands().  */
25109       sprintf (buf, "jbsr %%z%d,%.246s",
25110                dest_operand_number, IDENTIFIER_POINTER (labelname));
25111     }
25112   else
25113     sprintf (buf, "bl %%z%d", dest_operand_number);
25114   return buf;
25115 }
25116
25117 /* Generate PIC and indirect symbol stubs.  */
25118
25119 void
25120 machopic_output_stub (FILE *file, const char *symb, const char *stub)
25121 {
25122   unsigned int length;
25123   char *symbol_name, *lazy_ptr_name;
25124   char *local_label_0;
25125   static int label = 0;
25126
25127   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
25128   symb = (*targetm.strip_name_encoding) (symb);
25129
25130
25131   length = strlen (symb);
25132   symbol_name = XALLOCAVEC (char, length + 32);
25133   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
25134
25135   lazy_ptr_name = XALLOCAVEC (char, length + 32);
25136   GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
25137
25138   if (flag_pic == 2)
25139     switch_to_section (darwin_sections[machopic_picsymbol_stub1_section]);
25140   else
25141     switch_to_section (darwin_sections[machopic_symbol_stub1_section]);
25142
25143   if (flag_pic == 2)
25144     {
25145       fprintf (file, "\t.align 5\n");
25146
25147       fprintf (file, "%s:\n", stub);
25148       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25149
25150       label++;
25151       local_label_0 = XALLOCAVEC (char, sizeof ("\"L00000000000$spb\""));
25152       sprintf (local_label_0, "\"L%011d$spb\"", label);
25153
25154       fprintf (file, "\tmflr r0\n");
25155       fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
25156       fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
25157       fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
25158                lazy_ptr_name, local_label_0);
25159       fprintf (file, "\tmtlr r0\n");
25160       fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
25161                (TARGET_64BIT ? "ldu" : "lwzu"),
25162                lazy_ptr_name, local_label_0);
25163       fprintf (file, "\tmtctr r12\n");
25164       fprintf (file, "\tbctr\n");
25165     }
25166   else
25167     {
25168       fprintf (file, "\t.align 4\n");
25169
25170       fprintf (file, "%s:\n", stub);
25171       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25172
25173       fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
25174       fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
25175                (TARGET_64BIT ? "ldu" : "lwzu"),
25176                lazy_ptr_name);
25177       fprintf (file, "\tmtctr r12\n");
25178       fprintf (file, "\tbctr\n");
25179     }
25180
25181   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
25182   fprintf (file, "%s:\n", lazy_ptr_name);
25183   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25184   fprintf (file, "%sdyld_stub_binding_helper\n",
25185            (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
25186 }
25187
25188 /* Legitimize PIC addresses.  If the address is already
25189    position-independent, we return ORIG.  Newly generated
25190    position-independent addresses go into a reg.  This is REG if non
25191    zero, otherwise we allocate register(s) as necessary.  */
25192
25193 #define SMALL_INT(X) ((UINTVAL (X) + 0x8000) < 0x10000)
25194
25195 rtx
25196 rs6000_machopic_legitimize_pic_address (rtx orig, enum machine_mode mode,
25197                                         rtx reg)
25198 {
25199   rtx base, offset;
25200
25201   if (reg == NULL && ! reload_in_progress && ! reload_completed)
25202     reg = gen_reg_rtx (Pmode);
25203
25204   if (GET_CODE (orig) == CONST)
25205     {
25206       rtx reg_temp;
25207
25208       if (GET_CODE (XEXP (orig, 0)) == PLUS
25209           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
25210         return orig;
25211
25212       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
25213
25214       /* Use a different reg for the intermediate value, as
25215          it will be marked UNCHANGING.  */
25216       reg_temp = !can_create_pseudo_p () ? reg : gen_reg_rtx (Pmode);
25217       base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
25218                                                      Pmode, reg_temp);
25219       offset =
25220         rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
25221                                                 Pmode, reg);
25222
25223       if (GET_CODE (offset) == CONST_INT)
25224         {
25225           if (SMALL_INT (offset))
25226             return plus_constant (base, INTVAL (offset));
25227           else if (! reload_in_progress && ! reload_completed)
25228             offset = force_reg (Pmode, offset);
25229           else
25230             {
25231               rtx mem = force_const_mem (Pmode, orig);
25232               return machopic_legitimize_pic_address (mem, Pmode, reg);
25233             }
25234         }
25235       return gen_rtx_PLUS (Pmode, base, offset);
25236     }
25237
25238   /* Fall back on generic machopic code.  */
25239   return machopic_legitimize_pic_address (orig, mode, reg);
25240 }
25241
25242 /* Output a .machine directive for the Darwin assembler, and call
25243    the generic start_file routine.  */
25244
25245 static void
25246 rs6000_darwin_file_start (void)
25247 {
25248   static const struct
25249   {
25250     const char *arg;
25251     const char *name;
25252     int if_set;
25253   } mapping[] = {
25254     { "ppc64", "ppc64", MASK_64BIT },
25255     { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
25256     { "power4", "ppc970", 0 },
25257     { "G5", "ppc970", 0 },
25258     { "7450", "ppc7450", 0 },
25259     { "7400", "ppc7400", MASK_ALTIVEC },
25260     { "G4", "ppc7400", 0 },
25261     { "750", "ppc750", 0 },
25262     { "740", "ppc750", 0 },
25263     { "G3", "ppc750", 0 },
25264     { "604e", "ppc604e", 0 },
25265     { "604", "ppc604", 0 },
25266     { "603e", "ppc603", 0 },
25267     { "603", "ppc603", 0 },
25268     { "601", "ppc601", 0 },
25269     { NULL, "ppc", 0 } };
25270   const char *cpu_id = "";
25271   size_t i;
25272
25273   rs6000_file_start ();
25274   darwin_file_start ();
25275
25276   /* Determine the argument to -mcpu=.  Default to G3 if not specified.  */
25277   
25278   if (rs6000_default_cpu != 0 && rs6000_default_cpu[0] != '\0')
25279     cpu_id = rs6000_default_cpu;
25280
25281   if (global_options_set.x_rs6000_cpu_index)
25282     cpu_id = processor_target_table[rs6000_cpu_index].name;
25283
25284   /* Look through the mapping array.  Pick the first name that either
25285      matches the argument, has a bit set in IF_SET that is also set
25286      in the target flags, or has a NULL name.  */
25287
25288   i = 0;
25289   while (mapping[i].arg != NULL
25290          && strcmp (mapping[i].arg, cpu_id) != 0
25291          && (mapping[i].if_set & target_flags) == 0)
25292     i++;
25293
25294   fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
25295 }
25296
25297 #endif /* TARGET_MACHO */
25298
25299 #if TARGET_ELF
25300 static int
25301 rs6000_elf_reloc_rw_mask (void)
25302 {
25303   if (flag_pic)
25304     return 3;
25305   else if (DEFAULT_ABI == ABI_AIX)
25306     return 2;
25307   else
25308     return 0;
25309 }
25310
25311 /* Record an element in the table of global constructors.  SYMBOL is
25312    a SYMBOL_REF of the function to be called; PRIORITY is a number
25313    between 0 and MAX_INIT_PRIORITY.
25314
25315    This differs from default_named_section_asm_out_constructor in
25316    that we have special handling for -mrelocatable.  */
25317
25318 static void
25319 rs6000_elf_asm_out_constructor (rtx symbol, int priority)
25320 {
25321   const char *section = ".ctors";
25322   char buf[16];
25323
25324   if (priority != DEFAULT_INIT_PRIORITY)
25325     {
25326       sprintf (buf, ".ctors.%.5u",
25327                /* Invert the numbering so the linker puts us in the proper
25328                   order; constructors are run from right to left, and the
25329                   linker sorts in increasing order.  */
25330                MAX_INIT_PRIORITY - priority);
25331       section = buf;
25332     }
25333
25334   switch_to_section (get_section (section, SECTION_WRITE, NULL));
25335   assemble_align (POINTER_SIZE);
25336
25337   if (TARGET_RELOCATABLE)
25338     {
25339       fputs ("\t.long (", asm_out_file);
25340       output_addr_const (asm_out_file, symbol);
25341       fputs (")@fixup\n", asm_out_file);
25342     }
25343   else
25344     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
25345 }
25346
25347 static void
25348 rs6000_elf_asm_out_destructor (rtx symbol, int priority)
25349 {
25350   const char *section = ".dtors";
25351   char buf[16];
25352
25353   if (priority != DEFAULT_INIT_PRIORITY)
25354     {
25355       sprintf (buf, ".dtors.%.5u",
25356                /* Invert the numbering so the linker puts us in the proper
25357                   order; constructors are run from right to left, and the
25358                   linker sorts in increasing order.  */
25359                MAX_INIT_PRIORITY - priority);
25360       section = buf;
25361     }
25362
25363   switch_to_section (get_section (section, SECTION_WRITE, NULL));
25364   assemble_align (POINTER_SIZE);
25365
25366   if (TARGET_RELOCATABLE)
25367     {
25368       fputs ("\t.long (", asm_out_file);
25369       output_addr_const (asm_out_file, symbol);
25370       fputs (")@fixup\n", asm_out_file);
25371     }
25372   else
25373     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
25374 }
25375
25376 void
25377 rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
25378 {
25379   if (TARGET_64BIT)
25380     {
25381       fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
25382       ASM_OUTPUT_LABEL (file, name);
25383       fputs (DOUBLE_INT_ASM_OP, file);
25384       rs6000_output_function_entry (file, name);
25385       fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
25386       if (DOT_SYMBOLS)
25387         {
25388           fputs ("\t.size\t", file);
25389           assemble_name (file, name);
25390           fputs (",24\n\t.type\t.", file);
25391           assemble_name (file, name);
25392           fputs (",@function\n", file);
25393           if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
25394             {
25395               fputs ("\t.globl\t.", file);
25396               assemble_name (file, name);
25397               putc ('\n', file);
25398             }
25399         }
25400       else
25401         ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
25402       ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
25403       rs6000_output_function_entry (file, name);
25404       fputs (":\n", file);
25405       return;
25406     }
25407
25408   if (TARGET_RELOCATABLE
25409       && !TARGET_SECURE_PLT
25410       && (get_pool_size () != 0 || crtl->profile)
25411       && uses_TOC ())
25412     {
25413       char buf[256];
25414
25415       (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
25416
25417       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
25418       fprintf (file, "\t.long ");
25419       assemble_name (file, buf);
25420       putc ('-', file);
25421       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
25422       assemble_name (file, buf);
25423       putc ('\n', file);
25424     }
25425
25426   ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
25427   ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
25428
25429   if (DEFAULT_ABI == ABI_AIX)
25430     {
25431       const char *desc_name, *orig_name;
25432
25433       orig_name = (*targetm.strip_name_encoding) (name);
25434       desc_name = orig_name;
25435       while (*desc_name == '.')
25436         desc_name++;
25437
25438       if (TREE_PUBLIC (decl))
25439         fprintf (file, "\t.globl %s\n", desc_name);
25440
25441       fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
25442       fprintf (file, "%s:\n", desc_name);
25443       fprintf (file, "\t.long %s\n", orig_name);
25444       fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
25445       if (DEFAULT_ABI == ABI_AIX)
25446         fputs ("\t.long 0\n", file);
25447       fprintf (file, "\t.previous\n");
25448     }
25449   ASM_OUTPUT_LABEL (file, name);
25450 }
25451
25452 static void
25453 rs6000_elf_file_end (void)
25454 {
25455 #ifdef HAVE_AS_GNU_ATTRIBUTE
25456   if (TARGET_32BIT && DEFAULT_ABI == ABI_V4)
25457     {
25458       if (rs6000_passes_float)
25459         fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
25460                  ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT) ? 1 
25461                   : (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_SINGLE_FLOAT) ? 3 
25462                   : 2));
25463       if (rs6000_passes_vector)
25464         fprintf (asm_out_file, "\t.gnu_attribute 8, %d\n",
25465                  (TARGET_ALTIVEC_ABI ? 2
25466                   : TARGET_SPE_ABI ? 3
25467                   : 1));
25468       if (rs6000_returns_struct)
25469         fprintf (asm_out_file, "\t.gnu_attribute 12, %d\n",
25470                  aix_struct_return ? 2 : 1);
25471     }
25472 #endif
25473 #ifdef POWERPC_LINUX
25474   if (TARGET_32BIT)
25475     file_end_indicate_exec_stack ();
25476 #endif
25477 }
25478 #endif
25479
25480 #if TARGET_XCOFF
25481 static void
25482 rs6000_xcoff_asm_output_anchor (rtx symbol)
25483 {
25484   char buffer[100];
25485
25486   sprintf (buffer, "$ + " HOST_WIDE_INT_PRINT_DEC,
25487            SYMBOL_REF_BLOCK_OFFSET (symbol));
25488   ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
25489 }
25490
25491 static void
25492 rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
25493 {
25494   fputs (GLOBAL_ASM_OP, stream);
25495   RS6000_OUTPUT_BASENAME (stream, name);
25496   putc ('\n', stream);
25497 }
25498
25499 /* A get_unnamed_decl callback, used for read-only sections.  PTR
25500    points to the section string variable.  */
25501
25502 static void
25503 rs6000_xcoff_output_readonly_section_asm_op (const void *directive)
25504 {
25505   fprintf (asm_out_file, "\t.csect %s[RO],%s\n",
25506            *(const char *const *) directive,
25507            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
25508 }
25509
25510 /* Likewise for read-write sections.  */
25511
25512 static void
25513 rs6000_xcoff_output_readwrite_section_asm_op (const void *directive)
25514 {
25515   fprintf (asm_out_file, "\t.csect %s[RW],%s\n",
25516            *(const char *const *) directive,
25517            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
25518 }
25519
25520 /* A get_unnamed_section callback, used for switching to toc_section.  */
25521
25522 static void
25523 rs6000_xcoff_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
25524 {
25525   if (TARGET_MINIMAL_TOC)
25526     {
25527       /* toc_section is always selected at least once from
25528          rs6000_xcoff_file_start, so this is guaranteed to
25529          always be defined once and only once in each file.  */
25530       if (!toc_initialized)
25531         {
25532           fputs ("\t.toc\nLCTOC..1:\n", asm_out_file);
25533           fputs ("\t.tc toc_table[TC],toc_table[RW]\n", asm_out_file);
25534           toc_initialized = 1;
25535         }
25536       fprintf (asm_out_file, "\t.csect toc_table[RW]%s\n",
25537                (TARGET_32BIT ? "" : ",3"));
25538     }
25539   else
25540     fputs ("\t.toc\n", asm_out_file);
25541 }
25542
25543 /* Implement TARGET_ASM_INIT_SECTIONS.  */
25544
25545 static void
25546 rs6000_xcoff_asm_init_sections (void)
25547 {
25548   read_only_data_section
25549     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
25550                            &xcoff_read_only_section_name);
25551
25552   private_data_section
25553     = get_unnamed_section (SECTION_WRITE,
25554                            rs6000_xcoff_output_readwrite_section_asm_op,
25555                            &xcoff_private_data_section_name);
25556
25557   read_only_private_data_section
25558     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
25559                            &xcoff_private_data_section_name);
25560
25561   toc_section
25562     = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);
25563
25564   readonly_data_section = read_only_data_section;
25565   exception_section = data_section;
25566 }
25567
25568 static int
25569 rs6000_xcoff_reloc_rw_mask (void)
25570 {
25571   return 3;
25572 }
25573
25574 static void
25575 rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
25576                                 tree decl ATTRIBUTE_UNUSED)
25577 {
25578   int smclass;
25579   static const char * const suffix[3] = { "PR", "RO", "RW" };
25580
25581   if (flags & SECTION_CODE)
25582     smclass = 0;
25583   else if (flags & SECTION_WRITE)
25584     smclass = 2;
25585   else
25586     smclass = 1;
25587
25588   fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
25589            (flags & SECTION_CODE) ? "." : "",
25590            name, suffix[smclass], flags & SECTION_ENTSIZE);
25591 }
25592
25593 static section *
25594 rs6000_xcoff_select_section (tree decl, int reloc,
25595                              unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
25596 {
25597   if (decl_readonly_section (decl, reloc))
25598     {
25599       if (TREE_PUBLIC (decl))
25600         return read_only_data_section;
25601       else
25602         return read_only_private_data_section;
25603     }
25604   else
25605     {
25606       if (TREE_PUBLIC (decl))
25607         return data_section;
25608       else
25609         return private_data_section;
25610     }
25611 }
25612
25613 static void
25614 rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
25615 {
25616   const char *name;
25617
25618   /* Use select_section for private and uninitialized data.  */
25619   if (!TREE_PUBLIC (decl)
25620       || DECL_COMMON (decl)
25621       || DECL_INITIAL (decl) == NULL_TREE
25622       || DECL_INITIAL (decl) == error_mark_node
25623       || (flag_zero_initialized_in_bss
25624           && initializer_zerop (DECL_INITIAL (decl))))
25625     return;
25626
25627   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
25628   name = (*targetm.strip_name_encoding) (name);
25629   DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
25630 }
25631
25632 /* Select section for constant in constant pool.
25633
25634    On RS/6000, all constants are in the private read-only data area.
25635    However, if this is being placed in the TOC it must be output as a
25636    toc entry.  */
25637
25638 static section *
25639 rs6000_xcoff_select_rtx_section (enum machine_mode mode, rtx x,
25640                                  unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
25641 {
25642   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
25643     return toc_section;
25644   else
25645     return read_only_private_data_section;
25646 }
25647
25648 /* Remove any trailing [DS] or the like from the symbol name.  */
25649
25650 static const char *
25651 rs6000_xcoff_strip_name_encoding (const char *name)
25652 {
25653   size_t len;
25654   if (*name == '*')
25655     name++;
25656   len = strlen (name);
25657   if (name[len - 1] == ']')
25658     return ggc_alloc_string (name, len - 4);
25659   else
25660     return name;
25661 }
25662
25663 /* Section attributes.  AIX is always PIC.  */
25664
25665 static unsigned int
25666 rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
25667 {
25668   unsigned int align;
25669   unsigned int flags = default_section_type_flags (decl, name, reloc);
25670
25671   /* Align to at least UNIT size.  */
25672   if (flags & SECTION_CODE)
25673     align = MIN_UNITS_PER_WORD;
25674   else
25675     /* Increase alignment of large objects if not already stricter.  */
25676     align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
25677                  int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
25678                  ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
25679
25680   return flags | (exact_log2 (align) & SECTION_ENTSIZE);
25681 }
25682
25683 /* Output at beginning of assembler file.
25684
25685    Initialize the section names for the RS/6000 at this point.
25686
25687    Specify filename, including full path, to assembler.
25688
25689    We want to go into the TOC section so at least one .toc will be emitted.
25690    Also, in order to output proper .bs/.es pairs, we need at least one static
25691    [RW] section emitted.
25692
25693    Finally, declare mcount when profiling to make the assembler happy.  */
25694
25695 static void
25696 rs6000_xcoff_file_start (void)
25697 {
25698   rs6000_gen_section_name (&xcoff_bss_section_name,
25699                            main_input_filename, ".bss_");
25700   rs6000_gen_section_name (&xcoff_private_data_section_name,
25701                            main_input_filename, ".rw_");
25702   rs6000_gen_section_name (&xcoff_read_only_section_name,
25703                            main_input_filename, ".ro_");
25704
25705   fputs ("\t.file\t", asm_out_file);
25706   output_quoted_string (asm_out_file, main_input_filename);
25707   fputc ('\n', asm_out_file);
25708   if (write_symbols != NO_DEBUG)
25709     switch_to_section (private_data_section);
25710   switch_to_section (text_section);
25711   if (profile_flag)
25712     fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
25713   rs6000_file_start ();
25714 }
25715
25716 /* Output at end of assembler file.
25717    On the RS/6000, referencing data should automatically pull in text.  */
25718
25719 static void
25720 rs6000_xcoff_file_end (void)
25721 {
25722   switch_to_section (text_section);
25723   fputs ("_section_.text:\n", asm_out_file);
25724   switch_to_section (data_section);
25725   fputs (TARGET_32BIT
25726          ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
25727          asm_out_file);
25728 }
25729 #endif /* TARGET_XCOFF */
25730
25731 /* Compute a (partial) cost for rtx X.  Return true if the complete
25732    cost has been computed, and false if subexpressions should be
25733    scanned.  In either case, *TOTAL contains the cost result.  */
25734
25735 static bool
25736 rs6000_rtx_costs (rtx x, int code, int outer_code, int *total,
25737                   bool speed)
25738 {
25739   enum machine_mode mode = GET_MODE (x);
25740
25741   switch (code)
25742     {
25743       /* On the RS/6000, if it is valid in the insn, it is free.  */
25744     case CONST_INT:
25745       if (((outer_code == SET
25746             || outer_code == PLUS
25747             || outer_code == MINUS)
25748            && (satisfies_constraint_I (x)
25749                || satisfies_constraint_L (x)))
25750           || (outer_code == AND
25751               && (satisfies_constraint_K (x)
25752                   || (mode == SImode
25753                       ? satisfies_constraint_L (x)
25754                       : satisfies_constraint_J (x))
25755                   || mask_operand (x, mode)
25756                   || (mode == DImode
25757                       && mask64_operand (x, DImode))))
25758           || ((outer_code == IOR || outer_code == XOR)
25759               && (satisfies_constraint_K (x)
25760                   || (mode == SImode
25761                       ? satisfies_constraint_L (x)
25762                       : satisfies_constraint_J (x))))
25763           || outer_code == ASHIFT
25764           || outer_code == ASHIFTRT
25765           || outer_code == LSHIFTRT
25766           || outer_code == ROTATE
25767           || outer_code == ROTATERT
25768           || outer_code == ZERO_EXTRACT
25769           || (outer_code == MULT
25770               && satisfies_constraint_I (x))
25771           || ((outer_code == DIV || outer_code == UDIV
25772                || outer_code == MOD || outer_code == UMOD)
25773               && exact_log2 (INTVAL (x)) >= 0)
25774           || (outer_code == COMPARE
25775               && (satisfies_constraint_I (x)
25776                   || satisfies_constraint_K (x)))
25777           || ((outer_code == EQ || outer_code == NE)
25778               && (satisfies_constraint_I (x)
25779                   || satisfies_constraint_K (x)
25780                   || (mode == SImode
25781                       ? satisfies_constraint_L (x)
25782                       : satisfies_constraint_J (x))))
25783           || (outer_code == GTU
25784               && satisfies_constraint_I (x))
25785           || (outer_code == LTU
25786               && satisfies_constraint_P (x)))
25787         {
25788           *total = 0;
25789           return true;
25790         }
25791       else if ((outer_code == PLUS
25792                 && reg_or_add_cint_operand (x, VOIDmode))
25793                || (outer_code == MINUS
25794                    && reg_or_sub_cint_operand (x, VOIDmode))
25795                || ((outer_code == SET
25796                     || outer_code == IOR
25797                     || outer_code == XOR)
25798                    && (INTVAL (x)
25799                        & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
25800         {
25801           *total = COSTS_N_INSNS (1);
25802           return true;
25803         }
25804       /* FALLTHRU */
25805
25806     case CONST_DOUBLE:
25807       if (mode == DImode && code == CONST_DOUBLE)
25808         {
25809           if ((outer_code == IOR || outer_code == XOR)
25810               && CONST_DOUBLE_HIGH (x) == 0
25811               && (CONST_DOUBLE_LOW (x)
25812                   & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0)
25813             {
25814               *total = 0;
25815               return true;
25816             }
25817           else if ((outer_code == AND && and64_2_operand (x, DImode))
25818                    || ((outer_code == SET
25819                         || outer_code == IOR
25820                         || outer_code == XOR)
25821                        && CONST_DOUBLE_HIGH (x) == 0))
25822             {
25823               *total = COSTS_N_INSNS (1);
25824               return true;
25825             }
25826         }
25827       /* FALLTHRU */
25828
25829     case CONST:
25830     case HIGH:
25831     case SYMBOL_REF:
25832     case MEM:
25833       /* When optimizing for size, MEM should be slightly more expensive
25834          than generating address, e.g., (plus (reg) (const)).
25835          L1 cache latency is about two instructions.  */
25836       *total = !speed ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
25837       return true;
25838
25839     case LABEL_REF:
25840       *total = 0;
25841       return true;
25842
25843     case PLUS:
25844     case MINUS:
25845       if (FLOAT_MODE_P (mode))
25846         *total = rs6000_cost->fp;
25847       else
25848         *total = COSTS_N_INSNS (1);
25849       return false;
25850
25851     case MULT:
25852       if (GET_CODE (XEXP (x, 1)) == CONST_INT
25853           && satisfies_constraint_I (XEXP (x, 1)))
25854         {
25855           if (INTVAL (XEXP (x, 1)) >= -256
25856               && INTVAL (XEXP (x, 1)) <= 255)
25857             *total = rs6000_cost->mulsi_const9;
25858           else
25859             *total = rs6000_cost->mulsi_const;
25860         }
25861       else if (mode == SFmode)
25862         *total = rs6000_cost->fp;
25863       else if (FLOAT_MODE_P (mode))
25864         *total = rs6000_cost->dmul;
25865       else if (mode == DImode)
25866         *total = rs6000_cost->muldi;
25867       else
25868         *total = rs6000_cost->mulsi;
25869       return false;
25870
25871     case FMA:
25872       if (mode == SFmode)
25873         *total = rs6000_cost->fp;
25874       else
25875         *total = rs6000_cost->dmul;
25876       break;
25877
25878     case DIV:
25879     case MOD:
25880       if (FLOAT_MODE_P (mode))
25881         {
25882           *total = mode == DFmode ? rs6000_cost->ddiv
25883                                   : rs6000_cost->sdiv;
25884           return false;
25885         }
25886       /* FALLTHRU */
25887
25888     case UDIV:
25889     case UMOD:
25890       if (GET_CODE (XEXP (x, 1)) == CONST_INT
25891           && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
25892         {
25893           if (code == DIV || code == MOD)
25894             /* Shift, addze */
25895             *total = COSTS_N_INSNS (2);
25896           else
25897             /* Shift */
25898             *total = COSTS_N_INSNS (1);
25899         }
25900       else
25901         {
25902           if (GET_MODE (XEXP (x, 1)) == DImode)
25903             *total = rs6000_cost->divdi;
25904           else
25905             *total = rs6000_cost->divsi;
25906         }
25907       /* Add in shift and subtract for MOD. */
25908       if (code == MOD || code == UMOD)
25909         *total += COSTS_N_INSNS (2);
25910       return false;
25911
25912     case CTZ:
25913     case FFS:
25914       *total = COSTS_N_INSNS (4);
25915       return false;
25916
25917     case POPCOUNT:
25918       *total = COSTS_N_INSNS (TARGET_POPCNTD ? 1 : 6);
25919       return false;
25920
25921     case PARITY:
25922       *total = COSTS_N_INSNS (TARGET_CMPB ? 2 : 6);
25923       return false;
25924
25925     case NOT:
25926       if (outer_code == AND || outer_code == IOR || outer_code == XOR)
25927         {
25928           *total = 0;
25929           return false;
25930         }
25931       /* FALLTHRU */
25932
25933     case AND:
25934     case CLZ:
25935     case IOR:
25936     case XOR:
25937     case ZERO_EXTRACT:
25938       *total = COSTS_N_INSNS (1);
25939       return false;
25940
25941     case ASHIFT:
25942     case ASHIFTRT:
25943     case LSHIFTRT:
25944     case ROTATE:
25945     case ROTATERT:
25946       /* Handle mul_highpart.  */
25947       if (outer_code == TRUNCATE
25948           && GET_CODE (XEXP (x, 0)) == MULT)
25949         {
25950           if (mode == DImode)
25951             *total = rs6000_cost->muldi;
25952           else
25953             *total = rs6000_cost->mulsi;
25954           return true;
25955         }
25956       else if (outer_code == AND)
25957         *total = 0;
25958       else
25959         *total = COSTS_N_INSNS (1);
25960       return false;
25961
25962     case SIGN_EXTEND:
25963     case ZERO_EXTEND:
25964       if (GET_CODE (XEXP (x, 0)) == MEM)
25965         *total = 0;
25966       else
25967         *total = COSTS_N_INSNS (1);
25968       return false;
25969
25970     case COMPARE:
25971     case NEG:
25972     case ABS:
25973       if (!FLOAT_MODE_P (mode))
25974         {
25975           *total = COSTS_N_INSNS (1);
25976           return false;
25977         }
25978       /* FALLTHRU */
25979
25980     case FLOAT:
25981     case UNSIGNED_FLOAT:
25982     case FIX:
25983     case UNSIGNED_FIX:
25984     case FLOAT_TRUNCATE:
25985       *total = rs6000_cost->fp;
25986       return false;
25987
25988     case FLOAT_EXTEND:
25989       if (mode == DFmode)
25990         *total = 0;
25991       else
25992         *total = rs6000_cost->fp;
25993       return false;
25994
25995     case UNSPEC:
25996       switch (XINT (x, 1))
25997         {
25998         case UNSPEC_FRSP:
25999           *total = rs6000_cost->fp;
26000           return true;
26001
26002         default:
26003           break;
26004         }
26005       break;
26006
26007     case CALL:
26008     case IF_THEN_ELSE:
26009       if (!speed)
26010         {
26011           *total = COSTS_N_INSNS (1);
26012           return true;
26013         }
26014       else if (FLOAT_MODE_P (mode)
26015                && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS)
26016         {
26017           *total = rs6000_cost->fp;
26018           return false;
26019         }
26020       break;
26021
26022     case EQ:
26023     case GTU:
26024     case LTU:
26025       /* Carry bit requires mode == Pmode.
26026          NEG or PLUS already counted so only add one.  */
26027       if (mode == Pmode
26028           && (outer_code == NEG || outer_code == PLUS))
26029         {
26030           *total = COSTS_N_INSNS (1);
26031           return true;
26032         }
26033       if (outer_code == SET)
26034         {
26035           if (XEXP (x, 1) == const0_rtx)
26036             {
26037               if (TARGET_ISEL && !TARGET_MFCRF)
26038                 *total = COSTS_N_INSNS (8);
26039               else
26040                 *total = COSTS_N_INSNS (2);
26041               return true;
26042             }
26043           else if (mode == Pmode)
26044             {
26045               *total = COSTS_N_INSNS (3);
26046               return false;
26047             }
26048         }
26049       /* FALLTHRU */
26050
26051     case GT:
26052     case LT:
26053     case UNORDERED:
26054       if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
26055         {
26056           if (TARGET_ISEL && !TARGET_MFCRF)
26057             *total = COSTS_N_INSNS (8);
26058           else
26059             *total = COSTS_N_INSNS (2);
26060           return true;
26061         }
26062       /* CC COMPARE.  */
26063       if (outer_code == COMPARE)
26064         {
26065           *total = 0;
26066           return true;
26067         }
26068       break;
26069
26070     default:
26071       break;
26072     }
26073
26074   return false;
26075 }
26076
26077 /* Debug form of r6000_rtx_costs that is selected if -mdebug=cost.  */
26078
26079 static bool
26080 rs6000_debug_rtx_costs (rtx x, int code, int outer_code, int *total,
26081                         bool speed)
26082 {
26083   bool ret = rs6000_rtx_costs (x, code, outer_code, total, speed);
26084
26085   fprintf (stderr,
26086            "\nrs6000_rtx_costs, return = %s, code = %s, outer_code = %s, "
26087            "total = %d, speed = %s, x:\n",
26088            ret ? "complete" : "scan inner",
26089            GET_RTX_NAME (code),
26090            GET_RTX_NAME (outer_code),
26091            *total,
26092            speed ? "true" : "false");
26093
26094   debug_rtx (x);
26095
26096   return ret;
26097 }
26098
26099 /* Debug form of ADDRESS_COST that is selected if -mdebug=cost.  */
26100
26101 static int
26102 rs6000_debug_address_cost (rtx x, bool speed)
26103 {
26104   int ret = TARGET_ADDRESS_COST (x, speed);
26105
26106   fprintf (stderr, "\nrs6000_address_cost, return = %d, speed = %s, x:\n",
26107            ret, speed ? "true" : "false");
26108   debug_rtx (x);
26109
26110   return ret;
26111 }
26112
26113
26114 /* A C expression returning the cost of moving data from a register of class
26115    CLASS1 to one of CLASS2.  */
26116
26117 static int
26118 rs6000_register_move_cost (enum machine_mode mode,
26119                            reg_class_t from, reg_class_t to)
26120 {
26121   int ret;
26122
26123   if (TARGET_DEBUG_COST)
26124     dbg_cost_ctrl++;
26125
26126   /*  Moves from/to GENERAL_REGS.  */
26127   if (reg_classes_intersect_p (to, GENERAL_REGS)
26128       || reg_classes_intersect_p (from, GENERAL_REGS))
26129     {
26130       reg_class_t rclass = from;
26131
26132       if (! reg_classes_intersect_p (to, GENERAL_REGS))
26133         rclass = to;
26134
26135       if (rclass == FLOAT_REGS || rclass == ALTIVEC_REGS || rclass == VSX_REGS)
26136         ret = (rs6000_memory_move_cost (mode, rclass, false)
26137                + rs6000_memory_move_cost (mode, GENERAL_REGS, false));
26138
26139       /* It's more expensive to move CR_REGS than CR0_REGS because of the
26140          shift.  */
26141       else if (rclass == CR_REGS)
26142         ret = 4;
26143
26144       /* For those processors that have slow LR/CTR moves, make them more
26145          expensive than memory in order to bias spills to memory .*/
26146       else if ((rs6000_cpu == PROCESSOR_POWER6
26147                 || rs6000_cpu == PROCESSOR_POWER7)
26148                && reg_classes_intersect_p (rclass, LINK_OR_CTR_REGS))
26149         ret = 6 * hard_regno_nregs[0][mode];
26150
26151       else
26152         /* A move will cost one instruction per GPR moved.  */
26153         ret = 2 * hard_regno_nregs[0][mode];
26154     }
26155
26156   /* If we have VSX, we can easily move between FPR or Altivec registers.  */
26157   else if (VECTOR_UNIT_VSX_P (mode)
26158            && reg_classes_intersect_p (to, VSX_REGS)
26159            && reg_classes_intersect_p (from, VSX_REGS))
26160     ret = 2 * hard_regno_nregs[32][mode];
26161
26162   /* Moving between two similar registers is just one instruction.  */
26163   else if (reg_classes_intersect_p (to, from))
26164     ret = (mode == TFmode || mode == TDmode) ? 4 : 2;
26165
26166   /* Everything else has to go through GENERAL_REGS.  */
26167   else
26168     ret = (rs6000_register_move_cost (mode, GENERAL_REGS, to)
26169            + rs6000_register_move_cost (mode, from, GENERAL_REGS));
26170
26171   if (TARGET_DEBUG_COST)
26172     {
26173       if (dbg_cost_ctrl == 1)
26174         fprintf (stderr,
26175                  "rs6000_register_move_cost:, ret=%d, mode=%s, from=%s, to=%s\n",
26176                  ret, GET_MODE_NAME (mode), reg_class_names[from],
26177                  reg_class_names[to]);
26178       dbg_cost_ctrl--;
26179     }
26180
26181   return ret;
26182 }
26183
26184 /* A C expressions returning the cost of moving data of MODE from a register to
26185    or from memory.  */
26186
26187 static int
26188 rs6000_memory_move_cost (enum machine_mode mode, reg_class_t rclass,
26189                          bool in ATTRIBUTE_UNUSED)
26190 {
26191   int ret;
26192
26193   if (TARGET_DEBUG_COST)
26194     dbg_cost_ctrl++;
26195
26196   if (reg_classes_intersect_p (rclass, GENERAL_REGS))
26197     ret = 4 * hard_regno_nregs[0][mode];
26198   else if (reg_classes_intersect_p (rclass, FLOAT_REGS))
26199     ret = 4 * hard_regno_nregs[32][mode];
26200   else if (reg_classes_intersect_p (rclass, ALTIVEC_REGS))
26201     ret = 4 * hard_regno_nregs[FIRST_ALTIVEC_REGNO][mode];
26202   else
26203     ret = 4 + rs6000_register_move_cost (mode, rclass, GENERAL_REGS);
26204
26205   if (TARGET_DEBUG_COST)
26206     {
26207       if (dbg_cost_ctrl == 1)
26208         fprintf (stderr,
26209                  "rs6000_memory_move_cost: ret=%d, mode=%s, rclass=%s, in=%d\n",
26210                  ret, GET_MODE_NAME (mode), reg_class_names[rclass], in);
26211       dbg_cost_ctrl--;
26212     }
26213
26214   return ret;
26215 }
26216
26217 /* Returns a code for a target-specific builtin that implements
26218    reciprocal of the function, or NULL_TREE if not available.  */
26219
26220 static tree
26221 rs6000_builtin_reciprocal (unsigned int fn, bool md_fn,
26222                            bool sqrt ATTRIBUTE_UNUSED)
26223 {
26224   if (optimize_insn_for_size_p ())
26225     return NULL_TREE;
26226
26227   if (md_fn)
26228     switch (fn)
26229       {
26230       case VSX_BUILTIN_XVSQRTDP:
26231         if (!RS6000_RECIP_AUTO_RSQRTE_P (V2DFmode))
26232           return NULL_TREE;
26233
26234         return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V2DF];
26235
26236       case VSX_BUILTIN_XVSQRTSP:
26237         if (!RS6000_RECIP_AUTO_RSQRTE_P (V4SFmode))
26238           return NULL_TREE;
26239
26240         return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V4SF];
26241
26242       default:
26243         return NULL_TREE;
26244       }
26245
26246   else
26247     switch (fn)
26248       {
26249       case BUILT_IN_SQRT:
26250         if (!RS6000_RECIP_AUTO_RSQRTE_P (DFmode))
26251           return NULL_TREE;
26252
26253         return rs6000_builtin_decls[RS6000_BUILTIN_RSQRT];
26254
26255       case BUILT_IN_SQRTF:
26256         if (!RS6000_RECIP_AUTO_RSQRTE_P (SFmode))
26257           return NULL_TREE;
26258
26259         return rs6000_builtin_decls[RS6000_BUILTIN_RSQRTF];
26260
26261       default:
26262         return NULL_TREE;
26263       }
26264 }
26265
26266 /* Load up a constant.  If the mode is a vector mode, splat the value across
26267    all of the vector elements.  */
26268
26269 static rtx
26270 rs6000_load_constant_and_splat (enum machine_mode mode, REAL_VALUE_TYPE dconst)
26271 {
26272   rtx reg;
26273
26274   if (mode == SFmode || mode == DFmode)
26275     {
26276       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, mode);
26277       reg = force_reg (mode, d);
26278     }
26279   else if (mode == V4SFmode)
26280     {
26281       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, SFmode);
26282       rtvec v = gen_rtvec (4, d, d, d, d);
26283       reg = gen_reg_rtx (mode);
26284       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
26285     }
26286   else if (mode == V2DFmode)
26287     {
26288       rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, DFmode);
26289       rtvec v = gen_rtvec (2, d, d);
26290       reg = gen_reg_rtx (mode);
26291       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
26292     }
26293   else
26294     gcc_unreachable ();
26295
26296   return reg;
26297 }
26298
26299 /* Generate an FMA instruction.  */
26300
26301 static void
26302 rs6000_emit_madd (rtx target, rtx m1, rtx m2, rtx a)
26303 {
26304   enum machine_mode mode = GET_MODE (target);
26305   rtx dst;
26306
26307   dst = expand_ternary_op (mode, fma_optab, m1, m2, a, target, 0);
26308   gcc_assert (dst != NULL);
26309
26310   if (dst != target)
26311     emit_move_insn (target, dst);
26312 }
26313
26314 /* Generate a FMSUB instruction: dst = fma(m1, m2, -a).  */
26315
26316 static void
26317 rs6000_emit_msub (rtx target, rtx m1, rtx m2, rtx a)
26318 {
26319   enum machine_mode mode = GET_MODE (target);
26320   rtx dst;
26321
26322   /* Altivec does not support fms directly;
26323      generate in terms of fma in that case.  */
26324   if (optab_handler (fms_optab, mode) != CODE_FOR_nothing)
26325     dst = expand_ternary_op (mode, fms_optab, m1, m2, a, target, 0);
26326   else
26327     {
26328       a = expand_unop (mode, neg_optab, a, NULL_RTX, 0);
26329       dst = expand_ternary_op (mode, fma_optab, m1, m2, a, target, 0);
26330     }
26331   gcc_assert (dst != NULL);
26332
26333   if (dst != target)
26334     emit_move_insn (target, dst);
26335 }
26336     
26337 /* Generate a FNMSUB instruction: dst = -fma(m1, m2, -a).  */
26338
26339 static void
26340 rs6000_emit_nmsub (rtx dst, rtx m1, rtx m2, rtx a)
26341 {
26342   enum machine_mode mode = GET_MODE (dst);
26343   rtx r;
26344
26345   /* This is a tad more complicated, since the fnma_optab is for
26346      a different expression: fma(-m1, m2, a), which is the same
26347      thing except in the case of signed zeros.
26348
26349      Fortunately we know that if FMA is supported that FNMSUB is
26350      also supported in the ISA.  Just expand it directly.  */
26351
26352   gcc_assert (optab_handler (fma_optab, mode) != CODE_FOR_nothing);
26353
26354   r = gen_rtx_NEG (mode, a);
26355   r = gen_rtx_FMA (mode, m1, m2, r);
26356   r = gen_rtx_NEG (mode, r);
26357   emit_insn (gen_rtx_SET (VOIDmode, dst, r));
26358 }
26359
26360 /* Newton-Raphson approximation of floating point divide with just 2 passes
26361    (either single precision floating point, or newer machines with higher
26362    accuracy estimates).  Support both scalar and vector divide.  Assumes no
26363    trapping math and finite arguments.  */
26364
26365 static void
26366 rs6000_emit_swdiv_high_precision (rtx dst, rtx n, rtx d)
26367 {
26368   enum machine_mode mode = GET_MODE (dst);
26369   rtx x0, e0, e1, y1, u0, v0;
26370   enum insn_code code = optab_handler (smul_optab, mode);
26371   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26372   rtx one = rs6000_load_constant_and_splat (mode, dconst1);
26373
26374   gcc_assert (code != CODE_FOR_nothing);
26375
26376   /* x0 = 1./d estimate */
26377   x0 = gen_reg_rtx (mode);
26378   emit_insn (gen_rtx_SET (VOIDmode, x0,
26379                           gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
26380                                           UNSPEC_FRES)));
26381
26382   e0 = gen_reg_rtx (mode);
26383   rs6000_emit_nmsub (e0, d, x0, one);           /* e0 = 1. - (d * x0) */
26384
26385   e1 = gen_reg_rtx (mode);
26386   rs6000_emit_madd (e1, e0, e0, e0);            /* e1 = (e0 * e0) + e0 */
26387
26388   y1 = gen_reg_rtx (mode);
26389   rs6000_emit_madd (y1, e1, x0, x0);            /* y1 = (e1 * x0) + x0 */
26390
26391   u0 = gen_reg_rtx (mode);
26392   emit_insn (gen_mul (u0, n, y1));              /* u0 = n * y1 */
26393
26394   v0 = gen_reg_rtx (mode);
26395   rs6000_emit_nmsub (v0, d, u0, n);             /* v0 = n - (d * u0) */
26396
26397   rs6000_emit_madd (dst, v0, y1, u0);           /* dst = (v0 * y1) + u0 */
26398 }
26399
26400 /* Newton-Raphson approximation of floating point divide that has a low
26401    precision estimate.  Assumes no trapping math and finite arguments.  */
26402
26403 static void
26404 rs6000_emit_swdiv_low_precision (rtx dst, rtx n, rtx d)
26405 {
26406   enum machine_mode mode = GET_MODE (dst);
26407   rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
26408   enum insn_code code = optab_handler (smul_optab, mode);
26409   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26410
26411   gcc_assert (code != CODE_FOR_nothing);
26412
26413   one = rs6000_load_constant_and_splat (mode, dconst1);
26414
26415   /* x0 = 1./d estimate */
26416   x0 = gen_reg_rtx (mode);
26417   emit_insn (gen_rtx_SET (VOIDmode, x0,
26418                           gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
26419                                           UNSPEC_FRES)));
26420
26421   e0 = gen_reg_rtx (mode);
26422   rs6000_emit_nmsub (e0, d, x0, one);           /* e0 = 1. - d * x0 */
26423
26424   y1 = gen_reg_rtx (mode);
26425   rs6000_emit_madd (y1, e0, x0, x0);            /* y1 = x0 + e0 * x0 */
26426
26427   e1 = gen_reg_rtx (mode);
26428   emit_insn (gen_mul (e1, e0, e0));             /* e1 = e0 * e0 */
26429
26430   y2 = gen_reg_rtx (mode);
26431   rs6000_emit_madd (y2, e1, y1, y1);            /* y2 = y1 + e1 * y1 */
26432
26433   e2 = gen_reg_rtx (mode);
26434   emit_insn (gen_mul (e2, e1, e1));             /* e2 = e1 * e1 */
26435
26436   y3 = gen_reg_rtx (mode);
26437   rs6000_emit_madd (y3, e2, y2, y2);            /* y3 = y2 + e2 * y2 */
26438
26439   u0 = gen_reg_rtx (mode);
26440   emit_insn (gen_mul (u0, n, y3));              /* u0 = n * y3 */
26441
26442   v0 = gen_reg_rtx (mode);
26443   rs6000_emit_nmsub (v0, d, u0, n);             /* v0 = n - d * u0 */
26444
26445   rs6000_emit_madd (dst, v0, y3, u0);           /* dst = u0 + v0 * y3 */
26446 }
26447
26448 /* Newton-Raphson approximation of floating point divide DST = N/D.  If NOTE_P,
26449    add a reg_note saying that this was a division.  Support both scalar and
26450    vector divide.  Assumes no trapping math and finite arguments.  */
26451
26452 void
26453 rs6000_emit_swdiv (rtx dst, rtx n, rtx d, bool note_p)
26454 {
26455   enum machine_mode mode = GET_MODE (dst);
26456
26457   if (RS6000_RECIP_HIGH_PRECISION_P (mode))
26458     rs6000_emit_swdiv_high_precision (dst, n, d);
26459   else
26460     rs6000_emit_swdiv_low_precision (dst, n, d);
26461
26462   if (note_p)
26463     add_reg_note (get_last_insn (), REG_EQUAL, gen_rtx_DIV (mode, n, d));
26464 }
26465
26466 /* Newton-Raphson approximation of single/double-precision floating point
26467    rsqrt.  Assumes no trapping math and finite arguments.  */
26468
26469 void
26470 rs6000_emit_swrsqrt (rtx dst, rtx src)
26471 {
26472   enum machine_mode mode = GET_MODE (src);
26473   rtx x0 = gen_reg_rtx (mode);
26474   rtx y = gen_reg_rtx (mode);
26475   int passes = (TARGET_RECIP_PRECISION) ? 2 : 3;
26476   REAL_VALUE_TYPE dconst3_2;
26477   int i;
26478   rtx halfthree;
26479   enum insn_code code = optab_handler (smul_optab, mode);
26480   gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26481
26482   gcc_assert (code != CODE_FOR_nothing);
26483
26484   /* Load up the constant 1.5 either as a scalar, or as a vector.  */
26485   real_from_integer (&dconst3_2, VOIDmode, 3, 0, 0);
26486   SET_REAL_EXP (&dconst3_2, REAL_EXP (&dconst3_2) - 1);
26487
26488   halfthree = rs6000_load_constant_and_splat (mode, dconst3_2);
26489
26490   /* x0 = rsqrt estimate */
26491   emit_insn (gen_rtx_SET (VOIDmode, x0,
26492                           gen_rtx_UNSPEC (mode, gen_rtvec (1, src),
26493                                           UNSPEC_RSQRT)));
26494
26495   /* y = 0.5 * src = 1.5 * src - src -> fewer constants */
26496   rs6000_emit_msub (y, src, halfthree, src);
26497
26498   for (i = 0; i < passes; i++)
26499     {
26500       rtx x1 = gen_reg_rtx (mode);
26501       rtx u = gen_reg_rtx (mode);
26502       rtx v = gen_reg_rtx (mode);
26503
26504       /* x1 = x0 * (1.5 - y * (x0 * x0)) */
26505       emit_insn (gen_mul (u, x0, x0));
26506       rs6000_emit_nmsub (v, y, u, halfthree);
26507       emit_insn (gen_mul (x1, x0, v));
26508       x0 = x1;
26509     }
26510
26511   emit_move_insn (dst, x0);
26512   return;
26513 }
26514
26515 /* Emit popcount intrinsic on TARGET_POPCNTB (Power5) and TARGET_POPCNTD
26516    (Power7) targets.  DST is the target, and SRC is the argument operand.  */
26517
26518 void
26519 rs6000_emit_popcount (rtx dst, rtx src)
26520 {
26521   enum machine_mode mode = GET_MODE (dst);
26522   rtx tmp1, tmp2;
26523
26524   /* Use the PPC ISA 2.06 popcnt{w,d} instruction if we can.  */
26525   if (TARGET_POPCNTD)
26526     {
26527       if (mode == SImode)
26528         emit_insn (gen_popcntdsi2 (dst, src));
26529       else
26530         emit_insn (gen_popcntddi2 (dst, src));
26531       return;
26532     }
26533
26534   tmp1 = gen_reg_rtx (mode);
26535
26536   if (mode == SImode)
26537     {
26538       emit_insn (gen_popcntbsi2 (tmp1, src));
26539       tmp2 = expand_mult (SImode, tmp1, GEN_INT (0x01010101),
26540                            NULL_RTX, 0);
26541       tmp2 = force_reg (SImode, tmp2);
26542       emit_insn (gen_lshrsi3 (dst, tmp2, GEN_INT (24)));
26543     }
26544   else
26545     {
26546       emit_insn (gen_popcntbdi2 (tmp1, src));
26547       tmp2 = expand_mult (DImode, tmp1,
26548                           GEN_INT ((HOST_WIDE_INT)
26549                                    0x01010101 << 32 | 0x01010101),
26550                           NULL_RTX, 0);
26551       tmp2 = force_reg (DImode, tmp2);
26552       emit_insn (gen_lshrdi3 (dst, tmp2, GEN_INT (56)));
26553     }
26554 }
26555
26556
26557 /* Emit parity intrinsic on TARGET_POPCNTB targets.  DST is the
26558    target, and SRC is the argument operand.  */
26559
26560 void
26561 rs6000_emit_parity (rtx dst, rtx src)
26562 {
26563   enum machine_mode mode = GET_MODE (dst);
26564   rtx tmp;
26565
26566   tmp = gen_reg_rtx (mode);
26567
26568   /* Use the PPC ISA 2.05 prtyw/prtyd instruction if we can.  */
26569   if (TARGET_CMPB)
26570     {
26571       if (mode == SImode)
26572         {
26573           emit_insn (gen_popcntbsi2 (tmp, src));
26574           emit_insn (gen_paritysi2_cmpb (dst, tmp));
26575         }
26576       else
26577         {
26578           emit_insn (gen_popcntbdi2 (tmp, src));
26579           emit_insn (gen_paritydi2_cmpb (dst, tmp));
26580         }
26581       return;
26582     }
26583
26584   if (mode == SImode)
26585     {
26586       /* Is mult+shift >= shift+xor+shift+xor?  */
26587       if (rs6000_cost->mulsi_const >= COSTS_N_INSNS (3))
26588         {
26589           rtx tmp1, tmp2, tmp3, tmp4;
26590
26591           tmp1 = gen_reg_rtx (SImode);
26592           emit_insn (gen_popcntbsi2 (tmp1, src));
26593
26594           tmp2 = gen_reg_rtx (SImode);
26595           emit_insn (gen_lshrsi3 (tmp2, tmp1, GEN_INT (16)));
26596           tmp3 = gen_reg_rtx (SImode);
26597           emit_insn (gen_xorsi3 (tmp3, tmp1, tmp2));
26598
26599           tmp4 = gen_reg_rtx (SImode);
26600           emit_insn (gen_lshrsi3 (tmp4, tmp3, GEN_INT (8)));
26601           emit_insn (gen_xorsi3 (tmp, tmp3, tmp4));
26602         }
26603       else
26604         rs6000_emit_popcount (tmp, src);
26605       emit_insn (gen_andsi3 (dst, tmp, const1_rtx));
26606     }
26607   else
26608     {
26609       /* Is mult+shift >= shift+xor+shift+xor+shift+xor?  */
26610       if (rs6000_cost->muldi >= COSTS_N_INSNS (5))
26611         {
26612           rtx tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
26613
26614           tmp1 = gen_reg_rtx (DImode);
26615           emit_insn (gen_popcntbdi2 (tmp1, src));
26616
26617           tmp2 = gen_reg_rtx (DImode);
26618           emit_insn (gen_lshrdi3 (tmp2, tmp1, GEN_INT (32)));
26619           tmp3 = gen_reg_rtx (DImode);
26620           emit_insn (gen_xordi3 (tmp3, tmp1, tmp2));
26621
26622           tmp4 = gen_reg_rtx (DImode);
26623           emit_insn (gen_lshrdi3 (tmp4, tmp3, GEN_INT (16)));
26624           tmp5 = gen_reg_rtx (DImode);
26625           emit_insn (gen_xordi3 (tmp5, tmp3, tmp4));
26626
26627           tmp6 = gen_reg_rtx (DImode);
26628           emit_insn (gen_lshrdi3 (tmp6, tmp5, GEN_INT (8)));
26629           emit_insn (gen_xordi3 (tmp, tmp5, tmp6));
26630         }
26631       else
26632         rs6000_emit_popcount (tmp, src);
26633       emit_insn (gen_anddi3 (dst, tmp, const1_rtx));
26634     }
26635 }
26636
26637 /* Return an RTX representing where to find the function value of a
26638    function returning MODE.  */
26639 static rtx
26640 rs6000_complex_function_value (enum machine_mode mode)
26641 {
26642   unsigned int regno;
26643   rtx r1, r2;
26644   enum machine_mode inner = GET_MODE_INNER (mode);
26645   unsigned int inner_bytes = GET_MODE_SIZE (inner);
26646
26647   if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
26648     regno = FP_ARG_RETURN;
26649   else
26650     {
26651       regno = GP_ARG_RETURN;
26652
26653       /* 32-bit is OK since it'll go in r3/r4.  */
26654       if (TARGET_32BIT && inner_bytes >= 4)
26655         return gen_rtx_REG (mode, regno);
26656     }
26657
26658   if (inner_bytes >= 8)
26659     return gen_rtx_REG (mode, regno);
26660
26661   r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
26662                           const0_rtx);
26663   r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
26664                           GEN_INT (inner_bytes));
26665   return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
26666 }
26667
26668 /* Target hook for TARGET_FUNCTION_VALUE.
26669
26670    On the SPE, both FPs and vectors are returned in r3.
26671
26672    On RS/6000 an integer value is in r3 and a floating-point value is in
26673    fp1, unless -msoft-float.  */
26674
26675 rtx
26676 rs6000_function_value (const_tree valtype,
26677                        const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
26678                        bool outgoing ATTRIBUTE_UNUSED)
26679 {
26680   enum machine_mode mode;
26681   unsigned int regno;
26682
26683   /* Special handling for structs in darwin64.  */
26684   if (TARGET_MACHO 
26685       && rs6000_darwin64_struct_check_p (TYPE_MODE (valtype), valtype))
26686     {
26687       CUMULATIVE_ARGS valcum;
26688       rtx valret;
26689
26690       valcum.words = 0;
26691       valcum.fregno = FP_ARG_MIN_REG;
26692       valcum.vregno = ALTIVEC_ARG_MIN_REG;
26693       /* Do a trial code generation as if this were going to be passed as
26694          an argument; if any part goes in memory, we return NULL.  */
26695       valret = rs6000_darwin64_record_arg (&valcum, valtype, true, /* retval= */ true);
26696       if (valret)
26697         return valret;
26698       /* Otherwise fall through to standard ABI rules.  */
26699     }
26700
26701   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DImode)
26702     {
26703       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
26704       return gen_rtx_PARALLEL (DImode,
26705         gen_rtvec (2,
26706                    gen_rtx_EXPR_LIST (VOIDmode,
26707                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
26708                                       const0_rtx),
26709                    gen_rtx_EXPR_LIST (VOIDmode,
26710                                       gen_rtx_REG (SImode,
26711                                                    GP_ARG_RETURN + 1),
26712                                       GEN_INT (4))));
26713     }
26714   if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DCmode)
26715     {
26716       return gen_rtx_PARALLEL (DCmode,
26717         gen_rtvec (4,
26718                    gen_rtx_EXPR_LIST (VOIDmode,
26719                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
26720                                       const0_rtx),
26721                    gen_rtx_EXPR_LIST (VOIDmode,
26722                                       gen_rtx_REG (SImode,
26723                                                    GP_ARG_RETURN + 1),
26724                                       GEN_INT (4)),
26725                    gen_rtx_EXPR_LIST (VOIDmode,
26726                                       gen_rtx_REG (SImode,
26727                                                    GP_ARG_RETURN + 2),
26728                                       GEN_INT (8)),
26729                    gen_rtx_EXPR_LIST (VOIDmode,
26730                                       gen_rtx_REG (SImode,
26731                                                    GP_ARG_RETURN + 3),
26732                                       GEN_INT (12))));
26733     }
26734
26735   mode = TYPE_MODE (valtype);
26736   if ((INTEGRAL_TYPE_P (valtype) && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
26737       || POINTER_TYPE_P (valtype))
26738     mode = TARGET_32BIT ? SImode : DImode;
26739
26740   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
26741     /* _Decimal128 must use an even/odd register pair.  */
26742     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
26743   else if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS
26744            && ((TARGET_SINGLE_FLOAT && (mode == SFmode)) || TARGET_DOUBLE_FLOAT))
26745     regno = FP_ARG_RETURN;
26746   else if (TREE_CODE (valtype) == COMPLEX_TYPE
26747            && targetm.calls.split_complex_arg)
26748     return rs6000_complex_function_value (mode);
26749   /* VSX is a superset of Altivec and adds V2DImode/V2DFmode.  Since the same
26750      return register is used in both cases, and we won't see V2DImode/V2DFmode
26751      for pure altivec, combine the two cases.  */
26752   else if (TREE_CODE (valtype) == VECTOR_TYPE
26753            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
26754            && ALTIVEC_OR_VSX_VECTOR_MODE (mode))
26755     regno = ALTIVEC_ARG_RETURN;
26756   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
26757            && (mode == DFmode || mode == DCmode
26758                || mode == TFmode || mode == TCmode))
26759     return spe_build_register_parallel (mode, GP_ARG_RETURN);
26760   else
26761     regno = GP_ARG_RETURN;
26762
26763   return gen_rtx_REG (mode, regno);
26764 }
26765
26766 /* Define how to find the value returned by a library function
26767    assuming the value has mode MODE.  */
26768 rtx
26769 rs6000_libcall_value (enum machine_mode mode)
26770 {
26771   unsigned int regno;
26772
26773   if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
26774     {
26775       /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
26776       return gen_rtx_PARALLEL (DImode,
26777         gen_rtvec (2,
26778                    gen_rtx_EXPR_LIST (VOIDmode,
26779                                       gen_rtx_REG (SImode, GP_ARG_RETURN),
26780                                       const0_rtx),
26781                    gen_rtx_EXPR_LIST (VOIDmode,
26782                                       gen_rtx_REG (SImode,
26783                                                    GP_ARG_RETURN + 1),
26784                                       GEN_INT (4))));
26785     }
26786
26787   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
26788     /* _Decimal128 must use an even/odd register pair.  */
26789     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
26790   else if (SCALAR_FLOAT_MODE_P (mode)
26791            && TARGET_HARD_FLOAT && TARGET_FPRS
26792            && ((TARGET_SINGLE_FLOAT && mode == SFmode) || TARGET_DOUBLE_FLOAT))
26793     regno = FP_ARG_RETURN;
26794   /* VSX is a superset of Altivec and adds V2DImode/V2DFmode.  Since the same
26795      return register is used in both cases, and we won't see V2DImode/V2DFmode
26796      for pure altivec, combine the two cases.  */
26797   else if (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
26798            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
26799     regno = ALTIVEC_ARG_RETURN;
26800   else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
26801     return rs6000_complex_function_value (mode);
26802   else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
26803            && (mode == DFmode || mode == DCmode
26804                || mode == TFmode || mode == TCmode))
26805     return spe_build_register_parallel (mode, GP_ARG_RETURN);
26806   else
26807     regno = GP_ARG_RETURN;
26808
26809   return gen_rtx_REG (mode, regno);
26810 }
26811
26812
26813 /* Given FROM and TO register numbers, say whether this elimination is allowed.
26814    Frame pointer elimination is automatically handled.
26815
26816    For the RS/6000, if frame pointer elimination is being done, we would like
26817    to convert ap into fp, not sp.
26818
26819    We need r30 if -mminimal-toc was specified, and there are constant pool
26820    references.  */
26821
26822 bool
26823 rs6000_can_eliminate (const int from, const int to)
26824 {
26825   return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
26826           ? ! frame_pointer_needed
26827           : from == RS6000_PIC_OFFSET_TABLE_REGNUM
26828             ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC || get_pool_size () == 0
26829             : true);
26830 }
26831
26832 /* Define the offset between two registers, FROM to be eliminated and its
26833    replacement TO, at the start of a routine.  */
26834 HOST_WIDE_INT
26835 rs6000_initial_elimination_offset (int from, int to)
26836 {
26837   rs6000_stack_t *info = rs6000_stack_info ();
26838   HOST_WIDE_INT offset;
26839
26840   if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
26841     offset = info->push_p ? 0 : -info->total_size;
26842   else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
26843     {
26844       offset = info->push_p ? 0 : -info->total_size;
26845       if (FRAME_GROWS_DOWNWARD)
26846         offset += info->fixed_size + info->vars_size + info->parm_size;
26847     }
26848   else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
26849     offset = FRAME_GROWS_DOWNWARD
26850              ? info->fixed_size + info->vars_size + info->parm_size
26851              : 0;
26852   else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
26853     offset = info->total_size;
26854   else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
26855     offset = info->push_p ? info->total_size : 0;
26856   else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
26857     offset = 0;
26858   else
26859     gcc_unreachable ();
26860
26861   return offset;
26862 }
26863
26864 static rtx
26865 rs6000_dwarf_register_span (rtx reg)
26866 {
26867   rtx parts[8];
26868   int i, words;
26869   unsigned regno = REGNO (reg);
26870   enum machine_mode mode = GET_MODE (reg);
26871
26872   if (TARGET_SPE
26873       && regno < 32
26874       && (SPE_VECTOR_MODE (GET_MODE (reg))
26875           || (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode)
26876               && mode != SFmode && mode != SDmode && mode != SCmode)))
26877     ;
26878   else
26879     return NULL_RTX;
26880
26881   regno = REGNO (reg);
26882
26883   /* The duality of the SPE register size wreaks all kinds of havoc.
26884      This is a way of distinguishing r0 in 32-bits from r0 in
26885      64-bits.  */
26886   words = (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
26887   gcc_assert (words <= 4);
26888   for (i = 0; i < words; i++, regno++)
26889     {
26890       if (BYTES_BIG_ENDIAN)
26891         {
26892           parts[2 * i] = gen_rtx_REG (SImode, regno + 1200);
26893           parts[2 * i + 1] = gen_rtx_REG (SImode, regno);
26894         }
26895       else
26896         {
26897           parts[2 * i] = gen_rtx_REG (SImode, regno);
26898           parts[2 * i + 1] = gen_rtx_REG (SImode, regno + 1200);
26899         }
26900     }
26901
26902   return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (words * 2, parts));
26903 }
26904
26905 /* Fill in sizes for SPE register high parts in table used by unwinder.  */
26906
26907 static void
26908 rs6000_init_dwarf_reg_sizes_extra (tree address)
26909 {
26910   if (TARGET_SPE)
26911     {
26912       int i;
26913       enum machine_mode mode = TYPE_MODE (char_type_node);
26914       rtx addr = expand_expr (address, NULL_RTX, VOIDmode, EXPAND_NORMAL);
26915       rtx mem = gen_rtx_MEM (BLKmode, addr);
26916       rtx value = gen_int_mode (4, mode);
26917
26918       for (i = 1201; i < 1232; i++)
26919         {
26920           int column = DWARF_REG_TO_UNWIND_COLUMN (i);
26921           HOST_WIDE_INT offset
26922             = DWARF_FRAME_REGNUM (column) * GET_MODE_SIZE (mode);
26923
26924           emit_move_insn (adjust_address (mem, mode, offset), value);
26925         }
26926     }
26927 }
26928
26929 /* Map internal gcc register numbers to DWARF2 register numbers.  */
26930
26931 unsigned int
26932 rs6000_dbx_register_number (unsigned int regno)
26933 {
26934   if (regno <= 63 || write_symbols != DWARF2_DEBUG)
26935     return regno;
26936   if (regno == MQ_REGNO)
26937     return 100;
26938   if (regno == LR_REGNO)
26939     return 108;
26940   if (regno == CTR_REGNO)
26941     return 109;
26942   if (CR_REGNO_P (regno))
26943     return regno - CR0_REGNO + 86;
26944   if (regno == CA_REGNO)
26945     return 101;  /* XER */
26946   if (ALTIVEC_REGNO_P (regno))
26947     return regno - FIRST_ALTIVEC_REGNO + 1124;
26948   if (regno == VRSAVE_REGNO)
26949     return 356;
26950   if (regno == VSCR_REGNO)
26951     return 67;
26952   if (regno == SPE_ACC_REGNO)
26953     return 99;
26954   if (regno == SPEFSCR_REGNO)
26955     return 612;
26956   /* SPE high reg number.  We get these values of regno from
26957      rs6000_dwarf_register_span.  */
26958   gcc_assert (regno >= 1200 && regno < 1232);
26959   return regno;
26960 }
26961
26962 /* target hook eh_return_filter_mode */
26963 static enum machine_mode
26964 rs6000_eh_return_filter_mode (void)
26965 {
26966   return TARGET_32BIT ? SImode : word_mode;
26967 }
26968
26969 /* Target hook for scalar_mode_supported_p.  */
26970 static bool
26971 rs6000_scalar_mode_supported_p (enum machine_mode mode)
26972 {
26973   if (DECIMAL_FLOAT_MODE_P (mode))
26974     return default_decimal_float_supported_p ();
26975   else
26976     return default_scalar_mode_supported_p (mode);
26977 }
26978
26979 /* Target hook for vector_mode_supported_p.  */
26980 static bool
26981 rs6000_vector_mode_supported_p (enum machine_mode mode)
26982 {
26983
26984   if (TARGET_PAIRED_FLOAT && PAIRED_VECTOR_MODE (mode))
26985     return true;
26986
26987   if (TARGET_SPE && SPE_VECTOR_MODE (mode))
26988     return true;
26989
26990   else if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
26991     return true;
26992
26993   else
26994     return false;
26995 }
26996
26997 /* Target hook for invalid_arg_for_unprototyped_fn. */
26998 static const char *
26999 invalid_arg_for_unprototyped_fn (const_tree typelist, const_tree funcdecl, const_tree val)
27000 {
27001   return (!rs6000_darwin64_abi
27002           && typelist == 0
27003           && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
27004           && (funcdecl == NULL_TREE
27005               || (TREE_CODE (funcdecl) == FUNCTION_DECL
27006                   && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
27007           ? N_("AltiVec argument passed to unprototyped function")
27008           : NULL;
27009 }
27010
27011 /* For TARGET_SECURE_PLT 32-bit PIC code we can save PIC register
27012    setup by using __stack_chk_fail_local hidden function instead of
27013    calling __stack_chk_fail directly.  Otherwise it is better to call
27014    __stack_chk_fail directly.  */
27015
27016 static tree ATTRIBUTE_UNUSED
27017 rs6000_stack_protect_fail (void)
27018 {
27019   return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
27020          ? default_hidden_stack_protect_fail ()
27021          : default_external_stack_protect_fail ();
27022 }
27023
27024 void
27025 rs6000_final_prescan_insn (rtx insn, rtx *operand ATTRIBUTE_UNUSED,
27026                            int num_operands ATTRIBUTE_UNUSED)
27027 {
27028   if (rs6000_warn_cell_microcode)
27029     {
27030       const char *temp;
27031       int insn_code_number = recog_memoized (insn);
27032       location_t location = locator_location (INSN_LOCATOR (insn));
27033
27034       /* Punt on insns we cannot recognize.  */
27035       if (insn_code_number < 0)
27036         return;
27037
27038       temp = get_insn_template (insn_code_number, insn);
27039
27040       if (get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS)
27041         warning_at (location, OPT_mwarn_cell_microcode,
27042                     "emitting microcode insn %s\t[%s] #%d",
27043                     temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn)); 
27044       else if (get_attr_cell_micro (insn) == CELL_MICRO_CONDITIONAL)
27045         warning_at (location, OPT_mwarn_cell_microcode,
27046                     "emitting conditional microcode insn %s\t[%s] #%d",
27047                     temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn));
27048     }
27049 }
27050
27051 \f
27052 /* Mask options that we want to support inside of attribute((target)) and
27053    #pragma GCC target operations.  Note, we do not include things like
27054    64/32-bit, endianess, hard/soft floating point, etc. that would have
27055    different calling sequences.  */
27056
27057 struct rs6000_opt_mask {
27058   const char *name;             /* option name */
27059   int mask;                     /* mask to set */
27060   bool invert;                  /* invert sense of mask */
27061   bool valid_target;            /* option is a target option */
27062 };
27063
27064 static struct rs6000_opt_mask const rs6000_opt_masks[] =
27065 {
27066   { "altivec",          MASK_ALTIVEC,           false, true  },
27067   { "cmpb",             MASK_CMPB,              false, true  },
27068   { "dlmzb",            MASK_DLMZB,             false, true  },
27069   { "fprnd",            MASK_FPRND,             false, true  },
27070   { "hard-dfp",         MASK_DFP,               false, true  },
27071   { "isel",             MASK_ISEL,              false, true  },
27072   { "mfcrf",            MASK_MFCRF,             false, true  },
27073   { "mfpgpr",           MASK_MFPGPR,            false, true  },
27074   { "mulhw",            MASK_MULHW,             false, true  },
27075   { "multiple",         MASK_MULTIPLE,          false, true  },
27076   { "update",           MASK_NO_UPDATE,         true , true  },
27077   { "popcntb",          MASK_POPCNTB,           false, true  },
27078   { "popcntd",          MASK_POPCNTD,           false, true  },
27079   { "powerpc-gfxopt",   MASK_PPC_GFXOPT,        false, true  },
27080   { "powerpc-gpopt",    MASK_PPC_GPOPT,         false, true  },
27081   { "recip-precision",  MASK_RECIP_PRECISION,   false, true  },
27082   { "string",           MASK_STRING,            false, true  },
27083   { "vsx",              MASK_VSX,               false, true  },
27084 #ifdef MASK_64BIT
27085 #if TARGET_AIX_OS
27086   { "aix64",            MASK_64BIT,             false, false },
27087   { "aix32",            MASK_64BIT,             true,  false },
27088 #else
27089   { "64",               MASK_64BIT,             false, false },
27090   { "32",               MASK_64BIT,             true,  false },
27091 #endif
27092 #endif
27093 #ifdef MASK_EABI
27094   { "eabi",             MASK_EABI,              false, false },
27095 #endif
27096 #ifdef MASK_LITTLE_ENDIAN
27097   { "little",           MASK_LITTLE_ENDIAN,     false, false },
27098   { "big",              MASK_LITTLE_ENDIAN,     true,  false },
27099 #endif
27100 #ifdef MASK_RELOCATABLE
27101   { "relocatable",      MASK_RELOCATABLE,       false, false },
27102 #endif
27103 #ifdef MASK_STRICT_ALIGN
27104   { "strict-align",     MASK_STRICT_ALIGN,      false, false },
27105 #endif
27106   { "power",            MASK_POWER,             false, false },
27107   { "power2",           MASK_POWER2,            false, false },
27108   { "powerpc",          MASK_POWERPC,           false, false },
27109   { "soft-float",       MASK_SOFT_FLOAT,        false, false },
27110   { "string",           MASK_STRING,            false, false },
27111 };
27112
27113 /* Option variables that we want to support inside attribute((target)) and
27114    #pragma GCC target operations.  */
27115
27116 struct rs6000_opt_var {
27117   const char *name;             /* option name */
27118   size_t global_offset;         /* offset of the option in global_options.  */
27119   size_t target_offset;         /* offset of the option in target optiosn.  */
27120 };
27121
27122 static struct rs6000_opt_var const rs6000_opt_vars[] =
27123 {
27124   { "friz",
27125     offsetof (struct gcc_options, x_TARGET_FRIZ),
27126     offsetof (struct cl_target_option, x_TARGET_FRIZ), },
27127   { "avoid-indexed-addresses",
27128     offsetof (struct gcc_options, x_TARGET_AVOID_XFORM),
27129     offsetof (struct cl_target_option, x_TARGET_AVOID_XFORM) },
27130   { "paired",
27131     offsetof (struct gcc_options, x_rs6000_paired_float),
27132     offsetof (struct cl_target_option, x_rs6000_paired_float), },
27133   { "longcall",
27134     offsetof (struct gcc_options, x_rs6000_default_long_calls),
27135     offsetof (struct cl_target_option, x_rs6000_default_long_calls), },
27136 };
27137
27138 /* Inner function to handle attribute((target("..."))) and #pragma GCC target
27139    parsing.  Return true if there were no errors.  */
27140
27141 static bool
27142 rs6000_inner_target_options (tree args, bool attr_p)
27143 {
27144   bool ret = true;
27145
27146   if (args == NULL_TREE)
27147     ;
27148
27149   else if (TREE_CODE (args) == STRING_CST)
27150     {
27151       char *p = ASTRDUP (TREE_STRING_POINTER (args));
27152       char *q;
27153
27154       while ((q = strtok (p, ",")) != NULL)
27155         {
27156           bool error_p = false;
27157           bool not_valid_p = false;
27158           const char *cpu_opt = NULL;
27159
27160           p = NULL;
27161           if (strncmp (q, "cpu=", 4) == 0)
27162             {
27163               int cpu_index = rs6000_cpu_name_lookup (q+4);
27164               if (cpu_index >= 0)
27165                 rs6000_cpu_index = cpu_index;
27166               else
27167                 {
27168                   error_p = true;
27169                   cpu_opt = q+4;
27170                 }
27171             }
27172           else if (strncmp (q, "tune=", 5) == 0)
27173             {
27174               int tune_index = rs6000_cpu_name_lookup (q+5);
27175               if (tune_index >= 0)
27176                 rs6000_tune_index = tune_index;
27177               else
27178                 {
27179                   error_p = true;
27180                   cpu_opt = q+5;
27181                 }
27182             }
27183           else
27184             {
27185               size_t i;
27186               bool invert = false;
27187               char *r = q;
27188
27189               error_p = true;
27190               if (strncmp (r, "no-", 3) == 0)
27191                 {
27192                   invert = true;
27193                   r += 3;
27194                 }
27195
27196               for (i = 0; i < ARRAY_SIZE (rs6000_opt_masks); i++)
27197                 if (strcmp (r, rs6000_opt_masks[i].name) == 0)
27198                   {
27199                     int mask = rs6000_opt_masks[i].mask;
27200
27201                     if (!rs6000_opt_masks[i].valid_target)
27202                       not_valid_p = true;
27203                     else
27204                       {
27205                         error_p = false;
27206                         target_flags_explicit |= mask;
27207
27208                         if (rs6000_opt_masks[i].invert)
27209                           invert = !invert;
27210
27211                         if (invert)
27212                           target_flags &= ~mask;
27213                         else
27214                           target_flags |= mask;
27215                       }
27216                     break;
27217                   }
27218
27219               if (error_p && !not_valid_p)
27220                 {
27221                   for (i = 0; i < ARRAY_SIZE (rs6000_opt_vars); i++)
27222                     if (strcmp (r, rs6000_opt_vars[i].name) == 0)
27223                       {
27224                         size_t j = rs6000_opt_vars[i].global_offset;
27225                         ((int *) &global_options)[j] = !invert;
27226                         error_p = false;
27227                         break;
27228                       }
27229                 }
27230             }
27231
27232           if (error_p)
27233             {
27234               const char *eprefix, *esuffix;
27235
27236               ret = false;
27237               if (attr_p)
27238                 {
27239                   eprefix = "__attribute__((__target__(";
27240                   esuffix = ")))";
27241                 }
27242               else
27243                 {
27244                   eprefix = "#pragma GCC target ";
27245                   esuffix = "";
27246                 }
27247
27248               if (cpu_opt)
27249                 error ("invalid cpu \"%s\" for %s\"%s\"%s", cpu_opt, eprefix,
27250                        q, esuffix);
27251               else if (not_valid_p)
27252                 error ("%s\"%s\"%s is not allowed", eprefix, q, esuffix);
27253               else
27254                 error ("%s\"%s\"%s is invalid", eprefix, q, esuffix);
27255             }
27256         }
27257     }
27258
27259   else if (TREE_CODE (args) == TREE_LIST)
27260     {
27261       do
27262         {
27263           tree value = TREE_VALUE (args);
27264           if (value)
27265             {
27266               bool ret2 = rs6000_inner_target_options (value, attr_p);
27267               if (!ret2)
27268                 ret = false;
27269             }
27270           args = TREE_CHAIN (args);
27271         }
27272       while (args != NULL_TREE);
27273     }
27274
27275   else
27276     gcc_unreachable ();
27277
27278   return ret;
27279 }
27280
27281 /* Print out the target options as a list for -mdebug=target.  */
27282
27283 static void
27284 rs6000_debug_target_options (tree args, const char *prefix)
27285 {
27286   if (args == NULL_TREE)
27287     fprintf (stderr, "%s<NULL>", prefix);
27288
27289   else if (TREE_CODE (args) == STRING_CST)
27290     {
27291       char *p = ASTRDUP (TREE_STRING_POINTER (args));
27292       char *q;
27293
27294       while ((q = strtok (p, ",")) != NULL)
27295         {
27296           p = NULL;
27297           fprintf (stderr, "%s\"%s\"", prefix, q);
27298           prefix = ", ";
27299         }
27300     }
27301
27302   else if (TREE_CODE (args) == TREE_LIST)
27303     {
27304       do
27305         {
27306           tree value = TREE_VALUE (args);
27307           if (value)
27308             {
27309               rs6000_debug_target_options (value, prefix);
27310               prefix = ", ";
27311             }
27312           args = TREE_CHAIN (args);
27313         }
27314       while (args != NULL_TREE);
27315     }
27316
27317   else
27318     gcc_unreachable ();
27319
27320   return;
27321 }
27322
27323 \f
27324 /* Hook to validate attribute((target("..."))).  */
27325
27326 static bool
27327 rs6000_valid_attribute_p (tree fndecl,
27328                           tree ARG_UNUSED (name),
27329                           tree args,
27330                           int flags)
27331 {
27332   struct cl_target_option cur_target;
27333   bool ret;
27334   tree old_optimize = build_optimization_node ();
27335   tree new_target, new_optimize;
27336   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
27337
27338   gcc_assert ((fndecl != NULL_TREE) && (args != NULL_TREE));
27339
27340   if (TARGET_DEBUG_TARGET)
27341     {
27342       tree tname = DECL_NAME (fndecl);
27343       fprintf (stderr, "\n==================== rs6000_valid_attribute_p:\n");
27344       if (tname)
27345         fprintf (stderr, "function: %.*s\n",
27346                  (int) IDENTIFIER_LENGTH (tname),
27347                  IDENTIFIER_POINTER (tname));
27348       else
27349         fprintf (stderr, "function: unknown\n");
27350   
27351       fprintf (stderr, "args:");
27352       rs6000_debug_target_options (args, " ");
27353       fprintf (stderr, "\n");
27354
27355       if (flags)
27356         fprintf (stderr, "flags: 0x%x\n", flags);
27357
27358       fprintf (stderr, "--------------------\n");
27359     }
27360
27361   old_optimize = build_optimization_node ();
27362   func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
27363
27364   /* If the function changed the optimization levels as well as setting target
27365      options, start with the optimizations specified.  */
27366   if (func_optimize && func_optimize != old_optimize)
27367     cl_optimization_restore (&global_options,
27368                              TREE_OPTIMIZATION (func_optimize));
27369
27370   /* The target attributes may also change some optimization flags, so update
27371      the optimization options if necessary.  */
27372   cl_target_option_save (&cur_target, &global_options);
27373   rs6000_cpu_index = rs6000_tune_index = -1;
27374   ret = rs6000_inner_target_options (args, true);
27375
27376   /* Set up any additional state.  */
27377   if (ret)
27378     {
27379       ret = rs6000_option_override_internal (false);
27380       new_target = build_target_option_node ();
27381     }
27382   else
27383     new_target = NULL;
27384
27385   new_optimize = build_optimization_node ();
27386
27387   if (!new_target)
27388     ret = false;
27389
27390   else if (fndecl)
27391     {
27392       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
27393
27394       if (old_optimize != new_optimize)
27395         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
27396     }
27397
27398   cl_target_option_restore (&global_options, &cur_target);
27399
27400   if (old_optimize != new_optimize)
27401     cl_optimization_restore (&global_options,
27402                              TREE_OPTIMIZATION (old_optimize));
27403
27404   return ret;
27405 }
27406
27407 \f
27408 /* Hook to validate the current #pragma GCC target and set the state, and
27409    update the macros based on what was changed.  If ARGS is NULL, then
27410    POP_TARGET is used to reset the options.  */
27411
27412 bool
27413 rs6000_pragma_target_parse (tree args, tree pop_target)
27414 {
27415   tree cur_tree;
27416   bool ret;
27417
27418   if (TARGET_DEBUG_TARGET)
27419     {
27420       fprintf (stderr, "\n==================== rs6000_pragma_target_parse\n");
27421       fprintf (stderr, "args:");
27422       rs6000_debug_target_options (args, " ");
27423       fprintf (stderr, "\n");
27424
27425       if (pop_target)
27426         {
27427           fprintf (stderr, "pop_target:\n");
27428           debug_tree (pop_target);
27429         }
27430       else
27431         fprintf (stderr, "pop_target: <NULL>\n");
27432
27433       fprintf (stderr, "--------------------\n");
27434     }
27435
27436   if (! args)
27437     {
27438       ret = true;
27439       cur_tree = ((pop_target)
27440                   ? pop_target
27441                   : target_option_default_node);
27442       cl_target_option_restore (&global_options,
27443                                 TREE_TARGET_OPTION (cur_tree));
27444     }
27445   else
27446     {
27447       rs6000_cpu_index = rs6000_tune_index = -1;
27448       ret = rs6000_inner_target_options (args, false);
27449       cur_tree = build_target_option_node ();
27450
27451       if (!cur_tree)
27452         ret = false;
27453     }
27454
27455   if (cur_tree)
27456     target_option_current_node = cur_tree;
27457
27458   return ret;
27459 }
27460
27461 \f
27462 /* Remember the last target of rs6000_set_current_function.  */
27463 static GTY(()) tree rs6000_previous_fndecl;
27464
27465 /* Establish appropriate back-end context for processing the function
27466    FNDECL.  The argument might be NULL to indicate processing at top
27467    level, outside of any function scope.  */
27468 static void
27469 rs6000_set_current_function (tree fndecl)
27470 {
27471   tree old_tree = (rs6000_previous_fndecl
27472                    ? DECL_FUNCTION_SPECIFIC_TARGET (rs6000_previous_fndecl)
27473                    : NULL_TREE);
27474
27475   tree new_tree = (fndecl
27476                    ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
27477                    : NULL_TREE);
27478
27479   if (TARGET_DEBUG_TARGET)
27480     {
27481       bool print_final = false;
27482       fprintf (stderr, "\n==================== rs6000_set_current_function");
27483
27484       if (fndecl)
27485         fprintf (stderr, ", fndecl %s (%p)",
27486                  (DECL_NAME (fndecl)
27487                   ? IDENTIFIER_POINTER (DECL_NAME (fndecl))
27488                   : "<unknown>"), (void *)fndecl);
27489
27490       if (rs6000_previous_fndecl)
27491         fprintf (stderr, ", prev_fndecl (%p)", (void *)rs6000_previous_fndecl);
27492
27493       fprintf (stderr, "\n");
27494       if (new_tree)
27495         {
27496           fprintf (stderr, "\nnew fndecl target specific options:\n");
27497           debug_tree (new_tree);
27498           print_final = true;
27499         }
27500
27501       if (old_tree)
27502         {
27503           fprintf (stderr, "\nold fndecl target specific options:\n");
27504           debug_tree (old_tree);
27505           print_final = true;
27506         }
27507
27508       if (print_final)
27509         fprintf (stderr, "--------------------\n");
27510     }
27511
27512   /* Only change the context if the function changes.  This hook is called
27513      several times in the course of compiling a function, and we don't want to
27514      slow things down too much or call target_reinit when it isn't safe.  */
27515   if (fndecl && fndecl != rs6000_previous_fndecl)
27516     {
27517       rs6000_previous_fndecl = fndecl;
27518       if (old_tree == new_tree)
27519         ;
27520
27521       else if (new_tree)
27522         {
27523           cl_target_option_restore (&global_options,
27524                                     TREE_TARGET_OPTION (new_tree));
27525           target_reinit ();
27526         }
27527
27528       else if (old_tree)
27529         {
27530           struct cl_target_option *def
27531             = TREE_TARGET_OPTION (target_option_current_node);
27532
27533           cl_target_option_restore (&global_options, def);
27534           target_reinit ();
27535         }
27536     }
27537 }
27538
27539 \f
27540 /* Save the current options */
27541
27542 static void
27543 rs6000_function_specific_save (struct cl_target_option *ptr)
27544 {
27545   ptr->rs6000_target_flags_explicit = target_flags_explicit;
27546 }
27547
27548 /* Restore the current options */
27549
27550 static void
27551 rs6000_function_specific_restore (struct cl_target_option *ptr)
27552 {
27553   target_flags_explicit = ptr->rs6000_target_flags_explicit;
27554   (void) rs6000_option_override_internal (false);
27555 }
27556
27557 /* Print the current options */
27558
27559 static void
27560 rs6000_function_specific_print (FILE *file, int indent,
27561                                 struct cl_target_option *ptr)
27562 {
27563   size_t i;
27564   int flags = ptr->x_target_flags;
27565
27566   /* Print the various mask options.  */
27567   for (i = 0; i < ARRAY_SIZE (rs6000_opt_masks); i++)
27568     if ((flags & rs6000_opt_masks[i].mask) != 0)
27569       {
27570         flags &= ~ rs6000_opt_masks[i].mask;
27571         fprintf (file, "%*s-m%s%s\n", indent, "",
27572                  rs6000_opt_masks[i].invert ? "no-" : "",
27573                  rs6000_opt_masks[i].name);
27574       }
27575
27576   /* Print the various options that are variables.  */
27577   for (i = 0; i < ARRAY_SIZE (rs6000_opt_vars); i++)
27578     {
27579       size_t j = rs6000_opt_vars[i].target_offset;
27580       if (((signed char *) ptr)[j])
27581         fprintf (file, "%*s-m%s\n", indent, "",
27582                  rs6000_opt_vars[i].name);
27583     }
27584 }
27585
27586 \f
27587 /* Hook to determine if one function can safely inline another.  */
27588
27589 static bool
27590 rs6000_can_inline_p (tree caller, tree callee)
27591 {
27592   bool ret = false;
27593   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
27594   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
27595
27596   /* If callee has no option attributes, then it is ok to inline.  */
27597   if (!callee_tree)
27598     ret = true;
27599
27600   /* If caller has no option attributes, but callee does then it is not ok to
27601      inline.  */
27602   else if (!caller_tree)
27603     ret = false;
27604
27605   else
27606     {
27607       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
27608       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
27609
27610       /* Callee's options should a subset of the caller's, i.e. a vsx function
27611          can inline an altivec function but a non-vsx function can't inline a
27612          vsx function.  */
27613       if ((caller_opts->x_target_flags & callee_opts->x_target_flags)
27614           == callee_opts->x_target_flags)
27615         ret = true;
27616     }
27617
27618   if (TARGET_DEBUG_TARGET)
27619     fprintf (stderr, "rs6000_can_inline_p:, caller %s, callee %s, %s inline\n",
27620              (DECL_NAME (caller)
27621               ? IDENTIFIER_POINTER (DECL_NAME (caller))
27622               : "<unknown>"),
27623              (DECL_NAME (callee)
27624               ? IDENTIFIER_POINTER (DECL_NAME (callee))
27625               : "<unknown>"),
27626              (ret ? "can" : "cannot"));
27627
27628   return ret;
27629 }
27630 \f
27631 /* Allocate a stack temp and fixup the address so it meets the particular
27632    memory requirements (either offetable or REG+REG addressing).  */
27633
27634 rtx
27635 rs6000_allocate_stack_temp (enum machine_mode mode,
27636                             bool offsettable_p,
27637                             bool reg_reg_p)
27638 {
27639   rtx stack = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
27640   rtx addr = XEXP (stack, 0);
27641   int strict_p = (reload_in_progress || reload_completed);
27642
27643   if (!legitimate_indirect_address_p (addr, strict_p))
27644     {
27645       if (offsettable_p
27646           && !rs6000_legitimate_offset_address_p (mode, addr, strict_p))
27647         stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
27648
27649       else if (reg_reg_p && !legitimate_indexed_address_p (addr, strict_p))
27650         stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
27651     }
27652
27653   return stack;
27654 }
27655
27656 /* Given a memory reference, if it is not a reg or reg+reg addressing, convert
27657    to such a form to deal with memory reference instructions like STFIWX that
27658    only take reg+reg addressing.  */
27659
27660 rtx
27661 rs6000_address_for_fpconvert (rtx x)
27662 {
27663   int strict_p = (reload_in_progress || reload_completed);
27664   rtx addr;
27665
27666   gcc_assert (MEM_P (x));
27667   addr = XEXP (x, 0);
27668   if (! legitimate_indirect_address_p (addr, strict_p)
27669       && ! legitimate_indexed_address_p (addr, strict_p))
27670     {
27671       if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
27672         {
27673           rtx reg = XEXP (addr, 0);
27674           HOST_WIDE_INT size = GET_MODE_SIZE (GET_MODE (x));
27675           rtx size_rtx = GEN_INT ((GET_CODE (addr) == PRE_DEC) ? -size : size);
27676           gcc_assert (REG_P (reg));
27677           emit_insn (gen_add3_insn (reg, reg, size_rtx));
27678           addr = reg;
27679         }
27680       else if (GET_CODE (addr) == PRE_MODIFY)
27681         {
27682           rtx reg = XEXP (addr, 0);
27683           rtx expr = XEXP (addr, 1);
27684           gcc_assert (REG_P (reg));
27685           gcc_assert (GET_CODE (expr) == PLUS);
27686           emit_insn (gen_add3_insn (reg, XEXP (expr, 0), XEXP (expr, 1)));
27687           addr = reg;
27688         }
27689
27690       x = replace_equiv_address (x, copy_addr_to_reg (addr));
27691     }
27692
27693   return x;
27694 }
27695
27696 /* Given a memory reference, if it is not in the form for altivec memory
27697    reference instructions (i.e. reg or reg+reg addressing with AND of -16),
27698    convert to the altivec format.  */
27699
27700 rtx
27701 rs6000_address_for_altivec (rtx x)
27702 {
27703   gcc_assert (MEM_P (x));
27704   if (!altivec_indexed_or_indirect_operand (x, GET_MODE (x)))
27705     {
27706       rtx addr = XEXP (x, 0);
27707       int strict_p = (reload_in_progress || reload_completed);
27708
27709       if (!legitimate_indexed_address_p (addr, strict_p)
27710           && !legitimate_indirect_address_p (addr, strict_p))
27711         addr = copy_to_mode_reg (Pmode, addr);
27712
27713       addr = gen_rtx_AND (Pmode, addr, GEN_INT (-16));
27714       x = change_address (x, GET_MODE (x), addr);
27715     }
27716
27717   return x;
27718 }
27719
27720 /* Implement TARGET_LEGITIMATE_CONSTANT_P.
27721
27722    On the RS/6000, all integer constants are acceptable, most won't be valid
27723    for particular insns, though.  Only easy FP constants are acceptable.  */
27724
27725 static bool
27726 rs6000_legitimate_constant_p (enum machine_mode mode, rtx x)
27727 {
27728   if (rs6000_tls_referenced_p (x))
27729     return false;
27730
27731   return ((GET_CODE (x) != CONST_DOUBLE && GET_CODE (x) != CONST_VECTOR)
27732           || GET_MODE (x) == VOIDmode
27733           || (TARGET_POWERPC64 && mode == DImode)
27734           || easy_fp_constant (x, mode)
27735           || easy_vector_constant (x, mode));
27736 }
27737
27738 \f
27739 /* A function pointer under AIX is a pointer to a data area whose first word
27740    contains the actual address of the function, whose second word contains a
27741    pointer to its TOC, and whose third word contains a value to place in the
27742    static chain register (r11).  Note that if we load the static chain, our
27743    "trampoline" need not have any executable code.  */
27744
27745 void
27746 rs6000_call_indirect_aix (rtx value, rtx func_desc, rtx flag)
27747 {
27748   rtx func_addr;
27749   rtx toc_reg;
27750   rtx sc_reg;
27751   rtx stack_ptr;
27752   rtx stack_toc_offset;
27753   rtx stack_toc_mem;
27754   rtx func_toc_offset;
27755   rtx func_toc_mem;
27756   rtx func_sc_offset;
27757   rtx func_sc_mem;
27758   rtx insn;
27759   rtx (*call_func) (rtx, rtx, rtx, rtx);
27760   rtx (*call_value_func) (rtx, rtx, rtx, rtx, rtx);
27761
27762   stack_ptr = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
27763   toc_reg = gen_rtx_REG (Pmode, TOC_REGNUM);
27764
27765   /* Load up address of the actual function.  */
27766   func_desc = force_reg (Pmode, func_desc);
27767   func_addr = gen_reg_rtx (Pmode);
27768   emit_move_insn (func_addr, gen_rtx_MEM (Pmode, func_desc));
27769
27770   if (TARGET_32BIT)
27771     {
27772
27773       stack_toc_offset = GEN_INT (TOC_SAVE_OFFSET_32BIT);
27774       func_toc_offset = GEN_INT (AIX_FUNC_DESC_TOC_32BIT);
27775       func_sc_offset = GEN_INT (AIX_FUNC_DESC_SC_32BIT);
27776       if (TARGET_POINTERS_TO_NESTED_FUNCTIONS)
27777         {
27778           call_func = gen_call_indirect_aix32bit;
27779           call_value_func = gen_call_value_indirect_aix32bit;
27780         }
27781       else
27782         {
27783           call_func = gen_call_indirect_aix32bit_nor11;
27784           call_value_func = gen_call_value_indirect_aix32bit_nor11;
27785         }
27786     }
27787   else
27788     {
27789       stack_toc_offset = GEN_INT (TOC_SAVE_OFFSET_64BIT);
27790       func_toc_offset = GEN_INT (AIX_FUNC_DESC_TOC_64BIT);
27791       func_sc_offset = GEN_INT (AIX_FUNC_DESC_SC_64BIT);
27792       if (TARGET_POINTERS_TO_NESTED_FUNCTIONS)
27793         {
27794           call_func = gen_call_indirect_aix64bit;
27795           call_value_func = gen_call_value_indirect_aix64bit;
27796         }
27797       else
27798         {
27799           call_func = gen_call_indirect_aix64bit_nor11;
27800           call_value_func = gen_call_value_indirect_aix64bit_nor11;
27801         }
27802     }
27803
27804   /* Reserved spot to store the TOC.  */
27805   stack_toc_mem = gen_frame_mem (Pmode,
27806                                  gen_rtx_PLUS (Pmode,
27807                                                stack_ptr,
27808                                                stack_toc_offset));
27809
27810   gcc_assert (cfun);
27811   gcc_assert (cfun->machine);
27812
27813   /* Can we optimize saving the TOC in the prologue or do we need to do it at
27814      every call?  */
27815   if (TARGET_SAVE_TOC_INDIRECT && !cfun->calls_alloca)
27816     cfun->machine->save_toc_in_prologue = true;
27817
27818   else
27819     {
27820       MEM_VOLATILE_P (stack_toc_mem) = 1;
27821       emit_move_insn (stack_toc_mem, toc_reg);
27822     }
27823
27824   /* Calculate the address to load the TOC of the called function.  We don't
27825      actually load this until the split after reload.  */
27826   func_toc_mem = gen_rtx_MEM (Pmode,
27827                               gen_rtx_PLUS (Pmode,
27828                                             func_desc,
27829                                             func_toc_offset));
27830
27831   /* If we have a static chain, load it up.  */
27832   if (TARGET_POINTERS_TO_NESTED_FUNCTIONS)
27833     {
27834       func_sc_mem = gen_rtx_MEM (Pmode,
27835                                  gen_rtx_PLUS (Pmode,
27836                                                func_desc,
27837                                                func_sc_offset));
27838
27839       sc_reg = gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
27840       emit_move_insn (sc_reg, func_sc_mem);
27841     }
27842
27843   /* Create the call.  */
27844   if (value)
27845     insn = call_value_func (value, func_addr, flag, func_toc_mem,
27846                             stack_toc_mem);
27847   else
27848     insn = call_func (func_addr, flag, func_toc_mem, stack_toc_mem);
27849
27850   emit_call_insn (insn);
27851 }
27852
27853 /* Return whether we need to always update the saved TOC pointer when we update
27854    the stack pointer.  */
27855
27856 static bool
27857 rs6000_save_toc_in_prologue_p (void)
27858 {
27859   return (cfun && cfun->machine && cfun->machine->save_toc_in_prologue);
27860 }
27861
27862 #include "gt-rs6000.h"