rs6000: wj -> wi+p8v
[platform/upstream/gcc.git] / gcc / config / rs6000 / rs6000.c
1 /* Subroutines used for code generation on IBM RS/6000.
2    Copyright (C) 1991-2019 Free Software Foundation, Inc.
3    Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
4
5    This file is part of GCC.
6
7    GCC is free software; you can redistribute it and/or modify it
8    under the terms of the GNU General Public License as published
9    by the Free Software Foundation; either version 3, or (at your
10    option) any later version.
11
12    GCC is distributed in the hope that it will be useful, but WITHOUT
13    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15    License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GCC; see the file COPYING3.  If not see
19    <http://www.gnu.org/licenses/>.  */
20
21 #define IN_TARGET_CODE 1
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "backend.h"
27 #include "rtl.h"
28 #include "tree.h"
29 #include "memmodel.h"
30 #include "gimple.h"
31 #include "cfghooks.h"
32 #include "cfgloop.h"
33 #include "df.h"
34 #include "tm_p.h"
35 #include "stringpool.h"
36 #include "expmed.h"
37 #include "optabs.h"
38 #include "regs.h"
39 #include "ira.h"
40 #include "recog.h"
41 #include "cgraph.h"
42 #include "diagnostic-core.h"
43 #include "insn-attr.h"
44 #include "flags.h"
45 #include "alias.h"
46 #include "fold-const.h"
47 #include "attribs.h"
48 #include "stor-layout.h"
49 #include "calls.h"
50 #include "print-tree.h"
51 #include "varasm.h"
52 #include "explow.h"
53 #include "expr.h"
54 #include "output.h"
55 #include "dbxout.h"
56 #include "common/common-target.h"
57 #include "langhooks.h"
58 #include "reload.h"
59 #include "sched-int.h"
60 #include "gimplify.h"
61 #include "gimple-fold.h"
62 #include "gimple-iterator.h"
63 #include "gimple-ssa.h"
64 #include "gimple-walk.h"
65 #include "intl.h"
66 #include "params.h"
67 #include "tm-constrs.h"
68 #include "tree-vectorizer.h"
69 #include "target-globals.h"
70 #include "builtins.h"
71 #include "tree-vector-builder.h"
72 #include "context.h"
73 #include "tree-pass.h"
74 #include "except.h"
75 #if TARGET_XCOFF
76 #include "xcoffout.h"  /* get declarations of xcoff_*_section_name */
77 #endif
78 #if TARGET_MACHO
79 #include "gstab.h"  /* for N_SLINE */
80 #endif
81 #include "case-cfn-macros.h"
82 #include "ppc-auxv.h"
83 #include "tree-ssa-propagate.h"
84 #include "tree-vrp.h"
85 #include "tree-ssanames.h"
86
87 /* This file should be included last.  */
88 #include "target-def.h"
89
90 #ifndef TARGET_NO_PROTOTYPE
91 #define TARGET_NO_PROTOTYPE 0
92 #endif
93
94   /* Set -mabi=ieeelongdouble on some old targets.  In the future, power server
95      systems will also set long double to be IEEE 128-bit.  AIX and Darwin
96      explicitly redefine TARGET_IEEEQUAD and TARGET_IEEEQUAD_DEFAULT to 0, so
97      those systems will not pick up this default.  This needs to be after all
98      of the include files, so that POWERPC_LINUX and POWERPC_FREEBSD are
99      properly defined.  */
100 #ifndef TARGET_IEEEQUAD_DEFAULT
101 #if !defined (POWERPC_LINUX) && !defined (POWERPC_FREEBSD)
102 #define TARGET_IEEEQUAD_DEFAULT 1
103 #else
104 #define TARGET_IEEEQUAD_DEFAULT 0
105 #endif
106 #endif
107
108 static pad_direction rs6000_function_arg_padding (machine_mode, const_tree);
109
110 /* Structure used to define the rs6000 stack */
111 typedef struct rs6000_stack {
112   int reload_completed;         /* stack info won't change from here on */
113   int first_gp_reg_save;        /* first callee saved GP register used */
114   int first_fp_reg_save;        /* first callee saved FP register used */
115   int first_altivec_reg_save;   /* first callee saved AltiVec register used */
116   int lr_save_p;                /* true if the link reg needs to be saved */
117   int cr_save_p;                /* true if the CR reg needs to be saved */
118   unsigned int vrsave_mask;     /* mask of vec registers to save */
119   int push_p;                   /* true if we need to allocate stack space */
120   int calls_p;                  /* true if the function makes any calls */
121   int world_save_p;             /* true if we're saving *everything*:
122                                    r13-r31, cr, f14-f31, vrsave, v20-v31  */
123   enum rs6000_abi abi;          /* which ABI to use */
124   int gp_save_offset;           /* offset to save GP regs from initial SP */
125   int fp_save_offset;           /* offset to save FP regs from initial SP */
126   int altivec_save_offset;      /* offset to save AltiVec regs from initial SP */
127   int lr_save_offset;           /* offset to save LR from initial SP */
128   int cr_save_offset;           /* offset to save CR from initial SP */
129   int vrsave_save_offset;       /* offset to save VRSAVE from initial SP */
130   int varargs_save_offset;      /* offset to save the varargs registers */
131   int ehrd_offset;              /* offset to EH return data */
132   int ehcr_offset;              /* offset to EH CR field data */
133   int reg_size;                 /* register size (4 or 8) */
134   HOST_WIDE_INT vars_size;      /* variable save area size */
135   int parm_size;                /* outgoing parameter size */
136   int save_size;                /* save area size */
137   int fixed_size;               /* fixed size of stack frame */
138   int gp_size;                  /* size of saved GP registers */
139   int fp_size;                  /* size of saved FP registers */
140   int altivec_size;             /* size of saved AltiVec registers */
141   int cr_size;                  /* size to hold CR if not in fixed area */
142   int vrsave_size;              /* size to hold VRSAVE */
143   int altivec_padding_size;     /* size of altivec alignment padding */
144   HOST_WIDE_INT total_size;     /* total bytes allocated for stack */
145   int savres_strategy;
146 } rs6000_stack_t;
147
148 /* A C structure for machine-specific, per-function data.
149    This is added to the cfun structure.  */
150 typedef struct GTY(()) machine_function
151 {
152   /* Flags if __builtin_return_address (n) with n >= 1 was used.  */
153   int ra_needs_full_frame;
154   /* Flags if __builtin_return_address (0) was used.  */
155   int ra_need_lr;
156   /* Cache lr_save_p after expansion of builtin_eh_return.  */
157   int lr_save_state;
158   /* Whether we need to save the TOC to the reserved stack location in the
159      function prologue.  */
160   bool save_toc_in_prologue;
161   /* Offset from virtual_stack_vars_rtx to the start of the ABI_V4
162      varargs save area.  */
163   HOST_WIDE_INT varargs_save_offset;
164   /* Alternative internal arg pointer for -fsplit-stack.  */
165   rtx split_stack_arg_pointer;
166   bool split_stack_argp_used;
167   /* Flag if r2 setup is needed with ELFv2 ABI.  */
168   bool r2_setup_needed;
169   /* The number of components we use for separate shrink-wrapping.  */
170   int n_components;
171   /* The components already handled by separate shrink-wrapping, which should
172      not be considered by the prologue and epilogue.  */
173   bool gpr_is_wrapped_separately[32];
174   bool fpr_is_wrapped_separately[32];
175   bool lr_is_wrapped_separately;
176   bool toc_is_wrapped_separately;
177 } machine_function;
178
179 /* Support targetm.vectorize.builtin_mask_for_load.  */
180 static GTY(()) tree altivec_builtin_mask_for_load;
181
182 /* Set to nonzero once AIX common-mode calls have been defined.  */
183 static GTY(()) int common_mode_defined;
184
185 /* Label number of label created for -mrelocatable, to call to so we can
186    get the address of the GOT section */
187 static int rs6000_pic_labelno;
188
189 #ifdef USING_ELFOS_H
190 /* Counter for labels which are to be placed in .fixup.  */
191 int fixuplabelno = 0;
192 #endif
193
194 /* Whether to use variant of AIX ABI for PowerPC64 Linux.  */
195 int dot_symbols;
196
197 /* Specify the machine mode that pointers have.  After generation of rtl, the
198    compiler makes no further distinction between pointers and any other objects
199    of this machine mode.  */
200 scalar_int_mode rs6000_pmode;
201
202 #if TARGET_ELF
203 /* Note whether IEEE 128-bit floating point was passed or returned, either as
204    the __float128/_Float128 explicit type, or when long double is IEEE 128-bit
205    floating point.  We changed the default C++ mangling for these types and we
206    may want to generate a weak alias of the old mangling (U10__float128) to the
207    new mangling (u9__ieee128).  */
208 static bool rs6000_passes_ieee128;
209 #endif
210
211 /* Generate the manged name (i.e. U10__float128) used in GCC 8.1, and not the
212    name used in current releases (i.e. u9__ieee128).  */
213 static bool ieee128_mangling_gcc_8_1;
214
215 /* Width in bits of a pointer.  */
216 unsigned rs6000_pointer_size;
217
218 #ifdef HAVE_AS_GNU_ATTRIBUTE
219 # ifndef HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE
220 # define HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE 0
221 # endif
222 /* Flag whether floating point values have been passed/returned.
223    Note that this doesn't say whether fprs are used, since the
224    Tag_GNU_Power_ABI_FP .gnu.attributes value this flag controls
225    should be set for soft-float values passed in gprs and ieee128
226    values passed in vsx registers.  */
227 static bool rs6000_passes_float;
228 static bool rs6000_passes_long_double;
229 /* Flag whether vector values have been passed/returned.  */
230 static bool rs6000_passes_vector;
231 /* Flag whether small (<= 8 byte) structures have been returned.  */
232 static bool rs6000_returns_struct;
233 #endif
234
235 /* Value is TRUE if register/mode pair is acceptable.  */
236 static bool rs6000_hard_regno_mode_ok_p
237   [NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
238
239 /* Maximum number of registers needed for a given register class and mode.  */
240 unsigned char rs6000_class_max_nregs[NUM_MACHINE_MODES][LIM_REG_CLASSES];
241
242 /* How many registers are needed for a given register and mode.  */
243 unsigned char rs6000_hard_regno_nregs[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
244
245 /* Map register number to register class.  */
246 enum reg_class rs6000_regno_regclass[FIRST_PSEUDO_REGISTER];
247
248 static int dbg_cost_ctrl;
249
250 /* Built in types.  */
251 tree rs6000_builtin_types[RS6000_BTI_MAX];
252 tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
253
254 /* Flag to say the TOC is initialized */
255 int toc_initialized, need_toc_init;
256 char toc_label_name[10];
257
258 /* Cached value of rs6000_variable_issue. This is cached in
259    rs6000_variable_issue hook and returned from rs6000_sched_reorder2.  */
260 static short cached_can_issue_more;
261
262 static GTY(()) section *read_only_data_section;
263 static GTY(()) section *private_data_section;
264 static GTY(()) section *tls_data_section;
265 static GTY(()) section *tls_private_data_section;
266 static GTY(()) section *read_only_private_data_section;
267 static GTY(()) section *sdata2_section;
268 static GTY(()) section *toc_section;
269
270 struct builtin_description
271 {
272   const HOST_WIDE_INT mask;
273   const enum insn_code icode;
274   const char *const name;
275   const enum rs6000_builtins code;
276 };
277
278 /* Describe the vector unit used for modes.  */
279 enum rs6000_vector rs6000_vector_unit[NUM_MACHINE_MODES];
280 enum rs6000_vector rs6000_vector_mem[NUM_MACHINE_MODES];
281
282 /* Register classes for various constraints that are based on the target
283    switches.  */
284 enum reg_class rs6000_constraints[RS6000_CONSTRAINT_MAX];
285
286 /* Describe the alignment of a vector.  */
287 int rs6000_vector_align[NUM_MACHINE_MODES];
288
289 /* Map selected modes to types for builtins.  */
290 static GTY(()) tree builtin_mode_to_type[MAX_MACHINE_MODE][2];
291
292 /* What modes to automatically generate reciprocal divide estimate (fre) and
293    reciprocal sqrt (frsqrte) for.  */
294 unsigned char rs6000_recip_bits[MAX_MACHINE_MODE];
295
296 /* Masks to determine which reciprocal esitmate instructions to generate
297    automatically.  */
298 enum rs6000_recip_mask {
299   RECIP_SF_DIV          = 0x001,        /* Use divide estimate */
300   RECIP_DF_DIV          = 0x002,
301   RECIP_V4SF_DIV        = 0x004,
302   RECIP_V2DF_DIV        = 0x008,
303
304   RECIP_SF_RSQRT        = 0x010,        /* Use reciprocal sqrt estimate.  */
305   RECIP_DF_RSQRT        = 0x020,
306   RECIP_V4SF_RSQRT      = 0x040,
307   RECIP_V2DF_RSQRT      = 0x080,
308
309   /* Various combination of flags for -mrecip=xxx.  */
310   RECIP_NONE            = 0,
311   RECIP_ALL             = (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
312                            | RECIP_V2DF_DIV | RECIP_SF_RSQRT | RECIP_DF_RSQRT
313                            | RECIP_V4SF_RSQRT | RECIP_V2DF_RSQRT),
314
315   RECIP_HIGH_PRECISION  = RECIP_ALL,
316
317   /* On low precision machines like the power5, don't enable double precision
318      reciprocal square root estimate, since it isn't accurate enough.  */
319   RECIP_LOW_PRECISION   = (RECIP_ALL & ~(RECIP_DF_RSQRT | RECIP_V2DF_RSQRT))
320 };
321
322 /* -mrecip options.  */
323 static struct
324 {
325   const char *string;           /* option name */
326   unsigned int mask;            /* mask bits to set */
327 } recip_options[] = {
328   { "all",       RECIP_ALL },
329   { "none",      RECIP_NONE },
330   { "div",       (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
331                   | RECIP_V2DF_DIV) },
332   { "divf",      (RECIP_SF_DIV | RECIP_V4SF_DIV) },
333   { "divd",      (RECIP_DF_DIV | RECIP_V2DF_DIV) },
334   { "rsqrt",     (RECIP_SF_RSQRT | RECIP_DF_RSQRT | RECIP_V4SF_RSQRT
335                   | RECIP_V2DF_RSQRT) },
336   { "rsqrtf",    (RECIP_SF_RSQRT | RECIP_V4SF_RSQRT) },
337   { "rsqrtd",    (RECIP_DF_RSQRT | RECIP_V2DF_RSQRT) },
338 };
339
340 /* Used by __builtin_cpu_is(), mapping from PLATFORM names to values.  */
341 static const struct
342 {
343   const char *cpu;
344   unsigned int cpuid;
345 } cpu_is_info[] = {
346   { "power9",      PPC_PLATFORM_POWER9 },
347   { "power8",      PPC_PLATFORM_POWER8 },
348   { "power7",      PPC_PLATFORM_POWER7 },
349   { "power6x",     PPC_PLATFORM_POWER6X },
350   { "power6",      PPC_PLATFORM_POWER6 },
351   { "power5+",     PPC_PLATFORM_POWER5_PLUS },
352   { "power5",      PPC_PLATFORM_POWER5 },
353   { "ppc970",      PPC_PLATFORM_PPC970 },
354   { "power4",      PPC_PLATFORM_POWER4 },
355   { "ppca2",       PPC_PLATFORM_PPCA2 },
356   { "ppc476",      PPC_PLATFORM_PPC476 },
357   { "ppc464",      PPC_PLATFORM_PPC464 },
358   { "ppc440",      PPC_PLATFORM_PPC440 },
359   { "ppc405",      PPC_PLATFORM_PPC405 },
360   { "ppc-cell-be", PPC_PLATFORM_CELL_BE }
361 };
362
363 /* Used by __builtin_cpu_supports(), mapping from HWCAP names to masks.  */
364 static const struct
365 {
366   const char *hwcap;
367   int mask;
368   unsigned int id;
369 } cpu_supports_info[] = {
370   /* AT_HWCAP masks.  */
371   { "4xxmac",           PPC_FEATURE_HAS_4xxMAC,         0 },
372   { "altivec",          PPC_FEATURE_HAS_ALTIVEC,        0 },
373   { "arch_2_05",        PPC_FEATURE_ARCH_2_05,          0 },
374   { "arch_2_06",        PPC_FEATURE_ARCH_2_06,          0 },
375   { "archpmu",          PPC_FEATURE_PERFMON_COMPAT,     0 },
376   { "booke",            PPC_FEATURE_BOOKE,              0 },
377   { "cellbe",           PPC_FEATURE_CELL_BE,            0 },
378   { "dfp",              PPC_FEATURE_HAS_DFP,            0 },
379   { "efpdouble",        PPC_FEATURE_HAS_EFP_DOUBLE,     0 },
380   { "efpsingle",        PPC_FEATURE_HAS_EFP_SINGLE,     0 },
381   { "fpu",              PPC_FEATURE_HAS_FPU,            0 },
382   { "ic_snoop",         PPC_FEATURE_ICACHE_SNOOP,       0 },
383   { "mmu",              PPC_FEATURE_HAS_MMU,            0 },
384   { "notb",             PPC_FEATURE_NO_TB,              0 },
385   { "pa6t",             PPC_FEATURE_PA6T,               0 },
386   { "power4",           PPC_FEATURE_POWER4,             0 },
387   { "power5",           PPC_FEATURE_POWER5,             0 },
388   { "power5+",          PPC_FEATURE_POWER5_PLUS,        0 },
389   { "power6x",          PPC_FEATURE_POWER6_EXT,         0 },
390   { "ppc32",            PPC_FEATURE_32,                 0 },
391   { "ppc601",           PPC_FEATURE_601_INSTR,          0 },
392   { "ppc64",            PPC_FEATURE_64,                 0 },
393   { "ppcle",            PPC_FEATURE_PPC_LE,             0 },
394   { "smt",              PPC_FEATURE_SMT,                0 },
395   { "spe",              PPC_FEATURE_HAS_SPE,            0 },
396   { "true_le",          PPC_FEATURE_TRUE_LE,            0 },
397   { "ucache",           PPC_FEATURE_UNIFIED_CACHE,      0 },
398   { "vsx",              PPC_FEATURE_HAS_VSX,            0 },
399
400   /* AT_HWCAP2 masks.  */
401   { "arch_2_07",        PPC_FEATURE2_ARCH_2_07,         1 },
402   { "dscr",             PPC_FEATURE2_HAS_DSCR,          1 },
403   { "ebb",              PPC_FEATURE2_HAS_EBB,           1 },
404   { "htm",              PPC_FEATURE2_HAS_HTM,           1 },
405   { "htm-nosc",         PPC_FEATURE2_HTM_NOSC,          1 },
406   { "htm-no-suspend",   PPC_FEATURE2_HTM_NO_SUSPEND,    1 },
407   { "isel",             PPC_FEATURE2_HAS_ISEL,          1 },
408   { "tar",              PPC_FEATURE2_HAS_TAR,           1 },
409   { "vcrypto",          PPC_FEATURE2_HAS_VEC_CRYPTO,    1 },
410   { "arch_3_00",        PPC_FEATURE2_ARCH_3_00,         1 },
411   { "ieee128",          PPC_FEATURE2_HAS_IEEE128,       1 },
412   { "darn",             PPC_FEATURE2_DARN,              1 },
413   { "scv",              PPC_FEATURE2_SCV,               1 }
414 };
415
416 /* On PowerPC, we have a limited number of target clones that we care about
417    which means we can use an array to hold the options, rather than having more
418    elaborate data structures to identify each possible variation.  Order the
419    clones from the default to the highest ISA.  */
420 enum {
421   CLONE_DEFAULT         = 0,            /* default clone.  */
422   CLONE_ISA_2_05,                       /* ISA 2.05 (power6).  */
423   CLONE_ISA_2_06,                       /* ISA 2.06 (power7).  */
424   CLONE_ISA_2_07,                       /* ISA 2.07 (power8).  */
425   CLONE_ISA_3_00,                       /* ISA 3.00 (power9).  */
426   CLONE_MAX
427 };
428
429 /* Map compiler ISA bits into HWCAP names.  */
430 struct clone_map {
431   HOST_WIDE_INT isa_mask;       /* rs6000_isa mask */
432   const char *name;             /* name to use in __builtin_cpu_supports.  */
433 };
434
435 static const struct clone_map rs6000_clone_map[CLONE_MAX] = {
436   { 0,                          "" },           /* Default options.  */
437   { OPTION_MASK_CMPB,           "arch_2_05" },  /* ISA 2.05 (power6).  */
438   { OPTION_MASK_POPCNTD,        "arch_2_06" },  /* ISA 2.06 (power7).  */
439   { OPTION_MASK_P8_VECTOR,      "arch_2_07" },  /* ISA 2.07 (power8).  */
440   { OPTION_MASK_P9_VECTOR,      "arch_3_00" },  /* ISA 3.00 (power9).  */
441 };
442
443
444 /* Newer LIBCs explicitly export this symbol to declare that they provide
445    the AT_PLATFORM and AT_HWCAP/AT_HWCAP2 values in the TCB.  We emit a
446    reference to this symbol whenever we expand a CPU builtin, so that
447    we never link against an old LIBC.  */
448 const char *tcb_verification_symbol = "__parse_hwcap_and_convert_at_platform";
449
450 /* True if we have expanded a CPU builtin.  */
451 bool cpu_builtin_p;
452
453 /* Pointer to function (in rs6000-c.c) that can define or undefine target
454    macros that have changed.  Languages that don't support the preprocessor
455    don't link in rs6000-c.c, so we can't call it directly.  */
456 void (*rs6000_target_modify_macros_ptr) (bool, HOST_WIDE_INT, HOST_WIDE_INT);
457
458 /* Simplfy register classes into simpler classifications.  We assume
459    GPR_REG_TYPE - FPR_REG_TYPE are ordered so that we can use a simple range
460    check for standard register classes (gpr/floating/altivec/vsx) and
461    floating/vector classes (float/altivec/vsx).  */
462
463 enum rs6000_reg_type {
464   NO_REG_TYPE,
465   PSEUDO_REG_TYPE,
466   GPR_REG_TYPE,
467   VSX_REG_TYPE,
468   ALTIVEC_REG_TYPE,
469   FPR_REG_TYPE,
470   SPR_REG_TYPE,
471   CR_REG_TYPE
472 };
473
474 /* Map register class to register type.  */
475 static enum rs6000_reg_type reg_class_to_reg_type[N_REG_CLASSES];
476
477 /* First/last register type for the 'normal' register types (i.e. general
478    purpose, floating point, altivec, and VSX registers).  */
479 #define IS_STD_REG_TYPE(RTYPE) IN_RANGE(RTYPE, GPR_REG_TYPE, FPR_REG_TYPE)
480
481 #define IS_FP_VECT_REG_TYPE(RTYPE) IN_RANGE(RTYPE, VSX_REG_TYPE, FPR_REG_TYPE)
482
483
484 /* Register classes we care about in secondary reload or go if legitimate
485    address.  We only need to worry about GPR, FPR, and Altivec registers here,
486    along an ANY field that is the OR of the 3 register classes.  */
487
488 enum rs6000_reload_reg_type {
489   RELOAD_REG_GPR,                       /* General purpose registers.  */
490   RELOAD_REG_FPR,                       /* Traditional floating point regs.  */
491   RELOAD_REG_VMX,                       /* Altivec (VMX) registers.  */
492   RELOAD_REG_ANY,                       /* OR of GPR, FPR, Altivec masks.  */
493   N_RELOAD_REG
494 };
495
496 /* For setting up register classes, loop through the 3 register classes mapping
497    into real registers, and skip the ANY class, which is just an OR of the
498    bits.  */
499 #define FIRST_RELOAD_REG_CLASS  RELOAD_REG_GPR
500 #define LAST_RELOAD_REG_CLASS   RELOAD_REG_VMX
501
502 /* Map reload register type to a register in the register class.  */
503 struct reload_reg_map_type {
504   const char *name;                     /* Register class name.  */
505   int reg;                              /* Register in the register class.  */
506 };
507
508 static const struct reload_reg_map_type reload_reg_map[N_RELOAD_REG] = {
509   { "Gpr",      FIRST_GPR_REGNO },      /* RELOAD_REG_GPR.  */
510   { "Fpr",      FIRST_FPR_REGNO },      /* RELOAD_REG_FPR.  */
511   { "VMX",      FIRST_ALTIVEC_REGNO },  /* RELOAD_REG_VMX.  */
512   { "Any",      -1 },                   /* RELOAD_REG_ANY.  */
513 };
514
515 /* Mask bits for each register class, indexed per mode.  Historically the
516    compiler has been more restrictive which types can do PRE_MODIFY instead of
517    PRE_INC and PRE_DEC, so keep track of sepaate bits for these two.  */
518 typedef unsigned char addr_mask_type;
519
520 #define RELOAD_REG_VALID        0x01    /* Mode valid in register..  */
521 #define RELOAD_REG_MULTIPLE     0x02    /* Mode takes multiple registers.  */
522 #define RELOAD_REG_INDEXED      0x04    /* Reg+reg addressing.  */
523 #define RELOAD_REG_OFFSET       0x08    /* Reg+offset addressing. */
524 #define RELOAD_REG_PRE_INCDEC   0x10    /* PRE_INC/PRE_DEC valid.  */
525 #define RELOAD_REG_PRE_MODIFY   0x20    /* PRE_MODIFY valid.  */
526 #define RELOAD_REG_AND_M16      0x40    /* AND -16 addressing.  */
527 #define RELOAD_REG_QUAD_OFFSET  0x80    /* quad offset is limited.  */
528
529 /* Register type masks based on the type, of valid addressing modes.  */
530 struct rs6000_reg_addr {
531   enum insn_code reload_load;           /* INSN to reload for loading. */
532   enum insn_code reload_store;          /* INSN to reload for storing.  */
533   enum insn_code reload_fpr_gpr;        /* INSN to move from FPR to GPR.  */
534   enum insn_code reload_gpr_vsx;        /* INSN to move from GPR to VSX.  */
535   enum insn_code reload_vsx_gpr;        /* INSN to move from VSX to GPR.  */
536   addr_mask_type addr_mask[(int)N_RELOAD_REG]; /* Valid address masks.  */
537   bool scalar_in_vmx_p;                 /* Scalar value can go in VMX.  */
538 };
539
540 static struct rs6000_reg_addr reg_addr[NUM_MACHINE_MODES];
541
542 /* Helper function to say whether a mode supports PRE_INC or PRE_DEC.  */
543 static inline bool
544 mode_supports_pre_incdec_p (machine_mode mode)
545 {
546   return ((reg_addr[mode].addr_mask[RELOAD_REG_ANY] & RELOAD_REG_PRE_INCDEC)
547           != 0);
548 }
549
550 /* Helper function to say whether a mode supports PRE_MODIFY.  */
551 static inline bool
552 mode_supports_pre_modify_p (machine_mode mode)
553 {
554   return ((reg_addr[mode].addr_mask[RELOAD_REG_ANY] & RELOAD_REG_PRE_MODIFY)
555           != 0);
556 }
557
558 /* Return true if we have D-form addressing in altivec registers.  */
559 static inline bool
560 mode_supports_vmx_dform (machine_mode mode)
561 {
562   return ((reg_addr[mode].addr_mask[RELOAD_REG_VMX] & RELOAD_REG_OFFSET) != 0);
563 }
564
565 /* Return true if we have D-form addressing in VSX registers.  This addressing
566    is more limited than normal d-form addressing in that the offset must be
567    aligned on a 16-byte boundary.  */
568 static inline bool
569 mode_supports_dq_form (machine_mode mode)
570 {
571   return ((reg_addr[mode].addr_mask[RELOAD_REG_ANY] & RELOAD_REG_QUAD_OFFSET)
572           != 0);
573 }
574
575 /* Given that there exists at least one variable that is set (produced)
576    by OUT_INSN and read (consumed) by IN_INSN, return true iff
577    IN_INSN represents one or more memory store operations and none of
578    the variables set by OUT_INSN is used by IN_INSN as the address of a
579    store operation.  If either IN_INSN or OUT_INSN does not represent
580    a "single" RTL SET expression (as loosely defined by the
581    implementation of the single_set function) or a PARALLEL with only
582    SETs, CLOBBERs, and USEs inside, this function returns false.
583
584    This rs6000-specific version of store_data_bypass_p checks for
585    certain conditions that result in assertion failures (and internal
586    compiler errors) in the generic store_data_bypass_p function and
587    returns false rather than calling store_data_bypass_p if one of the
588    problematic conditions is detected.  */
589
590 int
591 rs6000_store_data_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
592 {
593   rtx out_set, in_set;
594   rtx out_pat, in_pat;
595   rtx out_exp, in_exp;
596   int i, j;
597
598   in_set = single_set (in_insn);
599   if (in_set)
600     {
601       if (MEM_P (SET_DEST (in_set)))
602         {
603           out_set = single_set (out_insn);
604           if (!out_set)
605             {
606               out_pat = PATTERN (out_insn);
607               if (GET_CODE (out_pat) == PARALLEL)
608                 {
609                   for (i = 0; i < XVECLEN (out_pat, 0); i++)
610                     {
611                       out_exp = XVECEXP (out_pat, 0, i);
612                       if ((GET_CODE (out_exp) == CLOBBER)
613                           || (GET_CODE (out_exp) == USE))
614                         continue;
615                       else if (GET_CODE (out_exp) != SET)
616                         return false;
617                     }
618                 }
619             }
620         }
621     }
622   else
623     {
624       in_pat = PATTERN (in_insn);
625       if (GET_CODE (in_pat) != PARALLEL)
626         return false;
627
628       for (i = 0; i < XVECLEN (in_pat, 0); i++)
629         {
630           in_exp = XVECEXP (in_pat, 0, i);
631           if ((GET_CODE (in_exp) == CLOBBER) || (GET_CODE (in_exp) == USE))
632             continue;
633           else if (GET_CODE (in_exp) != SET)
634             return false;
635
636           if (MEM_P (SET_DEST (in_exp)))
637             {
638               out_set = single_set (out_insn);
639               if (!out_set)
640                 {
641                   out_pat = PATTERN (out_insn);
642                   if (GET_CODE (out_pat) != PARALLEL)
643                     return false;
644                   for (j = 0; j < XVECLEN (out_pat, 0); j++)
645                     {
646                       out_exp = XVECEXP (out_pat, 0, j);
647                       if ((GET_CODE (out_exp) == CLOBBER)
648                           || (GET_CODE (out_exp) == USE))
649                         continue;
650                       else if (GET_CODE (out_exp) != SET)
651                         return false;
652                     }
653                 }
654             }
655         }
656     }
657   return store_data_bypass_p (out_insn, in_insn);
658 }
659
660 \f
661 /* Processor costs (relative to an add) */
662
663 const struct processor_costs *rs6000_cost;
664
665 /* Instruction size costs on 32bit processors.  */
666 static const
667 struct processor_costs size32_cost = {
668   COSTS_N_INSNS (1),    /* mulsi */
669   COSTS_N_INSNS (1),    /* mulsi_const */
670   COSTS_N_INSNS (1),    /* mulsi_const9 */
671   COSTS_N_INSNS (1),    /* muldi */
672   COSTS_N_INSNS (1),    /* divsi */
673   COSTS_N_INSNS (1),    /* divdi */
674   COSTS_N_INSNS (1),    /* fp */
675   COSTS_N_INSNS (1),    /* dmul */
676   COSTS_N_INSNS (1),    /* sdiv */
677   COSTS_N_INSNS (1),    /* ddiv */
678   32,                   /* cache line size */
679   0,                    /* l1 cache */
680   0,                    /* l2 cache */
681   0,                    /* streams */
682   0,                    /* SF->DF convert */
683 };
684
685 /* Instruction size costs on 64bit processors.  */
686 static const
687 struct processor_costs size64_cost = {
688   COSTS_N_INSNS (1),    /* mulsi */
689   COSTS_N_INSNS (1),    /* mulsi_const */
690   COSTS_N_INSNS (1),    /* mulsi_const9 */
691   COSTS_N_INSNS (1),    /* muldi */
692   COSTS_N_INSNS (1),    /* divsi */
693   COSTS_N_INSNS (1),    /* divdi */
694   COSTS_N_INSNS (1),    /* fp */
695   COSTS_N_INSNS (1),    /* dmul */
696   COSTS_N_INSNS (1),    /* sdiv */
697   COSTS_N_INSNS (1),    /* ddiv */
698   128,                  /* cache line size */
699   0,                    /* l1 cache */
700   0,                    /* l2 cache */
701   0,                    /* streams */
702   0,                    /* SF->DF convert */
703 };
704
705 /* Instruction costs on RS64A processors.  */
706 static const
707 struct processor_costs rs64a_cost = {
708   COSTS_N_INSNS (20),   /* mulsi */
709   COSTS_N_INSNS (12),   /* mulsi_const */
710   COSTS_N_INSNS (8),    /* mulsi_const9 */
711   COSTS_N_INSNS (34),   /* muldi */
712   COSTS_N_INSNS (65),   /* divsi */
713   COSTS_N_INSNS (67),   /* divdi */
714   COSTS_N_INSNS (4),    /* fp */
715   COSTS_N_INSNS (4),    /* dmul */
716   COSTS_N_INSNS (31),   /* sdiv */
717   COSTS_N_INSNS (31),   /* ddiv */
718   128,                  /* cache line size */
719   128,                  /* l1 cache */
720   2048,                 /* l2 cache */
721   1,                    /* streams */
722   0,                    /* SF->DF convert */
723 };
724
725 /* Instruction costs on MPCCORE processors.  */
726 static const
727 struct processor_costs mpccore_cost = {
728   COSTS_N_INSNS (2),    /* mulsi */
729   COSTS_N_INSNS (2),    /* mulsi_const */
730   COSTS_N_INSNS (2),    /* mulsi_const9 */
731   COSTS_N_INSNS (2),    /* muldi */
732   COSTS_N_INSNS (6),    /* divsi */
733   COSTS_N_INSNS (6),    /* divdi */
734   COSTS_N_INSNS (4),    /* fp */
735   COSTS_N_INSNS (5),    /* dmul */
736   COSTS_N_INSNS (10),   /* sdiv */
737   COSTS_N_INSNS (17),   /* ddiv */
738   32,                   /* cache line size */
739   4,                    /* l1 cache */
740   16,                   /* l2 cache */
741   1,                    /* streams */
742   0,                    /* SF->DF convert */
743 };
744
745 /* Instruction costs on PPC403 processors.  */
746 static const
747 struct processor_costs ppc403_cost = {
748   COSTS_N_INSNS (4),    /* mulsi */
749   COSTS_N_INSNS (4),    /* mulsi_const */
750   COSTS_N_INSNS (4),    /* mulsi_const9 */
751   COSTS_N_INSNS (4),    /* muldi */
752   COSTS_N_INSNS (33),   /* divsi */
753   COSTS_N_INSNS (33),   /* divdi */
754   COSTS_N_INSNS (11),   /* fp */
755   COSTS_N_INSNS (11),   /* dmul */
756   COSTS_N_INSNS (11),   /* sdiv */
757   COSTS_N_INSNS (11),   /* ddiv */
758   32,                   /* cache line size */
759   4,                    /* l1 cache */
760   16,                   /* l2 cache */
761   1,                    /* streams */
762   0,                    /* SF->DF convert */
763 };
764
765 /* Instruction costs on PPC405 processors.  */
766 static const
767 struct processor_costs ppc405_cost = {
768   COSTS_N_INSNS (5),    /* mulsi */
769   COSTS_N_INSNS (4),    /* mulsi_const */
770   COSTS_N_INSNS (3),    /* mulsi_const9 */
771   COSTS_N_INSNS (5),    /* muldi */
772   COSTS_N_INSNS (35),   /* divsi */
773   COSTS_N_INSNS (35),   /* divdi */
774   COSTS_N_INSNS (11),   /* fp */
775   COSTS_N_INSNS (11),   /* dmul */
776   COSTS_N_INSNS (11),   /* sdiv */
777   COSTS_N_INSNS (11),   /* ddiv */
778   32,                   /* cache line size */
779   16,                   /* l1 cache */
780   128,                  /* l2 cache */
781   1,                    /* streams */
782   0,                    /* SF->DF convert */
783 };
784
785 /* Instruction costs on PPC440 processors.  */
786 static const
787 struct processor_costs ppc440_cost = {
788   COSTS_N_INSNS (3),    /* mulsi */
789   COSTS_N_INSNS (2),    /* mulsi_const */
790   COSTS_N_INSNS (2),    /* mulsi_const9 */
791   COSTS_N_INSNS (3),    /* muldi */
792   COSTS_N_INSNS (34),   /* divsi */
793   COSTS_N_INSNS (34),   /* divdi */
794   COSTS_N_INSNS (5),    /* fp */
795   COSTS_N_INSNS (5),    /* dmul */
796   COSTS_N_INSNS (19),   /* sdiv */
797   COSTS_N_INSNS (33),   /* ddiv */
798   32,                   /* cache line size */
799   32,                   /* l1 cache */
800   256,                  /* l2 cache */
801   1,                    /* streams */
802   0,                    /* SF->DF convert */
803 };
804
805 /* Instruction costs on PPC476 processors.  */
806 static const
807 struct processor_costs ppc476_cost = {
808   COSTS_N_INSNS (4),    /* mulsi */
809   COSTS_N_INSNS (4),    /* mulsi_const */
810   COSTS_N_INSNS (4),    /* mulsi_const9 */
811   COSTS_N_INSNS (4),    /* muldi */
812   COSTS_N_INSNS (11),   /* divsi */
813   COSTS_N_INSNS (11),   /* divdi */
814   COSTS_N_INSNS (6),    /* fp */
815   COSTS_N_INSNS (6),    /* dmul */
816   COSTS_N_INSNS (19),   /* sdiv */
817   COSTS_N_INSNS (33),   /* ddiv */
818   32,                   /* l1 cache line size */
819   32,                   /* l1 cache */
820   512,                  /* l2 cache */
821   1,                    /* streams */
822   0,                    /* SF->DF convert */
823 };
824
825 /* Instruction costs on PPC601 processors.  */
826 static const
827 struct processor_costs ppc601_cost = {
828   COSTS_N_INSNS (5),    /* mulsi */
829   COSTS_N_INSNS (5),    /* mulsi_const */
830   COSTS_N_INSNS (5),    /* mulsi_const9 */
831   COSTS_N_INSNS (5),    /* muldi */
832   COSTS_N_INSNS (36),   /* divsi */
833   COSTS_N_INSNS (36),   /* divdi */
834   COSTS_N_INSNS (4),    /* fp */
835   COSTS_N_INSNS (5),    /* dmul */
836   COSTS_N_INSNS (17),   /* sdiv */
837   COSTS_N_INSNS (31),   /* ddiv */
838   32,                   /* cache line size */
839   32,                   /* l1 cache */
840   256,                  /* l2 cache */
841   1,                    /* streams */
842   0,                    /* SF->DF convert */
843 };
844
845 /* Instruction costs on PPC603 processors.  */
846 static const
847 struct processor_costs ppc603_cost = {
848   COSTS_N_INSNS (5),    /* mulsi */
849   COSTS_N_INSNS (3),    /* mulsi_const */
850   COSTS_N_INSNS (2),    /* mulsi_const9 */
851   COSTS_N_INSNS (5),    /* muldi */
852   COSTS_N_INSNS (37),   /* divsi */
853   COSTS_N_INSNS (37),   /* divdi */
854   COSTS_N_INSNS (3),    /* fp */
855   COSTS_N_INSNS (4),    /* dmul */
856   COSTS_N_INSNS (18),   /* sdiv */
857   COSTS_N_INSNS (33),   /* ddiv */
858   32,                   /* cache line size */
859   8,                    /* l1 cache */
860   64,                   /* l2 cache */
861   1,                    /* streams */
862   0,                    /* SF->DF convert */
863 };
864
865 /* Instruction costs on PPC604 processors.  */
866 static const
867 struct processor_costs ppc604_cost = {
868   COSTS_N_INSNS (4),    /* mulsi */
869   COSTS_N_INSNS (4),    /* mulsi_const */
870   COSTS_N_INSNS (4),    /* mulsi_const9 */
871   COSTS_N_INSNS (4),    /* muldi */
872   COSTS_N_INSNS (20),   /* divsi */
873   COSTS_N_INSNS (20),   /* divdi */
874   COSTS_N_INSNS (3),    /* fp */
875   COSTS_N_INSNS (3),    /* dmul */
876   COSTS_N_INSNS (18),   /* sdiv */
877   COSTS_N_INSNS (32),   /* ddiv */
878   32,                   /* cache line size */
879   16,                   /* l1 cache */
880   512,                  /* l2 cache */
881   1,                    /* streams */
882   0,                    /* SF->DF convert */
883 };
884
885 /* Instruction costs on PPC604e processors.  */
886 static const
887 struct processor_costs ppc604e_cost = {
888   COSTS_N_INSNS (2),    /* mulsi */
889   COSTS_N_INSNS (2),    /* mulsi_const */
890   COSTS_N_INSNS (2),    /* mulsi_const9 */
891   COSTS_N_INSNS (2),    /* muldi */
892   COSTS_N_INSNS (20),   /* divsi */
893   COSTS_N_INSNS (20),   /* divdi */
894   COSTS_N_INSNS (3),    /* fp */
895   COSTS_N_INSNS (3),    /* dmul */
896   COSTS_N_INSNS (18),   /* sdiv */
897   COSTS_N_INSNS (32),   /* ddiv */
898   32,                   /* cache line size */
899   32,                   /* l1 cache */
900   1024,                 /* l2 cache */
901   1,                    /* streams */
902   0,                    /* SF->DF convert */
903 };
904
905 /* Instruction costs on PPC620 processors.  */
906 static const
907 struct processor_costs ppc620_cost = {
908   COSTS_N_INSNS (5),    /* mulsi */
909   COSTS_N_INSNS (4),    /* mulsi_const */
910   COSTS_N_INSNS (3),    /* mulsi_const9 */
911   COSTS_N_INSNS (7),    /* muldi */
912   COSTS_N_INSNS (21),   /* divsi */
913   COSTS_N_INSNS (37),   /* divdi */
914   COSTS_N_INSNS (3),    /* fp */
915   COSTS_N_INSNS (3),    /* dmul */
916   COSTS_N_INSNS (18),   /* sdiv */
917   COSTS_N_INSNS (32),   /* ddiv */
918   128,                  /* cache line size */
919   32,                   /* l1 cache */
920   1024,                 /* l2 cache */
921   1,                    /* streams */
922   0,                    /* SF->DF convert */
923 };
924
925 /* Instruction costs on PPC630 processors.  */
926 static const
927 struct processor_costs ppc630_cost = {
928   COSTS_N_INSNS (5),    /* mulsi */
929   COSTS_N_INSNS (4),    /* mulsi_const */
930   COSTS_N_INSNS (3),    /* mulsi_const9 */
931   COSTS_N_INSNS (7),    /* muldi */
932   COSTS_N_INSNS (21),   /* divsi */
933   COSTS_N_INSNS (37),   /* divdi */
934   COSTS_N_INSNS (3),    /* fp */
935   COSTS_N_INSNS (3),    /* dmul */
936   COSTS_N_INSNS (17),   /* sdiv */
937   COSTS_N_INSNS (21),   /* ddiv */
938   128,                  /* cache line size */
939   64,                   /* l1 cache */
940   1024,                 /* l2 cache */
941   1,                    /* streams */
942   0,                    /* SF->DF convert */
943 };
944
945 /* Instruction costs on Cell processor.  */
946 /* COSTS_N_INSNS (1) ~ one add.  */
947 static const
948 struct processor_costs ppccell_cost = {
949   COSTS_N_INSNS (9/2)+2,    /* mulsi */
950   COSTS_N_INSNS (6/2),    /* mulsi_const */
951   COSTS_N_INSNS (6/2),    /* mulsi_const9 */
952   COSTS_N_INSNS (15/2)+2,   /* muldi */
953   COSTS_N_INSNS (38/2),   /* divsi */
954   COSTS_N_INSNS (70/2),   /* divdi */
955   COSTS_N_INSNS (10/2),   /* fp */
956   COSTS_N_INSNS (10/2),   /* dmul */
957   COSTS_N_INSNS (74/2),   /* sdiv */
958   COSTS_N_INSNS (74/2),   /* ddiv */
959   128,                  /* cache line size */
960   32,                   /* l1 cache */
961   512,                  /* l2 cache */
962   6,                    /* streams */
963   0,                    /* SF->DF convert */
964 };
965
966 /* Instruction costs on PPC750 and PPC7400 processors.  */
967 static const
968 struct processor_costs ppc750_cost = {
969   COSTS_N_INSNS (5),    /* mulsi */
970   COSTS_N_INSNS (3),    /* mulsi_const */
971   COSTS_N_INSNS (2),    /* mulsi_const9 */
972   COSTS_N_INSNS (5),    /* muldi */
973   COSTS_N_INSNS (17),   /* divsi */
974   COSTS_N_INSNS (17),   /* divdi */
975   COSTS_N_INSNS (3),    /* fp */
976   COSTS_N_INSNS (3),    /* dmul */
977   COSTS_N_INSNS (17),   /* sdiv */
978   COSTS_N_INSNS (31),   /* ddiv */
979   32,                   /* cache line size */
980   32,                   /* l1 cache */
981   512,                  /* l2 cache */
982   1,                    /* streams */
983   0,                    /* SF->DF convert */
984 };
985
986 /* Instruction costs on PPC7450 processors.  */
987 static const
988 struct processor_costs ppc7450_cost = {
989   COSTS_N_INSNS (4),    /* mulsi */
990   COSTS_N_INSNS (3),    /* mulsi_const */
991   COSTS_N_INSNS (3),    /* mulsi_const9 */
992   COSTS_N_INSNS (4),    /* muldi */
993   COSTS_N_INSNS (23),   /* divsi */
994   COSTS_N_INSNS (23),   /* divdi */
995   COSTS_N_INSNS (5),    /* fp */
996   COSTS_N_INSNS (5),    /* dmul */
997   COSTS_N_INSNS (21),   /* sdiv */
998   COSTS_N_INSNS (35),   /* ddiv */
999   32,                   /* cache line size */
1000   32,                   /* l1 cache */
1001   1024,                 /* l2 cache */
1002   1,                    /* streams */
1003   0,                    /* SF->DF convert */
1004 };
1005
1006 /* Instruction costs on PPC8540 processors.  */
1007 static const
1008 struct processor_costs ppc8540_cost = {
1009   COSTS_N_INSNS (4),    /* mulsi */
1010   COSTS_N_INSNS (4),    /* mulsi_const */
1011   COSTS_N_INSNS (4),    /* mulsi_const9 */
1012   COSTS_N_INSNS (4),    /* muldi */
1013   COSTS_N_INSNS (19),   /* divsi */
1014   COSTS_N_INSNS (19),   /* divdi */
1015   COSTS_N_INSNS (4),    /* fp */
1016   COSTS_N_INSNS (4),    /* dmul */
1017   COSTS_N_INSNS (29),   /* sdiv */
1018   COSTS_N_INSNS (29),   /* ddiv */
1019   32,                   /* cache line size */
1020   32,                   /* l1 cache */
1021   256,                  /* l2 cache */
1022   1,                    /* prefetch streams /*/
1023   0,                    /* SF->DF convert */
1024 };
1025
1026 /* Instruction costs on E300C2 and E300C3 cores.  */
1027 static const
1028 struct processor_costs ppce300c2c3_cost = {
1029   COSTS_N_INSNS (4),    /* mulsi */
1030   COSTS_N_INSNS (4),    /* mulsi_const */
1031   COSTS_N_INSNS (4),    /* mulsi_const9 */
1032   COSTS_N_INSNS (4),    /* muldi */
1033   COSTS_N_INSNS (19),   /* divsi */
1034   COSTS_N_INSNS (19),   /* divdi */
1035   COSTS_N_INSNS (3),    /* fp */
1036   COSTS_N_INSNS (4),    /* dmul */
1037   COSTS_N_INSNS (18),   /* sdiv */
1038   COSTS_N_INSNS (33),   /* ddiv */
1039   32,
1040   16,                   /* l1 cache */
1041   16,                   /* l2 cache */
1042   1,                    /* prefetch streams /*/
1043   0,                    /* SF->DF convert */
1044 };
1045
1046 /* Instruction costs on PPCE500MC processors.  */
1047 static const
1048 struct processor_costs ppce500mc_cost = {
1049   COSTS_N_INSNS (4),    /* mulsi */
1050   COSTS_N_INSNS (4),    /* mulsi_const */
1051   COSTS_N_INSNS (4),    /* mulsi_const9 */
1052   COSTS_N_INSNS (4),    /* muldi */
1053   COSTS_N_INSNS (14),   /* divsi */
1054   COSTS_N_INSNS (14),   /* divdi */
1055   COSTS_N_INSNS (8),    /* fp */
1056   COSTS_N_INSNS (10),   /* dmul */
1057   COSTS_N_INSNS (36),   /* sdiv */
1058   COSTS_N_INSNS (66),   /* ddiv */
1059   64,                   /* cache line size */
1060   32,                   /* l1 cache */
1061   128,                  /* l2 cache */
1062   1,                    /* prefetch streams /*/
1063   0,                    /* SF->DF convert */
1064 };
1065
1066 /* Instruction costs on PPCE500MC64 processors.  */
1067 static const
1068 struct processor_costs ppce500mc64_cost = {
1069   COSTS_N_INSNS (4),    /* mulsi */
1070   COSTS_N_INSNS (4),    /* mulsi_const */
1071   COSTS_N_INSNS (4),    /* mulsi_const9 */
1072   COSTS_N_INSNS (4),    /* muldi */
1073   COSTS_N_INSNS (14),   /* divsi */
1074   COSTS_N_INSNS (14),   /* divdi */
1075   COSTS_N_INSNS (4),    /* fp */
1076   COSTS_N_INSNS (10),   /* dmul */
1077   COSTS_N_INSNS (36),   /* sdiv */
1078   COSTS_N_INSNS (66),   /* ddiv */
1079   64,                   /* cache line size */
1080   32,                   /* l1 cache */
1081   128,                  /* l2 cache */
1082   1,                    /* prefetch streams /*/
1083   0,                    /* SF->DF convert */
1084 };
1085
1086 /* Instruction costs on PPCE5500 processors.  */
1087 static const
1088 struct processor_costs ppce5500_cost = {
1089   COSTS_N_INSNS (5),    /* mulsi */
1090   COSTS_N_INSNS (5),    /* mulsi_const */
1091   COSTS_N_INSNS (4),    /* mulsi_const9 */
1092   COSTS_N_INSNS (5),    /* muldi */
1093   COSTS_N_INSNS (14),   /* divsi */
1094   COSTS_N_INSNS (14),   /* divdi */
1095   COSTS_N_INSNS (7),    /* fp */
1096   COSTS_N_INSNS (10),   /* dmul */
1097   COSTS_N_INSNS (36),   /* sdiv */
1098   COSTS_N_INSNS (66),   /* ddiv */
1099   64,                   /* cache line size */
1100   32,                   /* l1 cache */
1101   128,                  /* l2 cache */
1102   1,                    /* prefetch streams /*/
1103   0,                    /* SF->DF convert */
1104 };
1105
1106 /* Instruction costs on PPCE6500 processors.  */
1107 static const
1108 struct processor_costs ppce6500_cost = {
1109   COSTS_N_INSNS (5),    /* mulsi */
1110   COSTS_N_INSNS (5),    /* mulsi_const */
1111   COSTS_N_INSNS (4),    /* mulsi_const9 */
1112   COSTS_N_INSNS (5),    /* muldi */
1113   COSTS_N_INSNS (14),   /* divsi */
1114   COSTS_N_INSNS (14),   /* divdi */
1115   COSTS_N_INSNS (7),    /* fp */
1116   COSTS_N_INSNS (10),   /* dmul */
1117   COSTS_N_INSNS (36),   /* sdiv */
1118   COSTS_N_INSNS (66),   /* ddiv */
1119   64,                   /* cache line size */
1120   32,                   /* l1 cache */
1121   128,                  /* l2 cache */
1122   1,                    /* prefetch streams /*/
1123   0,                    /* SF->DF convert */
1124 };
1125
1126 /* Instruction costs on AppliedMicro Titan processors.  */
1127 static const
1128 struct processor_costs titan_cost = {
1129   COSTS_N_INSNS (5),    /* mulsi */
1130   COSTS_N_INSNS (5),    /* mulsi_const */
1131   COSTS_N_INSNS (5),    /* mulsi_const9 */
1132   COSTS_N_INSNS (5),    /* muldi */
1133   COSTS_N_INSNS (18),   /* divsi */
1134   COSTS_N_INSNS (18),   /* divdi */
1135   COSTS_N_INSNS (10),   /* fp */
1136   COSTS_N_INSNS (10),   /* dmul */
1137   COSTS_N_INSNS (46),   /* sdiv */
1138   COSTS_N_INSNS (72),   /* ddiv */
1139   32,                   /* cache line size */
1140   32,                   /* l1 cache */
1141   512,                  /* l2 cache */
1142   1,                    /* prefetch streams /*/
1143   0,                    /* SF->DF convert */
1144 };
1145
1146 /* Instruction costs on POWER4 and POWER5 processors.  */
1147 static const
1148 struct processor_costs power4_cost = {
1149   COSTS_N_INSNS (3),    /* mulsi */
1150   COSTS_N_INSNS (2),    /* mulsi_const */
1151   COSTS_N_INSNS (2),    /* mulsi_const9 */
1152   COSTS_N_INSNS (4),    /* muldi */
1153   COSTS_N_INSNS (18),   /* divsi */
1154   COSTS_N_INSNS (34),   /* divdi */
1155   COSTS_N_INSNS (3),    /* fp */
1156   COSTS_N_INSNS (3),    /* dmul */
1157   COSTS_N_INSNS (17),   /* sdiv */
1158   COSTS_N_INSNS (17),   /* ddiv */
1159   128,                  /* cache line size */
1160   32,                   /* l1 cache */
1161   1024,                 /* l2 cache */
1162   8,                    /* prefetch streams /*/
1163   0,                    /* SF->DF convert */
1164 };
1165
1166 /* Instruction costs on POWER6 processors.  */
1167 static const
1168 struct processor_costs power6_cost = {
1169   COSTS_N_INSNS (8),    /* mulsi */
1170   COSTS_N_INSNS (8),    /* mulsi_const */
1171   COSTS_N_INSNS (8),    /* mulsi_const9 */
1172   COSTS_N_INSNS (8),    /* muldi */
1173   COSTS_N_INSNS (22),   /* divsi */
1174   COSTS_N_INSNS (28),   /* divdi */
1175   COSTS_N_INSNS (3),    /* fp */
1176   COSTS_N_INSNS (3),    /* dmul */
1177   COSTS_N_INSNS (13),   /* sdiv */
1178   COSTS_N_INSNS (16),   /* ddiv */
1179   128,                  /* cache line size */
1180   64,                   /* l1 cache */
1181   2048,                 /* l2 cache */
1182   16,                   /* prefetch streams */
1183   0,                    /* SF->DF convert */
1184 };
1185
1186 /* Instruction costs on POWER7 processors.  */
1187 static const
1188 struct processor_costs power7_cost = {
1189   COSTS_N_INSNS (2),    /* mulsi */
1190   COSTS_N_INSNS (2),    /* mulsi_const */
1191   COSTS_N_INSNS (2),    /* mulsi_const9 */
1192   COSTS_N_INSNS (2),    /* muldi */
1193   COSTS_N_INSNS (18),   /* divsi */
1194   COSTS_N_INSNS (34),   /* divdi */
1195   COSTS_N_INSNS (3),    /* fp */
1196   COSTS_N_INSNS (3),    /* dmul */
1197   COSTS_N_INSNS (13),   /* sdiv */
1198   COSTS_N_INSNS (16),   /* ddiv */
1199   128,                  /* cache line size */
1200   32,                   /* l1 cache */
1201   256,                  /* l2 cache */
1202   12,                   /* prefetch streams */
1203   COSTS_N_INSNS (3),    /* SF->DF convert */
1204 };
1205
1206 /* Instruction costs on POWER8 processors.  */
1207 static const
1208 struct processor_costs power8_cost = {
1209   COSTS_N_INSNS (3),    /* mulsi */
1210   COSTS_N_INSNS (3),    /* mulsi_const */
1211   COSTS_N_INSNS (3),    /* mulsi_const9 */
1212   COSTS_N_INSNS (3),    /* muldi */
1213   COSTS_N_INSNS (19),   /* divsi */
1214   COSTS_N_INSNS (35),   /* divdi */
1215   COSTS_N_INSNS (3),    /* fp */
1216   COSTS_N_INSNS (3),    /* dmul */
1217   COSTS_N_INSNS (14),   /* sdiv */
1218   COSTS_N_INSNS (17),   /* ddiv */
1219   128,                  /* cache line size */
1220   32,                   /* l1 cache */
1221   256,                  /* l2 cache */
1222   12,                   /* prefetch streams */
1223   COSTS_N_INSNS (3),    /* SF->DF convert */
1224 };
1225
1226 /* Instruction costs on POWER9 processors.  */
1227 static const
1228 struct processor_costs power9_cost = {
1229   COSTS_N_INSNS (3),    /* mulsi */
1230   COSTS_N_INSNS (3),    /* mulsi_const */
1231   COSTS_N_INSNS (3),    /* mulsi_const9 */
1232   COSTS_N_INSNS (3),    /* muldi */
1233   COSTS_N_INSNS (8),    /* divsi */
1234   COSTS_N_INSNS (12),   /* divdi */
1235   COSTS_N_INSNS (3),    /* fp */
1236   COSTS_N_INSNS (3),    /* dmul */
1237   COSTS_N_INSNS (13),   /* sdiv */
1238   COSTS_N_INSNS (18),   /* ddiv */
1239   128,                  /* cache line size */
1240   32,                   /* l1 cache */
1241   512,                  /* l2 cache */
1242   8,                    /* prefetch streams */
1243   COSTS_N_INSNS (3),    /* SF->DF convert */
1244 };
1245
1246 /* Instruction costs on POWER A2 processors.  */
1247 static const
1248 struct processor_costs ppca2_cost = {
1249   COSTS_N_INSNS (16),    /* mulsi */
1250   COSTS_N_INSNS (16),    /* mulsi_const */
1251   COSTS_N_INSNS (16),    /* mulsi_const9 */
1252   COSTS_N_INSNS (16),   /* muldi */
1253   COSTS_N_INSNS (22),   /* divsi */
1254   COSTS_N_INSNS (28),   /* divdi */
1255   COSTS_N_INSNS (3),    /* fp */
1256   COSTS_N_INSNS (3),    /* dmul */
1257   COSTS_N_INSNS (59),   /* sdiv */
1258   COSTS_N_INSNS (72),   /* ddiv */
1259   64,
1260   16,                   /* l1 cache */
1261   2048,                 /* l2 cache */
1262   16,                   /* prefetch streams */
1263   0,                    /* SF->DF convert */
1264 };
1265
1266 \f
1267 /* Table that classifies rs6000 builtin functions (pure, const, etc.).  */
1268 #undef RS6000_BUILTIN_0
1269 #undef RS6000_BUILTIN_1
1270 #undef RS6000_BUILTIN_2
1271 #undef RS6000_BUILTIN_3
1272 #undef RS6000_BUILTIN_A
1273 #undef RS6000_BUILTIN_D
1274 #undef RS6000_BUILTIN_H
1275 #undef RS6000_BUILTIN_P
1276 #undef RS6000_BUILTIN_X
1277
1278 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE) \
1279   { NAME, ICODE, MASK, ATTR },
1280
1281 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE) \
1282   { NAME, ICODE, MASK, ATTR },
1283
1284 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)  \
1285   { NAME, ICODE, MASK, ATTR },
1286
1287 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)  \
1288   { NAME, ICODE, MASK, ATTR },
1289
1290 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)  \
1291   { NAME, ICODE, MASK, ATTR },
1292
1293 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)  \
1294   { NAME, ICODE, MASK, ATTR },
1295
1296 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)  \
1297   { NAME, ICODE, MASK, ATTR },
1298
1299 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)  \
1300   { NAME, ICODE, MASK, ATTR },
1301
1302 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)  \
1303   { NAME, ICODE, MASK, ATTR },
1304
1305 struct rs6000_builtin_info_type {
1306   const char *name;
1307   const enum insn_code icode;
1308   const HOST_WIDE_INT mask;
1309   const unsigned attr;
1310 };
1311
1312 static const struct rs6000_builtin_info_type rs6000_builtin_info[] =
1313 {
1314 #include "rs6000-builtin.def"
1315 };
1316
1317 #undef RS6000_BUILTIN_0
1318 #undef RS6000_BUILTIN_1
1319 #undef RS6000_BUILTIN_2
1320 #undef RS6000_BUILTIN_3
1321 #undef RS6000_BUILTIN_A
1322 #undef RS6000_BUILTIN_D
1323 #undef RS6000_BUILTIN_H
1324 #undef RS6000_BUILTIN_P
1325 #undef RS6000_BUILTIN_X
1326
1327 /* Support for -mveclibabi=<xxx> to control which vector library to use.  */
1328 static tree (*rs6000_veclib_handler) (combined_fn, tree, tree);
1329
1330 \f
1331 static bool rs6000_debug_legitimate_address_p (machine_mode, rtx, bool);
1332 static struct machine_function * rs6000_init_machine_status (void);
1333 static int rs6000_ra_ever_killed (void);
1334 static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
1335 static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
1336 static tree rs6000_handle_struct_attribute (tree *, tree, tree, int, bool *);
1337 static tree rs6000_builtin_vectorized_libmass (combined_fn, tree, tree);
1338 static void rs6000_emit_set_long_const (rtx, HOST_WIDE_INT);
1339 static int rs6000_memory_move_cost (machine_mode, reg_class_t, bool);
1340 static bool rs6000_debug_rtx_costs (rtx, machine_mode, int, int, int *, bool);
1341 static int rs6000_debug_address_cost (rtx, machine_mode, addr_space_t,
1342                                       bool);
1343 static int rs6000_debug_adjust_cost (rtx_insn *, int, rtx_insn *, int,
1344                                      unsigned int);
1345 static bool is_microcoded_insn (rtx_insn *);
1346 static bool is_nonpipeline_insn (rtx_insn *);
1347 static bool is_cracked_insn (rtx_insn *);
1348 static bool is_load_insn (rtx, rtx *);
1349 static bool is_store_insn (rtx, rtx *);
1350 static bool set_to_load_agen (rtx_insn *,rtx_insn *);
1351 static bool insn_terminates_group_p (rtx_insn *, enum group_termination);
1352 static bool insn_must_be_first_in_group (rtx_insn *);
1353 static bool insn_must_be_last_in_group (rtx_insn *);
1354 static void altivec_init_builtins (void);
1355 static tree builtin_function_type (machine_mode, machine_mode,
1356                                    machine_mode, machine_mode,
1357                                    enum rs6000_builtins, const char *name);
1358 static void rs6000_common_init_builtins (void);
1359 static void htm_init_builtins (void);
1360 static rs6000_stack_t *rs6000_stack_info (void);
1361 static void is_altivec_return_reg (rtx, void *);
1362 int easy_vector_constant (rtx, machine_mode);
1363 static rtx rs6000_debug_legitimize_address (rtx, rtx, machine_mode);
1364 static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
1365 static rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, const_tree,
1366                                        bool, bool);
1367 #if TARGET_MACHO
1368 static void macho_branch_islands (void);
1369 static tree get_prev_label (tree);
1370 #endif
1371 static bool rs6000_mode_dependent_address (const_rtx);
1372 static bool rs6000_debug_mode_dependent_address (const_rtx);
1373 static bool rs6000_offsettable_memref_p (rtx, machine_mode, bool);
1374 static enum reg_class rs6000_secondary_reload_class (enum reg_class,
1375                                                      machine_mode, rtx);
1376 static enum reg_class rs6000_debug_secondary_reload_class (enum reg_class,
1377                                                            machine_mode,
1378                                                            rtx);
1379 static enum reg_class rs6000_preferred_reload_class (rtx, enum reg_class);
1380 static enum reg_class rs6000_debug_preferred_reload_class (rtx,
1381                                                            enum reg_class);
1382 static bool rs6000_debug_secondary_memory_needed (machine_mode,
1383                                                   reg_class_t,
1384                                                   reg_class_t);
1385 static bool rs6000_debug_can_change_mode_class (machine_mode,
1386                                                 machine_mode,
1387                                                 reg_class_t);
1388 static bool rs6000_save_toc_in_prologue_p (void);
1389 static rtx rs6000_internal_arg_pointer (void);
1390
1391 static bool (*rs6000_mode_dependent_address_ptr) (const_rtx)
1392   = rs6000_mode_dependent_address;
1393
1394 enum reg_class (*rs6000_secondary_reload_class_ptr) (enum reg_class,
1395                                                      machine_mode, rtx)
1396   = rs6000_secondary_reload_class;
1397
1398 enum reg_class (*rs6000_preferred_reload_class_ptr) (rtx, enum reg_class)
1399   = rs6000_preferred_reload_class;
1400
1401 const int INSN_NOT_AVAILABLE = -1;
1402
1403 static void rs6000_print_isa_options (FILE *, int, const char *,
1404                                       HOST_WIDE_INT);
1405 static void rs6000_print_builtin_options (FILE *, int, const char *,
1406                                           HOST_WIDE_INT);
1407 static HOST_WIDE_INT rs6000_disable_incompatible_switches (void);
1408
1409 static enum rs6000_reg_type register_to_reg_type (rtx, bool *);
1410 static bool rs6000_secondary_reload_move (enum rs6000_reg_type,
1411                                           enum rs6000_reg_type,
1412                                           machine_mode,
1413                                           secondary_reload_info *,
1414                                           bool);
1415 rtl_opt_pass *make_pass_analyze_swaps (gcc::context*);
1416 static bool rs6000_keep_leaf_when_profiled () __attribute__ ((unused));
1417 static tree rs6000_fold_builtin (tree, int, tree *, bool);
1418
1419 /* Hash table stuff for keeping track of TOC entries.  */
1420
1421 struct GTY((for_user)) toc_hash_struct
1422 {
1423   /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
1424      ASM_OUTPUT_SPECIAL_POOL_ENTRY_P.  */
1425   rtx key;
1426   machine_mode key_mode;
1427   int labelno;
1428 };
1429
1430 struct toc_hasher : ggc_ptr_hash<toc_hash_struct>
1431 {
1432   static hashval_t hash (toc_hash_struct *);
1433   static bool equal (toc_hash_struct *, toc_hash_struct *);
1434 };
1435
1436 static GTY (()) hash_table<toc_hasher> *toc_hash_table;
1437
1438 /* Hash table to keep track of the argument types for builtin functions.  */
1439
1440 struct GTY((for_user)) builtin_hash_struct
1441 {
1442   tree type;
1443   machine_mode mode[4]; /* return value + 3 arguments.  */
1444   unsigned char uns_p[4];       /* and whether the types are unsigned.  */
1445 };
1446
1447 struct builtin_hasher : ggc_ptr_hash<builtin_hash_struct>
1448 {
1449   static hashval_t hash (builtin_hash_struct *);
1450   static bool equal (builtin_hash_struct *, builtin_hash_struct *);
1451 };
1452
1453 static GTY (()) hash_table<builtin_hasher> *builtin_hash_table;
1454
1455 \f
1456 /* Default register names.  */
1457 char rs6000_reg_names[][8] =
1458 {
1459   /* GPRs */
1460       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1461       "8",  "9", "10", "11", "12", "13", "14", "15",
1462      "16", "17", "18", "19", "20", "21", "22", "23",
1463      "24", "25", "26", "27", "28", "29", "30", "31",
1464   /* FPRs */
1465       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1466       "8",  "9", "10", "11", "12", "13", "14", "15",
1467      "16", "17", "18", "19", "20", "21", "22", "23",
1468      "24", "25", "26", "27", "28", "29", "30", "31",
1469   /* VRs */
1470       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1471       "8",  "9", "10", "11", "12", "13", "14", "15",
1472      "16", "17", "18", "19", "20", "21", "22", "23",
1473      "24", "25", "26", "27", "28", "29", "30", "31",
1474   /* lr ctr ca ap */
1475      "lr", "ctr", "ca", "ap",
1476   /* cr0..cr7 */
1477       "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",
1478   /* vrsave vscr sfp */
1479       "vrsave", "vscr", "sfp",
1480 };
1481
1482 #ifdef TARGET_REGNAMES
1483 static const char alt_reg_names[][8] =
1484 {
1485   /* GPRs */
1486    "%r0",  "%r1",  "%r2",  "%r3",  "%r4",  "%r5",  "%r6",  "%r7",
1487    "%r8",  "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
1488   "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
1489   "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
1490   /* FPRs */
1491    "%f0",  "%f1",  "%f2",  "%f3",  "%f4",  "%f5",  "%f6",  "%f7",
1492    "%f8",  "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
1493   "%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
1494   "%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
1495   /* VRs */
1496    "%v0",  "%v1",  "%v2",  "%v3",  "%v4",  "%v5",  "%v6",  "%v7",
1497    "%v8",  "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
1498   "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
1499   "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
1500   /* lr ctr ca ap */
1501     "lr",  "ctr",   "ca",   "ap",
1502   /* cr0..cr7 */
1503   "%cr0",  "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
1504   /* vrsave vscr sfp */
1505   "vrsave", "vscr", "sfp",
1506 };
1507 #endif
1508
1509 /* Table of valid machine attributes.  */
1510
1511 static const struct attribute_spec rs6000_attribute_table[] =
1512 {
1513   /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
1514        affects_type_identity, handler, exclude } */
1515   { "altivec",   1, 1, false, true,  false, false,
1516     rs6000_handle_altivec_attribute, NULL },
1517   { "longcall",  0, 0, false, true,  true,  false,
1518     rs6000_handle_longcall_attribute, NULL },
1519   { "shortcall", 0, 0, false, true,  true,  false,
1520     rs6000_handle_longcall_attribute, NULL },
1521   { "ms_struct", 0, 0, false, false, false, false,
1522     rs6000_handle_struct_attribute, NULL },
1523   { "gcc_struct", 0, 0, false, false, false, false,
1524     rs6000_handle_struct_attribute, NULL },
1525 #ifdef SUBTARGET_ATTRIBUTE_TABLE
1526   SUBTARGET_ATTRIBUTE_TABLE,
1527 #endif
1528   { NULL,        0, 0, false, false, false, false, NULL, NULL }
1529 };
1530 \f
1531 #ifndef TARGET_PROFILE_KERNEL
1532 #define TARGET_PROFILE_KERNEL 0
1533 #endif
1534
1535 /* The VRSAVE bitmask puts bit %v0 as the most significant bit.  */
1536 #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
1537 \f
1538 /* Initialize the GCC target structure.  */
1539 #undef TARGET_ATTRIBUTE_TABLE
1540 #define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
1541 #undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
1542 #define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
1543 #undef TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P
1544 #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P rs6000_attribute_takes_identifier_p
1545
1546 #undef TARGET_ASM_ALIGNED_DI_OP
1547 #define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
1548
1549 /* Default unaligned ops are only provided for ELF.  Find the ops needed
1550    for non-ELF systems.  */
1551 #ifndef OBJECT_FORMAT_ELF
1552 #if TARGET_XCOFF
1553 /* For XCOFF.  rs6000_assemble_integer will handle unaligned DIs on
1554    64-bit targets.  */
1555 #undef TARGET_ASM_UNALIGNED_HI_OP
1556 #define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
1557 #undef TARGET_ASM_UNALIGNED_SI_OP
1558 #define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
1559 #undef TARGET_ASM_UNALIGNED_DI_OP
1560 #define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
1561 #else
1562 /* For Darwin.  */
1563 #undef TARGET_ASM_UNALIGNED_HI_OP
1564 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
1565 #undef TARGET_ASM_UNALIGNED_SI_OP
1566 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
1567 #undef TARGET_ASM_UNALIGNED_DI_OP
1568 #define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
1569 #undef TARGET_ASM_ALIGNED_DI_OP
1570 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
1571 #endif
1572 #endif
1573
1574 /* This hook deals with fixups for relocatable code and DI-mode objects
1575    in 64-bit code.  */
1576 #undef TARGET_ASM_INTEGER
1577 #define TARGET_ASM_INTEGER rs6000_assemble_integer
1578
1579 #if defined (HAVE_GAS_HIDDEN) && !TARGET_MACHO
1580 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
1581 #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
1582 #endif
1583
1584 #undef TARGET_SET_UP_BY_PROLOGUE
1585 #define TARGET_SET_UP_BY_PROLOGUE rs6000_set_up_by_prologue
1586
1587 #undef TARGET_SHRINK_WRAP_GET_SEPARATE_COMPONENTS
1588 #define TARGET_SHRINK_WRAP_GET_SEPARATE_COMPONENTS rs6000_get_separate_components
1589 #undef TARGET_SHRINK_WRAP_COMPONENTS_FOR_BB
1590 #define TARGET_SHRINK_WRAP_COMPONENTS_FOR_BB rs6000_components_for_bb
1591 #undef TARGET_SHRINK_WRAP_DISQUALIFY_COMPONENTS
1592 #define TARGET_SHRINK_WRAP_DISQUALIFY_COMPONENTS rs6000_disqualify_components
1593 #undef TARGET_SHRINK_WRAP_EMIT_PROLOGUE_COMPONENTS
1594 #define TARGET_SHRINK_WRAP_EMIT_PROLOGUE_COMPONENTS rs6000_emit_prologue_components
1595 #undef TARGET_SHRINK_WRAP_EMIT_EPILOGUE_COMPONENTS
1596 #define TARGET_SHRINK_WRAP_EMIT_EPILOGUE_COMPONENTS rs6000_emit_epilogue_components
1597 #undef TARGET_SHRINK_WRAP_SET_HANDLED_COMPONENTS
1598 #define TARGET_SHRINK_WRAP_SET_HANDLED_COMPONENTS rs6000_set_handled_components
1599
1600 #undef TARGET_EXTRA_LIVE_ON_ENTRY
1601 #define TARGET_EXTRA_LIVE_ON_ENTRY rs6000_live_on_entry
1602
1603 #undef TARGET_INTERNAL_ARG_POINTER
1604 #define TARGET_INTERNAL_ARG_POINTER rs6000_internal_arg_pointer
1605
1606 #undef TARGET_HAVE_TLS
1607 #define TARGET_HAVE_TLS HAVE_AS_TLS
1608
1609 #undef TARGET_CANNOT_FORCE_CONST_MEM
1610 #define TARGET_CANNOT_FORCE_CONST_MEM rs6000_cannot_force_const_mem
1611
1612 #undef TARGET_DELEGITIMIZE_ADDRESS
1613 #define TARGET_DELEGITIMIZE_ADDRESS rs6000_delegitimize_address
1614
1615 #undef TARGET_CONST_NOT_OK_FOR_DEBUG_P
1616 #define TARGET_CONST_NOT_OK_FOR_DEBUG_P rs6000_const_not_ok_for_debug_p
1617
1618 #undef TARGET_LEGITIMATE_COMBINED_INSN
1619 #define TARGET_LEGITIMATE_COMBINED_INSN rs6000_legitimate_combined_insn
1620
1621 #undef TARGET_ASM_FUNCTION_PROLOGUE
1622 #define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
1623 #undef TARGET_ASM_FUNCTION_EPILOGUE
1624 #define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
1625
1626 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
1627 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA rs6000_output_addr_const_extra
1628
1629 #undef TARGET_LEGITIMIZE_ADDRESS
1630 #define TARGET_LEGITIMIZE_ADDRESS rs6000_legitimize_address
1631
1632 #undef  TARGET_SCHED_VARIABLE_ISSUE
1633 #define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
1634
1635 #undef TARGET_SCHED_ISSUE_RATE
1636 #define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
1637 #undef TARGET_SCHED_ADJUST_COST
1638 #define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
1639 #undef TARGET_SCHED_ADJUST_PRIORITY
1640 #define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
1641 #undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
1642 #define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
1643 #undef TARGET_SCHED_INIT
1644 #define TARGET_SCHED_INIT rs6000_sched_init
1645 #undef TARGET_SCHED_FINISH
1646 #define TARGET_SCHED_FINISH rs6000_sched_finish
1647 #undef TARGET_SCHED_REORDER
1648 #define TARGET_SCHED_REORDER rs6000_sched_reorder
1649 #undef TARGET_SCHED_REORDER2
1650 #define TARGET_SCHED_REORDER2 rs6000_sched_reorder2
1651
1652 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
1653 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
1654
1655 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD
1656 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD rs6000_use_sched_lookahead_guard
1657
1658 #undef TARGET_SCHED_ALLOC_SCHED_CONTEXT
1659 #define TARGET_SCHED_ALLOC_SCHED_CONTEXT rs6000_alloc_sched_context
1660 #undef TARGET_SCHED_INIT_SCHED_CONTEXT
1661 #define TARGET_SCHED_INIT_SCHED_CONTEXT rs6000_init_sched_context
1662 #undef TARGET_SCHED_SET_SCHED_CONTEXT
1663 #define TARGET_SCHED_SET_SCHED_CONTEXT rs6000_set_sched_context
1664 #undef TARGET_SCHED_FREE_SCHED_CONTEXT
1665 #define TARGET_SCHED_FREE_SCHED_CONTEXT rs6000_free_sched_context
1666
1667 #undef TARGET_SCHED_CAN_SPECULATE_INSN
1668 #define TARGET_SCHED_CAN_SPECULATE_INSN rs6000_sched_can_speculate_insn
1669
1670 #undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD
1671 #define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load
1672 #undef TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
1673 #define TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT            \
1674   rs6000_builtin_support_vector_misalignment
1675 #undef TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE
1676 #define TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE rs6000_vector_alignment_reachable
1677 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
1678 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
1679   rs6000_builtin_vectorization_cost
1680 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
1681 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE \
1682   rs6000_preferred_simd_mode
1683 #undef TARGET_VECTORIZE_INIT_COST
1684 #define TARGET_VECTORIZE_INIT_COST rs6000_init_cost
1685 #undef TARGET_VECTORIZE_ADD_STMT_COST
1686 #define TARGET_VECTORIZE_ADD_STMT_COST rs6000_add_stmt_cost
1687 #undef TARGET_VECTORIZE_FINISH_COST
1688 #define TARGET_VECTORIZE_FINISH_COST rs6000_finish_cost
1689 #undef TARGET_VECTORIZE_DESTROY_COST_DATA
1690 #define TARGET_VECTORIZE_DESTROY_COST_DATA rs6000_destroy_cost_data
1691
1692 #undef TARGET_INIT_BUILTINS
1693 #define TARGET_INIT_BUILTINS rs6000_init_builtins
1694 #undef TARGET_BUILTIN_DECL
1695 #define TARGET_BUILTIN_DECL rs6000_builtin_decl
1696
1697 #undef TARGET_FOLD_BUILTIN
1698 #define TARGET_FOLD_BUILTIN rs6000_fold_builtin
1699 #undef TARGET_GIMPLE_FOLD_BUILTIN
1700 #define TARGET_GIMPLE_FOLD_BUILTIN rs6000_gimple_fold_builtin
1701
1702 #undef TARGET_EXPAND_BUILTIN
1703 #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
1704
1705 #undef TARGET_MANGLE_TYPE
1706 #define TARGET_MANGLE_TYPE rs6000_mangle_type
1707
1708 #undef TARGET_INIT_LIBFUNCS
1709 #define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
1710
1711 #if TARGET_MACHO
1712 #undef TARGET_BINDS_LOCAL_P
1713 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
1714 #endif
1715
1716 #undef TARGET_MS_BITFIELD_LAYOUT_P
1717 #define TARGET_MS_BITFIELD_LAYOUT_P rs6000_ms_bitfield_layout_p
1718
1719 #undef TARGET_ASM_OUTPUT_MI_THUNK
1720 #define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
1721
1722 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
1723 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
1724
1725 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
1726 #define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
1727
1728 #undef TARGET_REGISTER_MOVE_COST
1729 #define TARGET_REGISTER_MOVE_COST rs6000_register_move_cost
1730 #undef TARGET_MEMORY_MOVE_COST
1731 #define TARGET_MEMORY_MOVE_COST rs6000_memory_move_cost
1732 #undef TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS
1733 #define TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS \
1734   rs6000_ira_change_pseudo_allocno_class
1735 #undef TARGET_CANNOT_COPY_INSN_P
1736 #define TARGET_CANNOT_COPY_INSN_P rs6000_cannot_copy_insn_p
1737 #undef TARGET_RTX_COSTS
1738 #define TARGET_RTX_COSTS rs6000_rtx_costs
1739 #undef TARGET_ADDRESS_COST
1740 #define TARGET_ADDRESS_COST hook_int_rtx_mode_as_bool_0
1741 #undef TARGET_INSN_COST
1742 #define TARGET_INSN_COST rs6000_insn_cost
1743
1744 #undef TARGET_INIT_DWARF_REG_SIZES_EXTRA
1745 #define TARGET_INIT_DWARF_REG_SIZES_EXTRA rs6000_init_dwarf_reg_sizes_extra
1746
1747 #undef TARGET_PROMOTE_FUNCTION_MODE
1748 #define TARGET_PROMOTE_FUNCTION_MODE rs6000_promote_function_mode
1749
1750 #undef TARGET_RETURN_IN_MEMORY
1751 #define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
1752
1753 #undef TARGET_RETURN_IN_MSB
1754 #define TARGET_RETURN_IN_MSB rs6000_return_in_msb
1755
1756 #undef TARGET_SETUP_INCOMING_VARARGS
1757 #define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
1758
1759 /* Always strict argument naming on rs6000.  */
1760 #undef TARGET_STRICT_ARGUMENT_NAMING
1761 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
1762 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
1763 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
1764 #undef TARGET_SPLIT_COMPLEX_ARG
1765 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true
1766 #undef TARGET_MUST_PASS_IN_STACK
1767 #define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
1768 #undef TARGET_PASS_BY_REFERENCE
1769 #define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
1770 #undef TARGET_ARG_PARTIAL_BYTES
1771 #define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes
1772 #undef TARGET_FUNCTION_ARG_ADVANCE
1773 #define TARGET_FUNCTION_ARG_ADVANCE rs6000_function_arg_advance
1774 #undef TARGET_FUNCTION_ARG
1775 #define TARGET_FUNCTION_ARG rs6000_function_arg
1776 #undef TARGET_FUNCTION_ARG_PADDING
1777 #define TARGET_FUNCTION_ARG_PADDING rs6000_function_arg_padding
1778 #undef TARGET_FUNCTION_ARG_BOUNDARY
1779 #define TARGET_FUNCTION_ARG_BOUNDARY rs6000_function_arg_boundary
1780
1781 #undef TARGET_BUILD_BUILTIN_VA_LIST
1782 #define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
1783
1784 #undef TARGET_EXPAND_BUILTIN_VA_START
1785 #define TARGET_EXPAND_BUILTIN_VA_START rs6000_va_start
1786
1787 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
1788 #define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
1789
1790 #undef TARGET_EH_RETURN_FILTER_MODE
1791 #define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
1792
1793 #undef TARGET_TRANSLATE_MODE_ATTRIBUTE
1794 #define TARGET_TRANSLATE_MODE_ATTRIBUTE rs6000_translate_mode_attribute
1795
1796 #undef TARGET_SCALAR_MODE_SUPPORTED_P
1797 #define TARGET_SCALAR_MODE_SUPPORTED_P rs6000_scalar_mode_supported_p
1798
1799 #undef TARGET_VECTOR_MODE_SUPPORTED_P
1800 #define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p
1801
1802 #undef TARGET_FLOATN_MODE
1803 #define TARGET_FLOATN_MODE rs6000_floatn_mode
1804
1805 #undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
1806 #define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn
1807
1808 #undef TARGET_MD_ASM_ADJUST
1809 #define TARGET_MD_ASM_ADJUST rs6000_md_asm_adjust
1810
1811 #undef TARGET_OPTION_OVERRIDE
1812 #define TARGET_OPTION_OVERRIDE rs6000_option_override
1813
1814 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
1815 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
1816   rs6000_builtin_vectorized_function
1817
1818 #undef TARGET_VECTORIZE_BUILTIN_MD_VECTORIZED_FUNCTION
1819 #define TARGET_VECTORIZE_BUILTIN_MD_VECTORIZED_FUNCTION \
1820   rs6000_builtin_md_vectorized_function
1821
1822 #undef TARGET_STACK_PROTECT_GUARD
1823 #define TARGET_STACK_PROTECT_GUARD rs6000_init_stack_protect_guard
1824
1825 #if !TARGET_MACHO
1826 #undef TARGET_STACK_PROTECT_FAIL
1827 #define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail
1828 #endif
1829
1830 #ifdef HAVE_AS_TLS
1831 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
1832 #define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
1833 #endif
1834
1835 /* Use a 32-bit anchor range.  This leads to sequences like:
1836
1837         addis   tmp,anchor,high
1838         add     dest,tmp,low
1839
1840    where tmp itself acts as an anchor, and can be shared between
1841    accesses to the same 64k page.  */
1842 #undef TARGET_MIN_ANCHOR_OFFSET
1843 #define TARGET_MIN_ANCHOR_OFFSET -0x7fffffff - 1
1844 #undef TARGET_MAX_ANCHOR_OFFSET
1845 #define TARGET_MAX_ANCHOR_OFFSET 0x7fffffff
1846 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
1847 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P rs6000_use_blocks_for_constant_p
1848 #undef TARGET_USE_BLOCKS_FOR_DECL_P
1849 #define TARGET_USE_BLOCKS_FOR_DECL_P rs6000_use_blocks_for_decl_p
1850
1851 #undef TARGET_BUILTIN_RECIPROCAL
1852 #define TARGET_BUILTIN_RECIPROCAL rs6000_builtin_reciprocal
1853
1854 #undef TARGET_SECONDARY_RELOAD
1855 #define TARGET_SECONDARY_RELOAD rs6000_secondary_reload
1856 #undef TARGET_SECONDARY_MEMORY_NEEDED
1857 #define TARGET_SECONDARY_MEMORY_NEEDED rs6000_secondary_memory_needed
1858 #undef TARGET_SECONDARY_MEMORY_NEEDED_MODE
1859 #define TARGET_SECONDARY_MEMORY_NEEDED_MODE rs6000_secondary_memory_needed_mode
1860
1861 #undef TARGET_LEGITIMATE_ADDRESS_P
1862 #define TARGET_LEGITIMATE_ADDRESS_P rs6000_legitimate_address_p
1863
1864 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
1865 #define TARGET_MODE_DEPENDENT_ADDRESS_P rs6000_mode_dependent_address_p
1866
1867 #undef TARGET_COMPUTE_PRESSURE_CLASSES
1868 #define TARGET_COMPUTE_PRESSURE_CLASSES rs6000_compute_pressure_classes
1869
1870 #undef TARGET_CAN_ELIMINATE
1871 #define TARGET_CAN_ELIMINATE rs6000_can_eliminate
1872
1873 #undef TARGET_CONDITIONAL_REGISTER_USAGE
1874 #define TARGET_CONDITIONAL_REGISTER_USAGE rs6000_conditional_register_usage
1875
1876 #undef TARGET_SCHED_REASSOCIATION_WIDTH
1877 #define TARGET_SCHED_REASSOCIATION_WIDTH rs6000_reassociation_width
1878
1879 #undef TARGET_TRAMPOLINE_INIT
1880 #define TARGET_TRAMPOLINE_INIT rs6000_trampoline_init
1881
1882 #undef TARGET_FUNCTION_VALUE
1883 #define TARGET_FUNCTION_VALUE rs6000_function_value
1884
1885 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
1886 #define TARGET_OPTION_VALID_ATTRIBUTE_P rs6000_valid_attribute_p
1887
1888 #undef TARGET_OPTION_SAVE
1889 #define TARGET_OPTION_SAVE rs6000_function_specific_save
1890
1891 #undef TARGET_OPTION_RESTORE
1892 #define TARGET_OPTION_RESTORE rs6000_function_specific_restore
1893
1894 #undef TARGET_OPTION_PRINT
1895 #define TARGET_OPTION_PRINT rs6000_function_specific_print
1896
1897 #undef TARGET_CAN_INLINE_P
1898 #define TARGET_CAN_INLINE_P rs6000_can_inline_p
1899
1900 #undef TARGET_SET_CURRENT_FUNCTION
1901 #define TARGET_SET_CURRENT_FUNCTION rs6000_set_current_function
1902
1903 #undef TARGET_LEGITIMATE_CONSTANT_P
1904 #define TARGET_LEGITIMATE_CONSTANT_P rs6000_legitimate_constant_p
1905
1906 #undef TARGET_VECTORIZE_VEC_PERM_CONST
1907 #define TARGET_VECTORIZE_VEC_PERM_CONST rs6000_vectorize_vec_perm_const
1908
1909 #undef TARGET_CAN_USE_DOLOOP_P
1910 #define TARGET_CAN_USE_DOLOOP_P can_use_doloop_if_innermost
1911
1912 #undef TARGET_ATOMIC_ASSIGN_EXPAND_FENV
1913 #define TARGET_ATOMIC_ASSIGN_EXPAND_FENV rs6000_atomic_assign_expand_fenv
1914
1915 #undef TARGET_LIBGCC_CMP_RETURN_MODE
1916 #define TARGET_LIBGCC_CMP_RETURN_MODE rs6000_abi_word_mode
1917 #undef TARGET_LIBGCC_SHIFT_COUNT_MODE
1918 #define TARGET_LIBGCC_SHIFT_COUNT_MODE rs6000_abi_word_mode
1919 #undef TARGET_UNWIND_WORD_MODE
1920 #define TARGET_UNWIND_WORD_MODE rs6000_abi_word_mode
1921
1922 #undef TARGET_OFFLOAD_OPTIONS
1923 #define TARGET_OFFLOAD_OPTIONS rs6000_offload_options
1924
1925 #undef TARGET_C_MODE_FOR_SUFFIX
1926 #define TARGET_C_MODE_FOR_SUFFIX rs6000_c_mode_for_suffix
1927
1928 #undef TARGET_INVALID_BINARY_OP
1929 #define TARGET_INVALID_BINARY_OP rs6000_invalid_binary_op
1930
1931 #undef TARGET_OPTAB_SUPPORTED_P
1932 #define TARGET_OPTAB_SUPPORTED_P rs6000_optab_supported_p
1933
1934 #undef TARGET_CUSTOM_FUNCTION_DESCRIPTORS
1935 #define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 1
1936
1937 #undef TARGET_COMPARE_VERSION_PRIORITY
1938 #define TARGET_COMPARE_VERSION_PRIORITY rs6000_compare_version_priority
1939
1940 #undef TARGET_GENERATE_VERSION_DISPATCHER_BODY
1941 #define TARGET_GENERATE_VERSION_DISPATCHER_BODY                         \
1942   rs6000_generate_version_dispatcher_body
1943
1944 #undef TARGET_GET_FUNCTION_VERSIONS_DISPATCHER
1945 #define TARGET_GET_FUNCTION_VERSIONS_DISPATCHER                         \
1946   rs6000_get_function_versions_dispatcher
1947
1948 #undef TARGET_OPTION_FUNCTION_VERSIONS
1949 #define TARGET_OPTION_FUNCTION_VERSIONS common_function_versions
1950
1951 #undef TARGET_HARD_REGNO_NREGS
1952 #define TARGET_HARD_REGNO_NREGS rs6000_hard_regno_nregs_hook
1953 #undef TARGET_HARD_REGNO_MODE_OK
1954 #define TARGET_HARD_REGNO_MODE_OK rs6000_hard_regno_mode_ok
1955
1956 #undef TARGET_MODES_TIEABLE_P
1957 #define TARGET_MODES_TIEABLE_P rs6000_modes_tieable_p
1958
1959 #undef TARGET_HARD_REGNO_CALL_PART_CLOBBERED
1960 #define TARGET_HARD_REGNO_CALL_PART_CLOBBERED \
1961   rs6000_hard_regno_call_part_clobbered
1962
1963 #undef TARGET_SLOW_UNALIGNED_ACCESS
1964 #define TARGET_SLOW_UNALIGNED_ACCESS rs6000_slow_unaligned_access
1965
1966 #undef TARGET_CAN_CHANGE_MODE_CLASS
1967 #define TARGET_CAN_CHANGE_MODE_CLASS rs6000_can_change_mode_class
1968
1969 #undef TARGET_CONSTANT_ALIGNMENT
1970 #define TARGET_CONSTANT_ALIGNMENT rs6000_constant_alignment
1971
1972 #undef TARGET_STARTING_FRAME_OFFSET
1973 #define TARGET_STARTING_FRAME_OFFSET rs6000_starting_frame_offset
1974
1975 #if TARGET_ELF && RS6000_WEAK
1976 #undef TARGET_ASM_GLOBALIZE_DECL_NAME
1977 #define TARGET_ASM_GLOBALIZE_DECL_NAME rs6000_globalize_decl_name
1978 #endif
1979
1980 #undef TARGET_SETJMP_PRESERVES_NONVOLATILE_REGS_P
1981 #define TARGET_SETJMP_PRESERVES_NONVOLATILE_REGS_P hook_bool_void_true
1982
1983 #undef TARGET_MANGLE_DECL_ASSEMBLER_NAME
1984 #define TARGET_MANGLE_DECL_ASSEMBLER_NAME rs6000_mangle_decl_assembler_name
1985 \f
1986
1987 /* Processor table.  */
1988 struct rs6000_ptt
1989 {
1990   const char *const name;               /* Canonical processor name.  */
1991   const enum processor_type processor;  /* Processor type enum value.  */
1992   const HOST_WIDE_INT target_enable;    /* Target flags to enable.  */
1993 };
1994
1995 static struct rs6000_ptt const processor_target_table[] =
1996 {
1997 #define RS6000_CPU(NAME, CPU, FLAGS) { NAME, CPU, FLAGS },
1998 #include "rs6000-cpus.def"
1999 #undef RS6000_CPU
2000 };
2001
2002 /* Look up a processor name for -mcpu=xxx and -mtune=xxx.  Return -1 if the
2003    name is invalid.  */
2004
2005 static int
2006 rs6000_cpu_name_lookup (const char *name)
2007 {
2008   size_t i;
2009
2010   if (name != NULL)
2011     {
2012       for (i = 0; i < ARRAY_SIZE (processor_target_table); i++)
2013         if (! strcmp (name, processor_target_table[i].name))
2014           return (int)i;
2015     }
2016
2017   return -1;
2018 }
2019
2020 \f
2021 /* Return number of consecutive hard regs needed starting at reg REGNO
2022    to hold something of mode MODE.
2023    This is ordinarily the length in words of a value of mode MODE
2024    but can be less for certain modes in special long registers.
2025
2026    POWER and PowerPC GPRs hold 32 bits worth;
2027    PowerPC64 GPRs and FPRs point register holds 64 bits worth.  */
2028
2029 static int
2030 rs6000_hard_regno_nregs_internal (int regno, machine_mode mode)
2031 {
2032   unsigned HOST_WIDE_INT reg_size;
2033
2034   /* 128-bit floating point usually takes 2 registers, unless it is IEEE
2035      128-bit floating point that can go in vector registers, which has VSX
2036      memory addressing.  */
2037   if (FP_REGNO_P (regno))
2038     reg_size = (VECTOR_MEM_VSX_P (mode) || FLOAT128_VECTOR_P (mode)
2039                 ? UNITS_PER_VSX_WORD
2040                 : UNITS_PER_FP_WORD);
2041
2042   else if (ALTIVEC_REGNO_P (regno))
2043     reg_size = UNITS_PER_ALTIVEC_WORD;
2044
2045   else
2046     reg_size = UNITS_PER_WORD;
2047
2048   return (GET_MODE_SIZE (mode) + reg_size - 1) / reg_size;
2049 }
2050
2051 /* Value is 1 if hard register REGNO can hold a value of machine-mode
2052    MODE.  */
2053 static int
2054 rs6000_hard_regno_mode_ok_uncached (int regno, machine_mode mode)
2055 {
2056   int last_regno = regno + rs6000_hard_regno_nregs[mode][regno] - 1;
2057
2058   if (COMPLEX_MODE_P (mode))
2059     mode = GET_MODE_INNER (mode);
2060
2061   /* PTImode can only go in GPRs.  Quad word memory operations require even/odd
2062      register combinations, and use PTImode where we need to deal with quad
2063      word memory operations.  Don't allow quad words in the argument or frame
2064      pointer registers, just registers 0..31.  */
2065   if (mode == PTImode)
2066     return (IN_RANGE (regno, FIRST_GPR_REGNO, LAST_GPR_REGNO)
2067             && IN_RANGE (last_regno, FIRST_GPR_REGNO, LAST_GPR_REGNO)
2068             && ((regno & 1) == 0));
2069
2070   /* VSX registers that overlap the FPR registers are larger than for non-VSX
2071      implementations.  Don't allow an item to be split between a FP register
2072      and an Altivec register.  Allow TImode in all VSX registers if the user
2073      asked for it.  */
2074   if (TARGET_VSX && VSX_REGNO_P (regno)
2075       && (VECTOR_MEM_VSX_P (mode)
2076           || FLOAT128_VECTOR_P (mode)
2077           || reg_addr[mode].scalar_in_vmx_p
2078           || mode == TImode
2079           || (TARGET_VADDUQM && mode == V1TImode)))
2080     {
2081       if (FP_REGNO_P (regno))
2082         return FP_REGNO_P (last_regno);
2083
2084       if (ALTIVEC_REGNO_P (regno))
2085         {
2086           if (GET_MODE_SIZE (mode) != 16 && !reg_addr[mode].scalar_in_vmx_p)
2087             return 0;
2088
2089           return ALTIVEC_REGNO_P (last_regno);
2090         }
2091     }
2092
2093   /* The GPRs can hold any mode, but values bigger than one register
2094      cannot go past R31.  */
2095   if (INT_REGNO_P (regno))
2096     return INT_REGNO_P (last_regno);
2097
2098   /* The float registers (except for VSX vector modes) can only hold floating
2099      modes and DImode.  */
2100   if (FP_REGNO_P (regno))
2101     {
2102       if (FLOAT128_VECTOR_P (mode))
2103         return false;
2104
2105       if (SCALAR_FLOAT_MODE_P (mode)
2106           && (mode != TDmode || (regno % 2) == 0)
2107           && FP_REGNO_P (last_regno))
2108         return 1;
2109
2110       if (GET_MODE_CLASS (mode) == MODE_INT)
2111         {
2112           if(GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD)
2113             return 1;
2114
2115           if (TARGET_P8_VECTOR && (mode == SImode))
2116             return 1;
2117
2118           if (TARGET_P9_VECTOR && (mode == QImode || mode == HImode))
2119             return 1;
2120         }
2121
2122       return 0;
2123     }
2124
2125   /* The CR register can only hold CC modes.  */
2126   if (CR_REGNO_P (regno))
2127     return GET_MODE_CLASS (mode) == MODE_CC;
2128
2129   if (CA_REGNO_P (regno))
2130     return mode == Pmode || mode == SImode;
2131
2132   /* AltiVec only in AldyVec registers.  */
2133   if (ALTIVEC_REGNO_P (regno))
2134     return (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
2135             || mode == V1TImode);
2136
2137   /* We cannot put non-VSX TImode or PTImode anywhere except general register
2138      and it must be able to fit within the register set.  */
2139
2140   return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
2141 }
2142
2143 /* Implement TARGET_HARD_REGNO_NREGS.  */
2144
2145 static unsigned int
2146 rs6000_hard_regno_nregs_hook (unsigned int regno, machine_mode mode)
2147 {
2148   return rs6000_hard_regno_nregs[mode][regno];
2149 }
2150
2151 /* Implement TARGET_HARD_REGNO_MODE_OK.  */
2152
2153 static bool
2154 rs6000_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
2155 {
2156   return rs6000_hard_regno_mode_ok_p[mode][regno];
2157 }
2158
2159 /* Implement TARGET_MODES_TIEABLE_P.
2160
2161    PTImode cannot tie with other modes because PTImode is restricted to even
2162    GPR registers, and TImode can go in any GPR as well as VSX registers (PR
2163    57744).
2164
2165    Altivec/VSX vector tests were moved ahead of scalar float mode, so that IEEE
2166    128-bit floating point on VSX systems ties with other vectors.  */
2167
2168 static bool
2169 rs6000_modes_tieable_p (machine_mode mode1, machine_mode mode2)
2170 {
2171   if (mode1 == PTImode)
2172     return mode2 == PTImode;
2173   if (mode2 == PTImode)
2174     return false;
2175
2176   if (ALTIVEC_OR_VSX_VECTOR_MODE (mode1))
2177     return ALTIVEC_OR_VSX_VECTOR_MODE (mode2);
2178   if (ALTIVEC_OR_VSX_VECTOR_MODE (mode2))
2179     return false;
2180
2181   if (SCALAR_FLOAT_MODE_P (mode1))
2182     return SCALAR_FLOAT_MODE_P (mode2);
2183   if (SCALAR_FLOAT_MODE_P (mode2))
2184     return false;
2185
2186   if (GET_MODE_CLASS (mode1) == MODE_CC)
2187     return GET_MODE_CLASS (mode2) == MODE_CC;
2188   if (GET_MODE_CLASS (mode2) == MODE_CC)
2189     return false;
2190
2191   return true;
2192 }
2193
2194 /* Implement TARGET_HARD_REGNO_CALL_PART_CLOBBERED.  */
2195
2196 static bool
2197 rs6000_hard_regno_call_part_clobbered (rtx_insn *insn ATTRIBUTE_UNUSED,
2198                                        unsigned int regno, machine_mode mode)
2199 {
2200   if (TARGET_32BIT
2201       && TARGET_POWERPC64
2202       && GET_MODE_SIZE (mode) > 4
2203       && INT_REGNO_P (regno))
2204     return true;
2205
2206   if (TARGET_VSX
2207       && FP_REGNO_P (regno)
2208       && GET_MODE_SIZE (mode) > 8
2209       && !FLOAT128_2REG_P (mode))
2210     return true;
2211
2212   return false;
2213 }
2214
2215 /* Print interesting facts about registers.  */
2216 static void
2217 rs6000_debug_reg_print (int first_regno, int last_regno, const char *reg_name)
2218 {
2219   int r, m;
2220
2221   for (r = first_regno; r <= last_regno; ++r)
2222     {
2223       const char *comma = "";
2224       int len;
2225
2226       if (first_regno == last_regno)
2227         fprintf (stderr, "%s:\t", reg_name);
2228       else
2229         fprintf (stderr, "%s%d:\t", reg_name, r - first_regno);
2230
2231       len = 8;
2232       for (m = 0; m < NUM_MACHINE_MODES; ++m)
2233         if (rs6000_hard_regno_mode_ok_p[m][r] && rs6000_hard_regno_nregs[m][r])
2234           {
2235             if (len > 70)
2236               {
2237                 fprintf (stderr, ",\n\t");
2238                 len = 8;
2239                 comma = "";
2240               }
2241
2242             if (rs6000_hard_regno_nregs[m][r] > 1)
2243               len += fprintf (stderr, "%s%s/%d", comma, GET_MODE_NAME (m),
2244                              rs6000_hard_regno_nregs[m][r]);
2245             else
2246               len += fprintf (stderr, "%s%s", comma, GET_MODE_NAME (m));
2247
2248             comma = ", ";
2249           }
2250
2251       if (call_used_regs[r])
2252         {
2253           if (len > 70)
2254             {
2255               fprintf (stderr, ",\n\t");
2256               len = 8;
2257               comma = "";
2258             }
2259
2260           len += fprintf (stderr, "%s%s", comma, "call-used");
2261           comma = ", ";
2262         }
2263
2264       if (fixed_regs[r])
2265         {
2266           if (len > 70)
2267             {
2268               fprintf (stderr, ",\n\t");
2269               len = 8;
2270               comma = "";
2271             }
2272
2273           len += fprintf (stderr, "%s%s", comma, "fixed");
2274           comma = ", ";
2275         }
2276
2277       if (len > 70)
2278         {
2279           fprintf (stderr, ",\n\t");
2280           comma = "";
2281         }
2282
2283       len += fprintf (stderr, "%sreg-class = %s", comma,
2284                       reg_class_names[(int)rs6000_regno_regclass[r]]);
2285       comma = ", ";
2286
2287       if (len > 70)
2288         {
2289           fprintf (stderr, ",\n\t");
2290           comma = "";
2291         }
2292
2293       fprintf (stderr, "%sregno = %d\n", comma, r);
2294     }
2295 }
2296
2297 static const char *
2298 rs6000_debug_vector_unit (enum rs6000_vector v)
2299 {
2300   const char *ret;
2301
2302   switch (v)
2303     {
2304     case VECTOR_NONE:      ret = "none";      break;
2305     case VECTOR_ALTIVEC:   ret = "altivec";   break;
2306     case VECTOR_VSX:       ret = "vsx";       break;
2307     case VECTOR_P8_VECTOR: ret = "p8_vector"; break;
2308     default:               ret = "unknown";   break;
2309     }
2310
2311   return ret;
2312 }
2313
2314 /* Inner function printing just the address mask for a particular reload
2315    register class.  */
2316 DEBUG_FUNCTION char *
2317 rs6000_debug_addr_mask (addr_mask_type mask, bool keep_spaces)
2318 {
2319   static char ret[8];
2320   char *p = ret;
2321
2322   if ((mask & RELOAD_REG_VALID) != 0)
2323     *p++ = 'v';
2324   else if (keep_spaces)
2325     *p++ = ' ';
2326
2327   if ((mask & RELOAD_REG_MULTIPLE) != 0)
2328     *p++ = 'm';
2329   else if (keep_spaces)
2330     *p++ = ' ';
2331
2332   if ((mask & RELOAD_REG_INDEXED) != 0)
2333     *p++ = 'i';
2334   else if (keep_spaces)
2335     *p++ = ' ';
2336
2337   if ((mask & RELOAD_REG_QUAD_OFFSET) != 0)
2338     *p++ = 'O';
2339   else if ((mask & RELOAD_REG_OFFSET) != 0)
2340     *p++ = 'o';
2341   else if (keep_spaces)
2342     *p++ = ' ';
2343
2344   if ((mask & RELOAD_REG_PRE_INCDEC) != 0)
2345     *p++ = '+';
2346   else if (keep_spaces)
2347     *p++ = ' ';
2348
2349   if ((mask & RELOAD_REG_PRE_MODIFY) != 0)
2350     *p++ = '+';
2351   else if (keep_spaces)
2352     *p++ = ' ';
2353
2354   if ((mask & RELOAD_REG_AND_M16) != 0)
2355     *p++ = '&';
2356   else if (keep_spaces)
2357     *p++ = ' ';
2358
2359   *p = '\0';
2360
2361   return ret;
2362 }
2363
2364 /* Print the address masks in a human readble fashion.  */
2365 DEBUG_FUNCTION void
2366 rs6000_debug_print_mode (ssize_t m)
2367 {
2368   ssize_t rc;
2369   int spaces = 0;
2370
2371   fprintf (stderr, "Mode: %-5s", GET_MODE_NAME (m));
2372   for (rc = 0; rc < N_RELOAD_REG; rc++)
2373     fprintf (stderr, " %s: %s", reload_reg_map[rc].name,
2374              rs6000_debug_addr_mask (reg_addr[m].addr_mask[rc], true));
2375
2376   if ((reg_addr[m].reload_store != CODE_FOR_nothing)
2377       || (reg_addr[m].reload_load != CODE_FOR_nothing))
2378     {
2379       fprintf (stderr, "%*s  Reload=%c%c", spaces, "",
2380                (reg_addr[m].reload_store != CODE_FOR_nothing) ? 's' : '*',
2381                (reg_addr[m].reload_load != CODE_FOR_nothing) ? 'l' : '*');
2382       spaces = 0;
2383     }
2384   else
2385     spaces += sizeof ("  Reload=sl") - 1;
2386
2387   if (reg_addr[m].scalar_in_vmx_p)
2388     {
2389       fprintf (stderr, "%*s  Upper=y", spaces, "");
2390       spaces = 0;
2391     }
2392   else
2393     spaces += sizeof ("  Upper=y") - 1;
2394
2395   if (rs6000_vector_unit[m] != VECTOR_NONE
2396       || rs6000_vector_mem[m] != VECTOR_NONE)
2397     {
2398       fprintf (stderr, "%*s  vector: arith=%-10s mem=%s",
2399                spaces, "",
2400                rs6000_debug_vector_unit (rs6000_vector_unit[m]),
2401                rs6000_debug_vector_unit (rs6000_vector_mem[m]));
2402     }
2403
2404   fputs ("\n", stderr);
2405 }
2406
2407 #define DEBUG_FMT_ID "%-32s= "
2408 #define DEBUG_FMT_D   DEBUG_FMT_ID "%d\n"
2409 #define DEBUG_FMT_WX  DEBUG_FMT_ID "%#.12" HOST_WIDE_INT_PRINT "x: "
2410 #define DEBUG_FMT_S   DEBUG_FMT_ID "%s\n"
2411
2412 /* Print various interesting information with -mdebug=reg.  */
2413 static void
2414 rs6000_debug_reg_global (void)
2415 {
2416   static const char *const tf[2] = { "false", "true" };
2417   const char *nl = (const char *)0;
2418   int m;
2419   size_t m1, m2, v;
2420   char costly_num[20];
2421   char nop_num[20];
2422   char flags_buffer[40];
2423   const char *costly_str;
2424   const char *nop_str;
2425   const char *trace_str;
2426   const char *abi_str;
2427   const char *cmodel_str;
2428   struct cl_target_option cl_opts;
2429
2430   /* Modes we want tieable information on.  */
2431   static const machine_mode print_tieable_modes[] = {
2432     QImode,
2433     HImode,
2434     SImode,
2435     DImode,
2436     TImode,
2437     PTImode,
2438     SFmode,
2439     DFmode,
2440     TFmode,
2441     IFmode,
2442     KFmode,
2443     SDmode,
2444     DDmode,
2445     TDmode,
2446     V16QImode,
2447     V8HImode,
2448     V4SImode,
2449     V2DImode,
2450     V1TImode,
2451     V32QImode,
2452     V16HImode,
2453     V8SImode,
2454     V4DImode,
2455     V2TImode,
2456     V4SFmode,
2457     V2DFmode,
2458     V8SFmode,
2459     V4DFmode,
2460     CCmode,
2461     CCUNSmode,
2462     CCEQmode,
2463   };
2464
2465   /* Virtual regs we are interested in.  */
2466   const static struct {
2467     int regno;                  /* register number.  */
2468     const char *name;           /* register name.  */
2469   } virtual_regs[] = {
2470     { STACK_POINTER_REGNUM,                     "stack pointer:" },
2471     { TOC_REGNUM,                               "toc:          " },
2472     { STATIC_CHAIN_REGNUM,                      "static chain: " },
2473     { RS6000_PIC_OFFSET_TABLE_REGNUM,           "pic offset:   " },
2474     { HARD_FRAME_POINTER_REGNUM,                "hard frame:   " },
2475     { ARG_POINTER_REGNUM,                       "arg pointer:  " },
2476     { FRAME_POINTER_REGNUM,                     "frame pointer:" },
2477     { FIRST_PSEUDO_REGISTER,                    "first pseudo: " },
2478     { FIRST_VIRTUAL_REGISTER,                   "first virtual:" },
2479     { VIRTUAL_INCOMING_ARGS_REGNUM,             "incoming_args:" },
2480     { VIRTUAL_STACK_VARS_REGNUM,                "stack_vars:   " },
2481     { VIRTUAL_STACK_DYNAMIC_REGNUM,             "stack_dynamic:" },
2482     { VIRTUAL_OUTGOING_ARGS_REGNUM,             "outgoing_args:" },
2483     { VIRTUAL_CFA_REGNUM,                       "cfa (frame):  " },
2484     { VIRTUAL_PREFERRED_STACK_BOUNDARY_REGNUM,  "stack boundry:" },
2485     { LAST_VIRTUAL_REGISTER,                    "last virtual: " },
2486   };
2487
2488   fputs ("\nHard register information:\n", stderr);
2489   rs6000_debug_reg_print (FIRST_GPR_REGNO, LAST_GPR_REGNO, "gr");
2490   rs6000_debug_reg_print (FIRST_FPR_REGNO, LAST_FPR_REGNO, "fp");
2491   rs6000_debug_reg_print (FIRST_ALTIVEC_REGNO,
2492                           LAST_ALTIVEC_REGNO,
2493                           "vs");
2494   rs6000_debug_reg_print (LR_REGNO, LR_REGNO, "lr");
2495   rs6000_debug_reg_print (CTR_REGNO, CTR_REGNO, "ctr");
2496   rs6000_debug_reg_print (CR0_REGNO, CR7_REGNO, "cr");
2497   rs6000_debug_reg_print (CA_REGNO, CA_REGNO, "ca");
2498   rs6000_debug_reg_print (VRSAVE_REGNO, VRSAVE_REGNO, "vrsave");
2499   rs6000_debug_reg_print (VSCR_REGNO, VSCR_REGNO, "vscr");
2500
2501   fputs ("\nVirtual/stack/frame registers:\n", stderr);
2502   for (v = 0; v < ARRAY_SIZE (virtual_regs); v++)
2503     fprintf (stderr, "%s regno = %3d\n", virtual_regs[v].name, virtual_regs[v].regno);
2504
2505   fprintf (stderr,
2506            "\n"
2507            "d  reg_class = %s\n"
2508            "f  reg_class = %s\n"
2509            "v  reg_class = %s\n"
2510            "wa reg_class = %s\n"
2511            "wd reg_class = %s\n"
2512            "we reg_class = %s\n"
2513            "wf reg_class = %s\n"
2514            "wg reg_class = %s\n"
2515            "wi reg_class = %s\n"
2516            "wk reg_class = %s\n"
2517            "wl reg_class = %s\n"
2518            "wm reg_class = %s\n"
2519            "wp reg_class = %s\n"
2520            "wq reg_class = %s\n"
2521            "wr reg_class = %s\n"
2522            "ws reg_class = %s\n"
2523            "wt reg_class = %s\n"
2524            "wv reg_class = %s\n"
2525            "ww reg_class = %s\n"
2526            "wx reg_class = %s\n"
2527            "wz reg_class = %s\n"
2528            "wA reg_class = %s\n"
2529            "\n",
2530            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_d]],
2531            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_f]],
2532            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_v]],
2533            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wa]],
2534            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wd]],
2535            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_we]],
2536            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wf]],
2537            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wg]],
2538            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wi]],
2539            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wk]],
2540            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wl]],
2541            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wm]],
2542            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wp]],
2543            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wq]],
2544            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wr]],
2545            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_ws]],
2546            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wt]],
2547            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wv]],
2548            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_ww]],
2549            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wx]],
2550            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wz]],
2551            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wA]]);
2552
2553   nl = "\n";
2554   for (m = 0; m < NUM_MACHINE_MODES; ++m)
2555     rs6000_debug_print_mode (m);
2556
2557   fputs ("\n", stderr);
2558
2559   for (m1 = 0; m1 < ARRAY_SIZE (print_tieable_modes); m1++)
2560     {
2561       machine_mode mode1 = print_tieable_modes[m1];
2562       bool first_time = true;
2563
2564       nl = (const char *)0;
2565       for (m2 = 0; m2 < ARRAY_SIZE (print_tieable_modes); m2++)
2566         {
2567           machine_mode mode2 = print_tieable_modes[m2];
2568           if (mode1 != mode2 && rs6000_modes_tieable_p (mode1, mode2))
2569             {
2570               if (first_time)
2571                 {
2572                   fprintf (stderr, "Tieable modes %s:", GET_MODE_NAME (mode1));
2573                   nl = "\n";
2574                   first_time = false;
2575                 }
2576
2577               fprintf (stderr, " %s", GET_MODE_NAME (mode2));
2578             }
2579         }
2580
2581       if (!first_time)
2582         fputs ("\n", stderr);
2583     }
2584
2585   if (nl)
2586     fputs (nl, stderr);
2587
2588   if (rs6000_recip_control)
2589     {
2590       fprintf (stderr, "\nReciprocal mask = 0x%x\n", rs6000_recip_control);
2591
2592       for (m = 0; m < NUM_MACHINE_MODES; ++m)
2593         if (rs6000_recip_bits[m])
2594           {
2595             fprintf (stderr,
2596                      "Reciprocal estimate mode: %-5s divide: %s rsqrt: %s\n",
2597                      GET_MODE_NAME (m),
2598                      (RS6000_RECIP_AUTO_RE_P (m)
2599                       ? "auto"
2600                       : (RS6000_RECIP_HAVE_RE_P (m) ? "have" : "none")),
2601                      (RS6000_RECIP_AUTO_RSQRTE_P (m)
2602                       ? "auto"
2603                       : (RS6000_RECIP_HAVE_RSQRTE_P (m) ? "have" : "none")));
2604           }
2605
2606       fputs ("\n", stderr);
2607     }
2608
2609   if (rs6000_cpu_index >= 0)
2610     {
2611       const char *name = processor_target_table[rs6000_cpu_index].name;
2612       HOST_WIDE_INT flags
2613         = processor_target_table[rs6000_cpu_index].target_enable;
2614
2615       sprintf (flags_buffer, "-mcpu=%s flags", name);
2616       rs6000_print_isa_options (stderr, 0, flags_buffer, flags);
2617     }
2618   else
2619     fprintf (stderr, DEBUG_FMT_S, "cpu", "<none>");
2620
2621   if (rs6000_tune_index >= 0)
2622     {
2623       const char *name = processor_target_table[rs6000_tune_index].name;
2624       HOST_WIDE_INT flags
2625         = processor_target_table[rs6000_tune_index].target_enable;
2626
2627       sprintf (flags_buffer, "-mtune=%s flags", name);
2628       rs6000_print_isa_options (stderr, 0, flags_buffer, flags);
2629     }
2630   else
2631     fprintf (stderr, DEBUG_FMT_S, "tune", "<none>");
2632
2633   cl_target_option_save (&cl_opts, &global_options);
2634   rs6000_print_isa_options (stderr, 0, "rs6000_isa_flags",
2635                             rs6000_isa_flags);
2636
2637   rs6000_print_isa_options (stderr, 0, "rs6000_isa_flags_explicit",
2638                             rs6000_isa_flags_explicit);
2639
2640   rs6000_print_builtin_options (stderr, 0, "rs6000_builtin_mask",
2641                                 rs6000_builtin_mask);
2642
2643   rs6000_print_isa_options (stderr, 0, "TARGET_DEFAULT", TARGET_DEFAULT);
2644
2645   fprintf (stderr, DEBUG_FMT_S, "--with-cpu default",
2646            OPTION_TARGET_CPU_DEFAULT ? OPTION_TARGET_CPU_DEFAULT : "<none>");
2647
2648   switch (rs6000_sched_costly_dep)
2649     {
2650     case max_dep_latency:
2651       costly_str = "max_dep_latency";
2652       break;
2653
2654     case no_dep_costly:
2655       costly_str = "no_dep_costly";
2656       break;
2657
2658     case all_deps_costly:
2659       costly_str = "all_deps_costly";
2660       break;
2661
2662     case true_store_to_load_dep_costly:
2663       costly_str = "true_store_to_load_dep_costly";
2664       break;
2665
2666     case store_to_load_dep_costly:
2667       costly_str = "store_to_load_dep_costly";
2668       break;
2669
2670     default:
2671       costly_str = costly_num;
2672       sprintf (costly_num, "%d", (int)rs6000_sched_costly_dep);
2673       break;
2674     }
2675
2676   fprintf (stderr, DEBUG_FMT_S, "sched_costly_dep", costly_str);
2677
2678   switch (rs6000_sched_insert_nops)
2679     {
2680     case sched_finish_regroup_exact:
2681       nop_str = "sched_finish_regroup_exact";
2682       break;
2683
2684     case sched_finish_pad_groups:
2685       nop_str = "sched_finish_pad_groups";
2686       break;
2687
2688     case sched_finish_none:
2689       nop_str = "sched_finish_none";
2690       break;
2691
2692     default:
2693       nop_str = nop_num;
2694       sprintf (nop_num, "%d", (int)rs6000_sched_insert_nops);
2695       break;
2696     }
2697
2698   fprintf (stderr, DEBUG_FMT_S, "sched_insert_nops", nop_str);
2699
2700   switch (rs6000_sdata)
2701     {
2702     default:
2703     case SDATA_NONE:
2704       break;
2705
2706     case SDATA_DATA:
2707       fprintf (stderr, DEBUG_FMT_S, "sdata", "data");
2708       break;
2709
2710     case SDATA_SYSV:
2711       fprintf (stderr, DEBUG_FMT_S, "sdata", "sysv");
2712       break;
2713
2714     case SDATA_EABI:
2715       fprintf (stderr, DEBUG_FMT_S, "sdata", "eabi");
2716       break;
2717
2718     }
2719
2720   switch (rs6000_traceback)
2721     {
2722     case traceback_default:     trace_str = "default";  break;
2723     case traceback_none:        trace_str = "none";     break;
2724     case traceback_part:        trace_str = "part";     break;
2725     case traceback_full:        trace_str = "full";     break;
2726     default:                    trace_str = "unknown";  break;
2727     }
2728
2729   fprintf (stderr, DEBUG_FMT_S, "traceback", trace_str);
2730
2731   switch (rs6000_current_cmodel)
2732     {
2733     case CMODEL_SMALL:  cmodel_str = "small";   break;
2734     case CMODEL_MEDIUM: cmodel_str = "medium";  break;
2735     case CMODEL_LARGE:  cmodel_str = "large";   break;
2736     default:            cmodel_str = "unknown"; break;
2737     }
2738
2739   fprintf (stderr, DEBUG_FMT_S, "cmodel", cmodel_str);
2740
2741   switch (rs6000_current_abi)
2742     {
2743     case ABI_NONE:      abi_str = "none";       break;
2744     case ABI_AIX:       abi_str = "aix";        break;
2745     case ABI_ELFv2:     abi_str = "ELFv2";      break;
2746     case ABI_V4:        abi_str = "V4";         break;
2747     case ABI_DARWIN:    abi_str = "darwin";     break;
2748     default:            abi_str = "unknown";    break;
2749     }
2750
2751   fprintf (stderr, DEBUG_FMT_S, "abi", abi_str);
2752
2753   if (rs6000_altivec_abi)
2754     fprintf (stderr, DEBUG_FMT_S, "altivec_abi", "true");
2755
2756   if (rs6000_darwin64_abi)
2757     fprintf (stderr, DEBUG_FMT_S, "darwin64_abi", "true");
2758
2759   fprintf (stderr, DEBUG_FMT_S, "soft_float",
2760            (TARGET_SOFT_FLOAT ? "true" : "false"));
2761
2762   if (TARGET_LINK_STACK)
2763     fprintf (stderr, DEBUG_FMT_S, "link_stack", "true");
2764
2765   if (TARGET_P8_FUSION)
2766     {
2767       char options[80];
2768
2769       strcpy (options, "power8");
2770       if (TARGET_P8_FUSION_SIGN)
2771         strcat (options, ", sign");
2772
2773       fprintf (stderr, DEBUG_FMT_S, "fusion", options);
2774     }
2775
2776   fprintf (stderr, DEBUG_FMT_S, "plt-format",
2777            TARGET_SECURE_PLT ? "secure" : "bss");
2778   fprintf (stderr, DEBUG_FMT_S, "struct-return",
2779            aix_struct_return ? "aix" : "sysv");
2780   fprintf (stderr, DEBUG_FMT_S, "always_hint", tf[!!rs6000_always_hint]);
2781   fprintf (stderr, DEBUG_FMT_S, "sched_groups", tf[!!rs6000_sched_groups]);
2782   fprintf (stderr, DEBUG_FMT_S, "align_branch",
2783            tf[!!rs6000_align_branch_targets]);
2784   fprintf (stderr, DEBUG_FMT_D, "tls_size", rs6000_tls_size);
2785   fprintf (stderr, DEBUG_FMT_D, "long_double_size",
2786            rs6000_long_double_type_size);
2787   if (rs6000_long_double_type_size > 64)
2788     {
2789       fprintf (stderr, DEBUG_FMT_S, "long double type",
2790                TARGET_IEEEQUAD ? "IEEE" : "IBM");
2791       fprintf (stderr, DEBUG_FMT_S, "default long double type",
2792                TARGET_IEEEQUAD_DEFAULT ? "IEEE" : "IBM");
2793     }
2794   fprintf (stderr, DEBUG_FMT_D, "sched_restricted_insns_priority",
2795            (int)rs6000_sched_restricted_insns_priority);
2796   fprintf (stderr, DEBUG_FMT_D, "Number of standard builtins",
2797            (int)END_BUILTINS);
2798   fprintf (stderr, DEBUG_FMT_D, "Number of rs6000 builtins",
2799            (int)RS6000_BUILTIN_COUNT);
2800
2801   fprintf (stderr, DEBUG_FMT_D, "Enable float128 on VSX",
2802            (int)TARGET_FLOAT128_ENABLE_TYPE);
2803
2804   if (TARGET_VSX)
2805     fprintf (stderr, DEBUG_FMT_D, "VSX easy 64-bit scalar element",
2806              (int)VECTOR_ELEMENT_SCALAR_64BIT);
2807
2808   if (TARGET_DIRECT_MOVE_128)
2809     fprintf (stderr, DEBUG_FMT_D, "VSX easy 64-bit mfvsrld element",
2810              (int)VECTOR_ELEMENT_MFVSRLD_64BIT);
2811 }
2812
2813 \f
2814 /* Update the addr mask bits in reg_addr to help secondary reload and go if
2815    legitimate address support to figure out the appropriate addressing to
2816    use.  */
2817
2818 static void
2819 rs6000_setup_reg_addr_masks (void)
2820 {
2821   ssize_t rc, reg, m, nregs;
2822   addr_mask_type any_addr_mask, addr_mask;
2823
2824   for (m = 0; m < NUM_MACHINE_MODES; ++m)
2825     {
2826       machine_mode m2 = (machine_mode) m;
2827       bool complex_p = false;
2828       bool small_int_p = (m2 == QImode || m2 == HImode || m2 == SImode);
2829       size_t msize;
2830
2831       if (COMPLEX_MODE_P (m2))
2832         {
2833           complex_p = true;
2834           m2 = GET_MODE_INNER (m2);
2835         }
2836
2837       msize = GET_MODE_SIZE (m2);
2838
2839       /* SDmode is special in that we want to access it only via REG+REG
2840          addressing on power7 and above, since we want to use the LFIWZX and
2841          STFIWZX instructions to load it.  */
2842       bool indexed_only_p = (m == SDmode && TARGET_NO_SDMODE_STACK);
2843
2844       any_addr_mask = 0;
2845       for (rc = FIRST_RELOAD_REG_CLASS; rc <= LAST_RELOAD_REG_CLASS; rc++)
2846         {
2847           addr_mask = 0;
2848           reg = reload_reg_map[rc].reg;
2849
2850           /* Can mode values go in the GPR/FPR/Altivec registers?  */
2851           if (reg >= 0 && rs6000_hard_regno_mode_ok_p[m][reg])
2852             {
2853               bool small_int_vsx_p = (small_int_p
2854                                       && (rc == RELOAD_REG_FPR
2855                                           || rc == RELOAD_REG_VMX));
2856
2857               nregs = rs6000_hard_regno_nregs[m][reg];
2858               addr_mask |= RELOAD_REG_VALID;
2859
2860               /* Indicate if the mode takes more than 1 physical register.  If
2861                  it takes a single register, indicate it can do REG+REG
2862                  addressing.  Small integers in VSX registers can only do
2863                  REG+REG addressing.  */
2864               if (small_int_vsx_p)
2865                 addr_mask |= RELOAD_REG_INDEXED;
2866               else if (nregs > 1 || m == BLKmode || complex_p)
2867                 addr_mask |= RELOAD_REG_MULTIPLE;
2868               else
2869                 addr_mask |= RELOAD_REG_INDEXED;
2870
2871               /* Figure out if we can do PRE_INC, PRE_DEC, or PRE_MODIFY
2872                  addressing.  If we allow scalars into Altivec registers,
2873                  don't allow PRE_INC, PRE_DEC, or PRE_MODIFY.
2874
2875                  For VSX systems, we don't allow update addressing for
2876                  DFmode/SFmode if those registers can go in both the
2877                  traditional floating point registers and Altivec registers.
2878                  The load/store instructions for the Altivec registers do not
2879                  have update forms.  If we allowed update addressing, it seems
2880                  to break IV-OPT code using floating point if the index type is
2881                  int instead of long (PR target/81550 and target/84042).  */
2882
2883               if (TARGET_UPDATE
2884                   && (rc == RELOAD_REG_GPR || rc == RELOAD_REG_FPR)
2885                   && msize <= 8
2886                   && !VECTOR_MODE_P (m2)
2887                   && !FLOAT128_VECTOR_P (m2)
2888                   && !complex_p
2889                   && (m != E_DFmode || !TARGET_VSX)
2890                   && (m != E_SFmode || !TARGET_P8_VECTOR)
2891                   && !small_int_vsx_p)
2892                 {
2893                   addr_mask |= RELOAD_REG_PRE_INCDEC;
2894
2895                   /* PRE_MODIFY is more restricted than PRE_INC/PRE_DEC in that
2896                      we don't allow PRE_MODIFY for some multi-register
2897                      operations.  */
2898                   switch (m)
2899                     {
2900                     default:
2901                       addr_mask |= RELOAD_REG_PRE_MODIFY;
2902                       break;
2903
2904                     case E_DImode:
2905                       if (TARGET_POWERPC64)
2906                         addr_mask |= RELOAD_REG_PRE_MODIFY;
2907                       break;
2908
2909                     case E_DFmode:
2910                     case E_DDmode:
2911                       if (TARGET_HARD_FLOAT)
2912                         addr_mask |= RELOAD_REG_PRE_MODIFY;
2913                       break;
2914                     }
2915                 }
2916             }
2917
2918           /* GPR and FPR registers can do REG+OFFSET addressing, except
2919              possibly for SDmode.  ISA 3.0 (i.e. power9) adds D-form addressing
2920              for 64-bit scalars and 32-bit SFmode to altivec registers.  */
2921           if ((addr_mask != 0) && !indexed_only_p
2922               && msize <= 8
2923               && (rc == RELOAD_REG_GPR
2924                   || ((msize == 8 || m2 == SFmode)
2925                       && (rc == RELOAD_REG_FPR
2926                           || (rc == RELOAD_REG_VMX && TARGET_P9_VECTOR)))))
2927             addr_mask |= RELOAD_REG_OFFSET;
2928
2929           /* VSX registers can do REG+OFFSET addresssing if ISA 3.0
2930              instructions are enabled.  The offset for 128-bit VSX registers is
2931              only 12-bits.  While GPRs can handle the full offset range, VSX
2932              registers can only handle the restricted range.  */
2933           else if ((addr_mask != 0) && !indexed_only_p
2934                    && msize == 16 && TARGET_P9_VECTOR
2935                    && (ALTIVEC_OR_VSX_VECTOR_MODE (m2)
2936                        || (m2 == TImode && TARGET_VSX)))
2937             {
2938               addr_mask |= RELOAD_REG_OFFSET;
2939               if (rc == RELOAD_REG_FPR || rc == RELOAD_REG_VMX)
2940                 addr_mask |= RELOAD_REG_QUAD_OFFSET;
2941             }
2942
2943           /* VMX registers can do (REG & -16) and ((REG+REG) & -16)
2944              addressing on 128-bit types.  */
2945           if (rc == RELOAD_REG_VMX && msize == 16
2946               && (addr_mask & RELOAD_REG_VALID) != 0)
2947             addr_mask |= RELOAD_REG_AND_M16;
2948
2949           reg_addr[m].addr_mask[rc] = addr_mask;
2950           any_addr_mask |= addr_mask;
2951         }
2952
2953       reg_addr[m].addr_mask[RELOAD_REG_ANY] = any_addr_mask;
2954     }
2955 }
2956
2957 \f
2958 /* Initialize the various global tables that are based on register size.  */
2959 static void
2960 rs6000_init_hard_regno_mode_ok (bool global_init_p)
2961 {
2962   ssize_t r, m, c;
2963   int align64;
2964   int align32;
2965
2966   /* Precalculate REGNO_REG_CLASS.  */
2967   rs6000_regno_regclass[0] = GENERAL_REGS;
2968   for (r = 1; r < 32; ++r)
2969     rs6000_regno_regclass[r] = BASE_REGS;
2970
2971   for (r = 32; r < 64; ++r)
2972     rs6000_regno_regclass[r] = FLOAT_REGS;
2973
2974   for (r = 64; HARD_REGISTER_NUM_P (r); ++r)
2975     rs6000_regno_regclass[r] = NO_REGS;
2976
2977   for (r = FIRST_ALTIVEC_REGNO; r <= LAST_ALTIVEC_REGNO; ++r)
2978     rs6000_regno_regclass[r] = ALTIVEC_REGS;
2979
2980   rs6000_regno_regclass[CR0_REGNO] = CR0_REGS;
2981   for (r = CR1_REGNO; r <= CR7_REGNO; ++r)
2982     rs6000_regno_regclass[r] = CR_REGS;
2983
2984   rs6000_regno_regclass[LR_REGNO] = LINK_REGS;
2985   rs6000_regno_regclass[CTR_REGNO] = CTR_REGS;
2986   rs6000_regno_regclass[CA_REGNO] = NO_REGS;
2987   rs6000_regno_regclass[VRSAVE_REGNO] = VRSAVE_REGS;
2988   rs6000_regno_regclass[VSCR_REGNO] = VRSAVE_REGS;
2989   rs6000_regno_regclass[ARG_POINTER_REGNUM] = BASE_REGS;
2990   rs6000_regno_regclass[FRAME_POINTER_REGNUM] = BASE_REGS;
2991
2992   /* Precalculate register class to simpler reload register class.  We don't
2993      need all of the register classes that are combinations of different
2994      classes, just the simple ones that have constraint letters.  */
2995   for (c = 0; c < N_REG_CLASSES; c++)
2996     reg_class_to_reg_type[c] = NO_REG_TYPE;
2997
2998   reg_class_to_reg_type[(int)GENERAL_REGS] = GPR_REG_TYPE;
2999   reg_class_to_reg_type[(int)BASE_REGS] = GPR_REG_TYPE;
3000   reg_class_to_reg_type[(int)VSX_REGS] = VSX_REG_TYPE;
3001   reg_class_to_reg_type[(int)VRSAVE_REGS] = SPR_REG_TYPE;
3002   reg_class_to_reg_type[(int)VSCR_REGS] = SPR_REG_TYPE;
3003   reg_class_to_reg_type[(int)LINK_REGS] = SPR_REG_TYPE;
3004   reg_class_to_reg_type[(int)CTR_REGS] = SPR_REG_TYPE;
3005   reg_class_to_reg_type[(int)LINK_OR_CTR_REGS] = SPR_REG_TYPE;
3006   reg_class_to_reg_type[(int)CR_REGS] = CR_REG_TYPE;
3007   reg_class_to_reg_type[(int)CR0_REGS] = CR_REG_TYPE;
3008
3009   if (TARGET_VSX)
3010     {
3011       reg_class_to_reg_type[(int)FLOAT_REGS] = VSX_REG_TYPE;
3012       reg_class_to_reg_type[(int)ALTIVEC_REGS] = VSX_REG_TYPE;
3013     }
3014   else
3015     {
3016       reg_class_to_reg_type[(int)FLOAT_REGS] = FPR_REG_TYPE;
3017       reg_class_to_reg_type[(int)ALTIVEC_REGS] = ALTIVEC_REG_TYPE;
3018     }
3019
3020   /* Precalculate the valid memory formats as well as the vector information,
3021      this must be set up before the rs6000_hard_regno_nregs_internal calls
3022      below.  */
3023   gcc_assert ((int)VECTOR_NONE == 0);
3024   memset ((void *) &rs6000_vector_unit[0], '\0', sizeof (rs6000_vector_unit));
3025   memset ((void *) &rs6000_vector_mem[0], '\0', sizeof (rs6000_vector_mem));
3026
3027   gcc_assert ((int)CODE_FOR_nothing == 0);
3028   memset ((void *) &reg_addr[0], '\0', sizeof (reg_addr));
3029
3030   gcc_assert ((int)NO_REGS == 0);
3031   memset ((void *) &rs6000_constraints[0], '\0', sizeof (rs6000_constraints));
3032
3033   /* The VSX hardware allows native alignment for vectors, but control whether the compiler
3034      believes it can use native alignment or still uses 128-bit alignment.  */
3035   if (TARGET_VSX && !TARGET_VSX_ALIGN_128)
3036     {
3037       align64 = 64;
3038       align32 = 32;
3039     }
3040   else
3041     {
3042       align64 = 128;
3043       align32 = 128;
3044     }
3045
3046   /* KF mode (IEEE 128-bit in VSX registers).  We do not have arithmetic, so
3047      only set the memory modes.  Include TFmode if -mabi=ieeelongdouble.  */
3048   if (TARGET_FLOAT128_TYPE)
3049     {
3050       rs6000_vector_mem[KFmode] = VECTOR_VSX;
3051       rs6000_vector_align[KFmode] = 128;
3052
3053       if (FLOAT128_IEEE_P (TFmode))
3054         {
3055           rs6000_vector_mem[TFmode] = VECTOR_VSX;
3056           rs6000_vector_align[TFmode] = 128;
3057         }
3058     }
3059
3060   /* V2DF mode, VSX only.  */
3061   if (TARGET_VSX)
3062     {
3063       rs6000_vector_unit[V2DFmode] = VECTOR_VSX;
3064       rs6000_vector_mem[V2DFmode] = VECTOR_VSX;
3065       rs6000_vector_align[V2DFmode] = align64;
3066     }
3067
3068   /* V4SF mode, either VSX or Altivec.  */
3069   if (TARGET_VSX)
3070     {
3071       rs6000_vector_unit[V4SFmode] = VECTOR_VSX;
3072       rs6000_vector_mem[V4SFmode] = VECTOR_VSX;
3073       rs6000_vector_align[V4SFmode] = align32;
3074     }
3075   else if (TARGET_ALTIVEC)
3076     {
3077       rs6000_vector_unit[V4SFmode] = VECTOR_ALTIVEC;
3078       rs6000_vector_mem[V4SFmode] = VECTOR_ALTIVEC;
3079       rs6000_vector_align[V4SFmode] = align32;
3080     }
3081
3082   /* V16QImode, V8HImode, V4SImode are Altivec only, but possibly do VSX loads
3083      and stores. */
3084   if (TARGET_ALTIVEC)
3085     {
3086       rs6000_vector_unit[V4SImode] = VECTOR_ALTIVEC;
3087       rs6000_vector_unit[V8HImode] = VECTOR_ALTIVEC;
3088       rs6000_vector_unit[V16QImode] = VECTOR_ALTIVEC;
3089       rs6000_vector_align[V4SImode] = align32;
3090       rs6000_vector_align[V8HImode] = align32;
3091       rs6000_vector_align[V16QImode] = align32;
3092
3093       if (TARGET_VSX)
3094         {
3095           rs6000_vector_mem[V4SImode] = VECTOR_VSX;
3096           rs6000_vector_mem[V8HImode] = VECTOR_VSX;
3097           rs6000_vector_mem[V16QImode] = VECTOR_VSX;
3098         }
3099       else
3100         {
3101           rs6000_vector_mem[V4SImode] = VECTOR_ALTIVEC;
3102           rs6000_vector_mem[V8HImode] = VECTOR_ALTIVEC;
3103           rs6000_vector_mem[V16QImode] = VECTOR_ALTIVEC;
3104         }
3105     }
3106
3107   /* V2DImode, full mode depends on ISA 2.07 vector mode.  Allow under VSX to
3108      do insert/splat/extract.  Altivec doesn't have 64-bit integer support.  */
3109   if (TARGET_VSX)
3110     {
3111       rs6000_vector_mem[V2DImode] = VECTOR_VSX;
3112       rs6000_vector_unit[V2DImode]
3113         = (TARGET_P8_VECTOR) ? VECTOR_P8_VECTOR : VECTOR_NONE;
3114       rs6000_vector_align[V2DImode] = align64;
3115
3116       rs6000_vector_mem[V1TImode] = VECTOR_VSX;
3117       rs6000_vector_unit[V1TImode]
3118         = (TARGET_P8_VECTOR) ? VECTOR_P8_VECTOR : VECTOR_NONE;
3119       rs6000_vector_align[V1TImode] = 128;
3120     }
3121
3122   /* DFmode, see if we want to use the VSX unit.  Memory is handled
3123      differently, so don't set rs6000_vector_mem.  */
3124   if (TARGET_VSX)
3125     {
3126       rs6000_vector_unit[DFmode] = VECTOR_VSX;
3127       rs6000_vector_align[DFmode] = 64;
3128     }
3129
3130   /* SFmode, see if we want to use the VSX unit.  */
3131   if (TARGET_P8_VECTOR)
3132     {
3133       rs6000_vector_unit[SFmode] = VECTOR_VSX;
3134       rs6000_vector_align[SFmode] = 32;
3135     }
3136
3137   /* Allow TImode in VSX register and set the VSX memory macros.  */
3138   if (TARGET_VSX)
3139     {
3140       rs6000_vector_mem[TImode] = VECTOR_VSX;
3141       rs6000_vector_align[TImode] = align64;
3142     }
3143
3144   /* Register class constraints for the constraints that depend on compile
3145      switches. When the VSX code was added, different constraints were added
3146      based on the type (DFmode, V2DFmode, V4SFmode).  For the vector types, all
3147      of the VSX registers are used.  The register classes for scalar floating
3148      point types is set, based on whether we allow that type into the upper
3149      (Altivec) registers.  GCC has register classes to target the Altivec
3150      registers for load/store operations, to select using a VSX memory
3151      operation instead of the traditional floating point operation.  The
3152      constraints are:
3153
3154         d  - Register class to use with traditional DFmode instructions.
3155         f  - Register class to use with traditional SFmode instructions.
3156         v  - Altivec register.
3157         wa - Any VSX register.
3158         wc - Reserved to represent individual CR bits (used in LLVM).
3159         wd - Preferred register class for V2DFmode.
3160         wf - Preferred register class for V4SFmode.
3161         wg - Float register for power6x move insns.
3162         wi - FP or VSX register to hold 64-bit integers for VSX insns.
3163         wk - FP or VSX register to hold 64-bit doubles for direct moves.
3164         wl - Float register if we can do 32-bit signed int loads.
3165         wm - VSX register for ISA 2.07 direct move operations.
3166         wn - always NO_REGS.
3167         wr - GPR if 64-bit mode is permitted.
3168         ws - Register class to do ISA 2.06 DF operations.
3169         wt - VSX register for TImode in VSX registers.
3170         wv - Altivec register for ISA 2.06 VSX DF/DI load/stores.
3171         ww - Register class to do SF conversions in with VSX operations.
3172         wx - Float register if we can do 32-bit int stores.
3173         wz - Float register if we can do 32-bit unsigned int loads.  */
3174
3175   if (TARGET_HARD_FLOAT)
3176     {
3177       rs6000_constraints[RS6000_CONSTRAINT_f] = FLOAT_REGS;     /* SFmode  */
3178       rs6000_constraints[RS6000_CONSTRAINT_d] = FLOAT_REGS;     /* DFmode  */
3179     }
3180
3181   if (TARGET_VSX)
3182     {
3183       rs6000_constraints[RS6000_CONSTRAINT_wa] = VSX_REGS;
3184       rs6000_constraints[RS6000_CONSTRAINT_wd] = VSX_REGS;      /* V2DFmode  */
3185       rs6000_constraints[RS6000_CONSTRAINT_wf] = VSX_REGS;      /* V4SFmode  */
3186       rs6000_constraints[RS6000_CONSTRAINT_ws] = VSX_REGS;      /* DFmode  */
3187       rs6000_constraints[RS6000_CONSTRAINT_wv] = ALTIVEC_REGS;  /* DFmode  */
3188       rs6000_constraints[RS6000_CONSTRAINT_wi] = VSX_REGS;      /* DImode  */
3189       rs6000_constraints[RS6000_CONSTRAINT_wt] = VSX_REGS;      /* TImode  */
3190     }
3191
3192   /* Add conditional constraints based on various options, to allow us to
3193      collapse multiple insn patterns.  */
3194   if (TARGET_ALTIVEC)
3195     rs6000_constraints[RS6000_CONSTRAINT_v] = ALTIVEC_REGS;
3196
3197   if (TARGET_MFPGPR)                                            /* DFmode  */
3198     rs6000_constraints[RS6000_CONSTRAINT_wg] = FLOAT_REGS;
3199
3200   if (TARGET_LFIWAX)
3201     rs6000_constraints[RS6000_CONSTRAINT_wl] = FLOAT_REGS;      /* DImode  */
3202
3203   if (TARGET_DIRECT_MOVE)
3204     {
3205       rs6000_constraints[RS6000_CONSTRAINT_wk]                  /* DFmode  */
3206         = rs6000_constraints[RS6000_CONSTRAINT_ws];
3207       rs6000_constraints[RS6000_CONSTRAINT_wm] = VSX_REGS;
3208     }
3209
3210   if (TARGET_POWERPC64)
3211     {
3212       rs6000_constraints[RS6000_CONSTRAINT_wr] = GENERAL_REGS;
3213       rs6000_constraints[RS6000_CONSTRAINT_wA] = BASE_REGS;
3214     }
3215
3216   if (TARGET_P8_VECTOR)                                         /* SFmode  */
3217     rs6000_constraints[RS6000_CONSTRAINT_ww] = VSX_REGS;
3218   else if (TARGET_VSX)
3219     rs6000_constraints[RS6000_CONSTRAINT_ww] = FLOAT_REGS;
3220
3221   if (TARGET_STFIWX)
3222     rs6000_constraints[RS6000_CONSTRAINT_wx] = FLOAT_REGS;      /* DImode  */
3223
3224   if (TARGET_LFIWZX)
3225     rs6000_constraints[RS6000_CONSTRAINT_wz] = FLOAT_REGS;      /* DImode  */
3226
3227   if (TARGET_FLOAT128_TYPE)
3228     {
3229       rs6000_constraints[RS6000_CONSTRAINT_wq] = VSX_REGS;      /* KFmode  */
3230       if (FLOAT128_IEEE_P (TFmode))
3231         rs6000_constraints[RS6000_CONSTRAINT_wp] = VSX_REGS;    /* TFmode  */
3232     }
3233
3234   /* Support for new direct moves (ISA 3.0 + 64bit).  */
3235   if (TARGET_DIRECT_MOVE_128)
3236     rs6000_constraints[RS6000_CONSTRAINT_we] = VSX_REGS;
3237
3238   /* Set up the reload helper and direct move functions.  */
3239   if (TARGET_VSX || TARGET_ALTIVEC)
3240     {
3241       if (TARGET_64BIT)
3242         {
3243           reg_addr[V16QImode].reload_store = CODE_FOR_reload_v16qi_di_store;
3244           reg_addr[V16QImode].reload_load  = CODE_FOR_reload_v16qi_di_load;
3245           reg_addr[V8HImode].reload_store  = CODE_FOR_reload_v8hi_di_store;
3246           reg_addr[V8HImode].reload_load   = CODE_FOR_reload_v8hi_di_load;
3247           reg_addr[V4SImode].reload_store  = CODE_FOR_reload_v4si_di_store;
3248           reg_addr[V4SImode].reload_load   = CODE_FOR_reload_v4si_di_load;
3249           reg_addr[V2DImode].reload_store  = CODE_FOR_reload_v2di_di_store;
3250           reg_addr[V2DImode].reload_load   = CODE_FOR_reload_v2di_di_load;
3251           reg_addr[V1TImode].reload_store  = CODE_FOR_reload_v1ti_di_store;
3252           reg_addr[V1TImode].reload_load   = CODE_FOR_reload_v1ti_di_load;
3253           reg_addr[V4SFmode].reload_store  = CODE_FOR_reload_v4sf_di_store;
3254           reg_addr[V4SFmode].reload_load   = CODE_FOR_reload_v4sf_di_load;
3255           reg_addr[V2DFmode].reload_store  = CODE_FOR_reload_v2df_di_store;
3256           reg_addr[V2DFmode].reload_load   = CODE_FOR_reload_v2df_di_load;
3257           reg_addr[DFmode].reload_store    = CODE_FOR_reload_df_di_store;
3258           reg_addr[DFmode].reload_load     = CODE_FOR_reload_df_di_load;
3259           reg_addr[DDmode].reload_store    = CODE_FOR_reload_dd_di_store;
3260           reg_addr[DDmode].reload_load     = CODE_FOR_reload_dd_di_load;
3261           reg_addr[SFmode].reload_store    = CODE_FOR_reload_sf_di_store;
3262           reg_addr[SFmode].reload_load     = CODE_FOR_reload_sf_di_load;
3263
3264           if (FLOAT128_VECTOR_P (KFmode))
3265             {
3266               reg_addr[KFmode].reload_store = CODE_FOR_reload_kf_di_store;
3267               reg_addr[KFmode].reload_load  = CODE_FOR_reload_kf_di_load;
3268             }
3269
3270           if (FLOAT128_VECTOR_P (TFmode))
3271             {
3272               reg_addr[TFmode].reload_store = CODE_FOR_reload_tf_di_store;
3273               reg_addr[TFmode].reload_load  = CODE_FOR_reload_tf_di_load;
3274             }
3275
3276           /* Only provide a reload handler for SDmode if lfiwzx/stfiwx are
3277              available.  */
3278           if (TARGET_NO_SDMODE_STACK)
3279             {
3280               reg_addr[SDmode].reload_store = CODE_FOR_reload_sd_di_store;
3281               reg_addr[SDmode].reload_load  = CODE_FOR_reload_sd_di_load;
3282             }
3283
3284           if (TARGET_VSX)
3285             {
3286               reg_addr[TImode].reload_store  = CODE_FOR_reload_ti_di_store;
3287               reg_addr[TImode].reload_load   = CODE_FOR_reload_ti_di_load;
3288             }
3289
3290           if (TARGET_DIRECT_MOVE && !TARGET_DIRECT_MOVE_128)
3291             {
3292               reg_addr[TImode].reload_gpr_vsx    = CODE_FOR_reload_gpr_from_vsxti;
3293               reg_addr[V1TImode].reload_gpr_vsx  = CODE_FOR_reload_gpr_from_vsxv1ti;
3294               reg_addr[V2DFmode].reload_gpr_vsx  = CODE_FOR_reload_gpr_from_vsxv2df;
3295               reg_addr[V2DImode].reload_gpr_vsx  = CODE_FOR_reload_gpr_from_vsxv2di;
3296               reg_addr[V4SFmode].reload_gpr_vsx  = CODE_FOR_reload_gpr_from_vsxv4sf;
3297               reg_addr[V4SImode].reload_gpr_vsx  = CODE_FOR_reload_gpr_from_vsxv4si;
3298               reg_addr[V8HImode].reload_gpr_vsx  = CODE_FOR_reload_gpr_from_vsxv8hi;
3299               reg_addr[V16QImode].reload_gpr_vsx = CODE_FOR_reload_gpr_from_vsxv16qi;
3300               reg_addr[SFmode].reload_gpr_vsx    = CODE_FOR_reload_gpr_from_vsxsf;
3301
3302               reg_addr[TImode].reload_vsx_gpr    = CODE_FOR_reload_vsx_from_gprti;
3303               reg_addr[V1TImode].reload_vsx_gpr  = CODE_FOR_reload_vsx_from_gprv1ti;
3304               reg_addr[V2DFmode].reload_vsx_gpr  = CODE_FOR_reload_vsx_from_gprv2df;
3305               reg_addr[V2DImode].reload_vsx_gpr  = CODE_FOR_reload_vsx_from_gprv2di;
3306               reg_addr[V4SFmode].reload_vsx_gpr  = CODE_FOR_reload_vsx_from_gprv4sf;
3307               reg_addr[V4SImode].reload_vsx_gpr  = CODE_FOR_reload_vsx_from_gprv4si;
3308               reg_addr[V8HImode].reload_vsx_gpr  = CODE_FOR_reload_vsx_from_gprv8hi;
3309               reg_addr[V16QImode].reload_vsx_gpr = CODE_FOR_reload_vsx_from_gprv16qi;
3310               reg_addr[SFmode].reload_vsx_gpr    = CODE_FOR_reload_vsx_from_gprsf;
3311
3312               if (FLOAT128_VECTOR_P (KFmode))
3313                 {
3314                   reg_addr[KFmode].reload_gpr_vsx = CODE_FOR_reload_gpr_from_vsxkf;
3315                   reg_addr[KFmode].reload_vsx_gpr = CODE_FOR_reload_vsx_from_gprkf;
3316                 }
3317
3318               if (FLOAT128_VECTOR_P (TFmode))
3319                 {
3320                   reg_addr[TFmode].reload_gpr_vsx = CODE_FOR_reload_gpr_from_vsxtf;
3321                   reg_addr[TFmode].reload_vsx_gpr = CODE_FOR_reload_vsx_from_gprtf;
3322                 }
3323             }
3324         }
3325       else
3326         {
3327           reg_addr[V16QImode].reload_store = CODE_FOR_reload_v16qi_si_store;
3328           reg_addr[V16QImode].reload_load  = CODE_FOR_reload_v16qi_si_load;
3329           reg_addr[V8HImode].reload_store  = CODE_FOR_reload_v8hi_si_store;
3330           reg_addr[V8HImode].reload_load   = CODE_FOR_reload_v8hi_si_load;
3331           reg_addr[V4SImode].reload_store  = CODE_FOR_reload_v4si_si_store;
3332           reg_addr[V4SImode].reload_load   = CODE_FOR_reload_v4si_si_load;
3333           reg_addr[V2DImode].reload_store  = CODE_FOR_reload_v2di_si_store;
3334           reg_addr[V2DImode].reload_load   = CODE_FOR_reload_v2di_si_load;
3335           reg_addr[V1TImode].reload_store  = CODE_FOR_reload_v1ti_si_store;
3336           reg_addr[V1TImode].reload_load   = CODE_FOR_reload_v1ti_si_load;
3337           reg_addr[V4SFmode].reload_store  = CODE_FOR_reload_v4sf_si_store;
3338           reg_addr[V4SFmode].reload_load   = CODE_FOR_reload_v4sf_si_load;
3339           reg_addr[V2DFmode].reload_store  = CODE_FOR_reload_v2df_si_store;
3340           reg_addr[V2DFmode].reload_load   = CODE_FOR_reload_v2df_si_load;
3341           reg_addr[DFmode].reload_store    = CODE_FOR_reload_df_si_store;
3342           reg_addr[DFmode].reload_load     = CODE_FOR_reload_df_si_load;
3343           reg_addr[DDmode].reload_store    = CODE_FOR_reload_dd_si_store;
3344           reg_addr[DDmode].reload_load     = CODE_FOR_reload_dd_si_load;
3345           reg_addr[SFmode].reload_store    = CODE_FOR_reload_sf_si_store;
3346           reg_addr[SFmode].reload_load     = CODE_FOR_reload_sf_si_load;
3347
3348           if (FLOAT128_VECTOR_P (KFmode))
3349             {
3350               reg_addr[KFmode].reload_store = CODE_FOR_reload_kf_si_store;
3351               reg_addr[KFmode].reload_load  = CODE_FOR_reload_kf_si_load;
3352             }
3353
3354           if (FLOAT128_IEEE_P (TFmode))
3355             {
3356               reg_addr[TFmode].reload_store = CODE_FOR_reload_tf_si_store;
3357               reg_addr[TFmode].reload_load  = CODE_FOR_reload_tf_si_load;
3358             }
3359
3360           /* Only provide a reload handler for SDmode if lfiwzx/stfiwx are
3361              available.  */
3362           if (TARGET_NO_SDMODE_STACK)
3363             {
3364               reg_addr[SDmode].reload_store = CODE_FOR_reload_sd_si_store;
3365               reg_addr[SDmode].reload_load  = CODE_FOR_reload_sd_si_load;
3366             }
3367
3368           if (TARGET_VSX)
3369             {
3370               reg_addr[TImode].reload_store  = CODE_FOR_reload_ti_si_store;
3371               reg_addr[TImode].reload_load   = CODE_FOR_reload_ti_si_load;
3372             }
3373
3374           if (TARGET_DIRECT_MOVE)
3375             {
3376               reg_addr[DImode].reload_fpr_gpr = CODE_FOR_reload_fpr_from_gprdi;
3377               reg_addr[DDmode].reload_fpr_gpr = CODE_FOR_reload_fpr_from_gprdd;
3378               reg_addr[DFmode].reload_fpr_gpr = CODE_FOR_reload_fpr_from_gprdf;
3379             }
3380         }
3381
3382       reg_addr[DFmode].scalar_in_vmx_p = true;
3383       reg_addr[DImode].scalar_in_vmx_p = true;
3384
3385       if (TARGET_P8_VECTOR)
3386         {
3387           reg_addr[SFmode].scalar_in_vmx_p = true;
3388           reg_addr[SImode].scalar_in_vmx_p = true;
3389
3390           if (TARGET_P9_VECTOR)
3391             {
3392               reg_addr[HImode].scalar_in_vmx_p = true;
3393               reg_addr[QImode].scalar_in_vmx_p = true;
3394             }
3395         }
3396     }
3397
3398   /* Precalculate HARD_REGNO_NREGS.  */
3399   for (r = 0; HARD_REGISTER_NUM_P (r); ++r)
3400     for (m = 0; m < NUM_MACHINE_MODES; ++m)
3401       rs6000_hard_regno_nregs[m][r]
3402         = rs6000_hard_regno_nregs_internal (r, (machine_mode) m);
3403
3404   /* Precalculate TARGET_HARD_REGNO_MODE_OK.  */
3405   for (r = 0; HARD_REGISTER_NUM_P (r); ++r)
3406     for (m = 0; m < NUM_MACHINE_MODES; ++m)
3407       rs6000_hard_regno_mode_ok_p[m][r]
3408         = rs6000_hard_regno_mode_ok_uncached (r, (machine_mode) m);
3409
3410   /* Precalculate CLASS_MAX_NREGS sizes.  */
3411   for (c = 0; c < LIM_REG_CLASSES; ++c)
3412     {
3413       int reg_size;
3414
3415       if (TARGET_VSX && VSX_REG_CLASS_P (c))
3416         reg_size = UNITS_PER_VSX_WORD;
3417
3418       else if (c == ALTIVEC_REGS)
3419         reg_size = UNITS_PER_ALTIVEC_WORD;
3420
3421       else if (c == FLOAT_REGS)
3422         reg_size = UNITS_PER_FP_WORD;
3423
3424       else
3425         reg_size = UNITS_PER_WORD;
3426
3427       for (m = 0; m < NUM_MACHINE_MODES; ++m)
3428         {
3429           machine_mode m2 = (machine_mode)m;
3430           int reg_size2 = reg_size;
3431
3432           /* TDmode & IBM 128-bit floating point always takes 2 registers, even
3433              in VSX.  */
3434           if (TARGET_VSX && VSX_REG_CLASS_P (c) && FLOAT128_2REG_P (m))
3435             reg_size2 = UNITS_PER_FP_WORD;
3436
3437           rs6000_class_max_nregs[m][c]
3438             = (GET_MODE_SIZE (m2) + reg_size2 - 1) / reg_size2;
3439         }
3440     }
3441
3442   /* Calculate which modes to automatically generate code to use a the
3443      reciprocal divide and square root instructions.  In the future, possibly
3444      automatically generate the instructions even if the user did not specify
3445      -mrecip.  The older machines double precision reciprocal sqrt estimate is
3446      not accurate enough.  */
3447   memset (rs6000_recip_bits, 0, sizeof (rs6000_recip_bits));
3448   if (TARGET_FRES)
3449     rs6000_recip_bits[SFmode] = RS6000_RECIP_MASK_HAVE_RE;
3450   if (TARGET_FRE)
3451     rs6000_recip_bits[DFmode] = RS6000_RECIP_MASK_HAVE_RE;
3452   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
3453     rs6000_recip_bits[V4SFmode] = RS6000_RECIP_MASK_HAVE_RE;
3454   if (VECTOR_UNIT_VSX_P (V2DFmode))
3455     rs6000_recip_bits[V2DFmode] = RS6000_RECIP_MASK_HAVE_RE;
3456
3457   if (TARGET_FRSQRTES)
3458     rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
3459   if (TARGET_FRSQRTE)
3460     rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
3461   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
3462     rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
3463   if (VECTOR_UNIT_VSX_P (V2DFmode))
3464     rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
3465
3466   if (rs6000_recip_control)
3467     {
3468       if (!flag_finite_math_only)
3469         warning (0, "%qs requires %qs or %qs", "-mrecip", "-ffinite-math",
3470                  "-ffast-math");
3471       if (flag_trapping_math)
3472         warning (0, "%qs requires %qs or %qs", "-mrecip",
3473                  "-fno-trapping-math", "-ffast-math");
3474       if (!flag_reciprocal_math)
3475         warning (0, "%qs requires %qs or %qs", "-mrecip", "-freciprocal-math",
3476                  "-ffast-math");
3477       if (flag_finite_math_only && !flag_trapping_math && flag_reciprocal_math)
3478         {
3479           if (RS6000_RECIP_HAVE_RE_P (SFmode)
3480               && (rs6000_recip_control & RECIP_SF_DIV) != 0)
3481             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
3482
3483           if (RS6000_RECIP_HAVE_RE_P (DFmode)
3484               && (rs6000_recip_control & RECIP_DF_DIV) != 0)
3485             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
3486
3487           if (RS6000_RECIP_HAVE_RE_P (V4SFmode)
3488               && (rs6000_recip_control & RECIP_V4SF_DIV) != 0)
3489             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
3490
3491           if (RS6000_RECIP_HAVE_RE_P (V2DFmode)
3492               && (rs6000_recip_control & RECIP_V2DF_DIV) != 0)
3493             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
3494
3495           if (RS6000_RECIP_HAVE_RSQRTE_P (SFmode)
3496               && (rs6000_recip_control & RECIP_SF_RSQRT) != 0)
3497             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
3498
3499           if (RS6000_RECIP_HAVE_RSQRTE_P (DFmode)
3500               && (rs6000_recip_control & RECIP_DF_RSQRT) != 0)
3501             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
3502
3503           if (RS6000_RECIP_HAVE_RSQRTE_P (V4SFmode)
3504               && (rs6000_recip_control & RECIP_V4SF_RSQRT) != 0)
3505             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
3506
3507           if (RS6000_RECIP_HAVE_RSQRTE_P (V2DFmode)
3508               && (rs6000_recip_control & RECIP_V2DF_RSQRT) != 0)
3509             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
3510         }
3511     }
3512
3513   /* Update the addr mask bits in reg_addr to help secondary reload and go if
3514      legitimate address support to figure out the appropriate addressing to
3515      use.  */
3516   rs6000_setup_reg_addr_masks ();
3517
3518   if (global_init_p || TARGET_DEBUG_TARGET)
3519     {
3520       if (TARGET_DEBUG_REG)
3521         rs6000_debug_reg_global ();
3522
3523       if (TARGET_DEBUG_COST || TARGET_DEBUG_REG)
3524         fprintf (stderr,
3525                  "SImode variable mult cost       = %d\n"
3526                  "SImode constant mult cost       = %d\n"
3527                  "SImode short constant mult cost = %d\n"
3528                  "DImode multipliciation cost     = %d\n"
3529                  "SImode division cost            = %d\n"
3530                  "DImode division cost            = %d\n"
3531                  "Simple fp operation cost        = %d\n"
3532                  "DFmode multiplication cost      = %d\n"
3533                  "SFmode division cost            = %d\n"
3534                  "DFmode division cost            = %d\n"
3535                  "cache line size                 = %d\n"
3536                  "l1 cache size                   = %d\n"
3537                  "l2 cache size                   = %d\n"
3538                  "simultaneous prefetches         = %d\n"
3539                  "\n",
3540                  rs6000_cost->mulsi,
3541                  rs6000_cost->mulsi_const,
3542                  rs6000_cost->mulsi_const9,
3543                  rs6000_cost->muldi,
3544                  rs6000_cost->divsi,
3545                  rs6000_cost->divdi,
3546                  rs6000_cost->fp,
3547                  rs6000_cost->dmul,
3548                  rs6000_cost->sdiv,
3549                  rs6000_cost->ddiv,
3550                  rs6000_cost->cache_line_size,
3551                  rs6000_cost->l1_cache_size,
3552                  rs6000_cost->l2_cache_size,
3553                  rs6000_cost->simultaneous_prefetches);
3554     }
3555 }
3556
3557 #if TARGET_MACHO
3558 /* The Darwin version of SUBTARGET_OVERRIDE_OPTIONS.  */
3559
3560 static void
3561 darwin_rs6000_override_options (void)
3562 {
3563   /* The Darwin ABI always includes AltiVec, can't be (validly) turned
3564      off.  */
3565   rs6000_altivec_abi = 1;
3566   TARGET_ALTIVEC_VRSAVE = 1;
3567   rs6000_current_abi = ABI_DARWIN;
3568
3569   if (DEFAULT_ABI == ABI_DARWIN
3570       && TARGET_64BIT)
3571       darwin_one_byte_bool = 1;
3572
3573   if (TARGET_64BIT && ! TARGET_POWERPC64)
3574     {
3575       rs6000_isa_flags |= OPTION_MASK_POWERPC64;
3576       warning (0, "%qs requires PowerPC64 architecture, enabling", "-m64");
3577     }
3578   if (flag_mkernel)
3579     {
3580       rs6000_default_long_calls = 1;
3581       rs6000_isa_flags |= OPTION_MASK_SOFT_FLOAT;
3582     }
3583
3584   /* Make -m64 imply -maltivec.  Darwin's 64-bit ABI includes
3585      Altivec.  */
3586   if (!flag_mkernel && !flag_apple_kext
3587       && TARGET_64BIT
3588       && ! (rs6000_isa_flags_explicit & OPTION_MASK_ALTIVEC))
3589     rs6000_isa_flags |= OPTION_MASK_ALTIVEC;
3590
3591   /* Unless the user (not the configurer) has explicitly overridden
3592      it with -mcpu=G3 or -mno-altivec, then 10.5+ targets default to
3593      G4 unless targeting the kernel.  */
3594   if (!flag_mkernel
3595       && !flag_apple_kext
3596       && strverscmp (darwin_macosx_version_min, "10.5") >= 0
3597       && ! (rs6000_isa_flags_explicit & OPTION_MASK_ALTIVEC)
3598       && ! global_options_set.x_rs6000_cpu_index)
3599     {
3600       rs6000_isa_flags |= OPTION_MASK_ALTIVEC;
3601     }
3602 }
3603 #endif
3604
3605 /* If not otherwise specified by a target, make 'long double' equivalent to
3606    'double'.  */
3607
3608 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
3609 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
3610 #endif
3611
3612 /* Return the builtin mask of the various options used that could affect which
3613    builtins were used.  In the past we used target_flags, but we've run out of
3614    bits, and some options are no longer in target_flags.  */
3615
3616 HOST_WIDE_INT
3617 rs6000_builtin_mask_calculate (void)
3618 {
3619   return (((TARGET_ALTIVEC)                 ? RS6000_BTM_ALTIVEC   : 0)
3620           | ((TARGET_CMPB)                  ? RS6000_BTM_CMPB      : 0)
3621           | ((TARGET_VSX)                   ? RS6000_BTM_VSX       : 0)
3622           | ((TARGET_FRE)                   ? RS6000_BTM_FRE       : 0)
3623           | ((TARGET_FRES)                  ? RS6000_BTM_FRES      : 0)
3624           | ((TARGET_FRSQRTE)               ? RS6000_BTM_FRSQRTE   : 0)
3625           | ((TARGET_FRSQRTES)              ? RS6000_BTM_FRSQRTES  : 0)
3626           | ((TARGET_POPCNTD)               ? RS6000_BTM_POPCNTD   : 0)
3627           | ((rs6000_cpu == PROCESSOR_CELL) ? RS6000_BTM_CELL      : 0)
3628           | ((TARGET_P8_VECTOR)             ? RS6000_BTM_P8_VECTOR : 0)
3629           | ((TARGET_P9_VECTOR)             ? RS6000_BTM_P9_VECTOR : 0)
3630           | ((TARGET_P9_MISC)               ? RS6000_BTM_P9_MISC   : 0)
3631           | ((TARGET_MODULO)                ? RS6000_BTM_MODULO    : 0)
3632           | ((TARGET_64BIT)                 ? RS6000_BTM_64BIT     : 0)
3633           | ((TARGET_POWERPC64)             ? RS6000_BTM_POWERPC64 : 0)
3634           | ((TARGET_CRYPTO)                ? RS6000_BTM_CRYPTO    : 0)
3635           | ((TARGET_HTM)                   ? RS6000_BTM_HTM       : 0)
3636           | ((TARGET_DFP)                   ? RS6000_BTM_DFP       : 0)
3637           | ((TARGET_HARD_FLOAT)            ? RS6000_BTM_HARD_FLOAT : 0)
3638           | ((TARGET_LONG_DOUBLE_128
3639               && TARGET_HARD_FLOAT
3640               && !TARGET_IEEEQUAD)          ? RS6000_BTM_LDBL128   : 0)
3641           | ((TARGET_FLOAT128_TYPE)         ? RS6000_BTM_FLOAT128  : 0)
3642           | ((TARGET_FLOAT128_HW)           ? RS6000_BTM_FLOAT128_HW : 0));
3643 }
3644
3645 /* Implement TARGET_MD_ASM_ADJUST.  All asm statements are considered
3646    to clobber the XER[CA] bit because clobbering that bit without telling
3647    the compiler worked just fine with versions of GCC before GCC 5, and
3648    breaking a lot of older code in ways that are hard to track down is
3649    not such a great idea.  */
3650
3651 static rtx_insn *
3652 rs6000_md_asm_adjust (vec<rtx> &/*outputs*/, vec<rtx> &/*inputs*/,
3653                       vec<const char *> &/*constraints*/,
3654                       vec<rtx> &clobbers, HARD_REG_SET &clobbered_regs)
3655 {
3656   clobbers.safe_push (gen_rtx_REG (SImode, CA_REGNO));
3657   SET_HARD_REG_BIT (clobbered_regs, CA_REGNO);
3658   return NULL;
3659 }
3660
3661 /* Override command line options.
3662
3663    Combine build-specific configuration information with options
3664    specified on the command line to set various state variables which
3665    influence code generation, optimization, and expansion of built-in
3666    functions.  Assure that command-line configuration preferences are
3667    compatible with each other and with the build configuration; issue
3668    warnings while adjusting configuration or error messages while
3669    rejecting configuration.
3670
3671    Upon entry to this function:
3672
3673      This function is called once at the beginning of
3674      compilation, and then again at the start and end of compiling
3675      each section of code that has a different configuration, as
3676      indicated, for example, by adding the
3677
3678        __attribute__((__target__("cpu=power9")))
3679
3680      qualifier to a function definition or, for example, by bracketing
3681      code between
3682
3683        #pragma GCC target("altivec")
3684
3685      and
3686
3687        #pragma GCC reset_options
3688
3689      directives.  Parameter global_init_p is true for the initial
3690      invocation, which initializes global variables, and false for all
3691      subsequent invocations.
3692
3693
3694      Various global state information is assumed to be valid.  This
3695      includes OPTION_TARGET_CPU_DEFAULT, representing the name of the
3696      default CPU specified at build configure time, TARGET_DEFAULT,
3697      representing the default set of option flags for the default
3698      target, and global_options_set.x_rs6000_isa_flags, representing
3699      which options were requested on the command line.
3700
3701    Upon return from this function:
3702
3703      rs6000_isa_flags_explicit has a non-zero bit for each flag that
3704      was set by name on the command line.  Additionally, if certain
3705      attributes are automatically enabled or disabled by this function
3706      in order to assure compatibility between options and
3707      configuration, the flags associated with those attributes are
3708      also set.  By setting these "explicit bits", we avoid the risk
3709      that other code might accidentally overwrite these particular
3710      attributes with "default values".
3711
3712      The various bits of rs6000_isa_flags are set to indicate the
3713      target options that have been selected for the most current
3714      compilation efforts.  This has the effect of also turning on the
3715      associated TARGET_XXX values since these are macros which are
3716      generally defined to test the corresponding bit of the
3717      rs6000_isa_flags variable.
3718
3719      The variable rs6000_builtin_mask is set to represent the target
3720      options for the most current compilation efforts, consistent with
3721      the current contents of rs6000_isa_flags.  This variable controls
3722      expansion of built-in functions.
3723
3724      Various other global variables and fields of global structures
3725      (over 50 in all) are initialized to reflect the desired options
3726      for the most current compilation efforts.  */
3727
3728 static bool
3729 rs6000_option_override_internal (bool global_init_p)
3730 {
3731   bool ret = true;
3732
3733   HOST_WIDE_INT set_masks;
3734   HOST_WIDE_INT ignore_masks;
3735   int cpu_index = -1;
3736   int tune_index;
3737   struct cl_target_option *main_target_opt
3738     = ((global_init_p || target_option_default_node == NULL)
3739        ? NULL : TREE_TARGET_OPTION (target_option_default_node));
3740
3741   /* Print defaults.  */
3742   if ((TARGET_DEBUG_REG || TARGET_DEBUG_TARGET) && global_init_p)
3743     rs6000_print_isa_options (stderr, 0, "TARGET_DEFAULT", TARGET_DEFAULT);
3744
3745   /* Remember the explicit arguments.  */
3746   if (global_init_p)
3747     rs6000_isa_flags_explicit = global_options_set.x_rs6000_isa_flags;
3748
3749   /* On 64-bit Darwin, power alignment is ABI-incompatible with some C
3750      library functions, so warn about it. The flag may be useful for
3751      performance studies from time to time though, so don't disable it
3752      entirely.  */
3753   if (global_options_set.x_rs6000_alignment_flags
3754       && rs6000_alignment_flags == MASK_ALIGN_POWER
3755       && DEFAULT_ABI == ABI_DARWIN
3756       && TARGET_64BIT)
3757     warning (0, "%qs is not supported for 64-bit Darwin;"
3758              " it is incompatible with the installed C and C++ libraries",
3759              "-malign-power");
3760
3761   /* Numerous experiment shows that IRA based loop pressure
3762      calculation works better for RTL loop invariant motion on targets
3763      with enough (>= 32) registers.  It is an expensive optimization.
3764      So it is on only for peak performance.  */
3765   if (optimize >= 3 && global_init_p
3766       && !global_options_set.x_flag_ira_loop_pressure)
3767     flag_ira_loop_pressure = 1;
3768
3769   /* -fsanitize=address needs to turn on -fasynchronous-unwind-tables in order
3770      for tracebacks to be complete but not if any -fasynchronous-unwind-tables
3771      options were already specified.  */
3772   if (flag_sanitize & SANITIZE_USER_ADDRESS
3773       && !global_options_set.x_flag_asynchronous_unwind_tables)
3774     flag_asynchronous_unwind_tables = 1;
3775
3776   /* Set the pointer size.  */
3777   if (TARGET_64BIT)
3778     {
3779       rs6000_pmode = DImode;
3780       rs6000_pointer_size = 64;
3781     }
3782   else
3783     {
3784       rs6000_pmode = SImode;
3785       rs6000_pointer_size = 32;
3786     }
3787
3788   /* Some OSs don't support saving the high part of 64-bit registers on context
3789      switch.  Other OSs don't support saving Altivec registers.  On those OSs,
3790      we don't touch the OPTION_MASK_POWERPC64 or OPTION_MASK_ALTIVEC settings;
3791      if the user wants either, the user must explicitly specify them and we
3792      won't interfere with the user's specification.  */
3793
3794   set_masks = POWERPC_MASKS;
3795 #ifdef OS_MISSING_POWERPC64
3796   if (OS_MISSING_POWERPC64)
3797     set_masks &= ~OPTION_MASK_POWERPC64;
3798 #endif
3799 #ifdef OS_MISSING_ALTIVEC
3800   if (OS_MISSING_ALTIVEC)
3801     set_masks &= ~(OPTION_MASK_ALTIVEC | OPTION_MASK_VSX
3802                    | OTHER_VSX_VECTOR_MASKS);
3803 #endif
3804
3805   /* Don't override by the processor default if given explicitly.  */
3806   set_masks &= ~rs6000_isa_flags_explicit;
3807
3808   if (global_init_p && rs6000_dejagnu_cpu_index >= 0)
3809     rs6000_cpu_index = rs6000_dejagnu_cpu_index;
3810
3811   /* Process the -mcpu=<xxx> and -mtune=<xxx> argument.  If the user changed
3812      the cpu in a target attribute or pragma, but did not specify a tuning
3813      option, use the cpu for the tuning option rather than the option specified
3814      with -mtune on the command line.  Process a '--with-cpu' configuration
3815      request as an implicit --cpu.  */
3816   if (rs6000_cpu_index >= 0)
3817     cpu_index = rs6000_cpu_index;
3818   else if (main_target_opt != NULL && main_target_opt->x_rs6000_cpu_index >= 0)
3819     cpu_index = main_target_opt->x_rs6000_cpu_index;
3820   else if (OPTION_TARGET_CPU_DEFAULT)
3821     cpu_index = rs6000_cpu_name_lookup (OPTION_TARGET_CPU_DEFAULT);
3822
3823   /* If we have a cpu, either through an explicit -mcpu=<xxx> or if the
3824      compiler was configured with --with-cpu=<xxx>, replace all of the ISA bits
3825      with those from the cpu, except for options that were explicitly set.  If
3826      we don't have a cpu, do not override the target bits set in
3827      TARGET_DEFAULT.  */
3828   if (cpu_index >= 0)
3829     {
3830       rs6000_cpu_index = cpu_index;
3831       rs6000_isa_flags &= ~set_masks;
3832       rs6000_isa_flags |= (processor_target_table[cpu_index].target_enable
3833                            & set_masks);
3834     }
3835   else
3836     {
3837       /* If no -mcpu=<xxx>, inherit any default options that were cleared via
3838          POWERPC_MASKS.  Originally, TARGET_DEFAULT was used to initialize
3839          target_flags via the TARGET_DEFAULT_TARGET_FLAGS hook.  When we switched
3840          to using rs6000_isa_flags, we need to do the initialization here.
3841
3842          If there is a TARGET_DEFAULT, use that.  Otherwise fall back to using
3843          -mcpu=powerpc, -mcpu=powerpc64, or -mcpu=powerpc64le defaults.  */
3844       HOST_WIDE_INT flags;
3845       if (TARGET_DEFAULT)
3846         flags = TARGET_DEFAULT;
3847       else
3848         {
3849           /* PowerPC 64-bit LE requires at least ISA 2.07.  */
3850           const char *default_cpu = (!TARGET_POWERPC64
3851                                      ? "powerpc"
3852                                      : (BYTES_BIG_ENDIAN
3853                                         ? "powerpc64"
3854                                         : "powerpc64le"));
3855           int default_cpu_index = rs6000_cpu_name_lookup (default_cpu);
3856           flags = processor_target_table[default_cpu_index].target_enable;
3857         }
3858       rs6000_isa_flags |= (flags & ~rs6000_isa_flags_explicit);
3859     }
3860
3861   if (rs6000_tune_index >= 0)
3862     tune_index = rs6000_tune_index;
3863   else if (cpu_index >= 0)
3864     rs6000_tune_index = tune_index = cpu_index;
3865   else
3866     {
3867       size_t i;
3868       enum processor_type tune_proc
3869         = (TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT);
3870
3871       tune_index = -1;
3872       for (i = 0; i < ARRAY_SIZE (processor_target_table); i++)
3873         if (processor_target_table[i].processor == tune_proc)
3874           {
3875             tune_index = i;
3876             break;
3877           }
3878     }
3879
3880   if (cpu_index >= 0)
3881     rs6000_cpu = processor_target_table[cpu_index].processor;
3882   else
3883     rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
3884
3885   gcc_assert (tune_index >= 0);
3886   rs6000_tune = processor_target_table[tune_index].processor;
3887
3888   if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3
3889       || rs6000_cpu == PROCESSOR_PPCE500MC || rs6000_cpu == PROCESSOR_PPCE500MC64
3890       || rs6000_cpu == PROCESSOR_PPCE5500)
3891     {
3892       if (TARGET_ALTIVEC)
3893         error ("AltiVec not supported in this target");
3894     }
3895
3896   /* If we are optimizing big endian systems for space, use the load/store
3897      multiple instructions.  */
3898   if (BYTES_BIG_ENDIAN && optimize_size)
3899     rs6000_isa_flags |= ~rs6000_isa_flags_explicit & OPTION_MASK_MULTIPLE;
3900
3901   /* Don't allow -mmultiple on little endian systems unless the cpu is a 750,
3902      because the hardware doesn't support the instructions used in little
3903      endian mode, and causes an alignment trap.  The 750 does not cause an
3904      alignment trap (except when the target is unaligned).  */
3905
3906   if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750 && TARGET_MULTIPLE)
3907     {
3908       rs6000_isa_flags &= ~OPTION_MASK_MULTIPLE;
3909       if ((rs6000_isa_flags_explicit & OPTION_MASK_MULTIPLE) != 0)
3910         warning (0, "%qs is not supported on little endian systems",
3911                  "-mmultiple");
3912     }
3913
3914   /* If little-endian, default to -mstrict-align on older processors.
3915      Testing for htm matches power8 and later.  */
3916   if (!BYTES_BIG_ENDIAN
3917       && !(processor_target_table[tune_index].target_enable & OPTION_MASK_HTM))
3918     rs6000_isa_flags |= ~rs6000_isa_flags_explicit & OPTION_MASK_STRICT_ALIGN;
3919
3920   if (!rs6000_fold_gimple)
3921      fprintf (stderr,
3922               "gimple folding of rs6000 builtins has been disabled.\n");
3923
3924   /* Add some warnings for VSX.  */
3925   if (TARGET_VSX)
3926     {
3927       const char *msg = NULL;
3928       if (!TARGET_HARD_FLOAT)
3929         {
3930           if (rs6000_isa_flags_explicit & OPTION_MASK_VSX)
3931             msg = N_("%<-mvsx%> requires hardware floating point");
3932           else
3933             {
3934               rs6000_isa_flags &= ~ OPTION_MASK_VSX;
3935               rs6000_isa_flags_explicit |= OPTION_MASK_VSX;
3936             }
3937         }
3938       else if (TARGET_AVOID_XFORM > 0)
3939         msg = N_("%<-mvsx%> needs indexed addressing");
3940       else if (!TARGET_ALTIVEC && (rs6000_isa_flags_explicit
3941                                    & OPTION_MASK_ALTIVEC))
3942         {
3943           if (rs6000_isa_flags_explicit & OPTION_MASK_VSX)
3944             msg = N_("%<-mvsx%> and %<-mno-altivec%> are incompatible");
3945           else
3946             msg = N_("%<-mno-altivec%> disables vsx");
3947         }
3948
3949       if (msg)
3950         {
3951           warning (0, msg);
3952           rs6000_isa_flags &= ~ OPTION_MASK_VSX;
3953           rs6000_isa_flags_explicit |= OPTION_MASK_VSX;
3954         }
3955     }
3956
3957   /* If hard-float/altivec/vsx were explicitly turned off then don't allow
3958      the -mcpu setting to enable options that conflict. */
3959   if ((!TARGET_HARD_FLOAT || !TARGET_ALTIVEC || !TARGET_VSX)
3960       && (rs6000_isa_flags_explicit & (OPTION_MASK_SOFT_FLOAT
3961                                        | OPTION_MASK_ALTIVEC
3962                                        | OPTION_MASK_VSX)) != 0)
3963     rs6000_isa_flags &= ~((OPTION_MASK_P8_VECTOR | OPTION_MASK_CRYPTO
3964                            | OPTION_MASK_DIRECT_MOVE)
3965                          & ~rs6000_isa_flags_explicit);
3966
3967   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
3968     rs6000_print_isa_options (stderr, 0, "before defaults", rs6000_isa_flags);
3969
3970   /* Handle explicit -mno-{altivec,vsx,power8-vector,power9-vector} and turn
3971      off all of the options that depend on those flags.  */
3972   ignore_masks = rs6000_disable_incompatible_switches ();
3973
3974   /* For the newer switches (vsx, dfp, etc.) set some of the older options,
3975      unless the user explicitly used the -mno-<option> to disable the code.  */
3976   if (TARGET_P9_VECTOR || TARGET_MODULO || TARGET_P9_MISC)
3977     rs6000_isa_flags |= (ISA_3_0_MASKS_SERVER & ~ignore_masks);
3978   else if (TARGET_P9_MINMAX)
3979     {
3980       if (cpu_index >= 0)
3981         {
3982           if (cpu_index == PROCESSOR_POWER9)
3983             {
3984               /* legacy behavior: allow -mcpu=power9 with certain
3985                  capabilities explicitly disabled.  */
3986               rs6000_isa_flags |= (ISA_3_0_MASKS_SERVER & ~ignore_masks);
3987             }
3988           else
3989             error ("power9 target option is incompatible with %<%s=<xxx>%> "
3990                    "for <xxx> less than power9", "-mcpu");
3991         }
3992       else if ((ISA_3_0_MASKS_SERVER & rs6000_isa_flags_explicit)
3993                != (ISA_3_0_MASKS_SERVER & rs6000_isa_flags
3994                    & rs6000_isa_flags_explicit))
3995         /* Enforce that none of the ISA_3_0_MASKS_SERVER flags
3996            were explicitly cleared.  */
3997         error ("%qs incompatible with explicitly disabled options",
3998                "-mpower9-minmax");
3999       else
4000         rs6000_isa_flags |= ISA_3_0_MASKS_SERVER;
4001     }
4002   else if (TARGET_P8_VECTOR || TARGET_DIRECT_MOVE || TARGET_CRYPTO)
4003     rs6000_isa_flags |= (ISA_2_7_MASKS_SERVER & ~ignore_masks);
4004   else if (TARGET_VSX)
4005     rs6000_isa_flags |= (ISA_2_6_MASKS_SERVER & ~ignore_masks);
4006   else if (TARGET_POPCNTD)
4007     rs6000_isa_flags |= (ISA_2_6_MASKS_EMBEDDED & ~ignore_masks);
4008   else if (TARGET_DFP)
4009     rs6000_isa_flags |= (ISA_2_5_MASKS_SERVER & ~ignore_masks);
4010   else if (TARGET_CMPB)
4011     rs6000_isa_flags |= (ISA_2_5_MASKS_EMBEDDED & ~ignore_masks);
4012   else if (TARGET_FPRND)
4013     rs6000_isa_flags |= (ISA_2_4_MASKS & ~ignore_masks);
4014   else if (TARGET_POPCNTB)
4015     rs6000_isa_flags |= (ISA_2_2_MASKS & ~ignore_masks);
4016   else if (TARGET_ALTIVEC)
4017     rs6000_isa_flags |= (OPTION_MASK_PPC_GFXOPT & ~ignore_masks);
4018
4019   if (TARGET_CRYPTO && !TARGET_ALTIVEC)
4020     {
4021       if (rs6000_isa_flags_explicit & OPTION_MASK_CRYPTO)
4022         error ("%qs requires %qs", "-mcrypto", "-maltivec");
4023       rs6000_isa_flags &= ~OPTION_MASK_CRYPTO;
4024     }
4025
4026   if (TARGET_DIRECT_MOVE && !TARGET_VSX)
4027     {
4028       if (rs6000_isa_flags_explicit & OPTION_MASK_DIRECT_MOVE)
4029         error ("%qs requires %qs", "-mdirect-move", "-mvsx");
4030       rs6000_isa_flags &= ~OPTION_MASK_DIRECT_MOVE;
4031     }
4032
4033   if (TARGET_P8_VECTOR && !TARGET_ALTIVEC)
4034     {
4035       if (rs6000_isa_flags_explicit & OPTION_MASK_P8_VECTOR)
4036         error ("%qs requires %qs", "-mpower8-vector", "-maltivec");
4037       rs6000_isa_flags &= ~OPTION_MASK_P8_VECTOR;
4038     }
4039
4040   if (TARGET_P8_VECTOR && !TARGET_VSX)
4041     {
4042       if ((rs6000_isa_flags_explicit & OPTION_MASK_P8_VECTOR)
4043           && (rs6000_isa_flags_explicit & OPTION_MASK_VSX))
4044         error ("%qs requires %qs", "-mpower8-vector", "-mvsx");
4045       else if ((rs6000_isa_flags_explicit & OPTION_MASK_P8_VECTOR) == 0)
4046         {
4047           rs6000_isa_flags &= ~OPTION_MASK_P8_VECTOR;
4048           if (rs6000_isa_flags_explicit & OPTION_MASK_VSX)
4049             rs6000_isa_flags_explicit |= OPTION_MASK_P8_VECTOR;
4050         }
4051       else
4052         {
4053           /* OPTION_MASK_P8_VECTOR is explicit, and OPTION_MASK_VSX is
4054              not explicit.  */
4055           rs6000_isa_flags |= OPTION_MASK_VSX;
4056           rs6000_isa_flags_explicit |= OPTION_MASK_VSX;
4057         }
4058     }
4059
4060   if (TARGET_DFP && !TARGET_HARD_FLOAT)
4061     {
4062       if (rs6000_isa_flags_explicit & OPTION_MASK_DFP)
4063         error ("%qs requires %qs", "-mhard-dfp", "-mhard-float");
4064       rs6000_isa_flags &= ~OPTION_MASK_DFP;
4065     }
4066
4067   /* The quad memory instructions only works in 64-bit mode. In 32-bit mode,
4068      silently turn off quad memory mode.  */
4069   if ((TARGET_QUAD_MEMORY || TARGET_QUAD_MEMORY_ATOMIC) && !TARGET_POWERPC64)
4070     {
4071       if ((rs6000_isa_flags_explicit & OPTION_MASK_QUAD_MEMORY) != 0)
4072         warning (0, N_("%<-mquad-memory%> requires 64-bit mode"));
4073
4074       if ((rs6000_isa_flags_explicit & OPTION_MASK_QUAD_MEMORY_ATOMIC) != 0)
4075         warning (0, N_("%<-mquad-memory-atomic%> requires 64-bit mode"));
4076
4077       rs6000_isa_flags &= ~(OPTION_MASK_QUAD_MEMORY
4078                             | OPTION_MASK_QUAD_MEMORY_ATOMIC);
4079     }
4080
4081   /* Non-atomic quad memory load/store are disabled for little endian, since
4082      the words are reversed, but atomic operations can still be done by
4083      swapping the words.  */
4084   if (TARGET_QUAD_MEMORY && !WORDS_BIG_ENDIAN)
4085     {
4086       if ((rs6000_isa_flags_explicit & OPTION_MASK_QUAD_MEMORY) != 0)
4087         warning (0, N_("%<-mquad-memory%> is not available in little endian "
4088                        "mode"));
4089
4090       rs6000_isa_flags &= ~OPTION_MASK_QUAD_MEMORY;
4091     }
4092
4093   /* Assume if the user asked for normal quad memory instructions, they want
4094      the atomic versions as well, unless they explicity told us not to use quad
4095      word atomic instructions.  */
4096   if (TARGET_QUAD_MEMORY
4097       && !TARGET_QUAD_MEMORY_ATOMIC
4098       && ((rs6000_isa_flags_explicit & OPTION_MASK_QUAD_MEMORY_ATOMIC) == 0))
4099     rs6000_isa_flags |= OPTION_MASK_QUAD_MEMORY_ATOMIC;
4100
4101   /* If we can shrink-wrap the TOC register save separately, then use
4102      -msave-toc-indirect unless explicitly disabled.  */
4103   if ((rs6000_isa_flags_explicit & OPTION_MASK_SAVE_TOC_INDIRECT) == 0
4104       && flag_shrink_wrap_separate
4105       && optimize_function_for_speed_p (cfun))
4106     rs6000_isa_flags |= OPTION_MASK_SAVE_TOC_INDIRECT;
4107
4108   /* Enable power8 fusion if we are tuning for power8, even if we aren't
4109      generating power8 instructions.  Power9 does not optimize power8 fusion
4110      cases.  */
4111   if (!(rs6000_isa_flags_explicit & OPTION_MASK_P8_FUSION))
4112     {
4113       if (processor_target_table[tune_index].processor == PROCESSOR_POWER8)
4114         rs6000_isa_flags |= OPTION_MASK_P8_FUSION;
4115       else
4116         rs6000_isa_flags &= ~OPTION_MASK_P8_FUSION;
4117     }
4118
4119   /* Setting additional fusion flags turns on base fusion.  */
4120   if (!TARGET_P8_FUSION && TARGET_P8_FUSION_SIGN)
4121     {
4122       if (rs6000_isa_flags_explicit & OPTION_MASK_P8_FUSION)
4123         {
4124           if (TARGET_P8_FUSION_SIGN)
4125             error ("%qs requires %qs", "-mpower8-fusion-sign",
4126                    "-mpower8-fusion");
4127
4128           rs6000_isa_flags &= ~OPTION_MASK_P8_FUSION;
4129         }
4130       else
4131         rs6000_isa_flags |= OPTION_MASK_P8_FUSION;
4132     }
4133
4134   /* Power8 does not fuse sign extended loads with the addis.  If we are
4135      optimizing at high levels for speed, convert a sign extended load into a
4136      zero extending load, and an explicit sign extension.  */
4137   if (TARGET_P8_FUSION
4138       && !(rs6000_isa_flags_explicit & OPTION_MASK_P8_FUSION_SIGN)
4139       && optimize_function_for_speed_p (cfun)
4140       && optimize >= 3)
4141     rs6000_isa_flags |= OPTION_MASK_P8_FUSION_SIGN;
4142
4143   /* ISA 3.0 vector instructions include ISA 2.07.  */
4144   if (TARGET_P9_VECTOR && !TARGET_P8_VECTOR)
4145     {
4146       /* We prefer to not mention undocumented options in
4147          error messages.  However, if users have managed to select
4148          power9-vector without selecting power8-vector, they
4149          already know about undocumented flags.  */
4150       if ((rs6000_isa_flags_explicit & OPTION_MASK_P9_VECTOR) &&
4151           (rs6000_isa_flags_explicit & OPTION_MASK_P8_VECTOR))
4152         error ("%qs requires %qs", "-mpower9-vector", "-mpower8-vector");
4153       else if ((rs6000_isa_flags_explicit & OPTION_MASK_P9_VECTOR) == 0)
4154         {
4155           rs6000_isa_flags &= ~OPTION_MASK_P9_VECTOR;
4156           if (rs6000_isa_flags_explicit & OPTION_MASK_P8_VECTOR)
4157             rs6000_isa_flags_explicit |= OPTION_MASK_P9_VECTOR;
4158         }
4159       else
4160         {
4161           /* OPTION_MASK_P9_VECTOR is explicit and
4162              OPTION_MASK_P8_VECTOR is not explicit.  */
4163           rs6000_isa_flags |= OPTION_MASK_P8_VECTOR;
4164           rs6000_isa_flags_explicit |= OPTION_MASK_P8_VECTOR;
4165         }
4166     }
4167
4168   /* Set -mallow-movmisalign to explicitly on if we have full ISA 2.07
4169      support. If we only have ISA 2.06 support, and the user did not specify
4170      the switch, leave it set to -1 so the movmisalign patterns are enabled,
4171      but we don't enable the full vectorization support  */
4172   if (TARGET_ALLOW_MOVMISALIGN == -1 && TARGET_P8_VECTOR && TARGET_DIRECT_MOVE)
4173     TARGET_ALLOW_MOVMISALIGN = 1;
4174
4175   else if (TARGET_ALLOW_MOVMISALIGN && !TARGET_VSX)
4176     {
4177       if (TARGET_ALLOW_MOVMISALIGN > 0
4178           && global_options_set.x_TARGET_ALLOW_MOVMISALIGN)
4179         error ("%qs requires %qs", "-mallow-movmisalign", "-mvsx");
4180
4181       TARGET_ALLOW_MOVMISALIGN = 0;
4182     }
4183
4184   /* Determine when unaligned vector accesses are permitted, and when
4185      they are preferred over masked Altivec loads.  Note that if
4186      TARGET_ALLOW_MOVMISALIGN has been disabled by the user, then
4187      TARGET_EFFICIENT_UNALIGNED_VSX must be as well.  The converse is
4188      not true.  */
4189   if (TARGET_EFFICIENT_UNALIGNED_VSX)
4190     {
4191       if (!TARGET_VSX)
4192         {
4193           if (rs6000_isa_flags_explicit & OPTION_MASK_EFFICIENT_UNALIGNED_VSX)
4194             error ("%qs requires %qs", "-mefficient-unaligned-vsx", "-mvsx");
4195
4196           rs6000_isa_flags &= ~OPTION_MASK_EFFICIENT_UNALIGNED_VSX;
4197         }
4198
4199       else if (!TARGET_ALLOW_MOVMISALIGN)
4200         {
4201           if (rs6000_isa_flags_explicit & OPTION_MASK_EFFICIENT_UNALIGNED_VSX)
4202             error ("%qs requires %qs", "-munefficient-unaligned-vsx",
4203                    "-mallow-movmisalign");
4204
4205           rs6000_isa_flags &= ~OPTION_MASK_EFFICIENT_UNALIGNED_VSX;
4206         }
4207     }
4208
4209   /* Use long double size to select the appropriate long double.  We use
4210      TYPE_PRECISION to differentiate the 3 different long double types.  We map
4211      128 into the precision used for TFmode.  */
4212   int default_long_double_size = (RS6000_DEFAULT_LONG_DOUBLE_SIZE == 64
4213                                   ? 64
4214                                   : FLOAT_PRECISION_TFmode);
4215
4216   /* Set long double size before the IEEE 128-bit tests.  */
4217   if (!global_options_set.x_rs6000_long_double_type_size)
4218     {
4219       if (main_target_opt != NULL
4220           && (main_target_opt->x_rs6000_long_double_type_size
4221               != default_long_double_size))
4222         error ("target attribute or pragma changes %<long double%> size");
4223       else
4224         rs6000_long_double_type_size = default_long_double_size;
4225     }
4226   else if (rs6000_long_double_type_size == 128)
4227     rs6000_long_double_type_size = FLOAT_PRECISION_TFmode;
4228   else if (global_options_set.x_rs6000_ieeequad)
4229     {
4230       if (global_options.x_rs6000_ieeequad)
4231         error ("%qs requires %qs", "-mabi=ieeelongdouble", "-mlong-double-128");
4232       else
4233         error ("%qs requires %qs", "-mabi=ibmlongdouble", "-mlong-double-128");
4234     }
4235
4236   /* Set -mabi=ieeelongdouble on some old targets.  In the future, power server
4237      systems will also set long double to be IEEE 128-bit.  AIX and Darwin
4238      explicitly redefine TARGET_IEEEQUAD and TARGET_IEEEQUAD_DEFAULT to 0, so
4239      those systems will not pick up this default.  Warn if the user changes the
4240      default unless -Wno-psabi.  */
4241   if (!global_options_set.x_rs6000_ieeequad)
4242     rs6000_ieeequad = TARGET_IEEEQUAD_DEFAULT;
4243
4244   else
4245     {
4246       if (global_options.x_rs6000_ieeequad
4247           && (!TARGET_POPCNTD || !TARGET_VSX))
4248         error ("%qs requires full ISA 2.06 support", "-mabi=ieeelongdouble");
4249
4250       if (rs6000_ieeequad != TARGET_IEEEQUAD_DEFAULT && TARGET_LONG_DOUBLE_128)
4251         {
4252           static bool warned_change_long_double;
4253           if (!warned_change_long_double)
4254             {
4255               warned_change_long_double = true;
4256               if (TARGET_IEEEQUAD)
4257                 warning (OPT_Wpsabi, "Using IEEE extended precision "
4258                          "%<long double%>");
4259               else
4260                 warning (OPT_Wpsabi, "Using IBM extended precision "
4261                          "%<long double%>");
4262             }
4263         }
4264     }
4265
4266   /* Enable the default support for IEEE 128-bit floating point on Linux VSX
4267      sytems.  In GCC 7, we would enable the the IEEE 128-bit floating point
4268      infrastructure (-mfloat128-type) but not enable the actual __float128 type
4269      unless the user used the explicit -mfloat128.  In GCC 8, we enable both
4270      the keyword as well as the type.  */
4271   TARGET_FLOAT128_TYPE = TARGET_FLOAT128_ENABLE_TYPE && TARGET_VSX;
4272
4273   /* IEEE 128-bit floating point requires VSX support.  */
4274   if (TARGET_FLOAT128_KEYWORD)
4275     {
4276       if (!TARGET_VSX)
4277         {
4278           if ((rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_KEYWORD) != 0)
4279             error ("%qs requires VSX support", "%<-mfloat128%>");
4280
4281           TARGET_FLOAT128_TYPE = 0;
4282           rs6000_isa_flags &= ~(OPTION_MASK_FLOAT128_KEYWORD
4283                                 | OPTION_MASK_FLOAT128_HW);
4284         }
4285       else if (!TARGET_FLOAT128_TYPE)
4286         {
4287           TARGET_FLOAT128_TYPE = 1;
4288           warning (0, "The %<-mfloat128%> option may not be fully supported");
4289         }
4290     }
4291
4292   /* Enable the __float128 keyword under Linux by default.  */
4293   if (TARGET_FLOAT128_TYPE && !TARGET_FLOAT128_KEYWORD
4294       && (rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_KEYWORD) == 0)
4295     rs6000_isa_flags |= OPTION_MASK_FLOAT128_KEYWORD;
4296
4297   /* If we have are supporting the float128 type and full ISA 3.0 support,
4298      enable -mfloat128-hardware by default.  However, don't enable the
4299      __float128 keyword if it was explicitly turned off.  64-bit mode is needed
4300      because sometimes the compiler wants to put things in an integer
4301      container, and if we don't have __int128 support, it is impossible.  */
4302   if (TARGET_FLOAT128_TYPE && !TARGET_FLOAT128_HW && TARGET_64BIT
4303       && (rs6000_isa_flags & ISA_3_0_MASKS_IEEE) == ISA_3_0_MASKS_IEEE
4304       && !(rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_HW))
4305     rs6000_isa_flags |= OPTION_MASK_FLOAT128_HW;
4306
4307   if (TARGET_FLOAT128_HW
4308       && (rs6000_isa_flags & ISA_3_0_MASKS_IEEE) != ISA_3_0_MASKS_IEEE)
4309     {
4310       if ((rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_HW) != 0)
4311         error ("%qs requires full ISA 3.0 support", "%<-mfloat128-hardware%>");
4312
4313       rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW;
4314     }
4315
4316   if (TARGET_FLOAT128_HW && !TARGET_64BIT)
4317     {
4318       if ((rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_HW) != 0)
4319         error ("%qs requires %qs", "%<-mfloat128-hardware%>", "-m64");
4320
4321       rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW;
4322     }
4323
4324   /* Print the options after updating the defaults.  */
4325   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
4326     rs6000_print_isa_options (stderr, 0, "after defaults", rs6000_isa_flags);
4327
4328   /* E500mc does "better" if we inline more aggressively.  Respect the
4329      user's opinion, though.  */
4330   if (rs6000_block_move_inline_limit == 0
4331       && (rs6000_tune == PROCESSOR_PPCE500MC
4332           || rs6000_tune == PROCESSOR_PPCE500MC64
4333           || rs6000_tune == PROCESSOR_PPCE5500
4334           || rs6000_tune == PROCESSOR_PPCE6500))
4335     rs6000_block_move_inline_limit = 128;
4336
4337   /* store_one_arg depends on expand_block_move to handle at least the
4338      size of reg_parm_stack_space.  */
4339   if (rs6000_block_move_inline_limit < (TARGET_POWERPC64 ? 64 : 32))
4340     rs6000_block_move_inline_limit = (TARGET_POWERPC64 ? 64 : 32);
4341
4342   if (global_init_p)
4343     {
4344       /* If the appropriate debug option is enabled, replace the target hooks
4345          with debug versions that call the real version and then prints
4346          debugging information.  */
4347       if (TARGET_DEBUG_COST)
4348         {
4349           targetm.rtx_costs = rs6000_debug_rtx_costs;
4350           targetm.address_cost = rs6000_debug_address_cost;
4351           targetm.sched.adjust_cost = rs6000_debug_adjust_cost;
4352         }
4353
4354       if (TARGET_DEBUG_ADDR)
4355         {
4356           targetm.legitimate_address_p = rs6000_debug_legitimate_address_p;
4357           targetm.legitimize_address = rs6000_debug_legitimize_address;
4358           rs6000_secondary_reload_class_ptr
4359             = rs6000_debug_secondary_reload_class;
4360           targetm.secondary_memory_needed
4361             = rs6000_debug_secondary_memory_needed;
4362           targetm.can_change_mode_class
4363             = rs6000_debug_can_change_mode_class;
4364           rs6000_preferred_reload_class_ptr
4365             = rs6000_debug_preferred_reload_class;
4366           rs6000_mode_dependent_address_ptr
4367             = rs6000_debug_mode_dependent_address;
4368         }
4369
4370       if (rs6000_veclibabi_name)
4371         {
4372           if (strcmp (rs6000_veclibabi_name, "mass") == 0)
4373             rs6000_veclib_handler = rs6000_builtin_vectorized_libmass;
4374           else
4375             {
4376               error ("unknown vectorization library ABI type (%qs) for "
4377                      "%qs switch", rs6000_veclibabi_name, "-mveclibabi=");
4378               ret = false;
4379             }
4380         }
4381     }
4382
4383   /* Disable VSX and Altivec silently if the user switched cpus to power7 in a
4384      target attribute or pragma which automatically enables both options,
4385      unless the altivec ABI was set.  This is set by default for 64-bit, but
4386      not for 32-bit.  */
4387   if (main_target_opt != NULL && !main_target_opt->x_rs6000_altivec_abi)
4388     {
4389       TARGET_FLOAT128_TYPE = 0;
4390       rs6000_isa_flags &= ~((OPTION_MASK_VSX | OPTION_MASK_ALTIVEC
4391                              | OPTION_MASK_FLOAT128_KEYWORD)
4392                             & ~rs6000_isa_flags_explicit);
4393     }
4394
4395   /* Enable Altivec ABI for AIX -maltivec.  */
4396   if (TARGET_XCOFF && (TARGET_ALTIVEC || TARGET_VSX))
4397     {
4398       if (main_target_opt != NULL && !main_target_opt->x_rs6000_altivec_abi)
4399         error ("target attribute or pragma changes AltiVec ABI");
4400       else
4401         rs6000_altivec_abi = 1;
4402     }
4403
4404   /* The AltiVec ABI is the default for PowerPC-64 GNU/Linux.  For
4405      PowerPC-32 GNU/Linux, -maltivec implies the AltiVec ABI.  It can
4406      be explicitly overridden in either case.  */
4407   if (TARGET_ELF)
4408     {
4409       if (!global_options_set.x_rs6000_altivec_abi
4410           && (TARGET_64BIT || TARGET_ALTIVEC || TARGET_VSX))
4411         {
4412           if (main_target_opt != NULL &&
4413               !main_target_opt->x_rs6000_altivec_abi)
4414             error ("target attribute or pragma changes AltiVec ABI");
4415           else
4416             rs6000_altivec_abi = 1;
4417         }
4418     }
4419
4420   /* Set the Darwin64 ABI as default for 64-bit Darwin.  
4421      So far, the only darwin64 targets are also MACH-O.  */
4422   if (TARGET_MACHO
4423       && DEFAULT_ABI == ABI_DARWIN 
4424       && TARGET_64BIT)
4425     {
4426       if (main_target_opt != NULL && !main_target_opt->x_rs6000_darwin64_abi)
4427         error ("target attribute or pragma changes darwin64 ABI");
4428       else
4429         {
4430           rs6000_darwin64_abi = 1;
4431           /* Default to natural alignment, for better performance.  */
4432           rs6000_alignment_flags = MASK_ALIGN_NATURAL;
4433         }
4434     }
4435
4436   /* Place FP constants in the constant pool instead of TOC
4437      if section anchors enabled.  */
4438   if (flag_section_anchors
4439       && !global_options_set.x_TARGET_NO_FP_IN_TOC)
4440     TARGET_NO_FP_IN_TOC = 1;
4441
4442   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
4443     rs6000_print_isa_options (stderr, 0, "before subtarget", rs6000_isa_flags);
4444
4445 #ifdef SUBTARGET_OVERRIDE_OPTIONS
4446   SUBTARGET_OVERRIDE_OPTIONS;
4447 #endif
4448 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
4449   SUBSUBTARGET_OVERRIDE_OPTIONS;
4450 #endif
4451 #ifdef SUB3TARGET_OVERRIDE_OPTIONS
4452   SUB3TARGET_OVERRIDE_OPTIONS;
4453 #endif
4454
4455   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
4456     rs6000_print_isa_options (stderr, 0, "after subtarget", rs6000_isa_flags);
4457
4458   rs6000_always_hint = (rs6000_tune != PROCESSOR_POWER4
4459                         && rs6000_tune != PROCESSOR_POWER5
4460                         && rs6000_tune != PROCESSOR_POWER6
4461                         && rs6000_tune != PROCESSOR_POWER7
4462                         && rs6000_tune != PROCESSOR_POWER8
4463                         && rs6000_tune != PROCESSOR_POWER9
4464                         && rs6000_tune != PROCESSOR_PPCA2
4465                         && rs6000_tune != PROCESSOR_CELL
4466                         && rs6000_tune != PROCESSOR_PPC476);
4467   rs6000_sched_groups = (rs6000_tune == PROCESSOR_POWER4
4468                          || rs6000_tune == PROCESSOR_POWER5
4469                          || rs6000_tune == PROCESSOR_POWER7
4470                          || rs6000_tune == PROCESSOR_POWER8);
4471   rs6000_align_branch_targets = (rs6000_tune == PROCESSOR_POWER4
4472                                  || rs6000_tune == PROCESSOR_POWER5
4473                                  || rs6000_tune == PROCESSOR_POWER6
4474                                  || rs6000_tune == PROCESSOR_POWER7
4475                                  || rs6000_tune == PROCESSOR_POWER8
4476                                  || rs6000_tune == PROCESSOR_POWER9
4477                                  || rs6000_tune == PROCESSOR_PPCE500MC
4478                                  || rs6000_tune == PROCESSOR_PPCE500MC64
4479                                  || rs6000_tune == PROCESSOR_PPCE5500
4480                                  || rs6000_tune == PROCESSOR_PPCE6500);
4481
4482   /* Allow debug switches to override the above settings.  These are set to -1
4483      in rs6000.opt to indicate the user hasn't directly set the switch.  */
4484   if (TARGET_ALWAYS_HINT >= 0)
4485     rs6000_always_hint = TARGET_ALWAYS_HINT;
4486
4487   if (TARGET_SCHED_GROUPS >= 0)
4488     rs6000_sched_groups = TARGET_SCHED_GROUPS;
4489
4490   if (TARGET_ALIGN_BRANCH_TARGETS >= 0)
4491     rs6000_align_branch_targets = TARGET_ALIGN_BRANCH_TARGETS;
4492
4493   rs6000_sched_restricted_insns_priority
4494     = (rs6000_sched_groups ? 1 : 0);
4495
4496   /* Handle -msched-costly-dep option.  */
4497   rs6000_sched_costly_dep
4498     = (rs6000_sched_groups ? true_store_to_load_dep_costly : no_dep_costly);
4499
4500   if (rs6000_sched_costly_dep_str)
4501     {
4502       if (! strcmp (rs6000_sched_costly_dep_str, "no"))
4503         rs6000_sched_costly_dep = no_dep_costly;
4504       else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
4505         rs6000_sched_costly_dep = all_deps_costly;
4506       else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
4507         rs6000_sched_costly_dep = true_store_to_load_dep_costly;
4508       else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
4509         rs6000_sched_costly_dep = store_to_load_dep_costly;
4510       else
4511         rs6000_sched_costly_dep = ((enum rs6000_dependence_cost)
4512                                    atoi (rs6000_sched_costly_dep_str));
4513     }
4514
4515   /* Handle -minsert-sched-nops option.  */
4516   rs6000_sched_insert_nops
4517     = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
4518
4519   if (rs6000_sched_insert_nops_str)
4520     {
4521       if (! strcmp (rs6000_sched_insert_nops_str, "no"))
4522         rs6000_sched_insert_nops = sched_finish_none;
4523       else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
4524         rs6000_sched_insert_nops = sched_finish_pad_groups;
4525       else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
4526         rs6000_sched_insert_nops = sched_finish_regroup_exact;
4527       else
4528         rs6000_sched_insert_nops = ((enum rs6000_nop_insertion)
4529                                     atoi (rs6000_sched_insert_nops_str));
4530     }
4531
4532   /* Handle stack protector */
4533   if (!global_options_set.x_rs6000_stack_protector_guard)
4534 #ifdef TARGET_THREAD_SSP_OFFSET
4535     rs6000_stack_protector_guard = SSP_TLS;
4536 #else
4537     rs6000_stack_protector_guard = SSP_GLOBAL;
4538 #endif
4539
4540 #ifdef TARGET_THREAD_SSP_OFFSET
4541   rs6000_stack_protector_guard_offset = TARGET_THREAD_SSP_OFFSET;
4542   rs6000_stack_protector_guard_reg = TARGET_64BIT ? 13 : 2;
4543 #endif
4544
4545   if (global_options_set.x_rs6000_stack_protector_guard_offset_str)
4546     {
4547       char *endp;
4548       const char *str = rs6000_stack_protector_guard_offset_str;
4549
4550       errno = 0;
4551       long offset = strtol (str, &endp, 0);
4552       if (!*str || *endp || errno)
4553         error ("%qs is not a valid number in %qs", str,
4554                "-mstack-protector-guard-offset=");
4555
4556       if (!IN_RANGE (offset, -0x8000, 0x7fff)
4557           || (TARGET_64BIT && (offset & 3)))
4558         error ("%qs is not a valid offset in %qs", str,
4559                "-mstack-protector-guard-offset=");
4560
4561       rs6000_stack_protector_guard_offset = offset;
4562     }
4563
4564   if (global_options_set.x_rs6000_stack_protector_guard_reg_str)
4565     {
4566       const char *str = rs6000_stack_protector_guard_reg_str;
4567       int reg = decode_reg_name (str);
4568
4569       if (!IN_RANGE (reg, 1, 31))
4570         error ("%qs is not a valid base register in %qs", str,
4571                "-mstack-protector-guard-reg=");
4572
4573       rs6000_stack_protector_guard_reg = reg;
4574     }
4575
4576   if (rs6000_stack_protector_guard == SSP_TLS
4577       && !IN_RANGE (rs6000_stack_protector_guard_reg, 1, 31))
4578     error ("%qs needs a valid base register", "-mstack-protector-guard=tls");
4579
4580   if (global_init_p)
4581     {
4582 #ifdef TARGET_REGNAMES
4583       /* If the user desires alternate register names, copy in the
4584          alternate names now.  */
4585       if (TARGET_REGNAMES)
4586         memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
4587 #endif
4588
4589       /* Set aix_struct_return last, after the ABI is determined.
4590          If -maix-struct-return or -msvr4-struct-return was explicitly
4591          used, don't override with the ABI default.  */
4592       if (!global_options_set.x_aix_struct_return)
4593         aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
4594
4595 #if 0
4596       /* IBM XL compiler defaults to unsigned bitfields.  */
4597       if (TARGET_XL_COMPAT)
4598         flag_signed_bitfields = 0;
4599 #endif
4600
4601       if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
4602         REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
4603
4604       ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
4605
4606       /* We can only guarantee the availability of DI pseudo-ops when
4607          assembling for 64-bit targets.  */
4608       if (!TARGET_64BIT)
4609         {
4610           targetm.asm_out.aligned_op.di = NULL;
4611           targetm.asm_out.unaligned_op.di = NULL;
4612         }
4613
4614
4615       /* Set branch target alignment, if not optimizing for size.  */
4616       if (!optimize_size)
4617         {
4618           /* Cell wants to be aligned 8byte for dual issue.  Titan wants to be
4619              aligned 8byte to avoid misprediction by the branch predictor.  */
4620           if (rs6000_tune == PROCESSOR_TITAN
4621               || rs6000_tune == PROCESSOR_CELL)
4622             {
4623               if (flag_align_functions && !str_align_functions)
4624                 str_align_functions = "8";
4625               if (flag_align_jumps && !str_align_jumps)
4626                 str_align_jumps = "8";
4627               if (flag_align_loops && !str_align_loops)
4628                 str_align_loops = "8";
4629             }
4630           if (rs6000_align_branch_targets)
4631             {
4632               if (flag_align_functions && !str_align_functions)
4633                 str_align_functions = "16";
4634               if (flag_align_jumps && !str_align_jumps)
4635                 str_align_jumps = "16";
4636               if (flag_align_loops && !str_align_loops)
4637                 {
4638                   can_override_loop_align = 1;
4639                   str_align_loops = "16";
4640                 }
4641             }
4642
4643           if (flag_align_jumps && !str_align_jumps)
4644             str_align_jumps = "16";
4645           if (flag_align_loops && !str_align_loops)
4646             str_align_loops = "16";
4647         }
4648
4649       /* Arrange to save and restore machine status around nested functions.  */
4650       init_machine_status = rs6000_init_machine_status;
4651
4652       /* We should always be splitting complex arguments, but we can't break
4653          Linux and Darwin ABIs at the moment.  For now, only AIX is fixed.  */
4654       if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
4655         targetm.calls.split_complex_arg = NULL;
4656
4657       /* The AIX and ELFv1 ABIs define standard function descriptors.  */
4658       if (DEFAULT_ABI == ABI_AIX)
4659         targetm.calls.custom_function_descriptors = 0;
4660     }
4661
4662   /* Initialize rs6000_cost with the appropriate target costs.  */
4663   if (optimize_size)
4664     rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
4665   else
4666     switch (rs6000_tune)
4667       {
4668       case PROCESSOR_RS64A:
4669         rs6000_cost = &rs64a_cost;
4670         break;
4671
4672       case PROCESSOR_MPCCORE:
4673         rs6000_cost = &mpccore_cost;
4674         break;
4675
4676       case PROCESSOR_PPC403:
4677         rs6000_cost = &ppc403_cost;
4678         break;
4679
4680       case PROCESSOR_PPC405:
4681         rs6000_cost = &ppc405_cost;
4682         break;
4683
4684       case PROCESSOR_PPC440:
4685         rs6000_cost = &ppc440_cost;
4686         break;
4687
4688       case PROCESSOR_PPC476:
4689         rs6000_cost = &ppc476_cost;
4690         break;
4691
4692       case PROCESSOR_PPC601:
4693         rs6000_cost = &ppc601_cost;
4694         break;
4695
4696       case PROCESSOR_PPC603:
4697         rs6000_cost = &ppc603_cost;
4698         break;
4699
4700       case PROCESSOR_PPC604:
4701         rs6000_cost = &ppc604_cost;
4702         break;
4703
4704       case PROCESSOR_PPC604e:
4705         rs6000_cost = &ppc604e_cost;
4706         break;
4707
4708       case PROCESSOR_PPC620:
4709         rs6000_cost = &ppc620_cost;
4710         break;
4711
4712       case PROCESSOR_PPC630:
4713         rs6000_cost = &ppc630_cost;
4714         break;
4715
4716       case PROCESSOR_CELL:
4717         rs6000_cost = &ppccell_cost;
4718         break;
4719
4720       case PROCESSOR_PPC750:
4721       case PROCESSOR_PPC7400:
4722         rs6000_cost = &ppc750_cost;
4723         break;
4724
4725       case PROCESSOR_PPC7450:
4726         rs6000_cost = &ppc7450_cost;
4727         break;
4728
4729       case PROCESSOR_PPC8540:
4730       case PROCESSOR_PPC8548:
4731         rs6000_cost = &ppc8540_cost;
4732         break;
4733
4734       case PROCESSOR_PPCE300C2:
4735       case PROCESSOR_PPCE300C3:
4736         rs6000_cost = &ppce300c2c3_cost;
4737         break;
4738
4739       case PROCESSOR_PPCE500MC:
4740         rs6000_cost = &ppce500mc_cost;
4741         break;
4742
4743       case PROCESSOR_PPCE500MC64:
4744         rs6000_cost = &ppce500mc64_cost;
4745         break;
4746
4747       case PROCESSOR_PPCE5500:
4748         rs6000_cost = &ppce5500_cost;
4749         break;
4750
4751       case PROCESSOR_PPCE6500:
4752         rs6000_cost = &ppce6500_cost;
4753         break;
4754
4755       case PROCESSOR_TITAN:
4756         rs6000_cost = &titan_cost;
4757         break;
4758
4759       case PROCESSOR_POWER4:
4760       case PROCESSOR_POWER5:
4761         rs6000_cost = &power4_cost;
4762         break;
4763
4764       case PROCESSOR_POWER6:
4765         rs6000_cost = &power6_cost;
4766         break;
4767
4768       case PROCESSOR_POWER7:
4769         rs6000_cost = &power7_cost;
4770         break;
4771
4772       case PROCESSOR_POWER8:
4773         rs6000_cost = &power8_cost;
4774         break;
4775
4776       case PROCESSOR_POWER9:
4777         rs6000_cost = &power9_cost;
4778         break;
4779
4780       case PROCESSOR_PPCA2:
4781         rs6000_cost = &ppca2_cost;
4782         break;
4783
4784       default:
4785         gcc_unreachable ();
4786       }
4787
4788   if (global_init_p)
4789     {
4790       maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
4791                              rs6000_cost->simultaneous_prefetches,
4792                              global_options.x_param_values,
4793                              global_options_set.x_param_values);
4794       maybe_set_param_value (PARAM_L1_CACHE_SIZE, rs6000_cost->l1_cache_size,
4795                              global_options.x_param_values,
4796                              global_options_set.x_param_values);
4797       maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
4798                              rs6000_cost->cache_line_size,
4799                              global_options.x_param_values,
4800                              global_options_set.x_param_values);
4801       maybe_set_param_value (PARAM_L2_CACHE_SIZE, rs6000_cost->l2_cache_size,
4802                              global_options.x_param_values,
4803                              global_options_set.x_param_values);
4804
4805       /* Increase loop peeling limits based on performance analysis. */
4806       maybe_set_param_value (PARAM_MAX_PEELED_INSNS, 400,
4807                              global_options.x_param_values,
4808                              global_options_set.x_param_values);
4809       maybe_set_param_value (PARAM_MAX_COMPLETELY_PEELED_INSNS, 400,
4810                              global_options.x_param_values,
4811                              global_options_set.x_param_values);
4812
4813       /* Use the 'model' -fsched-pressure algorithm by default.  */
4814       maybe_set_param_value (PARAM_SCHED_PRESSURE_ALGORITHM,
4815                              SCHED_PRESSURE_MODEL,
4816                              global_options.x_param_values,
4817                              global_options_set.x_param_values);
4818
4819       /* If using typedef char *va_list, signal that
4820          __builtin_va_start (&ap, 0) can be optimized to
4821          ap = __builtin_next_arg (0).  */
4822       if (DEFAULT_ABI != ABI_V4)
4823         targetm.expand_builtin_va_start = NULL;
4824     }
4825
4826   /* If not explicitly specified via option, decide whether to generate indexed
4827      load/store instructions.  A value of -1 indicates that the
4828      initial value of this variable has not been overwritten. During
4829      compilation, TARGET_AVOID_XFORM is either 0 or 1. */
4830   if (TARGET_AVOID_XFORM == -1)
4831     /* Avoid indexed addressing when targeting Power6 in order to avoid the
4832      DERAT mispredict penalty.  However the LVE and STVE altivec instructions
4833      need indexed accesses and the type used is the scalar type of the element
4834      being loaded or stored.  */
4835     TARGET_AVOID_XFORM = (rs6000_tune == PROCESSOR_POWER6 && TARGET_CMPB
4836                           && !TARGET_ALTIVEC);
4837
4838   /* Set the -mrecip options.  */
4839   if (rs6000_recip_name)
4840     {
4841       char *p = ASTRDUP (rs6000_recip_name);
4842       char *q;
4843       unsigned int mask, i;
4844       bool invert;
4845
4846       while ((q = strtok (p, ",")) != NULL)
4847         {
4848           p = NULL;
4849           if (*q == '!')
4850             {
4851               invert = true;
4852               q++;
4853             }
4854           else
4855             invert = false;
4856
4857           if (!strcmp (q, "default"))
4858             mask = ((TARGET_RECIP_PRECISION)
4859                     ? RECIP_HIGH_PRECISION : RECIP_LOW_PRECISION);
4860           else
4861             {
4862               for (i = 0; i < ARRAY_SIZE (recip_options); i++)
4863                 if (!strcmp (q, recip_options[i].string))
4864                   {
4865                     mask = recip_options[i].mask;
4866                     break;
4867                   }
4868
4869               if (i == ARRAY_SIZE (recip_options))
4870                 {
4871                   error ("unknown option for %<%s=%s%>", "-mrecip", q);
4872                   invert = false;
4873                   mask = 0;
4874                   ret = false;
4875                 }
4876             }
4877
4878           if (invert)
4879             rs6000_recip_control &= ~mask;
4880           else
4881             rs6000_recip_control |= mask;
4882         }
4883     }
4884
4885   /* Set the builtin mask of the various options used that could affect which
4886      builtins were used.  In the past we used target_flags, but we've run out
4887      of bits, and some options are no longer in target_flags.  */
4888   rs6000_builtin_mask = rs6000_builtin_mask_calculate ();
4889   if (TARGET_DEBUG_BUILTIN || TARGET_DEBUG_TARGET)
4890     rs6000_print_builtin_options (stderr, 0, "builtin mask",
4891                                   rs6000_builtin_mask);
4892
4893   /* Initialize all of the registers.  */
4894   rs6000_init_hard_regno_mode_ok (global_init_p);
4895
4896   /* Save the initial options in case the user does function specific options */
4897   if (global_init_p)
4898     target_option_default_node = target_option_current_node
4899       = build_target_option_node (&global_options);
4900
4901   /* If not explicitly specified via option, decide whether to generate the
4902      extra blr's required to preserve the link stack on some cpus (eg, 476).  */
4903   if (TARGET_LINK_STACK == -1)
4904     SET_TARGET_LINK_STACK (rs6000_tune == PROCESSOR_PPC476 && flag_pic);
4905
4906   /* Deprecate use of -mno-speculate-indirect-jumps.  */
4907   if (!rs6000_speculate_indirect_jumps)
4908     warning (0, "%qs is deprecated and not recommended in any circumstances",
4909              "-mno-speculate-indirect-jumps");
4910
4911   return ret;
4912 }
4913
4914 /* Implement TARGET_OPTION_OVERRIDE.  On the RS/6000 this is used to
4915    define the target cpu type.  */
4916
4917 static void
4918 rs6000_option_override (void)
4919 {
4920   (void) rs6000_option_override_internal (true);
4921 }
4922
4923 \f
4924 /* Implement targetm.vectorize.builtin_mask_for_load.  */
4925 static tree
4926 rs6000_builtin_mask_for_load (void)
4927 {
4928   /* Don't use lvsl/vperm for P8 and similarly efficient machines.  */
4929   if ((TARGET_ALTIVEC && !TARGET_VSX)
4930       || (TARGET_VSX && !TARGET_EFFICIENT_UNALIGNED_VSX))
4931     return altivec_builtin_mask_for_load;
4932   else
4933     return 0;
4934 }
4935
4936 /* Implement LOOP_ALIGN. */
4937 align_flags
4938 rs6000_loop_align (rtx label)
4939 {
4940   basic_block bb;
4941   int ninsns;
4942
4943   /* Don't override loop alignment if -falign-loops was specified. */
4944   if (!can_override_loop_align)
4945     return align_loops;
4946
4947   bb = BLOCK_FOR_INSN (label);
4948   ninsns = num_loop_insns(bb->loop_father);
4949
4950   /* Align small loops to 32 bytes to fit in an icache sector, otherwise return default. */
4951   if (ninsns > 4 && ninsns <= 8
4952       && (rs6000_tune == PROCESSOR_POWER4
4953           || rs6000_tune == PROCESSOR_POWER5
4954           || rs6000_tune == PROCESSOR_POWER6
4955           || rs6000_tune == PROCESSOR_POWER7
4956           || rs6000_tune == PROCESSOR_POWER8))
4957     return align_flags (5);
4958   else
4959     return align_loops;
4960 }
4961
4962 /* Return true iff, data reference of TYPE can reach vector alignment (16)
4963    after applying N number of iterations.  This routine does not determine
4964    how may iterations are required to reach desired alignment.  */
4965
4966 static bool
4967 rs6000_vector_alignment_reachable (const_tree type ATTRIBUTE_UNUSED, bool is_packed)
4968 {
4969   if (is_packed)
4970     return false;
4971
4972   if (TARGET_32BIT)
4973     {
4974       if (rs6000_alignment_flags == MASK_ALIGN_NATURAL)
4975         return true;
4976
4977       if (rs6000_alignment_flags ==  MASK_ALIGN_POWER)
4978         return true;
4979
4980       return false;
4981     }
4982   else
4983     {
4984       if (TARGET_MACHO)
4985         return false;
4986
4987       /* Assuming that all other types are naturally aligned. CHECKME!  */
4988       return true;
4989     }
4990 }
4991
4992 /* Return true if the vector misalignment factor is supported by the
4993    target.  */ 
4994 static bool
4995 rs6000_builtin_support_vector_misalignment (machine_mode mode,
4996                                             const_tree type,
4997                                             int misalignment,
4998                                             bool is_packed)
4999 {
5000   if (TARGET_VSX)
5001     {
5002       if (TARGET_EFFICIENT_UNALIGNED_VSX)
5003         return true;
5004
5005       /* Return if movmisalign pattern is not supported for this mode.  */
5006       if (optab_handler (movmisalign_optab, mode) == CODE_FOR_nothing)
5007         return false;
5008
5009       if (misalignment == -1)
5010         {
5011           /* Misalignment factor is unknown at compile time but we know
5012              it's word aligned.  */
5013           if (rs6000_vector_alignment_reachable (type, is_packed))
5014             {
5015               int element_size = TREE_INT_CST_LOW (TYPE_SIZE (type));
5016
5017               if (element_size == 64 || element_size == 32)
5018                return true;
5019             }
5020
5021           return false;
5022         }
5023
5024       /* VSX supports word-aligned vector.  */
5025       if (misalignment % 4 == 0)
5026         return true;
5027     }
5028   return false;
5029 }
5030
5031 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
5032 static int
5033 rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
5034                                    tree vectype, int misalign)
5035 {
5036   unsigned elements;
5037   tree elem_type;
5038
5039   switch (type_of_cost)
5040     {
5041       case scalar_stmt:
5042       case scalar_load:
5043       case scalar_store:
5044       case vector_stmt:
5045       case vector_load:
5046       case vector_store:
5047       case vec_to_scalar:
5048       case scalar_to_vec:
5049       case cond_branch_not_taken:
5050         return 1;
5051
5052       case vec_perm:
5053         if (TARGET_VSX)
5054           return 3;
5055         else
5056           return 1;
5057
5058       case vec_promote_demote:
5059         if (TARGET_VSX)
5060           return 4;
5061         else
5062           return 1;
5063
5064       case cond_branch_taken:
5065         return 3;
5066
5067       case unaligned_load:
5068       case vector_gather_load:
5069         if (TARGET_EFFICIENT_UNALIGNED_VSX)
5070           return 1;
5071
5072         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
5073           {
5074             elements = TYPE_VECTOR_SUBPARTS (vectype);
5075             if (elements == 2)
5076               /* Double word aligned.  */
5077               return 2;
5078
5079             if (elements == 4)
5080               {
5081                 switch (misalign)
5082                   {
5083                     case 8:
5084                       /* Double word aligned.  */
5085                       return 2;
5086
5087                     case -1:
5088                       /* Unknown misalignment.  */
5089                     case 4:
5090                     case 12:
5091                       /* Word aligned.  */
5092                       return 22;
5093
5094                     default:
5095                       gcc_unreachable ();
5096                   }
5097               }
5098           }
5099
5100         if (TARGET_ALTIVEC)
5101           /* Misaligned loads are not supported.  */
5102           gcc_unreachable ();
5103
5104         return 2;
5105
5106       case unaligned_store:
5107       case vector_scatter_store:
5108         if (TARGET_EFFICIENT_UNALIGNED_VSX)
5109           return 1;
5110
5111         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
5112           {
5113             elements = TYPE_VECTOR_SUBPARTS (vectype);
5114             if (elements == 2)
5115               /* Double word aligned.  */
5116               return 2;
5117
5118             if (elements == 4)
5119               {
5120                 switch (misalign)
5121                   {
5122                     case 8:
5123                       /* Double word aligned.  */
5124                       return 2;
5125
5126                     case -1:
5127                       /* Unknown misalignment.  */
5128                     case 4:
5129                     case 12:
5130                       /* Word aligned.  */
5131                       return 23;
5132
5133                     default:
5134                       gcc_unreachable ();
5135                   }
5136               }
5137           }
5138
5139         if (TARGET_ALTIVEC)
5140           /* Misaligned stores are not supported.  */
5141           gcc_unreachable ();
5142
5143         return 2;
5144
5145       case vec_construct:
5146         /* This is a rough approximation assuming non-constant elements
5147            constructed into a vector via element insertion.  FIXME:
5148            vec_construct is not granular enough for uniformly good
5149            decisions.  If the initialization is a splat, this is
5150            cheaper than we estimate.  Improve this someday.  */
5151         elem_type = TREE_TYPE (vectype);
5152         /* 32-bit vectors loaded into registers are stored as double
5153            precision, so we need 2 permutes, 2 converts, and 1 merge
5154            to construct a vector of short floats from them.  */
5155         if (SCALAR_FLOAT_TYPE_P (elem_type)
5156             && TYPE_PRECISION (elem_type) == 32)
5157           return 5;
5158         /* On POWER9, integer vector types are built up in GPRs and then
5159            use a direct move (2 cycles).  For POWER8 this is even worse,
5160            as we need two direct moves and a merge, and the direct moves
5161            are five cycles.  */
5162         else if (INTEGRAL_TYPE_P (elem_type))
5163           {
5164             if (TARGET_P9_VECTOR)
5165               return TYPE_VECTOR_SUBPARTS (vectype) - 1 + 2;
5166             else
5167               return TYPE_VECTOR_SUBPARTS (vectype) - 1 + 5;
5168           }
5169         else
5170           /* V2DFmode doesn't need a direct move.  */
5171           return 2;
5172
5173       default:
5174         gcc_unreachable ();
5175     }
5176 }
5177
5178 /* Implement targetm.vectorize.preferred_simd_mode.  */
5179
5180 static machine_mode
5181 rs6000_preferred_simd_mode (scalar_mode mode)
5182 {
5183   if (TARGET_VSX)
5184     switch (mode)
5185       {
5186       case E_DFmode:
5187         return V2DFmode;
5188       default:;
5189       }
5190   if (TARGET_ALTIVEC || TARGET_VSX)
5191     switch (mode)
5192       {
5193       case E_SFmode:
5194         return V4SFmode;
5195       case E_TImode:
5196         return V1TImode;
5197       case E_DImode:
5198         return V2DImode;
5199       case E_SImode:
5200         return V4SImode;
5201       case E_HImode:
5202         return V8HImode;
5203       case E_QImode:
5204         return V16QImode;
5205       default:;
5206       }
5207   return word_mode;
5208 }
5209
5210 typedef struct _rs6000_cost_data
5211 {
5212   struct loop *loop_info;
5213   unsigned cost[3];
5214 } rs6000_cost_data;
5215
5216 /* Test for likely overcommitment of vector hardware resources.  If a
5217    loop iteration is relatively large, and too large a percentage of
5218    instructions in the loop are vectorized, the cost model may not
5219    adequately reflect delays from unavailable vector resources.
5220    Penalize the loop body cost for this case.  */
5221
5222 static void
5223 rs6000_density_test (rs6000_cost_data *data)
5224 {
5225   const int DENSITY_PCT_THRESHOLD = 85;
5226   const int DENSITY_SIZE_THRESHOLD = 70;
5227   const int DENSITY_PENALTY = 10;
5228   struct loop *loop = data->loop_info;
5229   basic_block *bbs = get_loop_body (loop);
5230   int nbbs = loop->num_nodes;
5231   loop_vec_info loop_vinfo = loop_vec_info_for_loop (data->loop_info);
5232   int vec_cost = data->cost[vect_body], not_vec_cost = 0;
5233   int i, density_pct;
5234
5235   for (i = 0; i < nbbs; i++)
5236     {
5237       basic_block bb = bbs[i];
5238       gimple_stmt_iterator gsi;
5239
5240       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5241         {
5242           gimple *stmt = gsi_stmt (gsi);
5243           stmt_vec_info stmt_info = loop_vinfo->lookup_stmt (stmt);
5244
5245           if (!STMT_VINFO_RELEVANT_P (stmt_info)
5246               && !STMT_VINFO_IN_PATTERN_P (stmt_info))
5247             not_vec_cost++;
5248         }
5249     }
5250
5251   free (bbs);
5252   density_pct = (vec_cost * 100) / (vec_cost + not_vec_cost);
5253
5254   if (density_pct > DENSITY_PCT_THRESHOLD
5255       && vec_cost + not_vec_cost > DENSITY_SIZE_THRESHOLD)
5256     {
5257       data->cost[vect_body] = vec_cost * (100 + DENSITY_PENALTY) / 100;
5258       if (dump_enabled_p ())
5259         dump_printf_loc (MSG_NOTE, vect_location,
5260                          "density %d%%, cost %d exceeds threshold, penalizing "
5261                          "loop body cost by %d%%", density_pct,
5262                          vec_cost + not_vec_cost, DENSITY_PENALTY);
5263     }
5264 }
5265
5266 /* Implement targetm.vectorize.init_cost.  */
5267
5268 /* For each vectorized loop, this var holds TRUE iff a non-memory vector
5269    instruction is needed by the vectorization.  */
5270 static bool rs6000_vect_nonmem;
5271
5272 static void *
5273 rs6000_init_cost (struct loop *loop_info)
5274 {
5275   rs6000_cost_data *data = XNEW (struct _rs6000_cost_data);
5276   data->loop_info = loop_info;
5277   data->cost[vect_prologue] = 0;
5278   data->cost[vect_body]     = 0;
5279   data->cost[vect_epilogue] = 0;
5280   rs6000_vect_nonmem = false;
5281   return data;
5282 }
5283
5284 /* Implement targetm.vectorize.add_stmt_cost.  */
5285
5286 static unsigned
5287 rs6000_add_stmt_cost (void *data, int count, enum vect_cost_for_stmt kind,
5288                       struct _stmt_vec_info *stmt_info, int misalign,
5289                       enum vect_cost_model_location where)
5290 {
5291   rs6000_cost_data *cost_data = (rs6000_cost_data*) data;
5292   unsigned retval = 0;
5293
5294   if (flag_vect_cost_model)
5295     {
5296       tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE;
5297       int stmt_cost = rs6000_builtin_vectorization_cost (kind, vectype,
5298                                                          misalign);
5299       /* Statements in an inner loop relative to the loop being
5300          vectorized are weighted more heavily.  The value here is
5301          arbitrary and could potentially be improved with analysis.  */
5302       if (where == vect_body && stmt_info && stmt_in_inner_loop_p (stmt_info))
5303         count *= 50;  /* FIXME.  */
5304
5305       retval = (unsigned) (count * stmt_cost);
5306       cost_data->cost[where] += retval;
5307
5308       /* Check whether we're doing something other than just a copy loop.
5309          Not all such loops may be profitably vectorized; see
5310          rs6000_finish_cost.  */
5311       if ((kind == vec_to_scalar || kind == vec_perm
5312            || kind == vec_promote_demote || kind == vec_construct
5313            || kind == scalar_to_vec)
5314           || (where == vect_body && kind == vector_stmt))
5315         rs6000_vect_nonmem = true;
5316     }
5317
5318   return retval;
5319 }
5320
5321 /* Implement targetm.vectorize.finish_cost.  */
5322
5323 static void
5324 rs6000_finish_cost (void *data, unsigned *prologue_cost,
5325                     unsigned *body_cost, unsigned *epilogue_cost)
5326 {
5327   rs6000_cost_data *cost_data = (rs6000_cost_data*) data;
5328
5329   if (cost_data->loop_info)
5330     rs6000_density_test (cost_data);
5331
5332   /* Don't vectorize minimum-vectorization-factor, simple copy loops
5333      that require versioning for any reason.  The vectorization is at
5334      best a wash inside the loop, and the versioning checks make
5335      profitability highly unlikely and potentially quite harmful.  */
5336   if (cost_data->loop_info)
5337     {
5338       loop_vec_info vec_info = loop_vec_info_for_loop (cost_data->loop_info);
5339       if (!rs6000_vect_nonmem
5340           && LOOP_VINFO_VECT_FACTOR (vec_info) == 2
5341           && LOOP_REQUIRES_VERSIONING (vec_info))
5342         cost_data->cost[vect_body] += 10000;
5343     }
5344
5345   *prologue_cost = cost_data->cost[vect_prologue];
5346   *body_cost     = cost_data->cost[vect_body];
5347   *epilogue_cost = cost_data->cost[vect_epilogue];
5348 }
5349
5350 /* Implement targetm.vectorize.destroy_cost_data.  */
5351
5352 static void
5353 rs6000_destroy_cost_data (void *data)
5354 {
5355   free (data);
5356 }
5357
5358 /* Handler for the Mathematical Acceleration Subsystem (mass) interface to a
5359    library with vectorized intrinsics.  */
5360
5361 static tree
5362 rs6000_builtin_vectorized_libmass (combined_fn fn, tree type_out,
5363                                    tree type_in)
5364 {
5365   char name[32];
5366   const char *suffix = NULL;
5367   tree fntype, new_fndecl, bdecl = NULL_TREE;
5368   int n_args = 1;
5369   const char *bname;
5370   machine_mode el_mode, in_mode;
5371   int n, in_n;
5372
5373   /* Libmass is suitable for unsafe math only as it does not correctly support
5374      parts of IEEE with the required precision such as denormals.  Only support
5375      it if we have VSX to use the simd d2 or f4 functions.
5376      XXX: Add variable length support.  */
5377   if (!flag_unsafe_math_optimizations || !TARGET_VSX)
5378     return NULL_TREE;
5379
5380   el_mode = TYPE_MODE (TREE_TYPE (type_out));
5381   n = TYPE_VECTOR_SUBPARTS (type_out);
5382   in_mode = TYPE_MODE (TREE_TYPE (type_in));
5383   in_n = TYPE_VECTOR_SUBPARTS (type_in);
5384   if (el_mode != in_mode
5385       || n != in_n)
5386     return NULL_TREE;
5387
5388   switch (fn)
5389     {
5390     CASE_CFN_ATAN2:
5391     CASE_CFN_HYPOT:
5392     CASE_CFN_POW:
5393       n_args = 2;
5394       gcc_fallthrough ();
5395
5396     CASE_CFN_ACOS:
5397     CASE_CFN_ACOSH:
5398     CASE_CFN_ASIN:
5399     CASE_CFN_ASINH:
5400     CASE_CFN_ATAN:
5401     CASE_CFN_ATANH:
5402     CASE_CFN_CBRT:
5403     CASE_CFN_COS:
5404     CASE_CFN_COSH:
5405     CASE_CFN_ERF:
5406     CASE_CFN_ERFC:
5407     CASE_CFN_EXP2:
5408     CASE_CFN_EXP:
5409     CASE_CFN_EXPM1:
5410     CASE_CFN_LGAMMA:
5411     CASE_CFN_LOG10:
5412     CASE_CFN_LOG1P:
5413     CASE_CFN_LOG2:
5414     CASE_CFN_LOG:
5415     CASE_CFN_SIN:
5416     CASE_CFN_SINH:
5417     CASE_CFN_SQRT:
5418     CASE_CFN_TAN:
5419     CASE_CFN_TANH:
5420       if (el_mode == DFmode && n == 2)
5421         {
5422           bdecl = mathfn_built_in (double_type_node, fn);
5423           suffix = "d2";                                /* pow -> powd2 */
5424         }
5425       else if (el_mode == SFmode && n == 4)
5426         {
5427           bdecl = mathfn_built_in (float_type_node, fn);
5428           suffix = "4";                                 /* powf -> powf4 */
5429         }
5430       else
5431         return NULL_TREE;
5432       if (!bdecl)
5433         return NULL_TREE;
5434       break;
5435
5436     default:
5437       return NULL_TREE;
5438     }
5439
5440   gcc_assert (suffix != NULL);
5441   bname = IDENTIFIER_POINTER (DECL_NAME (bdecl));
5442   if (!bname)
5443     return NULL_TREE;
5444
5445   strcpy (name, bname + sizeof ("__builtin_") - 1);
5446   strcat (name, suffix);
5447
5448   if (n_args == 1)
5449     fntype = build_function_type_list (type_out, type_in, NULL);
5450   else if (n_args == 2)
5451     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
5452   else
5453     gcc_unreachable ();
5454
5455   /* Build a function declaration for the vectorized function.  */
5456   new_fndecl = build_decl (BUILTINS_LOCATION,
5457                            FUNCTION_DECL, get_identifier (name), fntype);
5458   TREE_PUBLIC (new_fndecl) = 1;
5459   DECL_EXTERNAL (new_fndecl) = 1;
5460   DECL_IS_NOVOPS (new_fndecl) = 1;
5461   TREE_READONLY (new_fndecl) = 1;
5462
5463   return new_fndecl;
5464 }
5465
5466 /* Returns a function decl for a vectorized version of the builtin function
5467    with builtin function code FN and the result vector type TYPE, or NULL_TREE
5468    if it is not available.  */
5469
5470 static tree
5471 rs6000_builtin_vectorized_function (unsigned int fn, tree type_out,
5472                                     tree type_in)
5473 {
5474   machine_mode in_mode, out_mode;
5475   int in_n, out_n;
5476
5477   if (TARGET_DEBUG_BUILTIN)
5478     fprintf (stderr, "rs6000_builtin_vectorized_function (%s, %s, %s)\n",
5479              combined_fn_name (combined_fn (fn)),
5480              GET_MODE_NAME (TYPE_MODE (type_out)),
5481              GET_MODE_NAME (TYPE_MODE (type_in)));
5482
5483   if (TREE_CODE (type_out) != VECTOR_TYPE
5484       || TREE_CODE (type_in) != VECTOR_TYPE)
5485     return NULL_TREE;
5486
5487   out_mode = TYPE_MODE (TREE_TYPE (type_out));
5488   out_n = TYPE_VECTOR_SUBPARTS (type_out);
5489   in_mode = TYPE_MODE (TREE_TYPE (type_in));
5490   in_n = TYPE_VECTOR_SUBPARTS (type_in);
5491
5492   switch (fn)
5493     {
5494     CASE_CFN_COPYSIGN:
5495       if (VECTOR_UNIT_VSX_P (V2DFmode)
5496           && out_mode == DFmode && out_n == 2
5497           && in_mode == DFmode && in_n == 2)
5498         return rs6000_builtin_decls[VSX_BUILTIN_CPSGNDP];
5499       if (VECTOR_UNIT_VSX_P (V4SFmode)
5500           && out_mode == SFmode && out_n == 4
5501           && in_mode == SFmode && in_n == 4)
5502         return rs6000_builtin_decls[VSX_BUILTIN_CPSGNSP];
5503       if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
5504           && out_mode == SFmode && out_n == 4
5505           && in_mode == SFmode && in_n == 4)
5506         return rs6000_builtin_decls[ALTIVEC_BUILTIN_COPYSIGN_V4SF];
5507       break;
5508     CASE_CFN_CEIL:
5509       if (VECTOR_UNIT_VSX_P (V2DFmode)
5510           && out_mode == DFmode && out_n == 2
5511           && in_mode == DFmode && in_n == 2)
5512         return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIP];
5513       if (VECTOR_UNIT_VSX_P (V4SFmode)
5514           && out_mode == SFmode && out_n == 4
5515           && in_mode == SFmode && in_n == 4)
5516         return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIP];
5517       if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
5518           && out_mode == SFmode && out_n == 4
5519           && in_mode == SFmode && in_n == 4)
5520         return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIP];
5521       break;
5522     CASE_CFN_FLOOR:
5523       if (VECTOR_UNIT_VSX_P (V2DFmode)
5524           && out_mode == DFmode && out_n == 2
5525           && in_mode == DFmode && in_n == 2)
5526         return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIM];
5527       if (VECTOR_UNIT_VSX_P (V4SFmode)
5528           && out_mode == SFmode && out_n == 4
5529           && in_mode == SFmode && in_n == 4)
5530         return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIM];
5531       if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
5532           && out_mode == SFmode && out_n == 4
5533           && in_mode == SFmode && in_n == 4)
5534         return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIM];
5535       break;
5536     CASE_CFN_FMA:
5537       if (VECTOR_UNIT_VSX_P (V2DFmode)
5538           && out_mode == DFmode && out_n == 2
5539           && in_mode == DFmode && in_n == 2)
5540         return rs6000_builtin_decls[VSX_BUILTIN_XVMADDDP];
5541       if (VECTOR_UNIT_VSX_P (V4SFmode)
5542           && out_mode == SFmode && out_n == 4
5543           && in_mode == SFmode && in_n == 4)
5544         return rs6000_builtin_decls[VSX_BUILTIN_XVMADDSP];
5545       if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
5546           && out_mode == SFmode && out_n == 4
5547           && in_mode == SFmode && in_n == 4)
5548         return rs6000_builtin_decls[ALTIVEC_BUILTIN_VMADDFP];
5549       break;
5550     CASE_CFN_TRUNC:
5551       if (VECTOR_UNIT_VSX_P (V2DFmode)
5552           && out_mode == DFmode && out_n == 2
5553           && in_mode == DFmode && in_n == 2)
5554         return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIZ];
5555       if (VECTOR_UNIT_VSX_P (V4SFmode)
5556           && out_mode == SFmode && out_n == 4
5557           && in_mode == SFmode && in_n == 4)
5558         return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIZ];
5559       if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
5560           && out_mode == SFmode && out_n == 4
5561           && in_mode == SFmode && in_n == 4)
5562         return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIZ];
5563       break;
5564     CASE_CFN_NEARBYINT:
5565       if (VECTOR_UNIT_VSX_P (V2DFmode)
5566           && flag_unsafe_math_optimizations
5567           && out_mode == DFmode && out_n == 2
5568           && in_mode == DFmode && in_n == 2)
5569         return rs6000_builtin_decls[VSX_BUILTIN_XVRDPI];
5570       if (VECTOR_UNIT_VSX_P (V4SFmode)
5571           && flag_unsafe_math_optimizations
5572           && out_mode == SFmode && out_n == 4
5573           && in_mode == SFmode && in_n == 4)
5574         return rs6000_builtin_decls[VSX_BUILTIN_XVRSPI];
5575       break;
5576     CASE_CFN_RINT:
5577       if (VECTOR_UNIT_VSX_P (V2DFmode)
5578           && !flag_trapping_math
5579           && out_mode == DFmode && out_n == 2
5580           && in_mode == DFmode && in_n == 2)
5581         return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIC];
5582       if (VECTOR_UNIT_VSX_P (V4SFmode)
5583           && !flag_trapping_math
5584           && out_mode == SFmode && out_n == 4
5585           && in_mode == SFmode && in_n == 4)
5586         return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIC];
5587       break;
5588     default:
5589       break;
5590     }
5591
5592   /* Generate calls to libmass if appropriate.  */
5593   if (rs6000_veclib_handler)
5594     return rs6000_veclib_handler (combined_fn (fn), type_out, type_in);
5595
5596   return NULL_TREE;
5597 }
5598
5599 /* Implement TARGET_VECTORIZE_BUILTIN_MD_VECTORIZED_FUNCTION.  */
5600
5601 static tree
5602 rs6000_builtin_md_vectorized_function (tree fndecl, tree type_out,
5603                                        tree type_in)
5604 {
5605   machine_mode in_mode, out_mode;
5606   int in_n, out_n;
5607
5608   if (TARGET_DEBUG_BUILTIN)
5609     fprintf (stderr, "rs6000_builtin_md_vectorized_function (%s, %s, %s)\n",
5610              IDENTIFIER_POINTER (DECL_NAME (fndecl)),
5611              GET_MODE_NAME (TYPE_MODE (type_out)),
5612              GET_MODE_NAME (TYPE_MODE (type_in)));
5613
5614   if (TREE_CODE (type_out) != VECTOR_TYPE
5615       || TREE_CODE (type_in) != VECTOR_TYPE)
5616     return NULL_TREE;
5617
5618   out_mode = TYPE_MODE (TREE_TYPE (type_out));
5619   out_n = TYPE_VECTOR_SUBPARTS (type_out);
5620   in_mode = TYPE_MODE (TREE_TYPE (type_in));
5621   in_n = TYPE_VECTOR_SUBPARTS (type_in);
5622
5623   enum rs6000_builtins fn
5624     = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
5625   switch (fn)
5626     {
5627     case RS6000_BUILTIN_RSQRTF:
5628       if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
5629           && out_mode == SFmode && out_n == 4
5630           && in_mode == SFmode && in_n == 4)
5631         return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRSQRTFP];
5632       break;
5633     case RS6000_BUILTIN_RSQRT:
5634       if (VECTOR_UNIT_VSX_P (V2DFmode)
5635           && out_mode == DFmode && out_n == 2
5636           && in_mode == DFmode && in_n == 2)
5637         return rs6000_builtin_decls[VSX_BUILTIN_RSQRT_2DF];
5638       break;
5639     case RS6000_BUILTIN_RECIPF:
5640       if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
5641           && out_mode == SFmode && out_n == 4
5642           && in_mode == SFmode && in_n == 4)
5643         return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRECIPFP];
5644       break;
5645     case RS6000_BUILTIN_RECIP:
5646       if (VECTOR_UNIT_VSX_P (V2DFmode)
5647           && out_mode == DFmode && out_n == 2
5648           && in_mode == DFmode && in_n == 2)
5649         return rs6000_builtin_decls[VSX_BUILTIN_RECIP_V2DF];
5650       break;
5651     default:
5652       break;
5653     }
5654   return NULL_TREE;
5655 }
5656 \f
5657 /* Default CPU string for rs6000*_file_start functions.  */
5658 static const char *rs6000_default_cpu;
5659
5660 /* Do anything needed at the start of the asm file.  */
5661
5662 static void
5663 rs6000_file_start (void)
5664 {
5665   char buffer[80];
5666   const char *start = buffer;
5667   FILE *file = asm_out_file;
5668
5669   rs6000_default_cpu = TARGET_CPU_DEFAULT;
5670
5671   default_file_start ();
5672
5673   if (flag_verbose_asm)
5674     {
5675       sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
5676
5677       if (rs6000_default_cpu != 0 && rs6000_default_cpu[0] != '\0')
5678         {
5679           fprintf (file, "%s --with-cpu=%s", start, rs6000_default_cpu);
5680           start = "";
5681         }
5682
5683       if (global_options_set.x_rs6000_cpu_index)
5684         {
5685           fprintf (file, "%s -mcpu=%s", start,
5686                    processor_target_table[rs6000_cpu_index].name);
5687           start = "";
5688         }
5689
5690       if (global_options_set.x_rs6000_tune_index)
5691         {
5692           fprintf (file, "%s -mtune=%s", start,
5693                    processor_target_table[rs6000_tune_index].name);
5694           start = "";
5695         }
5696
5697       if (PPC405_ERRATUM77)
5698         {
5699           fprintf (file, "%s PPC405CR_ERRATUM77", start);
5700           start = "";
5701         }
5702
5703 #ifdef USING_ELFOS_H
5704       switch (rs6000_sdata)
5705         {
5706         case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
5707         case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
5708         case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
5709         case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
5710         }
5711
5712       if (rs6000_sdata && g_switch_value)
5713         {
5714           fprintf (file, "%s -G %d", start,
5715                    g_switch_value);
5716           start = "";
5717         }
5718 #endif
5719
5720       if (*start == '\0')
5721         putc ('\n', file);
5722     }
5723
5724 #ifdef USING_ELFOS_H
5725   if (!(rs6000_default_cpu && rs6000_default_cpu[0])
5726       && !global_options_set.x_rs6000_cpu_index)
5727     {
5728       fputs ("\t.machine ", asm_out_file);
5729       if ((rs6000_isa_flags & OPTION_MASK_MODULO) != 0)
5730         fputs ("power9\n", asm_out_file);
5731       else if ((rs6000_isa_flags & OPTION_MASK_DIRECT_MOVE) != 0)
5732         fputs ("power8\n", asm_out_file);
5733       else if ((rs6000_isa_flags & OPTION_MASK_POPCNTD) != 0)
5734         fputs ("power7\n", asm_out_file);
5735       else if ((rs6000_isa_flags & OPTION_MASK_CMPB) != 0)
5736         fputs ("power6\n", asm_out_file);
5737       else if ((rs6000_isa_flags & OPTION_MASK_POPCNTB) != 0)
5738         fputs ("power5\n", asm_out_file);
5739       else if ((rs6000_isa_flags & OPTION_MASK_MFCRF) != 0)
5740         fputs ("power4\n", asm_out_file);
5741       else if ((rs6000_isa_flags & OPTION_MASK_POWERPC64) != 0)
5742         fputs ("ppc64\n", asm_out_file);
5743       else
5744         fputs ("ppc\n", asm_out_file);
5745     }
5746 #endif
5747
5748   if (DEFAULT_ABI == ABI_ELFv2)
5749     fprintf (file, "\t.abiversion 2\n");
5750 }
5751
5752 \f
5753 /* Return nonzero if this function is known to have a null epilogue.  */
5754
5755 int
5756 direct_return (void)
5757 {
5758   if (reload_completed)
5759     {
5760       rs6000_stack_t *info = rs6000_stack_info ();
5761
5762       if (info->first_gp_reg_save == 32
5763           && info->first_fp_reg_save == 64
5764           && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
5765           && ! info->lr_save_p
5766           && ! info->cr_save_p
5767           && info->vrsave_size == 0
5768           && ! info->push_p)
5769         return 1;
5770     }
5771
5772   return 0;
5773 }
5774
5775 /* Helper for num_insns_constant.  Calculate number of instructions to
5776    load VALUE to a single gpr using combinations of addi, addis, ori,
5777    oris and sldi instructions.  */
5778
5779 static int
5780 num_insns_constant_gpr (HOST_WIDE_INT value)
5781 {
5782   /* signed constant loadable with addi */
5783   if (((unsigned HOST_WIDE_INT) value + 0x8000) < 0x10000)
5784     return 1;
5785
5786   /* constant loadable with addis */
5787   else if ((value & 0xffff) == 0
5788            && (value >> 31 == -1 || value >> 31 == 0))
5789     return 1;
5790
5791   else if (TARGET_POWERPC64)
5792     {
5793       HOST_WIDE_INT low  = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
5794       HOST_WIDE_INT high = value >> 31;
5795
5796       if (high == 0 || high == -1)
5797         return 2;
5798
5799       high >>= 1;
5800
5801       if (low == 0)
5802         return num_insns_constant_gpr (high) + 1;
5803       else if (high == 0)
5804         return num_insns_constant_gpr (low) + 1;
5805       else
5806         return (num_insns_constant_gpr (high)
5807                 + num_insns_constant_gpr (low) + 1);
5808     }
5809
5810   else
5811     return 2;
5812 }
5813
5814 /* Helper for num_insns_constant.  Allow constants formed by the
5815    num_insns_constant_gpr sequences, plus li -1, rldicl/rldicr/rlwinm,
5816    and handle modes that require multiple gprs.  */
5817
5818 static int
5819 num_insns_constant_multi (HOST_WIDE_INT value, machine_mode mode)
5820 {
5821   int nregs = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5822   int total = 0;
5823   while (nregs-- > 0)
5824     {
5825       HOST_WIDE_INT low = sext_hwi (value, BITS_PER_WORD);
5826       int insns = num_insns_constant_gpr (low);
5827       if (insns > 2
5828           /* We won't get more than 2 from num_insns_constant_gpr
5829              except when TARGET_POWERPC64 and mode is DImode or
5830              wider, so the register mode must be DImode.  */
5831           && rs6000_is_valid_and_mask (GEN_INT (low), DImode))
5832         insns = 2;
5833       total += insns;
5834       value >>= BITS_PER_WORD;
5835     }
5836   return total;
5837 }
5838
5839 /* Return the number of instructions it takes to form a constant in as
5840    many gprs are needed for MODE.  */
5841
5842 int
5843 num_insns_constant (rtx op, machine_mode mode)
5844 {
5845   HOST_WIDE_INT val;
5846
5847   switch (GET_CODE (op))
5848     {
5849     case CONST_INT:
5850       val = INTVAL (op);
5851       break;
5852
5853     case CONST_WIDE_INT:
5854       {
5855         int insns = 0;
5856         for (int i = 0; i < CONST_WIDE_INT_NUNITS (op); i++)
5857           insns += num_insns_constant_multi (CONST_WIDE_INT_ELT (op, i),
5858                                              DImode);
5859         return insns;
5860       }
5861
5862     case CONST_DOUBLE:
5863       {
5864         const struct real_value *rv = CONST_DOUBLE_REAL_VALUE (op);
5865
5866         if (mode == SFmode || mode == SDmode)
5867           {
5868             long l;
5869
5870             if (mode == SDmode)
5871               REAL_VALUE_TO_TARGET_DECIMAL32 (*rv, l);
5872             else
5873               REAL_VALUE_TO_TARGET_SINGLE (*rv, l);
5874             /* See the first define_split in rs6000.md handling a
5875                const_double_operand.  */
5876             val = l;
5877             mode = SImode;
5878           }
5879         else if (mode == DFmode || mode == DDmode)
5880           {
5881             long l[2];
5882
5883             if (mode == DDmode)
5884               REAL_VALUE_TO_TARGET_DECIMAL64 (*rv, l);
5885             else
5886               REAL_VALUE_TO_TARGET_DOUBLE (*rv, l);
5887
5888             /* See the second (32-bit) and third (64-bit) define_split
5889                in rs6000.md handling a const_double_operand.  */
5890             val = (unsigned HOST_WIDE_INT) l[WORDS_BIG_ENDIAN ? 0 : 1] << 32;
5891             val |= l[WORDS_BIG_ENDIAN ? 1 : 0] & 0xffffffffUL;
5892             mode = DImode;
5893           }
5894         else if (mode == TFmode || mode == TDmode
5895                  || mode == KFmode || mode == IFmode)
5896           {
5897             long l[4];
5898             int insns;
5899
5900             if (mode == TDmode)
5901               REAL_VALUE_TO_TARGET_DECIMAL128 (*rv, l);
5902             else
5903               REAL_VALUE_TO_TARGET_LONG_DOUBLE (*rv, l);
5904
5905             val = (unsigned HOST_WIDE_INT) l[WORDS_BIG_ENDIAN ? 0 : 3] << 32;
5906             val |= l[WORDS_BIG_ENDIAN ? 1 : 2] & 0xffffffffUL;
5907             insns = num_insns_constant_multi (val, DImode);
5908             val = (unsigned HOST_WIDE_INT) l[WORDS_BIG_ENDIAN ? 2 : 1] << 32;
5909             val |= l[WORDS_BIG_ENDIAN ? 3 : 0] & 0xffffffffUL;
5910             insns += num_insns_constant_multi (val, DImode);
5911             return insns;
5912           }
5913         else
5914           gcc_unreachable ();
5915       }
5916       break;
5917
5918     default:
5919       gcc_unreachable ();
5920     }
5921
5922   return num_insns_constant_multi (val, mode);
5923 }
5924
5925 /* Interpret element ELT of the CONST_VECTOR OP as an integer value.
5926    If the mode of OP is MODE_VECTOR_INT, this simply returns the
5927    corresponding element of the vector, but for V4SFmode, the
5928    corresponding "float" is interpreted as an SImode integer.  */
5929
5930 HOST_WIDE_INT
5931 const_vector_elt_as_int (rtx op, unsigned int elt)
5932 {
5933   rtx tmp;
5934
5935   /* We can't handle V2DImode and V2DFmode vector constants here yet.  */
5936   gcc_assert (GET_MODE (op) != V2DImode
5937               && GET_MODE (op) != V2DFmode);
5938
5939   tmp = CONST_VECTOR_ELT (op, elt);
5940   if (GET_MODE (op) == V4SFmode)
5941     tmp = gen_lowpart (SImode, tmp);
5942   return INTVAL (tmp);
5943 }
5944
5945 /* Return true if OP can be synthesized with a particular vspltisb, vspltish
5946    or vspltisw instruction.  OP is a CONST_VECTOR.  Which instruction is used
5947    depends on STEP and COPIES, one of which will be 1.  If COPIES > 1,
5948    all items are set to the same value and contain COPIES replicas of the
5949    vsplt's operand; if STEP > 1, one in STEP elements is set to the vsplt's
5950    operand and the others are set to the value of the operand's msb.  */
5951
5952 static bool
5953 vspltis_constant (rtx op, unsigned step, unsigned copies)
5954 {
5955   machine_mode mode = GET_MODE (op);
5956   machine_mode inner = GET_MODE_INNER (mode);
5957
5958   unsigned i;
5959   unsigned nunits;
5960   unsigned bitsize;
5961   unsigned mask;
5962
5963   HOST_WIDE_INT val;
5964   HOST_WIDE_INT splat_val;
5965   HOST_WIDE_INT msb_val;
5966
5967   if (mode == V2DImode || mode == V2DFmode || mode == V1TImode)
5968     return false;
5969
5970   nunits = GET_MODE_NUNITS (mode);
5971   bitsize = GET_MODE_BITSIZE (inner);
5972   mask = GET_MODE_MASK (inner);
5973
5974   val = const_vector_elt_as_int (op, BYTES_BIG_ENDIAN ? nunits - 1 : 0);
5975   splat_val = val;
5976   msb_val = val >= 0 ? 0 : -1;
5977
5978   /* Construct the value to be splatted, if possible.  If not, return 0.  */
5979   for (i = 2; i <= copies; i *= 2)
5980     {
5981       HOST_WIDE_INT small_val;
5982       bitsize /= 2;
5983       small_val = splat_val >> bitsize;
5984       mask >>= bitsize;
5985       if (splat_val != ((HOST_WIDE_INT)
5986           ((unsigned HOST_WIDE_INT) small_val << bitsize)
5987           | (small_val & mask)))
5988         return false;
5989       splat_val = small_val;
5990     }
5991
5992   /* Check if SPLAT_VAL can really be the operand of a vspltis[bhw].  */
5993   if (EASY_VECTOR_15 (splat_val))
5994     ;
5995
5996   /* Also check if we can splat, and then add the result to itself.  Do so if
5997      the value is positive, of if the splat instruction is using OP's mode;
5998      for splat_val < 0, the splat and the add should use the same mode.  */
5999   else if (EASY_VECTOR_15_ADD_SELF (splat_val)
6000            && (splat_val >= 0 || (step == 1 && copies == 1)))
6001     ;
6002
6003   /* Also check if are loading up the most significant bit which can be done by
6004      loading up -1 and shifting the value left by -1.  */
6005   else if (EASY_VECTOR_MSB (splat_val, inner))
6006     ;
6007
6008   else
6009     return false;
6010
6011   /* Check if VAL is present in every STEP-th element, and the
6012      other elements are filled with its most significant bit.  */
6013   for (i = 1; i < nunits; ++i)
6014     {
6015       HOST_WIDE_INT desired_val;
6016       unsigned elt = BYTES_BIG_ENDIAN ? nunits - 1 - i : i;
6017       if ((i & (step - 1)) == 0)
6018         desired_val = val;
6019       else
6020         desired_val = msb_val;
6021
6022       if (desired_val != const_vector_elt_as_int (op, elt))
6023         return false;
6024     }
6025
6026   return true;
6027 }
6028
6029 /* Like vsplitis_constant, but allow the value to be shifted left with a VSLDOI
6030    instruction, filling in the bottom elements with 0 or -1.
6031
6032    Return 0 if the constant cannot be generated with VSLDOI.  Return positive
6033    for the number of zeroes to shift in, or negative for the number of 0xff
6034    bytes to shift in.
6035
6036    OP is a CONST_VECTOR.  */
6037
6038 int
6039 vspltis_shifted (rtx op)
6040 {
6041   machine_mode mode = GET_MODE (op);
6042   machine_mode inner = GET_MODE_INNER (mode);
6043
6044   unsigned i, j;
6045   unsigned nunits;
6046   unsigned mask;
6047
6048   HOST_WIDE_INT val;
6049
6050   if (mode != V16QImode && mode != V8HImode && mode != V4SImode)
6051     return false;
6052
6053   /* We need to create pseudo registers to do the shift, so don't recognize
6054      shift vector constants after reload.  */
6055   if (!can_create_pseudo_p ())
6056     return false;
6057
6058   nunits = GET_MODE_NUNITS (mode);
6059   mask = GET_MODE_MASK (inner);
6060
6061   val = const_vector_elt_as_int (op, BYTES_BIG_ENDIAN ? 0 : nunits - 1);
6062
6063   /* Check if the value can really be the operand of a vspltis[bhw].  */
6064   if (EASY_VECTOR_15 (val))
6065     ;
6066
6067   /* Also check if we are loading up the most significant bit which can be done
6068      by loading up -1 and shifting the value left by -1.  */
6069   else if (EASY_VECTOR_MSB (val, inner))
6070     ;
6071
6072   else
6073     return 0;
6074
6075   /* Check if VAL is present in every STEP-th element until we find elements
6076      that are 0 or all 1 bits.  */
6077   for (i = 1; i < nunits; ++i)
6078     {
6079       unsigned elt = BYTES_BIG_ENDIAN ? i : nunits - 1 - i;
6080       HOST_WIDE_INT elt_val = const_vector_elt_as_int (op, elt);
6081
6082       /* If the value isn't the splat value, check for the remaining elements
6083          being 0/-1.  */
6084       if (val != elt_val)
6085         {
6086           if (elt_val == 0)
6087             {
6088               for (j = i+1; j < nunits; ++j)
6089                 {
6090                   unsigned elt2 = BYTES_BIG_ENDIAN ? j : nunits - 1 - j;
6091                   if (const_vector_elt_as_int (op, elt2) != 0)
6092                     return 0;
6093                 }
6094
6095               return (nunits - i) * GET_MODE_SIZE (inner);
6096             }
6097
6098           else if ((elt_val & mask) == mask)
6099             {
6100               for (j = i+1; j < nunits; ++j)
6101                 {
6102                   unsigned elt2 = BYTES_BIG_ENDIAN ? j : nunits - 1 - j;
6103                   if ((const_vector_elt_as_int (op, elt2) & mask) != mask)
6104                     return 0;
6105                 }
6106
6107               return -((nunits - i) * GET_MODE_SIZE (inner));
6108             }
6109
6110           else
6111             return 0;
6112         }
6113     }
6114
6115   /* If all elements are equal, we don't need to do VLSDOI.  */
6116   return 0;
6117 }
6118
6119
6120 /* Return true if OP is of the given MODE and can be synthesized
6121    with a vspltisb, vspltish or vspltisw.  */
6122
6123 bool
6124 easy_altivec_constant (rtx op, machine_mode mode)
6125 {
6126   unsigned step, copies;
6127
6128   if (mode == VOIDmode)
6129     mode = GET_MODE (op);
6130   else if (mode != GET_MODE (op))
6131     return false;
6132
6133   /* V2DI/V2DF was added with VSX.  Only allow 0 and all 1's as easy
6134      constants.  */
6135   if (mode == V2DFmode)
6136     return zero_constant (op, mode);
6137
6138   else if (mode == V2DImode)
6139     {
6140       if (!CONST_INT_P (CONST_VECTOR_ELT (op, 0))
6141           || !CONST_INT_P (CONST_VECTOR_ELT (op, 1)))
6142         return false;
6143
6144       if (zero_constant (op, mode))
6145         return true;
6146
6147       if (INTVAL (CONST_VECTOR_ELT (op, 0)) == -1
6148           && INTVAL (CONST_VECTOR_ELT (op, 1)) == -1)
6149         return true;
6150
6151       return false;
6152     }
6153
6154   /* V1TImode is a special container for TImode.  Ignore for now.  */
6155   else if (mode == V1TImode)
6156     return false;
6157
6158   /* Start with a vspltisw.  */
6159   step = GET_MODE_NUNITS (mode) / 4;
6160   copies = 1;
6161
6162   if (vspltis_constant (op, step, copies))
6163     return true;
6164
6165   /* Then try with a vspltish.  */
6166   if (step == 1)
6167     copies <<= 1;
6168   else
6169     step >>= 1;
6170
6171   if (vspltis_constant (op, step, copies))
6172     return true;
6173
6174   /* And finally a vspltisb.  */
6175   if (step == 1)
6176     copies <<= 1;
6177   else
6178     step >>= 1;
6179
6180   if (vspltis_constant (op, step, copies))
6181     return true;
6182
6183   if (vspltis_shifted (op) != 0)
6184     return true;
6185
6186   return false;
6187 }
6188
6189 /* Generate a VEC_DUPLICATE representing a vspltis[bhw] instruction whose
6190    result is OP.  Abort if it is not possible.  */
6191
6192 rtx
6193 gen_easy_altivec_constant (rtx op)
6194 {
6195   machine_mode mode = GET_MODE (op);
6196   int nunits = GET_MODE_NUNITS (mode);
6197   rtx val = CONST_VECTOR_ELT (op, BYTES_BIG_ENDIAN ? nunits - 1 : 0);
6198   unsigned step = nunits / 4;
6199   unsigned copies = 1;
6200
6201   /* Start with a vspltisw.  */
6202   if (vspltis_constant (op, step, copies))
6203     return gen_rtx_VEC_DUPLICATE (V4SImode, gen_lowpart (SImode, val));
6204
6205   /* Then try with a vspltish.  */
6206   if (step == 1)
6207     copies <<= 1;
6208   else
6209     step >>= 1;
6210
6211   if (vspltis_constant (op, step, copies))
6212     return gen_rtx_VEC_DUPLICATE (V8HImode, gen_lowpart (HImode, val));
6213
6214   /* And finally a vspltisb.  */
6215   if (step == 1)
6216     copies <<= 1;
6217   else
6218     step >>= 1;
6219
6220   if (vspltis_constant (op, step, copies))
6221     return gen_rtx_VEC_DUPLICATE (V16QImode, gen_lowpart (QImode, val));
6222
6223   gcc_unreachable ();
6224 }
6225
6226 /* Return true if OP is of the given MODE and can be synthesized with ISA 3.0
6227    instructions (xxspltib, vupkhsb/vextsb2w/vextb2d).
6228
6229    Return the number of instructions needed (1 or 2) into the address pointed
6230    via NUM_INSNS_PTR.
6231
6232    Return the constant that is being split via CONSTANT_PTR.  */
6233
6234 bool
6235 xxspltib_constant_p (rtx op,
6236                      machine_mode mode,
6237                      int *num_insns_ptr,
6238                      int *constant_ptr)
6239 {
6240   size_t nunits = GET_MODE_NUNITS (mode);
6241   size_t i;
6242   HOST_WIDE_INT value;
6243   rtx element;
6244
6245   /* Set the returned values to out of bound values.  */
6246   *num_insns_ptr = -1;
6247   *constant_ptr = 256;
6248
6249   if (!TARGET_P9_VECTOR)
6250     return false;
6251
6252   if (mode == VOIDmode)
6253     mode = GET_MODE (op);
6254
6255   else if (mode != GET_MODE (op) && GET_MODE (op) != VOIDmode)
6256     return false;
6257
6258   /* Handle (vec_duplicate <constant>).  */
6259   if (GET_CODE (op) == VEC_DUPLICATE)
6260     {
6261       if (mode != V16QImode && mode != V8HImode && mode != V4SImode
6262           && mode != V2DImode)
6263         return false;
6264
6265       element = XEXP (op, 0);
6266       if (!CONST_INT_P (element))
6267         return false;
6268
6269       value = INTVAL (element);
6270       if (!IN_RANGE (value, -128, 127))
6271         return false;
6272     }
6273
6274   /* Handle (const_vector [...]).  */
6275   else if (GET_CODE (op) == CONST_VECTOR)
6276     {
6277       if (mode != V16QImode && mode != V8HImode && mode != V4SImode
6278           && mode != V2DImode)
6279         return false;
6280
6281       element = CONST_VECTOR_ELT (op, 0);
6282       if (!CONST_INT_P (element))
6283         return false;
6284
6285       value = INTVAL (element);
6286       if (!IN_RANGE (value, -128, 127))
6287         return false;
6288
6289       for (i = 1; i < nunits; i++)
6290         {
6291           element = CONST_VECTOR_ELT (op, i);
6292           if (!CONST_INT_P (element))
6293             return false;
6294
6295           if (value != INTVAL (element))
6296             return false;
6297         }
6298     }
6299
6300   /* Handle integer constants being loaded into the upper part of the VSX
6301      register as a scalar.  If the value isn't 0/-1, only allow it if the mode
6302      can go in Altivec registers.  Prefer VSPLTISW/VUPKHSW over XXSPLITIB.  */
6303   else if (CONST_INT_P (op))
6304     {
6305       if (!SCALAR_INT_MODE_P (mode))
6306         return false;
6307
6308       value = INTVAL (op);
6309       if (!IN_RANGE (value, -128, 127))
6310         return false;
6311
6312       if (!IN_RANGE (value, -1, 0))
6313         {
6314           if (!(reg_addr[mode].addr_mask[RELOAD_REG_VMX] & RELOAD_REG_VALID))
6315             return false;
6316
6317           if (EASY_VECTOR_15 (value))
6318             return false;
6319         }
6320     }
6321
6322   else
6323     return false;
6324
6325   /* See if we could generate vspltisw/vspltish directly instead of xxspltib +
6326      sign extend.  Special case 0/-1 to allow getting any VSX register instead
6327      of an Altivec register.  */
6328   if ((mode == V4SImode || mode == V8HImode) && !IN_RANGE (value, -1, 0)
6329       && EASY_VECTOR_15 (value))
6330     return false;
6331
6332   /* Return # of instructions and the constant byte for XXSPLTIB.  */
6333   if (mode == V16QImode)
6334     *num_insns_ptr = 1;
6335
6336   else if (IN_RANGE (value, -1, 0))
6337     *num_insns_ptr = 1;
6338
6339   else
6340     *num_insns_ptr = 2;
6341
6342   *constant_ptr = (int) value;
6343   return true;
6344 }
6345
6346 const char *
6347 output_vec_const_move (rtx *operands)
6348 {
6349   int shift;
6350   machine_mode mode;
6351   rtx dest, vec;
6352
6353   dest = operands[0];
6354   vec = operands[1];
6355   mode = GET_MODE (dest);
6356
6357   if (TARGET_VSX)
6358     {
6359       bool dest_vmx_p = ALTIVEC_REGNO_P (REGNO (dest));
6360       int xxspltib_value = 256;
6361       int num_insns = -1;
6362
6363       if (zero_constant (vec, mode))
6364         {
6365           if (TARGET_P9_VECTOR)
6366             return "xxspltib %x0,0";
6367
6368           else if (dest_vmx_p)
6369             return "vspltisw %0,0";
6370
6371           else
6372             return "xxlxor %x0,%x0,%x0";
6373         }
6374
6375       if (all_ones_constant (vec, mode))
6376         {
6377           if (TARGET_P9_VECTOR)
6378             return "xxspltib %x0,255";
6379
6380           else if (dest_vmx_p)
6381             return "vspltisw %0,-1";
6382
6383           else if (TARGET_P8_VECTOR)
6384             return "xxlorc %x0,%x0,%x0";
6385
6386           else
6387             gcc_unreachable ();
6388         }
6389
6390       if (TARGET_P9_VECTOR
6391           && xxspltib_constant_p (vec, mode, &num_insns, &xxspltib_value))
6392         {
6393           if (num_insns == 1)
6394             {
6395               operands[2] = GEN_INT (xxspltib_value & 0xff);
6396               return "xxspltib %x0,%2";
6397             }
6398
6399           return "#";
6400         }
6401     }
6402
6403   if (TARGET_ALTIVEC)
6404     {
6405       rtx splat_vec;
6406
6407       gcc_assert (ALTIVEC_REGNO_P (REGNO (dest)));
6408       if (zero_constant (vec, mode))
6409         return "vspltisw %0,0";
6410
6411       if (all_ones_constant (vec, mode))
6412         return "vspltisw %0,-1";
6413
6414       /* Do we need to construct a value using VSLDOI?  */
6415       shift = vspltis_shifted (vec);
6416       if (shift != 0)
6417         return "#";
6418
6419       splat_vec = gen_easy_altivec_constant (vec);
6420       gcc_assert (GET_CODE (splat_vec) == VEC_DUPLICATE);
6421       operands[1] = XEXP (splat_vec, 0);
6422       if (!EASY_VECTOR_15 (INTVAL (operands[1])))
6423         return "#";
6424
6425       switch (GET_MODE (splat_vec))
6426         {
6427         case E_V4SImode:
6428           return "vspltisw %0,%1";
6429
6430         case E_V8HImode:
6431           return "vspltish %0,%1";
6432
6433         case E_V16QImode:
6434           return "vspltisb %0,%1";
6435
6436         default:
6437           gcc_unreachable ();
6438         }
6439     }
6440
6441   gcc_unreachable ();
6442 }
6443
6444 /* Initialize vector TARGET to VALS.  */
6445
6446 void
6447 rs6000_expand_vector_init (rtx target, rtx vals)
6448 {
6449   machine_mode mode = GET_MODE (target);
6450   machine_mode inner_mode = GET_MODE_INNER (mode);
6451   int n_elts = GET_MODE_NUNITS (mode);
6452   int n_var = 0, one_var = -1;
6453   bool all_same = true, all_const_zero = true;
6454   rtx x, mem;
6455   int i;
6456
6457   for (i = 0; i < n_elts; ++i)
6458     {
6459       x = XVECEXP (vals, 0, i);
6460       if (!(CONST_SCALAR_INT_P (x) || CONST_DOUBLE_P (x) || CONST_FIXED_P (x)))
6461         ++n_var, one_var = i;
6462       else if (x != CONST0_RTX (inner_mode))
6463         all_const_zero = false;
6464
6465       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
6466         all_same = false;
6467     }
6468
6469   if (n_var == 0)
6470     {
6471       rtx const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0));
6472       bool int_vector_p = (GET_MODE_CLASS (mode) == MODE_VECTOR_INT);
6473       if ((int_vector_p || TARGET_VSX) && all_const_zero)
6474         {
6475           /* Zero register.  */
6476           emit_move_insn (target, CONST0_RTX (mode));
6477           return;
6478         }
6479       else if (int_vector_p && easy_vector_constant (const_vec, mode))
6480         {
6481           /* Splat immediate.  */
6482           emit_insn (gen_rtx_SET (target, const_vec));
6483           return;
6484         }
6485       else
6486         {
6487           /* Load from constant pool.  */
6488           emit_move_insn (target, const_vec);
6489           return;
6490         }
6491     }
6492
6493   /* Double word values on VSX can use xxpermdi or lxvdsx.  */
6494   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
6495     {
6496       rtx op[2];
6497       size_t i;
6498       size_t num_elements = all_same ? 1 : 2;
6499       for (i = 0; i < num_elements; i++)
6500         {
6501           op[i] = XVECEXP (vals, 0, i);
6502           /* Just in case there is a SUBREG with a smaller mode, do a
6503              conversion.  */
6504           if (GET_MODE (op[i]) != inner_mode)
6505             {
6506               rtx tmp = gen_reg_rtx (inner_mode);
6507               convert_move (tmp, op[i], 0);
6508               op[i] = tmp;
6509             }
6510           /* Allow load with splat double word.  */
6511           else if (MEM_P (op[i]))
6512             {
6513               if (!all_same)
6514                 op[i] = force_reg (inner_mode, op[i]);
6515             }
6516           else if (!REG_P (op[i]))
6517             op[i] = force_reg (inner_mode, op[i]);
6518         }
6519
6520       if (all_same)
6521         {
6522           if (mode == V2DFmode)
6523             emit_insn (gen_vsx_splat_v2df (target, op[0]));
6524           else
6525             emit_insn (gen_vsx_splat_v2di (target, op[0]));
6526         }
6527       else
6528         {
6529           if (mode == V2DFmode)
6530             emit_insn (gen_vsx_concat_v2df (target, op[0], op[1]));
6531           else
6532             emit_insn (gen_vsx_concat_v2di (target, op[0], op[1]));
6533         }
6534       return;
6535     }
6536
6537   /* Special case initializing vector int if we are on 64-bit systems with
6538      direct move or we have the ISA 3.0 instructions.  */
6539   if (mode == V4SImode  && VECTOR_MEM_VSX_P (V4SImode)
6540       && TARGET_DIRECT_MOVE_64BIT)
6541     {
6542       if (all_same)
6543         {
6544           rtx element0 = XVECEXP (vals, 0, 0);
6545           if (MEM_P (element0))
6546             element0 = rs6000_force_indexed_or_indirect_mem (element0);
6547           else
6548             element0 = force_reg (SImode, element0);
6549
6550           if (TARGET_P9_VECTOR)
6551             emit_insn (gen_vsx_splat_v4si (target, element0));
6552           else
6553             {
6554               rtx tmp = gen_reg_rtx (DImode);
6555               emit_insn (gen_zero_extendsidi2 (tmp, element0));
6556               emit_insn (gen_vsx_splat_v4si_di (target, tmp));
6557             }
6558           return;
6559         }
6560       else
6561         {
6562           rtx elements[4];
6563           size_t i;
6564
6565           for (i = 0; i < 4; i++)
6566             elements[i] = force_reg (SImode, XVECEXP (vals, 0, i));
6567
6568           emit_insn (gen_vsx_init_v4si (target, elements[0], elements[1],
6569                                         elements[2], elements[3]));
6570           return;
6571         }
6572     }
6573
6574   /* With single precision floating point on VSX, know that internally single
6575      precision is actually represented as a double, and either make 2 V2DF
6576      vectors, and convert these vectors to single precision, or do one
6577      conversion, and splat the result to the other elements.  */
6578   if (mode == V4SFmode && VECTOR_MEM_VSX_P (V4SFmode))
6579     {
6580       if (all_same)
6581         {
6582           rtx element0 = XVECEXP (vals, 0, 0);
6583
6584           if (TARGET_P9_VECTOR)
6585             {
6586               if (MEM_P (element0))
6587                 element0 = rs6000_force_indexed_or_indirect_mem (element0);
6588
6589               emit_insn (gen_vsx_splat_v4sf (target, element0));
6590             }
6591
6592           else
6593             {
6594               rtx freg = gen_reg_rtx (V4SFmode);
6595               rtx sreg = force_reg (SFmode, element0);
6596               rtx cvt  = (TARGET_XSCVDPSPN
6597                           ? gen_vsx_xscvdpspn_scalar (freg, sreg)
6598                           : gen_vsx_xscvdpsp_scalar (freg, sreg));
6599
6600               emit_insn (cvt);
6601               emit_insn (gen_vsx_xxspltw_v4sf_direct (target, freg,
6602                                                       const0_rtx));
6603             }
6604         }
6605       else
6606         {
6607           rtx dbl_even = gen_reg_rtx (V2DFmode);
6608           rtx dbl_odd  = gen_reg_rtx (V2DFmode);
6609           rtx flt_even = gen_reg_rtx (V4SFmode);
6610           rtx flt_odd  = gen_reg_rtx (V4SFmode);
6611           rtx op0 = force_reg (SFmode, XVECEXP (vals, 0, 0));
6612           rtx op1 = force_reg (SFmode, XVECEXP (vals, 0, 1));
6613           rtx op2 = force_reg (SFmode, XVECEXP (vals, 0, 2));
6614           rtx op3 = force_reg (SFmode, XVECEXP (vals, 0, 3));
6615
6616           /* Use VMRGEW if we can instead of doing a permute.  */
6617           if (TARGET_P8_VECTOR)
6618             {
6619               emit_insn (gen_vsx_concat_v2sf (dbl_even, op0, op2));
6620               emit_insn (gen_vsx_concat_v2sf (dbl_odd, op1, op3));
6621               emit_insn (gen_vsx_xvcvdpsp (flt_even, dbl_even));
6622               emit_insn (gen_vsx_xvcvdpsp (flt_odd, dbl_odd));
6623               if (BYTES_BIG_ENDIAN)
6624                 emit_insn (gen_p8_vmrgew_v4sf_direct (target, flt_even, flt_odd));
6625               else
6626                 emit_insn (gen_p8_vmrgew_v4sf_direct (target, flt_odd, flt_even));
6627             }
6628           else
6629             {
6630               emit_insn (gen_vsx_concat_v2sf (dbl_even, op0, op1));
6631               emit_insn (gen_vsx_concat_v2sf (dbl_odd, op2, op3));
6632               emit_insn (gen_vsx_xvcvdpsp (flt_even, dbl_even));
6633               emit_insn (gen_vsx_xvcvdpsp (flt_odd, dbl_odd));
6634               rs6000_expand_extract_even (target, flt_even, flt_odd);
6635             }
6636         }
6637       return;
6638     }
6639
6640   /* Special case initializing vector short/char that are splats if we are on
6641      64-bit systems with direct move.  */
6642   if (all_same && TARGET_DIRECT_MOVE_64BIT
6643       && (mode == V16QImode || mode == V8HImode))
6644     {
6645       rtx op0 = XVECEXP (vals, 0, 0);
6646       rtx di_tmp = gen_reg_rtx (DImode);
6647
6648       if (!REG_P (op0))
6649         op0 = force_reg (GET_MODE_INNER (mode), op0);
6650
6651       if (mode == V16QImode)
6652         {
6653           emit_insn (gen_zero_extendqidi2 (di_tmp, op0));
6654           emit_insn (gen_vsx_vspltb_di (target, di_tmp));
6655           return;
6656         }
6657
6658       if (mode == V8HImode)
6659         {
6660           emit_insn (gen_zero_extendhidi2 (di_tmp, op0));
6661           emit_insn (gen_vsx_vsplth_di (target, di_tmp));
6662           return;
6663         }
6664     }
6665
6666   /* Store value to stack temp.  Load vector element.  Splat.  However, splat
6667      of 64-bit items is not supported on Altivec.  */
6668   if (all_same && GET_MODE_SIZE (inner_mode) <= 4)
6669     {
6670       mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode));
6671       emit_move_insn (adjust_address_nv (mem, inner_mode, 0),
6672                       XVECEXP (vals, 0, 0));
6673       x = gen_rtx_UNSPEC (VOIDmode,
6674                           gen_rtvec (1, const0_rtx), UNSPEC_LVE);
6675       emit_insn (gen_rtx_PARALLEL (VOIDmode,
6676                                    gen_rtvec (2,
6677                                               gen_rtx_SET (target, mem),
6678                                               x)));
6679       x = gen_rtx_VEC_SELECT (inner_mode, target,
6680                               gen_rtx_PARALLEL (VOIDmode,
6681                                                 gen_rtvec (1, const0_rtx)));
6682       emit_insn (gen_rtx_SET (target, gen_rtx_VEC_DUPLICATE (mode, x)));
6683       return;
6684     }
6685
6686   /* One field is non-constant.  Load constant then overwrite
6687      varying field.  */
6688   if (n_var == 1)
6689     {
6690       rtx copy = copy_rtx (vals);
6691
6692       /* Load constant part of vector, substitute neighboring value for
6693          varying element.  */
6694       XVECEXP (copy, 0, one_var) = XVECEXP (vals, 0, (one_var + 1) % n_elts);
6695       rs6000_expand_vector_init (target, copy);
6696
6697       /* Insert variable.  */
6698       rs6000_expand_vector_set (target, XVECEXP (vals, 0, one_var), one_var);
6699       return;
6700     }
6701
6702   /* Construct the vector in memory one field at a time
6703      and load the whole vector.  */
6704   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode));
6705   for (i = 0; i < n_elts; i++)
6706     emit_move_insn (adjust_address_nv (mem, inner_mode,
6707                                     i * GET_MODE_SIZE (inner_mode)),
6708                     XVECEXP (vals, 0, i));
6709   emit_move_insn (target, mem);
6710 }
6711
6712 /* Set field ELT of TARGET to VAL.  */
6713
6714 void
6715 rs6000_expand_vector_set (rtx target, rtx val, int elt)
6716 {
6717   machine_mode mode = GET_MODE (target);
6718   machine_mode inner_mode = GET_MODE_INNER (mode);
6719   rtx reg = gen_reg_rtx (mode);
6720   rtx mask, mem, x;
6721   int width = GET_MODE_SIZE (inner_mode);
6722   int i;
6723
6724   val = force_reg (GET_MODE (val), val);
6725
6726   if (VECTOR_MEM_VSX_P (mode))
6727     {
6728       rtx insn = NULL_RTX;
6729       rtx elt_rtx = GEN_INT (elt);
6730
6731       if (mode == V2DFmode)
6732         insn = gen_vsx_set_v2df (target, target, val, elt_rtx);
6733
6734       else if (mode == V2DImode)
6735         insn = gen_vsx_set_v2di (target, target, val, elt_rtx);
6736
6737       else if (TARGET_P9_VECTOR && TARGET_POWERPC64)
6738         {
6739           if (mode == V4SImode)
6740             insn = gen_vsx_set_v4si_p9 (target, target, val, elt_rtx);
6741           else if (mode == V8HImode)
6742             insn = gen_vsx_set_v8hi_p9 (target, target, val, elt_rtx);
6743           else if (mode == V16QImode)
6744             insn = gen_vsx_set_v16qi_p9 (target, target, val, elt_rtx);
6745           else if (mode == V4SFmode)
6746             insn = gen_vsx_set_v4sf_p9 (target, target, val, elt_rtx);
6747         }
6748
6749       if (insn)
6750         {
6751           emit_insn (insn);
6752           return;
6753         }
6754     }
6755
6756   /* Simplify setting single element vectors like V1TImode.  */
6757   if (GET_MODE_SIZE (mode) == GET_MODE_SIZE (inner_mode) && elt == 0)
6758     {
6759       emit_move_insn (target, gen_lowpart (mode, val));
6760       return;
6761     }
6762
6763   /* Load single variable value.  */
6764   mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode));
6765   emit_move_insn (adjust_address_nv (mem, inner_mode, 0), val);
6766   x = gen_rtx_UNSPEC (VOIDmode,
6767                       gen_rtvec (1, const0_rtx), UNSPEC_LVE);
6768   emit_insn (gen_rtx_PARALLEL (VOIDmode,
6769                                gen_rtvec (2,
6770                                           gen_rtx_SET (reg, mem),
6771                                           x)));
6772
6773   /* Linear sequence.  */
6774   mask = gen_rtx_PARALLEL (V16QImode, rtvec_alloc (16));
6775   for (i = 0; i < 16; ++i)
6776     XVECEXP (mask, 0, i) = GEN_INT (i);
6777
6778   /* Set permute mask to insert element into target.  */
6779   for (i = 0; i < width; ++i)
6780     XVECEXP (mask, 0, elt*width + i)
6781       = GEN_INT (i + 0x10);
6782   x = gen_rtx_CONST_VECTOR (V16QImode, XVEC (mask, 0));
6783
6784   if (BYTES_BIG_ENDIAN)
6785     x = gen_rtx_UNSPEC (mode,
6786                         gen_rtvec (3, target, reg,
6787                                    force_reg (V16QImode, x)),
6788                         UNSPEC_VPERM);
6789   else
6790     {
6791       if (TARGET_P9_VECTOR)
6792         x = gen_rtx_UNSPEC (mode,
6793                             gen_rtvec (3, reg, target,
6794                                        force_reg (V16QImode, x)),
6795                             UNSPEC_VPERMR);
6796       else
6797         {
6798           /* Invert selector.  We prefer to generate VNAND on P8 so
6799              that future fusion opportunities can kick in, but must
6800              generate VNOR elsewhere.  */
6801           rtx notx = gen_rtx_NOT (V16QImode, force_reg (V16QImode, x));
6802           rtx iorx = (TARGET_P8_VECTOR
6803                       ? gen_rtx_IOR (V16QImode, notx, notx)
6804                       : gen_rtx_AND (V16QImode, notx, notx));
6805           rtx tmp = gen_reg_rtx (V16QImode);
6806           emit_insn (gen_rtx_SET (tmp, iorx));
6807
6808           /* Permute with operands reversed and adjusted selector.  */
6809           x = gen_rtx_UNSPEC (mode, gen_rtvec (3, reg, target, tmp),
6810                               UNSPEC_VPERM);
6811         }
6812     }
6813
6814   emit_insn (gen_rtx_SET (target, x));
6815 }
6816
6817 /* Extract field ELT from VEC into TARGET.  */
6818
6819 void
6820 rs6000_expand_vector_extract (rtx target, rtx vec, rtx elt)
6821 {
6822   machine_mode mode = GET_MODE (vec);
6823   machine_mode inner_mode = GET_MODE_INNER (mode);
6824   rtx mem;
6825
6826   if (VECTOR_MEM_VSX_P (mode) && CONST_INT_P (elt))
6827     {
6828       switch (mode)
6829         {
6830         default:
6831           break;
6832         case E_V1TImode:
6833           emit_move_insn (target, gen_lowpart (TImode, vec));
6834           break;
6835         case E_V2DFmode:
6836           emit_insn (gen_vsx_extract_v2df (target, vec, elt));
6837           return;
6838         case E_V2DImode:
6839           emit_insn (gen_vsx_extract_v2di (target, vec, elt));
6840           return;
6841         case E_V4SFmode:
6842           emit_insn (gen_vsx_extract_v4sf (target, vec, elt));
6843           return;
6844         case E_V16QImode:
6845           if (TARGET_DIRECT_MOVE_64BIT)
6846             {
6847               emit_insn (gen_vsx_extract_v16qi (target, vec, elt));
6848               return;
6849             }
6850           else
6851             break;
6852         case E_V8HImode:
6853           if (TARGET_DIRECT_MOVE_64BIT)
6854             {
6855               emit_insn (gen_vsx_extract_v8hi (target, vec, elt));
6856               return;
6857             }
6858           else
6859             break;
6860         case E_V4SImode:
6861           if (TARGET_DIRECT_MOVE_64BIT)
6862             {
6863               emit_insn (gen_vsx_extract_v4si (target, vec, elt));
6864               return;
6865             }
6866           break;
6867         }
6868     }
6869   else if (VECTOR_MEM_VSX_P (mode) && !CONST_INT_P (elt)
6870            && TARGET_DIRECT_MOVE_64BIT)
6871     {
6872       if (GET_MODE (elt) != DImode)
6873         {
6874           rtx tmp = gen_reg_rtx (DImode);
6875           convert_move (tmp, elt, 0);
6876           elt = tmp;
6877         }
6878       else if (!REG_P (elt))
6879         elt = force_reg (DImode, elt);
6880
6881       switch (mode)
6882         {
6883         case E_V1TImode:
6884           emit_move_insn (target, gen_lowpart (TImode, vec));
6885           return;
6886
6887         case E_V2DFmode:
6888           emit_insn (gen_vsx_extract_v2df_var (target, vec, elt));
6889           return;
6890
6891         case E_V2DImode:
6892           emit_insn (gen_vsx_extract_v2di_var (target, vec, elt));
6893           return;
6894
6895         case E_V4SFmode:
6896           emit_insn (gen_vsx_extract_v4sf_var (target, vec, elt));
6897           return;
6898
6899         case E_V4SImode:
6900           emit_insn (gen_vsx_extract_v4si_var (target, vec, elt));
6901           return;
6902
6903         case E_V8HImode:
6904           emit_insn (gen_vsx_extract_v8hi_var (target, vec, elt));
6905           return;
6906
6907         case E_V16QImode:
6908           emit_insn (gen_vsx_extract_v16qi_var (target, vec, elt));
6909           return;
6910
6911         default:
6912           gcc_unreachable ();
6913         }
6914     }
6915
6916   /* Allocate mode-sized buffer.  */
6917   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode));
6918
6919   emit_move_insn (mem, vec);
6920   if (CONST_INT_P (elt))
6921     {
6922       int modulo_elt = INTVAL (elt) % GET_MODE_NUNITS (mode);
6923
6924       /* Add offset to field within buffer matching vector element.  */
6925       mem = adjust_address_nv (mem, inner_mode,
6926                                modulo_elt * GET_MODE_SIZE (inner_mode));
6927       emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0));
6928     }
6929   else
6930     {
6931       unsigned int ele_size = GET_MODE_SIZE (inner_mode);
6932       rtx num_ele_m1 = GEN_INT (GET_MODE_NUNITS (mode) - 1);
6933       rtx new_addr = gen_reg_rtx (Pmode);
6934
6935       elt = gen_rtx_AND (Pmode, elt, num_ele_m1);
6936       if (ele_size > 1)
6937         elt = gen_rtx_MULT (Pmode, elt, GEN_INT (ele_size));
6938       new_addr = gen_rtx_PLUS (Pmode, XEXP (mem, 0), elt);
6939       new_addr = change_address (mem, inner_mode, new_addr);
6940       emit_move_insn (target, new_addr);
6941     }
6942 }
6943
6944 /* Adjust a memory address (MEM) of a vector type to point to a scalar field
6945    within the vector (ELEMENT) with a mode (SCALAR_MODE).  Use a base register
6946    temporary (BASE_TMP) to fixup the address.  Return the new memory address
6947    that is valid for reads or writes to a given register (SCALAR_REG).  */
6948
6949 rtx
6950 rs6000_adjust_vec_address (rtx scalar_reg,
6951                            rtx mem,
6952                            rtx element,
6953                            rtx base_tmp,
6954                            machine_mode scalar_mode)
6955 {
6956   unsigned scalar_size = GET_MODE_SIZE (scalar_mode);
6957   rtx addr = XEXP (mem, 0);
6958   rtx element_offset;
6959   rtx new_addr;
6960   bool valid_addr_p;
6961
6962   /* Vector addresses should not have PRE_INC, PRE_DEC, or PRE_MODIFY.  */
6963   gcc_assert (GET_RTX_CLASS (GET_CODE (addr)) != RTX_AUTOINC);
6964
6965   /* Calculate what we need to add to the address to get the element
6966      address.  */
6967   if (CONST_INT_P (element))
6968     element_offset = GEN_INT (INTVAL (element) * scalar_size);
6969   else
6970     {
6971       int byte_shift = exact_log2 (scalar_size);
6972       gcc_assert (byte_shift >= 0);
6973
6974       if (byte_shift == 0)
6975         element_offset = element;
6976
6977       else
6978         {
6979           if (TARGET_POWERPC64)
6980             emit_insn (gen_ashldi3 (base_tmp, element, GEN_INT (byte_shift)));
6981           else
6982             emit_insn (gen_ashlsi3 (base_tmp, element, GEN_INT (byte_shift)));
6983
6984           element_offset = base_tmp;
6985         }
6986     }
6987
6988   /* Create the new address pointing to the element within the vector.  If we
6989      are adding 0, we don't have to change the address.  */
6990   if (element_offset == const0_rtx)
6991     new_addr = addr;
6992
6993   /* A simple indirect address can be converted into a reg + offset
6994      address.  */
6995   else if (REG_P (addr) || SUBREG_P (addr))
6996     new_addr = gen_rtx_PLUS (Pmode, addr, element_offset);
6997
6998   /* Optimize D-FORM addresses with constant offset with a constant element, to
6999      include the element offset in the address directly.  */
7000   else if (GET_CODE (addr) == PLUS)
7001     {
7002       rtx op0 = XEXP (addr, 0);
7003       rtx op1 = XEXP (addr, 1);
7004       rtx insn;
7005
7006       gcc_assert (REG_P (op0) || SUBREG_P (op0));
7007       if (CONST_INT_P (op1) && CONST_INT_P (element_offset))
7008         {
7009           HOST_WIDE_INT offset = INTVAL (op1) + INTVAL (element_offset);
7010           rtx offset_rtx = GEN_INT (offset);
7011
7012           if (IN_RANGE (offset, -32768, 32767)
7013               && (scalar_size < 8 || (offset & 0x3) == 0))
7014             new_addr = gen_rtx_PLUS (Pmode, op0, offset_rtx);
7015           else
7016             {
7017               emit_move_insn (base_tmp, offset_rtx);
7018               new_addr = gen_rtx_PLUS (Pmode, op0, base_tmp);
7019             }
7020         }
7021       else
7022         {
7023           bool op1_reg_p = (REG_P (op1) || SUBREG_P (op1));
7024           bool ele_reg_p = (REG_P (element_offset) || SUBREG_P (element_offset));
7025
7026           /* Note, ADDI requires the register being added to be a base
7027              register.  If the register was R0, load it up into the temporary
7028              and do the add.  */
7029           if (op1_reg_p
7030               && (ele_reg_p || reg_or_subregno (op1) != FIRST_GPR_REGNO))
7031             {
7032               insn = gen_add3_insn (base_tmp, op1, element_offset);
7033               gcc_assert (insn != NULL_RTX);
7034               emit_insn (insn);
7035             }
7036
7037           else if (ele_reg_p
7038                    && reg_or_subregno (element_offset) != FIRST_GPR_REGNO)
7039             {
7040               insn = gen_add3_insn (base_tmp, element_offset, op1);
7041               gcc_assert (insn != NULL_RTX);
7042               emit_insn (insn);
7043             }
7044
7045           else
7046             {
7047               emit_move_insn (base_tmp, op1);
7048               emit_insn (gen_add2_insn (base_tmp, element_offset));
7049             }
7050
7051           new_addr = gen_rtx_PLUS (Pmode, op0, base_tmp);
7052         }
7053     }
7054
7055   else
7056     {
7057       emit_move_insn (base_tmp, addr);
7058       new_addr = gen_rtx_PLUS (Pmode, base_tmp, element_offset);
7059     }
7060
7061   /* If we have a PLUS, we need to see whether the particular register class
7062      allows for D-FORM or X-FORM addressing.  */
7063   if (GET_CODE (new_addr) == PLUS)
7064     {
7065       rtx op1 = XEXP (new_addr, 1);
7066       addr_mask_type addr_mask;
7067       unsigned int scalar_regno = reg_or_subregno (scalar_reg);
7068
7069       gcc_assert (HARD_REGISTER_NUM_P (scalar_regno));
7070       if (INT_REGNO_P (scalar_regno))
7071         addr_mask = reg_addr[scalar_mode].addr_mask[RELOAD_REG_GPR];
7072
7073       else if (FP_REGNO_P (scalar_regno))
7074         addr_mask = reg_addr[scalar_mode].addr_mask[RELOAD_REG_FPR];
7075
7076       else if (ALTIVEC_REGNO_P (scalar_regno))
7077         addr_mask = reg_addr[scalar_mode].addr_mask[RELOAD_REG_VMX];
7078
7079       else
7080         gcc_unreachable ();
7081
7082       if (REG_P (op1) || SUBREG_P (op1))
7083         valid_addr_p = (addr_mask & RELOAD_REG_INDEXED) != 0;
7084       else
7085         valid_addr_p = (addr_mask & RELOAD_REG_OFFSET) != 0;
7086     }
7087
7088   else if (REG_P (new_addr) || SUBREG_P (new_addr))
7089     valid_addr_p = true;
7090
7091   else
7092     valid_addr_p = false;
7093
7094   if (!valid_addr_p)
7095     {
7096       emit_move_insn (base_tmp, new_addr);
7097       new_addr = base_tmp;
7098     }
7099
7100   return change_address (mem, scalar_mode, new_addr);
7101 }
7102
7103 /* Split a variable vec_extract operation into the component instructions.  */
7104
7105 void
7106 rs6000_split_vec_extract_var (rtx dest, rtx src, rtx element, rtx tmp_gpr,
7107                               rtx tmp_altivec)
7108 {
7109   machine_mode mode = GET_MODE (src);
7110   machine_mode scalar_mode = GET_MODE_INNER (GET_MODE (src));
7111   unsigned scalar_size = GET_MODE_SIZE (scalar_mode);
7112   int byte_shift = exact_log2 (scalar_size);
7113
7114   gcc_assert (byte_shift >= 0);
7115
7116   /* If we are given a memory address, optimize to load just the element.  We
7117      don't have to adjust the vector element number on little endian
7118      systems.  */
7119   if (MEM_P (src))
7120     {
7121       int num_elements = GET_MODE_NUNITS (mode);
7122       rtx num_ele_m1 = GEN_INT (num_elements - 1);
7123
7124       emit_insn (gen_anddi3 (element, element, num_ele_m1));
7125       gcc_assert (REG_P (tmp_gpr));
7126       emit_move_insn (dest, rs6000_adjust_vec_address (dest, src, element,
7127                                                        tmp_gpr, scalar_mode));
7128       return;
7129     }
7130
7131   else if (REG_P (src) || SUBREG_P (src))
7132     {
7133       int num_elements = GET_MODE_NUNITS (mode);
7134       int bits_in_element = mode_to_bits (GET_MODE_INNER (mode));
7135       int bit_shift = 7 - exact_log2 (num_elements);
7136       rtx element2;
7137       unsigned int dest_regno = reg_or_subregno (dest);
7138       unsigned int src_regno = reg_or_subregno (src);
7139       unsigned int element_regno = reg_or_subregno (element);
7140
7141       gcc_assert (REG_P (tmp_gpr));
7142
7143       /* See if we want to generate VEXTU{B,H,W}{L,R}X if the destination is in
7144          a general purpose register.  */
7145       if (TARGET_P9_VECTOR
7146           && (mode == V16QImode || mode == V8HImode || mode == V4SImode)
7147           && INT_REGNO_P (dest_regno)
7148           && ALTIVEC_REGNO_P (src_regno)
7149           && INT_REGNO_P (element_regno))
7150         {
7151           rtx dest_si = gen_rtx_REG (SImode, dest_regno);
7152           rtx element_si = gen_rtx_REG (SImode, element_regno);
7153
7154           if (mode == V16QImode)
7155             emit_insn (BYTES_BIG_ENDIAN
7156                        ? gen_vextublx (dest_si, element_si, src)
7157                        : gen_vextubrx (dest_si, element_si, src));
7158
7159           else if (mode == V8HImode)
7160             {
7161               rtx tmp_gpr_si = gen_rtx_REG (SImode, REGNO (tmp_gpr));
7162               emit_insn (gen_ashlsi3 (tmp_gpr_si, element_si, const1_rtx));
7163               emit_insn (BYTES_BIG_ENDIAN
7164                          ? gen_vextuhlx (dest_si, tmp_gpr_si, src)
7165                          : gen_vextuhrx (dest_si, tmp_gpr_si, src));
7166             }
7167
7168
7169           else
7170             {
7171               rtx tmp_gpr_si = gen_rtx_REG (SImode, REGNO (tmp_gpr));
7172               emit_insn (gen_ashlsi3 (tmp_gpr_si, element_si, const2_rtx));
7173               emit_insn (BYTES_BIG_ENDIAN
7174                          ? gen_vextuwlx (dest_si, tmp_gpr_si, src)
7175                          : gen_vextuwrx (dest_si, tmp_gpr_si, src));
7176             }
7177
7178           return;
7179         }
7180
7181
7182       gcc_assert (REG_P (tmp_altivec));
7183
7184       /* For little endian, adjust element ordering.  For V2DI/V2DF, we can use
7185          an XOR, otherwise we need to subtract.  The shift amount is so VSLO
7186          will shift the element into the upper position (adding 3 to convert a
7187          byte shift into a bit shift).  */
7188       if (scalar_size == 8)
7189         {
7190           if (!BYTES_BIG_ENDIAN)
7191             {
7192               emit_insn (gen_xordi3 (tmp_gpr, element, const1_rtx));
7193               element2 = tmp_gpr;
7194             }
7195           else
7196             element2 = element;
7197
7198           /* Generate RLDIC directly to shift left 6 bits and retrieve 1
7199              bit.  */
7200           emit_insn (gen_rtx_SET (tmp_gpr,
7201                                   gen_rtx_AND (DImode,
7202                                                gen_rtx_ASHIFT (DImode,
7203                                                                element2,
7204                                                                GEN_INT (6)),
7205                                                GEN_INT (64))));
7206         }
7207       else
7208         {
7209           if (!BYTES_BIG_ENDIAN)
7210             {
7211               rtx num_ele_m1 = GEN_INT (num_elements - 1);
7212
7213               emit_insn (gen_anddi3 (tmp_gpr, element, num_ele_m1));
7214               emit_insn (gen_subdi3 (tmp_gpr, num_ele_m1, tmp_gpr));
7215               element2 = tmp_gpr;
7216             }
7217           else
7218             element2 = element;
7219
7220           emit_insn (gen_ashldi3 (tmp_gpr, element2, GEN_INT (bit_shift)));
7221         }
7222
7223       /* Get the value into the lower byte of the Altivec register where VSLO
7224          expects it.  */
7225       if (TARGET_P9_VECTOR)
7226         emit_insn (gen_vsx_splat_v2di (tmp_altivec, tmp_gpr));
7227       else if (can_create_pseudo_p ())
7228         emit_insn (gen_vsx_concat_v2di (tmp_altivec, tmp_gpr, tmp_gpr));
7229       else
7230         {
7231           rtx tmp_di = gen_rtx_REG (DImode, REGNO (tmp_altivec));
7232           emit_move_insn (tmp_di, tmp_gpr);
7233           emit_insn (gen_vsx_concat_v2di (tmp_altivec, tmp_di, tmp_di));
7234         }
7235
7236       /* Do the VSLO to get the value into the final location.  */
7237       switch (mode)
7238         {
7239         case E_V2DFmode:
7240           emit_insn (gen_vsx_vslo_v2df (dest, src, tmp_altivec));
7241           return;
7242
7243         case E_V2DImode:
7244           emit_insn (gen_vsx_vslo_v2di (dest, src, tmp_altivec));
7245           return;
7246
7247         case E_V4SFmode:
7248           {
7249             rtx tmp_altivec_di = gen_rtx_REG (DImode, REGNO (tmp_altivec));
7250             rtx tmp_altivec_v4sf = gen_rtx_REG (V4SFmode, REGNO (tmp_altivec));
7251             rtx src_v2di = gen_rtx_REG (V2DImode, REGNO (src));
7252             emit_insn (gen_vsx_vslo_v2di (tmp_altivec_di, src_v2di,
7253                                           tmp_altivec));
7254
7255             emit_insn (gen_vsx_xscvspdp_scalar2 (dest, tmp_altivec_v4sf));
7256             return;
7257           }
7258
7259         case E_V4SImode:
7260         case E_V8HImode:
7261         case E_V16QImode:
7262           {
7263             rtx tmp_altivec_di = gen_rtx_REG (DImode, REGNO (tmp_altivec));
7264             rtx src_v2di = gen_rtx_REG (V2DImode, REGNO (src));
7265             rtx tmp_gpr_di = gen_rtx_REG (DImode, REGNO (dest));
7266             emit_insn (gen_vsx_vslo_v2di (tmp_altivec_di, src_v2di,
7267                                           tmp_altivec));
7268             emit_move_insn (tmp_gpr_di, tmp_altivec_di);
7269             emit_insn (gen_lshrdi3 (tmp_gpr_di, tmp_gpr_di,
7270                                     GEN_INT (64 - bits_in_element)));
7271             return;
7272           }
7273
7274         default:
7275           gcc_unreachable ();
7276         }
7277
7278       return;
7279     }
7280   else
7281     gcc_unreachable ();
7282  }
7283
7284 /* Return alignment of TYPE.  Existing alignment is ALIGN.  HOW
7285    selects whether the alignment is abi mandated, optional, or
7286    both abi and optional alignment.  */
7287    
7288 unsigned int
7289 rs6000_data_alignment (tree type, unsigned int align, enum data_align how)
7290 {
7291   if (how != align_opt)
7292     {
7293       if (TREE_CODE (type) == VECTOR_TYPE && align < 128)
7294         align = 128;
7295     }
7296
7297   if (how != align_abi)
7298     {
7299       if (TREE_CODE (type) == ARRAY_TYPE
7300           && TYPE_MODE (TREE_TYPE (type)) == QImode)
7301         {
7302           if (align < BITS_PER_WORD)
7303             align = BITS_PER_WORD;
7304         }
7305     }
7306
7307   return align;
7308 }
7309
7310 /* Implement TARGET_SLOW_UNALIGNED_ACCESS.  Altivec vector memory
7311    instructions simply ignore the low bits; VSX memory instructions
7312    are aligned to 4 or 8 bytes.  */
7313
7314 static bool
7315 rs6000_slow_unaligned_access (machine_mode mode, unsigned int align)
7316 {
7317   return (STRICT_ALIGNMENT
7318           || (!TARGET_EFFICIENT_UNALIGNED_VSX
7319               && ((SCALAR_FLOAT_MODE_NOT_VECTOR_P (mode) && align < 32)
7320                   || ((VECTOR_MODE_P (mode) || FLOAT128_VECTOR_P (mode))
7321                       && (int) align < VECTOR_ALIGN (mode)))));
7322 }
7323
7324 /* Previous GCC releases forced all vector types to have 16-byte alignment.  */
7325
7326 bool
7327 rs6000_special_adjust_field_align_p (tree type, unsigned int computed)
7328 {
7329   if (TARGET_ALTIVEC && TREE_CODE (type) == VECTOR_TYPE)
7330     {
7331       if (computed != 128)
7332         {
7333           static bool warned;
7334           if (!warned && warn_psabi)
7335             {
7336               warned = true;
7337               inform (input_location,
7338                       "the layout of aggregates containing vectors with"
7339                       " %d-byte alignment has changed in GCC 5",
7340                       computed / BITS_PER_UNIT);
7341             }
7342         }
7343       /* In current GCC there is no special case.  */
7344       return false;
7345     }
7346
7347   return false;
7348 }
7349
7350 /* AIX increases natural record alignment to doubleword if the first
7351    field is an FP double while the FP fields remain word aligned.  */
7352
7353 unsigned int
7354 rs6000_special_round_type_align (tree type, unsigned int computed,
7355                                  unsigned int specified)
7356 {
7357   unsigned int align = MAX (computed, specified);
7358   tree field = TYPE_FIELDS (type);
7359
7360   /* Skip all non field decls */
7361   while (field != NULL && TREE_CODE (field) != FIELD_DECL)
7362     field = DECL_CHAIN (field);
7363
7364   if (field != NULL && field != type)
7365     {
7366       type = TREE_TYPE (field);
7367       while (TREE_CODE (type) == ARRAY_TYPE)
7368         type = TREE_TYPE (type);
7369
7370       if (type != error_mark_node && TYPE_MODE (type) == DFmode)
7371         align = MAX (align, 64);
7372     }
7373
7374   return align;
7375 }
7376
7377 /* Darwin increases record alignment to the natural alignment of
7378    the first field.  */
7379
7380 unsigned int
7381 darwin_rs6000_special_round_type_align (tree type, unsigned int computed,
7382                                         unsigned int specified)
7383 {
7384   unsigned int align = MAX (computed, specified);
7385
7386   if (TYPE_PACKED (type))
7387     return align;
7388
7389   /* Find the first field, looking down into aggregates.  */
7390   do {
7391     tree field = TYPE_FIELDS (type);
7392     /* Skip all non field decls */
7393     while (field != NULL && TREE_CODE (field) != FIELD_DECL)
7394       field = DECL_CHAIN (field);
7395     if (! field)
7396       break;
7397     /* A packed field does not contribute any extra alignment.  */
7398     if (DECL_PACKED (field))
7399       return align;
7400     type = TREE_TYPE (field);
7401     while (TREE_CODE (type) == ARRAY_TYPE)
7402       type = TREE_TYPE (type);
7403   } while (AGGREGATE_TYPE_P (type));
7404
7405   if (! AGGREGATE_TYPE_P (type) && type != error_mark_node)
7406     align = MAX (align, TYPE_ALIGN (type));
7407
7408   return align;
7409 }
7410
7411 /* Return 1 for an operand in small memory on V.4/eabi.  */
7412
7413 int
7414 small_data_operand (rtx op ATTRIBUTE_UNUSED,
7415                     machine_mode mode ATTRIBUTE_UNUSED)
7416 {
7417 #if TARGET_ELF
7418   rtx sym_ref;
7419
7420   if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
7421     return 0;
7422
7423   if (DEFAULT_ABI != ABI_V4)
7424     return 0;
7425
7426   if (SYMBOL_REF_P (op))
7427     sym_ref = op;
7428
7429   else if (GET_CODE (op) != CONST
7430            || GET_CODE (XEXP (op, 0)) != PLUS
7431            || !SYMBOL_REF_P (XEXP (XEXP (op, 0), 0))
7432            || !CONST_INT_P (XEXP (XEXP (op, 0), 1)))
7433     return 0;
7434
7435   else
7436     {
7437       rtx sum = XEXP (op, 0);
7438       HOST_WIDE_INT summand;
7439
7440       /* We have to be careful here, because it is the referenced address
7441          that must be 32k from _SDA_BASE_, not just the symbol.  */
7442       summand = INTVAL (XEXP (sum, 1));
7443       if (summand < 0 || summand > g_switch_value)
7444         return 0;
7445
7446       sym_ref = XEXP (sum, 0);
7447     }
7448
7449   return SYMBOL_REF_SMALL_P (sym_ref);
7450 #else
7451   return 0;
7452 #endif
7453 }
7454
7455 /* Return true if either operand is a general purpose register.  */
7456
7457 bool
7458 gpr_or_gpr_p (rtx op0, rtx op1)
7459 {
7460   return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
7461           || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
7462 }
7463
7464 /* Return true if this is a move direct operation between GPR registers and
7465    floating point/VSX registers.  */
7466
7467 bool
7468 direct_move_p (rtx op0, rtx op1)
7469 {
7470   int regno0, regno1;
7471
7472   if (!REG_P (op0) || !REG_P (op1))
7473     return false;
7474
7475   if (!TARGET_DIRECT_MOVE && !TARGET_MFPGPR)
7476     return false;
7477
7478   regno0 = REGNO (op0);
7479   regno1 = REGNO (op1);
7480   if (!HARD_REGISTER_NUM_P (regno0) || !HARD_REGISTER_NUM_P (regno1))
7481     return false;
7482
7483   if (INT_REGNO_P (regno0))
7484     return (TARGET_DIRECT_MOVE) ? VSX_REGNO_P (regno1) : FP_REGNO_P (regno1);
7485
7486   else if (INT_REGNO_P (regno1))
7487     {
7488       if (TARGET_MFPGPR && FP_REGNO_P (regno0))
7489         return true;
7490
7491       else if (TARGET_DIRECT_MOVE && VSX_REGNO_P (regno0))
7492         return true;
7493     }
7494
7495   return false;
7496 }
7497
7498 /* Return true if the OFFSET is valid for the quad address instructions that
7499    use d-form (register + offset) addressing.  */
7500
7501 static inline bool
7502 quad_address_offset_p (HOST_WIDE_INT offset)
7503 {
7504   return (IN_RANGE (offset, -32768, 32767) && ((offset) & 0xf) == 0);
7505 }
7506
7507 /* Return true if the ADDR is an acceptable address for a quad memory
7508    operation of mode MODE (either LQ/STQ for general purpose registers, or
7509    LXV/STXV for vector registers under ISA 3.0.  GPR_P is true if this address
7510    is intended for LQ/STQ.  If it is false, the address is intended for the ISA
7511    3.0 LXV/STXV instruction.  */
7512
7513 bool
7514 quad_address_p (rtx addr, machine_mode mode, bool strict)
7515 {
7516   rtx op0, op1;
7517
7518   if (GET_MODE_SIZE (mode) != 16)
7519     return false;
7520
7521   if (legitimate_indirect_address_p (addr, strict))
7522     return true;
7523
7524   if (VECTOR_MODE_P (mode) && !mode_supports_dq_form (mode))
7525     return false;
7526
7527   if (GET_CODE (addr) != PLUS)
7528     return false;
7529
7530   op0 = XEXP (addr, 0);
7531   if (!REG_P (op0) || !INT_REG_OK_FOR_BASE_P (op0, strict))
7532     return false;
7533
7534   op1 = XEXP (addr, 1);
7535   if (!CONST_INT_P (op1))
7536     return false;
7537
7538   return quad_address_offset_p (INTVAL (op1));
7539 }
7540
7541 /* Return true if this is a load or store quad operation.  This function does
7542    not handle the atomic quad memory instructions.  */
7543
7544 bool
7545 quad_load_store_p (rtx op0, rtx op1)
7546 {
7547   bool ret;
7548
7549   if (!TARGET_QUAD_MEMORY)
7550     ret = false;
7551
7552   else if (REG_P (op0) && MEM_P (op1))
7553     ret = (quad_int_reg_operand (op0, GET_MODE (op0))
7554            && quad_memory_operand (op1, GET_MODE (op1))
7555            && !reg_overlap_mentioned_p (op0, op1));
7556
7557   else if (MEM_P (op0) && REG_P (op1))
7558     ret = (quad_memory_operand (op0, GET_MODE (op0))
7559            && quad_int_reg_operand (op1, GET_MODE (op1)));
7560
7561   else
7562     ret = false;
7563
7564   if (TARGET_DEBUG_ADDR)
7565     {
7566       fprintf (stderr, "\n========== quad_load_store, return %s\n",
7567                ret ? "true" : "false");
7568       debug_rtx (gen_rtx_SET (op0, op1));
7569     }
7570
7571   return ret;
7572 }
7573
7574 /* Given an address, return a constant offset term if one exists.  */
7575
7576 static rtx
7577 address_offset (rtx op)
7578 {
7579   if (GET_CODE (op) == PRE_INC
7580       || GET_CODE (op) == PRE_DEC)
7581     op = XEXP (op, 0);
7582   else if (GET_CODE (op) == PRE_MODIFY
7583            || GET_CODE (op) == LO_SUM)
7584     op = XEXP (op, 1);
7585
7586   if (GET_CODE (op) == CONST)
7587     op = XEXP (op, 0);
7588
7589   if (GET_CODE (op) == PLUS)
7590     op = XEXP (op, 1);
7591
7592   if (CONST_INT_P (op))
7593     return op;
7594
7595   return NULL_RTX;
7596 }
7597
7598 /* Return true if the MEM operand is a memory operand suitable for use
7599    with a (full width, possibly multiple) gpr load/store.  On
7600    powerpc64 this means the offset must be divisible by 4.
7601    Implements 'Y' constraint.
7602
7603    Accept direct, indexed, offset, lo_sum and tocref.  Since this is
7604    a constraint function we know the operand has satisfied a suitable
7605    memory predicate.
7606
7607    Offsetting a lo_sum should not be allowed, except where we know by
7608    alignment that a 32k boundary is not crossed.  Note that by
7609    "offsetting" here we mean a further offset to access parts of the
7610    MEM.  It's fine to have a lo_sum where the inner address is offset
7611    from a sym, since the same sym+offset will appear in the high part
7612    of the address calculation.  */
7613
7614 bool
7615 mem_operand_gpr (rtx op, machine_mode mode)
7616 {
7617   unsigned HOST_WIDE_INT offset;
7618   int extra;
7619   rtx addr = XEXP (op, 0);
7620
7621   /* PR85755: Allow PRE_INC and PRE_DEC addresses.  */
7622   if (TARGET_UPDATE
7623       && (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
7624       && mode_supports_pre_incdec_p (mode)
7625       && legitimate_indirect_address_p (XEXP (addr, 0), false))
7626     return true;
7627
7628   /* Don't allow non-offsettable addresses.  See PRs 83969 and 84279.  */
7629   if (!rs6000_offsettable_memref_p (op, mode, false))
7630     return false;
7631
7632   op = address_offset (addr);
7633   if (op == NULL_RTX)
7634     return true;
7635
7636   offset = INTVAL (op);
7637   if (TARGET_POWERPC64 && (offset & 3) != 0)
7638     return false;
7639
7640   extra = GET_MODE_SIZE (mode) - UNITS_PER_WORD;
7641   if (extra < 0)
7642     extra = 0;
7643
7644   if (GET_CODE (addr) == LO_SUM)
7645     /* For lo_sum addresses, we must allow any offset except one that
7646        causes a wrap, so test only the low 16 bits.  */
7647     offset = ((offset & 0xffff) ^ 0x8000) - 0x8000;
7648
7649   return offset + 0x8000 < 0x10000u - extra;
7650 }
7651
7652 /* As above, but for DS-FORM VSX insns.  Unlike mem_operand_gpr,
7653    enforce an offset divisible by 4 even for 32-bit.  */
7654
7655 bool
7656 mem_operand_ds_form (rtx op, machine_mode mode)
7657 {
7658   unsigned HOST_WIDE_INT offset;
7659   int extra;
7660   rtx addr = XEXP (op, 0);
7661
7662   if (!offsettable_address_p (false, mode, addr))
7663     return false;
7664
7665   op = address_offset (addr);
7666   if (op == NULL_RTX)
7667     return true;
7668
7669   offset = INTVAL (op);
7670   if ((offset & 3) != 0)
7671     return false;
7672
7673   extra = GET_MODE_SIZE (mode) - UNITS_PER_WORD;
7674   if (extra < 0)
7675     extra = 0;
7676
7677   if (GET_CODE (addr) == LO_SUM)
7678     /* For lo_sum addresses, we must allow any offset except one that
7679        causes a wrap, so test only the low 16 bits.  */
7680     offset = ((offset & 0xffff) ^ 0x8000) - 0x8000;
7681
7682   return offset + 0x8000 < 0x10000u - extra;
7683 }
7684 \f
7685 /* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address_p.  */
7686
7687 static bool
7688 reg_offset_addressing_ok_p (machine_mode mode)
7689 {
7690   switch (mode)
7691     {
7692     case E_V16QImode:
7693     case E_V8HImode:
7694     case E_V4SFmode:
7695     case E_V4SImode:
7696     case E_V2DFmode:
7697     case E_V2DImode:
7698     case E_V1TImode:
7699     case E_TImode:
7700     case E_TFmode:
7701     case E_KFmode:
7702       /* AltiVec/VSX vector modes.  Only reg+reg addressing was valid until the
7703          ISA 3.0 vector d-form addressing mode was added.  While TImode is not
7704          a vector mode, if we want to use the VSX registers to move it around,
7705          we need to restrict ourselves to reg+reg addressing.  Similarly for
7706          IEEE 128-bit floating point that is passed in a single vector
7707          register.  */
7708       if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
7709         return mode_supports_dq_form (mode);
7710       break;
7711
7712     case E_SDmode:
7713       /* If we can do direct load/stores of SDmode, restrict it to reg+reg
7714          addressing for the LFIWZX and STFIWX instructions.  */
7715       if (TARGET_NO_SDMODE_STACK)
7716         return false;
7717       break;
7718
7719     default:
7720       break;
7721     }
7722
7723   return true;
7724 }
7725
7726 static bool
7727 virtual_stack_registers_memory_p (rtx op)
7728 {
7729   int regnum;
7730
7731   if (REG_P (op))
7732     regnum = REGNO (op);
7733
7734   else if (GET_CODE (op) == PLUS
7735            && REG_P (XEXP (op, 0))
7736            && CONST_INT_P (XEXP (op, 1)))
7737     regnum = REGNO (XEXP (op, 0));
7738
7739   else
7740     return false;
7741
7742   return (regnum >= FIRST_VIRTUAL_REGISTER
7743           && regnum <= LAST_VIRTUAL_POINTER_REGISTER);
7744 }
7745
7746 /* Return true if a MODE sized memory accesses to OP plus OFFSET
7747    is known to not straddle a 32k boundary.  This function is used
7748    to determine whether -mcmodel=medium code can use TOC pointer
7749    relative addressing for OP.  This means the alignment of the TOC
7750    pointer must also be taken into account, and unfortunately that is
7751    only 8 bytes.  */ 
7752
7753 #ifndef POWERPC64_TOC_POINTER_ALIGNMENT
7754 #define POWERPC64_TOC_POINTER_ALIGNMENT 8
7755 #endif
7756
7757 static bool
7758 offsettable_ok_by_alignment (rtx op, HOST_WIDE_INT offset,
7759                              machine_mode mode)
7760 {
7761   tree decl;
7762   unsigned HOST_WIDE_INT dsize, dalign, lsb, mask;
7763
7764   if (!SYMBOL_REF_P (op))
7765     return false;
7766
7767   /* ISA 3.0 vector d-form addressing is restricted, don't allow
7768      SYMBOL_REF.  */
7769   if (mode_supports_dq_form (mode))
7770     return false;
7771
7772   dsize = GET_MODE_SIZE (mode);
7773   decl = SYMBOL_REF_DECL (op);
7774   if (!decl)
7775     {
7776       if (dsize == 0)
7777         return false;
7778
7779       /* -fsection-anchors loses the original SYMBOL_REF_DECL when
7780          replacing memory addresses with an anchor plus offset.  We
7781          could find the decl by rummaging around in the block->objects
7782          VEC for the given offset but that seems like too much work.  */
7783       dalign = BITS_PER_UNIT;
7784       if (SYMBOL_REF_HAS_BLOCK_INFO_P (op)
7785           && SYMBOL_REF_ANCHOR_P (op)
7786           && SYMBOL_REF_BLOCK (op) != NULL)
7787         {
7788           struct object_block *block = SYMBOL_REF_BLOCK (op);
7789
7790           dalign = block->alignment;
7791           offset += SYMBOL_REF_BLOCK_OFFSET (op);
7792         }
7793       else if (CONSTANT_POOL_ADDRESS_P (op))
7794         {
7795           /* It would be nice to have get_pool_align()..  */
7796           machine_mode cmode = get_pool_mode (op);
7797
7798           dalign = GET_MODE_ALIGNMENT (cmode);
7799         }
7800     }
7801   else if (DECL_P (decl))
7802     {
7803       dalign = DECL_ALIGN (decl);
7804
7805       if (dsize == 0)
7806         {
7807           /* Allow BLKmode when the entire object is known to not
7808              cross a 32k boundary.  */
7809           if (!DECL_SIZE_UNIT (decl))
7810             return false;
7811
7812           if (!tree_fits_uhwi_p (DECL_SIZE_UNIT (decl)))
7813             return false;
7814
7815           dsize = tree_to_uhwi (DECL_SIZE_UNIT (decl));
7816           if (dsize > 32768)
7817             return false;
7818
7819           dalign /= BITS_PER_UNIT;
7820           if (dalign > POWERPC64_TOC_POINTER_ALIGNMENT)
7821             dalign = POWERPC64_TOC_POINTER_ALIGNMENT;
7822           return dalign >= dsize;
7823         }
7824     }
7825   else
7826     gcc_unreachable ();
7827
7828   /* Find how many bits of the alignment we know for this access.  */
7829   dalign /= BITS_PER_UNIT;
7830   if (dalign > POWERPC64_TOC_POINTER_ALIGNMENT)
7831     dalign = POWERPC64_TOC_POINTER_ALIGNMENT;
7832   mask = dalign - 1;
7833   lsb = offset & -offset;
7834   mask &= lsb - 1;
7835   dalign = mask + 1;
7836
7837   return dalign >= dsize;
7838 }
7839
7840 static bool
7841 constant_pool_expr_p (rtx op)
7842 {
7843   rtx base, offset;
7844
7845   split_const (op, &base, &offset);
7846   return (SYMBOL_REF_P (base)
7847           && CONSTANT_POOL_ADDRESS_P (base)
7848           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (base), Pmode));
7849 }
7850
7851 /* These are only used to pass through from print_operand/print_operand_address
7852    to rs6000_output_addr_const_extra over the intervening function
7853    output_addr_const which is not target code.  */
7854 static const_rtx tocrel_base_oac, tocrel_offset_oac;
7855
7856 /* Return true if OP is a toc pointer relative address (the output
7857    of create_TOC_reference).  If STRICT, do not match non-split
7858    -mcmodel=large/medium toc pointer relative addresses.  If the pointers 
7859    are non-NULL, place base and offset pieces in TOCREL_BASE_RET and 
7860    TOCREL_OFFSET_RET respectively.  */
7861
7862 bool
7863 toc_relative_expr_p (const_rtx op, bool strict, const_rtx *tocrel_base_ret,
7864                      const_rtx *tocrel_offset_ret)
7865 {
7866   if (!TARGET_TOC)
7867     return false;
7868
7869   if (TARGET_CMODEL != CMODEL_SMALL)
7870     {
7871       /* When strict ensure we have everything tidy.  */
7872       if (strict
7873           && !(GET_CODE (op) == LO_SUM
7874                && REG_P (XEXP (op, 0))
7875                && INT_REG_OK_FOR_BASE_P (XEXP (op, 0), strict)))
7876         return false;
7877
7878       /* When not strict, allow non-split TOC addresses and also allow
7879          (lo_sum (high ..)) TOC addresses created during reload.  */
7880       if (GET_CODE (op) == LO_SUM)
7881         op = XEXP (op, 1);
7882     }
7883
7884   const_rtx tocrel_base = op;
7885   const_rtx tocrel_offset = const0_rtx;
7886
7887   if (GET_CODE (op) == PLUS && add_cint_operand (XEXP (op, 1), GET_MODE (op)))
7888     {
7889       tocrel_base = XEXP (op, 0);
7890       tocrel_offset = XEXP (op, 1);
7891     }
7892
7893   if (tocrel_base_ret)
7894     *tocrel_base_ret = tocrel_base;
7895   if (tocrel_offset_ret)
7896     *tocrel_offset_ret = tocrel_offset;
7897
7898   return (GET_CODE (tocrel_base) == UNSPEC
7899           && XINT (tocrel_base, 1) == UNSPEC_TOCREL
7900           && REG_P (XVECEXP (tocrel_base, 0, 1))
7901           && REGNO (XVECEXP (tocrel_base, 0, 1)) == TOC_REGISTER);
7902 }
7903
7904 /* Return true if X is a constant pool address, and also for cmodel=medium
7905    if X is a toc-relative address known to be offsettable within MODE.  */
7906
7907 bool
7908 legitimate_constant_pool_address_p (const_rtx x, machine_mode mode,
7909                                     bool strict)
7910 {
7911   const_rtx tocrel_base, tocrel_offset;
7912   return (toc_relative_expr_p (x, strict, &tocrel_base, &tocrel_offset)
7913           && (TARGET_CMODEL != CMODEL_MEDIUM
7914               || constant_pool_expr_p (XVECEXP (tocrel_base, 0, 0))
7915               || mode == QImode
7916               || offsettable_ok_by_alignment (XVECEXP (tocrel_base, 0, 0),
7917                                               INTVAL (tocrel_offset), mode)));
7918 }
7919
7920 static bool
7921 legitimate_small_data_p (machine_mode mode, rtx x)
7922 {
7923   return (DEFAULT_ABI == ABI_V4
7924           && !flag_pic && !TARGET_TOC
7925           && (SYMBOL_REF_P (x) || GET_CODE (x) == CONST)
7926           && small_data_operand (x, mode));
7927 }
7928
7929 bool
7930 rs6000_legitimate_offset_address_p (machine_mode mode, rtx x,
7931                                     bool strict, bool worst_case)
7932 {
7933   unsigned HOST_WIDE_INT offset;
7934   unsigned int extra;
7935
7936   if (GET_CODE (x) != PLUS)
7937     return false;
7938   if (!REG_P (XEXP (x, 0)))
7939     return false;
7940   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
7941     return false;
7942   if (mode_supports_dq_form (mode))
7943     return quad_address_p (x, mode, strict);
7944   if (!reg_offset_addressing_ok_p (mode))
7945     return virtual_stack_registers_memory_p (x);
7946   if (legitimate_constant_pool_address_p (x, mode, strict || lra_in_progress))
7947     return true;
7948   if (!CONST_INT_P (XEXP (x, 1)))
7949     return false;
7950
7951   offset = INTVAL (XEXP (x, 1));
7952   extra = 0;
7953   switch (mode)
7954     {
7955     case E_DFmode:
7956     case E_DDmode:
7957     case E_DImode:
7958       /* If we are using VSX scalar loads, restrict ourselves to reg+reg
7959          addressing.  */
7960       if (VECTOR_MEM_VSX_P (mode))
7961         return false;
7962
7963       if (!worst_case)
7964         break;
7965       if (!TARGET_POWERPC64)
7966         extra = 4;
7967       else if (offset & 3)
7968         return false;
7969       break;
7970
7971     case E_TFmode:
7972     case E_IFmode:
7973     case E_KFmode:
7974     case E_TDmode:
7975     case E_TImode:
7976     case E_PTImode:
7977       extra = 8;
7978       if (!worst_case)
7979         break;
7980       if (!TARGET_POWERPC64)
7981         extra = 12;
7982       else if (offset & 3)
7983         return false;
7984       break;
7985
7986     default:
7987       break;
7988     }
7989
7990   offset += 0x8000;
7991   return offset < 0x10000 - extra;
7992 }
7993
7994 bool
7995 legitimate_indexed_address_p (rtx x, int strict)
7996 {
7997   rtx op0, op1;
7998
7999   if (GET_CODE (x) != PLUS)
8000     return false;
8001
8002   op0 = XEXP (x, 0);
8003   op1 = XEXP (x, 1);
8004
8005   return (REG_P (op0) && REG_P (op1)
8006           && ((INT_REG_OK_FOR_BASE_P (op0, strict)
8007                && INT_REG_OK_FOR_INDEX_P (op1, strict))
8008               || (INT_REG_OK_FOR_BASE_P (op1, strict)
8009                   && INT_REG_OK_FOR_INDEX_P (op0, strict))));
8010 }
8011
8012 bool
8013 avoiding_indexed_address_p (machine_mode mode)
8014 {
8015   /* Avoid indexed addressing for modes that have non-indexed
8016      load/store instruction forms.  */
8017   return (TARGET_AVOID_XFORM && VECTOR_MEM_NONE_P (mode));
8018 }
8019
8020 bool
8021 legitimate_indirect_address_p (rtx x, int strict)
8022 {
8023   return REG_P (x) && INT_REG_OK_FOR_BASE_P (x, strict);
8024 }
8025
8026 bool
8027 macho_lo_sum_memory_operand (rtx x, machine_mode mode)
8028 {
8029   if (!TARGET_MACHO || !flag_pic
8030       || mode != SImode || !MEM_P (x))
8031     return false;
8032   x = XEXP (x, 0);
8033
8034   if (GET_CODE (x) != LO_SUM)
8035     return false;
8036   if (!REG_P (XEXP (x, 0)))
8037     return false;
8038   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
8039     return false;
8040   x = XEXP (x, 1);
8041
8042   return CONSTANT_P (x);
8043 }
8044
8045 static bool
8046 legitimate_lo_sum_address_p (machine_mode mode, rtx x, int strict)
8047 {
8048   if (GET_CODE (x) != LO_SUM)
8049     return false;
8050   if (!REG_P (XEXP (x, 0)))
8051     return false;
8052   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
8053     return false;
8054   /* quad word addresses are restricted, and we can't use LO_SUM.  */
8055   if (mode_supports_dq_form (mode))
8056     return false;
8057   x = XEXP (x, 1);
8058
8059   if (TARGET_ELF || TARGET_MACHO)
8060     {
8061       bool large_toc_ok;
8062
8063       if (DEFAULT_ABI == ABI_V4 && flag_pic)
8064         return false;
8065       /* LRA doesn't use LEGITIMIZE_RELOAD_ADDRESS as it usually calls
8066          push_reload from reload pass code.  LEGITIMIZE_RELOAD_ADDRESS
8067          recognizes some LO_SUM addresses as valid although this
8068          function says opposite.  In most cases, LRA through different
8069          transformations can generate correct code for address reloads.
8070          It cannot manage only some LO_SUM cases.  So we need to add
8071          code here saying that some addresses are still valid.  */
8072       large_toc_ok = (lra_in_progress && TARGET_CMODEL != CMODEL_SMALL
8073                       && small_toc_ref (x, VOIDmode));
8074       if (TARGET_TOC && ! large_toc_ok)
8075         return false;
8076       if (GET_MODE_NUNITS (mode) != 1)
8077         return false;
8078       if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
8079           && !(/* ??? Assume floating point reg based on mode?  */
8080                TARGET_HARD_FLOAT && (mode == DFmode || mode == DDmode)))
8081         return false;
8082
8083       return CONSTANT_P (x) || large_toc_ok;
8084     }
8085
8086   return false;
8087 }
8088
8089
8090 /* Try machine-dependent ways of modifying an illegitimate address
8091    to be legitimate.  If we find one, return the new, valid address.
8092    This is used from only one place: `memory_address' in explow.c.
8093
8094    OLDX is the address as it was before break_out_memory_refs was
8095    called.  In some cases it is useful to look at this to decide what
8096    needs to be done.
8097
8098    It is always safe for this function to do nothing.  It exists to
8099    recognize opportunities to optimize the output.
8100
8101    On RS/6000, first check for the sum of a register with a constant
8102    integer that is out of range.  If so, generate code to add the
8103    constant with the low-order 16 bits masked to the register and force
8104    this result into another register (this can be done with `cau').
8105    Then generate an address of REG+(CONST&0xffff), allowing for the
8106    possibility of bit 16 being a one.
8107
8108    Then check for the sum of a register and something not constant, try to
8109    load the other things into a register and return the sum.  */
8110
8111 static rtx
8112 rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
8113                            machine_mode mode)
8114 {
8115   unsigned int extra;
8116
8117   if (!reg_offset_addressing_ok_p (mode)
8118       || mode_supports_dq_form (mode))
8119     {
8120       if (virtual_stack_registers_memory_p (x))
8121         return x;
8122
8123       /* In theory we should not be seeing addresses of the form reg+0,
8124          but just in case it is generated, optimize it away.  */
8125       if (GET_CODE (x) == PLUS && XEXP (x, 1) == const0_rtx)
8126         return force_reg (Pmode, XEXP (x, 0));
8127
8128       /* For TImode with load/store quad, restrict addresses to just a single
8129          pointer, so it works with both GPRs and VSX registers.  */
8130       /* Make sure both operands are registers.  */
8131       else if (GET_CODE (x) == PLUS
8132                && (mode != TImode || !TARGET_VSX))
8133         return gen_rtx_PLUS (Pmode,
8134                              force_reg (Pmode, XEXP (x, 0)),
8135                              force_reg (Pmode, XEXP (x, 1)));
8136       else
8137         return force_reg (Pmode, x);
8138     }
8139   if (SYMBOL_REF_P (x))
8140     {
8141       enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
8142       if (model != 0)
8143         return rs6000_legitimize_tls_address (x, model);
8144     }
8145
8146   extra = 0;
8147   switch (mode)
8148     {
8149     case E_TFmode:
8150     case E_TDmode:
8151     case E_TImode:
8152     case E_PTImode:
8153     case E_IFmode:
8154     case E_KFmode:
8155       /* As in legitimate_offset_address_p we do not assume
8156          worst-case.  The mode here is just a hint as to the registers
8157          used.  A TImode is usually in gprs, but may actually be in
8158          fprs.  Leave worst-case scenario for reload to handle via
8159          insn constraints.  PTImode is only GPRs.  */
8160       extra = 8;
8161       break;
8162     default:
8163       break;
8164     }
8165
8166   if (GET_CODE (x) == PLUS
8167       && REG_P (XEXP (x, 0))
8168       && CONST_INT_P (XEXP (x, 1))
8169       && ((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000)
8170           >= 0x10000 - extra))
8171     {
8172       HOST_WIDE_INT high_int, low_int;
8173       rtx sum;
8174       low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
8175       if (low_int >= 0x8000 - extra)
8176         low_int = 0;
8177       high_int = INTVAL (XEXP (x, 1)) - low_int;
8178       sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
8179                                          GEN_INT (high_int)), 0);
8180       return plus_constant (Pmode, sum, low_int);
8181     }
8182   else if (GET_CODE (x) == PLUS
8183            && REG_P (XEXP (x, 0))
8184            && !CONST_INT_P (XEXP (x, 1))
8185            && GET_MODE_NUNITS (mode) == 1
8186            && (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
8187                || (/* ??? Assume floating point reg based on mode?  */
8188                    TARGET_HARD_FLOAT && (mode == DFmode || mode == DDmode)))
8189            && !avoiding_indexed_address_p (mode))
8190     {
8191       return gen_rtx_PLUS (Pmode, XEXP (x, 0),
8192                            force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
8193     }
8194   else if ((TARGET_ELF
8195 #if TARGET_MACHO
8196             || !MACHO_DYNAMIC_NO_PIC_P
8197 #endif
8198             )
8199            && TARGET_32BIT
8200            && TARGET_NO_TOC
8201            && !flag_pic
8202            && !CONST_INT_P (x)
8203            && !CONST_WIDE_INT_P (x)
8204            && !CONST_DOUBLE_P (x)
8205            && CONSTANT_P (x)
8206            && GET_MODE_NUNITS (mode) == 1
8207            && (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
8208                || (/* ??? Assume floating point reg based on mode?  */
8209                    TARGET_HARD_FLOAT && (mode == DFmode || mode == DDmode))))
8210     {
8211       rtx reg = gen_reg_rtx (Pmode);
8212       if (TARGET_ELF)
8213         emit_insn (gen_elf_high (reg, x));
8214       else
8215         emit_insn (gen_macho_high (reg, x));
8216       return gen_rtx_LO_SUM (Pmode, reg, x);
8217     }
8218   else if (TARGET_TOC
8219            && SYMBOL_REF_P (x)
8220            && constant_pool_expr_p (x)
8221            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
8222     return create_TOC_reference (x, NULL_RTX);
8223   else
8224     return x;
8225 }
8226
8227 /* Debug version of rs6000_legitimize_address.  */
8228 static rtx
8229 rs6000_debug_legitimize_address (rtx x, rtx oldx, machine_mode mode)
8230 {
8231   rtx ret;
8232   rtx_insn *insns;
8233
8234   start_sequence ();
8235   ret = rs6000_legitimize_address (x, oldx, mode);
8236   insns = get_insns ();
8237   end_sequence ();
8238
8239   if (ret != x)
8240     {
8241       fprintf (stderr,
8242                "\nrs6000_legitimize_address: mode %s, old code %s, "
8243                "new code %s, modified\n",
8244                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)),
8245                GET_RTX_NAME (GET_CODE (ret)));
8246
8247       fprintf (stderr, "Original address:\n");
8248       debug_rtx (x);
8249
8250       fprintf (stderr, "oldx:\n");
8251       debug_rtx (oldx);
8252
8253       fprintf (stderr, "New address:\n");
8254       debug_rtx (ret);
8255
8256       if (insns)
8257         {
8258           fprintf (stderr, "Insns added:\n");
8259           debug_rtx_list (insns, 20);
8260         }
8261     }
8262   else
8263     {
8264       fprintf (stderr,
8265                "\nrs6000_legitimize_address: mode %s, code %s, no change:\n",
8266                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)));
8267
8268       debug_rtx (x);
8269     }
8270
8271   if (insns)
8272     emit_insn (insns);
8273
8274   return ret;
8275 }
8276
8277 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
8278    We need to emit DTP-relative relocations.  */
8279
8280 static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
8281 static void
8282 rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
8283 {
8284   switch (size)
8285     {
8286     case 4:
8287       fputs ("\t.long\t", file);
8288       break;
8289     case 8:
8290       fputs (DOUBLE_INT_ASM_OP, file);
8291       break;
8292     default:
8293       gcc_unreachable ();
8294     }
8295   output_addr_const (file, x);
8296   if (TARGET_ELF)
8297     fputs ("@dtprel+0x8000", file);
8298   else if (TARGET_XCOFF && SYMBOL_REF_P (x))
8299     {
8300       switch (SYMBOL_REF_TLS_MODEL (x))
8301         {
8302         case 0:
8303           break;
8304         case TLS_MODEL_LOCAL_EXEC:
8305           fputs ("@le", file);
8306           break;
8307         case TLS_MODEL_INITIAL_EXEC:
8308           fputs ("@ie", file);
8309           break;
8310         case TLS_MODEL_GLOBAL_DYNAMIC:
8311         case TLS_MODEL_LOCAL_DYNAMIC:
8312           fputs ("@m", file);
8313           break;
8314         default:
8315           gcc_unreachable ();
8316         }
8317     }
8318 }
8319
8320 /* Return true if X is a symbol that refers to real (rather than emulated)
8321    TLS.  */
8322
8323 static bool
8324 rs6000_real_tls_symbol_ref_p (rtx x)
8325 {
8326   return (SYMBOL_REF_P (x)
8327           && SYMBOL_REF_TLS_MODEL (x) >= TLS_MODEL_REAL);
8328 }
8329
8330 /* In the name of slightly smaller debug output, and to cater to
8331    general assembler lossage, recognize various UNSPEC sequences
8332    and turn them back into a direct symbol reference.  */
8333
8334 static rtx
8335 rs6000_delegitimize_address (rtx orig_x)
8336 {
8337   rtx x, y, offset;
8338
8339   if (GET_CODE (orig_x) == UNSPEC && XINT (orig_x, 1) == UNSPEC_FUSION_GPR)
8340     orig_x = XVECEXP (orig_x, 0, 0);
8341
8342   orig_x = delegitimize_mem_from_attrs (orig_x);
8343
8344   x = orig_x;
8345   if (MEM_P (x))
8346     x = XEXP (x, 0);
8347
8348   y = x;
8349   if (TARGET_CMODEL != CMODEL_SMALL && GET_CODE (y) == LO_SUM)
8350     y = XEXP (y, 1);
8351
8352   offset = NULL_RTX;
8353   if (GET_CODE (y) == PLUS
8354       && GET_MODE (y) == Pmode
8355       && CONST_INT_P (XEXP (y, 1)))
8356     {
8357       offset = XEXP (y, 1);
8358       y = XEXP (y, 0);
8359     }
8360
8361   if (GET_CODE (y) == UNSPEC && XINT (y, 1) == UNSPEC_TOCREL)
8362     {
8363       y = XVECEXP (y, 0, 0);
8364
8365 #ifdef HAVE_AS_TLS
8366       /* Do not associate thread-local symbols with the original
8367          constant pool symbol.  */
8368       if (TARGET_XCOFF
8369           && SYMBOL_REF_P (y)
8370           && CONSTANT_POOL_ADDRESS_P (y)
8371           && rs6000_real_tls_symbol_ref_p (get_pool_constant (y)))
8372         return orig_x;
8373 #endif
8374
8375       if (offset != NULL_RTX)
8376         y = gen_rtx_PLUS (Pmode, y, offset);
8377       if (!MEM_P (orig_x))
8378         return y;
8379       else
8380         return replace_equiv_address_nv (orig_x, y);
8381     }
8382
8383   if (TARGET_MACHO
8384       && GET_CODE (orig_x) == LO_SUM
8385       && GET_CODE (XEXP (orig_x, 1)) == CONST)
8386     {
8387       y = XEXP (XEXP (orig_x, 1), 0);
8388       if (GET_CODE (y) == UNSPEC && XINT (y, 1) == UNSPEC_MACHOPIC_OFFSET)
8389         return XVECEXP (y, 0, 0);
8390     }
8391
8392   return orig_x;
8393 }
8394
8395 /* Return true if X shouldn't be emitted into the debug info.
8396    The linker doesn't like .toc section references from
8397    .debug_* sections, so reject .toc section symbols.  */
8398
8399 static bool
8400 rs6000_const_not_ok_for_debug_p (rtx x)
8401 {
8402   if (GET_CODE (x) == UNSPEC)
8403     return true;
8404   if (SYMBOL_REF_P (x)
8405       && CONSTANT_POOL_ADDRESS_P (x))
8406     {
8407       rtx c = get_pool_constant (x);
8408       machine_mode cmode = get_pool_mode (x);
8409       if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (c, cmode))
8410         return true;
8411     }
8412
8413   return false;
8414 }
8415
8416 /* Implement the TARGET_LEGITIMATE_COMBINED_INSN hook.  */
8417
8418 static bool
8419 rs6000_legitimate_combined_insn (rtx_insn *insn)
8420 {
8421   int icode = INSN_CODE (insn);
8422
8423   /* Reject creating doloop insns.  Combine should not be allowed
8424      to create these for a number of reasons:
8425      1) In a nested loop, if combine creates one of these in an
8426      outer loop and the register allocator happens to allocate ctr
8427      to the outer loop insn, then the inner loop can't use ctr.
8428      Inner loops ought to be more highly optimized.
8429      2) Combine often wants to create one of these from what was
8430      originally a three insn sequence, first combining the three
8431      insns to two, then to ctrsi/ctrdi.  When ctrsi/ctrdi is not
8432      allocated ctr, the splitter takes use back to the three insn
8433      sequence.  It's better to stop combine at the two insn
8434      sequence.
8435      3) Faced with not being able to allocate ctr for ctrsi/crtdi
8436      insns, the register allocator sometimes uses floating point
8437      or vector registers for the pseudo.  Since ctrsi/ctrdi is a
8438      jump insn and output reloads are not implemented for jumps,
8439      the ctrsi/ctrdi splitters need to handle all possible cases.
8440      That's a pain, and it gets to be seriously difficult when a
8441      splitter that runs after reload needs memory to transfer from
8442      a gpr to fpr.  See PR70098 and PR71763 which are not fixed
8443      for the difficult case.  It's better to not create problems
8444      in the first place.  */
8445   if (icode != CODE_FOR_nothing
8446       && (icode == CODE_FOR_bdz_si
8447           || icode == CODE_FOR_bdz_di
8448           || icode == CODE_FOR_bdnz_si
8449           || icode == CODE_FOR_bdnz_di
8450           || icode == CODE_FOR_bdztf_si
8451           || icode == CODE_FOR_bdztf_di
8452           || icode == CODE_FOR_bdnztf_si
8453           || icode == CODE_FOR_bdnztf_di))
8454     return false;
8455
8456   return true;
8457 }
8458
8459 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
8460
8461 static GTY(()) rtx rs6000_tls_symbol;
8462 static rtx
8463 rs6000_tls_get_addr (void)
8464 {
8465   if (!rs6000_tls_symbol)
8466     rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
8467
8468   return rs6000_tls_symbol;
8469 }
8470
8471 /* Construct the SYMBOL_REF for TLS GOT references.  */
8472
8473 static GTY(()) rtx rs6000_got_symbol;
8474 static rtx
8475 rs6000_got_sym (void)
8476 {
8477   if (!rs6000_got_symbol)
8478     {
8479       rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
8480       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
8481       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
8482     }
8483
8484   return rs6000_got_symbol;
8485 }
8486
8487 /* AIX Thread-Local Address support.  */
8488
8489 static rtx
8490 rs6000_legitimize_tls_address_aix (rtx addr, enum tls_model model)
8491 {
8492   rtx sym, mem, tocref, tlsreg, tmpreg, dest, tlsaddr;
8493   const char *name;
8494   char *tlsname;
8495
8496   name = XSTR (addr, 0);
8497   /* Append TLS CSECT qualifier, unless the symbol already is qualified
8498      or the symbol will be in TLS private data section.  */
8499   if (name[strlen (name) - 1] != ']'
8500       && (TREE_PUBLIC (SYMBOL_REF_DECL (addr))
8501           || bss_initializer_p (SYMBOL_REF_DECL (addr))))
8502     {
8503       tlsname = XALLOCAVEC (char, strlen (name) + 4);
8504       strcpy (tlsname, name);
8505       strcat (tlsname,
8506               bss_initializer_p (SYMBOL_REF_DECL (addr)) ? "[UL]" : "[TL]");
8507       tlsaddr = copy_rtx (addr);
8508       XSTR (tlsaddr, 0) = ggc_strdup (tlsname);
8509     }
8510   else
8511     tlsaddr = addr;
8512
8513   /* Place addr into TOC constant pool.  */
8514   sym = force_const_mem (GET_MODE (tlsaddr), tlsaddr);
8515
8516   /* Output the TOC entry and create the MEM referencing the value.  */
8517   if (constant_pool_expr_p (XEXP (sym, 0))
8518       && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (XEXP (sym, 0)), Pmode))
8519     {
8520       tocref = create_TOC_reference (XEXP (sym, 0), NULL_RTX);
8521       mem = gen_const_mem (Pmode, tocref);
8522       set_mem_alias_set (mem, get_TOC_alias_set ());
8523     }
8524   else
8525     return sym;
8526
8527   /* Use global-dynamic for local-dynamic.  */
8528   if (model == TLS_MODEL_GLOBAL_DYNAMIC
8529       || model == TLS_MODEL_LOCAL_DYNAMIC)
8530     {
8531       /* Create new TOC reference for @m symbol.  */
8532       name = XSTR (XVECEXP (XEXP (mem, 0), 0, 0), 0);
8533       tlsname = XALLOCAVEC (char, strlen (name) + 1);
8534       strcpy (tlsname, "*LCM");
8535       strcat (tlsname, name + 3);
8536       rtx modaddr = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (tlsname));
8537       SYMBOL_REF_FLAGS (modaddr) |= SYMBOL_FLAG_LOCAL;
8538       tocref = create_TOC_reference (modaddr, NULL_RTX);
8539       rtx modmem = gen_const_mem (Pmode, tocref);
8540       set_mem_alias_set (modmem, get_TOC_alias_set ());
8541       
8542       rtx modreg = gen_reg_rtx (Pmode);
8543       emit_insn (gen_rtx_SET (modreg, modmem));
8544
8545       tmpreg = gen_reg_rtx (Pmode);
8546       emit_insn (gen_rtx_SET (tmpreg, mem));
8547
8548       dest = gen_reg_rtx (Pmode);
8549       if (TARGET_32BIT)
8550         emit_insn (gen_tls_get_addrsi (dest, modreg, tmpreg));
8551       else
8552         emit_insn (gen_tls_get_addrdi (dest, modreg, tmpreg));
8553       return dest;
8554     }
8555   /* Obtain TLS pointer: 32 bit call or 64 bit GPR 13.  */
8556   else if (TARGET_32BIT)
8557     {
8558       tlsreg = gen_reg_rtx (SImode);
8559       emit_insn (gen_tls_get_tpointer (tlsreg));
8560     }
8561   else
8562     tlsreg = gen_rtx_REG (DImode, 13);
8563
8564   /* Load the TOC value into temporary register.  */
8565   tmpreg = gen_reg_rtx (Pmode);
8566   emit_insn (gen_rtx_SET (tmpreg, mem));
8567   set_unique_reg_note (get_last_insn (), REG_EQUAL,
8568                        gen_rtx_MINUS (Pmode, addr, tlsreg));
8569
8570   /* Add TOC symbol value to TLS pointer.  */
8571   dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tmpreg, tlsreg));
8572
8573   return dest;
8574 }
8575
8576 /* Output arg setup instructions for a !TARGET_TLS_MARKERS
8577    __tls_get_addr call.  */
8578
8579 void
8580 rs6000_output_tlsargs (rtx *operands)
8581 {
8582   /* Set up operands for output_asm_insn, without modifying OPERANDS.  */
8583   rtx op[3];
8584
8585   /* The set dest of the call, ie. r3, which is also the first arg reg.  */
8586   op[0] = operands[0];
8587   /* The TLS symbol from global_tlsarg stashed as CALL operand 2.  */
8588   op[1] = XVECEXP (operands[2], 0, 0);
8589   if (XINT (operands[2], 1) == UNSPEC_TLSGD)
8590     {
8591       /* The GOT register.  */
8592       op[2] = XVECEXP (operands[2], 0, 1);
8593       if (TARGET_CMODEL != CMODEL_SMALL)
8594         output_asm_insn ("addis %0,%2,%1@got@tlsgd@ha\n\t"
8595                          "addi %0,%0,%1@got@tlsgd@l", op);
8596       else
8597         output_asm_insn ("addi %0,%2,%1@got@tlsgd", op);
8598     }
8599   else if (XINT (operands[2], 1) == UNSPEC_TLSLD)
8600     {
8601       if (TARGET_CMODEL != CMODEL_SMALL)
8602         output_asm_insn ("addis %0,%1,%&@got@tlsld@ha\n\t"
8603                          "addi %0,%0,%&@got@tlsld@l", op);
8604       else
8605         output_asm_insn ("addi %0,%1,%&@got@tlsld", op);
8606     }
8607   else
8608     gcc_unreachable ();
8609 }
8610
8611 /* Passes the tls arg value for global dynamic and local dynamic
8612    emit_library_call_value in rs6000_legitimize_tls_address to
8613    rs6000_call_aix and rs6000_call_sysv.  This is used to emit the
8614    marker relocs put on __tls_get_addr calls.  */
8615 static rtx global_tlsarg;
8616
8617 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
8618    this (thread-local) address.  */
8619
8620 static rtx
8621 rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
8622 {
8623   rtx dest, insn;
8624
8625   if (TARGET_XCOFF)
8626     return rs6000_legitimize_tls_address_aix (addr, model);
8627
8628   dest = gen_reg_rtx (Pmode);
8629   if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
8630     {
8631       rtx tlsreg;
8632
8633       if (TARGET_64BIT)
8634         {
8635           tlsreg = gen_rtx_REG (Pmode, 13);
8636           insn = gen_tls_tprel_64 (dest, tlsreg, addr);
8637         }
8638       else
8639         {
8640           tlsreg = gen_rtx_REG (Pmode, 2);
8641           insn = gen_tls_tprel_32 (dest, tlsreg, addr);
8642         }
8643       emit_insn (insn);
8644     }
8645   else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
8646     {
8647       rtx tlsreg, tmp;
8648
8649       tmp = gen_reg_rtx (Pmode);
8650       if (TARGET_64BIT)
8651         {
8652           tlsreg = gen_rtx_REG (Pmode, 13);
8653           insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
8654         }
8655       else
8656         {
8657           tlsreg = gen_rtx_REG (Pmode, 2);
8658           insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
8659         }
8660       emit_insn (insn);
8661       if (TARGET_64BIT)
8662         insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
8663       else
8664         insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
8665       emit_insn (insn);
8666     }
8667   else
8668     {
8669       rtx got, tga, tmp1, tmp2;
8670
8671       /* We currently use relocations like @got@tlsgd for tls, which
8672          means the linker will handle allocation of tls entries, placing
8673          them in the .got section.  So use a pointer to the .got section,
8674          not one to secondary TOC sections used by 64-bit -mminimal-toc,
8675          or to secondary GOT sections used by 32-bit -fPIC.  */
8676       if (TARGET_64BIT)
8677         got = gen_rtx_REG (Pmode, 2);
8678       else
8679         {
8680           if (flag_pic == 1)
8681             got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
8682           else
8683             {
8684               rtx gsym = rs6000_got_sym ();
8685               got = gen_reg_rtx (Pmode);
8686               if (flag_pic == 0)
8687                 rs6000_emit_move (got, gsym, Pmode);
8688               else
8689                 {
8690                   rtx mem, lab;
8691
8692                   tmp1 = gen_reg_rtx (Pmode);
8693                   tmp2 = gen_reg_rtx (Pmode);
8694                   mem = gen_const_mem (Pmode, tmp1);
8695                   lab = gen_label_rtx ();
8696                   emit_insn (gen_load_toc_v4_PIC_1b (gsym, lab));
8697                   emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
8698                   if (TARGET_LINK_STACK)
8699                     emit_insn (gen_addsi3 (tmp1, tmp1, GEN_INT (4)));
8700                   emit_move_insn (tmp2, mem);
8701                   rtx_insn *last = emit_insn (gen_addsi3 (got, tmp1, tmp2));
8702                   set_unique_reg_note (last, REG_EQUAL, gsym);
8703                 }
8704             }
8705         }
8706
8707       if (model == TLS_MODEL_GLOBAL_DYNAMIC)
8708         {
8709           rtx arg = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, addr, got),
8710                                     UNSPEC_TLSGD);
8711           tga = rs6000_tls_get_addr ();
8712           global_tlsarg = arg;
8713           if (TARGET_TLS_MARKERS)
8714             {
8715               rtx argreg = gen_rtx_REG (Pmode, 3);
8716               emit_insn (gen_rtx_SET (argreg, arg));
8717               emit_library_call_value (tga, dest, LCT_CONST, Pmode,
8718                                        argreg, Pmode);
8719             }
8720           else
8721             emit_library_call_value (tga, dest, LCT_CONST, Pmode);
8722           global_tlsarg = NULL_RTX;
8723
8724           /* Make a note so that the result of this call can be CSEd.  */
8725           rtvec vec = gen_rtvec (1, copy_rtx (arg));
8726           rtx uns = gen_rtx_UNSPEC (Pmode, vec, UNSPEC_TLS_GET_ADDR);
8727           set_unique_reg_note (get_last_insn (), REG_EQUAL, uns);
8728         }
8729       else if (model == TLS_MODEL_LOCAL_DYNAMIC)
8730         {
8731           rtx arg = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, got), UNSPEC_TLSLD);
8732           tga = rs6000_tls_get_addr ();
8733           tmp1 = gen_reg_rtx (Pmode);
8734           global_tlsarg = arg;
8735           if (TARGET_TLS_MARKERS)
8736             {
8737               rtx argreg = gen_rtx_REG (Pmode, 3);
8738               emit_insn (gen_rtx_SET (argreg, arg));
8739               emit_library_call_value (tga, tmp1, LCT_CONST, Pmode,
8740                                        argreg, Pmode);
8741             }
8742           else
8743             emit_library_call_value (tga, tmp1, LCT_CONST, Pmode);
8744           global_tlsarg = NULL_RTX;
8745
8746           /* Make a note so that the result of this call can be CSEd.  */
8747           rtvec vec = gen_rtvec (1, copy_rtx (arg));
8748           rtx uns = gen_rtx_UNSPEC (Pmode, vec, UNSPEC_TLS_GET_ADDR);
8749           set_unique_reg_note (get_last_insn (), REG_EQUAL, uns);
8750
8751           if (rs6000_tls_size == 16)
8752             {
8753               if (TARGET_64BIT)
8754                 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
8755               else
8756                 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
8757             }
8758           else if (rs6000_tls_size == 32)
8759             {
8760               tmp2 = gen_reg_rtx (Pmode);
8761               if (TARGET_64BIT)
8762                 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
8763               else
8764                 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
8765               emit_insn (insn);
8766               if (TARGET_64BIT)
8767                 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
8768               else
8769                 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
8770             }
8771           else
8772             {
8773               tmp2 = gen_reg_rtx (Pmode);
8774               if (TARGET_64BIT)
8775                 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
8776               else
8777                 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
8778               emit_insn (insn);
8779               insn = gen_rtx_SET (dest, gen_rtx_PLUS (Pmode, tmp2, tmp1));
8780             }
8781           emit_insn (insn);
8782         }
8783       else
8784         {
8785           /* IE, or 64-bit offset LE.  */
8786           tmp2 = gen_reg_rtx (Pmode);
8787           if (TARGET_64BIT)
8788             insn = gen_tls_got_tprel_64 (tmp2, got, addr);
8789           else
8790             insn = gen_tls_got_tprel_32 (tmp2, got, addr);
8791           emit_insn (insn);
8792           if (TARGET_64BIT)
8793             insn = gen_tls_tls_64 (dest, tmp2, addr);
8794           else
8795             insn = gen_tls_tls_32 (dest, tmp2, addr);
8796           emit_insn (insn);
8797         }
8798     }
8799
8800   return dest;
8801 }
8802
8803 /* Only create the global variable for the stack protect guard if we are using
8804    the global flavor of that guard.  */
8805 static tree
8806 rs6000_init_stack_protect_guard (void)
8807 {
8808   if (rs6000_stack_protector_guard == SSP_GLOBAL)
8809     return default_stack_protect_guard ();
8810
8811   return NULL_TREE;
8812 }
8813
8814 /* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
8815
8816 static bool
8817 rs6000_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
8818 {
8819   if (GET_CODE (x) == HIGH
8820       && GET_CODE (XEXP (x, 0)) == UNSPEC)
8821     return true;
8822
8823   /* A TLS symbol in the TOC cannot contain a sum.  */
8824   if (GET_CODE (x) == CONST
8825       && GET_CODE (XEXP (x, 0)) == PLUS
8826       && SYMBOL_REF_P (XEXP (XEXP (x, 0), 0))
8827       && SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0)) != 0)
8828     return true;
8829
8830   /* Do not place an ELF TLS symbol in the constant pool.  */
8831   return TARGET_ELF && tls_referenced_p (x);
8832 }
8833
8834 /* Return true iff the given SYMBOL_REF refers to a constant pool entry
8835    that we have put in the TOC, or for cmodel=medium, if the SYMBOL_REF
8836    can be addressed relative to the toc pointer.  */
8837
8838 static bool
8839 use_toc_relative_ref (rtx sym, machine_mode mode)
8840 {
8841   return ((constant_pool_expr_p (sym)
8842            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (sym),
8843                                                get_pool_mode (sym)))
8844           || (TARGET_CMODEL == CMODEL_MEDIUM
8845               && SYMBOL_REF_LOCAL_P (sym)
8846               && GET_MODE_SIZE (mode) <= POWERPC64_TOC_POINTER_ALIGNMENT));
8847 }
8848
8849 /* TARGET_LEGITIMATE_ADDRESS_P recognizes an RTL expression
8850    that is a valid memory address for an instruction.
8851    The MODE argument is the machine mode for the MEM expression
8852    that wants to use this address.
8853
8854    On the RS/6000, there are four valid address: a SYMBOL_REF that
8855    refers to a constant pool entry of an address (or the sum of it
8856    plus a constant), a short (16-bit signed) constant plus a register,
8857    the sum of two registers, or a register indirect, possibly with an
8858    auto-increment.  For DFmode, DDmode and DImode with a constant plus
8859    register, we must ensure that both words are addressable or PowerPC64
8860    with offset word aligned.
8861
8862    For modes spanning multiple registers (DFmode and DDmode in 32-bit GPRs,
8863    32-bit DImode, TImode, TFmode, TDmode), indexed addressing cannot be used
8864    because adjacent memory cells are accessed by adding word-sized offsets
8865    during assembly output.  */
8866 static bool
8867 rs6000_legitimate_address_p (machine_mode mode, rtx x, bool reg_ok_strict)
8868 {
8869   bool reg_offset_p = reg_offset_addressing_ok_p (mode);
8870   bool quad_offset_p = mode_supports_dq_form (mode);
8871
8872   /* If this is an unaligned stvx/ldvx type address, discard the outer AND.  */
8873   if (VECTOR_MEM_ALTIVEC_P (mode)
8874       && GET_CODE (x) == AND
8875       && CONST_INT_P (XEXP (x, 1))
8876       && INTVAL (XEXP (x, 1)) == -16)
8877     x = XEXP (x, 0);
8878
8879   if (TARGET_ELF && RS6000_SYMBOL_REF_TLS_P (x))
8880     return 0;
8881   if (legitimate_indirect_address_p (x, reg_ok_strict))
8882     return 1;
8883   if (TARGET_UPDATE
8884       && (GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
8885       && mode_supports_pre_incdec_p (mode)
8886       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
8887     return 1;
8888   /* Handle restricted vector d-form offsets in ISA 3.0.  */
8889   if (quad_offset_p)
8890     {
8891       if (quad_address_p (x, mode, reg_ok_strict))
8892         return 1;
8893     }
8894   else if (virtual_stack_registers_memory_p (x))
8895     return 1;
8896
8897   else if (reg_offset_p)
8898     {
8899       if (legitimate_small_data_p (mode, x))
8900         return 1;
8901       if (legitimate_constant_pool_address_p (x, mode,
8902                                              reg_ok_strict || lra_in_progress))
8903         return 1;
8904     }
8905
8906   /* For TImode, if we have TImode in VSX registers, only allow register
8907      indirect addresses.  This will allow the values to go in either GPRs
8908      or VSX registers without reloading.  The vector types would tend to
8909      go into VSX registers, so we allow REG+REG, while TImode seems
8910      somewhat split, in that some uses are GPR based, and some VSX based.  */
8911   /* FIXME: We could loosen this by changing the following to
8912        if (mode == TImode && TARGET_QUAD_MEMORY && TARGET_VSX)
8913      but currently we cannot allow REG+REG addressing for TImode.  See
8914      PR72827 for complete details on how this ends up hoodwinking DSE.  */
8915   if (mode == TImode && TARGET_VSX)
8916     return 0;
8917   /* If not REG_OK_STRICT (before reload) let pass any stack offset.  */
8918   if (! reg_ok_strict
8919       && reg_offset_p
8920       && GET_CODE (x) == PLUS
8921       && REG_P (XEXP (x, 0))
8922       && (XEXP (x, 0) == virtual_stack_vars_rtx
8923           || XEXP (x, 0) == arg_pointer_rtx)
8924       && CONST_INT_P (XEXP (x, 1)))
8925     return 1;
8926   if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict, false))
8927     return 1;
8928   if (!FLOAT128_2REG_P (mode)
8929       && (TARGET_HARD_FLOAT
8930           || TARGET_POWERPC64
8931           || (mode != DFmode && mode != DDmode))
8932       && (TARGET_POWERPC64 || mode != DImode)
8933       && (mode != TImode || VECTOR_MEM_VSX_P (TImode))
8934       && mode != PTImode
8935       && !avoiding_indexed_address_p (mode)
8936       && legitimate_indexed_address_p (x, reg_ok_strict))
8937     return 1;
8938   if (TARGET_UPDATE && GET_CODE (x) == PRE_MODIFY
8939       && mode_supports_pre_modify_p (mode)
8940       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict)
8941       && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1),
8942                                               reg_ok_strict, false)
8943           || (!avoiding_indexed_address_p (mode)
8944               && legitimate_indexed_address_p (XEXP (x, 1), reg_ok_strict)))
8945       && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
8946     return 1;
8947   if (reg_offset_p && !quad_offset_p
8948       && legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
8949     return 1;
8950   return 0;
8951 }
8952
8953 /* Debug version of rs6000_legitimate_address_p.  */
8954 static bool
8955 rs6000_debug_legitimate_address_p (machine_mode mode, rtx x,
8956                                    bool reg_ok_strict)
8957 {
8958   bool ret = rs6000_legitimate_address_p (mode, x, reg_ok_strict);
8959   fprintf (stderr,
8960            "\nrs6000_legitimate_address_p: return = %s, mode = %s, "
8961            "strict = %d, reload = %s, code = %s\n",
8962            ret ? "true" : "false",
8963            GET_MODE_NAME (mode),
8964            reg_ok_strict,
8965            (reload_completed ? "after" : "before"),
8966            GET_RTX_NAME (GET_CODE (x)));
8967   debug_rtx (x);
8968
8969   return ret;
8970 }
8971
8972 /* Implement TARGET_MODE_DEPENDENT_ADDRESS_P.  */
8973
8974 static bool
8975 rs6000_mode_dependent_address_p (const_rtx addr,
8976                                  addr_space_t as ATTRIBUTE_UNUSED)
8977 {
8978   return rs6000_mode_dependent_address_ptr (addr);
8979 }
8980
8981 /* Go to LABEL if ADDR (a legitimate address expression)
8982    has an effect that depends on the machine mode it is used for.
8983
8984    On the RS/6000 this is true of all integral offsets (since AltiVec
8985    and VSX modes don't allow them) or is a pre-increment or decrement.
8986
8987    ??? Except that due to conceptual problems in offsettable_address_p
8988    we can't really report the problems of integral offsets.  So leave
8989    this assuming that the adjustable offset must be valid for the
8990    sub-words of a TFmode operand, which is what we had before.  */
8991
8992 static bool
8993 rs6000_mode_dependent_address (const_rtx addr)
8994 {
8995   switch (GET_CODE (addr))
8996     {
8997     case PLUS:
8998       /* Any offset from virtual_stack_vars_rtx and arg_pointer_rtx
8999          is considered a legitimate address before reload, so there
9000          are no offset restrictions in that case.  Note that this
9001          condition is safe in strict mode because any address involving
9002          virtual_stack_vars_rtx or arg_pointer_rtx would already have
9003          been rejected as illegitimate.  */
9004       if (XEXP (addr, 0) != virtual_stack_vars_rtx
9005           && XEXP (addr, 0) != arg_pointer_rtx
9006           && CONST_INT_P (XEXP (addr, 1)))
9007         {
9008           unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
9009           return val + 0x8000 >= 0x10000 - (TARGET_POWERPC64 ? 8 : 12);
9010         }
9011       break;
9012
9013     case LO_SUM:
9014       /* Anything in the constant pool is sufficiently aligned that
9015          all bytes have the same high part address.  */
9016       return !legitimate_constant_pool_address_p (addr, QImode, false);
9017
9018     /* Auto-increment cases are now treated generically in recog.c.  */
9019     case PRE_MODIFY:
9020       return TARGET_UPDATE;
9021
9022     /* AND is only allowed in Altivec loads.  */
9023     case AND:
9024       return true;
9025
9026     default:
9027       break;
9028     }
9029
9030   return false;
9031 }
9032
9033 /* Debug version of rs6000_mode_dependent_address.  */
9034 static bool
9035 rs6000_debug_mode_dependent_address (const_rtx addr)
9036 {
9037   bool ret = rs6000_mode_dependent_address (addr);
9038
9039   fprintf (stderr, "\nrs6000_mode_dependent_address: ret = %s\n",
9040            ret ? "true" : "false");
9041   debug_rtx (addr);
9042
9043   return ret;
9044 }
9045
9046 /* Implement FIND_BASE_TERM.  */
9047
9048 rtx
9049 rs6000_find_base_term (rtx op)
9050 {
9051   rtx base;
9052
9053   base = op;
9054   if (GET_CODE (base) == CONST)
9055     base = XEXP (base, 0);
9056   if (GET_CODE (base) == PLUS)
9057     base = XEXP (base, 0);
9058   if (GET_CODE (base) == UNSPEC)
9059     switch (XINT (base, 1))
9060       {
9061       case UNSPEC_TOCREL:
9062       case UNSPEC_MACHOPIC_OFFSET:
9063         /* OP represents SYM [+ OFFSET] - ANCHOR.  SYM is the base term
9064            for aliasing purposes.  */
9065         return XVECEXP (base, 0, 0);
9066       }
9067
9068   return op;
9069 }
9070
9071 /* More elaborate version of recog's offsettable_memref_p predicate
9072    that works around the ??? note of rs6000_mode_dependent_address.
9073    In particular it accepts
9074
9075      (mem:DI (plus:SI (reg/f:SI 31 31) (const_int 32760 [0x7ff8])))
9076
9077    in 32-bit mode, that the recog predicate rejects.  */
9078
9079 static bool
9080 rs6000_offsettable_memref_p (rtx op, machine_mode reg_mode, bool strict)
9081 {
9082   bool worst_case;
9083
9084   if (!MEM_P (op))
9085     return false;
9086
9087   /* First mimic offsettable_memref_p.  */
9088   if (offsettable_address_p (strict, GET_MODE (op), XEXP (op, 0)))
9089     return true;
9090
9091   /* offsettable_address_p invokes rs6000_mode_dependent_address, but
9092      the latter predicate knows nothing about the mode of the memory
9093      reference and, therefore, assumes that it is the largest supported
9094      mode (TFmode).  As a consequence, legitimate offsettable memory
9095      references are rejected.  rs6000_legitimate_offset_address_p contains
9096      the correct logic for the PLUS case of rs6000_mode_dependent_address,
9097      at least with a little bit of help here given that we know the
9098      actual registers used.  */
9099   worst_case = ((TARGET_POWERPC64 && GET_MODE_CLASS (reg_mode) == MODE_INT)
9100                 || GET_MODE_SIZE (reg_mode) == 4);
9101   return rs6000_legitimate_offset_address_p (GET_MODE (op), XEXP (op, 0),
9102                                              strict, worst_case);
9103 }
9104
9105 /* Determine the reassociation width to be used in reassociate_bb.
9106    This takes into account how many parallel operations we
9107    can actually do of a given type, and also the latency.
9108    P8:
9109      int add/sub 6/cycle     
9110          mul 2/cycle
9111      vect add/sub/mul 2/cycle
9112      fp   add/sub/mul 2/cycle
9113      dfp  1/cycle
9114 */
9115  
9116 static int
9117 rs6000_reassociation_width (unsigned int opc ATTRIBUTE_UNUSED,
9118                             machine_mode mode)
9119 {
9120   switch (rs6000_tune)
9121     {
9122     case PROCESSOR_POWER8:
9123     case PROCESSOR_POWER9:
9124       if (DECIMAL_FLOAT_MODE_P (mode))
9125         return 1;
9126       if (VECTOR_MODE_P (mode))
9127         return 4;
9128       if (INTEGRAL_MODE_P (mode)) 
9129         return 1;
9130       if (FLOAT_MODE_P (mode))
9131         return 4;
9132       break;
9133     default:
9134       break;
9135     }
9136   return 1;
9137 }
9138
9139 /* Change register usage conditional on target flags.  */
9140 static void
9141 rs6000_conditional_register_usage (void)
9142 {
9143   int i;
9144
9145   if (TARGET_DEBUG_TARGET)
9146     fprintf (stderr, "rs6000_conditional_register_usage called\n");
9147
9148   /* 64-bit AIX and Linux reserve GPR13 for thread-private data.  */
9149   if (TARGET_64BIT)
9150     fixed_regs[13] = call_used_regs[13]
9151       = call_really_used_regs[13] = 1;
9152
9153   /* Conditionally disable FPRs.  */
9154   if (TARGET_SOFT_FLOAT)
9155     for (i = 32; i < 64; i++)
9156       fixed_regs[i] = call_used_regs[i]
9157         = call_really_used_regs[i] = 1;
9158
9159   /* The TOC register is not killed across calls in a way that is
9160      visible to the compiler.  */
9161   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
9162     call_really_used_regs[2] = 0;
9163
9164   if (DEFAULT_ABI == ABI_V4 && flag_pic == 2)
9165     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
9166
9167   if (DEFAULT_ABI == ABI_V4 && flag_pic == 1)
9168     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
9169       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
9170       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
9171
9172   if (DEFAULT_ABI == ABI_DARWIN && flag_pic)
9173     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
9174       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
9175       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
9176
9177   if (TARGET_TOC && TARGET_MINIMAL_TOC)
9178     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
9179       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
9180
9181   if (!TARGET_ALTIVEC && !TARGET_VSX)
9182     {
9183       for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
9184         fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
9185       call_really_used_regs[VRSAVE_REGNO] = 1;
9186     }
9187
9188   if (TARGET_ALTIVEC || TARGET_VSX)
9189     global_regs[VSCR_REGNO] = 1;
9190
9191   if (TARGET_ALTIVEC_ABI)
9192     {
9193       for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
9194         call_used_regs[i] = call_really_used_regs[i] = 1;
9195
9196       /* AIX reserves VR20:31 in non-extended ABI mode.  */
9197       if (TARGET_XCOFF)
9198         for (i = FIRST_ALTIVEC_REGNO + 20; i < FIRST_ALTIVEC_REGNO + 32; ++i)
9199           fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
9200     }
9201 }
9202
9203 \f
9204 /* Output insns to set DEST equal to the constant SOURCE as a series of
9205    lis, ori and shl instructions and return TRUE.  */
9206
9207 bool
9208 rs6000_emit_set_const (rtx dest, rtx source)
9209 {
9210   machine_mode mode = GET_MODE (dest);
9211   rtx temp, set;
9212   rtx_insn *insn;
9213   HOST_WIDE_INT c;
9214
9215   gcc_checking_assert (CONST_INT_P (source));
9216   c = INTVAL (source);
9217   switch (mode)
9218     {
9219     case E_QImode:
9220     case E_HImode:
9221       emit_insn (gen_rtx_SET (dest, source));
9222       return true;
9223
9224     case E_SImode:
9225       temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (SImode);
9226
9227       emit_insn (gen_rtx_SET (copy_rtx (temp),
9228                               GEN_INT (c & ~(HOST_WIDE_INT) 0xffff)));
9229       emit_insn (gen_rtx_SET (dest,
9230                               gen_rtx_IOR (SImode, copy_rtx (temp),
9231                                            GEN_INT (c & 0xffff))));
9232       break;
9233
9234     case E_DImode:
9235       if (!TARGET_POWERPC64)
9236         {
9237           rtx hi, lo;
9238
9239           hi = operand_subword_force (copy_rtx (dest), WORDS_BIG_ENDIAN == 0,
9240                                       DImode);
9241           lo = operand_subword_force (dest, WORDS_BIG_ENDIAN != 0,
9242                                       DImode);
9243           emit_move_insn (hi, GEN_INT (c >> 32));
9244           c = ((c & 0xffffffff) ^ 0x80000000) - 0x80000000;
9245           emit_move_insn (lo, GEN_INT (c));
9246         }
9247       else
9248         rs6000_emit_set_long_const (dest, c);
9249       break;
9250
9251     default:
9252       gcc_unreachable ();
9253     }
9254
9255   insn = get_last_insn ();
9256   set = single_set (insn);
9257   if (! CONSTANT_P (SET_SRC (set)))
9258     set_unique_reg_note (insn, REG_EQUAL, GEN_INT (c));
9259
9260   return true;
9261 }
9262
9263 /* Subroutine of rs6000_emit_set_const, handling PowerPC64 DImode.
9264    Output insns to set DEST equal to the constant C as a series of
9265    lis, ori and shl instructions.  */
9266
9267 static void
9268 rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c)
9269 {
9270   rtx temp;
9271   HOST_WIDE_INT ud1, ud2, ud3, ud4;
9272
9273   ud1 = c & 0xffff;
9274   c = c >> 16;
9275   ud2 = c & 0xffff;
9276   c = c >> 16;
9277   ud3 = c & 0xffff;
9278   c = c >> 16;
9279   ud4 = c & 0xffff;
9280
9281   if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
9282       || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
9283     emit_move_insn (dest, GEN_INT ((ud1 ^ 0x8000) - 0x8000));
9284
9285   else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
9286            || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
9287     {
9288       temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
9289
9290       emit_move_insn (ud1 != 0 ? copy_rtx (temp) : dest,
9291                       GEN_INT (((ud2 << 16) ^ 0x80000000) - 0x80000000));
9292       if (ud1 != 0)
9293         emit_move_insn (dest,
9294                         gen_rtx_IOR (DImode, copy_rtx (temp),
9295                                      GEN_INT (ud1)));
9296     }
9297   else if (ud3 == 0 && ud4 == 0)
9298     {
9299       temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
9300
9301       gcc_assert (ud2 & 0x8000);
9302       emit_move_insn (copy_rtx (temp),
9303                       GEN_INT (((ud2 << 16) ^ 0x80000000) - 0x80000000));
9304       if (ud1 != 0)
9305         emit_move_insn (copy_rtx (temp),
9306                         gen_rtx_IOR (DImode, copy_rtx (temp),
9307                                      GEN_INT (ud1)));
9308       emit_move_insn (dest,
9309                       gen_rtx_ZERO_EXTEND (DImode,
9310                                            gen_lowpart (SImode,
9311                                                         copy_rtx (temp))));
9312     }
9313   else if ((ud4 == 0xffff && (ud3 & 0x8000))
9314            || (ud4 == 0 && ! (ud3 & 0x8000)))
9315     {
9316       temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
9317
9318       emit_move_insn (copy_rtx (temp),
9319                       GEN_INT (((ud3 << 16) ^ 0x80000000) - 0x80000000));
9320       if (ud2 != 0)
9321         emit_move_insn (copy_rtx (temp),
9322                         gen_rtx_IOR (DImode, copy_rtx (temp),
9323                                      GEN_INT (ud2)));
9324       emit_move_insn (ud1 != 0 ? copy_rtx (temp) : dest,
9325                       gen_rtx_ASHIFT (DImode, copy_rtx (temp),
9326                                       GEN_INT (16)));
9327       if (ud1 != 0)
9328         emit_move_insn (dest,
9329                         gen_rtx_IOR (DImode, copy_rtx (temp),
9330                                      GEN_INT (ud1)));
9331     }
9332   else
9333     {
9334       temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
9335
9336       emit_move_insn (copy_rtx (temp),
9337                       GEN_INT (((ud4 << 16) ^ 0x80000000) - 0x80000000));
9338       if (ud3 != 0)
9339         emit_move_insn (copy_rtx (temp),
9340                         gen_rtx_IOR (DImode, copy_rtx (temp),
9341                                      GEN_INT (ud3)));
9342
9343       emit_move_insn (ud2 != 0 || ud1 != 0 ? copy_rtx (temp) : dest,
9344                       gen_rtx_ASHIFT (DImode, copy_rtx (temp),
9345                                       GEN_INT (32)));
9346       if (ud2 != 0)
9347         emit_move_insn (ud1 != 0 ? copy_rtx (temp) : dest,
9348                         gen_rtx_IOR (DImode, copy_rtx (temp),
9349                                      GEN_INT (ud2 << 16)));
9350       if (ud1 != 0)
9351         emit_move_insn (dest,
9352                         gen_rtx_IOR (DImode, copy_rtx (temp),
9353                                      GEN_INT (ud1)));
9354     }
9355 }
9356
9357 /* Helper for the following.  Get rid of [r+r] memory refs
9358    in cases where it won't work (TImode, TFmode, TDmode, PTImode).  */
9359
9360 static void
9361 rs6000_eliminate_indexed_memrefs (rtx operands[2])
9362 {
9363   if (MEM_P (operands[0])
9364       && !REG_P (XEXP (operands[0], 0))
9365       && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0),
9366                                                GET_MODE (operands[0]), false))
9367     operands[0]
9368       = replace_equiv_address (operands[0],
9369                                copy_addr_to_reg (XEXP (operands[0], 0)));
9370
9371   if (MEM_P (operands[1])
9372       && !REG_P (XEXP (operands[1], 0))
9373       && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0),
9374                                                GET_MODE (operands[1]), false))
9375     operands[1]
9376       = replace_equiv_address (operands[1],
9377                                copy_addr_to_reg (XEXP (operands[1], 0)));
9378 }
9379
9380 /* Generate a vector of constants to permute MODE for a little-endian
9381    storage operation by swapping the two halves of a vector.  */
9382 static rtvec
9383 rs6000_const_vec (machine_mode mode)
9384 {
9385   int i, subparts;
9386   rtvec v;
9387
9388   switch (mode)
9389     {
9390     case E_V1TImode:
9391       subparts = 1;
9392       break;
9393     case E_V2DFmode:
9394     case E_V2DImode:
9395       subparts = 2;
9396       break;
9397     case E_V4SFmode:
9398     case E_V4SImode:
9399       subparts = 4;
9400       break;
9401     case E_V8HImode:
9402       subparts = 8;
9403       break;
9404     case E_V16QImode:
9405       subparts = 16;
9406       break;
9407     default:
9408       gcc_unreachable();
9409     }
9410
9411   v = rtvec_alloc (subparts);
9412
9413   for (i = 0; i < subparts / 2; ++i)
9414     RTVEC_ELT (v, i) = gen_rtx_CONST_INT (DImode, i + subparts / 2);
9415   for (i = subparts / 2; i < subparts; ++i)
9416     RTVEC_ELT (v, i) = gen_rtx_CONST_INT (DImode, i - subparts / 2);
9417
9418   return v;
9419 }
9420
9421 /* Emit an lxvd2x, stxvd2x, or xxpermdi instruction for a VSX load or
9422    store operation.  */
9423 void
9424 rs6000_emit_le_vsx_permute (rtx dest, rtx source, machine_mode mode)
9425 {
9426   /* Scalar permutations are easier to express in integer modes rather than
9427      floating-point modes, so cast them here.  We use V1TImode instead
9428      of TImode to ensure that the values don't go through GPRs.  */
9429   if (FLOAT128_VECTOR_P (mode))
9430     {
9431       dest = gen_lowpart (V1TImode, dest);
9432       source = gen_lowpart (V1TImode, source);
9433       mode = V1TImode;
9434     }
9435
9436   /* Use ROTATE instead of VEC_SELECT if the mode contains only a single
9437      scalar.  */
9438   if (mode == TImode || mode == V1TImode)
9439     emit_insn (gen_rtx_SET (dest, gen_rtx_ROTATE (mode, source,
9440                                                   GEN_INT (64))));
9441   else
9442     {
9443       rtx par = gen_rtx_PARALLEL (VOIDmode, rs6000_const_vec (mode));
9444       emit_insn (gen_rtx_SET (dest, gen_rtx_VEC_SELECT (mode, source, par)));
9445     }
9446 }
9447
9448 /* Emit a little-endian load from vector memory location SOURCE to VSX
9449    register DEST in mode MODE.  The load is done with two permuting
9450    insn's that represent an lxvd2x and xxpermdi.  */
9451 void
9452 rs6000_emit_le_vsx_load (rtx dest, rtx source, machine_mode mode)
9453 {
9454   /* Use V2DImode to do swaps of types with 128-bit scalare parts (TImode,
9455      V1TImode).  */
9456   if (mode == TImode || mode == V1TImode)
9457     {
9458       mode = V2DImode;
9459       dest = gen_lowpart (V2DImode, dest);
9460       source = adjust_address (source, V2DImode, 0);
9461     }
9462
9463   rtx tmp = can_create_pseudo_p () ? gen_reg_rtx_and_attrs (dest) : dest;
9464   rs6000_emit_le_vsx_permute (tmp, source, mode);
9465   rs6000_emit_le_vsx_permute (dest, tmp, mode);
9466 }
9467
9468 /* Emit a little-endian store to vector memory location DEST from VSX
9469    register SOURCE in mode MODE.  The store is done with two permuting
9470    insn's that represent an xxpermdi and an stxvd2x.  */
9471 void
9472 rs6000_emit_le_vsx_store (rtx dest, rtx source, machine_mode mode)
9473 {
9474   /* This should never be called during or after LRA, because it does
9475      not re-permute the source register.  It is intended only for use
9476      during expand.  */
9477   gcc_assert (!lra_in_progress && !reload_completed);
9478
9479   /* Use V2DImode to do swaps of types with 128-bit scalar parts (TImode,
9480      V1TImode).  */
9481   if (mode == TImode || mode == V1TImode)
9482     {
9483       mode = V2DImode;
9484       dest = adjust_address (dest, V2DImode, 0);
9485       source = gen_lowpart (V2DImode, source);
9486     }
9487
9488   rtx tmp = can_create_pseudo_p () ? gen_reg_rtx_and_attrs (source) : source;
9489   rs6000_emit_le_vsx_permute (tmp, source, mode);
9490   rs6000_emit_le_vsx_permute (dest, tmp, mode);
9491 }
9492
9493 /* Emit a sequence representing a little-endian VSX load or store,
9494    moving data from SOURCE to DEST in mode MODE.  This is done
9495    separately from rs6000_emit_move to ensure it is called only
9496    during expand.  LE VSX loads and stores introduced later are
9497    handled with a split.  The expand-time RTL generation allows
9498    us to optimize away redundant pairs of register-permutes.  */
9499 void
9500 rs6000_emit_le_vsx_move (rtx dest, rtx source, machine_mode mode)
9501 {
9502   gcc_assert (!BYTES_BIG_ENDIAN
9503               && VECTOR_MEM_VSX_P (mode)
9504               && !TARGET_P9_VECTOR
9505               && !gpr_or_gpr_p (dest, source)
9506               && (MEM_P (source) ^ MEM_P (dest)));
9507
9508   if (MEM_P (source))
9509     {
9510       gcc_assert (REG_P (dest) || SUBREG_P (dest));
9511       rs6000_emit_le_vsx_load (dest, source, mode);
9512     }
9513   else
9514     {
9515       if (!REG_P (source))
9516         source = force_reg (mode, source);
9517       rs6000_emit_le_vsx_store (dest, source, mode);
9518     }
9519 }
9520
9521 /* Return whether a SFmode or SImode move can be done without converting one
9522    mode to another.  This arrises when we have:
9523
9524         (SUBREG:SF (REG:SI ...))
9525         (SUBREG:SI (REG:SF ...))
9526
9527    and one of the values is in a floating point/vector register, where SFmode
9528    scalars are stored in DFmode format.  */
9529
9530 bool
9531 valid_sf_si_move (rtx dest, rtx src, machine_mode mode)
9532 {
9533   if (TARGET_ALLOW_SF_SUBREG)
9534     return true;
9535
9536   if (mode != SFmode && GET_MODE_CLASS (mode) != MODE_INT)
9537     return true;
9538
9539   if (!SUBREG_P (src) || !sf_subreg_operand (src, mode))
9540     return true;
9541
9542   /*.  Allow (set (SUBREG:SI (REG:SF)) (SUBREG:SI (REG:SF))).  */
9543   if (SUBREG_P (dest))
9544     {
9545       rtx dest_subreg = SUBREG_REG (dest);
9546       rtx src_subreg = SUBREG_REG (src);
9547       return GET_MODE (dest_subreg) == GET_MODE (src_subreg);
9548     }
9549
9550   return false;
9551 }
9552
9553
9554 /* Helper function to change moves with:
9555
9556         (SUBREG:SF (REG:SI)) and
9557         (SUBREG:SI (REG:SF))
9558
9559    into separate UNSPEC insns.  In the PowerPC architecture, scalar SFmode
9560    values are stored as DFmode values in the VSX registers.  We need to convert
9561    the bits before we can use a direct move or operate on the bits in the
9562    vector register as an integer type.
9563
9564    Skip things like (set (SUBREG:SI (...) (SUBREG:SI (...)).  */
9565
9566 static bool
9567 rs6000_emit_move_si_sf_subreg (rtx dest, rtx source, machine_mode mode)
9568 {
9569   if (TARGET_DIRECT_MOVE_64BIT && !reload_completed
9570       && (!SUBREG_P (dest) || !sf_subreg_operand (dest, mode))
9571       && SUBREG_P (source) && sf_subreg_operand (source, mode))
9572     {
9573       rtx inner_source = SUBREG_REG (source);
9574       machine_mode inner_mode = GET_MODE (inner_source);
9575
9576       if (mode == SImode && inner_mode == SFmode)
9577         {
9578           emit_insn (gen_movsi_from_sf (dest, inner_source));
9579           return true;
9580         }
9581
9582       if (mode == SFmode && inner_mode == SImode)
9583         {
9584           emit_insn (gen_movsf_from_si (dest, inner_source));
9585           return true;
9586         }
9587     }
9588
9589   return false;
9590 }
9591
9592 /* Emit a move from SOURCE to DEST in mode MODE.  */
9593 void
9594 rs6000_emit_move (rtx dest, rtx source, machine_mode mode)
9595 {
9596   rtx operands[2];
9597   operands[0] = dest;
9598   operands[1] = source;
9599
9600   if (TARGET_DEBUG_ADDR)
9601     {
9602       fprintf (stderr,
9603                "\nrs6000_emit_move: mode = %s, lra_in_progress = %d, "
9604                "reload_completed = %d, can_create_pseudos = %d.\ndest:\n",
9605                GET_MODE_NAME (mode),
9606                lra_in_progress,
9607                reload_completed,
9608                can_create_pseudo_p ());
9609       debug_rtx (dest);
9610       fprintf (stderr, "source:\n");
9611       debug_rtx (source);
9612     }
9613
9614   /* Check that we get CONST_WIDE_INT only when we should.  */
9615   if (CONST_WIDE_INT_P (operands[1])
9616       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
9617     gcc_unreachable ();
9618
9619 #ifdef HAVE_AS_GNU_ATTRIBUTE
9620   /* If we use a long double type, set the flags in .gnu_attribute that say
9621      what the long double type is.  This is to allow the linker's warning
9622      message for the wrong long double to be useful, even if the function does
9623      not do a call (for example, doing a 128-bit add on power9 if the long
9624      double type is IEEE 128-bit.  Do not set this if __ibm128 or __floa128 are
9625      used if they aren't the default long dobule type.  */
9626   if (rs6000_gnu_attr && (HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE || TARGET_64BIT))
9627     {
9628       if (TARGET_LONG_DOUBLE_128 && (mode == TFmode || mode == TCmode))
9629         rs6000_passes_float = rs6000_passes_long_double = true;
9630
9631       else if (!TARGET_LONG_DOUBLE_128 && (mode == DFmode || mode == DCmode))
9632         rs6000_passes_float = rs6000_passes_long_double = true;
9633     }
9634 #endif
9635
9636   /* See if we need to special case SImode/SFmode SUBREG moves.  */
9637   if ((mode == SImode || mode == SFmode) && SUBREG_P (source)
9638       && rs6000_emit_move_si_sf_subreg (dest, source, mode))
9639     return;
9640
9641   /* Check if GCC is setting up a block move that will end up using FP
9642      registers as temporaries.  We must make sure this is acceptable.  */
9643   if (MEM_P (operands[0])
9644       && MEM_P (operands[1])
9645       && mode == DImode
9646       && (rs6000_slow_unaligned_access (DImode, MEM_ALIGN (operands[0]))
9647           || rs6000_slow_unaligned_access (DImode, MEM_ALIGN (operands[1])))
9648       && ! (rs6000_slow_unaligned_access (SImode,
9649                                           (MEM_ALIGN (operands[0]) > 32
9650                                            ? 32 : MEM_ALIGN (operands[0])))
9651             || rs6000_slow_unaligned_access (SImode,
9652                                              (MEM_ALIGN (operands[1]) > 32
9653                                               ? 32 : MEM_ALIGN (operands[1]))))
9654       && ! MEM_VOLATILE_P (operands [0])
9655       && ! MEM_VOLATILE_P (operands [1]))
9656     {
9657       emit_move_insn (adjust_address (operands[0], SImode, 0),
9658                       adjust_address (operands[1], SImode, 0));
9659       emit_move_insn (adjust_address (copy_rtx (operands[0]), SImode, 4),
9660                       adjust_address (copy_rtx (operands[1]), SImode, 4));
9661       return;
9662     }
9663
9664   if (can_create_pseudo_p () && MEM_P (operands[0])
9665       && !gpc_reg_operand (operands[1], mode))
9666     operands[1] = force_reg (mode, operands[1]);
9667
9668   /* Recognize the case where operand[1] is a reference to thread-local
9669      data and load its address to a register.  */
9670   if (tls_referenced_p (operands[1]))
9671     {
9672       enum tls_model model;
9673       rtx tmp = operands[1];
9674       rtx addend = NULL;
9675
9676       if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
9677         {
9678           addend = XEXP (XEXP (tmp, 0), 1);
9679           tmp = XEXP (XEXP (tmp, 0), 0);
9680         }
9681
9682       gcc_assert (SYMBOL_REF_P (tmp));
9683       model = SYMBOL_REF_TLS_MODEL (tmp);
9684       gcc_assert (model != 0);
9685
9686       tmp = rs6000_legitimize_tls_address (tmp, model);
9687       if (addend)
9688         {
9689           tmp = gen_rtx_PLUS (mode, tmp, addend);
9690           tmp = force_operand (tmp, operands[0]);
9691         }
9692       operands[1] = tmp;
9693     }
9694
9695   /* 128-bit constant floating-point values on Darwin should really be loaded
9696      as two parts.  However, this premature splitting is a problem when DFmode
9697      values can go into Altivec registers.  */
9698   if (TARGET_MACHO && CONST_DOUBLE_P (operands[1]) && FLOAT128_IBM_P (mode)
9699       && !reg_addr[DFmode].scalar_in_vmx_p)
9700     {
9701       rs6000_emit_move (simplify_gen_subreg (DFmode, operands[0], mode, 0),
9702                         simplify_gen_subreg (DFmode, operands[1], mode, 0),
9703                         DFmode);
9704       rs6000_emit_move (simplify_gen_subreg (DFmode, operands[0], mode,
9705                                              GET_MODE_SIZE (DFmode)),
9706                         simplify_gen_subreg (DFmode, operands[1], mode,
9707                                              GET_MODE_SIZE (DFmode)),
9708                         DFmode);
9709       return;
9710     }
9711
9712   /* Transform (p0:DD, (SUBREG:DD p1:SD)) to ((SUBREG:SD p0:DD),
9713      p1:SD) if p1 is not of floating point class and p0 is spilled as
9714      we can have no analogous movsd_store for this.  */
9715   if (lra_in_progress && mode == DDmode
9716       && REG_P (operands[0]) && !HARD_REGISTER_P (operands[0])
9717       && reg_preferred_class (REGNO (operands[0])) == NO_REGS
9718       && SUBREG_P (operands[1]) && REG_P (SUBREG_REG (operands[1]))
9719       && GET_MODE (SUBREG_REG (operands[1])) == SDmode)
9720     {
9721       enum reg_class cl;
9722       int regno = REGNO (SUBREG_REG (operands[1]));
9723
9724       if (!HARD_REGISTER_NUM_P (regno))
9725         {
9726           cl = reg_preferred_class (regno);
9727           regno = reg_renumber[regno];
9728           if (regno < 0)
9729             regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];
9730         }
9731       if (regno >= 0 && ! FP_REGNO_P (regno))
9732         {
9733           mode = SDmode;
9734           operands[0] = gen_lowpart_SUBREG (SDmode, operands[0]);
9735           operands[1] = SUBREG_REG (operands[1]);
9736         }
9737     }
9738   if (lra_in_progress
9739       && mode == SDmode
9740       && REG_P (operands[0]) && !HARD_REGISTER_P (operands[0])
9741       && reg_preferred_class (REGNO (operands[0])) == NO_REGS
9742       && (REG_P (operands[1])
9743           || (SUBREG_P (operands[1]) && REG_P (SUBREG_REG (operands[1])))))
9744     {
9745       int regno = reg_or_subregno (operands[1]);
9746       enum reg_class cl;
9747
9748       if (!HARD_REGISTER_NUM_P (regno))
9749         {
9750           cl = reg_preferred_class (regno);
9751           gcc_assert (cl != NO_REGS);
9752           regno = reg_renumber[regno];
9753           if (regno < 0)
9754             regno = ira_class_hard_regs[cl][0];
9755         }
9756       if (FP_REGNO_P (regno))
9757         {
9758           if (GET_MODE (operands[0]) != DDmode)
9759             operands[0] = gen_rtx_SUBREG (DDmode, operands[0], 0);
9760           emit_insn (gen_movsd_store (operands[0], operands[1]));
9761         }
9762       else if (INT_REGNO_P (regno))
9763         emit_insn (gen_movsd_hardfloat (operands[0], operands[1]));
9764       else
9765         gcc_unreachable();
9766       return;
9767     }
9768   /* Transform ((SUBREG:DD p0:SD), p1:DD) to (p0:SD, (SUBREG:SD
9769      p:DD)) if p0 is not of floating point class and p1 is spilled as
9770      we can have no analogous movsd_load for this.  */
9771   if (lra_in_progress && mode == DDmode
9772       && SUBREG_P (operands[0]) && REG_P (SUBREG_REG (operands[0]))
9773       && GET_MODE (SUBREG_REG (operands[0])) == SDmode
9774       && REG_P (operands[1]) && !HARD_REGISTER_P (operands[1])
9775       && reg_preferred_class (REGNO (operands[1])) == NO_REGS)
9776     {
9777       enum reg_class cl;
9778       int regno = REGNO (SUBREG_REG (operands[0]));
9779
9780       if (!HARD_REGISTER_NUM_P (regno))
9781         {
9782           cl = reg_preferred_class (regno);
9783           regno = reg_renumber[regno];
9784           if (regno < 0)
9785             regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][0];
9786         }
9787       if (regno >= 0 && ! FP_REGNO_P (regno))
9788         {
9789           mode = SDmode;
9790           operands[0] = SUBREG_REG (operands[0]);
9791           operands[1] = gen_lowpart_SUBREG (SDmode, operands[1]);
9792         }
9793     }
9794   if (lra_in_progress
9795       && mode == SDmode
9796       && (REG_P (operands[0])
9797           || (SUBREG_P (operands[0]) && REG_P (SUBREG_REG (operands[0]))))
9798       && REG_P (operands[1]) && !HARD_REGISTER_P (operands[1])
9799       && reg_preferred_class (REGNO (operands[1])) == NO_REGS)
9800     {
9801       int regno = reg_or_subregno (operands[0]);
9802       enum reg_class cl;
9803
9804       if (!HARD_REGISTER_NUM_P (regno))
9805         {
9806           cl = reg_preferred_class (regno);
9807           gcc_assert (cl != NO_REGS);
9808           regno = reg_renumber[regno];
9809           if (regno < 0)
9810             regno = ira_class_hard_regs[cl][0];
9811         }
9812       if (FP_REGNO_P (regno))
9813         {
9814           if (GET_MODE (operands[1]) != DDmode)
9815             operands[1] = gen_rtx_SUBREG (DDmode, operands[1], 0);
9816           emit_insn (gen_movsd_load (operands[0], operands[1]));
9817         }
9818       else if (INT_REGNO_P (regno))
9819         emit_insn (gen_movsd_hardfloat (operands[0], operands[1]));
9820       else
9821         gcc_unreachable();
9822       return;
9823     }
9824
9825   /* FIXME:  In the long term, this switch statement should go away
9826      and be replaced by a sequence of tests based on things like
9827      mode == Pmode.  */
9828   switch (mode)
9829     {
9830     case E_HImode:
9831     case E_QImode:
9832       if (CONSTANT_P (operands[1])
9833           && !CONST_INT_P (operands[1]))
9834         operands[1] = force_const_mem (mode, operands[1]);
9835       break;
9836
9837     case E_TFmode:
9838     case E_TDmode:
9839     case E_IFmode:
9840     case E_KFmode:
9841       if (FLOAT128_2REG_P (mode))
9842         rs6000_eliminate_indexed_memrefs (operands);
9843       /* fall through */
9844
9845     case E_DFmode:
9846     case E_DDmode:
9847     case E_SFmode:
9848     case E_SDmode:
9849       if (CONSTANT_P (operands[1])
9850           && ! easy_fp_constant (operands[1], mode))
9851         operands[1] = force_const_mem (mode, operands[1]);
9852       break;
9853
9854     case E_V16QImode:
9855     case E_V8HImode:
9856     case E_V4SFmode:
9857     case E_V4SImode:
9858     case E_V2DFmode:
9859     case E_V2DImode:
9860     case E_V1TImode:
9861       if (CONSTANT_P (operands[1])
9862           && !easy_vector_constant (operands[1], mode))
9863         operands[1] = force_const_mem (mode, operands[1]);
9864       break;
9865
9866     case E_SImode:
9867     case E_DImode:
9868       /* Use default pattern for address of ELF small data */
9869       if (TARGET_ELF
9870           && mode == Pmode
9871           && DEFAULT_ABI == ABI_V4
9872           && (SYMBOL_REF_P (operands[1])
9873               || GET_CODE (operands[1]) == CONST)
9874           && small_data_operand (operands[1], mode))
9875         {
9876           emit_insn (gen_rtx_SET (operands[0], operands[1]));
9877           return;
9878         }
9879
9880       if (DEFAULT_ABI == ABI_V4
9881           && mode == Pmode && mode == SImode
9882           && flag_pic == 1 && got_operand (operands[1], mode))
9883         {
9884           emit_insn (gen_movsi_got (operands[0], operands[1]));
9885           return;
9886         }
9887
9888       if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
9889           && TARGET_NO_TOC
9890           && ! flag_pic
9891           && mode == Pmode
9892           && CONSTANT_P (operands[1])
9893           && GET_CODE (operands[1]) != HIGH
9894           && !CONST_INT_P (operands[1]))
9895         {
9896           rtx target = (!can_create_pseudo_p ()
9897                         ? operands[0]
9898                         : gen_reg_rtx (mode));
9899
9900           /* If this is a function address on -mcall-aixdesc,
9901              convert it to the address of the descriptor.  */
9902           if (DEFAULT_ABI == ABI_AIX
9903               && SYMBOL_REF_P (operands[1])
9904               && XSTR (operands[1], 0)[0] == '.')
9905             {
9906               const char *name = XSTR (operands[1], 0);
9907               rtx new_ref;
9908               while (*name == '.')
9909                 name++;
9910               new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
9911               CONSTANT_POOL_ADDRESS_P (new_ref)
9912                 = CONSTANT_POOL_ADDRESS_P (operands[1]);
9913               SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
9914               SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
9915               SYMBOL_REF_DATA (new_ref) = SYMBOL_REF_DATA (operands[1]);
9916               operands[1] = new_ref;
9917             }
9918
9919           if (DEFAULT_ABI == ABI_DARWIN)
9920             {
9921 #if TARGET_MACHO
9922               if (MACHO_DYNAMIC_NO_PIC_P)
9923                 {
9924                   /* Take care of any required data indirection.  */
9925                   operands[1] = rs6000_machopic_legitimize_pic_address (
9926                                   operands[1], mode, operands[0]);
9927                   if (operands[0] != operands[1])
9928                     emit_insn (gen_rtx_SET (operands[0], operands[1]));
9929                   return;
9930                 }
9931 #endif
9932               emit_insn (gen_macho_high (target, operands[1]));
9933               emit_insn (gen_macho_low (operands[0], target, operands[1]));
9934               return;
9935             }
9936
9937           emit_insn (gen_elf_high (target, operands[1]));
9938           emit_insn (gen_elf_low (operands[0], target, operands[1]));
9939           return;
9940         }
9941
9942       /* If this is a SYMBOL_REF that refers to a constant pool entry,
9943          and we have put it in the TOC, we just need to make a TOC-relative
9944          reference to it.  */
9945       if (TARGET_TOC
9946           && SYMBOL_REF_P (operands[1])
9947           && use_toc_relative_ref (operands[1], mode))
9948         operands[1] = create_TOC_reference (operands[1], operands[0]);
9949       else if (mode == Pmode
9950                && CONSTANT_P (operands[1])
9951                && GET_CODE (operands[1]) != HIGH
9952                && ((REG_P (operands[0])
9953                     && FP_REGNO_P (REGNO (operands[0])))
9954                    || !CONST_INT_P (operands[1])
9955                    || (num_insns_constant (operands[1], mode)
9956                        > (TARGET_CMODEL != CMODEL_SMALL ? 3 : 2)))
9957                && !toc_relative_expr_p (operands[1], false, NULL, NULL)
9958                && (TARGET_CMODEL == CMODEL_SMALL
9959                    || can_create_pseudo_p ()
9960                    || (REG_P (operands[0])
9961                        && INT_REG_OK_FOR_BASE_P (operands[0], true))))
9962         {
9963
9964 #if TARGET_MACHO
9965           /* Darwin uses a special PIC legitimizer.  */
9966           if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
9967             {
9968               operands[1] =
9969                 rs6000_machopic_legitimize_pic_address (operands[1], mode,
9970                                                         operands[0]);
9971               if (operands[0] != operands[1])
9972                 emit_insn (gen_rtx_SET (operands[0], operands[1]));
9973               return;
9974             }
9975 #endif
9976
9977           /* If we are to limit the number of things we put in the TOC and
9978              this is a symbol plus a constant we can add in one insn,
9979              just put the symbol in the TOC and add the constant.  */
9980           if (GET_CODE (operands[1]) == CONST
9981               && TARGET_NO_SUM_IN_TOC
9982               && GET_CODE (XEXP (operands[1], 0)) == PLUS
9983               && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
9984               && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
9985                   || SYMBOL_REF_P (XEXP (XEXP (operands[1], 0), 0)))
9986               && ! side_effects_p (operands[0]))
9987             {
9988               rtx sym =
9989                 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
9990               rtx other = XEXP (XEXP (operands[1], 0), 1);
9991
9992               sym = force_reg (mode, sym);
9993               emit_insn (gen_add3_insn (operands[0], sym, other));
9994               return;
9995             }
9996
9997           operands[1] = force_const_mem (mode, operands[1]);
9998
9999           if (TARGET_TOC
10000               && SYMBOL_REF_P (XEXP (operands[1], 0))
10001               && use_toc_relative_ref (XEXP (operands[1], 0), mode))
10002             {
10003               rtx tocref = create_TOC_reference (XEXP (operands[1], 0),
10004                                                  operands[0]);
10005               operands[1] = gen_const_mem (mode, tocref);
10006               set_mem_alias_set (operands[1], get_TOC_alias_set ());
10007             }
10008         }
10009       break;
10010
10011     case E_TImode:
10012       if (!VECTOR_MEM_VSX_P (TImode))
10013         rs6000_eliminate_indexed_memrefs (operands);
10014       break;
10015
10016     case E_PTImode:
10017       rs6000_eliminate_indexed_memrefs (operands);
10018       break;
10019
10020     default:
10021       fatal_insn ("bad move", gen_rtx_SET (dest, source));
10022     }
10023
10024   /* Above, we may have called force_const_mem which may have returned
10025      an invalid address.  If we can, fix this up; otherwise, reload will
10026      have to deal with it.  */
10027   if (MEM_P (operands[1]))
10028     operands[1] = validize_mem (operands[1]);
10029
10030   emit_insn (gen_rtx_SET (operands[0], operands[1]));
10031 }
10032 \f
10033 /* Nonzero if we can use a floating-point register to pass this arg.  */
10034 #define USE_FP_FOR_ARG_P(CUM,MODE)              \
10035   (SCALAR_FLOAT_MODE_NOT_VECTOR_P (MODE)                \
10036    && (CUM)->fregno <= FP_ARG_MAX_REG           \
10037    && TARGET_HARD_FLOAT)
10038
10039 /* Nonzero if we can use an AltiVec register to pass this arg.  */
10040 #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,NAMED)                   \
10041   (ALTIVEC_OR_VSX_VECTOR_MODE (MODE)                            \
10042    && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG                      \
10043    && TARGET_ALTIVEC_ABI                                        \
10044    && (NAMED))
10045
10046 /* Walk down the type tree of TYPE counting consecutive base elements.
10047    If *MODEP is VOIDmode, then set it to the first valid floating point
10048    or vector type.  If a non-floating point or vector type is found, or
10049    if a floating point or vector type that doesn't match a non-VOIDmode
10050    *MODEP is found, then return -1, otherwise return the count in the
10051    sub-tree.  */
10052
10053 static int
10054 rs6000_aggregate_candidate (const_tree type, machine_mode *modep)
10055 {
10056   machine_mode mode;
10057   HOST_WIDE_INT size;
10058
10059   switch (TREE_CODE (type))
10060     {
10061     case REAL_TYPE:
10062       mode = TYPE_MODE (type);
10063       if (!SCALAR_FLOAT_MODE_P (mode))
10064         return -1;
10065
10066       if (*modep == VOIDmode)
10067         *modep = mode;
10068
10069       if (*modep == mode)
10070         return 1;
10071
10072       break;
10073
10074     case COMPLEX_TYPE:
10075       mode = TYPE_MODE (TREE_TYPE (type));
10076       if (!SCALAR_FLOAT_MODE_P (mode))
10077         return -1;
10078
10079       if (*modep == VOIDmode)
10080         *modep = mode;
10081
10082       if (*modep == mode)
10083         return 2;
10084
10085       break;
10086
10087     case VECTOR_TYPE:
10088       if (!TARGET_ALTIVEC_ABI || !TARGET_ALTIVEC)
10089         return -1;
10090
10091       /* Use V4SImode as representative of all 128-bit vector types.  */
10092       size = int_size_in_bytes (type);
10093       switch (size)
10094         {
10095         case 16:
10096           mode = V4SImode;
10097           break;
10098         default:
10099           return -1;
10100         }
10101
10102       if (*modep == VOIDmode)
10103         *modep = mode;
10104
10105       /* Vector modes are considered to be opaque: two vectors are
10106          equivalent for the purposes of being homogeneous aggregates
10107          if they are the same size.  */
10108       if (*modep == mode)
10109         return 1;
10110
10111       break;
10112
10113     case ARRAY_TYPE:
10114       {
10115         int count;
10116         tree index = TYPE_DOMAIN (type);
10117
10118         /* Can't handle incomplete types nor sizes that are not
10119            fixed.  */
10120         if (!COMPLETE_TYPE_P (type)
10121             || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
10122           return -1;
10123
10124         count = rs6000_aggregate_candidate (TREE_TYPE (type), modep);
10125         if (count == -1
10126             || !index
10127             || !TYPE_MAX_VALUE (index)
10128             || !tree_fits_uhwi_p (TYPE_MAX_VALUE (index))
10129             || !TYPE_MIN_VALUE (index)
10130             || !tree_fits_uhwi_p (TYPE_MIN_VALUE (index))
10131             || count < 0)
10132           return -1;
10133
10134         count *= (1 + tree_to_uhwi (TYPE_MAX_VALUE (index))
10135                       - tree_to_uhwi (TYPE_MIN_VALUE (index)));
10136
10137         /* There must be no padding.  */
10138         if (wi::to_wide (TYPE_SIZE (type))
10139             != count * GET_MODE_BITSIZE (*modep))
10140           return -1;
10141
10142         return count;
10143       }
10144
10145     case RECORD_TYPE:
10146       {
10147         int count = 0;
10148         int sub_count;
10149         tree field;
10150
10151         /* Can't handle incomplete types nor sizes that are not
10152            fixed.  */
10153         if (!COMPLETE_TYPE_P (type)
10154             || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
10155           return -1;
10156
10157         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
10158           {
10159             if (TREE_CODE (field) != FIELD_DECL)
10160               continue;
10161
10162             sub_count = rs6000_aggregate_candidate (TREE_TYPE (field), modep);
10163             if (sub_count < 0)
10164               return -1;
10165             count += sub_count;
10166           }
10167
10168         /* There must be no padding.  */
10169         if (wi::to_wide (TYPE_SIZE (type))
10170             != count * GET_MODE_BITSIZE (*modep))
10171           return -1;
10172
10173         return count;
10174       }
10175
10176     case UNION_TYPE:
10177     case QUAL_UNION_TYPE:
10178       {
10179         /* These aren't very interesting except in a degenerate case.  */
10180         int count = 0;
10181         int sub_count;
10182         tree field;
10183
10184         /* Can't handle incomplete types nor sizes that are not
10185            fixed.  */
10186         if (!COMPLETE_TYPE_P (type)
10187             || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
10188           return -1;
10189
10190         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
10191           {
10192             if (TREE_CODE (field) != FIELD_DECL)
10193               continue;
10194
10195             sub_count = rs6000_aggregate_candidate (TREE_TYPE (field), modep);
10196             if (sub_count < 0)
10197               return -1;
10198             count = count > sub_count ? count : sub_count;
10199           }
10200
10201         /* There must be no padding.  */
10202         if (wi::to_wide (TYPE_SIZE (type))
10203             != count * GET_MODE_BITSIZE (*modep))
10204           return -1;
10205
10206         return count;
10207       }
10208
10209     default:
10210       break;
10211     }
10212
10213   return -1;
10214 }
10215
10216 /* If an argument, whose type is described by TYPE and MODE, is a homogeneous
10217    float or vector aggregate that shall be passed in FP/vector registers
10218    according to the ELFv2 ABI, return the homogeneous element mode in
10219    *ELT_MODE and the number of elements in *N_ELTS, and return TRUE.
10220
10221    Otherwise, set *ELT_MODE to MODE and *N_ELTS to 1, and return FALSE.  */
10222
10223 static bool
10224 rs6000_discover_homogeneous_aggregate (machine_mode mode, const_tree type,
10225                                        machine_mode *elt_mode,
10226                                        int *n_elts)
10227 {
10228   /* Note that we do not accept complex types at the top level as
10229      homogeneous aggregates; these types are handled via the
10230      targetm.calls.split_complex_arg mechanism.  Complex types
10231      can be elements of homogeneous aggregates, however.  */
10232   if (TARGET_HARD_FLOAT && DEFAULT_ABI == ABI_ELFv2 && type
10233       && AGGREGATE_TYPE_P (type))
10234     {
10235       machine_mode field_mode = VOIDmode;
10236       int field_count = rs6000_aggregate_candidate (type, &field_mode);
10237
10238       if (field_count > 0)
10239         {
10240           int reg_size = ALTIVEC_OR_VSX_VECTOR_MODE (field_mode) ? 16 : 8;
10241           int field_size = ROUND_UP (GET_MODE_SIZE (field_mode), reg_size);
10242
10243           /* The ELFv2 ABI allows homogeneous aggregates to occupy
10244              up to AGGR_ARG_NUM_REG registers.  */
10245           if (field_count * field_size <= AGGR_ARG_NUM_REG * reg_size)
10246             {
10247               if (elt_mode)
10248                 *elt_mode = field_mode;
10249               if (n_elts)
10250                 *n_elts = field_count;
10251               return true;
10252             }
10253         }
10254     }
10255
10256   if (elt_mode)
10257     *elt_mode = mode;
10258   if (n_elts)
10259     *n_elts = 1;
10260   return false;
10261 }
10262
10263 /* Return a nonzero value to say to return the function value in
10264    memory, just as large structures are always returned.  TYPE will be
10265    the data type of the value, and FNTYPE will be the type of the
10266    function doing the returning, or @code{NULL} for libcalls.
10267
10268    The AIX ABI for the RS/6000 specifies that all structures are
10269    returned in memory.  The Darwin ABI does the same.
10270    
10271    For the Darwin 64 Bit ABI, a function result can be returned in
10272    registers or in memory, depending on the size of the return data
10273    type.  If it is returned in registers, the value occupies the same
10274    registers as it would if it were the first and only function
10275    argument.  Otherwise, the function places its result in memory at
10276    the location pointed to by GPR3.
10277    
10278    The SVR4 ABI specifies that structures <= 8 bytes are returned in r3/r4, 
10279    but a draft put them in memory, and GCC used to implement the draft
10280    instead of the final standard.  Therefore, aix_struct_return
10281    controls this instead of DEFAULT_ABI; V.4 targets needing backward
10282    compatibility can change DRAFT_V4_STRUCT_RET to override the
10283    default, and -m switches get the final word.  See
10284    rs6000_option_override_internal for more details.
10285
10286    The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
10287    long double support is enabled.  These values are returned in memory.
10288
10289    int_size_in_bytes returns -1 for variable size objects, which go in
10290    memory always.  The cast to unsigned makes -1 > 8.  */
10291
10292 static bool
10293 rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
10294 {
10295   /* For the Darwin64 ABI, test if we can fit the return value in regs.  */
10296   if (TARGET_MACHO
10297       && rs6000_darwin64_abi
10298       && TREE_CODE (type) == RECORD_TYPE
10299       && int_size_in_bytes (type) > 0)
10300     {
10301       CUMULATIVE_ARGS valcum;
10302       rtx valret;
10303
10304       valcum.words = 0;
10305       valcum.fregno = FP_ARG_MIN_REG;
10306       valcum.vregno = ALTIVEC_ARG_MIN_REG;
10307       /* Do a trial code generation as if this were going to be passed
10308          as an argument; if any part goes in memory, we return NULL.  */
10309       valret = rs6000_darwin64_record_arg (&valcum, type, true, true);
10310       if (valret)
10311         return false;
10312       /* Otherwise fall through to more conventional ABI rules.  */
10313     }
10314
10315   /* The ELFv2 ABI returns homogeneous VFP aggregates in registers */
10316   if (rs6000_discover_homogeneous_aggregate (TYPE_MODE (type), type,
10317                                              NULL, NULL))
10318     return false;
10319
10320   /* The ELFv2 ABI returns aggregates up to 16B in registers */
10321   if (DEFAULT_ABI == ABI_ELFv2 && AGGREGATE_TYPE_P (type)
10322       && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) <= 16)
10323     return false;
10324
10325   if (AGGREGATE_TYPE_P (type)
10326       && (aix_struct_return
10327           || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
10328     return true;
10329
10330   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
10331      modes only exist for GCC vector types if -maltivec.  */
10332   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
10333       && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
10334     return false;
10335
10336   /* Return synthetic vectors in memory.  */
10337   if (TREE_CODE (type) == VECTOR_TYPE
10338       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
10339     {
10340       static bool warned_for_return_big_vectors = false;
10341       if (!warned_for_return_big_vectors)
10342         {
10343           warning (OPT_Wpsabi, "GCC vector returned by reference: "
10344                    "non-standard ABI extension with no compatibility "
10345                    "guarantee");
10346           warned_for_return_big_vectors = true;
10347         }
10348       return true;
10349     }
10350
10351   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD
10352       && FLOAT128_IEEE_P (TYPE_MODE (type)))
10353     return true;
10354
10355   return false;
10356 }
10357
10358 /* Specify whether values returned in registers should be at the most
10359    significant end of a register.  We want aggregates returned by
10360    value to match the way aggregates are passed to functions.  */
10361
10362 static bool
10363 rs6000_return_in_msb (const_tree valtype)
10364 {
10365   return (DEFAULT_ABI == ABI_ELFv2
10366           && BYTES_BIG_ENDIAN
10367           && AGGREGATE_TYPE_P (valtype)
10368           && (rs6000_function_arg_padding (TYPE_MODE (valtype), valtype)
10369               == PAD_UPWARD));
10370 }
10371
10372 #ifdef HAVE_AS_GNU_ATTRIBUTE
10373 /* Return TRUE if a call to function FNDECL may be one that
10374    potentially affects the function calling ABI of the object file.  */
10375
10376 static bool
10377 call_ABI_of_interest (tree fndecl)
10378 {
10379   if (rs6000_gnu_attr && symtab->state == EXPANSION)
10380     {
10381       struct cgraph_node *c_node;
10382
10383       /* Libcalls are always interesting.  */
10384       if (fndecl == NULL_TREE)
10385         return true;
10386
10387       /* Any call to an external function is interesting.  */
10388       if (DECL_EXTERNAL (fndecl))
10389         return true;
10390
10391       /* Interesting functions that we are emitting in this object file.  */
10392       c_node = cgraph_node::get (fndecl);
10393       c_node = c_node->ultimate_alias_target ();
10394       return !c_node->only_called_directly_p ();
10395     }
10396   return false;
10397 }
10398 #endif
10399
10400 /* Initialize a variable CUM of type CUMULATIVE_ARGS
10401    for a call to a function whose data type is FNTYPE.
10402    For a library call, FNTYPE is 0 and RETURN_MODE the return value mode.
10403
10404    For incoming args we set the number of arguments in the prototype large
10405    so we never return a PARALLEL.  */
10406
10407 void
10408 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
10409                       rtx libname ATTRIBUTE_UNUSED, int incoming,
10410                       int libcall, int n_named_args,
10411                       tree fndecl,
10412                       machine_mode return_mode ATTRIBUTE_UNUSED)
10413 {
10414   static CUMULATIVE_ARGS zero_cumulative;
10415
10416   *cum = zero_cumulative;
10417   cum->words = 0;
10418   cum->fregno = FP_ARG_MIN_REG;
10419   cum->vregno = ALTIVEC_ARG_MIN_REG;
10420   cum->prototype = (fntype && prototype_p (fntype));
10421   cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
10422                       ? CALL_LIBCALL : CALL_NORMAL);
10423   cum->sysv_gregno = GP_ARG_MIN_REG;
10424   cum->stdarg = stdarg_p (fntype);
10425   cum->libcall = libcall;
10426
10427   cum->nargs_prototype = 0;
10428   if (incoming || cum->prototype)
10429     cum->nargs_prototype = n_named_args;
10430
10431   /* Check for a longcall attribute.  */
10432   if ((!fntype && rs6000_default_long_calls)
10433       || (fntype
10434           && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
10435           && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
10436     cum->call_cookie |= CALL_LONG;
10437   else if (DEFAULT_ABI != ABI_DARWIN)
10438     {
10439       bool is_local = (fndecl
10440                        && !DECL_EXTERNAL (fndecl)
10441                        && !DECL_WEAK (fndecl)
10442                        && (*targetm.binds_local_p) (fndecl));
10443       if (is_local)
10444         ;
10445       else if (flag_plt)
10446         {
10447           if (fntype
10448               && lookup_attribute ("noplt", TYPE_ATTRIBUTES (fntype)))
10449             cum->call_cookie |= CALL_LONG;
10450         }
10451       else
10452         {
10453           if (!(fntype
10454                 && lookup_attribute ("plt", TYPE_ATTRIBUTES (fntype))))
10455             cum->call_cookie |= CALL_LONG;
10456         }
10457     }
10458
10459   if (TARGET_DEBUG_ARG)
10460     {
10461       fprintf (stderr, "\ninit_cumulative_args:");
10462       if (fntype)
10463         {
10464           tree ret_type = TREE_TYPE (fntype);
10465           fprintf (stderr, " ret code = %s,",
10466                    get_tree_code_name (TREE_CODE (ret_type)));
10467         }
10468
10469       if (cum->call_cookie & CALL_LONG)
10470         fprintf (stderr, " longcall,");
10471
10472       fprintf (stderr, " proto = %d, nargs = %d\n",
10473                cum->prototype, cum->nargs_prototype);
10474     }
10475
10476 #ifdef HAVE_AS_GNU_ATTRIBUTE
10477   if (TARGET_ELF && (TARGET_64BIT || DEFAULT_ABI == ABI_V4))
10478     {
10479       cum->escapes = call_ABI_of_interest (fndecl);
10480       if (cum->escapes)
10481         {
10482           tree return_type;
10483
10484           if (fntype)
10485             {
10486               return_type = TREE_TYPE (fntype);
10487               return_mode = TYPE_MODE (return_type);
10488             }
10489           else
10490             return_type = lang_hooks.types.type_for_mode (return_mode, 0);
10491
10492           if (return_type != NULL)
10493             {
10494               if (TREE_CODE (return_type) == RECORD_TYPE
10495                   && TYPE_TRANSPARENT_AGGR (return_type))
10496                 {
10497                   return_type = TREE_TYPE (first_field (return_type));
10498                   return_mode = TYPE_MODE (return_type);
10499                 }
10500               if (AGGREGATE_TYPE_P (return_type)
10501                   && ((unsigned HOST_WIDE_INT) int_size_in_bytes (return_type)
10502                       <= 8))
10503                 rs6000_returns_struct = true;
10504             }
10505           if (SCALAR_FLOAT_MODE_P (return_mode))
10506             {
10507               rs6000_passes_float = true;
10508               if ((HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE || TARGET_64BIT)
10509                   && (FLOAT128_IBM_P (return_mode)
10510                       || FLOAT128_IEEE_P (return_mode)
10511                       || (return_type != NULL
10512                           && (TYPE_MAIN_VARIANT (return_type)
10513                               == long_double_type_node))))
10514                 rs6000_passes_long_double = true;
10515
10516               /* Note if we passed or return a IEEE 128-bit type.  We changed
10517                  the mangling for these types, and we may need to make an alias
10518                  with the old mangling.  */
10519               if (FLOAT128_IEEE_P (return_mode))
10520                 rs6000_passes_ieee128 = true;
10521             }
10522           if (ALTIVEC_OR_VSX_VECTOR_MODE (return_mode))
10523             rs6000_passes_vector = true;
10524         }
10525     }
10526 #endif
10527
10528   if (fntype
10529       && !TARGET_ALTIVEC
10530       && TARGET_ALTIVEC_ABI
10531       && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
10532     {
10533       error ("cannot return value in vector register because"
10534              " altivec instructions are disabled, use %qs"
10535              " to enable them", "-maltivec");
10536     }
10537 }
10538 \f
10539 /* The mode the ABI uses for a word.  This is not the same as word_mode
10540    for -m32 -mpowerpc64.  This is used to implement various target hooks.  */
10541
10542 static scalar_int_mode
10543 rs6000_abi_word_mode (void)
10544 {
10545   return TARGET_32BIT ? SImode : DImode;
10546 }
10547
10548 /* Implement the TARGET_OFFLOAD_OPTIONS hook.  */
10549 static char *
10550 rs6000_offload_options (void)
10551 {
10552   if (TARGET_64BIT)
10553     return xstrdup ("-foffload-abi=lp64");
10554   else
10555     return xstrdup ("-foffload-abi=ilp32");
10556 }
10557
10558 /* On rs6000, function arguments are promoted, as are function return
10559    values.  */
10560
10561 static machine_mode
10562 rs6000_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
10563                               machine_mode mode,
10564                               int *punsignedp ATTRIBUTE_UNUSED,
10565                               const_tree, int)
10566 {
10567   PROMOTE_MODE (mode, *punsignedp, type);
10568
10569   return mode;
10570 }
10571
10572 /* Return true if TYPE must be passed on the stack and not in registers.  */
10573
10574 static bool
10575 rs6000_must_pass_in_stack (machine_mode mode, const_tree type)
10576 {
10577   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2 || TARGET_64BIT)
10578     return must_pass_in_stack_var_size (mode, type);
10579   else
10580     return must_pass_in_stack_var_size_or_pad (mode, type);
10581 }
10582
10583 static inline bool
10584 is_complex_IBM_long_double (machine_mode mode)
10585 {
10586   return mode == ICmode || (mode == TCmode && FLOAT128_IBM_P (TCmode));
10587 }
10588
10589 /* Whether ABI_V4 passes MODE args to a function in floating point
10590    registers.  */
10591
10592 static bool
10593 abi_v4_pass_in_fpr (machine_mode mode, bool named)
10594 {
10595   if (!TARGET_HARD_FLOAT)
10596     return false;
10597   if (mode == DFmode)
10598     return true;
10599   if (mode == SFmode && named)
10600     return true;
10601   /* ABI_V4 passes complex IBM long double in 8 gprs.
10602      Stupid, but we can't change the ABI now.  */
10603   if (is_complex_IBM_long_double (mode))
10604     return false;
10605   if (FLOAT128_2REG_P (mode))
10606     return true;
10607   if (DECIMAL_FLOAT_MODE_P (mode))
10608     return true;
10609   return false;
10610 }
10611
10612 /* Implement TARGET_FUNCTION_ARG_PADDING.
10613
10614    For the AIX ABI structs are always stored left shifted in their
10615    argument slot.  */
10616
10617 static pad_direction
10618 rs6000_function_arg_padding (machine_mode mode, const_tree type)
10619 {
10620 #ifndef AGGREGATE_PADDING_FIXED
10621 #define AGGREGATE_PADDING_FIXED 0
10622 #endif
10623 #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
10624 #define AGGREGATES_PAD_UPWARD_ALWAYS 0
10625 #endif
10626
10627   if (!AGGREGATE_PADDING_FIXED)
10628     {
10629       /* GCC used to pass structures of the same size as integer types as
10630          if they were in fact integers, ignoring TARGET_FUNCTION_ARG_PADDING.
10631          i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
10632          passed padded downward, except that -mstrict-align further
10633          muddied the water in that multi-component structures of 2 and 4
10634          bytes in size were passed padded upward.
10635
10636          The following arranges for best compatibility with previous
10637          versions of gcc, but removes the -mstrict-align dependency.  */
10638       if (BYTES_BIG_ENDIAN)
10639         {
10640           HOST_WIDE_INT size = 0;
10641
10642           if (mode == BLKmode)
10643             {
10644               if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
10645                 size = int_size_in_bytes (type);
10646             }
10647           else
10648             size = GET_MODE_SIZE (mode);
10649
10650           if (size == 1 || size == 2 || size == 4)
10651             return PAD_DOWNWARD;
10652         }
10653       return PAD_UPWARD;
10654     }
10655
10656   if (AGGREGATES_PAD_UPWARD_ALWAYS)
10657     {
10658       if (type != 0 && AGGREGATE_TYPE_P (type))
10659         return PAD_UPWARD;
10660     }
10661
10662   /* Fall back to the default.  */
10663   return default_function_arg_padding (mode, type);
10664 }
10665
10666 /* If defined, a C expression that gives the alignment boundary, in bits,
10667    of an argument with the specified mode and type.  If it is not defined,
10668    PARM_BOUNDARY is used for all arguments.
10669
10670    V.4 wants long longs and doubles to be double word aligned.  Just
10671    testing the mode size is a boneheaded way to do this as it means
10672    that other types such as complex int are also double word aligned.
10673    However, we're stuck with this because changing the ABI might break
10674    existing library interfaces.
10675
10676    Quadword align Altivec/VSX vectors.
10677    Quadword align large synthetic vector types.   */
10678
10679 static unsigned int
10680 rs6000_function_arg_boundary (machine_mode mode, const_tree type)
10681 {
10682   machine_mode elt_mode;
10683   int n_elts;
10684
10685   rs6000_discover_homogeneous_aggregate (mode, type, &elt_mode, &n_elts);
10686
10687   if (DEFAULT_ABI == ABI_V4
10688       && (GET_MODE_SIZE (mode) == 8
10689           || (TARGET_HARD_FLOAT
10690               && !is_complex_IBM_long_double (mode)
10691               && FLOAT128_2REG_P (mode))))
10692     return 64;
10693   else if (FLOAT128_VECTOR_P (mode))
10694     return 128;
10695   else if (type && TREE_CODE (type) == VECTOR_TYPE
10696            && int_size_in_bytes (type) >= 8
10697            && int_size_in_bytes (type) < 16)
10698     return 64;
10699   else if (ALTIVEC_OR_VSX_VECTOR_MODE (elt_mode)
10700            || (type && TREE_CODE (type) == VECTOR_TYPE
10701                && int_size_in_bytes (type) >= 16))
10702     return 128;
10703
10704   /* Aggregate types that need > 8 byte alignment are quadword-aligned
10705      in the parameter area in the ELFv2 ABI, and in the AIX ABI unless
10706      -mcompat-align-parm is used.  */
10707   if (((DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm)
10708        || DEFAULT_ABI == ABI_ELFv2)
10709       && type && TYPE_ALIGN (type) > 64)
10710     {
10711       /* "Aggregate" means any AGGREGATE_TYPE except for single-element
10712          or homogeneous float/vector aggregates here.  We already handled
10713          vector aggregates above, but still need to check for float here. */
10714       bool aggregate_p = (AGGREGATE_TYPE_P (type)
10715                           && !SCALAR_FLOAT_MODE_P (elt_mode));
10716
10717       /* We used to check for BLKmode instead of the above aggregate type
10718          check.  Warn when this results in any difference to the ABI.  */
10719       if (aggregate_p != (mode == BLKmode))
10720         {
10721           static bool warned;
10722           if (!warned && warn_psabi)
10723             {
10724               warned = true;
10725               inform (input_location,
10726                       "the ABI of passing aggregates with %d-byte alignment"
10727                       " has changed in GCC 5",
10728                       (int) TYPE_ALIGN (type) / BITS_PER_UNIT);
10729             }
10730         }
10731
10732       if (aggregate_p)
10733         return 128;
10734     }
10735
10736   /* Similar for the Darwin64 ABI.  Note that for historical reasons we
10737      implement the "aggregate type" check as a BLKmode check here; this
10738      means certain aggregate types are in fact not aligned.  */
10739   if (TARGET_MACHO && rs6000_darwin64_abi
10740       && mode == BLKmode
10741       && type && TYPE_ALIGN (type) > 64)
10742     return 128;
10743
10744   return PARM_BOUNDARY;
10745 }
10746
10747 /* The offset in words to the start of the parameter save area.  */
10748
10749 static unsigned int
10750 rs6000_parm_offset (void)
10751 {
10752   return (DEFAULT_ABI == ABI_V4 ? 2
10753           : DEFAULT_ABI == ABI_ELFv2 ? 4
10754           : 6);
10755 }
10756
10757 /* For a function parm of MODE and TYPE, return the starting word in
10758    the parameter area.  NWORDS of the parameter area are already used.  */
10759
10760 static unsigned int
10761 rs6000_parm_start (machine_mode mode, const_tree type,
10762                    unsigned int nwords)
10763 {
10764   unsigned int align;
10765
10766   align = rs6000_function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
10767   return nwords + (-(rs6000_parm_offset () + nwords) & align);
10768 }
10769
10770 /* Compute the size (in words) of a function argument.  */
10771
10772 static unsigned long
10773 rs6000_arg_size (machine_mode mode, const_tree type)
10774 {
10775   unsigned long size;
10776
10777   if (mode != BLKmode)
10778     size = GET_MODE_SIZE (mode);
10779   else
10780     size = int_size_in_bytes (type);
10781
10782   if (TARGET_32BIT)
10783     return (size + 3) >> 2;
10784   else
10785     return (size + 7) >> 3;
10786 }
10787 \f
10788 /* Use this to flush pending int fields.  */
10789
10790 static void
10791 rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
10792                                           HOST_WIDE_INT bitpos, int final)
10793 {
10794   unsigned int startbit, endbit;
10795   int intregs, intoffset;
10796
10797   /* Handle the situations where a float is taking up the first half
10798      of the GPR, and the other half is empty (typically due to
10799      alignment restrictions). We can detect this by a 8-byte-aligned
10800      int field, or by seeing that this is the final flush for this
10801      argument. Count the word and continue on.  */
10802   if (cum->floats_in_gpr == 1
10803       && (cum->intoffset % 64 == 0
10804           || (cum->intoffset == -1 && final)))
10805     {
10806       cum->words++;
10807       cum->floats_in_gpr = 0;
10808     }
10809
10810   if (cum->intoffset == -1)
10811     return;
10812
10813   intoffset = cum->intoffset;
10814   cum->intoffset = -1;
10815   cum->floats_in_gpr = 0;
10816
10817   if (intoffset % BITS_PER_WORD != 0)
10818     {
10819       unsigned int bits = BITS_PER_WORD - intoffset % BITS_PER_WORD;
10820       if (!int_mode_for_size (bits, 0).exists ())
10821         {
10822           /* We couldn't find an appropriate mode, which happens,
10823              e.g., in packed structs when there are 3 bytes to load.
10824              Back intoffset back to the beginning of the word in this
10825              case.  */
10826           intoffset = ROUND_DOWN (intoffset, BITS_PER_WORD);
10827         }
10828     }
10829
10830   startbit = ROUND_DOWN (intoffset, BITS_PER_WORD);
10831   endbit = ROUND_UP (bitpos, BITS_PER_WORD);
10832   intregs = (endbit - startbit) / BITS_PER_WORD;
10833   cum->words += intregs;
10834   /* words should be unsigned. */
10835   if ((unsigned)cum->words < (endbit/BITS_PER_WORD))
10836     {
10837       int pad = (endbit/BITS_PER_WORD) - cum->words;
10838       cum->words += pad;
10839     }
10840 }
10841
10842 /* The darwin64 ABI calls for us to recurse down through structs,
10843    looking for elements passed in registers.  Unfortunately, we have
10844    to track int register count here also because of misalignments
10845    in powerpc alignment mode.  */
10846
10847 static void
10848 rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
10849                                             const_tree type,
10850                                             HOST_WIDE_INT startbitpos)
10851 {
10852   tree f;
10853
10854   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
10855     if (TREE_CODE (f) == FIELD_DECL)
10856       {
10857         HOST_WIDE_INT bitpos = startbitpos;
10858         tree ftype = TREE_TYPE (f);
10859         machine_mode mode;
10860         if (ftype == error_mark_node)
10861           continue;
10862         mode = TYPE_MODE (ftype);
10863
10864         if (DECL_SIZE (f) != 0
10865             && tree_fits_uhwi_p (bit_position (f)))
10866           bitpos += int_bit_position (f);
10867
10868         /* ??? FIXME: else assume zero offset.  */
10869
10870         if (TREE_CODE (ftype) == RECORD_TYPE)
10871           rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
10872         else if (USE_FP_FOR_ARG_P (cum, mode))
10873           {
10874             unsigned n_fpregs = (GET_MODE_SIZE (mode) + 7) >> 3;
10875             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
10876             cum->fregno += n_fpregs;
10877             /* Single-precision floats present a special problem for
10878                us, because they are smaller than an 8-byte GPR, and so
10879                the structure-packing rules combined with the standard
10880                varargs behavior mean that we want to pack float/float
10881                and float/int combinations into a single register's
10882                space. This is complicated by the arg advance flushing,
10883                which works on arbitrarily large groups of int-type
10884                fields.  */
10885             if (mode == SFmode)
10886               {
10887                 if (cum->floats_in_gpr == 1)
10888                   {
10889                     /* Two floats in a word; count the word and reset
10890                        the float count.  */
10891                     cum->words++;
10892                     cum->floats_in_gpr = 0;
10893                   }
10894                 else if (bitpos % 64 == 0)
10895                   {
10896                     /* A float at the beginning of an 8-byte word;
10897                        count it and put off adjusting cum->words until
10898                        we see if a arg advance flush is going to do it
10899                        for us.  */
10900                     cum->floats_in_gpr++;
10901                   }
10902                 else
10903                   {
10904                     /* The float is at the end of a word, preceded
10905                        by integer fields, so the arg advance flush
10906                        just above has already set cum->words and
10907                        everything is taken care of.  */
10908                   }
10909               }
10910             else
10911               cum->words += n_fpregs;
10912           }
10913         else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, 1))
10914           {
10915             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
10916             cum->vregno++;
10917             cum->words += 2;
10918           }
10919         else if (cum->intoffset == -1)
10920           cum->intoffset = bitpos;
10921       }
10922 }
10923
10924 /* Check for an item that needs to be considered specially under the darwin 64
10925    bit ABI.  These are record types where the mode is BLK or the structure is
10926    8 bytes in size.  */
10927 static int
10928 rs6000_darwin64_struct_check_p (machine_mode mode, const_tree type)
10929 {
10930   return rs6000_darwin64_abi
10931          && ((mode == BLKmode 
10932               && TREE_CODE (type) == RECORD_TYPE 
10933               && int_size_in_bytes (type) > 0)
10934           || (type && TREE_CODE (type) == RECORD_TYPE 
10935               && int_size_in_bytes (type) == 8)) ? 1 : 0;
10936 }
10937
10938 /* Update the data in CUM to advance over an argument
10939    of mode MODE and data type TYPE.
10940    (TYPE is null for libcalls where that information may not be available.)
10941
10942    Note that for args passed by reference, function_arg will be called
10943    with MODE and TYPE set to that of the pointer to the arg, not the arg
10944    itself.  */
10945
10946 static void
10947 rs6000_function_arg_advance_1 (CUMULATIVE_ARGS *cum, machine_mode mode,
10948                                const_tree type, bool named, int depth)
10949 {
10950   machine_mode elt_mode;
10951   int n_elts;
10952
10953   rs6000_discover_homogeneous_aggregate (mode, type, &elt_mode, &n_elts);
10954
10955   /* Only tick off an argument if we're not recursing.  */
10956   if (depth == 0)
10957     cum->nargs_prototype--;
10958
10959 #ifdef HAVE_AS_GNU_ATTRIBUTE
10960   if (TARGET_ELF && (TARGET_64BIT || DEFAULT_ABI == ABI_V4)
10961       && cum->escapes)
10962     {
10963       if (SCALAR_FLOAT_MODE_P (mode))
10964         {
10965           rs6000_passes_float = true;
10966           if ((HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE || TARGET_64BIT)
10967               && (FLOAT128_IBM_P (mode)
10968                   || FLOAT128_IEEE_P (mode)
10969                   || (type != NULL
10970                       && TYPE_MAIN_VARIANT (type) == long_double_type_node)))
10971             rs6000_passes_long_double = true;
10972
10973           /* Note if we passed or return a IEEE 128-bit type.  We changed the
10974              mangling for these types, and we may need to make an alias with
10975              the old mangling.  */
10976           if (FLOAT128_IEEE_P (mode))
10977             rs6000_passes_ieee128 = true;
10978         }
10979       if (named && ALTIVEC_OR_VSX_VECTOR_MODE (mode))
10980         rs6000_passes_vector = true;
10981     }
10982 #endif
10983
10984   if (TARGET_ALTIVEC_ABI
10985       && (ALTIVEC_OR_VSX_VECTOR_MODE (elt_mode)
10986           || (type && TREE_CODE (type) == VECTOR_TYPE
10987               && int_size_in_bytes (type) == 16)))
10988     {
10989       bool stack = false;
10990
10991       if (USE_ALTIVEC_FOR_ARG_P (cum, elt_mode, named))
10992         {
10993           cum->vregno += n_elts;
10994
10995           if (!TARGET_ALTIVEC)
10996             error ("cannot pass argument in vector register because"
10997                    " altivec instructions are disabled, use %qs"
10998                    " to enable them", "-maltivec");
10999
11000           /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
11001              even if it is going to be passed in a vector register.
11002              Darwin does the same for variable-argument functions.  */
11003           if (((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
11004                && TARGET_64BIT)
11005               || (cum->stdarg && DEFAULT_ABI != ABI_V4))
11006             stack = true;
11007         }
11008       else
11009         stack = true;
11010
11011       if (stack)
11012         {
11013           int align;
11014
11015           /* Vector parameters must be 16-byte aligned.  In 32-bit
11016              mode this means we need to take into account the offset
11017              to the parameter save area.  In 64-bit mode, they just
11018              have to start on an even word, since the parameter save
11019              area is 16-byte aligned.  */
11020           if (TARGET_32BIT)
11021             align = -(rs6000_parm_offset () + cum->words) & 3;
11022           else
11023             align = cum->words & 1;
11024           cum->words += align + rs6000_arg_size (mode, type);
11025
11026           if (TARGET_DEBUG_ARG)
11027             {
11028               fprintf (stderr, "function_adv: words = %2d, align=%d, ",
11029                        cum->words, align);
11030               fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
11031                        cum->nargs_prototype, cum->prototype,
11032                        GET_MODE_NAME (mode));
11033             }
11034         }
11035     }
11036   else if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
11037     {
11038       int size = int_size_in_bytes (type);
11039       /* Variable sized types have size == -1 and are
11040          treated as if consisting entirely of ints.
11041          Pad to 16 byte boundary if needed.  */
11042       if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
11043           && (cum->words % 2) != 0)
11044         cum->words++;
11045       /* For varargs, we can just go up by the size of the struct. */
11046       if (!named)
11047         cum->words += (size + 7) / 8;
11048       else
11049         {
11050           /* It is tempting to say int register count just goes up by
11051              sizeof(type)/8, but this is wrong in a case such as
11052              { int; double; int; } [powerpc alignment].  We have to
11053              grovel through the fields for these too.  */
11054           cum->intoffset = 0;
11055           cum->floats_in_gpr = 0;
11056           rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
11057           rs6000_darwin64_record_arg_advance_flush (cum,
11058                                                     size * BITS_PER_UNIT, 1);
11059         }
11060           if (TARGET_DEBUG_ARG)
11061             {
11062               fprintf (stderr, "function_adv: words = %2d, align=%d, size=%d",
11063                        cum->words, TYPE_ALIGN (type), size);
11064               fprintf (stderr, 
11065                    "nargs = %4d, proto = %d, mode = %4s (darwin64 abi)\n",
11066                        cum->nargs_prototype, cum->prototype,
11067                        GET_MODE_NAME (mode));
11068             }
11069     }
11070   else if (DEFAULT_ABI == ABI_V4)
11071     {
11072       if (abi_v4_pass_in_fpr (mode, named))
11073         {
11074           /* _Decimal128 must use an even/odd register pair.  This assumes
11075              that the register number is odd when fregno is odd.  */
11076           if (mode == TDmode && (cum->fregno % 2) == 1)
11077             cum->fregno++;
11078
11079           if (cum->fregno + (FLOAT128_2REG_P (mode) ? 1 : 0)
11080               <= FP_ARG_V4_MAX_REG)
11081             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
11082           else
11083             {
11084               cum->fregno = FP_ARG_V4_MAX_REG + 1;
11085               if (mode == DFmode || FLOAT128_IBM_P (mode)
11086                   || mode == DDmode || mode == TDmode)
11087                 cum->words += cum->words & 1;
11088               cum->words += rs6000_arg_size (mode, type);
11089             }
11090         }
11091       else
11092         {
11093           int n_words = rs6000_arg_size (mode, type);
11094           int gregno = cum->sysv_gregno;
11095
11096           /* Long long is put in (r3,r4), (r5,r6), (r7,r8) or (r9,r10).
11097              As does any other 2 word item such as complex int due to a
11098              historical mistake.  */
11099           if (n_words == 2)
11100             gregno += (1 - gregno) & 1;
11101
11102           /* Multi-reg args are not split between registers and stack.  */
11103           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
11104             {
11105               /* Long long is aligned on the stack.  So are other 2 word
11106                  items such as complex int due to a historical mistake.  */
11107               if (n_words == 2)
11108                 cum->words += cum->words & 1;
11109               cum->words += n_words;
11110             }
11111
11112           /* Note: continuing to accumulate gregno past when we've started
11113              spilling to the stack indicates the fact that we've started
11114              spilling to the stack to expand_builtin_saveregs.  */
11115           cum->sysv_gregno = gregno + n_words;
11116         }
11117
11118       if (TARGET_DEBUG_ARG)
11119         {
11120           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
11121                    cum->words, cum->fregno);
11122           fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
11123                    cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
11124           fprintf (stderr, "mode = %4s, named = %d\n",
11125                    GET_MODE_NAME (mode), named);
11126         }
11127     }
11128   else
11129     {
11130       int n_words = rs6000_arg_size (mode, type);
11131       int start_words = cum->words;
11132       int align_words = rs6000_parm_start (mode, type, start_words);
11133
11134       cum->words = align_words + n_words;
11135
11136       if (SCALAR_FLOAT_MODE_P (elt_mode) && TARGET_HARD_FLOAT)
11137         {
11138           /* _Decimal128 must be passed in an even/odd float register pair.
11139              This assumes that the register number is odd when fregno is
11140              odd.  */
11141           if (elt_mode == TDmode && (cum->fregno % 2) == 1)
11142             cum->fregno++;
11143           cum->fregno += n_elts * ((GET_MODE_SIZE (elt_mode) + 7) >> 3);
11144         }
11145
11146       if (TARGET_DEBUG_ARG)
11147         {
11148           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
11149                    cum->words, cum->fregno);
11150           fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
11151                    cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
11152           fprintf (stderr, "named = %d, align = %d, depth = %d\n",
11153                    named, align_words - start_words, depth);
11154         }
11155     }
11156 }
11157
11158 static void
11159 rs6000_function_arg_advance (cumulative_args_t cum, machine_mode mode,
11160                              const_tree type, bool named)
11161 {
11162   rs6000_function_arg_advance_1 (get_cumulative_args (cum), mode, type, named,
11163                                  0);
11164 }
11165
11166 /* A subroutine of rs6000_darwin64_record_arg.  Assign the bits of the
11167    structure between cum->intoffset and bitpos to integer registers.  */
11168
11169 static void
11170 rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
11171                                   HOST_WIDE_INT bitpos, rtx rvec[], int *k)
11172 {
11173   machine_mode mode;
11174   unsigned int regno;
11175   unsigned int startbit, endbit;
11176   int this_regno, intregs, intoffset;
11177   rtx reg;
11178
11179   if (cum->intoffset == -1)
11180     return;
11181
11182   intoffset = cum->intoffset;
11183   cum->intoffset = -1;
11184
11185   /* If this is the trailing part of a word, try to only load that
11186      much into the register.  Otherwise load the whole register.  Note
11187      that in the latter case we may pick up unwanted bits.  It's not a
11188      problem at the moment but may wish to revisit.  */
11189
11190   if (intoffset % BITS_PER_WORD != 0)
11191     {
11192       unsigned int bits = BITS_PER_WORD - intoffset % BITS_PER_WORD;
11193       if (!int_mode_for_size (bits, 0).exists (&mode))
11194         {
11195           /* We couldn't find an appropriate mode, which happens,
11196              e.g., in packed structs when there are 3 bytes to load.
11197              Back intoffset back to the beginning of the word in this
11198              case.  */
11199           intoffset = ROUND_DOWN (intoffset, BITS_PER_WORD);
11200           mode = word_mode;
11201         }
11202     }
11203   else
11204     mode = word_mode;
11205
11206   startbit = ROUND_DOWN (intoffset, BITS_PER_WORD);
11207   endbit = ROUND_UP (bitpos, BITS_PER_WORD);
11208   intregs = (endbit - startbit) / BITS_PER_WORD;
11209   this_regno = cum->words + intoffset / BITS_PER_WORD;
11210
11211   if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
11212     cum->use_stack = 1;
11213
11214   intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
11215   if (intregs <= 0)
11216     return;
11217
11218   intoffset /= BITS_PER_UNIT;
11219   do
11220     {
11221       regno = GP_ARG_MIN_REG + this_regno;
11222       reg = gen_rtx_REG (mode, regno);
11223       rvec[(*k)++] =
11224         gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
11225
11226       this_regno += 1;
11227       intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
11228       mode = word_mode;
11229       intregs -= 1;
11230     }
11231   while (intregs > 0);
11232 }
11233
11234 /* Recursive workhorse for the following.  */
11235
11236 static void
11237 rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type,
11238                                     HOST_WIDE_INT startbitpos, rtx rvec[],
11239                                     int *k)
11240 {
11241   tree f;
11242
11243   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
11244     if (TREE_CODE (f) == FIELD_DECL)
11245       {
11246         HOST_WIDE_INT bitpos = startbitpos;
11247         tree ftype = TREE_TYPE (f);
11248         machine_mode mode;
11249         if (ftype == error_mark_node)
11250           continue;
11251         mode = TYPE_MODE (ftype);
11252
11253         if (DECL_SIZE (f) != 0
11254             && tree_fits_uhwi_p (bit_position (f)))
11255           bitpos += int_bit_position (f);
11256
11257         /* ??? FIXME: else assume zero offset.  */
11258
11259         if (TREE_CODE (ftype) == RECORD_TYPE)
11260           rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
11261         else if (cum->named && USE_FP_FOR_ARG_P (cum, mode))
11262           {
11263             unsigned n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
11264 #if 0
11265             switch (mode)
11266               {
11267               case E_SCmode: mode = SFmode; break;
11268               case E_DCmode: mode = DFmode; break;
11269               case E_TCmode: mode = TFmode; break;
11270               default: break;
11271               }
11272 #endif
11273             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
11274             if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
11275               {
11276                 gcc_assert (cum->fregno == FP_ARG_MAX_REG
11277                             && (mode == TFmode || mode == TDmode));
11278                 /* Long double or _Decimal128 split over regs and memory.  */
11279                 mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : DFmode;
11280                 cum->use_stack=1;
11281               }
11282             rvec[(*k)++]
11283               = gen_rtx_EXPR_LIST (VOIDmode,
11284                                    gen_rtx_REG (mode, cum->fregno++),
11285                                    GEN_INT (bitpos / BITS_PER_UNIT));
11286             if (FLOAT128_2REG_P (mode))
11287               cum->fregno++;
11288           }
11289         else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, 1))
11290           {
11291             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
11292             rvec[(*k)++]
11293               = gen_rtx_EXPR_LIST (VOIDmode,
11294                                    gen_rtx_REG (mode, cum->vregno++),
11295                                    GEN_INT (bitpos / BITS_PER_UNIT));
11296           }
11297         else if (cum->intoffset == -1)
11298           cum->intoffset = bitpos;
11299       }
11300 }
11301
11302 /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
11303    the register(s) to be used for each field and subfield of a struct
11304    being passed by value, along with the offset of where the
11305    register's value may be found in the block.  FP fields go in FP
11306    register, vector fields go in vector registers, and everything
11307    else goes in int registers, packed as in memory.
11308
11309    This code is also used for function return values.  RETVAL indicates
11310    whether this is the case.
11311
11312    Much of this is taken from the SPARC V9 port, which has a similar
11313    calling convention.  */
11314
11315 static rtx
11316 rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, const_tree type,
11317                             bool named, bool retval)
11318 {
11319   rtx rvec[FIRST_PSEUDO_REGISTER];
11320   int k = 1, kbase = 1;
11321   HOST_WIDE_INT typesize = int_size_in_bytes (type);
11322   /* This is a copy; modifications are not visible to our caller.  */
11323   CUMULATIVE_ARGS copy_cum = *orig_cum;
11324   CUMULATIVE_ARGS *cum = &copy_cum;
11325
11326   /* Pad to 16 byte boundary if needed.  */
11327   if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
11328       && (cum->words % 2) != 0)
11329     cum->words++;
11330
11331   cum->intoffset = 0;
11332   cum->use_stack = 0;
11333   cum->named = named;
11334
11335   /* Put entries into rvec[] for individual FP and vector fields, and
11336      for the chunks of memory that go in int regs.  Note we start at
11337      element 1; 0 is reserved for an indication of using memory, and
11338      may or may not be filled in below. */
11339   rs6000_darwin64_record_arg_recurse (cum, type, /* startbit pos= */ 0, rvec, &k);
11340   rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
11341
11342   /* If any part of the struct went on the stack put all of it there.
11343      This hack is because the generic code for
11344      FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
11345      parts of the struct are not at the beginning.  */
11346   if (cum->use_stack)
11347     {
11348       if (retval)
11349         return NULL_RTX;    /* doesn't go in registers at all */
11350       kbase = 0;
11351       rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
11352     }
11353   if (k > 1 || cum->use_stack)
11354     return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
11355   else
11356     return NULL_RTX;
11357 }
11358
11359 /* Determine where to place an argument in 64-bit mode with 32-bit ABI.  */
11360
11361 static rtx
11362 rs6000_mixed_function_arg (machine_mode mode, const_tree type,
11363                            int align_words)
11364 {
11365   int n_units;
11366   int i, k;
11367   rtx rvec[GP_ARG_NUM_REG + 1];
11368
11369   if (align_words >= GP_ARG_NUM_REG)
11370     return NULL_RTX;
11371
11372   n_units = rs6000_arg_size (mode, type);
11373
11374   /* Optimize the simple case where the arg fits in one gpr, except in
11375      the case of BLKmode due to assign_parms assuming that registers are
11376      BITS_PER_WORD wide.  */
11377   if (n_units == 0
11378       || (n_units == 1 && mode != BLKmode))
11379     return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
11380
11381   k = 0;
11382   if (align_words + n_units > GP_ARG_NUM_REG)
11383     /* Not all of the arg fits in gprs.  Say that it goes in memory too,
11384        using a magic NULL_RTX component.
11385        This is not strictly correct.  Only some of the arg belongs in
11386        memory, not all of it.  However, the normal scheme using
11387        function_arg_partial_nregs can result in unusual subregs, eg.
11388        (subreg:SI (reg:DF) 4), which are not handled well.  The code to
11389        store the whole arg to memory is often more efficient than code
11390        to store pieces, and we know that space is available in the right
11391        place for the whole arg.  */
11392     rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
11393
11394   i = 0;
11395   do
11396     {
11397       rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
11398       rtx off = GEN_INT (i++ * 4);
11399       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
11400     }
11401   while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
11402
11403   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
11404 }
11405
11406 /* We have an argument of MODE and TYPE that goes into FPRs or VRs,
11407    but must also be copied into the parameter save area starting at
11408    offset ALIGN_WORDS.  Fill in RVEC with the elements corresponding
11409    to the GPRs and/or memory.  Return the number of elements used.  */
11410
11411 static int
11412 rs6000_psave_function_arg (machine_mode mode, const_tree type,
11413                            int align_words, rtx *rvec)
11414 {
11415   int k = 0;
11416
11417   if (align_words < GP_ARG_NUM_REG)
11418     {
11419       int n_words = rs6000_arg_size (mode, type);
11420
11421       if (align_words + n_words > GP_ARG_NUM_REG
11422           || mode == BLKmode
11423           || (TARGET_32BIT && TARGET_POWERPC64))
11424         {
11425           /* If this is partially on the stack, then we only
11426              include the portion actually in registers here.  */
11427           machine_mode rmode = TARGET_32BIT ? SImode : DImode;
11428           int i = 0;
11429
11430           if (align_words + n_words > GP_ARG_NUM_REG)
11431             {
11432               /* Not all of the arg fits in gprs.  Say that it goes in memory
11433                  too, using a magic NULL_RTX component.  Also see comment in
11434                  rs6000_mixed_function_arg for why the normal
11435                  function_arg_partial_nregs scheme doesn't work in this case. */
11436               rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
11437             }
11438
11439           do
11440             {
11441               rtx r = gen_rtx_REG (rmode, GP_ARG_MIN_REG + align_words);
11442               rtx off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
11443               rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
11444             }
11445           while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
11446         }
11447       else
11448         {
11449           /* The whole arg fits in gprs.  */
11450           rtx r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
11451           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
11452         }
11453     }
11454   else
11455     {
11456       /* It's entirely in memory.  */
11457       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
11458     }
11459
11460   return k;
11461 }
11462
11463 /* RVEC is a vector of K components of an argument of mode MODE.
11464    Construct the final function_arg return value from it.  */
11465
11466 static rtx
11467 rs6000_finish_function_arg (machine_mode mode, rtx *rvec, int k)
11468 {
11469   gcc_assert (k >= 1);
11470
11471   /* Avoid returning a PARALLEL in the trivial cases.  */
11472   if (k == 1)
11473     {
11474       if (XEXP (rvec[0], 0) == NULL_RTX)
11475         return NULL_RTX;
11476
11477       if (GET_MODE (XEXP (rvec[0], 0)) == mode)
11478         return XEXP (rvec[0], 0);
11479     }
11480
11481   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
11482 }
11483
11484 /* Determine where to put an argument to a function.
11485    Value is zero to push the argument on the stack,
11486    or a hard register in which to store the argument.
11487
11488    MODE is the argument's machine mode.
11489    TYPE is the data type of the argument (as a tree).
11490     This is null for libcalls where that information may
11491     not be available.
11492    CUM is a variable of type CUMULATIVE_ARGS which gives info about
11493     the preceding args and about the function being called.  It is
11494     not modified in this routine.
11495    NAMED is nonzero if this argument is a named parameter
11496     (otherwise it is an extra parameter matching an ellipsis).
11497
11498    On RS/6000 the first eight words of non-FP are normally in registers
11499    and the rest are pushed.  Under AIX, the first 13 FP args are in registers.
11500    Under V.4, the first 8 FP args are in registers.
11501
11502    If this is floating-point and no prototype is specified, we use
11503    both an FP and integer register (or possibly FP reg and stack).  Library
11504    functions (when CALL_LIBCALL is set) always have the proper types for args,
11505    so we can pass the FP value just in one register.  emit_library_function
11506    doesn't support PARALLEL anyway.
11507
11508    Note that for args passed by reference, function_arg will be called
11509    with MODE and TYPE set to that of the pointer to the arg, not the arg
11510    itself.  */
11511
11512 static rtx
11513 rs6000_function_arg (cumulative_args_t cum_v, machine_mode mode,
11514                      const_tree type, bool named)
11515 {
11516   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
11517   enum rs6000_abi abi = DEFAULT_ABI;
11518   machine_mode elt_mode;
11519   int n_elts;
11520
11521   /* Return a marker to indicate whether CR1 needs to set or clear the
11522      bit that V.4 uses to say fp args were passed in registers.
11523      Assume that we don't need the marker for software floating point,
11524      or compiler generated library calls.  */
11525   if (mode == VOIDmode)
11526     {
11527       if (abi == ABI_V4
11528           && (cum->call_cookie & CALL_LIBCALL) == 0
11529           && (cum->stdarg
11530               || (cum->nargs_prototype < 0
11531                   && (cum->prototype || TARGET_NO_PROTOTYPE)))
11532           && TARGET_HARD_FLOAT)
11533         return GEN_INT (cum->call_cookie
11534                         | ((cum->fregno == FP_ARG_MIN_REG)
11535                            ? CALL_V4_SET_FP_ARGS
11536                            : CALL_V4_CLEAR_FP_ARGS));
11537
11538       return GEN_INT (cum->call_cookie & ~CALL_LIBCALL);
11539     }
11540
11541   rs6000_discover_homogeneous_aggregate (mode, type, &elt_mode, &n_elts);
11542
11543   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
11544     {
11545       rtx rslt = rs6000_darwin64_record_arg (cum, type, named, /*retval= */false);
11546       if (rslt != NULL_RTX)
11547         return rslt;
11548       /* Else fall through to usual handling.  */
11549     }
11550
11551   if (USE_ALTIVEC_FOR_ARG_P (cum, elt_mode, named))
11552     {
11553       rtx rvec[GP_ARG_NUM_REG + AGGR_ARG_NUM_REG + 1];
11554       rtx r, off;
11555       int i, k = 0;
11556
11557       /* Do we also need to pass this argument in the parameter save area?
11558          Library support functions for IEEE 128-bit are assumed to not need the
11559          value passed both in GPRs and in vector registers.  */
11560       if (TARGET_64BIT && !cum->prototype
11561           && (!cum->libcall || !FLOAT128_VECTOR_P (elt_mode)))
11562         {
11563           int align_words = ROUND_UP (cum->words, 2);
11564           k = rs6000_psave_function_arg (mode, type, align_words, rvec);
11565         }
11566
11567       /* Describe where this argument goes in the vector registers.  */
11568       for (i = 0; i < n_elts && cum->vregno + i <= ALTIVEC_ARG_MAX_REG; i++)
11569         {
11570           r = gen_rtx_REG (elt_mode, cum->vregno + i);
11571           off = GEN_INT (i * GET_MODE_SIZE (elt_mode));
11572           rvec[k++] =  gen_rtx_EXPR_LIST (VOIDmode, r, off);
11573         }
11574
11575       return rs6000_finish_function_arg (mode, rvec, k);
11576     }
11577   else if (TARGET_ALTIVEC_ABI
11578            && (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
11579                || (type && TREE_CODE (type) == VECTOR_TYPE
11580                    && int_size_in_bytes (type) == 16)))
11581     {
11582       if (named || abi == ABI_V4)
11583         return NULL_RTX;
11584       else
11585         {
11586           /* Vector parameters to varargs functions under AIX or Darwin
11587              get passed in memory and possibly also in GPRs.  */
11588           int align, align_words, n_words;
11589           machine_mode part_mode;
11590
11591           /* Vector parameters must be 16-byte aligned.  In 32-bit
11592              mode this means we need to take into account the offset
11593              to the parameter save area.  In 64-bit mode, they just
11594              have to start on an even word, since the parameter save
11595              area is 16-byte aligned.  */
11596           if (TARGET_32BIT)
11597             align = -(rs6000_parm_offset () + cum->words) & 3;
11598           else
11599             align = cum->words & 1;
11600           align_words = cum->words + align;
11601
11602           /* Out of registers?  Memory, then.  */
11603           if (align_words >= GP_ARG_NUM_REG)
11604             return NULL_RTX;
11605
11606           if (TARGET_32BIT && TARGET_POWERPC64)
11607             return rs6000_mixed_function_arg (mode, type, align_words);
11608
11609           /* The vector value goes in GPRs.  Only the part of the
11610              value in GPRs is reported here.  */
11611           part_mode = mode;
11612           n_words = rs6000_arg_size (mode, type);
11613           if (align_words + n_words > GP_ARG_NUM_REG)
11614             /* Fortunately, there are only two possibilities, the value
11615                is either wholly in GPRs or half in GPRs and half not.  */
11616             part_mode = DImode;
11617
11618           return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
11619         }
11620     }
11621
11622   else if (abi == ABI_V4)
11623     {
11624       if (abi_v4_pass_in_fpr (mode, named))
11625         {
11626           /* _Decimal128 must use an even/odd register pair.  This assumes
11627              that the register number is odd when fregno is odd.  */
11628           if (mode == TDmode && (cum->fregno % 2) == 1)
11629             cum->fregno++;
11630
11631           if (cum->fregno + (FLOAT128_2REG_P (mode) ? 1 : 0)
11632               <= FP_ARG_V4_MAX_REG)
11633             return gen_rtx_REG (mode, cum->fregno);
11634           else
11635             return NULL_RTX;
11636         }
11637       else
11638         {
11639           int n_words = rs6000_arg_size (mode, type);
11640           int gregno = cum->sysv_gregno;
11641
11642           /* Long long is put in (r3,r4), (r5,r6), (r7,r8) or (r9,r10).
11643              As does any other 2 word item such as complex int due to a
11644              historical mistake.  */
11645           if (n_words == 2)
11646             gregno += (1 - gregno) & 1;
11647
11648           /* Multi-reg args are not split between registers and stack.  */
11649           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
11650             return NULL_RTX;
11651
11652           if (TARGET_32BIT && TARGET_POWERPC64)
11653             return rs6000_mixed_function_arg (mode, type,
11654                                               gregno - GP_ARG_MIN_REG);
11655           return gen_rtx_REG (mode, gregno);
11656         }
11657     }
11658   else
11659     {
11660       int align_words = rs6000_parm_start (mode, type, cum->words);
11661
11662       /* _Decimal128 must be passed in an even/odd float register pair.
11663          This assumes that the register number is odd when fregno is odd.  */
11664       if (elt_mode == TDmode && (cum->fregno % 2) == 1)
11665         cum->fregno++;
11666
11667       if (USE_FP_FOR_ARG_P (cum, elt_mode)
11668           && !(TARGET_AIX && !TARGET_ELF
11669                && type != NULL && AGGREGATE_TYPE_P (type)))
11670         {
11671           rtx rvec[GP_ARG_NUM_REG + AGGR_ARG_NUM_REG + 1];
11672           rtx r, off;
11673           int i, k = 0;
11674           unsigned long n_fpreg = (GET_MODE_SIZE (elt_mode) + 7) >> 3;
11675           int fpr_words;
11676
11677           /* Do we also need to pass this argument in the parameter
11678              save area?  */
11679           if (type && (cum->nargs_prototype <= 0
11680                        || ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
11681                            && TARGET_XL_COMPAT
11682                            && align_words >= GP_ARG_NUM_REG)))
11683             k = rs6000_psave_function_arg (mode, type, align_words, rvec);
11684
11685           /* Describe where this argument goes in the fprs.  */
11686           for (i = 0; i < n_elts
11687                       && cum->fregno + i * n_fpreg <= FP_ARG_MAX_REG; i++)
11688             {
11689               /* Check if the argument is split over registers and memory.
11690                  This can only ever happen for long double or _Decimal128;
11691                  complex types are handled via split_complex_arg.  */
11692               machine_mode fmode = elt_mode;
11693               if (cum->fregno + (i + 1) * n_fpreg > FP_ARG_MAX_REG + 1)
11694                 {
11695                   gcc_assert (FLOAT128_2REG_P (fmode));
11696                   fmode = DECIMAL_FLOAT_MODE_P (fmode) ? DDmode : DFmode;
11697                 }
11698
11699               r = gen_rtx_REG (fmode, cum->fregno + i * n_fpreg);
11700               off = GEN_INT (i * GET_MODE_SIZE (elt_mode));
11701               rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
11702             }
11703
11704           /* If there were not enough FPRs to hold the argument, the rest
11705              usually goes into memory.  However, if the current position
11706              is still within the register parameter area, a portion may
11707              actually have to go into GPRs.
11708
11709              Note that it may happen that the portion of the argument
11710              passed in the first "half" of the first GPR was already
11711              passed in the last FPR as well.
11712
11713              For unnamed arguments, we already set up GPRs to cover the
11714              whole argument in rs6000_psave_function_arg, so there is
11715              nothing further to do at this point.  */
11716           fpr_words = (i * GET_MODE_SIZE (elt_mode)) / (TARGET_32BIT ? 4 : 8);
11717           if (i < n_elts && align_words + fpr_words < GP_ARG_NUM_REG
11718               && cum->nargs_prototype > 0)
11719             {
11720               static bool warned;
11721
11722               machine_mode rmode = TARGET_32BIT ? SImode : DImode;
11723               int n_words = rs6000_arg_size (mode, type);
11724
11725               align_words += fpr_words;
11726               n_words -= fpr_words;
11727
11728               do
11729                 {
11730                   r = gen_rtx_REG (rmode, GP_ARG_MIN_REG + align_words);
11731                   off = GEN_INT (fpr_words++ * GET_MODE_SIZE (rmode));
11732                   rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
11733                 }
11734               while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
11735
11736               if (!warned && warn_psabi)
11737                 {
11738                   warned = true;
11739                   inform (input_location,
11740                           "the ABI of passing homogeneous %<float%> aggregates"
11741                           " has changed in GCC 5");
11742                 }
11743             }
11744
11745           return rs6000_finish_function_arg (mode, rvec, k);
11746         }
11747       else if (align_words < GP_ARG_NUM_REG)
11748         {
11749           if (TARGET_32BIT && TARGET_POWERPC64)
11750             return rs6000_mixed_function_arg (mode, type, align_words);
11751
11752           return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
11753         }
11754       else
11755         return NULL_RTX;
11756     }
11757 }
11758 \f
11759 /* For an arg passed partly in registers and partly in memory, this is
11760    the number of bytes passed in registers.  For args passed entirely in
11761    registers or entirely in memory, zero.  When an arg is described by a
11762    PARALLEL, perhaps using more than one register type, this function
11763    returns the number of bytes used by the first element of the PARALLEL.  */
11764
11765 static int
11766 rs6000_arg_partial_bytes (cumulative_args_t cum_v, machine_mode mode,
11767                           tree type, bool named)
11768 {
11769   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
11770   bool passed_in_gprs = true;
11771   int ret = 0;
11772   int align_words;
11773   machine_mode elt_mode;
11774   int n_elts;
11775
11776   rs6000_discover_homogeneous_aggregate (mode, type, &elt_mode, &n_elts);
11777
11778   if (DEFAULT_ABI == ABI_V4)
11779     return 0;
11780
11781   if (USE_ALTIVEC_FOR_ARG_P (cum, elt_mode, named))
11782     {
11783       /* If we are passing this arg in the fixed parameter save area (gprs or
11784          memory) as well as VRs, we do not use the partial bytes mechanism;
11785          instead, rs6000_function_arg will return a PARALLEL including a memory
11786          element as necessary.  Library support functions for IEEE 128-bit are
11787          assumed to not need the value passed both in GPRs and in vector
11788          registers.  */
11789       if (TARGET_64BIT && !cum->prototype
11790           && (!cum->libcall || !FLOAT128_VECTOR_P (elt_mode)))
11791         return 0;
11792
11793       /* Otherwise, we pass in VRs only.  Check for partial copies.  */
11794       passed_in_gprs = false;
11795       if (cum->vregno + n_elts > ALTIVEC_ARG_MAX_REG + 1)
11796         ret = (ALTIVEC_ARG_MAX_REG + 1 - cum->vregno) * 16;
11797     }
11798
11799   /* In this complicated case we just disable the partial_nregs code.  */
11800   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
11801     return 0;
11802
11803   align_words = rs6000_parm_start (mode, type, cum->words);
11804
11805   if (USE_FP_FOR_ARG_P (cum, elt_mode)
11806       && !(TARGET_AIX && !TARGET_ELF
11807            && type != NULL && AGGREGATE_TYPE_P (type)))
11808     {
11809       unsigned long n_fpreg = (GET_MODE_SIZE (elt_mode) + 7) >> 3;
11810
11811       /* If we are passing this arg in the fixed parameter save area
11812          (gprs or memory) as well as FPRs, we do not use the partial
11813          bytes mechanism; instead, rs6000_function_arg will return a
11814          PARALLEL including a memory element as necessary.  */
11815       if (type
11816           && (cum->nargs_prototype <= 0
11817               || ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
11818                   && TARGET_XL_COMPAT
11819                   && align_words >= GP_ARG_NUM_REG)))
11820         return 0;
11821
11822       /* Otherwise, we pass in FPRs only.  Check for partial copies.  */
11823       passed_in_gprs = false;
11824       if (cum->fregno + n_elts * n_fpreg > FP_ARG_MAX_REG + 1)
11825         {
11826           /* Compute number of bytes / words passed in FPRs.  If there
11827              is still space available in the register parameter area
11828              *after* that amount, a part of the argument will be passed
11829              in GPRs.  In that case, the total amount passed in any
11830              registers is equal to the amount that would have been passed
11831              in GPRs if everything were passed there, so we fall back to
11832              the GPR code below to compute the appropriate value.  */
11833           int fpr = ((FP_ARG_MAX_REG + 1 - cum->fregno)
11834                      * MIN (8, GET_MODE_SIZE (elt_mode)));
11835           int fpr_words = fpr / (TARGET_32BIT ? 4 : 8);
11836
11837           if (align_words + fpr_words < GP_ARG_NUM_REG)
11838             passed_in_gprs = true;
11839           else
11840             ret = fpr;
11841         }
11842     }
11843
11844   if (passed_in_gprs
11845       && align_words < GP_ARG_NUM_REG
11846       && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
11847     ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
11848
11849   if (ret != 0 && TARGET_DEBUG_ARG)
11850     fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
11851
11852   return ret;
11853 }
11854 \f
11855 /* A C expression that indicates when an argument must be passed by
11856    reference.  If nonzero for an argument, a copy of that argument is
11857    made in memory and a pointer to the argument is passed instead of
11858    the argument itself.  The pointer is passed in whatever way is
11859    appropriate for passing a pointer to that type.
11860
11861    Under V.4, aggregates and long double are passed by reference.
11862
11863    As an extension to all 32-bit ABIs, AltiVec vectors are passed by
11864    reference unless the AltiVec vector extension ABI is in force.
11865
11866    As an extension to all ABIs, variable sized types are passed by
11867    reference.  */
11868
11869 static bool
11870 rs6000_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
11871                           machine_mode mode, const_tree type,
11872                           bool named ATTRIBUTE_UNUSED)
11873 {
11874   if (!type)
11875     return 0;
11876
11877   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD
11878       && FLOAT128_IEEE_P (TYPE_MODE (type)))
11879     {
11880       if (TARGET_DEBUG_ARG)
11881         fprintf (stderr, "function_arg_pass_by_reference: V4 IEEE 128-bit\n");
11882       return 1;
11883     }
11884
11885   if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
11886     {
11887       if (TARGET_DEBUG_ARG)
11888         fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
11889       return 1;
11890     }
11891
11892   if (int_size_in_bytes (type) < 0)
11893     {
11894       if (TARGET_DEBUG_ARG)
11895         fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
11896       return 1;
11897     }
11898
11899   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
11900      modes only exist for GCC vector types if -maltivec.  */
11901   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
11902     {
11903       if (TARGET_DEBUG_ARG)
11904         fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
11905       return 1;
11906     }
11907
11908   /* Pass synthetic vectors in memory.  */
11909   if (TREE_CODE (type) == VECTOR_TYPE
11910       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
11911     {
11912       static bool warned_for_pass_big_vectors = false;
11913       if (TARGET_DEBUG_ARG)
11914         fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
11915       if (!warned_for_pass_big_vectors)
11916         {
11917           warning (OPT_Wpsabi, "GCC vector passed by reference: "
11918                    "non-standard ABI extension with no compatibility "
11919                    "guarantee");
11920           warned_for_pass_big_vectors = true;
11921         }
11922       return 1;
11923     }
11924
11925   return 0;
11926 }
11927
11928 /* Process parameter of type TYPE after ARGS_SO_FAR parameters were
11929    already processes.  Return true if the parameter must be passed
11930    (fully or partially) on the stack.  */
11931
11932 static bool
11933 rs6000_parm_needs_stack (cumulative_args_t args_so_far, tree type)
11934 {
11935   machine_mode mode;
11936   int unsignedp;
11937   rtx entry_parm;
11938
11939   /* Catch errors.  */
11940   if (type == NULL || type == error_mark_node)
11941     return true;
11942
11943   /* Handle types with no storage requirement.  */
11944   if (TYPE_MODE (type) == VOIDmode)
11945     return false;
11946
11947   /* Handle complex types.  */
11948   if (TREE_CODE (type) == COMPLEX_TYPE)
11949     return (rs6000_parm_needs_stack (args_so_far, TREE_TYPE (type))
11950             || rs6000_parm_needs_stack (args_so_far, TREE_TYPE (type)));
11951
11952   /* Handle transparent aggregates.  */
11953   if ((TREE_CODE (type) == UNION_TYPE || TREE_CODE (type) == RECORD_TYPE)
11954       && TYPE_TRANSPARENT_AGGR (type))
11955     type = TREE_TYPE (first_field (type));
11956
11957   /* See if this arg was passed by invisible reference.  */
11958   if (pass_by_reference (get_cumulative_args (args_so_far),
11959                          TYPE_MODE (type), type, true))
11960     type = build_pointer_type (type);
11961
11962   /* Find mode as it is passed by the ABI.  */
11963   unsignedp = TYPE_UNSIGNED (type);
11964   mode = promote_mode (type, TYPE_MODE (type), &unsignedp);
11965
11966   /* If we must pass in stack, we need a stack.  */
11967   if (rs6000_must_pass_in_stack (mode, type))
11968     return true;
11969
11970   /* If there is no incoming register, we need a stack.  */
11971   entry_parm = rs6000_function_arg (args_so_far, mode, type, true);
11972   if (entry_parm == NULL)
11973     return true;
11974
11975   /* Likewise if we need to pass both in registers and on the stack.  */
11976   if (GET_CODE (entry_parm) == PARALLEL
11977       && XEXP (XVECEXP (entry_parm, 0, 0), 0) == NULL_RTX)
11978     return true;
11979
11980   /* Also true if we're partially in registers and partially not.  */
11981   if (rs6000_arg_partial_bytes (args_so_far, mode, type, true) != 0)
11982     return true;
11983
11984   /* Update info on where next arg arrives in registers.  */
11985   rs6000_function_arg_advance (args_so_far, mode, type, true);
11986   return false;
11987 }
11988
11989 /* Return true if FUN has no prototype, has a variable argument
11990    list, or passes any parameter in memory.  */
11991
11992 static bool
11993 rs6000_function_parms_need_stack (tree fun, bool incoming)
11994 {
11995   tree fntype, result;
11996   CUMULATIVE_ARGS args_so_far_v;
11997   cumulative_args_t args_so_far;
11998
11999   if (!fun)
12000     /* Must be a libcall, all of which only use reg parms.  */
12001     return false;
12002
12003   fntype = fun;
12004   if (!TYPE_P (fun))
12005     fntype = TREE_TYPE (fun);
12006
12007   /* Varargs functions need the parameter save area.  */
12008   if ((!incoming && !prototype_p (fntype)) || stdarg_p (fntype))
12009     return true;
12010
12011   INIT_CUMULATIVE_INCOMING_ARGS (args_so_far_v, fntype, NULL_RTX);
12012   args_so_far = pack_cumulative_args (&args_so_far_v);
12013
12014   /* When incoming, we will have been passed the function decl.
12015      It is necessary to use the decl to handle K&R style functions,
12016      where TYPE_ARG_TYPES may not be available.  */
12017   if (incoming)
12018     {
12019       gcc_assert (DECL_P (fun));
12020       result = DECL_RESULT (fun);
12021     }
12022   else
12023     result = TREE_TYPE (fntype);
12024
12025   if (result && aggregate_value_p (result, fntype))
12026     {
12027       if (!TYPE_P (result))
12028         result = TREE_TYPE (result);
12029       result = build_pointer_type (result);
12030       rs6000_parm_needs_stack (args_so_far, result);
12031     }
12032
12033   if (incoming)
12034     {
12035       tree parm;
12036
12037       for (parm = DECL_ARGUMENTS (fun);
12038            parm && parm != void_list_node;
12039            parm = TREE_CHAIN (parm))
12040         if (rs6000_parm_needs_stack (args_so_far, TREE_TYPE (parm)))
12041           return true;
12042     }
12043   else
12044     {
12045       function_args_iterator args_iter;
12046       tree arg_type;
12047
12048       FOREACH_FUNCTION_ARGS (fntype, arg_type, args_iter)
12049         if (rs6000_parm_needs_stack (args_so_far, arg_type))
12050           return true;
12051     }
12052
12053   return false;
12054 }
12055
12056 /* Return the size of the REG_PARM_STACK_SPACE are for FUN.  This is
12057    usually a constant depending on the ABI.  However, in the ELFv2 ABI
12058    the register parameter area is optional when calling a function that
12059    has a prototype is scope, has no variable argument list, and passes
12060    all parameters in registers.  */
12061
12062 int
12063 rs6000_reg_parm_stack_space (tree fun, bool incoming)
12064 {
12065   int reg_parm_stack_space;
12066
12067   switch (DEFAULT_ABI)
12068     {
12069     default:
12070       reg_parm_stack_space = 0;
12071       break;
12072
12073     case ABI_AIX:
12074     case ABI_DARWIN:
12075       reg_parm_stack_space = TARGET_64BIT ? 64 : 32;
12076       break;
12077
12078     case ABI_ELFv2:
12079       /* ??? Recomputing this every time is a bit expensive.  Is there
12080          a place to cache this information?  */
12081       if (rs6000_function_parms_need_stack (fun, incoming))
12082         reg_parm_stack_space = TARGET_64BIT ? 64 : 32;
12083       else
12084         reg_parm_stack_space = 0;
12085       break;
12086     }
12087
12088   return reg_parm_stack_space;
12089 }
12090
12091 static void
12092 rs6000_move_block_from_reg (int regno, rtx x, int nregs)
12093 {
12094   int i;
12095   machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
12096
12097   if (nregs == 0)
12098     return;
12099
12100   for (i = 0; i < nregs; i++)
12101     {
12102       rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
12103       if (reload_completed)
12104         {
12105           if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
12106             tem = NULL_RTX;
12107           else
12108             tem = simplify_gen_subreg (reg_mode, x, BLKmode,
12109                                        i * GET_MODE_SIZE (reg_mode));
12110         }
12111       else
12112         tem = replace_equiv_address (tem, XEXP (tem, 0));
12113
12114       gcc_assert (tem);
12115
12116       emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
12117     }
12118 }
12119 \f
12120 /* Perform any needed actions needed for a function that is receiving a
12121    variable number of arguments.
12122
12123    CUM is as above.
12124
12125    MODE and TYPE are the mode and type of the current parameter.
12126
12127    PRETEND_SIZE is a variable that should be set to the amount of stack
12128    that must be pushed by the prolog to pretend that our caller pushed
12129    it.
12130
12131    Normally, this macro will push all remaining incoming registers on the
12132    stack and set PRETEND_SIZE to the length of the registers pushed.  */
12133
12134 static void
12135 setup_incoming_varargs (cumulative_args_t cum, machine_mode mode,
12136                         tree type, int *pretend_size ATTRIBUTE_UNUSED,
12137                         int no_rtl)
12138 {
12139   CUMULATIVE_ARGS next_cum;
12140   int reg_size = TARGET_32BIT ? 4 : 8;
12141   rtx save_area = NULL_RTX, mem;
12142   int first_reg_offset;
12143   alias_set_type set;
12144
12145   /* Skip the last named argument.  */
12146   next_cum = *get_cumulative_args (cum);
12147   rs6000_function_arg_advance_1 (&next_cum, mode, type, true, 0);
12148
12149   if (DEFAULT_ABI == ABI_V4)
12150     {
12151       first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
12152
12153       if (! no_rtl)
12154         {
12155           int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
12156           HOST_WIDE_INT offset = 0;
12157
12158           /* Try to optimize the size of the varargs save area.
12159              The ABI requires that ap.reg_save_area is doubleword
12160              aligned, but we don't need to allocate space for all
12161              the bytes, only those to which we actually will save
12162              anything.  */
12163           if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
12164             gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
12165           if (TARGET_HARD_FLOAT
12166               && next_cum.fregno <= FP_ARG_V4_MAX_REG
12167               && cfun->va_list_fpr_size)
12168             {
12169               if (gpr_reg_num)
12170                 fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
12171                            * UNITS_PER_FP_WORD;
12172               if (cfun->va_list_fpr_size
12173                   < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
12174                 fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
12175               else
12176                 fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
12177                             * UNITS_PER_FP_WORD;
12178             }
12179           if (gpr_reg_num)
12180             {
12181               offset = -((first_reg_offset * reg_size) & ~7);
12182               if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
12183                 {
12184                   gpr_reg_num = cfun->va_list_gpr_size;
12185                   if (reg_size == 4 && (first_reg_offset & 1))
12186                     gpr_reg_num++;
12187                 }
12188               gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
12189             }
12190           else if (fpr_size)
12191             offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
12192                        * UNITS_PER_FP_WORD
12193                      - (int) (GP_ARG_NUM_REG * reg_size);
12194
12195           if (gpr_size + fpr_size)
12196             {
12197               rtx reg_save_area
12198                 = assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
12199               gcc_assert (MEM_P (reg_save_area));
12200               reg_save_area = XEXP (reg_save_area, 0);
12201               if (GET_CODE (reg_save_area) == PLUS)
12202                 {
12203                   gcc_assert (XEXP (reg_save_area, 0)
12204                               == virtual_stack_vars_rtx);
12205                   gcc_assert (CONST_INT_P (XEXP (reg_save_area, 1)));
12206                   offset += INTVAL (XEXP (reg_save_area, 1));
12207                 }
12208               else
12209                 gcc_assert (reg_save_area == virtual_stack_vars_rtx);
12210             }
12211
12212           cfun->machine->varargs_save_offset = offset;
12213           save_area = plus_constant (Pmode, virtual_stack_vars_rtx, offset);
12214         }
12215     }
12216   else
12217     {
12218       first_reg_offset = next_cum.words;
12219       save_area = crtl->args.internal_arg_pointer;
12220
12221       if (targetm.calls.must_pass_in_stack (mode, type))
12222         first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
12223     }
12224
12225   set = get_varargs_alias_set ();
12226   if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
12227       && cfun->va_list_gpr_size)
12228     {
12229       int n_gpr, nregs = GP_ARG_NUM_REG - first_reg_offset;
12230
12231       if (va_list_gpr_counter_field)
12232         /* V4 va_list_gpr_size counts number of registers needed.  */
12233         n_gpr = cfun->va_list_gpr_size;
12234       else
12235         /* char * va_list instead counts number of bytes needed.  */
12236         n_gpr = (cfun->va_list_gpr_size + reg_size - 1) / reg_size;
12237
12238       if (nregs > n_gpr)
12239         nregs = n_gpr;
12240
12241       mem = gen_rtx_MEM (BLKmode,
12242                          plus_constant (Pmode, save_area,
12243                                         first_reg_offset * reg_size));
12244       MEM_NOTRAP_P (mem) = 1;
12245       set_mem_alias_set (mem, set);
12246       set_mem_align (mem, BITS_PER_WORD);
12247
12248       rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
12249                                   nregs);
12250     }
12251
12252   /* Save FP registers if needed.  */
12253   if (DEFAULT_ABI == ABI_V4
12254       && TARGET_HARD_FLOAT
12255       && ! no_rtl
12256       && next_cum.fregno <= FP_ARG_V4_MAX_REG
12257       && cfun->va_list_fpr_size)
12258     {
12259       int fregno = next_cum.fregno, nregs;
12260       rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
12261       rtx lab = gen_label_rtx ();
12262       int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
12263                                                * UNITS_PER_FP_WORD);
12264
12265       emit_jump_insn
12266         (gen_rtx_SET (pc_rtx,
12267                       gen_rtx_IF_THEN_ELSE (VOIDmode,
12268                                             gen_rtx_NE (VOIDmode, cr1,
12269                                                         const0_rtx),
12270                                             gen_rtx_LABEL_REF (VOIDmode, lab),
12271                                             pc_rtx)));
12272
12273       for (nregs = 0;
12274            fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
12275            fregno++, off += UNITS_PER_FP_WORD, nregs++)
12276         {
12277           mem = gen_rtx_MEM (TARGET_HARD_FLOAT ? DFmode : SFmode,
12278                              plus_constant (Pmode, save_area, off));
12279           MEM_NOTRAP_P (mem) = 1;
12280           set_mem_alias_set (mem, set);
12281           set_mem_align (mem, GET_MODE_ALIGNMENT (
12282                          TARGET_HARD_FLOAT ? DFmode : SFmode));
12283           emit_move_insn (mem, gen_rtx_REG (
12284                           TARGET_HARD_FLOAT ? DFmode : SFmode, fregno));
12285         }
12286
12287       emit_label (lab);
12288     }
12289 }
12290
12291 /* Create the va_list data type.  */
12292
12293 static tree
12294 rs6000_build_builtin_va_list (void)
12295 {
12296   tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
12297
12298   /* For AIX, prefer 'char *' because that's what the system
12299      header files like.  */
12300   if (DEFAULT_ABI != ABI_V4)
12301     return build_pointer_type (char_type_node);
12302
12303   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
12304   type_decl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12305                           get_identifier ("__va_list_tag"), record);
12306
12307   f_gpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("gpr"),
12308                       unsigned_char_type_node);
12309   f_fpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("fpr"),
12310                       unsigned_char_type_node);
12311   /* Give the two bytes of padding a name, so that -Wpadded won't warn on
12312      every user file.  */
12313   f_res = build_decl (BUILTINS_LOCATION, FIELD_DECL,
12314                       get_identifier ("reserved"), short_unsigned_type_node);
12315   f_ovf = build_decl (BUILTINS_LOCATION, FIELD_DECL,
12316                       get_identifier ("overflow_arg_area"),
12317                       ptr_type_node);
12318   f_sav = build_decl (BUILTINS_LOCATION, FIELD_DECL,
12319                       get_identifier ("reg_save_area"),
12320                       ptr_type_node);
12321
12322   va_list_gpr_counter_field = f_gpr;
12323   va_list_fpr_counter_field = f_fpr;
12324
12325   DECL_FIELD_CONTEXT (f_gpr) = record;
12326   DECL_FIELD_CONTEXT (f_fpr) = record;
12327   DECL_FIELD_CONTEXT (f_res) = record;
12328   DECL_FIELD_CONTEXT (f_ovf) = record;
12329   DECL_FIELD_CONTEXT (f_sav) = record;
12330
12331   TYPE_STUB_DECL (record) = type_decl;
12332   TYPE_NAME (record) = type_decl;
12333   TYPE_FIELDS (record) = f_gpr;
12334   DECL_CHAIN (f_gpr) = f_fpr;
12335   DECL_CHAIN (f_fpr) = f_res;
12336   DECL_CHAIN (f_res) = f_ovf;
12337   DECL_CHAIN (f_ovf) = f_sav;
12338
12339   layout_type (record);
12340
12341   /* The correct type is an array type of one element.  */
12342   return build_array_type (record, build_index_type (size_zero_node));
12343 }
12344
12345 /* Implement va_start.  */
12346
12347 static void
12348 rs6000_va_start (tree valist, rtx nextarg)
12349 {
12350   HOST_WIDE_INT words, n_gpr, n_fpr;
12351   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
12352   tree gpr, fpr, ovf, sav, t;
12353
12354   /* Only SVR4 needs something special.  */
12355   if (DEFAULT_ABI != ABI_V4)
12356     {
12357       std_expand_builtin_va_start (valist, nextarg);
12358       return;
12359     }
12360
12361   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
12362   f_fpr = DECL_CHAIN (f_gpr);
12363   f_res = DECL_CHAIN (f_fpr);
12364   f_ovf = DECL_CHAIN (f_res);
12365   f_sav = DECL_CHAIN (f_ovf);
12366
12367   valist = build_simple_mem_ref (valist);
12368   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
12369   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
12370                 f_fpr, NULL_TREE);
12371   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
12372                 f_ovf, NULL_TREE);
12373   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
12374                 f_sav, NULL_TREE);
12375
12376   /* Count number of gp and fp argument registers used.  */
12377   words = crtl->args.info.words;
12378   n_gpr = MIN (crtl->args.info.sysv_gregno - GP_ARG_MIN_REG,
12379                GP_ARG_NUM_REG);
12380   n_fpr = MIN (crtl->args.info.fregno - FP_ARG_MIN_REG,
12381                FP_ARG_NUM_REG);
12382
12383   if (TARGET_DEBUG_ARG)
12384     fprintf (stderr, "va_start: words = " HOST_WIDE_INT_PRINT_DEC", n_gpr = "
12385              HOST_WIDE_INT_PRINT_DEC", n_fpr = " HOST_WIDE_INT_PRINT_DEC"\n",
12386              words, n_gpr, n_fpr);
12387
12388   if (cfun->va_list_gpr_size)
12389     {
12390       t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
12391                   build_int_cst (NULL_TREE, n_gpr));
12392       TREE_SIDE_EFFECTS (t) = 1;
12393       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
12394     }
12395
12396   if (cfun->va_list_fpr_size)
12397     {
12398       t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
12399                   build_int_cst (NULL_TREE, n_fpr));
12400       TREE_SIDE_EFFECTS (t) = 1;
12401       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
12402
12403 #ifdef HAVE_AS_GNU_ATTRIBUTE
12404       if (call_ABI_of_interest (cfun->decl))
12405         rs6000_passes_float = true;
12406 #endif
12407     }
12408
12409   /* Find the overflow area.  */
12410   t = make_tree (TREE_TYPE (ovf), crtl->args.internal_arg_pointer);
12411   if (words != 0)
12412     t = fold_build_pointer_plus_hwi (t, words * MIN_UNITS_PER_WORD);
12413   t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
12414   TREE_SIDE_EFFECTS (t) = 1;
12415   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
12416
12417   /* If there were no va_arg invocations, don't set up the register
12418      save area.  */
12419   if (!cfun->va_list_gpr_size
12420       && !cfun->va_list_fpr_size
12421       && n_gpr < GP_ARG_NUM_REG
12422       && n_fpr < FP_ARG_V4_MAX_REG)
12423     return;
12424
12425   /* Find the register save area.  */
12426   t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
12427   if (cfun->machine->varargs_save_offset)
12428     t = fold_build_pointer_plus_hwi (t, cfun->machine->varargs_save_offset);
12429   t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
12430   TREE_SIDE_EFFECTS (t) = 1;
12431   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
12432 }
12433
12434 /* Implement va_arg.  */
12435
12436 static tree
12437 rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
12438                         gimple_seq *post_p)
12439 {
12440   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
12441   tree gpr, fpr, ovf, sav, reg, t, u;
12442   int size, rsize, n_reg, sav_ofs, sav_scale;
12443   tree lab_false, lab_over, addr;
12444   int align;
12445   tree ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
12446   int regalign = 0;
12447   gimple *stmt;
12448
12449   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
12450     {
12451       t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
12452       return build_va_arg_indirect_ref (t);
12453     }
12454
12455   /* We need to deal with the fact that the darwin ppc64 ABI is defined by an
12456      earlier version of gcc, with the property that it always applied alignment
12457      adjustments to the va-args (even for zero-sized types).  The cheapest way
12458      to deal with this is to replicate the effect of the part of 
12459      std_gimplify_va_arg_expr that carries out the align adjust, for the case 
12460      of relevance.  
12461      We don't need to check for pass-by-reference because of the test above.
12462      We can return a simplifed answer, since we know there's no offset to add.  */
12463
12464   if (((TARGET_MACHO
12465         && rs6000_darwin64_abi)
12466        || DEFAULT_ABI == ABI_ELFv2
12467        || (DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm))
12468       && integer_zerop (TYPE_SIZE (type)))
12469     {
12470       unsigned HOST_WIDE_INT align, boundary;
12471       tree valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
12472       align = PARM_BOUNDARY / BITS_PER_UNIT;
12473       boundary = rs6000_function_arg_boundary (TYPE_MODE (type), type);
12474       if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
12475         boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
12476       boundary /= BITS_PER_UNIT;
12477       if (boundary > align)
12478         {
12479           tree t ;
12480           /* This updates arg ptr by the amount that would be necessary
12481              to align the zero-sized (but not zero-alignment) item.  */
12482           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
12483                       fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
12484           gimplify_and_add (t, pre_p);
12485
12486           t = fold_convert (sizetype, valist_tmp);
12487           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
12488                   fold_convert (TREE_TYPE (valist),
12489                                 fold_build2 (BIT_AND_EXPR, sizetype, t,
12490                                              size_int (-boundary))));
12491           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
12492           gimplify_and_add (t, pre_p);
12493         }
12494       /* Since it is zero-sized there's no increment for the item itself. */
12495       valist_tmp = fold_convert (build_pointer_type (type), valist_tmp);
12496       return build_va_arg_indirect_ref (valist_tmp);
12497     }
12498
12499   if (DEFAULT_ABI != ABI_V4)
12500     {
12501       if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
12502         {
12503           tree elem_type = TREE_TYPE (type);
12504           machine_mode elem_mode = TYPE_MODE (elem_type);
12505           int elem_size = GET_MODE_SIZE (elem_mode);
12506
12507           if (elem_size < UNITS_PER_WORD)
12508             {
12509               tree real_part, imag_part;
12510               gimple_seq post = NULL;
12511
12512               real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
12513                                                   &post);
12514               /* Copy the value into a temporary, lest the formal temporary
12515                  be reused out from under us.  */
12516               real_part = get_initialized_tmp_var (real_part, pre_p, &post);
12517               gimple_seq_add_seq (pre_p, post);
12518
12519               imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
12520                                                   post_p);
12521
12522               return build2 (COMPLEX_EXPR, type, real_part, imag_part);
12523             }
12524         }
12525
12526       return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
12527     }
12528
12529   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
12530   f_fpr = DECL_CHAIN (f_gpr);
12531   f_res = DECL_CHAIN (f_fpr);
12532   f_ovf = DECL_CHAIN (f_res);
12533   f_sav = DECL_CHAIN (f_ovf);
12534
12535   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
12536   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
12537                 f_fpr, NULL_TREE);
12538   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
12539                 f_ovf, NULL_TREE);
12540   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
12541                 f_sav, NULL_TREE);
12542
12543   size = int_size_in_bytes (type);
12544   rsize = (size + 3) / 4;
12545   int pad = 4 * rsize - size;
12546   align = 1;
12547
12548   machine_mode mode = TYPE_MODE (type);
12549   if (abi_v4_pass_in_fpr (mode, false))
12550     {
12551       /* FP args go in FP registers, if present.  */
12552       reg = fpr;
12553       n_reg = (size + 7) / 8;
12554       sav_ofs = (TARGET_HARD_FLOAT ? 8 : 4) * 4;
12555       sav_scale = (TARGET_HARD_FLOAT ? 8 : 4);
12556       if (mode != SFmode && mode != SDmode)
12557         align = 8;
12558     }
12559   else
12560     {
12561       /* Otherwise into GP registers.  */
12562       reg = gpr;
12563       n_reg = rsize;
12564       sav_ofs = 0;
12565       sav_scale = 4;
12566       if (n_reg == 2)
12567         align = 8;
12568     }
12569
12570   /* Pull the value out of the saved registers....  */
12571
12572   lab_over = NULL;
12573   addr = create_tmp_var (ptr_type_node, "addr");
12574
12575   /*  AltiVec vectors never go in registers when -mabi=altivec.  */
12576   if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
12577     align = 16;
12578   else
12579     {
12580       lab_false = create_artificial_label (input_location);
12581       lab_over = create_artificial_label (input_location);
12582
12583       /* Long long is aligned in the registers.  As are any other 2 gpr
12584          item such as complex int due to a historical mistake.  */
12585       u = reg;
12586       if (n_reg == 2 && reg == gpr)
12587         {
12588           regalign = 1;
12589           u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), unshare_expr (reg),
12590                      build_int_cst (TREE_TYPE (reg), n_reg - 1));
12591           u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg),
12592                       unshare_expr (reg), u);
12593         }
12594       /* _Decimal128 is passed in even/odd fpr pairs; the stored
12595          reg number is 0 for f1, so we want to make it odd.  */
12596       else if (reg == fpr && mode == TDmode)
12597         {
12598           t = build2 (BIT_IOR_EXPR, TREE_TYPE (reg), unshare_expr (reg),
12599                       build_int_cst (TREE_TYPE (reg), 1));
12600           u = build2 (MODIFY_EXPR, void_type_node, unshare_expr (reg), t);
12601         }
12602
12603       t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
12604       t = build2 (GE_EXPR, boolean_type_node, u, t);
12605       u = build1 (GOTO_EXPR, void_type_node, lab_false);
12606       t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
12607       gimplify_and_add (t, pre_p);
12608
12609       t = sav;
12610       if (sav_ofs)
12611         t = fold_build_pointer_plus_hwi (sav, sav_ofs);
12612
12613       u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
12614                   build_int_cst (TREE_TYPE (reg), n_reg));
12615       u = fold_convert (sizetype, u);
12616       u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
12617       t = fold_build_pointer_plus (t, u);
12618
12619       /* _Decimal32 varargs are located in the second word of the 64-bit
12620          FP register for 32-bit binaries.  */
12621       if (TARGET_32BIT && TARGET_HARD_FLOAT && mode == SDmode)
12622         t = fold_build_pointer_plus_hwi (t, size);
12623
12624       /* Args are passed right-aligned.  */
12625       if (BYTES_BIG_ENDIAN)
12626         t = fold_build_pointer_plus_hwi (t, pad);
12627
12628       gimplify_assign (addr, t, pre_p);
12629
12630       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
12631
12632       stmt = gimple_build_label (lab_false);
12633       gimple_seq_add_stmt (pre_p, stmt);
12634
12635       if ((n_reg == 2 && !regalign) || n_reg > 2)
12636         {
12637           /* Ensure that we don't find any more args in regs.
12638              Alignment has taken care of for special cases.  */
12639           gimplify_assign (reg, build_int_cst (TREE_TYPE (reg), 8), pre_p);
12640         }
12641     }
12642
12643   /* ... otherwise out of the overflow area.  */
12644
12645   /* Care for on-stack alignment if needed.  */
12646   t = ovf;
12647   if (align != 1)
12648     {
12649       t = fold_build_pointer_plus_hwi (t, align - 1);
12650       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
12651                   build_int_cst (TREE_TYPE (t), -align));
12652     }
12653
12654   /* Args are passed right-aligned.  */
12655   if (BYTES_BIG_ENDIAN)
12656     t = fold_build_pointer_plus_hwi (t, pad);
12657
12658   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
12659
12660   gimplify_assign (unshare_expr (addr), t, pre_p);
12661
12662   t = fold_build_pointer_plus_hwi (t, size);
12663   gimplify_assign (unshare_expr (ovf), t, pre_p);
12664
12665   if (lab_over)
12666     {
12667       stmt = gimple_build_label (lab_over);
12668       gimple_seq_add_stmt (pre_p, stmt);
12669     }
12670
12671   if (STRICT_ALIGNMENT
12672       && (TYPE_ALIGN (type)
12673           > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align)))
12674     {
12675       /* The value (of type complex double, for example) may not be
12676          aligned in memory in the saved registers, so copy via a
12677          temporary.  (This is the same code as used for SPARC.)  */
12678       tree tmp = create_tmp_var (type, "va_arg_tmp");
12679       tree dest_addr = build_fold_addr_expr (tmp);
12680
12681       tree copy = build_call_expr (builtin_decl_implicit (BUILT_IN_MEMCPY),
12682                                    3, dest_addr, addr, size_int (rsize * 4));
12683       TREE_ADDRESSABLE (tmp) = 1;
12684
12685       gimplify_and_add (copy, pre_p);
12686       addr = dest_addr;
12687     }
12688
12689   addr = fold_convert (ptrtype, addr);
12690   return build_va_arg_indirect_ref (addr);
12691 }
12692
12693 /* Builtins.  */
12694
12695 static void
12696 def_builtin (const char *name, tree type, enum rs6000_builtins code)
12697 {
12698   tree t;
12699   unsigned classify = rs6000_builtin_info[(int)code].attr;
12700   const char *attr_string = "";
12701
12702   gcc_assert (name != NULL);
12703   gcc_assert (IN_RANGE ((int)code, 0, (int)RS6000_BUILTIN_COUNT));
12704
12705   if (rs6000_builtin_decls[(int)code])
12706     fatal_error (input_location,
12707                  "internal error: builtin function %qs already processed",
12708                  name);
12709
12710   rs6000_builtin_decls[(int)code] = t =
12711     add_builtin_function (name, type, (int)code, BUILT_IN_MD, NULL, NULL_TREE);
12712
12713   /* Set any special attributes.  */
12714   if ((classify & RS6000_BTC_CONST) != 0)
12715     {
12716       /* const function, function only depends on the inputs.  */
12717       TREE_READONLY (t) = 1;
12718       TREE_NOTHROW (t) = 1;
12719       attr_string = ", const";
12720     }
12721   else if ((classify & RS6000_BTC_PURE) != 0)
12722     {
12723       /* pure function, function can read global memory, but does not set any
12724          external state.  */
12725       DECL_PURE_P (t) = 1;
12726       TREE_NOTHROW (t) = 1;
12727       attr_string = ", pure";
12728     }
12729   else if ((classify & RS6000_BTC_FP) != 0)
12730     {
12731       /* Function is a math function.  If rounding mode is on, then treat the
12732          function as not reading global memory, but it can have arbitrary side
12733          effects.  If it is off, then assume the function is a const function.
12734          This mimics the ATTR_MATHFN_FPROUNDING attribute in
12735          builtin-attribute.def that is used for the math functions. */
12736       TREE_NOTHROW (t) = 1;
12737       if (flag_rounding_math)
12738         {
12739           DECL_PURE_P (t) = 1;
12740           DECL_IS_NOVOPS (t) = 1;
12741           attr_string = ", fp, pure";
12742         }
12743       else
12744         {
12745           TREE_READONLY (t) = 1;
12746           attr_string = ", fp, const";
12747         }
12748     }
12749   else if ((classify & RS6000_BTC_ATTR_MASK) != 0)
12750     gcc_unreachable ();
12751
12752   if (TARGET_DEBUG_BUILTIN)
12753     fprintf (stderr, "rs6000_builtin, code = %4d, %s%s\n",
12754              (int)code, name, attr_string);
12755 }
12756
12757 /* Simple ternary operations: VECd = foo (VECa, VECb, VECc).  */
12758
12759 #undef RS6000_BUILTIN_0
12760 #undef RS6000_BUILTIN_1
12761 #undef RS6000_BUILTIN_2
12762 #undef RS6000_BUILTIN_3
12763 #undef RS6000_BUILTIN_A
12764 #undef RS6000_BUILTIN_D
12765 #undef RS6000_BUILTIN_H
12766 #undef RS6000_BUILTIN_P
12767 #undef RS6000_BUILTIN_X
12768
12769 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12770 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12771 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12772 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE) \
12773   { MASK, ICODE, NAME, ENUM },
12774
12775 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12776 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12777 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12778 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12779 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12780
12781 static const struct builtin_description bdesc_3arg[] =
12782 {
12783 #include "rs6000-builtin.def"
12784 };
12785
12786 /* DST operations: void foo (void *, const int, const char).  */
12787
12788 #undef RS6000_BUILTIN_0
12789 #undef RS6000_BUILTIN_1
12790 #undef RS6000_BUILTIN_2
12791 #undef RS6000_BUILTIN_3
12792 #undef RS6000_BUILTIN_A
12793 #undef RS6000_BUILTIN_D
12794 #undef RS6000_BUILTIN_H
12795 #undef RS6000_BUILTIN_P
12796 #undef RS6000_BUILTIN_X
12797
12798 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12799 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12800 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12801 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12802 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12803 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE) \
12804   { MASK, ICODE, NAME, ENUM },
12805
12806 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12807 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12808 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12809
12810 static const struct builtin_description bdesc_dst[] =
12811 {
12812 #include "rs6000-builtin.def"
12813 };
12814
12815 /* Simple binary operations: VECc = foo (VECa, VECb).  */
12816
12817 #undef RS6000_BUILTIN_0
12818 #undef RS6000_BUILTIN_1
12819 #undef RS6000_BUILTIN_2
12820 #undef RS6000_BUILTIN_3
12821 #undef RS6000_BUILTIN_A
12822 #undef RS6000_BUILTIN_D
12823 #undef RS6000_BUILTIN_H
12824 #undef RS6000_BUILTIN_P
12825 #undef RS6000_BUILTIN_X
12826
12827 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12828 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12829 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE) \
12830   { MASK, ICODE, NAME, ENUM },
12831
12832 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12833 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12834 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12835 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12836 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12837 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12838
12839 static const struct builtin_description bdesc_2arg[] =
12840 {
12841 #include "rs6000-builtin.def"
12842 };
12843
12844 #undef RS6000_BUILTIN_0
12845 #undef RS6000_BUILTIN_1
12846 #undef RS6000_BUILTIN_2
12847 #undef RS6000_BUILTIN_3
12848 #undef RS6000_BUILTIN_A
12849 #undef RS6000_BUILTIN_D
12850 #undef RS6000_BUILTIN_H
12851 #undef RS6000_BUILTIN_P
12852 #undef RS6000_BUILTIN_X
12853
12854 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12855 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12856 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12857 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12858 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12859 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12860 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12861 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE) \
12862   { MASK, ICODE, NAME, ENUM },
12863
12864 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12865
12866 /* AltiVec predicates.  */
12867
12868 static const struct builtin_description bdesc_altivec_preds[] =
12869 {
12870 #include "rs6000-builtin.def"
12871 };
12872
12873 /* ABS* operations.  */
12874
12875 #undef RS6000_BUILTIN_0
12876 #undef RS6000_BUILTIN_1
12877 #undef RS6000_BUILTIN_2
12878 #undef RS6000_BUILTIN_3
12879 #undef RS6000_BUILTIN_A
12880 #undef RS6000_BUILTIN_D
12881 #undef RS6000_BUILTIN_H
12882 #undef RS6000_BUILTIN_P
12883 #undef RS6000_BUILTIN_X
12884
12885 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12886 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12887 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12888 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12889 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE) \
12890   { MASK, ICODE, NAME, ENUM },
12891
12892 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12893 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12894 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12895 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12896
12897 static const struct builtin_description bdesc_abs[] =
12898 {
12899 #include "rs6000-builtin.def"
12900 };
12901
12902 /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
12903    foo (VECa).  */
12904
12905 #undef RS6000_BUILTIN_0
12906 #undef RS6000_BUILTIN_1
12907 #undef RS6000_BUILTIN_2
12908 #undef RS6000_BUILTIN_3
12909 #undef RS6000_BUILTIN_A
12910 #undef RS6000_BUILTIN_D
12911 #undef RS6000_BUILTIN_H
12912 #undef RS6000_BUILTIN_P
12913 #undef RS6000_BUILTIN_X
12914
12915 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12916 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE) \
12917   { MASK, ICODE, NAME, ENUM },
12918
12919 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12920 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12921 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12922 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12923 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12924 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12925 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12926
12927 static const struct builtin_description bdesc_1arg[] =
12928 {
12929 #include "rs6000-builtin.def"
12930 };
12931
12932 /* Simple no-argument operations: result = __builtin_darn_32 () */
12933
12934 #undef RS6000_BUILTIN_0
12935 #undef RS6000_BUILTIN_1
12936 #undef RS6000_BUILTIN_2
12937 #undef RS6000_BUILTIN_3
12938 #undef RS6000_BUILTIN_A
12939 #undef RS6000_BUILTIN_D
12940 #undef RS6000_BUILTIN_H
12941 #undef RS6000_BUILTIN_P
12942 #undef RS6000_BUILTIN_X
12943
12944 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE) \
12945   { MASK, ICODE, NAME, ENUM },
12946
12947 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12948 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12949 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12950 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12951 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12952 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12953 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12954 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12955
12956 static const struct builtin_description bdesc_0arg[] =
12957 {
12958 #include "rs6000-builtin.def"
12959 };
12960
12961 /* HTM builtins.  */
12962 #undef RS6000_BUILTIN_0
12963 #undef RS6000_BUILTIN_1
12964 #undef RS6000_BUILTIN_2
12965 #undef RS6000_BUILTIN_3
12966 #undef RS6000_BUILTIN_A
12967 #undef RS6000_BUILTIN_D
12968 #undef RS6000_BUILTIN_H
12969 #undef RS6000_BUILTIN_P
12970 #undef RS6000_BUILTIN_X
12971
12972 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12973 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12974 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12975 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12976 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12977 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12978 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE) \
12979   { MASK, ICODE, NAME, ENUM },
12980
12981 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12982 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12983
12984 static const struct builtin_description bdesc_htm[] =
12985 {
12986 #include "rs6000-builtin.def"
12987 };
12988
12989 #undef RS6000_BUILTIN_0
12990 #undef RS6000_BUILTIN_1
12991 #undef RS6000_BUILTIN_2
12992 #undef RS6000_BUILTIN_3
12993 #undef RS6000_BUILTIN_A
12994 #undef RS6000_BUILTIN_D
12995 #undef RS6000_BUILTIN_H
12996 #undef RS6000_BUILTIN_P
12997
12998 /* Return true if a builtin function is overloaded.  */
12999 bool
13000 rs6000_overloaded_builtin_p (enum rs6000_builtins fncode)
13001 {
13002   return (rs6000_builtin_info[(int)fncode].attr & RS6000_BTC_OVERLOADED) != 0;
13003 }
13004
13005 const char *
13006 rs6000_overloaded_builtin_name (enum rs6000_builtins fncode)
13007 {
13008   return rs6000_builtin_info[(int)fncode].name;
13009 }
13010
13011 /* Expand an expression EXP that calls a builtin without arguments.  */
13012 static rtx
13013 rs6000_expand_zeroop_builtin (enum insn_code icode, rtx target)
13014 {
13015   rtx pat;
13016   machine_mode tmode = insn_data[icode].operand[0].mode;
13017
13018   if (icode == CODE_FOR_nothing)
13019     /* Builtin not supported on this processor.  */
13020     return 0;
13021
13022   if (icode == CODE_FOR_rs6000_mffsl
13023       && rs6000_isa_flags & OPTION_MASK_SOFT_FLOAT)
13024     {
13025       error ("%<__builtin_mffsl%> not supported with %<-msoft-float%>");
13026       return const0_rtx;
13027     }
13028
13029   if (target == 0
13030       || GET_MODE (target) != tmode
13031       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13032     target = gen_reg_rtx (tmode);
13033
13034   pat = GEN_FCN (icode) (target);
13035   if (! pat)
13036     return 0;
13037   emit_insn (pat);
13038
13039   return target;
13040 }
13041
13042
13043 static rtx
13044 rs6000_expand_mtfsf_builtin (enum insn_code icode, tree exp)
13045 {
13046   rtx pat;
13047   tree arg0 = CALL_EXPR_ARG (exp, 0);
13048   tree arg1 = CALL_EXPR_ARG (exp, 1);
13049   rtx op0 = expand_normal (arg0);
13050   rtx op1 = expand_normal (arg1);
13051   machine_mode mode0 = insn_data[icode].operand[0].mode;
13052   machine_mode mode1 = insn_data[icode].operand[1].mode;
13053
13054   if (icode == CODE_FOR_nothing)
13055     /* Builtin not supported on this processor.  */
13056     return 0;
13057
13058   /* If we got invalid arguments bail out before generating bad rtl.  */
13059   if (arg0 == error_mark_node || arg1 == error_mark_node)
13060     return const0_rtx;
13061
13062   if (!CONST_INT_P (op0)
13063       || INTVAL (op0) > 255
13064       || INTVAL (op0) < 0)
13065     {
13066       error ("argument 1 must be an 8-bit field value");
13067       return const0_rtx;
13068     }
13069
13070   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
13071     op0 = copy_to_mode_reg (mode0, op0);
13072
13073   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
13074     op1 = copy_to_mode_reg (mode1, op1);
13075
13076   pat = GEN_FCN (icode) (op0, op1);
13077   if (!pat)
13078     return const0_rtx;
13079   emit_insn (pat);
13080
13081   return NULL_RTX;
13082 }
13083
13084 static rtx
13085 rs6000_expand_mtfsb_builtin (enum insn_code icode, tree exp)
13086 {
13087   rtx pat;
13088   tree arg0 = CALL_EXPR_ARG (exp, 0);
13089   rtx op0 = expand_normal (arg0);
13090
13091   if (icode == CODE_FOR_nothing)
13092     /* Builtin not supported on this processor.  */
13093     return 0;
13094
13095   if (rs6000_isa_flags & OPTION_MASK_SOFT_FLOAT)
13096     {
13097       error ("%<__builtin_mtfsb0%> and %<__builtin_mtfsb1%> not supported with "
13098              "%<-msoft-float%>");
13099       return const0_rtx;
13100     }
13101
13102   /* If we got invalid arguments bail out before generating bad rtl.  */
13103   if (arg0 == error_mark_node)
13104     return const0_rtx;
13105
13106   /* Only allow bit numbers 0 to 31.  */
13107   if (!u5bit_cint_operand (op0, VOIDmode))
13108     {
13109        error ("Argument must be a constant between 0 and 31.");
13110        return const0_rtx;
13111      }
13112
13113   pat = GEN_FCN (icode) (op0);
13114   if (!pat)
13115     return const0_rtx;
13116   emit_insn (pat);
13117
13118   return NULL_RTX;
13119 }
13120
13121 static rtx
13122 rs6000_expand_set_fpscr_rn_builtin (enum insn_code icode, tree exp)
13123 {
13124   rtx pat;
13125   tree arg0 = CALL_EXPR_ARG (exp, 0);
13126   rtx op0 = expand_normal (arg0);
13127   machine_mode mode0 = insn_data[icode].operand[0].mode;
13128
13129   if (icode == CODE_FOR_nothing)
13130     /* Builtin not supported on this processor.  */
13131     return 0;
13132
13133   if (rs6000_isa_flags & OPTION_MASK_SOFT_FLOAT)
13134     {
13135       error ("%<__builtin_set_fpscr_rn%> not supported with %<-msoft-float%>");
13136       return const0_rtx;
13137     }
13138
13139   /* If we got invalid arguments bail out before generating bad rtl.  */
13140   if (arg0 == error_mark_node)
13141     return const0_rtx;
13142
13143   /* If the argument is a constant, check the range. Argument can only be a
13144      2-bit value.  Unfortunately, can't check the range of the value at
13145      compile time if the argument is a variable.  The least significant two
13146      bits of the argument, regardless of type, are used to set the rounding
13147      mode.  All other bits are ignored.  */
13148   if (CONST_INT_P (op0) && !const_0_to_3_operand(op0, VOIDmode))
13149     {
13150       error ("Argument must be a value between 0 and 3.");
13151       return const0_rtx;
13152     }
13153
13154   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
13155     op0 = copy_to_mode_reg (mode0, op0);
13156
13157   pat = GEN_FCN (icode) (op0);
13158   if (!pat)
13159     return const0_rtx;
13160   emit_insn (pat);
13161
13162   return NULL_RTX;
13163 }
13164 static rtx
13165 rs6000_expand_set_fpscr_drn_builtin (enum insn_code icode, tree exp)
13166 {
13167   rtx pat;
13168   tree arg0 = CALL_EXPR_ARG (exp, 0);
13169   rtx op0 = expand_normal (arg0);
13170   machine_mode mode0 = insn_data[icode].operand[0].mode;
13171
13172   if (TARGET_32BIT)
13173     /* Builtin not supported in 32-bit mode.  */
13174     fatal_error (input_location,
13175                  "%<__builtin_set_fpscr_drn%> is not supported "
13176                  "in 32-bit mode");
13177
13178   if (rs6000_isa_flags & OPTION_MASK_SOFT_FLOAT)
13179     {
13180       error ("%<__builtin_set_fpscr_drn%> not supported with %<-msoft-float%>");
13181       return const0_rtx;
13182     }
13183
13184   if (icode == CODE_FOR_nothing)
13185     /* Builtin not supported on this processor.  */
13186     return 0;
13187
13188   /* If we got invalid arguments bail out before generating bad rtl.  */
13189   if (arg0 == error_mark_node)
13190     return const0_rtx;
13191
13192   /* If the argument is a constant, check the range. Agrument can only be a
13193      3-bit value.  Unfortunately, can't check the range of the value at
13194      compile time if the argument is a variable. The least significant two
13195      bits of the argument, regardless of type, are used to set the rounding
13196      mode.  All other bits are ignored.  */
13197   if (CONST_INT_P (op0) && !const_0_to_7_operand(op0, VOIDmode))
13198    {
13199       error ("Argument must be a value between 0 and 7.");
13200       return const0_rtx;
13201     }
13202
13203   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
13204     op0 = copy_to_mode_reg (mode0, op0);
13205
13206   pat = GEN_FCN (icode) (op0);
13207   if (! pat)
13208     return const0_rtx;
13209   emit_insn (pat);
13210
13211   return NULL_RTX;
13212 }
13213
13214 static rtx
13215 rs6000_expand_unop_builtin (enum insn_code icode, tree exp, rtx target)
13216 {
13217   rtx pat;
13218   tree arg0 = CALL_EXPR_ARG (exp, 0);
13219   rtx op0 = expand_normal (arg0);
13220   machine_mode tmode = insn_data[icode].operand[0].mode;
13221   machine_mode mode0 = insn_data[icode].operand[1].mode;
13222
13223   if (icode == CODE_FOR_nothing)
13224     /* Builtin not supported on this processor.  */
13225     return 0;
13226
13227   /* If we got invalid arguments bail out before generating bad rtl.  */
13228   if (arg0 == error_mark_node)
13229     return const0_rtx;
13230
13231   if (icode == CODE_FOR_altivec_vspltisb
13232       || icode == CODE_FOR_altivec_vspltish
13233       || icode == CODE_FOR_altivec_vspltisw)
13234     {
13235       /* Only allow 5-bit *signed* literals.  */
13236       if (!CONST_INT_P (op0)
13237           || INTVAL (op0) > 15
13238           || INTVAL (op0) < -16)
13239         {
13240           error ("argument 1 must be a 5-bit signed literal");
13241           return CONST0_RTX (tmode);
13242         }
13243     }
13244
13245   if (target == 0
13246       || GET_MODE (target) != tmode
13247       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13248     target = gen_reg_rtx (tmode);
13249
13250   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13251     op0 = copy_to_mode_reg (mode0, op0);
13252
13253   pat = GEN_FCN (icode) (target, op0);
13254   if (! pat)
13255     return 0;
13256   emit_insn (pat);
13257
13258   return target;
13259 }
13260
13261 static rtx
13262 altivec_expand_abs_builtin (enum insn_code icode, tree exp, rtx target)
13263 {
13264   rtx pat, scratch1, scratch2;
13265   tree arg0 = CALL_EXPR_ARG (exp, 0);
13266   rtx op0 = expand_normal (arg0);
13267   machine_mode tmode = insn_data[icode].operand[0].mode;
13268   machine_mode mode0 = insn_data[icode].operand[1].mode;
13269
13270   /* If we have invalid arguments, bail out before generating bad rtl.  */
13271   if (arg0 == error_mark_node)
13272     return const0_rtx;
13273
13274   if (target == 0
13275       || GET_MODE (target) != tmode
13276       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13277     target = gen_reg_rtx (tmode);
13278
13279   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13280     op0 = copy_to_mode_reg (mode0, op0);
13281
13282   scratch1 = gen_reg_rtx (mode0);
13283   scratch2 = gen_reg_rtx (mode0);
13284
13285   pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
13286   if (! pat)
13287     return 0;
13288   emit_insn (pat);
13289
13290   return target;
13291 }
13292
13293 static rtx
13294 rs6000_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
13295 {
13296   rtx pat;
13297   tree arg0 = CALL_EXPR_ARG (exp, 0);
13298   tree arg1 = CALL_EXPR_ARG (exp, 1);
13299   rtx op0 = expand_normal (arg0);
13300   rtx op1 = expand_normal (arg1);
13301   machine_mode tmode = insn_data[icode].operand[0].mode;
13302   machine_mode mode0 = insn_data[icode].operand[1].mode;
13303   machine_mode mode1 = insn_data[icode].operand[2].mode;
13304
13305   if (icode == CODE_FOR_nothing)
13306     /* Builtin not supported on this processor.  */
13307     return 0;
13308
13309   /* If we got invalid arguments bail out before generating bad rtl.  */
13310   if (arg0 == error_mark_node || arg1 == error_mark_node)
13311     return const0_rtx;
13312
13313   if (icode == CODE_FOR_unpackv1ti
13314            || icode == CODE_FOR_unpackkf
13315            || icode == CODE_FOR_unpacktf
13316            || icode == CODE_FOR_unpackif
13317            || icode == CODE_FOR_unpacktd)
13318     {
13319       /* Only allow 1-bit unsigned literals. */
13320       STRIP_NOPS (arg1);
13321       if (TREE_CODE (arg1) != INTEGER_CST
13322           || !IN_RANGE (TREE_INT_CST_LOW (arg1), 0, 1))
13323         {
13324           error ("argument 2 must be a 1-bit unsigned literal");
13325           return CONST0_RTX (tmode);
13326         }
13327     }
13328   else if (icode == CODE_FOR_altivec_vspltw)
13329     {
13330       /* Only allow 2-bit unsigned literals.  */
13331       STRIP_NOPS (arg1);
13332       if (TREE_CODE (arg1) != INTEGER_CST
13333           || TREE_INT_CST_LOW (arg1) & ~3)
13334         {
13335           error ("argument 2 must be a 2-bit unsigned literal");
13336           return CONST0_RTX (tmode);
13337         }
13338     }
13339   else if (icode == CODE_FOR_altivec_vsplth)
13340     {
13341       /* Only allow 3-bit unsigned literals.  */
13342       STRIP_NOPS (arg1);
13343       if (TREE_CODE (arg1) != INTEGER_CST
13344           || TREE_INT_CST_LOW (arg1) & ~7)
13345         {
13346           error ("argument 2 must be a 3-bit unsigned literal");
13347           return CONST0_RTX (tmode);
13348         }
13349     }
13350   else if (icode == CODE_FOR_altivec_vspltb)
13351     {
13352       /* Only allow 4-bit unsigned literals.  */
13353       STRIP_NOPS (arg1);
13354       if (TREE_CODE (arg1) != INTEGER_CST
13355           || TREE_INT_CST_LOW (arg1) & ~15)
13356         {
13357           error ("argument 2 must be a 4-bit unsigned literal");
13358           return CONST0_RTX (tmode);
13359         }
13360     }
13361   else if (icode == CODE_FOR_altivec_vcfux
13362       || icode == CODE_FOR_altivec_vcfsx
13363       || icode == CODE_FOR_altivec_vctsxs
13364       || icode == CODE_FOR_altivec_vctuxs)
13365     {
13366       /* Only allow 5-bit unsigned literals.  */
13367       STRIP_NOPS (arg1);
13368       if (TREE_CODE (arg1) != INTEGER_CST
13369           || TREE_INT_CST_LOW (arg1) & ~0x1f)
13370         {
13371           error ("argument 2 must be a 5-bit unsigned literal");
13372           return CONST0_RTX (tmode);
13373         }
13374     }
13375   else if (icode == CODE_FOR_dfptstsfi_eq_dd
13376       || icode == CODE_FOR_dfptstsfi_lt_dd
13377       || icode == CODE_FOR_dfptstsfi_gt_dd
13378       || icode == CODE_FOR_dfptstsfi_unordered_dd
13379       || icode == CODE_FOR_dfptstsfi_eq_td
13380       || icode == CODE_FOR_dfptstsfi_lt_td
13381       || icode == CODE_FOR_dfptstsfi_gt_td
13382       || icode == CODE_FOR_dfptstsfi_unordered_td)
13383     {
13384       /* Only allow 6-bit unsigned literals.  */
13385       STRIP_NOPS (arg0);
13386       if (TREE_CODE (arg0) != INTEGER_CST
13387           || !IN_RANGE (TREE_INT_CST_LOW (arg0), 0, 63))
13388         {
13389           error ("argument 1 must be a 6-bit unsigned literal");
13390           return CONST0_RTX (tmode);
13391         }
13392     }
13393   else if (icode == CODE_FOR_xststdcqp_kf
13394            || icode == CODE_FOR_xststdcqp_tf
13395            || icode == CODE_FOR_xststdcdp
13396            || icode == CODE_FOR_xststdcsp
13397            || icode == CODE_FOR_xvtstdcdp
13398            || icode == CODE_FOR_xvtstdcsp)
13399     {
13400       /* Only allow 7-bit unsigned literals. */
13401       STRIP_NOPS (arg1);
13402       if (TREE_CODE (arg1) != INTEGER_CST
13403           || !IN_RANGE (TREE_INT_CST_LOW (arg1), 0, 127))
13404         {
13405           error ("argument 2 must be a 7-bit unsigned literal");
13406           return CONST0_RTX (tmode);
13407         }
13408     }
13409
13410   if (target == 0
13411       || GET_MODE (target) != tmode
13412       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13413     target = gen_reg_rtx (tmode);
13414
13415   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13416     op0 = copy_to_mode_reg (mode0, op0);
13417   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13418     op1 = copy_to_mode_reg (mode1, op1);
13419
13420   pat = GEN_FCN (icode) (target, op0, op1);
13421   if (! pat)
13422     return 0;
13423   emit_insn (pat);
13424
13425   return target;
13426 }
13427
13428 static rtx
13429 altivec_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
13430 {
13431   rtx pat, scratch;
13432   tree cr6_form = CALL_EXPR_ARG (exp, 0);
13433   tree arg0 = CALL_EXPR_ARG (exp, 1);
13434   tree arg1 = CALL_EXPR_ARG (exp, 2);
13435   rtx op0 = expand_normal (arg0);
13436   rtx op1 = expand_normal (arg1);
13437   machine_mode tmode = SImode;
13438   machine_mode mode0 = insn_data[icode].operand[1].mode;
13439   machine_mode mode1 = insn_data[icode].operand[2].mode;
13440   int cr6_form_int;
13441
13442   if (TREE_CODE (cr6_form) != INTEGER_CST)
13443     {
13444       error ("argument 1 of %qs must be a constant",
13445              "__builtin_altivec_predicate");
13446       return const0_rtx;
13447     }
13448   else
13449     cr6_form_int = TREE_INT_CST_LOW (cr6_form);
13450
13451   gcc_assert (mode0 == mode1);
13452
13453   /* If we have invalid arguments, bail out before generating bad rtl.  */
13454   if (arg0 == error_mark_node || arg1 == error_mark_node)
13455     return const0_rtx;
13456
13457   if (target == 0
13458       || GET_MODE (target) != tmode
13459       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13460     target = gen_reg_rtx (tmode);
13461
13462   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13463     op0 = copy_to_mode_reg (mode0, op0);
13464   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13465     op1 = copy_to_mode_reg (mode1, op1);
13466
13467   /* Note that for many of the relevant operations (e.g. cmpne or
13468      cmpeq) with float or double operands, it makes more sense for the
13469      mode of the allocated scratch register to select a vector of
13470      integer.  But the choice to copy the mode of operand 0 was made
13471      long ago and there are no plans to change it.  */
13472   scratch = gen_reg_rtx (mode0);
13473
13474   pat = GEN_FCN (icode) (scratch, op0, op1);
13475   if (! pat)
13476     return 0;
13477   emit_insn (pat);
13478
13479   /* The vec_any* and vec_all* predicates use the same opcodes for two
13480      different operations, but the bits in CR6 will be different
13481      depending on what information we want.  So we have to play tricks
13482      with CR6 to get the right bits out.
13483
13484      If you think this is disgusting, look at the specs for the
13485      AltiVec predicates.  */
13486
13487   switch (cr6_form_int)
13488     {
13489     case 0:
13490       emit_insn (gen_cr6_test_for_zero (target));
13491       break;
13492     case 1:
13493       emit_insn (gen_cr6_test_for_zero_reverse (target));
13494       break;
13495     case 2:
13496       emit_insn (gen_cr6_test_for_lt (target));
13497       break;
13498     case 3:
13499       emit_insn (gen_cr6_test_for_lt_reverse (target));
13500       break;
13501     default:
13502       error ("argument 1 of %qs is out of range",
13503              "__builtin_altivec_predicate");
13504       break;
13505     }
13506
13507   return target;
13508 }
13509
13510 rtx
13511 swap_endian_selector_for_mode (machine_mode mode)
13512 {
13513   unsigned int swap1[16] = {15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0};
13514   unsigned int swap2[16] = {7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8};
13515   unsigned int swap4[16] = {3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12};
13516   unsigned int swap8[16] = {1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14};
13517
13518   unsigned int *swaparray, i;
13519   rtx perm[16];
13520
13521   switch (mode)
13522     {
13523     case E_V1TImode:
13524       swaparray = swap1;
13525       break;
13526     case E_V2DFmode:
13527     case E_V2DImode:
13528       swaparray = swap2;
13529       break;
13530     case E_V4SFmode:
13531     case E_V4SImode:
13532       swaparray = swap4;
13533       break;
13534     case E_V8HImode:
13535       swaparray = swap8;
13536       break;
13537     default:
13538       gcc_unreachable ();
13539     }
13540
13541   for (i = 0; i < 16; ++i)
13542     perm[i] = GEN_INT (swaparray[i]);
13543
13544   return force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode,
13545                                                      gen_rtvec_v (16, perm)));
13546 }
13547
13548 static rtx
13549 altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target, bool blk)
13550 {
13551   rtx pat, addr;
13552   tree arg0 = CALL_EXPR_ARG (exp, 0);
13553   tree arg1 = CALL_EXPR_ARG (exp, 1);
13554   machine_mode tmode = insn_data[icode].operand[0].mode;
13555   machine_mode mode0 = Pmode;
13556   machine_mode mode1 = Pmode;
13557   rtx op0 = expand_normal (arg0);
13558   rtx op1 = expand_normal (arg1);
13559
13560   if (icode == CODE_FOR_nothing)
13561     /* Builtin not supported on this processor.  */
13562     return 0;
13563
13564   /* If we got invalid arguments bail out before generating bad rtl.  */
13565   if (arg0 == error_mark_node || arg1 == error_mark_node)
13566     return const0_rtx;
13567
13568   if (target == 0
13569       || GET_MODE (target) != tmode
13570       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13571     target = gen_reg_rtx (tmode);
13572
13573   op1 = copy_to_mode_reg (mode1, op1);
13574
13575   /* For LVX, express the RTL accurately by ANDing the address with -16.
13576      LVXL and LVE*X expand to use UNSPECs to hide their special behavior,
13577      so the raw address is fine.  */
13578   if (icode == CODE_FOR_altivec_lvx_v1ti
13579       || icode == CODE_FOR_altivec_lvx_v2df
13580       || icode == CODE_FOR_altivec_lvx_v2di
13581       || icode == CODE_FOR_altivec_lvx_v4sf
13582       || icode == CODE_FOR_altivec_lvx_v4si
13583       || icode == CODE_FOR_altivec_lvx_v8hi
13584       || icode == CODE_FOR_altivec_lvx_v16qi)
13585     {
13586       rtx rawaddr;
13587       if (op0 == const0_rtx)
13588         rawaddr = op1;
13589       else
13590         {
13591           op0 = copy_to_mode_reg (mode0, op0);
13592           rawaddr = gen_rtx_PLUS (Pmode, op1, op0);
13593         }
13594       addr = gen_rtx_AND (Pmode, rawaddr, gen_rtx_CONST_INT (Pmode, -16));
13595       addr = gen_rtx_MEM (blk ? BLKmode : tmode, addr);
13596
13597       emit_insn (gen_rtx_SET (target, addr));
13598     }
13599   else
13600     {
13601       if (op0 == const0_rtx)
13602         addr = gen_rtx_MEM (blk ? BLKmode : tmode, op1);
13603       else
13604         {
13605           op0 = copy_to_mode_reg (mode0, op0);
13606           addr = gen_rtx_MEM (blk ? BLKmode : tmode,
13607                               gen_rtx_PLUS (Pmode, op1, op0));
13608         }
13609
13610       pat = GEN_FCN (icode) (target, addr);
13611       if (! pat)
13612         return 0;
13613       emit_insn (pat);
13614     }
13615
13616   return target;
13617 }
13618
13619 static rtx
13620 altivec_expand_stxvl_builtin (enum insn_code icode, tree exp)
13621 {
13622   rtx pat;
13623   tree arg0 = CALL_EXPR_ARG (exp, 0);
13624   tree arg1 = CALL_EXPR_ARG (exp, 1);
13625   tree arg2 = CALL_EXPR_ARG (exp, 2);
13626   rtx op0 = expand_normal (arg0);
13627   rtx op1 = expand_normal (arg1);
13628   rtx op2 = expand_normal (arg2);
13629   machine_mode mode0 = insn_data[icode].operand[0].mode;
13630   machine_mode mode1 = insn_data[icode].operand[1].mode;
13631   machine_mode mode2 = insn_data[icode].operand[2].mode;
13632
13633   if (icode == CODE_FOR_nothing)
13634     /* Builtin not supported on this processor.  */
13635     return NULL_RTX;
13636
13637   /* If we got invalid arguments bail out before generating bad rtl.  */
13638   if (arg0 == error_mark_node
13639       || arg1 == error_mark_node
13640       || arg2 == error_mark_node)
13641     return NULL_RTX;
13642
13643   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13644     op0 = copy_to_mode_reg (mode0, op0);
13645   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13646     op1 = copy_to_mode_reg (mode1, op1);
13647   if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
13648     op2 = copy_to_mode_reg (mode2, op2);
13649
13650   pat = GEN_FCN (icode) (op0, op1, op2);
13651   if (pat)
13652     emit_insn (pat);
13653
13654   return NULL_RTX;
13655 }
13656
13657 static rtx
13658 altivec_expand_stv_builtin (enum insn_code icode, tree exp)
13659 {
13660   tree arg0 = CALL_EXPR_ARG (exp, 0);
13661   tree arg1 = CALL_EXPR_ARG (exp, 1);
13662   tree arg2 = CALL_EXPR_ARG (exp, 2);
13663   rtx op0 = expand_normal (arg0);
13664   rtx op1 = expand_normal (arg1);
13665   rtx op2 = expand_normal (arg2);
13666   rtx pat, addr, rawaddr;
13667   machine_mode tmode = insn_data[icode].operand[0].mode;
13668   machine_mode smode = insn_data[icode].operand[1].mode;
13669   machine_mode mode1 = Pmode;
13670   machine_mode mode2 = Pmode;
13671
13672   /* Invalid arguments.  Bail before doing anything stoopid!  */
13673   if (arg0 == error_mark_node
13674       || arg1 == error_mark_node
13675       || arg2 == error_mark_node)
13676     return const0_rtx;
13677
13678   op2 = copy_to_mode_reg (mode2, op2);
13679
13680   /* For STVX, express the RTL accurately by ANDing the address with -16.
13681      STVXL and STVE*X expand to use UNSPECs to hide their special behavior,
13682      so the raw address is fine.  */
13683   if (icode == CODE_FOR_altivec_stvx_v2df
13684       || icode == CODE_FOR_altivec_stvx_v2di
13685       || icode == CODE_FOR_altivec_stvx_v4sf
13686       || icode == CODE_FOR_altivec_stvx_v4si
13687       || icode == CODE_FOR_altivec_stvx_v8hi
13688       || icode == CODE_FOR_altivec_stvx_v16qi)
13689     {
13690       if (op1 == const0_rtx)
13691         rawaddr = op2;
13692       else
13693         {
13694           op1 = copy_to_mode_reg (mode1, op1);
13695           rawaddr = gen_rtx_PLUS (Pmode, op2, op1);
13696         }
13697
13698       addr = gen_rtx_AND (Pmode, rawaddr, gen_rtx_CONST_INT (Pmode, -16));
13699       addr = gen_rtx_MEM (tmode, addr);
13700
13701       op0 = copy_to_mode_reg (tmode, op0);
13702
13703       emit_insn (gen_rtx_SET (addr, op0));
13704     }
13705   else
13706     {
13707       if (! (*insn_data[icode].operand[1].predicate) (op0, smode))
13708         op0 = copy_to_mode_reg (smode, op0);
13709
13710       if (op1 == const0_rtx)
13711         addr = gen_rtx_MEM (tmode, op2);
13712       else
13713         {
13714           op1 = copy_to_mode_reg (mode1, op1);
13715           addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op2, op1));
13716         }
13717
13718       pat = GEN_FCN (icode) (addr, op0);
13719       if (pat)
13720         emit_insn (pat);
13721     }
13722
13723   return NULL_RTX;
13724 }
13725
13726 /* Return the appropriate SPR number associated with the given builtin.  */
13727 static inline HOST_WIDE_INT
13728 htm_spr_num (enum rs6000_builtins code)
13729 {
13730   if (code == HTM_BUILTIN_GET_TFHAR
13731       || code == HTM_BUILTIN_SET_TFHAR)
13732     return TFHAR_SPR;
13733   else if (code == HTM_BUILTIN_GET_TFIAR
13734            || code == HTM_BUILTIN_SET_TFIAR)
13735     return TFIAR_SPR;
13736   else if (code == HTM_BUILTIN_GET_TEXASR
13737            || code == HTM_BUILTIN_SET_TEXASR)
13738     return TEXASR_SPR;
13739   gcc_assert (code == HTM_BUILTIN_GET_TEXASRU
13740               || code == HTM_BUILTIN_SET_TEXASRU);
13741   return TEXASRU_SPR;
13742 }
13743
13744 /* Return the correct ICODE value depending on whether we are
13745    setting or reading the HTM SPRs.  */
13746 static inline enum insn_code
13747 rs6000_htm_spr_icode (bool nonvoid)
13748 {
13749   if (nonvoid)
13750     return (TARGET_POWERPC64) ? CODE_FOR_htm_mfspr_di : CODE_FOR_htm_mfspr_si;
13751   else
13752     return (TARGET_POWERPC64) ? CODE_FOR_htm_mtspr_di : CODE_FOR_htm_mtspr_si;
13753 }
13754
13755 /* Expand the HTM builtin in EXP and store the result in TARGET.
13756    Store true in *EXPANDEDP if we found a builtin to expand.  */
13757 static rtx
13758 htm_expand_builtin (tree exp, rtx target, bool * expandedp)
13759 {
13760   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
13761   bool nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
13762   enum rs6000_builtins fcode = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
13763   const struct builtin_description *d;
13764   size_t i;
13765
13766   *expandedp = true;
13767
13768   if (!TARGET_POWERPC64
13769       && (fcode == HTM_BUILTIN_TABORTDC
13770           || fcode == HTM_BUILTIN_TABORTDCI))
13771     {
13772       size_t uns_fcode = (size_t)fcode;
13773       const char *name = rs6000_builtin_info[uns_fcode].name;
13774       error ("builtin %qs is only valid in 64-bit mode", name);
13775       return const0_rtx;
13776     }
13777
13778   /* Expand the HTM builtins.  */
13779   d = bdesc_htm;
13780   for (i = 0; i < ARRAY_SIZE (bdesc_htm); i++, d++)
13781     if (d->code == fcode)
13782       {
13783         rtx op[MAX_HTM_OPERANDS], pat;
13784         int nopnds = 0;
13785         tree arg;
13786         call_expr_arg_iterator iter;
13787         unsigned attr = rs6000_builtin_info[fcode].attr;
13788         enum insn_code icode = d->icode;
13789         const struct insn_operand_data *insn_op;
13790         bool uses_spr = (attr & RS6000_BTC_SPR);
13791         rtx cr = NULL_RTX;
13792
13793         if (uses_spr)
13794           icode = rs6000_htm_spr_icode (nonvoid);
13795         insn_op = &insn_data[icode].operand[0];
13796
13797         if (nonvoid)
13798           {
13799             machine_mode tmode = (uses_spr) ? insn_op->mode : E_SImode;
13800             if (!target
13801                 || GET_MODE (target) != tmode
13802                 || (uses_spr && !(*insn_op->predicate) (target, tmode)))
13803               target = gen_reg_rtx (tmode);
13804             if (uses_spr)
13805               op[nopnds++] = target;
13806           }
13807
13808         FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
13809         {
13810           if (arg == error_mark_node || nopnds >= MAX_HTM_OPERANDS)
13811             return const0_rtx;
13812
13813           insn_op = &insn_data[icode].operand[nopnds];
13814
13815           op[nopnds] = expand_normal (arg);
13816
13817           if (!(*insn_op->predicate) (op[nopnds], insn_op->mode))
13818             {
13819               if (!strcmp (insn_op->constraint, "n"))
13820                 {
13821                   int arg_num = (nonvoid) ? nopnds : nopnds + 1;
13822                   if (!CONST_INT_P (op[nopnds]))
13823                     error ("argument %d must be an unsigned literal", arg_num);
13824                   else
13825                     error ("argument %d is an unsigned literal that is "
13826                            "out of range", arg_num);
13827                   return const0_rtx;
13828                 }
13829               op[nopnds] = copy_to_mode_reg (insn_op->mode, op[nopnds]);
13830             }
13831
13832           nopnds++;
13833         }
13834
13835         /* Handle the builtins for extended mnemonics.  These accept
13836            no arguments, but map to builtins that take arguments.  */
13837         switch (fcode)
13838           {
13839           case HTM_BUILTIN_TENDALL:  /* Alias for: tend. 1  */
13840           case HTM_BUILTIN_TRESUME:  /* Alias for: tsr. 1  */
13841             op[nopnds++] = GEN_INT (1);
13842             if (flag_checking)
13843               attr |= RS6000_BTC_UNARY;
13844             break;
13845           case HTM_BUILTIN_TSUSPEND: /* Alias for: tsr. 0  */
13846             op[nopnds++] = GEN_INT (0);
13847             if (flag_checking)
13848               attr |= RS6000_BTC_UNARY;
13849             break;
13850           default:
13851             break;
13852           }
13853
13854         /* If this builtin accesses SPRs, then pass in the appropriate
13855            SPR number and SPR regno as the last two operands.  */
13856         if (uses_spr)
13857           {
13858             machine_mode mode = (TARGET_POWERPC64) ? DImode : SImode;
13859             op[nopnds++] = gen_rtx_CONST_INT (mode, htm_spr_num (fcode));
13860           }
13861         /* If this builtin accesses a CR, then pass in a scratch
13862            CR as the last operand.  */
13863         else if (attr & RS6000_BTC_CR)
13864           { cr = gen_reg_rtx (CCmode);
13865             op[nopnds++] = cr;
13866           }
13867
13868         if (flag_checking)
13869           {
13870             int expected_nopnds = 0;
13871             if ((attr & RS6000_BTC_TYPE_MASK) == RS6000_BTC_UNARY)
13872               expected_nopnds = 1;
13873             else if ((attr & RS6000_BTC_TYPE_MASK) == RS6000_BTC_BINARY)
13874               expected_nopnds = 2;
13875             else if ((attr & RS6000_BTC_TYPE_MASK) == RS6000_BTC_TERNARY)
13876               expected_nopnds = 3;
13877             if (!(attr & RS6000_BTC_VOID))
13878               expected_nopnds += 1;
13879             if (uses_spr)
13880               expected_nopnds += 1;
13881
13882             gcc_assert (nopnds == expected_nopnds
13883                         && nopnds <= MAX_HTM_OPERANDS);
13884           }
13885
13886         switch (nopnds)
13887           {
13888           case 1:
13889             pat = GEN_FCN (icode) (op[0]);
13890             break;
13891           case 2:
13892             pat = GEN_FCN (icode) (op[0], op[1]);
13893             break;
13894           case 3:
13895             pat = GEN_FCN (icode) (op[0], op[1], op[2]);
13896             break;
13897           case 4:
13898             pat = GEN_FCN (icode) (op[0], op[1], op[2], op[3]);
13899             break;
13900           default:
13901             gcc_unreachable ();
13902           }
13903         if (!pat)
13904           return NULL_RTX;
13905         emit_insn (pat);
13906
13907         if (attr & RS6000_BTC_CR)
13908           {
13909             if (fcode == HTM_BUILTIN_TBEGIN)
13910               {
13911                 /* Emit code to set TARGET to true or false depending on
13912                    whether the tbegin. instruction successfully or failed
13913                    to start a transaction.  We do this by placing the 1's
13914                    complement of CR's EQ bit into TARGET.  */
13915                 rtx scratch = gen_reg_rtx (SImode);
13916                 emit_insn (gen_rtx_SET (scratch,
13917                                         gen_rtx_EQ (SImode, cr,
13918                                                      const0_rtx)));
13919                 emit_insn (gen_rtx_SET (target,
13920                                         gen_rtx_XOR (SImode, scratch,
13921                                                      GEN_INT (1))));
13922               }
13923             else
13924               {
13925                 /* Emit code to copy the 4-bit condition register field
13926                    CR into the least significant end of register TARGET.  */
13927                 rtx scratch1 = gen_reg_rtx (SImode);
13928                 rtx scratch2 = gen_reg_rtx (SImode);
13929                 rtx subreg = simplify_gen_subreg (CCmode, scratch1, SImode, 0);
13930                 emit_insn (gen_movcc (subreg, cr));
13931                 emit_insn (gen_lshrsi3 (scratch2, scratch1, GEN_INT (28)));
13932                 emit_insn (gen_andsi3 (target, scratch2, GEN_INT (0xf)));
13933               }
13934           }
13935
13936         if (nonvoid)
13937           return target;
13938         return const0_rtx;
13939       }
13940
13941   *expandedp = false;
13942   return NULL_RTX;
13943 }
13944
13945 /* Expand the CPU builtin in FCODE and store the result in TARGET.  */
13946
13947 static rtx
13948 cpu_expand_builtin (enum rs6000_builtins fcode, tree exp ATTRIBUTE_UNUSED,
13949                     rtx target)
13950 {
13951   /* __builtin_cpu_init () is a nop, so expand to nothing.  */
13952   if (fcode == RS6000_BUILTIN_CPU_INIT)
13953     return const0_rtx;
13954
13955   if (target == 0 || GET_MODE (target) != SImode)
13956     target = gen_reg_rtx (SImode);
13957
13958 #ifdef TARGET_LIBC_PROVIDES_HWCAP_IN_TCB
13959   tree arg = TREE_OPERAND (CALL_EXPR_ARG (exp, 0), 0);
13960   /* Target clones creates an ARRAY_REF instead of STRING_CST, convert it back
13961      to a STRING_CST.  */
13962   if (TREE_CODE (arg) == ARRAY_REF
13963       && TREE_CODE (TREE_OPERAND (arg, 0)) == STRING_CST
13964       && TREE_CODE (TREE_OPERAND (arg, 1)) == INTEGER_CST
13965       && compare_tree_int (TREE_OPERAND (arg, 1), 0) == 0)
13966     arg = TREE_OPERAND (arg, 0);
13967
13968   if (TREE_CODE (arg) != STRING_CST)
13969     {
13970       error ("builtin %qs only accepts a string argument",
13971              rs6000_builtin_info[(size_t) fcode].name);
13972       return const0_rtx;
13973     }
13974
13975   if (fcode == RS6000_BUILTIN_CPU_IS)
13976     {
13977       const char *cpu = TREE_STRING_POINTER (arg);
13978       rtx cpuid = NULL_RTX;
13979       for (size_t i = 0; i < ARRAY_SIZE (cpu_is_info); i++)
13980         if (strcmp (cpu, cpu_is_info[i].cpu) == 0)
13981           {
13982             /* The CPUID value in the TCB is offset by _DL_FIRST_PLATFORM.  */
13983             cpuid = GEN_INT (cpu_is_info[i].cpuid + _DL_FIRST_PLATFORM);
13984             break;
13985           }
13986       if (cpuid == NULL_RTX)
13987         {
13988           /* Invalid CPU argument.  */
13989           error ("cpu %qs is an invalid argument to builtin %qs",
13990                  cpu, rs6000_builtin_info[(size_t) fcode].name);
13991           return const0_rtx;
13992         }
13993
13994       rtx platform = gen_reg_rtx (SImode);
13995       rtx tcbmem = gen_const_mem (SImode,
13996                                   gen_rtx_PLUS (Pmode,
13997                                                 gen_rtx_REG (Pmode, TLS_REGNUM),
13998                                                 GEN_INT (TCB_PLATFORM_OFFSET)));
13999       emit_move_insn (platform, tcbmem);
14000       emit_insn (gen_eqsi3 (target, platform, cpuid));
14001     }
14002   else if (fcode == RS6000_BUILTIN_CPU_SUPPORTS)
14003     {
14004       const char *hwcap = TREE_STRING_POINTER (arg);
14005       rtx mask = NULL_RTX;
14006       int hwcap_offset;
14007       for (size_t i = 0; i < ARRAY_SIZE (cpu_supports_info); i++)
14008         if (strcmp (hwcap, cpu_supports_info[i].hwcap) == 0)
14009           {
14010             mask = GEN_INT (cpu_supports_info[i].mask);
14011             hwcap_offset = TCB_HWCAP_OFFSET (cpu_supports_info[i].id);
14012             break;
14013           }
14014       if (mask == NULL_RTX)
14015         {
14016           /* Invalid HWCAP argument.  */
14017           error ("%s %qs is an invalid argument to builtin %qs",
14018                  "hwcap", hwcap, rs6000_builtin_info[(size_t) fcode].name);
14019           return const0_rtx;
14020         }
14021
14022       rtx tcb_hwcap = gen_reg_rtx (SImode);
14023       rtx tcbmem = gen_const_mem (SImode,
14024                                   gen_rtx_PLUS (Pmode,
14025                                                 gen_rtx_REG (Pmode, TLS_REGNUM),
14026                                                 GEN_INT (hwcap_offset)));
14027       emit_move_insn (tcb_hwcap, tcbmem);
14028       rtx scratch1 = gen_reg_rtx (SImode);
14029       emit_insn (gen_rtx_SET (scratch1, gen_rtx_AND (SImode, tcb_hwcap, mask)));
14030       rtx scratch2 = gen_reg_rtx (SImode);
14031       emit_insn (gen_eqsi3 (scratch2, scratch1, const0_rtx));
14032       emit_insn (gen_rtx_SET (target, gen_rtx_XOR (SImode, scratch2, const1_rtx)));
14033     }
14034   else
14035     gcc_unreachable ();
14036
14037   /* Record that we have expanded a CPU builtin, so that we can later
14038      emit a reference to the special symbol exported by LIBC to ensure we
14039      do not link against an old LIBC that doesn't support this feature.  */
14040   cpu_builtin_p = true;
14041
14042 #else
14043   warning (0, "builtin %qs needs GLIBC (2.23 and newer) that exports hardware "
14044            "capability bits", rs6000_builtin_info[(size_t) fcode].name);
14045   
14046   /* For old LIBCs, always return FALSE.  */
14047   emit_move_insn (target, GEN_INT (0));
14048 #endif /* TARGET_LIBC_PROVIDES_HWCAP_IN_TCB */
14049
14050   return target;
14051 }
14052
14053 static rtx
14054 rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
14055 {
14056   rtx pat;
14057   tree arg0 = CALL_EXPR_ARG (exp, 0);
14058   tree arg1 = CALL_EXPR_ARG (exp, 1);
14059   tree arg2 = CALL_EXPR_ARG (exp, 2);
14060   rtx op0 = expand_normal (arg0);
14061   rtx op1 = expand_normal (arg1);
14062   rtx op2 = expand_normal (arg2);
14063   machine_mode tmode = insn_data[icode].operand[0].mode;
14064   machine_mode mode0 = insn_data[icode].operand[1].mode;
14065   machine_mode mode1 = insn_data[icode].operand[2].mode;
14066   machine_mode mode2 = insn_data[icode].operand[3].mode;
14067
14068   if (icode == CODE_FOR_nothing)
14069     /* Builtin not supported on this processor.  */
14070     return 0;
14071
14072   /* If we got invalid arguments bail out before generating bad rtl.  */
14073   if (arg0 == error_mark_node
14074       || arg1 == error_mark_node
14075       || arg2 == error_mark_node)
14076     return const0_rtx;
14077
14078   /* Check and prepare argument depending on the instruction code.
14079
14080      Note that a switch statement instead of the sequence of tests
14081      would be incorrect as many of the CODE_FOR values could be
14082      CODE_FOR_nothing and that would yield multiple alternatives
14083      with identical values.  We'd never reach here at runtime in
14084      this case.  */
14085   if (icode == CODE_FOR_altivec_vsldoi_v4sf
14086       || icode == CODE_FOR_altivec_vsldoi_v2df
14087       || icode == CODE_FOR_altivec_vsldoi_v4si
14088       || icode == CODE_FOR_altivec_vsldoi_v8hi
14089       || icode == CODE_FOR_altivec_vsldoi_v16qi)
14090     {
14091       /* Only allow 4-bit unsigned literals.  */
14092       STRIP_NOPS (arg2);
14093       if (TREE_CODE (arg2) != INTEGER_CST
14094           || TREE_INT_CST_LOW (arg2) & ~0xf)
14095         {
14096           error ("argument 3 must be a 4-bit unsigned literal");
14097           return CONST0_RTX (tmode);
14098         }
14099     }
14100   else if (icode == CODE_FOR_vsx_xxpermdi_v2df
14101            || icode == CODE_FOR_vsx_xxpermdi_v2di
14102            || icode == CODE_FOR_vsx_xxpermdi_v2df_be
14103            || icode == CODE_FOR_vsx_xxpermdi_v2di_be
14104            || icode == CODE_FOR_vsx_xxpermdi_v1ti
14105            || icode == CODE_FOR_vsx_xxpermdi_v4sf
14106            || icode == CODE_FOR_vsx_xxpermdi_v4si
14107            || icode == CODE_FOR_vsx_xxpermdi_v8hi
14108            || icode == CODE_FOR_vsx_xxpermdi_v16qi
14109            || icode == CODE_FOR_vsx_xxsldwi_v16qi
14110            || icode == CODE_FOR_vsx_xxsldwi_v8hi
14111            || icode == CODE_FOR_vsx_xxsldwi_v4si
14112            || icode == CODE_FOR_vsx_xxsldwi_v4sf
14113            || icode == CODE_FOR_vsx_xxsldwi_v2di
14114            || icode == CODE_FOR_vsx_xxsldwi_v2df)
14115     {
14116       /* Only allow 2-bit unsigned literals.  */
14117       STRIP_NOPS (arg2);
14118       if (TREE_CODE (arg2) != INTEGER_CST
14119           || TREE_INT_CST_LOW (arg2) & ~0x3)
14120         {
14121           error ("argument 3 must be a 2-bit unsigned literal");
14122           return CONST0_RTX (tmode);
14123         }
14124     }
14125   else if (icode == CODE_FOR_vsx_set_v2df
14126            || icode == CODE_FOR_vsx_set_v2di
14127            || icode == CODE_FOR_bcdadd
14128            || icode == CODE_FOR_bcdadd_lt
14129            || icode == CODE_FOR_bcdadd_eq
14130            || icode == CODE_FOR_bcdadd_gt
14131            || icode == CODE_FOR_bcdsub
14132            || icode == CODE_FOR_bcdsub_lt
14133            || icode == CODE_FOR_bcdsub_eq
14134            || icode == CODE_FOR_bcdsub_gt)
14135     {
14136       /* Only allow 1-bit unsigned literals.  */
14137       STRIP_NOPS (arg2);
14138       if (TREE_CODE (arg2) != INTEGER_CST
14139           || TREE_INT_CST_LOW (arg2) & ~0x1)
14140         {
14141           error ("argument 3 must be a 1-bit unsigned literal");
14142           return CONST0_RTX (tmode);
14143         }
14144     }
14145   else if (icode == CODE_FOR_dfp_ddedpd_dd
14146            || icode == CODE_FOR_dfp_ddedpd_td)
14147     {
14148       /* Only allow 2-bit unsigned literals where the value is 0 or 2.  */
14149       STRIP_NOPS (arg0);
14150       if (TREE_CODE (arg0) != INTEGER_CST
14151           || TREE_INT_CST_LOW (arg2) & ~0x3)
14152         {
14153           error ("argument 1 must be 0 or 2");
14154           return CONST0_RTX (tmode);
14155         }
14156     }
14157   else if (icode == CODE_FOR_dfp_denbcd_dd
14158            || icode == CODE_FOR_dfp_denbcd_td)
14159     {
14160       /* Only allow 1-bit unsigned literals.  */
14161       STRIP_NOPS (arg0);
14162       if (TREE_CODE (arg0) != INTEGER_CST
14163           || TREE_INT_CST_LOW (arg0) & ~0x1)
14164         {
14165           error ("argument 1 must be a 1-bit unsigned literal");
14166           return CONST0_RTX (tmode);
14167         }
14168     }
14169   else if (icode == CODE_FOR_dfp_dscli_dd
14170            || icode == CODE_FOR_dfp_dscli_td
14171            || icode == CODE_FOR_dfp_dscri_dd
14172            || icode == CODE_FOR_dfp_dscri_td)
14173     {
14174       /* Only allow 6-bit unsigned literals.  */
14175       STRIP_NOPS (arg1);
14176       if (TREE_CODE (arg1) != INTEGER_CST
14177           || TREE_INT_CST_LOW (arg1) & ~0x3f)
14178         {
14179           error ("argument 2 must be a 6-bit unsigned literal");
14180           return CONST0_RTX (tmode);
14181         }
14182     }
14183   else if (icode == CODE_FOR_crypto_vshasigmaw
14184            || icode == CODE_FOR_crypto_vshasigmad)
14185     {
14186       /* Check whether the 2nd and 3rd arguments are integer constants and in
14187          range and prepare arguments.  */
14188       STRIP_NOPS (arg1);
14189       if (TREE_CODE (arg1) != INTEGER_CST || wi::geu_p (wi::to_wide (arg1), 2))
14190         {
14191           error ("argument 2 must be 0 or 1");
14192           return CONST0_RTX (tmode);
14193         }
14194
14195       STRIP_NOPS (arg2);
14196       if (TREE_CODE (arg2) != INTEGER_CST
14197           || wi::geu_p (wi::to_wide (arg2), 16))
14198         {
14199           error ("argument 3 must be in the range [0, 15]");
14200           return CONST0_RTX (tmode);
14201         }
14202     }
14203
14204   if (target == 0
14205       || GET_MODE (target) != tmode
14206       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
14207     target = gen_reg_rtx (tmode);
14208
14209   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
14210     op0 = copy_to_mode_reg (mode0, op0);
14211   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
14212     op1 = copy_to_mode_reg (mode1, op1);
14213   if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
14214     op2 = copy_to_mode_reg (mode2, op2);
14215
14216   pat = GEN_FCN (icode) (target, op0, op1, op2);
14217   if (! pat)
14218     return 0;
14219   emit_insn (pat);
14220
14221   return target;
14222 }
14223
14224
14225 /* Expand the dst builtins.  */
14226 static rtx
14227 altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
14228                             bool *expandedp)
14229 {
14230   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
14231   enum rs6000_builtins fcode = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
14232   tree arg0, arg1, arg2;
14233   machine_mode mode0, mode1;
14234   rtx pat, op0, op1, op2;
14235   const struct builtin_description *d;
14236   size_t i;
14237
14238   *expandedp = false;
14239
14240   /* Handle DST variants.  */
14241   d = bdesc_dst;
14242   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
14243     if (d->code == fcode)
14244       {
14245         arg0 = CALL_EXPR_ARG (exp, 0);
14246         arg1 = CALL_EXPR_ARG (exp, 1);
14247         arg2 = CALL_EXPR_ARG (exp, 2);
14248         op0 = expand_normal (arg0);
14249         op1 = expand_normal (arg1);
14250         op2 = expand_normal (arg2);
14251         mode0 = insn_data[d->icode].operand[0].mode;
14252         mode1 = insn_data[d->icode].operand[1].mode;
14253
14254         /* Invalid arguments, bail out before generating bad rtl.  */
14255         if (arg0 == error_mark_node
14256             || arg1 == error_mark_node
14257             || arg2 == error_mark_node)
14258           return const0_rtx;
14259
14260         *expandedp = true;
14261         STRIP_NOPS (arg2);
14262         if (TREE_CODE (arg2) != INTEGER_CST
14263             || TREE_INT_CST_LOW (arg2) & ~0x3)
14264           {
14265             error ("argument to %qs must be a 2-bit unsigned literal", d->name);
14266             return const0_rtx;
14267           }
14268
14269         if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
14270           op0 = copy_to_mode_reg (Pmode, op0);
14271         if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
14272           op1 = copy_to_mode_reg (mode1, op1);
14273
14274         pat = GEN_FCN (d->icode) (op0, op1, op2);
14275         if (pat != 0)
14276           emit_insn (pat);
14277
14278         return NULL_RTX;
14279       }
14280
14281   return NULL_RTX;
14282 }
14283
14284 /* Expand vec_init builtin.  */
14285 static rtx
14286 altivec_expand_vec_init_builtin (tree type, tree exp, rtx target)
14287 {
14288   machine_mode tmode = TYPE_MODE (type);
14289   machine_mode inner_mode = GET_MODE_INNER (tmode);
14290   int i, n_elt = GET_MODE_NUNITS (tmode);
14291
14292   gcc_assert (VECTOR_MODE_P (tmode));
14293   gcc_assert (n_elt == call_expr_nargs (exp));
14294
14295   if (!target || !register_operand (target, tmode))
14296     target = gen_reg_rtx (tmode);
14297
14298   /* If we have a vector compromised of a single element, such as V1TImode, do
14299      the initialization directly.  */
14300   if (n_elt == 1 && GET_MODE_SIZE (tmode) == GET_MODE_SIZE (inner_mode))
14301     {
14302       rtx x = expand_normal (CALL_EXPR_ARG (exp, 0));
14303       emit_move_insn (target, gen_lowpart (tmode, x));
14304     }
14305   else
14306     {
14307       rtvec v = rtvec_alloc (n_elt);
14308
14309       for (i = 0; i < n_elt; ++i)
14310         {
14311           rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
14312           RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
14313         }
14314
14315       rs6000_expand_vector_init (target, gen_rtx_PARALLEL (tmode, v));
14316     }
14317
14318   return target;
14319 }
14320
14321 /* Return the integer constant in ARG.  Constrain it to be in the range
14322    of the subparts of VEC_TYPE; issue an error if not.  */
14323
14324 static int
14325 get_element_number (tree vec_type, tree arg)
14326 {
14327   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
14328
14329   if (!tree_fits_uhwi_p (arg)
14330       || (elt = tree_to_uhwi (arg), elt > max))
14331     {
14332       error ("selector must be an integer constant in the range [0, %wi]", max);
14333       return 0;
14334     }
14335
14336   return elt;
14337 }
14338
14339 /* Expand vec_set builtin.  */
14340 static rtx
14341 altivec_expand_vec_set_builtin (tree exp)
14342 {
14343   machine_mode tmode, mode1;
14344   tree arg0, arg1, arg2;
14345   int elt;
14346   rtx op0, op1;
14347
14348   arg0 = CALL_EXPR_ARG (exp, 0);
14349   arg1 = CALL_EXPR_ARG (exp, 1);
14350   arg2 = CALL_EXPR_ARG (exp, 2);
14351
14352   tmode = TYPE_MODE (TREE_TYPE (arg0));
14353   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
14354   gcc_assert (VECTOR_MODE_P (tmode));
14355
14356   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
14357   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
14358   elt = get_element_number (TREE_TYPE (arg0), arg2);
14359
14360   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
14361     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
14362
14363   op0 = force_reg (tmode, op0);
14364   op1 = force_reg (mode1, op1);
14365
14366   rs6000_expand_vector_set (op0, op1, elt);
14367
14368   return op0;
14369 }
14370
14371 /* Expand vec_ext builtin.  */
14372 static rtx
14373 altivec_expand_vec_ext_builtin (tree exp, rtx target)
14374 {
14375   machine_mode tmode, mode0;
14376   tree arg0, arg1;
14377   rtx op0;
14378   rtx op1;
14379
14380   arg0 = CALL_EXPR_ARG (exp, 0);
14381   arg1 = CALL_EXPR_ARG (exp, 1);
14382
14383   op0 = expand_normal (arg0);
14384   op1 = expand_normal (arg1);
14385
14386   if (TREE_CODE (arg1) == INTEGER_CST)
14387     {
14388       unsigned HOST_WIDE_INT elt;
14389       unsigned HOST_WIDE_INT size = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0));
14390       unsigned int truncated_selector;
14391       /* Even if !tree_fits_uhwi_p (arg1)), TREE_INT_CST_LOW (arg0)
14392          returns low-order bits of INTEGER_CST for modulo indexing.  */
14393       elt = TREE_INT_CST_LOW (arg1);
14394       truncated_selector = elt % size;
14395       op1 = GEN_INT (truncated_selector);
14396     }
14397
14398   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
14399   mode0 = TYPE_MODE (TREE_TYPE (arg0));
14400   gcc_assert (VECTOR_MODE_P (mode0));
14401
14402   op0 = force_reg (mode0, op0);
14403
14404   if (optimize || !target || !register_operand (target, tmode))
14405     target = gen_reg_rtx (tmode);
14406
14407   rs6000_expand_vector_extract (target, op0, op1);
14408
14409   return target;
14410 }
14411
14412 /* Expand the builtin in EXP and store the result in TARGET.  Store
14413    true in *EXPANDEDP if we found a builtin to expand.  */
14414 static rtx
14415 altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
14416 {
14417   const struct builtin_description *d;
14418   size_t i;
14419   enum insn_code icode;
14420   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
14421   tree arg0, arg1, arg2;
14422   rtx op0, pat;
14423   machine_mode tmode, mode0;
14424   enum rs6000_builtins fcode
14425     = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
14426
14427   if (rs6000_overloaded_builtin_p (fcode))
14428     {
14429       *expandedp = true;
14430       error ("unresolved overload for Altivec builtin %qF", fndecl);
14431
14432       /* Given it is invalid, just generate a normal call.  */
14433       return expand_call (exp, target, false);
14434     }
14435
14436   target = altivec_expand_dst_builtin (exp, target, expandedp);
14437   if (*expandedp)
14438     return target;
14439
14440   *expandedp = true;
14441
14442   switch (fcode)
14443     {
14444     case ALTIVEC_BUILTIN_STVX_V2DF:
14445       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v2df, exp);
14446     case ALTIVEC_BUILTIN_STVX_V2DI:
14447       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v2di, exp);
14448     case ALTIVEC_BUILTIN_STVX_V4SF:
14449       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v4sf, exp);
14450     case ALTIVEC_BUILTIN_STVX:
14451     case ALTIVEC_BUILTIN_STVX_V4SI:
14452       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v4si, exp);
14453     case ALTIVEC_BUILTIN_STVX_V8HI:
14454       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v8hi, exp);
14455     case ALTIVEC_BUILTIN_STVX_V16QI:
14456       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v16qi, exp);
14457     case ALTIVEC_BUILTIN_STVEBX:
14458       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, exp);
14459     case ALTIVEC_BUILTIN_STVEHX:
14460       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, exp);
14461     case ALTIVEC_BUILTIN_STVEWX:
14462       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, exp);
14463     case ALTIVEC_BUILTIN_STVXL_V2DF:
14464       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl_v2df, exp);
14465     case ALTIVEC_BUILTIN_STVXL_V2DI:
14466       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl_v2di, exp);
14467     case ALTIVEC_BUILTIN_STVXL_V4SF:
14468       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl_v4sf, exp);
14469     case ALTIVEC_BUILTIN_STVXL:
14470     case ALTIVEC_BUILTIN_STVXL_V4SI:
14471       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl_v4si, exp);
14472     case ALTIVEC_BUILTIN_STVXL_V8HI:
14473       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl_v8hi, exp);
14474     case ALTIVEC_BUILTIN_STVXL_V16QI:
14475       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl_v16qi, exp);
14476
14477     case ALTIVEC_BUILTIN_STVLX:
14478       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlx, exp);
14479     case ALTIVEC_BUILTIN_STVLXL:
14480       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlxl, exp);
14481     case ALTIVEC_BUILTIN_STVRX:
14482       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrx, exp);
14483     case ALTIVEC_BUILTIN_STVRXL:
14484       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrxl, exp);
14485
14486     case P9V_BUILTIN_STXVL:
14487       return altivec_expand_stxvl_builtin (CODE_FOR_stxvl, exp);
14488
14489     case P9V_BUILTIN_XST_LEN_R:
14490       return altivec_expand_stxvl_builtin (CODE_FOR_xst_len_r, exp);
14491
14492     case VSX_BUILTIN_STXVD2X_V1TI:
14493       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v1ti, exp);
14494     case VSX_BUILTIN_STXVD2X_V2DF:
14495       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v2df, exp);
14496     case VSX_BUILTIN_STXVD2X_V2DI:
14497       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v2di, exp);
14498     case VSX_BUILTIN_STXVW4X_V4SF:
14499       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v4sf, exp);
14500     case VSX_BUILTIN_STXVW4X_V4SI:
14501       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v4si, exp);
14502     case VSX_BUILTIN_STXVW4X_V8HI:
14503       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v8hi, exp);
14504     case VSX_BUILTIN_STXVW4X_V16QI:
14505       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v16qi, exp);
14506
14507     /* For the following on big endian, it's ok to use any appropriate
14508        unaligned-supporting store, so use a generic expander.  For
14509        little-endian, the exact element-reversing instruction must
14510        be used.  */
14511    case VSX_BUILTIN_ST_ELEMREV_V1TI:
14512      {
14513         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v1ti
14514                                : CODE_FOR_vsx_st_elemrev_v1ti);
14515         return altivec_expand_stv_builtin (code, exp);
14516       }
14517     case VSX_BUILTIN_ST_ELEMREV_V2DF:
14518       {
14519         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v2df
14520                                : CODE_FOR_vsx_st_elemrev_v2df);
14521         return altivec_expand_stv_builtin (code, exp);
14522       }
14523     case VSX_BUILTIN_ST_ELEMREV_V2DI:
14524       {
14525         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v2di
14526                                : CODE_FOR_vsx_st_elemrev_v2di);
14527         return altivec_expand_stv_builtin (code, exp);
14528       }
14529     case VSX_BUILTIN_ST_ELEMREV_V4SF:
14530       {
14531         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v4sf
14532                                : CODE_FOR_vsx_st_elemrev_v4sf);
14533         return altivec_expand_stv_builtin (code, exp);
14534       }
14535     case VSX_BUILTIN_ST_ELEMREV_V4SI:
14536       {
14537         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v4si
14538                                : CODE_FOR_vsx_st_elemrev_v4si);
14539         return altivec_expand_stv_builtin (code, exp);
14540       }
14541     case VSX_BUILTIN_ST_ELEMREV_V8HI:
14542       {
14543         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v8hi
14544                                : CODE_FOR_vsx_st_elemrev_v8hi);
14545         return altivec_expand_stv_builtin (code, exp);
14546       }
14547     case VSX_BUILTIN_ST_ELEMREV_V16QI:
14548       {
14549         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v16qi
14550                                : CODE_FOR_vsx_st_elemrev_v16qi);
14551         return altivec_expand_stv_builtin (code, exp);
14552       }
14553
14554     case ALTIVEC_BUILTIN_MFVSCR:
14555       icode = CODE_FOR_altivec_mfvscr;
14556       tmode = insn_data[icode].operand[0].mode;
14557
14558       if (target == 0
14559           || GET_MODE (target) != tmode
14560           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
14561         target = gen_reg_rtx (tmode);
14562
14563       pat = GEN_FCN (icode) (target);
14564       if (! pat)
14565         return 0;
14566       emit_insn (pat);
14567       return target;
14568
14569     case ALTIVEC_BUILTIN_MTVSCR:
14570       icode = CODE_FOR_altivec_mtvscr;
14571       arg0 = CALL_EXPR_ARG (exp, 0);
14572       op0 = expand_normal (arg0);
14573       mode0 = insn_data[icode].operand[0].mode;
14574
14575       /* If we got invalid arguments bail out before generating bad rtl.  */
14576       if (arg0 == error_mark_node)
14577         return const0_rtx;
14578
14579       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
14580         op0 = copy_to_mode_reg (mode0, op0);
14581
14582       pat = GEN_FCN (icode) (op0);
14583       if (pat)
14584         emit_insn (pat);
14585       return NULL_RTX;
14586
14587     case ALTIVEC_BUILTIN_DSSALL:
14588       emit_insn (gen_altivec_dssall ());
14589       return NULL_RTX;
14590
14591     case ALTIVEC_BUILTIN_DSS:
14592       icode = CODE_FOR_altivec_dss;
14593       arg0 = CALL_EXPR_ARG (exp, 0);
14594       STRIP_NOPS (arg0);
14595       op0 = expand_normal (arg0);
14596       mode0 = insn_data[icode].operand[0].mode;
14597
14598       /* If we got invalid arguments bail out before generating bad rtl.  */
14599       if (arg0 == error_mark_node)
14600         return const0_rtx;
14601
14602       if (TREE_CODE (arg0) != INTEGER_CST
14603           || TREE_INT_CST_LOW (arg0) & ~0x3)
14604         {
14605           error ("argument to %qs must be a 2-bit unsigned literal", "dss");
14606           return const0_rtx;
14607         }
14608
14609       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
14610         op0 = copy_to_mode_reg (mode0, op0);
14611
14612       emit_insn (gen_altivec_dss (op0));
14613       return NULL_RTX;
14614
14615     case ALTIVEC_BUILTIN_VEC_INIT_V4SI:
14616     case ALTIVEC_BUILTIN_VEC_INIT_V8HI:
14617     case ALTIVEC_BUILTIN_VEC_INIT_V16QI:
14618     case ALTIVEC_BUILTIN_VEC_INIT_V4SF:
14619     case VSX_BUILTIN_VEC_INIT_V2DF:
14620     case VSX_BUILTIN_VEC_INIT_V2DI:
14621     case VSX_BUILTIN_VEC_INIT_V1TI:
14622       return altivec_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
14623
14624     case ALTIVEC_BUILTIN_VEC_SET_V4SI:
14625     case ALTIVEC_BUILTIN_VEC_SET_V8HI:
14626     case ALTIVEC_BUILTIN_VEC_SET_V16QI:
14627     case ALTIVEC_BUILTIN_VEC_SET_V4SF:
14628     case VSX_BUILTIN_VEC_SET_V2DF:
14629     case VSX_BUILTIN_VEC_SET_V2DI:
14630     case VSX_BUILTIN_VEC_SET_V1TI:
14631       return altivec_expand_vec_set_builtin (exp);
14632
14633     case ALTIVEC_BUILTIN_VEC_EXT_V4SI:
14634     case ALTIVEC_BUILTIN_VEC_EXT_V8HI:
14635     case ALTIVEC_BUILTIN_VEC_EXT_V16QI:
14636     case ALTIVEC_BUILTIN_VEC_EXT_V4SF:
14637     case VSX_BUILTIN_VEC_EXT_V2DF:
14638     case VSX_BUILTIN_VEC_EXT_V2DI:
14639     case VSX_BUILTIN_VEC_EXT_V1TI:
14640       return altivec_expand_vec_ext_builtin (exp, target);
14641
14642     case P9V_BUILTIN_VEC_EXTRACT4B:
14643       arg1 = CALL_EXPR_ARG (exp, 1);
14644       STRIP_NOPS (arg1);
14645
14646       /* Generate a normal call if it is invalid.  */
14647       if (arg1 == error_mark_node)
14648         return expand_call (exp, target, false);
14649
14650       if (TREE_CODE (arg1) != INTEGER_CST || TREE_INT_CST_LOW (arg1) > 12)
14651         {
14652           error ("second argument to %qs must be [0, 12]", "vec_vextract4b");
14653           return expand_call (exp, target, false);
14654         }
14655       break;
14656
14657     case P9V_BUILTIN_VEC_INSERT4B:
14658       arg2 = CALL_EXPR_ARG (exp, 2);
14659       STRIP_NOPS (arg2);
14660
14661       /* Generate a normal call if it is invalid.  */
14662       if (arg2 == error_mark_node)
14663         return expand_call (exp, target, false);
14664
14665       if (TREE_CODE (arg2) != INTEGER_CST || TREE_INT_CST_LOW (arg2) > 12)
14666         {
14667           error ("third argument to %qs must be [0, 12]", "vec_vinsert4b");
14668           return expand_call (exp, target, false);
14669         }
14670       break;
14671
14672     default:
14673       break;
14674       /* Fall through.  */
14675     }
14676
14677   /* Expand abs* operations.  */
14678   d = bdesc_abs;
14679   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
14680     if (d->code == fcode)
14681       return altivec_expand_abs_builtin (d->icode, exp, target);
14682
14683   /* Expand the AltiVec predicates.  */
14684   d = bdesc_altivec_preds;
14685   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, d++)
14686     if (d->code == fcode)
14687       return altivec_expand_predicate_builtin (d->icode, exp, target);
14688
14689   /* LV* are funky.  We initialized them differently.  */
14690   switch (fcode)
14691     {
14692     case ALTIVEC_BUILTIN_LVSL:
14693       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
14694                                         exp, target, false);
14695     case ALTIVEC_BUILTIN_LVSR:
14696       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
14697                                         exp, target, false);
14698     case ALTIVEC_BUILTIN_LVEBX:
14699       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
14700                                         exp, target, false);
14701     case ALTIVEC_BUILTIN_LVEHX:
14702       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
14703                                         exp, target, false);
14704     case ALTIVEC_BUILTIN_LVEWX:
14705       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
14706                                         exp, target, false);
14707     case ALTIVEC_BUILTIN_LVXL_V2DF:
14708       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl_v2df,
14709                                         exp, target, false);
14710     case ALTIVEC_BUILTIN_LVXL_V2DI:
14711       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl_v2di,
14712                                         exp, target, false);
14713     case ALTIVEC_BUILTIN_LVXL_V4SF:
14714       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl_v4sf,
14715                                         exp, target, false);
14716     case ALTIVEC_BUILTIN_LVXL:
14717     case ALTIVEC_BUILTIN_LVXL_V4SI:
14718       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl_v4si,
14719                                         exp, target, false);
14720     case ALTIVEC_BUILTIN_LVXL_V8HI:
14721       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl_v8hi,
14722                                         exp, target, false);
14723     case ALTIVEC_BUILTIN_LVXL_V16QI:
14724       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl_v16qi,
14725                                         exp, target, false);
14726     case ALTIVEC_BUILTIN_LVX_V1TI:
14727       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v1ti,
14728                                         exp, target, false);
14729     case ALTIVEC_BUILTIN_LVX_V2DF:
14730       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v2df,
14731                                         exp, target, false);
14732     case ALTIVEC_BUILTIN_LVX_V2DI:
14733       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v2di,
14734                                         exp, target, false);
14735     case ALTIVEC_BUILTIN_LVX_V4SF:
14736       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v4sf,
14737                                         exp, target, false);
14738     case ALTIVEC_BUILTIN_LVX:
14739     case ALTIVEC_BUILTIN_LVX_V4SI:
14740       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v4si,
14741                                         exp, target, false);
14742     case ALTIVEC_BUILTIN_LVX_V8HI:
14743       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v8hi,
14744                                         exp, target, false);
14745     case ALTIVEC_BUILTIN_LVX_V16QI:
14746       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v16qi,
14747                                         exp, target, false);
14748     case ALTIVEC_BUILTIN_LVLX:
14749       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlx,
14750                                         exp, target, true);
14751     case ALTIVEC_BUILTIN_LVLXL:
14752       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlxl,
14753                                         exp, target, true);
14754     case ALTIVEC_BUILTIN_LVRX:
14755       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrx,
14756                                         exp, target, true);
14757     case ALTIVEC_BUILTIN_LVRXL:
14758       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrxl,
14759                                         exp, target, true);
14760     case VSX_BUILTIN_LXVD2X_V1TI:
14761       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v1ti,
14762                                         exp, target, false);
14763     case VSX_BUILTIN_LXVD2X_V2DF:
14764       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v2df,
14765                                         exp, target, false);
14766     case VSX_BUILTIN_LXVD2X_V2DI:
14767       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v2di,
14768                                         exp, target, false);
14769     case VSX_BUILTIN_LXVW4X_V4SF:
14770       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v4sf,
14771                                         exp, target, false);
14772     case VSX_BUILTIN_LXVW4X_V4SI:
14773       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v4si,
14774                                         exp, target, false);
14775     case VSX_BUILTIN_LXVW4X_V8HI:
14776       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v8hi,
14777                                         exp, target, false);
14778     case VSX_BUILTIN_LXVW4X_V16QI:
14779       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v16qi,
14780                                         exp, target, false);
14781     /* For the following on big endian, it's ok to use any appropriate
14782        unaligned-supporting load, so use a generic expander.  For
14783        little-endian, the exact element-reversing instruction must
14784        be used.  */
14785     case VSX_BUILTIN_LD_ELEMREV_V2DF:
14786       {
14787         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v2df
14788                                : CODE_FOR_vsx_ld_elemrev_v2df);
14789         return altivec_expand_lv_builtin (code, exp, target, false);
14790       }
14791     case VSX_BUILTIN_LD_ELEMREV_V1TI:
14792       {
14793         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v1ti
14794                                : CODE_FOR_vsx_ld_elemrev_v1ti);
14795         return altivec_expand_lv_builtin (code, exp, target, false);
14796       }
14797     case VSX_BUILTIN_LD_ELEMREV_V2DI:
14798       {
14799         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v2di
14800                                : CODE_FOR_vsx_ld_elemrev_v2di);
14801         return altivec_expand_lv_builtin (code, exp, target, false);
14802       }
14803     case VSX_BUILTIN_LD_ELEMREV_V4SF:
14804       {
14805         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v4sf
14806                                : CODE_FOR_vsx_ld_elemrev_v4sf);
14807         return altivec_expand_lv_builtin (code, exp, target, false);
14808       }
14809     case VSX_BUILTIN_LD_ELEMREV_V4SI:
14810       {
14811         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v4si
14812                                : CODE_FOR_vsx_ld_elemrev_v4si);
14813         return altivec_expand_lv_builtin (code, exp, target, false);
14814       }
14815     case VSX_BUILTIN_LD_ELEMREV_V8HI:
14816       {
14817         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v8hi
14818                                : CODE_FOR_vsx_ld_elemrev_v8hi);
14819         return altivec_expand_lv_builtin (code, exp, target, false);
14820       }
14821     case VSX_BUILTIN_LD_ELEMREV_V16QI:
14822       {
14823         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v16qi
14824                                : CODE_FOR_vsx_ld_elemrev_v16qi);
14825         return altivec_expand_lv_builtin (code, exp, target, false);
14826       }
14827       break;
14828     default:
14829       break;
14830       /* Fall through.  */
14831     }
14832
14833   *expandedp = false;
14834   return NULL_RTX;
14835 }
14836
14837 /* Check whether a builtin function is supported in this target
14838    configuration.  */
14839 bool
14840 rs6000_builtin_is_supported_p (enum rs6000_builtins fncode)
14841 {
14842   HOST_WIDE_INT fnmask = rs6000_builtin_info[fncode].mask;
14843   if ((fnmask & rs6000_builtin_mask) != fnmask)
14844     return false;
14845   else
14846     return true;
14847 }
14848
14849 /* Raise an error message for a builtin function that is called without the
14850    appropriate target options being set.  */
14851
14852 static void
14853 rs6000_invalid_builtin (enum rs6000_builtins fncode)
14854 {
14855   size_t uns_fncode = (size_t) fncode;
14856   const char *name = rs6000_builtin_info[uns_fncode].name;
14857   HOST_WIDE_INT fnmask = rs6000_builtin_info[uns_fncode].mask;
14858
14859   gcc_assert (name != NULL);
14860   if ((fnmask & RS6000_BTM_CELL) != 0)
14861     error ("builtin function %qs is only valid for the cell processor", name);
14862   else if ((fnmask & RS6000_BTM_VSX) != 0)
14863     error ("builtin function %qs requires the %qs option", name, "-mvsx");
14864   else if ((fnmask & RS6000_BTM_HTM) != 0)
14865     error ("builtin function %qs requires the %qs option", name, "-mhtm");
14866   else if ((fnmask & RS6000_BTM_ALTIVEC) != 0)
14867     error ("builtin function %qs requires the %qs option", name, "-maltivec");
14868   else if ((fnmask & (RS6000_BTM_DFP | RS6000_BTM_P8_VECTOR))
14869            == (RS6000_BTM_DFP | RS6000_BTM_P8_VECTOR))
14870     error ("builtin function %qs requires the %qs and %qs options",
14871            name, "-mhard-dfp", "-mpower8-vector");
14872   else if ((fnmask & RS6000_BTM_DFP) != 0)
14873     error ("builtin function %qs requires the %qs option", name, "-mhard-dfp");
14874   else if ((fnmask & RS6000_BTM_P8_VECTOR) != 0)
14875     error ("builtin function %qs requires the %qs option", name,
14876            "-mpower8-vector");
14877   else if ((fnmask & (RS6000_BTM_P9_VECTOR | RS6000_BTM_64BIT))
14878            == (RS6000_BTM_P9_VECTOR | RS6000_BTM_64BIT))
14879     error ("builtin function %qs requires the %qs and %qs options",
14880            name, "-mcpu=power9", "-m64");
14881   else if ((fnmask & RS6000_BTM_P9_VECTOR) != 0)
14882     error ("builtin function %qs requires the %qs option", name,
14883            "-mcpu=power9");
14884   else if ((fnmask & (RS6000_BTM_P9_MISC | RS6000_BTM_64BIT))
14885            == (RS6000_BTM_P9_MISC | RS6000_BTM_64BIT))
14886     error ("builtin function %qs requires the %qs and %qs options",
14887            name, "-mcpu=power9", "-m64");
14888   else if ((fnmask & RS6000_BTM_P9_MISC) == RS6000_BTM_P9_MISC)
14889     error ("builtin function %qs requires the %qs option", name,
14890            "-mcpu=power9");
14891   else if ((fnmask & RS6000_BTM_LDBL128) == RS6000_BTM_LDBL128)
14892     {
14893       if (!TARGET_HARD_FLOAT)
14894         error ("builtin function %qs requires the %qs option", name,
14895                "-mhard-float");
14896       else
14897         error ("builtin function %qs requires the %qs option", name,
14898                TARGET_IEEEQUAD ? "-mabi=ibmlongdouble" : "-mlong-double-128");
14899     }
14900   else if ((fnmask & RS6000_BTM_HARD_FLOAT) != 0)
14901     error ("builtin function %qs requires the %qs option", name,
14902            "-mhard-float");
14903   else if ((fnmask & RS6000_BTM_FLOAT128_HW) != 0)
14904     error ("builtin function %qs requires ISA 3.0 IEEE 128-bit floating point",
14905            name);
14906   else if ((fnmask & RS6000_BTM_FLOAT128) != 0)
14907     error ("builtin function %qs requires the %qs option", name,
14908            "%<-mfloat128%>");
14909   else if ((fnmask & (RS6000_BTM_POPCNTD | RS6000_BTM_POWERPC64))
14910            == (RS6000_BTM_POPCNTD | RS6000_BTM_POWERPC64))
14911     error ("builtin function %qs requires the %qs (or newer), and "
14912            "%qs or %qs options",
14913            name, "-mcpu=power7", "-m64", "-mpowerpc64");
14914   else
14915     error ("builtin function %qs is not supported with the current options",
14916            name);
14917 }
14918
14919 /* Target hook for early folding of built-ins, shamelessly stolen
14920    from ia64.c.  */
14921
14922 static tree
14923 rs6000_fold_builtin (tree fndecl ATTRIBUTE_UNUSED,
14924                      int n_args ATTRIBUTE_UNUSED,
14925                      tree *args ATTRIBUTE_UNUSED,
14926                      bool ignore ATTRIBUTE_UNUSED)
14927 {
14928 #ifdef SUBTARGET_FOLD_BUILTIN
14929   return SUBTARGET_FOLD_BUILTIN (fndecl, n_args, args, ignore);
14930 #else
14931   return NULL_TREE;
14932 #endif
14933 }
14934
14935 /*  Helper function to sort out which built-ins may be valid without having
14936     a LHS.  */
14937 static bool
14938 rs6000_builtin_valid_without_lhs (enum rs6000_builtins fn_code)
14939 {
14940   switch (fn_code)
14941     {
14942     case ALTIVEC_BUILTIN_STVX_V16QI:
14943     case ALTIVEC_BUILTIN_STVX_V8HI:
14944     case ALTIVEC_BUILTIN_STVX_V4SI:
14945     case ALTIVEC_BUILTIN_STVX_V4SF:
14946     case ALTIVEC_BUILTIN_STVX_V2DI:
14947     case ALTIVEC_BUILTIN_STVX_V2DF:
14948     case VSX_BUILTIN_STXVW4X_V16QI:
14949     case VSX_BUILTIN_STXVW4X_V8HI:
14950     case VSX_BUILTIN_STXVW4X_V4SF:
14951     case VSX_BUILTIN_STXVW4X_V4SI:
14952     case VSX_BUILTIN_STXVD2X_V2DF:
14953     case VSX_BUILTIN_STXVD2X_V2DI:
14954       return true;
14955     default:
14956       return false;
14957     }
14958 }
14959
14960 /* Helper function to handle the gimple folding of a vector compare
14961    operation.  This sets up true/false vectors, and uses the
14962    VEC_COND_EXPR operation.
14963    CODE indicates which comparison is to be made. (EQ, GT, ...).
14964    TYPE indicates the type of the result.  */
14965 static tree
14966 fold_build_vec_cmp (tree_code code, tree type,
14967                     tree arg0, tree arg1)
14968 {
14969   tree cmp_type = build_same_sized_truth_vector_type (type);
14970   tree zero_vec = build_zero_cst (type);
14971   tree minus_one_vec = build_minus_one_cst (type);
14972   tree cmp = fold_build2 (code, cmp_type, arg0, arg1);
14973   return fold_build3 (VEC_COND_EXPR, type, cmp, minus_one_vec, zero_vec);
14974 }
14975
14976 /* Helper function to handle the in-between steps for the
14977    vector compare built-ins.  */
14978 static void
14979 fold_compare_helper (gimple_stmt_iterator *gsi, tree_code code, gimple *stmt)
14980 {
14981   tree arg0 = gimple_call_arg (stmt, 0);
14982   tree arg1 = gimple_call_arg (stmt, 1);
14983   tree lhs = gimple_call_lhs (stmt);
14984   tree cmp = fold_build_vec_cmp (code, TREE_TYPE (lhs), arg0, arg1);
14985   gimple *g = gimple_build_assign (lhs, cmp);
14986   gimple_set_location (g, gimple_location (stmt));
14987   gsi_replace (gsi, g, true);
14988 }
14989
14990 /* Helper function to map V2DF and V4SF types to their
14991  integral equivalents (V2DI and V4SI).  */
14992 tree map_to_integral_tree_type (tree input_tree_type)
14993 {
14994   if (INTEGRAL_TYPE_P (TREE_TYPE (input_tree_type)))
14995     return input_tree_type;
14996   else
14997     {
14998       if (types_compatible_p (TREE_TYPE (input_tree_type),
14999                               TREE_TYPE (V2DF_type_node)))
15000         return V2DI_type_node;
15001       else if (types_compatible_p (TREE_TYPE (input_tree_type),
15002                                    TREE_TYPE (V4SF_type_node)))
15003         return V4SI_type_node;
15004       else
15005         gcc_unreachable ();
15006     }
15007 }
15008
15009 /* Helper function to handle the vector merge[hl] built-ins.  The
15010    implementation difference between h and l versions for this code are in
15011    the values used when building of the permute vector for high word versus
15012    low word merge.  The variance is keyed off the use_high parameter.  */
15013 static void
15014 fold_mergehl_helper (gimple_stmt_iterator *gsi, gimple *stmt, int use_high)
15015 {
15016   tree arg0 = gimple_call_arg (stmt, 0);
15017   tree arg1 = gimple_call_arg (stmt, 1);
15018   tree lhs = gimple_call_lhs (stmt);
15019   tree lhs_type = TREE_TYPE (lhs);
15020   int n_elts = TYPE_VECTOR_SUBPARTS (lhs_type);
15021   int midpoint = n_elts / 2;
15022   int offset = 0;
15023
15024   if (use_high == 1)
15025     offset = midpoint;
15026
15027   /* The permute_type will match the lhs for integral types.  For double and
15028      float types, the permute type needs to map to the V2 or V4 type that
15029      matches size.  */
15030   tree permute_type;
15031   permute_type = map_to_integral_tree_type (lhs_type);
15032   tree_vector_builder elts (permute_type, VECTOR_CST_NELTS (arg0), 1);
15033
15034   for (int i = 0; i < midpoint; i++)
15035     {
15036       elts.safe_push (build_int_cst (TREE_TYPE (permute_type),
15037                                      offset + i));
15038       elts.safe_push (build_int_cst (TREE_TYPE (permute_type),
15039                                      offset + n_elts + i));
15040     }
15041
15042   tree permute = elts.build ();
15043
15044   gimple *g = gimple_build_assign (lhs, VEC_PERM_EXPR, arg0, arg1, permute);
15045   gimple_set_location (g, gimple_location (stmt));
15046   gsi_replace (gsi, g, true);
15047 }
15048
15049 /* Helper function to handle the vector merge[eo] built-ins.  */
15050 static void
15051 fold_mergeeo_helper (gimple_stmt_iterator *gsi, gimple *stmt, int use_odd)
15052 {
15053   tree arg0 = gimple_call_arg (stmt, 0);
15054   tree arg1 = gimple_call_arg (stmt, 1);
15055   tree lhs = gimple_call_lhs (stmt);
15056   tree lhs_type = TREE_TYPE (lhs);
15057   int n_elts = TYPE_VECTOR_SUBPARTS (lhs_type);
15058
15059   /* The permute_type will match the lhs for integral types.  For double and
15060      float types, the permute type needs to map to the V2 or V4 type that
15061      matches size.  */
15062   tree permute_type;
15063   permute_type = map_to_integral_tree_type (lhs_type);
15064
15065   tree_vector_builder elts (permute_type, VECTOR_CST_NELTS (arg0), 1);
15066
15067  /* Build the permute vector.  */
15068   for (int i = 0; i < n_elts / 2; i++)
15069     {
15070       elts.safe_push (build_int_cst (TREE_TYPE (permute_type),
15071                                      2*i + use_odd));
15072       elts.safe_push (build_int_cst (TREE_TYPE (permute_type),
15073                                      2*i + use_odd + n_elts));
15074     }
15075
15076   tree permute = elts.build ();
15077
15078   gimple *g = gimple_build_assign (lhs, VEC_PERM_EXPR, arg0, arg1, permute);
15079   gimple_set_location (g, gimple_location (stmt));
15080   gsi_replace (gsi, g, true);
15081 }
15082
15083 /* Fold a machine-dependent built-in in GIMPLE.  (For folding into
15084    a constant, use rs6000_fold_builtin.)  */
15085
15086 bool
15087 rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi)
15088 {
15089   gimple *stmt = gsi_stmt (*gsi);
15090   tree fndecl = gimple_call_fndecl (stmt);
15091   gcc_checking_assert (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD);
15092   enum rs6000_builtins fn_code
15093     = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
15094   tree arg0, arg1, lhs, temp;
15095   enum tree_code bcode;
15096   gimple *g;
15097
15098   size_t uns_fncode = (size_t) fn_code;
15099   enum insn_code icode = rs6000_builtin_info[uns_fncode].icode;
15100   const char *fn_name1 = rs6000_builtin_info[uns_fncode].name;
15101   const char *fn_name2 = (icode != CODE_FOR_nothing)
15102                           ? get_insn_name ((int) icode)
15103                           : "nothing";
15104
15105   if (TARGET_DEBUG_BUILTIN)
15106       fprintf (stderr, "rs6000_gimple_fold_builtin %d %s %s\n",
15107                fn_code, fn_name1, fn_name2);
15108
15109   if (!rs6000_fold_gimple)
15110     return false;
15111
15112   /* Prevent gimple folding for code that does not have a LHS, unless it is
15113      allowed per the rs6000_builtin_valid_without_lhs helper function.  */
15114   if (!gimple_call_lhs (stmt) && !rs6000_builtin_valid_without_lhs (fn_code))
15115     return false;
15116
15117   /* Don't fold invalid builtins, let rs6000_expand_builtin diagnose it.  */
15118   HOST_WIDE_INT mask = rs6000_builtin_info[uns_fncode].mask;
15119   bool func_valid_p = (rs6000_builtin_mask & mask) == mask;
15120   if (!func_valid_p)
15121     return false;
15122
15123   switch (fn_code)
15124     {
15125     /* Flavors of vec_add.  We deliberately don't expand
15126        P8V_BUILTIN_VADDUQM as it gets lowered from V1TImode to
15127        TImode, resulting in much poorer code generation.  */
15128     case ALTIVEC_BUILTIN_VADDUBM:
15129     case ALTIVEC_BUILTIN_VADDUHM:
15130     case ALTIVEC_BUILTIN_VADDUWM:
15131     case P8V_BUILTIN_VADDUDM:
15132     case ALTIVEC_BUILTIN_VADDFP:
15133     case VSX_BUILTIN_XVADDDP:
15134       bcode = PLUS_EXPR;
15135     do_binary:
15136       arg0 = gimple_call_arg (stmt, 0);
15137       arg1 = gimple_call_arg (stmt, 1);
15138       lhs = gimple_call_lhs (stmt);
15139       if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (lhs)))
15140           && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (TREE_TYPE (lhs))))
15141         {
15142           /* Ensure the binary operation is performed in a type
15143              that wraps if it is integral type.  */
15144           gimple_seq stmts = NULL;
15145           tree type = unsigned_type_for (TREE_TYPE (lhs));
15146           tree uarg0 = gimple_build (&stmts, VIEW_CONVERT_EXPR,
15147                                      type, arg0);
15148           tree uarg1 = gimple_build (&stmts, VIEW_CONVERT_EXPR,
15149                                      type, arg1);
15150           tree res = gimple_build (&stmts, gimple_location (stmt), bcode,
15151                                    type, uarg0, uarg1);
15152           gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15153           g = gimple_build_assign (lhs, VIEW_CONVERT_EXPR,
15154                                    build1 (VIEW_CONVERT_EXPR,
15155                                            TREE_TYPE (lhs), res));
15156           gsi_replace (gsi, g, true);
15157           return true;
15158         }
15159       g = gimple_build_assign (lhs, bcode, arg0, arg1);
15160       gimple_set_location (g, gimple_location (stmt));
15161       gsi_replace (gsi, g, true);
15162       return true;
15163     /* Flavors of vec_sub.  We deliberately don't expand
15164        P8V_BUILTIN_VSUBUQM. */
15165     case ALTIVEC_BUILTIN_VSUBUBM:
15166     case ALTIVEC_BUILTIN_VSUBUHM:
15167     case ALTIVEC_BUILTIN_VSUBUWM:
15168     case P8V_BUILTIN_VSUBUDM:
15169     case ALTIVEC_BUILTIN_VSUBFP:
15170     case VSX_BUILTIN_XVSUBDP:
15171       bcode = MINUS_EXPR;
15172       goto do_binary;
15173     case VSX_BUILTIN_XVMULSP:
15174     case VSX_BUILTIN_XVMULDP:
15175       arg0 = gimple_call_arg (stmt, 0);
15176       arg1 = gimple_call_arg (stmt, 1);
15177       lhs = gimple_call_lhs (stmt);
15178       g = gimple_build_assign (lhs, MULT_EXPR, arg0, arg1);
15179       gimple_set_location (g, gimple_location (stmt));
15180       gsi_replace (gsi, g, true);
15181       return true;
15182     /* Even element flavors of vec_mul (signed). */
15183     case ALTIVEC_BUILTIN_VMULESB:
15184     case ALTIVEC_BUILTIN_VMULESH:
15185     case P8V_BUILTIN_VMULESW:
15186     /* Even element flavors of vec_mul (unsigned).  */
15187     case ALTIVEC_BUILTIN_VMULEUB:
15188     case ALTIVEC_BUILTIN_VMULEUH:
15189     case P8V_BUILTIN_VMULEUW:
15190       arg0 = gimple_call_arg (stmt, 0);
15191       arg1 = gimple_call_arg (stmt, 1);
15192       lhs = gimple_call_lhs (stmt);
15193       g = gimple_build_assign (lhs, VEC_WIDEN_MULT_EVEN_EXPR, arg0, arg1);
15194       gimple_set_location (g, gimple_location (stmt));
15195       gsi_replace (gsi, g, true);
15196       return true;
15197     /* Odd element flavors of vec_mul (signed).  */
15198     case ALTIVEC_BUILTIN_VMULOSB:
15199     case ALTIVEC_BUILTIN_VMULOSH:
15200     case P8V_BUILTIN_VMULOSW:
15201     /* Odd element flavors of vec_mul (unsigned). */
15202     case ALTIVEC_BUILTIN_VMULOUB:
15203     case ALTIVEC_BUILTIN_VMULOUH:
15204     case P8V_BUILTIN_VMULOUW:
15205       arg0 = gimple_call_arg (stmt, 0);
15206       arg1 = gimple_call_arg (stmt, 1);
15207       lhs = gimple_call_lhs (stmt);
15208       g = gimple_build_assign (lhs, VEC_WIDEN_MULT_ODD_EXPR, arg0, arg1);
15209       gimple_set_location (g, gimple_location (stmt));
15210       gsi_replace (gsi, g, true);
15211       return true;
15212     /* Flavors of vec_div (Integer).  */
15213     case VSX_BUILTIN_DIV_V2DI:
15214     case VSX_BUILTIN_UDIV_V2DI:
15215       arg0 = gimple_call_arg (stmt, 0);
15216       arg1 = gimple_call_arg (stmt, 1);
15217       lhs = gimple_call_lhs (stmt);
15218       g = gimple_build_assign (lhs, TRUNC_DIV_EXPR, arg0, arg1);
15219       gimple_set_location (g, gimple_location (stmt));
15220       gsi_replace (gsi, g, true);
15221       return true;
15222     /* Flavors of vec_div (Float).  */
15223     case VSX_BUILTIN_XVDIVSP:
15224     case VSX_BUILTIN_XVDIVDP:
15225       arg0 = gimple_call_arg (stmt, 0);
15226       arg1 = gimple_call_arg (stmt, 1);
15227       lhs = gimple_call_lhs (stmt);
15228       g = gimple_build_assign (lhs, RDIV_EXPR, arg0, arg1);
15229       gimple_set_location (g, gimple_location (stmt));
15230       gsi_replace (gsi, g, true);
15231       return true;
15232     /* Flavors of vec_and.  */
15233     case ALTIVEC_BUILTIN_VAND:
15234       arg0 = gimple_call_arg (stmt, 0);
15235       arg1 = gimple_call_arg (stmt, 1);
15236       lhs = gimple_call_lhs (stmt);
15237       g = gimple_build_assign (lhs, BIT_AND_EXPR, arg0, arg1);
15238       gimple_set_location (g, gimple_location (stmt));
15239       gsi_replace (gsi, g, true);
15240       return true;
15241     /* Flavors of vec_andc.  */
15242     case ALTIVEC_BUILTIN_VANDC:
15243       arg0 = gimple_call_arg (stmt, 0);
15244       arg1 = gimple_call_arg (stmt, 1);
15245       lhs = gimple_call_lhs (stmt);
15246       temp = create_tmp_reg_or_ssa_name (TREE_TYPE (arg1));
15247       g = gimple_build_assign (temp, BIT_NOT_EXPR, arg1);
15248       gimple_set_location (g, gimple_location (stmt));
15249       gsi_insert_before (gsi, g, GSI_SAME_STMT);
15250       g = gimple_build_assign (lhs, BIT_AND_EXPR, arg0, temp);
15251       gimple_set_location (g, gimple_location (stmt));
15252       gsi_replace (gsi, g, true);
15253       return true;
15254     /* Flavors of vec_nand.  */
15255     case P8V_BUILTIN_VEC_NAND:
15256     case P8V_BUILTIN_NAND_V16QI:
15257     case P8V_BUILTIN_NAND_V8HI:
15258     case P8V_BUILTIN_NAND_V4SI:
15259     case P8V_BUILTIN_NAND_V4SF:
15260     case P8V_BUILTIN_NAND_V2DF:
15261     case P8V_BUILTIN_NAND_V2DI:
15262       arg0 = gimple_call_arg (stmt, 0);
15263       arg1 = gimple_call_arg (stmt, 1);
15264       lhs = gimple_call_lhs (stmt);
15265       temp = create_tmp_reg_or_ssa_name (TREE_TYPE (arg1));
15266       g = gimple_build_assign (temp, BIT_AND_EXPR, arg0, arg1);
15267       gimple_set_location (g, gimple_location (stmt));
15268       gsi_insert_before (gsi, g, GSI_SAME_STMT);
15269       g = gimple_build_assign (lhs, BIT_NOT_EXPR, temp);
15270       gimple_set_location (g, gimple_location (stmt));
15271       gsi_replace (gsi, g, true);
15272       return true;
15273     /* Flavors of vec_or.  */
15274     case ALTIVEC_BUILTIN_VOR:
15275       arg0 = gimple_call_arg (stmt, 0);
15276       arg1 = gimple_call_arg (stmt, 1);
15277       lhs = gimple_call_lhs (stmt);
15278       g = gimple_build_assign (lhs, BIT_IOR_EXPR, arg0, arg1);
15279       gimple_set_location (g, gimple_location (stmt));
15280       gsi_replace (gsi, g, true);
15281       return true;
15282     /* flavors of vec_orc.  */
15283     case P8V_BUILTIN_ORC_V16QI:
15284     case P8V_BUILTIN_ORC_V8HI:
15285     case P8V_BUILTIN_ORC_V4SI:
15286     case P8V_BUILTIN_ORC_V4SF:
15287     case P8V_BUILTIN_ORC_V2DF:
15288     case P8V_BUILTIN_ORC_V2DI:
15289       arg0 = gimple_call_arg (stmt, 0);
15290       arg1 = gimple_call_arg (stmt, 1);
15291       lhs = gimple_call_lhs (stmt);
15292       temp = create_tmp_reg_or_ssa_name (TREE_TYPE (arg1));
15293       g = gimple_build_assign (temp, BIT_NOT_EXPR, arg1);
15294       gimple_set_location (g, gimple_location (stmt));
15295       gsi_insert_before (gsi, g, GSI_SAME_STMT);
15296       g = gimple_build_assign (lhs, BIT_IOR_EXPR, arg0, temp);
15297       gimple_set_location (g, gimple_location (stmt));
15298       gsi_replace (gsi, g, true);
15299       return true;
15300     /* Flavors of vec_xor.  */
15301     case ALTIVEC_BUILTIN_VXOR:
15302       arg0 = gimple_call_arg (stmt, 0);
15303       arg1 = gimple_call_arg (stmt, 1);
15304       lhs = gimple_call_lhs (stmt);
15305       g = gimple_build_assign (lhs, BIT_XOR_EXPR, arg0, arg1);
15306       gimple_set_location (g, gimple_location (stmt));
15307       gsi_replace (gsi, g, true);
15308       return true;
15309     /* Flavors of vec_nor.  */
15310     case ALTIVEC_BUILTIN_VNOR:
15311       arg0 = gimple_call_arg (stmt, 0);
15312       arg1 = gimple_call_arg (stmt, 1);
15313       lhs = gimple_call_lhs (stmt);
15314       temp = create_tmp_reg_or_ssa_name (TREE_TYPE (arg1));
15315       g = gimple_build_assign (temp, BIT_IOR_EXPR, arg0, arg1);
15316       gimple_set_location (g, gimple_location (stmt));
15317       gsi_insert_before (gsi, g, GSI_SAME_STMT);
15318       g = gimple_build_assign (lhs, BIT_NOT_EXPR, temp);
15319       gimple_set_location (g, gimple_location (stmt));
15320       gsi_replace (gsi, g, true);
15321       return true;
15322     /* flavors of vec_abs.  */
15323     case ALTIVEC_BUILTIN_ABS_V16QI:
15324     case ALTIVEC_BUILTIN_ABS_V8HI:
15325     case ALTIVEC_BUILTIN_ABS_V4SI:
15326     case ALTIVEC_BUILTIN_ABS_V4SF:
15327     case P8V_BUILTIN_ABS_V2DI:
15328     case VSX_BUILTIN_XVABSDP:
15329       arg0 = gimple_call_arg (stmt, 0);
15330       if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (arg0)))
15331           && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (TREE_TYPE (arg0))))
15332         return false;
15333       lhs = gimple_call_lhs (stmt);
15334       g = gimple_build_assign (lhs, ABS_EXPR, arg0);
15335       gimple_set_location (g, gimple_location (stmt));
15336       gsi_replace (gsi, g, true);
15337       return true;
15338     /* flavors of vec_min.  */
15339     case VSX_BUILTIN_XVMINDP:
15340     case P8V_BUILTIN_VMINSD:
15341     case P8V_BUILTIN_VMINUD:
15342     case ALTIVEC_BUILTIN_VMINSB:
15343     case ALTIVEC_BUILTIN_VMINSH:
15344     case ALTIVEC_BUILTIN_VMINSW:
15345     case ALTIVEC_BUILTIN_VMINUB:
15346     case ALTIVEC_BUILTIN_VMINUH:
15347     case ALTIVEC_BUILTIN_VMINUW:
15348     case ALTIVEC_BUILTIN_VMINFP:
15349       arg0 = gimple_call_arg (stmt, 0);
15350       arg1 = gimple_call_arg (stmt, 1);
15351       lhs = gimple_call_lhs (stmt);
15352       g = gimple_build_assign (lhs, MIN_EXPR, arg0, arg1);
15353       gimple_set_location (g, gimple_location (stmt));
15354       gsi_replace (gsi, g, true);
15355       return true;
15356     /* flavors of vec_max.  */
15357     case VSX_BUILTIN_XVMAXDP:
15358     case P8V_BUILTIN_VMAXSD:
15359     case P8V_BUILTIN_VMAXUD:
15360     case ALTIVEC_BUILTIN_VMAXSB:
15361     case ALTIVEC_BUILTIN_VMAXSH:
15362     case ALTIVEC_BUILTIN_VMAXSW:
15363     case ALTIVEC_BUILTIN_VMAXUB:
15364     case ALTIVEC_BUILTIN_VMAXUH:
15365     case ALTIVEC_BUILTIN_VMAXUW:
15366     case ALTIVEC_BUILTIN_VMAXFP:
15367       arg0 = gimple_call_arg (stmt, 0);
15368       arg1 = gimple_call_arg (stmt, 1);
15369       lhs = gimple_call_lhs (stmt);
15370       g = gimple_build_assign (lhs, MAX_EXPR, arg0, arg1);
15371       gimple_set_location (g, gimple_location (stmt));
15372       gsi_replace (gsi, g, true);
15373       return true;
15374     /* Flavors of vec_eqv.  */
15375     case P8V_BUILTIN_EQV_V16QI:
15376     case P8V_BUILTIN_EQV_V8HI:
15377     case P8V_BUILTIN_EQV_V4SI:
15378     case P8V_BUILTIN_EQV_V4SF:
15379     case P8V_BUILTIN_EQV_V2DF:
15380     case P8V_BUILTIN_EQV_V2DI:
15381       arg0 = gimple_call_arg (stmt, 0);
15382       arg1 = gimple_call_arg (stmt, 1);
15383       lhs = gimple_call_lhs (stmt);
15384       temp = create_tmp_reg_or_ssa_name (TREE_TYPE (arg1));
15385       g = gimple_build_assign (temp, BIT_XOR_EXPR, arg0, arg1);
15386       gimple_set_location (g, gimple_location (stmt));
15387       gsi_insert_before (gsi, g, GSI_SAME_STMT);
15388       g = gimple_build_assign (lhs, BIT_NOT_EXPR, temp);
15389       gimple_set_location (g, gimple_location (stmt));
15390       gsi_replace (gsi, g, true);
15391       return true;
15392     /* Flavors of vec_rotate_left.  */
15393     case ALTIVEC_BUILTIN_VRLB:
15394     case ALTIVEC_BUILTIN_VRLH:
15395     case ALTIVEC_BUILTIN_VRLW:
15396     case P8V_BUILTIN_VRLD:
15397       arg0 = gimple_call_arg (stmt, 0);
15398       arg1 = gimple_call_arg (stmt, 1);
15399       lhs = gimple_call_lhs (stmt);
15400       g = gimple_build_assign (lhs, LROTATE_EXPR, arg0, arg1);
15401       gimple_set_location (g, gimple_location (stmt));
15402       gsi_replace (gsi, g, true);
15403       return true;
15404   /* Flavors of vector shift right algebraic.
15405      vec_sra{b,h,w} -> vsra{b,h,w}.  */
15406     case ALTIVEC_BUILTIN_VSRAB:
15407     case ALTIVEC_BUILTIN_VSRAH:
15408     case ALTIVEC_BUILTIN_VSRAW:
15409     case P8V_BUILTIN_VSRAD:
15410       {
15411         arg0 = gimple_call_arg (stmt, 0);
15412         arg1 = gimple_call_arg (stmt, 1);
15413         lhs = gimple_call_lhs (stmt);
15414         tree arg1_type = TREE_TYPE (arg1);
15415         tree unsigned_arg1_type = unsigned_type_for (TREE_TYPE (arg1));
15416         tree unsigned_element_type = unsigned_type_for (TREE_TYPE (arg1_type));
15417         location_t loc = gimple_location (stmt);
15418         /* Force arg1 into the range valid matching the arg0 type.  */
15419         /* Build a vector consisting of the max valid bit-size values.  */
15420         int n_elts = VECTOR_CST_NELTS (arg1);
15421         tree element_size = build_int_cst (unsigned_element_type,
15422                                            128 / n_elts);
15423         tree_vector_builder elts (unsigned_arg1_type, n_elts, 1);
15424         for (int i = 0; i < n_elts; i++)
15425           elts.safe_push (element_size);
15426         tree modulo_tree = elts.build ();
15427         /* Modulo the provided shift value against that vector.  */
15428         gimple_seq stmts = NULL;
15429         tree unsigned_arg1 = gimple_build (&stmts, VIEW_CONVERT_EXPR,
15430                                            unsigned_arg1_type, arg1);
15431         tree new_arg1 = gimple_build (&stmts, loc, TRUNC_MOD_EXPR,
15432                                       unsigned_arg1_type, unsigned_arg1,
15433                                       modulo_tree);
15434         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15435         /* And finally, do the shift.  */
15436         g = gimple_build_assign (lhs, RSHIFT_EXPR, arg0, new_arg1);
15437         gimple_set_location (g, loc);
15438         gsi_replace (gsi, g, true);
15439         return true;
15440       }
15441    /* Flavors of vector shift left.
15442       builtin_altivec_vsl{b,h,w} -> vsl{b,h,w}.  */
15443     case ALTIVEC_BUILTIN_VSLB:
15444     case ALTIVEC_BUILTIN_VSLH:
15445     case ALTIVEC_BUILTIN_VSLW:
15446     case P8V_BUILTIN_VSLD:
15447       {
15448         location_t loc;
15449         gimple_seq stmts = NULL;
15450         arg0 = gimple_call_arg (stmt, 0);
15451         tree arg0_type = TREE_TYPE (arg0);
15452         if (INTEGRAL_TYPE_P (TREE_TYPE (arg0_type))
15453             && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0_type)))
15454           return false;
15455         arg1 = gimple_call_arg (stmt, 1);
15456         tree arg1_type = TREE_TYPE (arg1);
15457         tree unsigned_arg1_type = unsigned_type_for (TREE_TYPE (arg1));
15458         tree unsigned_element_type = unsigned_type_for (TREE_TYPE (arg1_type));
15459         loc = gimple_location (stmt);
15460         lhs = gimple_call_lhs (stmt);
15461         /* Force arg1 into the range valid matching the arg0 type.  */
15462         /* Build a vector consisting of the max valid bit-size values.  */
15463         int n_elts = VECTOR_CST_NELTS (arg1);
15464         int tree_size_in_bits = TREE_INT_CST_LOW (size_in_bytes (arg1_type))
15465                                 * BITS_PER_UNIT;
15466         tree element_size = build_int_cst (unsigned_element_type,
15467                                            tree_size_in_bits / n_elts);
15468         tree_vector_builder elts (unsigned_type_for (arg1_type), n_elts, 1);
15469         for (int i = 0; i < n_elts; i++)
15470           elts.safe_push (element_size);
15471         tree modulo_tree = elts.build ();
15472         /* Modulo the provided shift value against that vector.  */
15473         tree unsigned_arg1 = gimple_build (&stmts, VIEW_CONVERT_EXPR,
15474                                            unsigned_arg1_type, arg1);
15475         tree new_arg1 = gimple_build (&stmts, loc, TRUNC_MOD_EXPR,
15476                                       unsigned_arg1_type, unsigned_arg1,
15477                                       modulo_tree);
15478         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15479         /* And finally, do the shift.  */
15480         g = gimple_build_assign (lhs, LSHIFT_EXPR, arg0, new_arg1);
15481         gimple_set_location (g, gimple_location (stmt));
15482         gsi_replace (gsi, g, true);
15483         return true;
15484       }
15485     /* Flavors of vector shift right.  */
15486     case ALTIVEC_BUILTIN_VSRB:
15487     case ALTIVEC_BUILTIN_VSRH:
15488     case ALTIVEC_BUILTIN_VSRW:
15489     case P8V_BUILTIN_VSRD:
15490       {
15491         arg0 = gimple_call_arg (stmt, 0);
15492         arg1 = gimple_call_arg (stmt, 1);
15493         lhs = gimple_call_lhs (stmt);
15494         tree arg1_type = TREE_TYPE (arg1);
15495         tree unsigned_arg1_type = unsigned_type_for (TREE_TYPE (arg1));
15496         tree unsigned_element_type = unsigned_type_for (TREE_TYPE (arg1_type));
15497         location_t loc = gimple_location (stmt);
15498         gimple_seq stmts = NULL;
15499         /* Convert arg0 to unsigned.  */
15500         tree arg0_unsigned
15501           = gimple_build (&stmts, VIEW_CONVERT_EXPR,
15502                           unsigned_type_for (TREE_TYPE (arg0)), arg0);
15503         /* Force arg1 into the range valid matching the arg0 type.  */
15504         /* Build a vector consisting of the max valid bit-size values.  */
15505         int n_elts = VECTOR_CST_NELTS (arg1);
15506         tree element_size = build_int_cst (unsigned_element_type,
15507                                            128 / n_elts);
15508         tree_vector_builder elts (unsigned_arg1_type, n_elts, 1);
15509         for (int i = 0; i < n_elts; i++)
15510           elts.safe_push (element_size);
15511         tree modulo_tree = elts.build ();
15512         /* Modulo the provided shift value against that vector.  */
15513         tree unsigned_arg1 = gimple_build (&stmts, VIEW_CONVERT_EXPR,
15514                                            unsigned_arg1_type, arg1);
15515         tree new_arg1 = gimple_build (&stmts, loc, TRUNC_MOD_EXPR,
15516                                       unsigned_arg1_type, unsigned_arg1,
15517                                       modulo_tree);
15518         /* Do the shift.  */
15519         tree res
15520           = gimple_build (&stmts, RSHIFT_EXPR,
15521                           TREE_TYPE (arg0_unsigned), arg0_unsigned, new_arg1);
15522         /* Convert result back to the lhs type.  */
15523         res = gimple_build (&stmts, VIEW_CONVERT_EXPR, TREE_TYPE (lhs), res);
15524         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15525         update_call_from_tree (gsi, res);
15526         return true;
15527       }
15528     /* Vector loads.  */
15529     case ALTIVEC_BUILTIN_LVX_V16QI:
15530     case ALTIVEC_BUILTIN_LVX_V8HI:
15531     case ALTIVEC_BUILTIN_LVX_V4SI:
15532     case ALTIVEC_BUILTIN_LVX_V4SF:
15533     case ALTIVEC_BUILTIN_LVX_V2DI:
15534     case ALTIVEC_BUILTIN_LVX_V2DF:
15535     case ALTIVEC_BUILTIN_LVX_V1TI:
15536       {
15537         arg0 = gimple_call_arg (stmt, 0);  // offset
15538         arg1 = gimple_call_arg (stmt, 1);  // address
15539         lhs = gimple_call_lhs (stmt);
15540         location_t loc = gimple_location (stmt);
15541         /* Since arg1 may be cast to a different type, just use ptr_type_node
15542            here instead of trying to enforce TBAA on pointer types.  */
15543         tree arg1_type = ptr_type_node;
15544         tree lhs_type = TREE_TYPE (lhs);
15545         /* POINTER_PLUS_EXPR wants the offset to be of type 'sizetype'.  Create
15546            the tree using the value from arg0.  The resulting type will match
15547            the type of arg1.  */
15548         gimple_seq stmts = NULL;
15549         tree temp_offset = gimple_convert (&stmts, loc, sizetype, arg0);
15550         tree temp_addr = gimple_build (&stmts, loc, POINTER_PLUS_EXPR,
15551                                        arg1_type, arg1, temp_offset);
15552         /* Mask off any lower bits from the address.  */
15553         tree aligned_addr = gimple_build (&stmts, loc, BIT_AND_EXPR,
15554                                           arg1_type, temp_addr,
15555                                           build_int_cst (arg1_type, -16));
15556         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15557         if (!is_gimple_mem_ref_addr (aligned_addr))
15558           {
15559             tree t = make_ssa_name (TREE_TYPE (aligned_addr));
15560             gimple *g = gimple_build_assign (t, aligned_addr);
15561             gsi_insert_before (gsi, g, GSI_SAME_STMT);
15562             aligned_addr = t;
15563           }
15564         /* Use the build2 helper to set up the mem_ref.  The MEM_REF could also
15565            take an offset, but since we've already incorporated the offset
15566            above, here we just pass in a zero.  */
15567         gimple *g
15568           = gimple_build_assign (lhs, build2 (MEM_REF, lhs_type, aligned_addr,
15569                                               build_int_cst (arg1_type, 0)));
15570         gimple_set_location (g, loc);
15571         gsi_replace (gsi, g, true);
15572         return true;
15573       }
15574     /* Vector stores.  */
15575     case ALTIVEC_BUILTIN_STVX_V16QI:
15576     case ALTIVEC_BUILTIN_STVX_V8HI:
15577     case ALTIVEC_BUILTIN_STVX_V4SI:
15578     case ALTIVEC_BUILTIN_STVX_V4SF:
15579     case ALTIVEC_BUILTIN_STVX_V2DI:
15580     case ALTIVEC_BUILTIN_STVX_V2DF:
15581       {
15582         arg0 = gimple_call_arg (stmt, 0); /* Value to be stored.  */
15583         arg1 = gimple_call_arg (stmt, 1); /* Offset.  */
15584         tree arg2 = gimple_call_arg (stmt, 2); /* Store-to address.  */
15585         location_t loc = gimple_location (stmt);
15586         tree arg0_type = TREE_TYPE (arg0);
15587         /* Use ptr_type_node (no TBAA) for the arg2_type.
15588            FIXME: (Richard)  "A proper fix would be to transition this type as
15589            seen from the frontend to GIMPLE, for example in a similar way we
15590            do for MEM_REFs by piggy-backing that on an extra argument, a
15591            constant zero pointer of the alias pointer type to use (which would
15592            also serve as a type indicator of the store itself).  I'd use a
15593            target specific internal function for this (not sure if we can have
15594            those target specific, but I guess if it's folded away then that's
15595            fine) and get away with the overload set."  */
15596         tree arg2_type = ptr_type_node;
15597         /* POINTER_PLUS_EXPR wants the offset to be of type 'sizetype'.  Create
15598            the tree using the value from arg0.  The resulting type will match
15599            the type of arg2.  */
15600         gimple_seq stmts = NULL;
15601         tree temp_offset = gimple_convert (&stmts, loc, sizetype, arg1);
15602         tree temp_addr = gimple_build (&stmts, loc, POINTER_PLUS_EXPR,
15603                                        arg2_type, arg2, temp_offset);
15604         /* Mask off any lower bits from the address.  */
15605         tree aligned_addr = gimple_build (&stmts, loc, BIT_AND_EXPR,
15606                                           arg2_type, temp_addr,
15607                                           build_int_cst (arg2_type, -16));
15608         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15609         if (!is_gimple_mem_ref_addr (aligned_addr))
15610           {
15611             tree t = make_ssa_name (TREE_TYPE (aligned_addr));
15612             gimple *g = gimple_build_assign (t, aligned_addr);
15613             gsi_insert_before (gsi, g, GSI_SAME_STMT);
15614             aligned_addr = t;
15615           }
15616         /* The desired gimple result should be similar to:
15617            MEM[(__vector floatD.1407 *)_1] = vf1D.2697;  */
15618         gimple *g
15619           = gimple_build_assign (build2 (MEM_REF, arg0_type, aligned_addr,
15620                                          build_int_cst (arg2_type, 0)), arg0);
15621         gimple_set_location (g, loc);
15622         gsi_replace (gsi, g, true);
15623         return true;
15624       }
15625
15626     /* unaligned Vector loads.  */
15627     case VSX_BUILTIN_LXVW4X_V16QI:
15628     case VSX_BUILTIN_LXVW4X_V8HI:
15629     case VSX_BUILTIN_LXVW4X_V4SF:
15630     case VSX_BUILTIN_LXVW4X_V4SI:
15631     case VSX_BUILTIN_LXVD2X_V2DF:
15632     case VSX_BUILTIN_LXVD2X_V2DI:
15633       {
15634         arg0 = gimple_call_arg (stmt, 0);  // offset
15635         arg1 = gimple_call_arg (stmt, 1);  // address
15636         lhs = gimple_call_lhs (stmt);
15637         location_t loc = gimple_location (stmt);
15638         /* Since arg1 may be cast to a different type, just use ptr_type_node
15639            here instead of trying to enforce TBAA on pointer types.  */
15640         tree arg1_type = ptr_type_node;
15641         tree lhs_type = TREE_TYPE (lhs);
15642         /* In GIMPLE the type of the MEM_REF specifies the alignment.  The
15643           required alignment (power) is 4 bytes regardless of data type.  */
15644         tree align_ltype = build_aligned_type (lhs_type, 4);
15645         /* POINTER_PLUS_EXPR wants the offset to be of type 'sizetype'.  Create
15646            the tree using the value from arg0.  The resulting type will match
15647            the type of arg1.  */
15648         gimple_seq stmts = NULL;
15649         tree temp_offset = gimple_convert (&stmts, loc, sizetype, arg0);
15650         tree temp_addr = gimple_build (&stmts, loc, POINTER_PLUS_EXPR,
15651                                        arg1_type, arg1, temp_offset);
15652         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15653         if (!is_gimple_mem_ref_addr (temp_addr))
15654           {
15655             tree t = make_ssa_name (TREE_TYPE (temp_addr));
15656             gimple *g = gimple_build_assign (t, temp_addr);
15657             gsi_insert_before (gsi, g, GSI_SAME_STMT);
15658             temp_addr = t;
15659           }
15660         /* Use the build2 helper to set up the mem_ref.  The MEM_REF could also
15661            take an offset, but since we've already incorporated the offset
15662            above, here we just pass in a zero.  */
15663         gimple *g;
15664         g = gimple_build_assign (lhs, build2 (MEM_REF, align_ltype, temp_addr,
15665                                               build_int_cst (arg1_type, 0)));
15666         gimple_set_location (g, loc);
15667         gsi_replace (gsi, g, true);
15668         return true;
15669       }
15670
15671     /* unaligned Vector stores.  */
15672     case VSX_BUILTIN_STXVW4X_V16QI:
15673     case VSX_BUILTIN_STXVW4X_V8HI:
15674     case VSX_BUILTIN_STXVW4X_V4SF:
15675     case VSX_BUILTIN_STXVW4X_V4SI:
15676     case VSX_BUILTIN_STXVD2X_V2DF:
15677     case VSX_BUILTIN_STXVD2X_V2DI:
15678       {
15679         arg0 = gimple_call_arg (stmt, 0); /* Value to be stored.  */
15680         arg1 = gimple_call_arg (stmt, 1); /* Offset.  */
15681         tree arg2 = gimple_call_arg (stmt, 2); /* Store-to address.  */
15682         location_t loc = gimple_location (stmt);
15683         tree arg0_type = TREE_TYPE (arg0);
15684         /* Use ptr_type_node (no TBAA) for the arg2_type.  */
15685         tree arg2_type = ptr_type_node;
15686         /* In GIMPLE the type of the MEM_REF specifies the alignment.  The
15687            required alignment (power) is 4 bytes regardless of data type.  */
15688         tree align_stype = build_aligned_type (arg0_type, 4);
15689         /* POINTER_PLUS_EXPR wants the offset to be of type 'sizetype'.  Create
15690            the tree using the value from arg1.  */
15691         gimple_seq stmts = NULL;
15692         tree temp_offset = gimple_convert (&stmts, loc, sizetype, arg1);
15693         tree temp_addr = gimple_build (&stmts, loc, POINTER_PLUS_EXPR,
15694                                        arg2_type, arg2, temp_offset);
15695         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15696         if (!is_gimple_mem_ref_addr (temp_addr))
15697           {
15698             tree t = make_ssa_name (TREE_TYPE (temp_addr));
15699             gimple *g = gimple_build_assign (t, temp_addr);
15700             gsi_insert_before (gsi, g, GSI_SAME_STMT);
15701             temp_addr = t;
15702           }
15703         gimple *g;
15704         g = gimple_build_assign (build2 (MEM_REF, align_stype, temp_addr,
15705                                          build_int_cst (arg2_type, 0)), arg0);
15706         gimple_set_location (g, loc);
15707         gsi_replace (gsi, g, true);
15708         return true;
15709       }
15710
15711     /* Vector Fused multiply-add (fma).  */
15712     case ALTIVEC_BUILTIN_VMADDFP:
15713     case VSX_BUILTIN_XVMADDDP:
15714     case ALTIVEC_BUILTIN_VMLADDUHM:
15715       {
15716         arg0 = gimple_call_arg (stmt, 0);
15717         arg1 = gimple_call_arg (stmt, 1);
15718         tree arg2 = gimple_call_arg (stmt, 2);
15719         lhs = gimple_call_lhs (stmt);
15720         gcall *g = gimple_build_call_internal (IFN_FMA, 3, arg0, arg1, arg2);
15721         gimple_call_set_lhs (g, lhs);
15722         gimple_call_set_nothrow (g, true);
15723         gimple_set_location (g, gimple_location (stmt));
15724         gsi_replace (gsi, g, true);
15725         return true;
15726       }
15727
15728     /* Vector compares; EQ, NE, GE, GT, LE.  */
15729     case ALTIVEC_BUILTIN_VCMPEQUB:
15730     case ALTIVEC_BUILTIN_VCMPEQUH:
15731     case ALTIVEC_BUILTIN_VCMPEQUW:
15732     case P8V_BUILTIN_VCMPEQUD:
15733       fold_compare_helper (gsi, EQ_EXPR, stmt);
15734       return true;
15735
15736     case P9V_BUILTIN_CMPNEB:
15737     case P9V_BUILTIN_CMPNEH:
15738     case P9V_BUILTIN_CMPNEW:
15739       fold_compare_helper (gsi, NE_EXPR, stmt);
15740       return true;
15741
15742     case VSX_BUILTIN_CMPGE_16QI:
15743     case VSX_BUILTIN_CMPGE_U16QI:
15744     case VSX_BUILTIN_CMPGE_8HI:
15745     case VSX_BUILTIN_CMPGE_U8HI:
15746     case VSX_BUILTIN_CMPGE_4SI:
15747     case VSX_BUILTIN_CMPGE_U4SI:
15748     case VSX_BUILTIN_CMPGE_2DI:
15749     case VSX_BUILTIN_CMPGE_U2DI:
15750       fold_compare_helper (gsi, GE_EXPR, stmt);
15751       return true;
15752
15753     case ALTIVEC_BUILTIN_VCMPGTSB:
15754     case ALTIVEC_BUILTIN_VCMPGTUB:
15755     case ALTIVEC_BUILTIN_VCMPGTSH:
15756     case ALTIVEC_BUILTIN_VCMPGTUH:
15757     case ALTIVEC_BUILTIN_VCMPGTSW:
15758     case ALTIVEC_BUILTIN_VCMPGTUW:
15759     case P8V_BUILTIN_VCMPGTUD:
15760     case P8V_BUILTIN_VCMPGTSD:
15761       fold_compare_helper (gsi, GT_EXPR, stmt);
15762       return true;
15763
15764     case VSX_BUILTIN_CMPLE_16QI:
15765     case VSX_BUILTIN_CMPLE_U16QI:
15766     case VSX_BUILTIN_CMPLE_8HI:
15767     case VSX_BUILTIN_CMPLE_U8HI:
15768     case VSX_BUILTIN_CMPLE_4SI:
15769     case VSX_BUILTIN_CMPLE_U4SI:
15770     case VSX_BUILTIN_CMPLE_2DI:
15771     case VSX_BUILTIN_CMPLE_U2DI:
15772       fold_compare_helper (gsi, LE_EXPR, stmt);
15773       return true;
15774
15775     /* flavors of vec_splat_[us]{8,16,32}.  */
15776     case ALTIVEC_BUILTIN_VSPLTISB:
15777     case ALTIVEC_BUILTIN_VSPLTISH:
15778     case ALTIVEC_BUILTIN_VSPLTISW:
15779       {
15780         arg0 = gimple_call_arg (stmt, 0);
15781         lhs = gimple_call_lhs (stmt);
15782
15783         /* Only fold the vec_splat_*() if the lower bits of arg 0 is a
15784            5-bit signed constant in range -16 to +15.  */
15785         if (TREE_CODE (arg0) != INTEGER_CST
15786             || !IN_RANGE (TREE_INT_CST_LOW (arg0), -16, 15))
15787           return false;
15788         gimple_seq stmts = NULL;
15789         location_t loc = gimple_location (stmt);
15790         tree splat_value = gimple_convert (&stmts, loc,
15791                                            TREE_TYPE (TREE_TYPE (lhs)), arg0);
15792         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15793         tree splat_tree = build_vector_from_val (TREE_TYPE (lhs), splat_value);
15794         g = gimple_build_assign (lhs, splat_tree);
15795         gimple_set_location (g, gimple_location (stmt));
15796         gsi_replace (gsi, g, true);
15797         return true;
15798       }
15799
15800     /* Flavors of vec_splat.  */
15801     /* a = vec_splat (b, 0x3) becomes a = { b[3],b[3],b[3],...};  */
15802     case ALTIVEC_BUILTIN_VSPLTB:
15803     case ALTIVEC_BUILTIN_VSPLTH:
15804     case ALTIVEC_BUILTIN_VSPLTW:
15805     case VSX_BUILTIN_XXSPLTD_V2DI:
15806     case VSX_BUILTIN_XXSPLTD_V2DF:
15807       {
15808         arg0 = gimple_call_arg (stmt, 0); /* input vector.  */
15809         arg1 = gimple_call_arg (stmt, 1); /* index into arg0.  */
15810         /* Only fold the vec_splat_*() if arg1 is both a constant value and
15811            is a valid index into the arg0 vector.  */
15812         unsigned int n_elts = VECTOR_CST_NELTS (arg0);
15813         if (TREE_CODE (arg1) != INTEGER_CST
15814             || TREE_INT_CST_LOW (arg1) > (n_elts -1))
15815           return false;
15816         lhs = gimple_call_lhs (stmt);
15817         tree lhs_type = TREE_TYPE (lhs);
15818         tree arg0_type = TREE_TYPE (arg0);
15819         tree splat;
15820         if (TREE_CODE (arg0) == VECTOR_CST)
15821           splat = VECTOR_CST_ELT (arg0, TREE_INT_CST_LOW (arg1));
15822         else
15823           {
15824             /* Determine (in bits) the length and start location of the
15825                splat value for a call to the tree_vec_extract helper.  */
15826             int splat_elem_size = TREE_INT_CST_LOW (size_in_bytes (arg0_type))
15827                                   * BITS_PER_UNIT / n_elts;
15828             int splat_start_bit = TREE_INT_CST_LOW (arg1) * splat_elem_size;
15829             tree len = build_int_cst (bitsizetype, splat_elem_size);
15830             tree start = build_int_cst (bitsizetype, splat_start_bit);
15831             splat = tree_vec_extract (gsi, TREE_TYPE (lhs_type), arg0,
15832                                       len, start);
15833           }
15834         /* And finally, build the new vector.  */
15835         tree splat_tree = build_vector_from_val (lhs_type, splat);
15836         g = gimple_build_assign (lhs, splat_tree);
15837         gimple_set_location (g, gimple_location (stmt));
15838         gsi_replace (gsi, g, true);
15839         return true;
15840       }
15841
15842     /* vec_mergel (integrals).  */
15843     case ALTIVEC_BUILTIN_VMRGLH:
15844     case ALTIVEC_BUILTIN_VMRGLW:
15845     case VSX_BUILTIN_XXMRGLW_4SI:
15846     case ALTIVEC_BUILTIN_VMRGLB:
15847     case VSX_BUILTIN_VEC_MERGEL_V2DI:
15848     case VSX_BUILTIN_XXMRGLW_4SF:
15849     case VSX_BUILTIN_VEC_MERGEL_V2DF:
15850       fold_mergehl_helper (gsi, stmt, 1);
15851       return true;
15852     /* vec_mergeh (integrals).  */
15853     case ALTIVEC_BUILTIN_VMRGHH:
15854     case ALTIVEC_BUILTIN_VMRGHW:
15855     case VSX_BUILTIN_XXMRGHW_4SI:
15856     case ALTIVEC_BUILTIN_VMRGHB:
15857     case VSX_BUILTIN_VEC_MERGEH_V2DI:
15858     case VSX_BUILTIN_XXMRGHW_4SF:
15859     case VSX_BUILTIN_VEC_MERGEH_V2DF:
15860       fold_mergehl_helper (gsi, stmt, 0);
15861       return true;
15862
15863     /* Flavors of vec_mergee.  */
15864     case P8V_BUILTIN_VMRGEW_V4SI:
15865     case P8V_BUILTIN_VMRGEW_V2DI:
15866     case P8V_BUILTIN_VMRGEW_V4SF:
15867     case P8V_BUILTIN_VMRGEW_V2DF:
15868       fold_mergeeo_helper (gsi, stmt, 0);
15869       return true;
15870     /* Flavors of vec_mergeo.  */
15871     case P8V_BUILTIN_VMRGOW_V4SI:
15872     case P8V_BUILTIN_VMRGOW_V2DI:
15873     case P8V_BUILTIN_VMRGOW_V4SF:
15874     case P8V_BUILTIN_VMRGOW_V2DF:
15875       fold_mergeeo_helper (gsi, stmt, 1);
15876       return true;
15877
15878     /* d = vec_pack (a, b) */
15879     case P8V_BUILTIN_VPKUDUM:
15880     case ALTIVEC_BUILTIN_VPKUHUM:
15881     case ALTIVEC_BUILTIN_VPKUWUM:
15882       {
15883         arg0 = gimple_call_arg (stmt, 0);
15884         arg1 = gimple_call_arg (stmt, 1);
15885         lhs = gimple_call_lhs (stmt);
15886         gimple *g = gimple_build_assign (lhs, VEC_PACK_TRUNC_EXPR, arg0, arg1);
15887         gimple_set_location (g, gimple_location (stmt));
15888         gsi_replace (gsi, g, true);
15889         return true;
15890       }
15891
15892     /* d = vec_unpackh (a) */
15893     /* Note that the UNPACK_{HI,LO}_EXPR used in the gimple_build_assign call
15894        in this code is sensitive to endian-ness, and needs to be inverted to
15895        handle both LE and BE targets.  */
15896     case ALTIVEC_BUILTIN_VUPKHSB:
15897     case ALTIVEC_BUILTIN_VUPKHSH:
15898     case P8V_BUILTIN_VUPKHSW:
15899       {
15900         arg0 = gimple_call_arg (stmt, 0);
15901         lhs = gimple_call_lhs (stmt);
15902         if (BYTES_BIG_ENDIAN)
15903           g = gimple_build_assign (lhs, VEC_UNPACK_HI_EXPR, arg0);
15904         else
15905           g = gimple_build_assign (lhs, VEC_UNPACK_LO_EXPR, arg0);
15906         gimple_set_location (g, gimple_location (stmt));
15907         gsi_replace (gsi, g, true);
15908         return true;
15909       }
15910     /* d = vec_unpackl (a) */
15911     case ALTIVEC_BUILTIN_VUPKLSB:
15912     case ALTIVEC_BUILTIN_VUPKLSH:
15913     case P8V_BUILTIN_VUPKLSW:
15914       {
15915         arg0 = gimple_call_arg (stmt, 0);
15916         lhs = gimple_call_lhs (stmt);
15917         if (BYTES_BIG_ENDIAN)
15918           g = gimple_build_assign (lhs, VEC_UNPACK_LO_EXPR, arg0);
15919         else
15920           g = gimple_build_assign (lhs, VEC_UNPACK_HI_EXPR, arg0);
15921         gimple_set_location (g, gimple_location (stmt));
15922         gsi_replace (gsi, g, true);
15923         return true;
15924       }
15925     /* There is no gimple type corresponding with pixel, so just return.  */
15926     case ALTIVEC_BUILTIN_VUPKHPX:
15927     case ALTIVEC_BUILTIN_VUPKLPX:
15928       return false;
15929
15930     /* vec_perm.  */
15931     case ALTIVEC_BUILTIN_VPERM_16QI:
15932     case ALTIVEC_BUILTIN_VPERM_8HI:
15933     case ALTIVEC_BUILTIN_VPERM_4SI:
15934     case ALTIVEC_BUILTIN_VPERM_2DI:
15935     case ALTIVEC_BUILTIN_VPERM_4SF:
15936     case ALTIVEC_BUILTIN_VPERM_2DF:
15937       {
15938         arg0 = gimple_call_arg (stmt, 0);
15939         arg1 = gimple_call_arg (stmt, 1);
15940         tree permute = gimple_call_arg (stmt, 2);
15941         lhs = gimple_call_lhs (stmt);
15942         location_t loc = gimple_location (stmt);
15943         gimple_seq stmts = NULL;
15944         // convert arg0 and arg1 to match the type of the permute
15945         // for the VEC_PERM_EXPR operation.
15946         tree permute_type = (TREE_TYPE (permute));
15947         tree arg0_ptype = gimple_convert (&stmts, loc, permute_type, arg0);
15948         tree arg1_ptype = gimple_convert (&stmts, loc, permute_type, arg1);
15949         tree lhs_ptype = gimple_build (&stmts, loc, VEC_PERM_EXPR,
15950                                       permute_type, arg0_ptype, arg1_ptype,
15951                                       permute);
15952         // Convert the result back to the desired lhs type upon completion.
15953         tree temp = gimple_convert (&stmts, loc, TREE_TYPE (lhs), lhs_ptype);
15954         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15955         g = gimple_build_assign (lhs, temp);
15956         gimple_set_location (g, loc);
15957         gsi_replace (gsi, g, true);
15958         return true;
15959       }
15960
15961     default:
15962       if (TARGET_DEBUG_BUILTIN)
15963         fprintf (stderr, "gimple builtin intrinsic not matched:%d %s %s\n",
15964                  fn_code, fn_name1, fn_name2);
15965       break;
15966     }
15967
15968   return false;
15969 }
15970
15971 /* Expand an expression EXP that calls a built-in function,
15972    with result going to TARGET if that's convenient
15973    (and in mode MODE if that's convenient).
15974    SUBTARGET may be used as the target for computing one of EXP's operands.
15975    IGNORE is nonzero if the value is to be ignored.  */
15976
15977 static rtx
15978 rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
15979                        machine_mode mode ATTRIBUTE_UNUSED,
15980                        int ignore ATTRIBUTE_UNUSED)
15981 {
15982   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
15983   enum rs6000_builtins fcode
15984     = (enum rs6000_builtins)DECL_FUNCTION_CODE (fndecl);
15985   size_t uns_fcode = (size_t)fcode;
15986   const struct builtin_description *d;
15987   size_t i;
15988   rtx ret;
15989   bool success;
15990   HOST_WIDE_INT mask = rs6000_builtin_info[uns_fcode].mask;
15991   bool func_valid_p = ((rs6000_builtin_mask & mask) == mask);
15992   enum insn_code icode = rs6000_builtin_info[uns_fcode].icode;
15993
15994   /* We have two different modes (KFmode, TFmode) that are the IEEE 128-bit
15995      floating point type, depending on whether long double is the IBM extended
15996      double (KFmode) or long double is IEEE 128-bit (TFmode).  It is simpler if
15997      we only define one variant of the built-in function, and switch the code
15998      when defining it, rather than defining two built-ins and using the
15999      overload table in rs6000-c.c to switch between the two.  If we don't have
16000      the proper assembler, don't do this switch because CODE_FOR_*kf* and
16001      CODE_FOR_*tf* will be CODE_FOR_nothing.  */
16002   if (FLOAT128_IEEE_P (TFmode))
16003     switch (icode)
16004       {
16005       default:
16006         break;
16007
16008       case CODE_FOR_sqrtkf2_odd:        icode = CODE_FOR_sqrttf2_odd;   break;
16009       case CODE_FOR_trunckfdf2_odd:     icode = CODE_FOR_trunctfdf2_odd; break;
16010       case CODE_FOR_addkf3_odd:         icode = CODE_FOR_addtf3_odd;    break;
16011       case CODE_FOR_subkf3_odd:         icode = CODE_FOR_subtf3_odd;    break;
16012       case CODE_FOR_mulkf3_odd:         icode = CODE_FOR_multf3_odd;    break;
16013       case CODE_FOR_divkf3_odd:         icode = CODE_FOR_divtf3_odd;    break;
16014       case CODE_FOR_fmakf4_odd:         icode = CODE_FOR_fmatf4_odd;    break;
16015       case CODE_FOR_xsxexpqp_kf:        icode = CODE_FOR_xsxexpqp_tf;   break;
16016       case CODE_FOR_xsxsigqp_kf:        icode = CODE_FOR_xsxsigqp_tf;   break;
16017       case CODE_FOR_xststdcnegqp_kf:    icode = CODE_FOR_xststdcnegqp_tf; break;
16018       case CODE_FOR_xsiexpqp_kf:        icode = CODE_FOR_xsiexpqp_tf;   break;
16019       case CODE_FOR_xsiexpqpf_kf:       icode = CODE_FOR_xsiexpqpf_tf;  break;
16020       case CODE_FOR_xststdcqp_kf:       icode = CODE_FOR_xststdcqp_tf;  break;
16021       }
16022
16023   if (TARGET_DEBUG_BUILTIN)
16024     {
16025       const char *name1 = rs6000_builtin_info[uns_fcode].name;
16026       const char *name2 = (icode != CODE_FOR_nothing)
16027                            ? get_insn_name ((int) icode)
16028                            : "nothing";
16029       const char *name3;
16030
16031       switch (rs6000_builtin_info[uns_fcode].attr & RS6000_BTC_TYPE_MASK)
16032         {
16033         default:                   name3 = "unknown";   break;
16034         case RS6000_BTC_SPECIAL:   name3 = "special";   break;
16035         case RS6000_BTC_UNARY:     name3 = "unary";     break;
16036         case RS6000_BTC_BINARY:    name3 = "binary";    break;
16037         case RS6000_BTC_TERNARY:   name3 = "ternary";   break;
16038         case RS6000_BTC_PREDICATE: name3 = "predicate"; break;
16039         case RS6000_BTC_ABS:       name3 = "abs";       break;
16040         case RS6000_BTC_DST:       name3 = "dst";       break;
16041         }
16042
16043
16044       fprintf (stderr,
16045                "rs6000_expand_builtin, %s (%d), insn = %s (%d), type=%s%s\n",
16046                (name1) ? name1 : "---", fcode,
16047                (name2) ? name2 : "---", (int) icode,
16048                name3,
16049                func_valid_p ? "" : ", not valid");
16050     }        
16051
16052   if (!func_valid_p)
16053     {
16054       rs6000_invalid_builtin (fcode);
16055
16056       /* Given it is invalid, just generate a normal call.  */
16057       return expand_call (exp, target, ignore);
16058     }
16059
16060   switch (fcode)
16061     {
16062     case RS6000_BUILTIN_RECIP:
16063       return rs6000_expand_binop_builtin (CODE_FOR_recipdf3, exp, target);
16064
16065     case RS6000_BUILTIN_RECIPF:
16066       return rs6000_expand_binop_builtin (CODE_FOR_recipsf3, exp, target);
16067
16068     case RS6000_BUILTIN_RSQRTF:
16069       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtsf2, exp, target);
16070
16071     case RS6000_BUILTIN_RSQRT:
16072       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtdf2, exp, target);
16073
16074     case POWER7_BUILTIN_BPERMD:
16075       return rs6000_expand_binop_builtin (((TARGET_64BIT)
16076                                            ? CODE_FOR_bpermd_di
16077                                            : CODE_FOR_bpermd_si), exp, target);
16078
16079     case RS6000_BUILTIN_GET_TB:
16080       return rs6000_expand_zeroop_builtin (CODE_FOR_rs6000_get_timebase,
16081                                            target);
16082
16083     case RS6000_BUILTIN_MFTB:
16084       return rs6000_expand_zeroop_builtin (((TARGET_64BIT)
16085                                             ? CODE_FOR_rs6000_mftb_di
16086                                             : CODE_FOR_rs6000_mftb_si),
16087                                            target);
16088
16089     case RS6000_BUILTIN_MFFS:
16090       return rs6000_expand_zeroop_builtin (CODE_FOR_rs6000_mffs, target);
16091
16092     case RS6000_BUILTIN_MTFSB0:
16093       return rs6000_expand_mtfsb_builtin (CODE_FOR_rs6000_mtfsb0, exp);
16094
16095     case RS6000_BUILTIN_MTFSB1:
16096       return rs6000_expand_mtfsb_builtin (CODE_FOR_rs6000_mtfsb1, exp);
16097
16098     case RS6000_BUILTIN_SET_FPSCR_RN:
16099       return rs6000_expand_set_fpscr_rn_builtin (CODE_FOR_rs6000_set_fpscr_rn,
16100                                                  exp);
16101
16102     case RS6000_BUILTIN_SET_FPSCR_DRN:
16103       return
16104         rs6000_expand_set_fpscr_drn_builtin (CODE_FOR_rs6000_set_fpscr_drn,
16105                                              exp);
16106
16107     case RS6000_BUILTIN_MFFSL:
16108       return rs6000_expand_zeroop_builtin (CODE_FOR_rs6000_mffsl, target);
16109
16110     case RS6000_BUILTIN_MTFSF:
16111       return rs6000_expand_mtfsf_builtin (CODE_FOR_rs6000_mtfsf, exp);
16112
16113     case RS6000_BUILTIN_CPU_INIT:
16114     case RS6000_BUILTIN_CPU_IS:
16115     case RS6000_BUILTIN_CPU_SUPPORTS:
16116       return cpu_expand_builtin (fcode, exp, target);
16117
16118     case MISC_BUILTIN_SPEC_BARRIER:
16119       {
16120         emit_insn (gen_speculation_barrier ());
16121         return NULL_RTX;
16122       }
16123
16124     case ALTIVEC_BUILTIN_MASK_FOR_LOAD:
16125     case ALTIVEC_BUILTIN_MASK_FOR_STORE:
16126       {
16127         int icode2 = (BYTES_BIG_ENDIAN ? (int) CODE_FOR_altivec_lvsr_direct
16128                      : (int) CODE_FOR_altivec_lvsl_direct);
16129         machine_mode tmode = insn_data[icode2].operand[0].mode;
16130         machine_mode mode = insn_data[icode2].operand[1].mode;
16131         tree arg;
16132         rtx op, addr, pat;
16133
16134         gcc_assert (TARGET_ALTIVEC);
16135
16136         arg = CALL_EXPR_ARG (exp, 0);
16137         gcc_assert (POINTER_TYPE_P (TREE_TYPE (arg)));
16138         op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
16139         addr = memory_address (mode, op);
16140         if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
16141           op = addr;
16142         else
16143           {
16144             /* For the load case need to negate the address.  */
16145             op = gen_reg_rtx (GET_MODE (addr));
16146             emit_insn (gen_rtx_SET (op, gen_rtx_NEG (GET_MODE (addr), addr)));
16147           }
16148         op = gen_rtx_MEM (mode, op);
16149
16150         if (target == 0
16151             || GET_MODE (target) != tmode
16152             || ! (*insn_data[icode2].operand[0].predicate) (target, tmode))
16153           target = gen_reg_rtx (tmode);
16154
16155         pat = GEN_FCN (icode2) (target, op);
16156         if (!pat)
16157           return 0;
16158         emit_insn (pat);
16159
16160         return target;
16161       }
16162
16163     case ALTIVEC_BUILTIN_VCFUX:
16164     case ALTIVEC_BUILTIN_VCFSX:
16165     case ALTIVEC_BUILTIN_VCTUXS:
16166     case ALTIVEC_BUILTIN_VCTSXS:
16167   /* FIXME: There's got to be a nicer way to handle this case than
16168      constructing a new CALL_EXPR.  */
16169       if (call_expr_nargs (exp) == 1)
16170         {
16171           exp = build_call_nary (TREE_TYPE (exp), CALL_EXPR_FN (exp),
16172                                  2, CALL_EXPR_ARG (exp, 0), integer_zero_node);
16173         }
16174       break;
16175
16176       /* For the pack and unpack int128 routines, fix up the builtin so it
16177          uses the correct IBM128 type.  */
16178     case MISC_BUILTIN_PACK_IF:
16179       if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
16180         {
16181           icode = CODE_FOR_packtf;
16182           fcode = MISC_BUILTIN_PACK_TF;
16183           uns_fcode = (size_t)fcode;
16184         }
16185       break;
16186
16187     case MISC_BUILTIN_UNPACK_IF:
16188       if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
16189         {
16190           icode = CODE_FOR_unpacktf;
16191           fcode = MISC_BUILTIN_UNPACK_TF;
16192           uns_fcode = (size_t)fcode;
16193         }
16194       break;
16195
16196     default:
16197       break;
16198     }
16199
16200   if (TARGET_ALTIVEC)
16201     {
16202       ret = altivec_expand_builtin (exp, target, &success);
16203
16204       if (success)
16205         return ret;
16206     }
16207   if (TARGET_HTM)
16208     {
16209       ret = htm_expand_builtin (exp, target, &success);
16210
16211       if (success)
16212         return ret;
16213     }  
16214
16215   unsigned attr = rs6000_builtin_info[uns_fcode].attr & RS6000_BTC_TYPE_MASK;
16216   /* RS6000_BTC_SPECIAL represents no-operand operators.  */
16217   gcc_assert (attr == RS6000_BTC_UNARY
16218               || attr == RS6000_BTC_BINARY
16219               || attr == RS6000_BTC_TERNARY
16220               || attr == RS6000_BTC_SPECIAL);
16221   
16222   /* Handle simple unary operations.  */
16223   d = bdesc_1arg;
16224   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
16225     if (d->code == fcode)
16226       return rs6000_expand_unop_builtin (icode, exp, target);
16227
16228   /* Handle simple binary operations.  */
16229   d = bdesc_2arg;
16230   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
16231     if (d->code == fcode)
16232       return rs6000_expand_binop_builtin (icode, exp, target);
16233
16234   /* Handle simple ternary operations.  */
16235   d = bdesc_3arg;
16236   for (i = 0; i < ARRAY_SIZE  (bdesc_3arg); i++, d++)
16237     if (d->code == fcode)
16238       return rs6000_expand_ternop_builtin (icode, exp, target);
16239
16240   /* Handle simple no-argument operations. */
16241   d = bdesc_0arg;
16242   for (i = 0; i < ARRAY_SIZE (bdesc_0arg); i++, d++)
16243     if (d->code == fcode)
16244       return rs6000_expand_zeroop_builtin (icode, target);
16245
16246   gcc_unreachable ();
16247 }
16248
16249 /* Create a builtin vector type with a name.  Taking care not to give
16250    the canonical type a name.  */
16251
16252 static tree
16253 rs6000_vector_type (const char *name, tree elt_type, unsigned num_elts)
16254 {
16255   tree result = build_vector_type (elt_type, num_elts);
16256
16257   /* Copy so we don't give the canonical type a name.  */
16258   result = build_variant_type_copy (result);
16259
16260   add_builtin_type (name, result);
16261
16262   return result;
16263 }
16264
16265 static void
16266 rs6000_init_builtins (void)
16267 {
16268   tree tdecl;
16269   tree ftype;
16270   machine_mode mode;
16271
16272   if (TARGET_DEBUG_BUILTIN)
16273     fprintf (stderr, "rs6000_init_builtins%s%s\n",
16274              (TARGET_ALTIVEC)      ? ", altivec" : "",
16275              (TARGET_VSX)          ? ", vsx"     : "");
16276
16277   V2DI_type_node = rs6000_vector_type (TARGET_POWERPC64 ? "__vector long"
16278                                        : "__vector long long",
16279                                        intDI_type_node, 2);
16280   V2DF_type_node = rs6000_vector_type ("__vector double", double_type_node, 2);
16281   V4SI_type_node = rs6000_vector_type ("__vector signed int",
16282                                        intSI_type_node, 4);
16283   V4SF_type_node = rs6000_vector_type ("__vector float", float_type_node, 4);
16284   V8HI_type_node = rs6000_vector_type ("__vector signed short",
16285                                        intHI_type_node, 8);
16286   V16QI_type_node = rs6000_vector_type ("__vector signed char",
16287                                         intQI_type_node, 16);
16288
16289   unsigned_V16QI_type_node = rs6000_vector_type ("__vector unsigned char",
16290                                         unsigned_intQI_type_node, 16);
16291   unsigned_V8HI_type_node = rs6000_vector_type ("__vector unsigned short",
16292                                        unsigned_intHI_type_node, 8);
16293   unsigned_V4SI_type_node = rs6000_vector_type ("__vector unsigned int",
16294                                        unsigned_intSI_type_node, 4);
16295   unsigned_V2DI_type_node = rs6000_vector_type (TARGET_POWERPC64
16296                                        ? "__vector unsigned long"
16297                                        : "__vector unsigned long long",
16298                                        unsigned_intDI_type_node, 2);
16299
16300   opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4);
16301
16302   const_str_type_node
16303     = build_pointer_type (build_qualified_type (char_type_node,
16304                                                 TYPE_QUAL_CONST));
16305
16306   /* We use V1TI mode as a special container to hold __int128_t items that
16307      must live in VSX registers.  */
16308   if (intTI_type_node)
16309     {
16310       V1TI_type_node = rs6000_vector_type ("__vector __int128",
16311                                            intTI_type_node, 1);
16312       unsigned_V1TI_type_node
16313         = rs6000_vector_type ("__vector unsigned __int128",
16314                               unsigned_intTI_type_node, 1);
16315     }
16316
16317   /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
16318      types, especially in C++ land.  Similarly, 'vector pixel' is distinct from
16319      'vector unsigned short'.  */
16320
16321   bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
16322   bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
16323   bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
16324   bool_long_long_type_node = build_distinct_type_copy (unsigned_intDI_type_node);
16325   pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
16326
16327   long_integer_type_internal_node = long_integer_type_node;
16328   long_unsigned_type_internal_node = long_unsigned_type_node;
16329   long_long_integer_type_internal_node = long_long_integer_type_node;
16330   long_long_unsigned_type_internal_node = long_long_unsigned_type_node;
16331   intQI_type_internal_node = intQI_type_node;
16332   uintQI_type_internal_node = unsigned_intQI_type_node;
16333   intHI_type_internal_node = intHI_type_node;
16334   uintHI_type_internal_node = unsigned_intHI_type_node;
16335   intSI_type_internal_node = intSI_type_node;
16336   uintSI_type_internal_node = unsigned_intSI_type_node;
16337   intDI_type_internal_node = intDI_type_node;
16338   uintDI_type_internal_node = unsigned_intDI_type_node;
16339   intTI_type_internal_node = intTI_type_node;
16340   uintTI_type_internal_node = unsigned_intTI_type_node;
16341   float_type_internal_node = float_type_node;
16342   double_type_internal_node = double_type_node;
16343   long_double_type_internal_node = long_double_type_node;
16344   dfloat64_type_internal_node = dfloat64_type_node;
16345   dfloat128_type_internal_node = dfloat128_type_node;
16346   void_type_internal_node = void_type_node;
16347
16348   /* 128-bit floating point support.  KFmode is IEEE 128-bit floating point.
16349      IFmode is the IBM extended 128-bit format that is a pair of doubles.
16350      TFmode will be either IEEE 128-bit floating point or the IBM double-double
16351      format that uses a pair of doubles, depending on the switches and
16352      defaults.
16353
16354      If we don't support for either 128-bit IBM double double or IEEE 128-bit
16355      floating point, we need make sure the type is non-zero or else self-test
16356      fails during bootstrap.
16357
16358      Always create __ibm128 as a separate type, even if the current long double
16359      format is IBM extended double.
16360
16361      For IEEE 128-bit floating point, always create the type __ieee128.  If the
16362      user used -mfloat128, rs6000-c.c will create a define from __float128 to
16363      __ieee128.  */
16364   if (TARGET_FLOAT128_TYPE)
16365     {
16366       if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128)
16367         ibm128_float_type_node = long_double_type_node;
16368       else
16369         {
16370           ibm128_float_type_node = make_node (REAL_TYPE);
16371           TYPE_PRECISION (ibm128_float_type_node) = 128;
16372           SET_TYPE_MODE (ibm128_float_type_node, IFmode);
16373           layout_type (ibm128_float_type_node);
16374         }
16375
16376       lang_hooks.types.register_builtin_type (ibm128_float_type_node,
16377                                               "__ibm128");
16378
16379       if (TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128)
16380         ieee128_float_type_node = long_double_type_node;
16381       else
16382         ieee128_float_type_node = float128_type_node;
16383
16384       lang_hooks.types.register_builtin_type (ieee128_float_type_node,
16385                                               "__ieee128");
16386     }
16387
16388   else
16389     ieee128_float_type_node = ibm128_float_type_node = long_double_type_node;
16390
16391   /* Initialize the modes for builtin_function_type, mapping a machine mode to
16392      tree type node.  */
16393   builtin_mode_to_type[QImode][0] = integer_type_node;
16394   builtin_mode_to_type[HImode][0] = integer_type_node;
16395   builtin_mode_to_type[SImode][0] = intSI_type_node;
16396   builtin_mode_to_type[SImode][1] = unsigned_intSI_type_node;
16397   builtin_mode_to_type[DImode][0] = intDI_type_node;
16398   builtin_mode_to_type[DImode][1] = unsigned_intDI_type_node;
16399   builtin_mode_to_type[TImode][0] = intTI_type_node;
16400   builtin_mode_to_type[TImode][1] = unsigned_intTI_type_node;
16401   builtin_mode_to_type[SFmode][0] = float_type_node;
16402   builtin_mode_to_type[DFmode][0] = double_type_node;
16403   builtin_mode_to_type[IFmode][0] = ibm128_float_type_node;
16404   builtin_mode_to_type[KFmode][0] = ieee128_float_type_node;
16405   builtin_mode_to_type[TFmode][0] = long_double_type_node;
16406   builtin_mode_to_type[DDmode][0] = dfloat64_type_node;
16407   builtin_mode_to_type[TDmode][0] = dfloat128_type_node;
16408   builtin_mode_to_type[V1TImode][0] = V1TI_type_node;
16409   builtin_mode_to_type[V1TImode][1] = unsigned_V1TI_type_node;
16410   builtin_mode_to_type[V2DImode][0] = V2DI_type_node;
16411   builtin_mode_to_type[V2DImode][1] = unsigned_V2DI_type_node;
16412   builtin_mode_to_type[V2DFmode][0] = V2DF_type_node;
16413   builtin_mode_to_type[V4SImode][0] = V4SI_type_node;
16414   builtin_mode_to_type[V4SImode][1] = unsigned_V4SI_type_node;
16415   builtin_mode_to_type[V4SFmode][0] = V4SF_type_node;
16416   builtin_mode_to_type[V8HImode][0] = V8HI_type_node;
16417   builtin_mode_to_type[V8HImode][1] = unsigned_V8HI_type_node;
16418   builtin_mode_to_type[V16QImode][0] = V16QI_type_node;
16419   builtin_mode_to_type[V16QImode][1] = unsigned_V16QI_type_node;
16420
16421   tdecl = add_builtin_type ("__bool char", bool_char_type_node);
16422   TYPE_NAME (bool_char_type_node) = tdecl;
16423
16424   tdecl = add_builtin_type ("__bool short", bool_short_type_node);
16425   TYPE_NAME (bool_short_type_node) = tdecl;
16426
16427   tdecl = add_builtin_type ("__bool int", bool_int_type_node);
16428   TYPE_NAME (bool_int_type_node) = tdecl;
16429
16430   tdecl = add_builtin_type ("__pixel", pixel_type_node);
16431   TYPE_NAME (pixel_type_node) = tdecl;
16432
16433   bool_V16QI_type_node = rs6000_vector_type ("__vector __bool char",
16434                                              bool_char_type_node, 16);
16435   bool_V8HI_type_node = rs6000_vector_type ("__vector __bool short",
16436                                             bool_short_type_node, 8);
16437   bool_V4SI_type_node = rs6000_vector_type ("__vector __bool int",
16438                                             bool_int_type_node, 4);
16439   bool_V2DI_type_node = rs6000_vector_type (TARGET_POWERPC64
16440                                             ? "__vector __bool long"
16441                                             : "__vector __bool long long",
16442                                             bool_long_long_type_node, 2);
16443   pixel_V8HI_type_node = rs6000_vector_type ("__vector __pixel",
16444                                              pixel_type_node, 8);
16445
16446   /* Create Altivec and VSX builtins on machines with at least the
16447      general purpose extensions (970 and newer) to allow the use of
16448      the target attribute.  */
16449   if (TARGET_EXTRA_BUILTINS)
16450     altivec_init_builtins ();
16451   if (TARGET_HTM)
16452     htm_init_builtins ();
16453
16454   if (TARGET_EXTRA_BUILTINS)
16455     rs6000_common_init_builtins ();
16456
16457   ftype = builtin_function_type (DFmode, DFmode, DFmode, VOIDmode,
16458                                  RS6000_BUILTIN_RECIP, "__builtin_recipdiv");
16459   def_builtin ("__builtin_recipdiv", ftype, RS6000_BUILTIN_RECIP);
16460
16461   ftype = builtin_function_type (SFmode, SFmode, SFmode, VOIDmode,
16462                                  RS6000_BUILTIN_RECIPF, "__builtin_recipdivf");
16463   def_builtin ("__builtin_recipdivf", ftype, RS6000_BUILTIN_RECIPF);
16464
16465   ftype = builtin_function_type (DFmode, DFmode, VOIDmode, VOIDmode,
16466                                  RS6000_BUILTIN_RSQRT, "__builtin_rsqrt");
16467   def_builtin ("__builtin_rsqrt", ftype, RS6000_BUILTIN_RSQRT);
16468
16469   ftype = builtin_function_type (SFmode, SFmode, VOIDmode, VOIDmode,
16470                                  RS6000_BUILTIN_RSQRTF, "__builtin_rsqrtf");
16471   def_builtin ("__builtin_rsqrtf", ftype, RS6000_BUILTIN_RSQRTF);
16472
16473   mode = (TARGET_64BIT) ? DImode : SImode;
16474   ftype = builtin_function_type (mode, mode, mode, VOIDmode,
16475                                  POWER7_BUILTIN_BPERMD, "__builtin_bpermd");
16476   def_builtin ("__builtin_bpermd", ftype, POWER7_BUILTIN_BPERMD);
16477
16478   ftype = build_function_type_list (unsigned_intDI_type_node,
16479                                     NULL_TREE);
16480   def_builtin ("__builtin_ppc_get_timebase", ftype, RS6000_BUILTIN_GET_TB);
16481
16482   if (TARGET_64BIT)
16483     ftype = build_function_type_list (unsigned_intDI_type_node,
16484                                       NULL_TREE);
16485   else
16486     ftype = build_function_type_list (unsigned_intSI_type_node,
16487                                       NULL_TREE);
16488   def_builtin ("__builtin_ppc_mftb", ftype, RS6000_BUILTIN_MFTB);
16489
16490   ftype = build_function_type_list (double_type_node, NULL_TREE);
16491   def_builtin ("__builtin_mffs", ftype, RS6000_BUILTIN_MFFS);
16492
16493   ftype = build_function_type_list (double_type_node, NULL_TREE);
16494   def_builtin ("__builtin_mffsl", ftype, RS6000_BUILTIN_MFFSL);
16495
16496   ftype = build_function_type_list (void_type_node,
16497                                     intSI_type_node,
16498                                     NULL_TREE);
16499   def_builtin ("__builtin_mtfsb0", ftype, RS6000_BUILTIN_MTFSB0);
16500
16501   ftype = build_function_type_list (void_type_node,
16502                                     intSI_type_node,
16503                                     NULL_TREE);
16504   def_builtin ("__builtin_mtfsb1", ftype, RS6000_BUILTIN_MTFSB1);
16505
16506   ftype = build_function_type_list (void_type_node,
16507                                     intDI_type_node,
16508                                     NULL_TREE);
16509   def_builtin ("__builtin_set_fpscr_rn", ftype, RS6000_BUILTIN_SET_FPSCR_RN);
16510
16511   ftype = build_function_type_list (void_type_node,
16512                                     intDI_type_node,
16513                                     NULL_TREE);
16514   def_builtin ("__builtin_set_fpscr_drn", ftype, RS6000_BUILTIN_SET_FPSCR_DRN);
16515
16516   ftype = build_function_type_list (void_type_node,
16517                                     intSI_type_node, double_type_node,
16518                                     NULL_TREE);
16519   def_builtin ("__builtin_mtfsf", ftype, RS6000_BUILTIN_MTFSF);
16520
16521   ftype = build_function_type_list (void_type_node, NULL_TREE);
16522   def_builtin ("__builtin_cpu_init", ftype, RS6000_BUILTIN_CPU_INIT);
16523   def_builtin ("__builtin_ppc_speculation_barrier", ftype,
16524                MISC_BUILTIN_SPEC_BARRIER);
16525
16526   ftype = build_function_type_list (bool_int_type_node, const_ptr_type_node,
16527                                     NULL_TREE);
16528   def_builtin ("__builtin_cpu_is", ftype, RS6000_BUILTIN_CPU_IS);
16529   def_builtin ("__builtin_cpu_supports", ftype, RS6000_BUILTIN_CPU_SUPPORTS);
16530
16531   /* AIX libm provides clog as __clog.  */
16532   if (TARGET_XCOFF &&
16533       (tdecl = builtin_decl_explicit (BUILT_IN_CLOG)) != NULL_TREE)
16534     set_user_assembler_name (tdecl, "__clog");
16535
16536 #ifdef SUBTARGET_INIT_BUILTINS
16537   SUBTARGET_INIT_BUILTINS;
16538 #endif
16539 }
16540
16541 /* Returns the rs6000 builtin decl for CODE.  */
16542
16543 static tree
16544 rs6000_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
16545 {
16546   HOST_WIDE_INT fnmask;
16547
16548   if (code >= RS6000_BUILTIN_COUNT)
16549     return error_mark_node;
16550
16551   fnmask = rs6000_builtin_info[code].mask;
16552   if ((fnmask & rs6000_builtin_mask) != fnmask)
16553     {
16554       rs6000_invalid_builtin ((enum rs6000_builtins)code);
16555       return error_mark_node;
16556     }
16557
16558   return rs6000_builtin_decls[code];
16559 }
16560
16561 static void
16562 altivec_init_builtins (void)
16563 {
16564   const struct builtin_description *d;
16565   size_t i;
16566   tree ftype;
16567   tree decl;
16568   HOST_WIDE_INT builtin_mask = rs6000_builtin_mask;
16569
16570   tree pvoid_type_node = build_pointer_type (void_type_node);
16571
16572   tree pcvoid_type_node
16573     = build_pointer_type (build_qualified_type (void_type_node,
16574                                                 TYPE_QUAL_CONST));
16575
16576   tree int_ftype_opaque
16577     = build_function_type_list (integer_type_node,
16578                                 opaque_V4SI_type_node, NULL_TREE);
16579   tree opaque_ftype_opaque
16580     = build_function_type_list (integer_type_node, NULL_TREE);
16581   tree opaque_ftype_opaque_int
16582     = build_function_type_list (opaque_V4SI_type_node,
16583                                 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
16584   tree opaque_ftype_opaque_opaque_int
16585     = build_function_type_list (opaque_V4SI_type_node,
16586                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
16587                                 integer_type_node, NULL_TREE);
16588   tree opaque_ftype_opaque_opaque_opaque
16589     = build_function_type_list (opaque_V4SI_type_node,
16590                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
16591                                 opaque_V4SI_type_node, NULL_TREE);
16592   tree opaque_ftype_opaque_opaque
16593     = build_function_type_list (opaque_V4SI_type_node,
16594                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
16595                                 NULL_TREE);
16596   tree int_ftype_int_opaque_opaque
16597     = build_function_type_list (integer_type_node,
16598                                 integer_type_node, opaque_V4SI_type_node,
16599                                 opaque_V4SI_type_node, NULL_TREE);
16600   tree int_ftype_int_v4si_v4si
16601     = build_function_type_list (integer_type_node,
16602                                 integer_type_node, V4SI_type_node,
16603                                 V4SI_type_node, NULL_TREE);
16604   tree int_ftype_int_v2di_v2di
16605     = build_function_type_list (integer_type_node,
16606                                 integer_type_node, V2DI_type_node,
16607                                 V2DI_type_node, NULL_TREE);
16608   tree void_ftype_v4si
16609     = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
16610   tree v8hi_ftype_void
16611     = build_function_type_list (V8HI_type_node, NULL_TREE);
16612   tree void_ftype_void
16613     = build_function_type_list (void_type_node, NULL_TREE);
16614   tree void_ftype_int
16615     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
16616
16617   tree opaque_ftype_long_pcvoid
16618     = build_function_type_list (opaque_V4SI_type_node,
16619                                 long_integer_type_node, pcvoid_type_node,
16620                                 NULL_TREE);
16621   tree v16qi_ftype_long_pcvoid
16622     = build_function_type_list (V16QI_type_node,
16623                                 long_integer_type_node, pcvoid_type_node,
16624                                 NULL_TREE);
16625   tree v8hi_ftype_long_pcvoid
16626     = build_function_type_list (V8HI_type_node,
16627                                 long_integer_type_node, pcvoid_type_node,
16628                                 NULL_TREE);
16629   tree v4si_ftype_long_pcvoid
16630     = build_function_type_list (V4SI_type_node,
16631                                 long_integer_type_node, pcvoid_type_node,
16632                                 NULL_TREE);
16633   tree v4sf_ftype_long_pcvoid
16634     = build_function_type_list (V4SF_type_node,
16635                                 long_integer_type_node, pcvoid_type_node,
16636                                 NULL_TREE);
16637   tree v2df_ftype_long_pcvoid
16638     = build_function_type_list (V2DF_type_node,
16639                                 long_integer_type_node, pcvoid_type_node,
16640                                 NULL_TREE);
16641   tree v2di_ftype_long_pcvoid
16642     = build_function_type_list (V2DI_type_node,
16643                                 long_integer_type_node, pcvoid_type_node,
16644                                 NULL_TREE);
16645   tree v1ti_ftype_long_pcvoid
16646     = build_function_type_list (V1TI_type_node,
16647                                 long_integer_type_node, pcvoid_type_node,
16648                                 NULL_TREE);
16649
16650   tree void_ftype_opaque_long_pvoid
16651     = build_function_type_list (void_type_node,
16652                                 opaque_V4SI_type_node, long_integer_type_node,
16653                                 pvoid_type_node, NULL_TREE);
16654   tree void_ftype_v4si_long_pvoid
16655     = build_function_type_list (void_type_node,
16656                                 V4SI_type_node, long_integer_type_node,
16657                                 pvoid_type_node, NULL_TREE);
16658   tree void_ftype_v16qi_long_pvoid
16659     = build_function_type_list (void_type_node,
16660                                 V16QI_type_node, long_integer_type_node,
16661                                 pvoid_type_node, NULL_TREE);
16662
16663   tree void_ftype_v16qi_pvoid_long
16664     = build_function_type_list (void_type_node,
16665                                 V16QI_type_node, pvoid_type_node,
16666                                 long_integer_type_node, NULL_TREE);
16667
16668   tree void_ftype_v8hi_long_pvoid
16669     = build_function_type_list (void_type_node,
16670                                 V8HI_type_node, long_integer_type_node,
16671                                 pvoid_type_node, NULL_TREE);
16672   tree void_ftype_v4sf_long_pvoid
16673     = build_function_type_list (void_type_node,
16674                                 V4SF_type_node, long_integer_type_node,
16675                                 pvoid_type_node, NULL_TREE);
16676   tree void_ftype_v2df_long_pvoid
16677     = build_function_type_list (void_type_node,
16678                                 V2DF_type_node, long_integer_type_node,
16679                                 pvoid_type_node, NULL_TREE);
16680   tree void_ftype_v1ti_long_pvoid
16681     = build_function_type_list (void_type_node,
16682                                 V1TI_type_node, long_integer_type_node,
16683                                 pvoid_type_node, NULL_TREE);
16684   tree void_ftype_v2di_long_pvoid
16685     = build_function_type_list (void_type_node,
16686                                 V2DI_type_node, long_integer_type_node,
16687                                 pvoid_type_node, NULL_TREE);
16688   tree int_ftype_int_v8hi_v8hi
16689     = build_function_type_list (integer_type_node,
16690                                 integer_type_node, V8HI_type_node,
16691                                 V8HI_type_node, NULL_TREE);
16692   tree int_ftype_int_v16qi_v16qi
16693     = build_function_type_list (integer_type_node,
16694                                 integer_type_node, V16QI_type_node,
16695                                 V16QI_type_node, NULL_TREE);
16696   tree int_ftype_int_v4sf_v4sf
16697     = build_function_type_list (integer_type_node,
16698                                 integer_type_node, V4SF_type_node,
16699                                 V4SF_type_node, NULL_TREE);
16700   tree int_ftype_int_v2df_v2df
16701     = build_function_type_list (integer_type_node,
16702                                 integer_type_node, V2DF_type_node,
16703                                 V2DF_type_node, NULL_TREE);
16704   tree v2di_ftype_v2di
16705     = build_function_type_list (V2DI_type_node, V2DI_type_node, NULL_TREE);
16706   tree v4si_ftype_v4si
16707     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
16708   tree v8hi_ftype_v8hi
16709     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
16710   tree v16qi_ftype_v16qi
16711     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
16712   tree v4sf_ftype_v4sf
16713     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
16714   tree v2df_ftype_v2df
16715     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
16716   tree void_ftype_pcvoid_int_int
16717     = build_function_type_list (void_type_node,
16718                                 pcvoid_type_node, integer_type_node,
16719                                 integer_type_node, NULL_TREE);
16720
16721   def_builtin ("__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
16722   def_builtin ("__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
16723   def_builtin ("__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
16724   def_builtin ("__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
16725   def_builtin ("__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
16726   def_builtin ("__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
16727   def_builtin ("__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
16728   def_builtin ("__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
16729   def_builtin ("__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
16730   def_builtin ("__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
16731   def_builtin ("__builtin_altivec_lvxl_v2df", v2df_ftype_long_pcvoid,
16732                ALTIVEC_BUILTIN_LVXL_V2DF);
16733   def_builtin ("__builtin_altivec_lvxl_v2di", v2di_ftype_long_pcvoid,
16734                ALTIVEC_BUILTIN_LVXL_V2DI);
16735   def_builtin ("__builtin_altivec_lvxl_v4sf", v4sf_ftype_long_pcvoid,
16736                ALTIVEC_BUILTIN_LVXL_V4SF);
16737   def_builtin ("__builtin_altivec_lvxl_v4si", v4si_ftype_long_pcvoid,
16738                ALTIVEC_BUILTIN_LVXL_V4SI);
16739   def_builtin ("__builtin_altivec_lvxl_v8hi", v8hi_ftype_long_pcvoid,
16740                ALTIVEC_BUILTIN_LVXL_V8HI);
16741   def_builtin ("__builtin_altivec_lvxl_v16qi", v16qi_ftype_long_pcvoid,
16742                ALTIVEC_BUILTIN_LVXL_V16QI);
16743   def_builtin ("__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
16744   def_builtin ("__builtin_altivec_lvx_v1ti", v1ti_ftype_long_pcvoid,
16745                ALTIVEC_BUILTIN_LVX_V1TI);
16746   def_builtin ("__builtin_altivec_lvx_v2df", v2df_ftype_long_pcvoid,
16747                ALTIVEC_BUILTIN_LVX_V2DF);
16748   def_builtin ("__builtin_altivec_lvx_v2di", v2di_ftype_long_pcvoid,
16749                ALTIVEC_BUILTIN_LVX_V2DI);
16750   def_builtin ("__builtin_altivec_lvx_v4sf", v4sf_ftype_long_pcvoid,
16751                ALTIVEC_BUILTIN_LVX_V4SF);
16752   def_builtin ("__builtin_altivec_lvx_v4si", v4si_ftype_long_pcvoid,
16753                ALTIVEC_BUILTIN_LVX_V4SI);
16754   def_builtin ("__builtin_altivec_lvx_v8hi", v8hi_ftype_long_pcvoid,
16755                ALTIVEC_BUILTIN_LVX_V8HI);
16756   def_builtin ("__builtin_altivec_lvx_v16qi", v16qi_ftype_long_pcvoid,
16757                ALTIVEC_BUILTIN_LVX_V16QI);
16758   def_builtin ("__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
16759   def_builtin ("__builtin_altivec_stvx_v2df", void_ftype_v2df_long_pvoid,
16760                ALTIVEC_BUILTIN_STVX_V2DF);
16761   def_builtin ("__builtin_altivec_stvx_v2di", void_ftype_v2di_long_pvoid,
16762                ALTIVEC_BUILTIN_STVX_V2DI);
16763   def_builtin ("__builtin_altivec_stvx_v4sf", void_ftype_v4sf_long_pvoid,
16764                ALTIVEC_BUILTIN_STVX_V4SF);
16765   def_builtin ("__builtin_altivec_stvx_v4si", void_ftype_v4si_long_pvoid,
16766                ALTIVEC_BUILTIN_STVX_V4SI);
16767   def_builtin ("__builtin_altivec_stvx_v8hi", void_ftype_v8hi_long_pvoid,
16768                ALTIVEC_BUILTIN_STVX_V8HI);
16769   def_builtin ("__builtin_altivec_stvx_v16qi", void_ftype_v16qi_long_pvoid,
16770                ALTIVEC_BUILTIN_STVX_V16QI);
16771   def_builtin ("__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
16772   def_builtin ("__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
16773   def_builtin ("__builtin_altivec_stvxl_v2df", void_ftype_v2df_long_pvoid,
16774                ALTIVEC_BUILTIN_STVXL_V2DF);
16775   def_builtin ("__builtin_altivec_stvxl_v2di", void_ftype_v2di_long_pvoid,
16776                ALTIVEC_BUILTIN_STVXL_V2DI);
16777   def_builtin ("__builtin_altivec_stvxl_v4sf", void_ftype_v4sf_long_pvoid,
16778                ALTIVEC_BUILTIN_STVXL_V4SF);
16779   def_builtin ("__builtin_altivec_stvxl_v4si", void_ftype_v4si_long_pvoid,
16780                ALTIVEC_BUILTIN_STVXL_V4SI);
16781   def_builtin ("__builtin_altivec_stvxl_v8hi", void_ftype_v8hi_long_pvoid,
16782                ALTIVEC_BUILTIN_STVXL_V8HI);
16783   def_builtin ("__builtin_altivec_stvxl_v16qi", void_ftype_v16qi_long_pvoid,
16784                ALTIVEC_BUILTIN_STVXL_V16QI);
16785   def_builtin ("__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
16786   def_builtin ("__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
16787   def_builtin ("__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
16788   def_builtin ("__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
16789   def_builtin ("__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
16790   def_builtin ("__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
16791   def_builtin ("__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
16792   def_builtin ("__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
16793   def_builtin ("__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
16794   def_builtin ("__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
16795   def_builtin ("__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
16796   def_builtin ("__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
16797   def_builtin ("__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
16798   def_builtin ("__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
16799   def_builtin ("__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
16800   def_builtin ("__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
16801
16802   def_builtin ("__builtin_vsx_lxvd2x_v2df", v2df_ftype_long_pcvoid,
16803                VSX_BUILTIN_LXVD2X_V2DF);
16804   def_builtin ("__builtin_vsx_lxvd2x_v2di", v2di_ftype_long_pcvoid,
16805                VSX_BUILTIN_LXVD2X_V2DI);
16806   def_builtin ("__builtin_vsx_lxvw4x_v4sf", v4sf_ftype_long_pcvoid,
16807                VSX_BUILTIN_LXVW4X_V4SF);
16808   def_builtin ("__builtin_vsx_lxvw4x_v4si", v4si_ftype_long_pcvoid,
16809                VSX_BUILTIN_LXVW4X_V4SI);
16810   def_builtin ("__builtin_vsx_lxvw4x_v8hi", v8hi_ftype_long_pcvoid,
16811                VSX_BUILTIN_LXVW4X_V8HI);
16812   def_builtin ("__builtin_vsx_lxvw4x_v16qi", v16qi_ftype_long_pcvoid,
16813                VSX_BUILTIN_LXVW4X_V16QI);
16814   def_builtin ("__builtin_vsx_stxvd2x_v2df", void_ftype_v2df_long_pvoid,
16815                VSX_BUILTIN_STXVD2X_V2DF);
16816   def_builtin ("__builtin_vsx_stxvd2x_v2di", void_ftype_v2di_long_pvoid,
16817                VSX_BUILTIN_STXVD2X_V2DI);
16818   def_builtin ("__builtin_vsx_stxvw4x_v4sf", void_ftype_v4sf_long_pvoid,
16819                VSX_BUILTIN_STXVW4X_V4SF);
16820   def_builtin ("__builtin_vsx_stxvw4x_v4si", void_ftype_v4si_long_pvoid,
16821                VSX_BUILTIN_STXVW4X_V4SI);
16822   def_builtin ("__builtin_vsx_stxvw4x_v8hi", void_ftype_v8hi_long_pvoid,
16823                VSX_BUILTIN_STXVW4X_V8HI);
16824   def_builtin ("__builtin_vsx_stxvw4x_v16qi", void_ftype_v16qi_long_pvoid,
16825                VSX_BUILTIN_STXVW4X_V16QI);
16826
16827   def_builtin ("__builtin_vsx_ld_elemrev_v2df", v2df_ftype_long_pcvoid,
16828                VSX_BUILTIN_LD_ELEMREV_V2DF);
16829   def_builtin ("__builtin_vsx_ld_elemrev_v2di", v2di_ftype_long_pcvoid,
16830                VSX_BUILTIN_LD_ELEMREV_V2DI);
16831   def_builtin ("__builtin_vsx_ld_elemrev_v4sf", v4sf_ftype_long_pcvoid,
16832                VSX_BUILTIN_LD_ELEMREV_V4SF);
16833   def_builtin ("__builtin_vsx_ld_elemrev_v4si", v4si_ftype_long_pcvoid,
16834                VSX_BUILTIN_LD_ELEMREV_V4SI);
16835   def_builtin ("__builtin_vsx_ld_elemrev_v8hi", v8hi_ftype_long_pcvoid,
16836                VSX_BUILTIN_LD_ELEMREV_V8HI);
16837   def_builtin ("__builtin_vsx_ld_elemrev_v16qi", v16qi_ftype_long_pcvoid,
16838                VSX_BUILTIN_LD_ELEMREV_V16QI);
16839   def_builtin ("__builtin_vsx_st_elemrev_v2df", void_ftype_v2df_long_pvoid,
16840                VSX_BUILTIN_ST_ELEMREV_V2DF);
16841   def_builtin ("__builtin_vsx_st_elemrev_v1ti", void_ftype_v1ti_long_pvoid,
16842                VSX_BUILTIN_ST_ELEMREV_V1TI);
16843   def_builtin ("__builtin_vsx_st_elemrev_v2di", void_ftype_v2di_long_pvoid,
16844                VSX_BUILTIN_ST_ELEMREV_V2DI);
16845   def_builtin ("__builtin_vsx_st_elemrev_v4sf", void_ftype_v4sf_long_pvoid,
16846                VSX_BUILTIN_ST_ELEMREV_V4SF);
16847   def_builtin ("__builtin_vsx_st_elemrev_v4si", void_ftype_v4si_long_pvoid,
16848                VSX_BUILTIN_ST_ELEMREV_V4SI);
16849   def_builtin ("__builtin_vsx_st_elemrev_v8hi", void_ftype_v8hi_long_pvoid,
16850                VSX_BUILTIN_ST_ELEMREV_V8HI);
16851   def_builtin ("__builtin_vsx_st_elemrev_v16qi", void_ftype_v16qi_long_pvoid,
16852                VSX_BUILTIN_ST_ELEMREV_V16QI);
16853
16854   def_builtin ("__builtin_vec_vsx_ld", opaque_ftype_long_pcvoid,
16855                VSX_BUILTIN_VEC_LD);
16856   def_builtin ("__builtin_vec_vsx_st", void_ftype_opaque_long_pvoid,
16857                VSX_BUILTIN_VEC_ST);
16858   def_builtin ("__builtin_vec_xl", opaque_ftype_long_pcvoid,
16859                VSX_BUILTIN_VEC_XL);
16860   def_builtin ("__builtin_vec_xl_be", opaque_ftype_long_pcvoid,
16861                VSX_BUILTIN_VEC_XL_BE);
16862   def_builtin ("__builtin_vec_xst", void_ftype_opaque_long_pvoid,
16863                VSX_BUILTIN_VEC_XST);
16864   def_builtin ("__builtin_vec_xst_be", void_ftype_opaque_long_pvoid,
16865                VSX_BUILTIN_VEC_XST_BE);
16866
16867   def_builtin ("__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
16868   def_builtin ("__builtin_vec_splats", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_SPLATS);
16869   def_builtin ("__builtin_vec_promote", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_PROMOTE);
16870
16871   def_builtin ("__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
16872   def_builtin ("__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
16873   def_builtin ("__builtin_vec_extract", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_EXTRACT);
16874   def_builtin ("__builtin_vec_insert", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_INSERT);
16875   def_builtin ("__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
16876   def_builtin ("__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
16877   def_builtin ("__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
16878   def_builtin ("__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
16879   def_builtin ("__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
16880   def_builtin ("__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
16881   def_builtin ("__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
16882   def_builtin ("__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
16883
16884   def_builtin ("__builtin_vec_adde", opaque_ftype_opaque_opaque_opaque,
16885                 ALTIVEC_BUILTIN_VEC_ADDE);
16886   def_builtin ("__builtin_vec_addec", opaque_ftype_opaque_opaque_opaque,
16887                 ALTIVEC_BUILTIN_VEC_ADDEC);
16888   def_builtin ("__builtin_vec_cmpne", opaque_ftype_opaque_opaque,
16889                 ALTIVEC_BUILTIN_VEC_CMPNE);
16890   def_builtin ("__builtin_vec_mul", opaque_ftype_opaque_opaque,
16891                 ALTIVEC_BUILTIN_VEC_MUL);
16892   def_builtin ("__builtin_vec_sube", opaque_ftype_opaque_opaque_opaque,
16893                 ALTIVEC_BUILTIN_VEC_SUBE);
16894   def_builtin ("__builtin_vec_subec", opaque_ftype_opaque_opaque_opaque,
16895                 ALTIVEC_BUILTIN_VEC_SUBEC);
16896
16897   /* Cell builtins.  */
16898   def_builtin ("__builtin_altivec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLX);
16899   def_builtin ("__builtin_altivec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLXL);
16900   def_builtin ("__builtin_altivec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRX);
16901   def_builtin ("__builtin_altivec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRXL);
16902
16903   def_builtin ("__builtin_vec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLX);
16904   def_builtin ("__builtin_vec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLXL);
16905   def_builtin ("__builtin_vec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRX);
16906   def_builtin ("__builtin_vec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRXL);
16907
16908   def_builtin ("__builtin_altivec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLX);
16909   def_builtin ("__builtin_altivec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLXL);
16910   def_builtin ("__builtin_altivec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRX);
16911   def_builtin ("__builtin_altivec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRXL);
16912
16913   def_builtin ("__builtin_vec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLX);
16914   def_builtin ("__builtin_vec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLXL);
16915   def_builtin ("__builtin_vec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRX);
16916   def_builtin ("__builtin_vec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRXL);
16917
16918   if (TARGET_P9_VECTOR)
16919     {
16920       def_builtin ("__builtin_altivec_stxvl", void_ftype_v16qi_pvoid_long,
16921                    P9V_BUILTIN_STXVL);
16922       def_builtin ("__builtin_xst_len_r", void_ftype_v16qi_pvoid_long,
16923                    P9V_BUILTIN_XST_LEN_R);
16924     }
16925
16926   /* Add the DST variants.  */
16927   d = bdesc_dst;
16928   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
16929     {
16930       HOST_WIDE_INT mask = d->mask;
16931
16932       /* It is expected that these dst built-in functions may have
16933          d->icode equal to CODE_FOR_nothing.  */
16934       if ((mask & builtin_mask) != mask)
16935         {
16936           if (TARGET_DEBUG_BUILTIN)
16937             fprintf (stderr, "altivec_init_builtins, skip dst %s\n",
16938                      d->name);
16939           continue;
16940         }
16941       def_builtin (d->name, void_ftype_pcvoid_int_int, d->code);
16942     }
16943
16944   /* Initialize the predicates.  */
16945   d = bdesc_altivec_preds;
16946   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, d++)
16947     {
16948       machine_mode mode1;
16949       tree type;
16950       HOST_WIDE_INT mask = d->mask;
16951
16952       if ((mask & builtin_mask) != mask)
16953         {
16954           if (TARGET_DEBUG_BUILTIN)
16955             fprintf (stderr, "altivec_init_builtins, skip predicate %s\n",
16956                      d->name);
16957           continue;
16958         }
16959
16960       if (rs6000_overloaded_builtin_p (d->code))
16961         mode1 = VOIDmode;
16962       else
16963         {
16964           /* Cannot define builtin if the instruction is disabled.  */
16965           gcc_assert (d->icode != CODE_FOR_nothing);
16966           mode1 = insn_data[d->icode].operand[1].mode;
16967         }
16968
16969       switch (mode1)
16970         {
16971         case E_VOIDmode:
16972           type = int_ftype_int_opaque_opaque;
16973           break;
16974         case E_V2DImode:
16975           type = int_ftype_int_v2di_v2di;
16976           break;
16977         case E_V4SImode:
16978           type = int_ftype_int_v4si_v4si;
16979           break;
16980         case E_V8HImode:
16981           type = int_ftype_int_v8hi_v8hi;
16982           break;
16983         case E_V16QImode:
16984           type = int_ftype_int_v16qi_v16qi;
16985           break;
16986         case E_V4SFmode:
16987           type = int_ftype_int_v4sf_v4sf;
16988           break;
16989         case E_V2DFmode:
16990           type = int_ftype_int_v2df_v2df;
16991           break;
16992         default:
16993           gcc_unreachable ();
16994         }
16995
16996       def_builtin (d->name, type, d->code);
16997     }
16998
16999   /* Initialize the abs* operators.  */
17000   d = bdesc_abs;
17001   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
17002     {
17003       machine_mode mode0;
17004       tree type;
17005       HOST_WIDE_INT mask = d->mask;
17006
17007       if ((mask & builtin_mask) != mask)
17008         {
17009           if (TARGET_DEBUG_BUILTIN)
17010             fprintf (stderr, "altivec_init_builtins, skip abs %s\n",
17011                      d->name);
17012           continue;
17013         }
17014
17015       /* Cannot define builtin if the instruction is disabled.  */
17016       gcc_assert (d->icode != CODE_FOR_nothing);
17017       mode0 = insn_data[d->icode].operand[0].mode;
17018
17019       switch (mode0)
17020         {
17021         case E_V2DImode:
17022           type = v2di_ftype_v2di;
17023           break;
17024         case E_V4SImode:
17025           type = v4si_ftype_v4si;
17026           break;
17027         case E_V8HImode:
17028           type = v8hi_ftype_v8hi;
17029           break;
17030         case E_V16QImode:
17031           type = v16qi_ftype_v16qi;
17032           break;
17033         case E_V4SFmode:
17034           type = v4sf_ftype_v4sf;
17035           break;
17036         case E_V2DFmode:
17037           type = v2df_ftype_v2df;
17038           break;
17039         default:
17040           gcc_unreachable ();
17041         }
17042
17043       def_builtin (d->name, type, d->code);
17044     }
17045
17046   /* Initialize target builtin that implements
17047      targetm.vectorize.builtin_mask_for_load.  */
17048
17049   decl = add_builtin_function ("__builtin_altivec_mask_for_load",
17050                                v16qi_ftype_long_pcvoid,
17051                                ALTIVEC_BUILTIN_MASK_FOR_LOAD,
17052                                BUILT_IN_MD, NULL, NULL_TREE);
17053   TREE_READONLY (decl) = 1;
17054   /* Record the decl. Will be used by rs6000_builtin_mask_for_load.  */
17055   altivec_builtin_mask_for_load = decl;
17056
17057   /* Access to the vec_init patterns.  */
17058   ftype = build_function_type_list (V4SI_type_node, integer_type_node,
17059                                     integer_type_node, integer_type_node,
17060                                     integer_type_node, NULL_TREE);
17061   def_builtin ("__builtin_vec_init_v4si", ftype, ALTIVEC_BUILTIN_VEC_INIT_V4SI);
17062
17063   ftype = build_function_type_list (V8HI_type_node, short_integer_type_node,
17064                                     short_integer_type_node,
17065                                     short_integer_type_node,
17066                                     short_integer_type_node,
17067                                     short_integer_type_node,
17068                                     short_integer_type_node,
17069                                     short_integer_type_node,
17070                                     short_integer_type_node, NULL_TREE);
17071   def_builtin ("__builtin_vec_init_v8hi", ftype, ALTIVEC_BUILTIN_VEC_INIT_V8HI);
17072
17073   ftype = build_function_type_list (V16QI_type_node, char_type_node,
17074                                     char_type_node, char_type_node,
17075                                     char_type_node, char_type_node,
17076                                     char_type_node, char_type_node,
17077                                     char_type_node, char_type_node,
17078                                     char_type_node, char_type_node,
17079                                     char_type_node, char_type_node,
17080                                     char_type_node, char_type_node,
17081                                     char_type_node, NULL_TREE);
17082   def_builtin ("__builtin_vec_init_v16qi", ftype,
17083                ALTIVEC_BUILTIN_VEC_INIT_V16QI);
17084
17085   ftype = build_function_type_list (V4SF_type_node, float_type_node,
17086                                     float_type_node, float_type_node,
17087                                     float_type_node, NULL_TREE);
17088   def_builtin ("__builtin_vec_init_v4sf", ftype, ALTIVEC_BUILTIN_VEC_INIT_V4SF);
17089
17090   /* VSX builtins.  */
17091   ftype = build_function_type_list (V2DF_type_node, double_type_node,
17092                                     double_type_node, NULL_TREE);
17093   def_builtin ("__builtin_vec_init_v2df", ftype, VSX_BUILTIN_VEC_INIT_V2DF);
17094
17095   ftype = build_function_type_list (V2DI_type_node, intDI_type_node,
17096                                     intDI_type_node, NULL_TREE);
17097   def_builtin ("__builtin_vec_init_v2di", ftype, VSX_BUILTIN_VEC_INIT_V2DI);
17098
17099   /* Access to the vec_set patterns.  */
17100   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
17101                                     intSI_type_node,
17102                                     integer_type_node, NULL_TREE);
17103   def_builtin ("__builtin_vec_set_v4si", ftype, ALTIVEC_BUILTIN_VEC_SET_V4SI);
17104
17105   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
17106                                     intHI_type_node,
17107                                     integer_type_node, NULL_TREE);
17108   def_builtin ("__builtin_vec_set_v8hi", ftype, ALTIVEC_BUILTIN_VEC_SET_V8HI);
17109
17110   ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
17111                                     intQI_type_node,
17112                                     integer_type_node, NULL_TREE);
17113   def_builtin ("__builtin_vec_set_v16qi", ftype, ALTIVEC_BUILTIN_VEC_SET_V16QI);
17114
17115   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
17116                                     float_type_node,
17117                                     integer_type_node, NULL_TREE);
17118   def_builtin ("__builtin_vec_set_v4sf", ftype, ALTIVEC_BUILTIN_VEC_SET_V4SF);
17119
17120   ftype = build_function_type_list (V2DF_type_node, V2DF_type_node,
17121                                     double_type_node,
17122                                     integer_type_node, NULL_TREE);
17123   def_builtin ("__builtin_vec_set_v2df", ftype, VSX_BUILTIN_VEC_SET_V2DF);
17124
17125   ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
17126                                     intDI_type_node,
17127                                     integer_type_node, NULL_TREE);
17128   def_builtin ("__builtin_vec_set_v2di", ftype, VSX_BUILTIN_VEC_SET_V2DI);
17129
17130   /* Access to the vec_extract patterns.  */
17131   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
17132                                     integer_type_node, NULL_TREE);
17133   def_builtin ("__builtin_vec_ext_v4si", ftype, ALTIVEC_BUILTIN_VEC_EXT_V4SI);
17134
17135   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
17136                                     integer_type_node, NULL_TREE);
17137   def_builtin ("__builtin_vec_ext_v8hi", ftype, ALTIVEC_BUILTIN_VEC_EXT_V8HI);
17138
17139   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
17140                                     integer_type_node, NULL_TREE);
17141   def_builtin ("__builtin_vec_ext_v16qi", ftype, ALTIVEC_BUILTIN_VEC_EXT_V16QI);
17142
17143   ftype = build_function_type_list (float_type_node, V4SF_type_node,
17144                                     integer_type_node, NULL_TREE);
17145   def_builtin ("__builtin_vec_ext_v4sf", ftype, ALTIVEC_BUILTIN_VEC_EXT_V4SF);
17146
17147   ftype = build_function_type_list (double_type_node, V2DF_type_node,
17148                                     integer_type_node, NULL_TREE);
17149   def_builtin ("__builtin_vec_ext_v2df", ftype, VSX_BUILTIN_VEC_EXT_V2DF);
17150
17151   ftype = build_function_type_list (intDI_type_node, V2DI_type_node,
17152                                     integer_type_node, NULL_TREE);
17153   def_builtin ("__builtin_vec_ext_v2di", ftype, VSX_BUILTIN_VEC_EXT_V2DI);
17154
17155
17156   if (V1TI_type_node)
17157     {
17158       tree v1ti_ftype_long_pcvoid
17159         = build_function_type_list (V1TI_type_node,
17160                                     long_integer_type_node, pcvoid_type_node,
17161                                     NULL_TREE);
17162       tree void_ftype_v1ti_long_pvoid
17163         = build_function_type_list (void_type_node,
17164                                     V1TI_type_node, long_integer_type_node,
17165                                     pvoid_type_node, NULL_TREE);
17166       def_builtin ("__builtin_vsx_ld_elemrev_v1ti", v1ti_ftype_long_pcvoid,
17167                    VSX_BUILTIN_LD_ELEMREV_V1TI);
17168       def_builtin ("__builtin_vsx_lxvd2x_v1ti", v1ti_ftype_long_pcvoid,
17169                    VSX_BUILTIN_LXVD2X_V1TI);
17170       def_builtin ("__builtin_vsx_stxvd2x_v1ti", void_ftype_v1ti_long_pvoid,
17171                    VSX_BUILTIN_STXVD2X_V1TI);
17172       ftype = build_function_type_list (V1TI_type_node, intTI_type_node,
17173                                         NULL_TREE, NULL_TREE);
17174       def_builtin ("__builtin_vec_init_v1ti", ftype, VSX_BUILTIN_VEC_INIT_V1TI);
17175       ftype = build_function_type_list (V1TI_type_node, V1TI_type_node,
17176                                         intTI_type_node,
17177                                         integer_type_node, NULL_TREE);
17178       def_builtin ("__builtin_vec_set_v1ti", ftype, VSX_BUILTIN_VEC_SET_V1TI);
17179       ftype = build_function_type_list (intTI_type_node, V1TI_type_node,
17180                                         integer_type_node, NULL_TREE);
17181       def_builtin ("__builtin_vec_ext_v1ti", ftype, VSX_BUILTIN_VEC_EXT_V1TI);
17182     }
17183
17184 }
17185
17186 static void
17187 htm_init_builtins (void)
17188 {
17189   HOST_WIDE_INT builtin_mask = rs6000_builtin_mask;
17190   const struct builtin_description *d;
17191   size_t i;
17192
17193   d = bdesc_htm;
17194   for (i = 0; i < ARRAY_SIZE (bdesc_htm); i++, d++)
17195     {
17196       tree op[MAX_HTM_OPERANDS], type;
17197       HOST_WIDE_INT mask = d->mask;
17198       unsigned attr = rs6000_builtin_info[d->code].attr;
17199       bool void_func = (attr & RS6000_BTC_VOID);
17200       int attr_args = (attr & RS6000_BTC_TYPE_MASK);
17201       int nopnds = 0;
17202       tree gpr_type_node;
17203       tree rettype;
17204       tree argtype;
17205
17206       /* It is expected that these htm built-in functions may have
17207          d->icode equal to CODE_FOR_nothing.  */
17208
17209       if (TARGET_32BIT && TARGET_POWERPC64)
17210         gpr_type_node = long_long_unsigned_type_node;
17211       else
17212         gpr_type_node = long_unsigned_type_node;
17213
17214       if (attr & RS6000_BTC_SPR)
17215         {
17216           rettype = gpr_type_node;
17217           argtype = gpr_type_node;
17218         }
17219       else if (d->code == HTM_BUILTIN_TABORTDC
17220                || d->code == HTM_BUILTIN_TABORTDCI)
17221         {
17222           rettype = unsigned_type_node;
17223           argtype = gpr_type_node;
17224         }
17225       else
17226         {
17227           rettype = unsigned_type_node;
17228           argtype = unsigned_type_node;
17229         }
17230
17231       if ((mask & builtin_mask) != mask)
17232         {
17233           if (TARGET_DEBUG_BUILTIN)
17234             fprintf (stderr, "htm_builtin, skip binary %s\n", d->name);
17235           continue;
17236         }
17237
17238       if (d->name == 0)
17239         {
17240           if (TARGET_DEBUG_BUILTIN)
17241             fprintf (stderr, "htm_builtin, bdesc_htm[%ld] no name\n",
17242                      (long unsigned) i);
17243           continue;
17244         }
17245
17246       op[nopnds++] = (void_func) ? void_type_node : rettype;
17247
17248       if (attr_args == RS6000_BTC_UNARY)
17249         op[nopnds++] = argtype;
17250       else if (attr_args == RS6000_BTC_BINARY)
17251         {
17252           op[nopnds++] = argtype;
17253           op[nopnds++] = argtype;
17254         }
17255       else if (attr_args == RS6000_BTC_TERNARY)
17256         {
17257           op[nopnds++] = argtype;
17258           op[nopnds++] = argtype;
17259           op[nopnds++] = argtype;
17260         }
17261
17262       switch (nopnds)
17263         {
17264         case 1:
17265           type = build_function_type_list (op[0], NULL_TREE);
17266           break;
17267         case 2:
17268           type = build_function_type_list (op[0], op[1], NULL_TREE);
17269           break;
17270         case 3:
17271           type = build_function_type_list (op[0], op[1], op[2], NULL_TREE);
17272           break;
17273         case 4:
17274           type = build_function_type_list (op[0], op[1], op[2], op[3],
17275                                            NULL_TREE);
17276           break;
17277         default:
17278           gcc_unreachable ();
17279         }
17280
17281       def_builtin (d->name, type, d->code);
17282     }
17283 }
17284
17285 /* Hash function for builtin functions with up to 3 arguments and a return
17286    type.  */
17287 hashval_t
17288 builtin_hasher::hash (builtin_hash_struct *bh)
17289 {
17290   unsigned ret = 0;
17291   int i;
17292
17293   for (i = 0; i < 4; i++)
17294     {
17295       ret = (ret * (unsigned)MAX_MACHINE_MODE) + ((unsigned)bh->mode[i]);
17296       ret = (ret * 2) + bh->uns_p[i];
17297     }
17298
17299   return ret;
17300 }
17301
17302 /* Compare builtin hash entries H1 and H2 for equivalence.  */
17303 bool
17304 builtin_hasher::equal (builtin_hash_struct *p1, builtin_hash_struct *p2)
17305 {
17306   return ((p1->mode[0] == p2->mode[0])
17307           && (p1->mode[1] == p2->mode[1])
17308           && (p1->mode[2] == p2->mode[2])
17309           && (p1->mode[3] == p2->mode[3])
17310           && (p1->uns_p[0] == p2->uns_p[0])
17311           && (p1->uns_p[1] == p2->uns_p[1])
17312           && (p1->uns_p[2] == p2->uns_p[2])
17313           && (p1->uns_p[3] == p2->uns_p[3]));
17314 }
17315
17316 /* Map types for builtin functions with an explicit return type and up to 3
17317    arguments.  Functions with fewer than 3 arguments use VOIDmode as the type
17318    of the argument.  */
17319 static tree
17320 builtin_function_type (machine_mode mode_ret, machine_mode mode_arg0,
17321                        machine_mode mode_arg1, machine_mode mode_arg2,
17322                        enum rs6000_builtins builtin, const char *name)
17323 {
17324   struct builtin_hash_struct h;
17325   struct builtin_hash_struct *h2;
17326   int num_args = 3;
17327   int i;
17328   tree ret_type = NULL_TREE;
17329   tree arg_type[3] = { NULL_TREE, NULL_TREE, NULL_TREE };
17330
17331   /* Create builtin_hash_table.  */
17332   if (builtin_hash_table == NULL)
17333     builtin_hash_table = hash_table<builtin_hasher>::create_ggc (1500);
17334
17335   h.type = NULL_TREE;
17336   h.mode[0] = mode_ret;
17337   h.mode[1] = mode_arg0;
17338   h.mode[2] = mode_arg1;
17339   h.mode[3] = mode_arg2;
17340   h.uns_p[0] = 0;
17341   h.uns_p[1] = 0;
17342   h.uns_p[2] = 0;
17343   h.uns_p[3] = 0;
17344
17345   /* If the builtin is a type that produces unsigned results or takes unsigned
17346      arguments, and it is returned as a decl for the vectorizer (such as
17347      widening multiplies, permute), make sure the arguments and return value
17348      are type correct.  */
17349   switch (builtin)
17350     {
17351     /* unsigned 1 argument functions.  */
17352     case CRYPTO_BUILTIN_VSBOX:
17353     case CRYPTO_BUILTIN_VSBOX_BE:
17354     case P8V_BUILTIN_VGBBD:
17355     case MISC_BUILTIN_CDTBCD:
17356     case MISC_BUILTIN_CBCDTD:
17357       h.uns_p[0] = 1;
17358       h.uns_p[1] = 1;
17359       break;
17360
17361     /* unsigned 2 argument functions.  */
17362     case ALTIVEC_BUILTIN_VMULEUB:
17363     case ALTIVEC_BUILTIN_VMULEUH:
17364     case P8V_BUILTIN_VMULEUW:
17365     case ALTIVEC_BUILTIN_VMULOUB:
17366     case ALTIVEC_BUILTIN_VMULOUH:
17367     case P8V_BUILTIN_VMULOUW:
17368     case CRYPTO_BUILTIN_VCIPHER:
17369     case CRYPTO_BUILTIN_VCIPHER_BE:
17370     case CRYPTO_BUILTIN_VCIPHERLAST:
17371     case CRYPTO_BUILTIN_VCIPHERLAST_BE:
17372     case CRYPTO_BUILTIN_VNCIPHER:
17373     case CRYPTO_BUILTIN_VNCIPHER_BE:
17374     case CRYPTO_BUILTIN_VNCIPHERLAST:
17375     case CRYPTO_BUILTIN_VNCIPHERLAST_BE:
17376     case CRYPTO_BUILTIN_VPMSUMB:
17377     case CRYPTO_BUILTIN_VPMSUMH:
17378     case CRYPTO_BUILTIN_VPMSUMW:
17379     case CRYPTO_BUILTIN_VPMSUMD:
17380     case CRYPTO_BUILTIN_VPMSUM:
17381     case MISC_BUILTIN_ADDG6S:
17382     case MISC_BUILTIN_DIVWEU:
17383     case MISC_BUILTIN_DIVDEU:
17384     case VSX_BUILTIN_UDIV_V2DI:
17385     case ALTIVEC_BUILTIN_VMAXUB:
17386     case ALTIVEC_BUILTIN_VMINUB:
17387     case ALTIVEC_BUILTIN_VMAXUH:
17388     case ALTIVEC_BUILTIN_VMINUH:
17389     case ALTIVEC_BUILTIN_VMAXUW:
17390     case ALTIVEC_BUILTIN_VMINUW:
17391     case P8V_BUILTIN_VMAXUD:
17392     case P8V_BUILTIN_VMINUD:
17393       h.uns_p[0] = 1;
17394       h.uns_p[1] = 1;
17395       h.uns_p[2] = 1;
17396       break;
17397
17398     /* unsigned 3 argument functions.  */
17399     case ALTIVEC_BUILTIN_VPERM_16QI_UNS:
17400     case ALTIVEC_BUILTIN_VPERM_8HI_UNS:
17401     case ALTIVEC_BUILTIN_VPERM_4SI_UNS:
17402     case ALTIVEC_BUILTIN_VPERM_2DI_UNS:
17403     case ALTIVEC_BUILTIN_VSEL_16QI_UNS:
17404     case ALTIVEC_BUILTIN_VSEL_8HI_UNS:
17405     case ALTIVEC_BUILTIN_VSEL_4SI_UNS:
17406     case ALTIVEC_BUILTIN_VSEL_2DI_UNS:
17407     case VSX_BUILTIN_VPERM_16QI_UNS:
17408     case VSX_BUILTIN_VPERM_8HI_UNS:
17409     case VSX_BUILTIN_VPERM_4SI_UNS:
17410     case VSX_BUILTIN_VPERM_2DI_UNS:
17411     case VSX_BUILTIN_XXSEL_16QI_UNS:
17412     case VSX_BUILTIN_XXSEL_8HI_UNS:
17413     case VSX_BUILTIN_XXSEL_4SI_UNS:
17414     case VSX_BUILTIN_XXSEL_2DI_UNS:
17415     case CRYPTO_BUILTIN_VPERMXOR:
17416     case CRYPTO_BUILTIN_VPERMXOR_V2DI:
17417     case CRYPTO_BUILTIN_VPERMXOR_V4SI:
17418     case CRYPTO_BUILTIN_VPERMXOR_V8HI:
17419     case CRYPTO_BUILTIN_VPERMXOR_V16QI:
17420     case CRYPTO_BUILTIN_VSHASIGMAW:
17421     case CRYPTO_BUILTIN_VSHASIGMAD:
17422     case CRYPTO_BUILTIN_VSHASIGMA:
17423       h.uns_p[0] = 1;
17424       h.uns_p[1] = 1;
17425       h.uns_p[2] = 1;
17426       h.uns_p[3] = 1;
17427       break;
17428
17429     /* signed permute functions with unsigned char mask.  */
17430     case ALTIVEC_BUILTIN_VPERM_16QI:
17431     case ALTIVEC_BUILTIN_VPERM_8HI:
17432     case ALTIVEC_BUILTIN_VPERM_4SI:
17433     case ALTIVEC_BUILTIN_VPERM_4SF:
17434     case ALTIVEC_BUILTIN_VPERM_2DI:
17435     case ALTIVEC_BUILTIN_VPERM_2DF:
17436     case VSX_BUILTIN_VPERM_16QI:
17437     case VSX_BUILTIN_VPERM_8HI:
17438     case VSX_BUILTIN_VPERM_4SI:
17439     case VSX_BUILTIN_VPERM_4SF:
17440     case VSX_BUILTIN_VPERM_2DI:
17441     case VSX_BUILTIN_VPERM_2DF:
17442       h.uns_p[3] = 1;
17443       break;
17444
17445     /* unsigned args, signed return.  */
17446     case VSX_BUILTIN_XVCVUXDSP:
17447     case VSX_BUILTIN_XVCVUXDDP_UNS:
17448     case ALTIVEC_BUILTIN_UNSFLOAT_V4SI_V4SF:
17449       h.uns_p[1] = 1;
17450       break;
17451
17452     /* signed args, unsigned return.  */
17453     case VSX_BUILTIN_XVCVDPUXDS_UNS:
17454     case ALTIVEC_BUILTIN_FIXUNS_V4SF_V4SI:
17455     case MISC_BUILTIN_UNPACK_TD:
17456     case MISC_BUILTIN_UNPACK_V1TI:
17457       h.uns_p[0] = 1;
17458       break;
17459
17460     /* unsigned arguments, bool return (compares).  */
17461     case ALTIVEC_BUILTIN_VCMPEQUB:
17462     case ALTIVEC_BUILTIN_VCMPEQUH:
17463     case ALTIVEC_BUILTIN_VCMPEQUW:
17464     case P8V_BUILTIN_VCMPEQUD:
17465     case VSX_BUILTIN_CMPGE_U16QI:
17466     case VSX_BUILTIN_CMPGE_U8HI:
17467     case VSX_BUILTIN_CMPGE_U4SI:
17468     case VSX_BUILTIN_CMPGE_U2DI:
17469     case ALTIVEC_BUILTIN_VCMPGTUB:
17470     case ALTIVEC_BUILTIN_VCMPGTUH:
17471     case ALTIVEC_BUILTIN_VCMPGTUW:
17472     case P8V_BUILTIN_VCMPGTUD:
17473       h.uns_p[1] = 1;
17474       h.uns_p[2] = 1;
17475       break;
17476
17477     /* unsigned arguments for 128-bit pack instructions.  */
17478     case MISC_BUILTIN_PACK_TD:
17479     case MISC_BUILTIN_PACK_V1TI:
17480       h.uns_p[1] = 1;
17481       h.uns_p[2] = 1;
17482       break;
17483
17484     /* unsigned second arguments (vector shift right).  */
17485     case ALTIVEC_BUILTIN_VSRB:
17486     case ALTIVEC_BUILTIN_VSRH:
17487     case ALTIVEC_BUILTIN_VSRW:
17488     case P8V_BUILTIN_VSRD:
17489       h.uns_p[2] = 1;
17490       break;
17491
17492     default:
17493       break;
17494     }
17495
17496   /* Figure out how many args are present.  */
17497   while (num_args > 0 && h.mode[num_args] == VOIDmode)
17498     num_args--;
17499
17500   ret_type = builtin_mode_to_type[h.mode[0]][h.uns_p[0]];
17501   if (!ret_type && h.uns_p[0])
17502     ret_type = builtin_mode_to_type[h.mode[0]][0];
17503
17504   if (!ret_type)
17505     fatal_error (input_location,
17506                  "internal error: builtin function %qs had an unexpected "
17507                  "return type %qs", name, GET_MODE_NAME (h.mode[0]));
17508
17509   for (i = 0; i < (int) ARRAY_SIZE (arg_type); i++)
17510     arg_type[i] = NULL_TREE;
17511
17512   for (i = 0; i < num_args; i++)
17513     {
17514       int m = (int) h.mode[i+1];
17515       int uns_p = h.uns_p[i+1];
17516
17517       arg_type[i] = builtin_mode_to_type[m][uns_p];
17518       if (!arg_type[i] && uns_p)
17519         arg_type[i] = builtin_mode_to_type[m][0];
17520
17521       if (!arg_type[i])
17522         fatal_error (input_location,
17523                      "internal error: builtin function %qs, argument %d "
17524                      "had unexpected argument type %qs", name, i,
17525                      GET_MODE_NAME (m));
17526     }
17527
17528   builtin_hash_struct **found = builtin_hash_table->find_slot (&h, INSERT);
17529   if (*found == NULL)
17530     {
17531       h2 = ggc_alloc<builtin_hash_struct> ();
17532       *h2 = h;
17533       *found = h2;
17534
17535       h2->type = build_function_type_list (ret_type, arg_type[0], arg_type[1],
17536                                            arg_type[2], NULL_TREE);
17537     }
17538
17539   return (*found)->type;
17540 }
17541
17542 static void
17543 rs6000_common_init_builtins (void)
17544 {
17545   const struct builtin_description *d;
17546   size_t i;
17547
17548   tree opaque_ftype_opaque = NULL_TREE;
17549   tree opaque_ftype_opaque_opaque = NULL_TREE;
17550   tree opaque_ftype_opaque_opaque_opaque = NULL_TREE;
17551   HOST_WIDE_INT builtin_mask = rs6000_builtin_mask;
17552
17553   /* Create Altivec and VSX builtins on machines with at least the
17554      general purpose extensions (970 and newer) to allow the use of
17555      the target attribute.  */
17556
17557   if (TARGET_EXTRA_BUILTINS)
17558     builtin_mask |= RS6000_BTM_COMMON;
17559
17560   /* Add the ternary operators.  */
17561   d = bdesc_3arg;
17562   for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
17563     {
17564       tree type;
17565       HOST_WIDE_INT mask = d->mask;
17566
17567       if ((mask & builtin_mask) != mask)
17568         {
17569           if (TARGET_DEBUG_BUILTIN)
17570             fprintf (stderr, "rs6000_builtin, skip ternary %s\n", d->name);
17571           continue;
17572         }
17573
17574       if (rs6000_overloaded_builtin_p (d->code))
17575         {
17576           if (! (type = opaque_ftype_opaque_opaque_opaque))
17577             type = opaque_ftype_opaque_opaque_opaque
17578               = build_function_type_list (opaque_V4SI_type_node,
17579                                           opaque_V4SI_type_node,
17580                                           opaque_V4SI_type_node,
17581                                           opaque_V4SI_type_node,
17582                                           NULL_TREE);
17583         }
17584       else
17585         {
17586           enum insn_code icode = d->icode;
17587           if (d->name == 0)
17588             {
17589               if (TARGET_DEBUG_BUILTIN)
17590                 fprintf (stderr, "rs6000_builtin, bdesc_3arg[%ld] no name\n",
17591                          (long unsigned)i);
17592
17593               continue;
17594             }
17595
17596           if (icode == CODE_FOR_nothing)
17597             {
17598               if (TARGET_DEBUG_BUILTIN)
17599                 fprintf (stderr, "rs6000_builtin, skip ternary %s (no code)\n",
17600                          d->name);
17601
17602               continue;
17603             }
17604
17605           type = builtin_function_type (insn_data[icode].operand[0].mode,
17606                                         insn_data[icode].operand[1].mode,
17607                                         insn_data[icode].operand[2].mode,
17608                                         insn_data[icode].operand[3].mode,
17609                                         d->code, d->name);
17610         }
17611
17612       def_builtin (d->name, type, d->code);
17613     }
17614
17615   /* Add the binary operators.  */
17616   d = bdesc_2arg;
17617   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
17618     {
17619       machine_mode mode0, mode1, mode2;
17620       tree type;
17621       HOST_WIDE_INT mask = d->mask;
17622
17623       if ((mask & builtin_mask) != mask)
17624         {
17625           if (TARGET_DEBUG_BUILTIN)
17626             fprintf (stderr, "rs6000_builtin, skip binary %s\n", d->name);
17627           continue;
17628         }
17629
17630       if (rs6000_overloaded_builtin_p (d->code))
17631         {
17632           if (! (type = opaque_ftype_opaque_opaque))
17633             type = opaque_ftype_opaque_opaque
17634               = build_function_type_list (opaque_V4SI_type_node,
17635                                           opaque_V4SI_type_node,
17636                                           opaque_V4SI_type_node,
17637                                           NULL_TREE);
17638         }
17639       else
17640         {
17641           enum insn_code icode = d->icode;
17642           if (d->name == 0)
17643             {
17644               if (TARGET_DEBUG_BUILTIN)
17645                 fprintf (stderr, "rs6000_builtin, bdesc_2arg[%ld] no name\n",
17646                          (long unsigned)i);
17647
17648               continue;
17649             }
17650
17651           if (icode == CODE_FOR_nothing)
17652             {
17653               if (TARGET_DEBUG_BUILTIN)
17654                 fprintf (stderr, "rs6000_builtin, skip binary %s (no code)\n",
17655                          d->name);
17656
17657               continue;
17658             }
17659
17660           mode0 = insn_data[icode].operand[0].mode;
17661           mode1 = insn_data[icode].operand[1].mode;
17662           mode2 = insn_data[icode].operand[2].mode;
17663
17664           type = builtin_function_type (mode0, mode1, mode2, VOIDmode,
17665                                         d->code, d->name);
17666         }
17667
17668       def_builtin (d->name, type, d->code);
17669     }
17670
17671   /* Add the simple unary operators.  */
17672   d = bdesc_1arg;
17673   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
17674     {
17675       machine_mode mode0, mode1;
17676       tree type;
17677       HOST_WIDE_INT mask = d->mask;
17678
17679       if ((mask & builtin_mask) != mask)
17680         {
17681           if (TARGET_DEBUG_BUILTIN)
17682             fprintf (stderr, "rs6000_builtin, skip unary %s\n", d->name);
17683           continue;
17684         }
17685
17686       if (rs6000_overloaded_builtin_p (d->code))
17687         {
17688           if (! (type = opaque_ftype_opaque))
17689             type = opaque_ftype_opaque
17690               = build_function_type_list (opaque_V4SI_type_node,
17691                                           opaque_V4SI_type_node,
17692                                           NULL_TREE);
17693         }
17694       else
17695         {
17696           enum insn_code icode = d->icode;
17697           if (d->name == 0)
17698             {
17699               if (TARGET_DEBUG_BUILTIN)
17700                 fprintf (stderr, "rs6000_builtin, bdesc_1arg[%ld] no name\n",
17701                          (long unsigned)i);
17702
17703               continue;
17704             }
17705
17706           if (icode == CODE_FOR_nothing)
17707             {
17708               if (TARGET_DEBUG_BUILTIN)
17709                 fprintf (stderr, "rs6000_builtin, skip unary %s (no code)\n",
17710                          d->name);
17711
17712               continue;
17713             }
17714
17715           mode0 = insn_data[icode].operand[0].mode;
17716           mode1 = insn_data[icode].operand[1].mode;
17717
17718           type = builtin_function_type (mode0, mode1, VOIDmode, VOIDmode,
17719                                         d->code, d->name);
17720         }
17721
17722       def_builtin (d->name, type, d->code);
17723     }
17724
17725   /* Add the simple no-argument operators.  */
17726   d = bdesc_0arg;
17727   for (i = 0; i < ARRAY_SIZE (bdesc_0arg); i++, d++)
17728     {
17729       machine_mode mode0;
17730       tree type;
17731       HOST_WIDE_INT mask = d->mask;
17732
17733       if ((mask & builtin_mask) != mask)
17734         {
17735           if (TARGET_DEBUG_BUILTIN)
17736             fprintf (stderr, "rs6000_builtin, skip no-argument %s\n", d->name);
17737           continue;
17738         }
17739       if (rs6000_overloaded_builtin_p (d->code))
17740         {
17741           if (!opaque_ftype_opaque)
17742             opaque_ftype_opaque
17743               = build_function_type_list (opaque_V4SI_type_node, NULL_TREE);
17744           type = opaque_ftype_opaque;
17745         }
17746       else
17747         {
17748           enum insn_code icode = d->icode;
17749           if (d->name == 0)
17750             {
17751               if (TARGET_DEBUG_BUILTIN)
17752                 fprintf (stderr, "rs6000_builtin, bdesc_0arg[%lu] no name\n",
17753                          (long unsigned) i);
17754               continue;
17755             }
17756           if (icode == CODE_FOR_nothing)
17757             {
17758               if (TARGET_DEBUG_BUILTIN)
17759                 fprintf (stderr,
17760                          "rs6000_builtin, skip no-argument %s (no code)\n",
17761                          d->name);
17762               continue;
17763             }
17764           mode0 = insn_data[icode].operand[0].mode;
17765           type = builtin_function_type (mode0, VOIDmode, VOIDmode, VOIDmode,
17766                                         d->code, d->name);
17767         }
17768       def_builtin (d->name, type, d->code);
17769     }
17770 }
17771
17772 /* Set up AIX/Darwin/64-bit Linux quad floating point routines.  */
17773 static void
17774 init_float128_ibm (machine_mode mode)
17775 {
17776   if (!TARGET_XL_COMPAT)
17777     {
17778       set_optab_libfunc (add_optab, mode, "__gcc_qadd");
17779       set_optab_libfunc (sub_optab, mode, "__gcc_qsub");
17780       set_optab_libfunc (smul_optab, mode, "__gcc_qmul");
17781       set_optab_libfunc (sdiv_optab, mode, "__gcc_qdiv");
17782
17783       if (!TARGET_HARD_FLOAT)
17784         {
17785           set_optab_libfunc (neg_optab, mode, "__gcc_qneg");
17786           set_optab_libfunc (eq_optab, mode, "__gcc_qeq");
17787           set_optab_libfunc (ne_optab, mode, "__gcc_qne");
17788           set_optab_libfunc (gt_optab, mode, "__gcc_qgt");
17789           set_optab_libfunc (ge_optab, mode, "__gcc_qge");
17790           set_optab_libfunc (lt_optab, mode, "__gcc_qlt");
17791           set_optab_libfunc (le_optab, mode, "__gcc_qle");
17792           set_optab_libfunc (unord_optab, mode, "__gcc_qunord");
17793
17794           set_conv_libfunc (sext_optab, mode, SFmode, "__gcc_stoq");
17795           set_conv_libfunc (sext_optab, mode, DFmode, "__gcc_dtoq");
17796           set_conv_libfunc (trunc_optab, SFmode, mode, "__gcc_qtos");
17797           set_conv_libfunc (trunc_optab, DFmode, mode, "__gcc_qtod");
17798           set_conv_libfunc (sfix_optab, SImode, mode, "__gcc_qtoi");
17799           set_conv_libfunc (ufix_optab, SImode, mode, "__gcc_qtou");
17800           set_conv_libfunc (sfloat_optab, mode, SImode, "__gcc_itoq");
17801           set_conv_libfunc (ufloat_optab, mode, SImode, "__gcc_utoq");
17802         }
17803     }
17804   else
17805     {
17806       set_optab_libfunc (add_optab, mode, "_xlqadd");
17807       set_optab_libfunc (sub_optab, mode, "_xlqsub");
17808       set_optab_libfunc (smul_optab, mode, "_xlqmul");
17809       set_optab_libfunc (sdiv_optab, mode, "_xlqdiv");
17810     }
17811
17812   /* Add various conversions for IFmode to use the traditional TFmode
17813      names.  */
17814   if (mode == IFmode)
17815     {
17816       set_conv_libfunc (sext_optab, mode, SDmode, "__dpd_extendsdtf");
17817       set_conv_libfunc (sext_optab, mode, DDmode, "__dpd_extendddtf");
17818       set_conv_libfunc (trunc_optab, mode, TDmode, "__dpd_trunctdtf");
17819       set_conv_libfunc (trunc_optab, SDmode, mode, "__dpd_trunctfsd");
17820       set_conv_libfunc (trunc_optab, DDmode, mode, "__dpd_trunctfdd");
17821       set_conv_libfunc (sext_optab, TDmode, mode, "__dpd_extendtftd");
17822
17823       if (TARGET_POWERPC64)
17824         {
17825           set_conv_libfunc (sfix_optab, TImode, mode, "__fixtfti");
17826           set_conv_libfunc (ufix_optab, TImode, mode, "__fixunstfti");
17827           set_conv_libfunc (sfloat_optab, mode, TImode, "__floattitf");
17828           set_conv_libfunc (ufloat_optab, mode, TImode, "__floatuntitf");
17829         }
17830     }
17831 }
17832
17833 /* Create a decl for either complex long double multiply or complex long double
17834    divide when long double is IEEE 128-bit floating point.  We can't use
17835    __multc3 and __divtc3 because the original long double using IBM extended
17836    double used those names.  The complex multiply/divide functions are encoded
17837    as builtin functions with a complex result and 4 scalar inputs.  */
17838
17839 static void
17840 create_complex_muldiv (const char *name, built_in_function fncode, tree fntype)
17841 {
17842   tree fndecl = add_builtin_function (name, fntype, fncode, BUILT_IN_NORMAL,
17843                                       name, NULL_TREE);
17844
17845   set_builtin_decl (fncode, fndecl, true);
17846
17847   if (TARGET_DEBUG_BUILTIN)
17848     fprintf (stderr, "create complex %s, fncode: %d\n", name, (int) fncode);
17849
17850   return;
17851 }
17852
17853 /* Set up IEEE 128-bit floating point routines.  Use different names if the
17854    arguments can be passed in a vector register.  The historical PowerPC
17855    implementation of IEEE 128-bit floating point used _q_<op> for the names, so
17856    continue to use that if we aren't using vector registers to pass IEEE
17857    128-bit floating point.  */
17858
17859 static void
17860 init_float128_ieee (machine_mode mode)
17861 {
17862   if (FLOAT128_VECTOR_P (mode))
17863     {
17864       static bool complex_muldiv_init_p = false;
17865
17866       /* Set up to call __mulkc3 and __divkc3 under -mabi=ieeelongdouble.  If
17867          we have clone or target attributes, this will be called a second
17868          time.  We want to create the built-in function only once.  */
17869      if (mode == TFmode && TARGET_IEEEQUAD && !complex_muldiv_init_p)
17870        {
17871          complex_muldiv_init_p = true;
17872          built_in_function fncode_mul =
17873            (built_in_function) (BUILT_IN_COMPLEX_MUL_MIN + TCmode
17874                                 - MIN_MODE_COMPLEX_FLOAT);
17875          built_in_function fncode_div =
17876            (built_in_function) (BUILT_IN_COMPLEX_DIV_MIN + TCmode
17877                                 - MIN_MODE_COMPLEX_FLOAT);
17878
17879          tree fntype = build_function_type_list (complex_long_double_type_node,
17880                                                  long_double_type_node,
17881                                                  long_double_type_node,
17882                                                  long_double_type_node,
17883                                                  long_double_type_node,
17884                                                  NULL_TREE);
17885
17886          create_complex_muldiv ("__mulkc3", fncode_mul, fntype);
17887          create_complex_muldiv ("__divkc3", fncode_div, fntype);
17888        }
17889
17890       set_optab_libfunc (add_optab, mode, "__addkf3");
17891       set_optab_libfunc (sub_optab, mode, "__subkf3");
17892       set_optab_libfunc (neg_optab, mode, "__negkf2");
17893       set_optab_libfunc (smul_optab, mode, "__mulkf3");
17894       set_optab_libfunc (sdiv_optab, mode, "__divkf3");
17895       set_optab_libfunc (sqrt_optab, mode, "__sqrtkf2");
17896       set_optab_libfunc (abs_optab, mode, "__abskf2");
17897       set_optab_libfunc (powi_optab, mode, "__powikf2");
17898
17899       set_optab_libfunc (eq_optab, mode, "__eqkf2");
17900       set_optab_libfunc (ne_optab, mode, "__nekf2");
17901       set_optab_libfunc (gt_optab, mode, "__gtkf2");
17902       set_optab_libfunc (ge_optab, mode, "__gekf2");
17903       set_optab_libfunc (lt_optab, mode, "__ltkf2");
17904       set_optab_libfunc (le_optab, mode, "__lekf2");
17905       set_optab_libfunc (unord_optab, mode, "__unordkf2");
17906
17907       set_conv_libfunc (sext_optab, mode, SFmode, "__extendsfkf2");
17908       set_conv_libfunc (sext_optab, mode, DFmode, "__extenddfkf2");
17909       set_conv_libfunc (trunc_optab, SFmode, mode, "__trunckfsf2");
17910       set_conv_libfunc (trunc_optab, DFmode, mode, "__trunckfdf2");
17911
17912       set_conv_libfunc (sext_optab, mode, IFmode, "__trunctfkf2");
17913       if (mode != TFmode && FLOAT128_IBM_P (TFmode))
17914         set_conv_libfunc (sext_optab, mode, TFmode, "__trunctfkf2");
17915
17916       set_conv_libfunc (trunc_optab, IFmode, mode, "__extendkftf2");
17917       if (mode != TFmode && FLOAT128_IBM_P (TFmode))
17918         set_conv_libfunc (trunc_optab, TFmode, mode, "__extendkftf2");
17919
17920       set_conv_libfunc (sext_optab, mode, SDmode, "__dpd_extendsdkf");
17921       set_conv_libfunc (sext_optab, mode, DDmode, "__dpd_extendddkf");
17922       set_conv_libfunc (trunc_optab, mode, TDmode, "__dpd_trunctdkf");
17923       set_conv_libfunc (trunc_optab, SDmode, mode, "__dpd_trunckfsd");
17924       set_conv_libfunc (trunc_optab, DDmode, mode, "__dpd_trunckfdd");
17925       set_conv_libfunc (sext_optab, TDmode, mode, "__dpd_extendkftd");
17926
17927       set_conv_libfunc (sfix_optab, SImode, mode, "__fixkfsi");
17928       set_conv_libfunc (ufix_optab, SImode, mode, "__fixunskfsi");
17929       set_conv_libfunc (sfix_optab, DImode, mode, "__fixkfdi");
17930       set_conv_libfunc (ufix_optab, DImode, mode, "__fixunskfdi");
17931
17932       set_conv_libfunc (sfloat_optab, mode, SImode, "__floatsikf");
17933       set_conv_libfunc (ufloat_optab, mode, SImode, "__floatunsikf");
17934       set_conv_libfunc (sfloat_optab, mode, DImode, "__floatdikf");
17935       set_conv_libfunc (ufloat_optab, mode, DImode, "__floatundikf");
17936
17937       if (TARGET_POWERPC64)
17938         {
17939           set_conv_libfunc (sfix_optab, TImode, mode, "__fixkfti");
17940           set_conv_libfunc (ufix_optab, TImode, mode, "__fixunskfti");
17941           set_conv_libfunc (sfloat_optab, mode, TImode, "__floattikf");
17942           set_conv_libfunc (ufloat_optab, mode, TImode, "__floatuntikf");
17943         }
17944     }
17945
17946   else
17947     {
17948       set_optab_libfunc (add_optab, mode, "_q_add");
17949       set_optab_libfunc (sub_optab, mode, "_q_sub");
17950       set_optab_libfunc (neg_optab, mode, "_q_neg");
17951       set_optab_libfunc (smul_optab, mode, "_q_mul");
17952       set_optab_libfunc (sdiv_optab, mode, "_q_div");
17953       if (TARGET_PPC_GPOPT)
17954         set_optab_libfunc (sqrt_optab, mode, "_q_sqrt");
17955
17956       set_optab_libfunc (eq_optab, mode, "_q_feq");
17957       set_optab_libfunc (ne_optab, mode, "_q_fne");
17958       set_optab_libfunc (gt_optab, mode, "_q_fgt");
17959       set_optab_libfunc (ge_optab, mode, "_q_fge");
17960       set_optab_libfunc (lt_optab, mode, "_q_flt");
17961       set_optab_libfunc (le_optab, mode, "_q_fle");
17962
17963       set_conv_libfunc (sext_optab, mode, SFmode, "_q_stoq");
17964       set_conv_libfunc (sext_optab, mode, DFmode, "_q_dtoq");
17965       set_conv_libfunc (trunc_optab, SFmode, mode, "_q_qtos");
17966       set_conv_libfunc (trunc_optab, DFmode, mode, "_q_qtod");
17967       set_conv_libfunc (sfix_optab, SImode, mode, "_q_qtoi");
17968       set_conv_libfunc (ufix_optab, SImode, mode, "_q_qtou");
17969       set_conv_libfunc (sfloat_optab, mode, SImode, "_q_itoq");
17970       set_conv_libfunc (ufloat_optab, mode, SImode, "_q_utoq");
17971     }
17972 }
17973
17974 static void
17975 rs6000_init_libfuncs (void)
17976 {
17977   /* __float128 support.  */
17978   if (TARGET_FLOAT128_TYPE)
17979     {
17980       init_float128_ibm (IFmode);
17981       init_float128_ieee (KFmode);
17982     }
17983
17984   /* AIX/Darwin/64-bit Linux quad floating point routines.  */
17985   if (TARGET_LONG_DOUBLE_128)
17986     {
17987       if (!TARGET_IEEEQUAD)
17988         init_float128_ibm (TFmode);
17989
17990       /* IEEE 128-bit including 32-bit SVR4 quad floating point routines.  */
17991       else
17992         init_float128_ieee (TFmode);
17993     }
17994 }
17995
17996 /* Emit a potentially record-form instruction, setting DST from SRC.
17997    If DOT is 0, that is all; otherwise, set CCREG to the result of the
17998    signed comparison of DST with zero.  If DOT is 1, the generated RTL
17999    doesn't care about the DST result; if DOT is 2, it does.  If CCREG
18000    is CR0 do a single dot insn (as a PARALLEL); otherwise, do a SET and
18001    a separate COMPARE.  */
18002
18003 void
18004 rs6000_emit_dot_insn (rtx dst, rtx src, int dot, rtx ccreg)
18005 {
18006   if (dot == 0)
18007     {
18008       emit_move_insn (dst, src);
18009       return;
18010     }
18011
18012   if (cc_reg_not_cr0_operand (ccreg, CCmode))
18013     {
18014       emit_move_insn (dst, src);
18015       emit_move_insn (ccreg, gen_rtx_COMPARE (CCmode, dst, const0_rtx));
18016       return;
18017     }
18018
18019   rtx ccset = gen_rtx_SET (ccreg, gen_rtx_COMPARE (CCmode, src, const0_rtx));
18020   if (dot == 1)
18021     {
18022       rtx clobber = gen_rtx_CLOBBER (VOIDmode, dst);
18023       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, ccset, clobber)));
18024     }
18025   else
18026     {
18027       rtx set = gen_rtx_SET (dst, src);
18028       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, ccset, set)));
18029     }
18030 }
18031
18032 \f
18033 /* A validation routine: say whether CODE, a condition code, and MODE
18034    match.  The other alternatives either don't make sense or should
18035    never be generated.  */
18036
18037 void
18038 validate_condition_mode (enum rtx_code code, machine_mode mode)
18039 {
18040   gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
18041                || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
18042               && GET_MODE_CLASS (mode) == MODE_CC);
18043
18044   /* These don't make sense.  */
18045   gcc_assert ((code != GT && code != LT && code != GE && code != LE)
18046               || mode != CCUNSmode);
18047
18048   gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
18049               || mode == CCUNSmode);
18050
18051   gcc_assert (mode == CCFPmode
18052               || (code != ORDERED && code != UNORDERED
18053                   && code != UNEQ && code != LTGT
18054                   && code != UNGT && code != UNLT
18055                   && code != UNGE && code != UNLE));
18056
18057   /* These should never be generated except for
18058      flag_finite_math_only.  */
18059   gcc_assert (mode != CCFPmode
18060               || flag_finite_math_only
18061               || (code != LE && code != GE
18062                   && code != UNEQ && code != LTGT
18063                   && code != UNGT && code != UNLT));
18064
18065   /* These are invalid; the information is not there.  */
18066   gcc_assert (mode != CCEQmode || code == EQ || code == NE);
18067 }
18068
18069 \f
18070 /* Return whether MASK (a CONST_INT) is a valid mask for any rlwinm,
18071    rldicl, rldicr, or rldic instruction in mode MODE.  If so, if E is
18072    not zero, store there the bit offset (counted from the right) where
18073    the single stretch of 1 bits begins; and similarly for B, the bit
18074    offset where it ends.  */
18075
18076 bool
18077 rs6000_is_valid_mask (rtx mask, int *b, int *e, machine_mode mode)
18078 {
18079   unsigned HOST_WIDE_INT val = INTVAL (mask);
18080   unsigned HOST_WIDE_INT bit;
18081   int nb, ne;
18082   int n = GET_MODE_PRECISION (mode);
18083
18084   if (mode != DImode && mode != SImode)
18085     return false;
18086
18087   if (INTVAL (mask) >= 0)
18088     {
18089       bit = val & -val;
18090       ne = exact_log2 (bit);
18091       nb = exact_log2 (val + bit);
18092     }
18093   else if (val + 1 == 0)
18094     {
18095       nb = n;
18096       ne = 0;
18097     }
18098   else if (val & 1)
18099     {
18100       val = ~val;
18101       bit = val & -val;
18102       nb = exact_log2 (bit);
18103       ne = exact_log2 (val + bit);
18104     }
18105   else
18106     {
18107       bit = val & -val;
18108       ne = exact_log2 (bit);
18109       if (val + bit == 0)
18110         nb = n;
18111       else
18112         nb = 0;
18113     }
18114
18115   nb--;
18116
18117   if (nb < 0 || ne < 0 || nb >= n || ne >= n)
18118     return false;
18119
18120   if (b)
18121     *b = nb;
18122   if (e)
18123     *e = ne;
18124
18125   return true;
18126 }
18127
18128 /* Return whether MASK (a CONST_INT) is a valid mask for any rlwinm, rldicl,
18129    or rldicr instruction, to implement an AND with it in mode MODE.  */
18130
18131 bool
18132 rs6000_is_valid_and_mask (rtx mask, machine_mode mode)
18133 {
18134   int nb, ne;
18135
18136   if (!rs6000_is_valid_mask (mask, &nb, &ne, mode))
18137     return false;
18138
18139   /* For DImode, we need a rldicl, rldicr, or a rlwinm with mask that
18140      does not wrap.  */
18141   if (mode == DImode)
18142     return (ne == 0 || nb == 63 || (nb < 32 && ne <= nb));
18143
18144   /* For SImode, rlwinm can do everything.  */
18145   if (mode == SImode)
18146     return (nb < 32 && ne < 32);
18147
18148   return false;
18149 }
18150
18151 /* Return the instruction template for an AND with mask in mode MODE, with
18152    operands OPERANDS.  If DOT is true, make it a record-form instruction.  */
18153
18154 const char *
18155 rs6000_insn_for_and_mask (machine_mode mode, rtx *operands, bool dot)
18156 {
18157   int nb, ne;
18158
18159   if (!rs6000_is_valid_mask (operands[2], &nb, &ne, mode))
18160     gcc_unreachable ();
18161
18162   if (mode == DImode && ne == 0)
18163     {
18164       operands[3] = GEN_INT (63 - nb);
18165       if (dot)
18166         return "rldicl. %0,%1,0,%3";
18167       return "rldicl %0,%1,0,%3";
18168     }
18169
18170   if (mode == DImode && nb == 63)
18171     {
18172       operands[3] = GEN_INT (63 - ne);
18173       if (dot)
18174         return "rldicr. %0,%1,0,%3";
18175       return "rldicr %0,%1,0,%3";
18176     }
18177
18178   if (nb < 32 && ne < 32)
18179     {
18180       operands[3] = GEN_INT (31 - nb);
18181       operands[4] = GEN_INT (31 - ne);
18182       if (dot)
18183         return "rlwinm. %0,%1,0,%3,%4";
18184       return "rlwinm %0,%1,0,%3,%4";
18185     }
18186
18187   gcc_unreachable ();
18188 }
18189
18190 /* Return whether MASK (a CONST_INT) is a valid mask for any rlw[i]nm,
18191    rld[i]cl, rld[i]cr, or rld[i]c instruction, to implement an AND with
18192    shift SHIFT (a ROTATE, ASHIFT, or LSHIFTRT) in mode MODE.  */
18193
18194 bool
18195 rs6000_is_valid_shift_mask (rtx mask, rtx shift, machine_mode mode)
18196 {
18197   int nb, ne;
18198
18199   if (!rs6000_is_valid_mask (mask, &nb, &ne, mode))
18200     return false;
18201
18202   int n = GET_MODE_PRECISION (mode);
18203   int sh = -1;
18204
18205   if (CONST_INT_P (XEXP (shift, 1)))
18206     {
18207       sh = INTVAL (XEXP (shift, 1));
18208       if (sh < 0 || sh >= n)
18209         return false;
18210     }
18211
18212   rtx_code code = GET_CODE (shift);
18213
18214   /* Convert any shift by 0 to a rotate, to simplify below code.  */
18215   if (sh == 0)
18216     code = ROTATE;
18217
18218   /* Convert rotate to simple shift if we can, to make analysis simpler.  */
18219   if (code == ROTATE && sh >= 0 && nb >= ne && ne >= sh)
18220     code = ASHIFT;
18221   if (code == ROTATE && sh >= 0 && nb >= ne && nb < sh)
18222     {
18223       code = LSHIFTRT;
18224       sh = n - sh;
18225     }
18226
18227   /* DImode rotates need rld*.  */
18228   if (mode == DImode && code == ROTATE)
18229     return (nb == 63 || ne == 0 || ne == sh);
18230
18231   /* SImode rotates need rlw*.  */
18232   if (mode == SImode && code == ROTATE)
18233     return (nb < 32 && ne < 32 && sh < 32);
18234
18235   /* Wrap-around masks are only okay for rotates.  */
18236   if (ne > nb)
18237     return false;
18238
18239   /* Variable shifts are only okay for rotates.  */
18240   if (sh < 0)
18241     return false;
18242
18243   /* Don't allow ASHIFT if the mask is wrong for that.  */
18244   if (code == ASHIFT && ne < sh)
18245     return false;
18246
18247   /* If we can do it with an rlw*, we can do it.  Don't allow LSHIFTRT
18248      if the mask is wrong for that.  */
18249   if (nb < 32 && ne < 32 && sh < 32
18250       && !(code == LSHIFTRT && nb >= 32 - sh))
18251     return true;
18252
18253   /* If we can do it with an rld*, we can do it.  Don't allow LSHIFTRT
18254      if the mask is wrong for that.  */
18255   if (code == LSHIFTRT)
18256     sh = 64 - sh;
18257   if (nb == 63 || ne == 0 || ne == sh)
18258     return !(code == LSHIFTRT && nb >= sh);
18259
18260   return false;
18261 }
18262
18263 /* Return the instruction template for a shift with mask in mode MODE, with
18264    operands OPERANDS.  If DOT is true, make it a record-form instruction.  */
18265
18266 const char *
18267 rs6000_insn_for_shift_mask (machine_mode mode, rtx *operands, bool dot)
18268 {
18269   int nb, ne;
18270
18271   if (!rs6000_is_valid_mask (operands[3], &nb, &ne, mode))
18272     gcc_unreachable ();
18273
18274   if (mode == DImode && ne == 0)
18275     {
18276       if (GET_CODE (operands[4]) == LSHIFTRT && INTVAL (operands[2]))
18277         operands[2] = GEN_INT (64 - INTVAL (operands[2]));
18278       operands[3] = GEN_INT (63 - nb);
18279       if (dot)
18280         return "rld%I2cl. %0,%1,%2,%3";
18281       return "rld%I2cl %0,%1,%2,%3";
18282     }
18283
18284   if (mode == DImode && nb == 63)
18285     {
18286       operands[3] = GEN_INT (63 - ne);
18287       if (dot)
18288         return "rld%I2cr. %0,%1,%2,%3";
18289       return "rld%I2cr %0,%1,%2,%3";
18290     }
18291
18292   if (mode == DImode
18293       && GET_CODE (operands[4]) != LSHIFTRT
18294       && CONST_INT_P (operands[2])
18295       && ne == INTVAL (operands[2]))
18296     {
18297       operands[3] = GEN_INT (63 - nb);
18298       if (dot)
18299         return "rld%I2c. %0,%1,%2,%3";
18300       return "rld%I2c %0,%1,%2,%3";
18301     }
18302
18303   if (nb < 32 && ne < 32)
18304     {
18305       if (GET_CODE (operands[4]) == LSHIFTRT && INTVAL (operands[2]))
18306         operands[2] = GEN_INT (32 - INTVAL (operands[2]));
18307       operands[3] = GEN_INT (31 - nb);
18308       operands[4] = GEN_INT (31 - ne);
18309       /* This insn can also be a 64-bit rotate with mask that really makes
18310          it just a shift right (with mask); the %h below are to adjust for
18311          that situation (shift count is >= 32 in that case).  */
18312       if (dot)
18313         return "rlw%I2nm. %0,%1,%h2,%3,%4";
18314       return "rlw%I2nm %0,%1,%h2,%3,%4";
18315     }
18316
18317   gcc_unreachable ();
18318 }
18319
18320 /* Return whether MASK (a CONST_INT) is a valid mask for any rlwimi or
18321    rldimi instruction, to implement an insert with shift SHIFT (a ROTATE,
18322    ASHIFT, or LSHIFTRT) in mode MODE.  */
18323
18324 bool
18325 rs6000_is_valid_insert_mask (rtx mask, rtx shift, machine_mode mode)
18326 {
18327   int nb, ne;
18328
18329   if (!rs6000_is_valid_mask (mask, &nb, &ne, mode))
18330     return false;
18331
18332   int n = GET_MODE_PRECISION (mode);
18333
18334   int sh = INTVAL (XEXP (shift, 1));
18335   if (sh < 0 || sh >= n)
18336     return false;
18337
18338   rtx_code code = GET_CODE (shift);
18339
18340   /* Convert any shift by 0 to a rotate, to simplify below code.  */
18341   if (sh == 0)
18342     code = ROTATE;
18343
18344   /* Convert rotate to simple shift if we can, to make analysis simpler.  */
18345   if (code == ROTATE && sh >= 0 && nb >= ne && ne >= sh)
18346     code = ASHIFT;
18347   if (code == ROTATE && sh >= 0 && nb >= ne && nb < sh)
18348     {
18349       code = LSHIFTRT;
18350       sh = n - sh;
18351     }
18352
18353   /* DImode rotates need rldimi.  */
18354   if (mode == DImode && code == ROTATE)
18355     return (ne == sh);
18356
18357   /* SImode rotates need rlwimi.  */
18358   if (mode == SImode && code == ROTATE)
18359     return (nb < 32 && ne < 32 && sh < 32);
18360
18361   /* Wrap-around masks are only okay for rotates.  */
18362   if (ne > nb)
18363     return false;
18364
18365   /* Don't allow ASHIFT if the mask is wrong for that.  */
18366   if (code == ASHIFT && ne < sh)
18367     return false;
18368
18369   /* If we can do it with an rlwimi, we can do it.  Don't allow LSHIFTRT
18370      if the mask is wrong for that.  */
18371   if (nb < 32 && ne < 32 && sh < 32
18372       && !(code == LSHIFTRT && nb >= 32 - sh))
18373     return true;
18374
18375   /* If we can do it with an rldimi, we can do it.  Don't allow LSHIFTRT
18376      if the mask is wrong for that.  */
18377   if (code == LSHIFTRT)
18378     sh = 64 - sh;
18379   if (ne == sh)
18380     return !(code == LSHIFTRT && nb >= sh);
18381
18382   return false;
18383 }
18384
18385 /* Return the instruction template for an insert with mask in mode MODE, with
18386    operands OPERANDS.  If DOT is true, make it a record-form instruction.  */
18387
18388 const char *
18389 rs6000_insn_for_insert_mask (machine_mode mode, rtx *operands, bool dot)
18390 {
18391   int nb, ne;
18392
18393   if (!rs6000_is_valid_mask (operands[3], &nb, &ne, mode))
18394     gcc_unreachable ();
18395
18396   /* Prefer rldimi because rlwimi is cracked.  */
18397   if (TARGET_POWERPC64
18398       && (!dot || mode == DImode)
18399       && GET_CODE (operands[4]) != LSHIFTRT
18400       && ne == INTVAL (operands[2]))
18401     {
18402       operands[3] = GEN_INT (63 - nb);
18403       if (dot)
18404         return "rldimi. %0,%1,%2,%3";
18405       return "rldimi %0,%1,%2,%3";
18406     }
18407
18408   if (nb < 32 && ne < 32)
18409     {
18410       if (GET_CODE (operands[4]) == LSHIFTRT && INTVAL (operands[2]))
18411         operands[2] = GEN_INT (32 - INTVAL (operands[2]));
18412       operands[3] = GEN_INT (31 - nb);
18413       operands[4] = GEN_INT (31 - ne);
18414       if (dot)
18415         return "rlwimi. %0,%1,%2,%3,%4";
18416       return "rlwimi %0,%1,%2,%3,%4";
18417     }
18418
18419   gcc_unreachable ();
18420 }
18421
18422 /* Return whether an AND with C (a CONST_INT) in mode MODE can be done
18423    using two machine instructions.  */
18424
18425 bool
18426 rs6000_is_valid_2insn_and (rtx c, machine_mode mode)
18427 {
18428   /* There are two kinds of AND we can handle with two insns:
18429      1) those we can do with two rl* insn;
18430      2) ori[s];xori[s].
18431
18432      We do not handle that last case yet.  */
18433
18434   /* If there is just one stretch of ones, we can do it.  */
18435   if (rs6000_is_valid_mask (c, NULL, NULL, mode))
18436     return true;
18437
18438   /* Otherwise, fill in the lowest "hole"; if we can do the result with
18439      one insn, we can do the whole thing with two.  */
18440   unsigned HOST_WIDE_INT val = INTVAL (c);
18441   unsigned HOST_WIDE_INT bit1 = val & -val;
18442   unsigned HOST_WIDE_INT bit2 = (val + bit1) & ~val;
18443   unsigned HOST_WIDE_INT val1 = (val + bit1) & val;
18444   unsigned HOST_WIDE_INT bit3 = val1 & -val1;
18445   return rs6000_is_valid_and_mask (GEN_INT (val + bit3 - bit2), mode);
18446 }
18447
18448 /* Emit the two insns to do an AND in mode MODE, with operands OPERANDS.
18449    If EXPAND is true, split rotate-and-mask instructions we generate to
18450    their constituent parts as well (this is used during expand); if DOT
18451    is 1, make the last insn a record-form instruction clobbering the
18452    destination GPR and setting the CC reg (from operands[3]); if 2, set
18453    that GPR as well as the CC reg.  */
18454
18455 void
18456 rs6000_emit_2insn_and (machine_mode mode, rtx *operands, bool expand, int dot)
18457 {
18458   gcc_assert (!(expand && dot));
18459
18460   unsigned HOST_WIDE_INT val = INTVAL (operands[2]);
18461
18462   /* If it is one stretch of ones, it is DImode; shift left, mask, then
18463      shift right.  This generates better code than doing the masks without
18464      shifts, or shifting first right and then left.  */
18465   int nb, ne;
18466   if (rs6000_is_valid_mask (operands[2], &nb, &ne, mode) && nb >= ne)
18467     {
18468       gcc_assert (mode == DImode);
18469
18470       int shift = 63 - nb;
18471       if (expand)
18472         {
18473           rtx tmp1 = gen_reg_rtx (DImode);
18474           rtx tmp2 = gen_reg_rtx (DImode);
18475           emit_insn (gen_ashldi3 (tmp1, operands[1], GEN_INT (shift)));
18476           emit_insn (gen_anddi3 (tmp2, tmp1, GEN_INT (val << shift)));
18477           emit_insn (gen_lshrdi3 (operands[0], tmp2, GEN_INT (shift)));
18478         }
18479       else
18480         {
18481           rtx tmp = gen_rtx_ASHIFT (mode, operands[1], GEN_INT (shift));
18482           tmp = gen_rtx_AND (mode, tmp, GEN_INT (val << shift));
18483           emit_move_insn (operands[0], tmp);
18484           tmp = gen_rtx_LSHIFTRT (mode, operands[0], GEN_INT (shift));
18485           rs6000_emit_dot_insn (operands[0], tmp, dot, dot ? operands[3] : 0);
18486         }
18487       return;
18488     }
18489
18490   /* Otherwise, make a mask2 that cuts out the lowest "hole", and a mask1
18491      that does the rest.  */
18492   unsigned HOST_WIDE_INT bit1 = val & -val;
18493   unsigned HOST_WIDE_INT bit2 = (val + bit1) & ~val;
18494   unsigned HOST_WIDE_INT val1 = (val + bit1) & val;
18495   unsigned HOST_WIDE_INT bit3 = val1 & -val1;
18496
18497   unsigned HOST_WIDE_INT mask1 = -bit3 + bit2 - 1;
18498   unsigned HOST_WIDE_INT mask2 = val + bit3 - bit2;
18499
18500   gcc_assert (rs6000_is_valid_and_mask (GEN_INT (mask2), mode));
18501
18502   /* Two "no-rotate"-and-mask instructions, for SImode.  */
18503   if (rs6000_is_valid_and_mask (GEN_INT (mask1), mode))
18504     {
18505       gcc_assert (mode == SImode);
18506
18507       rtx reg = expand ? gen_reg_rtx (mode) : operands[0];
18508       rtx tmp = gen_rtx_AND (mode, operands[1], GEN_INT (mask1));
18509       emit_move_insn (reg, tmp);
18510       tmp = gen_rtx_AND (mode, reg, GEN_INT (mask2));
18511       rs6000_emit_dot_insn (operands[0], tmp, dot, dot ? operands[3] : 0);
18512       return;
18513     }
18514
18515   gcc_assert (mode == DImode);
18516
18517   /* Two "no-rotate"-and-mask instructions, for DImode: both are rlwinm
18518      insns; we have to do the first in SImode, because it wraps.  */
18519   if (mask2 <= 0xffffffff
18520       && rs6000_is_valid_and_mask (GEN_INT (mask1), SImode))
18521     {
18522       rtx reg = expand ? gen_reg_rtx (mode) : operands[0];
18523       rtx tmp = gen_rtx_AND (SImode, gen_lowpart (SImode, operands[1]),
18524                              GEN_INT (mask1));
18525       rtx reg_low = gen_lowpart (SImode, reg);
18526       emit_move_insn (reg_low, tmp);
18527       tmp = gen_rtx_AND (mode, reg, GEN_INT (mask2));
18528       rs6000_emit_dot_insn (operands[0], tmp, dot, dot ? operands[3] : 0);
18529       return;
18530     }
18531
18532   /* Two rld* insns: rotate, clear the hole in the middle (which now is
18533      at the top end), rotate back and clear the other hole.  */
18534   int right = exact_log2 (bit3);
18535   int left = 64 - right;
18536
18537   /* Rotate the mask too.  */
18538   mask1 = (mask1 >> right) | ((bit2 - 1) << left);
18539
18540   if (expand)
18541     {
18542       rtx tmp1 = gen_reg_rtx (DImode);
18543       rtx tmp2 = gen_reg_rtx (DImode);
18544       rtx tmp3 = gen_reg_rtx (DImode);
18545       emit_insn (gen_rotldi3 (tmp1, operands[1], GEN_INT (left)));
18546       emit_insn (gen_anddi3 (tmp2, tmp1, GEN_INT (mask1)));
18547       emit_insn (gen_rotldi3 (tmp3, tmp2, GEN_INT (right)));
18548       emit_insn (gen_anddi3 (operands[0], tmp3, GEN_INT (mask2)));
18549     }
18550   else
18551     {
18552       rtx tmp = gen_rtx_ROTATE (mode, operands[1], GEN_INT (left));
18553       tmp = gen_rtx_AND (mode, tmp, GEN_INT (mask1));
18554       emit_move_insn (operands[0], tmp);
18555       tmp = gen_rtx_ROTATE (mode, operands[0], GEN_INT (right));
18556       tmp = gen_rtx_AND (mode, tmp, GEN_INT (mask2));
18557       rs6000_emit_dot_insn (operands[0], tmp, dot, dot ? operands[3] : 0);
18558     }
18559 }
18560 \f
18561 /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
18562    for lfq and stfq insns iff the registers are hard registers.   */
18563
18564 int
18565 registers_ok_for_quad_peep (rtx reg1, rtx reg2)
18566 {
18567   /* We might have been passed a SUBREG.  */
18568   if (!REG_P (reg1) || !REG_P (reg2))
18569     return 0;
18570
18571   /* We might have been passed non floating point registers.  */
18572   if (!FP_REGNO_P (REGNO (reg1))
18573       || !FP_REGNO_P (REGNO (reg2)))
18574     return 0;
18575
18576   return (REGNO (reg1) == REGNO (reg2) - 1);
18577 }
18578
18579 /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
18580    addr1 and addr2 must be in consecutive memory locations
18581    (addr2 == addr1 + 8).  */
18582
18583 int
18584 mems_ok_for_quad_peep (rtx mem1, rtx mem2)
18585 {
18586   rtx addr1, addr2;
18587   unsigned int reg1, reg2;
18588   int offset1, offset2;
18589
18590   /* The mems cannot be volatile.  */
18591   if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
18592     return 0;
18593
18594   addr1 = XEXP (mem1, 0);
18595   addr2 = XEXP (mem2, 0);
18596
18597   /* Extract an offset (if used) from the first addr.  */
18598   if (GET_CODE (addr1) == PLUS)
18599     {
18600       /* If not a REG, return zero.  */
18601       if (!REG_P (XEXP (addr1, 0)))
18602         return 0;
18603       else
18604         {
18605           reg1 = REGNO (XEXP (addr1, 0));
18606           /* The offset must be constant!  */
18607           if (!CONST_INT_P (XEXP (addr1, 1)))
18608             return 0;
18609           offset1 = INTVAL (XEXP (addr1, 1));
18610         }
18611     }
18612   else if (!REG_P (addr1))
18613     return 0;
18614   else
18615     {
18616       reg1 = REGNO (addr1);
18617       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
18618       offset1 = 0;
18619     }
18620
18621   /* And now for the second addr.  */
18622   if (GET_CODE (addr2) == PLUS)
18623     {
18624       /* If not a REG, return zero.  */
18625       if (!REG_P (XEXP (addr2, 0)))
18626         return 0;
18627       else
18628         {
18629           reg2 = REGNO (XEXP (addr2, 0));
18630           /* The offset must be constant. */
18631           if (!CONST_INT_P (XEXP (addr2, 1)))
18632             return 0;
18633           offset2 = INTVAL (XEXP (addr2, 1));
18634         }
18635     }
18636   else if (!REG_P (addr2))
18637     return 0;
18638   else
18639     {
18640       reg2 = REGNO (addr2);
18641       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
18642       offset2 = 0;
18643     }
18644
18645   /* Both of these must have the same base register.  */
18646   if (reg1 != reg2)
18647     return 0;
18648
18649   /* The offset for the second addr must be 8 more than the first addr.  */
18650   if (offset2 != offset1 + 8)
18651     return 0;
18652
18653   /* All the tests passed.  addr1 and addr2 are valid for lfq or stfq
18654      instructions.  */
18655   return 1;
18656 }
18657 \f
18658 /* Implement TARGET_SECONDARY_RELOAD_NEEDED_MODE.  For SDmode values we
18659    need to use DDmode, in all other cases we can use the same mode.  */
18660 static machine_mode
18661 rs6000_secondary_memory_needed_mode (machine_mode mode)
18662 {
18663   if (lra_in_progress && mode == SDmode)
18664     return DDmode;
18665   return mode;
18666 }
18667
18668 /* Classify a register type.  Because the FMRGOW/FMRGEW instructions only work
18669    on traditional floating point registers, and the VMRGOW/VMRGEW instructions
18670    only work on the traditional altivec registers, note if an altivec register
18671    was chosen.  */
18672
18673 static enum rs6000_reg_type
18674 register_to_reg_type (rtx reg, bool *is_altivec)
18675 {
18676   HOST_WIDE_INT regno;
18677   enum reg_class rclass;
18678
18679   if (SUBREG_P (reg))
18680     reg = SUBREG_REG (reg);
18681
18682   if (!REG_P (reg))
18683     return NO_REG_TYPE;
18684
18685   regno = REGNO (reg);
18686   if (!HARD_REGISTER_NUM_P (regno))
18687     {
18688       if (!lra_in_progress && !reload_completed)
18689         return PSEUDO_REG_TYPE;
18690
18691       regno = true_regnum (reg);
18692       if (regno < 0 || !HARD_REGISTER_NUM_P (regno))
18693         return PSEUDO_REG_TYPE;
18694     }
18695
18696   gcc_assert (regno >= 0);
18697
18698   if (is_altivec && ALTIVEC_REGNO_P (regno))
18699     *is_altivec = true;
18700
18701   rclass = rs6000_regno_regclass[regno];
18702   return reg_class_to_reg_type[(int)rclass];
18703 }
18704
18705 /* Helper function to return the cost of adding a TOC entry address.  */
18706
18707 static inline int
18708 rs6000_secondary_reload_toc_costs (addr_mask_type addr_mask)
18709 {
18710   int ret;
18711
18712   if (TARGET_CMODEL != CMODEL_SMALL)
18713     ret = ((addr_mask & RELOAD_REG_OFFSET) == 0) ? 1 : 2;
18714
18715   else
18716     ret = (TARGET_MINIMAL_TOC) ? 6 : 3;
18717
18718   return ret;
18719 }
18720
18721 /* Helper function for rs6000_secondary_reload to determine whether the memory
18722    address (ADDR) with a given register class (RCLASS) and machine mode (MODE)
18723    needs reloading.  Return negative if the memory is not handled by the memory
18724    helper functions and to try a different reload method, 0 if no additional
18725    instructions are need, and positive to give the extra cost for the
18726    memory.  */
18727
18728 static int
18729 rs6000_secondary_reload_memory (rtx addr,
18730                                 enum reg_class rclass,
18731                                 machine_mode mode)
18732 {
18733   int extra_cost = 0;
18734   rtx reg, and_arg, plus_arg0, plus_arg1;
18735   addr_mask_type addr_mask;
18736   const char *type = NULL;
18737   const char *fail_msg = NULL;
18738
18739   if (GPR_REG_CLASS_P (rclass))
18740     addr_mask = reg_addr[mode].addr_mask[RELOAD_REG_GPR];
18741
18742   else if (rclass == FLOAT_REGS)
18743     addr_mask = reg_addr[mode].addr_mask[RELOAD_REG_FPR];
18744
18745   else if (rclass == ALTIVEC_REGS)
18746     addr_mask = reg_addr[mode].addr_mask[RELOAD_REG_VMX];
18747
18748   /* For the combined VSX_REGS, turn off Altivec AND -16.  */
18749   else if (rclass == VSX_REGS)
18750     addr_mask = (reg_addr[mode].addr_mask[RELOAD_REG_VMX]
18751                  & ~RELOAD_REG_AND_M16);
18752
18753   /* If the register allocator hasn't made up its mind yet on the register
18754      class to use, settle on defaults to use.  */
18755   else if (rclass == NO_REGS)
18756     {
18757       addr_mask = (reg_addr[mode].addr_mask[RELOAD_REG_ANY]
18758                    & ~RELOAD_REG_AND_M16);
18759
18760       if ((addr_mask & RELOAD_REG_MULTIPLE) != 0)
18761         addr_mask &= ~(RELOAD_REG_INDEXED
18762                        | RELOAD_REG_PRE_INCDEC
18763                        | RELOAD_REG_PRE_MODIFY);
18764     }
18765
18766   else
18767     addr_mask = 0;
18768
18769   /* If the register isn't valid in this register class, just return now.  */
18770   if ((addr_mask & RELOAD_REG_VALID) == 0)
18771     {
18772       if (TARGET_DEBUG_ADDR)
18773         {
18774           fprintf (stderr,
18775                    "rs6000_secondary_reload_memory: mode = %s, class = %s, "
18776                    "not valid in class\n",
18777                    GET_MODE_NAME (mode), reg_class_names[rclass]);
18778           debug_rtx (addr);
18779         }
18780
18781       return -1;
18782     }
18783
18784   switch (GET_CODE (addr))
18785     {
18786       /* Does the register class supports auto update forms for this mode?  We
18787          don't need a scratch register, since the powerpc only supports
18788          PRE_INC, PRE_DEC, and PRE_MODIFY.  */
18789     case PRE_INC:
18790     case PRE_DEC:
18791       reg = XEXP (addr, 0);
18792       if (!base_reg_operand (addr, GET_MODE (reg)))
18793         {
18794           fail_msg = "no base register #1";
18795           extra_cost = -1;
18796         }
18797
18798       else if ((addr_mask & RELOAD_REG_PRE_INCDEC) == 0)
18799         {
18800           extra_cost = 1;
18801           type = "update";
18802         }
18803       break;
18804
18805     case PRE_MODIFY:
18806       reg = XEXP (addr, 0);
18807       plus_arg1 = XEXP (addr, 1);
18808       if (!base_reg_operand (reg, GET_MODE (reg))
18809           || GET_CODE (plus_arg1) != PLUS
18810           || !rtx_equal_p (reg, XEXP (plus_arg1, 0)))
18811         {
18812           fail_msg = "bad PRE_MODIFY";
18813           extra_cost = -1;
18814         }
18815
18816       else if ((addr_mask & RELOAD_REG_PRE_MODIFY) == 0)
18817         {
18818           extra_cost = 1;
18819           type = "update";
18820         }
18821       break;
18822
18823       /* Do we need to simulate AND -16 to clear the bottom address bits used
18824          in VMX load/stores?  Only allow the AND for vector sizes.  */
18825     case AND:
18826       and_arg = XEXP (addr, 0);
18827       if (GET_MODE_SIZE (mode) != 16
18828           || !CONST_INT_P (XEXP (addr, 1))
18829           || INTVAL (XEXP (addr, 1)) != -16)
18830         {
18831           fail_msg = "bad Altivec AND #1";
18832           extra_cost = -1;
18833         }
18834
18835       if (rclass != ALTIVEC_REGS)
18836         {
18837           if (legitimate_indirect_address_p (and_arg, false))
18838             extra_cost = 1;
18839
18840           else if (legitimate_indexed_address_p (and_arg, false))
18841             extra_cost = 2;
18842
18843           else
18844             {
18845               fail_msg = "bad Altivec AND #2";
18846               extra_cost = -1;
18847             }
18848
18849           type = "and";
18850         }
18851       break;
18852
18853       /* If this is an indirect address, make sure it is a base register.  */
18854     case REG:
18855     case SUBREG:
18856       if (!legitimate_indirect_address_p (addr, false))
18857         {
18858           extra_cost = 1;
18859           type = "move";
18860         }
18861       break;
18862
18863       /* If this is an indexed address, make sure the register class can handle
18864          indexed addresses for this mode.  */
18865     case PLUS:
18866       plus_arg0 = XEXP (addr, 0);
18867       plus_arg1 = XEXP (addr, 1);
18868
18869       /* (plus (plus (reg) (constant)) (constant)) is generated during
18870          push_reload processing, so handle it now.  */
18871       if (GET_CODE (plus_arg0) == PLUS && CONST_INT_P (plus_arg1))
18872         {
18873           if ((addr_mask & RELOAD_REG_OFFSET) == 0)
18874             {
18875               extra_cost = 1;
18876               type = "offset";
18877             }
18878         }
18879
18880       /* (plus (plus (reg) (constant)) (reg)) is also generated during
18881          push_reload processing, so handle it now.  */
18882       else if (GET_CODE (plus_arg0) == PLUS && REG_P (plus_arg1))
18883         {
18884           if ((addr_mask & RELOAD_REG_INDEXED) == 0)
18885             {
18886               extra_cost = 1;
18887               type = "indexed #2";
18888             }
18889         }
18890
18891       else if (!base_reg_operand (plus_arg0, GET_MODE (plus_arg0)))
18892         {
18893           fail_msg = "no base register #2";
18894           extra_cost = -1;
18895         }
18896
18897       else if (int_reg_operand (plus_arg1, GET_MODE (plus_arg1)))
18898         {
18899           if ((addr_mask & RELOAD_REG_INDEXED) == 0
18900               || !legitimate_indexed_address_p (addr, false))
18901             {
18902               extra_cost = 1;
18903               type = "indexed";
18904             }
18905         }
18906
18907       else if ((addr_mask & RELOAD_REG_QUAD_OFFSET) != 0
18908                && CONST_INT_P (plus_arg1))
18909         {
18910           if (!quad_address_offset_p (INTVAL (plus_arg1)))
18911             {
18912               extra_cost = 1;
18913               type = "vector d-form offset";
18914             }
18915         }
18916
18917       /* Make sure the register class can handle offset addresses.  */
18918       else if (rs6000_legitimate_offset_address_p (mode, addr, false, true))
18919         {
18920           if ((addr_mask & RELOAD_REG_OFFSET) == 0)
18921             {
18922               extra_cost = 1;
18923               type = "offset #2";
18924             }
18925         }
18926
18927       else
18928         {
18929           fail_msg = "bad PLUS";
18930           extra_cost = -1;
18931         }
18932
18933       break;
18934
18935     case LO_SUM:
18936       /* Quad offsets are restricted and can't handle normal addresses.  */
18937       if ((addr_mask & RELOAD_REG_QUAD_OFFSET) != 0)
18938         {
18939           extra_cost = -1;
18940           type = "vector d-form lo_sum";
18941         }
18942
18943       else if (!legitimate_lo_sum_address_p (mode, addr, false))
18944         {
18945           fail_msg = "bad LO_SUM";
18946           extra_cost = -1;
18947         }
18948
18949       if ((addr_mask & RELOAD_REG_OFFSET) == 0)
18950         {
18951           extra_cost = 1;
18952           type = "lo_sum";
18953         }
18954       break;
18955
18956       /* Static addresses need to create a TOC entry.  */
18957     case CONST:
18958     case SYMBOL_REF:
18959     case LABEL_REF:
18960       if ((addr_mask & RELOAD_REG_QUAD_OFFSET) != 0)
18961         {
18962           extra_cost = -1;
18963           type = "vector d-form lo_sum #2";
18964         }
18965
18966       else
18967         {
18968           type = "address";
18969           extra_cost = rs6000_secondary_reload_toc_costs (addr_mask);
18970         }
18971       break;
18972
18973       /* TOC references look like offsetable memory.  */
18974     case UNSPEC:
18975       if (TARGET_CMODEL == CMODEL_SMALL || XINT (addr, 1) != UNSPEC_TOCREL)
18976         {
18977           fail_msg = "bad UNSPEC";
18978           extra_cost = -1;
18979         }
18980
18981       else if ((addr_mask & RELOAD_REG_QUAD_OFFSET) != 0)
18982         {
18983           extra_cost = -1;
18984           type = "vector d-form lo_sum #3";
18985         }
18986
18987       else if ((addr_mask & RELOAD_REG_OFFSET) == 0)
18988         {
18989           extra_cost = 1;
18990           type = "toc reference";
18991         }
18992       break;
18993
18994     default:
18995         {
18996           fail_msg = "bad address";
18997           extra_cost = -1;
18998         }
18999     }
19000
19001   if (TARGET_DEBUG_ADDR /* && extra_cost != 0 */)
19002     {
19003       if (extra_cost < 0)
19004         fprintf (stderr,
19005                  "rs6000_secondary_reload_memory error: mode = %s, "
19006                  "class = %s, addr_mask = '%s', %s\n",
19007                  GET_MODE_NAME (mode),
19008                  reg_class_names[rclass],
19009                  rs6000_debug_addr_mask (addr_mask, false),
19010                  (fail_msg != NULL) ? fail_msg : "<bad address>");
19011
19012       else
19013         fprintf (stderr,
19014                  "rs6000_secondary_reload_memory: mode = %s, class = %s, "
19015                  "addr_mask = '%s', extra cost = %d, %s\n",
19016                  GET_MODE_NAME (mode),
19017                  reg_class_names[rclass],
19018                  rs6000_debug_addr_mask (addr_mask, false),
19019                  extra_cost,
19020                  (type) ? type : "<none>");
19021
19022       debug_rtx (addr);
19023     }
19024
19025   return extra_cost;
19026 }
19027
19028 /* Helper function for rs6000_secondary_reload to return true if a move to a
19029    different register classe is really a simple move.  */
19030
19031 static bool
19032 rs6000_secondary_reload_simple_move (enum rs6000_reg_type to_type,
19033                                      enum rs6000_reg_type from_type,
19034                                      machine_mode mode)
19035 {
19036   int size = GET_MODE_SIZE (mode);
19037
19038   /* Add support for various direct moves available.  In this function, we only
19039      look at cases where we don't need any extra registers, and one or more
19040      simple move insns are issued.  Originally small integers are not allowed
19041      in FPR/VSX registers.  Single precision binary floating is not a simple
19042      move because we need to convert to the single precision memory layout.
19043      The 4-byte SDmode can be moved.  TDmode values are disallowed since they
19044      need special direct move handling, which we do not support yet.  */
19045   if (TARGET_DIRECT_MOVE
19046       && ((to_type == GPR_REG_TYPE && from_type == VSX_REG_TYPE)
19047           || (to_type == VSX_REG_TYPE && from_type == GPR_REG_TYPE)))
19048     {
19049       if (TARGET_POWERPC64)
19050         {
19051           /* ISA 2.07: MTVSRD or MVFVSRD.  */
19052           if (size == 8)
19053             return true;
19054
19055           /* ISA 3.0: MTVSRDD or MFVSRD + MFVSRLD.  */
19056           if (size == 16 && TARGET_P9_VECTOR && mode != TDmode)
19057             return true;
19058         }
19059
19060       /* ISA 2.07: MTVSRWZ or  MFVSRWZ.  */
19061       if (TARGET_P8_VECTOR)
19062         {
19063           if (mode == SImode)
19064             return true;
19065
19066           if (TARGET_P9_VECTOR && (mode == HImode || mode == QImode))
19067             return true;
19068         }
19069
19070       /* ISA 2.07: MTVSRWZ or  MFVSRWZ.  */
19071       if (mode == SDmode)
19072         return true;
19073     }
19074
19075   /* Power6+: MFTGPR or MFFGPR.  */
19076   else if (TARGET_MFPGPR && TARGET_POWERPC64 && size == 8
19077       && ((to_type == GPR_REG_TYPE && from_type == FPR_REG_TYPE)
19078           || (to_type == FPR_REG_TYPE && from_type == GPR_REG_TYPE)))
19079     return true;
19080
19081   /* Move to/from SPR.  */
19082   else if ((size == 4 || (TARGET_POWERPC64 && size == 8))
19083            && ((to_type == GPR_REG_TYPE && from_type == SPR_REG_TYPE)
19084                || (to_type == SPR_REG_TYPE && from_type == GPR_REG_TYPE)))
19085     return true;
19086
19087   return false;
19088 }
19089
19090 /* Direct move helper function for rs6000_secondary_reload, handle all of the
19091    special direct moves that involve allocating an extra register, return the
19092    insn code of the helper function if there is such a function or
19093    CODE_FOR_nothing if not.  */
19094
19095 static bool
19096 rs6000_secondary_reload_direct_move (enum rs6000_reg_type to_type,
19097                                      enum rs6000_reg_type from_type,
19098                                      machine_mode mode,
19099                                      secondary_reload_info *sri,
19100                                      bool altivec_p)
19101 {
19102   bool ret = false;
19103   enum insn_code icode = CODE_FOR_nothing;
19104   int cost = 0;
19105   int size = GET_MODE_SIZE (mode);
19106
19107   if (TARGET_POWERPC64 && size == 16)
19108     {
19109       /* Handle moving 128-bit values from GPRs to VSX point registers on
19110          ISA 2.07 (power8, power9) when running in 64-bit mode using
19111          XXPERMDI to glue the two 64-bit values back together.  */
19112       if (to_type == VSX_REG_TYPE && from_type == GPR_REG_TYPE)
19113         {
19114           cost = 3;                     /* 2 mtvsrd's, 1 xxpermdi.  */
19115           icode = reg_addr[mode].reload_vsx_gpr;
19116         }
19117
19118       /* Handle moving 128-bit values from VSX point registers to GPRs on
19119          ISA 2.07 when running in 64-bit mode using XXPERMDI to get access to the
19120          bottom 64-bit value.  */
19121       else if (to_type == GPR_REG_TYPE && from_type == VSX_REG_TYPE)
19122         {
19123           cost = 3;                     /* 2 mfvsrd's, 1 xxpermdi.  */
19124           icode = reg_addr[mode].reload_gpr_vsx;
19125         }
19126     }
19127
19128   else if (TARGET_POWERPC64 && mode == SFmode)
19129     {
19130       if (to_type == GPR_REG_TYPE && from_type == VSX_REG_TYPE)
19131         {
19132           cost = 3;                     /* xscvdpspn, mfvsrd, and.  */
19133           icode = reg_addr[mode].reload_gpr_vsx;
19134         }
19135
19136       else if (to_type == VSX_REG_TYPE && from_type == GPR_REG_TYPE)
19137         {
19138           cost = 2;                     /* mtvsrz, xscvspdpn.  */
19139           icode = reg_addr[mode].reload_vsx_gpr;
19140         }
19141     }
19142
19143   else if (!TARGET_POWERPC64 && size == 8)
19144     {
19145       /* Handle moving 64-bit values from GPRs to floating point registers on
19146          ISA 2.07 when running in 32-bit mode using FMRGOW to glue the two
19147          32-bit values back together.  Altivec register classes must be handled
19148          specially since a different instruction is used, and the secondary
19149          reload support requires a single instruction class in the scratch
19150          register constraint.  However, right now TFmode is not allowed in
19151          Altivec registers, so the pattern will never match.  */
19152       if (to_type == VSX_REG_TYPE && from_type == GPR_REG_TYPE && !altivec_p)
19153         {
19154           cost = 3;                     /* 2 mtvsrwz's, 1 fmrgow.  */
19155           icode = reg_addr[mode].reload_fpr_gpr;
19156         }
19157     }
19158
19159   if (icode != CODE_FOR_nothing)
19160     {
19161       ret = true;
19162       if (sri)
19163         {
19164           sri->icode = icode;
19165           sri->extra_cost = cost;
19166         }
19167     }
19168
19169   return ret;
19170 }
19171
19172 /* Return whether a move between two register classes can be done either
19173    directly (simple move) or via a pattern that uses a single extra temporary
19174    (using ISA 2.07's direct move in this case.  */
19175
19176 static bool
19177 rs6000_secondary_reload_move (enum rs6000_reg_type to_type,
19178                               enum rs6000_reg_type from_type,
19179                               machine_mode mode,
19180                               secondary_reload_info *sri,
19181                               bool altivec_p)
19182 {
19183   /* Fall back to load/store reloads if either type is not a register.  */
19184   if (to_type == NO_REG_TYPE || from_type == NO_REG_TYPE)
19185     return false;
19186
19187   /* If we haven't allocated registers yet, assume the move can be done for the
19188      standard register types.  */
19189   if ((to_type == PSEUDO_REG_TYPE && from_type == PSEUDO_REG_TYPE)
19190       || (to_type == PSEUDO_REG_TYPE && IS_STD_REG_TYPE (from_type))
19191       || (from_type == PSEUDO_REG_TYPE && IS_STD_REG_TYPE (to_type)))
19192     return true;
19193
19194   /* Moves to the same set of registers is a simple move for non-specialized
19195      registers.  */
19196   if (to_type == from_type && IS_STD_REG_TYPE (to_type))
19197     return true;
19198
19199   /* Check whether a simple move can be done directly.  */
19200   if (rs6000_secondary_reload_simple_move (to_type, from_type, mode))
19201     {
19202       if (sri)
19203         {
19204           sri->icode = CODE_FOR_nothing;
19205           sri->extra_cost = 0;
19206         }
19207       return true;
19208     }
19209
19210   /* Now check if we can do it in a few steps.  */
19211   return rs6000_secondary_reload_direct_move (to_type, from_type, mode, sri,
19212                                               altivec_p);
19213 }
19214
19215 /* Inform reload about cases where moving X with a mode MODE to a register in
19216    RCLASS requires an extra scratch or immediate register.  Return the class
19217    needed for the immediate register.
19218
19219    For VSX and Altivec, we may need a register to convert sp+offset into
19220    reg+sp.
19221
19222    For misaligned 64-bit gpr loads and stores we need a register to
19223    convert an offset address to indirect.  */
19224
19225 static reg_class_t
19226 rs6000_secondary_reload (bool in_p,
19227                          rtx x,
19228                          reg_class_t rclass_i,
19229                          machine_mode mode,
19230                          secondary_reload_info *sri)
19231 {
19232   enum reg_class rclass = (enum reg_class) rclass_i;
19233   reg_class_t ret = ALL_REGS;
19234   enum insn_code icode;
19235   bool default_p = false;
19236   bool done_p = false;
19237
19238   /* Allow subreg of memory before/during reload.  */
19239   bool memory_p = (MEM_P (x)
19240                    || (!reload_completed && SUBREG_P (x)
19241                        && MEM_P (SUBREG_REG (x))));
19242
19243   sri->icode = CODE_FOR_nothing;
19244   sri->t_icode = CODE_FOR_nothing;
19245   sri->extra_cost = 0;
19246   icode = ((in_p)
19247            ? reg_addr[mode].reload_load
19248            : reg_addr[mode].reload_store);
19249
19250   if (REG_P (x) || register_operand (x, mode))
19251     {
19252       enum rs6000_reg_type to_type = reg_class_to_reg_type[(int)rclass];
19253       bool altivec_p = (rclass == ALTIVEC_REGS);
19254       enum rs6000_reg_type from_type = register_to_reg_type (x, &altivec_p);
19255
19256       if (!in_p)
19257         std::swap (to_type, from_type);
19258
19259       /* Can we do a direct move of some sort?  */
19260       if (rs6000_secondary_reload_move (to_type, from_type, mode, sri,
19261                                         altivec_p))
19262         {
19263           icode = (enum insn_code)sri->icode;
19264           default_p = false;
19265           done_p = true;
19266           ret = NO_REGS;
19267         }
19268     }
19269
19270   /* Make sure 0.0 is not reloaded or forced into memory.  */
19271   if (x == CONST0_RTX (mode) && VSX_REG_CLASS_P (rclass))
19272     {
19273       ret = NO_REGS;
19274       default_p = false;
19275       done_p = true;
19276     }
19277
19278   /* If this is a scalar floating point value and we want to load it into the
19279      traditional Altivec registers, do it via a move via a traditional floating
19280      point register, unless we have D-form addressing.  Also make sure that
19281      non-zero constants use a FPR.  */
19282   if (!done_p && reg_addr[mode].scalar_in_vmx_p
19283       && !mode_supports_vmx_dform (mode)
19284       && (rclass == VSX_REGS || rclass == ALTIVEC_REGS)
19285       && (memory_p || CONST_DOUBLE_P (x)))
19286     {
19287       ret = FLOAT_REGS;
19288       default_p = false;
19289       done_p = true;
19290     }
19291
19292   /* Handle reload of load/stores if we have reload helper functions.  */
19293   if (!done_p && icode != CODE_FOR_nothing && memory_p)
19294     {
19295       int extra_cost = rs6000_secondary_reload_memory (XEXP (x, 0), rclass,
19296                                                        mode);
19297
19298       if (extra_cost >= 0)
19299         {
19300           done_p = true;
19301           ret = NO_REGS;
19302           if (extra_cost > 0)
19303             {
19304               sri->extra_cost = extra_cost;
19305               sri->icode = icode;
19306             }
19307         }
19308     }
19309
19310   /* Handle unaligned loads and stores of integer registers.  */
19311   if (!done_p && TARGET_POWERPC64
19312       && reg_class_to_reg_type[(int)rclass] == GPR_REG_TYPE
19313       && memory_p
19314       && GET_MODE_SIZE (GET_MODE (x)) >= UNITS_PER_WORD)
19315     {
19316       rtx addr = XEXP (x, 0);
19317       rtx off = address_offset (addr);
19318
19319       if (off != NULL_RTX)
19320         {
19321           unsigned int extra = GET_MODE_SIZE (GET_MODE (x)) - UNITS_PER_WORD;
19322           unsigned HOST_WIDE_INT offset = INTVAL (off);
19323
19324           /* We need a secondary reload when our legitimate_address_p
19325              says the address is good (as otherwise the entire address
19326              will be reloaded), and the offset is not a multiple of
19327              four or we have an address wrap.  Address wrap will only
19328              occur for LO_SUMs since legitimate_offset_address_p
19329              rejects addresses for 16-byte mems that will wrap.  */
19330           if (GET_CODE (addr) == LO_SUM
19331               ? (1 /* legitimate_address_p allows any offset for lo_sum */
19332                  && ((offset & 3) != 0
19333                      || ((offset & 0xffff) ^ 0x8000) >= 0x10000 - extra))
19334               : (offset + 0x8000 < 0x10000 - extra /* legitimate_address_p */
19335                  && (offset & 3) != 0))
19336             {
19337               /* -m32 -mpowerpc64 needs to use a 32-bit scratch register.  */
19338               if (in_p)
19339                 sri->icode = ((TARGET_32BIT) ? CODE_FOR_reload_si_load
19340                               : CODE_FOR_reload_di_load);
19341               else
19342                 sri->icode = ((TARGET_32BIT) ? CODE_FOR_reload_si_store
19343                               : CODE_FOR_reload_di_store);
19344               sri->extra_cost = 2;
19345               ret = NO_REGS;
19346               done_p = true;
19347             }
19348           else
19349             default_p = true;
19350         }
19351       else
19352         default_p = true;
19353     }
19354
19355   if (!done_p && !TARGET_POWERPC64
19356       && reg_class_to_reg_type[(int)rclass] == GPR_REG_TYPE
19357       && memory_p
19358       && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD)
19359     {
19360       rtx addr = XEXP (x, 0);
19361       rtx off = address_offset (addr);
19362
19363       if (off != NULL_RTX)
19364         {
19365           unsigned int extra = GET_MODE_SIZE (GET_MODE (x)) - UNITS_PER_WORD;
19366           unsigned HOST_WIDE_INT offset = INTVAL (off);
19367
19368           /* We need a secondary reload when our legitimate_address_p
19369              says the address is good (as otherwise the entire address
19370              will be reloaded), and we have a wrap.
19371
19372              legitimate_lo_sum_address_p allows LO_SUM addresses to
19373              have any offset so test for wrap in the low 16 bits.
19374
19375              legitimate_offset_address_p checks for the range
19376              [-0x8000,0x7fff] for mode size of 8 and [-0x8000,0x7ff7]
19377              for mode size of 16.  We wrap at [0x7ffc,0x7fff] and
19378              [0x7ff4,0x7fff] respectively, so test for the
19379              intersection of these ranges, [0x7ffc,0x7fff] and
19380              [0x7ff4,0x7ff7] respectively.
19381
19382              Note that the address we see here may have been
19383              manipulated by legitimize_reload_address.  */
19384           if (GET_CODE (addr) == LO_SUM
19385               ? ((offset & 0xffff) ^ 0x8000) >= 0x10000 - extra
19386               : offset - (0x8000 - extra) < UNITS_PER_WORD)
19387             {
19388               if (in_p)
19389                 sri->icode = CODE_FOR_reload_si_load;
19390               else
19391                 sri->icode = CODE_FOR_reload_si_store;
19392               sri->extra_cost = 2;
19393               ret = NO_REGS;
19394               done_p = true;
19395             }
19396           else
19397             default_p = true;
19398         }
19399       else
19400         default_p = true;
19401     }
19402
19403   if (!done_p)
19404     default_p = true;
19405
19406   if (default_p)
19407     ret = default_secondary_reload (in_p, x, rclass, mode, sri);
19408
19409   gcc_assert (ret != ALL_REGS);
19410
19411   if (TARGET_DEBUG_ADDR)
19412     {
19413       fprintf (stderr,
19414                "\nrs6000_secondary_reload, return %s, in_p = %s, rclass = %s, "
19415                "mode = %s",
19416                reg_class_names[ret],
19417                in_p ? "true" : "false",
19418                reg_class_names[rclass],
19419                GET_MODE_NAME (mode));
19420
19421       if (reload_completed)
19422         fputs (", after reload", stderr);
19423
19424       if (!done_p)
19425         fputs (", done_p not set", stderr);
19426
19427       if (default_p)
19428         fputs (", default secondary reload", stderr);
19429
19430       if (sri->icode != CODE_FOR_nothing)
19431         fprintf (stderr, ", reload func = %s, extra cost = %d",
19432                  insn_data[sri->icode].name, sri->extra_cost);
19433
19434       else if (sri->extra_cost > 0)
19435         fprintf (stderr, ", extra cost = %d", sri->extra_cost);
19436
19437       fputs ("\n", stderr);
19438       debug_rtx (x);
19439     }
19440
19441   return ret;
19442 }
19443
19444 /* Better tracing for rs6000_secondary_reload_inner.  */
19445
19446 static void
19447 rs6000_secondary_reload_trace (int line, rtx reg, rtx mem, rtx scratch,
19448                                bool store_p)
19449 {
19450   rtx set, clobber;
19451
19452   gcc_assert (reg != NULL_RTX && mem != NULL_RTX && scratch != NULL_RTX);
19453
19454   fprintf (stderr, "rs6000_secondary_reload_inner:%d, type = %s\n", line,
19455            store_p ? "store" : "load");
19456
19457   if (store_p)
19458     set = gen_rtx_SET (mem, reg);
19459   else
19460     set = gen_rtx_SET (reg, mem);
19461
19462   clobber = gen_rtx_CLOBBER (VOIDmode, scratch);
19463   debug_rtx (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber)));
19464 }
19465
19466 static void rs6000_secondary_reload_fail (int, rtx, rtx, rtx, bool)
19467   ATTRIBUTE_NORETURN;
19468
19469 static void
19470 rs6000_secondary_reload_fail (int line, rtx reg, rtx mem, rtx scratch,
19471                               bool store_p)
19472 {
19473   rs6000_secondary_reload_trace (line, reg, mem, scratch, store_p);
19474   gcc_unreachable ();
19475 }
19476
19477 /* Fixup reload addresses for values in GPR, FPR, and VMX registers that have
19478    reload helper functions.  These were identified in
19479    rs6000_secondary_reload_memory, and if reload decided to use the secondary
19480    reload, it calls the insns:
19481         reload_<RELOAD:mode>_<P:mptrsize>_store
19482         reload_<RELOAD:mode>_<P:mptrsize>_load
19483
19484    which in turn calls this function, to do whatever is necessary to create
19485    valid addresses.  */
19486
19487 void
19488 rs6000_secondary_reload_inner (rtx reg, rtx mem, rtx scratch, bool store_p)
19489 {
19490   int regno = true_regnum (reg);
19491   machine_mode mode = GET_MODE (reg);
19492   addr_mask_type addr_mask;
19493   rtx addr;
19494   rtx new_addr;
19495   rtx op_reg, op0, op1;
19496   rtx and_op;
19497   rtx cc_clobber;
19498   rtvec rv;
19499
19500   if (regno < 0 || !HARD_REGISTER_NUM_P (regno) || !MEM_P (mem)
19501       || !base_reg_operand (scratch, GET_MODE (scratch)))
19502     rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19503
19504   if (IN_RANGE (regno, FIRST_GPR_REGNO, LAST_GPR_REGNO))
19505     addr_mask = reg_addr[mode].addr_mask[RELOAD_REG_GPR];
19506
19507   else if (IN_RANGE (regno, FIRST_FPR_REGNO, LAST_FPR_REGNO))
19508     addr_mask = reg_addr[mode].addr_mask[RELOAD_REG_FPR];
19509
19510   else if (IN_RANGE (regno, FIRST_ALTIVEC_REGNO, LAST_ALTIVEC_REGNO))
19511     addr_mask = reg_addr[mode].addr_mask[RELOAD_REG_VMX];
19512
19513   else
19514     rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19515
19516   /* Make sure the mode is valid in this register class.  */
19517   if ((addr_mask & RELOAD_REG_VALID) == 0)
19518     rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19519
19520   if (TARGET_DEBUG_ADDR)
19521     rs6000_secondary_reload_trace (__LINE__, reg, mem, scratch, store_p);
19522
19523   new_addr = addr = XEXP (mem, 0);
19524   switch (GET_CODE (addr))
19525     {
19526       /* Does the register class support auto update forms for this mode?  If
19527          not, do the update now.  We don't need a scratch register, since the
19528          powerpc only supports PRE_INC, PRE_DEC, and PRE_MODIFY.  */
19529     case PRE_INC:
19530     case PRE_DEC:
19531       op_reg = XEXP (addr, 0);
19532       if (!base_reg_operand (op_reg, Pmode))
19533         rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19534
19535       if ((addr_mask & RELOAD_REG_PRE_INCDEC) == 0)
19536         {
19537           int delta = GET_MODE_SIZE (mode);
19538           if (GET_CODE (addr) == PRE_DEC)
19539             delta = -delta;
19540           emit_insn (gen_add2_insn (op_reg, GEN_INT (delta)));
19541           new_addr = op_reg;
19542         }
19543       break;
19544
19545     case PRE_MODIFY:
19546       op0 = XEXP (addr, 0);
19547       op1 = XEXP (addr, 1);
19548       if (!base_reg_operand (op0, Pmode)
19549           || GET_CODE (op1) != PLUS
19550           || !rtx_equal_p (op0, XEXP (op1, 0)))
19551         rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19552
19553       if ((addr_mask & RELOAD_REG_PRE_MODIFY) == 0)
19554         {
19555           emit_insn (gen_rtx_SET (op0, op1));
19556           new_addr = reg;
19557         }
19558       break;
19559
19560       /* Do we need to simulate AND -16 to clear the bottom address bits used
19561          in VMX load/stores?  */
19562     case AND:
19563       op0 = XEXP (addr, 0);
19564       op1 = XEXP (addr, 1);
19565       if ((addr_mask & RELOAD_REG_AND_M16) == 0)
19566         {
19567           if (REG_P (op0) || SUBREG_P (op0))
19568             op_reg = op0;
19569
19570           else if (GET_CODE (op1) == PLUS)
19571             {
19572               emit_insn (gen_rtx_SET (scratch, op1));
19573               op_reg = scratch;
19574             }
19575
19576           else
19577             rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19578
19579           and_op = gen_rtx_AND (GET_MODE (scratch), op_reg, op1);
19580           cc_clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
19581           rv = gen_rtvec (2, gen_rtx_SET (scratch, and_op), cc_clobber);
19582           emit_insn (gen_rtx_PARALLEL (VOIDmode, rv));
19583           new_addr = scratch;
19584         }
19585       break;
19586
19587       /* If this is an indirect address, make sure it is a base register.  */
19588     case REG:
19589     case SUBREG:
19590       if (!base_reg_operand (addr, GET_MODE (addr)))
19591         {
19592           emit_insn (gen_rtx_SET (scratch, addr));
19593           new_addr = scratch;
19594         }
19595       break;
19596
19597       /* If this is an indexed address, make sure the register class can handle
19598          indexed addresses for this mode.  */
19599     case PLUS:
19600       op0 = XEXP (addr, 0);
19601       op1 = XEXP (addr, 1);
19602       if (!base_reg_operand (op0, Pmode))
19603         rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19604
19605       else if (int_reg_operand (op1, Pmode))
19606         {
19607           if ((addr_mask & RELOAD_REG_INDEXED) == 0)
19608             {
19609               emit_insn (gen_rtx_SET (scratch, addr));
19610               new_addr = scratch;
19611             }
19612         }
19613
19614       else if (mode_supports_dq_form (mode) && CONST_INT_P (op1))
19615         {
19616           if (((addr_mask & RELOAD_REG_QUAD_OFFSET) == 0)
19617               || !quad_address_p (addr, mode, false))
19618             {
19619               emit_insn (gen_rtx_SET (scratch, addr));
19620               new_addr = scratch;
19621             }
19622         }
19623
19624       /* Make sure the register class can handle offset addresses.  */
19625       else if (rs6000_legitimate_offset_address_p (mode, addr, false, true))
19626         {
19627           if ((addr_mask & RELOAD_REG_OFFSET) == 0)
19628             {
19629               emit_insn (gen_rtx_SET (scratch, addr));
19630               new_addr = scratch;
19631             }
19632         }
19633
19634       else
19635         rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19636
19637       break;
19638
19639     case LO_SUM:
19640       op0 = XEXP (addr, 0);
19641       op1 = XEXP (addr, 1);
19642       if (!base_reg_operand (op0, Pmode))
19643         rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19644
19645       else if (int_reg_operand (op1, Pmode))
19646         {
19647           if ((addr_mask & RELOAD_REG_INDEXED) == 0)
19648             {
19649               emit_insn (gen_rtx_SET (scratch, addr));
19650               new_addr = scratch;
19651             }
19652         }
19653
19654       /* Quad offsets are restricted and can't handle normal addresses.  */
19655       else if (mode_supports_dq_form (mode))
19656         {
19657           emit_insn (gen_rtx_SET (scratch, addr));
19658           new_addr = scratch;
19659         }
19660
19661       /* Make sure the register class can handle offset addresses.  */
19662       else if (legitimate_lo_sum_address_p (mode, addr, false))
19663         {
19664           if ((addr_mask & RELOAD_REG_OFFSET) == 0)
19665             {
19666               emit_insn (gen_rtx_SET (scratch, addr));
19667               new_addr = scratch;
19668             }
19669         }
19670
19671       else
19672         rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19673
19674       break;
19675
19676     case SYMBOL_REF:
19677     case CONST:
19678     case LABEL_REF:
19679       rs6000_emit_move (scratch, addr, Pmode);
19680       new_addr = scratch;
19681       break;
19682
19683     default:
19684       rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19685     }
19686
19687   /* Adjust the address if it changed.  */
19688   if (addr != new_addr)
19689     {
19690       mem = replace_equiv_address_nv (mem, new_addr);
19691       if (TARGET_DEBUG_ADDR)
19692         fprintf (stderr, "\nrs6000_secondary_reload_inner, mem adjusted.\n");
19693     }
19694
19695   /* Now create the move.  */
19696   if (store_p)
19697     emit_insn (gen_rtx_SET (mem, reg));
19698   else
19699     emit_insn (gen_rtx_SET (reg, mem));
19700
19701   return;
19702 }
19703
19704 /* Convert reloads involving 64-bit gprs and misaligned offset
19705    addressing, or multiple 32-bit gprs and offsets that are too large,
19706    to use indirect addressing.  */
19707
19708 void
19709 rs6000_secondary_reload_gpr (rtx reg, rtx mem, rtx scratch, bool store_p)
19710 {
19711   int regno = true_regnum (reg);
19712   enum reg_class rclass;
19713   rtx addr;
19714   rtx scratch_or_premodify = scratch;
19715
19716   if (TARGET_DEBUG_ADDR)
19717     {
19718       fprintf (stderr, "\nrs6000_secondary_reload_gpr, type = %s\n",
19719                store_p ? "store" : "load");
19720       fprintf (stderr, "reg:\n");
19721       debug_rtx (reg);
19722       fprintf (stderr, "mem:\n");
19723       debug_rtx (mem);
19724       fprintf (stderr, "scratch:\n");
19725       debug_rtx (scratch);
19726     }
19727
19728   gcc_assert (regno >= 0 && HARD_REGISTER_NUM_P (regno));
19729   gcc_assert (MEM_P (mem));
19730   rclass = REGNO_REG_CLASS (regno);
19731   gcc_assert (rclass == GENERAL_REGS || rclass == BASE_REGS);
19732   addr = XEXP (mem, 0);
19733
19734   if (GET_CODE (addr) == PRE_MODIFY)
19735     {
19736       gcc_assert (REG_P (XEXP (addr, 0))
19737                   && GET_CODE (XEXP (addr, 1)) == PLUS
19738                   && XEXP (XEXP (addr, 1), 0) == XEXP (addr, 0));
19739       scratch_or_premodify = XEXP (addr, 0);
19740       addr = XEXP (addr, 1);
19741     }
19742   gcc_assert (GET_CODE (addr) == PLUS || GET_CODE (addr) == LO_SUM);
19743
19744   rs6000_emit_move (scratch_or_premodify, addr, Pmode);
19745
19746   mem = replace_equiv_address_nv (mem, scratch_or_premodify);
19747
19748   /* Now create the move.  */
19749   if (store_p)
19750     emit_insn (gen_rtx_SET (mem, reg));
19751   else
19752     emit_insn (gen_rtx_SET (reg, mem));
19753
19754   return;
19755 }
19756
19757 /* Given an rtx X being reloaded into a reg required to be
19758    in class CLASS, return the class of reg to actually use.
19759    In general this is just CLASS; but on some machines
19760    in some cases it is preferable to use a more restrictive class.
19761
19762    On the RS/6000, we have to return NO_REGS when we want to reload a
19763    floating-point CONST_DOUBLE to force it to be copied to memory.
19764
19765    We also don't want to reload integer values into floating-point
19766    registers if we can at all help it.  In fact, this can
19767    cause reload to die, if it tries to generate a reload of CTR
19768    into a FP register and discovers it doesn't have the memory location
19769    required.
19770
19771    ??? Would it be a good idea to have reload do the converse, that is
19772    try to reload floating modes into FP registers if possible?
19773  */
19774
19775 static enum reg_class
19776 rs6000_preferred_reload_class (rtx x, enum reg_class rclass)
19777 {
19778   machine_mode mode = GET_MODE (x);
19779   bool is_constant = CONSTANT_P (x);
19780
19781   /* If a mode can't go in FPR/ALTIVEC/VSX registers, don't return a preferred
19782      reload class for it.  */
19783   if ((rclass == ALTIVEC_REGS || rclass == VSX_REGS)
19784       && (reg_addr[mode].addr_mask[RELOAD_REG_VMX] & RELOAD_REG_VALID) == 0)
19785     return NO_REGS;
19786
19787   if ((rclass == FLOAT_REGS || rclass == VSX_REGS)
19788       && (reg_addr[mode].addr_mask[RELOAD_REG_FPR] & RELOAD_REG_VALID) == 0)
19789     return NO_REGS;
19790
19791   /* For VSX, see if we should prefer FLOAT_REGS or ALTIVEC_REGS.  Do not allow
19792      the reloading of address expressions using PLUS into floating point
19793      registers.  */
19794   if (TARGET_VSX && VSX_REG_CLASS_P (rclass) && GET_CODE (x) != PLUS)
19795     {
19796       if (is_constant)
19797         {
19798           /* Zero is always allowed in all VSX registers.  */
19799           if (x == CONST0_RTX (mode))
19800             return rclass;
19801
19802           /* If this is a vector constant that can be formed with a few Altivec
19803              instructions, we want altivec registers.  */
19804           if (GET_CODE (x) == CONST_VECTOR && easy_vector_constant (x, mode))
19805             return ALTIVEC_REGS;
19806
19807           /* If this is an integer constant that can easily be loaded into
19808              vector registers, allow it.  */
19809           if (CONST_INT_P (x))
19810             {
19811               HOST_WIDE_INT value = INTVAL (x);
19812
19813               /* ISA 2.07 can generate -1 in all registers with XXLORC.  ISA
19814                  2.06 can generate it in the Altivec registers with
19815                  VSPLTI<x>.  */
19816               if (value == -1)
19817                 {
19818                   if (TARGET_P8_VECTOR)
19819                     return rclass;
19820                   else if (rclass == ALTIVEC_REGS || rclass == VSX_REGS)
19821                     return ALTIVEC_REGS;
19822                   else
19823                     return NO_REGS;
19824                 }
19825
19826               /* ISA 3.0 can load -128..127 using the XXSPLTIB instruction and
19827                  a sign extend in the Altivec registers.  */
19828               if (IN_RANGE (value, -128, 127) && TARGET_P9_VECTOR
19829                   && (rclass == ALTIVEC_REGS || rclass == VSX_REGS))
19830                 return ALTIVEC_REGS;
19831             }
19832
19833           /* Force constant to memory.  */
19834           return NO_REGS;
19835         }
19836
19837       /* D-form addressing can easily reload the value.  */
19838       if (mode_supports_vmx_dform (mode)
19839           || mode_supports_dq_form (mode))
19840         return rclass;
19841
19842       /* If this is a scalar floating point value and we don't have D-form
19843          addressing, prefer the traditional floating point registers so that we
19844          can use D-form (register+offset) addressing.  */
19845       if (rclass == VSX_REGS
19846           && (mode == SFmode || GET_MODE_SIZE (mode) == 8))
19847         return FLOAT_REGS;
19848
19849       /* Prefer the Altivec registers if Altivec is handling the vector
19850          operations (i.e. V16QI, V8HI, and V4SI), or if we prefer Altivec
19851          loads.  */
19852       if (VECTOR_UNIT_ALTIVEC_P (mode) || VECTOR_MEM_ALTIVEC_P (mode)
19853           || mode == V1TImode)
19854         return ALTIVEC_REGS;
19855
19856       return rclass;
19857     }
19858
19859   if (is_constant || GET_CODE (x) == PLUS)
19860     {
19861       if (reg_class_subset_p (GENERAL_REGS, rclass))
19862         return GENERAL_REGS;
19863       if (reg_class_subset_p (BASE_REGS, rclass))
19864         return BASE_REGS;
19865       return NO_REGS;
19866     }
19867
19868   if (GET_MODE_CLASS (mode) == MODE_INT && rclass == GEN_OR_FLOAT_REGS)
19869     return GENERAL_REGS;
19870
19871   return rclass;
19872 }
19873
19874 /* Debug version of rs6000_preferred_reload_class.  */
19875 static enum reg_class
19876 rs6000_debug_preferred_reload_class (rtx x, enum reg_class rclass)
19877 {
19878   enum reg_class ret = rs6000_preferred_reload_class (x, rclass);
19879
19880   fprintf (stderr,
19881            "\nrs6000_preferred_reload_class, return %s, rclass = %s, "
19882            "mode = %s, x:\n",
19883            reg_class_names[ret], reg_class_names[rclass],
19884            GET_MODE_NAME (GET_MODE (x)));
19885   debug_rtx (x);
19886
19887   return ret;
19888 }
19889
19890 /* If we are copying between FP or AltiVec registers and anything else, we need
19891    a memory location.  The exception is when we are targeting ppc64 and the
19892    move to/from fpr to gpr instructions are available.  Also, under VSX, you
19893    can copy vector registers from the FP register set to the Altivec register
19894    set and vice versa.  */
19895
19896 static bool
19897 rs6000_secondary_memory_needed (machine_mode mode,
19898                                 reg_class_t from_class,
19899                                 reg_class_t to_class)
19900 {
19901   enum rs6000_reg_type from_type, to_type;
19902   bool altivec_p = ((from_class == ALTIVEC_REGS)
19903                     || (to_class == ALTIVEC_REGS));
19904
19905   /* If a simple/direct move is available, we don't need secondary memory  */
19906   from_type = reg_class_to_reg_type[(int)from_class];
19907   to_type = reg_class_to_reg_type[(int)to_class];
19908
19909   if (rs6000_secondary_reload_move (to_type, from_type, mode,
19910                                     (secondary_reload_info *)0, altivec_p))
19911     return false;
19912
19913   /* If we have a floating point or vector register class, we need to use
19914      memory to transfer the data.  */
19915   if (IS_FP_VECT_REG_TYPE (from_type) || IS_FP_VECT_REG_TYPE (to_type))
19916     return true;
19917
19918   return false;
19919 }
19920
19921 /* Debug version of rs6000_secondary_memory_needed.  */
19922 static bool
19923 rs6000_debug_secondary_memory_needed (machine_mode mode,
19924                                       reg_class_t from_class,
19925                                       reg_class_t to_class)
19926 {
19927   bool ret = rs6000_secondary_memory_needed (mode, from_class, to_class);
19928
19929   fprintf (stderr,
19930            "rs6000_secondary_memory_needed, return: %s, from_class = %s, "
19931            "to_class = %s, mode = %s\n",
19932            ret ? "true" : "false",
19933            reg_class_names[from_class],
19934            reg_class_names[to_class],
19935            GET_MODE_NAME (mode));
19936
19937   return ret;
19938 }
19939
19940 /* Return the register class of a scratch register needed to copy IN into
19941    or out of a register in RCLASS in MODE.  If it can be done directly,
19942    NO_REGS is returned.  */
19943
19944 static enum reg_class
19945 rs6000_secondary_reload_class (enum reg_class rclass, machine_mode mode,
19946                                rtx in)
19947 {
19948   int regno;
19949
19950   if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
19951 #if TARGET_MACHO
19952                      && MACHOPIC_INDIRECT
19953 #endif
19954                      ))
19955     {
19956       /* We cannot copy a symbolic operand directly into anything
19957          other than BASE_REGS for TARGET_ELF.  So indicate that a
19958          register from BASE_REGS is needed as an intermediate
19959          register.
19960
19961          On Darwin, pic addresses require a load from memory, which
19962          needs a base register.  */
19963       if (rclass != BASE_REGS
19964           && (SYMBOL_REF_P (in)
19965               || GET_CODE (in) == HIGH
19966               || GET_CODE (in) == LABEL_REF
19967               || GET_CODE (in) == CONST))
19968         return BASE_REGS;
19969     }
19970
19971   if (REG_P (in))
19972     {
19973       regno = REGNO (in);
19974       if (!HARD_REGISTER_NUM_P (regno))
19975         {
19976           regno = true_regnum (in);
19977           if (!HARD_REGISTER_NUM_P (regno))
19978             regno = -1;
19979         }
19980     }
19981   else if (SUBREG_P (in))
19982     {
19983       regno = true_regnum (in);
19984       if (!HARD_REGISTER_NUM_P (regno))
19985         regno = -1;
19986     }
19987   else
19988     regno = -1;
19989
19990   /* If we have VSX register moves, prefer moving scalar values between
19991      Altivec registers and GPR by going via an FPR (and then via memory)
19992      instead of reloading the secondary memory address for Altivec moves.  */
19993   if (TARGET_VSX
19994       && GET_MODE_SIZE (mode) < 16
19995       && !mode_supports_vmx_dform (mode)
19996       && (((rclass == GENERAL_REGS || rclass == BASE_REGS)
19997            && (regno >= 0 && ALTIVEC_REGNO_P (regno)))
19998           || ((rclass == VSX_REGS || rclass == ALTIVEC_REGS)
19999               && (regno >= 0 && INT_REGNO_P (regno)))))
20000     return FLOAT_REGS;
20001
20002   /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
20003      into anything.  */
20004   if (rclass == GENERAL_REGS || rclass == BASE_REGS
20005       || (regno >= 0 && INT_REGNO_P (regno)))
20006     return NO_REGS;
20007
20008   /* Constants, memory, and VSX registers can go into VSX registers (both the
20009      traditional floating point and the altivec registers).  */
20010   if (rclass == VSX_REGS
20011       && (regno == -1 || VSX_REGNO_P (regno)))
20012     return NO_REGS;
20013
20014   /* Constants, memory, and FP registers can go into FP registers.  */
20015   if ((regno == -1 || FP_REGNO_P (regno))
20016       && (rclass == FLOAT_REGS || rclass == GEN_OR_FLOAT_REGS))
20017     return (mode != SDmode || lra_in_progress) ? NO_REGS : GENERAL_REGS;
20018
20019   /* Memory, and AltiVec registers can go into AltiVec registers.  */
20020   if ((regno == -1 || ALTIVEC_REGNO_P (regno))
20021       && rclass == ALTIVEC_REGS)
20022     return NO_REGS;
20023
20024   /* We can copy among the CR registers.  */
20025   if ((rclass == CR_REGS || rclass == CR0_REGS)
20026       && regno >= 0 && CR_REGNO_P (regno))
20027     return NO_REGS;
20028
20029   /* Otherwise, we need GENERAL_REGS.  */
20030   return GENERAL_REGS;
20031 }
20032
20033 /* Debug version of rs6000_secondary_reload_class.  */
20034 static enum reg_class
20035 rs6000_debug_secondary_reload_class (enum reg_class rclass,
20036                                      machine_mode mode, rtx in)
20037 {
20038   enum reg_class ret = rs6000_secondary_reload_class (rclass, mode, in);
20039   fprintf (stderr,
20040            "\nrs6000_secondary_reload_class, return %s, rclass = %s, "
20041            "mode = %s, input rtx:\n",
20042            reg_class_names[ret], reg_class_names[rclass],
20043            GET_MODE_NAME (mode));
20044   debug_rtx (in);
20045
20046   return ret;
20047 }
20048
20049 /* Implement TARGET_CAN_CHANGE_MODE_CLASS.  */
20050
20051 static bool
20052 rs6000_can_change_mode_class (machine_mode from,
20053                               machine_mode to,
20054                               reg_class_t rclass)
20055 {
20056   unsigned from_size = GET_MODE_SIZE (from);
20057   unsigned to_size = GET_MODE_SIZE (to);
20058
20059   if (from_size != to_size)
20060     {
20061       enum reg_class xclass = (TARGET_VSX) ? VSX_REGS : FLOAT_REGS;
20062
20063       if (reg_classes_intersect_p (xclass, rclass))
20064         {
20065           unsigned to_nregs = hard_regno_nregs (FIRST_FPR_REGNO, to);
20066           unsigned from_nregs = hard_regno_nregs (FIRST_FPR_REGNO, from);
20067           bool to_float128_vector_p = FLOAT128_VECTOR_P (to);
20068           bool from_float128_vector_p = FLOAT128_VECTOR_P (from);
20069
20070           /* Don't allow 64-bit types to overlap with 128-bit types that take a
20071              single register under VSX because the scalar part of the register
20072              is in the upper 64-bits, and not the lower 64-bits.  Types like
20073              TFmode/TDmode that take 2 scalar register can overlap.  128-bit
20074              IEEE floating point can't overlap, and neither can small
20075              values.  */
20076
20077           if (to_float128_vector_p && from_float128_vector_p)
20078             return true;
20079
20080           else if (to_float128_vector_p || from_float128_vector_p)
20081             return false;
20082
20083           /* TDmode in floating-mode registers must always go into a register
20084              pair with the most significant word in the even-numbered register
20085              to match ISA requirements.  In little-endian mode, this does not
20086              match subreg numbering, so we cannot allow subregs.  */
20087           if (!BYTES_BIG_ENDIAN && (to == TDmode || from == TDmode))
20088             return false;
20089
20090           if (from_size < 8 || to_size < 8)
20091             return false;
20092
20093           if (from_size == 8 && (8 * to_nregs) != to_size)
20094             return false;
20095
20096           if (to_size == 8 && (8 * from_nregs) != from_size)
20097             return false;
20098
20099           return true;
20100         }
20101       else
20102         return true;
20103     }
20104
20105   /* Since the VSX register set includes traditional floating point registers
20106      and altivec registers, just check for the size being different instead of
20107      trying to check whether the modes are vector modes.  Otherwise it won't
20108      allow say DF and DI to change classes.  For types like TFmode and TDmode
20109      that take 2 64-bit registers, rather than a single 128-bit register, don't
20110      allow subregs of those types to other 128 bit types.  */
20111   if (TARGET_VSX && VSX_REG_CLASS_P (rclass))
20112     {
20113       unsigned num_regs = (from_size + 15) / 16;
20114       if (hard_regno_nregs (FIRST_FPR_REGNO, to) > num_regs
20115           || hard_regno_nregs (FIRST_FPR_REGNO, from) > num_regs)
20116         return false;
20117
20118       return (from_size == 8 || from_size == 16);
20119     }
20120
20121   if (TARGET_ALTIVEC && rclass == ALTIVEC_REGS
20122       && (ALTIVEC_VECTOR_MODE (from) + ALTIVEC_VECTOR_MODE (to)) == 1)
20123     return false;
20124
20125   return true;
20126 }
20127
20128 /* Debug version of rs6000_can_change_mode_class.  */
20129 static bool
20130 rs6000_debug_can_change_mode_class (machine_mode from,
20131                                     machine_mode to,
20132                                     reg_class_t rclass)
20133 {
20134   bool ret = rs6000_can_change_mode_class (from, to, rclass);
20135
20136   fprintf (stderr,
20137            "rs6000_can_change_mode_class, return %s, from = %s, "
20138            "to = %s, rclass = %s\n",
20139            ret ? "true" : "false",
20140            GET_MODE_NAME (from), GET_MODE_NAME (to),
20141            reg_class_names[rclass]);
20142
20143   return ret;
20144 }
20145 \f
20146 /* Return a string to do a move operation of 128 bits of data.  */
20147
20148 const char *
20149 rs6000_output_move_128bit (rtx operands[])
20150 {
20151   rtx dest = operands[0];
20152   rtx src = operands[1];
20153   machine_mode mode = GET_MODE (dest);
20154   int dest_regno;
20155   int src_regno;
20156   bool dest_gpr_p, dest_fp_p, dest_vmx_p, dest_vsx_p;
20157   bool src_gpr_p, src_fp_p, src_vmx_p, src_vsx_p;
20158
20159   if (REG_P (dest))
20160     {
20161       dest_regno = REGNO (dest);
20162       dest_gpr_p = INT_REGNO_P (dest_regno);
20163       dest_fp_p = FP_REGNO_P (dest_regno);
20164       dest_vmx_p = ALTIVEC_REGNO_P (dest_regno);
20165       dest_vsx_p = dest_fp_p | dest_vmx_p;
20166     }
20167   else
20168     {
20169       dest_regno = -1;
20170       dest_gpr_p = dest_fp_p = dest_vmx_p = dest_vsx_p = false;
20171     }
20172
20173   if (REG_P (src))
20174     {
20175       src_regno = REGNO (src);
20176       src_gpr_p = INT_REGNO_P (src_regno);
20177       src_fp_p = FP_REGNO_P (src_regno);
20178       src_vmx_p = ALTIVEC_REGNO_P (src_regno);
20179       src_vsx_p = src_fp_p | src_vmx_p;
20180     }
20181   else
20182     {
20183       src_regno = -1;
20184       src_gpr_p = src_fp_p = src_vmx_p = src_vsx_p = false;
20185     }
20186
20187   /* Register moves.  */
20188   if (dest_regno >= 0 && src_regno >= 0)
20189     {
20190       if (dest_gpr_p)
20191         {
20192           if (src_gpr_p)
20193             return "#";
20194
20195           if (TARGET_DIRECT_MOVE_128 && src_vsx_p)
20196             return (WORDS_BIG_ENDIAN
20197                     ? "mfvsrd %0,%x1\n\tmfvsrld %L0,%x1"
20198                     : "mfvsrd %L0,%x1\n\tmfvsrld %0,%x1");
20199
20200           else if (TARGET_VSX && TARGET_DIRECT_MOVE && src_vsx_p)
20201             return "#";
20202         }
20203
20204       else if (TARGET_VSX && dest_vsx_p)
20205         {
20206           if (src_vsx_p)
20207             return "xxlor %x0,%x1,%x1";
20208
20209           else if (TARGET_DIRECT_MOVE_128 && src_gpr_p)
20210             return (WORDS_BIG_ENDIAN
20211                     ? "mtvsrdd %x0,%1,%L1"
20212                     : "mtvsrdd %x0,%L1,%1");
20213
20214           else if (TARGET_DIRECT_MOVE && src_gpr_p)
20215             return "#";
20216         }
20217
20218       else if (TARGET_ALTIVEC && dest_vmx_p && src_vmx_p)
20219         return "vor %0,%1,%1";
20220
20221       else if (dest_fp_p && src_fp_p)
20222         return "#";
20223     }
20224
20225   /* Loads.  */
20226   else if (dest_regno >= 0 && MEM_P (src))
20227     {
20228       if (dest_gpr_p)
20229         {
20230           if (TARGET_QUAD_MEMORY && quad_load_store_p (dest, src))
20231             return "lq %0,%1";
20232           else
20233             return "#";
20234         }
20235
20236       else if (TARGET_ALTIVEC && dest_vmx_p
20237                && altivec_indexed_or_indirect_operand (src, mode))
20238         return "lvx %0,%y1";
20239
20240       else if (TARGET_VSX && dest_vsx_p)
20241         {
20242           if (mode_supports_dq_form (mode)
20243               && quad_address_p (XEXP (src, 0), mode, true))
20244             return "lxv %x0,%1";
20245
20246           else if (TARGET_P9_VECTOR)
20247             return "lxvx %x0,%y1";
20248
20249           else if (mode == V16QImode || mode == V8HImode || mode == V4SImode)
20250             return "lxvw4x %x0,%y1";
20251
20252           else
20253             return "lxvd2x %x0,%y1";
20254         }
20255
20256       else if (TARGET_ALTIVEC && dest_vmx_p)
20257         return "lvx %0,%y1";
20258
20259       else if (dest_fp_p)
20260         return "#";
20261     }
20262
20263   /* Stores.  */
20264   else if (src_regno >= 0 && MEM_P (dest))
20265     {
20266       if (src_gpr_p)
20267         {
20268           if (TARGET_QUAD_MEMORY && quad_load_store_p (dest, src))
20269             return "stq %1,%0";
20270           else
20271             return "#";
20272         }
20273
20274       else if (TARGET_ALTIVEC && src_vmx_p
20275                && altivec_indexed_or_indirect_operand (dest, mode))
20276         return "stvx %1,%y0";
20277
20278       else if (TARGET_VSX && src_vsx_p)
20279         {
20280           if (mode_supports_dq_form (mode)
20281               && quad_address_p (XEXP (dest, 0), mode, true))
20282             return "stxv %x1,%0";
20283
20284           else if (TARGET_P9_VECTOR)
20285             return "stxvx %x1,%y0";
20286
20287           else if (mode == V16QImode || mode == V8HImode || mode == V4SImode)
20288             return "stxvw4x %x1,%y0";
20289
20290           else
20291             return "stxvd2x %x1,%y0";
20292         }
20293
20294       else if (TARGET_ALTIVEC && src_vmx_p)
20295         return "stvx %1,%y0";
20296
20297       else if (src_fp_p)
20298         return "#";
20299     }
20300
20301   /* Constants.  */
20302   else if (dest_regno >= 0
20303            && (CONST_INT_P (src)
20304                || CONST_WIDE_INT_P (src)
20305                || CONST_DOUBLE_P (src)
20306                || GET_CODE (src) == CONST_VECTOR))
20307     {
20308       if (dest_gpr_p)
20309         return "#";
20310
20311       else if ((dest_vmx_p && TARGET_ALTIVEC)
20312                || (dest_vsx_p && TARGET_VSX))
20313         return output_vec_const_move (operands);
20314     }
20315
20316   fatal_insn ("Bad 128-bit move", gen_rtx_SET (dest, src));
20317 }
20318
20319 /* Validate a 128-bit move.  */
20320 bool
20321 rs6000_move_128bit_ok_p (rtx operands[])
20322 {
20323   machine_mode mode = GET_MODE (operands[0]);
20324   return (gpc_reg_operand (operands[0], mode)
20325           || gpc_reg_operand (operands[1], mode));
20326 }
20327
20328 /* Return true if a 128-bit move needs to be split.  */
20329 bool
20330 rs6000_split_128bit_ok_p (rtx operands[])
20331 {
20332   if (!reload_completed)
20333     return false;
20334
20335   if (!gpr_or_gpr_p (operands[0], operands[1]))
20336     return false;
20337
20338   if (quad_load_store_p (operands[0], operands[1]))
20339     return false;
20340
20341   return true;
20342 }
20343
20344 \f
20345 /* Given a comparison operation, return the bit number in CCR to test.  We
20346    know this is a valid comparison.
20347
20348    SCC_P is 1 if this is for an scc.  That means that %D will have been
20349    used instead of %C, so the bits will be in different places.
20350
20351    Return -1 if OP isn't a valid comparison for some reason.  */
20352
20353 int
20354 ccr_bit (rtx op, int scc_p)
20355 {
20356   enum rtx_code code = GET_CODE (op);
20357   machine_mode cc_mode;
20358   int cc_regnum;
20359   int base_bit;
20360   rtx reg;
20361
20362   if (!COMPARISON_P (op))
20363     return -1;
20364
20365   reg = XEXP (op, 0);
20366
20367   if (!REG_P (reg) || !CR_REGNO_P (REGNO (reg)))
20368     return -1;
20369
20370   cc_mode = GET_MODE (reg);
20371   cc_regnum = REGNO (reg);
20372   base_bit = 4 * (cc_regnum - CR0_REGNO);
20373
20374   validate_condition_mode (code, cc_mode);
20375
20376   /* When generating a sCOND operation, only positive conditions are
20377      allowed.  */
20378   if (scc_p)
20379     switch (code)
20380       {
20381       case EQ:
20382       case GT:
20383       case LT:
20384       case UNORDERED:
20385       case GTU:
20386       case LTU:
20387         break;
20388       default:
20389         return -1;
20390       }
20391
20392   switch (code)
20393     {
20394     case NE:
20395       return scc_p ? base_bit + 3 : base_bit + 2;
20396     case EQ:
20397       return base_bit + 2;
20398     case GT:  case GTU:  case UNLE:
20399       return base_bit + 1;
20400     case LT:  case LTU:  case UNGE:
20401       return base_bit;
20402     case ORDERED:  case UNORDERED:
20403       return base_bit + 3;
20404
20405     case GE:  case GEU:
20406       /* If scc, we will have done a cror to put the bit in the
20407          unordered position.  So test that bit.  For integer, this is ! LT
20408          unless this is an scc insn.  */
20409       return scc_p ? base_bit + 3 : base_bit;
20410
20411     case LE:  case LEU:
20412       return scc_p ? base_bit + 3 : base_bit + 1;
20413
20414     default:
20415       return -1;
20416     }
20417 }
20418 \f
20419 /* Return the GOT register.  */
20420
20421 rtx
20422 rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
20423 {
20424   /* The second flow pass currently (June 1999) can't update
20425      regs_ever_live without disturbing other parts of the compiler, so
20426      update it here to make the prolog/epilogue code happy.  */
20427   if (!can_create_pseudo_p ()
20428       && !df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
20429     df_set_regs_ever_live (RS6000_PIC_OFFSET_TABLE_REGNUM, true);
20430
20431   crtl->uses_pic_offset_table = 1;
20432
20433   return pic_offset_table_rtx;
20434 }
20435 \f
20436 static rs6000_stack_t stack_info;
20437
20438 /* Function to init struct machine_function.
20439    This will be called, via a pointer variable,
20440    from push_function_context.  */
20441
20442 static struct machine_function *
20443 rs6000_init_machine_status (void)
20444 {
20445   stack_info.reload_completed = 0;
20446   return ggc_cleared_alloc<machine_function> ();
20447 }
20448 \f
20449 #define INT_P(X) (CONST_INT_P (X) && GET_MODE (X) == VOIDmode)
20450
20451 /* Write out a function code label.  */
20452
20453 void
20454 rs6000_output_function_entry (FILE *file, const char *fname)
20455 {
20456   if (fname[0] != '.')
20457     {
20458       switch (DEFAULT_ABI)
20459         {
20460         default:
20461           gcc_unreachable ();
20462
20463         case ABI_AIX:
20464           if (DOT_SYMBOLS)
20465             putc ('.', file);
20466           else
20467             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
20468           break;
20469
20470         case ABI_ELFv2:
20471         case ABI_V4:
20472         case ABI_DARWIN:
20473           break;
20474         }
20475     }
20476
20477   RS6000_OUTPUT_BASENAME (file, fname);
20478 }
20479
20480 /* Print an operand.  Recognize special options, documented below.  */
20481
20482 #if TARGET_ELF
20483 /* Access to .sdata2 through r2 (see -msdata=eabi in invoke.texi) is
20484    only introduced by the linker, when applying the sda21
20485    relocation.  */
20486 #define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
20487 #define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
20488 #else
20489 #define SMALL_DATA_RELOC "sda21"
20490 #define SMALL_DATA_REG 0
20491 #endif
20492
20493 void
20494 print_operand (FILE *file, rtx x, int code)
20495 {
20496   int i;
20497   unsigned HOST_WIDE_INT uval;
20498
20499   switch (code)
20500     {
20501       /* %a is output_address.  */
20502
20503       /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
20504          output_operand.  */
20505
20506     case 'D':
20507       /* Like 'J' but get to the GT bit only.  */
20508       if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
20509         {
20510           output_operand_lossage ("invalid %%D value");
20511           return;
20512         }
20513
20514       /* Bit 1 is GT bit.  */
20515       i = 4 * (REGNO (x) - CR0_REGNO) + 1;
20516
20517       /* Add one for shift count in rlinm for scc.  */
20518       fprintf (file, "%d", i + 1);
20519       return;
20520
20521     case 'e':
20522       /* If the low 16 bits are 0, but some other bit is set, write 's'.  */
20523       if (! INT_P (x))
20524         {
20525           output_operand_lossage ("invalid %%e value");
20526           return;
20527         }
20528
20529       uval = INTVAL (x);
20530       if ((uval & 0xffff) == 0 && uval != 0)
20531         putc ('s', file);
20532       return;
20533
20534     case 'E':
20535       /* X is a CR register.  Print the number of the EQ bit of the CR */
20536       if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
20537         output_operand_lossage ("invalid %%E value");
20538       else
20539         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
20540       return;
20541
20542     case 'f':
20543       /* X is a CR register.  Print the shift count needed to move it
20544          to the high-order four bits.  */
20545       if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
20546         output_operand_lossage ("invalid %%f value");
20547       else
20548         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
20549       return;
20550
20551     case 'F':
20552       /* Similar, but print the count for the rotate in the opposite
20553          direction.  */
20554       if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
20555         output_operand_lossage ("invalid %%F value");
20556       else
20557         fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
20558       return;
20559
20560     case 'G':
20561       /* X is a constant integer.  If it is negative, print "m",
20562          otherwise print "z".  This is to make an aze or ame insn.  */
20563       if (!CONST_INT_P (x))
20564         output_operand_lossage ("invalid %%G value");
20565       else if (INTVAL (x) >= 0)
20566         putc ('z', file);
20567       else
20568         putc ('m', file);
20569       return;
20570
20571     case 'h':
20572       /* If constant, output low-order five bits.  Otherwise, write
20573          normally.  */
20574       if (INT_P (x))
20575         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x) & 31);
20576       else
20577         print_operand (file, x, 0);
20578       return;
20579
20580     case 'H':
20581       /* If constant, output low-order six bits.  Otherwise, write
20582          normally.  */
20583       if (INT_P (x))
20584         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x) & 63);
20585       else
20586         print_operand (file, x, 0);
20587       return;
20588
20589     case 'I':
20590       /* Print `i' if this is a constant, else nothing.  */
20591       if (INT_P (x))
20592         putc ('i', file);
20593       return;
20594
20595     case 'j':
20596       /* Write the bit number in CCR for jump.  */
20597       i = ccr_bit (x, 0);
20598       if (i == -1)
20599         output_operand_lossage ("invalid %%j code");
20600       else
20601         fprintf (file, "%d", i);
20602       return;
20603
20604     case 'J':
20605       /* Similar, but add one for shift count in rlinm for scc and pass
20606          scc flag to `ccr_bit'.  */
20607       i = ccr_bit (x, 1);
20608       if (i == -1)
20609         output_operand_lossage ("invalid %%J code");
20610       else
20611         /* If we want bit 31, write a shift count of zero, not 32.  */
20612         fprintf (file, "%d", i == 31 ? 0 : i + 1);
20613       return;
20614
20615     case 'k':
20616       /* X must be a constant.  Write the 1's complement of the
20617          constant.  */
20618       if (! INT_P (x))
20619         output_operand_lossage ("invalid %%k value");
20620       else
20621         fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INTVAL (x));
20622       return;
20623
20624     case 'K':
20625       /* X must be a symbolic constant on ELF.  Write an
20626          expression suitable for an 'addi' that adds in the low 16
20627          bits of the MEM.  */
20628       if (GET_CODE (x) == CONST)
20629         {
20630           if (GET_CODE (XEXP (x, 0)) != PLUS
20631               || (!SYMBOL_REF_P (XEXP (XEXP (x, 0), 0))
20632                   && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
20633               || !CONST_INT_P (XEXP (XEXP (x, 0), 1)))
20634             output_operand_lossage ("invalid %%K value");
20635         }
20636       print_operand_address (file, x);
20637       fputs ("@l", file);
20638       return;
20639
20640       /* %l is output_asm_label.  */
20641
20642     case 'L':
20643       /* Write second word of DImode or DFmode reference.  Works on register
20644          or non-indexed memory only.  */
20645       if (REG_P (x))
20646         fputs (reg_names[REGNO (x) + 1], file);
20647       else if (MEM_P (x))
20648         {
20649           machine_mode mode = GET_MODE (x);
20650           /* Handle possible auto-increment.  Since it is pre-increment and
20651              we have already done it, we can just use an offset of word.  */
20652           if (GET_CODE (XEXP (x, 0)) == PRE_INC
20653               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
20654             output_address (mode, plus_constant (Pmode, XEXP (XEXP (x, 0), 0),
20655                                                  UNITS_PER_WORD));
20656           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
20657             output_address (mode, plus_constant (Pmode, XEXP (XEXP (x, 0), 0),
20658                                                  UNITS_PER_WORD));
20659           else
20660             output_address (mode, XEXP (adjust_address_nv (x, SImode,
20661                                                            UNITS_PER_WORD),
20662                                   0));
20663
20664           if (small_data_operand (x, GET_MODE (x)))
20665             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
20666                      reg_names[SMALL_DATA_REG]);
20667         }
20668       return;
20669
20670     case 'N': /* Unused */
20671       /* Write the number of elements in the vector times 4.  */
20672       if (GET_CODE (x) != PARALLEL)
20673         output_operand_lossage ("invalid %%N value");
20674       else
20675         fprintf (file, "%d", XVECLEN (x, 0) * 4);
20676       return;
20677
20678     case 'O': /* Unused */
20679       /* Similar, but subtract 1 first.  */
20680       if (GET_CODE (x) != PARALLEL)
20681         output_operand_lossage ("invalid %%O value");
20682       else
20683         fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
20684       return;
20685
20686     case 'p':
20687       /* X is a CONST_INT that is a power of two.  Output the logarithm.  */
20688       if (! INT_P (x)
20689           || INTVAL (x) < 0
20690           || (i = exact_log2 (INTVAL (x))) < 0)
20691         output_operand_lossage ("invalid %%p value");
20692       else
20693         fprintf (file, "%d", i);
20694       return;
20695
20696     case 'P':
20697       /* The operand must be an indirect memory reference.  The result
20698          is the register name.  */
20699       if (!MEM_P (x) || !REG_P (XEXP (x, 0))
20700           || REGNO (XEXP (x, 0)) >= 32)
20701         output_operand_lossage ("invalid %%P value");
20702       else
20703         fputs (reg_names[REGNO (XEXP (x, 0))], file);
20704       return;
20705
20706     case 'q':
20707       /* This outputs the logical code corresponding to a boolean
20708          expression.  The expression may have one or both operands
20709          negated (if one, only the first one).  For condition register
20710          logical operations, it will also treat the negated
20711          CR codes as NOTs, but not handle NOTs of them.  */
20712       {
20713         const char *const *t = 0;
20714         const char *s;
20715         enum rtx_code code = GET_CODE (x);
20716         static const char * const tbl[3][3] = {
20717           { "and", "andc", "nor" },
20718           { "or", "orc", "nand" },
20719           { "xor", "eqv", "xor" } };
20720
20721         if (code == AND)
20722           t = tbl[0];
20723         else if (code == IOR)
20724           t = tbl[1];
20725         else if (code == XOR)
20726           t = tbl[2];
20727         else
20728           output_operand_lossage ("invalid %%q value");
20729
20730         if (GET_CODE (XEXP (x, 0)) != NOT)
20731           s = t[0];
20732         else
20733           {
20734             if (GET_CODE (XEXP (x, 1)) == NOT)
20735               s = t[2];
20736             else
20737               s = t[1];
20738           }
20739
20740         fputs (s, file);
20741       }
20742       return;
20743
20744     case 'Q':
20745       if (! TARGET_MFCRF)
20746         return;
20747       fputc (',', file);
20748       /* FALLTHRU */
20749
20750     case 'R':
20751       /* X is a CR register.  Print the mask for `mtcrf'.  */
20752       if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
20753         output_operand_lossage ("invalid %%R value");
20754       else
20755         fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
20756       return;
20757
20758     case 's':
20759       /* Low 5 bits of 32 - value */
20760       if (! INT_P (x))
20761         output_operand_lossage ("invalid %%s value");
20762       else
20763         fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INTVAL (x)) & 31);
20764       return;
20765
20766     case 't':
20767       /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
20768       if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
20769         {
20770           output_operand_lossage ("invalid %%t value");
20771           return;
20772         }
20773
20774       /* Bit 3 is OV bit.  */
20775       i = 4 * (REGNO (x) - CR0_REGNO) + 3;
20776
20777       /* If we want bit 31, write a shift count of zero, not 32.  */
20778       fprintf (file, "%d", i == 31 ? 0 : i + 1);
20779       return;
20780
20781     case 'T':
20782       /* Print the symbolic name of a branch target register.  */
20783       if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_PLTSEQ)
20784         x = XVECEXP (x, 0, 0);
20785       if (!REG_P (x) || (REGNO (x) != LR_REGNO
20786                          && REGNO (x) != CTR_REGNO))
20787         output_operand_lossage ("invalid %%T value");
20788       else if (REGNO (x) == LR_REGNO)
20789         fputs ("lr", file);
20790       else
20791         fputs ("ctr", file);
20792       return;
20793
20794     case 'u':
20795       /* High-order or low-order 16 bits of constant, whichever is non-zero,
20796          for use in unsigned operand.  */
20797       if (! INT_P (x))
20798         {
20799           output_operand_lossage ("invalid %%u value");
20800           return;
20801         }
20802
20803       uval = INTVAL (x);
20804       if ((uval & 0xffff) == 0)
20805         uval >>= 16;
20806
20807       fprintf (file, HOST_WIDE_INT_PRINT_HEX, uval & 0xffff);
20808       return;
20809
20810     case 'v':
20811       /* High-order 16 bits of constant for use in signed operand.  */
20812       if (! INT_P (x))
20813         output_operand_lossage ("invalid %%v value");
20814       else
20815         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
20816                  (INTVAL (x) >> 16) & 0xffff);
20817       return;
20818
20819     case 'U':
20820       /* Print `u' if this has an auto-increment or auto-decrement.  */
20821       if (MEM_P (x)
20822           && (GET_CODE (XEXP (x, 0)) == PRE_INC
20823               || GET_CODE (XEXP (x, 0)) == PRE_DEC
20824               || GET_CODE (XEXP (x, 0)) == PRE_MODIFY))
20825         putc ('u', file);
20826       return;
20827
20828     case 'V':
20829       /* Print the trap code for this operand.  */
20830       switch (GET_CODE (x))
20831         {
20832         case EQ:
20833           fputs ("eq", file);   /* 4 */
20834           break;
20835         case NE:
20836           fputs ("ne", file);   /* 24 */
20837           break;
20838         case LT:
20839           fputs ("lt", file);   /* 16 */
20840           break;
20841         case LE:
20842           fputs ("le", file);   /* 20 */
20843           break;
20844         case GT:
20845           fputs ("gt", file);   /* 8 */
20846           break;
20847         case GE:
20848           fputs ("ge", file);   /* 12 */
20849           break;
20850         case LTU:
20851           fputs ("llt", file);  /* 2 */
20852           break;
20853         case LEU:
20854           fputs ("lle", file);  /* 6 */
20855           break;
20856         case GTU:
20857           fputs ("lgt", file);  /* 1 */
20858           break;
20859         case GEU:
20860           fputs ("lge", file);  /* 5 */
20861           break;
20862         default:
20863           output_operand_lossage ("invalid %%V value");
20864         }
20865       break;
20866
20867     case 'w':
20868       /* If constant, low-order 16 bits of constant, signed.  Otherwise, write
20869          normally.  */
20870       if (INT_P (x))
20871         fprintf (file, HOST_WIDE_INT_PRINT_DEC,
20872                  ((INTVAL (x) & 0xffff) ^ 0x8000) - 0x8000);
20873       else
20874         print_operand (file, x, 0);
20875       return;
20876
20877     case 'x':
20878       /* X is a FPR or Altivec register used in a VSX context.  */
20879       if (!REG_P (x) || !VSX_REGNO_P (REGNO (x)))
20880         output_operand_lossage ("invalid %%x value");
20881       else
20882         {
20883           int reg = REGNO (x);
20884           int vsx_reg = (FP_REGNO_P (reg)
20885                          ? reg - 32
20886                          : reg - FIRST_ALTIVEC_REGNO + 32);
20887
20888 #ifdef TARGET_REGNAMES      
20889           if (TARGET_REGNAMES)
20890             fprintf (file, "%%vs%d", vsx_reg);
20891           else
20892 #endif
20893             fprintf (file, "%d", vsx_reg);
20894         }
20895       return;
20896
20897     case 'X':
20898       if (MEM_P (x)
20899           && (legitimate_indexed_address_p (XEXP (x, 0), 0)
20900               || (GET_CODE (XEXP (x, 0)) == PRE_MODIFY
20901                   && legitimate_indexed_address_p (XEXP (XEXP (x, 0), 1), 0))))
20902         putc ('x', file);
20903       return;
20904
20905     case 'Y':
20906       /* Like 'L', for third word of TImode/PTImode  */
20907       if (REG_P (x))
20908         fputs (reg_names[REGNO (x) + 2], file);
20909       else if (MEM_P (x))
20910         {
20911           machine_mode mode = GET_MODE (x);
20912           if (GET_CODE (XEXP (x, 0)) == PRE_INC
20913               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
20914             output_address (mode, plus_constant (Pmode,
20915                                                  XEXP (XEXP (x, 0), 0), 8));
20916           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
20917             output_address (mode, plus_constant (Pmode,
20918                                                  XEXP (XEXP (x, 0), 0), 8));
20919           else
20920             output_address (mode, XEXP (adjust_address_nv (x, SImode, 8), 0));
20921           if (small_data_operand (x, GET_MODE (x)))
20922             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
20923                      reg_names[SMALL_DATA_REG]);
20924         }
20925       return;
20926
20927     case 'z':
20928       if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_PLTSEQ)
20929         x = XVECEXP (x, 0, 1);
20930       /* X is a SYMBOL_REF.  Write out the name preceded by a
20931          period and without any trailing data in brackets.  Used for function
20932          names.  If we are configured for System V (or the embedded ABI) on
20933          the PowerPC, do not emit the period, since those systems do not use
20934          TOCs and the like.  */
20935       if (!SYMBOL_REF_P (x))
20936         {
20937           output_operand_lossage ("invalid %%z value");
20938           return;
20939         }
20940
20941       /* For macho, check to see if we need a stub.  */
20942       if (TARGET_MACHO)
20943         {
20944           const char *name = XSTR (x, 0);
20945 #if TARGET_MACHO
20946           if (darwin_emit_branch_islands
20947               && MACHOPIC_INDIRECT
20948               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
20949             name = machopic_indirection_name (x, /*stub_p=*/true);
20950 #endif
20951           assemble_name (file, name);
20952         }
20953       else if (!DOT_SYMBOLS)
20954         assemble_name (file, XSTR (x, 0));
20955       else
20956         rs6000_output_function_entry (file, XSTR (x, 0));
20957       return;
20958
20959     case 'Z':
20960       /* Like 'L', for last word of TImode/PTImode.  */
20961       if (REG_P (x))
20962         fputs (reg_names[REGNO (x) + 3], file);
20963       else if (MEM_P (x))
20964         {
20965           machine_mode mode = GET_MODE (x);
20966           if (GET_CODE (XEXP (x, 0)) == PRE_INC
20967               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
20968             output_address (mode, plus_constant (Pmode,
20969                                                  XEXP (XEXP (x, 0), 0), 12));
20970           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
20971             output_address (mode, plus_constant (Pmode,
20972                                                  XEXP (XEXP (x, 0), 0), 12));
20973           else
20974             output_address (mode, XEXP (adjust_address_nv (x, SImode, 12), 0));
20975           if (small_data_operand (x, GET_MODE (x)))
20976             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
20977                      reg_names[SMALL_DATA_REG]);
20978         }
20979       return;
20980
20981       /* Print AltiVec memory operand.  */
20982     case 'y':
20983       {
20984         rtx tmp;
20985
20986         gcc_assert (MEM_P (x));
20987
20988         tmp = XEXP (x, 0);
20989
20990         if (VECTOR_MEM_ALTIVEC_OR_VSX_P (GET_MODE (x))
20991             && GET_CODE (tmp) == AND
20992             && CONST_INT_P (XEXP (tmp, 1))
20993             && INTVAL (XEXP (tmp, 1)) == -16)
20994           tmp = XEXP (tmp, 0);
20995         else if (VECTOR_MEM_VSX_P (GET_MODE (x))
20996                  && GET_CODE (tmp) == PRE_MODIFY)
20997           tmp = XEXP (tmp, 1);
20998         if (REG_P (tmp))
20999           fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
21000         else
21001           {
21002             if (GET_CODE (tmp) != PLUS
21003                 || !REG_P (XEXP (tmp, 0))
21004                 || !REG_P (XEXP (tmp, 1)))
21005               {
21006                 output_operand_lossage ("invalid %%y value, try using the 'Z' constraint");
21007                 break;
21008               }
21009
21010             if (REGNO (XEXP (tmp, 0)) == 0)
21011               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
21012                        reg_names[ REGNO (XEXP (tmp, 0)) ]);
21013             else
21014               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
21015                        reg_names[ REGNO (XEXP (tmp, 1)) ]);
21016           }
21017         break;
21018       }
21019
21020     case 0:
21021       if (REG_P (x))
21022         fprintf (file, "%s", reg_names[REGNO (x)]);
21023       else if (MEM_P (x))
21024         {
21025           /* We need to handle PRE_INC and PRE_DEC here, since we need to
21026              know the width from the mode.  */
21027           if (GET_CODE (XEXP (x, 0)) == PRE_INC)
21028             fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
21029                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
21030           else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
21031             fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
21032                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
21033           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
21034             output_address (GET_MODE (x), XEXP (XEXP (x, 0), 1));
21035           else
21036             output_address (GET_MODE (x), XEXP (x, 0));
21037         }
21038       else if (toc_relative_expr_p (x, false,
21039                                     &tocrel_base_oac, &tocrel_offset_oac))
21040         /* This hack along with a corresponding hack in
21041            rs6000_output_addr_const_extra arranges to output addends
21042            where the assembler expects to find them.  eg.
21043            (plus (unspec [(symbol_ref ("x")) (reg 2)] tocrel) 4)
21044            without this hack would be output as "x@toc+4".  We
21045            want "x+4@toc".  */
21046         output_addr_const (file, CONST_CAST_RTX (tocrel_base_oac));
21047       else if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_TLSGD)
21048         output_addr_const (file, XVECEXP (x, 0, 0));
21049       else if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_PLTSEQ)
21050         output_addr_const (file, XVECEXP (x, 0, 1));
21051       else
21052         output_addr_const (file, x);
21053       return;
21054
21055     case '&':
21056       if (const char *name = get_some_local_dynamic_name ())
21057         assemble_name (file, name);
21058       else
21059         output_operand_lossage ("'%%&' used without any "
21060                                 "local dynamic TLS references");
21061       return;
21062
21063     default:
21064       output_operand_lossage ("invalid %%xn code");
21065     }
21066 }
21067 \f
21068 /* Print the address of an operand.  */
21069
21070 void
21071 print_operand_address (FILE *file, rtx x)
21072 {
21073   if (REG_P (x))
21074     fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
21075   else if (SYMBOL_REF_P (x) || GET_CODE (x) == CONST
21076            || GET_CODE (x) == LABEL_REF)
21077     {
21078       output_addr_const (file, x);
21079       if (small_data_operand (x, GET_MODE (x)))
21080         fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
21081                  reg_names[SMALL_DATA_REG]);
21082       else
21083         gcc_assert (!TARGET_TOC);
21084     }
21085   else if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 0))
21086            && REG_P (XEXP (x, 1)))
21087     {
21088       if (REGNO (XEXP (x, 0)) == 0)
21089         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
21090                  reg_names[ REGNO (XEXP (x, 0)) ]);
21091       else
21092         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
21093                  reg_names[ REGNO (XEXP (x, 1)) ]);
21094     }
21095   else if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 0))
21096            && CONST_INT_P (XEXP (x, 1)))
21097     fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
21098              INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
21099 #if TARGET_MACHO
21100   else if (GET_CODE (x) == LO_SUM && REG_P (XEXP (x, 0))
21101            && CONSTANT_P (XEXP (x, 1)))
21102     {
21103       fprintf (file, "lo16(");
21104       output_addr_const (file, XEXP (x, 1));
21105       fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
21106     }
21107 #endif
21108 #if TARGET_ELF
21109   else if (GET_CODE (x) == LO_SUM && REG_P (XEXP (x, 0))
21110            && CONSTANT_P (XEXP (x, 1)))
21111     {
21112       output_addr_const (file, XEXP (x, 1));
21113       fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
21114     }
21115 #endif
21116   else if (toc_relative_expr_p (x, false, &tocrel_base_oac, &tocrel_offset_oac))
21117     {
21118       /* This hack along with a corresponding hack in
21119          rs6000_output_addr_const_extra arranges to output addends
21120          where the assembler expects to find them.  eg.
21121          (lo_sum (reg 9)
21122          .       (plus (unspec [(symbol_ref ("x")) (reg 2)] tocrel) 8))
21123          without this hack would be output as "x@toc+8@l(9)".  We
21124          want "x+8@toc@l(9)".  */
21125       output_addr_const (file, CONST_CAST_RTX (tocrel_base_oac));
21126       if (GET_CODE (x) == LO_SUM)
21127         fprintf (file, "@l(%s)", reg_names[REGNO (XEXP (x, 0))]);
21128       else
21129         fprintf (file, "(%s)", reg_names[REGNO (XVECEXP (tocrel_base_oac, 0, 1))]);
21130     }
21131   else
21132     output_addr_const (file, x);
21133 }
21134 \f
21135 /* Implement TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA.  */
21136
21137 static bool
21138 rs6000_output_addr_const_extra (FILE *file, rtx x)
21139 {
21140   if (GET_CODE (x) == UNSPEC)
21141     switch (XINT (x, 1))
21142       {
21143       case UNSPEC_TOCREL:
21144         gcc_checking_assert (SYMBOL_REF_P (XVECEXP (x, 0, 0))
21145                              && REG_P (XVECEXP (x, 0, 1))
21146                              && REGNO (XVECEXP (x, 0, 1)) == TOC_REGISTER);
21147         output_addr_const (file, XVECEXP (x, 0, 0));
21148         if (x == tocrel_base_oac && tocrel_offset_oac != const0_rtx)
21149           {
21150             if (INTVAL (tocrel_offset_oac) >= 0)
21151               fprintf (file, "+");
21152             output_addr_const (file, CONST_CAST_RTX (tocrel_offset_oac));
21153           }
21154         if (!TARGET_AIX || (TARGET_ELF && TARGET_MINIMAL_TOC))
21155           {
21156             putc ('-', file);
21157             assemble_name (file, toc_label_name);
21158             need_toc_init = 1;
21159           }
21160         else if (TARGET_ELF)
21161           fputs ("@toc", file);
21162         return true;
21163
21164 #if TARGET_MACHO
21165       case UNSPEC_MACHOPIC_OFFSET:
21166         output_addr_const (file, XVECEXP (x, 0, 0));
21167         putc ('-', file);
21168         machopic_output_function_base_name (file);
21169         return true;
21170 #endif
21171       }
21172   return false;
21173 }
21174 \f
21175 /* Target hook for assembling integer objects.  The PowerPC version has
21176    to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
21177    is defined.  It also needs to handle DI-mode objects on 64-bit
21178    targets.  */
21179
21180 static bool
21181 rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
21182 {
21183 #ifdef RELOCATABLE_NEEDS_FIXUP
21184   /* Special handling for SI values.  */
21185   if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
21186     {
21187       static int recurse = 0;
21188
21189       /* For -mrelocatable, we mark all addresses that need to be fixed up in
21190          the .fixup section.  Since the TOC section is already relocated, we
21191          don't need to mark it here.  We used to skip the text section, but it
21192          should never be valid for relocated addresses to be placed in the text
21193          section.  */
21194       if (DEFAULT_ABI == ABI_V4
21195           && (TARGET_RELOCATABLE || flag_pic > 1)
21196           && in_section != toc_section
21197           && !recurse
21198           && !CONST_SCALAR_INT_P (x)
21199           && CONSTANT_P (x))
21200         {
21201           char buf[256];
21202
21203           recurse = 1;
21204           ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
21205           fixuplabelno++;
21206           ASM_OUTPUT_LABEL (asm_out_file, buf);
21207           fprintf (asm_out_file, "\t.long\t(");
21208           output_addr_const (asm_out_file, x);
21209           fprintf (asm_out_file, ")@fixup\n");
21210           fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
21211           ASM_OUTPUT_ALIGN (asm_out_file, 2);
21212           fprintf (asm_out_file, "\t.long\t");
21213           assemble_name (asm_out_file, buf);
21214           fprintf (asm_out_file, "\n\t.previous\n");
21215           recurse = 0;
21216           return true;
21217         }
21218       /* Remove initial .'s to turn a -mcall-aixdesc function
21219          address into the address of the descriptor, not the function
21220          itself.  */
21221       else if (SYMBOL_REF_P (x)
21222                && XSTR (x, 0)[0] == '.'
21223                && DEFAULT_ABI == ABI_AIX)
21224         {
21225           const char *name = XSTR (x, 0);
21226           while (*name == '.')
21227             name++;
21228
21229           fprintf (asm_out_file, "\t.long\t%s\n", name);
21230           return true;
21231         }
21232     }
21233 #endif /* RELOCATABLE_NEEDS_FIXUP */
21234   return default_assemble_integer (x, size, aligned_p);
21235 }
21236
21237 /* Return a template string for assembly to emit when making an
21238    external call.  FUNOP is the call mem argument operand number.  */
21239
21240 static const char *
21241 rs6000_call_template_1 (rtx *operands, unsigned int funop, bool sibcall)
21242 {
21243   /* -Wformat-overflow workaround, without which gcc thinks that %u
21244       might produce 10 digits.  */
21245   gcc_assert (funop <= MAX_RECOG_OPERANDS);
21246
21247   char arg[12];
21248   arg[0] = 0;
21249   if (TARGET_TLS_MARKERS && GET_CODE (operands[funop + 1]) == UNSPEC)
21250     {
21251       if (XINT (operands[funop + 1], 1) == UNSPEC_TLSGD)
21252         sprintf (arg, "(%%%u@tlsgd)", funop + 1);
21253       else if (XINT (operands[funop + 1], 1) == UNSPEC_TLSLD)
21254         sprintf (arg, "(%%&@tlsld)");
21255       else
21256         gcc_unreachable ();
21257     }
21258
21259   /* The magic 32768 offset here corresponds to the offset of
21260      r30 in .got2, as given by LCTOC1.  See sysv4.h:toc_section.  */
21261   char z[11];
21262   sprintf (z, "%%z%u%s", funop,
21263            (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic == 2
21264             ? "+32768" : ""));
21265
21266   static char str[32];  /* 2 spare */
21267   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
21268     sprintf (str, "b%s %s%s%s", sibcall ? "" : "l", z, arg,
21269              sibcall ? "" : "\n\tnop");
21270   else if (DEFAULT_ABI == ABI_V4)
21271     sprintf (str, "b%s %s%s%s", sibcall ? "" : "l", z, arg,
21272              flag_pic ? "@plt" : "");
21273 #if TARGET_MACHO
21274   /* If/when we remove the mlongcall opt, we can share the AIX/ELGv2 case. */
21275    else if (DEFAULT_ABI == ABI_DARWIN)
21276     {
21277       /* The cookie is in operand func+2.  */
21278       gcc_checking_assert (GET_CODE (operands[funop + 2]) == CONST_INT);
21279       int cookie = INTVAL (operands[funop + 2]);
21280       if (cookie & CALL_LONG)
21281         {
21282           tree funname = get_identifier (XSTR (operands[funop], 0));
21283           tree labelname = get_prev_label (funname);
21284           gcc_checking_assert (labelname && !sibcall);
21285
21286           /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
21287              instruction will reach 'foo', otherwise link as 'bl L42'".
21288              "L42" should be a 'branch island', that will do a far jump to
21289              'foo'.  Branch islands are generated in
21290              macho_branch_islands().  */
21291           sprintf (str, "jbsr %%z%u,%.10s", funop,
21292                    IDENTIFIER_POINTER (labelname));
21293         }
21294       else
21295         /* Same as AIX or ELFv2, except to keep backwards compat, no nop
21296            after the call.  */
21297         sprintf (str, "b%s %s%s", sibcall ? "" : "l", z, arg);
21298     }
21299 #endif
21300   else
21301     gcc_unreachable ();
21302   return str;
21303 }
21304
21305 const char *
21306 rs6000_call_template (rtx *operands, unsigned int funop)
21307 {
21308   return rs6000_call_template_1 (operands, funop, false);
21309 }
21310
21311 const char *
21312 rs6000_sibcall_template (rtx *operands, unsigned int funop)
21313 {
21314   return rs6000_call_template_1 (operands, funop, true);
21315 }
21316
21317 /* As above, for indirect calls.  */
21318
21319 static const char *
21320 rs6000_indirect_call_template_1 (rtx *operands, unsigned int funop,
21321                                  bool sibcall)
21322 {
21323   /* -Wformat-overflow workaround, without which gcc thinks that %u
21324      might produce 10 digits.  Note that -Wformat-overflow will not
21325      currently warn here for str[], so do not rely on a warning to
21326      ensure str[] is correctly sized.  */
21327   gcc_assert (funop <= MAX_RECOG_OPERANDS);
21328
21329   /* Currently, funop is either 0 or 1.  The maximum string is always
21330      a !speculate 64-bit __tls_get_addr call.
21331
21332      ABI_AIX:
21333      .  9       ld 2,%3\n\t
21334      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21335      . 29       .reloc .,R_PPC64_PLTSEQ,%z1\n\t
21336      .  9       crset 2\n\t
21337      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21338      . 30       .reloc .,R_PPC64_PLTCALL,%z1\n\t
21339      . 10       beq%T1l-\n\t
21340      . 10       ld 2,%4(1)
21341      .---
21342      .151
21343
21344      ABI_ELFv2:
21345      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21346      . 29       .reloc .,R_PPC64_PLTSEQ,%z1\n\t
21347      .  9       crset 2\n\t
21348      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21349      . 30       .reloc .,R_PPC64_PLTCALL,%z1\n\t
21350      . 10       beq%T1l-\n\t
21351      . 10       ld 2,%3(1)
21352      .---
21353      .142
21354
21355      ABI_V4:
21356      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21357      . 35       .reloc .,R_PPC64_PLTSEQ,%z1+32768\n\t
21358      .  9       crset 2\n\t
21359      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21360      . 36       .reloc .,R_PPC64_PLTCALL,%z1+32768\n\t
21361      .  8       beq%T1l-
21362      .---
21363      .141  */
21364   static char str[160];  /* 8 spare */
21365   char *s = str;
21366   const char *ptrload = TARGET_64BIT ? "d" : "wz";
21367
21368   if (DEFAULT_ABI == ABI_AIX)
21369     s += sprintf (s,
21370                   "l%s 2,%%%u\n\t",
21371                   ptrload, funop + 2);
21372
21373   /* We don't need the extra code to stop indirect call speculation if
21374      calling via LR.  */
21375   bool speculate = (TARGET_MACHO
21376                     || rs6000_speculate_indirect_jumps
21377                     || (REG_P (operands[funop])
21378                         && REGNO (operands[funop]) == LR_REGNO));
21379
21380   if (TARGET_PLTSEQ && GET_CODE (operands[funop]) == UNSPEC)
21381     {
21382       const char *rel64 = TARGET_64BIT ? "64" : "";
21383       char tls[29];
21384       tls[0] = 0;
21385       if (TARGET_TLS_MARKERS && GET_CODE (operands[funop + 1]) == UNSPEC)
21386         {
21387           if (XINT (operands[funop + 1], 1) == UNSPEC_TLSGD)
21388             sprintf (tls, ".reloc .,R_PPC%s_TLSGD,%%%u\n\t",
21389                      rel64, funop + 1);
21390           else if (XINT (operands[funop + 1], 1) == UNSPEC_TLSLD)
21391             sprintf (tls, ".reloc .,R_PPC%s_TLSLD,%%&\n\t",
21392                      rel64);
21393           else
21394             gcc_unreachable ();
21395         }
21396
21397       const char *addend = (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT
21398                             && flag_pic == 2 ? "+32768" : "");
21399       if (!speculate)
21400         {
21401           s += sprintf (s,
21402                         "%s.reloc .,R_PPC%s_PLTSEQ,%%z%u%s\n\t",
21403                         tls, rel64, funop, addend);
21404           s += sprintf (s, "crset 2\n\t");
21405         }
21406       s += sprintf (s,
21407                     "%s.reloc .,R_PPC%s_PLTCALL,%%z%u%s\n\t",
21408                     tls, rel64, funop, addend);
21409     }
21410   else if (!speculate)
21411     s += sprintf (s, "crset 2\n\t");
21412
21413   if (DEFAULT_ABI == ABI_AIX)
21414     {
21415       if (speculate)
21416         sprintf (s,
21417                  "b%%T%ul\n\t"
21418                  "l%s 2,%%%u(1)",
21419                  funop, ptrload, funop + 3);
21420       else
21421         sprintf (s,
21422                  "beq%%T%ul-\n\t"
21423                  "l%s 2,%%%u(1)",
21424                  funop, ptrload, funop + 3);
21425     }
21426   else if (DEFAULT_ABI == ABI_ELFv2)
21427     {
21428       if (speculate)
21429         sprintf (s,
21430                  "b%%T%ul\n\t"
21431                  "l%s 2,%%%u(1)",
21432                  funop, ptrload, funop + 2);
21433       else
21434         sprintf (s,
21435                  "beq%%T%ul-\n\t"
21436                  "l%s 2,%%%u(1)",
21437                  funop, ptrload, funop + 2);
21438     }
21439   else
21440     {
21441       if (speculate)
21442         sprintf (s,
21443                  "b%%T%u%s",
21444                  funop, sibcall ? "" : "l");
21445       else
21446         sprintf (s,
21447                  "beq%%T%u%s-%s",
21448                  funop, sibcall ? "" : "l", sibcall ? "\n\tb $" : "");
21449     }
21450   return str;
21451 }
21452
21453 const char *
21454 rs6000_indirect_call_template (rtx *operands, unsigned int funop)
21455 {
21456   return rs6000_indirect_call_template_1 (operands, funop, false);
21457 }
21458
21459 const char *
21460 rs6000_indirect_sibcall_template (rtx *operands, unsigned int funop)
21461 {
21462   return rs6000_indirect_call_template_1 (operands, funop, true);
21463 }
21464
21465 #if HAVE_AS_PLTSEQ
21466 /* Output indirect call insns.
21467    WHICH is 0 for tocsave, 1 for plt16_ha, 2 for plt16_lo, 3 for mtctr.  */
21468 const char *
21469 rs6000_pltseq_template (rtx *operands, int which)
21470 {
21471   const char *rel64 = TARGET_64BIT ? "64" : "";
21472   char tls[28];
21473   tls[0] = 0;
21474   if (TARGET_TLS_MARKERS && GET_CODE (operands[3]) == UNSPEC)
21475     {
21476       if (XINT (operands[3], 1) == UNSPEC_TLSGD)
21477         sprintf (tls, ".reloc .,R_PPC%s_TLSGD,%%3\n\t",
21478                  rel64);
21479       else if (XINT (operands[3], 1) == UNSPEC_TLSLD)
21480         sprintf (tls, ".reloc .,R_PPC%s_TLSLD,%%&\n\t",
21481                  rel64);
21482       else
21483         gcc_unreachable ();
21484     }
21485
21486   gcc_assert (DEFAULT_ABI == ABI_ELFv2 || DEFAULT_ABI == ABI_V4);
21487   static char str[96];  /* 15 spare */
21488   const char *off = WORDS_BIG_ENDIAN ? "+2" : "";
21489   const char *addend = (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT
21490                         && flag_pic == 2 ? "+32768" : "");
21491   switch (which)
21492     {
21493     case 0:
21494       sprintf (str,
21495                "%s.reloc .,R_PPC%s_PLTSEQ,%%z2\n\t"
21496                "st%s",
21497                tls, rel64, TARGET_64BIT ? "d 2,24(1)" : "w 2,12(1)");
21498       break;
21499     case 1:
21500       if (DEFAULT_ABI == ABI_V4 && !flag_pic)
21501         sprintf (str,
21502                  "%s.reloc .%s,R_PPC%s_PLT16_HA,%%z2\n\t"
21503                  "lis %%0,0",
21504                  tls, off, rel64);
21505       else
21506         sprintf (str,
21507                  "%s.reloc .%s,R_PPC%s_PLT16_HA,%%z2%s\n\t"
21508                  "addis %%0,%%1,0",
21509                  tls, off, rel64, addend);
21510       break;
21511     case 2:
21512       sprintf (str,
21513                "%s.reloc .%s,R_PPC%s_PLT16_LO%s,%%z2%s\n\t"
21514                "l%s %%0,0(%%1)",
21515                tls, off, rel64, TARGET_64BIT ? "_DS" : "", addend,
21516                TARGET_64BIT ? "d" : "wz");
21517       break;
21518     case 3:
21519       sprintf (str,
21520                "%s.reloc .,R_PPC%s_PLTSEQ,%%z2%s\n\t"
21521                "mtctr %%1",
21522                tls, rel64, addend);
21523       break;
21524     default:
21525       gcc_unreachable ();
21526     }
21527   return str;
21528 }
21529 #endif
21530
21531 #if defined (HAVE_GAS_HIDDEN) && !TARGET_MACHO
21532 /* Emit an assembler directive to set symbol visibility for DECL to
21533    VISIBILITY_TYPE.  */
21534
21535 static void
21536 rs6000_assemble_visibility (tree decl, int vis)
21537 {
21538   if (TARGET_XCOFF)
21539     return;
21540
21541   /* Functions need to have their entry point symbol visibility set as
21542      well as their descriptor symbol visibility.  */
21543   if (DEFAULT_ABI == ABI_AIX
21544       && DOT_SYMBOLS
21545       && TREE_CODE (decl) == FUNCTION_DECL)
21546     {
21547       static const char * const visibility_types[] = {
21548         NULL, "protected", "hidden", "internal"
21549       };
21550
21551       const char *name, *type;
21552
21553       name = ((* targetm.strip_name_encoding)
21554               (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
21555       type = visibility_types[vis];
21556
21557       fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
21558       fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
21559     }
21560   else
21561     default_assemble_visibility (decl, vis);
21562 }
21563 #endif
21564 \f
21565 enum rtx_code
21566 rs6000_reverse_condition (machine_mode mode, enum rtx_code code)
21567 {
21568   /* Reversal of FP compares takes care -- an ordered compare
21569      becomes an unordered compare and vice versa.  */
21570   if (mode == CCFPmode
21571       && (!flag_finite_math_only
21572           || code == UNLT || code == UNLE || code == UNGT || code == UNGE
21573           || code == UNEQ || code == LTGT))
21574     return reverse_condition_maybe_unordered (code);
21575   else
21576     return reverse_condition (code);
21577 }
21578
21579 /* Generate a compare for CODE.  Return a brand-new rtx that
21580    represents the result of the compare.  */
21581
21582 static rtx
21583 rs6000_generate_compare (rtx cmp, machine_mode mode)
21584 {
21585   machine_mode comp_mode;
21586   rtx compare_result;
21587   enum rtx_code code = GET_CODE (cmp);
21588   rtx op0 = XEXP (cmp, 0);
21589   rtx op1 = XEXP (cmp, 1);
21590
21591   if (!TARGET_FLOAT128_HW && FLOAT128_VECTOR_P (mode))
21592     comp_mode = CCmode;
21593   else if (FLOAT_MODE_P (mode))
21594     comp_mode = CCFPmode;
21595   else if (code == GTU || code == LTU
21596            || code == GEU || code == LEU)
21597     comp_mode = CCUNSmode;
21598   else if ((code == EQ || code == NE)
21599            && unsigned_reg_p (op0)
21600            && (unsigned_reg_p (op1)
21601                || (CONST_INT_P (op1) && INTVAL (op1) != 0)))
21602     /* These are unsigned values, perhaps there will be a later
21603        ordering compare that can be shared with this one.  */
21604     comp_mode = CCUNSmode;
21605   else
21606     comp_mode = CCmode;
21607
21608   /* If we have an unsigned compare, make sure we don't have a signed value as
21609      an immediate.  */
21610   if (comp_mode == CCUNSmode && CONST_INT_P (op1)
21611       && INTVAL (op1) < 0)
21612     {
21613       op0 = copy_rtx_if_shared (op0);
21614       op1 = force_reg (GET_MODE (op0), op1);
21615       cmp = gen_rtx_fmt_ee (code, GET_MODE (cmp), op0, op1);
21616     }
21617
21618   /* First, the compare.  */
21619   compare_result = gen_reg_rtx (comp_mode);
21620
21621   /* IEEE 128-bit support in VSX registers when we do not have hardware
21622      support.  */
21623   if (!TARGET_FLOAT128_HW && FLOAT128_VECTOR_P (mode))
21624     {
21625       rtx libfunc = NULL_RTX;
21626       bool check_nan = false;
21627       rtx dest;
21628
21629       switch (code)
21630         {
21631         case EQ:
21632         case NE:
21633           libfunc = optab_libfunc (eq_optab, mode);
21634           break;
21635
21636         case GT:
21637         case GE:
21638           libfunc = optab_libfunc (ge_optab, mode);
21639           break;
21640
21641         case LT:
21642         case LE:
21643           libfunc = optab_libfunc (le_optab, mode);
21644           break;
21645
21646         case UNORDERED:
21647         case ORDERED:
21648           libfunc = optab_libfunc (unord_optab, mode);
21649           code = (code == UNORDERED) ? NE : EQ;
21650           break;
21651
21652         case UNGE:
21653         case UNGT:
21654           check_nan = true;
21655           libfunc = optab_libfunc (ge_optab, mode);
21656           code = (code == UNGE) ? GE : GT;
21657           break;
21658
21659         case UNLE:
21660         case UNLT:
21661           check_nan = true;
21662           libfunc = optab_libfunc (le_optab, mode);
21663           code = (code == UNLE) ? LE : LT;
21664           break;
21665
21666         case UNEQ:
21667         case LTGT:
21668           check_nan = true;
21669           libfunc = optab_libfunc (eq_optab, mode);
21670           code = (code = UNEQ) ? EQ : NE;
21671           break;
21672
21673         default:
21674           gcc_unreachable ();
21675         }
21676
21677       gcc_assert (libfunc);
21678
21679       if (!check_nan)
21680         dest = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
21681                                         SImode, op0, mode, op1, mode);
21682
21683       /* The library signals an exception for signalling NaNs, so we need to
21684          handle isgreater, etc. by first checking isordered.  */
21685       else
21686         {
21687           rtx ne_rtx, normal_dest, unord_dest;
21688           rtx unord_func = optab_libfunc (unord_optab, mode);
21689           rtx join_label = gen_label_rtx ();
21690           rtx join_ref = gen_rtx_LABEL_REF (VOIDmode, join_label);
21691           rtx unord_cmp = gen_reg_rtx (comp_mode);
21692
21693
21694           /* Test for either value being a NaN.  */
21695           gcc_assert (unord_func);
21696           unord_dest = emit_library_call_value (unord_func, NULL_RTX, LCT_CONST,
21697                                                 SImode, op0, mode, op1, mode);
21698
21699           /* Set value (0) if either value is a NaN, and jump to the join
21700              label.  */
21701           dest = gen_reg_rtx (SImode);
21702           emit_move_insn (dest, const1_rtx);
21703           emit_insn (gen_rtx_SET (unord_cmp,
21704                                   gen_rtx_COMPARE (comp_mode, unord_dest,
21705                                                    const0_rtx)));
21706
21707           ne_rtx = gen_rtx_NE (comp_mode, unord_cmp, const0_rtx);
21708           emit_jump_insn (gen_rtx_SET (pc_rtx,
21709                                        gen_rtx_IF_THEN_ELSE (VOIDmode, ne_rtx,
21710                                                              join_ref,
21711                                                              pc_rtx)));
21712
21713           /* Do the normal comparison, knowing that the values are not
21714              NaNs.  */
21715           normal_dest = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
21716                                                  SImode, op0, mode, op1, mode);
21717
21718           emit_insn (gen_cstoresi4 (dest,
21719                                     gen_rtx_fmt_ee (code, SImode, normal_dest,
21720                                                     const0_rtx),
21721                                     normal_dest, const0_rtx));
21722
21723           /* Join NaN and non-Nan paths.  Compare dest against 0.  */
21724           emit_label (join_label);
21725           code = NE;
21726         }
21727
21728       emit_insn (gen_rtx_SET (compare_result,
21729                               gen_rtx_COMPARE (comp_mode, dest, const0_rtx)));
21730     }
21731
21732   else
21733     {
21734       /* Generate XLC-compatible TFmode compare as PARALLEL with extra
21735          CLOBBERs to match cmptf_internal2 pattern.  */
21736       if (comp_mode == CCFPmode && TARGET_XL_COMPAT
21737           && FLOAT128_IBM_P (GET_MODE (op0))
21738           && TARGET_HARD_FLOAT)
21739         emit_insn (gen_rtx_PARALLEL (VOIDmode,
21740           gen_rtvec (10,
21741                      gen_rtx_SET (compare_result,
21742                                   gen_rtx_COMPARE (comp_mode, op0, op1)),
21743                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21744                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21745                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21746                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21747                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21748                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21749                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21750                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21751                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (Pmode)))));
21752       else if (GET_CODE (op1) == UNSPEC
21753                && XINT (op1, 1) == UNSPEC_SP_TEST)
21754         {
21755           rtx op1b = XVECEXP (op1, 0, 0);
21756           comp_mode = CCEQmode;
21757           compare_result = gen_reg_rtx (CCEQmode);
21758           if (TARGET_64BIT)
21759             emit_insn (gen_stack_protect_testdi (compare_result, op0, op1b));
21760           else
21761             emit_insn (gen_stack_protect_testsi (compare_result, op0, op1b));
21762         }
21763       else
21764         emit_insn (gen_rtx_SET (compare_result,
21765                                 gen_rtx_COMPARE (comp_mode, op0, op1)));
21766     }
21767
21768   /* Some kinds of FP comparisons need an OR operation;
21769      under flag_finite_math_only we don't bother.  */
21770   if (FLOAT_MODE_P (mode)
21771       && (!FLOAT128_IEEE_P (mode) || TARGET_FLOAT128_HW)
21772       && !flag_finite_math_only
21773       && (code == LE || code == GE
21774           || code == UNEQ || code == LTGT
21775           || code == UNGT || code == UNLT))
21776     {
21777       enum rtx_code or1, or2;
21778       rtx or1_rtx, or2_rtx, compare2_rtx;
21779       rtx or_result = gen_reg_rtx (CCEQmode);
21780
21781       switch (code)
21782         {
21783         case LE: or1 = LT;  or2 = EQ;  break;
21784         case GE: or1 = GT;  or2 = EQ;  break;
21785         case UNEQ: or1 = UNORDERED;  or2 = EQ;  break;
21786         case LTGT: or1 = LT;  or2 = GT;  break;
21787         case UNGT: or1 = UNORDERED;  or2 = GT;  break;
21788         case UNLT: or1 = UNORDERED;  or2 = LT;  break;
21789         default:  gcc_unreachable ();
21790         }
21791       validate_condition_mode (or1, comp_mode);
21792       validate_condition_mode (or2, comp_mode);
21793       or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
21794       or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
21795       compare2_rtx = gen_rtx_COMPARE (CCEQmode,
21796                                       gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
21797                                       const_true_rtx);
21798       emit_insn (gen_rtx_SET (or_result, compare2_rtx));
21799
21800       compare_result = or_result;
21801       code = EQ;
21802     }
21803
21804   validate_condition_mode (code, GET_MODE (compare_result));
21805
21806   return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
21807 }
21808
21809 \f
21810 /* Return the diagnostic message string if the binary operation OP is
21811    not permitted on TYPE1 and TYPE2, NULL otherwise.  */
21812
21813 static const char*
21814 rs6000_invalid_binary_op (int op ATTRIBUTE_UNUSED,
21815                           const_tree type1,
21816                           const_tree type2)
21817 {
21818   machine_mode mode1 = TYPE_MODE (type1);
21819   machine_mode mode2 = TYPE_MODE (type2);
21820
21821   /* For complex modes, use the inner type.  */
21822   if (COMPLEX_MODE_P (mode1))
21823     mode1 = GET_MODE_INNER (mode1);
21824
21825   if (COMPLEX_MODE_P (mode2))
21826     mode2 = GET_MODE_INNER (mode2);
21827
21828   /* Don't allow IEEE 754R 128-bit binary floating point and IBM extended
21829      double to intermix unless -mfloat128-convert.  */
21830   if (mode1 == mode2)
21831     return NULL;
21832
21833   if (!TARGET_FLOAT128_CVT)
21834     {
21835       if ((mode1 == KFmode && mode2 == IFmode)
21836           || (mode1 == IFmode && mode2 == KFmode))
21837         return N_("__float128 and __ibm128 cannot be used in the same "
21838                   "expression");
21839
21840       if (TARGET_IEEEQUAD
21841           && ((mode1 == IFmode && mode2 == TFmode)
21842               || (mode1 == TFmode && mode2 == IFmode)))
21843         return N_("__ibm128 and long double cannot be used in the same "
21844                   "expression");
21845
21846       if (!TARGET_IEEEQUAD
21847           && ((mode1 == KFmode && mode2 == TFmode)
21848               || (mode1 == TFmode && mode2 == KFmode)))
21849         return N_("__float128 and long double cannot be used in the same "
21850                   "expression");
21851     }
21852
21853   return NULL;
21854 }
21855
21856 \f
21857 /* Expand floating point conversion to/from __float128 and __ibm128.  */
21858
21859 void
21860 rs6000_expand_float128_convert (rtx dest, rtx src, bool unsigned_p)
21861 {
21862   machine_mode dest_mode = GET_MODE (dest);
21863   machine_mode src_mode = GET_MODE (src);
21864   convert_optab cvt = unknown_optab;
21865   bool do_move = false;
21866   rtx libfunc = NULL_RTX;
21867   rtx dest2;
21868   typedef rtx (*rtx_2func_t) (rtx, rtx);
21869   rtx_2func_t hw_convert = (rtx_2func_t)0;
21870   size_t kf_or_tf;
21871
21872   struct hw_conv_t {
21873     rtx_2func_t from_df;
21874     rtx_2func_t from_sf;
21875     rtx_2func_t from_si_sign;
21876     rtx_2func_t from_si_uns;
21877     rtx_2func_t from_di_sign;
21878     rtx_2func_t from_di_uns;
21879     rtx_2func_t to_df;
21880     rtx_2func_t to_sf;
21881     rtx_2func_t to_si_sign;
21882     rtx_2func_t to_si_uns;
21883     rtx_2func_t to_di_sign;
21884     rtx_2func_t to_di_uns;
21885   } hw_conversions[2] = {
21886     /* convertions to/from KFmode */
21887     {
21888       gen_extenddfkf2_hw,               /* KFmode <- DFmode.  */
21889       gen_extendsfkf2_hw,               /* KFmode <- SFmode.  */
21890       gen_float_kfsi2_hw,               /* KFmode <- SImode (signed).  */
21891       gen_floatuns_kfsi2_hw,            /* KFmode <- SImode (unsigned).  */
21892       gen_float_kfdi2_hw,               /* KFmode <- DImode (signed).  */
21893       gen_floatuns_kfdi2_hw,            /* KFmode <- DImode (unsigned).  */
21894       gen_trunckfdf2_hw,                /* DFmode <- KFmode.  */
21895       gen_trunckfsf2_hw,                /* SFmode <- KFmode.  */
21896       gen_fix_kfsi2_hw,                 /* SImode <- KFmode (signed).  */
21897       gen_fixuns_kfsi2_hw,              /* SImode <- KFmode (unsigned).  */
21898       gen_fix_kfdi2_hw,                 /* DImode <- KFmode (signed).  */
21899       gen_fixuns_kfdi2_hw,              /* DImode <- KFmode (unsigned).  */
21900     },
21901
21902     /* convertions to/from TFmode */
21903     {
21904       gen_extenddftf2_hw,               /* TFmode <- DFmode.  */
21905       gen_extendsftf2_hw,               /* TFmode <- SFmode.  */
21906       gen_float_tfsi2_hw,               /* TFmode <- SImode (signed).  */
21907       gen_floatuns_tfsi2_hw,            /* TFmode <- SImode (unsigned).  */
21908       gen_float_tfdi2_hw,               /* TFmode <- DImode (signed).  */
21909       gen_floatuns_tfdi2_hw,            /* TFmode <- DImode (unsigned).  */
21910       gen_trunctfdf2_hw,                /* DFmode <- TFmode.  */
21911       gen_trunctfsf2_hw,                /* SFmode <- TFmode.  */
21912       gen_fix_tfsi2_hw,                 /* SImode <- TFmode (signed).  */
21913       gen_fixuns_tfsi2_hw,              /* SImode <- TFmode (unsigned).  */
21914       gen_fix_tfdi2_hw,                 /* DImode <- TFmode (signed).  */
21915       gen_fixuns_tfdi2_hw,              /* DImode <- TFmode (unsigned).  */
21916     },
21917   };
21918
21919   if (dest_mode == src_mode)
21920     gcc_unreachable ();
21921
21922   /* Eliminate memory operations.  */
21923   if (MEM_P (src))
21924     src = force_reg (src_mode, src);
21925
21926   if (MEM_P (dest))
21927     {
21928       rtx tmp = gen_reg_rtx (dest_mode);
21929       rs6000_expand_float128_convert (tmp, src, unsigned_p);
21930       rs6000_emit_move (dest, tmp, dest_mode);
21931       return;
21932     }
21933
21934   /* Convert to IEEE 128-bit floating point.  */
21935   if (FLOAT128_IEEE_P (dest_mode))
21936     {
21937       if (dest_mode == KFmode)
21938         kf_or_tf = 0;
21939       else if (dest_mode == TFmode)
21940         kf_or_tf = 1;
21941       else
21942         gcc_unreachable ();
21943
21944       switch (src_mode)
21945         {
21946         case E_DFmode:
21947           cvt = sext_optab;
21948           hw_convert = hw_conversions[kf_or_tf].from_df;
21949           break;
21950
21951         case E_SFmode:
21952           cvt = sext_optab;
21953           hw_convert = hw_conversions[kf_or_tf].from_sf;
21954           break;
21955
21956         case E_KFmode:
21957         case E_IFmode:
21958         case E_TFmode:
21959           if (FLOAT128_IBM_P (src_mode))
21960             cvt = sext_optab;
21961           else
21962             do_move = true;
21963           break;
21964
21965         case E_SImode:
21966           if (unsigned_p)
21967             {
21968               cvt = ufloat_optab;
21969               hw_convert = hw_conversions[kf_or_tf].from_si_uns;
21970             }
21971           else
21972             {
21973               cvt = sfloat_optab;
21974               hw_convert = hw_conversions[kf_or_tf].from_si_sign;
21975             }
21976           break;
21977
21978         case E_DImode:
21979           if (unsigned_p)
21980             {
21981               cvt = ufloat_optab;
21982               hw_convert = hw_conversions[kf_or_tf].from_di_uns;
21983             }
21984           else
21985             {
21986               cvt = sfloat_optab;
21987               hw_convert = hw_conversions[kf_or_tf].from_di_sign;
21988             }
21989           break;
21990
21991         default:
21992           gcc_unreachable ();
21993         }
21994     }
21995
21996   /* Convert from IEEE 128-bit floating point.  */
21997   else if (FLOAT128_IEEE_P (src_mode))
21998     {
21999       if (src_mode == KFmode)
22000         kf_or_tf = 0;
22001       else if (src_mode == TFmode)
22002         kf_or_tf = 1;
22003       else
22004         gcc_unreachable ();
22005
22006       switch (dest_mode)
22007         {
22008         case E_DFmode:
22009           cvt = trunc_optab;
22010           hw_convert = hw_conversions[kf_or_tf].to_df;
22011           break;
22012
22013         case E_SFmode:
22014           cvt = trunc_optab;
22015           hw_convert = hw_conversions[kf_or_tf].to_sf;
22016           break;
22017
22018         case E_KFmode:
22019         case E_IFmode:
22020         case E_TFmode:
22021           if (FLOAT128_IBM_P (dest_mode))
22022             cvt = trunc_optab;
22023           else
22024             do_move = true;
22025           break;
22026
22027         case E_SImode:
22028           if (unsigned_p)
22029             {
22030               cvt = ufix_optab;
22031               hw_convert = hw_conversions[kf_or_tf].to_si_uns;
22032             }
22033           else
22034             {
22035               cvt = sfix_optab;
22036               hw_convert = hw_conversions[kf_or_tf].to_si_sign;
22037             }
22038           break;
22039
22040         case E_DImode:
22041           if (unsigned_p)
22042             {
22043               cvt = ufix_optab;
22044               hw_convert = hw_conversions[kf_or_tf].to_di_uns;
22045             }
22046           else
22047             {
22048               cvt = sfix_optab;
22049               hw_convert = hw_conversions[kf_or_tf].to_di_sign;
22050             }
22051           break;
22052
22053         default:
22054           gcc_unreachable ();
22055         }
22056     }
22057
22058   /* Both IBM format.  */
22059   else if (FLOAT128_IBM_P (dest_mode) && FLOAT128_IBM_P (src_mode))
22060     do_move = true;
22061
22062   else
22063     gcc_unreachable ();
22064
22065   /* Handle conversion between TFmode/KFmode/IFmode.  */
22066   if (do_move)
22067     emit_insn (gen_rtx_SET (dest, gen_rtx_FLOAT_EXTEND (dest_mode, src)));
22068
22069   /* Handle conversion if we have hardware support.  */
22070   else if (TARGET_FLOAT128_HW && hw_convert)
22071     emit_insn ((hw_convert) (dest, src));
22072
22073   /* Call an external function to do the conversion.  */
22074   else if (cvt != unknown_optab)
22075     {
22076       libfunc = convert_optab_libfunc (cvt, dest_mode, src_mode);
22077       gcc_assert (libfunc != NULL_RTX);
22078
22079       dest2 = emit_library_call_value (libfunc, dest, LCT_CONST, dest_mode,
22080                                        src, src_mode);
22081
22082       gcc_assert (dest2 != NULL_RTX);
22083       if (!rtx_equal_p (dest, dest2))
22084         emit_move_insn (dest, dest2);
22085     }
22086
22087   else
22088     gcc_unreachable ();
22089
22090   return;
22091 }
22092
22093 \f
22094 /* Emit RTL that sets a register to zero if OP1 and OP2 are equal.  SCRATCH
22095    can be used as that dest register.  Return the dest register.  */
22096
22097 rtx
22098 rs6000_emit_eqne (machine_mode mode, rtx op1, rtx op2, rtx scratch)
22099 {
22100   if (op2 == const0_rtx)
22101     return op1;
22102
22103   if (GET_CODE (scratch) == SCRATCH)
22104     scratch = gen_reg_rtx (mode);
22105
22106   if (logical_operand (op2, mode))
22107     emit_insn (gen_rtx_SET (scratch, gen_rtx_XOR (mode, op1, op2)));
22108   else
22109     emit_insn (gen_rtx_SET (scratch,
22110                             gen_rtx_PLUS (mode, op1, negate_rtx (mode, op2))));
22111
22112   return scratch;
22113 }
22114
22115 void
22116 rs6000_emit_sCOND (machine_mode mode, rtx operands[])
22117 {
22118   rtx condition_rtx;
22119   machine_mode op_mode;
22120   enum rtx_code cond_code;
22121   rtx result = operands[0];
22122
22123   condition_rtx = rs6000_generate_compare (operands[1], mode);
22124   cond_code = GET_CODE (condition_rtx);
22125
22126   if (cond_code == NE
22127       || cond_code == GE || cond_code == LE
22128       || cond_code == GEU || cond_code == LEU
22129       || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
22130     {
22131       rtx not_result = gen_reg_rtx (CCEQmode);
22132       rtx not_op, rev_cond_rtx;
22133       machine_mode cc_mode;
22134
22135       cc_mode = GET_MODE (XEXP (condition_rtx, 0));
22136
22137       rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
22138                                      SImode, XEXP (condition_rtx, 0), const0_rtx);
22139       not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
22140       emit_insn (gen_rtx_SET (not_result, not_op));
22141       condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
22142     }
22143
22144   op_mode = GET_MODE (XEXP (operands[1], 0));
22145   if (op_mode == VOIDmode)
22146     op_mode = GET_MODE (XEXP (operands[1], 1));
22147
22148   if (TARGET_POWERPC64 && (op_mode == DImode || FLOAT_MODE_P (mode)))
22149     {
22150       PUT_MODE (condition_rtx, DImode);
22151       convert_move (result, condition_rtx, 0);
22152     }
22153   else
22154     {
22155       PUT_MODE (condition_rtx, SImode);
22156       emit_insn (gen_rtx_SET (result, condition_rtx));
22157     }
22158 }
22159
22160 /* Emit a branch of kind CODE to location LOC.  */
22161
22162 void
22163 rs6000_emit_cbranch (machine_mode mode, rtx operands[])
22164 {
22165   rtx condition_rtx, loc_ref;
22166
22167   condition_rtx = rs6000_generate_compare (operands[0], mode);
22168   loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
22169   emit_jump_insn (gen_rtx_SET (pc_rtx,
22170                                gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
22171                                                      loc_ref, pc_rtx)));
22172 }
22173
22174 /* Return the string to output a conditional branch to LABEL, which is
22175    the operand template of the label, or NULL if the branch is really a
22176    conditional return.
22177
22178    OP is the conditional expression.  XEXP (OP, 0) is assumed to be a
22179    condition code register and its mode specifies what kind of
22180    comparison we made.
22181
22182    REVERSED is nonzero if we should reverse the sense of the comparison.
22183
22184    INSN is the insn.  */
22185
22186 char *
22187 output_cbranch (rtx op, const char *label, int reversed, rtx_insn *insn)
22188 {
22189   static char string[64];
22190   enum rtx_code code = GET_CODE (op);
22191   rtx cc_reg = XEXP (op, 0);
22192   machine_mode mode = GET_MODE (cc_reg);
22193   int cc_regno = REGNO (cc_reg) - CR0_REGNO;
22194   int need_longbranch = label != NULL && get_attr_length (insn) == 8;
22195   int really_reversed = reversed ^ need_longbranch;
22196   char *s = string;
22197   const char *ccode;
22198   const char *pred;
22199   rtx note;
22200
22201   validate_condition_mode (code, mode);
22202
22203   /* Work out which way this really branches.  We could use
22204      reverse_condition_maybe_unordered here always but this
22205      makes the resulting assembler clearer.  */
22206   if (really_reversed)
22207     {
22208       /* Reversal of FP compares takes care -- an ordered compare
22209          becomes an unordered compare and vice versa.  */
22210       if (mode == CCFPmode)
22211         code = reverse_condition_maybe_unordered (code);
22212       else
22213         code = reverse_condition (code);
22214     }
22215
22216   switch (code)
22217     {
22218       /* Not all of these are actually distinct opcodes, but
22219          we distinguish them for clarity of the resulting assembler.  */
22220     case NE: case LTGT:
22221       ccode = "ne"; break;
22222     case EQ: case UNEQ:
22223       ccode = "eq"; break;
22224     case GE: case GEU:
22225       ccode = "ge"; break;
22226     case GT: case GTU: case UNGT:
22227       ccode = "gt"; break;
22228     case LE: case LEU:
22229       ccode = "le"; break;
22230     case LT: case LTU: case UNLT:
22231       ccode = "lt"; break;
22232     case UNORDERED: ccode = "un"; break;
22233     case ORDERED: ccode = "nu"; break;
22234     case UNGE: ccode = "nl"; break;
22235     case UNLE: ccode = "ng"; break;
22236     default:
22237       gcc_unreachable ();
22238     }
22239
22240   /* Maybe we have a guess as to how likely the branch is.  */
22241   pred = "";
22242   note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
22243   if (note != NULL_RTX)
22244     {
22245       /* PROB is the difference from 50%.  */
22246       int prob = profile_probability::from_reg_br_prob_note (XINT (note, 0))
22247                    .to_reg_br_prob_base () - REG_BR_PROB_BASE / 2;
22248
22249       /* Only hint for highly probable/improbable branches on newer cpus when
22250          we have real profile data, as static prediction overrides processor
22251          dynamic prediction.  For older cpus we may as well always hint, but
22252          assume not taken for branches that are very close to 50% as a
22253          mispredicted taken branch is more expensive than a
22254          mispredicted not-taken branch.  */
22255       if (rs6000_always_hint
22256           || (abs (prob) > REG_BR_PROB_BASE / 100 * 48
22257               && (profile_status_for_fn (cfun) != PROFILE_GUESSED)
22258               && br_prob_note_reliable_p (note)))
22259         {
22260           if (abs (prob) > REG_BR_PROB_BASE / 20
22261               && ((prob > 0) ^ need_longbranch))
22262             pred = "+";
22263           else
22264             pred = "-";
22265         }
22266     }
22267
22268   if (label == NULL)
22269     s += sprintf (s, "b%slr%s ", ccode, pred);
22270   else
22271     s += sprintf (s, "b%s%s ", ccode, pred);
22272
22273   /* We need to escape any '%' characters in the reg_names string.
22274      Assume they'd only be the first character....  */
22275   if (reg_names[cc_regno + CR0_REGNO][0] == '%')
22276     *s++ = '%';
22277   s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
22278
22279   if (label != NULL)
22280     {
22281       /* If the branch distance was too far, we may have to use an
22282          unconditional branch to go the distance.  */
22283       if (need_longbranch)
22284         s += sprintf (s, ",$+8\n\tb %s", label);
22285       else
22286         s += sprintf (s, ",%s", label);
22287     }
22288
22289   return string;
22290 }
22291
22292 /* Return insn for VSX or Altivec comparisons.  */
22293
22294 static rtx
22295 rs6000_emit_vector_compare_inner (enum rtx_code code, rtx op0, rtx op1)
22296 {
22297   rtx mask;
22298   machine_mode mode = GET_MODE (op0);
22299
22300   switch (code)
22301     {
22302     default:
22303       break;
22304
22305     case GE:
22306       if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
22307         return NULL_RTX;
22308       /* FALLTHRU */
22309
22310     case EQ:
22311     case GT:
22312     case GTU:
22313     case ORDERED:
22314     case UNORDERED:
22315     case UNEQ:
22316     case LTGT:
22317       mask = gen_reg_rtx (mode);
22318       emit_insn (gen_rtx_SET (mask, gen_rtx_fmt_ee (code, mode, op0, op1)));
22319       return mask;
22320     }
22321
22322   return NULL_RTX;
22323 }
22324
22325 /* Emit vector compare for operands OP0 and OP1 using code RCODE.
22326    DMODE is expected destination mode. This is a recursive function.  */
22327
22328 static rtx
22329 rs6000_emit_vector_compare (enum rtx_code rcode,
22330                             rtx op0, rtx op1,
22331                             machine_mode dmode)
22332 {
22333   rtx mask;
22334   bool swap_operands = false;
22335   bool try_again = false;
22336
22337   gcc_assert (VECTOR_UNIT_ALTIVEC_OR_VSX_P (dmode));
22338   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
22339
22340   /* See if the comparison works as is.  */
22341   mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
22342   if (mask)
22343     return mask;
22344
22345   switch (rcode)
22346     {
22347     case LT:
22348       rcode = GT;
22349       swap_operands = true;
22350       try_again = true;
22351       break;
22352     case LTU:
22353       rcode = GTU;
22354       swap_operands = true;
22355       try_again = true;
22356       break;
22357     case NE:
22358     case UNLE:
22359     case UNLT:
22360     case UNGE:
22361     case UNGT:
22362       /* Invert condition and try again.
22363          e.g., A != B becomes ~(A==B).  */
22364       {
22365         enum rtx_code rev_code;
22366         enum insn_code nor_code;
22367         rtx mask2;
22368
22369         rev_code = reverse_condition_maybe_unordered (rcode);
22370         if (rev_code == UNKNOWN)
22371           return NULL_RTX;
22372
22373         nor_code = optab_handler (one_cmpl_optab, dmode);
22374         if (nor_code == CODE_FOR_nothing)
22375           return NULL_RTX;
22376
22377         mask2 = rs6000_emit_vector_compare (rev_code, op0, op1, dmode);
22378         if (!mask2)
22379           return NULL_RTX;
22380
22381         mask = gen_reg_rtx (dmode);
22382         emit_insn (GEN_FCN (nor_code) (mask, mask2));
22383         return mask;
22384       }
22385       break;
22386     case GE:
22387     case GEU:
22388     case LE:
22389     case LEU:
22390       /* Try GT/GTU/LT/LTU OR EQ */
22391       {
22392         rtx c_rtx, eq_rtx;
22393         enum insn_code ior_code;
22394         enum rtx_code new_code;
22395
22396         switch (rcode)
22397           {
22398           case  GE:
22399             new_code = GT;
22400             break;
22401
22402           case GEU:
22403             new_code = GTU;
22404             break;
22405
22406           case LE:
22407             new_code = LT;
22408             break;
22409
22410           case LEU:
22411             new_code = LTU;
22412             break;
22413
22414           default:
22415             gcc_unreachable ();
22416           }
22417
22418         ior_code = optab_handler (ior_optab, dmode);
22419         if (ior_code == CODE_FOR_nothing)
22420           return NULL_RTX;
22421
22422         c_rtx = rs6000_emit_vector_compare (new_code, op0, op1, dmode);
22423         if (!c_rtx)
22424           return NULL_RTX;
22425
22426         eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1, dmode);
22427         if (!eq_rtx)
22428           return NULL_RTX;
22429
22430         mask = gen_reg_rtx (dmode);
22431         emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
22432         return mask;
22433       }
22434       break;
22435     default:
22436       return NULL_RTX;
22437     }
22438
22439   if (try_again)
22440     {
22441       if (swap_operands)
22442         std::swap (op0, op1);
22443
22444       mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
22445       if (mask)
22446         return mask;
22447     }
22448
22449   /* You only get two chances.  */
22450   return NULL_RTX;
22451 }
22452
22453 /* Emit vector conditional expression.  DEST is destination. OP_TRUE and
22454    OP_FALSE are two VEC_COND_EXPR operands.  CC_OP0 and CC_OP1 are the two
22455    operands for the relation operation COND.  */
22456
22457 int
22458 rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false,
22459                               rtx cond, rtx cc_op0, rtx cc_op1)
22460 {
22461   machine_mode dest_mode = GET_MODE (dest);
22462   machine_mode mask_mode = GET_MODE (cc_op0);
22463   enum rtx_code rcode = GET_CODE (cond);
22464   machine_mode cc_mode = CCmode;
22465   rtx mask;
22466   rtx cond2;
22467   bool invert_move = false;
22468
22469   if (VECTOR_UNIT_NONE_P (dest_mode))
22470     return 0;
22471
22472   gcc_assert (GET_MODE_SIZE (dest_mode) == GET_MODE_SIZE (mask_mode)
22473               && GET_MODE_NUNITS (dest_mode) == GET_MODE_NUNITS (mask_mode));
22474
22475   switch (rcode)
22476     {
22477       /* Swap operands if we can, and fall back to doing the operation as
22478          specified, and doing a NOR to invert the test.  */
22479     case NE:
22480     case UNLE:
22481     case UNLT:
22482     case UNGE:
22483     case UNGT:
22484       /* Invert condition and try again.
22485          e.g., A  = (B != C) ? D : E becomes A = (B == C) ? E : D.  */
22486       invert_move = true;
22487       rcode = reverse_condition_maybe_unordered (rcode);
22488       if (rcode == UNKNOWN)
22489         return 0;
22490       break;
22491
22492     case GE:
22493     case LE:
22494       if (GET_MODE_CLASS (mask_mode) == MODE_VECTOR_INT)
22495         {
22496           /* Invert condition to avoid compound test.  */
22497           invert_move = true;
22498           rcode = reverse_condition (rcode);
22499         }
22500       break;
22501
22502     case GTU:
22503     case GEU:
22504     case LTU:
22505     case LEU:
22506       /* Mark unsigned tests with CCUNSmode.  */
22507       cc_mode = CCUNSmode;
22508
22509       /* Invert condition to avoid compound test if necessary.  */
22510       if (rcode == GEU || rcode == LEU)
22511         {
22512           invert_move = true;
22513           rcode = reverse_condition (rcode);
22514         }
22515       break;
22516
22517     default:
22518       break;
22519     }
22520
22521   /* Get the vector mask for the given relational operations.  */
22522   mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, mask_mode);
22523
22524   if (!mask)
22525     return 0;
22526
22527   if (invert_move)
22528     std::swap (op_true, op_false);
22529
22530   /* Optimize vec1 == vec2, to know the mask generates -1/0.  */
22531   if (GET_MODE_CLASS (dest_mode) == MODE_VECTOR_INT
22532       && (GET_CODE (op_true) == CONST_VECTOR
22533           || GET_CODE (op_false) == CONST_VECTOR))
22534     {
22535       rtx constant_0 = CONST0_RTX (dest_mode);
22536       rtx constant_m1 = CONSTM1_RTX (dest_mode);
22537
22538       if (op_true == constant_m1 && op_false == constant_0)
22539         {
22540           emit_move_insn (dest, mask);
22541           return 1;
22542         }
22543
22544       else if (op_true == constant_0 && op_false == constant_m1)
22545         {
22546           emit_insn (gen_rtx_SET (dest, gen_rtx_NOT (dest_mode, mask)));
22547           return 1;
22548         }
22549
22550       /* If we can't use the vector comparison directly, perhaps we can use
22551          the mask for the true or false fields, instead of loading up a
22552          constant.  */
22553       if (op_true == constant_m1)
22554         op_true = mask;
22555
22556       if (op_false == constant_0)
22557         op_false = mask;
22558     }
22559
22560   if (!REG_P (op_true) && !SUBREG_P (op_true))
22561     op_true = force_reg (dest_mode, op_true);
22562
22563   if (!REG_P (op_false) && !SUBREG_P (op_false))
22564     op_false = force_reg (dest_mode, op_false);
22565
22566   cond2 = gen_rtx_fmt_ee (NE, cc_mode, gen_lowpart (dest_mode, mask),
22567                           CONST0_RTX (dest_mode));
22568   emit_insn (gen_rtx_SET (dest,
22569                           gen_rtx_IF_THEN_ELSE (dest_mode,
22570                                                 cond2,
22571                                                 op_true,
22572                                                 op_false)));
22573   return 1;
22574 }
22575
22576 /* ISA 3.0 (power9) minmax subcase to emit a XSMAXCDP or XSMINCDP instruction
22577    for SF/DF scalars.  Move TRUE_COND to DEST if OP of the operands of the last
22578    comparison is nonzero/true, FALSE_COND if it is zero/false.  Return 0 if the
22579    hardware has no such operation.  */
22580
22581 static int
22582 rs6000_emit_p9_fp_minmax (rtx dest, rtx op, rtx true_cond, rtx false_cond)
22583 {
22584   enum rtx_code code = GET_CODE (op);
22585   rtx op0 = XEXP (op, 0);
22586   rtx op1 = XEXP (op, 1);
22587   machine_mode compare_mode = GET_MODE (op0);
22588   machine_mode result_mode = GET_MODE (dest);
22589   bool max_p = false;
22590
22591   if (result_mode != compare_mode)
22592     return 0;
22593
22594   if (code == GE || code == GT)
22595     max_p = true;
22596   else if (code == LE || code == LT)
22597     max_p = false;
22598   else
22599     return 0;
22600
22601   if (rtx_equal_p (op0, true_cond) && rtx_equal_p (op1, false_cond))
22602     ;
22603
22604   else if (rtx_equal_p (op1, true_cond) && rtx_equal_p (op0, false_cond))
22605     max_p = !max_p;
22606
22607   else
22608     return 0;
22609
22610   rs6000_emit_minmax (dest, max_p ? SMAX : SMIN, op0, op1);
22611   return 1;
22612 }
22613
22614 /* ISA 3.0 (power9) conditional move subcase to emit XSCMP{EQ,GE,GT,NE}DP and
22615    XXSEL instructions for SF/DF scalars.  Move TRUE_COND to DEST if OP of the
22616    operands of the last comparison is nonzero/true, FALSE_COND if it is
22617    zero/false.  Return 0 if the hardware has no such operation.  */
22618
22619 static int
22620 rs6000_emit_p9_fp_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
22621 {
22622   enum rtx_code code = GET_CODE (op);
22623   rtx op0 = XEXP (op, 0);
22624   rtx op1 = XEXP (op, 1);
22625   machine_mode result_mode = GET_MODE (dest);
22626   rtx compare_rtx;
22627   rtx cmove_rtx;
22628   rtx clobber_rtx;
22629
22630   if (!can_create_pseudo_p ())
22631     return 0;
22632
22633   switch (code)
22634     {
22635     case EQ:
22636     case GE:
22637     case GT:
22638       break;
22639
22640     case NE:
22641     case LT:
22642     case LE:
22643       code = swap_condition (code);
22644       std::swap (op0, op1);
22645       break;
22646
22647     default:
22648       return 0;
22649     }
22650
22651   /* Generate:  [(parallel [(set (dest)
22652                                  (if_then_else (op (cmp1) (cmp2))
22653                                                (true)
22654                                                (false)))
22655                             (clobber (scratch))])].  */
22656
22657   compare_rtx = gen_rtx_fmt_ee (code, CCFPmode, op0, op1);
22658   cmove_rtx = gen_rtx_SET (dest,
22659                            gen_rtx_IF_THEN_ELSE (result_mode,
22660                                                  compare_rtx,
22661                                                  true_cond,
22662                                                  false_cond));
22663
22664   clobber_rtx = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (V2DImode));
22665   emit_insn (gen_rtx_PARALLEL (VOIDmode,
22666                                gen_rtvec (2, cmove_rtx, clobber_rtx)));
22667
22668   return 1;
22669 }
22670
22671 /* Emit a conditional move: move TRUE_COND to DEST if OP of the
22672    operands of the last comparison is nonzero/true, FALSE_COND if it
22673    is zero/false.  Return 0 if the hardware has no such operation.  */
22674
22675 int
22676 rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
22677 {
22678   enum rtx_code code = GET_CODE (op);
22679   rtx op0 = XEXP (op, 0);
22680   rtx op1 = XEXP (op, 1);
22681   machine_mode compare_mode = GET_MODE (op0);
22682   machine_mode result_mode = GET_MODE (dest);
22683   rtx temp;
22684   bool is_against_zero;
22685
22686   /* These modes should always match.  */
22687   if (GET_MODE (op1) != compare_mode
22688       /* In the isel case however, we can use a compare immediate, so
22689          op1 may be a small constant.  */
22690       && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
22691     return 0;
22692   if (GET_MODE (true_cond) != result_mode)
22693     return 0;
22694   if (GET_MODE (false_cond) != result_mode)
22695     return 0;
22696
22697   /* See if we can use the ISA 3.0 (power9) min/max/compare functions.  */
22698   if (TARGET_P9_MINMAX
22699       && (compare_mode == SFmode || compare_mode == DFmode)
22700       && (result_mode == SFmode || result_mode == DFmode))
22701     {
22702       if (rs6000_emit_p9_fp_minmax (dest, op, true_cond, false_cond))
22703         return 1;
22704
22705       if (rs6000_emit_p9_fp_cmove (dest, op, true_cond, false_cond))
22706         return 1;
22707     }
22708
22709   /* Don't allow using floating point comparisons for integer results for
22710      now.  */
22711   if (FLOAT_MODE_P (compare_mode) && !FLOAT_MODE_P (result_mode))
22712     return 0;
22713
22714   /* First, work out if the hardware can do this at all, or
22715      if it's too slow....  */
22716   if (!FLOAT_MODE_P (compare_mode))
22717     {
22718       if (TARGET_ISEL)
22719         return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
22720       return 0;
22721     }
22722
22723   is_against_zero = op1 == CONST0_RTX (compare_mode);
22724
22725   /* A floating-point subtract might overflow, underflow, or produce
22726      an inexact result, thus changing the floating-point flags, so it
22727      can't be generated if we care about that.  It's safe if one side
22728      of the construct is zero, since then no subtract will be
22729      generated.  */
22730   if (SCALAR_FLOAT_MODE_P (compare_mode)
22731       && flag_trapping_math && ! is_against_zero)
22732     return 0;
22733
22734   /* Eliminate half of the comparisons by switching operands, this
22735      makes the remaining code simpler.  */
22736   if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
22737       || code == LTGT || code == LT || code == UNLE)
22738     {
22739       code = reverse_condition_maybe_unordered (code);
22740       temp = true_cond;
22741       true_cond = false_cond;
22742       false_cond = temp;
22743     }
22744
22745   /* UNEQ and LTGT take four instructions for a comparison with zero,
22746      it'll probably be faster to use a branch here too.  */
22747   if (code == UNEQ && HONOR_NANS (compare_mode))
22748     return 0;
22749
22750   /* We're going to try to implement comparisons by performing
22751      a subtract, then comparing against zero.  Unfortunately,
22752      Inf - Inf is NaN which is not zero, and so if we don't
22753      know that the operand is finite and the comparison
22754      would treat EQ different to UNORDERED, we can't do it.  */
22755   if (HONOR_INFINITIES (compare_mode)
22756       && code != GT && code != UNGE
22757       && (!CONST_DOUBLE_P (op1)
22758           || real_isinf (CONST_DOUBLE_REAL_VALUE (op1)))
22759       /* Constructs of the form (a OP b ? a : b) are safe.  */
22760       && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
22761           || (! rtx_equal_p (op0, true_cond)
22762               && ! rtx_equal_p (op1, true_cond))))
22763     return 0;
22764
22765   /* At this point we know we can use fsel.  */
22766
22767   /* Reduce the comparison to a comparison against zero.  */
22768   if (! is_against_zero)
22769     {
22770       temp = gen_reg_rtx (compare_mode);
22771       emit_insn (gen_rtx_SET (temp, gen_rtx_MINUS (compare_mode, op0, op1)));
22772       op0 = temp;
22773       op1 = CONST0_RTX (compare_mode);
22774     }
22775
22776   /* If we don't care about NaNs we can reduce some of the comparisons
22777      down to faster ones.  */
22778   if (! HONOR_NANS (compare_mode))
22779     switch (code)
22780       {
22781       case GT:
22782         code = LE;
22783         temp = true_cond;
22784         true_cond = false_cond;
22785         false_cond = temp;
22786         break;
22787       case UNGE:
22788         code = GE;
22789         break;
22790       case UNEQ:
22791         code = EQ;
22792         break;
22793       default:
22794         break;
22795       }
22796
22797   /* Now, reduce everything down to a GE.  */
22798   switch (code)
22799     {
22800     case GE:
22801       break;
22802
22803     case LE:
22804       temp = gen_reg_rtx (compare_mode);
22805       emit_insn (gen_rtx_SET (temp, gen_rtx_NEG (compare_mode, op0)));
22806       op0 = temp;
22807       break;
22808
22809     case ORDERED:
22810       temp = gen_reg_rtx (compare_mode);
22811       emit_insn (gen_rtx_SET (temp, gen_rtx_ABS (compare_mode, op0)));
22812       op0 = temp;
22813       break;
22814
22815     case EQ:
22816       temp = gen_reg_rtx (compare_mode);
22817       emit_insn (gen_rtx_SET (temp,
22818                               gen_rtx_NEG (compare_mode,
22819                                            gen_rtx_ABS (compare_mode, op0))));
22820       op0 = temp;
22821       break;
22822
22823     case UNGE:
22824       /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
22825       temp = gen_reg_rtx (result_mode);
22826       emit_insn (gen_rtx_SET (temp,
22827                               gen_rtx_IF_THEN_ELSE (result_mode,
22828                                                     gen_rtx_GE (VOIDmode,
22829                                                                 op0, op1),
22830                                                     true_cond, false_cond)));
22831       false_cond = true_cond;
22832       true_cond = temp;
22833
22834       temp = gen_reg_rtx (compare_mode);
22835       emit_insn (gen_rtx_SET (temp, gen_rtx_NEG (compare_mode, op0)));
22836       op0 = temp;
22837       break;
22838
22839     case GT:
22840       /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
22841       temp = gen_reg_rtx (result_mode);
22842       emit_insn (gen_rtx_SET (temp,
22843                               gen_rtx_IF_THEN_ELSE (result_mode,
22844                                                     gen_rtx_GE (VOIDmode,
22845                                                                 op0, op1),
22846                                                     true_cond, false_cond)));
22847       true_cond = false_cond;
22848       false_cond = temp;
22849
22850       temp = gen_reg_rtx (compare_mode);
22851       emit_insn (gen_rtx_SET (temp, gen_rtx_NEG (compare_mode, op0)));
22852       op0 = temp;
22853       break;
22854
22855     default:
22856       gcc_unreachable ();
22857     }
22858
22859   emit_insn (gen_rtx_SET (dest,
22860                           gen_rtx_IF_THEN_ELSE (result_mode,
22861                                                 gen_rtx_GE (VOIDmode,
22862                                                             op0, op1),
22863                                                 true_cond, false_cond)));
22864   return 1;
22865 }
22866
22867 /* Same as above, but for ints (isel).  */
22868
22869 int
22870 rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
22871 {
22872   rtx condition_rtx, cr;
22873   machine_mode mode = GET_MODE (dest);
22874   enum rtx_code cond_code;
22875   rtx (*isel_func) (rtx, rtx, rtx, rtx, rtx);
22876   bool signedp;
22877
22878   if (mode != SImode && (!TARGET_POWERPC64 || mode != DImode))
22879     return 0;
22880
22881   /* We still have to do the compare, because isel doesn't do a
22882      compare, it just looks at the CRx bits set by a previous compare
22883      instruction.  */
22884   condition_rtx = rs6000_generate_compare (op, mode);
22885   cond_code = GET_CODE (condition_rtx);
22886   cr = XEXP (condition_rtx, 0);
22887   signedp = GET_MODE (cr) == CCmode;
22888
22889   isel_func = (mode == SImode
22890                ? (signedp ? gen_isel_signed_si : gen_isel_unsigned_si)
22891                : (signedp ? gen_isel_signed_di : gen_isel_unsigned_di));
22892
22893   switch (cond_code)
22894     {
22895     case LT: case GT: case LTU: case GTU: case EQ:
22896       /* isel handles these directly.  */
22897       break;
22898
22899     default:
22900       /* We need to swap the sense of the comparison.  */
22901       {
22902         std::swap (false_cond, true_cond);
22903         PUT_CODE (condition_rtx, reverse_condition (cond_code));
22904       }
22905       break;
22906     }
22907
22908   false_cond = force_reg (mode, false_cond);
22909   if (true_cond != const0_rtx)
22910     true_cond = force_reg (mode, true_cond);
22911
22912   emit_insn (isel_func (dest, condition_rtx, true_cond, false_cond, cr));
22913
22914   return 1;
22915 }
22916
22917 void
22918 rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
22919 {
22920   machine_mode mode = GET_MODE (op0);
22921   enum rtx_code c;
22922   rtx target;
22923
22924   /* VSX/altivec have direct min/max insns.  */
22925   if ((code == SMAX || code == SMIN)
22926       && (VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode)
22927           || (mode == SFmode && VECTOR_UNIT_VSX_P (DFmode))))
22928     {
22929       emit_insn (gen_rtx_SET (dest, gen_rtx_fmt_ee (code, mode, op0, op1)));
22930       return;
22931     }
22932
22933   if (code == SMAX || code == SMIN)
22934     c = GE;
22935   else
22936     c = GEU;
22937
22938   if (code == SMAX || code == UMAX)
22939     target = emit_conditional_move (dest, c, op0, op1, mode,
22940                                     op0, op1, mode, 0);
22941   else
22942     target = emit_conditional_move (dest, c, op0, op1, mode,
22943                                     op1, op0, mode, 0);
22944   gcc_assert (target);
22945   if (target != dest)
22946     emit_move_insn (dest, target);
22947 }
22948
22949 /* A subroutine of the atomic operation splitters.  Jump to LABEL if
22950    COND is true.  Mark the jump as unlikely to be taken.  */
22951
22952 static void
22953 emit_unlikely_jump (rtx cond, rtx label)
22954 {
22955   rtx x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
22956   rtx_insn *insn = emit_jump_insn (gen_rtx_SET (pc_rtx, x));
22957   add_reg_br_prob_note (insn, profile_probability::very_unlikely ());
22958 }
22959
22960 /* A subroutine of the atomic operation splitters.  Emit a load-locked
22961    instruction in MODE.  For QI/HImode, possibly use a pattern than includes
22962    the zero_extend operation.  */
22963
22964 static void
22965 emit_load_locked (machine_mode mode, rtx reg, rtx mem)
22966 {
22967   rtx (*fn) (rtx, rtx) = NULL;
22968
22969   switch (mode)
22970     {
22971     case E_QImode:
22972       fn = gen_load_lockedqi;
22973       break;
22974     case E_HImode:
22975       fn = gen_load_lockedhi;
22976       break;
22977     case E_SImode:
22978       if (GET_MODE (mem) == QImode)
22979         fn = gen_load_lockedqi_si;
22980       else if (GET_MODE (mem) == HImode)
22981         fn = gen_load_lockedhi_si;
22982       else
22983         fn = gen_load_lockedsi;
22984       break;
22985     case E_DImode:
22986       fn = gen_load_lockeddi;
22987       break;
22988     case E_TImode:
22989       fn = gen_load_lockedti;
22990       break;
22991     default:
22992       gcc_unreachable ();
22993     }
22994   emit_insn (fn (reg, mem));
22995 }
22996
22997 /* A subroutine of the atomic operation splitters.  Emit a store-conditional
22998    instruction in MODE.  */
22999
23000 static void
23001 emit_store_conditional (machine_mode mode, rtx res, rtx mem, rtx val)
23002 {
23003   rtx (*fn) (rtx, rtx, rtx) = NULL;
23004
23005   switch (mode)
23006     {
23007     case E_QImode:
23008       fn = gen_store_conditionalqi;
23009       break;
23010     case E_HImode:
23011       fn = gen_store_conditionalhi;
23012       break;
23013     case E_SImode:
23014       fn = gen_store_conditionalsi;
23015       break;
23016     case E_DImode:
23017       fn = gen_store_conditionaldi;
23018       break;
23019     case E_TImode:
23020       fn = gen_store_conditionalti;
23021       break;
23022     default:
23023       gcc_unreachable ();
23024     }
23025
23026   /* Emit sync before stwcx. to address PPC405 Erratum.  */
23027   if (PPC405_ERRATUM77)
23028     emit_insn (gen_hwsync ());
23029
23030   emit_insn (fn (res, mem, val));
23031 }
23032
23033 /* Expand barriers before and after a load_locked/store_cond sequence.  */
23034
23035 static rtx
23036 rs6000_pre_atomic_barrier (rtx mem, enum memmodel model)
23037 {
23038   rtx addr = XEXP (mem, 0);
23039
23040   if (!legitimate_indirect_address_p (addr, reload_completed)
23041       && !legitimate_indexed_address_p (addr, reload_completed))
23042     {
23043       addr = force_reg (Pmode, addr);
23044       mem = replace_equiv_address_nv (mem, addr);
23045     }
23046
23047   switch (model)
23048     {
23049     case MEMMODEL_RELAXED:
23050     case MEMMODEL_CONSUME:
23051     case MEMMODEL_ACQUIRE:
23052       break;
23053     case MEMMODEL_RELEASE:
23054     case MEMMODEL_ACQ_REL:
23055       emit_insn (gen_lwsync ());
23056       break;
23057     case MEMMODEL_SEQ_CST:
23058       emit_insn (gen_hwsync ());
23059       break;
23060     default:
23061       gcc_unreachable ();
23062     }
23063   return mem;
23064 }
23065
23066 static void
23067 rs6000_post_atomic_barrier (enum memmodel model)
23068 {
23069   switch (model)
23070     {
23071     case MEMMODEL_RELAXED:
23072     case MEMMODEL_CONSUME:
23073     case MEMMODEL_RELEASE:
23074       break;
23075     case MEMMODEL_ACQUIRE:
23076     case MEMMODEL_ACQ_REL:
23077     case MEMMODEL_SEQ_CST:
23078       emit_insn (gen_isync ());
23079       break;
23080     default:
23081       gcc_unreachable ();
23082     }
23083 }
23084
23085 /* A subroutine of the various atomic expanders.  For sub-word operations,
23086    we must adjust things to operate on SImode.  Given the original MEM,
23087    return a new aligned memory.  Also build and return the quantities by
23088    which to shift and mask.  */
23089
23090 static rtx
23091 rs6000_adjust_atomic_subword (rtx orig_mem, rtx *pshift, rtx *pmask)
23092 {
23093   rtx addr, align, shift, mask, mem;
23094   HOST_WIDE_INT shift_mask;
23095   machine_mode mode = GET_MODE (orig_mem);
23096
23097   /* For smaller modes, we have to implement this via SImode.  */
23098   shift_mask = (mode == QImode ? 0x18 : 0x10);
23099
23100   addr = XEXP (orig_mem, 0);
23101   addr = force_reg (GET_MODE (addr), addr);
23102
23103   /* Aligned memory containing subword.  Generate a new memory.  We
23104      do not want any of the existing MEM_ATTR data, as we're now
23105      accessing memory outside the original object.  */
23106   align = expand_simple_binop (Pmode, AND, addr, GEN_INT (-4),
23107                                NULL_RTX, 1, OPTAB_LIB_WIDEN);
23108   mem = gen_rtx_MEM (SImode, align);
23109   MEM_VOLATILE_P (mem) = MEM_VOLATILE_P (orig_mem);
23110   if (MEM_ALIAS_SET (orig_mem) == ALIAS_SET_MEMORY_BARRIER)
23111     set_mem_alias_set (mem, ALIAS_SET_MEMORY_BARRIER);
23112
23113   /* Shift amount for subword relative to aligned word.  */
23114   shift = gen_reg_rtx (SImode);
23115   addr = gen_lowpart (SImode, addr);
23116   rtx tmp = gen_reg_rtx (SImode);
23117   emit_insn (gen_ashlsi3 (tmp, addr, GEN_INT (3)));
23118   emit_insn (gen_andsi3 (shift, tmp, GEN_INT (shift_mask)));
23119   if (BYTES_BIG_ENDIAN)
23120     shift = expand_simple_binop (SImode, XOR, shift, GEN_INT (shift_mask),
23121                                  shift, 1, OPTAB_LIB_WIDEN);
23122   *pshift = shift;
23123
23124   /* Mask for insertion.  */
23125   mask = expand_simple_binop (SImode, ASHIFT, GEN_INT (GET_MODE_MASK (mode)),
23126                               shift, NULL_RTX, 1, OPTAB_LIB_WIDEN);
23127   *pmask = mask;
23128
23129   return mem;
23130 }
23131
23132 /* A subroutine of the various atomic expanders.  For sub-word operands,
23133    combine OLDVAL and NEWVAL via MASK.  Returns a new pseduo.  */
23134
23135 static rtx
23136 rs6000_mask_atomic_subword (rtx oldval, rtx newval, rtx mask)
23137 {
23138   rtx x;
23139
23140   x = gen_reg_rtx (SImode);
23141   emit_insn (gen_rtx_SET (x, gen_rtx_AND (SImode,
23142                                           gen_rtx_NOT (SImode, mask),
23143                                           oldval)));
23144
23145   x = expand_simple_binop (SImode, IOR, newval, x, x, 1, OPTAB_LIB_WIDEN);
23146
23147   return x;
23148 }
23149
23150 /* A subroutine of the various atomic expanders.  For sub-word operands,
23151    extract WIDE to NARROW via SHIFT.  */
23152
23153 static void
23154 rs6000_finish_atomic_subword (rtx narrow, rtx wide, rtx shift)
23155 {
23156   wide = expand_simple_binop (SImode, LSHIFTRT, wide, shift,
23157                               wide, 1, OPTAB_LIB_WIDEN);
23158   emit_move_insn (narrow, gen_lowpart (GET_MODE (narrow), wide));
23159 }
23160
23161 /* Expand an atomic compare and swap operation.  */
23162
23163 void
23164 rs6000_expand_atomic_compare_and_swap (rtx operands[])
23165 {
23166   rtx boolval, retval, mem, oldval, newval, cond;
23167   rtx label1, label2, x, mask, shift;
23168   machine_mode mode, orig_mode;
23169   enum memmodel mod_s, mod_f;
23170   bool is_weak;
23171
23172   boolval = operands[0];
23173   retval = operands[1];
23174   mem = operands[2];
23175   oldval = operands[3];
23176   newval = operands[4];
23177   is_weak = (INTVAL (operands[5]) != 0);
23178   mod_s = memmodel_base (INTVAL (operands[6]));
23179   mod_f = memmodel_base (INTVAL (operands[7]));
23180   orig_mode = mode = GET_MODE (mem);
23181
23182   mask = shift = NULL_RTX;
23183   if (mode == QImode || mode == HImode)
23184     {
23185       /* Before power8, we didn't have access to lbarx/lharx, so generate a
23186          lwarx and shift/mask operations.  With power8, we need to do the
23187          comparison in SImode, but the store is still done in QI/HImode.  */
23188       oldval = convert_modes (SImode, mode, oldval, 1);
23189
23190       if (!TARGET_SYNC_HI_QI)
23191         {
23192           mem = rs6000_adjust_atomic_subword (mem, &shift, &mask);
23193
23194           /* Shift and mask OLDVAL into position with the word.  */
23195           oldval = expand_simple_binop (SImode, ASHIFT, oldval, shift,
23196                                         NULL_RTX, 1, OPTAB_LIB_WIDEN);
23197
23198           /* Shift and mask NEWVAL into position within the word.  */
23199           newval = convert_modes (SImode, mode, newval, 1);
23200           newval = expand_simple_binop (SImode, ASHIFT, newval, shift,
23201                                         NULL_RTX, 1, OPTAB_LIB_WIDEN);
23202         }
23203
23204       /* Prepare to adjust the return value.  */
23205       retval = gen_reg_rtx (SImode);
23206       mode = SImode;
23207     }
23208   else if (reg_overlap_mentioned_p (retval, oldval))
23209     oldval = copy_to_reg (oldval);
23210
23211   if (mode != TImode && !reg_or_short_operand (oldval, mode))
23212     oldval = copy_to_mode_reg (mode, oldval);
23213
23214   if (reg_overlap_mentioned_p (retval, newval))
23215     newval = copy_to_reg (newval);
23216
23217   mem = rs6000_pre_atomic_barrier (mem, mod_s);
23218
23219   label1 = NULL_RTX;
23220   if (!is_weak)
23221     {
23222       label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
23223       emit_label (XEXP (label1, 0));
23224     }
23225   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
23226
23227   emit_load_locked (mode, retval, mem);
23228
23229   x = retval;
23230   if (mask)
23231     x = expand_simple_binop (SImode, AND, retval, mask,
23232                              NULL_RTX, 1, OPTAB_LIB_WIDEN);
23233
23234   cond = gen_reg_rtx (CCmode);
23235   /* If we have TImode, synthesize a comparison.  */
23236   if (mode != TImode)
23237     x = gen_rtx_COMPARE (CCmode, x, oldval);
23238   else
23239     {
23240       rtx xor1_result = gen_reg_rtx (DImode);
23241       rtx xor2_result = gen_reg_rtx (DImode);
23242       rtx or_result = gen_reg_rtx (DImode);
23243       rtx new_word0 = simplify_gen_subreg (DImode, x, TImode, 0);
23244       rtx new_word1 = simplify_gen_subreg (DImode, x, TImode, 8);
23245       rtx old_word0 = simplify_gen_subreg (DImode, oldval, TImode, 0);
23246       rtx old_word1 = simplify_gen_subreg (DImode, oldval, TImode, 8);
23247
23248       emit_insn (gen_xordi3 (xor1_result, new_word0, old_word0));
23249       emit_insn (gen_xordi3 (xor2_result, new_word1, old_word1));
23250       emit_insn (gen_iordi3 (or_result, xor1_result, xor2_result));
23251       x = gen_rtx_COMPARE (CCmode, or_result, const0_rtx);
23252     }
23253
23254   emit_insn (gen_rtx_SET (cond, x));
23255
23256   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
23257   emit_unlikely_jump (x, label2);
23258
23259   x = newval;
23260   if (mask)
23261     x = rs6000_mask_atomic_subword (retval, newval, mask);
23262
23263   emit_store_conditional (orig_mode, cond, mem, x);
23264
23265   if (!is_weak)
23266     {
23267       x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
23268       emit_unlikely_jump (x, label1);
23269     }
23270
23271   if (!is_mm_relaxed (mod_f))
23272     emit_label (XEXP (label2, 0));
23273
23274   rs6000_post_atomic_barrier (mod_s);
23275
23276   if (is_mm_relaxed (mod_f))
23277     emit_label (XEXP (label2, 0));
23278
23279   if (shift)
23280     rs6000_finish_atomic_subword (operands[1], retval, shift);
23281   else if (mode != GET_MODE (operands[1]))
23282     convert_move (operands[1], retval, 1);
23283
23284   /* In all cases, CR0 contains EQ on success, and NE on failure.  */
23285   x = gen_rtx_EQ (SImode, cond, const0_rtx);
23286   emit_insn (gen_rtx_SET (boolval, x));
23287 }
23288
23289 /* Expand an atomic exchange operation.  */
23290
23291 void
23292 rs6000_expand_atomic_exchange (rtx operands[])
23293 {
23294   rtx retval, mem, val, cond;
23295   machine_mode mode;
23296   enum memmodel model;
23297   rtx label, x, mask, shift;
23298
23299   retval = operands[0];
23300   mem = operands[1];
23301   val = operands[2];
23302   model = memmodel_base (INTVAL (operands[3]));
23303   mode = GET_MODE (mem);
23304
23305   mask = shift = NULL_RTX;
23306   if (!TARGET_SYNC_HI_QI && (mode == QImode || mode == HImode))
23307     {
23308       mem = rs6000_adjust_atomic_subword (mem, &shift, &mask);
23309
23310       /* Shift and mask VAL into position with the word.  */
23311       val = convert_modes (SImode, mode, val, 1);
23312       val = expand_simple_binop (SImode, ASHIFT, val, shift,
23313                                  NULL_RTX, 1, OPTAB_LIB_WIDEN);
23314
23315       /* Prepare to adjust the return value.  */
23316       retval = gen_reg_rtx (SImode);
23317       mode = SImode;
23318     }
23319
23320   mem = rs6000_pre_atomic_barrier (mem, model);
23321
23322   label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
23323   emit_label (XEXP (label, 0));
23324
23325   emit_load_locked (mode, retval, mem);
23326
23327   x = val;
23328   if (mask)
23329     x = rs6000_mask_atomic_subword (retval, val, mask);
23330
23331   cond = gen_reg_rtx (CCmode);
23332   emit_store_conditional (mode, cond, mem, x);
23333
23334   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
23335   emit_unlikely_jump (x, label);
23336
23337   rs6000_post_atomic_barrier (model);
23338
23339   if (shift)
23340     rs6000_finish_atomic_subword (operands[0], retval, shift);
23341 }
23342
23343 /* Expand an atomic fetch-and-operate pattern.  CODE is the binary operation
23344    to perform.  MEM is the memory on which to operate.  VAL is the second
23345    operand of the binary operator.  BEFORE and AFTER are optional locations to
23346    return the value of MEM either before of after the operation.  MODEL_RTX
23347    is a CONST_INT containing the memory model to use.  */
23348
23349 void
23350 rs6000_expand_atomic_op (enum rtx_code code, rtx mem, rtx val,
23351                          rtx orig_before, rtx orig_after, rtx model_rtx)
23352 {
23353   enum memmodel model = memmodel_base (INTVAL (model_rtx));
23354   machine_mode mode = GET_MODE (mem);
23355   machine_mode store_mode = mode;
23356   rtx label, x, cond, mask, shift;
23357   rtx before = orig_before, after = orig_after;
23358
23359   mask = shift = NULL_RTX;
23360   /* On power8, we want to use SImode for the operation.  On previous systems,
23361      use the operation in a subword and shift/mask to get the proper byte or
23362      halfword.  */
23363   if (mode == QImode || mode == HImode)
23364     {
23365       if (TARGET_SYNC_HI_QI)
23366         {
23367           val = convert_modes (SImode, mode, val, 1);
23368
23369           /* Prepare to adjust the return value.  */
23370           before = gen_reg_rtx (SImode);
23371           if (after)
23372             after = gen_reg_rtx (SImode);
23373           mode = SImode;
23374         }
23375       else
23376         {
23377           mem = rs6000_adjust_atomic_subword (mem, &shift, &mask);
23378
23379           /* Shift and mask VAL into position with the word.  */
23380           val = convert_modes (SImode, mode, val, 1);
23381           val = expand_simple_binop (SImode, ASHIFT, val, shift,
23382                                      NULL_RTX, 1, OPTAB_LIB_WIDEN);
23383
23384           switch (code)
23385             {
23386             case IOR:
23387             case XOR:
23388               /* We've already zero-extended VAL.  That is sufficient to
23389                  make certain that it does not affect other bits.  */
23390               mask = NULL;
23391               break;
23392
23393             case AND:
23394               /* If we make certain that all of the other bits in VAL are
23395                  set, that will be sufficient to not affect other bits.  */
23396               x = gen_rtx_NOT (SImode, mask);
23397               x = gen_rtx_IOR (SImode, x, val);
23398               emit_insn (gen_rtx_SET (val, x));
23399               mask = NULL;
23400               break;
23401
23402             case NOT:
23403             case PLUS:
23404             case MINUS:
23405               /* These will all affect bits outside the field and need
23406                  adjustment via MASK within the loop.  */
23407               break;
23408
23409             default:
23410               gcc_unreachable ();
23411             }
23412
23413           /* Prepare to adjust the return value.  */
23414           before = gen_reg_rtx (SImode);
23415           if (after)
23416             after = gen_reg_rtx (SImode);
23417           store_mode = mode = SImode;
23418         }
23419     }
23420
23421   mem = rs6000_pre_atomic_barrier (mem, model);
23422
23423   label = gen_label_rtx ();
23424   emit_label (label);
23425   label = gen_rtx_LABEL_REF (VOIDmode, label);
23426
23427   if (before == NULL_RTX)
23428     before = gen_reg_rtx (mode);
23429
23430   emit_load_locked (mode, before, mem);
23431
23432   if (code == NOT)
23433     {
23434       x = expand_simple_binop (mode, AND, before, val,
23435                                NULL_RTX, 1, OPTAB_LIB_WIDEN);
23436       after = expand_simple_unop (mode, NOT, x, after, 1);
23437     }
23438   else
23439     {
23440       after = expand_simple_binop (mode, code, before, val,
23441                                    after, 1, OPTAB_LIB_WIDEN);
23442     }
23443
23444   x = after;
23445   if (mask)
23446     {
23447       x = expand_simple_binop (SImode, AND, after, mask,
23448                                NULL_RTX, 1, OPTAB_LIB_WIDEN);
23449       x = rs6000_mask_atomic_subword (before, x, mask);
23450     }
23451   else if (store_mode != mode)
23452     x = convert_modes (store_mode, mode, x, 1);
23453
23454   cond = gen_reg_rtx (CCmode);
23455   emit_store_conditional (store_mode, cond, mem, x);
23456
23457   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
23458   emit_unlikely_jump (x, label);
23459
23460   rs6000_post_atomic_barrier (model);
23461
23462   if (shift)
23463     {
23464       /* QImode/HImode on machines without lbarx/lharx where we do a lwarx and
23465          then do the calcuations in a SImode register.  */
23466       if (orig_before)
23467         rs6000_finish_atomic_subword (orig_before, before, shift);
23468       if (orig_after)
23469         rs6000_finish_atomic_subword (orig_after, after, shift);
23470     }
23471   else if (store_mode != mode)
23472     {
23473       /* QImode/HImode on machines with lbarx/lharx where we do the native
23474          operation and then do the calcuations in a SImode register.  */
23475       if (orig_before)
23476         convert_move (orig_before, before, 1);
23477       if (orig_after)
23478         convert_move (orig_after, after, 1);
23479     }
23480   else if (orig_after && after != orig_after)
23481     emit_move_insn (orig_after, after);
23482 }
23483
23484 /* Emit instructions to move SRC to DST.  Called by splitters for
23485    multi-register moves.  It will emit at most one instruction for
23486    each register that is accessed; that is, it won't emit li/lis pairs
23487    (or equivalent for 64-bit code).  One of SRC or DST must be a hard
23488    register.  */
23489
23490 void
23491 rs6000_split_multireg_move (rtx dst, rtx src)
23492 {
23493   /* The register number of the first register being moved.  */
23494   int reg;
23495   /* The mode that is to be moved.  */
23496   machine_mode mode;
23497   /* The mode that the move is being done in, and its size.  */
23498   machine_mode reg_mode;
23499   int reg_mode_size;
23500   /* The number of registers that will be moved.  */
23501   int nregs;
23502
23503   reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
23504   mode = GET_MODE (dst);
23505   nregs = hard_regno_nregs (reg, mode);
23506   if (FP_REGNO_P (reg))
23507     reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode :
23508         (TARGET_HARD_FLOAT ? DFmode : SFmode);
23509   else if (ALTIVEC_REGNO_P (reg))
23510     reg_mode = V16QImode;
23511   else
23512     reg_mode = word_mode;
23513   reg_mode_size = GET_MODE_SIZE (reg_mode);
23514
23515   gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
23516
23517   /* TDmode residing in FP registers is special, since the ISA requires that
23518      the lower-numbered word of a register pair is always the most significant
23519      word, even in little-endian mode.  This does not match the usual subreg
23520      semantics, so we cannnot use simplify_gen_subreg in those cases.  Access
23521      the appropriate constituent registers "by hand" in little-endian mode.
23522
23523      Note we do not need to check for destructive overlap here since TDmode
23524      can only reside in even/odd register pairs.  */
23525   if (FP_REGNO_P (reg) && DECIMAL_FLOAT_MODE_P (mode) && !BYTES_BIG_ENDIAN)
23526     {
23527       rtx p_src, p_dst;
23528       int i;
23529
23530       for (i = 0; i < nregs; i++)
23531         {
23532           if (REG_P (src) && FP_REGNO_P (REGNO (src)))
23533             p_src = gen_rtx_REG (reg_mode, REGNO (src) + nregs - 1 - i);
23534           else
23535             p_src = simplify_gen_subreg (reg_mode, src, mode,
23536                                          i * reg_mode_size);
23537
23538           if (REG_P (dst) && FP_REGNO_P (REGNO (dst)))
23539             p_dst = gen_rtx_REG (reg_mode, REGNO (dst) + nregs - 1 - i);
23540           else
23541             p_dst = simplify_gen_subreg (reg_mode, dst, mode,
23542                                          i * reg_mode_size);
23543
23544           emit_insn (gen_rtx_SET (p_dst, p_src));
23545         }
23546
23547       return;
23548     }
23549
23550   if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
23551     {
23552       /* Move register range backwards, if we might have destructive
23553          overlap.  */
23554       int i;
23555       for (i = nregs - 1; i >= 0; i--)
23556         emit_insn (gen_rtx_SET (simplify_gen_subreg (reg_mode, dst, mode,
23557                                                      i * reg_mode_size),
23558                                 simplify_gen_subreg (reg_mode, src, mode,
23559                                                      i * reg_mode_size)));
23560     }
23561   else
23562     {
23563       int i;
23564       int j = -1;
23565       bool used_update = false;
23566       rtx restore_basereg = NULL_RTX;
23567
23568       if (MEM_P (src) && INT_REGNO_P (reg))
23569         {
23570           rtx breg;
23571
23572           if (GET_CODE (XEXP (src, 0)) == PRE_INC
23573               || GET_CODE (XEXP (src, 0)) == PRE_DEC)
23574             {
23575               rtx delta_rtx;
23576               breg = XEXP (XEXP (src, 0), 0);
23577               delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
23578                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
23579                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
23580               emit_insn (gen_add3_insn (breg, breg, delta_rtx));
23581               src = replace_equiv_address (src, breg);
23582             }
23583           else if (! rs6000_offsettable_memref_p (src, reg_mode, true))
23584             {
23585               if (GET_CODE (XEXP (src, 0)) == PRE_MODIFY)
23586                 {
23587                   rtx basereg = XEXP (XEXP (src, 0), 0);
23588                   if (TARGET_UPDATE)
23589                     {
23590                       rtx ndst = simplify_gen_subreg (reg_mode, dst, mode, 0);
23591                       emit_insn (gen_rtx_SET (ndst,
23592                                               gen_rtx_MEM (reg_mode,
23593                                                            XEXP (src, 0))));
23594                       used_update = true;
23595                     }
23596                   else
23597                     emit_insn (gen_rtx_SET (basereg,
23598                                             XEXP (XEXP (src, 0), 1)));
23599                   src = replace_equiv_address (src, basereg);
23600                 }
23601               else
23602                 {
23603                   rtx basereg = gen_rtx_REG (Pmode, reg);
23604                   emit_insn (gen_rtx_SET (basereg, XEXP (src, 0)));
23605                   src = replace_equiv_address (src, basereg);
23606                 }
23607             }
23608
23609           breg = XEXP (src, 0);
23610           if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
23611             breg = XEXP (breg, 0);
23612
23613           /* If the base register we are using to address memory is
23614              also a destination reg, then change that register last.  */
23615           if (REG_P (breg)
23616               && REGNO (breg) >= REGNO (dst)
23617               && REGNO (breg) < REGNO (dst) + nregs)
23618             j = REGNO (breg) - REGNO (dst);
23619         }
23620       else if (MEM_P (dst) && INT_REGNO_P (reg))
23621         {
23622           rtx breg;
23623
23624           if (GET_CODE (XEXP (dst, 0)) == PRE_INC
23625               || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
23626             {
23627               rtx delta_rtx;
23628               breg = XEXP (XEXP (dst, 0), 0);
23629               delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
23630                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
23631                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
23632
23633               /* We have to update the breg before doing the store.
23634                  Use store with update, if available.  */
23635
23636               if (TARGET_UPDATE)
23637                 {
23638                   rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
23639                   emit_insn (TARGET_32BIT
23640                              ? (TARGET_POWERPC64
23641                                 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
23642                                 : gen_movsi_si_update (breg, breg, delta_rtx, nsrc))
23643                              : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
23644                   used_update = true;
23645                 }
23646               else
23647                 emit_insn (gen_add3_insn (breg, breg, delta_rtx));
23648               dst = replace_equiv_address (dst, breg);
23649             }
23650           else if (!rs6000_offsettable_memref_p (dst, reg_mode, true)
23651                    && GET_CODE (XEXP (dst, 0)) != LO_SUM)
23652             {
23653               if (GET_CODE (XEXP (dst, 0)) == PRE_MODIFY)
23654                 {
23655                   rtx basereg = XEXP (XEXP (dst, 0), 0);
23656                   if (TARGET_UPDATE)
23657                     {
23658                       rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
23659                       emit_insn (gen_rtx_SET (gen_rtx_MEM (reg_mode,
23660                                                            XEXP (dst, 0)),
23661                                               nsrc));
23662                       used_update = true;
23663                     }
23664                   else
23665                     emit_insn (gen_rtx_SET (basereg,
23666                                             XEXP (XEXP (dst, 0), 1)));
23667                   dst = replace_equiv_address (dst, basereg);
23668                 }
23669               else
23670                 {
23671                   rtx basereg = XEXP (XEXP (dst, 0), 0);
23672                   rtx offsetreg = XEXP (XEXP (dst, 0), 1);
23673                   gcc_assert (GET_CODE (XEXP (dst, 0)) == PLUS
23674                               && REG_P (basereg)
23675                               && REG_P (offsetreg)
23676                               && REGNO (basereg) != REGNO (offsetreg));
23677                   if (REGNO (basereg) == 0)
23678                     {
23679                       rtx tmp = offsetreg;
23680                       offsetreg = basereg;
23681                       basereg = tmp;
23682                     }
23683                   emit_insn (gen_add3_insn (basereg, basereg, offsetreg));
23684                   restore_basereg = gen_sub3_insn (basereg, basereg, offsetreg);
23685                   dst = replace_equiv_address (dst, basereg);
23686                 }
23687             }
23688           else if (GET_CODE (XEXP (dst, 0)) != LO_SUM)
23689             gcc_assert (rs6000_offsettable_memref_p (dst, reg_mode, true));
23690         }
23691
23692       for (i = 0; i < nregs; i++)
23693         {
23694           /* Calculate index to next subword.  */
23695           ++j;
23696           if (j == nregs)
23697             j = 0;
23698
23699           /* If compiler already emitted move of first word by
23700              store with update, no need to do anything.  */
23701           if (j == 0 && used_update)
23702             continue;
23703
23704           emit_insn (gen_rtx_SET (simplify_gen_subreg (reg_mode, dst, mode,
23705                                                        j * reg_mode_size),
23706                                   simplify_gen_subreg (reg_mode, src, mode,
23707                                                        j * reg_mode_size)));
23708         }
23709       if (restore_basereg != NULL_RTX)
23710         emit_insn (restore_basereg);
23711     }
23712 }
23713
23714 \f
23715 /* This page contains routines that are used to determine what the
23716    function prologue and epilogue code will do and write them out.  */
23717
23718 /* Determine whether the REG is really used.  */
23719
23720 static bool
23721 save_reg_p (int reg)
23722 {
23723   if (reg == RS6000_PIC_OFFSET_TABLE_REGNUM && !TARGET_SINGLE_PIC_BASE)
23724     {
23725       /* When calling eh_return, we must return true for all the cases
23726          where conditional_register_usage marks the PIC offset reg
23727          call used or fixed.  */
23728       if (crtl->calls_eh_return
23729           && ((DEFAULT_ABI == ABI_V4 && flag_pic)
23730               || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
23731               || (TARGET_TOC && TARGET_MINIMAL_TOC)))
23732         return true;
23733
23734       /* We need to mark the PIC offset register live for the same
23735          conditions as it is set up in rs6000_emit_prologue, or
23736          otherwise it won't be saved before we clobber it.  */
23737       if (TARGET_TOC && TARGET_MINIMAL_TOC
23738           && !constant_pool_empty_p ())
23739         return true;
23740
23741       if (DEFAULT_ABI == ABI_V4
23742           && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
23743           && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
23744         return true;
23745
23746       if (DEFAULT_ABI == ABI_DARWIN
23747           && flag_pic && crtl->uses_pic_offset_table)
23748         return true;
23749     }
23750
23751   return !call_used_regs[reg] && df_regs_ever_live_p (reg);
23752 }
23753
23754 /* Return the first fixed-point register that is required to be
23755    saved. 32 if none.  */
23756
23757 int
23758 first_reg_to_save (void)
23759 {
23760   int first_reg;
23761
23762   /* Find lowest numbered live register.  */
23763   for (first_reg = 13; first_reg <= 31; first_reg++)
23764     if (save_reg_p (first_reg))
23765       break;
23766
23767   return first_reg;
23768 }
23769
23770 /* Similar, for FP regs.  */
23771
23772 int
23773 first_fp_reg_to_save (void)
23774 {
23775   int first_reg;
23776
23777   /* Find lowest numbered live register.  */
23778   for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
23779     if (save_reg_p (first_reg))
23780       break;
23781
23782   return first_reg;
23783 }
23784
23785 /* Similar, for AltiVec regs.  */
23786
23787 static int
23788 first_altivec_reg_to_save (void)
23789 {
23790   int i;
23791
23792   /* Stack frame remains as is unless we are in AltiVec ABI.  */
23793   if (! TARGET_ALTIVEC_ABI)
23794     return LAST_ALTIVEC_REGNO + 1;
23795
23796   /* On Darwin, the unwind routines are compiled without
23797      TARGET_ALTIVEC, and use save_world to save/restore the
23798      altivec registers when necessary.  */
23799   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
23800       && ! TARGET_ALTIVEC)
23801     return FIRST_ALTIVEC_REGNO + 20;
23802
23803   /* Find lowest numbered live register.  */
23804   for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
23805     if (save_reg_p (i))
23806       break;
23807
23808   return i;
23809 }
23810
23811 /* Return a 32-bit mask of the AltiVec registers we need to set in
23812    VRSAVE.  Bit n of the return value is 1 if Vn is live.  The MSB in
23813    the 32-bit word is 0.  */
23814
23815 static unsigned int
23816 compute_vrsave_mask (void)
23817 {
23818   unsigned int i, mask = 0;
23819
23820   /* On Darwin, the unwind routines are compiled without
23821      TARGET_ALTIVEC, and use save_world to save/restore the
23822      call-saved altivec registers when necessary.  */
23823   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
23824       && ! TARGET_ALTIVEC)
23825     mask |= 0xFFF;
23826
23827   /* First, find out if we use _any_ altivec registers.  */
23828   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
23829     if (df_regs_ever_live_p (i))
23830       mask |= ALTIVEC_REG_BIT (i);
23831
23832   if (mask == 0)
23833     return mask;
23834
23835   /* Next, remove the argument registers from the set.  These must
23836      be in the VRSAVE mask set by the caller, so we don't need to add
23837      them in again.  More importantly, the mask we compute here is
23838      used to generate CLOBBERs in the set_vrsave insn, and we do not
23839      wish the argument registers to die.  */
23840   for (i = ALTIVEC_ARG_MIN_REG; i < (unsigned) crtl->args.info.vregno; i++)
23841     mask &= ~ALTIVEC_REG_BIT (i);
23842
23843   /* Similarly, remove the return value from the set.  */
23844   {
23845     bool yes = false;
23846     diddle_return_value (is_altivec_return_reg, &yes);
23847     if (yes)
23848       mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
23849   }
23850
23851   return mask;
23852 }
23853
23854 /* For a very restricted set of circumstances, we can cut down the
23855    size of prologues/epilogues by calling our own save/restore-the-world
23856    routines.  */
23857
23858 static void
23859 compute_save_world_info (rs6000_stack_t *info)
23860 {
23861   info->world_save_p = 1;
23862   info->world_save_p
23863     = (WORLD_SAVE_P (info)
23864        && DEFAULT_ABI == ABI_DARWIN
23865        && !cfun->has_nonlocal_label
23866        && info->first_fp_reg_save == FIRST_SAVED_FP_REGNO
23867        && info->first_gp_reg_save == FIRST_SAVED_GP_REGNO
23868        && info->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
23869        && info->cr_save_p);
23870
23871   /* This will not work in conjunction with sibcalls.  Make sure there
23872      are none.  (This check is expensive, but seldom executed.) */
23873   if (WORLD_SAVE_P (info))
23874     {
23875       rtx_insn *insn;
23876       for (insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
23877         if (CALL_P (insn) && SIBLING_CALL_P (insn))
23878           {
23879             info->world_save_p = 0;
23880             break;
23881           }
23882     }
23883
23884   if (WORLD_SAVE_P (info))
23885     {
23886       /* Even if we're not touching VRsave, make sure there's room on the
23887          stack for it, if it looks like we're calling SAVE_WORLD, which
23888          will attempt to save it. */
23889       info->vrsave_size  = 4;
23890
23891       /* If we are going to save the world, we need to save the link register too.  */
23892       info->lr_save_p = 1;
23893
23894       /* "Save" the VRsave register too if we're saving the world.  */
23895       if (info->vrsave_mask == 0)
23896         info->vrsave_mask = compute_vrsave_mask ();
23897
23898       /* Because the Darwin register save/restore routines only handle
23899          F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
23900          check.  */
23901       gcc_assert (info->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
23902                   && (info->first_altivec_reg_save
23903                       >= FIRST_SAVED_ALTIVEC_REGNO));
23904     }
23905
23906   return;
23907 }
23908
23909
23910 static void
23911 is_altivec_return_reg (rtx reg, void *xyes)
23912 {
23913   bool *yes = (bool *) xyes;
23914   if (REGNO (reg) == ALTIVEC_ARG_RETURN)
23915     *yes = true;
23916 }
23917
23918 \f
23919 /* Return whether REG is a global user reg or has been specifed by
23920    -ffixed-REG.  We should not restore these, and so cannot use
23921    lmw or out-of-line restore functions if there are any.  We also
23922    can't save them (well, emit frame notes for them), because frame
23923    unwinding during exception handling will restore saved registers.  */
23924
23925 static bool
23926 fixed_reg_p (int reg)
23927 {
23928   /* Ignore fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] when the
23929      backend sets it, overriding anything the user might have given.  */
23930   if (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
23931       && ((DEFAULT_ABI == ABI_V4 && flag_pic)
23932           || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
23933           || (TARGET_TOC && TARGET_MINIMAL_TOC)))
23934     return false;
23935
23936   return fixed_regs[reg];
23937 }
23938
23939 /* Determine the strategy for savings/restoring registers.  */
23940
23941 enum {
23942   SAVE_MULTIPLE = 0x1,
23943   SAVE_INLINE_GPRS = 0x2,
23944   SAVE_INLINE_FPRS = 0x4,
23945   SAVE_NOINLINE_GPRS_SAVES_LR = 0x8,
23946   SAVE_NOINLINE_FPRS_SAVES_LR = 0x10,
23947   SAVE_INLINE_VRS = 0x20,
23948   REST_MULTIPLE = 0x100,
23949   REST_INLINE_GPRS = 0x200,
23950   REST_INLINE_FPRS = 0x400,
23951   REST_NOINLINE_FPRS_DOESNT_RESTORE_LR = 0x800,
23952   REST_INLINE_VRS = 0x1000
23953 };
23954
23955 static int
23956 rs6000_savres_strategy (rs6000_stack_t *info,
23957                         bool using_static_chain_p)
23958 {
23959   int strategy = 0;
23960
23961   /* Select between in-line and out-of-line save and restore of regs.
23962      First, all the obvious cases where we don't use out-of-line.  */
23963   if (crtl->calls_eh_return
23964       || cfun->machine->ra_need_lr)
23965     strategy |= (SAVE_INLINE_FPRS | REST_INLINE_FPRS
23966                  | SAVE_INLINE_GPRS | REST_INLINE_GPRS
23967                  | SAVE_INLINE_VRS | REST_INLINE_VRS);
23968
23969   if (info->first_gp_reg_save == 32)
23970     strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
23971
23972   if (info->first_fp_reg_save == 64)
23973     strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
23974
23975   if (info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1)
23976     strategy |= SAVE_INLINE_VRS | REST_INLINE_VRS;
23977
23978   /* Define cutoff for using out-of-line functions to save registers.  */
23979   if (DEFAULT_ABI == ABI_V4 || TARGET_ELF)
23980     {
23981       if (!optimize_size)
23982         {
23983           strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
23984           strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
23985           strategy |= SAVE_INLINE_VRS | REST_INLINE_VRS;
23986         }
23987       else
23988         {
23989           /* Prefer out-of-line restore if it will exit.  */
23990           if (info->first_fp_reg_save > 61)
23991             strategy |= SAVE_INLINE_FPRS;
23992           if (info->first_gp_reg_save > 29)
23993             {
23994               if (info->first_fp_reg_save == 64)
23995                 strategy |= SAVE_INLINE_GPRS;
23996               else
23997                 strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
23998             }
23999           if (info->first_altivec_reg_save == LAST_ALTIVEC_REGNO)
24000             strategy |= SAVE_INLINE_VRS | REST_INLINE_VRS;
24001         }
24002     }
24003   else if (DEFAULT_ABI == ABI_DARWIN)
24004     {
24005       if (info->first_fp_reg_save > 60)
24006         strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
24007       if (info->first_gp_reg_save > 29)
24008         strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
24009       strategy |= SAVE_INLINE_VRS | REST_INLINE_VRS;
24010     }
24011   else
24012     {
24013       gcc_checking_assert (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2);
24014       if ((flag_shrink_wrap_separate && optimize_function_for_speed_p (cfun))
24015           || info->first_fp_reg_save > 61)
24016         strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
24017       strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
24018       strategy |= SAVE_INLINE_VRS | REST_INLINE_VRS;
24019     }
24020
24021   /* Don't bother to try to save things out-of-line if r11 is occupied
24022      by the static chain.  It would require too much fiddling and the
24023      static chain is rarely used anyway.  FPRs are saved w.r.t the stack
24024      pointer on Darwin, and AIX uses r1 or r12.  */
24025   if (using_static_chain_p
24026       && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN))
24027     strategy |= ((DEFAULT_ABI == ABI_DARWIN ? 0 : SAVE_INLINE_FPRS)
24028                  | SAVE_INLINE_GPRS
24029                  | SAVE_INLINE_VRS);
24030
24031   /* Don't ever restore fixed regs.  That means we can't use the
24032      out-of-line register restore functions if a fixed reg is in the
24033      range of regs restored.   */
24034   if (!(strategy & REST_INLINE_FPRS))
24035     for (int i = info->first_fp_reg_save; i < 64; i++)
24036       if (fixed_regs[i])
24037         {
24038           strategy |= REST_INLINE_FPRS;
24039           break;
24040         }
24041
24042   /* We can only use the out-of-line routines to restore fprs if we've
24043      saved all the registers from first_fp_reg_save in the prologue.
24044      Otherwise, we risk loading garbage.  Of course, if we have saved
24045      out-of-line then we know we haven't skipped any fprs.  */
24046   if ((strategy & SAVE_INLINE_FPRS)
24047       && !(strategy & REST_INLINE_FPRS))
24048     for (int i = info->first_fp_reg_save; i < 64; i++)
24049       if (!save_reg_p (i))
24050         {
24051           strategy |= REST_INLINE_FPRS;
24052           break;
24053         }
24054
24055   /* Similarly, for altivec regs.  */
24056   if (!(strategy & REST_INLINE_VRS))
24057     for (int i = info->first_altivec_reg_save; i < LAST_ALTIVEC_REGNO + 1; i++)
24058       if (fixed_regs[i])
24059         {
24060           strategy |= REST_INLINE_VRS;
24061           break;
24062         }
24063
24064   if ((strategy & SAVE_INLINE_VRS)
24065       && !(strategy & REST_INLINE_VRS))
24066     for (int i = info->first_altivec_reg_save; i < LAST_ALTIVEC_REGNO + 1; i++)
24067       if (!save_reg_p (i))
24068         {
24069           strategy |= REST_INLINE_VRS;
24070           break;
24071         }
24072
24073   /* info->lr_save_p isn't yet set if the only reason lr needs to be
24074      saved is an out-of-line save or restore.  Set up the value for
24075      the next test (excluding out-of-line gprs).  */
24076   bool lr_save_p = (info->lr_save_p
24077                     || !(strategy & SAVE_INLINE_FPRS)
24078                     || !(strategy & SAVE_INLINE_VRS)
24079                     || !(strategy & REST_INLINE_FPRS)
24080                     || !(strategy & REST_INLINE_VRS));
24081
24082   if (TARGET_MULTIPLE
24083       && !TARGET_POWERPC64
24084       && info->first_gp_reg_save < 31
24085       && !(flag_shrink_wrap
24086            && flag_shrink_wrap_separate
24087            && optimize_function_for_speed_p (cfun)))
24088     {
24089       int count = 0;
24090       for (int i = info->first_gp_reg_save; i < 32; i++)
24091         if (save_reg_p (i))
24092           count++;
24093
24094       if (count <= 1)
24095         /* Don't use store multiple if only one reg needs to be
24096            saved.  This can occur for example when the ABI_V4 pic reg
24097            (r30) needs to be saved to make calls, but r31 is not
24098            used.  */
24099         strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
24100       else
24101         {
24102           /* Prefer store multiple for saves over out-of-line
24103              routines, since the store-multiple instruction will
24104              always be smaller.  */
24105           strategy |= SAVE_INLINE_GPRS | SAVE_MULTIPLE;
24106
24107           /* The situation is more complicated with load multiple.
24108              We'd prefer to use the out-of-line routines for restores,
24109              since the "exit" out-of-line routines can handle the
24110              restore of LR and the frame teardown.  However if doesn't
24111              make sense to use the out-of-line routine if that is the
24112              only reason we'd need to save LR, and we can't use the
24113              "exit" out-of-line gpr restore if we have saved some
24114              fprs; In those cases it is advantageous to use load
24115              multiple when available.  */
24116           if (info->first_fp_reg_save != 64 || !lr_save_p)
24117             strategy |= REST_INLINE_GPRS | REST_MULTIPLE;
24118         }
24119     }
24120
24121   /* Using the "exit" out-of-line routine does not improve code size
24122      if using it would require lr to be saved and if only saving one
24123      or two gprs.  */
24124   else if (!lr_save_p && info->first_gp_reg_save > 29)
24125     strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
24126
24127   /* Don't ever restore fixed regs.  */
24128   if ((strategy & (REST_INLINE_GPRS | REST_MULTIPLE)) != REST_INLINE_GPRS)
24129     for (int i = info->first_gp_reg_save; i < 32; i++)
24130       if (fixed_reg_p (i))
24131         {
24132           strategy |= REST_INLINE_GPRS;
24133           strategy &= ~REST_MULTIPLE;
24134           break;
24135         }
24136
24137   /* We can only use load multiple or the out-of-line routines to
24138      restore gprs if we've saved all the registers from
24139      first_gp_reg_save.  Otherwise, we risk loading garbage.
24140      Of course, if we have saved out-of-line or used stmw then we know
24141      we haven't skipped any gprs.  */
24142   if ((strategy & (SAVE_INLINE_GPRS | SAVE_MULTIPLE)) == SAVE_INLINE_GPRS
24143       && (strategy & (REST_INLINE_GPRS | REST_MULTIPLE)) != REST_INLINE_GPRS)
24144     for (int i = info->first_gp_reg_save; i < 32; i++)
24145       if (!save_reg_p (i))
24146         {
24147           strategy |= REST_INLINE_GPRS;
24148           strategy &= ~REST_MULTIPLE;
24149           break;
24150         }
24151
24152   if (TARGET_ELF && TARGET_64BIT)
24153     {
24154       if (!(strategy & SAVE_INLINE_FPRS))
24155         strategy |= SAVE_NOINLINE_FPRS_SAVES_LR;
24156       else if (!(strategy & SAVE_INLINE_GPRS)
24157                && info->first_fp_reg_save == 64)
24158         strategy |= SAVE_NOINLINE_GPRS_SAVES_LR;
24159     }
24160   else if (TARGET_AIX && !(strategy & REST_INLINE_FPRS))
24161     strategy |= REST_NOINLINE_FPRS_DOESNT_RESTORE_LR;
24162
24163   if (TARGET_MACHO && !(strategy & SAVE_INLINE_FPRS))
24164     strategy |= SAVE_NOINLINE_FPRS_SAVES_LR;
24165
24166   return strategy;
24167 }
24168
24169 /* Calculate the stack information for the current function.  This is
24170    complicated by having two separate calling sequences, the AIX calling
24171    sequence and the V.4 calling sequence.
24172
24173    AIX (and Darwin/Mac OS X) stack frames look like:
24174                                                           32-bit  64-bit
24175         SP----> +---------------------------------------+
24176                 | back chain to caller                  | 0       0
24177                 +---------------------------------------+
24178                 | saved CR                              | 4       8 (8-11)
24179                 +---------------------------------------+
24180                 | saved LR                              | 8       16
24181                 +---------------------------------------+
24182                 | reserved for compilers                | 12      24
24183                 +---------------------------------------+
24184                 | reserved for binders                  | 16      32
24185                 +---------------------------------------+
24186                 | saved TOC pointer                     | 20      40
24187                 +---------------------------------------+
24188                 | Parameter save area (+padding*) (P)   | 24      48
24189                 +---------------------------------------+
24190                 | Alloca space (A)                      | 24+P    etc.
24191                 +---------------------------------------+
24192                 | Local variable space (L)              | 24+P+A
24193                 +---------------------------------------+
24194                 | Float/int conversion temporary (X)    | 24+P+A+L
24195                 +---------------------------------------+
24196                 | Save area for AltiVec registers (W)   | 24+P+A+L+X
24197                 +---------------------------------------+
24198                 | AltiVec alignment padding (Y)         | 24+P+A+L+X+W
24199                 +---------------------------------------+
24200                 | Save area for VRSAVE register (Z)     | 24+P+A+L+X+W+Y
24201                 +---------------------------------------+
24202                 | Save area for GP registers (G)        | 24+P+A+X+L+X+W+Y+Z
24203                 +---------------------------------------+
24204                 | Save area for FP registers (F)        | 24+P+A+X+L+X+W+Y+Z+G
24205                 +---------------------------------------+
24206         old SP->| back chain to caller's caller         |
24207                 +---------------------------------------+
24208
24209      * If the alloca area is present, the parameter save area is
24210        padded so that the former starts 16-byte aligned.
24211
24212    The required alignment for AIX configurations is two words (i.e., 8
24213    or 16 bytes).
24214
24215    The ELFv2 ABI is a variant of the AIX ABI.  Stack frames look like:
24216
24217         SP----> +---------------------------------------+
24218                 | Back chain to caller                  |  0
24219                 +---------------------------------------+
24220                 | Save area for CR                      |  8
24221                 +---------------------------------------+
24222                 | Saved LR                              |  16
24223                 +---------------------------------------+
24224                 | Saved TOC pointer                     |  24
24225                 +---------------------------------------+
24226                 | Parameter save area (+padding*) (P)   |  32
24227                 +---------------------------------------+
24228                 | Alloca space (A)                      |  32+P
24229                 +---------------------------------------+
24230                 | Local variable space (L)              |  32+P+A
24231                 +---------------------------------------+
24232                 | Save area for AltiVec registers (W)   |  32+P+A+L
24233                 +---------------------------------------+
24234                 | AltiVec alignment padding (Y)         |  32+P+A+L+W
24235                 +---------------------------------------+
24236                 | Save area for GP registers (G)        |  32+P+A+L+W+Y
24237                 +---------------------------------------+
24238                 | Save area for FP registers (F)        |  32+P+A+L+W+Y+G
24239                 +---------------------------------------+
24240         old SP->| back chain to caller's caller         |  32+P+A+L+W+Y+G+F
24241                 +---------------------------------------+
24242
24243      * If the alloca area is present, the parameter save area is
24244        padded so that the former starts 16-byte aligned.
24245
24246    V.4 stack frames look like:
24247
24248         SP----> +---------------------------------------+
24249                 | back chain to caller                  | 0
24250                 +---------------------------------------+
24251                 | caller's saved LR                     | 4
24252                 +---------------------------------------+
24253                 | Parameter save area (+padding*) (P)   | 8
24254                 +---------------------------------------+
24255                 | Alloca space (A)                      | 8+P
24256                 +---------------------------------------+
24257                 | Varargs save area (V)                 | 8+P+A
24258                 +---------------------------------------+
24259                 | Local variable space (L)              | 8+P+A+V
24260                 +---------------------------------------+
24261                 | Float/int conversion temporary (X)    | 8+P+A+V+L
24262                 +---------------------------------------+
24263                 | Save area for AltiVec registers (W)   | 8+P+A+V+L+X
24264                 +---------------------------------------+
24265                 | AltiVec alignment padding (Y)         | 8+P+A+V+L+X+W
24266                 +---------------------------------------+
24267                 | Save area for VRSAVE register (Z)     | 8+P+A+V+L+X+W+Y
24268                 +---------------------------------------+
24269                 | saved CR (C)                          | 8+P+A+V+L+X+W+Y+Z
24270                 +---------------------------------------+
24271                 | Save area for GP registers (G)        | 8+P+A+V+L+X+W+Y+Z+C
24272                 +---------------------------------------+
24273                 | Save area for FP registers (F)        | 8+P+A+V+L+X+W+Y+Z+C+G
24274                 +---------------------------------------+
24275         old SP->| back chain to caller's caller         |
24276                 +---------------------------------------+
24277
24278      * If the alloca area is present and the required alignment is
24279        16 bytes, the parameter save area is padded so that the
24280        alloca area starts 16-byte aligned.
24281
24282    The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
24283    given.  (But note below and in sysv4.h that we require only 8 and
24284    may round up the size of our stack frame anyways.  The historical
24285    reason is early versions of powerpc-linux which didn't properly
24286    align the stack at program startup.  A happy side-effect is that
24287    -mno-eabi libraries can be used with -meabi programs.)
24288
24289    The EABI configuration defaults to the V.4 layout.  However,
24290    the stack alignment requirements may differ.  If -mno-eabi is not
24291    given, the required stack alignment is 8 bytes; if -mno-eabi is
24292    given, the required alignment is 16 bytes.  (But see V.4 comment
24293    above.)  */
24294
24295 #ifndef ABI_STACK_BOUNDARY
24296 #define ABI_STACK_BOUNDARY STACK_BOUNDARY
24297 #endif
24298
24299 static rs6000_stack_t *
24300 rs6000_stack_info (void)
24301 {
24302   /* We should never be called for thunks, we are not set up for that.  */
24303   gcc_assert (!cfun->is_thunk);
24304
24305   rs6000_stack_t *info = &stack_info;
24306   int reg_size = TARGET_32BIT ? 4 : 8;
24307   int ehrd_size;
24308   int ehcr_size;
24309   int save_align;
24310   int first_gp;
24311   HOST_WIDE_INT non_fixed_size;
24312   bool using_static_chain_p;
24313
24314   if (reload_completed && info->reload_completed)
24315     return info;
24316
24317   memset (info, 0, sizeof (*info));
24318   info->reload_completed = reload_completed;
24319
24320   /* Select which calling sequence.  */
24321   info->abi = DEFAULT_ABI;
24322
24323   /* Calculate which registers need to be saved & save area size.  */
24324   info->first_gp_reg_save = first_reg_to_save ();
24325   /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
24326      even if it currently looks like we won't.  Reload may need it to
24327      get at a constant; if so, it will have already created a constant
24328      pool entry for it.  */
24329   if (((TARGET_TOC && TARGET_MINIMAL_TOC)
24330        || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
24331        || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
24332       && crtl->uses_const_pool
24333       && info->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
24334     first_gp = RS6000_PIC_OFFSET_TABLE_REGNUM;
24335   else
24336     first_gp = info->first_gp_reg_save;
24337
24338   info->gp_size = reg_size * (32 - first_gp);
24339
24340   info->first_fp_reg_save = first_fp_reg_to_save ();
24341   info->fp_size = 8 * (64 - info->first_fp_reg_save);
24342
24343   info->first_altivec_reg_save = first_altivec_reg_to_save ();
24344   info->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
24345                                  - info->first_altivec_reg_save);
24346
24347   /* Does this function call anything?  */
24348   info->calls_p = (!crtl->is_leaf || cfun->machine->ra_needs_full_frame);
24349
24350   /* Determine if we need to save the condition code registers.  */
24351   if (save_reg_p (CR2_REGNO)
24352       || save_reg_p (CR3_REGNO)
24353       || save_reg_p (CR4_REGNO))
24354     {
24355       info->cr_save_p = 1;
24356       if (DEFAULT_ABI == ABI_V4)
24357         info->cr_size = reg_size;
24358     }
24359
24360   /* If the current function calls __builtin_eh_return, then we need
24361      to allocate stack space for registers that will hold data for
24362      the exception handler.  */
24363   if (crtl->calls_eh_return)
24364     {
24365       unsigned int i;
24366       for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
24367         continue;
24368
24369       ehrd_size = i * UNITS_PER_WORD;
24370     }
24371   else
24372     ehrd_size = 0;
24373
24374   /* In the ELFv2 ABI, we also need to allocate space for separate
24375      CR field save areas if the function calls __builtin_eh_return.  */
24376   if (DEFAULT_ABI == ABI_ELFv2 && crtl->calls_eh_return)
24377     {
24378       /* This hard-codes that we have three call-saved CR fields.  */
24379       ehcr_size = 3 * reg_size;
24380       /* We do *not* use the regular CR save mechanism.  */
24381       info->cr_save_p = 0;
24382     }
24383   else
24384     ehcr_size = 0;
24385
24386   /* Determine various sizes.  */
24387   info->reg_size     = reg_size;
24388   info->fixed_size   = RS6000_SAVE_AREA;
24389   info->vars_size    = RS6000_ALIGN (get_frame_size (), 8);
24390   if (cfun->calls_alloca)
24391     info->parm_size  =
24392       RS6000_ALIGN (crtl->outgoing_args_size + info->fixed_size,
24393                     STACK_BOUNDARY / BITS_PER_UNIT) - info->fixed_size;
24394   else
24395     info->parm_size  = RS6000_ALIGN (crtl->outgoing_args_size,
24396                                      TARGET_ALTIVEC ? 16 : 8);
24397   if (FRAME_GROWS_DOWNWARD)
24398     info->vars_size
24399       += RS6000_ALIGN (info->fixed_size + info->vars_size + info->parm_size,
24400                        ABI_STACK_BOUNDARY / BITS_PER_UNIT)
24401          - (info->fixed_size + info->vars_size + info->parm_size);
24402
24403   if (TARGET_ALTIVEC_ABI)
24404     info->vrsave_mask = compute_vrsave_mask ();
24405
24406   if (TARGET_ALTIVEC_VRSAVE && info->vrsave_mask)
24407     info->vrsave_size = 4;
24408
24409   compute_save_world_info (info);
24410
24411   /* Calculate the offsets.  */
24412   switch (DEFAULT_ABI)
24413     {
24414     case ABI_NONE:
24415     default:
24416       gcc_unreachable ();
24417
24418     case ABI_AIX:
24419     case ABI_ELFv2:
24420     case ABI_DARWIN:
24421       info->fp_save_offset = -info->fp_size;
24422       info->gp_save_offset = info->fp_save_offset - info->gp_size;
24423
24424       if (TARGET_ALTIVEC_ABI)
24425         {
24426           info->vrsave_save_offset = info->gp_save_offset - info->vrsave_size;
24427
24428           /* Align stack so vector save area is on a quadword boundary.
24429              The padding goes above the vectors.  */
24430           if (info->altivec_size != 0)
24431             info->altivec_padding_size = info->vrsave_save_offset & 0xF;
24432
24433           info->altivec_save_offset = info->vrsave_save_offset
24434                                       - info->altivec_padding_size
24435                                       - info->altivec_size;
24436           gcc_assert (info->altivec_size == 0
24437                       || info->altivec_save_offset % 16 == 0);
24438
24439           /* Adjust for AltiVec case.  */
24440           info->ehrd_offset = info->altivec_save_offset - ehrd_size;
24441         }
24442       else
24443         info->ehrd_offset = info->gp_save_offset - ehrd_size;
24444
24445       info->ehcr_offset = info->ehrd_offset - ehcr_size;
24446       info->cr_save_offset = reg_size; /* first word when 64-bit.  */
24447       info->lr_save_offset = 2*reg_size;
24448       break;
24449
24450     case ABI_V4:
24451       info->fp_save_offset = -info->fp_size;
24452       info->gp_save_offset = info->fp_save_offset - info->gp_size;
24453       info->cr_save_offset = info->gp_save_offset - info->cr_size;
24454
24455       if (TARGET_ALTIVEC_ABI)
24456         {
24457           info->vrsave_save_offset = info->cr_save_offset - info->vrsave_size;
24458
24459           /* Align stack so vector save area is on a quadword boundary.  */
24460           if (info->altivec_size != 0)
24461             info->altivec_padding_size = 16 - (-info->vrsave_save_offset % 16);
24462
24463           info->altivec_save_offset = info->vrsave_save_offset
24464                                       - info->altivec_padding_size
24465                                       - info->altivec_size;
24466
24467           /* Adjust for AltiVec case.  */
24468           info->ehrd_offset = info->altivec_save_offset;
24469         }
24470       else
24471         info->ehrd_offset = info->cr_save_offset;
24472
24473       info->ehrd_offset -= ehrd_size;
24474       info->lr_save_offset = reg_size;
24475     }
24476
24477   save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
24478   info->save_size = RS6000_ALIGN (info->fp_size
24479                                   + info->gp_size
24480                                   + info->altivec_size
24481                                   + info->altivec_padding_size
24482                                   + ehrd_size
24483                                   + ehcr_size
24484                                   + info->cr_size
24485                                   + info->vrsave_size,
24486                                   save_align);
24487
24488   non_fixed_size = info->vars_size + info->parm_size + info->save_size;
24489
24490   info->total_size = RS6000_ALIGN (non_fixed_size + info->fixed_size,
24491                                    ABI_STACK_BOUNDARY / BITS_PER_UNIT);
24492
24493   /* Determine if we need to save the link register.  */
24494   if (info->calls_p
24495       || ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
24496           && crtl->profile
24497           && !TARGET_PROFILE_KERNEL)
24498       || (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca)
24499 #ifdef TARGET_RELOCATABLE
24500       || (DEFAULT_ABI == ABI_V4
24501           && (TARGET_RELOCATABLE || flag_pic > 1)
24502           && !constant_pool_empty_p ())
24503 #endif
24504       || rs6000_ra_ever_killed ())
24505     info->lr_save_p = 1;
24506
24507   using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
24508                           && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
24509                           && call_used_regs[STATIC_CHAIN_REGNUM]);
24510   info->savres_strategy = rs6000_savres_strategy (info, using_static_chain_p);
24511
24512   if (!(info->savres_strategy & SAVE_INLINE_GPRS)
24513       || !(info->savres_strategy & SAVE_INLINE_FPRS)
24514       || !(info->savres_strategy & SAVE_INLINE_VRS)
24515       || !(info->savres_strategy & REST_INLINE_GPRS)
24516       || !(info->savres_strategy & REST_INLINE_FPRS)
24517       || !(info->savres_strategy & REST_INLINE_VRS))
24518     info->lr_save_p = 1;
24519
24520   if (info->lr_save_p)
24521     df_set_regs_ever_live (LR_REGNO, true);
24522
24523   /* Determine if we need to allocate any stack frame:
24524
24525      For AIX we need to push the stack if a frame pointer is needed
24526      (because the stack might be dynamically adjusted), if we are
24527      debugging, if we make calls, or if the sum of fp_save, gp_save,
24528      and local variables are more than the space needed to save all
24529      non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
24530      + 18*8 = 288 (GPR13 reserved).
24531
24532      For V.4 we don't have the stack cushion that AIX uses, but assume
24533      that the debugger can handle stackless frames.  */
24534
24535   if (info->calls_p)
24536     info->push_p = 1;
24537
24538   else if (DEFAULT_ABI == ABI_V4)
24539     info->push_p = non_fixed_size != 0;
24540
24541   else if (frame_pointer_needed)
24542     info->push_p = 1;
24543
24544   else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
24545     info->push_p = 1;
24546
24547   else
24548     info->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
24549
24550   return info;
24551 }
24552
24553 static void
24554 debug_stack_info (rs6000_stack_t *info)
24555 {
24556   const char *abi_string;
24557
24558   if (! info)
24559     info = rs6000_stack_info ();
24560
24561   fprintf (stderr, "\nStack information for function %s:\n",
24562            ((current_function_decl && DECL_NAME (current_function_decl))
24563             ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
24564             : "<unknown>"));
24565
24566   switch (info->abi)
24567     {
24568     default:             abi_string = "Unknown";        break;
24569     case ABI_NONE:       abi_string = "NONE";           break;
24570     case ABI_AIX:        abi_string = "AIX";            break;
24571     case ABI_ELFv2:      abi_string = "ELFv2";          break;
24572     case ABI_DARWIN:     abi_string = "Darwin";         break;
24573     case ABI_V4:         abi_string = "V.4";            break;
24574     }
24575
24576   fprintf (stderr, "\tABI                 = %5s\n", abi_string);
24577
24578   if (TARGET_ALTIVEC_ABI)
24579     fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
24580
24581   if (info->first_gp_reg_save != 32)
24582     fprintf (stderr, "\tfirst_gp_reg_save   = %5d\n", info->first_gp_reg_save);
24583
24584   if (info->first_fp_reg_save != 64)
24585     fprintf (stderr, "\tfirst_fp_reg_save   = %5d\n", info->first_fp_reg_save);
24586
24587   if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
24588     fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
24589              info->first_altivec_reg_save);
24590
24591   if (info->lr_save_p)
24592     fprintf (stderr, "\tlr_save_p           = %5d\n", info->lr_save_p);
24593
24594   if (info->cr_save_p)
24595     fprintf (stderr, "\tcr_save_p           = %5d\n", info->cr_save_p);
24596
24597   if (info->vrsave_mask)
24598     fprintf (stderr, "\tvrsave_mask         = 0x%x\n", info->vrsave_mask);
24599
24600   if (info->push_p)
24601     fprintf (stderr, "\tpush_p              = %5d\n", info->push_p);
24602
24603   if (info->calls_p)
24604     fprintf (stderr, "\tcalls_p             = %5d\n", info->calls_p);
24605
24606   if (info->gp_size)
24607     fprintf (stderr, "\tgp_save_offset      = %5d\n", info->gp_save_offset);
24608
24609   if (info->fp_size)
24610     fprintf (stderr, "\tfp_save_offset      = %5d\n", info->fp_save_offset);
24611
24612   if (info->altivec_size)
24613     fprintf (stderr, "\taltivec_save_offset = %5d\n",
24614              info->altivec_save_offset);
24615
24616   if (info->vrsave_size)
24617     fprintf (stderr, "\tvrsave_save_offset  = %5d\n",
24618              info->vrsave_save_offset);
24619
24620   if (info->lr_save_p)
24621     fprintf (stderr, "\tlr_save_offset      = %5d\n", info->lr_save_offset);
24622
24623   if (info->cr_save_p)
24624     fprintf (stderr, "\tcr_save_offset      = %5d\n", info->cr_save_offset);
24625
24626   if (info->varargs_save_offset)
24627     fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
24628
24629   if (info->total_size)
24630     fprintf (stderr, "\ttotal_size          = " HOST_WIDE_INT_PRINT_DEC"\n",
24631              info->total_size);
24632
24633   if (info->vars_size)
24634     fprintf (stderr, "\tvars_size           = " HOST_WIDE_INT_PRINT_DEC"\n",
24635              info->vars_size);
24636
24637   if (info->parm_size)
24638     fprintf (stderr, "\tparm_size           = %5d\n", info->parm_size);
24639
24640   if (info->fixed_size)
24641     fprintf (stderr, "\tfixed_size          = %5d\n", info->fixed_size);
24642
24643   if (info->gp_size)
24644     fprintf (stderr, "\tgp_size             = %5d\n", info->gp_size);
24645
24646   if (info->fp_size)
24647     fprintf (stderr, "\tfp_size             = %5d\n", info->fp_size);
24648
24649   if (info->altivec_size)
24650     fprintf (stderr, "\taltivec_size        = %5d\n", info->altivec_size);
24651
24652   if (info->vrsave_size)
24653     fprintf (stderr, "\tvrsave_size         = %5d\n", info->vrsave_size);
24654
24655   if (info->altivec_padding_size)
24656     fprintf (stderr, "\taltivec_padding_size= %5d\n",
24657              info->altivec_padding_size);
24658
24659   if (info->cr_size)
24660     fprintf (stderr, "\tcr_size             = %5d\n", info->cr_size);
24661
24662   if (info->save_size)
24663     fprintf (stderr, "\tsave_size           = %5d\n", info->save_size);
24664
24665   if (info->reg_size != 4)
24666     fprintf (stderr, "\treg_size            = %5d\n", info->reg_size);
24667
24668     fprintf (stderr, "\tsave-strategy       =  %04x\n", info->savres_strategy);
24669
24670   if (info->abi == ABI_DARWIN)
24671     fprintf (stderr, "\tWORLD_SAVE_P        = %5d\n", WORLD_SAVE_P(info));
24672
24673   fprintf (stderr, "\n");
24674 }
24675
24676 rtx
24677 rs6000_return_addr (int count, rtx frame)
24678 {
24679   /* We can't use get_hard_reg_initial_val for LR when count == 0 if LR
24680      is trashed by the prologue, as it is for PIC on ABI_V4 and Darwin.  */
24681   if (count != 0
24682       || ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN) && flag_pic))
24683     {
24684       cfun->machine->ra_needs_full_frame = 1;
24685
24686       if (count == 0)
24687         /* FRAME is set to frame_pointer_rtx by the generic code, but that
24688            is good for loading 0(r1) only when !FRAME_GROWS_DOWNWARD.  */
24689         frame = stack_pointer_rtx;
24690       rtx prev_frame_addr = memory_address (Pmode, frame);
24691       rtx prev_frame = copy_to_reg (gen_rtx_MEM (Pmode, prev_frame_addr));
24692       rtx lr_save_off = plus_constant (Pmode,
24693                                        prev_frame, RETURN_ADDRESS_OFFSET);
24694       rtx lr_save_addr = memory_address (Pmode, lr_save_off);
24695       return gen_rtx_MEM (Pmode, lr_save_addr);
24696     }
24697
24698   cfun->machine->ra_need_lr = 1;
24699   return get_hard_reg_initial_val (Pmode, LR_REGNO);
24700 }
24701
24702 /* Say whether a function is a candidate for sibcall handling or not.  */
24703
24704 static bool
24705 rs6000_function_ok_for_sibcall (tree decl, tree exp)
24706 {
24707   tree fntype;
24708
24709   /* The sibcall epilogue may clobber the static chain register.
24710      ??? We could work harder and avoid that, but it's probably
24711      not worth the hassle in practice.  */
24712   if (CALL_EXPR_STATIC_CHAIN (exp))
24713     return false;
24714
24715   if (decl)
24716     fntype = TREE_TYPE (decl);
24717   else
24718     fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (exp)));
24719
24720   /* We can't do it if the called function has more vector parameters
24721      than the current function; there's nowhere to put the VRsave code.  */
24722   if (TARGET_ALTIVEC_ABI
24723       && TARGET_ALTIVEC_VRSAVE
24724       && !(decl && decl == current_function_decl))
24725     {
24726       function_args_iterator args_iter;
24727       tree type;
24728       int nvreg = 0;
24729
24730       /* Functions with vector parameters are required to have a
24731          prototype, so the argument type info must be available
24732          here.  */
24733       FOREACH_FUNCTION_ARGS(fntype, type, args_iter)
24734         if (TREE_CODE (type) == VECTOR_TYPE
24735             && ALTIVEC_OR_VSX_VECTOR_MODE (TYPE_MODE (type)))
24736           nvreg++;
24737
24738       FOREACH_FUNCTION_ARGS(TREE_TYPE (current_function_decl), type, args_iter)
24739         if (TREE_CODE (type) == VECTOR_TYPE
24740             && ALTIVEC_OR_VSX_VECTOR_MODE (TYPE_MODE (type)))
24741           nvreg--;
24742
24743       if (nvreg > 0)
24744         return false;
24745     }
24746
24747   /* Under the AIX or ELFv2 ABIs we can't allow calls to non-local
24748      functions, because the callee may have a different TOC pointer to
24749      the caller and there's no way to ensure we restore the TOC when
24750      we return.  With the secure-plt SYSV ABI we can't make non-local
24751      calls when -fpic/PIC because the plt call stubs use r30.  */
24752   if (DEFAULT_ABI == ABI_DARWIN
24753       || ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
24754           && decl
24755           && !DECL_EXTERNAL (decl)
24756           && !DECL_WEAK (decl)
24757           && (*targetm.binds_local_p) (decl))
24758       || (DEFAULT_ABI == ABI_V4
24759           && (!TARGET_SECURE_PLT
24760               || !flag_pic
24761               || (decl
24762                   && (*targetm.binds_local_p) (decl)))))
24763     {
24764       tree attr_list = TYPE_ATTRIBUTES (fntype);
24765
24766       if (!lookup_attribute ("longcall", attr_list)
24767           || lookup_attribute ("shortcall", attr_list))
24768         return true;
24769     }
24770
24771   return false;
24772 }
24773
24774 static int
24775 rs6000_ra_ever_killed (void)
24776 {
24777   rtx_insn *top;
24778   rtx reg;
24779   rtx_insn *insn;
24780
24781   if (cfun->is_thunk)
24782     return 0;
24783
24784   if (cfun->machine->lr_save_state)
24785     return cfun->machine->lr_save_state - 1;
24786
24787   /* regs_ever_live has LR marked as used if any sibcalls are present,
24788      but this should not force saving and restoring in the
24789      pro/epilogue.  Likewise, reg_set_between_p thinks a sibcall
24790      clobbers LR, so that is inappropriate.  */
24791
24792   /* Also, the prologue can generate a store into LR that
24793      doesn't really count, like this:
24794
24795         move LR->R0
24796         bcl to set PIC register
24797         move LR->R31
24798         move R0->LR
24799
24800      When we're called from the epilogue, we need to avoid counting
24801      this as a store.  */
24802
24803   push_topmost_sequence ();
24804   top = get_insns ();
24805   pop_topmost_sequence ();
24806   reg = gen_rtx_REG (Pmode, LR_REGNO);
24807
24808   for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
24809     {
24810       if (INSN_P (insn))
24811         {
24812           if (CALL_P (insn))
24813             {
24814               if (!SIBLING_CALL_P (insn))
24815                 return 1;
24816             }
24817           else if (find_regno_note (insn, REG_INC, LR_REGNO))
24818             return 1;
24819           else if (set_of (reg, insn) != NULL_RTX
24820                    && !prologue_epilogue_contains (insn))
24821             return 1;
24822         }
24823     }
24824   return 0;
24825 }
24826 \f
24827 /* Emit instructions needed to load the TOC register.
24828    This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
24829    a constant pool; or for SVR4 -fpic.  */
24830
24831 void
24832 rs6000_emit_load_toc_table (int fromprolog)
24833 {
24834   rtx dest;
24835   dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
24836
24837   if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI == ABI_V4 && flag_pic)
24838     {
24839       char buf[30];
24840       rtx lab, tmp1, tmp2, got;
24841
24842       lab = gen_label_rtx ();
24843       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (lab));
24844       lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
24845       if (flag_pic == 2)
24846         {
24847           got = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (toc_label_name));
24848           need_toc_init = 1;
24849         }
24850       else
24851         got = rs6000_got_sym ();
24852       tmp1 = tmp2 = dest;
24853       if (!fromprolog)
24854         {
24855           tmp1 = gen_reg_rtx (Pmode);
24856           tmp2 = gen_reg_rtx (Pmode);
24857         }
24858       emit_insn (gen_load_toc_v4_PIC_1 (lab));
24859       emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
24860       emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
24861       emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
24862     }
24863   else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
24864     {
24865       emit_insn (gen_load_toc_v4_pic_si ());
24866       emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
24867     }
24868   else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 2)
24869     {
24870       char buf[30];
24871       rtx temp0 = (fromprolog
24872                    ? gen_rtx_REG (Pmode, 0)
24873                    : gen_reg_rtx (Pmode));
24874
24875       if (fromprolog)
24876         {
24877           rtx symF, symL;
24878
24879           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
24880           symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
24881
24882           ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
24883           symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
24884
24885           emit_insn (gen_load_toc_v4_PIC_1 (symF));
24886           emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
24887           emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest, symL, symF));
24888         }
24889       else
24890         {
24891           rtx tocsym, lab;
24892
24893           tocsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (toc_label_name));
24894           need_toc_init = 1;
24895           lab = gen_label_rtx ();
24896           emit_insn (gen_load_toc_v4_PIC_1b (tocsym, lab));
24897           emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
24898           if (TARGET_LINK_STACK)
24899             emit_insn (gen_addsi3 (dest, dest, GEN_INT (4)));
24900           emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
24901         }
24902       emit_insn (gen_addsi3 (dest, temp0, dest));
24903     }
24904   else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
24905     {
24906       /* This is for AIX code running in non-PIC ELF32.  */
24907       rtx realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (toc_label_name));
24908
24909       need_toc_init = 1;
24910       emit_insn (gen_elf_high (dest, realsym));
24911       emit_insn (gen_elf_low (dest, dest, realsym));
24912     }
24913   else
24914     {
24915       gcc_assert (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2);
24916
24917       if (TARGET_32BIT)
24918         emit_insn (gen_load_toc_aix_si (dest));
24919       else
24920         emit_insn (gen_load_toc_aix_di (dest));
24921     }
24922 }
24923
24924 /* Emit instructions to restore the link register after determining where
24925    its value has been stored.  */
24926
24927 void
24928 rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
24929 {
24930   rs6000_stack_t *info = rs6000_stack_info ();
24931   rtx operands[2];
24932
24933   operands[0] = source;
24934   operands[1] = scratch;
24935
24936   if (info->lr_save_p)
24937     {
24938       rtx frame_rtx = stack_pointer_rtx;
24939       HOST_WIDE_INT sp_offset = 0;
24940       rtx tmp;
24941
24942       if (frame_pointer_needed
24943           || cfun->calls_alloca
24944           || info->total_size > 32767)
24945         {
24946           tmp = gen_frame_mem (Pmode, frame_rtx);
24947           emit_move_insn (operands[1], tmp);
24948           frame_rtx = operands[1];
24949         }
24950       else if (info->push_p)
24951         sp_offset = info->total_size;
24952
24953       tmp = plus_constant (Pmode, frame_rtx,
24954                            info->lr_save_offset + sp_offset);
24955       tmp = gen_frame_mem (Pmode, tmp);
24956       emit_move_insn (tmp, operands[0]);
24957     }
24958   else
24959     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO), operands[0]);
24960
24961   /* Freeze lr_save_p.  We've just emitted rtl that depends on the
24962      state of lr_save_p so any change from here on would be a bug.  In
24963      particular, stop rs6000_ra_ever_killed from considering the SET
24964      of lr we may have added just above.  */ 
24965   cfun->machine->lr_save_state = info->lr_save_p + 1;
24966 }
24967
24968 static GTY(()) alias_set_type set = -1;
24969
24970 alias_set_type
24971 get_TOC_alias_set (void)
24972 {
24973   if (set == -1)
24974     set = new_alias_set ();
24975   return set;
24976 }
24977
24978 /* This returns nonzero if the current function uses the TOC.  This is
24979    determined by the presence of (use (unspec ... UNSPEC_TOC)), which
24980    is generated by the ABI_V4 load_toc_* patterns.
24981    Return 2 instead of 1 if the load_toc_* pattern is in the function
24982    partition that doesn't start the function.  */
24983 #if TARGET_ELF
24984 static int
24985 uses_TOC (void)
24986 {
24987   rtx_insn *insn;
24988   int ret = 1;
24989
24990   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
24991     {
24992       if (INSN_P (insn))
24993         {
24994           rtx pat = PATTERN (insn);
24995           int i;
24996
24997           if (GET_CODE (pat) == PARALLEL)
24998             for (i = 0; i < XVECLEN (pat, 0); i++)
24999               {
25000                 rtx sub = XVECEXP (pat, 0, i);
25001                 if (GET_CODE (sub) == USE)
25002                   {
25003                     sub = XEXP (sub, 0);
25004                     if (GET_CODE (sub) == UNSPEC
25005                         && XINT (sub, 1) == UNSPEC_TOC)
25006                       return ret;
25007                   }
25008               }
25009         }
25010       else if (crtl->has_bb_partition
25011                && NOTE_P (insn)
25012                && NOTE_KIND (insn) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
25013         ret = 2;
25014     }
25015   return 0;
25016 }
25017 #endif
25018
25019 rtx
25020 create_TOC_reference (rtx symbol, rtx largetoc_reg)
25021 {
25022   rtx tocrel, tocreg, hi;
25023
25024   if (TARGET_DEBUG_ADDR)
25025     {
25026       if (SYMBOL_REF_P (symbol))
25027         fprintf (stderr, "\ncreate_TOC_reference, (symbol_ref %s)\n",
25028                  XSTR (symbol, 0));
25029       else
25030         {
25031           fprintf (stderr, "\ncreate_TOC_reference, code %s:\n",
25032                    GET_RTX_NAME (GET_CODE (symbol)));
25033           debug_rtx (symbol);
25034         }
25035     }
25036
25037   if (!can_create_pseudo_p ())
25038     df_set_regs_ever_live (TOC_REGISTER, true);
25039
25040   tocreg = gen_rtx_REG (Pmode, TOC_REGISTER);
25041   tocrel = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, symbol, tocreg), UNSPEC_TOCREL);
25042   if (TARGET_CMODEL == CMODEL_SMALL || can_create_pseudo_p ())
25043     return tocrel;
25044
25045   hi = gen_rtx_HIGH (Pmode, copy_rtx (tocrel));
25046   if (largetoc_reg != NULL)
25047     {
25048       emit_move_insn (largetoc_reg, hi);
25049       hi = largetoc_reg;
25050     }
25051   return gen_rtx_LO_SUM (Pmode, hi, tocrel);
25052 }
25053
25054 /* Issue assembly directives that create a reference to the given DWARF
25055    FRAME_TABLE_LABEL from the current function section.  */
25056 void
25057 rs6000_aix_asm_output_dwarf_table_ref (char * frame_table_label)
25058 {
25059   fprintf (asm_out_file, "\t.ref %s\n",
25060            (* targetm.strip_name_encoding) (frame_table_label));
25061 }
25062 \f
25063 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
25064    and the change to the stack pointer.  */
25065
25066 static void
25067 rs6000_emit_stack_tie (rtx fp, bool hard_frame_needed)
25068 {
25069   rtvec p;
25070   int i;
25071   rtx regs[3];
25072
25073   i = 0;
25074   regs[i++] = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
25075   if (hard_frame_needed)
25076     regs[i++] = gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM);
25077   if (!(REGNO (fp) == STACK_POINTER_REGNUM
25078         || (hard_frame_needed
25079             && REGNO (fp) == HARD_FRAME_POINTER_REGNUM)))
25080     regs[i++] = fp;
25081
25082   p = rtvec_alloc (i);
25083   while (--i >= 0)
25084     {
25085       rtx mem = gen_frame_mem (BLKmode, regs[i]);
25086       RTVEC_ELT (p, i) = gen_rtx_SET (mem, const0_rtx);
25087     }
25088
25089   emit_insn (gen_stack_tie (gen_rtx_PARALLEL (VOIDmode, p)));
25090 }
25091
25092 /* Allocate SIZE_INT bytes on the stack using a store with update style insn
25093    and set the appropriate attributes for the generated insn.  Return the
25094    first insn which adjusts the stack pointer or the last insn before
25095    the stack adjustment loop. 
25096
25097    SIZE_INT is used to create the CFI note for the allocation.
25098
25099    SIZE_RTX is an rtx containing the size of the adjustment.  Note that
25100    since stacks grow to lower addresses its runtime value is -SIZE_INT.
25101
25102    ORIG_SP contains the backchain value that must be stored at *sp.  */
25103
25104 static rtx_insn *
25105 rs6000_emit_allocate_stack_1 (HOST_WIDE_INT size_int, rtx orig_sp)
25106 {
25107   rtx_insn *insn;
25108
25109   rtx size_rtx = GEN_INT (-size_int);
25110   if (size_int > 32767)
25111     {
25112       rtx tmp_reg = gen_rtx_REG (Pmode, 0);
25113       /* Need a note here so that try_split doesn't get confused.  */
25114       if (get_last_insn () == NULL_RTX)
25115         emit_note (NOTE_INSN_DELETED);
25116       insn = emit_move_insn (tmp_reg, size_rtx);
25117       try_split (PATTERN (insn), insn, 0);
25118       size_rtx = tmp_reg;
25119     }
25120   
25121   if (TARGET_32BIT)
25122     insn = emit_insn (gen_movsi_update_stack (stack_pointer_rtx,
25123                                               stack_pointer_rtx,
25124                                               size_rtx,
25125                                               orig_sp));
25126   else
25127     insn = emit_insn (gen_movdi_update_stack (stack_pointer_rtx,
25128                                               stack_pointer_rtx,
25129                                               size_rtx,
25130                                               orig_sp));
25131   rtx par = PATTERN (insn);
25132   gcc_assert (GET_CODE (par) == PARALLEL);
25133   rtx set = XVECEXP (par, 0, 0);
25134   gcc_assert (GET_CODE (set) == SET);
25135   rtx mem = SET_DEST (set);
25136   gcc_assert (MEM_P (mem));
25137   MEM_NOTRAP_P (mem) = 1;
25138   set_mem_alias_set (mem, get_frame_alias_set ());
25139
25140   RTX_FRAME_RELATED_P (insn) = 1;
25141   add_reg_note (insn, REG_FRAME_RELATED_EXPR,
25142                 gen_rtx_SET (stack_pointer_rtx,
25143                              gen_rtx_PLUS (Pmode,
25144                                            stack_pointer_rtx,
25145                                            GEN_INT (-size_int))));
25146
25147   /* Emit a blockage to ensure the allocation/probing insns are
25148      not optimized, combined, removed, etc.  Add REG_STACK_CHECK
25149      note for similar reasons.  */
25150   if (flag_stack_clash_protection)
25151     {
25152       add_reg_note (insn, REG_STACK_CHECK, const0_rtx);
25153       emit_insn (gen_blockage ());
25154     }
25155
25156   return insn;
25157 }
25158
25159 static HOST_WIDE_INT
25160 get_stack_clash_protection_probe_interval (void)
25161 {
25162   return (HOST_WIDE_INT_1U
25163           << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL));
25164 }
25165
25166 static HOST_WIDE_INT
25167 get_stack_clash_protection_guard_size (void)
25168 {
25169   return (HOST_WIDE_INT_1U
25170           << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE));
25171 }
25172
25173 /* Allocate ORIG_SIZE bytes on the stack and probe the newly
25174    allocated space every STACK_CLASH_PROTECTION_PROBE_INTERVAL bytes.
25175
25176    COPY_REG, if non-null, should contain a copy of the original
25177    stack pointer at exit from this function.
25178
25179    This is subtly different than the Ada probing in that it tries hard to
25180    prevent attacks that jump the stack guard.  Thus it is never allowed to
25181    allocate more than STACK_CLASH_PROTECTION_PROBE_INTERVAL bytes of stack
25182    space without a suitable probe.  */
25183 static rtx_insn *
25184 rs6000_emit_probe_stack_range_stack_clash (HOST_WIDE_INT orig_size,
25185                                            rtx copy_reg)
25186 {
25187   rtx orig_sp = copy_reg;
25188
25189   HOST_WIDE_INT probe_interval = get_stack_clash_protection_probe_interval ();
25190
25191   /* Round the size down to a multiple of PROBE_INTERVAL.  */
25192   HOST_WIDE_INT rounded_size = ROUND_DOWN (orig_size, probe_interval);
25193
25194   /* If explicitly requested,
25195        or the rounded size is not the same as the original size
25196        or the the rounded size is greater than a page,
25197      then we will need a copy of the original stack pointer.  */
25198   if (rounded_size != orig_size
25199       || rounded_size > probe_interval
25200       || copy_reg)
25201     {
25202       /* If the caller did not request a copy of the incoming stack
25203          pointer, then we use r0 to hold the copy.  */
25204       if (!copy_reg)
25205         orig_sp = gen_rtx_REG (Pmode, 0);
25206       emit_move_insn (orig_sp, stack_pointer_rtx);
25207     }
25208
25209   /* There's three cases here.
25210
25211      One is a single probe which is the most common and most efficiently
25212      implemented as it does not have to have a copy of the original
25213      stack pointer if there are no residuals.
25214
25215      Second is unrolled allocation/probes which we use if there's just
25216      a few of them.  It needs to save the original stack pointer into a
25217      temporary for use as a source register in the allocation/probe.
25218
25219      Last is a loop.  This is the most uncommon case and least efficient.  */
25220   rtx_insn *retval = NULL;
25221   if (rounded_size == probe_interval)
25222     {
25223       retval = rs6000_emit_allocate_stack_1 (probe_interval, stack_pointer_rtx);
25224
25225       dump_stack_clash_frame_info (PROBE_INLINE, rounded_size != orig_size);
25226     }
25227   else if (rounded_size <= 8 * probe_interval)
25228     {
25229       /* The ABI requires using the store with update insns to allocate
25230          space and store the backchain into the stack
25231
25232          So we save the current stack pointer into a temporary, then
25233          emit the store-with-update insns to store the saved stack pointer
25234          into the right location in each new page.  */
25235       for (int i = 0; i < rounded_size; i += probe_interval)
25236         {
25237           rtx_insn *insn
25238             = rs6000_emit_allocate_stack_1 (probe_interval, orig_sp);
25239
25240           /* Save the first stack adjustment in RETVAL.  */
25241           if (i == 0)
25242             retval = insn;
25243         }
25244
25245       dump_stack_clash_frame_info (PROBE_INLINE, rounded_size != orig_size);
25246     }
25247   else
25248     {
25249       /* Compute the ending address.  */
25250       rtx end_addr
25251         = copy_reg ? gen_rtx_REG (Pmode, 0) : gen_rtx_REG (Pmode, 12);
25252       rtx rs = GEN_INT (-rounded_size);
25253       rtx_insn *insn;
25254       if (add_operand (rs, Pmode))
25255         insn = emit_insn (gen_add3_insn (end_addr, stack_pointer_rtx, rs));
25256       else
25257         {
25258           emit_move_insn (end_addr, GEN_INT (-rounded_size));
25259           insn = emit_insn (gen_add3_insn (end_addr, end_addr,
25260                                            stack_pointer_rtx));
25261           /* Describe the effect of INSN to the CFI engine.  */
25262           add_reg_note (insn, REG_FRAME_RELATED_EXPR,
25263                         gen_rtx_SET (end_addr,
25264                                      gen_rtx_PLUS (Pmode, stack_pointer_rtx,
25265                                                    rs)));
25266         }
25267       RTX_FRAME_RELATED_P (insn) = 1;
25268
25269       /* Emit the loop.  */
25270       if (TARGET_64BIT)
25271         retval = emit_insn (gen_probe_stack_rangedi (stack_pointer_rtx,
25272                                                      stack_pointer_rtx, orig_sp,
25273                                                      end_addr));
25274       else
25275         retval = emit_insn (gen_probe_stack_rangesi (stack_pointer_rtx,
25276                                                      stack_pointer_rtx, orig_sp,
25277                                                      end_addr));
25278       RTX_FRAME_RELATED_P (retval) = 1;
25279       /* Describe the effect of INSN to the CFI engine.  */
25280       add_reg_note (retval, REG_FRAME_RELATED_EXPR,
25281                     gen_rtx_SET (stack_pointer_rtx, end_addr));
25282
25283       /* Emit a blockage to ensure the allocation/probing insns are
25284          not optimized, combined, removed, etc.  Other cases handle this
25285          within their call to rs6000_emit_allocate_stack_1.  */
25286       emit_insn (gen_blockage ());
25287
25288       dump_stack_clash_frame_info (PROBE_LOOP, rounded_size != orig_size);
25289     }
25290
25291   if (orig_size != rounded_size)
25292     {
25293       /* Allocate (and implicitly probe) any residual space.   */
25294       HOST_WIDE_INT residual = orig_size - rounded_size;
25295
25296       rtx_insn *insn = rs6000_emit_allocate_stack_1 (residual, orig_sp);
25297
25298       /* If the residual was the only allocation, then we can return the
25299          allocating insn.  */
25300       if (!retval)
25301         retval = insn;
25302     }
25303
25304   return retval;
25305 }
25306
25307 /* Emit the correct code for allocating stack space, as insns.
25308    If COPY_REG, make sure a copy of the old frame is left there.
25309    The generated code may use hard register 0 as a temporary.  */
25310
25311 static rtx_insn *
25312 rs6000_emit_allocate_stack (HOST_WIDE_INT size, rtx copy_reg, int copy_off)
25313 {
25314   rtx_insn *insn;
25315   rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
25316   rtx tmp_reg = gen_rtx_REG (Pmode, 0);
25317   rtx todec = gen_int_mode (-size, Pmode);
25318
25319   if (INTVAL (todec) != -size)
25320     {
25321       warning (0, "stack frame too large");
25322       emit_insn (gen_trap ());
25323       return 0;
25324     }
25325
25326   if (crtl->limit_stack)
25327     {
25328       if (REG_P (stack_limit_rtx)
25329           && REGNO (stack_limit_rtx) > 1
25330           && REGNO (stack_limit_rtx) <= 31)
25331         {
25332           rtx_insn *insn
25333             = gen_add3_insn (tmp_reg, stack_limit_rtx, GEN_INT (size));
25334           gcc_assert (insn);
25335           emit_insn (insn);
25336           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg, const0_rtx));
25337         }
25338       else if (SYMBOL_REF_P (stack_limit_rtx)
25339                && TARGET_32BIT
25340                && DEFAULT_ABI == ABI_V4
25341                && !flag_pic)
25342         {
25343           rtx toload = gen_rtx_CONST (VOIDmode,
25344                                       gen_rtx_PLUS (Pmode,
25345                                                     stack_limit_rtx,
25346                                                     GEN_INT (size)));
25347
25348           emit_insn (gen_elf_high (tmp_reg, toload));
25349           emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
25350           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
25351                                     const0_rtx));
25352         }
25353       else
25354         warning (0, "stack limit expression is not supported");
25355     }
25356
25357   if (flag_stack_clash_protection)
25358     {
25359       if (size < get_stack_clash_protection_guard_size ())
25360         dump_stack_clash_frame_info (NO_PROBE_SMALL_FRAME, true);
25361       else
25362         {
25363           rtx_insn *insn = rs6000_emit_probe_stack_range_stack_clash (size,
25364                                                                       copy_reg);
25365
25366           /* If we asked for a copy with an offset, then we still need add in
25367              the offset.  */
25368           if (copy_reg && copy_off)
25369             emit_insn (gen_add3_insn (copy_reg, copy_reg, GEN_INT (copy_off)));
25370           return insn;
25371         }
25372     }
25373
25374   if (copy_reg)
25375     {
25376       if (copy_off != 0)
25377         emit_insn (gen_add3_insn (copy_reg, stack_reg, GEN_INT (copy_off)));
25378       else
25379         emit_move_insn (copy_reg, stack_reg);
25380     }
25381
25382   /* Since we didn't use gen_frame_mem to generate the MEM, grab
25383      it now and set the alias set/attributes. The above gen_*_update
25384      calls will generate a PARALLEL with the MEM set being the first
25385      operation. */
25386   insn = rs6000_emit_allocate_stack_1 (size, stack_reg);
25387   return insn;
25388 }
25389
25390 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
25391
25392 #if PROBE_INTERVAL > 32768
25393 #error Cannot use indexed addressing mode for stack probing
25394 #endif
25395
25396 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
25397    inclusive.  These are offsets from the current stack pointer.  */
25398
25399 static void
25400 rs6000_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
25401 {
25402   /* See if we have a constant small number of probes to generate.  If so,
25403      that's the easy case.  */
25404   if (first + size <= 32768)
25405     {
25406       HOST_WIDE_INT i;
25407
25408       /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
25409          it exceeds SIZE.  If only one probe is needed, this will not
25410          generate any code.  Then probe at FIRST + SIZE.  */
25411       for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
25412         emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
25413                                          -(first + i)));
25414
25415       emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
25416                                        -(first + size)));
25417     }
25418
25419   /* Otherwise, do the same as above, but in a loop.  Note that we must be
25420      extra careful with variables wrapping around because we might be at
25421      the very top (or the very bottom) of the address space and we have
25422      to be able to handle this case properly; in particular, we use an
25423      equality test for the loop condition.  */
25424   else
25425     {
25426       HOST_WIDE_INT rounded_size;
25427       rtx r12 = gen_rtx_REG (Pmode, 12);
25428       rtx r0 = gen_rtx_REG (Pmode, 0);
25429
25430       /* Sanity check for the addressing mode we're going to use.  */
25431       gcc_assert (first <= 32768);
25432
25433       /* Step 1: round SIZE to the previous multiple of the interval.  */
25434
25435       rounded_size = ROUND_DOWN (size, PROBE_INTERVAL);
25436
25437
25438       /* Step 2: compute initial and final value of the loop counter.  */
25439
25440       /* TEST_ADDR = SP + FIRST.  */
25441       emit_insn (gen_rtx_SET (r12, plus_constant (Pmode, stack_pointer_rtx,
25442                                                   -first)));
25443
25444       /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE.  */
25445       if (rounded_size > 32768)
25446         {
25447           emit_move_insn (r0, GEN_INT (-rounded_size));
25448           emit_insn (gen_rtx_SET (r0, gen_rtx_PLUS (Pmode, r12, r0)));
25449         }
25450       else
25451         emit_insn (gen_rtx_SET (r0, plus_constant (Pmode, r12,
25452                                                    -rounded_size)));
25453
25454
25455       /* Step 3: the loop
25456
25457          do
25458            {
25459              TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
25460              probe at TEST_ADDR
25461            }
25462          while (TEST_ADDR != LAST_ADDR)
25463
25464          probes at FIRST + N * PROBE_INTERVAL for values of N from 1
25465          until it is equal to ROUNDED_SIZE.  */
25466
25467       if (TARGET_64BIT)
25468         emit_insn (gen_probe_stack_rangedi (r12, r12, stack_pointer_rtx, r0));
25469       else
25470         emit_insn (gen_probe_stack_rangesi (r12, r12, stack_pointer_rtx, r0));
25471
25472
25473       /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
25474          that SIZE is equal to ROUNDED_SIZE.  */
25475
25476       if (size != rounded_size)
25477         emit_stack_probe (plus_constant (Pmode, r12, rounded_size - size));
25478     }
25479 }
25480
25481 /* Probe a range of stack addresses from REG1 to REG2 inclusive.  These are
25482    addresses, not offsets.  */
25483
25484 static const char *
25485 output_probe_stack_range_1 (rtx reg1, rtx reg2)
25486 {
25487   static int labelno = 0;
25488   char loop_lab[32];
25489   rtx xops[2];
25490
25491   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno++);
25492
25493   /* Loop.  */
25494   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
25495
25496   /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
25497   xops[0] = reg1;
25498   xops[1] = GEN_INT (-PROBE_INTERVAL);
25499   output_asm_insn ("addi %0,%0,%1", xops);
25500
25501   /* Probe at TEST_ADDR.  */
25502   xops[1] = gen_rtx_REG (Pmode, 0);
25503   output_asm_insn ("stw %1,0(%0)", xops);
25504
25505   /* Test if TEST_ADDR == LAST_ADDR.  */
25506   xops[1] = reg2;
25507   if (TARGET_64BIT)
25508     output_asm_insn ("cmpd 0,%0,%1", xops);
25509   else
25510     output_asm_insn ("cmpw 0,%0,%1", xops);
25511
25512   /* Branch.  */
25513   fputs ("\tbne 0,", asm_out_file);
25514   assemble_name_raw (asm_out_file, loop_lab);
25515   fputc ('\n', asm_out_file);
25516
25517   return "";
25518 }
25519
25520 /* This function is called when rs6000_frame_related is processing
25521    SETs within a PARALLEL, and returns whether the REGNO save ought to
25522    be marked RTX_FRAME_RELATED_P.  The PARALLELs involved are those
25523    for out-of-line register save functions, store multiple, and the
25524    Darwin world_save.  They may contain registers that don't really
25525    need saving.  */
25526
25527 static bool
25528 interesting_frame_related_regno (unsigned int regno)
25529 {
25530   /* Saves apparently of r0 are actually saving LR.  It doesn't make
25531      sense to substitute the regno here to test save_reg_p (LR_REGNO).
25532      We *know* LR needs saving, and dwarf2cfi.c is able to deduce that
25533      (set (mem) (r0)) is saving LR from a prior (set (r0) (lr)) marked
25534      as frame related.  */
25535   if (regno == 0)
25536     return true;
25537   /* If we see CR2 then we are here on a Darwin world save.  Saves of
25538      CR2 signify the whole CR is being saved.  This is a long-standing
25539      ABI wart fixed by ELFv2.  As for r0/lr there is no need to check
25540      that CR needs to be saved.  */
25541   if (regno == CR2_REGNO)
25542     return true;
25543   /* Omit frame info for any user-defined global regs.  If frame info
25544      is supplied for them, frame unwinding will restore a user reg.
25545      Also omit frame info for any reg we don't need to save, as that
25546      bloats frame info and can cause problems with shrink wrapping.
25547      Since global regs won't be seen as needing to be saved, both of
25548      these conditions are covered by save_reg_p.  */
25549   return save_reg_p (regno);
25550 }
25551
25552 /* Probe a range of stack addresses from REG1 to REG3 inclusive.  These are
25553    addresses, not offsets.
25554
25555    REG2 contains the backchain that must be stored into *sp at each allocation.
25556
25557    This is subtly different than the Ada probing above in that it tries hard
25558    to prevent attacks that jump the stack guard.  Thus, it is never allowed
25559    to allocate more than PROBE_INTERVAL bytes of stack space without a
25560    suitable probe.  */
25561
25562 static const char *
25563 output_probe_stack_range_stack_clash (rtx reg1, rtx reg2, rtx reg3)
25564 {
25565   static int labelno = 0;
25566   char loop_lab[32];
25567   rtx xops[3];
25568
25569   HOST_WIDE_INT probe_interval = get_stack_clash_protection_probe_interval ();
25570
25571   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno++);
25572
25573   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
25574
25575   /* This allocates and probes.  */
25576   xops[0] = reg1;
25577   xops[1] = reg2;
25578   xops[2] = GEN_INT (-probe_interval);
25579   if (TARGET_64BIT)
25580     output_asm_insn ("stdu %1,%2(%0)", xops);
25581   else
25582     output_asm_insn ("stwu %1,%2(%0)", xops);
25583
25584   /* Jump to LOOP_LAB if TEST_ADDR != LAST_ADDR.  */
25585   xops[0] = reg1;
25586   xops[1] = reg3;
25587   if (TARGET_64BIT)
25588     output_asm_insn ("cmpd 0,%0,%1", xops);
25589   else
25590     output_asm_insn ("cmpw 0,%0,%1", xops);
25591
25592   fputs ("\tbne 0,", asm_out_file);
25593   assemble_name_raw (asm_out_file, loop_lab);
25594   fputc ('\n', asm_out_file);
25595
25596   return "";
25597 }
25598
25599 /* Wrapper around the output_probe_stack_range routines.  */
25600 const char *
25601 output_probe_stack_range (rtx reg1, rtx reg2, rtx reg3)
25602 {
25603   if (flag_stack_clash_protection)
25604     return output_probe_stack_range_stack_clash (reg1, reg2, reg3);
25605   else
25606     return output_probe_stack_range_1 (reg1, reg3);
25607 }
25608
25609 /* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
25610    with (plus:P (reg 1) VAL), and with REG2 replaced with REPL2 if REG2
25611    is not NULL.  It would be nice if dwarf2out_frame_debug_expr could
25612    deduce these equivalences by itself so it wasn't necessary to hold
25613    its hand so much.  Don't be tempted to always supply d2_f_d_e with
25614    the actual cfa register, ie. r31 when we are using a hard frame
25615    pointer.  That fails when saving regs off r1, and sched moves the
25616    r31 setup past the reg saves.  */
25617
25618 static rtx_insn *
25619 rs6000_frame_related (rtx_insn *insn, rtx reg, HOST_WIDE_INT val,
25620                       rtx reg2, rtx repl2)
25621 {
25622   rtx repl;
25623
25624   if (REGNO (reg) == STACK_POINTER_REGNUM)
25625     {
25626       gcc_checking_assert (val == 0);
25627       repl = NULL_RTX;
25628     }
25629   else
25630     repl = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, STACK_POINTER_REGNUM),
25631                          GEN_INT (val));
25632
25633   rtx pat = PATTERN (insn);
25634   if (!repl && !reg2)
25635     {
25636       /* No need for any replacement.  Just set RTX_FRAME_RELATED_P.  */
25637       if (GET_CODE (pat) == PARALLEL)
25638         for (int i = 0; i < XVECLEN (pat, 0); i++)
25639           if (GET_CODE (XVECEXP (pat, 0, i)) == SET)
25640             {
25641               rtx set = XVECEXP (pat, 0, i);
25642
25643               if (!REG_P (SET_SRC (set))
25644                   || interesting_frame_related_regno (REGNO (SET_SRC (set))))
25645                 RTX_FRAME_RELATED_P (set) = 1;
25646             }
25647       RTX_FRAME_RELATED_P (insn) = 1;
25648       return insn;
25649     }
25650
25651   /* We expect that 'pat' is either a SET or a PARALLEL containing
25652      SETs (and possibly other stuff).  In a PARALLEL, all the SETs
25653      are important so they all have to be marked RTX_FRAME_RELATED_P.
25654      Call simplify_replace_rtx on the SETs rather than the whole insn
25655      so as to leave the other stuff alone (for example USE of r12).  */
25656
25657   set_used_flags (pat);
25658   if (GET_CODE (pat) == SET)
25659     {
25660       if (repl)
25661         pat = simplify_replace_rtx (pat, reg, repl);
25662       if (reg2)
25663         pat = simplify_replace_rtx (pat, reg2, repl2);
25664     }
25665   else if (GET_CODE (pat) == PARALLEL)
25666     {
25667       pat = shallow_copy_rtx (pat);
25668       XVEC (pat, 0) = shallow_copy_rtvec (XVEC (pat, 0));
25669
25670       for (int i = 0; i < XVECLEN (pat, 0); i++)
25671         if (GET_CODE (XVECEXP (pat, 0, i)) == SET)
25672           {
25673             rtx set = XVECEXP (pat, 0, i);
25674
25675             if (repl)
25676               set = simplify_replace_rtx (set, reg, repl);
25677             if (reg2)
25678               set = simplify_replace_rtx (set, reg2, repl2);
25679             XVECEXP (pat, 0, i) = set;
25680
25681             if (!REG_P (SET_SRC (set))
25682                 || interesting_frame_related_regno (REGNO (SET_SRC (set))))
25683               RTX_FRAME_RELATED_P (set) = 1;
25684           }
25685     }
25686   else
25687     gcc_unreachable ();
25688
25689   RTX_FRAME_RELATED_P (insn) = 1;
25690   add_reg_note (insn, REG_FRAME_RELATED_EXPR, copy_rtx_if_shared (pat));
25691
25692   return insn;
25693 }
25694
25695 /* Returns an insn that has a vrsave set operation with the
25696    appropriate CLOBBERs.  */
25697
25698 static rtx
25699 generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
25700 {
25701   int nclobs, i;
25702   rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
25703   rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
25704
25705   clobs[0]
25706     = gen_rtx_SET (vrsave,
25707                    gen_rtx_UNSPEC_VOLATILE (SImode,
25708                                             gen_rtvec (2, reg, vrsave),
25709                                             UNSPECV_SET_VRSAVE));
25710
25711   nclobs = 1;
25712
25713   /* We need to clobber the registers in the mask so the scheduler
25714      does not move sets to VRSAVE before sets of AltiVec registers.
25715
25716      However, if the function receives nonlocal gotos, reload will set
25717      all call saved registers live.  We will end up with:
25718
25719         (set (reg 999) (mem))
25720         (parallel [ (set (reg vrsave) (unspec blah))
25721                     (clobber (reg 999))])
25722
25723      The clobber will cause the store into reg 999 to be dead, and
25724      flow will attempt to delete an epilogue insn.  In this case, we
25725      need an unspec use/set of the register.  */
25726
25727   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
25728     if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
25729       {
25730         if (!epiloguep || call_used_regs [i])
25731           clobs[nclobs++] = gen_hard_reg_clobber (V4SImode, i);
25732         else
25733           {
25734             rtx reg = gen_rtx_REG (V4SImode, i);
25735
25736             clobs[nclobs++]
25737               = gen_rtx_SET (reg,
25738                              gen_rtx_UNSPEC (V4SImode,
25739                                              gen_rtvec (1, reg), 27));
25740           }
25741       }
25742
25743   insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
25744
25745   for (i = 0; i < nclobs; ++i)
25746     XVECEXP (insn, 0, i) = clobs[i];
25747
25748   return insn;
25749 }
25750
25751 static rtx
25752 gen_frame_set (rtx reg, rtx frame_reg, int offset, bool store)
25753 {
25754   rtx addr, mem;
25755
25756   addr = gen_rtx_PLUS (Pmode, frame_reg, GEN_INT (offset));
25757   mem = gen_frame_mem (GET_MODE (reg), addr);
25758   return gen_rtx_SET (store ? mem : reg, store ? reg : mem);
25759 }
25760
25761 static rtx
25762 gen_frame_load (rtx reg, rtx frame_reg, int offset)
25763 {
25764   return gen_frame_set (reg, frame_reg, offset, false);
25765 }
25766
25767 static rtx
25768 gen_frame_store (rtx reg, rtx frame_reg, int offset)
25769 {
25770   return gen_frame_set (reg, frame_reg, offset, true);
25771 }
25772
25773 /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
25774    Save REGNO into [FRAME_REG + OFFSET] in mode MODE.  */
25775
25776 static rtx_insn *
25777 emit_frame_save (rtx frame_reg, machine_mode mode,
25778                  unsigned int regno, int offset, HOST_WIDE_INT frame_reg_to_sp)
25779 {
25780   rtx reg;
25781
25782   /* Some cases that need register indexed addressing.  */
25783   gcc_checking_assert (!(TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
25784                          || (TARGET_VSX && ALTIVEC_OR_VSX_VECTOR_MODE (mode)));
25785
25786   reg = gen_rtx_REG (mode, regno);
25787   rtx_insn *insn = emit_insn (gen_frame_store (reg, frame_reg, offset));
25788   return rs6000_frame_related (insn, frame_reg, frame_reg_to_sp,
25789                                NULL_RTX, NULL_RTX);
25790 }
25791
25792 /* Emit an offset memory reference suitable for a frame store, while
25793    converting to a valid addressing mode.  */
25794
25795 static rtx
25796 gen_frame_mem_offset (machine_mode mode, rtx reg, int offset)
25797 {
25798   return gen_frame_mem (mode, gen_rtx_PLUS (Pmode, reg, GEN_INT (offset)));
25799 }
25800
25801 #ifndef TARGET_FIX_AND_CONTINUE
25802 #define TARGET_FIX_AND_CONTINUE 0
25803 #endif
25804
25805 /* It's really GPR 13 or 14, FPR 14 and VR 20.  We need the smallest.  */
25806 #define FIRST_SAVRES_REGISTER FIRST_SAVED_GP_REGNO
25807 #define LAST_SAVRES_REGISTER 31
25808 #define N_SAVRES_REGISTERS (LAST_SAVRES_REGISTER - FIRST_SAVRES_REGISTER + 1)
25809
25810 enum {
25811   SAVRES_LR = 0x1,
25812   SAVRES_SAVE = 0x2,
25813   SAVRES_REG = 0x0c,
25814   SAVRES_GPR = 0,
25815   SAVRES_FPR = 4,
25816   SAVRES_VR  = 8
25817 };
25818
25819 static GTY(()) rtx savres_routine_syms[N_SAVRES_REGISTERS][12];
25820
25821 /* Temporary holding space for an out-of-line register save/restore
25822    routine name.  */
25823 static char savres_routine_name[30];
25824
25825 /* Return the name for an out-of-line register save/restore routine.
25826    We are saving/restoring GPRs if GPR is true.  */
25827
25828 static char *
25829 rs6000_savres_routine_name (int regno, int sel)
25830 {
25831   const char *prefix = "";
25832   const char *suffix = "";
25833
25834   /* Different targets are supposed to define
25835      {SAVE,RESTORE}_FP_{PREFIX,SUFFIX} with the idea that the needed
25836      routine name could be defined with:
25837
25838      sprintf (name, "%s%d%s", SAVE_FP_PREFIX, regno, SAVE_FP_SUFFIX)
25839
25840      This is a nice idea in practice, but in reality, things are
25841      complicated in several ways:
25842
25843      - ELF targets have save/restore routines for GPRs.
25844
25845      - PPC64 ELF targets have routines for save/restore of GPRs that
25846        differ in what they do with the link register, so having a set
25847        prefix doesn't work.  (We only use one of the save routines at
25848        the moment, though.)
25849
25850      - PPC32 elf targets have "exit" versions of the restore routines
25851        that restore the link register and can save some extra space.
25852        These require an extra suffix.  (There are also "tail" versions
25853        of the restore routines and "GOT" versions of the save routines,
25854        but we don't generate those at present.  Same problems apply,
25855        though.)
25856
25857      We deal with all this by synthesizing our own prefix/suffix and
25858      using that for the simple sprintf call shown above.  */
25859   if (DEFAULT_ABI == ABI_V4)
25860     {
25861       if (TARGET_64BIT)
25862         goto aix_names;
25863
25864       if ((sel & SAVRES_REG) == SAVRES_GPR)
25865         prefix = (sel & SAVRES_SAVE) ? "_savegpr_" : "_restgpr_";
25866       else if ((sel & SAVRES_REG) == SAVRES_FPR)
25867         prefix = (sel & SAVRES_SAVE) ? "_savefpr_" : "_restfpr_";
25868       else if ((sel & SAVRES_REG) == SAVRES_VR)
25869         prefix = (sel & SAVRES_SAVE) ? "_savevr_" : "_restvr_";
25870       else
25871         abort ();
25872
25873       if ((sel & SAVRES_LR))
25874         suffix = "_x";
25875     }
25876   else if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
25877     {
25878 #if !defined (POWERPC_LINUX) && !defined (POWERPC_FREEBSD)
25879       /* No out-of-line save/restore routines for GPRs on AIX.  */
25880       gcc_assert (!TARGET_AIX || (sel & SAVRES_REG) != SAVRES_GPR);
25881 #endif
25882
25883     aix_names:
25884       if ((sel & SAVRES_REG) == SAVRES_GPR)
25885         prefix = ((sel & SAVRES_SAVE)
25886                   ? ((sel & SAVRES_LR) ? "_savegpr0_" : "_savegpr1_")
25887                   : ((sel & SAVRES_LR) ? "_restgpr0_" : "_restgpr1_"));
25888       else if ((sel & SAVRES_REG) == SAVRES_FPR)
25889         {
25890 #if defined (POWERPC_LINUX) || defined (POWERPC_FREEBSD)
25891           if ((sel & SAVRES_LR))
25892             prefix = ((sel & SAVRES_SAVE) ? "_savefpr_" : "_restfpr_");
25893           else
25894 #endif
25895             {
25896               prefix = (sel & SAVRES_SAVE) ? SAVE_FP_PREFIX : RESTORE_FP_PREFIX;
25897               suffix = (sel & SAVRES_SAVE) ? SAVE_FP_SUFFIX : RESTORE_FP_SUFFIX;
25898             }
25899         }
25900       else if ((sel & SAVRES_REG) == SAVRES_VR)
25901         prefix = (sel & SAVRES_SAVE) ? "_savevr_" : "_restvr_";
25902       else
25903         abort ();
25904     }
25905
25906    if (DEFAULT_ABI == ABI_DARWIN)
25907     {
25908       /* The Darwin approach is (slightly) different, in order to be
25909          compatible with code generated by the system toolchain.  There is a
25910          single symbol for the start of save sequence, and the code here
25911          embeds an offset into that code on the basis of the first register
25912          to be saved.  */
25913       prefix = (sel & SAVRES_SAVE) ? "save" : "rest" ;
25914       if ((sel & SAVRES_REG) == SAVRES_GPR)
25915         sprintf (savres_routine_name, "*%sGPR%s%s%.0d ; %s r%d-r31", prefix,
25916                  ((sel & SAVRES_LR) ? "x" : ""), (regno == 13 ? "" : "+"),
25917                  (regno - 13) * 4, prefix, regno);
25918       else if ((sel & SAVRES_REG) == SAVRES_FPR)
25919         sprintf (savres_routine_name, "*%sFP%s%.0d ; %s f%d-f31", prefix,
25920                  (regno == 14 ? "" : "+"), (regno - 14) * 4, prefix, regno);
25921       else if ((sel & SAVRES_REG) == SAVRES_VR)
25922         sprintf (savres_routine_name, "*%sVEC%s%.0d ; %s v%d-v31", prefix,
25923                  (regno == 20 ? "" : "+"), (regno - 20) * 8, prefix, regno);
25924       else
25925         abort ();
25926     }
25927   else
25928     sprintf (savres_routine_name, "%s%d%s", prefix, regno, suffix);
25929
25930   return savres_routine_name;
25931 }
25932
25933 /* Return an RTL SYMBOL_REF for an out-of-line register save/restore routine.
25934    We are saving/restoring GPRs if GPR is true.  */
25935
25936 static rtx
25937 rs6000_savres_routine_sym (rs6000_stack_t *info, int sel)
25938 {
25939   int regno = ((sel & SAVRES_REG) == SAVRES_GPR
25940                ? info->first_gp_reg_save
25941                : (sel & SAVRES_REG) == SAVRES_FPR
25942                ? info->first_fp_reg_save - 32
25943                : (sel & SAVRES_REG) == SAVRES_VR
25944                ? info->first_altivec_reg_save - FIRST_ALTIVEC_REGNO
25945                : -1);
25946   rtx sym;
25947   int select = sel;
25948
25949   /* Don't generate bogus routine names.  */
25950   gcc_assert (FIRST_SAVRES_REGISTER <= regno
25951               && regno <= LAST_SAVRES_REGISTER
25952               && select >= 0 && select <= 12);
25953
25954   sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select];
25955
25956   if (sym == NULL)
25957     {
25958       char *name;
25959
25960       name = rs6000_savres_routine_name (regno, sel);
25961
25962       sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select]
25963         = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
25964       SYMBOL_REF_FLAGS (sym) |= SYMBOL_FLAG_FUNCTION;
25965     }
25966
25967   return sym;
25968 }
25969
25970 /* Emit a sequence of insns, including a stack tie if needed, for
25971    resetting the stack pointer.  If UPDT_REGNO is not 1, then don't
25972    reset the stack pointer, but move the base of the frame into
25973    reg UPDT_REGNO for use by out-of-line register restore routines.  */
25974
25975 static rtx
25976 rs6000_emit_stack_reset (rtx frame_reg_rtx, HOST_WIDE_INT frame_off,
25977                          unsigned updt_regno)
25978 {
25979   /* If there is nothing to do, don't do anything.  */
25980   if (frame_off == 0 && REGNO (frame_reg_rtx) == updt_regno)
25981     return NULL_RTX;
25982
25983   rtx updt_reg_rtx = gen_rtx_REG (Pmode, updt_regno);
25984
25985   /* This blockage is needed so that sched doesn't decide to move
25986      the sp change before the register restores.  */
25987   if (DEFAULT_ABI == ABI_V4)
25988     return emit_insn (gen_stack_restore_tie (updt_reg_rtx, frame_reg_rtx,
25989                                              GEN_INT (frame_off)));
25990
25991   /* If we are restoring registers out-of-line, we will be using the
25992      "exit" variants of the restore routines, which will reset the
25993      stack for us.  But we do need to point updt_reg into the
25994      right place for those routines.  */
25995   if (frame_off != 0)
25996     return emit_insn (gen_add3_insn (updt_reg_rtx,
25997                                      frame_reg_rtx, GEN_INT (frame_off)));
25998   else
25999     return emit_move_insn (updt_reg_rtx, frame_reg_rtx);
26000
26001   return NULL_RTX;
26002 }
26003
26004 /* Return the register number used as a pointer by out-of-line
26005    save/restore functions.  */
26006
26007 static inline unsigned
26008 ptr_regno_for_savres (int sel)
26009 {
26010   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
26011     return (sel & SAVRES_REG) == SAVRES_FPR || (sel & SAVRES_LR) ? 1 : 12;
26012   return DEFAULT_ABI == ABI_DARWIN && (sel & SAVRES_REG) == SAVRES_FPR ? 1 : 11;
26013 }
26014
26015 /* Construct a parallel rtx describing the effect of a call to an
26016    out-of-line register save/restore routine, and emit the insn
26017    or jump_insn as appropriate.  */
26018
26019 static rtx_insn *
26020 rs6000_emit_savres_rtx (rs6000_stack_t *info,
26021                         rtx frame_reg_rtx, int save_area_offset, int lr_offset,
26022                         machine_mode reg_mode, int sel)
26023 {
26024   int i;
26025   int offset, start_reg, end_reg, n_regs, use_reg;
26026   int reg_size = GET_MODE_SIZE (reg_mode);
26027   rtx sym;
26028   rtvec p;
26029   rtx par;
26030   rtx_insn *insn;
26031
26032   offset = 0;
26033   start_reg = ((sel & SAVRES_REG) == SAVRES_GPR
26034                ? info->first_gp_reg_save
26035                : (sel & SAVRES_REG) == SAVRES_FPR
26036                ? info->first_fp_reg_save
26037                : (sel & SAVRES_REG) == SAVRES_VR
26038                ? info->first_altivec_reg_save
26039                : -1);
26040   end_reg = ((sel & SAVRES_REG) == SAVRES_GPR
26041              ? 32
26042              : (sel & SAVRES_REG) == SAVRES_FPR
26043              ? 64
26044              : (sel & SAVRES_REG) == SAVRES_VR
26045              ? LAST_ALTIVEC_REGNO + 1
26046              : -1);
26047   n_regs = end_reg - start_reg;
26048   p = rtvec_alloc (3 + ((sel & SAVRES_LR) ? 1 : 0)
26049                    + ((sel & SAVRES_REG) == SAVRES_VR ? 1 : 0)
26050                    + n_regs);
26051
26052   if (!(sel & SAVRES_SAVE) && (sel & SAVRES_LR))
26053     RTVEC_ELT (p, offset++) = ret_rtx;
26054
26055   RTVEC_ELT (p, offset++) = gen_hard_reg_clobber (Pmode, LR_REGNO);
26056
26057   sym = rs6000_savres_routine_sym (info, sel);
26058   RTVEC_ELT (p, offset++) = gen_rtx_USE (VOIDmode, sym);
26059
26060   use_reg = ptr_regno_for_savres (sel);
26061   if ((sel & SAVRES_REG) == SAVRES_VR)
26062     {
26063       /* Vector regs are saved/restored using [reg+reg] addressing.  */
26064       RTVEC_ELT (p, offset++) = gen_hard_reg_clobber (Pmode, use_reg);
26065       RTVEC_ELT (p, offset++)
26066         = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 0));
26067     }
26068   else
26069     RTVEC_ELT (p, offset++)
26070       = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, use_reg));
26071
26072   for (i = 0; i < end_reg - start_reg; i++)
26073     RTVEC_ELT (p, i + offset)
26074       = gen_frame_set (gen_rtx_REG (reg_mode, start_reg + i),
26075                        frame_reg_rtx, save_area_offset + reg_size * i,
26076                        (sel & SAVRES_SAVE) != 0);
26077
26078   if ((sel & SAVRES_SAVE) && (sel & SAVRES_LR))
26079     RTVEC_ELT (p, i + offset)
26080       = gen_frame_store (gen_rtx_REG (Pmode, 0), frame_reg_rtx, lr_offset);
26081
26082   par = gen_rtx_PARALLEL (VOIDmode, p);
26083
26084   if (!(sel & SAVRES_SAVE) && (sel & SAVRES_LR))
26085     {
26086       insn = emit_jump_insn (par);
26087       JUMP_LABEL (insn) = ret_rtx;
26088     }
26089   else
26090     insn = emit_insn (par);
26091   return insn;
26092 }
26093
26094 /* Emit prologue code to store CR fields that need to be saved into REG.  This
26095    function should only be called when moving the non-volatile CRs to REG, it
26096    is not a general purpose routine to move the entire set of CRs to REG.
26097    Specifically, gen_prologue_movesi_from_cr() does not contain uses of the
26098    volatile CRs.  */
26099
26100 static void
26101 rs6000_emit_prologue_move_from_cr (rtx reg)
26102 {
26103   /* Only the ELFv2 ABI allows storing only selected fields.  */
26104   if (DEFAULT_ABI == ABI_ELFv2 && TARGET_MFCRF)
26105     {
26106       int i, cr_reg[8], count = 0;
26107
26108       /* Collect CR fields that must be saved.  */
26109       for (i = 0; i < 8; i++)
26110         if (save_reg_p (CR0_REGNO + i))
26111           cr_reg[count++] = i;
26112
26113       /* If it's just a single one, use mfcrf.  */
26114       if (count == 1)
26115         {
26116           rtvec p = rtvec_alloc (1);
26117           rtvec r = rtvec_alloc (2);
26118           RTVEC_ELT (r, 0) = gen_rtx_REG (CCmode, CR0_REGNO + cr_reg[0]);
26119           RTVEC_ELT (r, 1) = GEN_INT (1 << (7 - cr_reg[0]));
26120           RTVEC_ELT (p, 0)
26121             = gen_rtx_SET (reg,
26122                            gen_rtx_UNSPEC (SImode, r, UNSPEC_MOVESI_FROM_CR));
26123
26124           emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
26125           return;
26126         }
26127
26128       /* ??? It might be better to handle count == 2 / 3 cases here
26129          as well, using logical operations to combine the values.  */
26130     }
26131
26132   emit_insn (gen_prologue_movesi_from_cr (reg));
26133 }
26134
26135 /* Return whether the split-stack arg pointer (r12) is used.  */
26136
26137 static bool
26138 split_stack_arg_pointer_used_p (void)
26139 {
26140   /* If the pseudo holding the arg pointer is no longer a pseudo,
26141      then the arg pointer is used.  */
26142   if (cfun->machine->split_stack_arg_pointer != NULL_RTX
26143       && (!REG_P (cfun->machine->split_stack_arg_pointer)
26144           || HARD_REGISTER_P (cfun->machine->split_stack_arg_pointer)))
26145     return true;
26146
26147   /* Unfortunately we also need to do some code scanning, since
26148      r12 may have been substituted for the pseudo.  */
26149   rtx_insn *insn;
26150   basic_block bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb;
26151   FOR_BB_INSNS (bb, insn)
26152     if (NONDEBUG_INSN_P (insn))
26153       {
26154         /* A call destroys r12.  */
26155         if (CALL_P (insn))
26156           return false;
26157
26158         df_ref use;
26159         FOR_EACH_INSN_USE (use, insn)
26160           {
26161             rtx x = DF_REF_REG (use);
26162             if (REG_P (x) && REGNO (x) == 12)
26163               return true;
26164           }
26165         df_ref def;
26166         FOR_EACH_INSN_DEF (def, insn)
26167           {
26168             rtx x = DF_REF_REG (def);
26169             if (REG_P (x) && REGNO (x) == 12)
26170               return false;
26171           }
26172       }
26173   return bitmap_bit_p (DF_LR_OUT (bb), 12);
26174 }
26175
26176 /* Return whether we need to emit an ELFv2 global entry point prologue.  */
26177
26178 static bool
26179 rs6000_global_entry_point_needed_p (void)
26180 {
26181   /* Only needed for the ELFv2 ABI.  */
26182   if (DEFAULT_ABI != ABI_ELFv2)
26183     return false;
26184
26185   /* With -msingle-pic-base, we assume the whole program shares the same
26186      TOC, so no global entry point prologues are needed anywhere.  */
26187   if (TARGET_SINGLE_PIC_BASE)
26188     return false;
26189
26190   /* Ensure we have a global entry point for thunks.   ??? We could
26191      avoid that if the target routine doesn't need a global entry point,
26192      but we do not know whether this is the case at this point.  */
26193   if (cfun->is_thunk)
26194     return true;
26195
26196   /* For regular functions, rs6000_emit_prologue sets this flag if the
26197      routine ever uses the TOC pointer.  */
26198   return cfun->machine->r2_setup_needed;
26199 }
26200
26201 /* Implement TARGET_SHRINK_WRAP_GET_SEPARATE_COMPONENTS.  */
26202 static sbitmap
26203 rs6000_get_separate_components (void)
26204 {
26205   rs6000_stack_t *info = rs6000_stack_info ();
26206
26207   if (WORLD_SAVE_P (info))
26208     return NULL;
26209
26210   gcc_assert (!(info->savres_strategy & SAVE_MULTIPLE)
26211               && !(info->savres_strategy & REST_MULTIPLE));
26212
26213   /* Component 0 is the save/restore of LR (done via GPR0).
26214      Component 2 is the save of the TOC (GPR2).
26215      Components 13..31 are the save/restore of GPR13..GPR31.
26216      Components 46..63 are the save/restore of FPR14..FPR31.  */
26217
26218   cfun->machine->n_components = 64;
26219
26220   sbitmap components = sbitmap_alloc (cfun->machine->n_components);
26221   bitmap_clear (components);
26222
26223   int reg_size = TARGET_32BIT ? 4 : 8;
26224   int fp_reg_size = 8;
26225
26226   /* The GPRs we need saved to the frame.  */
26227   if ((info->savres_strategy & SAVE_INLINE_GPRS)
26228       && (info->savres_strategy & REST_INLINE_GPRS))
26229     {
26230       int offset = info->gp_save_offset;
26231       if (info->push_p)
26232         offset += info->total_size;
26233
26234       for (unsigned regno = info->first_gp_reg_save; regno < 32; regno++)
26235         {
26236           if (IN_RANGE (offset, -0x8000, 0x7fff)
26237               && save_reg_p (regno))
26238             bitmap_set_bit (components, regno);
26239
26240           offset += reg_size;
26241         }
26242     }
26243
26244   /* Don't mess with the hard frame pointer.  */
26245   if (frame_pointer_needed)
26246     bitmap_clear_bit (components, HARD_FRAME_POINTER_REGNUM);
26247
26248   /* Don't mess with the fixed TOC register.  */
26249   if ((TARGET_TOC && TARGET_MINIMAL_TOC)
26250       || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
26251       || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
26252     bitmap_clear_bit (components, RS6000_PIC_OFFSET_TABLE_REGNUM);
26253
26254   /* The FPRs we need saved to the frame.  */
26255   if ((info->savres_strategy & SAVE_INLINE_FPRS)
26256       && (info->savres_strategy & REST_INLINE_FPRS))
26257     {
26258       int offset = info->fp_save_offset;
26259       if (info->push_p)
26260         offset += info->total_size;
26261
26262       for (unsigned regno = info->first_fp_reg_save; regno < 64; regno++)
26263         {
26264           if (IN_RANGE (offset, -0x8000, 0x7fff) && save_reg_p (regno))
26265             bitmap_set_bit (components, regno);
26266
26267           offset += fp_reg_size;
26268         }
26269     }
26270
26271   /* Optimize LR save and restore if we can.  This is component 0.  Any
26272      out-of-line register save/restore routines need LR.  */
26273   if (info->lr_save_p
26274       && !(flag_pic && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN))
26275       && (info->savres_strategy & SAVE_INLINE_GPRS)
26276       && (info->savres_strategy & REST_INLINE_GPRS)
26277       && (info->savres_strategy & SAVE_INLINE_FPRS)
26278       && (info->savres_strategy & REST_INLINE_FPRS)
26279       && (info->savres_strategy & SAVE_INLINE_VRS)
26280       && (info->savres_strategy & REST_INLINE_VRS))
26281     {
26282       int offset = info->lr_save_offset;
26283       if (info->push_p)
26284         offset += info->total_size;
26285       if (IN_RANGE (offset, -0x8000, 0x7fff))
26286         bitmap_set_bit (components, 0);
26287     }
26288
26289   /* Optimize saving the TOC.  This is component 2.  */
26290   if (cfun->machine->save_toc_in_prologue)
26291     bitmap_set_bit (components, 2);
26292
26293   return components;
26294 }
26295
26296 /* Implement TARGET_SHRINK_WRAP_COMPONENTS_FOR_BB.  */
26297 static sbitmap
26298 rs6000_components_for_bb (basic_block bb)
26299 {
26300   rs6000_stack_t *info = rs6000_stack_info ();
26301
26302   bitmap in = DF_LIVE_IN (bb);
26303   bitmap gen = &DF_LIVE_BB_INFO (bb)->gen;
26304   bitmap kill = &DF_LIVE_BB_INFO (bb)->kill;
26305
26306   sbitmap components = sbitmap_alloc (cfun->machine->n_components);
26307   bitmap_clear (components);
26308
26309   /* A register is used in a bb if it is in the IN, GEN, or KILL sets.  */
26310
26311   /* GPRs.  */
26312   for (unsigned regno = info->first_gp_reg_save; regno < 32; regno++)
26313     if (bitmap_bit_p (in, regno)
26314         || bitmap_bit_p (gen, regno)
26315         || bitmap_bit_p (kill, regno))
26316       bitmap_set_bit (components, regno);
26317
26318   /* FPRs.  */
26319   for (unsigned regno = info->first_fp_reg_save; regno < 64; regno++)
26320     if (bitmap_bit_p (in, regno)
26321         || bitmap_bit_p (gen, regno)
26322         || bitmap_bit_p (kill, regno))
26323       bitmap_set_bit (components, regno);
26324
26325   /* The link register.  */
26326   if (bitmap_bit_p (in, LR_REGNO)
26327       || bitmap_bit_p (gen, LR_REGNO)
26328       || bitmap_bit_p (kill, LR_REGNO))
26329     bitmap_set_bit (components, 0);
26330
26331   /* The TOC save.  */
26332   if (bitmap_bit_p (in, TOC_REGNUM)
26333       || bitmap_bit_p (gen, TOC_REGNUM)
26334       || bitmap_bit_p (kill, TOC_REGNUM))
26335     bitmap_set_bit (components, 2);
26336
26337   return components;
26338 }
26339
26340 /* Implement TARGET_SHRINK_WRAP_DISQUALIFY_COMPONENTS.  */
26341 static void
26342 rs6000_disqualify_components (sbitmap components, edge e,
26343                               sbitmap edge_components, bool /*is_prologue*/)
26344 {
26345   /* Our LR pro/epilogue code moves LR via R0, so R0 had better not be
26346      live where we want to place that code.  */
26347   if (bitmap_bit_p (edge_components, 0)
26348       && bitmap_bit_p (DF_LIVE_IN (e->dest), 0))
26349     {
26350       if (dump_file)
26351         fprintf (dump_file, "Disqualifying LR because GPR0 is live "
26352                  "on entry to bb %d\n", e->dest->index);
26353       bitmap_clear_bit (components, 0);
26354     }
26355 }
26356
26357 /* Implement TARGET_SHRINK_WRAP_EMIT_PROLOGUE_COMPONENTS.  */
26358 static void
26359 rs6000_emit_prologue_components (sbitmap components)
26360 {
26361   rs6000_stack_t *info = rs6000_stack_info ();
26362   rtx ptr_reg = gen_rtx_REG (Pmode, frame_pointer_needed
26363                              ? HARD_FRAME_POINTER_REGNUM
26364                              : STACK_POINTER_REGNUM);
26365
26366   machine_mode reg_mode = Pmode;
26367   int reg_size = TARGET_32BIT ? 4 : 8;
26368   machine_mode fp_reg_mode = TARGET_HARD_FLOAT ? DFmode : SFmode;
26369   int fp_reg_size = 8;
26370
26371   /* Prologue for LR.  */
26372   if (bitmap_bit_p (components, 0))
26373     {
26374       rtx lr = gen_rtx_REG (reg_mode, LR_REGNO);
26375       rtx reg = gen_rtx_REG (reg_mode, 0);
26376       rtx_insn *insn = emit_move_insn (reg, lr);
26377       RTX_FRAME_RELATED_P (insn) = 1;
26378       add_reg_note (insn, REG_CFA_REGISTER, gen_rtx_SET (reg, lr));
26379
26380       int offset = info->lr_save_offset;
26381       if (info->push_p)
26382         offset += info->total_size;
26383
26384       insn = emit_insn (gen_frame_store (reg, ptr_reg, offset));
26385       RTX_FRAME_RELATED_P (insn) = 1;
26386       rtx mem = copy_rtx (SET_DEST (single_set (insn)));
26387       add_reg_note (insn, REG_CFA_OFFSET, gen_rtx_SET (mem, lr));
26388     }
26389
26390   /* Prologue for TOC.  */
26391   if (bitmap_bit_p (components, 2))
26392     {
26393       rtx reg = gen_rtx_REG (reg_mode, TOC_REGNUM);
26394       rtx sp_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
26395       emit_insn (gen_frame_store (reg, sp_reg, RS6000_TOC_SAVE_SLOT));
26396     }
26397
26398   /* Prologue for the GPRs.  */
26399   int offset = info->gp_save_offset;
26400   if (info->push_p)
26401     offset += info->total_size;
26402
26403   for (int i = info->first_gp_reg_save; i < 32; i++)
26404     {
26405       if (bitmap_bit_p (components, i))
26406         {
26407           rtx reg = gen_rtx_REG (reg_mode, i);
26408           rtx_insn *insn = emit_insn (gen_frame_store (reg, ptr_reg, offset));
26409           RTX_FRAME_RELATED_P (insn) = 1;
26410           rtx set = copy_rtx (single_set (insn));
26411           add_reg_note (insn, REG_CFA_OFFSET, set);
26412         }
26413
26414       offset += reg_size;
26415     }
26416
26417   /* Prologue for the FPRs.  */
26418   offset = info->fp_save_offset;
26419   if (info->push_p)
26420     offset += info->total_size;
26421
26422   for (int i = info->first_fp_reg_save; i < 64; i++)
26423     {
26424       if (bitmap_bit_p (components, i))
26425         {
26426           rtx reg = gen_rtx_REG (fp_reg_mode, i);
26427           rtx_insn *insn = emit_insn (gen_frame_store (reg, ptr_reg, offset));
26428           RTX_FRAME_RELATED_P (insn) = 1;
26429           rtx set = copy_rtx (single_set (insn));
26430           add_reg_note (insn, REG_CFA_OFFSET, set);
26431         }
26432
26433       offset += fp_reg_size;
26434     }
26435 }
26436
26437 /* Implement TARGET_SHRINK_WRAP_EMIT_EPILOGUE_COMPONENTS.  */
26438 static void
26439 rs6000_emit_epilogue_components (sbitmap components)
26440 {
26441   rs6000_stack_t *info = rs6000_stack_info ();
26442   rtx ptr_reg = gen_rtx_REG (Pmode, frame_pointer_needed
26443                              ? HARD_FRAME_POINTER_REGNUM
26444                              : STACK_POINTER_REGNUM);
26445
26446   machine_mode reg_mode = Pmode;
26447   int reg_size = TARGET_32BIT ? 4 : 8;
26448
26449   machine_mode fp_reg_mode = TARGET_HARD_FLOAT ? DFmode : SFmode;
26450   int fp_reg_size = 8;
26451
26452   /* Epilogue for the FPRs.  */
26453   int offset = info->fp_save_offset;
26454   if (info->push_p)
26455     offset += info->total_size;
26456
26457   for (int i = info->first_fp_reg_save; i < 64; i++)
26458     {
26459       if (bitmap_bit_p (components, i))
26460         {
26461           rtx reg = gen_rtx_REG (fp_reg_mode, i);
26462           rtx_insn *insn = emit_insn (gen_frame_load (reg, ptr_reg, offset));
26463           RTX_FRAME_RELATED_P (insn) = 1;
26464           add_reg_note (insn, REG_CFA_RESTORE, reg);
26465         }
26466
26467       offset += fp_reg_size;
26468     }
26469
26470   /* Epilogue for the GPRs.  */
26471   offset = info->gp_save_offset;
26472   if (info->push_p)
26473     offset += info->total_size;
26474
26475   for (int i = info->first_gp_reg_save; i < 32; i++)
26476     {
26477       if (bitmap_bit_p (components, i))
26478         {
26479           rtx reg = gen_rtx_REG (reg_mode, i);
26480           rtx_insn *insn = emit_insn (gen_frame_load (reg, ptr_reg, offset));
26481           RTX_FRAME_RELATED_P (insn) = 1;
26482           add_reg_note (insn, REG_CFA_RESTORE, reg);
26483         }
26484
26485       offset += reg_size;
26486     }
26487
26488   /* Epilogue for LR.  */
26489   if (bitmap_bit_p (components, 0))
26490     {
26491       int offset = info->lr_save_offset;
26492       if (info->push_p)
26493         offset += info->total_size;
26494
26495       rtx reg = gen_rtx_REG (reg_mode, 0);
26496       rtx_insn *insn = emit_insn (gen_frame_load (reg, ptr_reg, offset));
26497
26498       rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
26499       insn = emit_move_insn (lr, reg);
26500       RTX_FRAME_RELATED_P (insn) = 1;
26501       add_reg_note (insn, REG_CFA_RESTORE, lr);
26502     }
26503 }
26504
26505 /* Implement TARGET_SHRINK_WRAP_SET_HANDLED_COMPONENTS.  */
26506 static void
26507 rs6000_set_handled_components (sbitmap components)
26508 {
26509   rs6000_stack_t *info = rs6000_stack_info ();
26510
26511   for (int i = info->first_gp_reg_save; i < 32; i++)
26512     if (bitmap_bit_p (components, i))
26513       cfun->machine->gpr_is_wrapped_separately[i] = true;
26514
26515   for (int i = info->first_fp_reg_save; i < 64; i++)
26516     if (bitmap_bit_p (components, i))
26517       cfun->machine->fpr_is_wrapped_separately[i - 32] = true;
26518
26519   if (bitmap_bit_p (components, 0))
26520     cfun->machine->lr_is_wrapped_separately = true;
26521
26522   if (bitmap_bit_p (components, 2))
26523     cfun->machine->toc_is_wrapped_separately = true;
26524 }
26525
26526 /* VRSAVE is a bit vector representing which AltiVec registers
26527    are used.  The OS uses this to determine which vector
26528    registers to save on a context switch.  We need to save
26529    VRSAVE on the stack frame, add whatever AltiVec registers we
26530    used in this function, and do the corresponding magic in the
26531    epilogue.  */
26532 static void
26533 emit_vrsave_prologue (rs6000_stack_t *info, int save_regno,
26534                       HOST_WIDE_INT frame_off, rtx frame_reg_rtx)
26535 {
26536   /* Get VRSAVE into a GPR.  */
26537   rtx reg = gen_rtx_REG (SImode, save_regno);
26538   rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
26539   if (TARGET_MACHO)
26540     emit_insn (gen_get_vrsave_internal (reg));
26541   else
26542     emit_insn (gen_rtx_SET (reg, vrsave));
26543
26544   /* Save VRSAVE.  */
26545   int offset = info->vrsave_save_offset + frame_off;
26546   emit_insn (gen_frame_store (reg, frame_reg_rtx, offset));
26547
26548   /* Include the registers in the mask.  */
26549   emit_insn (gen_iorsi3 (reg, reg, GEN_INT (info->vrsave_mask)));
26550
26551   emit_insn (generate_set_vrsave (reg, info, 0));
26552 }
26553
26554 /* Set up the arg pointer (r12) for -fsplit-stack code.  If __morestack was
26555    called, it left the arg pointer to the old stack in r29.  Otherwise, the
26556    arg pointer is the top of the current frame.  */
26557 static void
26558 emit_split_stack_prologue (rs6000_stack_t *info, rtx_insn *sp_adjust,
26559                            HOST_WIDE_INT frame_off, rtx frame_reg_rtx)
26560 {
26561   cfun->machine->split_stack_argp_used = true;
26562
26563   if (sp_adjust)
26564     {
26565       rtx r12 = gen_rtx_REG (Pmode, 12);
26566       rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
26567       rtx set_r12 = gen_rtx_SET (r12, sp_reg_rtx);
26568       emit_insn_before (set_r12, sp_adjust);
26569     }
26570   else if (frame_off != 0 || REGNO (frame_reg_rtx) != 12)
26571     {
26572       rtx r12 = gen_rtx_REG (Pmode, 12);
26573       if (frame_off == 0)
26574         emit_move_insn (r12, frame_reg_rtx);
26575       else
26576         emit_insn (gen_add3_insn (r12, frame_reg_rtx, GEN_INT (frame_off)));
26577     }
26578
26579   if (info->push_p)
26580     {
26581       rtx r12 = gen_rtx_REG (Pmode, 12);
26582       rtx r29 = gen_rtx_REG (Pmode, 29);
26583       rtx cr7 = gen_rtx_REG (CCUNSmode, CR7_REGNO);
26584       rtx not_more = gen_label_rtx ();
26585       rtx jump;
26586
26587       jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
26588                                    gen_rtx_GEU (VOIDmode, cr7, const0_rtx),
26589                                    gen_rtx_LABEL_REF (VOIDmode, not_more),
26590                                    pc_rtx);
26591       jump = emit_jump_insn (gen_rtx_SET (pc_rtx, jump));
26592       JUMP_LABEL (jump) = not_more;
26593       LABEL_NUSES (not_more) += 1;
26594       emit_move_insn (r12, r29);
26595       emit_label (not_more);
26596     }
26597 }
26598
26599 /* Emit function prologue as insns.  */
26600
26601 void
26602 rs6000_emit_prologue (void)
26603 {
26604   rs6000_stack_t *info = rs6000_stack_info ();
26605   machine_mode reg_mode = Pmode;
26606   int reg_size = TARGET_32BIT ? 4 : 8;
26607   machine_mode fp_reg_mode = TARGET_HARD_FLOAT ? DFmode : SFmode;
26608   int fp_reg_size = 8;
26609   rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
26610   rtx frame_reg_rtx = sp_reg_rtx;
26611   unsigned int cr_save_regno;
26612   rtx cr_save_rtx = NULL_RTX;
26613   rtx_insn *insn;
26614   int strategy;
26615   int using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
26616                               && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
26617                               && call_used_regs[STATIC_CHAIN_REGNUM]);
26618   int using_split_stack = (flag_split_stack
26619                            && (lookup_attribute ("no_split_stack",
26620                                                  DECL_ATTRIBUTES (cfun->decl))
26621                                == NULL));
26622  
26623   /* Offset to top of frame for frame_reg and sp respectively.  */
26624   HOST_WIDE_INT frame_off = 0;
26625   HOST_WIDE_INT sp_off = 0;
26626   /* sp_adjust is the stack adjusting instruction, tracked so that the
26627      insn setting up the split-stack arg pointer can be emitted just
26628      prior to it, when r12 is not used here for other purposes.  */
26629   rtx_insn *sp_adjust = 0;
26630
26631 #if CHECKING_P
26632   /* Track and check usage of r0, r11, r12.  */
26633   int reg_inuse = using_static_chain_p ? 1 << 11 : 0;
26634 #define START_USE(R) do \
26635   {                                             \
26636     gcc_assert ((reg_inuse & (1 << (R))) == 0); \
26637     reg_inuse |= 1 << (R);                      \
26638   } while (0)
26639 #define END_USE(R) do \
26640   {                                             \
26641     gcc_assert ((reg_inuse & (1 << (R))) != 0); \
26642     reg_inuse &= ~(1 << (R));                   \
26643   } while (0)
26644 #define NOT_INUSE(R) do \
26645   {                                             \
26646     gcc_assert ((reg_inuse & (1 << (R))) == 0); \
26647   } while (0)
26648 #else
26649 #define START_USE(R) do {} while (0)
26650 #define END_USE(R) do {} while (0)
26651 #define NOT_INUSE(R) do {} while (0)
26652 #endif
26653
26654   if (DEFAULT_ABI == ABI_ELFv2
26655       && !TARGET_SINGLE_PIC_BASE)
26656     {
26657       cfun->machine->r2_setup_needed = df_regs_ever_live_p (TOC_REGNUM);
26658
26659       /* With -mminimal-toc we may generate an extra use of r2 below.  */
26660       if (TARGET_TOC && TARGET_MINIMAL_TOC
26661           && !constant_pool_empty_p ())
26662         cfun->machine->r2_setup_needed = true;
26663     }
26664
26665
26666   if (flag_stack_usage_info)
26667     current_function_static_stack_size = info->total_size;
26668
26669   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
26670     {
26671       HOST_WIDE_INT size = info->total_size;
26672
26673       if (crtl->is_leaf && !cfun->calls_alloca)
26674         {
26675           if (size > PROBE_INTERVAL && size > get_stack_check_protect ())
26676             rs6000_emit_probe_stack_range (get_stack_check_protect (),
26677                                            size - get_stack_check_protect ());
26678         }
26679       else if (size > 0)
26680         rs6000_emit_probe_stack_range (get_stack_check_protect (), size);
26681     }
26682
26683   if (TARGET_FIX_AND_CONTINUE)
26684     {
26685       /* gdb on darwin arranges to forward a function from the old
26686          address by modifying the first 5 instructions of the function
26687          to branch to the overriding function.  This is necessary to
26688          permit function pointers that point to the old function to
26689          actually forward to the new function.  */
26690       emit_insn (gen_nop ());
26691       emit_insn (gen_nop ());
26692       emit_insn (gen_nop ());
26693       emit_insn (gen_nop ());
26694       emit_insn (gen_nop ());
26695     }
26696
26697   /* Handle world saves specially here.  */
26698   if (WORLD_SAVE_P (info))
26699     {
26700       int i, j, sz;
26701       rtx treg;
26702       rtvec p;
26703       rtx reg0;
26704
26705       /* save_world expects lr in r0. */
26706       reg0 = gen_rtx_REG (Pmode, 0);
26707       if (info->lr_save_p)
26708         {
26709           insn = emit_move_insn (reg0,
26710                                  gen_rtx_REG (Pmode, LR_REGNO));
26711           RTX_FRAME_RELATED_P (insn) = 1;
26712         }
26713
26714       /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
26715          assumptions about the offsets of various bits of the stack
26716          frame.  */
26717       gcc_assert (info->gp_save_offset == -220
26718                   && info->fp_save_offset == -144
26719                   && info->lr_save_offset == 8
26720                   && info->cr_save_offset == 4
26721                   && info->push_p
26722                   && info->lr_save_p
26723                   && (!crtl->calls_eh_return
26724                       || info->ehrd_offset == -432)
26725                   && info->vrsave_save_offset == -224
26726                   && info->altivec_save_offset == -416);
26727
26728       treg = gen_rtx_REG (SImode, 11);
26729       emit_move_insn (treg, GEN_INT (-info->total_size));
26730
26731       /* SAVE_WORLD takes the caller's LR in R0 and the frame size
26732          in R11.  It also clobbers R12, so beware!  */
26733
26734       /* Preserve CR2 for save_world prologues */
26735       sz = 5;
26736       sz += 32 - info->first_gp_reg_save;
26737       sz += 64 - info->first_fp_reg_save;
26738       sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
26739       p = rtvec_alloc (sz);
26740       j = 0;
26741       RTVEC_ELT (p, j++) = gen_hard_reg_clobber (SImode, LR_REGNO);
26742       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
26743                                         gen_rtx_SYMBOL_REF (Pmode,
26744                                                             "*save_world"));
26745       /* We do floats first so that the instruction pattern matches
26746          properly.  */
26747       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
26748         RTVEC_ELT (p, j++)
26749           = gen_frame_store (gen_rtx_REG (TARGET_HARD_FLOAT ? DFmode : SFmode,
26750                                           info->first_fp_reg_save + i),
26751                              frame_reg_rtx,
26752                              info->fp_save_offset + frame_off + 8 * i);
26753       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
26754         RTVEC_ELT (p, j++)
26755           = gen_frame_store (gen_rtx_REG (V4SImode,
26756                                           info->first_altivec_reg_save + i),
26757                              frame_reg_rtx,
26758                              info->altivec_save_offset + frame_off + 16 * i);
26759       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
26760         RTVEC_ELT (p, j++)
26761           = gen_frame_store (gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
26762                              frame_reg_rtx,
26763                              info->gp_save_offset + frame_off + reg_size * i);
26764
26765       /* CR register traditionally saved as CR2.  */
26766       RTVEC_ELT (p, j++)
26767         = gen_frame_store (gen_rtx_REG (SImode, CR2_REGNO),
26768                            frame_reg_rtx, info->cr_save_offset + frame_off);
26769       /* Explain about use of R0.  */
26770       if (info->lr_save_p)
26771         RTVEC_ELT (p, j++)
26772           = gen_frame_store (reg0,
26773                              frame_reg_rtx, info->lr_save_offset + frame_off);
26774       /* Explain what happens to the stack pointer.  */
26775       {
26776         rtx newval = gen_rtx_PLUS (Pmode, sp_reg_rtx, treg);
26777         RTVEC_ELT (p, j++) = gen_rtx_SET (sp_reg_rtx, newval);
26778       }
26779
26780       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
26781       rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
26782                             treg, GEN_INT (-info->total_size));
26783       sp_off = frame_off = info->total_size;
26784     }
26785
26786   strategy = info->savres_strategy;
26787
26788   /* For V.4, update stack before we do any saving and set back pointer.  */
26789   if (! WORLD_SAVE_P (info)
26790       && info->push_p
26791       && (DEFAULT_ABI == ABI_V4
26792           || crtl->calls_eh_return))
26793     {
26794       bool need_r11 = (!(strategy & SAVE_INLINE_FPRS)
26795                        || !(strategy & SAVE_INLINE_GPRS)
26796                        || !(strategy & SAVE_INLINE_VRS));
26797       int ptr_regno = -1;
26798       rtx ptr_reg = NULL_RTX;
26799       int ptr_off = 0;
26800
26801       if (info->total_size < 32767)
26802         frame_off = info->total_size;
26803       else if (need_r11)
26804         ptr_regno = 11;
26805       else if (info->cr_save_p
26806                || info->lr_save_p
26807                || info->first_fp_reg_save < 64
26808                || info->first_gp_reg_save < 32
26809                || info->altivec_size != 0
26810                || info->vrsave_size != 0
26811                || crtl->calls_eh_return)
26812         ptr_regno = 12;
26813       else
26814         {
26815           /* The prologue won't be saving any regs so there is no need
26816              to set up a frame register to access any frame save area.
26817              We also won't be using frame_off anywhere below, but set
26818              the correct value anyway to protect against future
26819              changes to this function.  */
26820           frame_off = info->total_size;
26821         }
26822       if (ptr_regno != -1)
26823         {
26824           /* Set up the frame offset to that needed by the first
26825              out-of-line save function.  */
26826           START_USE (ptr_regno);
26827           ptr_reg = gen_rtx_REG (Pmode, ptr_regno);
26828           frame_reg_rtx = ptr_reg;
26829           if (!(strategy & SAVE_INLINE_FPRS) && info->fp_size != 0)
26830             gcc_checking_assert (info->fp_save_offset + info->fp_size == 0);
26831           else if (!(strategy & SAVE_INLINE_GPRS) && info->first_gp_reg_save < 32)
26832             ptr_off = info->gp_save_offset + info->gp_size;
26833           else if (!(strategy & SAVE_INLINE_VRS) && info->altivec_size != 0)
26834             ptr_off = info->altivec_save_offset + info->altivec_size;
26835           frame_off = -ptr_off;
26836         }
26837       sp_adjust = rs6000_emit_allocate_stack (info->total_size,
26838                                               ptr_reg, ptr_off);
26839       if (REGNO (frame_reg_rtx) == 12)
26840         sp_adjust = 0;
26841       sp_off = info->total_size;
26842       if (frame_reg_rtx != sp_reg_rtx)
26843         rs6000_emit_stack_tie (frame_reg_rtx, false);
26844     }
26845
26846   /* If we use the link register, get it into r0.  */
26847   if (!WORLD_SAVE_P (info) && info->lr_save_p
26848       && !cfun->machine->lr_is_wrapped_separately)
26849     {
26850       rtx addr, reg, mem;
26851
26852       reg = gen_rtx_REG (Pmode, 0);
26853       START_USE (0);
26854       insn = emit_move_insn (reg, gen_rtx_REG (Pmode, LR_REGNO));
26855       RTX_FRAME_RELATED_P (insn) = 1;
26856
26857       if (!(strategy & (SAVE_NOINLINE_GPRS_SAVES_LR
26858                         | SAVE_NOINLINE_FPRS_SAVES_LR)))
26859         {
26860           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
26861                                GEN_INT (info->lr_save_offset + frame_off));
26862           mem = gen_rtx_MEM (Pmode, addr);
26863           /* This should not be of rs6000_sr_alias_set, because of
26864              __builtin_return_address.  */
26865
26866           insn = emit_move_insn (mem, reg);
26867           rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
26868                                 NULL_RTX, NULL_RTX);
26869           END_USE (0);
26870         }
26871     }
26872
26873   /* If we need to save CR, put it into r12 or r11.  Choose r12 except when
26874      r12 will be needed by out-of-line gpr save.  */
26875   cr_save_regno = ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
26876                    && !(strategy & (SAVE_INLINE_GPRS
26877                                     | SAVE_NOINLINE_GPRS_SAVES_LR))
26878                    ? 11 : 12);
26879   if (!WORLD_SAVE_P (info)
26880       && info->cr_save_p
26881       && REGNO (frame_reg_rtx) != cr_save_regno
26882       && !(using_static_chain_p && cr_save_regno == 11)
26883       && !(using_split_stack && cr_save_regno == 12 && sp_adjust))
26884     {
26885       cr_save_rtx = gen_rtx_REG (SImode, cr_save_regno);
26886       START_USE (cr_save_regno);
26887       rs6000_emit_prologue_move_from_cr (cr_save_rtx);
26888     }
26889
26890   /* Do any required saving of fpr's.  If only one or two to save, do
26891      it ourselves.  Otherwise, call function.  */
26892   if (!WORLD_SAVE_P (info) && (strategy & SAVE_INLINE_FPRS))
26893     {
26894       int offset = info->fp_save_offset + frame_off;
26895       for (int i = info->first_fp_reg_save; i < 64; i++)
26896         {
26897           if (save_reg_p (i)
26898               && !cfun->machine->fpr_is_wrapped_separately[i - 32])
26899             emit_frame_save (frame_reg_rtx, fp_reg_mode, i, offset,
26900                              sp_off - frame_off);
26901
26902           offset += fp_reg_size;
26903         }
26904     }
26905   else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
26906     {
26907       bool lr = (strategy & SAVE_NOINLINE_FPRS_SAVES_LR) != 0;
26908       int sel = SAVRES_SAVE | SAVRES_FPR | (lr ? SAVRES_LR : 0);
26909       unsigned ptr_regno = ptr_regno_for_savres (sel);
26910       rtx ptr_reg = frame_reg_rtx;
26911
26912       if (REGNO (frame_reg_rtx) == ptr_regno)
26913         gcc_checking_assert (frame_off == 0);
26914       else
26915         {
26916           ptr_reg = gen_rtx_REG (Pmode, ptr_regno);
26917           NOT_INUSE (ptr_regno);
26918           emit_insn (gen_add3_insn (ptr_reg,
26919                                     frame_reg_rtx, GEN_INT (frame_off)));
26920         }
26921       insn = rs6000_emit_savres_rtx (info, ptr_reg,
26922                                      info->fp_save_offset,
26923                                      info->lr_save_offset,
26924                                      DFmode, sel);
26925       rs6000_frame_related (insn, ptr_reg, sp_off,
26926                             NULL_RTX, NULL_RTX);
26927       if (lr)
26928         END_USE (0);
26929     }
26930
26931   /* Save GPRs.  This is done as a PARALLEL if we are using
26932      the store-multiple instructions.  */
26933   if (!WORLD_SAVE_P (info) && !(strategy & SAVE_INLINE_GPRS))
26934     {
26935       bool lr = (strategy & SAVE_NOINLINE_GPRS_SAVES_LR) != 0;
26936       int sel = SAVRES_SAVE | SAVRES_GPR | (lr ? SAVRES_LR : 0);
26937       unsigned ptr_regno = ptr_regno_for_savres (sel);
26938       rtx ptr_reg = frame_reg_rtx;
26939       bool ptr_set_up = REGNO (ptr_reg) == ptr_regno;
26940       int end_save = info->gp_save_offset + info->gp_size;
26941       int ptr_off;
26942
26943       if (ptr_regno == 12)
26944         sp_adjust = 0;
26945       if (!ptr_set_up)
26946         ptr_reg = gen_rtx_REG (Pmode, ptr_regno);
26947
26948       /* Need to adjust r11 (r12) if we saved any FPRs.  */
26949       if (end_save + frame_off != 0)
26950         {
26951           rtx offset = GEN_INT (end_save + frame_off);
26952
26953           if (ptr_set_up)
26954             frame_off = -end_save;
26955           else
26956             NOT_INUSE (ptr_regno);
26957           emit_insn (gen_add3_insn (ptr_reg, frame_reg_rtx, offset));
26958         }
26959       else if (!ptr_set_up)
26960         {
26961           NOT_INUSE (ptr_regno);
26962           emit_move_insn (ptr_reg, frame_reg_rtx);
26963         }
26964       ptr_off = -end_save;
26965       insn = rs6000_emit_savres_rtx (info, ptr_reg,
26966                                      info->gp_save_offset + ptr_off,
26967                                      info->lr_save_offset + ptr_off,
26968                                      reg_mode, sel);
26969       rs6000_frame_related (insn, ptr_reg, sp_off - ptr_off,
26970                             NULL_RTX, NULL_RTX);
26971       if (lr)
26972         END_USE (0);
26973     }
26974   else if (!WORLD_SAVE_P (info) && (strategy & SAVE_MULTIPLE))
26975     {
26976       rtvec p;
26977       int i;
26978       p = rtvec_alloc (32 - info->first_gp_reg_save);
26979       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
26980         RTVEC_ELT (p, i)
26981           = gen_frame_store (gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
26982                              frame_reg_rtx,
26983                              info->gp_save_offset + frame_off + reg_size * i);
26984       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
26985       rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
26986                             NULL_RTX, NULL_RTX);
26987     }
26988   else if (!WORLD_SAVE_P (info))
26989     {
26990       int offset = info->gp_save_offset + frame_off;
26991       for (int i = info->first_gp_reg_save; i < 32; i++)
26992         {
26993           if (save_reg_p (i)
26994               && !cfun->machine->gpr_is_wrapped_separately[i])
26995             emit_frame_save (frame_reg_rtx, reg_mode, i, offset,
26996                              sp_off - frame_off);
26997
26998           offset += reg_size;
26999         }
27000     }
27001
27002   if (crtl->calls_eh_return)
27003     {
27004       unsigned int i;
27005       rtvec p;
27006
27007       for (i = 0; ; ++i)
27008         {
27009           unsigned int regno = EH_RETURN_DATA_REGNO (i);
27010           if (regno == INVALID_REGNUM)
27011             break;
27012         }
27013
27014       p = rtvec_alloc (i);
27015
27016       for (i = 0; ; ++i)
27017         {
27018           unsigned int regno = EH_RETURN_DATA_REGNO (i);
27019           if (regno == INVALID_REGNUM)
27020             break;
27021
27022           rtx set
27023             = gen_frame_store (gen_rtx_REG (reg_mode, regno),
27024                                sp_reg_rtx,
27025                                info->ehrd_offset + sp_off + reg_size * (int) i);
27026           RTVEC_ELT (p, i) = set;
27027           RTX_FRAME_RELATED_P (set) = 1;
27028         }
27029
27030       insn = emit_insn (gen_blockage ());
27031       RTX_FRAME_RELATED_P (insn) = 1;
27032       add_reg_note (insn, REG_FRAME_RELATED_EXPR, gen_rtx_PARALLEL (VOIDmode, p));
27033     }
27034
27035   /* In AIX ABI we need to make sure r2 is really saved.  */
27036   if (TARGET_AIX && crtl->calls_eh_return)
27037     {
27038       rtx tmp_reg, tmp_reg_si, hi, lo, compare_result, toc_save_done, jump;
27039       rtx join_insn, note;
27040       rtx_insn *save_insn;
27041       long toc_restore_insn;
27042
27043       tmp_reg = gen_rtx_REG (Pmode, 11);
27044       tmp_reg_si = gen_rtx_REG (SImode, 11);
27045       if (using_static_chain_p)
27046         {
27047           START_USE (0);
27048           emit_move_insn (gen_rtx_REG (Pmode, 0), tmp_reg);
27049         }
27050       else
27051         START_USE (11);
27052       emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, LR_REGNO));
27053       /* Peek at instruction to which this function returns.  If it's
27054          restoring r2, then we know we've already saved r2.  We can't
27055          unconditionally save r2 because the value we have will already
27056          be updated if we arrived at this function via a plt call or
27057          toc adjusting stub.  */
27058       emit_move_insn (tmp_reg_si, gen_rtx_MEM (SImode, tmp_reg));
27059       toc_restore_insn = ((TARGET_32BIT ? 0x80410000 : 0xE8410000)
27060                           + RS6000_TOC_SAVE_SLOT);
27061       hi = gen_int_mode (toc_restore_insn & ~0xffff, SImode);
27062       emit_insn (gen_xorsi3 (tmp_reg_si, tmp_reg_si, hi));
27063       compare_result = gen_rtx_REG (CCUNSmode, CR0_REGNO);
27064       validate_condition_mode (EQ, CCUNSmode);
27065       lo = gen_int_mode (toc_restore_insn & 0xffff, SImode);
27066       emit_insn (gen_rtx_SET (compare_result,
27067                               gen_rtx_COMPARE (CCUNSmode, tmp_reg_si, lo)));
27068       toc_save_done = gen_label_rtx ();
27069       jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
27070                                    gen_rtx_EQ (VOIDmode, compare_result,
27071                                                const0_rtx),
27072                                    gen_rtx_LABEL_REF (VOIDmode, toc_save_done),
27073                                    pc_rtx);
27074       jump = emit_jump_insn (gen_rtx_SET (pc_rtx, jump));
27075       JUMP_LABEL (jump) = toc_save_done;
27076       LABEL_NUSES (toc_save_done) += 1;
27077
27078       save_insn = emit_frame_save (frame_reg_rtx, reg_mode,
27079                                    TOC_REGNUM, frame_off + RS6000_TOC_SAVE_SLOT,
27080                                    sp_off - frame_off);
27081
27082       emit_label (toc_save_done);
27083
27084       /* ??? If we leave SAVE_INSN as marked as saving R2, then we'll
27085          have a CFG that has different saves along different paths.
27086          Move the note to a dummy blockage insn, which describes that
27087          R2 is unconditionally saved after the label.  */
27088       /* ??? An alternate representation might be a special insn pattern
27089          containing both the branch and the store.  That might let the
27090          code that minimizes the number of DW_CFA_advance opcodes better
27091          freedom in placing the annotations.  */
27092       note = find_reg_note (save_insn, REG_FRAME_RELATED_EXPR, NULL);
27093       if (note)
27094         remove_note (save_insn, note);
27095       else
27096         note = alloc_reg_note (REG_FRAME_RELATED_EXPR,
27097                                copy_rtx (PATTERN (save_insn)), NULL_RTX);
27098       RTX_FRAME_RELATED_P (save_insn) = 0;
27099
27100       join_insn = emit_insn (gen_blockage ());
27101       REG_NOTES (join_insn) = note;
27102       RTX_FRAME_RELATED_P (join_insn) = 1;
27103
27104       if (using_static_chain_p)
27105         {
27106           emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, 0));
27107           END_USE (0);
27108         }
27109       else
27110         END_USE (11);
27111     }
27112
27113   /* Save CR if we use any that must be preserved.  */
27114   if (!WORLD_SAVE_P (info) && info->cr_save_p)
27115     {
27116       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
27117                                GEN_INT (info->cr_save_offset + frame_off));
27118       rtx mem = gen_frame_mem (SImode, addr);
27119
27120       /* If we didn't copy cr before, do so now using r0.  */
27121       if (cr_save_rtx == NULL_RTX)
27122         {
27123           START_USE (0);
27124           cr_save_rtx = gen_rtx_REG (SImode, 0);
27125           rs6000_emit_prologue_move_from_cr (cr_save_rtx);
27126         }
27127
27128       /* Saving CR requires a two-instruction sequence: one instruction
27129          to move the CR to a general-purpose register, and a second
27130          instruction that stores the GPR to memory.
27131
27132          We do not emit any DWARF CFI records for the first of these,
27133          because we cannot properly represent the fact that CR is saved in
27134          a register.  One reason is that we cannot express that multiple
27135          CR fields are saved; another reason is that on 64-bit, the size
27136          of the CR register in DWARF (4 bytes) differs from the size of
27137          a general-purpose register.
27138
27139          This means if any intervening instruction were to clobber one of
27140          the call-saved CR fields, we'd have incorrect CFI.  To prevent
27141          this from happening, we mark the store to memory as a use of
27142          those CR fields, which prevents any such instruction from being
27143          scheduled in between the two instructions.  */
27144       rtx crsave_v[9];
27145       int n_crsave = 0;
27146       int i;
27147
27148       crsave_v[n_crsave++] = gen_rtx_SET (mem, cr_save_rtx);
27149       for (i = 0; i < 8; i++)
27150         if (save_reg_p (CR0_REGNO + i))
27151           crsave_v[n_crsave++]
27152             = gen_rtx_USE (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO + i));
27153
27154       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode,
27155                                           gen_rtvec_v (n_crsave, crsave_v)));
27156       END_USE (REGNO (cr_save_rtx));
27157
27158       /* Now, there's no way that dwarf2out_frame_debug_expr is going to
27159          understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)',
27160          so we need to construct a frame expression manually.  */
27161       RTX_FRAME_RELATED_P (insn) = 1;
27162
27163       /* Update address to be stack-pointer relative, like
27164          rs6000_frame_related would do.  */
27165       addr = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, STACK_POINTER_REGNUM),
27166                            GEN_INT (info->cr_save_offset + sp_off));
27167       mem = gen_frame_mem (SImode, addr);
27168
27169       if (DEFAULT_ABI == ABI_ELFv2)
27170         {
27171           /* In the ELFv2 ABI we generate separate CFI records for each
27172              CR field that was actually saved.  They all point to the
27173              same 32-bit stack slot.  */
27174           rtx crframe[8];
27175           int n_crframe = 0;
27176
27177           for (i = 0; i < 8; i++)
27178             if (save_reg_p (CR0_REGNO + i))
27179               {
27180                 crframe[n_crframe]
27181                   = gen_rtx_SET (mem, gen_rtx_REG (SImode, CR0_REGNO + i));
27182
27183                 RTX_FRAME_RELATED_P (crframe[n_crframe]) = 1;
27184                 n_crframe++;
27185              }
27186
27187           add_reg_note (insn, REG_FRAME_RELATED_EXPR,
27188                         gen_rtx_PARALLEL (VOIDmode,
27189                                           gen_rtvec_v (n_crframe, crframe)));
27190         }
27191       else
27192         {
27193           /* In other ABIs, by convention, we use a single CR regnum to
27194              represent the fact that all call-saved CR fields are saved.
27195              We use CR2_REGNO to be compatible with gcc-2.95 on Linux.  */
27196           rtx set = gen_rtx_SET (mem, gen_rtx_REG (SImode, CR2_REGNO));
27197           add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
27198         }
27199     }
27200
27201   /* In the ELFv2 ABI we need to save all call-saved CR fields into
27202      *separate* slots if the routine calls __builtin_eh_return, so
27203      that they can be independently restored by the unwinder.  */
27204   if (DEFAULT_ABI == ABI_ELFv2 && crtl->calls_eh_return)
27205     {
27206       int i, cr_off = info->ehcr_offset;
27207       rtx crsave;
27208
27209       /* ??? We might get better performance by using multiple mfocrf
27210          instructions.  */
27211       crsave = gen_rtx_REG (SImode, 0);
27212       emit_insn (gen_prologue_movesi_from_cr (crsave));
27213
27214       for (i = 0; i < 8; i++)
27215         if (!call_used_regs[CR0_REGNO + i])
27216           {
27217             rtvec p = rtvec_alloc (2);
27218             RTVEC_ELT (p, 0)
27219               = gen_frame_store (crsave, frame_reg_rtx, cr_off + frame_off);
27220             RTVEC_ELT (p, 1)
27221               = gen_rtx_USE (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO + i));
27222
27223             insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
27224
27225             RTX_FRAME_RELATED_P (insn) = 1;
27226             add_reg_note (insn, REG_FRAME_RELATED_EXPR,
27227                           gen_frame_store (gen_rtx_REG (SImode, CR0_REGNO + i),
27228                                            sp_reg_rtx, cr_off + sp_off));
27229
27230             cr_off += reg_size;
27231           }
27232     }
27233
27234   /* If we are emitting stack probes, but allocate no stack, then
27235      just note that in the dump file.  */
27236   if (flag_stack_clash_protection
27237       && dump_file
27238       && !info->push_p)
27239     dump_stack_clash_frame_info (NO_PROBE_NO_FRAME, false);
27240
27241   /* Update stack and set back pointer unless this is V.4,
27242      for which it was done previously.  */
27243   if (!WORLD_SAVE_P (info) && info->push_p
27244       && !(DEFAULT_ABI == ABI_V4 || crtl->calls_eh_return))
27245     {
27246       rtx ptr_reg = NULL;
27247       int ptr_off = 0;
27248
27249       /* If saving altivec regs we need to be able to address all save
27250          locations using a 16-bit offset.  */
27251       if ((strategy & SAVE_INLINE_VRS) == 0
27252           || (info->altivec_size != 0
27253               && (info->altivec_save_offset + info->altivec_size - 16
27254                   + info->total_size - frame_off) > 32767)
27255           || (info->vrsave_size != 0
27256               && (info->vrsave_save_offset
27257                   + info->total_size - frame_off) > 32767))
27258         {
27259           int sel = SAVRES_SAVE | SAVRES_VR;
27260           unsigned ptr_regno = ptr_regno_for_savres (sel);
27261
27262           if (using_static_chain_p
27263               && ptr_regno == STATIC_CHAIN_REGNUM)
27264             ptr_regno = 12;
27265           if (REGNO (frame_reg_rtx) != ptr_regno)
27266             START_USE (ptr_regno);
27267           ptr_reg = gen_rtx_REG (Pmode, ptr_regno);
27268           frame_reg_rtx = ptr_reg;
27269           ptr_off = info->altivec_save_offset + info->altivec_size;
27270           frame_off = -ptr_off;
27271         }
27272       else if (REGNO (frame_reg_rtx) == 1)
27273         frame_off = info->total_size;
27274       sp_adjust = rs6000_emit_allocate_stack (info->total_size,
27275                                               ptr_reg, ptr_off);
27276       if (REGNO (frame_reg_rtx) == 12)
27277         sp_adjust = 0;
27278       sp_off = info->total_size;
27279       if (frame_reg_rtx != sp_reg_rtx)
27280         rs6000_emit_stack_tie (frame_reg_rtx, false);
27281     }
27282
27283   /* Set frame pointer, if needed.  */
27284   if (frame_pointer_needed)
27285     {
27286       insn = emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
27287                              sp_reg_rtx);
27288       RTX_FRAME_RELATED_P (insn) = 1;
27289     }
27290
27291   /* Save AltiVec registers if needed.  Save here because the red zone does
27292      not always include AltiVec registers.  */
27293   if (!WORLD_SAVE_P (info)
27294       && info->altivec_size != 0 && (strategy & SAVE_INLINE_VRS) == 0)
27295     {
27296       int end_save = info->altivec_save_offset + info->altivec_size;
27297       int ptr_off;
27298       /* Oddly, the vector save/restore functions point r0 at the end
27299          of the save area, then use r11 or r12 to load offsets for
27300          [reg+reg] addressing.  */
27301       rtx ptr_reg = gen_rtx_REG (Pmode, 0);
27302       int scratch_regno = ptr_regno_for_savres (SAVRES_SAVE | SAVRES_VR);
27303       rtx scratch_reg = gen_rtx_REG (Pmode, scratch_regno);
27304
27305       gcc_checking_assert (scratch_regno == 11 || scratch_regno == 12);
27306       NOT_INUSE (0);
27307       if (scratch_regno == 12)
27308         sp_adjust = 0;
27309       if (end_save + frame_off != 0)
27310         {
27311           rtx offset = GEN_INT (end_save + frame_off);
27312
27313           emit_insn (gen_add3_insn (ptr_reg, frame_reg_rtx, offset));
27314         }
27315       else
27316         emit_move_insn (ptr_reg, frame_reg_rtx);
27317
27318       ptr_off = -end_save;
27319       insn = rs6000_emit_savres_rtx (info, scratch_reg,
27320                                      info->altivec_save_offset + ptr_off,
27321                                      0, V4SImode, SAVRES_SAVE | SAVRES_VR);
27322       rs6000_frame_related (insn, scratch_reg, sp_off - ptr_off,
27323                             NULL_RTX, NULL_RTX);
27324       if (REGNO (frame_reg_rtx) == REGNO (scratch_reg))
27325         {
27326           /* The oddity mentioned above clobbered our frame reg.  */
27327           emit_move_insn (frame_reg_rtx, ptr_reg);
27328           frame_off = ptr_off;
27329         }
27330     }
27331   else if (!WORLD_SAVE_P (info)
27332            && info->altivec_size != 0)
27333     {
27334       int i;
27335
27336       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
27337         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
27338           {
27339             rtx areg, savereg, mem;
27340             HOST_WIDE_INT offset;
27341
27342             offset = (info->altivec_save_offset + frame_off
27343                       + 16 * (i - info->first_altivec_reg_save));
27344
27345             savereg = gen_rtx_REG (V4SImode, i);
27346
27347             if (TARGET_P9_VECTOR && quad_address_offset_p (offset))
27348               {
27349                 mem = gen_frame_mem (V4SImode,
27350                                      gen_rtx_PLUS (Pmode, frame_reg_rtx,
27351                                                    GEN_INT (offset)));
27352                 insn = emit_insn (gen_rtx_SET (mem, savereg));
27353                 areg = NULL_RTX;
27354               }
27355             else
27356               {
27357                 NOT_INUSE (0);
27358                 areg = gen_rtx_REG (Pmode, 0);
27359                 emit_move_insn (areg, GEN_INT (offset));
27360
27361                 /* AltiVec addressing mode is [reg+reg].  */
27362                 mem = gen_frame_mem (V4SImode,
27363                                      gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
27364
27365                 /* Rather than emitting a generic move, force use of the stvx
27366                    instruction, which we always want on ISA 2.07 (power8) systems.
27367                    In particular we don't want xxpermdi/stxvd2x for little
27368                    endian.  */
27369                 insn = emit_insn (gen_altivec_stvx_v4si_internal (mem, savereg));
27370               }
27371
27372             rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
27373                                   areg, GEN_INT (offset));
27374           }
27375     }
27376
27377   /* VRSAVE is a bit vector representing which AltiVec registers
27378      are used.  The OS uses this to determine which vector
27379      registers to save on a context switch.  We need to save
27380      VRSAVE on the stack frame, add whatever AltiVec registers we
27381      used in this function, and do the corresponding magic in the
27382      epilogue.  */
27383
27384   if (!WORLD_SAVE_P (info) && info->vrsave_size != 0)
27385     {
27386       /* Get VRSAVE into a GPR.  Note that ABI_V4 and ABI_DARWIN might
27387          be using r12 as frame_reg_rtx and r11 as the static chain
27388          pointer for nested functions.  */
27389       int save_regno = 12;
27390       if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
27391           && !using_static_chain_p)
27392         save_regno = 11;
27393       else if (using_split_stack || REGNO (frame_reg_rtx) == 12)
27394         {
27395           save_regno = 11;
27396           if (using_static_chain_p)
27397             save_regno = 0;
27398         }
27399       NOT_INUSE (save_regno);
27400
27401       emit_vrsave_prologue (info, save_regno, frame_off, frame_reg_rtx);
27402     }
27403
27404   /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up.  */
27405   if (!TARGET_SINGLE_PIC_BASE
27406       && ((TARGET_TOC && TARGET_MINIMAL_TOC
27407            && !constant_pool_empty_p ())
27408           || (DEFAULT_ABI == ABI_V4
27409               && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
27410               && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))))
27411     {
27412       /* If emit_load_toc_table will use the link register, we need to save
27413          it.  We use R12 for this purpose because emit_load_toc_table
27414          can use register 0.  This allows us to use a plain 'blr' to return
27415          from the procedure more often.  */
27416       int save_LR_around_toc_setup = (TARGET_ELF
27417                                       && DEFAULT_ABI == ABI_V4
27418                                       && flag_pic
27419                                       && ! info->lr_save_p
27420                                       && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) > 0);
27421       if (save_LR_around_toc_setup)
27422         {
27423           rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
27424           rtx tmp = gen_rtx_REG (Pmode, 12);
27425
27426           sp_adjust = 0;
27427           insn = emit_move_insn (tmp, lr);
27428           RTX_FRAME_RELATED_P (insn) = 1;
27429
27430           rs6000_emit_load_toc_table (TRUE);
27431
27432           insn = emit_move_insn (lr, tmp);
27433           add_reg_note (insn, REG_CFA_RESTORE, lr);
27434           RTX_FRAME_RELATED_P (insn) = 1;
27435         }
27436       else
27437         rs6000_emit_load_toc_table (TRUE);
27438     }
27439
27440 #if TARGET_MACHO
27441   if (!TARGET_SINGLE_PIC_BASE
27442       && DEFAULT_ABI == ABI_DARWIN
27443       && flag_pic && crtl->uses_pic_offset_table)
27444     {
27445       rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
27446       rtx src = gen_rtx_SYMBOL_REF (Pmode, MACHOPIC_FUNCTION_BASE_NAME);
27447
27448       /* Save and restore LR locally around this call (in R0).  */
27449       if (!info->lr_save_p)
27450         emit_move_insn (gen_rtx_REG (Pmode, 0), lr);
27451
27452       emit_insn (gen_load_macho_picbase (src));
27453
27454       emit_move_insn (gen_rtx_REG (Pmode,
27455                                    RS6000_PIC_OFFSET_TABLE_REGNUM),
27456                       lr);
27457
27458       if (!info->lr_save_p)
27459         emit_move_insn (lr, gen_rtx_REG (Pmode, 0));
27460     }
27461 #endif
27462
27463   /* If we need to, save the TOC register after doing the stack setup.
27464      Do not emit eh frame info for this save.  The unwinder wants info,
27465      conceptually attached to instructions in this function, about
27466      register values in the caller of this function.  This R2 may have
27467      already been changed from the value in the caller.
27468      We don't attempt to write accurate DWARF EH frame info for R2
27469      because code emitted by gcc for a (non-pointer) function call
27470      doesn't save and restore R2.  Instead, R2 is managed out-of-line
27471      by a linker generated plt call stub when the function resides in
27472      a shared library.  This behavior is costly to describe in DWARF,
27473      both in terms of the size of DWARF info and the time taken in the
27474      unwinder to interpret it.  R2 changes, apart from the
27475      calls_eh_return case earlier in this function, are handled by
27476      linux-unwind.h frob_update_context.  */
27477   if (rs6000_save_toc_in_prologue_p ()
27478       && !cfun->machine->toc_is_wrapped_separately)
27479     {
27480       rtx reg = gen_rtx_REG (reg_mode, TOC_REGNUM);
27481       emit_insn (gen_frame_store (reg, sp_reg_rtx, RS6000_TOC_SAVE_SLOT));
27482     }
27483
27484   /* Set up the arg pointer (r12) for -fsplit-stack code.  */
27485   if (using_split_stack && split_stack_arg_pointer_used_p ())
27486     emit_split_stack_prologue (info, sp_adjust, frame_off, frame_reg_rtx);
27487 }
27488
27489 /* Output .extern statements for the save/restore routines we use.  */
27490
27491 static void
27492 rs6000_output_savres_externs (FILE *file)
27493 {
27494   rs6000_stack_t *info = rs6000_stack_info ();
27495
27496   if (TARGET_DEBUG_STACK)
27497     debug_stack_info (info);
27498
27499   /* Write .extern for any function we will call to save and restore
27500      fp values.  */
27501   if (info->first_fp_reg_save < 64
27502       && !TARGET_MACHO
27503       && !TARGET_ELF)
27504     {
27505       char *name;
27506       int regno = info->first_fp_reg_save - 32;
27507
27508       if ((info->savres_strategy & SAVE_INLINE_FPRS) == 0)
27509         {
27510           bool lr = (info->savres_strategy & SAVE_NOINLINE_FPRS_SAVES_LR) != 0;
27511           int sel = SAVRES_SAVE | SAVRES_FPR | (lr ? SAVRES_LR : 0);
27512           name = rs6000_savres_routine_name (regno, sel);
27513           fprintf (file, "\t.extern %s\n", name);
27514         }
27515       if ((info->savres_strategy & REST_INLINE_FPRS) == 0)
27516         {
27517           bool lr = (info->savres_strategy
27518                      & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0;
27519           int sel = SAVRES_FPR | (lr ? SAVRES_LR : 0);
27520           name = rs6000_savres_routine_name (regno, sel);
27521           fprintf (file, "\t.extern %s\n", name);
27522         }
27523     }
27524 }
27525
27526 /* Write function prologue.  */
27527
27528 static void
27529 rs6000_output_function_prologue (FILE *file)
27530 {
27531   if (!cfun->is_thunk)
27532     rs6000_output_savres_externs (file);
27533
27534   /* ELFv2 ABI r2 setup code and local entry point.  This must follow
27535      immediately after the global entry point label.  */
27536   if (rs6000_global_entry_point_needed_p ())
27537     {
27538       const char *name = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
27539
27540       (*targetm.asm_out.internal_label) (file, "LCF", rs6000_pic_labelno);
27541
27542       if (TARGET_CMODEL != CMODEL_LARGE)
27543         {
27544           /* In the small and medium code models, we assume the TOC is less
27545              2 GB away from the text section, so it can be computed via the
27546              following two-instruction sequence.  */
27547           char buf[256];
27548
27549           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
27550           fprintf (file, "0:\taddis 2,12,.TOC.-");
27551           assemble_name (file, buf);
27552           fprintf (file, "@ha\n");
27553           fprintf (file, "\taddi 2,2,.TOC.-");
27554           assemble_name (file, buf);
27555           fprintf (file, "@l\n");
27556         }
27557       else
27558         {
27559           /* In the large code model, we allow arbitrary offsets between the
27560              TOC and the text section, so we have to load the offset from
27561              memory.  The data field is emitted directly before the global
27562              entry point in rs6000_elf_declare_function_name.  */
27563           char buf[256];
27564
27565 #ifdef HAVE_AS_ENTRY_MARKERS
27566           /* If supported by the linker, emit a marker relocation.  If the
27567              total code size of the final executable or shared library
27568              happens to fit into 2 GB after all, the linker will replace
27569              this code sequence with the sequence for the small or medium
27570              code model.  */
27571           fprintf (file, "\t.reloc .,R_PPC64_ENTRY\n");
27572 #endif
27573           fprintf (file, "\tld 2,");
27574           ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
27575           assemble_name (file, buf);
27576           fprintf (file, "-");
27577           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
27578           assemble_name (file, buf);
27579           fprintf (file, "(12)\n");
27580           fprintf (file, "\tadd 2,2,12\n");
27581         }
27582
27583       fputs ("\t.localentry\t", file);
27584       assemble_name (file, name);
27585       fputs (",.-", file);
27586       assemble_name (file, name);
27587       fputs ("\n", file);
27588     }
27589
27590   /* Output -mprofile-kernel code.  This needs to be done here instead of
27591      in output_function_profile since it must go after the ELFv2 ABI
27592      local entry point.  */
27593   if (TARGET_PROFILE_KERNEL && crtl->profile)
27594     {
27595       gcc_assert (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2);
27596       gcc_assert (!TARGET_32BIT);
27597
27598       asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
27599
27600       /* In the ELFv2 ABI we have no compiler stack word.  It must be
27601          the resposibility of _mcount to preserve the static chain
27602          register if required.  */
27603       if (DEFAULT_ABI != ABI_ELFv2
27604           && cfun->static_chain_decl != NULL)
27605         {
27606           asm_fprintf (file, "\tstd %s,24(%s)\n",
27607                        reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
27608           fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
27609           asm_fprintf (file, "\tld %s,24(%s)\n",
27610                        reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
27611         }
27612       else
27613         fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
27614     }
27615
27616   rs6000_pic_labelno++;
27617 }
27618
27619 /* -mprofile-kernel code calls mcount before the function prolog,
27620    so a profiled leaf function should stay a leaf function.  */
27621 static bool
27622 rs6000_keep_leaf_when_profiled ()
27623 {
27624   return TARGET_PROFILE_KERNEL;
27625 }
27626
27627 /* Non-zero if vmx regs are restored before the frame pop, zero if
27628    we restore after the pop when possible.  */
27629 #define ALWAYS_RESTORE_ALTIVEC_BEFORE_POP 0
27630
27631 /* Restoring cr is a two step process: loading a reg from the frame
27632    save, then moving the reg to cr.  For ABI_V4 we must let the
27633    unwinder know that the stack location is no longer valid at or
27634    before the stack deallocation, but we can't emit a cfa_restore for
27635    cr at the stack deallocation like we do for other registers.
27636    The trouble is that it is possible for the move to cr to be
27637    scheduled after the stack deallocation.  So say exactly where cr
27638    is located on each of the two insns.  */
27639
27640 static rtx
27641 load_cr_save (int regno, rtx frame_reg_rtx, int offset, bool exit_func)
27642 {
27643   rtx mem = gen_frame_mem_offset (SImode, frame_reg_rtx, offset);
27644   rtx reg = gen_rtx_REG (SImode, regno);
27645   rtx_insn *insn = emit_move_insn (reg, mem);
27646
27647   if (!exit_func && DEFAULT_ABI == ABI_V4)
27648     {
27649       rtx cr = gen_rtx_REG (SImode, CR2_REGNO);
27650       rtx set = gen_rtx_SET (reg, cr);
27651
27652       add_reg_note (insn, REG_CFA_REGISTER, set);
27653       RTX_FRAME_RELATED_P (insn) = 1;
27654     }
27655   return reg;
27656 }
27657
27658 /* Reload CR from REG.  */
27659
27660 static void
27661 restore_saved_cr (rtx reg, bool using_mfcr_multiple, bool exit_func)
27662 {
27663   int count = 0;
27664   int i;
27665
27666   if (using_mfcr_multiple)
27667     {
27668       for (i = 0; i < 8; i++)
27669         if (save_reg_p (CR0_REGNO + i))
27670           count++;
27671       gcc_assert (count);
27672     }
27673
27674   if (using_mfcr_multiple && count > 1)
27675     {
27676       rtx_insn *insn;
27677       rtvec p;
27678       int ndx;
27679
27680       p = rtvec_alloc (count);
27681
27682       ndx = 0;
27683       for (i = 0; i < 8; i++)
27684         if (save_reg_p (CR0_REGNO + i))
27685           {
27686             rtvec r = rtvec_alloc (2);
27687             RTVEC_ELT (r, 0) = reg;
27688             RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
27689             RTVEC_ELT (p, ndx) =
27690               gen_rtx_SET (gen_rtx_REG (CCmode, CR0_REGNO + i),
27691                            gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
27692             ndx++;
27693           }
27694       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
27695       gcc_assert (ndx == count);
27696
27697       /* For the ELFv2 ABI we generate a CFA_RESTORE for each
27698          CR field separately.  */
27699       if (!exit_func && DEFAULT_ABI == ABI_ELFv2 && flag_shrink_wrap)
27700         {
27701           for (i = 0; i < 8; i++)
27702             if (save_reg_p (CR0_REGNO + i))
27703               add_reg_note (insn, REG_CFA_RESTORE,
27704                             gen_rtx_REG (SImode, CR0_REGNO + i));
27705
27706           RTX_FRAME_RELATED_P (insn) = 1;
27707         }
27708     }
27709   else
27710     for (i = 0; i < 8; i++)
27711       if (save_reg_p (CR0_REGNO + i))
27712         {
27713           rtx insn = emit_insn (gen_movsi_to_cr_one
27714                                  (gen_rtx_REG (CCmode, CR0_REGNO + i), reg));
27715
27716           /* For the ELFv2 ABI we generate a CFA_RESTORE for each
27717              CR field separately, attached to the insn that in fact
27718              restores this particular CR field.  */
27719           if (!exit_func && DEFAULT_ABI == ABI_ELFv2 && flag_shrink_wrap)
27720             {
27721               add_reg_note (insn, REG_CFA_RESTORE,
27722                             gen_rtx_REG (SImode, CR0_REGNO + i));
27723
27724               RTX_FRAME_RELATED_P (insn) = 1;
27725             }
27726         }
27727
27728   /* For other ABIs, we just generate a single CFA_RESTORE for CR2.  */
27729   if (!exit_func && DEFAULT_ABI != ABI_ELFv2
27730       && (DEFAULT_ABI == ABI_V4 || flag_shrink_wrap))
27731     {
27732       rtx_insn *insn = get_last_insn ();
27733       rtx cr = gen_rtx_REG (SImode, CR2_REGNO);
27734
27735       add_reg_note (insn, REG_CFA_RESTORE, cr);
27736       RTX_FRAME_RELATED_P (insn) = 1;
27737     }
27738 }
27739
27740 /* Like cr, the move to lr instruction can be scheduled after the
27741    stack deallocation, but unlike cr, its stack frame save is still
27742    valid.  So we only need to emit the cfa_restore on the correct
27743    instruction.  */
27744
27745 static void
27746 load_lr_save (int regno, rtx frame_reg_rtx, int offset)
27747 {
27748   rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx, offset);
27749   rtx reg = gen_rtx_REG (Pmode, regno);
27750
27751   emit_move_insn (reg, mem);
27752 }
27753
27754 static void
27755 restore_saved_lr (int regno, bool exit_func)
27756 {
27757   rtx reg = gen_rtx_REG (Pmode, regno);
27758   rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
27759   rtx_insn *insn = emit_move_insn (lr, reg);
27760
27761   if (!exit_func && flag_shrink_wrap)
27762     {
27763       add_reg_note (insn, REG_CFA_RESTORE, lr);
27764       RTX_FRAME_RELATED_P (insn) = 1;
27765     }
27766 }
27767
27768 static rtx
27769 add_crlr_cfa_restore (const rs6000_stack_t *info, rtx cfa_restores)
27770 {
27771   if (DEFAULT_ABI == ABI_ELFv2)
27772     {
27773       int i;
27774       for (i = 0; i < 8; i++)
27775         if (save_reg_p (CR0_REGNO + i))
27776           {
27777             rtx cr = gen_rtx_REG (SImode, CR0_REGNO + i);
27778             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, cr,
27779                                            cfa_restores);
27780           }
27781     }
27782   else if (info->cr_save_p)
27783     cfa_restores = alloc_reg_note (REG_CFA_RESTORE,
27784                                    gen_rtx_REG (SImode, CR2_REGNO),
27785                                    cfa_restores);
27786
27787   if (info->lr_save_p)
27788     cfa_restores = alloc_reg_note (REG_CFA_RESTORE,
27789                                    gen_rtx_REG (Pmode, LR_REGNO),
27790                                    cfa_restores);
27791   return cfa_restores;
27792 }
27793
27794 /* Return true if OFFSET from stack pointer can be clobbered by signals.
27795    V.4 doesn't have any stack cushion, AIX ABIs have 220 or 288 bytes
27796    below stack pointer not cloberred by signals.  */
27797
27798 static inline bool
27799 offset_below_red_zone_p (HOST_WIDE_INT offset)
27800 {
27801   return offset < (DEFAULT_ABI == ABI_V4
27802                    ? 0
27803                    : TARGET_32BIT ? -220 : -288);
27804 }
27805
27806 /* Append CFA_RESTORES to any existing REG_NOTES on the last insn.  */
27807
27808 static void
27809 emit_cfa_restores (rtx cfa_restores)
27810 {
27811   rtx_insn *insn = get_last_insn ();
27812   rtx *loc = &REG_NOTES (insn);
27813
27814   while (*loc)
27815     loc = &XEXP (*loc, 1);
27816   *loc = cfa_restores;
27817   RTX_FRAME_RELATED_P (insn) = 1;
27818 }
27819
27820 /* Emit function epilogue as insns.  */
27821
27822 void
27823 rs6000_emit_epilogue (enum epilogue_type epilogue_type)
27824 {
27825   HOST_WIDE_INT frame_off = 0;
27826   rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
27827   rtx frame_reg_rtx = sp_reg_rtx;
27828   rtx cfa_restores = NULL_RTX;
27829   rtx insn;
27830   rtx cr_save_reg = NULL_RTX;
27831   machine_mode reg_mode = Pmode;
27832   int reg_size = TARGET_32BIT ? 4 : 8;
27833   machine_mode fp_reg_mode = TARGET_HARD_FLOAT ? DFmode : SFmode;
27834   int fp_reg_size = 8;
27835   int i;
27836   unsigned ptr_regno;
27837
27838   rs6000_stack_t *info = rs6000_stack_info ();
27839
27840   if (epilogue_type == EPILOGUE_TYPE_NORMAL && crtl->calls_eh_return)
27841     epilogue_type = EPILOGUE_TYPE_EH_RETURN;
27842
27843   int strategy = info->savres_strategy;
27844   bool using_load_multiple = !!(strategy & REST_MULTIPLE);
27845   bool restoring_GPRs_inline = !!(strategy & REST_INLINE_GPRS);
27846   bool restoring_FPRs_inline = !!(strategy & REST_INLINE_FPRS);
27847   if (epilogue_type == EPILOGUE_TYPE_SIBCALL)
27848     {
27849       restoring_GPRs_inline = true;
27850       restoring_FPRs_inline = true;
27851     }
27852
27853   bool using_mtcr_multiple = (rs6000_tune == PROCESSOR_PPC601
27854                               || rs6000_tune == PROCESSOR_PPC603
27855                               || rs6000_tune == PROCESSOR_PPC750
27856                               || optimize_size);
27857
27858   /* Restore via the backchain when we have a large frame, since this
27859      is more efficient than an addis, addi pair.  The second condition
27860      here will not trigger at the moment;  We don't actually need a
27861      frame pointer for alloca, but the generic parts of the compiler
27862      give us one anyway.  */
27863   bool use_backchain_to_restore_sp
27864     = (info->total_size + (info->lr_save_p ? info->lr_save_offset : 0) > 32767
27865        || (cfun->calls_alloca && !frame_pointer_needed));
27866
27867   bool restore_lr = (info->lr_save_p
27868                 && (restoring_FPRs_inline
27869                     || (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR))
27870                 && (restoring_GPRs_inline
27871                     || info->first_fp_reg_save < 64)
27872                 && !cfun->machine->lr_is_wrapped_separately);
27873
27874
27875   if (WORLD_SAVE_P (info))
27876     {
27877       gcc_assert (epilogue_type != EPILOGUE_TYPE_SIBCALL);
27878
27879       /* eh_rest_world_r10 will return to the location saved in the LR
27880          stack slot (which is not likely to be our caller.)
27881          Input: R10 -- stack adjustment.  Clobbers R0, R11, R12, R7, R8.
27882          rest_world is similar, except any R10 parameter is ignored.
27883          The exception-handling stuff that was here in 2.95 is no
27884          longer necessary.  */
27885
27886       rtvec p;
27887       p = rtvec_alloc (9
27888                        + 32 - info->first_gp_reg_save
27889                        + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
27890                        + 63 + 1 - info->first_fp_reg_save);
27891
27892       const char *rname;
27893       switch (epilogue_type)
27894         {
27895         case EPILOGUE_TYPE_NORMAL:
27896           rname = ggc_strdup ("*rest_world");
27897           break;
27898
27899         case EPILOGUE_TYPE_EH_RETURN:
27900           rname = ggc_strdup ("*eh_rest_world_r10");
27901           break;
27902
27903         default:
27904           gcc_unreachable ();
27905         }
27906
27907       int j = 0;
27908       RTVEC_ELT (p, j++) = ret_rtx;
27909       RTVEC_ELT (p, j++)
27910         = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, rname));
27911       /* The instruction pattern requires a clobber here;
27912          it is shared with the restVEC helper. */
27913       RTVEC_ELT (p, j++) = gen_hard_reg_clobber (Pmode, 11);
27914
27915       {
27916         /* CR register traditionally saved as CR2.  */
27917         rtx reg = gen_rtx_REG (SImode, CR2_REGNO);
27918         RTVEC_ELT (p, j++)
27919           = gen_frame_load (reg, frame_reg_rtx, info->cr_save_offset);
27920         if (flag_shrink_wrap)
27921           {
27922             cfa_restores = alloc_reg_note (REG_CFA_RESTORE,
27923                                            gen_rtx_REG (Pmode, LR_REGNO),
27924                                            cfa_restores);
27925             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
27926           }
27927       }
27928
27929       int i;
27930       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
27931         {
27932           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
27933           RTVEC_ELT (p, j++)
27934             = gen_frame_load (reg,
27935                               frame_reg_rtx, info->gp_save_offset + reg_size * i);
27936           if (flag_shrink_wrap
27937               && save_reg_p (info->first_gp_reg_save + i))
27938             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
27939         }
27940       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
27941         {
27942           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
27943           RTVEC_ELT (p, j++)
27944             = gen_frame_load (reg,
27945                               frame_reg_rtx, info->altivec_save_offset + 16 * i);
27946           if (flag_shrink_wrap
27947               && save_reg_p (info->first_altivec_reg_save + i))
27948             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
27949         }
27950       for (i = 0; info->first_fp_reg_save + i <= 63; i++)
27951         {
27952           rtx reg = gen_rtx_REG (TARGET_HARD_FLOAT ? DFmode : SFmode,
27953                                  info->first_fp_reg_save + i);
27954           RTVEC_ELT (p, j++)
27955             = gen_frame_load (reg, frame_reg_rtx, info->fp_save_offset + 8 * i);
27956           if (flag_shrink_wrap
27957               && save_reg_p (info->first_fp_reg_save + i))
27958             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
27959         }
27960       RTVEC_ELT (p, j++) = gen_hard_reg_clobber (Pmode, 0);
27961       RTVEC_ELT (p, j++) = gen_hard_reg_clobber (SImode, 12);
27962       RTVEC_ELT (p, j++) = gen_hard_reg_clobber (SImode, 7);
27963       RTVEC_ELT (p, j++) = gen_hard_reg_clobber (SImode, 8);
27964       RTVEC_ELT (p, j++)
27965         = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
27966       insn = emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
27967
27968       if (flag_shrink_wrap)
27969         {
27970           REG_NOTES (insn) = cfa_restores;
27971           add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
27972           RTX_FRAME_RELATED_P (insn) = 1;
27973         }
27974       return;
27975     }
27976
27977   /* frame_reg_rtx + frame_off points to the top of this stack frame.  */
27978   if (info->push_p)
27979     frame_off = info->total_size;
27980
27981   /* Restore AltiVec registers if we must do so before adjusting the
27982      stack.  */
27983   if (info->altivec_size != 0
27984       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
27985           || (DEFAULT_ABI != ABI_V4
27986               && offset_below_red_zone_p (info->altivec_save_offset))))
27987     {
27988       int i;
27989       int scratch_regno = ptr_regno_for_savres (SAVRES_VR);
27990
27991       gcc_checking_assert (scratch_regno == 11 || scratch_regno == 12);
27992       if (use_backchain_to_restore_sp)
27993         {
27994           int frame_regno = 11;
27995
27996           if ((strategy & REST_INLINE_VRS) == 0)
27997             {
27998               /* Of r11 and r12, select the one not clobbered by an
27999                  out-of-line restore function for the frame register.  */
28000               frame_regno = 11 + 12 - scratch_regno;
28001             }
28002           frame_reg_rtx = gen_rtx_REG (Pmode, frame_regno);
28003           emit_move_insn (frame_reg_rtx,
28004                           gen_rtx_MEM (Pmode, sp_reg_rtx));
28005           frame_off = 0;
28006         }
28007       else if (frame_pointer_needed)
28008         frame_reg_rtx = hard_frame_pointer_rtx;
28009
28010       if ((strategy & REST_INLINE_VRS) == 0)
28011         {
28012           int end_save = info->altivec_save_offset + info->altivec_size;
28013           int ptr_off;
28014           rtx ptr_reg = gen_rtx_REG (Pmode, 0);
28015           rtx scratch_reg = gen_rtx_REG (Pmode, scratch_regno);
28016
28017           if (end_save + frame_off != 0)
28018             {
28019               rtx offset = GEN_INT (end_save + frame_off);
28020
28021               emit_insn (gen_add3_insn (ptr_reg, frame_reg_rtx, offset));
28022             }
28023           else
28024             emit_move_insn (ptr_reg, frame_reg_rtx);
28025
28026           ptr_off = -end_save;
28027           insn = rs6000_emit_savres_rtx (info, scratch_reg,
28028                                          info->altivec_save_offset + ptr_off,
28029                                          0, V4SImode, SAVRES_VR);
28030         }
28031       else
28032         {
28033           for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
28034             if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
28035               {
28036                 rtx addr, areg, mem, insn;
28037                 rtx reg = gen_rtx_REG (V4SImode, i);
28038                 HOST_WIDE_INT offset
28039                   = (info->altivec_save_offset + frame_off
28040                      + 16 * (i - info->first_altivec_reg_save));
28041
28042                 if (TARGET_P9_VECTOR && quad_address_offset_p (offset))
28043                   {
28044                     mem = gen_frame_mem (V4SImode,
28045                                          gen_rtx_PLUS (Pmode, frame_reg_rtx,
28046                                                        GEN_INT (offset)));
28047                     insn = gen_rtx_SET (reg, mem);
28048                   }
28049                 else
28050                   {
28051                     areg = gen_rtx_REG (Pmode, 0);
28052                     emit_move_insn (areg, GEN_INT (offset));
28053
28054                     /* AltiVec addressing mode is [reg+reg].  */
28055                     addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
28056                     mem = gen_frame_mem (V4SImode, addr);
28057
28058                     /* Rather than emitting a generic move, force use of the
28059                        lvx instruction, which we always want.  In particular we
28060                        don't want lxvd2x/xxpermdi for little endian.  */
28061                     insn = gen_altivec_lvx_v4si_internal (reg, mem);
28062                   }
28063
28064                 (void) emit_insn (insn);
28065               }
28066         }
28067
28068       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
28069         if (((strategy & REST_INLINE_VRS) == 0
28070              || (info->vrsave_mask & ALTIVEC_REG_BIT (i)) != 0)
28071             && (flag_shrink_wrap
28072                 || (offset_below_red_zone_p
28073                     (info->altivec_save_offset
28074                      + 16 * (i - info->first_altivec_reg_save))))
28075             && save_reg_p (i))
28076           {
28077             rtx reg = gen_rtx_REG (V4SImode, i);
28078             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
28079           }
28080     }
28081
28082   /* Restore VRSAVE if we must do so before adjusting the stack.  */
28083   if (info->vrsave_size != 0
28084       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
28085           || (DEFAULT_ABI != ABI_V4
28086               && offset_below_red_zone_p (info->vrsave_save_offset))))
28087     {
28088       rtx reg;
28089
28090       if (frame_reg_rtx == sp_reg_rtx)
28091         {
28092           if (use_backchain_to_restore_sp)
28093             {
28094               frame_reg_rtx = gen_rtx_REG (Pmode, 11);
28095               emit_move_insn (frame_reg_rtx,
28096                               gen_rtx_MEM (Pmode, sp_reg_rtx));
28097               frame_off = 0;
28098             }
28099           else if (frame_pointer_needed)
28100             frame_reg_rtx = hard_frame_pointer_rtx;
28101         }
28102
28103       reg = gen_rtx_REG (SImode, 12);
28104       emit_insn (gen_frame_load (reg, frame_reg_rtx,
28105                                  info->vrsave_save_offset + frame_off));
28106
28107       emit_insn (generate_set_vrsave (reg, info, 1));
28108     }
28109
28110   insn = NULL_RTX;
28111   /* If we have a large stack frame, restore the old stack pointer
28112      using the backchain.  */
28113   if (use_backchain_to_restore_sp)
28114     {
28115       if (frame_reg_rtx == sp_reg_rtx)
28116         {
28117           /* Under V.4, don't reset the stack pointer until after we're done
28118              loading the saved registers.  */
28119           if (DEFAULT_ABI == ABI_V4)
28120             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
28121
28122           insn = emit_move_insn (frame_reg_rtx,
28123                                  gen_rtx_MEM (Pmode, sp_reg_rtx));
28124           frame_off = 0;
28125         }
28126       else if (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
28127                && DEFAULT_ABI == ABI_V4)
28128         /* frame_reg_rtx has been set up by the altivec restore.  */
28129         ;
28130       else
28131         {
28132           insn = emit_move_insn (sp_reg_rtx, frame_reg_rtx);
28133           frame_reg_rtx = sp_reg_rtx;
28134         }
28135     }
28136   /* If we have a frame pointer, we can restore the old stack pointer
28137      from it.  */
28138   else if (frame_pointer_needed)
28139     {
28140       frame_reg_rtx = sp_reg_rtx;
28141       if (DEFAULT_ABI == ABI_V4)
28142         frame_reg_rtx = gen_rtx_REG (Pmode, 11);
28143       /* Prevent reordering memory accesses against stack pointer restore.  */
28144       else if (cfun->calls_alloca
28145                || offset_below_red_zone_p (-info->total_size))
28146         rs6000_emit_stack_tie (frame_reg_rtx, true);
28147
28148       insn = emit_insn (gen_add3_insn (frame_reg_rtx, hard_frame_pointer_rtx,
28149                                        GEN_INT (info->total_size)));
28150       frame_off = 0;
28151     }
28152   else if (info->push_p
28153            && DEFAULT_ABI != ABI_V4
28154            && epilogue_type != EPILOGUE_TYPE_EH_RETURN)
28155     {
28156       /* Prevent reordering memory accesses against stack pointer restore.  */
28157       if (cfun->calls_alloca
28158           || offset_below_red_zone_p (-info->total_size))
28159         rs6000_emit_stack_tie (frame_reg_rtx, false);
28160       insn = emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx,
28161                                        GEN_INT (info->total_size)));
28162       frame_off = 0;
28163     }
28164   if (insn && frame_reg_rtx == sp_reg_rtx)
28165     {
28166       if (cfa_restores)
28167         {
28168           REG_NOTES (insn) = cfa_restores;
28169           cfa_restores = NULL_RTX;
28170         }
28171       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
28172       RTX_FRAME_RELATED_P (insn) = 1;
28173     }
28174
28175   /* Restore AltiVec registers if we have not done so already.  */
28176   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
28177       && info->altivec_size != 0
28178       && (DEFAULT_ABI == ABI_V4
28179           || !offset_below_red_zone_p (info->altivec_save_offset)))
28180     {
28181       int i;
28182
28183       if ((strategy & REST_INLINE_VRS) == 0)
28184         {
28185           int end_save = info->altivec_save_offset + info->altivec_size;
28186           int ptr_off;
28187           rtx ptr_reg = gen_rtx_REG (Pmode, 0);
28188           int scratch_regno = ptr_regno_for_savres (SAVRES_VR);
28189           rtx scratch_reg = gen_rtx_REG (Pmode, scratch_regno);
28190
28191           if (end_save + frame_off != 0)
28192             {
28193               rtx offset = GEN_INT (end_save + frame_off);
28194
28195               emit_insn (gen_add3_insn (ptr_reg, frame_reg_rtx, offset));
28196             }
28197           else
28198             emit_move_insn (ptr_reg, frame_reg_rtx);
28199
28200           ptr_off = -end_save;
28201           insn = rs6000_emit_savres_rtx (info, scratch_reg,
28202                                          info->altivec_save_offset + ptr_off,
28203                                          0, V4SImode, SAVRES_VR);
28204           if (REGNO (frame_reg_rtx) == REGNO (scratch_reg))
28205             {
28206               /* Frame reg was clobbered by out-of-line save.  Restore it
28207                  from ptr_reg, and if we are calling out-of-line gpr or
28208                  fpr restore set up the correct pointer and offset.  */
28209               unsigned newptr_regno = 1;
28210               if (!restoring_GPRs_inline)
28211                 {
28212                   bool lr = info->gp_save_offset + info->gp_size == 0;
28213                   int sel = SAVRES_GPR | (lr ? SAVRES_LR : 0);
28214                   newptr_regno = ptr_regno_for_savres (sel);
28215                   end_save = info->gp_save_offset + info->gp_size;
28216                 }
28217               else if (!restoring_FPRs_inline)
28218                 {
28219                   bool lr = !(strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR);
28220                   int sel = SAVRES_FPR | (lr ? SAVRES_LR : 0);
28221                   newptr_regno = ptr_regno_for_savres (sel);
28222                   end_save = info->fp_save_offset + info->fp_size;
28223                 }
28224
28225               if (newptr_regno != 1 && REGNO (frame_reg_rtx) != newptr_regno)
28226                 frame_reg_rtx = gen_rtx_REG (Pmode, newptr_regno);
28227                 
28228               if (end_save + ptr_off != 0)
28229                 {
28230                   rtx offset = GEN_INT (end_save + ptr_off);
28231
28232                   frame_off = -end_save;
28233                   if (TARGET_32BIT)
28234                     emit_insn (gen_addsi3_carry (frame_reg_rtx,
28235                                                  ptr_reg, offset));
28236                   else
28237                     emit_insn (gen_adddi3_carry (frame_reg_rtx,
28238                                                  ptr_reg, offset));
28239                 }
28240               else
28241                 {
28242                   frame_off = ptr_off;
28243                   emit_move_insn (frame_reg_rtx, ptr_reg);
28244                 }
28245             }
28246         }
28247       else
28248         {
28249           for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
28250             if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
28251               {
28252                 rtx addr, areg, mem, insn;
28253                 rtx reg = gen_rtx_REG (V4SImode, i);
28254                 HOST_WIDE_INT offset
28255                   = (info->altivec_save_offset + frame_off
28256                      + 16 * (i - info->first_altivec_reg_save));
28257
28258                 if (TARGET_P9_VECTOR && quad_address_offset_p (offset))
28259                   {
28260                     mem = gen_frame_mem (V4SImode,
28261                                          gen_rtx_PLUS (Pmode, frame_reg_rtx,
28262                                                        GEN_INT (offset)));
28263                     insn = gen_rtx_SET (reg, mem);
28264                   }
28265                 else
28266                   {
28267                     areg = gen_rtx_REG (Pmode, 0);
28268                     emit_move_insn (areg, GEN_INT (offset));
28269
28270                     /* AltiVec addressing mode is [reg+reg].  */
28271                     addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
28272                     mem = gen_frame_mem (V4SImode, addr);
28273
28274                     /* Rather than emitting a generic move, force use of the
28275                        lvx instruction, which we always want.  In particular we
28276                        don't want lxvd2x/xxpermdi for little endian.  */
28277                     insn = gen_altivec_lvx_v4si_internal (reg, mem);
28278                   }
28279
28280                 (void) emit_insn (insn);
28281               }
28282         }
28283
28284       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
28285         if (((strategy & REST_INLINE_VRS) == 0
28286              || (info->vrsave_mask & ALTIVEC_REG_BIT (i)) != 0)
28287             && (DEFAULT_ABI == ABI_V4 || flag_shrink_wrap)
28288             && save_reg_p (i))
28289           {
28290             rtx reg = gen_rtx_REG (V4SImode, i);
28291             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
28292           }
28293     }
28294
28295   /* Restore VRSAVE if we have not done so already.  */
28296   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
28297       && info->vrsave_size != 0
28298       && (DEFAULT_ABI == ABI_V4
28299           || !offset_below_red_zone_p (info->vrsave_save_offset)))
28300     {
28301       rtx reg;
28302
28303       reg = gen_rtx_REG (SImode, 12);
28304       emit_insn (gen_frame_load (reg, frame_reg_rtx,
28305                                  info->vrsave_save_offset + frame_off));
28306
28307       emit_insn (generate_set_vrsave (reg, info, 1));
28308     }
28309
28310   /* If we exit by an out-of-line restore function on ABI_V4 then that
28311      function will deallocate the stack, so we don't need to worry
28312      about the unwinder restoring cr from an invalid stack frame
28313      location.  */
28314   bool exit_func = (!restoring_FPRs_inline
28315                     || (!restoring_GPRs_inline
28316                         && info->first_fp_reg_save == 64));
28317
28318   /* In the ELFv2 ABI we need to restore all call-saved CR fields from
28319      *separate* slots if the routine calls __builtin_eh_return, so
28320      that they can be independently restored by the unwinder.  */
28321   if (DEFAULT_ABI == ABI_ELFv2 && crtl->calls_eh_return)
28322     {
28323       int i, cr_off = info->ehcr_offset;
28324
28325       for (i = 0; i < 8; i++)
28326         if (!call_used_regs[CR0_REGNO + i])
28327           {
28328             rtx reg = gen_rtx_REG (SImode, 0);
28329             emit_insn (gen_frame_load (reg, frame_reg_rtx,
28330                                        cr_off + frame_off));
28331
28332             insn = emit_insn (gen_movsi_to_cr_one
28333                                 (gen_rtx_REG (CCmode, CR0_REGNO + i), reg));
28334
28335             if (!exit_func && flag_shrink_wrap)
28336               {
28337                 add_reg_note (insn, REG_CFA_RESTORE,
28338                               gen_rtx_REG (SImode, CR0_REGNO + i));
28339
28340                 RTX_FRAME_RELATED_P (insn) = 1;
28341               }
28342
28343             cr_off += reg_size;
28344           }
28345     }
28346
28347   /* Get the old lr if we saved it.  If we are restoring registers
28348      out-of-line, then the out-of-line routines can do this for us.  */
28349   if (restore_lr && restoring_GPRs_inline)
28350     load_lr_save (0, frame_reg_rtx, info->lr_save_offset + frame_off);
28351
28352   /* Get the old cr if we saved it.  */
28353   if (info->cr_save_p)
28354     {
28355       unsigned cr_save_regno = 12;
28356
28357       if (!restoring_GPRs_inline)
28358         {
28359           /* Ensure we don't use the register used by the out-of-line
28360              gpr register restore below.  */
28361           bool lr = info->gp_save_offset + info->gp_size == 0;
28362           int sel = SAVRES_GPR | (lr ? SAVRES_LR : 0);
28363           int gpr_ptr_regno = ptr_regno_for_savres (sel);
28364
28365           if (gpr_ptr_regno == 12)
28366             cr_save_regno = 11;
28367           gcc_checking_assert (REGNO (frame_reg_rtx) != cr_save_regno);
28368         }
28369       else if (REGNO (frame_reg_rtx) == 12)
28370         cr_save_regno = 11;
28371
28372       cr_save_reg = load_cr_save (cr_save_regno, frame_reg_rtx,
28373                                   info->cr_save_offset + frame_off,
28374                                   exit_func);
28375     }
28376
28377   /* Set LR here to try to overlap restores below.  */
28378   if (restore_lr && restoring_GPRs_inline)
28379     restore_saved_lr (0, exit_func);
28380
28381   /* Load exception handler data registers, if needed.  */
28382   if (epilogue_type == EPILOGUE_TYPE_EH_RETURN)
28383     {
28384       unsigned int i, regno;
28385
28386       if (TARGET_AIX)
28387         {
28388           rtx reg = gen_rtx_REG (reg_mode, 2);
28389           emit_insn (gen_frame_load (reg, frame_reg_rtx,
28390                                      frame_off + RS6000_TOC_SAVE_SLOT));
28391         }
28392
28393       for (i = 0; ; ++i)
28394         {
28395           rtx mem;
28396
28397           regno = EH_RETURN_DATA_REGNO (i);
28398           if (regno == INVALID_REGNUM)
28399             break;
28400
28401           mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
28402                                       info->ehrd_offset + frame_off
28403                                       + reg_size * (int) i);
28404
28405           emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
28406         }
28407     }
28408
28409   /* Restore GPRs.  This is done as a PARALLEL if we are using
28410      the load-multiple instructions.  */
28411   if (!restoring_GPRs_inline)
28412     {
28413       /* We are jumping to an out-of-line function.  */
28414       rtx ptr_reg;
28415       int end_save = info->gp_save_offset + info->gp_size;
28416       bool can_use_exit = end_save == 0;
28417       int sel = SAVRES_GPR | (can_use_exit ? SAVRES_LR : 0);
28418       int ptr_off;
28419
28420       /* Emit stack reset code if we need it.  */
28421       ptr_regno = ptr_regno_for_savres (sel);
28422       ptr_reg = gen_rtx_REG (Pmode, ptr_regno);
28423       if (can_use_exit)
28424         rs6000_emit_stack_reset (frame_reg_rtx, frame_off, ptr_regno);
28425       else if (end_save + frame_off != 0)
28426         emit_insn (gen_add3_insn (ptr_reg, frame_reg_rtx,
28427                                   GEN_INT (end_save + frame_off)));
28428       else if (REGNO (frame_reg_rtx) != ptr_regno)
28429         emit_move_insn (ptr_reg, frame_reg_rtx);
28430       if (REGNO (frame_reg_rtx) == ptr_regno)
28431         frame_off = -end_save;
28432
28433       if (can_use_exit && info->cr_save_p)
28434         restore_saved_cr (cr_save_reg, using_mtcr_multiple, true);
28435
28436       ptr_off = -end_save;
28437       rs6000_emit_savres_rtx (info, ptr_reg,
28438                               info->gp_save_offset + ptr_off,
28439                               info->lr_save_offset + ptr_off,
28440                               reg_mode, sel);
28441     }
28442   else if (using_load_multiple)
28443     {
28444       rtvec p;
28445       p = rtvec_alloc (32 - info->first_gp_reg_save);
28446       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
28447         RTVEC_ELT (p, i)
28448           = gen_frame_load (gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
28449                             frame_reg_rtx,
28450                             info->gp_save_offset + frame_off + reg_size * i);
28451       emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
28452     }
28453   else
28454     {
28455       int offset = info->gp_save_offset + frame_off;
28456       for (i = info->first_gp_reg_save; i < 32; i++)
28457         {
28458           if (save_reg_p (i)
28459               && !cfun->machine->gpr_is_wrapped_separately[i])
28460             {
28461               rtx reg = gen_rtx_REG (reg_mode, i);
28462               emit_insn (gen_frame_load (reg, frame_reg_rtx, offset));
28463             }
28464
28465           offset += reg_size;
28466         }
28467     }
28468
28469   if (DEFAULT_ABI == ABI_V4 || flag_shrink_wrap)
28470     {
28471       /* If the frame pointer was used then we can't delay emitting
28472          a REG_CFA_DEF_CFA note.  This must happen on the insn that
28473          restores the frame pointer, r31.  We may have already emitted
28474          a REG_CFA_DEF_CFA note, but that's OK;  A duplicate is
28475          discarded by dwarf2cfi.c/dwarf2out.c, and in any case would
28476          be harmless if emitted.  */
28477       if (frame_pointer_needed)
28478         {
28479           insn = get_last_insn ();
28480           add_reg_note (insn, REG_CFA_DEF_CFA,
28481                         plus_constant (Pmode, frame_reg_rtx, frame_off));
28482           RTX_FRAME_RELATED_P (insn) = 1;
28483         }
28484
28485       /* Set up cfa_restores.  We always need these when
28486          shrink-wrapping.  If not shrink-wrapping then we only need
28487          the cfa_restore when the stack location is no longer valid.
28488          The cfa_restores must be emitted on or before the insn that
28489          invalidates the stack, and of course must not be emitted
28490          before the insn that actually does the restore.  The latter
28491          is why it is a bad idea to emit the cfa_restores as a group
28492          on the last instruction here that actually does a restore:
28493          That insn may be reordered with respect to others doing
28494          restores.  */
28495       if (flag_shrink_wrap
28496           && !restoring_GPRs_inline
28497           && info->first_fp_reg_save == 64)
28498         cfa_restores = add_crlr_cfa_restore (info, cfa_restores);
28499
28500       for (i = info->first_gp_reg_save; i < 32; i++)
28501         if (save_reg_p (i)
28502             && !cfun->machine->gpr_is_wrapped_separately[i])
28503           {
28504             rtx reg = gen_rtx_REG (reg_mode, i);
28505             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
28506           }
28507     }
28508
28509   if (!restoring_GPRs_inline
28510       && info->first_fp_reg_save == 64)
28511     {
28512       /* We are jumping to an out-of-line function.  */
28513       if (cfa_restores)
28514         emit_cfa_restores (cfa_restores);
28515       return;
28516     }
28517
28518   if (restore_lr && !restoring_GPRs_inline)
28519     {
28520       load_lr_save (0, frame_reg_rtx, info->lr_save_offset + frame_off);
28521       restore_saved_lr (0, exit_func);
28522     }
28523
28524   /* Restore fpr's if we need to do it without calling a function.  */
28525   if (restoring_FPRs_inline)
28526     {
28527       int offset = info->fp_save_offset + frame_off;
28528       for (i = info->first_fp_reg_save; i < 64; i++)
28529         {
28530           if (save_reg_p (i)
28531               && !cfun->machine->fpr_is_wrapped_separately[i - 32])
28532             {
28533               rtx reg = gen_rtx_REG (fp_reg_mode, i);
28534               emit_insn (gen_frame_load (reg, frame_reg_rtx, offset));
28535               if (DEFAULT_ABI == ABI_V4 || flag_shrink_wrap)
28536                 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
28537                                                cfa_restores);
28538             }
28539
28540           offset += fp_reg_size;
28541         }
28542     }
28543
28544   /* If we saved cr, restore it here.  Just those that were used.  */
28545   if (info->cr_save_p)
28546     restore_saved_cr (cr_save_reg, using_mtcr_multiple, exit_func);
28547
28548   /* If this is V.4, unwind the stack pointer after all of the loads
28549      have been done, or set up r11 if we are restoring fp out of line.  */
28550   ptr_regno = 1;
28551   if (!restoring_FPRs_inline)
28552     {
28553       bool lr = (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0;
28554       int sel = SAVRES_FPR | (lr ? SAVRES_LR : 0);
28555       ptr_regno = ptr_regno_for_savres (sel);
28556     }
28557
28558   insn = rs6000_emit_stack_reset (frame_reg_rtx, frame_off, ptr_regno);
28559   if (REGNO (frame_reg_rtx) == ptr_regno)
28560     frame_off = 0;
28561
28562   if (insn && restoring_FPRs_inline)
28563     {
28564       if (cfa_restores)
28565         {
28566           REG_NOTES (insn) = cfa_restores;
28567           cfa_restores = NULL_RTX;
28568         }
28569       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
28570       RTX_FRAME_RELATED_P (insn) = 1;
28571     }
28572
28573   if (epilogue_type == EPILOGUE_TYPE_EH_RETURN)
28574     {
28575       rtx sa = EH_RETURN_STACKADJ_RTX;
28576       emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx, sa));
28577     }
28578
28579   if (epilogue_type != EPILOGUE_TYPE_SIBCALL && restoring_FPRs_inline)
28580     {
28581       if (cfa_restores)
28582         {
28583           /* We can't hang the cfa_restores off a simple return,
28584              since the shrink-wrap code sometimes uses an existing
28585              return.  This means there might be a path from
28586              pre-prologue code to this return, and dwarf2cfi code
28587              wants the eh_frame unwinder state to be the same on
28588              all paths to any point.  So we need to emit the
28589              cfa_restores before the return.  For -m64 we really
28590              don't need epilogue cfa_restores at all, except for
28591              this irritating dwarf2cfi with shrink-wrap
28592              requirement;  The stack red-zone means eh_frame info
28593              from the prologue telling the unwinder to restore
28594              from the stack is perfectly good right to the end of
28595              the function.  */
28596           emit_insn (gen_blockage ());
28597           emit_cfa_restores (cfa_restores);
28598           cfa_restores = NULL_RTX;
28599         }
28600
28601       emit_jump_insn (targetm.gen_simple_return ());
28602     }
28603
28604   if (epilogue_type != EPILOGUE_TYPE_SIBCALL && !restoring_FPRs_inline)
28605     {
28606       bool lr = (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0;
28607       rtvec p = rtvec_alloc (3 + !!lr + 64 - info->first_fp_reg_save);
28608       int elt = 0;
28609       RTVEC_ELT (p, elt++) = ret_rtx;
28610       if (lr)
28611         RTVEC_ELT (p, elt++) = gen_hard_reg_clobber (Pmode, LR_REGNO);
28612
28613       /* We have to restore more than two FP registers, so branch to the
28614          restore function.  It will return to our caller.  */
28615       int i;
28616       int reg;
28617       rtx sym;
28618
28619       if (flag_shrink_wrap)
28620         cfa_restores = add_crlr_cfa_restore (info, cfa_restores);
28621
28622       sym = rs6000_savres_routine_sym (info, SAVRES_FPR | (lr ? SAVRES_LR : 0));
28623       RTVEC_ELT (p, elt++) = gen_rtx_USE (VOIDmode, sym);
28624       reg = (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)? 1 : 11;
28625       RTVEC_ELT (p, elt++) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, reg));
28626
28627       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
28628         {
28629           rtx reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
28630
28631           RTVEC_ELT (p, elt++)
28632             = gen_frame_load (reg, sp_reg_rtx, info->fp_save_offset + 8 * i);
28633           if (flag_shrink_wrap
28634               && save_reg_p (info->first_fp_reg_save + i))
28635             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
28636         }
28637
28638       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
28639     }
28640
28641   if (cfa_restores)
28642     {
28643       if (epilogue_type == EPILOGUE_TYPE_SIBCALL)
28644         /* Ensure the cfa_restores are hung off an insn that won't
28645            be reordered above other restores.  */
28646         emit_insn (gen_blockage ());
28647
28648       emit_cfa_restores (cfa_restores);
28649     }
28650 }
28651
28652 /* Write function epilogue.  */
28653
28654 static void
28655 rs6000_output_function_epilogue (FILE *file)
28656 {
28657 #if TARGET_MACHO
28658   macho_branch_islands ();
28659
28660   {
28661     rtx_insn *insn = get_last_insn ();
28662     rtx_insn *deleted_debug_label = NULL;
28663
28664     /* Mach-O doesn't support labels at the end of objects, so if
28665        it looks like we might want one, take special action.
28666
28667        First, collect any sequence of deleted debug labels.  */
28668     while (insn
28669            && NOTE_P (insn)
28670            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
28671       {
28672         /* Don't insert a nop for NOTE_INSN_DELETED_DEBUG_LABEL
28673            notes only, instead set their CODE_LABEL_NUMBER to -1,
28674            otherwise there would be code generation differences
28675            in between -g and -g0.  */
28676         if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_DELETED_DEBUG_LABEL)
28677           deleted_debug_label = insn;
28678         insn = PREV_INSN (insn);
28679       }
28680
28681     /* Second, if we have:
28682        label:
28683          barrier
28684        then this needs to be detected, so skip past the barrier.  */
28685
28686     if (insn && BARRIER_P (insn))
28687       insn = PREV_INSN (insn);
28688
28689     /* Up to now we've only seen notes or barriers.  */
28690     if (insn)
28691       {
28692         if (LABEL_P (insn)
28693             || (NOTE_P (insn)
28694                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL))
28695           /* Trailing label: <barrier>.  */
28696           fputs ("\tnop\n", file);
28697         else
28698           {
28699             /* Lastly, see if we have a completely empty function body.  */
28700             while (insn && ! INSN_P (insn))
28701               insn = PREV_INSN (insn);
28702             /* If we don't find any insns, we've got an empty function body;
28703                I.e. completely empty - without a return or branch.  This is
28704                taken as the case where a function body has been removed
28705                because it contains an inline __builtin_unreachable().  GCC
28706                states that reaching __builtin_unreachable() means UB so we're
28707                not obliged to do anything special; however, we want
28708                non-zero-sized function bodies.  To meet this, and help the
28709                user out, let's trap the case.  */
28710             if (insn == NULL)
28711               fputs ("\ttrap\n", file);
28712           }
28713       }
28714     else if (deleted_debug_label)
28715       for (insn = deleted_debug_label; insn; insn = NEXT_INSN (insn))
28716         if (NOTE_KIND (insn) == NOTE_INSN_DELETED_DEBUG_LABEL)
28717           CODE_LABEL_NUMBER (insn) = -1;
28718   }
28719 #endif
28720
28721   /* Output a traceback table here.  See /usr/include/sys/debug.h for info
28722      on its format.
28723
28724      We don't output a traceback table if -finhibit-size-directive was
28725      used.  The documentation for -finhibit-size-directive reads
28726      ``don't output a @code{.size} assembler directive, or anything
28727      else that would cause trouble if the function is split in the
28728      middle, and the two halves are placed at locations far apart in
28729      memory.''  The traceback table has this property, since it
28730      includes the offset from the start of the function to the
28731      traceback table itself.
28732
28733      System V.4 Powerpc's (and the embedded ABI derived from it) use a
28734      different traceback table.  */
28735   if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
28736       && ! flag_inhibit_size_directive
28737       && rs6000_traceback != traceback_none && !cfun->is_thunk)
28738     {
28739       const char *fname = NULL;
28740       const char *language_string = lang_hooks.name;
28741       int fixed_parms = 0, float_parms = 0, parm_info = 0;
28742       int i;
28743       int optional_tbtab;
28744       rs6000_stack_t *info = rs6000_stack_info ();
28745
28746       if (rs6000_traceback == traceback_full)
28747         optional_tbtab = 1;
28748       else if (rs6000_traceback == traceback_part)
28749         optional_tbtab = 0;
28750       else
28751         optional_tbtab = !optimize_size && !TARGET_ELF;
28752
28753       if (optional_tbtab)
28754         {
28755           fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
28756           while (*fname == '.') /* V.4 encodes . in the name */
28757             fname++;
28758
28759           /* Need label immediately before tbtab, so we can compute
28760              its offset from the function start.  */
28761           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
28762           ASM_OUTPUT_LABEL (file, fname);
28763         }
28764
28765       /* The .tbtab pseudo-op can only be used for the first eight
28766          expressions, since it can't handle the possibly variable
28767          length fields that follow.  However, if you omit the optional
28768          fields, the assembler outputs zeros for all optional fields
28769          anyways, giving each variable length field is minimum length
28770          (as defined in sys/debug.h).  Thus we cannot use the .tbtab
28771          pseudo-op at all.  */
28772
28773       /* An all-zero word flags the start of the tbtab, for debuggers
28774          that have to find it by searching forward from the entry
28775          point or from the current pc.  */
28776       fputs ("\t.long 0\n", file);
28777
28778       /* Tbtab format type.  Use format type 0.  */
28779       fputs ("\t.byte 0,", file);
28780
28781       /* Language type.  Unfortunately, there does not seem to be any
28782          official way to discover the language being compiled, so we
28783          use language_string.
28784          C is 0.  Fortran is 1.  Ada is 3.  C++ is 9.
28785          Java is 13.  Objective-C is 14.  Objective-C++ isn't assigned
28786          a number, so for now use 9.  LTO, Go, D, and JIT aren't assigned
28787          numbers either, so for now use 0.  */
28788       if (lang_GNU_C ()
28789           || ! strcmp (language_string, "GNU GIMPLE")
28790           || ! strcmp (language_string, "GNU Go")
28791           || ! strcmp (language_string, "GNU D")
28792           || ! strcmp (language_string, "libgccjit"))
28793         i = 0;
28794       else if (! strcmp (language_string, "GNU F77")
28795                || lang_GNU_Fortran ())
28796         i = 1;
28797       else if (! strcmp (language_string, "GNU Ada"))
28798         i = 3;
28799       else if (lang_GNU_CXX ()
28800                || ! strcmp (language_string, "GNU Objective-C++"))
28801         i = 9;
28802       else if (! strcmp (language_string, "GNU Java"))
28803         i = 13;
28804       else if (! strcmp (language_string, "GNU Objective-C"))
28805         i = 14;
28806       else
28807         gcc_unreachable ();
28808       fprintf (file, "%d,", i);
28809
28810       /* 8 single bit fields: global linkage (not set for C extern linkage,
28811          apparently a PL/I convention?), out-of-line epilogue/prologue, offset
28812          from start of procedure stored in tbtab, internal function, function
28813          has controlled storage, function has no toc, function uses fp,
28814          function logs/aborts fp operations.  */
28815       /* Assume that fp operations are used if any fp reg must be saved.  */
28816       fprintf (file, "%d,",
28817                (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
28818
28819       /* 6 bitfields: function is interrupt handler, name present in
28820          proc table, function calls alloca, on condition directives
28821          (controls stack walks, 3 bits), saves condition reg, saves
28822          link reg.  */
28823       /* The `function calls alloca' bit seems to be set whenever reg 31 is
28824          set up as a frame pointer, even when there is no alloca call.  */
28825       fprintf (file, "%d,",
28826                ((optional_tbtab << 6)
28827                 | ((optional_tbtab & frame_pointer_needed) << 5)
28828                 | (info->cr_save_p << 1)
28829                 | (info->lr_save_p)));
28830
28831       /* 3 bitfields: saves backchain, fixup code, number of fpr saved
28832          (6 bits).  */
28833       fprintf (file, "%d,",
28834                (info->push_p << 7) | (64 - info->first_fp_reg_save));
28835
28836       /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits).  */
28837       fprintf (file, "%d,", (32 - first_reg_to_save ()));
28838
28839       if (optional_tbtab)
28840         {
28841           /* Compute the parameter info from the function decl argument
28842              list.  */
28843           tree decl;
28844           int next_parm_info_bit = 31;
28845
28846           for (decl = DECL_ARGUMENTS (current_function_decl);
28847                decl; decl = DECL_CHAIN (decl))
28848             {
28849               rtx parameter = DECL_INCOMING_RTL (decl);
28850               machine_mode mode = GET_MODE (parameter);
28851
28852               if (REG_P (parameter))
28853                 {
28854                   if (SCALAR_FLOAT_MODE_P (mode))
28855                     {
28856                       int bits;
28857
28858                       float_parms++;
28859
28860                       switch (mode)
28861                         {
28862                         case E_SFmode:
28863                         case E_SDmode:
28864                           bits = 0x2;
28865                           break;
28866
28867                         case E_DFmode:
28868                         case E_DDmode:
28869                         case E_TFmode:
28870                         case E_TDmode:
28871                         case E_IFmode:
28872                         case E_KFmode:
28873                           bits = 0x3;
28874                           break;
28875
28876                         default:
28877                           gcc_unreachable ();
28878                         }
28879
28880                       /* If only one bit will fit, don't or in this entry.  */
28881                       if (next_parm_info_bit > 0)
28882                         parm_info |= (bits << (next_parm_info_bit - 1));
28883                       next_parm_info_bit -= 2;
28884                     }
28885                   else
28886                     {
28887                       fixed_parms += ((GET_MODE_SIZE (mode)
28888                                        + (UNITS_PER_WORD - 1))
28889                                       / UNITS_PER_WORD);
28890                       next_parm_info_bit -= 1;
28891                     }
28892                 }
28893             }
28894         }
28895
28896       /* Number of fixed point parameters.  */
28897       /* This is actually the number of words of fixed point parameters; thus
28898          an 8 byte struct counts as 2; and thus the maximum value is 8.  */
28899       fprintf (file, "%d,", fixed_parms);
28900
28901       /* 2 bitfields: number of floating point parameters (7 bits), parameters
28902          all on stack.  */
28903       /* This is actually the number of fp registers that hold parameters;
28904          and thus the maximum value is 13.  */
28905       /* Set parameters on stack bit if parameters are not in their original
28906          registers, regardless of whether they are on the stack?  Xlc
28907          seems to set the bit when not optimizing.  */
28908       fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
28909
28910       if (optional_tbtab)
28911         {
28912           /* Optional fields follow.  Some are variable length.  */
28913
28914           /* Parameter types, left adjusted bit fields: 0 fixed, 10 single
28915              float, 11 double float.  */
28916           /* There is an entry for each parameter in a register, in the order
28917              that they occur in the parameter list.  Any intervening arguments
28918              on the stack are ignored.  If the list overflows a long (max
28919              possible length 34 bits) then completely leave off all elements
28920              that don't fit.  */
28921           /* Only emit this long if there was at least one parameter.  */
28922           if (fixed_parms || float_parms)
28923             fprintf (file, "\t.long %d\n", parm_info);
28924
28925           /* Offset from start of code to tb table.  */
28926           fputs ("\t.long ", file);
28927           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
28928           RS6000_OUTPUT_BASENAME (file, fname);
28929           putc ('-', file);
28930           rs6000_output_function_entry (file, fname);
28931           putc ('\n', file);
28932
28933           /* Interrupt handler mask.  */
28934           /* Omit this long, since we never set the interrupt handler bit
28935              above.  */
28936
28937           /* Number of CTL (controlled storage) anchors.  */
28938           /* Omit this long, since the has_ctl bit is never set above.  */
28939
28940           /* Displacement into stack of each CTL anchor.  */
28941           /* Omit this list of longs, because there are no CTL anchors.  */
28942
28943           /* Length of function name.  */
28944           if (*fname == '*')
28945             ++fname;
28946           fprintf (file, "\t.short %d\n", (int) strlen (fname));
28947
28948           /* Function name.  */
28949           assemble_string (fname, strlen (fname));
28950
28951           /* Register for alloca automatic storage; this is always reg 31.
28952              Only emit this if the alloca bit was set above.  */
28953           if (frame_pointer_needed)
28954             fputs ("\t.byte 31\n", file);
28955
28956           fputs ("\t.align 2\n", file);
28957         }
28958     }
28959
28960   /* Arrange to define .LCTOC1 label, if not already done.  */
28961   if (need_toc_init)
28962     {
28963       need_toc_init = 0;
28964       if (!toc_initialized)
28965         {
28966           switch_to_section (toc_section);
28967           switch_to_section (current_function_section ());
28968         }
28969     }
28970 }
28971
28972 /* -fsplit-stack support.  */
28973
28974 /* A SYMBOL_REF for __morestack.  */
28975 static GTY(()) rtx morestack_ref;
28976
28977 static rtx
28978 gen_add3_const (rtx rt, rtx ra, long c)
28979 {
28980   if (TARGET_64BIT)
28981     return gen_adddi3 (rt, ra, GEN_INT (c));
28982  else
28983     return gen_addsi3 (rt, ra, GEN_INT (c));
28984 }
28985
28986 /* Emit -fsplit-stack prologue, which goes before the regular function
28987    prologue (at local entry point in the case of ELFv2).  */
28988
28989 void
28990 rs6000_expand_split_stack_prologue (void)
28991 {
28992   rs6000_stack_t *info = rs6000_stack_info ();
28993   unsigned HOST_WIDE_INT allocate;
28994   long alloc_hi, alloc_lo;
28995   rtx r0, r1, r12, lr, ok_label, compare, jump, call_fusage;
28996   rtx_insn *insn;
28997
28998   gcc_assert (flag_split_stack && reload_completed);
28999
29000   if (!info->push_p)
29001     return;
29002
29003   if (global_regs[29])
29004     {
29005       error ("%qs uses register r29", "%<-fsplit-stack%>");
29006       inform (DECL_SOURCE_LOCATION (global_regs_decl[29]),
29007               "conflicts with %qD", global_regs_decl[29]);
29008     }
29009
29010   allocate = info->total_size;
29011   if (allocate > (unsigned HOST_WIDE_INT) 1 << 31)
29012     {
29013       sorry ("Stack frame larger than 2G is not supported for "
29014              "%<-fsplit-stack%>");
29015       return;
29016     }
29017   if (morestack_ref == NULL_RTX)
29018     {
29019       morestack_ref = gen_rtx_SYMBOL_REF (Pmode, "__morestack");
29020       SYMBOL_REF_FLAGS (morestack_ref) |= (SYMBOL_FLAG_LOCAL
29021                                            | SYMBOL_FLAG_FUNCTION);
29022     }
29023
29024   r0 = gen_rtx_REG (Pmode, 0);
29025   r1 = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
29026   r12 = gen_rtx_REG (Pmode, 12);
29027   emit_insn (gen_load_split_stack_limit (r0));
29028   /* Always emit two insns here to calculate the requested stack,
29029      so that the linker can edit them when adjusting size for calling
29030      non-split-stack code.  */
29031   alloc_hi = (-allocate + 0x8000) & ~0xffffL;
29032   alloc_lo = -allocate - alloc_hi;
29033   if (alloc_hi != 0)
29034     {
29035       emit_insn (gen_add3_const (r12, r1, alloc_hi));
29036       if (alloc_lo != 0)
29037         emit_insn (gen_add3_const (r12, r12, alloc_lo));
29038       else
29039         emit_insn (gen_nop ());
29040     }
29041   else
29042     {
29043       emit_insn (gen_add3_const (r12, r1, alloc_lo));
29044       emit_insn (gen_nop ());
29045     }
29046
29047   compare = gen_rtx_REG (CCUNSmode, CR7_REGNO);
29048   emit_insn (gen_rtx_SET (compare, gen_rtx_COMPARE (CCUNSmode, r12, r0)));
29049   ok_label = gen_label_rtx ();
29050   jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
29051                                gen_rtx_GEU (VOIDmode, compare, const0_rtx),
29052                                gen_rtx_LABEL_REF (VOIDmode, ok_label),
29053                                pc_rtx);
29054   insn = emit_jump_insn (gen_rtx_SET (pc_rtx, jump));
29055   JUMP_LABEL (insn) = ok_label;
29056   /* Mark the jump as very likely to be taken.  */
29057   add_reg_br_prob_note (insn, profile_probability::very_likely ());
29058
29059   lr = gen_rtx_REG (Pmode, LR_REGNO);
29060   insn = emit_move_insn (r0, lr);
29061   RTX_FRAME_RELATED_P (insn) = 1;
29062   insn = emit_insn (gen_frame_store (r0, r1, info->lr_save_offset));
29063   RTX_FRAME_RELATED_P (insn) = 1;
29064
29065   insn = emit_call_insn (gen_call (gen_rtx_MEM (SImode, morestack_ref),
29066                                    const0_rtx, const0_rtx));
29067   call_fusage = NULL_RTX;
29068   use_reg (&call_fusage, r12);
29069   /* Say the call uses r0, even though it doesn't, to stop regrename
29070      from twiddling with the insns saving lr, trashing args for cfun.
29071      The insns restoring lr are similarly protected by making
29072      split_stack_return use r0.  */
29073   use_reg (&call_fusage, r0);
29074   add_function_usage_to (insn, call_fusage);
29075   /* Indicate that this function can't jump to non-local gotos.  */
29076   make_reg_eh_region_note_nothrow_nononlocal (insn);
29077   emit_insn (gen_frame_load (r0, r1, info->lr_save_offset));
29078   insn = emit_move_insn (lr, r0);
29079   add_reg_note (insn, REG_CFA_RESTORE, lr);
29080   RTX_FRAME_RELATED_P (insn) = 1;
29081   emit_insn (gen_split_stack_return ());
29082
29083   emit_label (ok_label);
29084   LABEL_NUSES (ok_label) = 1;
29085 }
29086
29087 /* Return the internal arg pointer used for function incoming
29088    arguments.  When -fsplit-stack, the arg pointer is r12 so we need
29089    to copy it to a pseudo in order for it to be preserved over calls
29090    and suchlike.  We'd really like to use a pseudo here for the
29091    internal arg pointer but data-flow analysis is not prepared to
29092    accept pseudos as live at the beginning of a function.  */
29093
29094 static rtx
29095 rs6000_internal_arg_pointer (void)
29096 {
29097   if (flag_split_stack
29098      && (lookup_attribute ("no_split_stack", DECL_ATTRIBUTES (cfun->decl))
29099          == NULL))
29100
29101     {
29102       if (cfun->machine->split_stack_arg_pointer == NULL_RTX)
29103         {
29104           rtx pat;
29105
29106           cfun->machine->split_stack_arg_pointer = gen_reg_rtx (Pmode);
29107           REG_POINTER (cfun->machine->split_stack_arg_pointer) = 1;
29108
29109           /* Put the pseudo initialization right after the note at the
29110              beginning of the function.  */
29111           pat = gen_rtx_SET (cfun->machine->split_stack_arg_pointer,
29112                              gen_rtx_REG (Pmode, 12));
29113           push_topmost_sequence ();
29114           emit_insn_after (pat, get_insns ());
29115           pop_topmost_sequence ();
29116         }
29117       rtx ret = plus_constant (Pmode, cfun->machine->split_stack_arg_pointer,
29118                                FIRST_PARM_OFFSET (current_function_decl));
29119       return copy_to_reg (ret);
29120     }
29121   return virtual_incoming_args_rtx;
29122 }
29123
29124 /* We may have to tell the dataflow pass that the split stack prologue
29125    is initializing a register.  */
29126
29127 static void
29128 rs6000_live_on_entry (bitmap regs)
29129 {
29130   if (flag_split_stack)
29131     bitmap_set_bit (regs, 12);
29132 }
29133
29134 /* Emit -fsplit-stack dynamic stack allocation space check.  */
29135
29136 void
29137 rs6000_split_stack_space_check (rtx size, rtx label)
29138 {
29139   rtx sp = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
29140   rtx limit = gen_reg_rtx (Pmode);
29141   rtx requested = gen_reg_rtx (Pmode);
29142   rtx cmp = gen_reg_rtx (CCUNSmode);
29143   rtx jump;
29144
29145   emit_insn (gen_load_split_stack_limit (limit));
29146   if (CONST_INT_P (size))
29147     emit_insn (gen_add3_insn (requested, sp, GEN_INT (-INTVAL (size))));
29148   else
29149     {
29150       size = force_reg (Pmode, size);
29151       emit_move_insn (requested, gen_rtx_MINUS (Pmode, sp, size));
29152     }
29153   emit_insn (gen_rtx_SET (cmp, gen_rtx_COMPARE (CCUNSmode, requested, limit)));
29154   jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
29155                                gen_rtx_GEU (VOIDmode, cmp, const0_rtx),
29156                                gen_rtx_LABEL_REF (VOIDmode, label),
29157                                pc_rtx);
29158   jump = emit_jump_insn (gen_rtx_SET (pc_rtx, jump));
29159   JUMP_LABEL (jump) = label;
29160 }
29161 \f
29162 /* A C compound statement that outputs the assembler code for a thunk
29163    function, used to implement C++ virtual function calls with
29164    multiple inheritance.  The thunk acts as a wrapper around a virtual
29165    function, adjusting the implicit object parameter before handing
29166    control off to the real function.
29167
29168    First, emit code to add the integer DELTA to the location that
29169    contains the incoming first argument.  Assume that this argument
29170    contains a pointer, and is the one used to pass the `this' pointer
29171    in C++.  This is the incoming argument *before* the function
29172    prologue, e.g. `%o0' on a sparc.  The addition must preserve the
29173    values of all other incoming arguments.
29174
29175    After the addition, emit code to jump to FUNCTION, which is a
29176    `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
29177    not touch the return address.  Hence returning from FUNCTION will
29178    return to whoever called the current `thunk'.
29179
29180    The effect must be as if FUNCTION had been called directly with the
29181    adjusted first argument.  This macro is responsible for emitting
29182    all of the code for a thunk function; output_function_prologue()
29183    and output_function_epilogue() are not invoked.
29184
29185    The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
29186    been extracted from it.)  It might possibly be useful on some
29187    targets, but probably not.
29188
29189    If you do not define this macro, the target-independent code in the
29190    C++ frontend will generate a less efficient heavyweight thunk that
29191    calls FUNCTION instead of jumping to it.  The generic approach does
29192    not support varargs.  */
29193
29194 static void
29195 rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
29196                         HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
29197                         tree function)
29198 {
29199   const char *fnname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk_fndecl));
29200   rtx this_rtx, funexp;
29201   rtx_insn *insn;
29202
29203   reload_completed = 1;
29204   epilogue_completed = 1;
29205
29206   /* Mark the end of the (empty) prologue.  */
29207   emit_note (NOTE_INSN_PROLOGUE_END);
29208
29209   /* Find the "this" pointer.  If the function returns a structure,
29210      the structure return pointer is in r3.  */
29211   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
29212     this_rtx = gen_rtx_REG (Pmode, 4);
29213   else
29214     this_rtx = gen_rtx_REG (Pmode, 3);
29215
29216   /* Apply the constant offset, if required.  */
29217   if (delta)
29218     emit_insn (gen_add3_insn (this_rtx, this_rtx, GEN_INT (delta)));
29219
29220   /* Apply the offset from the vtable, if required.  */
29221   if (vcall_offset)
29222     {
29223       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
29224       rtx tmp = gen_rtx_REG (Pmode, 12);
29225
29226       emit_move_insn (tmp, gen_rtx_MEM (Pmode, this_rtx));
29227       if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
29228         {
29229           emit_insn (gen_add3_insn (tmp, tmp, vcall_offset_rtx));
29230           emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
29231         }
29232       else
29233         {
29234           rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
29235
29236           emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
29237         }
29238       emit_insn (gen_add3_insn (this_rtx, this_rtx, tmp));
29239     }
29240
29241   /* Generate a tail call to the target function.  */
29242   if (!TREE_USED (function))
29243     {
29244       assemble_external (function);
29245       TREE_USED (function) = 1;
29246     }
29247   funexp = XEXP (DECL_RTL (function), 0);
29248   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
29249
29250 #if TARGET_MACHO
29251   if (MACHOPIC_INDIRECT)
29252     funexp = machopic_indirect_call_target (funexp);
29253 #endif
29254
29255   /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
29256      generate sibcall RTL explicitly.  */
29257   insn = emit_call_insn (
29258            gen_rtx_PARALLEL (VOIDmode,
29259              gen_rtvec (3,
29260                         gen_rtx_CALL (VOIDmode,
29261                                       funexp, const0_rtx),
29262                         gen_rtx_USE (VOIDmode, const0_rtx),
29263                         simple_return_rtx)));
29264   SIBLING_CALL_P (insn) = 1;
29265   emit_barrier ();
29266
29267   /* Run just enough of rest_of_compilation to get the insns emitted.
29268      There's not really enough bulk here to make other passes such as
29269      instruction scheduling worth while.  Note that use_thunk calls
29270      assemble_start_function and assemble_end_function.  */
29271   insn = get_insns ();
29272   shorten_branches (insn);
29273   assemble_start_function (thunk_fndecl, fnname);
29274   final_start_function (insn, file, 1);
29275   final (insn, file, 1);
29276   final_end_function ();
29277   assemble_end_function (thunk_fndecl, fnname);
29278
29279   reload_completed = 0;
29280   epilogue_completed = 0;
29281 }
29282 \f
29283 /* A quick summary of the various types of 'constant-pool tables'
29284    under PowerPC:
29285
29286    Target       Flags           Name            One table per
29287    AIX          (none)          AIX TOC         object file
29288    AIX          -mfull-toc      AIX TOC         object file
29289    AIX          -mminimal-toc   AIX minimal TOC translation unit
29290    SVR4/EABI    (none)          SVR4 SDATA      object file
29291    SVR4/EABI    -fpic           SVR4 pic        object file
29292    SVR4/EABI    -fPIC           SVR4 PIC        translation unit
29293    SVR4/EABI    -mrelocatable   EABI TOC        function
29294    SVR4/EABI    -maix           AIX TOC         object file
29295    SVR4/EABI    -maix -mminimal-toc
29296                                 AIX minimal TOC translation unit
29297
29298    Name                 Reg.    Set by  entries       contains:
29299                                         made by  addrs? fp?     sum?
29300
29301    AIX TOC              2       crt0    as       Y      option  option
29302    AIX minimal TOC      30      prolog  gcc      Y      Y       option
29303    SVR4 SDATA           13      crt0    gcc      N      Y       N
29304    SVR4 pic             30      prolog  ld       Y      not yet N
29305    SVR4 PIC             30      prolog  gcc      Y      option  option
29306    EABI TOC             30      prolog  gcc      Y      option  option
29307
29308 */
29309
29310 /* Hash functions for the hash table.  */
29311
29312 static unsigned
29313 rs6000_hash_constant (rtx k)
29314 {
29315   enum rtx_code code = GET_CODE (k);
29316   machine_mode mode = GET_MODE (k);
29317   unsigned result = (code << 3) ^ mode;
29318   const char *format;
29319   int flen, fidx;
29320
29321   format = GET_RTX_FORMAT (code);
29322   flen = strlen (format);
29323   fidx = 0;
29324
29325   switch (code)
29326     {
29327     case LABEL_REF:
29328       return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
29329
29330     case CONST_WIDE_INT:
29331       {
29332         int i;
29333         flen = CONST_WIDE_INT_NUNITS (k);
29334         for (i = 0; i < flen; i++)
29335           result = result * 613 + CONST_WIDE_INT_ELT (k, i);
29336         return result;
29337       }
29338
29339     case CONST_DOUBLE:
29340       return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
29341
29342     case CODE_LABEL:
29343       fidx = 3;
29344       break;
29345
29346     default:
29347       break;
29348     }
29349
29350   for (; fidx < flen; fidx++)
29351     switch (format[fidx])
29352       {
29353       case 's':
29354         {
29355           unsigned i, len;
29356           const char *str = XSTR (k, fidx);
29357           len = strlen (str);
29358           result = result * 613 + len;
29359           for (i = 0; i < len; i++)
29360             result = result * 613 + (unsigned) str[i];
29361           break;
29362         }
29363       case 'u':
29364       case 'e':
29365         result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
29366         break;
29367       case 'i':
29368       case 'n':
29369         result = result * 613 + (unsigned) XINT (k, fidx);
29370         break;
29371       case 'w':
29372         if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
29373           result = result * 613 + (unsigned) XWINT (k, fidx);
29374         else
29375           {
29376             size_t i;
29377             for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
29378               result = result * 613 + (unsigned) (XWINT (k, fidx)
29379                                                   >> CHAR_BIT * i);
29380           }
29381         break;
29382       case '0':
29383         break;
29384       default:
29385         gcc_unreachable ();
29386       }
29387
29388   return result;
29389 }
29390
29391 hashval_t
29392 toc_hasher::hash (toc_hash_struct *thc)
29393 {
29394   return rs6000_hash_constant (thc->key) ^ thc->key_mode;
29395 }
29396
29397 /* Compare H1 and H2 for equivalence.  */
29398
29399 bool
29400 toc_hasher::equal (toc_hash_struct *h1, toc_hash_struct *h2)
29401 {
29402   rtx r1 = h1->key;
29403   rtx r2 = h2->key;
29404
29405   if (h1->key_mode != h2->key_mode)
29406     return 0;
29407
29408   return rtx_equal_p (r1, r2);
29409 }
29410
29411 /* These are the names given by the C++ front-end to vtables, and
29412    vtable-like objects.  Ideally, this logic should not be here;
29413    instead, there should be some programmatic way of inquiring as
29414    to whether or not an object is a vtable.  */
29415
29416 #define VTABLE_NAME_P(NAME)                             \
29417   (strncmp ("_vt.", name, strlen ("_vt.")) == 0         \
29418   || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0       \
29419   || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0       \
29420   || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0       \
29421   || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
29422
29423 #ifdef NO_DOLLAR_IN_LABEL
29424 /* Return a GGC-allocated character string translating dollar signs in
29425    input NAME to underscores.  Used by XCOFF ASM_OUTPUT_LABELREF.  */
29426
29427 const char *
29428 rs6000_xcoff_strip_dollar (const char *name)
29429 {
29430   char *strip, *p;
29431   const char *q;
29432   size_t len;
29433
29434   q = (const char *) strchr (name, '$');
29435
29436   if (q == 0 || q == name)
29437     return name;
29438
29439   len = strlen (name);
29440   strip = XALLOCAVEC (char, len + 1);
29441   strcpy (strip, name);
29442   p = strip + (q - name);
29443   while (p)
29444     {
29445       *p = '_';
29446       p = strchr (p + 1, '$');
29447     }
29448
29449   return ggc_alloc_string (strip, len);
29450 }
29451 #endif
29452
29453 void
29454 rs6000_output_symbol_ref (FILE *file, rtx x)
29455 {
29456   const char *name = XSTR (x, 0);
29457
29458   /* Currently C++ toc references to vtables can be emitted before it
29459      is decided whether the vtable is public or private.  If this is
29460      the case, then the linker will eventually complain that there is
29461      a reference to an unknown section.  Thus, for vtables only,
29462      we emit the TOC reference to reference the identifier and not the
29463      symbol.  */
29464   if (VTABLE_NAME_P (name))
29465     {
29466       RS6000_OUTPUT_BASENAME (file, name);
29467     }
29468   else
29469     assemble_name (file, name);
29470 }
29471
29472 /* Output a TOC entry.  We derive the entry name from what is being
29473    written.  */
29474
29475 void
29476 output_toc (FILE *file, rtx x, int labelno, machine_mode mode)
29477 {
29478   char buf[256];
29479   const char *name = buf;
29480   rtx base = x;
29481   HOST_WIDE_INT offset = 0;
29482
29483   gcc_assert (!TARGET_NO_TOC);
29484
29485   /* When the linker won't eliminate them, don't output duplicate
29486      TOC entries (this happens on AIX if there is any kind of TOC,
29487      and on SVR4 under -fPIC or -mrelocatable).  Don't do this for
29488      CODE_LABELs.  */
29489   if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
29490     {
29491       struct toc_hash_struct *h;
29492
29493       /* Create toc_hash_table.  This can't be done at TARGET_OPTION_OVERRIDE
29494          time because GGC is not initialized at that point.  */
29495       if (toc_hash_table == NULL)
29496         toc_hash_table = hash_table<toc_hasher>::create_ggc (1021);
29497
29498       h = ggc_alloc<toc_hash_struct> ();
29499       h->key = x;
29500       h->key_mode = mode;
29501       h->labelno = labelno;
29502
29503       toc_hash_struct **found = toc_hash_table->find_slot (h, INSERT);
29504       if (*found == NULL)
29505         *found = h;
29506       else  /* This is indeed a duplicate.
29507                Set this label equal to that label.  */
29508         {
29509           fputs ("\t.set ", file);
29510           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
29511           fprintf (file, "%d,", labelno);
29512           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
29513           fprintf (file, "%d\n", ((*found)->labelno));
29514
29515 #ifdef HAVE_AS_TLS
29516           if (TARGET_XCOFF && SYMBOL_REF_P (x)
29517               && (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_GLOBAL_DYNAMIC
29518                   || SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC))
29519             {
29520               fputs ("\t.set ", file);
29521               ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LCM");
29522               fprintf (file, "%d,", labelno);
29523               ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LCM");
29524               fprintf (file, "%d\n", ((*found)->labelno));
29525             }
29526 #endif
29527           return;
29528         }
29529     }
29530
29531   /* If we're going to put a double constant in the TOC, make sure it's
29532      aligned properly when strict alignment is on.  */
29533   if ((CONST_DOUBLE_P (x) || CONST_WIDE_INT_P (x))
29534       && STRICT_ALIGNMENT
29535       && GET_MODE_BITSIZE (mode) >= 64
29536       && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
29537     ASM_OUTPUT_ALIGN (file, 3);
29538   }
29539
29540   (*targetm.asm_out.internal_label) (file, "LC", labelno);
29541
29542   /* Handle FP constants specially.  Note that if we have a minimal
29543      TOC, things we put here aren't actually in the TOC, so we can allow
29544      FP constants.  */
29545   if (CONST_DOUBLE_P (x)
29546       && (GET_MODE (x) == TFmode || GET_MODE (x) == TDmode
29547           || GET_MODE (x) == IFmode || GET_MODE (x) == KFmode))
29548     {
29549       long k[4];
29550
29551       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
29552         REAL_VALUE_TO_TARGET_DECIMAL128 (*CONST_DOUBLE_REAL_VALUE (x), k);
29553       else
29554         REAL_VALUE_TO_TARGET_LONG_DOUBLE (*CONST_DOUBLE_REAL_VALUE (x), k);
29555
29556       if (TARGET_64BIT)
29557         {
29558           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29559             fputs (DOUBLE_INT_ASM_OP, file);
29560           else
29561             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
29562                      k[0] & 0xffffffff, k[1] & 0xffffffff,
29563                      k[2] & 0xffffffff, k[3] & 0xffffffff);
29564           fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
29565                    k[WORDS_BIG_ENDIAN ? 0 : 1] & 0xffffffff,
29566                    k[WORDS_BIG_ENDIAN ? 1 : 0] & 0xffffffff,
29567                    k[WORDS_BIG_ENDIAN ? 2 : 3] & 0xffffffff,
29568                    k[WORDS_BIG_ENDIAN ? 3 : 2] & 0xffffffff);
29569           return;
29570         }
29571       else
29572         {
29573           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29574             fputs ("\t.long ", file);
29575           else
29576             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
29577                      k[0] & 0xffffffff, k[1] & 0xffffffff,
29578                      k[2] & 0xffffffff, k[3] & 0xffffffff);
29579           fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
29580                    k[0] & 0xffffffff, k[1] & 0xffffffff,
29581                    k[2] & 0xffffffff, k[3] & 0xffffffff);
29582           return;
29583         }
29584     }
29585   else if (CONST_DOUBLE_P (x)
29586            && (GET_MODE (x) == DFmode || GET_MODE (x) == DDmode))
29587     {
29588       long k[2];
29589
29590       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
29591         REAL_VALUE_TO_TARGET_DECIMAL64 (*CONST_DOUBLE_REAL_VALUE (x), k);
29592       else
29593         REAL_VALUE_TO_TARGET_DOUBLE (*CONST_DOUBLE_REAL_VALUE (x), k);
29594
29595       if (TARGET_64BIT)
29596         {
29597           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29598             fputs (DOUBLE_INT_ASM_OP, file);
29599           else
29600             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
29601                      k[0] & 0xffffffff, k[1] & 0xffffffff);
29602           fprintf (file, "0x%lx%08lx\n",
29603                    k[WORDS_BIG_ENDIAN ? 0 : 1] & 0xffffffff,
29604                    k[WORDS_BIG_ENDIAN ? 1 : 0] & 0xffffffff);
29605           return;
29606         }
29607       else
29608         {
29609           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29610             fputs ("\t.long ", file);
29611           else
29612             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
29613                      k[0] & 0xffffffff, k[1] & 0xffffffff);
29614           fprintf (file, "0x%lx,0x%lx\n",
29615                    k[0] & 0xffffffff, k[1] & 0xffffffff);
29616           return;
29617         }
29618     }
29619   else if (CONST_DOUBLE_P (x)
29620            && (GET_MODE (x) == SFmode || GET_MODE (x) == SDmode))
29621     {
29622       long l;
29623
29624       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
29625         REAL_VALUE_TO_TARGET_DECIMAL32 (*CONST_DOUBLE_REAL_VALUE (x), l);
29626       else
29627         REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), l);
29628
29629       if (TARGET_64BIT)
29630         {
29631           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29632             fputs (DOUBLE_INT_ASM_OP, file);
29633           else
29634             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
29635           if (WORDS_BIG_ENDIAN)
29636             fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
29637           else
29638             fprintf (file, "0x%lx\n", l & 0xffffffff);
29639           return;
29640         }
29641       else
29642         {
29643           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29644             fputs ("\t.long ", file);
29645           else
29646             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
29647           fprintf (file, "0x%lx\n", l & 0xffffffff);
29648           return;
29649         }
29650     }
29651   else if (GET_MODE (x) == VOIDmode && CONST_INT_P (x))
29652     {
29653       unsigned HOST_WIDE_INT low;
29654       HOST_WIDE_INT high;
29655
29656       low = INTVAL (x) & 0xffffffff;
29657       high = (HOST_WIDE_INT) INTVAL (x) >> 32;
29658
29659       /* TOC entries are always Pmode-sized, so when big-endian
29660          smaller integer constants in the TOC need to be padded.
29661          (This is still a win over putting the constants in
29662          a separate constant pool, because then we'd have
29663          to have both a TOC entry _and_ the actual constant.)
29664
29665          For a 32-bit target, CONST_INT values are loaded and shifted
29666          entirely within `low' and can be stored in one TOC entry.  */
29667
29668       /* It would be easy to make this work, but it doesn't now.  */
29669       gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
29670
29671       if (WORDS_BIG_ENDIAN && POINTER_SIZE > GET_MODE_BITSIZE (mode))
29672         {
29673           low |= high << 32;
29674           low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
29675           high = (HOST_WIDE_INT) low >> 32;
29676           low &= 0xffffffff;
29677         }
29678
29679       if (TARGET_64BIT)
29680         {
29681           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29682             fputs (DOUBLE_INT_ASM_OP, file);
29683           else
29684             fprintf (file, "\t.tc ID_%lx_%lx[TC],",
29685                      (long) high & 0xffffffff, (long) low & 0xffffffff);
29686           fprintf (file, "0x%lx%08lx\n",
29687                    (long) high & 0xffffffff, (long) low & 0xffffffff);
29688           return;
29689         }
29690       else
29691         {
29692           if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
29693             {
29694               if (TARGET_ELF || TARGET_MINIMAL_TOC)
29695                 fputs ("\t.long ", file);
29696               else
29697                 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
29698                          (long) high & 0xffffffff, (long) low & 0xffffffff);
29699               fprintf (file, "0x%lx,0x%lx\n",
29700                        (long) high & 0xffffffff, (long) low & 0xffffffff);
29701             }
29702           else
29703             {
29704               if (TARGET_ELF || TARGET_MINIMAL_TOC)
29705                 fputs ("\t.long ", file);
29706               else
29707                 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
29708               fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
29709             }
29710           return;
29711         }
29712     }
29713
29714   if (GET_CODE (x) == CONST)
29715     {
29716       gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS
29717                   && CONST_INT_P (XEXP (XEXP (x, 0), 1)));
29718
29719       base = XEXP (XEXP (x, 0), 0);
29720       offset = INTVAL (XEXP (XEXP (x, 0), 1));
29721     }
29722
29723   switch (GET_CODE (base))
29724     {
29725     case SYMBOL_REF:
29726       name = XSTR (base, 0);
29727       break;
29728
29729     case LABEL_REF:
29730       ASM_GENERATE_INTERNAL_LABEL (buf, "L",
29731                                    CODE_LABEL_NUMBER (XEXP (base, 0)));
29732       break;
29733
29734     case CODE_LABEL:
29735       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
29736       break;
29737
29738     default:
29739       gcc_unreachable ();
29740     }
29741
29742   if (TARGET_ELF || TARGET_MINIMAL_TOC)
29743     fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
29744   else
29745     {
29746       fputs ("\t.tc ", file);
29747       RS6000_OUTPUT_BASENAME (file, name);
29748
29749       if (offset < 0)
29750         fprintf (file, ".N" HOST_WIDE_INT_PRINT_UNSIGNED, - offset);
29751       else if (offset)
29752         fprintf (file, ".P" HOST_WIDE_INT_PRINT_UNSIGNED, offset);
29753
29754       /* Mark large TOC symbols on AIX with [TE] so they are mapped
29755          after other TOC symbols, reducing overflow of small TOC access
29756          to [TC] symbols.  */
29757       fputs (TARGET_XCOFF && TARGET_CMODEL != CMODEL_SMALL
29758              ? "[TE]," : "[TC],", file);
29759     }
29760
29761   /* Currently C++ toc references to vtables can be emitted before it
29762      is decided whether the vtable is public or private.  If this is
29763      the case, then the linker will eventually complain that there is
29764      a TOC reference to an unknown section.  Thus, for vtables only,
29765      we emit the TOC reference to reference the symbol and not the
29766      section.  */
29767   if (VTABLE_NAME_P (name))
29768     {
29769       RS6000_OUTPUT_BASENAME (file, name);
29770       if (offset < 0)
29771         fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset);
29772       else if (offset > 0)
29773         fprintf (file, "+" HOST_WIDE_INT_PRINT_DEC, offset);
29774     }
29775   else
29776     output_addr_const (file, x);
29777
29778 #if HAVE_AS_TLS
29779   if (TARGET_XCOFF && SYMBOL_REF_P (base))
29780     {
29781       switch (SYMBOL_REF_TLS_MODEL (base))
29782         {
29783         case 0:
29784           break;
29785         case TLS_MODEL_LOCAL_EXEC:
29786           fputs ("@le", file);
29787           break;
29788         case TLS_MODEL_INITIAL_EXEC:
29789           fputs ("@ie", file);
29790           break;
29791         /* Use global-dynamic for local-dynamic.  */
29792         case TLS_MODEL_GLOBAL_DYNAMIC:
29793         case TLS_MODEL_LOCAL_DYNAMIC:
29794           putc ('\n', file);
29795           (*targetm.asm_out.internal_label) (file, "LCM", labelno);
29796           fputs ("\t.tc .", file);
29797           RS6000_OUTPUT_BASENAME (file, name);
29798           fputs ("[TC],", file);
29799           output_addr_const (file, x);
29800           fputs ("@m", file);
29801           break;
29802         default:
29803           gcc_unreachable ();
29804         }
29805     }
29806 #endif
29807
29808   putc ('\n', file);
29809 }
29810 \f
29811 /* Output an assembler pseudo-op to write an ASCII string of N characters
29812    starting at P to FILE.
29813
29814    On the RS/6000, we have to do this using the .byte operation and
29815    write out special characters outside the quoted string.
29816    Also, the assembler is broken; very long strings are truncated,
29817    so we must artificially break them up early.  */
29818
29819 void
29820 output_ascii (FILE *file, const char *p, int n)
29821 {
29822   char c;
29823   int i, count_string;
29824   const char *for_string = "\t.byte \"";
29825   const char *for_decimal = "\t.byte ";
29826   const char *to_close = NULL;
29827
29828   count_string = 0;
29829   for (i = 0; i < n; i++)
29830     {
29831       c = *p++;
29832       if (c >= ' ' && c < 0177)
29833         {
29834           if (for_string)
29835             fputs (for_string, file);
29836           putc (c, file);
29837
29838           /* Write two quotes to get one.  */
29839           if (c == '"')
29840             {
29841               putc (c, file);
29842               ++count_string;
29843             }
29844
29845           for_string = NULL;
29846           for_decimal = "\"\n\t.byte ";
29847           to_close = "\"\n";
29848           ++count_string;
29849
29850           if (count_string >= 512)
29851             {
29852               fputs (to_close, file);
29853
29854               for_string = "\t.byte \"";
29855               for_decimal = "\t.byte ";
29856               to_close = NULL;
29857               count_string = 0;
29858             }
29859         }
29860       else
29861         {
29862           if (for_decimal)
29863             fputs (for_decimal, file);
29864           fprintf (file, "%d", c);
29865
29866           for_string = "\n\t.byte \"";
29867           for_decimal = ", ";
29868           to_close = "\n";
29869           count_string = 0;
29870         }
29871     }
29872
29873   /* Now close the string if we have written one.  Then end the line.  */
29874   if (to_close)
29875     fputs (to_close, file);
29876 }
29877 \f
29878 /* Generate a unique section name for FILENAME for a section type
29879    represented by SECTION_DESC.  Output goes into BUF.
29880
29881    SECTION_DESC can be any string, as long as it is different for each
29882    possible section type.
29883
29884    We name the section in the same manner as xlc.  The name begins with an
29885    underscore followed by the filename (after stripping any leading directory
29886    names) with the last period replaced by the string SECTION_DESC.  If
29887    FILENAME does not contain a period, SECTION_DESC is appended to the end of
29888    the name.  */
29889
29890 void
29891 rs6000_gen_section_name (char **buf, const char *filename,
29892                          const char *section_desc)
29893 {
29894   const char *q, *after_last_slash, *last_period = 0;
29895   char *p;
29896   int len;
29897
29898   after_last_slash = filename;
29899   for (q = filename; *q; q++)
29900     {
29901       if (*q == '/')
29902         after_last_slash = q + 1;
29903       else if (*q == '.')
29904         last_period = q;
29905     }
29906
29907   len = strlen (after_last_slash) + strlen (section_desc) + 2;
29908   *buf = (char *) xmalloc (len);
29909
29910   p = *buf;
29911   *p++ = '_';
29912
29913   for (q = after_last_slash; *q; q++)
29914     {
29915       if (q == last_period)
29916         {
29917           strcpy (p, section_desc);
29918           p += strlen (section_desc);
29919           break;
29920         }
29921
29922       else if (ISALNUM (*q))
29923         *p++ = *q;
29924     }
29925
29926   if (last_period == 0)
29927     strcpy (p, section_desc);
29928   else
29929     *p = '\0';
29930 }
29931 \f
29932 /* Emit profile function.  */
29933
29934 void
29935 output_profile_hook (int labelno ATTRIBUTE_UNUSED)
29936 {
29937   /* Non-standard profiling for kernels, which just saves LR then calls
29938      _mcount without worrying about arg saves.  The idea is to change
29939      the function prologue as little as possible as it isn't easy to
29940      account for arg save/restore code added just for _mcount.  */
29941   if (TARGET_PROFILE_KERNEL)
29942     return;
29943
29944   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
29945     {
29946 #ifndef NO_PROFILE_COUNTERS
29947 # define NO_PROFILE_COUNTERS 0
29948 #endif
29949       if (NO_PROFILE_COUNTERS)
29950         emit_library_call (init_one_libfunc (RS6000_MCOUNT),
29951                            LCT_NORMAL, VOIDmode);
29952       else
29953         {
29954           char buf[30];
29955           const char *label_name;
29956           rtx fun;
29957
29958           ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
29959           label_name = ggc_strdup ((*targetm.strip_name_encoding) (buf));
29960           fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
29961
29962           emit_library_call (init_one_libfunc (RS6000_MCOUNT),
29963                              LCT_NORMAL, VOIDmode, fun, Pmode);
29964         }
29965     }
29966   else if (DEFAULT_ABI == ABI_DARWIN)
29967     {
29968       const char *mcount_name = RS6000_MCOUNT;
29969       int caller_addr_regno = LR_REGNO;
29970
29971       /* Be conservative and always set this, at least for now.  */
29972       crtl->uses_pic_offset_table = 1;
29973
29974 #if TARGET_MACHO
29975       /* For PIC code, set up a stub and collect the caller's address
29976          from r0, which is where the prologue puts it.  */
29977       if (MACHOPIC_INDIRECT
29978           && crtl->uses_pic_offset_table)
29979         caller_addr_regno = 0;
29980 #endif
29981       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
29982                          LCT_NORMAL, VOIDmode,
29983                          gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
29984     }
29985 }
29986
29987 /* Write function profiler code.  */
29988
29989 void
29990 output_function_profiler (FILE *file, int labelno)
29991 {
29992   char buf[100];
29993
29994   switch (DEFAULT_ABI)
29995     {
29996     default:
29997       gcc_unreachable ();
29998
29999     case ABI_V4:
30000       if (!TARGET_32BIT)
30001         {
30002           warning (0, "no profiling of 64-bit code for this ABI");
30003           return;
30004         }
30005       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
30006       fprintf (file, "\tmflr %s\n", reg_names[0]);
30007       if (NO_PROFILE_COUNTERS)
30008         {
30009           asm_fprintf (file, "\tstw %s,4(%s)\n",
30010                        reg_names[0], reg_names[1]);
30011         }
30012       else if (TARGET_SECURE_PLT && flag_pic)
30013         {
30014           if (TARGET_LINK_STACK)
30015             {
30016               char name[32];
30017               get_ppc476_thunk_name (name);
30018               asm_fprintf (file, "\tbl %s\n", name);
30019             }
30020           else
30021             asm_fprintf (file, "\tbcl 20,31,1f\n1:\n");
30022           asm_fprintf (file, "\tstw %s,4(%s)\n",
30023                        reg_names[0], reg_names[1]);
30024           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
30025           asm_fprintf (file, "\taddis %s,%s,",
30026                        reg_names[12], reg_names[12]);
30027           assemble_name (file, buf);
30028           asm_fprintf (file, "-1b@ha\n\tla %s,", reg_names[0]);
30029           assemble_name (file, buf);
30030           asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
30031         }
30032       else if (flag_pic == 1)
30033         {
30034           fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
30035           asm_fprintf (file, "\tstw %s,4(%s)\n",
30036                        reg_names[0], reg_names[1]);
30037           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
30038           asm_fprintf (file, "\tlwz %s,", reg_names[0]);
30039           assemble_name (file, buf);
30040           asm_fprintf (file, "@got(%s)\n", reg_names[12]);
30041         }
30042       else if (flag_pic > 1)
30043         {
30044           asm_fprintf (file, "\tstw %s,4(%s)\n",
30045                        reg_names[0], reg_names[1]);
30046           /* Now, we need to get the address of the label.  */
30047           if (TARGET_LINK_STACK)
30048             {
30049               char name[32];
30050               get_ppc476_thunk_name (name);
30051               asm_fprintf (file, "\tbl %s\n\tb 1f\n\t.long ", name);
30052               assemble_name (file, buf);
30053               fputs ("-.\n1:", file);
30054               asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
30055               asm_fprintf (file, "\taddi %s,%s,4\n",
30056                            reg_names[11], reg_names[11]);
30057             }
30058           else
30059             {
30060               fputs ("\tbcl 20,31,1f\n\t.long ", file);
30061               assemble_name (file, buf);
30062               fputs ("-.\n1:", file);
30063               asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
30064             }
30065           asm_fprintf (file, "\tlwz %s,0(%s)\n",
30066                        reg_names[0], reg_names[11]);
30067           asm_fprintf (file, "\tadd %s,%s,%s\n",
30068                        reg_names[0], reg_names[0], reg_names[11]);
30069         }
30070       else
30071         {
30072           asm_fprintf (file, "\tlis %s,", reg_names[12]);
30073           assemble_name (file, buf);
30074           fputs ("@ha\n", file);
30075           asm_fprintf (file, "\tstw %s,4(%s)\n",
30076                        reg_names[0], reg_names[1]);
30077           asm_fprintf (file, "\tla %s,", reg_names[0]);
30078           assemble_name (file, buf);
30079           asm_fprintf (file, "@l(%s)\n", reg_names[12]);
30080         }
30081
30082       /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH.  */
30083       fprintf (file, "\tbl %s%s\n",
30084                RS6000_MCOUNT, flag_pic ? "@plt" : "");
30085       break;
30086
30087     case ABI_AIX:
30088     case ABI_ELFv2:
30089     case ABI_DARWIN:
30090       /* Don't do anything, done in output_profile_hook ().  */
30091       break;
30092     }
30093 }
30094
30095 \f
30096
30097 /* The following variable value is the last issued insn.  */
30098
30099 static rtx_insn *last_scheduled_insn;
30100
30101 /* The following variable helps to balance issuing of load and
30102    store instructions */
30103
30104 static int load_store_pendulum;
30105
30106 /* The following variable helps pair divide insns during scheduling.  */
30107 static int divide_cnt;
30108 /* The following variable helps pair and alternate vector and vector load
30109    insns during scheduling.  */
30110 static int vec_pairing;
30111
30112
30113 /* Power4 load update and store update instructions are cracked into a
30114    load or store and an integer insn which are executed in the same cycle.
30115    Branches have their own dispatch slot which does not count against the
30116    GCC issue rate, but it changes the program flow so there are no other
30117    instructions to issue in this cycle.  */
30118
30119 static int
30120 rs6000_variable_issue_1 (rtx_insn *insn, int more)
30121 {
30122   last_scheduled_insn = insn;
30123   if (GET_CODE (PATTERN (insn)) == USE
30124       || GET_CODE (PATTERN (insn)) == CLOBBER)
30125     {
30126       cached_can_issue_more = more;
30127       return cached_can_issue_more;
30128     }
30129
30130   if (insn_terminates_group_p (insn, current_group))
30131     {
30132       cached_can_issue_more = 0;
30133       return cached_can_issue_more;
30134     }
30135
30136   /* If no reservation, but reach here */
30137   if (recog_memoized (insn) < 0)
30138     return more;
30139
30140   if (rs6000_sched_groups)
30141     {
30142       if (is_microcoded_insn (insn))
30143         cached_can_issue_more = 0;
30144       else if (is_cracked_insn (insn))
30145         cached_can_issue_more = more > 2 ? more - 2 : 0;
30146       else
30147         cached_can_issue_more = more - 1;
30148
30149       return cached_can_issue_more;
30150     }
30151
30152   if (rs6000_tune == PROCESSOR_CELL && is_nonpipeline_insn (insn))
30153     return 0;
30154
30155   cached_can_issue_more = more - 1;
30156   return cached_can_issue_more;
30157 }
30158
30159 static int
30160 rs6000_variable_issue (FILE *stream, int verbose, rtx_insn *insn, int more)
30161 {
30162   int r = rs6000_variable_issue_1 (insn, more);
30163   if (verbose)
30164     fprintf (stream, "// rs6000_variable_issue (more = %d) = %d\n", more, r);
30165   return r;
30166 }
30167
30168 /* Adjust the cost of a scheduling dependency.  Return the new cost of
30169    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
30170
30171 static int
30172 rs6000_adjust_cost (rtx_insn *insn, int dep_type, rtx_insn *dep_insn, int cost,
30173                     unsigned int)
30174 {
30175   enum attr_type attr_type;
30176
30177   if (recog_memoized (insn) < 0 || recog_memoized (dep_insn) < 0)
30178     return cost;
30179
30180   switch (dep_type)
30181     {
30182     case REG_DEP_TRUE:
30183       {
30184         /* Data dependency; DEP_INSN writes a register that INSN reads
30185            some cycles later.  */
30186
30187         /* Separate a load from a narrower, dependent store.  */
30188         if ((rs6000_sched_groups || rs6000_tune == PROCESSOR_POWER9)
30189             && GET_CODE (PATTERN (insn)) == SET
30190             && GET_CODE (PATTERN (dep_insn)) == SET
30191             && MEM_P (XEXP (PATTERN (insn), 1))
30192             && MEM_P (XEXP (PATTERN (dep_insn), 0))
30193             && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
30194                 > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
30195           return cost + 14;
30196
30197         attr_type = get_attr_type (insn);
30198
30199         switch (attr_type)
30200           {
30201           case TYPE_JMPREG:
30202             /* Tell the first scheduling pass about the latency between
30203                a mtctr and bctr (and mtlr and br/blr).  The first
30204                scheduling pass will not know about this latency since
30205                the mtctr instruction, which has the latency associated
30206                to it, will be generated by reload.  */
30207             return 4;
30208           case TYPE_BRANCH:
30209             /* Leave some extra cycles between a compare and its
30210                dependent branch, to inhibit expensive mispredicts.  */
30211             if ((rs6000_tune == PROCESSOR_PPC603
30212                  || rs6000_tune == PROCESSOR_PPC604
30213                  || rs6000_tune == PROCESSOR_PPC604e
30214                  || rs6000_tune == PROCESSOR_PPC620
30215                  || rs6000_tune == PROCESSOR_PPC630
30216                  || rs6000_tune == PROCESSOR_PPC750
30217                  || rs6000_tune == PROCESSOR_PPC7400
30218                  || rs6000_tune == PROCESSOR_PPC7450
30219                  || rs6000_tune == PROCESSOR_PPCE5500
30220                  || rs6000_tune == PROCESSOR_PPCE6500
30221                  || rs6000_tune == PROCESSOR_POWER4
30222                  || rs6000_tune == PROCESSOR_POWER5
30223                  || rs6000_tune == PROCESSOR_POWER7
30224                  || rs6000_tune == PROCESSOR_POWER8
30225                  || rs6000_tune == PROCESSOR_POWER9
30226                  || rs6000_tune == PROCESSOR_CELL)
30227                 && recog_memoized (dep_insn)
30228                 && (INSN_CODE (dep_insn) >= 0))
30229
30230               switch (get_attr_type (dep_insn))
30231                 {
30232                 case TYPE_CMP:
30233                 case TYPE_FPCOMPARE:
30234                 case TYPE_CR_LOGICAL:
30235                   return cost + 2;
30236                 case TYPE_EXTS:
30237                 case TYPE_MUL:
30238                   if (get_attr_dot (dep_insn) == DOT_YES)
30239                     return cost + 2;
30240                   else
30241                     break;
30242                 case TYPE_SHIFT:
30243                   if (get_attr_dot (dep_insn) == DOT_YES
30244                       && get_attr_var_shift (dep_insn) == VAR_SHIFT_NO)
30245                     return cost + 2;
30246                   else
30247                     break;
30248                 default:
30249                   break;
30250                 }
30251             break;
30252
30253           case TYPE_STORE:
30254           case TYPE_FPSTORE:
30255             if ((rs6000_tune == PROCESSOR_POWER6)
30256                 && recog_memoized (dep_insn)
30257                 && (INSN_CODE (dep_insn) >= 0))
30258               {
30259
30260                 if (GET_CODE (PATTERN (insn)) != SET)
30261                   /* If this happens, we have to extend this to schedule
30262                      optimally.  Return default for now.  */
30263                   return cost;
30264
30265                 /* Adjust the cost for the case where the value written
30266                    by a fixed point operation is used as the address
30267                    gen value on a store. */
30268                 switch (get_attr_type (dep_insn))
30269                   {
30270                   case TYPE_LOAD:
30271                   case TYPE_CNTLZ:
30272                     {
30273                       if (! rs6000_store_data_bypass_p (dep_insn, insn))
30274                         return get_attr_sign_extend (dep_insn)
30275                                == SIGN_EXTEND_YES ? 6 : 4;
30276                       break;
30277                     }
30278                   case TYPE_SHIFT:
30279                     {
30280                       if (! rs6000_store_data_bypass_p (dep_insn, insn))
30281                         return get_attr_var_shift (dep_insn) == VAR_SHIFT_YES ?
30282                                6 : 3;
30283                       break;
30284                     }
30285                   case TYPE_INTEGER:
30286                   case TYPE_ADD:
30287                   case TYPE_LOGICAL:
30288                   case TYPE_EXTS:
30289                   case TYPE_INSERT:
30290                     {
30291                       if (! rs6000_store_data_bypass_p (dep_insn, insn))
30292                         return 3;
30293                       break;
30294                     }
30295                   case TYPE_STORE:
30296                   case TYPE_FPLOAD:
30297                   case TYPE_FPSTORE:
30298                     {
30299                       if (get_attr_update (dep_insn) == UPDATE_YES
30300                           && ! rs6000_store_data_bypass_p (dep_insn, insn))
30301                         return 3;
30302                       break;
30303                     }
30304                   case TYPE_MUL:
30305                     {
30306                       if (! rs6000_store_data_bypass_p (dep_insn, insn))
30307                         return 17;
30308                       break;
30309                     }
30310                   case TYPE_DIV:
30311                     {
30312                       if (! rs6000_store_data_bypass_p (dep_insn, insn))
30313                         return get_attr_size (dep_insn) == SIZE_32 ? 45 : 57;
30314                       break;
30315                     }
30316                   default:
30317                     break;
30318                   }
30319               }
30320             break;
30321
30322           case TYPE_LOAD:
30323             if ((rs6000_tune == PROCESSOR_POWER6)
30324                 && recog_memoized (dep_insn)
30325                 && (INSN_CODE (dep_insn) >= 0))
30326               {
30327
30328                 /* Adjust the cost for the case where the value written
30329                    by a fixed point instruction is used within the address
30330                    gen portion of a subsequent load(u)(x) */
30331                 switch (get_attr_type (dep_insn))
30332                   {
30333                   case TYPE_LOAD:
30334                   case TYPE_CNTLZ:
30335                     {
30336                       if (set_to_load_agen (dep_insn, insn))
30337                         return get_attr_sign_extend (dep_insn)
30338                                == SIGN_EXTEND_YES ? 6 : 4;
30339                       break;
30340                     }
30341                   case TYPE_SHIFT:
30342                     {
30343                       if (set_to_load_agen (dep_insn, insn))
30344                         return get_attr_var_shift (dep_insn) == VAR_SHIFT_YES ?
30345                                6 : 3;
30346                       break;
30347                     }
30348                   case TYPE_INTEGER:
30349                   case TYPE_ADD:
30350                   case TYPE_LOGICAL:
30351                   case TYPE_EXTS:
30352                   case TYPE_INSERT:
30353                     {
30354                       if (set_to_load_agen (dep_insn, insn))
30355                         return 3;
30356                       break;
30357                     }
30358                   case TYPE_STORE:
30359                   case TYPE_FPLOAD:
30360                   case TYPE_FPSTORE:
30361                     {
30362                       if (get_attr_update (dep_insn) == UPDATE_YES
30363                           && set_to_load_agen (dep_insn, insn))
30364                         return 3;
30365                       break;
30366                     }
30367                   case TYPE_MUL:
30368                     {
30369                       if (set_to_load_agen (dep_insn, insn))
30370                         return 17;
30371                       break;
30372                     }
30373                   case TYPE_DIV:
30374                     {
30375                       if (set_to_load_agen (dep_insn, insn))
30376                         return get_attr_size (dep_insn) == SIZE_32 ? 45 : 57;
30377                       break;
30378                     }
30379                   default:
30380                     break;
30381                   }
30382               }
30383             break;
30384
30385           case TYPE_FPLOAD:
30386             if ((rs6000_tune == PROCESSOR_POWER6)
30387                 && get_attr_update (insn) == UPDATE_NO
30388                 && recog_memoized (dep_insn)
30389                 && (INSN_CODE (dep_insn) >= 0)
30390                 && (get_attr_type (dep_insn) == TYPE_MFFGPR))
30391               return 2;
30392
30393           default:
30394             break;
30395           }
30396
30397         /* Fall out to return default cost.  */
30398       }
30399       break;
30400
30401     case REG_DEP_OUTPUT:
30402       /* Output dependency; DEP_INSN writes a register that INSN writes some
30403          cycles later.  */
30404       if ((rs6000_tune == PROCESSOR_POWER6)
30405           && recog_memoized (dep_insn)
30406           && (INSN_CODE (dep_insn) >= 0))
30407         {
30408           attr_type = get_attr_type (insn);
30409
30410           switch (attr_type)
30411             {
30412             case TYPE_FP:
30413             case TYPE_FPSIMPLE:
30414               if (get_attr_type (dep_insn) == TYPE_FP
30415                   || get_attr_type (dep_insn) == TYPE_FPSIMPLE)
30416                 return 1;
30417               break;
30418             case TYPE_FPLOAD:
30419               if (get_attr_update (insn) == UPDATE_NO
30420                   && get_attr_type (dep_insn) == TYPE_MFFGPR)
30421                 return 2;
30422               break;
30423             default:
30424               break;
30425             }
30426         }
30427       /* Fall through, no cost for output dependency.  */
30428       /* FALLTHRU */
30429
30430     case REG_DEP_ANTI:
30431       /* Anti dependency; DEP_INSN reads a register that INSN writes some
30432          cycles later.  */
30433       return 0;
30434
30435     default:
30436       gcc_unreachable ();
30437     }
30438
30439   return cost;
30440 }
30441
30442 /* Debug version of rs6000_adjust_cost.  */
30443
30444 static int
30445 rs6000_debug_adjust_cost (rtx_insn *insn, int dep_type, rtx_insn *dep_insn,
30446                           int cost, unsigned int dw)
30447 {
30448   int ret = rs6000_adjust_cost (insn, dep_type, dep_insn, cost, dw);
30449
30450   if (ret != cost)
30451     {
30452       const char *dep;
30453
30454       switch (dep_type)
30455         {
30456         default:             dep = "unknown depencency"; break;
30457         case REG_DEP_TRUE:   dep = "data dependency";    break;
30458         case REG_DEP_OUTPUT: dep = "output dependency";  break;
30459         case REG_DEP_ANTI:   dep = "anti depencency";    break;
30460         }
30461
30462       fprintf (stderr,
30463                "\nrs6000_adjust_cost, final cost = %d, orig cost = %d, "
30464                "%s, insn:\n", ret, cost, dep);
30465
30466       debug_rtx (insn);
30467     }
30468
30469   return ret;
30470 }
30471
30472 /* The function returns a true if INSN is microcoded.
30473    Return false otherwise.  */
30474
30475 static bool
30476 is_microcoded_insn (rtx_insn *insn)
30477 {
30478   if (!insn || !NONDEBUG_INSN_P (insn)
30479       || GET_CODE (PATTERN (insn)) == USE
30480       || GET_CODE (PATTERN (insn)) == CLOBBER)
30481     return false;
30482
30483   if (rs6000_tune == PROCESSOR_CELL)
30484     return get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS;
30485
30486   if (rs6000_sched_groups
30487       && (rs6000_tune == PROCESSOR_POWER4 || rs6000_tune == PROCESSOR_POWER5))
30488     {
30489       enum attr_type type = get_attr_type (insn);
30490       if ((type == TYPE_LOAD
30491            && get_attr_update (insn) == UPDATE_YES
30492            && get_attr_sign_extend (insn) == SIGN_EXTEND_YES)
30493           || ((type == TYPE_LOAD || type == TYPE_STORE)
30494               && get_attr_update (insn) == UPDATE_YES
30495               && get_attr_indexed (insn) == INDEXED_YES)
30496           || type == TYPE_MFCR)
30497         return true;
30498     }
30499
30500   return false;
30501 }
30502
30503 /* The function returns true if INSN is cracked into 2 instructions
30504    by the processor (and therefore occupies 2 issue slots).  */
30505
30506 static bool
30507 is_cracked_insn (rtx_insn *insn)
30508 {
30509   if (!insn || !NONDEBUG_INSN_P (insn)
30510       || GET_CODE (PATTERN (insn)) == USE
30511       || GET_CODE (PATTERN (insn)) == CLOBBER)
30512     return false;
30513
30514   if (rs6000_sched_groups
30515       && (rs6000_tune == PROCESSOR_POWER4 || rs6000_tune == PROCESSOR_POWER5))
30516     {
30517       enum attr_type type = get_attr_type (insn);
30518       if ((type == TYPE_LOAD
30519            && get_attr_sign_extend (insn) == SIGN_EXTEND_YES
30520            && get_attr_update (insn) == UPDATE_NO)
30521           || (type == TYPE_LOAD
30522               && get_attr_sign_extend (insn) == SIGN_EXTEND_NO
30523               && get_attr_update (insn) == UPDATE_YES
30524               && get_attr_indexed (insn) == INDEXED_NO)
30525           || (type == TYPE_STORE
30526               && get_attr_update (insn) == UPDATE_YES
30527               && get_attr_indexed (insn) == INDEXED_NO)
30528           || ((type == TYPE_FPLOAD || type == TYPE_FPSTORE)
30529               && get_attr_update (insn) == UPDATE_YES)
30530           || (type == TYPE_CR_LOGICAL
30531               && get_attr_cr_logical_3op (insn) == CR_LOGICAL_3OP_YES)
30532           || (type == TYPE_EXTS
30533               && get_attr_dot (insn) == DOT_YES)
30534           || (type == TYPE_SHIFT
30535               && get_attr_dot (insn) == DOT_YES
30536               && get_attr_var_shift (insn) == VAR_SHIFT_NO)
30537           || (type == TYPE_MUL
30538               && get_attr_dot (insn) == DOT_YES)
30539           || type == TYPE_DIV
30540           || (type == TYPE_INSERT
30541               && get_attr_size (insn) == SIZE_32))
30542         return true;
30543     }
30544
30545   return false;
30546 }
30547
30548 /* The function returns true if INSN can be issued only from
30549    the branch slot.  */
30550
30551 static bool
30552 is_branch_slot_insn (rtx_insn *insn)
30553 {
30554   if (!insn || !NONDEBUG_INSN_P (insn)
30555       || GET_CODE (PATTERN (insn)) == USE
30556       || GET_CODE (PATTERN (insn)) == CLOBBER)
30557     return false;
30558
30559   if (rs6000_sched_groups)
30560     {
30561       enum attr_type type = get_attr_type (insn);
30562       if (type == TYPE_BRANCH || type == TYPE_JMPREG)
30563         return true;
30564       return false;
30565     }
30566
30567   return false;
30568 }
30569
30570 /* The function returns true if out_inst sets a value that is
30571    used in the address generation computation of in_insn */
30572 static bool
30573 set_to_load_agen (rtx_insn *out_insn, rtx_insn *in_insn)
30574 {
30575   rtx out_set, in_set;
30576
30577   /* For performance reasons, only handle the simple case where
30578      both loads are a single_set. */
30579   out_set = single_set (out_insn);
30580   if (out_set)
30581     {
30582       in_set = single_set (in_insn);
30583       if (in_set)
30584         return reg_mentioned_p (SET_DEST (out_set), SET_SRC (in_set));
30585     }
30586
30587   return false;
30588 }
30589
30590 /* Try to determine base/offset/size parts of the given MEM.
30591    Return true if successful, false if all the values couldn't
30592    be determined.
30593
30594    This function only looks for REG or REG+CONST address forms.
30595    REG+REG address form will return false. */
30596
30597 static bool
30598 get_memref_parts (rtx mem, rtx *base, HOST_WIDE_INT *offset,
30599                   HOST_WIDE_INT *size)
30600 {
30601   rtx addr_rtx;
30602   if MEM_SIZE_KNOWN_P (mem)
30603     *size = MEM_SIZE (mem);
30604   else
30605     return false;
30606
30607   addr_rtx = (XEXP (mem, 0));
30608   if (GET_CODE (addr_rtx) == PRE_MODIFY)
30609     addr_rtx = XEXP (addr_rtx, 1);
30610
30611   *offset = 0;
30612   while (GET_CODE (addr_rtx) == PLUS
30613          && CONST_INT_P (XEXP (addr_rtx, 1)))
30614     {
30615       *offset += INTVAL (XEXP (addr_rtx, 1));
30616       addr_rtx = XEXP (addr_rtx, 0);
30617     }
30618   if (!REG_P (addr_rtx))
30619     return false;
30620
30621   *base = addr_rtx;
30622   return true;
30623 }
30624
30625 /* The function returns true if the target storage location of
30626    mem1 is adjacent to the target storage location of mem2 */
30627 /* Return 1 if memory locations are adjacent.  */
30628
30629 static bool
30630 adjacent_mem_locations (rtx mem1, rtx mem2)
30631 {
30632   rtx reg1, reg2;
30633   HOST_WIDE_INT off1, size1, off2, size2;
30634
30635   if (get_memref_parts (mem1, &reg1, &off1, &size1)
30636       && get_memref_parts (mem2, &reg2, &off2, &size2))
30637     return ((REGNO (reg1) == REGNO (reg2))
30638             && ((off1 + size1 == off2)
30639                 || (off2 + size2 == off1)));
30640
30641   return false;
30642 }
30643
30644 /* This function returns true if it can be determined that the two MEM
30645    locations overlap by at least 1 byte based on base reg/offset/size. */
30646
30647 static bool
30648 mem_locations_overlap (rtx mem1, rtx mem2)
30649 {
30650   rtx reg1, reg2;
30651   HOST_WIDE_INT off1, size1, off2, size2;
30652
30653   if (get_memref_parts (mem1, &reg1, &off1, &size1)
30654       && get_memref_parts (mem2, &reg2, &off2, &size2))
30655     return ((REGNO (reg1) == REGNO (reg2))
30656             && (((off1 <= off2) && (off1 + size1 > off2))
30657                 || ((off2 <= off1) && (off2 + size2 > off1))));
30658
30659   return false;
30660 }
30661
30662 /* A C statement (sans semicolon) to update the integer scheduling
30663    priority INSN_PRIORITY (INSN). Increase the priority to execute the
30664    INSN earlier, reduce the priority to execute INSN later.  Do not
30665    define this macro if you do not need to adjust the scheduling
30666    priorities of insns.  */
30667
30668 static int
30669 rs6000_adjust_priority (rtx_insn *insn ATTRIBUTE_UNUSED, int priority)
30670 {
30671   rtx load_mem, str_mem;
30672   /* On machines (like the 750) which have asymmetric integer units,
30673      where one integer unit can do multiply and divides and the other
30674      can't, reduce the priority of multiply/divide so it is scheduled
30675      before other integer operations.  */
30676
30677 #if 0
30678   if (! INSN_P (insn))
30679     return priority;
30680
30681   if (GET_CODE (PATTERN (insn)) == USE)
30682     return priority;
30683
30684   switch (rs6000_tune) {
30685   case PROCESSOR_PPC750:
30686     switch (get_attr_type (insn))
30687       {
30688       default:
30689         break;
30690
30691       case TYPE_MUL:
30692       case TYPE_DIV:
30693         fprintf (stderr, "priority was %#x (%d) before adjustment\n",
30694                  priority, priority);
30695         if (priority >= 0 && priority < 0x01000000)
30696           priority >>= 3;
30697         break;
30698       }
30699   }
30700 #endif
30701
30702   if (insn_must_be_first_in_group (insn)
30703       && reload_completed
30704       && current_sched_info->sched_max_insns_priority
30705       && rs6000_sched_restricted_insns_priority)
30706     {
30707
30708       /* Prioritize insns that can be dispatched only in the first
30709          dispatch slot.  */
30710       if (rs6000_sched_restricted_insns_priority == 1)
30711         /* Attach highest priority to insn. This means that in
30712            haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
30713            precede 'priority' (critical path) considerations.  */
30714         return current_sched_info->sched_max_insns_priority;
30715       else if (rs6000_sched_restricted_insns_priority == 2)
30716         /* Increase priority of insn by a minimal amount. This means that in
30717            haifa-sched.c:ready_sort(), only 'priority' (critical path)
30718            considerations precede dispatch-slot restriction considerations.  */
30719         return (priority + 1);
30720     }
30721
30722   if (rs6000_tune == PROCESSOR_POWER6
30723       && ((load_store_pendulum == -2 && is_load_insn (insn, &load_mem))
30724           || (load_store_pendulum == 2 && is_store_insn (insn, &str_mem))))
30725     /* Attach highest priority to insn if the scheduler has just issued two
30726        stores and this instruction is a load, or two loads and this instruction
30727        is a store. Power6 wants loads and stores scheduled alternately
30728        when possible */
30729     return current_sched_info->sched_max_insns_priority;
30730
30731   return priority;
30732 }
30733
30734 /* Return true if the instruction is nonpipelined on the Cell. */
30735 static bool
30736 is_nonpipeline_insn (rtx_insn *insn)
30737 {
30738   enum attr_type type;
30739   if (!insn || !NONDEBUG_INSN_P (insn)
30740       || GET_CODE (PATTERN (insn)) == USE
30741       || GET_CODE (PATTERN (insn)) == CLOBBER)
30742     return false;
30743
30744   type = get_attr_type (insn);
30745   if (type == TYPE_MUL
30746       || type == TYPE_DIV
30747       || type == TYPE_SDIV
30748       || type == TYPE_DDIV
30749       || type == TYPE_SSQRT
30750       || type == TYPE_DSQRT
30751       || type == TYPE_MFCR
30752       || type == TYPE_MFCRF
30753       || type == TYPE_MFJMPR)
30754     {
30755       return true;
30756     }
30757   return false;
30758 }
30759
30760
30761 /* Return how many instructions the machine can issue per cycle.  */
30762
30763 static int
30764 rs6000_issue_rate (void)
30765 {
30766   /* Unless scheduling for register pressure, use issue rate of 1 for
30767      first scheduling pass to decrease degradation.  */
30768   if (!reload_completed && !flag_sched_pressure)
30769     return 1;
30770
30771   switch (rs6000_tune) {
30772   case PROCESSOR_RS64A:
30773   case PROCESSOR_PPC601: /* ? */
30774   case PROCESSOR_PPC7450:
30775     return 3;
30776   case PROCESSOR_PPC440:
30777   case PROCESSOR_PPC603:
30778   case PROCESSOR_PPC750:
30779   case PROCESSOR_PPC7400:
30780   case PROCESSOR_PPC8540:
30781   case PROCESSOR_PPC8548:
30782   case PROCESSOR_CELL:
30783   case PROCESSOR_PPCE300C2:
30784   case PROCESSOR_PPCE300C3:
30785   case PROCESSOR_PPCE500MC:
30786   case PROCESSOR_PPCE500MC64:
30787   case PROCESSOR_PPCE5500:
30788   case PROCESSOR_PPCE6500:
30789   case PROCESSOR_TITAN:
30790     return 2;
30791   case PROCESSOR_PPC476:
30792   case PROCESSOR_PPC604:
30793   case PROCESSOR_PPC604e:
30794   case PROCESSOR_PPC620:
30795   case PROCESSOR_PPC630:
30796     return 4;
30797   case PROCESSOR_POWER4:
30798   case PROCESSOR_POWER5:
30799   case PROCESSOR_POWER6:
30800   case PROCESSOR_POWER7:
30801     return 5;
30802   case PROCESSOR_POWER8:
30803     return 7;
30804   case PROCESSOR_POWER9:
30805     return 6;
30806   default:
30807     return 1;
30808   }
30809 }
30810
30811 /* Return how many instructions to look ahead for better insn
30812    scheduling.  */
30813
30814 static int
30815 rs6000_use_sched_lookahead (void)
30816 {
30817   switch (rs6000_tune)
30818     {
30819     case PROCESSOR_PPC8540:
30820     case PROCESSOR_PPC8548:
30821       return 4;
30822
30823     case PROCESSOR_CELL:
30824       return (reload_completed ? 8 : 0);
30825
30826     default:
30827       return 0;
30828     }
30829 }
30830
30831 /* We are choosing insn from the ready queue.  Return zero if INSN can be
30832    chosen.  */
30833 static int
30834 rs6000_use_sched_lookahead_guard (rtx_insn *insn, int ready_index)
30835 {
30836   if (ready_index == 0)
30837     return 0;
30838
30839   if (rs6000_tune != PROCESSOR_CELL)
30840     return 0;
30841
30842   gcc_assert (insn != NULL_RTX && INSN_P (insn));
30843
30844   if (!reload_completed
30845       || is_nonpipeline_insn (insn)
30846       || is_microcoded_insn (insn))
30847     return 1;
30848
30849   return 0;
30850 }
30851
30852 /* Determine if PAT refers to memory. If so, set MEM_REF to the MEM rtx
30853    and return true.  */
30854
30855 static bool
30856 find_mem_ref (rtx pat, rtx *mem_ref)
30857 {
30858   const char * fmt;
30859   int i, j;
30860
30861   /* stack_tie does not produce any real memory traffic.  */
30862   if (tie_operand (pat, VOIDmode))
30863     return false;
30864
30865   if (MEM_P (pat))
30866     {
30867       *mem_ref = pat;
30868       return true;
30869     }
30870
30871   /* Recursively process the pattern.  */
30872   fmt = GET_RTX_FORMAT (GET_CODE (pat));
30873
30874   for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0; i--)
30875     {
30876       if (fmt[i] == 'e')
30877         {
30878           if (find_mem_ref (XEXP (pat, i), mem_ref))
30879             return true;
30880         }
30881       else if (fmt[i] == 'E')
30882         for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
30883           {
30884             if (find_mem_ref (XVECEXP (pat, i, j), mem_ref))
30885               return true;
30886           }
30887     }
30888
30889   return false;
30890 }
30891
30892 /* Determine if PAT is a PATTERN of a load insn.  */
30893
30894 static bool
30895 is_load_insn1 (rtx pat, rtx *load_mem)
30896 {
30897   if (!pat || pat == NULL_RTX)
30898     return false;
30899
30900   if (GET_CODE (pat) == SET)
30901     return find_mem_ref (SET_SRC (pat), load_mem);
30902
30903   if (GET_CODE (pat) == PARALLEL)
30904     {
30905       int i;
30906
30907       for (i = 0; i < XVECLEN (pat, 0); i++)
30908         if (is_load_insn1 (XVECEXP (pat, 0, i), load_mem))
30909           return true;
30910     }
30911
30912   return false;
30913 }
30914
30915 /* Determine if INSN loads from memory.  */
30916
30917 static bool
30918 is_load_insn (rtx insn, rtx *load_mem)
30919 {
30920   if (!insn || !INSN_P (insn))
30921     return false;
30922
30923   if (CALL_P (insn))
30924     return false;
30925
30926   return is_load_insn1 (PATTERN (insn), load_mem);
30927 }
30928
30929 /* Determine if PAT is a PATTERN of a store insn.  */
30930
30931 static bool
30932 is_store_insn1 (rtx pat, rtx *str_mem)
30933 {
30934   if (!pat || pat == NULL_RTX)
30935     return false;
30936
30937   if (GET_CODE (pat) == SET)
30938     return find_mem_ref (SET_DEST (pat), str_mem);
30939
30940   if (GET_CODE (pat) == PARALLEL)
30941     {
30942       int i;
30943
30944       for (i = 0; i < XVECLEN (pat, 0); i++)
30945         if (is_store_insn1 (XVECEXP (pat, 0, i), str_mem))
30946           return true;
30947     }
30948
30949   return false;
30950 }
30951
30952 /* Determine if INSN stores to memory.  */
30953
30954 static bool
30955 is_store_insn (rtx insn, rtx *str_mem)
30956 {
30957   if (!insn || !INSN_P (insn))
30958     return false;
30959
30960   return is_store_insn1 (PATTERN (insn), str_mem);
30961 }
30962
30963 /* Return whether TYPE is a Power9 pairable vector instruction type.  */
30964
30965 static bool
30966 is_power9_pairable_vec_type (enum attr_type type)
30967 {
30968   switch (type)
30969     {
30970       case TYPE_VECSIMPLE:
30971       case TYPE_VECCOMPLEX:
30972       case TYPE_VECDIV:
30973       case TYPE_VECCMP:
30974       case TYPE_VECPERM:
30975       case TYPE_VECFLOAT:
30976       case TYPE_VECFDIV:
30977       case TYPE_VECDOUBLE:
30978         return true;
30979       default:
30980         break;
30981     }
30982   return false;
30983 }
30984
30985 /* Returns whether the dependence between INSN and NEXT is considered
30986    costly by the given target.  */
30987
30988 static bool
30989 rs6000_is_costly_dependence (dep_t dep, int cost, int distance)
30990 {
30991   rtx insn;
30992   rtx next;
30993   rtx load_mem, str_mem;
30994
30995   /* If the flag is not enabled - no dependence is considered costly;
30996      allow all dependent insns in the same group.
30997      This is the most aggressive option.  */
30998   if (rs6000_sched_costly_dep == no_dep_costly)
30999     return false;
31000
31001   /* If the flag is set to 1 - a dependence is always considered costly;
31002      do not allow dependent instructions in the same group.
31003      This is the most conservative option.  */
31004   if (rs6000_sched_costly_dep == all_deps_costly)
31005     return true;
31006
31007   insn = DEP_PRO (dep);
31008   next = DEP_CON (dep);
31009
31010   if (rs6000_sched_costly_dep == store_to_load_dep_costly
31011       && is_load_insn (next, &load_mem)
31012       && is_store_insn (insn, &str_mem))
31013     /* Prevent load after store in the same group.  */
31014     return true;
31015
31016   if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
31017       && is_load_insn (next, &load_mem)
31018       && is_store_insn (insn, &str_mem)
31019       && DEP_TYPE (dep) == REG_DEP_TRUE
31020       && mem_locations_overlap(str_mem, load_mem))
31021      /* Prevent load after store in the same group if it is a true
31022         dependence.  */
31023      return true;
31024
31025   /* The flag is set to X; dependences with latency >= X are considered costly,
31026      and will not be scheduled in the same group.  */
31027   if (rs6000_sched_costly_dep <= max_dep_latency
31028       && ((cost - distance) >= (int)rs6000_sched_costly_dep))
31029     return true;
31030
31031   return false;
31032 }
31033
31034 /* Return the next insn after INSN that is found before TAIL is reached,
31035    skipping any "non-active" insns - insns that will not actually occupy
31036    an issue slot.  Return NULL_RTX if such an insn is not found.  */
31037
31038 static rtx_insn *
31039 get_next_active_insn (rtx_insn *insn, rtx_insn *tail)
31040 {
31041   if (insn == NULL_RTX || insn == tail)
31042     return NULL;
31043
31044   while (1)
31045     {
31046       insn = NEXT_INSN (insn);
31047       if (insn == NULL_RTX || insn == tail)
31048         return NULL;
31049
31050       if (CALL_P (insn)
31051           || JUMP_P (insn) || JUMP_TABLE_DATA_P (insn)
31052           || (NONJUMP_INSN_P (insn)
31053               && GET_CODE (PATTERN (insn)) != USE
31054               && GET_CODE (PATTERN (insn)) != CLOBBER
31055               && INSN_CODE (insn) != CODE_FOR_stack_tie))
31056         break;
31057     }
31058   return insn;
31059 }
31060
31061 /* Do Power9 specific sched_reorder2 reordering of ready list.  */
31062
31063 static int
31064 power9_sched_reorder2 (rtx_insn **ready, int lastpos)
31065 {
31066   int pos;
31067   int i;
31068   rtx_insn *tmp;
31069   enum attr_type type, type2;
31070
31071   type = get_attr_type (last_scheduled_insn);
31072
31073   /* Try to issue fixed point divides back-to-back in pairs so they will be
31074      routed to separate execution units and execute in parallel.  */
31075   if (type == TYPE_DIV && divide_cnt == 0)
31076     {
31077       /* First divide has been scheduled.  */
31078       divide_cnt = 1;
31079
31080       /* Scan the ready list looking for another divide, if found move it
31081          to the end of the list so it is chosen next.  */
31082       pos = lastpos;
31083       while (pos >= 0)
31084         {
31085           if (recog_memoized (ready[pos]) >= 0
31086               && get_attr_type (ready[pos]) == TYPE_DIV)
31087             {
31088               tmp = ready[pos];
31089               for (i = pos; i < lastpos; i++)
31090                 ready[i] = ready[i + 1];
31091               ready[lastpos] = tmp;
31092               break;
31093             }
31094           pos--;
31095         }
31096     }
31097   else
31098     {
31099       /* Last insn was the 2nd divide or not a divide, reset the counter.  */
31100       divide_cnt = 0;
31101
31102       /* The best dispatch throughput for vector and vector load insns can be
31103          achieved by interleaving a vector and vector load such that they'll
31104          dispatch to the same superslice. If this pairing cannot be achieved
31105          then it is best to pair vector insns together and vector load insns
31106          together.
31107
31108          To aid in this pairing, vec_pairing maintains the current state with
31109          the following values:
31110
31111              0  : Initial state, no vecload/vector pairing has been started.
31112
31113              1  : A vecload or vector insn has been issued and a candidate for
31114                   pairing has been found and moved to the end of the ready
31115                   list.  */
31116       if (type == TYPE_VECLOAD)
31117         {
31118           /* Issued a vecload.  */
31119           if (vec_pairing == 0)
31120             {
31121               int vecload_pos = -1;
31122               /* We issued a single vecload, look for a vector insn to pair it
31123                  with.  If one isn't found, try to pair another vecload.  */
31124               pos = lastpos;
31125               while (pos >= 0)
31126                 {
31127                   if (recog_memoized (ready[pos]) >= 0)
31128                     {
31129                       type2 = get_attr_type (ready[pos]);
31130                       if (is_power9_pairable_vec_type (type2))
31131                         {
31132                           /* Found a vector insn to pair with, move it to the
31133                              end of the ready list so it is scheduled next.  */
31134                           tmp = ready[pos];
31135                           for (i = pos; i < lastpos; i++)
31136                             ready[i] = ready[i + 1];
31137                           ready[lastpos] = tmp;
31138                           vec_pairing = 1;
31139                           return cached_can_issue_more;
31140                         }
31141                       else if (type2 == TYPE_VECLOAD && vecload_pos == -1)
31142                         /* Remember position of first vecload seen.  */
31143                         vecload_pos = pos;
31144                     }
31145                   pos--;
31146                 }
31147               if (vecload_pos >= 0)
31148                 {
31149                   /* Didn't find a vector to pair with but did find a vecload,
31150                      move it to the end of the ready list.  */
31151                   tmp = ready[vecload_pos];
31152                   for (i = vecload_pos; i < lastpos; i++)
31153                     ready[i] = ready[i + 1];
31154                   ready[lastpos] = tmp;
31155                   vec_pairing = 1;
31156                   return cached_can_issue_more;
31157                 }
31158             }
31159         }
31160       else if (is_power9_pairable_vec_type (type))
31161         {
31162           /* Issued a vector operation.  */
31163           if (vec_pairing == 0)
31164             {
31165               int vec_pos = -1;
31166               /* We issued a single vector insn, look for a vecload to pair it
31167                  with.  If one isn't found, try to pair another vector.  */
31168               pos = lastpos;
31169               while (pos >= 0)
31170                 {
31171                   if (recog_memoized (ready[pos]) >= 0)
31172                     {
31173                       type2 = get_attr_type (ready[pos]);
31174                       if (type2 == TYPE_VECLOAD)
31175                         {
31176                           /* Found a vecload insn to pair with, move it to the
31177                              end of the ready list so it is scheduled next.  */
31178                           tmp = ready[pos];
31179                           for (i = pos; i < lastpos; i++)
31180                             ready[i] = ready[i + 1];
31181                           ready[lastpos] = tmp;
31182                           vec_pairing = 1;
31183                           return cached_can_issue_more;
31184                         }
31185                       else if (is_power9_pairable_vec_type (type2)
31186                                && vec_pos == -1)
31187                         /* Remember position of first vector insn seen.  */
31188                         vec_pos = pos;
31189                     }
31190                   pos--;
31191                 }
31192               if (vec_pos >= 0)
31193                 {
31194                   /* Didn't find a vecload to pair with but did find a vector
31195                      insn, move it to the end of the ready list.  */
31196                   tmp = ready[vec_pos];
31197                   for (i = vec_pos; i < lastpos; i++)
31198                     ready[i] = ready[i + 1];
31199                   ready[lastpos] = tmp;
31200                   vec_pairing = 1;
31201                   return cached_can_issue_more;
31202                 }
31203             }
31204         }
31205
31206       /* We've either finished a vec/vecload pair, couldn't find an insn to
31207          continue the current pair, or the last insn had nothing to do with
31208          with pairing.  In any case, reset the state.  */
31209       vec_pairing = 0;
31210     }
31211
31212   return cached_can_issue_more;
31213 }
31214
31215 /* We are about to begin issuing insns for this clock cycle. */
31216
31217 static int
31218 rs6000_sched_reorder (FILE *dump ATTRIBUTE_UNUSED, int sched_verbose,
31219                         rtx_insn **ready ATTRIBUTE_UNUSED,
31220                         int *pn_ready ATTRIBUTE_UNUSED,
31221                         int clock_var ATTRIBUTE_UNUSED)
31222 {
31223   int n_ready = *pn_ready;
31224
31225   if (sched_verbose)
31226     fprintf (dump, "// rs6000_sched_reorder :\n");
31227
31228   /* Reorder the ready list, if the second to last ready insn
31229      is a nonepipeline insn.  */
31230   if (rs6000_tune == PROCESSOR_CELL && n_ready > 1)
31231   {
31232     if (is_nonpipeline_insn (ready[n_ready - 1])
31233         && (recog_memoized (ready[n_ready - 2]) > 0))
31234       /* Simply swap first two insns.  */
31235       std::swap (ready[n_ready - 1], ready[n_ready - 2]);
31236   }
31237
31238   if (rs6000_tune == PROCESSOR_POWER6)
31239     load_store_pendulum = 0;
31240
31241   return rs6000_issue_rate ();
31242 }
31243
31244 /* Like rs6000_sched_reorder, but called after issuing each insn.  */
31245
31246 static int
31247 rs6000_sched_reorder2 (FILE *dump, int sched_verbose, rtx_insn **ready,
31248                          int *pn_ready, int clock_var ATTRIBUTE_UNUSED)
31249 {
31250   if (sched_verbose)
31251     fprintf (dump, "// rs6000_sched_reorder2 :\n");
31252
31253   /* For Power6, we need to handle some special cases to try and keep the
31254      store queue from overflowing and triggering expensive flushes.
31255
31256      This code monitors how load and store instructions are being issued
31257      and skews the ready list one way or the other to increase the likelihood
31258      that a desired instruction is issued at the proper time.
31259
31260      A couple of things are done.  First, we maintain a "load_store_pendulum"
31261      to track the current state of load/store issue.
31262
31263        - If the pendulum is at zero, then no loads or stores have been
31264          issued in the current cycle so we do nothing.
31265
31266        - If the pendulum is 1, then a single load has been issued in this
31267          cycle and we attempt to locate another load in the ready list to
31268          issue with it.
31269
31270        - If the pendulum is -2, then two stores have already been
31271          issued in this cycle, so we increase the priority of the first load
31272          in the ready list to increase it's likelihood of being chosen first
31273          in the next cycle.
31274
31275        - If the pendulum is -1, then a single store has been issued in this
31276          cycle and we attempt to locate another store in the ready list to
31277          issue with it, preferring a store to an adjacent memory location to
31278          facilitate store pairing in the store queue.
31279
31280        - If the pendulum is 2, then two loads have already been
31281          issued in this cycle, so we increase the priority of the first store
31282          in the ready list to increase it's likelihood of being chosen first
31283          in the next cycle.
31284
31285        - If the pendulum < -2 or > 2, then do nothing.
31286
31287        Note: This code covers the most common scenarios.  There exist non
31288              load/store instructions which make use of the LSU and which
31289              would need to be accounted for to strictly model the behavior
31290              of the machine.  Those instructions are currently unaccounted
31291              for to help minimize compile time overhead of this code.
31292    */
31293   if (rs6000_tune == PROCESSOR_POWER6 && last_scheduled_insn)
31294     {
31295       int pos;
31296       int i;
31297       rtx_insn *tmp;
31298       rtx load_mem, str_mem;
31299
31300       if (is_store_insn (last_scheduled_insn, &str_mem))
31301         /* Issuing a store, swing the load_store_pendulum to the left */
31302         load_store_pendulum--;
31303       else if (is_load_insn (last_scheduled_insn, &load_mem))
31304         /* Issuing a load, swing the load_store_pendulum to the right */
31305         load_store_pendulum++;
31306       else
31307         return cached_can_issue_more;
31308
31309       /* If the pendulum is balanced, or there is only one instruction on
31310          the ready list, then all is well, so return. */
31311       if ((load_store_pendulum == 0) || (*pn_ready <= 1))
31312         return cached_can_issue_more;
31313
31314       if (load_store_pendulum == 1)
31315         {
31316           /* A load has been issued in this cycle.  Scan the ready list
31317              for another load to issue with it */
31318           pos = *pn_ready-1;
31319
31320           while (pos >= 0)
31321             {
31322               if (is_load_insn (ready[pos], &load_mem))
31323                 {
31324                   /* Found a load.  Move it to the head of the ready list,
31325                      and adjust it's priority so that it is more likely to
31326                      stay there */
31327                   tmp = ready[pos];
31328                   for (i=pos; i<*pn_ready-1; i++)
31329                     ready[i] = ready[i + 1];
31330                   ready[*pn_ready-1] = tmp;
31331
31332                   if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
31333                     INSN_PRIORITY (tmp)++;
31334                   break;
31335                 }
31336               pos--;
31337             }
31338         }
31339       else if (load_store_pendulum == -2)
31340         {
31341           /* Two stores have been issued in this cycle.  Increase the
31342              priority of the first load in the ready list to favor it for
31343              issuing in the next cycle. */
31344           pos = *pn_ready-1;
31345
31346           while (pos >= 0)
31347             {
31348               if (is_load_insn (ready[pos], &load_mem)
31349                   && !sel_sched_p ()
31350                   && INSN_PRIORITY_KNOWN (ready[pos]))
31351                 {
31352                   INSN_PRIORITY (ready[pos])++;
31353
31354                   /* Adjust the pendulum to account for the fact that a load
31355                      was found and increased in priority.  This is to prevent
31356                      increasing the priority of multiple loads */
31357                   load_store_pendulum--;
31358
31359                   break;
31360                 }
31361               pos--;
31362             }
31363         }
31364       else if (load_store_pendulum == -1)
31365         {
31366           /* A store has been issued in this cycle.  Scan the ready list for
31367              another store to issue with it, preferring a store to an adjacent
31368              memory location */
31369           int first_store_pos = -1;
31370
31371           pos = *pn_ready-1;
31372
31373           while (pos >= 0)
31374             {
31375               if (is_store_insn (ready[pos], &str_mem))
31376                 {
31377                   rtx str_mem2;
31378                   /* Maintain the index of the first store found on the
31379                      list */
31380                   if (first_store_pos == -1)
31381                     first_store_pos = pos;
31382
31383                   if (is_store_insn (last_scheduled_insn, &str_mem2)
31384                       && adjacent_mem_locations (str_mem, str_mem2))
31385                     {
31386                       /* Found an adjacent store.  Move it to the head of the
31387                          ready list, and adjust it's priority so that it is
31388                          more likely to stay there */
31389                       tmp = ready[pos];
31390                       for (i=pos; i<*pn_ready-1; i++)
31391                         ready[i] = ready[i + 1];
31392                       ready[*pn_ready-1] = tmp;
31393
31394                       if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
31395                         INSN_PRIORITY (tmp)++;
31396
31397                       first_store_pos = -1;
31398
31399                       break;
31400                     };
31401                 }
31402               pos--;
31403             }
31404
31405           if (first_store_pos >= 0)
31406             {
31407               /* An adjacent store wasn't found, but a non-adjacent store was,
31408                  so move the non-adjacent store to the front of the ready
31409                  list, and adjust its priority so that it is more likely to
31410                  stay there. */
31411               tmp = ready[first_store_pos];
31412               for (i=first_store_pos; i<*pn_ready-1; i++)
31413                 ready[i] = ready[i + 1];
31414               ready[*pn_ready-1] = tmp;
31415               if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
31416                 INSN_PRIORITY (tmp)++;
31417             }
31418         }
31419       else if (load_store_pendulum == 2)
31420        {
31421            /* Two loads have been issued in this cycle.  Increase the priority
31422               of the first store in the ready list to favor it for issuing in
31423               the next cycle. */
31424           pos = *pn_ready-1;
31425
31426           while (pos >= 0)
31427             {
31428               if (is_store_insn (ready[pos], &str_mem)
31429                   && !sel_sched_p ()
31430                   && INSN_PRIORITY_KNOWN (ready[pos]))
31431                 {
31432                   INSN_PRIORITY (ready[pos])++;
31433
31434                   /* Adjust the pendulum to account for the fact that a store
31435                      was found and increased in priority.  This is to prevent
31436                      increasing the priority of multiple stores */
31437                   load_store_pendulum++;
31438
31439                   break;
31440                 }
31441               pos--;
31442             }
31443         }
31444     }
31445
31446   /* Do Power9 dependent reordering if necessary.  */
31447   if (rs6000_tune == PROCESSOR_POWER9 && last_scheduled_insn
31448       && recog_memoized (last_scheduled_insn) >= 0)
31449     return power9_sched_reorder2 (ready, *pn_ready - 1);
31450
31451   return cached_can_issue_more;
31452 }
31453
31454 /* Return whether the presence of INSN causes a dispatch group termination
31455    of group WHICH_GROUP.
31456
31457    If WHICH_GROUP == current_group, this function will return true if INSN
31458    causes the termination of the current group (i.e, the dispatch group to
31459    which INSN belongs). This means that INSN will be the last insn in the
31460    group it belongs to.
31461
31462    If WHICH_GROUP == previous_group, this function will return true if INSN
31463    causes the termination of the previous group (i.e, the dispatch group that
31464    precedes the group to which INSN belongs).  This means that INSN will be
31465    the first insn in the group it belongs to).  */
31466
31467 static bool
31468 insn_terminates_group_p (rtx_insn *insn, enum group_termination which_group)
31469 {
31470   bool first, last;
31471
31472   if (! insn)
31473     return false;
31474
31475   first = insn_must_be_first_in_group (insn);
31476   last = insn_must_be_last_in_group (insn);
31477
31478   if (first && last)
31479     return true;
31480
31481   if (which_group == current_group)
31482     return last;
31483   else if (which_group == previous_group)
31484     return first;
31485
31486   return false;
31487 }
31488
31489
31490 static bool
31491 insn_must_be_first_in_group (rtx_insn *insn)
31492 {
31493   enum attr_type type;
31494
31495   if (!insn
31496       || NOTE_P (insn)
31497       || DEBUG_INSN_P (insn)
31498       || GET_CODE (PATTERN (insn)) == USE
31499       || GET_CODE (PATTERN (insn)) == CLOBBER)
31500     return false;
31501
31502   switch (rs6000_tune)
31503     {
31504     case PROCESSOR_POWER5:
31505       if (is_cracked_insn (insn))
31506         return true;
31507       /* FALLTHRU */
31508     case PROCESSOR_POWER4:
31509       if (is_microcoded_insn (insn))
31510         return true;
31511
31512       if (!rs6000_sched_groups)
31513         return false;
31514
31515       type = get_attr_type (insn);
31516
31517       switch (type)
31518         {
31519         case TYPE_MFCR:
31520         case TYPE_MFCRF:
31521         case TYPE_MTCR:
31522         case TYPE_CR_LOGICAL:
31523         case TYPE_MTJMPR:
31524         case TYPE_MFJMPR:
31525         case TYPE_DIV:
31526         case TYPE_LOAD_L:
31527         case TYPE_STORE_C:
31528         case TYPE_ISYNC:
31529         case TYPE_SYNC:
31530           return true;
31531         default:
31532           break;
31533         }
31534       break;
31535     case PROCESSOR_POWER6:
31536       type = get_attr_type (insn);
31537
31538       switch (type)
31539         {
31540         case TYPE_EXTS:
31541         case TYPE_CNTLZ:
31542         case TYPE_TRAP:
31543         case TYPE_MUL:
31544         case TYPE_INSERT:
31545         case TYPE_FPCOMPARE:
31546         case TYPE_MFCR:
31547         case TYPE_MTCR:
31548         case TYPE_MFJMPR:
31549         case TYPE_MTJMPR:
31550         case TYPE_ISYNC:
31551         case TYPE_SYNC:
31552         case TYPE_LOAD_L:
31553         case TYPE_STORE_C:
31554           return true;
31555         case TYPE_SHIFT:
31556           if (get_attr_dot (insn) == DOT_NO
31557               || get_attr_var_shift (insn) == VAR_SHIFT_NO)
31558             return true;
31559           else
31560             break;
31561         case TYPE_DIV:
31562           if (get_attr_size (insn) == SIZE_32)
31563             return true;
31564           else
31565             break;
31566         case TYPE_LOAD:
31567         case TYPE_STORE:
31568         case TYPE_FPLOAD:
31569         case TYPE_FPSTORE:
31570           if (get_attr_update (insn) == UPDATE_YES)
31571             return true;
31572           else
31573             break;
31574         default:
31575           break;
31576         }
31577       break;
31578     case PROCESSOR_POWER7:
31579       type = get_attr_type (insn);
31580
31581       switch (type)
31582         {
31583         case TYPE_CR_LOGICAL:
31584         case TYPE_MFCR:
31585         case TYPE_MFCRF:
31586         case TYPE_MTCR:
31587         case TYPE_DIV:
31588         case TYPE_ISYNC:
31589         case TYPE_LOAD_L:
31590         case TYPE_STORE_C:
31591         case TYPE_MFJMPR:
31592         case TYPE_MTJMPR:
31593           return true;
31594         case TYPE_MUL:
31595         case TYPE_SHIFT:
31596         case TYPE_EXTS:
31597           if (get_attr_dot (insn) == DOT_YES)
31598             return true;
31599           else
31600             break;
31601         case TYPE_LOAD:
31602           if (get_attr_sign_extend (insn) == SIGN_EXTEND_YES
31603               || get_attr_update (insn) == UPDATE_YES)
31604             return true;
31605           else
31606             break;
31607         case TYPE_STORE:
31608         case TYPE_FPLOAD:
31609         case TYPE_FPSTORE:
31610           if (get_attr_update (insn) == UPDATE_YES)
31611             return true;
31612           else
31613             break;
31614         default:
31615           break;
31616         }
31617       break;
31618     case PROCESSOR_POWER8:
31619       type = get_attr_type (insn);
31620
31621       switch (type)
31622         {
31623         case TYPE_CR_LOGICAL:
31624         case TYPE_MFCR:
31625         case TYPE_MFCRF:
31626         case TYPE_MTCR:
31627         case TYPE_SYNC:
31628         case TYPE_ISYNC:
31629         case TYPE_LOAD_L:
31630         case TYPE_STORE_C:
31631         case TYPE_VECSTORE:
31632         case TYPE_MFJMPR:
31633         case TYPE_MTJMPR:
31634           return true;
31635         case TYPE_SHIFT:
31636         case TYPE_EXTS:
31637         case TYPE_MUL:
31638           if (get_attr_dot (insn) == DOT_YES)
31639             return true;
31640           else
31641             break;
31642         case TYPE_LOAD:
31643           if (get_attr_sign_extend (insn) == SIGN_EXTEND_YES
31644               || get_attr_update (insn) == UPDATE_YES)
31645             return true;
31646           else
31647             break;
31648         case TYPE_STORE:
31649           if (get_attr_update (insn) == UPDATE_YES
31650               && get_attr_indexed (insn) == INDEXED_YES)
31651             return true;
31652           else
31653             break;
31654         default:
31655           break;
31656         }
31657       break;
31658     default:
31659       break;
31660     }
31661
31662   return false;
31663 }
31664
31665 static bool
31666 insn_must_be_last_in_group (rtx_insn *insn)
31667 {
31668   enum attr_type type;
31669
31670   if (!insn
31671       || NOTE_P (insn)
31672       || DEBUG_INSN_P (insn)
31673       || GET_CODE (PATTERN (insn)) == USE
31674       || GET_CODE (PATTERN (insn)) == CLOBBER)
31675     return false;
31676
31677   switch (rs6000_tune) {
31678   case PROCESSOR_POWER4:
31679   case PROCESSOR_POWER5:
31680     if (is_microcoded_insn (insn))
31681       return true;
31682
31683     if (is_branch_slot_insn (insn))
31684       return true;
31685
31686     break;
31687   case PROCESSOR_POWER6:
31688     type = get_attr_type (insn);
31689
31690     switch (type)
31691       {
31692       case TYPE_EXTS:
31693       case TYPE_CNTLZ:
31694       case TYPE_TRAP:
31695       case TYPE_MUL:
31696       case TYPE_FPCOMPARE:
31697       case TYPE_MFCR:
31698       case TYPE_MTCR:
31699       case TYPE_MFJMPR:
31700       case TYPE_MTJMPR:
31701       case TYPE_ISYNC:
31702       case TYPE_SYNC:
31703       case TYPE_LOAD_L:
31704       case TYPE_STORE_C:
31705         return true;
31706       case TYPE_SHIFT:
31707         if (get_attr_dot (insn) == DOT_NO
31708             || get_attr_var_shift (insn) == VAR_SHIFT_NO)
31709           return true;
31710         else
31711           break;
31712       case TYPE_DIV:
31713         if (get_attr_size (insn) == SIZE_32)
31714           return true;
31715         else
31716           break;
31717       default:
31718         break;
31719     }
31720     break;
31721   case PROCESSOR_POWER7:
31722     type = get_attr_type (insn);
31723
31724     switch (type)
31725       {
31726       case TYPE_ISYNC:
31727       case TYPE_SYNC:
31728       case TYPE_LOAD_L:
31729       case TYPE_STORE_C:
31730         return true;
31731       case TYPE_LOAD:
31732         if (get_attr_sign_extend (insn) == SIGN_EXTEND_YES
31733             && get_attr_update (insn) == UPDATE_YES)
31734           return true;
31735         else
31736           break;
31737       case TYPE_STORE:
31738         if (get_attr_update (insn) == UPDATE_YES
31739             && get_attr_indexed (insn) == INDEXED_YES)
31740           return true;
31741         else
31742           break;
31743       default:
31744         break;
31745     }
31746     break;
31747   case PROCESSOR_POWER8:
31748     type = get_attr_type (insn);
31749
31750     switch (type)
31751       {
31752       case TYPE_MFCR:
31753       case TYPE_MTCR:
31754       case TYPE_ISYNC:
31755       case TYPE_SYNC:
31756       case TYPE_LOAD_L:
31757       case TYPE_STORE_C:
31758         return true;
31759       case TYPE_LOAD:
31760         if (get_attr_sign_extend (insn) == SIGN_EXTEND_YES
31761             && get_attr_update (insn) == UPDATE_YES)
31762           return true;
31763         else
31764           break;
31765       case TYPE_STORE:
31766         if (get_attr_update (insn) == UPDATE_YES
31767             && get_attr_indexed (insn) == INDEXED_YES)
31768           return true;
31769         else
31770           break;
31771       default:
31772         break;
31773     }
31774     break;
31775   default:
31776     break;
31777   }
31778
31779   return false;
31780 }
31781
31782 /* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
31783    dispatch group) from the insns in GROUP_INSNS.  Return false otherwise.  */
31784
31785 static bool
31786 is_costly_group (rtx *group_insns, rtx next_insn)
31787 {
31788   int i;
31789   int issue_rate = rs6000_issue_rate ();
31790
31791   for (i = 0; i < issue_rate; i++)
31792     {
31793       sd_iterator_def sd_it;
31794       dep_t dep;
31795       rtx insn = group_insns[i];
31796
31797       if (!insn)
31798         continue;
31799
31800       FOR_EACH_DEP (insn, SD_LIST_RES_FORW, sd_it, dep)
31801         {
31802           rtx next = DEP_CON (dep);
31803
31804           if (next == next_insn
31805               && rs6000_is_costly_dependence (dep, dep_cost (dep), 0))
31806             return true;
31807         }
31808     }
31809
31810   return false;
31811 }
31812
31813 /* Utility of the function redefine_groups.
31814    Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
31815    in the same dispatch group.  If so, insert nops before NEXT_INSN, in order
31816    to keep it "far" (in a separate group) from GROUP_INSNS, following
31817    one of the following schemes, depending on the value of the flag
31818    -minsert_sched_nops = X:
31819    (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
31820        in order to force NEXT_INSN into a separate group.
31821    (2) X < sched_finish_regroup_exact: insert exactly X nops.
31822    GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
31823    insertion (has a group just ended, how many vacant issue slots remain in the
31824    last group, and how many dispatch groups were encountered so far).  */
31825
31826 static int
31827 force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
31828                  rtx_insn *next_insn, bool *group_end, int can_issue_more,
31829                  int *group_count)
31830 {
31831   rtx nop;
31832   bool force;
31833   int issue_rate = rs6000_issue_rate ();
31834   bool end = *group_end;
31835   int i;
31836
31837   if (next_insn == NULL_RTX || DEBUG_INSN_P (next_insn))
31838     return can_issue_more;
31839
31840   if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
31841     return can_issue_more;
31842
31843   force = is_costly_group (group_insns, next_insn);
31844   if (!force)
31845     return can_issue_more;
31846
31847   if (sched_verbose > 6)
31848     fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
31849              *group_count ,can_issue_more);
31850
31851   if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
31852     {
31853       if (*group_end)
31854         can_issue_more = 0;
31855
31856       /* Since only a branch can be issued in the last issue_slot, it is
31857          sufficient to insert 'can_issue_more - 1' nops if next_insn is not
31858          a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
31859          in this case the last nop will start a new group and the branch
31860          will be forced to the new group.  */
31861       if (can_issue_more && !is_branch_slot_insn (next_insn))
31862         can_issue_more--;
31863
31864       /* Do we have a special group ending nop? */
31865       if (rs6000_tune == PROCESSOR_POWER6 || rs6000_tune == PROCESSOR_POWER7
31866           || rs6000_tune == PROCESSOR_POWER8)
31867         {
31868           nop = gen_group_ending_nop ();
31869           emit_insn_before (nop, next_insn);
31870           can_issue_more = 0;
31871         }
31872       else
31873         while (can_issue_more > 0)
31874           {
31875             nop = gen_nop ();
31876             emit_insn_before (nop, next_insn);
31877             can_issue_more--;
31878           }
31879
31880       *group_end = true;
31881       return 0;
31882     }
31883
31884   if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
31885     {
31886       int n_nops = rs6000_sched_insert_nops;
31887
31888       /* Nops can't be issued from the branch slot, so the effective
31889          issue_rate for nops is 'issue_rate - 1'.  */
31890       if (can_issue_more == 0)
31891         can_issue_more = issue_rate;
31892       can_issue_more--;
31893       if (can_issue_more == 0)
31894         {
31895           can_issue_more = issue_rate - 1;
31896           (*group_count)++;
31897           end = true;
31898           for (i = 0; i < issue_rate; i++)
31899             {
31900               group_insns[i] = 0;
31901             }
31902         }
31903
31904       while (n_nops > 0)
31905         {
31906           nop = gen_nop ();
31907           emit_insn_before (nop, next_insn);
31908           if (can_issue_more == issue_rate - 1) /* new group begins */
31909             end = false;
31910           can_issue_more--;
31911           if (can_issue_more == 0)
31912             {
31913               can_issue_more = issue_rate - 1;
31914               (*group_count)++;
31915               end = true;
31916               for (i = 0; i < issue_rate; i++)
31917                 {
31918                   group_insns[i] = 0;
31919                 }
31920             }
31921           n_nops--;
31922         }
31923
31924       /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1').  */
31925       can_issue_more++;
31926
31927       /* Is next_insn going to start a new group?  */
31928       *group_end
31929         = (end
31930            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
31931            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
31932            || (can_issue_more < issue_rate &&
31933                insn_terminates_group_p (next_insn, previous_group)));
31934       if (*group_end && end)
31935         (*group_count)--;
31936
31937       if (sched_verbose > 6)
31938         fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
31939                  *group_count, can_issue_more);
31940       return can_issue_more;
31941     }
31942
31943   return can_issue_more;
31944 }
31945
31946 /* This function tries to synch the dispatch groups that the compiler "sees"
31947    with the dispatch groups that the processor dispatcher is expected to
31948    form in practice.  It tries to achieve this synchronization by forcing the
31949    estimated processor grouping on the compiler (as opposed to the function
31950    'pad_goups' which tries to force the scheduler's grouping on the processor).
31951
31952    The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
31953    examines the (estimated) dispatch groups that will be formed by the processor
31954    dispatcher.  It marks these group boundaries to reflect the estimated
31955    processor grouping, overriding the grouping that the scheduler had marked.
31956    Depending on the value of the flag '-minsert-sched-nops' this function can
31957    force certain insns into separate groups or force a certain distance between
31958    them by inserting nops, for example, if there exists a "costly dependence"
31959    between the insns.
31960
31961    The function estimates the group boundaries that the processor will form as
31962    follows:  It keeps track of how many vacant issue slots are available after
31963    each insn.  A subsequent insn will start a new group if one of the following
31964    4 cases applies:
31965    - no more vacant issue slots remain in the current dispatch group.
31966    - only the last issue slot, which is the branch slot, is vacant, but the next
31967      insn is not a branch.
31968    - only the last 2 or less issue slots, including the branch slot, are vacant,
31969      which means that a cracked insn (which occupies two issue slots) can't be
31970      issued in this group.
31971    - less than 'issue_rate' slots are vacant, and the next insn always needs to
31972      start a new group.  */
31973
31974 static int
31975 redefine_groups (FILE *dump, int sched_verbose, rtx_insn *prev_head_insn,
31976                  rtx_insn *tail)
31977 {
31978   rtx_insn *insn, *next_insn;
31979   int issue_rate;
31980   int can_issue_more;
31981   int slot, i;
31982   bool group_end;
31983   int group_count = 0;
31984   rtx *group_insns;
31985
31986   /* Initialize.  */
31987   issue_rate = rs6000_issue_rate ();
31988   group_insns = XALLOCAVEC (rtx, issue_rate);
31989   for (i = 0; i < issue_rate; i++)
31990     {
31991       group_insns[i] = 0;
31992     }
31993   can_issue_more = issue_rate;
31994   slot = 0;
31995   insn = get_next_active_insn (prev_head_insn, tail);
31996   group_end = false;
31997
31998   while (insn != NULL_RTX)
31999     {
32000       slot = (issue_rate - can_issue_more);
32001       group_insns[slot] = insn;
32002       can_issue_more =
32003         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
32004       if (insn_terminates_group_p (insn, current_group))
32005         can_issue_more = 0;
32006
32007       next_insn = get_next_active_insn (insn, tail);
32008       if (next_insn == NULL_RTX)
32009         return group_count + 1;
32010
32011       /* Is next_insn going to start a new group?  */
32012       group_end
32013         = (can_issue_more == 0
32014            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
32015            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
32016            || (can_issue_more < issue_rate &&
32017                insn_terminates_group_p (next_insn, previous_group)));
32018
32019       can_issue_more = force_new_group (sched_verbose, dump, group_insns,
32020                                         next_insn, &group_end, can_issue_more,
32021                                         &group_count);
32022
32023       if (group_end)
32024         {
32025           group_count++;
32026           can_issue_more = 0;
32027           for (i = 0; i < issue_rate; i++)
32028             {
32029               group_insns[i] = 0;
32030             }
32031         }
32032
32033       if (GET_MODE (next_insn) == TImode && can_issue_more)
32034         PUT_MODE (next_insn, VOIDmode);
32035       else if (!can_issue_more && GET_MODE (next_insn) != TImode)
32036         PUT_MODE (next_insn, TImode);
32037
32038       insn = next_insn;
32039       if (can_issue_more == 0)
32040         can_issue_more = issue_rate;
32041     } /* while */
32042
32043   return group_count;
32044 }
32045
32046 /* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
32047    dispatch group boundaries that the scheduler had marked.  Pad with nops
32048    any dispatch groups which have vacant issue slots, in order to force the
32049    scheduler's grouping on the processor dispatcher.  The function
32050    returns the number of dispatch groups found.  */
32051
32052 static int
32053 pad_groups (FILE *dump, int sched_verbose, rtx_insn *prev_head_insn,
32054             rtx_insn *tail)
32055 {
32056   rtx_insn *insn, *next_insn;
32057   rtx nop;
32058   int issue_rate;
32059   int can_issue_more;
32060   int group_end;
32061   int group_count = 0;
32062
32063   /* Initialize issue_rate.  */
32064   issue_rate = rs6000_issue_rate ();
32065   can_issue_more = issue_rate;
32066
32067   insn = get_next_active_insn (prev_head_insn, tail);
32068   next_insn = get_next_active_insn (insn, tail);
32069
32070   while (insn != NULL_RTX)
32071     {
32072       can_issue_more =
32073         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
32074
32075       group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
32076
32077       if (next_insn == NULL_RTX)
32078         break;
32079
32080       if (group_end)
32081         {
32082           /* If the scheduler had marked group termination at this location
32083              (between insn and next_insn), and neither insn nor next_insn will
32084              force group termination, pad the group with nops to force group
32085              termination.  */
32086           if (can_issue_more
32087               && (rs6000_sched_insert_nops == sched_finish_pad_groups)
32088               && !insn_terminates_group_p (insn, current_group)
32089               && !insn_terminates_group_p (next_insn, previous_group))
32090             {
32091               if (!is_branch_slot_insn (next_insn))
32092                 can_issue_more--;
32093
32094               while (can_issue_more)
32095                 {
32096                   nop = gen_nop ();
32097                   emit_insn_before (nop, next_insn);
32098                   can_issue_more--;
32099                 }
32100             }
32101
32102           can_issue_more = issue_rate;
32103           group_count++;
32104         }
32105
32106       insn = next_insn;
32107       next_insn = get_next_active_insn (insn, tail);
32108     }
32109
32110   return group_count;
32111 }
32112
32113 /* We're beginning a new block.  Initialize data structures as necessary.  */
32114
32115 static void
32116 rs6000_sched_init (FILE *dump ATTRIBUTE_UNUSED,
32117                      int sched_verbose ATTRIBUTE_UNUSED,
32118                      int max_ready ATTRIBUTE_UNUSED)
32119 {
32120   last_scheduled_insn = NULL;
32121   load_store_pendulum = 0;
32122   divide_cnt = 0;
32123   vec_pairing = 0;
32124 }
32125
32126 /* The following function is called at the end of scheduling BB.
32127    After reload, it inserts nops at insn group bundling.  */
32128
32129 static void
32130 rs6000_sched_finish (FILE *dump, int sched_verbose)
32131 {
32132   int n_groups;
32133
32134   if (sched_verbose)
32135     fprintf (dump, "=== Finishing schedule.\n");
32136
32137   if (reload_completed && rs6000_sched_groups)
32138     {
32139       /* Do not run sched_finish hook when selective scheduling enabled.  */
32140       if (sel_sched_p ())
32141         return;
32142
32143       if (rs6000_sched_insert_nops == sched_finish_none)
32144         return;
32145
32146       if (rs6000_sched_insert_nops == sched_finish_pad_groups)
32147         n_groups = pad_groups (dump, sched_verbose,
32148                                current_sched_info->prev_head,
32149                                current_sched_info->next_tail);
32150       else
32151         n_groups = redefine_groups (dump, sched_verbose,
32152                                     current_sched_info->prev_head,
32153                                     current_sched_info->next_tail);
32154
32155       if (sched_verbose >= 6)
32156         {
32157           fprintf (dump, "ngroups = %d\n", n_groups);
32158           print_rtl (dump, current_sched_info->prev_head);
32159           fprintf (dump, "Done finish_sched\n");
32160         }
32161     }
32162 }
32163
32164 struct rs6000_sched_context
32165 {
32166   short cached_can_issue_more;
32167   rtx_insn *last_scheduled_insn;
32168   int load_store_pendulum;
32169   int divide_cnt;
32170   int vec_pairing;
32171 };
32172
32173 typedef struct rs6000_sched_context rs6000_sched_context_def;
32174 typedef rs6000_sched_context_def *rs6000_sched_context_t;
32175
32176 /* Allocate store for new scheduling context.  */
32177 static void *
32178 rs6000_alloc_sched_context (void)
32179 {
32180   return xmalloc (sizeof (rs6000_sched_context_def));
32181 }
32182
32183 /* If CLEAN_P is true then initializes _SC with clean data,
32184    and from the global context otherwise.  */
32185 static void
32186 rs6000_init_sched_context (void *_sc, bool clean_p)
32187 {
32188   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
32189
32190   if (clean_p)
32191     {
32192       sc->cached_can_issue_more = 0;
32193       sc->last_scheduled_insn = NULL;
32194       sc->load_store_pendulum = 0;
32195       sc->divide_cnt = 0;
32196       sc->vec_pairing = 0;
32197     }
32198   else
32199     {
32200       sc->cached_can_issue_more = cached_can_issue_more;
32201       sc->last_scheduled_insn = last_scheduled_insn;
32202       sc->load_store_pendulum = load_store_pendulum;
32203       sc->divide_cnt = divide_cnt;
32204       sc->vec_pairing = vec_pairing;
32205     }
32206 }
32207
32208 /* Sets the global scheduling context to the one pointed to by _SC.  */
32209 static void
32210 rs6000_set_sched_context (void *_sc)
32211 {
32212   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
32213
32214   gcc_assert (sc != NULL);
32215
32216   cached_can_issue_more = sc->cached_can_issue_more;
32217   last_scheduled_insn = sc->last_scheduled_insn;
32218   load_store_pendulum = sc->load_store_pendulum;
32219   divide_cnt = sc->divide_cnt;
32220   vec_pairing = sc->vec_pairing;
32221 }
32222
32223 /* Free _SC.  */
32224 static void
32225 rs6000_free_sched_context (void *_sc)
32226 {
32227   gcc_assert (_sc != NULL);
32228
32229   free (_sc);
32230 }
32231
32232 static bool
32233 rs6000_sched_can_speculate_insn (rtx_insn *insn)
32234 {
32235   switch (get_attr_type (insn))
32236     {
32237     case TYPE_DIV:
32238     case TYPE_SDIV:
32239     case TYPE_DDIV:
32240     case TYPE_VECDIV:
32241     case TYPE_SSQRT:
32242     case TYPE_DSQRT:
32243       return false;
32244
32245     default:
32246       return true;
32247   }
32248 }
32249 \f
32250 /* Length in units of the trampoline for entering a nested function.  */
32251
32252 int
32253 rs6000_trampoline_size (void)
32254 {
32255   int ret = 0;
32256
32257   switch (DEFAULT_ABI)
32258     {
32259     default:
32260       gcc_unreachable ();
32261
32262     case ABI_AIX:
32263       ret = (TARGET_32BIT) ? 12 : 24;
32264       break;
32265
32266     case ABI_ELFv2:
32267       gcc_assert (!TARGET_32BIT);
32268       ret = 32;
32269       break;
32270
32271     case ABI_DARWIN:
32272     case ABI_V4:
32273       ret = (TARGET_32BIT) ? 40 : 48;
32274       break;
32275     }
32276
32277   return ret;
32278 }
32279
32280 /* Emit RTL insns to initialize the variable parts of a trampoline.
32281    FNADDR is an RTX for the address of the function's pure code.
32282    CXT is an RTX for the static chain value for the function.  */
32283
32284 static void
32285 rs6000_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
32286 {
32287   int regsize = (TARGET_32BIT) ? 4 : 8;
32288   rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
32289   rtx ctx_reg = force_reg (Pmode, cxt);
32290   rtx addr = force_reg (Pmode, XEXP (m_tramp, 0));
32291
32292   switch (DEFAULT_ABI)
32293     {
32294     default:
32295       gcc_unreachable ();
32296
32297     /* Under AIX, just build the 3 word function descriptor */
32298     case ABI_AIX:
32299       {
32300         rtx fnmem, fn_reg, toc_reg;
32301
32302         if (!TARGET_POINTERS_TO_NESTED_FUNCTIONS)
32303           error ("you cannot take the address of a nested function if you use "
32304                  "the %qs option", "-mno-pointers-to-nested-functions");
32305
32306         fnmem = gen_const_mem (Pmode, force_reg (Pmode, fnaddr));
32307         fn_reg = gen_reg_rtx (Pmode);
32308         toc_reg = gen_reg_rtx (Pmode);
32309
32310   /* Macro to shorten the code expansions below.  */
32311 # define MEM_PLUS(MEM, OFFSET) adjust_address (MEM, Pmode, OFFSET)
32312
32313         m_tramp = replace_equiv_address (m_tramp, addr);
32314
32315         emit_move_insn (fn_reg, MEM_PLUS (fnmem, 0));
32316         emit_move_insn (toc_reg, MEM_PLUS (fnmem, regsize));
32317         emit_move_insn (MEM_PLUS (m_tramp, 0), fn_reg);
32318         emit_move_insn (MEM_PLUS (m_tramp, regsize), toc_reg);
32319         emit_move_insn (MEM_PLUS (m_tramp, 2*regsize), ctx_reg);
32320
32321 # undef MEM_PLUS
32322       }
32323       break;
32324
32325     /* Under V.4/eabi/darwin, __trampoline_setup does the real work.  */
32326     case ABI_ELFv2:
32327     case ABI_DARWIN:
32328     case ABI_V4:
32329       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
32330                          LCT_NORMAL, VOIDmode,
32331                          addr, Pmode,
32332                          GEN_INT (rs6000_trampoline_size ()), SImode,
32333                          fnaddr, Pmode,
32334                          ctx_reg, Pmode);
32335       break;
32336     }
32337 }
32338
32339 \f
32340 /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain
32341    identifier as an argument, so the front end shouldn't look it up.  */
32342
32343 static bool
32344 rs6000_attribute_takes_identifier_p (const_tree attr_id)
32345 {
32346   return is_attribute_p ("altivec", attr_id);
32347 }
32348
32349 /* Handle the "altivec" attribute.  The attribute may have
32350    arguments as follows:
32351
32352         __attribute__((altivec(vector__)))
32353         __attribute__((altivec(pixel__)))       (always followed by 'unsigned short')
32354         __attribute__((altivec(bool__)))        (always followed by 'unsigned')
32355
32356   and may appear more than once (e.g., 'vector bool char') in a
32357   given declaration.  */
32358
32359 static tree
32360 rs6000_handle_altivec_attribute (tree *node,
32361                                  tree name ATTRIBUTE_UNUSED,
32362                                  tree args,
32363                                  int flags ATTRIBUTE_UNUSED,
32364                                  bool *no_add_attrs)
32365 {
32366   tree type = *node, result = NULL_TREE;
32367   machine_mode mode;
32368   int unsigned_p;
32369   char altivec_type
32370     = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
32371         && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
32372        ? *IDENTIFIER_POINTER (TREE_VALUE (args))
32373        : '?');
32374
32375   while (POINTER_TYPE_P (type)
32376          || TREE_CODE (type) == FUNCTION_TYPE
32377          || TREE_CODE (type) == METHOD_TYPE
32378          || TREE_CODE (type) == ARRAY_TYPE)
32379     type = TREE_TYPE (type);
32380
32381   mode = TYPE_MODE (type);
32382
32383   /* Check for invalid AltiVec type qualifiers.  */
32384   if (type == long_double_type_node)
32385     error ("use of %<long double%> in AltiVec types is invalid");
32386   else if (type == boolean_type_node)
32387     error ("use of boolean types in AltiVec types is invalid");
32388   else if (TREE_CODE (type) == COMPLEX_TYPE)
32389     error ("use of %<complex%> in AltiVec types is invalid");
32390   else if (DECIMAL_FLOAT_MODE_P (mode))
32391     error ("use of decimal floating point types in AltiVec types is invalid");
32392   else if (!TARGET_VSX)
32393     {
32394       if (type == long_unsigned_type_node || type == long_integer_type_node)
32395         {
32396           if (TARGET_64BIT)
32397             error ("use of %<long%> in AltiVec types is invalid for "
32398                    "64-bit code without %qs", "-mvsx");
32399           else if (rs6000_warn_altivec_long)
32400             warning (0, "use of %<long%> in AltiVec types is deprecated; "
32401                      "use %<int%>");
32402         }
32403       else if (type == long_long_unsigned_type_node
32404                || type == long_long_integer_type_node)
32405         error ("use of %<long long%> in AltiVec types is invalid without %qs",
32406                "-mvsx");
32407       else if (type == double_type_node)
32408         error ("use of %<double%> in AltiVec types is invalid without %qs",
32409                "-mvsx");
32410     }
32411
32412   switch (altivec_type)
32413     {
32414     case 'v':
32415       unsigned_p = TYPE_UNSIGNED (type);
32416       switch (mode)
32417         {
32418         case E_TImode:
32419           result = (unsigned_p ? unsigned_V1TI_type_node : V1TI_type_node);
32420           break;
32421         case E_DImode:
32422           result = (unsigned_p ? unsigned_V2DI_type_node : V2DI_type_node);
32423           break;
32424         case E_SImode:
32425           result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
32426           break;
32427         case E_HImode:
32428           result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
32429           break;
32430         case E_QImode:
32431           result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
32432           break;
32433         case E_SFmode: result = V4SF_type_node; break;
32434         case E_DFmode: result = V2DF_type_node; break;
32435           /* If the user says 'vector int bool', we may be handed the 'bool'
32436              attribute _before_ the 'vector' attribute, and so select the
32437              proper type in the 'b' case below.  */
32438         case E_V4SImode: case E_V8HImode: case E_V16QImode: case E_V4SFmode:
32439         case E_V2DImode: case E_V2DFmode:
32440           result = type;
32441         default: break;
32442         }
32443       break;
32444     case 'b':
32445       switch (mode)
32446         {
32447         case E_DImode: case E_V2DImode: result = bool_V2DI_type_node; break;
32448         case E_SImode: case E_V4SImode: result = bool_V4SI_type_node; break;
32449         case E_HImode: case E_V8HImode: result = bool_V8HI_type_node; break;
32450         case E_QImode: case E_V16QImode: result = bool_V16QI_type_node;
32451         default: break;
32452         }
32453       break;
32454     case 'p':
32455       switch (mode)
32456         {
32457         case E_V8HImode: result = pixel_V8HI_type_node;
32458         default: break;
32459         }
32460     default: break;
32461     }
32462
32463   /* Propagate qualifiers attached to the element type
32464      onto the vector type.  */
32465   if (result && result != type && TYPE_QUALS (type))
32466     result = build_qualified_type (result, TYPE_QUALS (type));
32467
32468   *no_add_attrs = true;  /* No need to hang on to the attribute.  */
32469
32470   if (result)
32471     *node = lang_hooks.types.reconstruct_complex_type (*node, result);
32472
32473   return NULL_TREE;
32474 }
32475
32476 /* AltiVec defines five built-in scalar types that serve as vector
32477    elements; we must teach the compiler how to mangle them.  The 128-bit
32478    floating point mangling is target-specific as well.  */
32479
32480 static const char *
32481 rs6000_mangle_type (const_tree type)
32482 {
32483   type = TYPE_MAIN_VARIANT (type);
32484
32485   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
32486       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
32487     return NULL;
32488
32489   if (type == bool_char_type_node) return "U6__boolc";
32490   if (type == bool_short_type_node) return "U6__bools";
32491   if (type == pixel_type_node) return "u7__pixel";
32492   if (type == bool_int_type_node) return "U6__booli";
32493   if (type == bool_long_long_type_node) return "U6__boolx";
32494
32495   if (SCALAR_FLOAT_TYPE_P (type) && FLOAT128_IBM_P (TYPE_MODE (type)))
32496     return "g";
32497   if (SCALAR_FLOAT_TYPE_P (type) && FLOAT128_IEEE_P (TYPE_MODE (type)))
32498     return ieee128_mangling_gcc_8_1 ? "U10__float128" : "u9__ieee128";
32499
32500   /* For all other types, use the default mangling.  */
32501   return NULL;
32502 }
32503
32504 /* Handle a "longcall" or "shortcall" attribute; arguments as in
32505    struct attribute_spec.handler.  */
32506
32507 static tree
32508 rs6000_handle_longcall_attribute (tree *node, tree name,
32509                                   tree args ATTRIBUTE_UNUSED,
32510                                   int flags ATTRIBUTE_UNUSED,
32511                                   bool *no_add_attrs)
32512 {
32513   if (TREE_CODE (*node) != FUNCTION_TYPE
32514       && TREE_CODE (*node) != FIELD_DECL
32515       && TREE_CODE (*node) != TYPE_DECL)
32516     {
32517       warning (OPT_Wattributes, "%qE attribute only applies to functions",
32518                name);
32519       *no_add_attrs = true;
32520     }
32521
32522   return NULL_TREE;
32523 }
32524
32525 /* Set longcall attributes on all functions declared when
32526    rs6000_default_long_calls is true.  */
32527 static void
32528 rs6000_set_default_type_attributes (tree type)
32529 {
32530   if (rs6000_default_long_calls
32531       && (TREE_CODE (type) == FUNCTION_TYPE
32532           || TREE_CODE (type) == METHOD_TYPE))
32533     TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
32534                                         NULL_TREE,
32535                                         TYPE_ATTRIBUTES (type));
32536
32537 #if TARGET_MACHO
32538   darwin_set_default_type_attributes (type);
32539 #endif
32540 }
32541
32542 /* Return a reference suitable for calling a function with the
32543    longcall attribute.  */
32544
32545 static rtx
32546 rs6000_longcall_ref (rtx call_ref, rtx arg)
32547 {
32548   /* System V adds '.' to the internal name, so skip them.  */
32549   const char *call_name = XSTR (call_ref, 0);
32550   if (*call_name == '.')
32551     {
32552       while (*call_name == '.')
32553         call_name++;
32554
32555       tree node = get_identifier (call_name);
32556       call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
32557     }
32558
32559   if (TARGET_PLTSEQ)
32560     {
32561       rtx base = const0_rtx;
32562       int regno;
32563       if (DEFAULT_ABI == ABI_ELFv2)
32564         {
32565           base = gen_rtx_REG (Pmode, TOC_REGISTER);
32566           regno = 12;
32567         }
32568       else
32569         {
32570           if (flag_pic)
32571             base = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
32572           regno = 11;
32573         }
32574       /* Reg must match that used by linker PLT stubs.  For ELFv2, r12
32575          may be used by a function global entry point.  For SysV4, r11
32576          is used by __glink_PLTresolve lazy resolver entry.  */
32577       rtx reg = gen_rtx_REG (Pmode, regno);
32578       rtx hi = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, base, call_ref, arg),
32579                                UNSPEC_PLT16_HA);
32580       rtx lo = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, reg, call_ref, arg),
32581                                UNSPEC_PLT16_LO);
32582       emit_insn (gen_rtx_SET (reg, hi));
32583       emit_insn (gen_rtx_SET (reg, lo));
32584       return reg;
32585     }
32586
32587   return force_reg (Pmode, call_ref);
32588 }
32589 \f
32590 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
32591 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
32592 #endif
32593
32594 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
32595    struct attribute_spec.handler.  */
32596 static tree
32597 rs6000_handle_struct_attribute (tree *node, tree name,
32598                                 tree args ATTRIBUTE_UNUSED,
32599                                 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
32600 {
32601   tree *type = NULL;
32602   if (DECL_P (*node))
32603     {
32604       if (TREE_CODE (*node) == TYPE_DECL)
32605         type = &TREE_TYPE (*node);
32606     }
32607   else
32608     type = node;
32609
32610   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
32611                  || TREE_CODE (*type) == UNION_TYPE)))
32612     {
32613       warning (OPT_Wattributes, "%qE attribute ignored", name);
32614       *no_add_attrs = true;
32615     }
32616
32617   else if ((is_attribute_p ("ms_struct", name)
32618             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
32619            || ((is_attribute_p ("gcc_struct", name)
32620                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
32621     {
32622       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
32623                name);
32624       *no_add_attrs = true;
32625     }
32626
32627   return NULL_TREE;
32628 }
32629
32630 static bool
32631 rs6000_ms_bitfield_layout_p (const_tree record_type)
32632 {
32633   return (TARGET_USE_MS_BITFIELD_LAYOUT &&
32634           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
32635     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
32636 }
32637 \f
32638 #ifdef USING_ELFOS_H
32639
32640 /* A get_unnamed_section callback, used for switching to toc_section.  */
32641
32642 static void
32643 rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
32644 {
32645   if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
32646       && TARGET_MINIMAL_TOC)
32647     {
32648       if (!toc_initialized)
32649         {
32650           fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
32651           ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
32652           (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0);
32653           fprintf (asm_out_file, "\t.tc ");
32654           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],");
32655           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
32656           fprintf (asm_out_file, "\n");
32657
32658           fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
32659           ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
32660           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
32661           fprintf (asm_out_file, " = .+32768\n");
32662           toc_initialized = 1;
32663         }
32664       else
32665         fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
32666     }
32667   else if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
32668     {
32669       fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
32670       if (!toc_initialized)
32671         {
32672           ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
32673           toc_initialized = 1;
32674         }
32675     }
32676   else
32677     {
32678       fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
32679       if (!toc_initialized)
32680         {
32681           ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
32682           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
32683           fprintf (asm_out_file, " = .+32768\n");
32684           toc_initialized = 1;
32685         }
32686     }
32687 }
32688
32689 /* Implement TARGET_ASM_INIT_SECTIONS.  */
32690
32691 static void
32692 rs6000_elf_asm_init_sections (void)
32693 {
32694   toc_section
32695     = get_unnamed_section (0, rs6000_elf_output_toc_section_asm_op, NULL);
32696
32697   sdata2_section
32698     = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
32699                            SDATA2_SECTION_ASM_OP);
32700 }
32701
32702 /* Implement TARGET_SELECT_RTX_SECTION.  */
32703
32704 static section *
32705 rs6000_elf_select_rtx_section (machine_mode mode, rtx x,
32706                                unsigned HOST_WIDE_INT align)
32707 {
32708   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
32709     return toc_section;
32710   else
32711     return default_elf_select_rtx_section (mode, x, align);
32712 }
32713 \f
32714 /* For a SYMBOL_REF, set generic flags and then perform some
32715    target-specific processing.
32716
32717    When the AIX ABI is requested on a non-AIX system, replace the
32718    function name with the real name (with a leading .) rather than the
32719    function descriptor name.  This saves a lot of overriding code to
32720    read the prefixes.  */
32721
32722 static void rs6000_elf_encode_section_info (tree, rtx, int) ATTRIBUTE_UNUSED;
32723 static void
32724 rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
32725 {
32726   default_encode_section_info (decl, rtl, first);
32727
32728   if (first
32729       && TREE_CODE (decl) == FUNCTION_DECL
32730       && !TARGET_AIX
32731       && DEFAULT_ABI == ABI_AIX)
32732     {
32733       rtx sym_ref = XEXP (rtl, 0);
32734       size_t len = strlen (XSTR (sym_ref, 0));
32735       char *str = XALLOCAVEC (char, len + 2);
32736       str[0] = '.';
32737       memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
32738       XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
32739     }
32740 }
32741
32742 static inline bool
32743 compare_section_name (const char *section, const char *templ)
32744 {
32745   int len;
32746
32747   len = strlen (templ);
32748   return (strncmp (section, templ, len) == 0
32749           && (section[len] == 0 || section[len] == '.'));
32750 }
32751
32752 bool
32753 rs6000_elf_in_small_data_p (const_tree decl)
32754 {
32755   if (rs6000_sdata == SDATA_NONE)
32756     return false;
32757
32758   /* We want to merge strings, so we never consider them small data.  */
32759   if (TREE_CODE (decl) == STRING_CST)
32760     return false;
32761
32762   /* Functions are never in the small data area.  */
32763   if (TREE_CODE (decl) == FUNCTION_DECL)
32764     return false;
32765
32766   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
32767     {
32768       const char *section = DECL_SECTION_NAME (decl);
32769       if (compare_section_name (section, ".sdata")
32770           || compare_section_name (section, ".sdata2")
32771           || compare_section_name (section, ".gnu.linkonce.s")
32772           || compare_section_name (section, ".sbss")
32773           || compare_section_name (section, ".sbss2")
32774           || compare_section_name (section, ".gnu.linkonce.sb")
32775           || strcmp (section, ".PPC.EMB.sdata0") == 0
32776           || strcmp (section, ".PPC.EMB.sbss0") == 0)
32777         return true;
32778     }
32779   else
32780     {
32781       /* If we are told not to put readonly data in sdata, then don't.  */
32782       if (TREE_READONLY (decl) && rs6000_sdata != SDATA_EABI
32783           && !rs6000_readonly_in_sdata)
32784         return false;
32785
32786       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
32787
32788       if (size > 0
32789           && size <= g_switch_value
32790           /* If it's not public, and we're not going to reference it there,
32791              there's no need to put it in the small data section.  */
32792           && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
32793         return true;
32794     }
32795
32796   return false;
32797 }
32798
32799 #endif /* USING_ELFOS_H */
32800 \f
32801 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  */
32802
32803 static bool
32804 rs6000_use_blocks_for_constant_p (machine_mode mode, const_rtx x)
32805 {
32806   return !ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode);
32807 }
32808
32809 /* Do not place thread-local symbols refs in the object blocks.  */
32810
32811 static bool
32812 rs6000_use_blocks_for_decl_p (const_tree decl)
32813 {
32814   return !DECL_THREAD_LOCAL_P (decl);
32815 }
32816 \f
32817 /* Return a REG that occurs in ADDR with coefficient 1.
32818    ADDR can be effectively incremented by incrementing REG.
32819
32820    r0 is special and we must not select it as an address
32821    register by this routine since our caller will try to
32822    increment the returned register via an "la" instruction.  */
32823
32824 rtx
32825 find_addr_reg (rtx addr)
32826 {
32827   while (GET_CODE (addr) == PLUS)
32828     {
32829       if (REG_P (XEXP (addr, 0))
32830           && REGNO (XEXP (addr, 0)) != 0)
32831         addr = XEXP (addr, 0);
32832       else if (REG_P (XEXP (addr, 1))
32833                && REGNO (XEXP (addr, 1)) != 0)
32834         addr = XEXP (addr, 1);
32835       else if (CONSTANT_P (XEXP (addr, 0)))
32836         addr = XEXP (addr, 1);
32837       else if (CONSTANT_P (XEXP (addr, 1)))
32838         addr = XEXP (addr, 0);
32839       else
32840         gcc_unreachable ();
32841     }
32842   gcc_assert (REG_P (addr) && REGNO (addr) != 0);
32843   return addr;
32844 }
32845
32846 void
32847 rs6000_fatal_bad_address (rtx op)
32848 {
32849   fatal_insn ("bad address", op);
32850 }
32851
32852 #if TARGET_MACHO
32853
32854 typedef struct branch_island_d {
32855   tree function_name;
32856   tree label_name;
32857   int line_number;
32858 } branch_island;
32859
32860
32861 static vec<branch_island, va_gc> *branch_islands;
32862
32863 /* Remember to generate a branch island for far calls to the given
32864    function.  */
32865
32866 static void
32867 add_compiler_branch_island (tree label_name, tree function_name,
32868                             int line_number)
32869 {
32870   branch_island bi = {function_name, label_name, line_number};
32871   vec_safe_push (branch_islands, bi);
32872 }
32873
32874 /* Generate far-jump branch islands for everything recorded in
32875    branch_islands.  Invoked immediately after the last instruction of
32876    the epilogue has been emitted; the branch islands must be appended
32877    to, and contiguous with, the function body.  Mach-O stubs are
32878    generated in machopic_output_stub().  */
32879
32880 static void
32881 macho_branch_islands (void)
32882 {
32883   char tmp_buf[512];
32884
32885   while (!vec_safe_is_empty (branch_islands))
32886     {
32887       branch_island *bi = &branch_islands->last ();
32888       const char *label = IDENTIFIER_POINTER (bi->label_name);
32889       const char *name = IDENTIFIER_POINTER (bi->function_name);
32890       char name_buf[512];
32891       /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF().  */
32892       if (name[0] == '*' || name[0] == '&')
32893         strcpy (name_buf, name+1);
32894       else
32895         {
32896           name_buf[0] = '_';
32897           strcpy (name_buf+1, name);
32898         }
32899       strcpy (tmp_buf, "\n");
32900       strcat (tmp_buf, label);
32901 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
32902       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
32903         dbxout_stabd (N_SLINE, bi->line_number);
32904 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
32905       if (flag_pic)
32906         {
32907           if (TARGET_LINK_STACK)
32908             {
32909               char name[32];
32910               get_ppc476_thunk_name (name);
32911               strcat (tmp_buf, ":\n\tmflr r0\n\tbl ");
32912               strcat (tmp_buf, name);
32913               strcat (tmp_buf, "\n");
32914               strcat (tmp_buf, label);
32915               strcat (tmp_buf, "_pic:\n\tmflr r11\n");
32916             }
32917           else
32918             {
32919               strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
32920               strcat (tmp_buf, label);
32921               strcat (tmp_buf, "_pic\n");
32922               strcat (tmp_buf, label);
32923               strcat (tmp_buf, "_pic:\n\tmflr r11\n");
32924             }
32925
32926           strcat (tmp_buf, "\taddis r11,r11,ha16(");
32927           strcat (tmp_buf, name_buf);
32928           strcat (tmp_buf, " - ");
32929           strcat (tmp_buf, label);
32930           strcat (tmp_buf, "_pic)\n");
32931
32932           strcat (tmp_buf, "\tmtlr r0\n");
32933
32934           strcat (tmp_buf, "\taddi r12,r11,lo16(");
32935           strcat (tmp_buf, name_buf);
32936           strcat (tmp_buf, " - ");
32937           strcat (tmp_buf, label);
32938           strcat (tmp_buf, "_pic)\n");
32939
32940           strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
32941         }
32942       else
32943         {
32944           strcat (tmp_buf, ":\n\tlis r12,hi16(");
32945           strcat (tmp_buf, name_buf);
32946           strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
32947           strcat (tmp_buf, name_buf);
32948           strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
32949         }
32950       output_asm_insn (tmp_buf, 0);
32951 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
32952       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
32953         dbxout_stabd (N_SLINE, bi->line_number);
32954 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
32955       branch_islands->pop ();
32956     }
32957 }
32958
32959 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
32960    already there or not.  */
32961
32962 static int
32963 no_previous_def (tree function_name)
32964 {
32965   branch_island *bi;
32966   unsigned ix;
32967
32968   FOR_EACH_VEC_SAFE_ELT (branch_islands, ix, bi)
32969     if (function_name == bi->function_name)
32970       return 0;
32971   return 1;
32972 }
32973
32974 /* GET_PREV_LABEL gets the label name from the previous definition of
32975    the function.  */
32976
32977 static tree
32978 get_prev_label (tree function_name)
32979 {
32980   branch_island *bi;
32981   unsigned ix;
32982
32983   FOR_EACH_VEC_SAFE_ELT (branch_islands, ix, bi)
32984     if (function_name == bi->function_name)
32985       return bi->label_name;
32986   return NULL_TREE;
32987 }
32988
32989 /* Generate PIC and indirect symbol stubs.  */
32990
32991 void
32992 machopic_output_stub (FILE *file, const char *symb, const char *stub)
32993 {
32994   unsigned int length;
32995   char *symbol_name, *lazy_ptr_name;
32996   char *local_label_0;
32997   static unsigned label = 0;
32998
32999   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
33000   symb = (*targetm.strip_name_encoding) (symb);
33001
33002
33003   length = strlen (symb);
33004   symbol_name = XALLOCAVEC (char, length + 32);
33005   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
33006
33007   lazy_ptr_name = XALLOCAVEC (char, length + 32);
33008   GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
33009
33010   if (flag_pic == 2)
33011     switch_to_section (darwin_sections[machopic_picsymbol_stub1_section]);
33012   else
33013     switch_to_section (darwin_sections[machopic_symbol_stub1_section]);
33014
33015   if (flag_pic == 2)
33016     {
33017       fprintf (file, "\t.align 5\n");
33018
33019       fprintf (file, "%s:\n", stub);
33020       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
33021
33022       label++;
33023       local_label_0 = XALLOCAVEC (char, 16);
33024       sprintf (local_label_0, "L%u$spb", label);
33025
33026       fprintf (file, "\tmflr r0\n");
33027       if (TARGET_LINK_STACK)
33028         {
33029           char name[32];
33030           get_ppc476_thunk_name (name);
33031           fprintf (file, "\tbl %s\n", name);
33032           fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
33033         }
33034       else
33035         {
33036           fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
33037           fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
33038         }
33039       fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
33040                lazy_ptr_name, local_label_0);
33041       fprintf (file, "\tmtlr r0\n");
33042       fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
33043                (TARGET_64BIT ? "ldu" : "lwzu"),
33044                lazy_ptr_name, local_label_0);
33045       fprintf (file, "\tmtctr r12\n");
33046       fprintf (file, "\tbctr\n");
33047     }
33048   else
33049     {
33050       fprintf (file, "\t.align 4\n");
33051
33052       fprintf (file, "%s:\n", stub);
33053       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
33054
33055       fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
33056       fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
33057                (TARGET_64BIT ? "ldu" : "lwzu"),
33058                lazy_ptr_name);
33059       fprintf (file, "\tmtctr r12\n");
33060       fprintf (file, "\tbctr\n");
33061     }
33062
33063   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
33064   fprintf (file, "%s:\n", lazy_ptr_name);
33065   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
33066   fprintf (file, "%sdyld_stub_binding_helper\n",
33067            (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
33068 }
33069
33070 /* Legitimize PIC addresses.  If the address is already
33071    position-independent, we return ORIG.  Newly generated
33072    position-independent addresses go into a reg.  This is REG if non
33073    zero, otherwise we allocate register(s) as necessary.  */
33074
33075 #define SMALL_INT(X) ((UINTVAL (X) + 0x8000) < 0x10000)
33076
33077 rtx
33078 rs6000_machopic_legitimize_pic_address (rtx orig, machine_mode mode,
33079                                         rtx reg)
33080 {
33081   rtx base, offset;
33082
33083   if (reg == NULL && !reload_completed)
33084     reg = gen_reg_rtx (Pmode);
33085
33086   if (GET_CODE (orig) == CONST)
33087     {
33088       rtx reg_temp;
33089
33090       if (GET_CODE (XEXP (orig, 0)) == PLUS
33091           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
33092         return orig;
33093
33094       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
33095
33096       /* Use a different reg for the intermediate value, as
33097          it will be marked UNCHANGING.  */
33098       reg_temp = !can_create_pseudo_p () ? reg : gen_reg_rtx (Pmode);
33099       base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
33100                                                      Pmode, reg_temp);
33101       offset =
33102         rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
33103                                                 Pmode, reg);
33104
33105       if (CONST_INT_P (offset))
33106         {
33107           if (SMALL_INT (offset))
33108             return plus_constant (Pmode, base, INTVAL (offset));
33109           else if (!reload_completed)
33110             offset = force_reg (Pmode, offset);
33111           else
33112             {
33113               rtx mem = force_const_mem (Pmode, orig);
33114               return machopic_legitimize_pic_address (mem, Pmode, reg);
33115             }
33116         }
33117       return gen_rtx_PLUS (Pmode, base, offset);
33118     }
33119
33120   /* Fall back on generic machopic code.  */
33121   return machopic_legitimize_pic_address (orig, mode, reg);
33122 }
33123
33124 /* Output a .machine directive for the Darwin assembler, and call
33125    the generic start_file routine.  */
33126
33127 static void
33128 rs6000_darwin_file_start (void)
33129 {
33130   static const struct
33131   {
33132     const char *arg;
33133     const char *name;
33134     HOST_WIDE_INT if_set;
33135   } mapping[] = {
33136     { "ppc64", "ppc64", MASK_64BIT },
33137     { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
33138     { "power4", "ppc970", 0 },
33139     { "G5", "ppc970", 0 },
33140     { "7450", "ppc7450", 0 },
33141     { "7400", "ppc7400", MASK_ALTIVEC },
33142     { "G4", "ppc7400", 0 },
33143     { "750", "ppc750", 0 },
33144     { "740", "ppc750", 0 },
33145     { "G3", "ppc750", 0 },
33146     { "604e", "ppc604e", 0 },
33147     { "604", "ppc604", 0 },
33148     { "603e", "ppc603", 0 },
33149     { "603", "ppc603", 0 },
33150     { "601", "ppc601", 0 },
33151     { NULL, "ppc", 0 } };
33152   const char *cpu_id = "";
33153   size_t i;
33154
33155   rs6000_file_start ();
33156   darwin_file_start ();
33157
33158   /* Determine the argument to -mcpu=.  Default to G3 if not specified.  */
33159   
33160   if (rs6000_default_cpu != 0 && rs6000_default_cpu[0] != '\0')
33161     cpu_id = rs6000_default_cpu;
33162
33163   if (global_options_set.x_rs6000_cpu_index)
33164     cpu_id = processor_target_table[rs6000_cpu_index].name;
33165
33166   /* Look through the mapping array.  Pick the first name that either
33167      matches the argument, has a bit set in IF_SET that is also set
33168      in the target flags, or has a NULL name.  */
33169
33170   i = 0;
33171   while (mapping[i].arg != NULL
33172          && strcmp (mapping[i].arg, cpu_id) != 0
33173          && (mapping[i].if_set & rs6000_isa_flags) == 0)
33174     i++;
33175
33176   fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
33177 }
33178
33179 #endif /* TARGET_MACHO */
33180
33181 #if TARGET_ELF
33182 static int
33183 rs6000_elf_reloc_rw_mask (void)
33184 {
33185   if (flag_pic)
33186     return 3;
33187   else if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
33188     return 2;
33189   else
33190     return 0;
33191 }
33192
33193 /* Record an element in the table of global constructors.  SYMBOL is
33194    a SYMBOL_REF of the function to be called; PRIORITY is a number
33195    between 0 and MAX_INIT_PRIORITY.
33196
33197    This differs from default_named_section_asm_out_constructor in
33198    that we have special handling for -mrelocatable.  */
33199
33200 static void rs6000_elf_asm_out_constructor (rtx, int) ATTRIBUTE_UNUSED;
33201 static void
33202 rs6000_elf_asm_out_constructor (rtx symbol, int priority)
33203 {
33204   const char *section = ".ctors";
33205   char buf[18];
33206
33207   if (priority != DEFAULT_INIT_PRIORITY)
33208     {
33209       sprintf (buf, ".ctors.%.5u",
33210                /* Invert the numbering so the linker puts us in the proper
33211                   order; constructors are run from right to left, and the
33212                   linker sorts in increasing order.  */
33213                MAX_INIT_PRIORITY - priority);
33214       section = buf;
33215     }
33216
33217   switch_to_section (get_section (section, SECTION_WRITE, NULL));
33218   assemble_align (POINTER_SIZE);
33219
33220   if (DEFAULT_ABI == ABI_V4
33221       && (TARGET_RELOCATABLE || flag_pic > 1))
33222     {
33223       fputs ("\t.long (", asm_out_file);
33224       output_addr_const (asm_out_file, symbol);
33225       fputs (")@fixup\n", asm_out_file);
33226     }
33227   else
33228     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
33229 }
33230
33231 static void rs6000_elf_asm_out_destructor (rtx, int) ATTRIBUTE_UNUSED;
33232 static void
33233 rs6000_elf_asm_out_destructor (rtx symbol, int priority)
33234 {
33235   const char *section = ".dtors";
33236   char buf[18];
33237
33238   if (priority != DEFAULT_INIT_PRIORITY)
33239     {
33240       sprintf (buf, ".dtors.%.5u",
33241                /* Invert the numbering so the linker puts us in the proper
33242                   order; constructors are run from right to left, and the
33243                   linker sorts in increasing order.  */
33244                MAX_INIT_PRIORITY - priority);
33245       section = buf;
33246     }
33247
33248   switch_to_section (get_section (section, SECTION_WRITE, NULL));
33249   assemble_align (POINTER_SIZE);
33250
33251   if (DEFAULT_ABI == ABI_V4
33252       && (TARGET_RELOCATABLE || flag_pic > 1))
33253     {
33254       fputs ("\t.long (", asm_out_file);
33255       output_addr_const (asm_out_file, symbol);
33256       fputs (")@fixup\n", asm_out_file);
33257     }
33258   else
33259     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
33260 }
33261
33262 void
33263 rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
33264 {
33265   if (TARGET_64BIT && DEFAULT_ABI != ABI_ELFv2)
33266     {
33267       fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
33268       ASM_OUTPUT_LABEL (file, name);
33269       fputs (DOUBLE_INT_ASM_OP, file);
33270       rs6000_output_function_entry (file, name);
33271       fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
33272       if (DOT_SYMBOLS)
33273         {
33274           fputs ("\t.size\t", file);
33275           assemble_name (file, name);
33276           fputs (",24\n\t.type\t.", file);
33277           assemble_name (file, name);
33278           fputs (",@function\n", file);
33279           if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
33280             {
33281               fputs ("\t.globl\t.", file);
33282               assemble_name (file, name);
33283               putc ('\n', file);
33284             }
33285         }
33286       else
33287         ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
33288       ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
33289       rs6000_output_function_entry (file, name);
33290       fputs (":\n", file);
33291       return;
33292     }
33293
33294   int uses_toc;
33295   if (DEFAULT_ABI == ABI_V4
33296       && (TARGET_RELOCATABLE || flag_pic > 1)
33297       && !TARGET_SECURE_PLT
33298       && (!constant_pool_empty_p () || crtl->profile)
33299       && (uses_toc = uses_TOC ()))
33300     {
33301       char buf[256];
33302
33303       if (uses_toc == 2)
33304         switch_to_other_text_partition ();
33305       (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
33306
33307       fprintf (file, "\t.long ");
33308       assemble_name (file, toc_label_name);
33309       need_toc_init = 1;
33310       putc ('-', file);
33311       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
33312       assemble_name (file, buf);
33313       putc ('\n', file);
33314       if (uses_toc == 2)
33315         switch_to_other_text_partition ();
33316     }
33317
33318   ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
33319   ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
33320
33321   if (TARGET_CMODEL == CMODEL_LARGE && rs6000_global_entry_point_needed_p ())
33322     {
33323       char buf[256];
33324
33325       (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
33326
33327       fprintf (file, "\t.quad .TOC.-");
33328       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
33329       assemble_name (file, buf);
33330       putc ('\n', file);
33331     }
33332
33333   if (DEFAULT_ABI == ABI_AIX)
33334     {
33335       const char *desc_name, *orig_name;
33336
33337       orig_name = (*targetm.strip_name_encoding) (name);
33338       desc_name = orig_name;
33339       while (*desc_name == '.')
33340         desc_name++;
33341
33342       if (TREE_PUBLIC (decl))
33343         fprintf (file, "\t.globl %s\n", desc_name);
33344
33345       fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
33346       fprintf (file, "%s:\n", desc_name);
33347       fprintf (file, "\t.long %s\n", orig_name);
33348       fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
33349       fputs ("\t.long 0\n", file);
33350       fprintf (file, "\t.previous\n");
33351     }
33352   ASM_OUTPUT_LABEL (file, name);
33353 }
33354
33355 static void rs6000_elf_file_end (void) ATTRIBUTE_UNUSED;
33356 static void
33357 rs6000_elf_file_end (void)
33358 {
33359 #ifdef HAVE_AS_GNU_ATTRIBUTE
33360   /* ??? The value emitted depends on options active at file end.
33361      Assume anyone using #pragma or attributes that might change
33362      options knows what they are doing.  */
33363   if ((TARGET_64BIT || DEFAULT_ABI == ABI_V4)
33364       && rs6000_passes_float)
33365     {
33366       int fp;
33367
33368       if (TARGET_HARD_FLOAT)
33369         fp = 1;
33370       else
33371         fp = 2;
33372       if (rs6000_passes_long_double)
33373         {
33374           if (!TARGET_LONG_DOUBLE_128)
33375             fp |= 2 * 4;
33376           else if (TARGET_IEEEQUAD)
33377             fp |= 3 * 4;
33378           else
33379             fp |= 1 * 4;
33380         }
33381       fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n", fp);
33382     }
33383   if (TARGET_32BIT && DEFAULT_ABI == ABI_V4)
33384     {
33385       if (rs6000_passes_vector)
33386         fprintf (asm_out_file, "\t.gnu_attribute 8, %d\n",
33387                  (TARGET_ALTIVEC_ABI ? 2 : 1));
33388       if (rs6000_returns_struct)
33389         fprintf (asm_out_file, "\t.gnu_attribute 12, %d\n",
33390                  aix_struct_return ? 2 : 1);
33391     }
33392 #endif
33393 #if defined (POWERPC_LINUX) || defined (POWERPC_FREEBSD)
33394   if (TARGET_32BIT || DEFAULT_ABI == ABI_ELFv2)
33395     file_end_indicate_exec_stack ();
33396 #endif
33397
33398   if (flag_split_stack)
33399     file_end_indicate_split_stack ();
33400
33401   if (cpu_builtin_p)
33402     {
33403       /* We have expanded a CPU builtin, so we need to emit a reference to
33404          the special symbol that LIBC uses to declare it supports the
33405          AT_PLATFORM and AT_HWCAP/AT_HWCAP2 in the TCB feature.  */
33406       switch_to_section (data_section);
33407       fprintf (asm_out_file, "\t.align %u\n", TARGET_32BIT ? 2 : 3);
33408       fprintf (asm_out_file, "\t%s %s\n",
33409                TARGET_32BIT ? ".long" : ".quad", tcb_verification_symbol);
33410     }
33411 }
33412 #endif
33413
33414 #if TARGET_XCOFF
33415
33416 #ifndef HAVE_XCOFF_DWARF_EXTRAS
33417 #define HAVE_XCOFF_DWARF_EXTRAS 0
33418 #endif
33419
33420 static enum unwind_info_type
33421 rs6000_xcoff_debug_unwind_info (void)
33422 {
33423   return UI_NONE;
33424 }
33425
33426 static void
33427 rs6000_xcoff_asm_output_anchor (rtx symbol)
33428 {
33429   char buffer[100];
33430
33431   sprintf (buffer, "$ + " HOST_WIDE_INT_PRINT_DEC,
33432            SYMBOL_REF_BLOCK_OFFSET (symbol));
33433   fprintf (asm_out_file, "%s", SET_ASM_OP);
33434   RS6000_OUTPUT_BASENAME (asm_out_file, XSTR (symbol, 0));
33435   fprintf (asm_out_file, ",");
33436   RS6000_OUTPUT_BASENAME (asm_out_file, buffer);
33437   fprintf (asm_out_file, "\n");
33438 }
33439
33440 static void
33441 rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
33442 {
33443   fputs (GLOBAL_ASM_OP, stream);
33444   RS6000_OUTPUT_BASENAME (stream, name);
33445   putc ('\n', stream);
33446 }
33447
33448 /* A get_unnamed_decl callback, used for read-only sections.  PTR
33449    points to the section string variable.  */
33450
33451 static void
33452 rs6000_xcoff_output_readonly_section_asm_op (const void *directive)
33453 {
33454   fprintf (asm_out_file, "\t.csect %s[RO],%s\n",
33455            *(const char *const *) directive,
33456            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
33457 }
33458
33459 /* Likewise for read-write sections.  */
33460
33461 static void
33462 rs6000_xcoff_output_readwrite_section_asm_op (const void *directive)
33463 {
33464   fprintf (asm_out_file, "\t.csect %s[RW],%s\n",
33465            *(const char *const *) directive,
33466            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
33467 }
33468
33469 static void
33470 rs6000_xcoff_output_tls_section_asm_op (const void *directive)
33471 {
33472   fprintf (asm_out_file, "\t.csect %s[TL],%s\n",
33473            *(const char *const *) directive,
33474            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
33475 }
33476
33477 /* A get_unnamed_section callback, used for switching to toc_section.  */
33478
33479 static void
33480 rs6000_xcoff_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
33481 {
33482   if (TARGET_MINIMAL_TOC)
33483     {
33484       /* toc_section is always selected at least once from
33485          rs6000_xcoff_file_start, so this is guaranteed to
33486          always be defined once and only once in each file.  */
33487       if (!toc_initialized)
33488         {
33489           fputs ("\t.toc\nLCTOC..1:\n", asm_out_file);
33490           fputs ("\t.tc toc_table[TC],toc_table[RW]\n", asm_out_file);
33491           toc_initialized = 1;
33492         }
33493       fprintf (asm_out_file, "\t.csect toc_table[RW]%s\n",
33494                (TARGET_32BIT ? "" : ",3"));
33495     }
33496   else
33497     fputs ("\t.toc\n", asm_out_file);
33498 }
33499
33500 /* Implement TARGET_ASM_INIT_SECTIONS.  */
33501
33502 static void
33503 rs6000_xcoff_asm_init_sections (void)
33504 {
33505   read_only_data_section
33506     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
33507                            &xcoff_read_only_section_name);
33508
33509   private_data_section
33510     = get_unnamed_section (SECTION_WRITE,
33511                            rs6000_xcoff_output_readwrite_section_asm_op,
33512                            &xcoff_private_data_section_name);
33513
33514   read_only_private_data_section
33515     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
33516                            &xcoff_private_rodata_section_name);
33517
33518   tls_data_section
33519     = get_unnamed_section (SECTION_TLS,
33520                            rs6000_xcoff_output_tls_section_asm_op,
33521                            &xcoff_tls_data_section_name);
33522
33523   tls_private_data_section
33524     = get_unnamed_section (SECTION_TLS,
33525                            rs6000_xcoff_output_tls_section_asm_op,
33526                            &xcoff_private_data_section_name);
33527
33528   toc_section
33529     = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);
33530
33531   readonly_data_section = read_only_data_section;
33532 }
33533
33534 static int
33535 rs6000_xcoff_reloc_rw_mask (void)
33536 {
33537   return 3;
33538 }
33539
33540 static void
33541 rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
33542                                 tree decl ATTRIBUTE_UNUSED)
33543 {
33544   int smclass;
33545   static const char * const suffix[5] = { "PR", "RO", "RW", "TL", "XO" };
33546
33547   if (flags & SECTION_EXCLUDE)
33548     smclass = 4;
33549   else if (flags & SECTION_DEBUG)
33550     {
33551       fprintf (asm_out_file, "\t.dwsect %s\n", name);
33552       return;
33553     }
33554   else if (flags & SECTION_CODE)
33555     smclass = 0;
33556   else if (flags & SECTION_TLS)
33557     smclass = 3;
33558   else if (flags & SECTION_WRITE)
33559     smclass = 2;
33560   else
33561     smclass = 1;
33562
33563   fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
33564            (flags & SECTION_CODE) ? "." : "",
33565            name, suffix[smclass], flags & SECTION_ENTSIZE);
33566 }
33567
33568 #define IN_NAMED_SECTION(DECL) \
33569   ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
33570    && DECL_SECTION_NAME (DECL) != NULL)
33571
33572 static section *
33573 rs6000_xcoff_select_section (tree decl, int reloc,
33574                              unsigned HOST_WIDE_INT align)
33575 {
33576   /* Place variables with alignment stricter than BIGGEST_ALIGNMENT into
33577      named section.  */
33578   if (align > BIGGEST_ALIGNMENT)
33579     {
33580       resolve_unique_section (decl, reloc, true);
33581       if (IN_NAMED_SECTION (decl))
33582         return get_named_section (decl, NULL, reloc);
33583     }
33584
33585   if (decl_readonly_section (decl, reloc))
33586     {
33587       if (TREE_PUBLIC (decl))
33588         return read_only_data_section;
33589       else
33590         return read_only_private_data_section;
33591     }
33592   else
33593     {
33594 #if HAVE_AS_TLS
33595       if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
33596         {
33597           if (TREE_PUBLIC (decl))
33598             return tls_data_section;
33599           else if (bss_initializer_p (decl))
33600             {
33601               /* Convert to COMMON to emit in BSS.  */
33602               DECL_COMMON (decl) = 1;
33603               return tls_comm_section;
33604             }
33605           else
33606             return tls_private_data_section;
33607         }
33608       else
33609 #endif
33610         if (TREE_PUBLIC (decl))
33611         return data_section;
33612       else
33613         return private_data_section;
33614     }
33615 }
33616
33617 static void
33618 rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
33619 {
33620   const char *name;
33621
33622   /* Use select_section for private data and uninitialized data with
33623      alignment <= BIGGEST_ALIGNMENT.  */
33624   if (!TREE_PUBLIC (decl)
33625       || DECL_COMMON (decl)
33626       || (DECL_INITIAL (decl) == NULL_TREE
33627           && DECL_ALIGN (decl) <= BIGGEST_ALIGNMENT)
33628       || DECL_INITIAL (decl) == error_mark_node
33629       || (flag_zero_initialized_in_bss
33630           && initializer_zerop (DECL_INITIAL (decl))))
33631     return;
33632
33633   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
33634   name = (*targetm.strip_name_encoding) (name);
33635   set_decl_section_name (decl, name);
33636 }
33637
33638 /* Select section for constant in constant pool.
33639
33640    On RS/6000, all constants are in the private read-only data area.
33641    However, if this is being placed in the TOC it must be output as a
33642    toc entry.  */
33643
33644 static section *
33645 rs6000_xcoff_select_rtx_section (machine_mode mode, rtx x,
33646                                  unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
33647 {
33648   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
33649     return toc_section;
33650   else
33651     return read_only_private_data_section;
33652 }
33653
33654 /* Remove any trailing [DS] or the like from the symbol name.  */
33655
33656 static const char *
33657 rs6000_xcoff_strip_name_encoding (const char *name)
33658 {
33659   size_t len;
33660   if (*name == '*')
33661     name++;
33662   len = strlen (name);
33663   if (name[len - 1] == ']')
33664     return ggc_alloc_string (name, len - 4);
33665   else
33666     return name;
33667 }
33668
33669 /* Section attributes.  AIX is always PIC.  */
33670
33671 static unsigned int
33672 rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
33673 {
33674   unsigned int align;
33675   unsigned int flags = default_section_type_flags (decl, name, reloc);
33676
33677   /* Align to at least UNIT size.  */
33678   if ((flags & SECTION_CODE) != 0 || !decl || !DECL_P (decl))
33679     align = MIN_UNITS_PER_WORD;
33680   else
33681     /* Increase alignment of large objects if not already stricter.  */
33682     align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
33683                  int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
33684                  ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
33685
33686   return flags | (exact_log2 (align) & SECTION_ENTSIZE);
33687 }
33688
33689 /* Output at beginning of assembler file.
33690
33691    Initialize the section names for the RS/6000 at this point.
33692
33693    Specify filename, including full path, to assembler.
33694
33695    We want to go into the TOC section so at least one .toc will be emitted.
33696    Also, in order to output proper .bs/.es pairs, we need at least one static
33697    [RW] section emitted.
33698
33699    Finally, declare mcount when profiling to make the assembler happy.  */
33700
33701 static void
33702 rs6000_xcoff_file_start (void)
33703 {
33704   rs6000_gen_section_name (&xcoff_bss_section_name,
33705                            main_input_filename, ".bss_");
33706   rs6000_gen_section_name (&xcoff_private_data_section_name,
33707                            main_input_filename, ".rw_");
33708   rs6000_gen_section_name (&xcoff_private_rodata_section_name,
33709                            main_input_filename, ".rop_");
33710   rs6000_gen_section_name (&xcoff_read_only_section_name,
33711                            main_input_filename, ".ro_");
33712   rs6000_gen_section_name (&xcoff_tls_data_section_name,
33713                            main_input_filename, ".tls_");
33714   rs6000_gen_section_name (&xcoff_tbss_section_name,
33715                            main_input_filename, ".tbss_[UL]");
33716
33717   fputs ("\t.file\t", asm_out_file);
33718   output_quoted_string (asm_out_file, main_input_filename);
33719   fputc ('\n', asm_out_file);
33720   if (write_symbols != NO_DEBUG)
33721     switch_to_section (private_data_section);
33722   switch_to_section (toc_section);
33723   switch_to_section (text_section);
33724   if (profile_flag)
33725     fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
33726   rs6000_file_start ();
33727 }
33728
33729 /* Output at end of assembler file.
33730    On the RS/6000, referencing data should automatically pull in text.  */
33731
33732 static void
33733 rs6000_xcoff_file_end (void)
33734 {
33735   switch_to_section (text_section);
33736   fputs ("_section_.text:\n", asm_out_file);
33737   switch_to_section (data_section);
33738   fputs (TARGET_32BIT
33739          ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
33740          asm_out_file);
33741 }
33742
33743 struct declare_alias_data
33744 {
33745   FILE *file;
33746   bool function_descriptor;
33747 };
33748
33749 /* Declare alias N.  A helper function for for_node_and_aliases.  */
33750
33751 static bool
33752 rs6000_declare_alias (struct symtab_node *n, void *d)
33753 {
33754   struct declare_alias_data *data = (struct declare_alias_data *)d;
33755   /* Main symbol is output specially, because varasm machinery does part of
33756      the job for us - we do not need to declare .globl/lglobs and such.  */
33757   if (!n->alias || n->weakref)
33758     return false;
33759
33760   if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (n->decl)))
33761     return false;
33762
33763   /* Prevent assemble_alias from trying to use .set pseudo operation
33764      that does not behave as expected by the middle-end.  */
33765   TREE_ASM_WRITTEN (n->decl) = true;
33766
33767   const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (n->decl));
33768   char *buffer = (char *) alloca (strlen (name) + 2);
33769   char *p;
33770   int dollar_inside = 0;
33771
33772   strcpy (buffer, name);
33773   p = strchr (buffer, '$');
33774   while (p) {
33775     *p = '_';
33776     dollar_inside++;
33777     p = strchr (p + 1, '$');
33778   }
33779   if (TREE_PUBLIC (n->decl))
33780     {
33781       if (!RS6000_WEAK || !DECL_WEAK (n->decl))
33782         {
33783           if (dollar_inside) {
33784               if (data->function_descriptor)
33785                 fprintf(data->file, "\t.rename .%s,\".%s\"\n", buffer, name);
33786               fprintf(data->file, "\t.rename %s,\"%s\"\n", buffer, name);
33787             }
33788           if (data->function_descriptor)
33789             {
33790               fputs ("\t.globl .", data->file);
33791               RS6000_OUTPUT_BASENAME (data->file, buffer);
33792               putc ('\n', data->file);
33793             }
33794           fputs ("\t.globl ", data->file);
33795           RS6000_OUTPUT_BASENAME (data->file, buffer);
33796           putc ('\n', data->file);
33797         }
33798 #ifdef ASM_WEAKEN_DECL
33799       else if (DECL_WEAK (n->decl) && !data->function_descriptor)
33800         ASM_WEAKEN_DECL (data->file, n->decl, name, NULL);
33801 #endif
33802     }
33803   else
33804     {
33805       if (dollar_inside)
33806         {
33807           if (data->function_descriptor)
33808             fprintf(data->file, "\t.rename .%s,\".%s\"\n", buffer, name);
33809           fprintf(data->file, "\t.rename %s,\"%s\"\n", buffer, name);
33810         }
33811       if (data->function_descriptor)
33812         {
33813           fputs ("\t.lglobl .", data->file);
33814           RS6000_OUTPUT_BASENAME (data->file, buffer);
33815           putc ('\n', data->file);
33816         }
33817       fputs ("\t.lglobl ", data->file);
33818       RS6000_OUTPUT_BASENAME (data->file, buffer);
33819       putc ('\n', data->file);
33820     }
33821   if (data->function_descriptor)
33822     fputs (".", data->file);
33823   RS6000_OUTPUT_BASENAME (data->file, buffer);
33824   fputs (":\n", data->file);
33825   return false;
33826 }
33827
33828
33829 #ifdef HAVE_GAS_HIDDEN
33830 /* Helper function to calculate visibility of a DECL
33831    and return the value as a const string.  */
33832
33833 static const char *
33834 rs6000_xcoff_visibility (tree decl)
33835 {
33836   static const char * const visibility_types[] = {
33837     "", ",protected", ",hidden", ",internal"
33838   };
33839
33840   enum symbol_visibility vis = DECL_VISIBILITY (decl);
33841   return visibility_types[vis];
33842 }
33843 #endif
33844
33845
33846 /* This macro produces the initial definition of a function name.
33847    On the RS/6000, we need to place an extra '.' in the function name and
33848    output the function descriptor.
33849    Dollar signs are converted to underscores.
33850
33851    The csect for the function will have already been created when
33852    text_section was selected.  We do have to go back to that csect, however.
33853
33854    The third and fourth parameters to the .function pseudo-op (16 and 044)
33855    are placeholders which no longer have any use.
33856
33857    Because AIX assembler's .set command has unexpected semantics, we output
33858    all aliases as alternative labels in front of the definition.  */
33859
33860 void
33861 rs6000_xcoff_declare_function_name (FILE *file, const char *name, tree decl)
33862 {
33863   char *buffer = (char *) alloca (strlen (name) + 1);
33864   char *p;
33865   int dollar_inside = 0;
33866   struct declare_alias_data data = {file, false};
33867
33868   strcpy (buffer, name);
33869   p = strchr (buffer, '$');
33870   while (p) {
33871     *p = '_';
33872     dollar_inside++;
33873     p = strchr (p + 1, '$');
33874   }
33875   if (TREE_PUBLIC (decl))
33876     {
33877       if (!RS6000_WEAK || !DECL_WEAK (decl))
33878         {
33879           if (dollar_inside) {
33880               fprintf(file, "\t.rename .%s,\".%s\"\n", buffer, name);
33881               fprintf(file, "\t.rename %s,\"%s\"\n", buffer, name);
33882             }
33883           fputs ("\t.globl .", file);
33884           RS6000_OUTPUT_BASENAME (file, buffer);
33885 #ifdef HAVE_GAS_HIDDEN
33886           fputs (rs6000_xcoff_visibility (decl), file);
33887 #endif
33888           putc ('\n', file);
33889         }
33890     }
33891   else
33892     {
33893       if (dollar_inside) {
33894           fprintf(file, "\t.rename .%s,\".%s\"\n", buffer, name);
33895           fprintf(file, "\t.rename %s,\"%s\"\n", buffer, name);
33896         }
33897       fputs ("\t.lglobl .", file);
33898       RS6000_OUTPUT_BASENAME (file, buffer);
33899       putc ('\n', file);
33900     }
33901   fputs ("\t.csect ", file);
33902   RS6000_OUTPUT_BASENAME (file, buffer);
33903   fputs (TARGET_32BIT ? "[DS]\n" : "[DS],3\n", file);
33904   RS6000_OUTPUT_BASENAME (file, buffer);
33905   fputs (":\n", file);
33906   symtab_node::get (decl)->call_for_symbol_and_aliases (rs6000_declare_alias,
33907                                                         &data, true);
33908   fputs (TARGET_32BIT ? "\t.long ." : "\t.llong .", file);
33909   RS6000_OUTPUT_BASENAME (file, buffer);
33910   fputs (", TOC[tc0], 0\n", file);
33911   in_section = NULL;
33912   switch_to_section (function_section (decl));
33913   putc ('.', file);
33914   RS6000_OUTPUT_BASENAME (file, buffer);
33915   fputs (":\n", file);
33916   data.function_descriptor = true;
33917   symtab_node::get (decl)->call_for_symbol_and_aliases (rs6000_declare_alias,
33918                                                         &data, true);
33919   if (!DECL_IGNORED_P (decl))
33920     {
33921       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
33922         xcoffout_declare_function (file, decl, buffer);
33923       else if (write_symbols == DWARF2_DEBUG)
33924         {
33925           name = (*targetm.strip_name_encoding) (name);
33926           fprintf (file, "\t.function .%s,.%s,2,0\n", name, name);
33927         }
33928     }
33929   return;
33930 }
33931
33932
33933 /* Output assembly language to globalize a symbol from a DECL,
33934    possibly with visibility.  */
33935
33936 void
33937 rs6000_xcoff_asm_globalize_decl_name (FILE *stream, tree decl)
33938 {
33939   const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
33940   fputs (GLOBAL_ASM_OP, stream);
33941   RS6000_OUTPUT_BASENAME (stream, name);
33942 #ifdef HAVE_GAS_HIDDEN
33943   fputs (rs6000_xcoff_visibility (decl), stream);
33944 #endif
33945   putc ('\n', stream);
33946 }
33947
33948 /* Output assembly language to define a symbol as COMMON from a DECL,
33949    possibly with visibility.  */
33950
33951 void
33952 rs6000_xcoff_asm_output_aligned_decl_common (FILE *stream,
33953                                              tree decl ATTRIBUTE_UNUSED,
33954                                              const char *name,
33955                                              unsigned HOST_WIDE_INT size,
33956                                              unsigned HOST_WIDE_INT align)
33957 {
33958   unsigned HOST_WIDE_INT align2 = 2;
33959
33960   if (align > 32)
33961     align2 = floor_log2 (align / BITS_PER_UNIT);
33962   else if (size > 4)
33963     align2 = 3;
33964
33965   fputs (COMMON_ASM_OP, stream);
33966   RS6000_OUTPUT_BASENAME (stream, name);
33967
33968   fprintf (stream,
33969            "," HOST_WIDE_INT_PRINT_UNSIGNED "," HOST_WIDE_INT_PRINT_UNSIGNED,
33970            size, align2);
33971
33972 #ifdef HAVE_GAS_HIDDEN
33973   if (decl != NULL)
33974     fputs (rs6000_xcoff_visibility (decl), stream);
33975 #endif
33976   putc ('\n', stream);
33977 }
33978
33979 /* This macro produces the initial definition of a object (variable) name.
33980    Because AIX assembler's .set command has unexpected semantics, we output
33981    all aliases as alternative labels in front of the definition.  */
33982
33983 void
33984 rs6000_xcoff_declare_object_name (FILE *file, const char *name, tree decl)
33985 {
33986   struct declare_alias_data data = {file, false};
33987   RS6000_OUTPUT_BASENAME (file, name);
33988   fputs (":\n", file);
33989   symtab_node::get_create (decl)->call_for_symbol_and_aliases (rs6000_declare_alias,
33990                                                                &data, true);
33991 }
33992
33993 /* Overide the default 'SYMBOL-.' syntax with AIX compatible 'SYMBOL-$'. */
33994
33995 void
33996 rs6000_asm_output_dwarf_pcrel (FILE *file, int size, const char *label)
33997 {
33998   fputs (integer_asm_op (size, FALSE), file);
33999   assemble_name (file, label);
34000   fputs ("-$", file);
34001 }
34002
34003 /* Output a symbol offset relative to the dbase for the current object.
34004    We use __gcc_unwind_dbase as an arbitrary base for dbase and assume
34005    signed offsets.
34006
34007    __gcc_unwind_dbase is embedded in all executables/libraries through
34008    libgcc/config/rs6000/crtdbase.S.  */
34009
34010 void
34011 rs6000_asm_output_dwarf_datarel (FILE *file, int size, const char *label)
34012 {
34013   fputs (integer_asm_op (size, FALSE), file);
34014   assemble_name (file, label);
34015   fputs("-__gcc_unwind_dbase", file);
34016 }
34017
34018 #ifdef HAVE_AS_TLS
34019 static void
34020 rs6000_xcoff_encode_section_info (tree decl, rtx rtl, int first)
34021 {
34022   rtx symbol;
34023   int flags;
34024   const char *symname;
34025
34026   default_encode_section_info (decl, rtl, first);
34027
34028   /* Careful not to prod global register variables.  */
34029   if (!MEM_P (rtl))
34030     return;
34031   symbol = XEXP (rtl, 0);
34032   if (!SYMBOL_REF_P (symbol))
34033     return;
34034
34035   flags = SYMBOL_REF_FLAGS (symbol);
34036
34037   if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
34038     flags &= ~SYMBOL_FLAG_HAS_BLOCK_INFO;
34039
34040   SYMBOL_REF_FLAGS (symbol) = flags;
34041
34042   /* Append mapping class to extern decls.  */
34043   symname = XSTR (symbol, 0);
34044   if (decl /* sync condition with assemble_external () */
34045       && DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl)
34046       && ((TREE_CODE (decl) == VAR_DECL && !DECL_THREAD_LOCAL_P (decl))
34047           || TREE_CODE (decl) == FUNCTION_DECL)
34048       && symname[strlen (symname) - 1] != ']')
34049     {
34050       char *newname = (char *) alloca (strlen (symname) + 5);
34051       strcpy (newname, symname);
34052       strcat (newname, (TREE_CODE (decl) == FUNCTION_DECL
34053                         ? "[DS]" : "[UA]"));
34054       XSTR (symbol, 0) = ggc_strdup (newname);
34055     }
34056 }
34057 #endif /* HAVE_AS_TLS */
34058 #endif /* TARGET_XCOFF */
34059
34060 void
34061 rs6000_asm_weaken_decl (FILE *stream, tree decl,
34062                         const char *name, const char *val)
34063 {
34064   fputs ("\t.weak\t", stream);
34065   RS6000_OUTPUT_BASENAME (stream, name);
34066   if (decl && TREE_CODE (decl) == FUNCTION_DECL
34067       && DEFAULT_ABI == ABI_AIX && DOT_SYMBOLS)
34068     {
34069       if (TARGET_XCOFF)                                         
34070         fputs ("[DS]", stream);
34071 #if TARGET_XCOFF && HAVE_GAS_HIDDEN
34072       if (TARGET_XCOFF)
34073         fputs (rs6000_xcoff_visibility (decl), stream);
34074 #endif
34075       fputs ("\n\t.weak\t.", stream);
34076       RS6000_OUTPUT_BASENAME (stream, name);
34077     }
34078 #if TARGET_XCOFF && HAVE_GAS_HIDDEN
34079   if (TARGET_XCOFF)
34080     fputs (rs6000_xcoff_visibility (decl), stream);
34081 #endif
34082   fputc ('\n', stream);
34083   if (val)
34084     {
34085 #ifdef ASM_OUTPUT_DEF
34086       ASM_OUTPUT_DEF (stream, name, val);
34087 #endif
34088       if (decl && TREE_CODE (decl) == FUNCTION_DECL
34089           && DEFAULT_ABI == ABI_AIX && DOT_SYMBOLS)
34090         {
34091           fputs ("\t.set\t.", stream);
34092           RS6000_OUTPUT_BASENAME (stream, name);
34093           fputs (",.", stream);
34094           RS6000_OUTPUT_BASENAME (stream, val);
34095           fputc ('\n', stream);
34096         }
34097     }
34098 }
34099
34100
34101 /* Return true if INSN should not be copied.  */
34102
34103 static bool
34104 rs6000_cannot_copy_insn_p (rtx_insn *insn)
34105 {
34106   return recog_memoized (insn) >= 0
34107          && get_attr_cannot_copy (insn);
34108 }
34109
34110 /* Compute a (partial) cost for rtx X.  Return true if the complete
34111    cost has been computed, and false if subexpressions should be
34112    scanned.  In either case, *TOTAL contains the cost result.  */
34113
34114 static bool
34115 rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code,
34116                   int opno ATTRIBUTE_UNUSED, int *total, bool speed)
34117 {
34118   int code = GET_CODE (x);
34119
34120   switch (code)
34121     {
34122       /* On the RS/6000, if it is valid in the insn, it is free.  */
34123     case CONST_INT:
34124       if (((outer_code == SET
34125             || outer_code == PLUS
34126             || outer_code == MINUS)
34127            && (satisfies_constraint_I (x)
34128                || satisfies_constraint_L (x)))
34129           || (outer_code == AND
34130               && (satisfies_constraint_K (x)
34131                   || (mode == SImode
34132                       ? satisfies_constraint_L (x)
34133                       : satisfies_constraint_J (x))))
34134           || ((outer_code == IOR || outer_code == XOR)
34135               && (satisfies_constraint_K (x)
34136                   || (mode == SImode
34137                       ? satisfies_constraint_L (x)
34138                       : satisfies_constraint_J (x))))
34139           || outer_code == ASHIFT
34140           || outer_code == ASHIFTRT
34141           || outer_code == LSHIFTRT
34142           || outer_code == ROTATE
34143           || outer_code == ROTATERT
34144           || outer_code == ZERO_EXTRACT
34145           || (outer_code == MULT
34146               && satisfies_constraint_I (x))
34147           || ((outer_code == DIV || outer_code == UDIV
34148                || outer_code == MOD || outer_code == UMOD)
34149               && exact_log2 (INTVAL (x)) >= 0)
34150           || (outer_code == COMPARE
34151               && (satisfies_constraint_I (x)
34152                   || satisfies_constraint_K (x)))
34153           || ((outer_code == EQ || outer_code == NE)
34154               && (satisfies_constraint_I (x)
34155                   || satisfies_constraint_K (x)
34156                   || (mode == SImode
34157                       ? satisfies_constraint_L (x)
34158                       : satisfies_constraint_J (x))))
34159           || (outer_code == GTU
34160               && satisfies_constraint_I (x))
34161           || (outer_code == LTU
34162               && satisfies_constraint_P (x)))
34163         {
34164           *total = 0;
34165           return true;
34166         }
34167       else if ((outer_code == PLUS
34168                 && reg_or_add_cint_operand (x, VOIDmode))
34169                || (outer_code == MINUS
34170                    && reg_or_sub_cint_operand (x, VOIDmode))
34171                || ((outer_code == SET
34172                     || outer_code == IOR
34173                     || outer_code == XOR)
34174                    && (INTVAL (x)
34175                        & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
34176         {
34177           *total = COSTS_N_INSNS (1);
34178           return true;
34179         }
34180       /* FALLTHRU */
34181
34182     case CONST_DOUBLE:
34183     case CONST_WIDE_INT:
34184     case CONST:
34185     case HIGH:
34186     case SYMBOL_REF:
34187       *total = !speed ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
34188       return true;
34189
34190     case MEM:
34191       /* When optimizing for size, MEM should be slightly more expensive
34192          than generating address, e.g., (plus (reg) (const)).
34193          L1 cache latency is about two instructions.  */
34194       *total = !speed ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
34195       if (rs6000_slow_unaligned_access (mode, MEM_ALIGN (x)))
34196         *total += COSTS_N_INSNS (100);
34197       return true;
34198
34199     case LABEL_REF:
34200       *total = 0;
34201       return true;
34202
34203     case PLUS:
34204     case MINUS:
34205       if (FLOAT_MODE_P (mode))
34206         *total = rs6000_cost->fp;
34207       else
34208         *total = COSTS_N_INSNS (1);
34209       return false;
34210
34211     case MULT:
34212       if (CONST_INT_P (XEXP (x, 1))
34213           && satisfies_constraint_I (XEXP (x, 1)))
34214         {
34215           if (INTVAL (XEXP (x, 1)) >= -256
34216               && INTVAL (XEXP (x, 1)) <= 255)
34217             *total = rs6000_cost->mulsi_const9;
34218           else
34219             *total = rs6000_cost->mulsi_const;
34220         }
34221       else if (mode == SFmode)
34222         *total = rs6000_cost->fp;
34223       else if (FLOAT_MODE_P (mode))
34224         *total = rs6000_cost->dmul;
34225       else if (mode == DImode)
34226         *total = rs6000_cost->muldi;
34227       else
34228         *total = rs6000_cost->mulsi;
34229       return false;
34230
34231     case FMA:
34232       if (mode == SFmode)
34233         *total = rs6000_cost->fp;
34234       else
34235         *total = rs6000_cost->dmul;
34236       break;
34237
34238     case DIV:
34239     case MOD:
34240       if (FLOAT_MODE_P (mode))
34241         {
34242           *total = mode == DFmode ? rs6000_cost->ddiv
34243                                   : rs6000_cost->sdiv;
34244           return false;
34245         }
34246       /* FALLTHRU */
34247
34248     case UDIV:
34249     case UMOD:
34250       if (CONST_INT_P (XEXP (x, 1))
34251           && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
34252         {
34253           if (code == DIV || code == MOD)
34254             /* Shift, addze */
34255             *total = COSTS_N_INSNS (2);
34256           else
34257             /* Shift */
34258             *total = COSTS_N_INSNS (1);
34259         }
34260       else
34261         {
34262           if (GET_MODE (XEXP (x, 1)) == DImode)
34263             *total = rs6000_cost->divdi;
34264           else
34265             *total = rs6000_cost->divsi;
34266         }
34267       /* Add in shift and subtract for MOD unless we have a mod instruction. */
34268       if (!TARGET_MODULO && (code == MOD || code == UMOD))
34269         *total += COSTS_N_INSNS (2);
34270       return false;
34271
34272     case CTZ:
34273       *total = COSTS_N_INSNS (TARGET_CTZ ? 1 : 4);
34274       return false;
34275
34276     case FFS:
34277       *total = COSTS_N_INSNS (4);
34278       return false;
34279
34280     case POPCOUNT:
34281       *total = COSTS_N_INSNS (TARGET_POPCNTD ? 1 : 6);
34282       return false;
34283
34284     case PARITY:
34285       *total = COSTS_N_INSNS (TARGET_CMPB ? 2 : 6);
34286       return false;
34287
34288     case NOT:
34289       if (outer_code == AND || outer_code == IOR || outer_code == XOR)
34290         *total = 0;
34291       else
34292         *total = COSTS_N_INSNS (1);
34293       return false;
34294
34295     case AND:
34296       if (CONST_INT_P (XEXP (x, 1)))
34297         {
34298           rtx left = XEXP (x, 0);
34299           rtx_code left_code = GET_CODE (left);
34300
34301           /* rotate-and-mask: 1 insn.  */
34302           if ((left_code == ROTATE
34303                || left_code == ASHIFT
34304                || left_code == LSHIFTRT)
34305               && rs6000_is_valid_shift_mask (XEXP (x, 1), left, mode))
34306             {
34307               *total = rtx_cost (XEXP (left, 0), mode, left_code, 0, speed);
34308               if (!CONST_INT_P (XEXP (left, 1)))
34309                 *total += rtx_cost (XEXP (left, 1), SImode, left_code, 1, speed);
34310               *total += COSTS_N_INSNS (1);
34311               return true;
34312             }
34313
34314           /* rotate-and-mask (no rotate), andi., andis.: 1 insn.  */
34315           HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
34316           if (rs6000_is_valid_and_mask (XEXP (x, 1), mode)
34317               || (val & 0xffff) == val
34318               || (val & 0xffff0000) == val
34319               || ((val & 0xffff) == 0 && mode == SImode))
34320             {
34321               *total = rtx_cost (left, mode, AND, 0, speed);
34322               *total += COSTS_N_INSNS (1);
34323               return true;
34324             }
34325
34326           /* 2 insns.  */
34327           if (rs6000_is_valid_2insn_and (XEXP (x, 1), mode))
34328             {
34329               *total = rtx_cost (left, mode, AND, 0, speed);
34330               *total += COSTS_N_INSNS (2);
34331               return true;
34332             }
34333         }
34334
34335       *total = COSTS_N_INSNS (1);
34336       return false;
34337
34338     case IOR:
34339       /* FIXME */
34340       *total = COSTS_N_INSNS (1);
34341       return true;
34342
34343     case CLZ:
34344     case XOR:
34345     case ZERO_EXTRACT:
34346       *total = COSTS_N_INSNS (1);
34347       return false;
34348
34349     case ASHIFT:
34350       /* The EXTSWSLI instruction is a combined instruction.  Don't count both
34351          the sign extend and shift separately within the insn.  */
34352       if (TARGET_EXTSWSLI && mode == DImode
34353           && GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
34354           && GET_MODE (XEXP (XEXP (x, 0), 0)) == SImode)
34355         {
34356           *total = 0;
34357           return false;
34358         }
34359       /* fall through */
34360           
34361     case ASHIFTRT:
34362     case LSHIFTRT:
34363     case ROTATE:
34364     case ROTATERT:
34365       /* Handle mul_highpart.  */
34366       if (outer_code == TRUNCATE
34367           && GET_CODE (XEXP (x, 0)) == MULT)
34368         {
34369           if (mode == DImode)
34370             *total = rs6000_cost->muldi;
34371           else
34372             *total = rs6000_cost->mulsi;
34373           return true;
34374         }
34375       else if (outer_code == AND)
34376         *total = 0;
34377       else
34378         *total = COSTS_N_INSNS (1);
34379       return false;
34380
34381     case SIGN_EXTEND:
34382     case ZERO_EXTEND:
34383       if (MEM_P (XEXP (x, 0)))
34384         *total = 0;
34385       else
34386         *total = COSTS_N_INSNS (1);
34387       return false;
34388
34389     case COMPARE:
34390     case NEG:
34391     case ABS:
34392       if (!FLOAT_MODE_P (mode))
34393         {
34394           *total = COSTS_N_INSNS (1);
34395           return false;
34396         }
34397       /* FALLTHRU */
34398
34399     case FLOAT:
34400     case UNSIGNED_FLOAT:
34401     case FIX:
34402     case UNSIGNED_FIX:
34403     case FLOAT_TRUNCATE:
34404       *total = rs6000_cost->fp;
34405       return false;
34406
34407     case FLOAT_EXTEND:
34408       if (mode == DFmode)
34409         *total = rs6000_cost->sfdf_convert;
34410       else
34411         *total = rs6000_cost->fp;
34412       return false;
34413
34414     case UNSPEC:
34415       switch (XINT (x, 1))
34416         {
34417         case UNSPEC_FRSP:
34418           *total = rs6000_cost->fp;
34419           return true;
34420
34421         default:
34422           break;
34423         }
34424       break;
34425
34426     case CALL:
34427     case IF_THEN_ELSE:
34428       if (!speed)
34429         {
34430           *total = COSTS_N_INSNS (1);
34431           return true;
34432         }
34433       else if (FLOAT_MODE_P (mode) && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT)
34434         {
34435           *total = rs6000_cost->fp;
34436           return false;
34437         }
34438       break;
34439
34440     case NE:
34441     case EQ:
34442     case GTU:
34443     case LTU:
34444       /* Carry bit requires mode == Pmode.
34445          NEG or PLUS already counted so only add one.  */
34446       if (mode == Pmode
34447           && (outer_code == NEG || outer_code == PLUS))
34448         {
34449           *total = COSTS_N_INSNS (1);
34450           return true;
34451         }
34452       /* FALLTHRU */
34453
34454     case GT:
34455     case LT:
34456     case UNORDERED:
34457       if (outer_code == SET)
34458         {
34459           if (XEXP (x, 1) == const0_rtx)
34460             {
34461               *total = COSTS_N_INSNS (2);
34462               return true;
34463             }
34464           else
34465             {
34466               *total = COSTS_N_INSNS (3);
34467               return false;
34468             }
34469         }
34470       /* CC COMPARE.  */
34471       if (outer_code == COMPARE)
34472         {
34473           *total = 0;
34474           return true;
34475         }
34476       break;
34477
34478     default:
34479       break;
34480     }
34481
34482   return false;
34483 }
34484
34485 /* Debug form of r6000_rtx_costs that is selected if -mdebug=cost.  */
34486
34487 static bool
34488 rs6000_debug_rtx_costs (rtx x, machine_mode mode, int outer_code,
34489                         int opno, int *total, bool speed)
34490 {
34491   bool ret = rs6000_rtx_costs (x, mode, outer_code, opno, total, speed);
34492
34493   fprintf (stderr,
34494            "\nrs6000_rtx_costs, return = %s, mode = %s, outer_code = %s, "
34495            "opno = %d, total = %d, speed = %s, x:\n",
34496            ret ? "complete" : "scan inner",
34497            GET_MODE_NAME (mode),
34498            GET_RTX_NAME (outer_code),
34499            opno,
34500            *total,
34501            speed ? "true" : "false");
34502
34503   debug_rtx (x);
34504
34505   return ret;
34506 }
34507
34508 static int
34509 rs6000_insn_cost (rtx_insn *insn, bool speed)
34510 {
34511   if (recog_memoized (insn) < 0)
34512     return 0;
34513
34514   if (!speed)
34515     return get_attr_length (insn);
34516
34517   int cost = get_attr_cost (insn);
34518   if (cost > 0)
34519     return cost;
34520
34521   int n = get_attr_length (insn) / 4;
34522   enum attr_type type = get_attr_type (insn);
34523
34524   switch (type)
34525     {
34526     case TYPE_LOAD:
34527     case TYPE_FPLOAD:
34528     case TYPE_VECLOAD:
34529       cost = COSTS_N_INSNS (n + 1);
34530       break;
34531
34532     case TYPE_MUL:
34533       switch (get_attr_size (insn))
34534         {
34535         case SIZE_8:
34536           cost = COSTS_N_INSNS (n - 1) + rs6000_cost->mulsi_const9;
34537           break;
34538         case SIZE_16:
34539           cost = COSTS_N_INSNS (n - 1) + rs6000_cost->mulsi_const;
34540           break;
34541         case SIZE_32:
34542           cost = COSTS_N_INSNS (n - 1) + rs6000_cost->mulsi;
34543           break;
34544         case SIZE_64:
34545           cost = COSTS_N_INSNS (n - 1) + rs6000_cost->muldi;
34546           break;
34547         default:
34548           gcc_unreachable ();
34549         }
34550       break;
34551     case TYPE_DIV:
34552       switch (get_attr_size (insn))
34553         {
34554         case SIZE_32:
34555           cost = COSTS_N_INSNS (n - 1) + rs6000_cost->divsi;
34556           break;
34557         case SIZE_64:
34558           cost = COSTS_N_INSNS (n - 1) + rs6000_cost->divdi;
34559           break;
34560         default:
34561           gcc_unreachable ();
34562         }
34563       break;
34564
34565     case TYPE_FP:
34566       cost = n * rs6000_cost->fp;
34567       break;
34568     case TYPE_DMUL:
34569       cost = n * rs6000_cost->dmul;
34570       break;
34571     case TYPE_SDIV:
34572       cost = n * rs6000_cost->sdiv;
34573       break;
34574     case TYPE_DDIV:
34575       cost = n * rs6000_cost->ddiv;
34576       break;
34577
34578     case TYPE_SYNC:
34579     case TYPE_LOAD_L:
34580     case TYPE_MFCR:
34581     case TYPE_MFCRF:
34582       cost = COSTS_N_INSNS (n + 2);
34583       break;
34584
34585     default:
34586       cost = COSTS_N_INSNS (n);
34587     }
34588
34589   return cost;
34590 }
34591
34592 /* Debug form of ADDRESS_COST that is selected if -mdebug=cost.  */
34593
34594 static int
34595 rs6000_debug_address_cost (rtx x, machine_mode mode,
34596                            addr_space_t as, bool speed)
34597 {
34598   int ret = TARGET_ADDRESS_COST (x, mode, as, speed);
34599
34600   fprintf (stderr, "\nrs6000_address_cost, return = %d, speed = %s, x:\n",
34601            ret, speed ? "true" : "false");
34602   debug_rtx (x);
34603
34604   return ret;
34605 }
34606
34607
34608 /* A C expression returning the cost of moving data from a register of class
34609    CLASS1 to one of CLASS2.  */
34610
34611 static int
34612 rs6000_register_move_cost (machine_mode mode,
34613                            reg_class_t from, reg_class_t to)
34614 {
34615   int ret;
34616   reg_class_t rclass;
34617
34618   if (TARGET_DEBUG_COST)
34619     dbg_cost_ctrl++;
34620
34621   /* If we have VSX, we can easily move between FPR or Altivec registers,
34622      otherwise we can only easily move within classes.
34623      Do this first so we give best-case answers for union classes
34624      containing both gprs and vsx regs.  */
34625   HARD_REG_SET to_vsx, from_vsx;
34626   COPY_HARD_REG_SET (to_vsx, reg_class_contents[to]);
34627   AND_HARD_REG_SET (to_vsx, reg_class_contents[VSX_REGS]);
34628   COPY_HARD_REG_SET (from_vsx, reg_class_contents[from]);
34629   AND_HARD_REG_SET (from_vsx, reg_class_contents[VSX_REGS]);
34630   if (!hard_reg_set_empty_p (to_vsx)
34631       && !hard_reg_set_empty_p (from_vsx)
34632       && (TARGET_VSX
34633           || hard_reg_set_intersect_p (to_vsx, from_vsx)))
34634     {
34635       int reg = FIRST_FPR_REGNO;
34636       if (TARGET_VSX
34637           || (TEST_HARD_REG_BIT (to_vsx, FIRST_ALTIVEC_REGNO)
34638               && TEST_HARD_REG_BIT (from_vsx, FIRST_ALTIVEC_REGNO)))
34639         reg = FIRST_ALTIVEC_REGNO;
34640       ret = 2 * hard_regno_nregs (reg, mode);
34641     }
34642
34643   /*  Moves from/to GENERAL_REGS.  */
34644   else if ((rclass = from, reg_classes_intersect_p (to, GENERAL_REGS))
34645            || (rclass = to, reg_classes_intersect_p (from, GENERAL_REGS)))
34646     {
34647       if (rclass == FLOAT_REGS || rclass == ALTIVEC_REGS || rclass == VSX_REGS)
34648         {
34649           if (TARGET_DIRECT_MOVE)
34650             {
34651               /* Keep the cost for direct moves above that for within
34652                  a register class even if the actual processor cost is
34653                  comparable.  We do this because a direct move insn
34654                  can't be a nop, whereas with ideal register
34655                  allocation a move within the same class might turn
34656                  out to be a nop.  */
34657               if (rs6000_tune == PROCESSOR_POWER9)
34658                 ret = 3 * hard_regno_nregs (FIRST_GPR_REGNO, mode);
34659               else
34660                 ret = 4 * hard_regno_nregs (FIRST_GPR_REGNO, mode);
34661               /* SFmode requires a conversion when moving between gprs
34662                  and vsx.  */
34663               if (mode == SFmode)
34664                 ret += 2;
34665             }
34666           else
34667             ret = (rs6000_memory_move_cost (mode, rclass, false)
34668                    + rs6000_memory_move_cost (mode, GENERAL_REGS, false));
34669         }
34670
34671       /* It's more expensive to move CR_REGS than CR0_REGS because of the
34672          shift.  */
34673       else if (rclass == CR_REGS)
34674         ret = 4;
34675
34676       /* For those processors that have slow LR/CTR moves, make them more
34677          expensive than memory in order to bias spills to memory .*/
34678       else if ((rs6000_tune == PROCESSOR_POWER6
34679                 || rs6000_tune == PROCESSOR_POWER7
34680                 || rs6000_tune == PROCESSOR_POWER8
34681                 || rs6000_tune == PROCESSOR_POWER9)
34682                && reg_class_subset_p (rclass, SPECIAL_REGS))
34683         ret = 6 * hard_regno_nregs (FIRST_GPR_REGNO, mode);
34684
34685       else
34686         /* A move will cost one instruction per GPR moved.  */
34687         ret = 2 * hard_regno_nregs (FIRST_GPR_REGNO, mode);
34688     }
34689
34690   /* Everything else has to go through GENERAL_REGS.  */
34691   else
34692     ret = (rs6000_register_move_cost (mode, GENERAL_REGS, to)
34693            + rs6000_register_move_cost (mode, from, GENERAL_REGS));
34694
34695   if (TARGET_DEBUG_COST)
34696     {
34697       if (dbg_cost_ctrl == 1)
34698         fprintf (stderr,
34699                  "rs6000_register_move_cost: ret=%d, mode=%s, from=%s, to=%s\n",
34700                  ret, GET_MODE_NAME (mode), reg_class_names[from],
34701                  reg_class_names[to]);
34702       dbg_cost_ctrl--;
34703     }
34704
34705   return ret;
34706 }
34707
34708 /* A C expressions returning the cost of moving data of MODE from a register to
34709    or from memory.  */
34710
34711 static int
34712 rs6000_memory_move_cost (machine_mode mode, reg_class_t rclass,
34713                          bool in ATTRIBUTE_UNUSED)
34714 {
34715   int ret;
34716
34717   if (TARGET_DEBUG_COST)
34718     dbg_cost_ctrl++;
34719
34720   if (reg_classes_intersect_p (rclass, GENERAL_REGS))
34721     ret = 4 * hard_regno_nregs (0, mode);
34722   else if ((reg_classes_intersect_p (rclass, FLOAT_REGS)
34723             || reg_classes_intersect_p (rclass, VSX_REGS)))
34724     ret = 4 * hard_regno_nregs (32, mode);
34725   else if (reg_classes_intersect_p (rclass, ALTIVEC_REGS))
34726     ret = 4 * hard_regno_nregs (FIRST_ALTIVEC_REGNO, mode);
34727   else
34728     ret = 4 + rs6000_register_move_cost (mode, rclass, GENERAL_REGS);
34729
34730   if (TARGET_DEBUG_COST)
34731     {
34732       if (dbg_cost_ctrl == 1)
34733         fprintf (stderr,
34734                  "rs6000_memory_move_cost: ret=%d, mode=%s, rclass=%s, in=%d\n",
34735                  ret, GET_MODE_NAME (mode), reg_class_names[rclass], in);
34736       dbg_cost_ctrl--;
34737     }
34738
34739   return ret;
34740 }
34741
34742 /* Implement TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS.
34743
34744    The register allocator chooses GEN_OR_VSX_REGS for the allocno
34745    class if GENERAL_REGS and VSX_REGS cost is lower than the memory
34746    cost.  This happens a lot when TARGET_DIRECT_MOVE makes the register
34747    move cost between GENERAL_REGS and VSX_REGS low.
34748
34749    It might seem reasonable to use a union class.  After all, if usage
34750    of vsr is low and gpr high, it might make sense to spill gpr to vsr
34751    rather than memory.  However, in cases where register pressure of
34752    both is high, like the cactus_adm spec test, allowing
34753    GEN_OR_VSX_REGS as the allocno class results in bad decisions in
34754    the first scheduling pass.  This is partly due to an allocno of
34755    GEN_OR_VSX_REGS wrongly contributing to the GENERAL_REGS pressure
34756    class, which gives too high a pressure for GENERAL_REGS and too low
34757    for VSX_REGS.  So, force a choice of the subclass here.
34758
34759    The best class is also the union if GENERAL_REGS and VSX_REGS have
34760    the same cost.  In that case we do use GEN_OR_VSX_REGS as the
34761    allocno class, since trying to narrow down the class by regno mode
34762    is prone to error.  For example, SImode is allowed in VSX regs and
34763    in some cases (eg. gcc.target/powerpc/p9-xxbr-3.c do_bswap32_vect)
34764    it would be wrong to choose an allocno of GENERAL_REGS based on
34765    SImode.  */
34766
34767 static reg_class_t
34768 rs6000_ira_change_pseudo_allocno_class (int regno ATTRIBUTE_UNUSED,
34769                                         reg_class_t allocno_class,
34770                                         reg_class_t best_class)
34771 {
34772   switch (allocno_class)
34773     {
34774     case GEN_OR_VSX_REGS:
34775       /* best_class must be a subset of allocno_class.  */
34776       gcc_checking_assert (best_class == GEN_OR_VSX_REGS
34777                            || best_class == GEN_OR_FLOAT_REGS
34778                            || best_class == VSX_REGS
34779                            || best_class == ALTIVEC_REGS
34780                            || best_class == FLOAT_REGS
34781                            || best_class == GENERAL_REGS
34782                            || best_class == BASE_REGS);
34783       /* Use best_class but choose wider classes when copying from the
34784          wider class to best_class is cheap.  This mimics IRA choice
34785          of allocno class.  */
34786       if (best_class == BASE_REGS)
34787         return GENERAL_REGS;
34788       if (TARGET_VSX
34789           && (best_class == FLOAT_REGS || best_class == ALTIVEC_REGS))
34790         return VSX_REGS;
34791       return best_class;
34792
34793     default:
34794       break;
34795     }
34796
34797   return allocno_class;
34798 }
34799
34800 /* Returns a code for a target-specific builtin that implements
34801    reciprocal of the function, or NULL_TREE if not available.  */
34802
34803 static tree
34804 rs6000_builtin_reciprocal (tree fndecl)
34805 {
34806   switch (DECL_FUNCTION_CODE (fndecl))
34807     {
34808     case VSX_BUILTIN_XVSQRTDP:
34809       if (!RS6000_RECIP_AUTO_RSQRTE_P (V2DFmode))
34810         return NULL_TREE;
34811
34812       return rs6000_builtin_decls[VSX_BUILTIN_RSQRT_2DF];
34813
34814     case VSX_BUILTIN_XVSQRTSP:
34815       if (!RS6000_RECIP_AUTO_RSQRTE_P (V4SFmode))
34816         return NULL_TREE;
34817
34818       return rs6000_builtin_decls[VSX_BUILTIN_RSQRT_4SF];
34819
34820     default:
34821       return NULL_TREE;
34822     }
34823 }
34824
34825 /* Load up a constant.  If the mode is a vector mode, splat the value across
34826    all of the vector elements.  */
34827
34828 static rtx
34829 rs6000_load_constant_and_splat (machine_mode mode, REAL_VALUE_TYPE dconst)
34830 {
34831   rtx reg;
34832
34833   if (mode == SFmode || mode == DFmode)
34834     {
34835       rtx d = const_double_from_real_value (dconst, mode);
34836       reg = force_reg (mode, d);
34837     }
34838   else if (mode == V4SFmode)
34839     {
34840       rtx d = const_double_from_real_value (dconst, SFmode);
34841       rtvec v = gen_rtvec (4, d, d, d, d);
34842       reg = gen_reg_rtx (mode);
34843       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
34844     }
34845   else if (mode == V2DFmode)
34846     {
34847       rtx d = const_double_from_real_value (dconst, DFmode);
34848       rtvec v = gen_rtvec (2, d, d);
34849       reg = gen_reg_rtx (mode);
34850       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
34851     }
34852   else
34853     gcc_unreachable ();
34854
34855   return reg;
34856 }
34857
34858 /* Generate an FMA instruction.  */
34859
34860 static void
34861 rs6000_emit_madd (rtx target, rtx m1, rtx m2, rtx a)
34862 {
34863   machine_mode mode = GET_MODE (target);
34864   rtx dst;
34865
34866   dst = expand_ternary_op (mode, fma_optab, m1, m2, a, target, 0);
34867   gcc_assert (dst != NULL);
34868
34869   if (dst != target)
34870     emit_move_insn (target, dst);
34871 }
34872
34873 /* Generate a FNMSUB instruction: dst = -fma(m1, m2, -a).  */
34874
34875 static void
34876 rs6000_emit_nmsub (rtx dst, rtx m1, rtx m2, rtx a)
34877 {
34878   machine_mode mode = GET_MODE (dst);
34879   rtx r;
34880
34881   /* This is a tad more complicated, since the fnma_optab is for
34882      a different expression: fma(-m1, m2, a), which is the same
34883      thing except in the case of signed zeros.
34884
34885      Fortunately we know that if FMA is supported that FNMSUB is
34886      also supported in the ISA.  Just expand it directly.  */
34887
34888   gcc_assert (optab_handler (fma_optab, mode) != CODE_FOR_nothing);
34889
34890   r = gen_rtx_NEG (mode, a);
34891   r = gen_rtx_FMA (mode, m1, m2, r);
34892   r = gen_rtx_NEG (mode, r);
34893   emit_insn (gen_rtx_SET (dst, r));
34894 }
34895
34896 /* Newton-Raphson approximation of floating point divide DST = N/D.  If NOTE_P,
34897    add a reg_note saying that this was a division.  Support both scalar and
34898    vector divide.  Assumes no trapping math and finite arguments.  */
34899
34900 void
34901 rs6000_emit_swdiv (rtx dst, rtx n, rtx d, bool note_p)
34902 {
34903   machine_mode mode = GET_MODE (dst);
34904   rtx one, x0, e0, x1, xprev, eprev, xnext, enext, u, v;
34905   int i;
34906
34907   /* Low precision estimates guarantee 5 bits of accuracy.  High
34908      precision estimates guarantee 14 bits of accuracy.  SFmode
34909      requires 23 bits of accuracy.  DFmode requires 52 bits of
34910      accuracy.  Each pass at least doubles the accuracy, leading
34911      to the following.  */
34912   int passes = (TARGET_RECIP_PRECISION) ? 1 : 3;
34913   if (mode == DFmode || mode == V2DFmode)
34914     passes++;
34915
34916   enum insn_code code = optab_handler (smul_optab, mode);
34917   insn_gen_fn gen_mul = GEN_FCN (code);
34918
34919   gcc_assert (code != CODE_FOR_nothing);
34920
34921   one = rs6000_load_constant_and_splat (mode, dconst1);
34922
34923   /* x0 = 1./d estimate */
34924   x0 = gen_reg_rtx (mode);
34925   emit_insn (gen_rtx_SET (x0, gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
34926                                               UNSPEC_FRES)));
34927
34928   /* Each iteration but the last calculates x_(i+1) = x_i * (2 - d * x_i).  */
34929   if (passes > 1) {
34930
34931     /* e0 = 1. - d * x0  */
34932     e0 = gen_reg_rtx (mode);
34933     rs6000_emit_nmsub (e0, d, x0, one);
34934
34935     /* x1 = x0 + e0 * x0  */
34936     x1 = gen_reg_rtx (mode);
34937     rs6000_emit_madd (x1, e0, x0, x0);
34938
34939     for (i = 0, xprev = x1, eprev = e0; i < passes - 2;
34940          ++i, xprev = xnext, eprev = enext) {
34941       
34942       /* enext = eprev * eprev  */
34943       enext = gen_reg_rtx (mode);
34944       emit_insn (gen_mul (enext, eprev, eprev));
34945
34946       /* xnext = xprev + enext * xprev  */
34947       xnext = gen_reg_rtx (mode);
34948       rs6000_emit_madd (xnext, enext, xprev, xprev);
34949     }
34950
34951   } else
34952     xprev = x0;
34953
34954   /* The last iteration calculates x_(i+1) = n * x_i * (2 - d * x_i).  */
34955
34956   /* u = n * xprev  */
34957   u = gen_reg_rtx (mode);
34958   emit_insn (gen_mul (u, n, xprev));
34959
34960   /* v = n - (d * u)  */
34961   v = gen_reg_rtx (mode);
34962   rs6000_emit_nmsub (v, d, u, n);
34963
34964   /* dst = (v * xprev) + u  */
34965   rs6000_emit_madd (dst, v, xprev, u);
34966
34967   if (note_p)
34968     add_reg_note (get_last_insn (), REG_EQUAL, gen_rtx_DIV (mode, n, d));
34969 }
34970
34971 /* Goldschmidt's Algorithm for single/double-precision floating point
34972    sqrt and rsqrt.  Assumes no trapping math and finite arguments.  */
34973
34974 void
34975 rs6000_emit_swsqrt (rtx dst, rtx src, bool recip)
34976 {
34977   machine_mode mode = GET_MODE (src);
34978   rtx e = gen_reg_rtx (mode);
34979   rtx g = gen_reg_rtx (mode);
34980   rtx h = gen_reg_rtx (mode);
34981
34982   /* Low precision estimates guarantee 5 bits of accuracy.  High
34983      precision estimates guarantee 14 bits of accuracy.  SFmode
34984      requires 23 bits of accuracy.  DFmode requires 52 bits of
34985      accuracy.  Each pass at least doubles the accuracy, leading
34986      to the following.  */
34987   int passes = (TARGET_RECIP_PRECISION) ? 1 : 3;
34988   if (mode == DFmode || mode == V2DFmode)
34989     passes++;
34990
34991   int i;
34992   rtx mhalf;
34993   enum insn_code code = optab_handler (smul_optab, mode);
34994   insn_gen_fn gen_mul = GEN_FCN (code);
34995
34996   gcc_assert (code != CODE_FOR_nothing);
34997
34998   mhalf = rs6000_load_constant_and_splat (mode, dconsthalf);
34999
35000   /* e = rsqrt estimate */
35001   emit_insn (gen_rtx_SET (e, gen_rtx_UNSPEC (mode, gen_rtvec (1, src),
35002                                              UNSPEC_RSQRT)));
35003
35004   /* If (src == 0.0) filter infinity to prevent NaN for sqrt(0.0).  */
35005   if (!recip)
35006     {
35007       rtx zero = force_reg (mode, CONST0_RTX (mode));
35008
35009       if (mode == SFmode)
35010         {
35011           rtx target = emit_conditional_move (e, GT, src, zero, mode,
35012                                               e, zero, mode, 0);
35013           if (target != e)
35014             emit_move_insn (e, target);
35015         }
35016       else
35017         {
35018           rtx cond = gen_rtx_GT (VOIDmode, e, zero);
35019           rs6000_emit_vector_cond_expr (e, e, zero, cond, src, zero);
35020         }
35021     }
35022
35023   /* g = sqrt estimate.  */
35024   emit_insn (gen_mul (g, e, src));
35025   /* h = 1/(2*sqrt) estimate.  */
35026   emit_insn (gen_mul (h, e, mhalf));
35027
35028   if (recip)
35029     {
35030       if (passes == 1)
35031         {
35032           rtx t = gen_reg_rtx (mode);
35033           rs6000_emit_nmsub (t, g, h, mhalf);
35034           /* Apply correction directly to 1/rsqrt estimate.  */
35035           rs6000_emit_madd (dst, e, t, e);
35036         }
35037       else
35038         {
35039           for (i = 0; i < passes; i++)
35040             {
35041               rtx t1 = gen_reg_rtx (mode);
35042               rtx g1 = gen_reg_rtx (mode);
35043               rtx h1 = gen_reg_rtx (mode);
35044
35045               rs6000_emit_nmsub (t1, g, h, mhalf);
35046               rs6000_emit_madd (g1, g, t1, g);
35047               rs6000_emit_madd (h1, h, t1, h);
35048
35049               g = g1;
35050               h = h1;
35051             }
35052           /* Multiply by 2 for 1/rsqrt.  */
35053           emit_insn (gen_add3_insn (dst, h, h));
35054         }
35055     }
35056   else
35057     {
35058       rtx t = gen_reg_rtx (mode);
35059       rs6000_emit_nmsub (t, g, h, mhalf);
35060       rs6000_emit_madd (dst, g, t, g);
35061     }
35062
35063   return;
35064 }
35065
35066 /* Emit popcount intrinsic on TARGET_POPCNTB (Power5) and TARGET_POPCNTD
35067    (Power7) targets.  DST is the target, and SRC is the argument operand.  */
35068
35069 void
35070 rs6000_emit_popcount (rtx dst, rtx src)
35071 {
35072   machine_mode mode = GET_MODE (dst);
35073   rtx tmp1, tmp2;
35074
35075   /* Use the PPC ISA 2.06 popcnt{w,d} instruction if we can.  */
35076   if (TARGET_POPCNTD)
35077     {
35078       if (mode == SImode)
35079         emit_insn (gen_popcntdsi2 (dst, src));
35080       else
35081         emit_insn (gen_popcntddi2 (dst, src));
35082       return;
35083     }
35084
35085   tmp1 = gen_reg_rtx (mode);
35086
35087   if (mode == SImode)
35088     {
35089       emit_insn (gen_popcntbsi2 (tmp1, src));
35090       tmp2 = expand_mult (SImode, tmp1, GEN_INT (0x01010101),
35091                            NULL_RTX, 0);
35092       tmp2 = force_reg (SImode, tmp2);
35093       emit_insn (gen_lshrsi3 (dst, tmp2, GEN_INT (24)));
35094     }
35095   else
35096     {
35097       emit_insn (gen_popcntbdi2 (tmp1, src));
35098       tmp2 = expand_mult (DImode, tmp1,
35099                           GEN_INT ((HOST_WIDE_INT)
35100                                    0x01010101 << 32 | 0x01010101),
35101                           NULL_RTX, 0);
35102       tmp2 = force_reg (DImode, tmp2);
35103       emit_insn (gen_lshrdi3 (dst, tmp2, GEN_INT (56)));
35104     }
35105 }
35106
35107
35108 /* Emit parity intrinsic on TARGET_POPCNTB targets.  DST is the
35109    target, and SRC is the argument operand.  */
35110
35111 void
35112 rs6000_emit_parity (rtx dst, rtx src)
35113 {
35114   machine_mode mode = GET_MODE (dst);
35115   rtx tmp;
35116
35117   tmp = gen_reg_rtx (mode);
35118
35119   /* Use the PPC ISA 2.05 prtyw/prtyd instruction if we can.  */
35120   if (TARGET_CMPB)
35121     {
35122       if (mode == SImode)
35123         {
35124           emit_insn (gen_popcntbsi2 (tmp, src));
35125           emit_insn (gen_paritysi2_cmpb (dst, tmp));
35126         }
35127       else
35128         {
35129           emit_insn (gen_popcntbdi2 (tmp, src));
35130           emit_insn (gen_paritydi2_cmpb (dst, tmp));
35131         }
35132       return;
35133     }
35134
35135   if (mode == SImode)
35136     {
35137       /* Is mult+shift >= shift+xor+shift+xor?  */
35138       if (rs6000_cost->mulsi_const >= COSTS_N_INSNS (3))
35139         {
35140           rtx tmp1, tmp2, tmp3, tmp4;
35141
35142           tmp1 = gen_reg_rtx (SImode);
35143           emit_insn (gen_popcntbsi2 (tmp1, src));
35144
35145           tmp2 = gen_reg_rtx (SImode);
35146           emit_insn (gen_lshrsi3 (tmp2, tmp1, GEN_INT (16)));
35147           tmp3 = gen_reg_rtx (SImode);
35148           emit_insn (gen_xorsi3 (tmp3, tmp1, tmp2));
35149
35150           tmp4 = gen_reg_rtx (SImode);
35151           emit_insn (gen_lshrsi3 (tmp4, tmp3, GEN_INT (8)));
35152           emit_insn (gen_xorsi3 (tmp, tmp3, tmp4));
35153         }
35154       else
35155         rs6000_emit_popcount (tmp, src);
35156       emit_insn (gen_andsi3 (dst, tmp, const1_rtx));
35157     }
35158   else
35159     {
35160       /* Is mult+shift >= shift+xor+shift+xor+shift+xor?  */
35161       if (rs6000_cost->muldi >= COSTS_N_INSNS (5))
35162         {
35163           rtx tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
35164
35165           tmp1 = gen_reg_rtx (DImode);
35166           emit_insn (gen_popcntbdi2 (tmp1, src));
35167
35168           tmp2 = gen_reg_rtx (DImode);
35169           emit_insn (gen_lshrdi3 (tmp2, tmp1, GEN_INT (32)));
35170           tmp3 = gen_reg_rtx (DImode);
35171           emit_insn (gen_xordi3 (tmp3, tmp1, tmp2));
35172
35173           tmp4 = gen_reg_rtx (DImode);
35174           emit_insn (gen_lshrdi3 (tmp4, tmp3, GEN_INT (16)));
35175           tmp5 = gen_reg_rtx (DImode);
35176           emit_insn (gen_xordi3 (tmp5, tmp3, tmp4));
35177
35178           tmp6 = gen_reg_rtx (DImode);
35179           emit_insn (gen_lshrdi3 (tmp6, tmp5, GEN_INT (8)));
35180           emit_insn (gen_xordi3 (tmp, tmp5, tmp6));
35181         }
35182       else
35183         rs6000_emit_popcount (tmp, src);
35184       emit_insn (gen_anddi3 (dst, tmp, const1_rtx));
35185     }
35186 }
35187
35188 /* Expand an Altivec constant permutation for little endian mode.
35189    OP0 and OP1 are the input vectors and TARGET is the output vector.
35190    SEL specifies the constant permutation vector.
35191
35192    There are two issues: First, the two input operands must be
35193    swapped so that together they form a double-wide array in LE
35194    order.  Second, the vperm instruction has surprising behavior
35195    in LE mode:  it interprets the elements of the source vectors
35196    in BE mode ("left to right") and interprets the elements of
35197    the destination vector in LE mode ("right to left").  To
35198    correct for this, we must subtract each element of the permute
35199    control vector from 31.
35200
35201    For example, suppose we want to concatenate vr10 = {0, 1, 2, 3}
35202    with vr11 = {4, 5, 6, 7} and extract {0, 2, 4, 6} using a vperm.
35203    We place {0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27} in vr12 to
35204    serve as the permute control vector.  Then, in BE mode,
35205
35206      vperm 9,10,11,12
35207
35208    places the desired result in vr9.  However, in LE mode the 
35209    vector contents will be
35210
35211      vr10 = 00000003 00000002 00000001 00000000
35212      vr11 = 00000007 00000006 00000005 00000004
35213
35214    The result of the vperm using the same permute control vector is
35215
35216      vr9  = 05000000 07000000 01000000 03000000
35217
35218    That is, the leftmost 4 bytes of vr10 are interpreted as the
35219    source for the rightmost 4 bytes of vr9, and so on.
35220
35221    If we change the permute control vector to
35222
35223      vr12 = {31,20,29,28,23,22,21,20,15,14,13,12,7,6,5,4}
35224
35225    and issue
35226
35227      vperm 9,11,10,12
35228
35229    we get the desired
35230
35231    vr9  = 00000006 00000004 00000002 00000000.  */
35232
35233 static void
35234 altivec_expand_vec_perm_const_le (rtx target, rtx op0, rtx op1,
35235                                   const vec_perm_indices &sel)
35236 {
35237   unsigned int i;
35238   rtx perm[16];
35239   rtx constv, unspec;
35240
35241   /* Unpack and adjust the constant selector.  */
35242   for (i = 0; i < 16; ++i)
35243     {
35244       unsigned int elt = 31 - (sel[i] & 31);
35245       perm[i] = GEN_INT (elt);
35246     }
35247
35248   /* Expand to a permute, swapping the inputs and using the
35249      adjusted selector.  */
35250   if (!REG_P (op0))
35251     op0 = force_reg (V16QImode, op0);
35252   if (!REG_P (op1))
35253     op1 = force_reg (V16QImode, op1);
35254
35255   constv = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, perm));
35256   constv = force_reg (V16QImode, constv);
35257   unspec = gen_rtx_UNSPEC (V16QImode, gen_rtvec (3, op1, op0, constv),
35258                            UNSPEC_VPERM);
35259   if (!REG_P (target))
35260     {
35261       rtx tmp = gen_reg_rtx (V16QImode);
35262       emit_move_insn (tmp, unspec);
35263       unspec = tmp;
35264     }
35265
35266   emit_move_insn (target, unspec);
35267 }
35268
35269 /* Similarly to altivec_expand_vec_perm_const_le, we must adjust the
35270    permute control vector.  But here it's not a constant, so we must
35271    generate a vector NAND or NOR to do the adjustment.  */
35272
35273 void
35274 altivec_expand_vec_perm_le (rtx operands[4])
35275 {
35276   rtx notx, iorx, unspec;
35277   rtx target = operands[0];
35278   rtx op0 = operands[1];
35279   rtx op1 = operands[2];
35280   rtx sel = operands[3];
35281   rtx tmp = target;
35282   rtx norreg = gen_reg_rtx (V16QImode);
35283   machine_mode mode = GET_MODE (target);
35284
35285   /* Get everything in regs so the pattern matches.  */
35286   if (!REG_P (op0))
35287     op0 = force_reg (mode, op0);
35288   if (!REG_P (op1))
35289     op1 = force_reg (mode, op1);
35290   if (!REG_P (sel))
35291     sel = force_reg (V16QImode, sel);
35292   if (!REG_P (target))
35293     tmp = gen_reg_rtx (mode);
35294
35295   if (TARGET_P9_VECTOR)
35296     {
35297       unspec = gen_rtx_UNSPEC (mode, gen_rtvec (3, op1, op0, sel),
35298                                UNSPEC_VPERMR);
35299     }
35300   else
35301     {
35302       /* Invert the selector with a VNAND if available, else a VNOR.
35303          The VNAND is preferred for future fusion opportunities.  */
35304       notx = gen_rtx_NOT (V16QImode, sel);
35305       iorx = (TARGET_P8_VECTOR
35306               ? gen_rtx_IOR (V16QImode, notx, notx)
35307               : gen_rtx_AND (V16QImode, notx, notx));
35308       emit_insn (gen_rtx_SET (norreg, iorx));
35309
35310       /* Permute with operands reversed and adjusted selector.  */
35311       unspec = gen_rtx_UNSPEC (mode, gen_rtvec (3, op1, op0, norreg),
35312                                UNSPEC_VPERM);
35313     }
35314
35315   /* Copy into target, possibly by way of a register.  */
35316   if (!REG_P (target))
35317     {
35318       emit_move_insn (tmp, unspec);
35319       unspec = tmp;
35320     }
35321
35322   emit_move_insn (target, unspec);
35323 }
35324
35325 /* Expand an Altivec constant permutation.  Return true if we match
35326    an efficient implementation; false to fall back to VPERM.
35327
35328    OP0 and OP1 are the input vectors and TARGET is the output vector.
35329    SEL specifies the constant permutation vector.  */
35330
35331 static bool
35332 altivec_expand_vec_perm_const (rtx target, rtx op0, rtx op1,
35333                                const vec_perm_indices &sel)
35334 {
35335   struct altivec_perm_insn {
35336     HOST_WIDE_INT mask;
35337     enum insn_code impl;
35338     unsigned char perm[16];
35339   };
35340   static const struct altivec_perm_insn patterns[] = {
35341     { OPTION_MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum_direct,
35342       {  1,  3,  5,  7,  9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 } },
35343     { OPTION_MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum_direct,
35344       {  2,  3,  6,  7, 10, 11, 14, 15, 18, 19, 22, 23, 26, 27, 30, 31 } },
35345     { OPTION_MASK_ALTIVEC, 
35346       (BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghb_direct
35347        : CODE_FOR_altivec_vmrglb_direct),
35348       {  0, 16,  1, 17,  2, 18,  3, 19,  4, 20,  5, 21,  6, 22,  7, 23 } },
35349     { OPTION_MASK_ALTIVEC,
35350       (BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghh_direct
35351        : CODE_FOR_altivec_vmrglh_direct),
35352       {  0,  1, 16, 17,  2,  3, 18, 19,  4,  5, 20, 21,  6,  7, 22, 23 } },
35353     { OPTION_MASK_ALTIVEC,
35354       (BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghw_direct
35355        : CODE_FOR_altivec_vmrglw_direct),
35356       {  0,  1,  2,  3, 16, 17, 18, 19,  4,  5,  6,  7, 20, 21, 22, 23 } },
35357     { OPTION_MASK_ALTIVEC,
35358       (BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglb_direct
35359        : CODE_FOR_altivec_vmrghb_direct),
35360       {  8, 24,  9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 } },
35361     { OPTION_MASK_ALTIVEC,
35362       (BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglh_direct
35363        : CODE_FOR_altivec_vmrghh_direct),
35364       {  8,  9, 24, 25, 10, 11, 26, 27, 12, 13, 28, 29, 14, 15, 30, 31 } },
35365     { OPTION_MASK_ALTIVEC,
35366       (BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglw_direct
35367        : CODE_FOR_altivec_vmrghw_direct),
35368       {  8,  9, 10, 11, 24, 25, 26, 27, 12, 13, 14, 15, 28, 29, 30, 31 } },
35369     { OPTION_MASK_P8_VECTOR,
35370       (BYTES_BIG_ENDIAN ? CODE_FOR_p8_vmrgew_v4sf_direct
35371        : CODE_FOR_p8_vmrgow_v4sf_direct),
35372       {  0,  1,  2,  3, 16, 17, 18, 19,  8,  9, 10, 11, 24, 25, 26, 27 } },
35373     { OPTION_MASK_P8_VECTOR,
35374       (BYTES_BIG_ENDIAN ? CODE_FOR_p8_vmrgow_v4sf_direct
35375        : CODE_FOR_p8_vmrgew_v4sf_direct),
35376       {  4,  5,  6,  7, 20, 21, 22, 23, 12, 13, 14, 15, 28, 29, 30, 31 } }
35377   };
35378
35379   unsigned int i, j, elt, which;
35380   unsigned char perm[16];
35381   rtx x;
35382   bool one_vec;
35383
35384   /* Unpack the constant selector.  */
35385   for (i = which = 0; i < 16; ++i)
35386     {
35387       elt = sel[i] & 31;
35388       which |= (elt < 16 ? 1 : 2);
35389       perm[i] = elt;
35390     }
35391
35392   /* Simplify the constant selector based on operands.  */
35393   switch (which)
35394     {
35395     default:
35396       gcc_unreachable ();
35397
35398     case 3:
35399       one_vec = false;
35400       if (!rtx_equal_p (op0, op1))
35401         break;
35402       /* FALLTHRU */
35403
35404     case 2:
35405       for (i = 0; i < 16; ++i)
35406         perm[i] &= 15;
35407       op0 = op1;
35408       one_vec = true;
35409       break;
35410
35411     case 1:
35412       op1 = op0;
35413       one_vec = true;
35414       break;
35415     }
35416  
35417   /* Look for splat patterns.  */
35418   if (one_vec)
35419     {
35420       elt = perm[0];
35421
35422       for (i = 0; i < 16; ++i)
35423         if (perm[i] != elt)
35424           break;
35425       if (i == 16)
35426         {
35427           if (!BYTES_BIG_ENDIAN)
35428             elt = 15 - elt;
35429           emit_insn (gen_altivec_vspltb_direct (target, op0, GEN_INT (elt)));
35430           return true;
35431         }
35432
35433       if (elt % 2 == 0)
35434         {
35435           for (i = 0; i < 16; i += 2)
35436             if (perm[i] != elt || perm[i + 1] != elt + 1)
35437               break;
35438           if (i == 16)
35439             {
35440               int field = BYTES_BIG_ENDIAN ? elt / 2 : 7 - elt / 2;
35441               x = gen_reg_rtx (V8HImode);
35442               emit_insn (gen_altivec_vsplth_direct (x, gen_lowpart (V8HImode, op0),
35443                                                     GEN_INT (field)));
35444               emit_move_insn (target, gen_lowpart (V16QImode, x));
35445               return true;
35446             }
35447         }
35448
35449       if (elt % 4 == 0)
35450         {
35451           for (i = 0; i < 16; i += 4)
35452             if (perm[i] != elt
35453                 || perm[i + 1] != elt + 1
35454                 || perm[i + 2] != elt + 2
35455                 || perm[i + 3] != elt + 3)
35456               break;
35457           if (i == 16)
35458             {
35459               int field = BYTES_BIG_ENDIAN ? elt / 4 : 3 - elt / 4;
35460               x = gen_reg_rtx (V4SImode);
35461               emit_insn (gen_altivec_vspltw_direct (x, gen_lowpart (V4SImode, op0),
35462                                                     GEN_INT (field)));
35463               emit_move_insn (target, gen_lowpart (V16QImode, x));
35464               return true;
35465             }
35466         }
35467     }
35468
35469   /* Look for merge and pack patterns.  */
35470   for (j = 0; j < ARRAY_SIZE (patterns); ++j)
35471     {
35472       bool swapped;
35473
35474       if ((patterns[j].mask & rs6000_isa_flags) == 0)
35475         continue;
35476
35477       elt = patterns[j].perm[0];
35478       if (perm[0] == elt)
35479         swapped = false;
35480       else if (perm[0] == elt + 16)
35481         swapped = true;
35482       else
35483         continue;
35484       for (i = 1; i < 16; ++i)
35485         {
35486           elt = patterns[j].perm[i];
35487           if (swapped)
35488             elt = (elt >= 16 ? elt - 16 : elt + 16);
35489           else if (one_vec && elt >= 16)
35490             elt -= 16;
35491           if (perm[i] != elt)
35492             break;
35493         }
35494       if (i == 16)
35495         {
35496           enum insn_code icode = patterns[j].impl;
35497           machine_mode omode = insn_data[icode].operand[0].mode;
35498           machine_mode imode = insn_data[icode].operand[1].mode;
35499
35500           /* For little-endian, don't use vpkuwum and vpkuhum if the
35501              underlying vector type is not V4SI and V8HI, respectively.
35502              For example, using vpkuwum with a V8HI picks up the even
35503              halfwords (BE numbering) when the even halfwords (LE
35504              numbering) are what we need.  */
35505           if (!BYTES_BIG_ENDIAN
35506               && icode == CODE_FOR_altivec_vpkuwum_direct
35507               && ((REG_P (op0)
35508                    && GET_MODE (op0) != V4SImode)
35509                   || (SUBREG_P (op0)
35510                       && GET_MODE (XEXP (op0, 0)) != V4SImode)))
35511             continue;
35512           if (!BYTES_BIG_ENDIAN
35513               && icode == CODE_FOR_altivec_vpkuhum_direct
35514               && ((REG_P (op0)
35515                    && GET_MODE (op0) != V8HImode)
35516                   || (SUBREG_P (op0)
35517                       && GET_MODE (XEXP (op0, 0)) != V8HImode)))
35518             continue;
35519
35520           /* For little-endian, the two input operands must be swapped
35521              (or swapped back) to ensure proper right-to-left numbering
35522              from 0 to 2N-1.  */
35523           if (swapped ^ !BYTES_BIG_ENDIAN)
35524             std::swap (op0, op1);
35525           if (imode != V16QImode)
35526             {
35527               op0 = gen_lowpart (imode, op0);
35528               op1 = gen_lowpart (imode, op1);
35529             }
35530           if (omode == V16QImode)
35531             x = target;
35532           else
35533             x = gen_reg_rtx (omode);
35534           emit_insn (GEN_FCN (icode) (x, op0, op1));
35535           if (omode != V16QImode)
35536             emit_move_insn (target, gen_lowpart (V16QImode, x));
35537           return true;
35538         }
35539     }
35540
35541   if (!BYTES_BIG_ENDIAN)
35542     {
35543       altivec_expand_vec_perm_const_le (target, op0, op1, sel);
35544       return true;
35545     }
35546
35547   return false;
35548 }
35549
35550 /* Expand a VSX Permute Doubleword constant permutation.
35551    Return true if we match an efficient implementation.  */
35552
35553 static bool
35554 rs6000_expand_vec_perm_const_1 (rtx target, rtx op0, rtx op1,
35555                                 unsigned char perm0, unsigned char perm1)
35556 {
35557   rtx x;
35558
35559   /* If both selectors come from the same operand, fold to single op.  */
35560   if ((perm0 & 2) == (perm1 & 2))
35561     {
35562       if (perm0 & 2)
35563         op0 = op1;
35564       else
35565         op1 = op0;
35566     }
35567   /* If both operands are equal, fold to simpler permutation.  */
35568   if (rtx_equal_p (op0, op1))
35569     {
35570       perm0 = perm0 & 1;
35571       perm1 = (perm1 & 1) + 2;
35572     }
35573   /* If the first selector comes from the second operand, swap.  */
35574   else if (perm0 & 2)
35575     {
35576       if (perm1 & 2)
35577         return false;
35578       perm0 -= 2;
35579       perm1 += 2;
35580       std::swap (op0, op1);
35581     }
35582   /* If the second selector does not come from the second operand, fail.  */
35583   else if ((perm1 & 2) == 0)
35584     return false;
35585
35586   /* Success! */
35587   if (target != NULL)
35588     {
35589       machine_mode vmode, dmode;
35590       rtvec v;
35591
35592       vmode = GET_MODE (target);
35593       gcc_assert (GET_MODE_NUNITS (vmode) == 2);
35594       dmode = mode_for_vector (GET_MODE_INNER (vmode), 4).require ();
35595       x = gen_rtx_VEC_CONCAT (dmode, op0, op1);
35596       v = gen_rtvec (2, GEN_INT (perm0), GEN_INT (perm1));
35597       x = gen_rtx_VEC_SELECT (vmode, x, gen_rtx_PARALLEL (VOIDmode, v));
35598       emit_insn (gen_rtx_SET (target, x));
35599     }
35600   return true;
35601 }
35602
35603 /* Implement TARGET_VECTORIZE_VEC_PERM_CONST.  */
35604
35605 static bool
35606 rs6000_vectorize_vec_perm_const (machine_mode vmode, rtx target, rtx op0,
35607                                  rtx op1, const vec_perm_indices &sel)
35608 {
35609   bool testing_p = !target;
35610
35611   /* AltiVec (and thus VSX) can handle arbitrary permutations.  */
35612   if (TARGET_ALTIVEC && testing_p)
35613     return true;
35614
35615   /* Check for ps_merge* or xxpermdi insns.  */
35616   if ((vmode == V2DFmode || vmode == V2DImode) && VECTOR_MEM_VSX_P (vmode))
35617     {
35618       if (testing_p)
35619         {
35620           op0 = gen_raw_REG (vmode, LAST_VIRTUAL_REGISTER + 1);
35621           op1 = gen_raw_REG (vmode, LAST_VIRTUAL_REGISTER + 2);
35622         }
35623       if (rs6000_expand_vec_perm_const_1 (target, op0, op1, sel[0], sel[1]))
35624         return true;
35625     }
35626
35627   if (TARGET_ALTIVEC)
35628     {
35629       /* Force the target-independent code to lower to V16QImode.  */
35630       if (vmode != V16QImode)
35631         return false;
35632       if (altivec_expand_vec_perm_const (target, op0, op1, sel))
35633         return true;
35634     }
35635
35636   return false;
35637 }
35638
35639 /* A subroutine for rs6000_expand_extract_even & rs6000_expand_interleave.
35640    OP0 and OP1 are the input vectors and TARGET is the output vector.
35641    PERM specifies the constant permutation vector.  */
35642
35643 static void
35644 rs6000_do_expand_vec_perm (rtx target, rtx op0, rtx op1,
35645                            machine_mode vmode, const vec_perm_builder &perm)
35646 {
35647   rtx x = expand_vec_perm_const (vmode, op0, op1, perm, BLKmode, target);
35648   if (x != target)
35649     emit_move_insn (target, x);
35650 }
35651
35652 /* Expand an extract even operation.  */
35653
35654 void
35655 rs6000_expand_extract_even (rtx target, rtx op0, rtx op1)
35656 {
35657   machine_mode vmode = GET_MODE (target);
35658   unsigned i, nelt = GET_MODE_NUNITS (vmode);
35659   vec_perm_builder perm (nelt, nelt, 1);
35660
35661   for (i = 0; i < nelt; i++)
35662     perm.quick_push (i * 2);
35663
35664   rs6000_do_expand_vec_perm (target, op0, op1, vmode, perm);
35665 }
35666
35667 /* Expand a vector interleave operation.  */
35668
35669 void
35670 rs6000_expand_interleave (rtx target, rtx op0, rtx op1, bool highp)
35671 {
35672   machine_mode vmode = GET_MODE (target);
35673   unsigned i, high, nelt = GET_MODE_NUNITS (vmode);
35674   vec_perm_builder perm (nelt, nelt, 1);
35675
35676   high = (highp ? 0 : nelt / 2);
35677   for (i = 0; i < nelt / 2; i++)
35678     {
35679       perm.quick_push (i + high);
35680       perm.quick_push (i + nelt + high);
35681     }
35682
35683   rs6000_do_expand_vec_perm (target, op0, op1, vmode, perm);
35684 }
35685
35686 /* Scale a V2DF vector SRC by two to the SCALE and place in TGT.  */
35687 void
35688 rs6000_scale_v2df (rtx tgt, rtx src, int scale)
35689 {
35690   HOST_WIDE_INT hwi_scale (scale);
35691   REAL_VALUE_TYPE r_pow;
35692   rtvec v = rtvec_alloc (2);
35693   rtx elt;
35694   rtx scale_vec = gen_reg_rtx (V2DFmode);
35695   (void)real_powi (&r_pow, DFmode, &dconst2, hwi_scale);
35696   elt = const_double_from_real_value (r_pow, DFmode);
35697   RTVEC_ELT (v, 0) = elt;
35698   RTVEC_ELT (v, 1) = elt;
35699   rs6000_expand_vector_init (scale_vec, gen_rtx_PARALLEL (V2DFmode, v));
35700   emit_insn (gen_mulv2df3 (tgt, src, scale_vec));
35701 }
35702
35703 /* Return an RTX representing where to find the function value of a
35704    function returning MODE.  */
35705 static rtx
35706 rs6000_complex_function_value (machine_mode mode)
35707 {
35708   unsigned int regno;
35709   rtx r1, r2;
35710   machine_mode inner = GET_MODE_INNER (mode);
35711   unsigned int inner_bytes = GET_MODE_UNIT_SIZE (mode);
35712
35713   if (TARGET_FLOAT128_TYPE
35714       && (mode == KCmode
35715           || (mode == TCmode && TARGET_IEEEQUAD)))
35716     regno = ALTIVEC_ARG_RETURN;
35717
35718   else if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT)
35719     regno = FP_ARG_RETURN;
35720
35721   else
35722     {
35723       regno = GP_ARG_RETURN;
35724
35725       /* 32-bit is OK since it'll go in r3/r4.  */
35726       if (TARGET_32BIT && inner_bytes >= 4)
35727         return gen_rtx_REG (mode, regno);
35728     }
35729
35730   if (inner_bytes >= 8)
35731     return gen_rtx_REG (mode, regno);
35732
35733   r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
35734                           const0_rtx);
35735   r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
35736                           GEN_INT (inner_bytes));
35737   return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
35738 }
35739
35740 /* Return an rtx describing a return value of MODE as a PARALLEL
35741    in N_ELTS registers, each of mode ELT_MODE, starting at REGNO,
35742    stride REG_STRIDE.  */
35743
35744 static rtx
35745 rs6000_parallel_return (machine_mode mode,
35746                         int n_elts, machine_mode elt_mode,
35747                         unsigned int regno, unsigned int reg_stride)
35748 {
35749   rtx par = gen_rtx_PARALLEL (mode, rtvec_alloc (n_elts));
35750
35751   int i;
35752   for (i = 0; i < n_elts; i++)
35753     {
35754       rtx r = gen_rtx_REG (elt_mode, regno);
35755       rtx off = GEN_INT (i * GET_MODE_SIZE (elt_mode));
35756       XVECEXP (par, 0, i) = gen_rtx_EXPR_LIST (VOIDmode, r, off);
35757       regno += reg_stride;
35758     }
35759
35760   return par;
35761 }
35762
35763 /* Target hook for TARGET_FUNCTION_VALUE.
35764
35765    An integer value is in r3 and a floating-point value is in fp1,
35766    unless -msoft-float.  */
35767
35768 static rtx
35769 rs6000_function_value (const_tree valtype,
35770                        const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
35771                        bool outgoing ATTRIBUTE_UNUSED)
35772 {
35773   machine_mode mode;
35774   unsigned int regno;
35775   machine_mode elt_mode;
35776   int n_elts;
35777
35778   /* Special handling for structs in darwin64.  */
35779   if (TARGET_MACHO 
35780       && rs6000_darwin64_struct_check_p (TYPE_MODE (valtype), valtype))
35781     {
35782       CUMULATIVE_ARGS valcum;
35783       rtx valret;
35784
35785       valcum.words = 0;
35786       valcum.fregno = FP_ARG_MIN_REG;
35787       valcum.vregno = ALTIVEC_ARG_MIN_REG;
35788       /* Do a trial code generation as if this were going to be passed as
35789          an argument; if any part goes in memory, we return NULL.  */
35790       valret = rs6000_darwin64_record_arg (&valcum, valtype, true, /* retval= */ true);
35791       if (valret)
35792         return valret;
35793       /* Otherwise fall through to standard ABI rules.  */
35794     }
35795
35796   mode = TYPE_MODE (valtype);
35797
35798   /* The ELFv2 ABI returns homogeneous VFP aggregates in registers.  */
35799   if (rs6000_discover_homogeneous_aggregate (mode, valtype, &elt_mode, &n_elts))
35800     {
35801       int first_reg, n_regs;
35802
35803       if (SCALAR_FLOAT_MODE_NOT_VECTOR_P (elt_mode))
35804         {
35805           /* _Decimal128 must use even/odd register pairs.  */
35806           first_reg = (elt_mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
35807           n_regs = (GET_MODE_SIZE (elt_mode) + 7) >> 3;
35808         }
35809       else
35810         {
35811           first_reg = ALTIVEC_ARG_RETURN;
35812           n_regs = 1;
35813         }
35814
35815       return rs6000_parallel_return (mode, n_elts, elt_mode, first_reg, n_regs);
35816     }
35817
35818   /* Some return value types need be split in -mpowerpc64, 32bit ABI.  */
35819   if (TARGET_32BIT && TARGET_POWERPC64)
35820     switch (mode)
35821       {
35822       default:
35823         break;
35824       case E_DImode:
35825       case E_SCmode:
35826       case E_DCmode:
35827       case E_TCmode:
35828         int count = GET_MODE_SIZE (mode) / 4;
35829         return rs6000_parallel_return (mode, count, SImode, GP_ARG_RETURN, 1);
35830       }
35831
35832   if ((INTEGRAL_TYPE_P (valtype)
35833        && GET_MODE_BITSIZE (mode) < (TARGET_32BIT ? 32 : 64))
35834       || POINTER_TYPE_P (valtype))
35835     mode = TARGET_32BIT ? SImode : DImode;
35836
35837   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT)
35838     /* _Decimal128 must use an even/odd register pair.  */
35839     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
35840   else if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT
35841            && !FLOAT128_VECTOR_P (mode))
35842     regno = FP_ARG_RETURN;
35843   else if (TREE_CODE (valtype) == COMPLEX_TYPE
35844            && targetm.calls.split_complex_arg)
35845     return rs6000_complex_function_value (mode);
35846   /* VSX is a superset of Altivec and adds V2DImode/V2DFmode.  Since the same
35847      return register is used in both cases, and we won't see V2DImode/V2DFmode
35848      for pure altivec, combine the two cases.  */
35849   else if ((TREE_CODE (valtype) == VECTOR_TYPE || FLOAT128_VECTOR_P (mode))
35850            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
35851            && ALTIVEC_OR_VSX_VECTOR_MODE (mode))
35852     regno = ALTIVEC_ARG_RETURN;
35853   else
35854     regno = GP_ARG_RETURN;
35855
35856   return gen_rtx_REG (mode, regno);
35857 }
35858
35859 /* Define how to find the value returned by a library function
35860    assuming the value has mode MODE.  */
35861 rtx
35862 rs6000_libcall_value (machine_mode mode)
35863 {
35864   unsigned int regno;
35865
35866   /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
35867   if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
35868     return rs6000_parallel_return (mode, 2, SImode, GP_ARG_RETURN, 1);
35869
35870   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT)
35871     /* _Decimal128 must use an even/odd register pair.  */
35872     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
35873   else if (SCALAR_FLOAT_MODE_NOT_VECTOR_P (mode) && TARGET_HARD_FLOAT)
35874     regno = FP_ARG_RETURN;
35875   /* VSX is a superset of Altivec and adds V2DImode/V2DFmode.  Since the same
35876      return register is used in both cases, and we won't see V2DImode/V2DFmode
35877      for pure altivec, combine the two cases.  */
35878   else if (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
35879            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
35880     regno = ALTIVEC_ARG_RETURN;
35881   else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
35882     return rs6000_complex_function_value (mode);
35883   else
35884     regno = GP_ARG_RETURN;
35885
35886   return gen_rtx_REG (mode, regno);
35887 }
35888
35889 /* Compute register pressure classes.  We implement the target hook to avoid
35890    IRA picking something like GEN_OR_FLOAT_REGS as a pressure class, which can
35891    lead to incorrect estimates of number of available registers and therefor
35892    increased register pressure/spill.   */
35893 static int
35894 rs6000_compute_pressure_classes (enum reg_class *pressure_classes)
35895 {
35896   int n;
35897
35898   n = 0;
35899   pressure_classes[n++] = GENERAL_REGS;
35900   if (TARGET_VSX)
35901     pressure_classes[n++] = VSX_REGS;
35902   else
35903     {
35904       if (TARGET_ALTIVEC)
35905         pressure_classes[n++] = ALTIVEC_REGS;
35906       if (TARGET_HARD_FLOAT)
35907         pressure_classes[n++] = FLOAT_REGS;
35908     }
35909   pressure_classes[n++] = CR_REGS;
35910   pressure_classes[n++] = SPECIAL_REGS;
35911
35912   return n;
35913 }
35914
35915 /* Given FROM and TO register numbers, say whether this elimination is allowed.
35916    Frame pointer elimination is automatically handled.
35917
35918    For the RS/6000, if frame pointer elimination is being done, we would like
35919    to convert ap into fp, not sp.
35920
35921    We need r30 if -mminimal-toc was specified, and there are constant pool
35922    references.  */
35923
35924 static bool
35925 rs6000_can_eliminate (const int from, const int to)
35926 {
35927   return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
35928           ? ! frame_pointer_needed
35929           : from == RS6000_PIC_OFFSET_TABLE_REGNUM
35930             ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC
35931                 || constant_pool_empty_p ()
35932             : true);
35933 }
35934
35935 /* Define the offset between two registers, FROM to be eliminated and its
35936    replacement TO, at the start of a routine.  */
35937 HOST_WIDE_INT
35938 rs6000_initial_elimination_offset (int from, int to)
35939 {
35940   rs6000_stack_t *info = rs6000_stack_info ();
35941   HOST_WIDE_INT offset;
35942
35943   if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
35944     offset = info->push_p ? 0 : -info->total_size;
35945   else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
35946     {
35947       offset = info->push_p ? 0 : -info->total_size;
35948       if (FRAME_GROWS_DOWNWARD)
35949         offset += info->fixed_size + info->vars_size + info->parm_size;
35950     }
35951   else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
35952     offset = FRAME_GROWS_DOWNWARD
35953              ? info->fixed_size + info->vars_size + info->parm_size
35954              : 0;
35955   else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
35956     offset = info->total_size;
35957   else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
35958     offset = info->push_p ? info->total_size : 0;
35959   else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
35960     offset = 0;
35961   else
35962     gcc_unreachable ();
35963
35964   return offset;
35965 }
35966
35967 /* Fill in sizes of registers used by unwinder.  */
35968
35969 static void
35970 rs6000_init_dwarf_reg_sizes_extra (tree address)
35971 {
35972   if (TARGET_MACHO && ! TARGET_ALTIVEC)
35973     {
35974       int i;
35975       machine_mode mode = TYPE_MODE (char_type_node);
35976       rtx addr = expand_expr (address, NULL_RTX, VOIDmode, EXPAND_NORMAL);
35977       rtx mem = gen_rtx_MEM (BLKmode, addr);
35978       rtx value = gen_int_mode (16, mode);
35979
35980       /* On Darwin, libgcc may be built to run on both G3 and G4/5.
35981          The unwinder still needs to know the size of Altivec registers.  */
35982
35983       for (i = FIRST_ALTIVEC_REGNO; i < LAST_ALTIVEC_REGNO+1; i++)
35984         {
35985           int column = DWARF_REG_TO_UNWIND_COLUMN
35986                 (DWARF2_FRAME_REG_OUT (DWARF_FRAME_REGNUM (i), true));
35987           HOST_WIDE_INT offset = column * GET_MODE_SIZE (mode);
35988
35989           emit_move_insn (adjust_address (mem, mode, offset), value);
35990         }
35991     }
35992 }
35993
35994 /* Map internal gcc register numbers to debug format register numbers.
35995    FORMAT specifies the type of debug register number to use:
35996      0 -- debug information, except for frame-related sections
35997      1 -- DWARF .debug_frame section
35998      2 -- DWARF .eh_frame section  */
35999
36000 unsigned int
36001 rs6000_dbx_register_number (unsigned int regno, unsigned int format)
36002 {
36003   /* On some platforms, we use the standard DWARF register
36004      numbering for .debug_info and .debug_frame.  */
36005   if ((format == 0 && write_symbols == DWARF2_DEBUG) || format == 1)
36006     {
36007 #ifdef RS6000_USE_DWARF_NUMBERING
36008       if (regno <= 31)
36009         return regno;
36010       if (FP_REGNO_P (regno))
36011         return regno - FIRST_FPR_REGNO + 32;
36012       if (ALTIVEC_REGNO_P (regno))
36013         return regno - FIRST_ALTIVEC_REGNO + 1124;
36014       if (regno == LR_REGNO)
36015         return 108;
36016       if (regno == CTR_REGNO)
36017         return 109;
36018       if (regno == CA_REGNO)
36019         return 101;  /* XER */
36020       /* Special handling for CR for .debug_frame: rs6000_emit_prologue has
36021          translated any combination of CR2, CR3, CR4 saves to a save of CR2.
36022          The actual code emitted saves the whole of CR, so we map CR2_REGNO
36023          to the DWARF reg for CR.  */
36024       if (format == 1 && regno == CR2_REGNO)
36025         return 64;
36026       if (CR_REGNO_P (regno))
36027         return regno - CR0_REGNO + 86;
36028       if (regno == VRSAVE_REGNO)
36029         return 356;
36030       if (regno == VSCR_REGNO)
36031         return 67;
36032
36033       /* These do not make much sense.  */
36034       if (regno == FRAME_POINTER_REGNUM)
36035         return 111;
36036       if (regno == ARG_POINTER_REGNUM)
36037         return 67;
36038       if (regno == 64)
36039         return 100;
36040
36041       gcc_unreachable ();
36042 #endif
36043     }
36044
36045   /* We use the GCC 7 (and before) internal number for non-DWARF debug
36046      information, and also for .eh_frame.  */
36047   /* Translate the regnos to their numbers in GCC 7 (and before).  */
36048   if (regno <= 31)
36049     return regno;
36050   if (FP_REGNO_P (regno))
36051     return regno - FIRST_FPR_REGNO + 32;
36052   if (ALTIVEC_REGNO_P (regno))
36053     return regno - FIRST_ALTIVEC_REGNO + 77;
36054   if (regno == LR_REGNO)
36055     return 65;
36056   if (regno == CTR_REGNO)
36057     return 66;
36058   if (regno == CA_REGNO)
36059     return 76;  /* XER */
36060   if (CR_REGNO_P (regno))
36061     return regno - CR0_REGNO + 68;
36062   if (regno == VRSAVE_REGNO)
36063     return 109;
36064   if (regno == VSCR_REGNO)
36065     return 110;
36066
36067   if (regno == FRAME_POINTER_REGNUM)
36068     return 111;
36069   if (regno == ARG_POINTER_REGNUM)
36070     return 67;
36071   if (regno == 64)
36072     return 64;
36073
36074   gcc_unreachable ();
36075 }
36076
36077 /* target hook eh_return_filter_mode */
36078 static scalar_int_mode
36079 rs6000_eh_return_filter_mode (void)
36080 {
36081   return TARGET_32BIT ? SImode : word_mode;
36082 }
36083
36084 /* Target hook for translate_mode_attribute.  */
36085 static machine_mode
36086 rs6000_translate_mode_attribute (machine_mode mode)
36087 {
36088   if ((FLOAT128_IEEE_P (mode)
36089        && ieee128_float_type_node == long_double_type_node)
36090       || (FLOAT128_IBM_P (mode)
36091           && ibm128_float_type_node == long_double_type_node))
36092     return COMPLEX_MODE_P (mode) ? E_TCmode : E_TFmode;
36093   return mode;
36094 }
36095
36096 /* Target hook for scalar_mode_supported_p.  */
36097 static bool
36098 rs6000_scalar_mode_supported_p (scalar_mode mode)
36099 {
36100   /* -m32 does not support TImode.  This is the default, from
36101      default_scalar_mode_supported_p.  For -m32 -mpowerpc64 we want the
36102      same ABI as for -m32.  But default_scalar_mode_supported_p allows
36103      integer modes of precision 2 * BITS_PER_WORD, which matches TImode
36104      for -mpowerpc64.  */
36105   if (TARGET_32BIT && mode == TImode)
36106     return false;
36107
36108   if (DECIMAL_FLOAT_MODE_P (mode))
36109     return default_decimal_float_supported_p ();
36110   else if (TARGET_FLOAT128_TYPE && (mode == KFmode || mode == IFmode))
36111     return true;
36112   else
36113     return default_scalar_mode_supported_p (mode);
36114 }
36115
36116 /* Target hook for vector_mode_supported_p.  */
36117 static bool
36118 rs6000_vector_mode_supported_p (machine_mode mode)
36119 {
36120   /* There is no vector form for IEEE 128-bit.  If we return true for IEEE
36121      128-bit, the compiler might try to widen IEEE 128-bit to IBM
36122      double-double.  */
36123   if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode) && !FLOAT128_IEEE_P (mode))
36124     return true;
36125
36126   else
36127     return false;
36128 }
36129
36130 /* Target hook for floatn_mode.  */
36131 static opt_scalar_float_mode
36132 rs6000_floatn_mode (int n, bool extended)
36133 {
36134   if (extended)
36135     {
36136       switch (n)
36137         {
36138         case 32:
36139           return DFmode;
36140
36141         case 64:
36142           if (TARGET_FLOAT128_TYPE)
36143             return (FLOAT128_IEEE_P (TFmode)) ? TFmode : KFmode;
36144           else
36145             return opt_scalar_float_mode ();
36146
36147         case 128:
36148           return opt_scalar_float_mode ();
36149
36150         default:
36151           /* Those are the only valid _FloatNx types.  */
36152           gcc_unreachable ();
36153         }
36154     }
36155   else
36156     {
36157       switch (n)
36158         {
36159         case 32:
36160           return SFmode;
36161
36162         case 64:
36163           return DFmode;
36164
36165         case 128:
36166           if (TARGET_FLOAT128_TYPE)
36167             return (FLOAT128_IEEE_P (TFmode)) ? TFmode : KFmode;
36168           else
36169             return opt_scalar_float_mode ();
36170
36171         default:
36172           return opt_scalar_float_mode ();
36173         }
36174     }
36175
36176 }
36177
36178 /* Target hook for c_mode_for_suffix.  */
36179 static machine_mode
36180 rs6000_c_mode_for_suffix (char suffix)
36181 {
36182   if (TARGET_FLOAT128_TYPE)
36183     {
36184       if (suffix == 'q' || suffix == 'Q')
36185         return (FLOAT128_IEEE_P (TFmode)) ? TFmode : KFmode;
36186
36187       /* At the moment, we are not defining a suffix for IBM extended double.
36188          If/when the default for -mabi=ieeelongdouble is changed, and we want
36189          to support __ibm128 constants in legacy library code, we may need to
36190          re-evalaute this decision.  Currently, c-lex.c only supports 'w' and
36191          'q' as machine dependent suffixes.  The x86_64 port uses 'w' for
36192          __float80 constants.  */
36193     }
36194
36195   return VOIDmode;
36196 }
36197
36198 /* Target hook for invalid_arg_for_unprototyped_fn. */
36199 static const char *
36200 invalid_arg_for_unprototyped_fn (const_tree typelist, const_tree funcdecl, const_tree val)
36201 {
36202   return (!rs6000_darwin64_abi
36203           && typelist == 0
36204           && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
36205           && (funcdecl == NULL_TREE
36206               || (TREE_CODE (funcdecl) == FUNCTION_DECL
36207                   && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
36208           ? N_("AltiVec argument passed to unprototyped function")
36209           : NULL;
36210 }
36211
36212 /* For TARGET_SECURE_PLT 32-bit PIC code we can save PIC register
36213    setup by using __stack_chk_fail_local hidden function instead of
36214    calling __stack_chk_fail directly.  Otherwise it is better to call
36215    __stack_chk_fail directly.  */
36216
36217 static tree ATTRIBUTE_UNUSED
36218 rs6000_stack_protect_fail (void)
36219 {
36220   return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
36221          ? default_hidden_stack_protect_fail ()
36222          : default_external_stack_protect_fail ();
36223 }
36224
36225 /* Implement the TARGET_ASAN_SHADOW_OFFSET hook.  */
36226
36227 #if TARGET_ELF
36228 static unsigned HOST_WIDE_INT
36229 rs6000_asan_shadow_offset (void)
36230 {
36231   return (unsigned HOST_WIDE_INT) 1 << (TARGET_64BIT ? 41 : 29);
36232 }
36233 #endif
36234 \f
36235 /* Mask options that we want to support inside of attribute((target)) and
36236    #pragma GCC target operations.  Note, we do not include things like
36237    64/32-bit, endianness, hard/soft floating point, etc. that would have
36238    different calling sequences.  */
36239
36240 struct rs6000_opt_mask {
36241   const char *name;             /* option name */
36242   HOST_WIDE_INT mask;           /* mask to set */
36243   bool invert;                  /* invert sense of mask */
36244   bool valid_target;            /* option is a target option */
36245 };
36246
36247 static struct rs6000_opt_mask const rs6000_opt_masks[] =
36248 {
36249   { "altivec",                  OPTION_MASK_ALTIVEC,            false, true  },
36250   { "cmpb",                     OPTION_MASK_CMPB,               false, true  },
36251   { "crypto",                   OPTION_MASK_CRYPTO,             false, true  },
36252   { "direct-move",              OPTION_MASK_DIRECT_MOVE,        false, true  },
36253   { "dlmzb",                    OPTION_MASK_DLMZB,              false, true  },
36254   { "efficient-unaligned-vsx",  OPTION_MASK_EFFICIENT_UNALIGNED_VSX,
36255                                                                 false, true  },
36256   { "float128",                 OPTION_MASK_FLOAT128_KEYWORD,   false, true  },
36257   { "float128-hardware",        OPTION_MASK_FLOAT128_HW,        false, true  },
36258   { "fprnd",                    OPTION_MASK_FPRND,              false, true  },
36259   { "hard-dfp",                 OPTION_MASK_DFP,                false, true  },
36260   { "htm",                      OPTION_MASK_HTM,                false, true  },
36261   { "isel",                     OPTION_MASK_ISEL,               false, true  },
36262   { "mfcrf",                    OPTION_MASK_MFCRF,              false, true  },
36263   { "mfpgpr",                   OPTION_MASK_MFPGPR,             false, true  },
36264   { "modulo",                   OPTION_MASK_MODULO,             false, true  },
36265   { "mulhw",                    OPTION_MASK_MULHW,              false, true  },
36266   { "multiple",                 OPTION_MASK_MULTIPLE,           false, true  },
36267   { "popcntb",                  OPTION_MASK_POPCNTB,            false, true  },
36268   { "popcntd",                  OPTION_MASK_POPCNTD,            false, true  },
36269   { "power8-fusion",            OPTION_MASK_P8_FUSION,          false, true  },
36270   { "power8-fusion-sign",       OPTION_MASK_P8_FUSION_SIGN,     false, true  },
36271   { "power8-vector",            OPTION_MASK_P8_VECTOR,          false, true  },
36272   { "power9-minmax",            OPTION_MASK_P9_MINMAX,          false, true  },
36273   { "power9-misc",              OPTION_MASK_P9_MISC,            false, true  },
36274   { "power9-vector",            OPTION_MASK_P9_VECTOR,          false, true  },
36275   { "powerpc-gfxopt",           OPTION_MASK_PPC_GFXOPT,         false, true  },
36276   { "powerpc-gpopt",            OPTION_MASK_PPC_GPOPT,          false, true  },
36277   { "quad-memory",              OPTION_MASK_QUAD_MEMORY,        false, true  },
36278   { "quad-memory-atomic",       OPTION_MASK_QUAD_MEMORY_ATOMIC, false, true  },
36279   { "recip-precision",          OPTION_MASK_RECIP_PRECISION,    false, true  },
36280   { "save-toc-indirect",        OPTION_MASK_SAVE_TOC_INDIRECT,  false, true  },
36281   { "string",                   0,                              false, true  },
36282   { "update",                   OPTION_MASK_NO_UPDATE,          true , true  },
36283   { "vsx",                      OPTION_MASK_VSX,                false, true  },
36284 #ifdef OPTION_MASK_64BIT
36285 #if TARGET_AIX_OS
36286   { "aix64",                    OPTION_MASK_64BIT,              false, false },
36287   { "aix32",                    OPTION_MASK_64BIT,              true,  false },
36288 #else
36289   { "64",                       OPTION_MASK_64BIT,              false, false },
36290   { "32",                       OPTION_MASK_64BIT,              true,  false },
36291 #endif
36292 #endif
36293 #ifdef OPTION_MASK_EABI
36294   { "eabi",                     OPTION_MASK_EABI,               false, false },
36295 #endif
36296 #ifdef OPTION_MASK_LITTLE_ENDIAN
36297   { "little",                   OPTION_MASK_LITTLE_ENDIAN,      false, false },
36298   { "big",                      OPTION_MASK_LITTLE_ENDIAN,      true,  false },
36299 #endif
36300 #ifdef OPTION_MASK_RELOCATABLE
36301   { "relocatable",              OPTION_MASK_RELOCATABLE,        false, false },
36302 #endif
36303 #ifdef OPTION_MASK_STRICT_ALIGN
36304   { "strict-align",             OPTION_MASK_STRICT_ALIGN,       false, false },
36305 #endif
36306   { "soft-float",               OPTION_MASK_SOFT_FLOAT,         false, false },
36307   { "string",                   0,                              false, false },
36308 };
36309
36310 /* Builtin mask mapping for printing the flags.  */
36311 static struct rs6000_opt_mask const rs6000_builtin_mask_names[] =
36312 {
36313   { "altivec",           RS6000_BTM_ALTIVEC,    false, false },
36314   { "vsx",               RS6000_BTM_VSX,        false, false },
36315   { "fre",               RS6000_BTM_FRE,        false, false },
36316   { "fres",              RS6000_BTM_FRES,       false, false },
36317   { "frsqrte",           RS6000_BTM_FRSQRTE,    false, false },
36318   { "frsqrtes",          RS6000_BTM_FRSQRTES,   false, false },
36319   { "popcntd",           RS6000_BTM_POPCNTD,    false, false },
36320   { "cell",              RS6000_BTM_CELL,       false, false },
36321   { "power8-vector",     RS6000_BTM_P8_VECTOR,  false, false },
36322   { "power9-vector",     RS6000_BTM_P9_VECTOR,  false, false },
36323   { "power9-misc",       RS6000_BTM_P9_MISC,    false, false },
36324   { "crypto",            RS6000_BTM_CRYPTO,     false, false },
36325   { "htm",               RS6000_BTM_HTM,        false, false },
36326   { "hard-dfp",          RS6000_BTM_DFP,        false, false },
36327   { "hard-float",        RS6000_BTM_HARD_FLOAT, false, false },
36328   { "long-double-128",   RS6000_BTM_LDBL128,    false, false },
36329   { "powerpc64",         RS6000_BTM_POWERPC64,  false, false },
36330   { "float128",          RS6000_BTM_FLOAT128,   false, false },
36331   { "float128-hw",       RS6000_BTM_FLOAT128_HW,false, false },
36332 };
36333
36334 /* Option variables that we want to support inside attribute((target)) and
36335    #pragma GCC target operations.  */
36336
36337 struct rs6000_opt_var {
36338   const char *name;             /* option name */
36339   size_t global_offset;         /* offset of the option in global_options.  */
36340   size_t target_offset;         /* offset of the option in target options.  */
36341 };
36342
36343 static struct rs6000_opt_var const rs6000_opt_vars[] =
36344 {
36345   { "friz",
36346     offsetof (struct gcc_options, x_TARGET_FRIZ),
36347     offsetof (struct cl_target_option, x_TARGET_FRIZ), },
36348   { "avoid-indexed-addresses",
36349     offsetof (struct gcc_options, x_TARGET_AVOID_XFORM),
36350     offsetof (struct cl_target_option, x_TARGET_AVOID_XFORM) },
36351   { "longcall",
36352     offsetof (struct gcc_options, x_rs6000_default_long_calls),
36353     offsetof (struct cl_target_option, x_rs6000_default_long_calls), },
36354   { "optimize-swaps",
36355     offsetof (struct gcc_options, x_rs6000_optimize_swaps),
36356     offsetof (struct cl_target_option, x_rs6000_optimize_swaps), },
36357   { "allow-movmisalign",
36358     offsetof (struct gcc_options, x_TARGET_ALLOW_MOVMISALIGN),
36359     offsetof (struct cl_target_option, x_TARGET_ALLOW_MOVMISALIGN), },
36360   { "sched-groups",
36361     offsetof (struct gcc_options, x_TARGET_SCHED_GROUPS),
36362     offsetof (struct cl_target_option, x_TARGET_SCHED_GROUPS), },
36363   { "always-hint",
36364     offsetof (struct gcc_options, x_TARGET_ALWAYS_HINT),
36365     offsetof (struct cl_target_option, x_TARGET_ALWAYS_HINT), },
36366   { "align-branch-targets",
36367     offsetof (struct gcc_options, x_TARGET_ALIGN_BRANCH_TARGETS),
36368     offsetof (struct cl_target_option, x_TARGET_ALIGN_BRANCH_TARGETS), },
36369   { "tls-markers",
36370     offsetof (struct gcc_options, x_tls_markers),
36371     offsetof (struct cl_target_option, x_tls_markers), },
36372   { "sched-prolog",
36373     offsetof (struct gcc_options, x_TARGET_SCHED_PROLOG),
36374     offsetof (struct cl_target_option, x_TARGET_SCHED_PROLOG), },
36375   { "sched-epilog",
36376     offsetof (struct gcc_options, x_TARGET_SCHED_PROLOG),
36377     offsetof (struct cl_target_option, x_TARGET_SCHED_PROLOG), },
36378   { "speculate-indirect-jumps",
36379     offsetof (struct gcc_options, x_rs6000_speculate_indirect_jumps),
36380     offsetof (struct cl_target_option, x_rs6000_speculate_indirect_jumps), },
36381 };
36382
36383 /* Inner function to handle attribute((target("..."))) and #pragma GCC target
36384    parsing.  Return true if there were no errors.  */
36385
36386 static bool
36387 rs6000_inner_target_options (tree args, bool attr_p)
36388 {
36389   bool ret = true;
36390
36391   if (args == NULL_TREE)
36392     ;
36393
36394   else if (TREE_CODE (args) == STRING_CST)
36395     {
36396       char *p = ASTRDUP (TREE_STRING_POINTER (args));
36397       char *q;
36398
36399       while ((q = strtok (p, ",")) != NULL)
36400         {
36401           bool error_p = false;
36402           bool not_valid_p = false;
36403           const char *cpu_opt = NULL;
36404
36405           p = NULL;
36406           if (strncmp (q, "cpu=", 4) == 0)
36407             {
36408               int cpu_index = rs6000_cpu_name_lookup (q+4);
36409               if (cpu_index >= 0)
36410                 rs6000_cpu_index = cpu_index;
36411               else
36412                 {
36413                   error_p = true;
36414                   cpu_opt = q+4;
36415                 }
36416             }
36417           else if (strncmp (q, "tune=", 5) == 0)
36418             {
36419               int tune_index = rs6000_cpu_name_lookup (q+5);
36420               if (tune_index >= 0)
36421                 rs6000_tune_index = tune_index;
36422               else
36423                 {
36424                   error_p = true;
36425                   cpu_opt = q+5;
36426                 }
36427             }
36428           else
36429             {
36430               size_t i;
36431               bool invert = false;
36432               char *r = q;
36433
36434               error_p = true;
36435               if (strncmp (r, "no-", 3) == 0)
36436                 {
36437                   invert = true;
36438                   r += 3;
36439                 }
36440
36441               for (i = 0; i < ARRAY_SIZE (rs6000_opt_masks); i++)
36442                 if (strcmp (r, rs6000_opt_masks[i].name) == 0)
36443                   {
36444                     HOST_WIDE_INT mask = rs6000_opt_masks[i].mask;
36445
36446                     if (!rs6000_opt_masks[i].valid_target)
36447                       not_valid_p = true;
36448                     else
36449                       {
36450                         error_p = false;
36451                         rs6000_isa_flags_explicit |= mask;
36452
36453                         /* VSX needs altivec, so -mvsx automagically sets
36454                            altivec and disables -mavoid-indexed-addresses.  */
36455                         if (!invert)
36456                           {
36457                             if (mask == OPTION_MASK_VSX)
36458                               {
36459                                 mask |= OPTION_MASK_ALTIVEC;
36460                                 TARGET_AVOID_XFORM = 0;
36461                               }
36462                           }
36463
36464                         if (rs6000_opt_masks[i].invert)
36465                           invert = !invert;
36466
36467                         if (invert)
36468                           rs6000_isa_flags &= ~mask;
36469                         else
36470                           rs6000_isa_flags |= mask;
36471                       }
36472                     break;
36473                   }
36474
36475               if (error_p && !not_valid_p)
36476                 {
36477                   for (i = 0; i < ARRAY_SIZE (rs6000_opt_vars); i++)
36478                     if (strcmp (r, rs6000_opt_vars[i].name) == 0)
36479                       {
36480                         size_t j = rs6000_opt_vars[i].global_offset;
36481                         *((int *) ((char *)&global_options + j)) = !invert;
36482                         error_p = false;
36483                         not_valid_p = false;
36484                         break;
36485                       }
36486                 }
36487             }
36488
36489           if (error_p)
36490             {
36491               const char *eprefix, *esuffix;
36492
36493               ret = false;
36494               if (attr_p)
36495                 {
36496                   eprefix = "__attribute__((__target__(";
36497                   esuffix = ")))";
36498                 }
36499               else
36500                 {
36501                   eprefix = "#pragma GCC target ";
36502                   esuffix = "";
36503                 }
36504
36505               if (cpu_opt)
36506                 error ("invalid cpu %qs for %s%qs%s", cpu_opt, eprefix,
36507                        q, esuffix);
36508               else if (not_valid_p)
36509                 error ("%s%qs%s is not allowed", eprefix, q, esuffix);
36510               else
36511                 error ("%s%qs%s is invalid", eprefix, q, esuffix);
36512             }
36513         }
36514     }
36515
36516   else if (TREE_CODE (args) == TREE_LIST)
36517     {
36518       do
36519         {
36520           tree value = TREE_VALUE (args);
36521           if (value)
36522             {
36523               bool ret2 = rs6000_inner_target_options (value, attr_p);
36524               if (!ret2)
36525                 ret = false;
36526             }
36527           args = TREE_CHAIN (args);
36528         }
36529       while (args != NULL_TREE);
36530     }
36531
36532   else
36533     {
36534       error ("attribute %<target%> argument not a string");
36535       return false;
36536     }
36537
36538   return ret;
36539 }
36540
36541 /* Print out the target options as a list for -mdebug=target.  */
36542
36543 static void
36544 rs6000_debug_target_options (tree args, const char *prefix)
36545 {
36546   if (args == NULL_TREE)
36547     fprintf (stderr, "%s<NULL>", prefix);
36548
36549   else if (TREE_CODE (args) == STRING_CST)
36550     {
36551       char *p = ASTRDUP (TREE_STRING_POINTER (args));
36552       char *q;
36553
36554       while ((q = strtok (p, ",")) != NULL)
36555         {
36556           p = NULL;
36557           fprintf (stderr, "%s\"%s\"", prefix, q);
36558           prefix = ", ";
36559         }
36560     }
36561
36562   else if (TREE_CODE (args) == TREE_LIST)
36563     {
36564       do
36565         {
36566           tree value = TREE_VALUE (args);
36567           if (value)
36568             {
36569               rs6000_debug_target_options (value, prefix);
36570               prefix = ", ";
36571             }
36572           args = TREE_CHAIN (args);
36573         }
36574       while (args != NULL_TREE);
36575     }
36576
36577   else
36578     gcc_unreachable ();
36579
36580   return;
36581 }
36582
36583 \f
36584 /* Hook to validate attribute((target("..."))).  */
36585
36586 static bool
36587 rs6000_valid_attribute_p (tree fndecl,
36588                           tree ARG_UNUSED (name),
36589                           tree args,
36590                           int flags)
36591 {
36592   struct cl_target_option cur_target;
36593   bool ret;
36594   tree old_optimize;
36595   tree new_target, new_optimize;
36596   tree func_optimize;
36597
36598   gcc_assert ((fndecl != NULL_TREE) && (args != NULL_TREE));
36599
36600   if (TARGET_DEBUG_TARGET)
36601     {
36602       tree tname = DECL_NAME (fndecl);
36603       fprintf (stderr, "\n==================== rs6000_valid_attribute_p:\n");
36604       if (tname)
36605         fprintf (stderr, "function: %.*s\n",
36606                  (int) IDENTIFIER_LENGTH (tname),
36607                  IDENTIFIER_POINTER (tname));
36608       else
36609         fprintf (stderr, "function: unknown\n");
36610   
36611       fprintf (stderr, "args:");
36612       rs6000_debug_target_options (args, " ");
36613       fprintf (stderr, "\n");
36614
36615       if (flags)
36616         fprintf (stderr, "flags: 0x%x\n", flags);
36617
36618       fprintf (stderr, "--------------------\n");
36619     }
36620
36621   /* attribute((target("default"))) does nothing, beyond
36622      affecting multi-versioning.  */
36623   if (TREE_VALUE (args)
36624       && TREE_CODE (TREE_VALUE (args)) == STRING_CST
36625       && TREE_CHAIN (args) == NULL_TREE
36626       && strcmp (TREE_STRING_POINTER (TREE_VALUE (args)), "default") == 0)
36627     return true;
36628
36629   old_optimize = build_optimization_node (&global_options);
36630   func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
36631
36632   /* If the function changed the optimization levels as well as setting target
36633      options, start with the optimizations specified.  */
36634   if (func_optimize && func_optimize != old_optimize)
36635     cl_optimization_restore (&global_options,
36636                              TREE_OPTIMIZATION (func_optimize));
36637
36638   /* The target attributes may also change some optimization flags, so update
36639      the optimization options if necessary.  */
36640   cl_target_option_save (&cur_target, &global_options);
36641   rs6000_cpu_index = rs6000_tune_index = -1;
36642   ret = rs6000_inner_target_options (args, true);
36643
36644   /* Set up any additional state.  */
36645   if (ret)
36646     {
36647       ret = rs6000_option_override_internal (false);
36648       new_target = build_target_option_node (&global_options);
36649     }
36650   else
36651     new_target = NULL;
36652
36653   new_optimize = build_optimization_node (&global_options);
36654
36655   if (!new_target)
36656     ret = false;
36657
36658   else if (fndecl)
36659     {
36660       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
36661
36662       if (old_optimize != new_optimize)
36663         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
36664     }
36665
36666   cl_target_option_restore (&global_options, &cur_target);
36667
36668   if (old_optimize != new_optimize)
36669     cl_optimization_restore (&global_options,
36670                              TREE_OPTIMIZATION (old_optimize));
36671
36672   return ret;
36673 }
36674
36675 \f
36676 /* Hook to validate the current #pragma GCC target and set the state, and
36677    update the macros based on what was changed.  If ARGS is NULL, then
36678    POP_TARGET is used to reset the options.  */
36679
36680 bool
36681 rs6000_pragma_target_parse (tree args, tree pop_target)
36682 {
36683   tree prev_tree = build_target_option_node (&global_options);
36684   tree cur_tree;
36685   struct cl_target_option *prev_opt, *cur_opt;
36686   HOST_WIDE_INT prev_flags, cur_flags, diff_flags;
36687   HOST_WIDE_INT prev_bumask, cur_bumask, diff_bumask;
36688
36689   if (TARGET_DEBUG_TARGET)
36690     {
36691       fprintf (stderr, "\n==================== rs6000_pragma_target_parse\n");
36692       fprintf (stderr, "args:");
36693       rs6000_debug_target_options (args, " ");
36694       fprintf (stderr, "\n");
36695
36696       if (pop_target)
36697         {
36698           fprintf (stderr, "pop_target:\n");
36699           debug_tree (pop_target);
36700         }
36701       else
36702         fprintf (stderr, "pop_target: <NULL>\n");
36703
36704       fprintf (stderr, "--------------------\n");
36705     }
36706
36707   if (! args)
36708     {
36709       cur_tree = ((pop_target)
36710                   ? pop_target
36711                   : target_option_default_node);
36712       cl_target_option_restore (&global_options,
36713                                 TREE_TARGET_OPTION (cur_tree));
36714     }
36715   else
36716     {
36717       rs6000_cpu_index = rs6000_tune_index = -1;
36718       if (!rs6000_inner_target_options (args, false)
36719           || !rs6000_option_override_internal (false)
36720           || (cur_tree = build_target_option_node (&global_options))
36721              == NULL_TREE)
36722         {
36723           if (TARGET_DEBUG_BUILTIN || TARGET_DEBUG_TARGET)
36724             fprintf (stderr, "invalid pragma\n");
36725
36726           return false;
36727         }
36728     }
36729
36730   target_option_current_node = cur_tree;
36731   rs6000_activate_target_options (target_option_current_node);
36732
36733   /* If we have the preprocessor linked in (i.e. C or C++ languages), possibly
36734      change the macros that are defined.  */
36735   if (rs6000_target_modify_macros_ptr)
36736     {
36737       prev_opt    = TREE_TARGET_OPTION (prev_tree);
36738       prev_bumask = prev_opt->x_rs6000_builtin_mask;
36739       prev_flags  = prev_opt->x_rs6000_isa_flags;
36740
36741       cur_opt     = TREE_TARGET_OPTION (cur_tree);
36742       cur_flags   = cur_opt->x_rs6000_isa_flags;
36743       cur_bumask  = cur_opt->x_rs6000_builtin_mask;
36744
36745       diff_bumask = (prev_bumask ^ cur_bumask);
36746       diff_flags  = (prev_flags ^ cur_flags);
36747
36748       if ((diff_flags != 0) || (diff_bumask != 0))
36749         {
36750           /* Delete old macros.  */
36751           rs6000_target_modify_macros_ptr (false,
36752                                            prev_flags & diff_flags,
36753                                            prev_bumask & diff_bumask);
36754
36755           /* Define new macros.  */
36756           rs6000_target_modify_macros_ptr (true,
36757                                            cur_flags & diff_flags,
36758                                            cur_bumask & diff_bumask);
36759         }
36760     }
36761
36762   return true;
36763 }
36764
36765 \f
36766 /* Remember the last target of rs6000_set_current_function.  */
36767 static GTY(()) tree rs6000_previous_fndecl;
36768
36769 /* Restore target's globals from NEW_TREE and invalidate the
36770    rs6000_previous_fndecl cache.  */
36771
36772 void
36773 rs6000_activate_target_options (tree new_tree)
36774 {
36775   cl_target_option_restore (&global_options, TREE_TARGET_OPTION (new_tree));
36776   if (TREE_TARGET_GLOBALS (new_tree))
36777     restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
36778   else if (new_tree == target_option_default_node)
36779     restore_target_globals (&default_target_globals);
36780   else
36781     TREE_TARGET_GLOBALS (new_tree) = save_target_globals_default_opts ();
36782   rs6000_previous_fndecl = NULL_TREE;
36783 }
36784
36785 /* Establish appropriate back-end context for processing the function
36786    FNDECL.  The argument might be NULL to indicate processing at top
36787    level, outside of any function scope.  */
36788 static void
36789 rs6000_set_current_function (tree fndecl)
36790 {
36791   if (TARGET_DEBUG_TARGET)
36792     {
36793       fprintf (stderr, "\n==================== rs6000_set_current_function");
36794
36795       if (fndecl)
36796         fprintf (stderr, ", fndecl %s (%p)",
36797                  (DECL_NAME (fndecl)
36798                   ? IDENTIFIER_POINTER (DECL_NAME (fndecl))
36799                   : "<unknown>"), (void *)fndecl);
36800
36801       if (rs6000_previous_fndecl)
36802         fprintf (stderr, ", prev_fndecl (%p)", (void *)rs6000_previous_fndecl);
36803
36804       fprintf (stderr, "\n");
36805     }
36806
36807   /* Only change the context if the function changes.  This hook is called
36808      several times in the course of compiling a function, and we don't want to
36809      slow things down too much or call target_reinit when it isn't safe.  */
36810   if (fndecl == rs6000_previous_fndecl)
36811     return;
36812
36813   tree old_tree;
36814   if (rs6000_previous_fndecl == NULL_TREE)
36815     old_tree = target_option_current_node;
36816   else if (DECL_FUNCTION_SPECIFIC_TARGET (rs6000_previous_fndecl))
36817     old_tree = DECL_FUNCTION_SPECIFIC_TARGET (rs6000_previous_fndecl);
36818   else
36819     old_tree = target_option_default_node;
36820
36821   tree new_tree;
36822   if (fndecl == NULL_TREE)
36823     {
36824       if (old_tree != target_option_current_node)
36825         new_tree = target_option_current_node;
36826       else
36827         new_tree = NULL_TREE;
36828     }
36829   else
36830     {
36831       new_tree = DECL_FUNCTION_SPECIFIC_TARGET (fndecl);
36832       if (new_tree == NULL_TREE)
36833         new_tree = target_option_default_node;
36834     }
36835
36836   if (TARGET_DEBUG_TARGET)
36837     {
36838       if (new_tree)
36839         {
36840           fprintf (stderr, "\nnew fndecl target specific options:\n");
36841           debug_tree (new_tree);
36842         }
36843
36844       if (old_tree)
36845         {
36846           fprintf (stderr, "\nold fndecl target specific options:\n");
36847           debug_tree (old_tree);
36848         }
36849
36850       if (old_tree != NULL_TREE || new_tree != NULL_TREE)
36851         fprintf (stderr, "--------------------\n");
36852     }
36853
36854   if (new_tree && old_tree != new_tree)
36855     rs6000_activate_target_options (new_tree);
36856
36857   if (fndecl)
36858     rs6000_previous_fndecl = fndecl;
36859 }
36860
36861 \f
36862 /* Save the current options */
36863
36864 static void
36865 rs6000_function_specific_save (struct cl_target_option *ptr,
36866                                struct gcc_options *opts)
36867 {
36868   ptr->x_rs6000_isa_flags = opts->x_rs6000_isa_flags;
36869   ptr->x_rs6000_isa_flags_explicit = opts->x_rs6000_isa_flags_explicit;
36870 }
36871
36872 /* Restore the current options */
36873
36874 static void
36875 rs6000_function_specific_restore (struct gcc_options *opts,
36876                                   struct cl_target_option *ptr)
36877                                   
36878 {
36879   opts->x_rs6000_isa_flags = ptr->x_rs6000_isa_flags;
36880   opts->x_rs6000_isa_flags_explicit = ptr->x_rs6000_isa_flags_explicit;
36881   (void) rs6000_option_override_internal (false);
36882 }
36883
36884 /* Print the current options */
36885
36886 static void
36887 rs6000_function_specific_print (FILE *file, int indent,
36888                                 struct cl_target_option *ptr)
36889 {
36890   rs6000_print_isa_options (file, indent, "Isa options set",
36891                             ptr->x_rs6000_isa_flags);
36892
36893   rs6000_print_isa_options (file, indent, "Isa options explicit",
36894                             ptr->x_rs6000_isa_flags_explicit);
36895 }
36896
36897 /* Helper function to print the current isa or misc options on a line.  */
36898
36899 static void
36900 rs6000_print_options_internal (FILE *file,
36901                                int indent,
36902                                const char *string,
36903                                HOST_WIDE_INT flags,
36904                                const char *prefix,
36905                                const struct rs6000_opt_mask *opts,
36906                                size_t num_elements)
36907 {
36908   size_t i;
36909   size_t start_column = 0;
36910   size_t cur_column;
36911   size_t max_column = 120;
36912   size_t prefix_len = strlen (prefix);
36913   size_t comma_len = 0;
36914   const char *comma = "";
36915
36916   if (indent)
36917     start_column += fprintf (file, "%*s", indent, "");
36918
36919   if (!flags)
36920     {
36921       fprintf (stderr, DEBUG_FMT_S, string, "<none>");
36922       return;
36923     }
36924
36925   start_column += fprintf (stderr, DEBUG_FMT_WX, string, flags);
36926
36927   /* Print the various mask options.  */
36928   cur_column = start_column;
36929   for (i = 0; i < num_elements; i++)
36930     {
36931       bool invert = opts[i].invert;
36932       const char *name = opts[i].name;
36933       const char *no_str = "";
36934       HOST_WIDE_INT mask = opts[i].mask;
36935       size_t len = comma_len + prefix_len + strlen (name);
36936
36937       if (!invert)
36938         {
36939           if ((flags & mask) == 0)
36940             {
36941               no_str = "no-";
36942               len += sizeof ("no-") - 1;
36943             }
36944
36945           flags &= ~mask;
36946         }
36947
36948       else
36949         {
36950           if ((flags & mask) != 0)
36951             {
36952               no_str = "no-";
36953               len += sizeof ("no-") - 1;
36954             }
36955
36956           flags |= mask;
36957         }
36958
36959       cur_column += len;
36960       if (cur_column > max_column)
36961         {
36962           fprintf (stderr, ", \\\n%*s", (int)start_column, "");
36963           cur_column = start_column + len;
36964           comma = "";
36965         }
36966
36967       fprintf (file, "%s%s%s%s", comma, prefix, no_str, name);
36968       comma = ", ";
36969       comma_len = sizeof (", ") - 1;
36970     }
36971
36972   fputs ("\n", file);
36973 }
36974
36975 /* Helper function to print the current isa options on a line.  */
36976
36977 static void
36978 rs6000_print_isa_options (FILE *file, int indent, const char *string,
36979                           HOST_WIDE_INT flags)
36980 {
36981   rs6000_print_options_internal (file, indent, string, flags, "-m",
36982                                  &rs6000_opt_masks[0],
36983                                  ARRAY_SIZE (rs6000_opt_masks));
36984 }
36985
36986 static void
36987 rs6000_print_builtin_options (FILE *file, int indent, const char *string,
36988                               HOST_WIDE_INT flags)
36989 {
36990   rs6000_print_options_internal (file, indent, string, flags, "",
36991                                  &rs6000_builtin_mask_names[0],
36992                                  ARRAY_SIZE (rs6000_builtin_mask_names));
36993 }
36994
36995 /* If the user used -mno-vsx, we need turn off all of the implicit ISA 2.06,
36996    2.07, and 3.0 options that relate to the vector unit (-mdirect-move,
36997    -mupper-regs-df, etc.).
36998
36999    If the user used -mno-power8-vector, we need to turn off all of the implicit
37000    ISA 2.07 and 3.0 options that relate to the vector unit.
37001
37002    If the user used -mno-power9-vector, we need to turn off all of the implicit
37003    ISA 3.0 options that relate to the vector unit.
37004
37005    This function does not handle explicit options such as the user specifying
37006    -mdirect-move.  These are handled in rs6000_option_override_internal, and
37007    the appropriate error is given if needed.
37008
37009    We return a mask of all of the implicit options that should not be enabled
37010    by default.  */
37011
37012 static HOST_WIDE_INT
37013 rs6000_disable_incompatible_switches (void)
37014 {
37015   HOST_WIDE_INT ignore_masks = rs6000_isa_flags_explicit;
37016   size_t i, j;
37017
37018   static const struct {
37019     const HOST_WIDE_INT no_flag;        /* flag explicitly turned off.  */
37020     const HOST_WIDE_INT dep_flags;      /* flags that depend on this option.  */
37021     const char *const name;             /* name of the switch.  */
37022   } flags[] = {
37023     { OPTION_MASK_P9_VECTOR,    OTHER_P9_VECTOR_MASKS,  "power9-vector" },
37024     { OPTION_MASK_P8_VECTOR,    OTHER_P8_VECTOR_MASKS,  "power8-vector" },
37025     { OPTION_MASK_VSX,          OTHER_VSX_VECTOR_MASKS, "vsx"           },
37026   };
37027
37028   for (i = 0; i < ARRAY_SIZE (flags); i++)
37029     {
37030       HOST_WIDE_INT no_flag = flags[i].no_flag;
37031
37032       if ((rs6000_isa_flags & no_flag) == 0
37033           && (rs6000_isa_flags_explicit & no_flag) != 0)
37034         {
37035           HOST_WIDE_INT dep_flags = flags[i].dep_flags;
37036           HOST_WIDE_INT set_flags = (rs6000_isa_flags_explicit
37037                                      & rs6000_isa_flags
37038                                      & dep_flags);
37039
37040           if (set_flags)
37041             {
37042               for (j = 0; j < ARRAY_SIZE (rs6000_opt_masks); j++)
37043                 if ((set_flags & rs6000_opt_masks[j].mask) != 0)
37044                   {
37045                     set_flags &= ~rs6000_opt_masks[j].mask;
37046                     error ("%<-mno-%s%> turns off %<-m%s%>",
37047                            flags[i].name,
37048                            rs6000_opt_masks[j].name);
37049                   }
37050
37051               gcc_assert (!set_flags);
37052             }
37053
37054           rs6000_isa_flags &= ~dep_flags;
37055           ignore_masks |= no_flag | dep_flags;
37056         }
37057     }
37058
37059   return ignore_masks;
37060 }
37061
37062 \f
37063 /* Helper function for printing the function name when debugging.  */
37064
37065 static const char *
37066 get_decl_name (tree fn)
37067 {
37068   tree name;
37069
37070   if (!fn)
37071     return "<null>";
37072
37073   name = DECL_NAME (fn);
37074   if (!name)
37075     return "<no-name>";
37076
37077   return IDENTIFIER_POINTER (name);
37078 }
37079
37080 /* Return the clone id of the target we are compiling code for in a target
37081    clone.  The clone id is ordered from 0 (default) to CLONE_MAX-1 and gives
37082    the priority list for the target clones (ordered from lowest to
37083    highest).  */
37084
37085 static int
37086 rs6000_clone_priority (tree fndecl)
37087 {
37088   tree fn_opts = DECL_FUNCTION_SPECIFIC_TARGET (fndecl);
37089   HOST_WIDE_INT isa_masks;
37090   int ret = CLONE_DEFAULT;
37091   tree attrs = lookup_attribute ("target", DECL_ATTRIBUTES (fndecl));
37092   const char *attrs_str = NULL;
37093
37094   attrs = TREE_VALUE (TREE_VALUE (attrs));
37095   attrs_str = TREE_STRING_POINTER (attrs);
37096
37097   /* Return priority zero for default function.  Return the ISA needed for the
37098      function if it is not the default.  */
37099   if (strcmp (attrs_str, "default") != 0)
37100     {
37101       if (fn_opts == NULL_TREE)
37102         fn_opts = target_option_default_node;
37103
37104       if (!fn_opts || !TREE_TARGET_OPTION (fn_opts))
37105         isa_masks = rs6000_isa_flags;
37106       else
37107         isa_masks = TREE_TARGET_OPTION (fn_opts)->x_rs6000_isa_flags;
37108
37109       for (ret = CLONE_MAX - 1; ret != 0; ret--)
37110         if ((rs6000_clone_map[ret].isa_mask & isa_masks) != 0)
37111           break;
37112     }
37113
37114   if (TARGET_DEBUG_TARGET)
37115     fprintf (stderr, "rs6000_get_function_version_priority (%s) => %d\n",
37116              get_decl_name (fndecl), ret);
37117
37118   return ret;
37119 }
37120
37121 /* This compares the priority of target features in function DECL1 and DECL2.
37122    It returns positive value if DECL1 is higher priority, negative value if
37123    DECL2 is higher priority and 0 if they are the same.  Note, priorities are
37124    ordered from lowest (CLONE_DEFAULT) to highest (currently CLONE_ISA_3_0).  */
37125
37126 static int
37127 rs6000_compare_version_priority (tree decl1, tree decl2)
37128 {
37129   int priority1 = rs6000_clone_priority (decl1);
37130   int priority2 = rs6000_clone_priority (decl2);
37131   int ret = priority1 - priority2;
37132
37133   if (TARGET_DEBUG_TARGET)
37134     fprintf (stderr, "rs6000_compare_version_priority (%s, %s) => %d\n",
37135              get_decl_name (decl1), get_decl_name (decl2), ret);
37136
37137   return ret;
37138 }
37139
37140 /* Make a dispatcher declaration for the multi-versioned function DECL.
37141    Calls to DECL function will be replaced with calls to the dispatcher
37142    by the front-end.  Returns the decl of the dispatcher function.  */
37143
37144 static tree
37145 rs6000_get_function_versions_dispatcher (void *decl)
37146 {
37147   tree fn = (tree) decl;
37148   struct cgraph_node *node = NULL;
37149   struct cgraph_node *default_node = NULL;
37150   struct cgraph_function_version_info *node_v = NULL;
37151   struct cgraph_function_version_info *first_v = NULL;
37152
37153   tree dispatch_decl = NULL;
37154
37155   struct cgraph_function_version_info *default_version_info = NULL;
37156   gcc_assert (fn != NULL && DECL_FUNCTION_VERSIONED (fn));
37157
37158   if (TARGET_DEBUG_TARGET)
37159     fprintf (stderr, "rs6000_get_function_versions_dispatcher (%s)\n",
37160              get_decl_name (fn));
37161
37162   node = cgraph_node::get (fn);
37163   gcc_assert (node != NULL);
37164
37165   node_v = node->function_version ();
37166   gcc_assert (node_v != NULL);
37167
37168   if (node_v->dispatcher_resolver != NULL)
37169     return node_v->dispatcher_resolver;
37170
37171   /* Find the default version and make it the first node.  */
37172   first_v = node_v;
37173   /* Go to the beginning of the chain.  */
37174   while (first_v->prev != NULL)
37175     first_v = first_v->prev;
37176
37177   default_version_info = first_v;
37178   while (default_version_info != NULL)
37179     {
37180       const tree decl2 = default_version_info->this_node->decl;
37181       if (is_function_default_version (decl2))
37182         break;
37183       default_version_info = default_version_info->next;
37184     }
37185
37186   /* If there is no default node, just return NULL.  */
37187   if (default_version_info == NULL)
37188     return NULL;
37189
37190   /* Make default info the first node.  */
37191   if (first_v != default_version_info)
37192     {
37193       default_version_info->prev->next = default_version_info->next;
37194       if (default_version_info->next)
37195         default_version_info->next->prev = default_version_info->prev;
37196       first_v->prev = default_version_info;
37197       default_version_info->next = first_v;
37198       default_version_info->prev = NULL;
37199     }
37200
37201   default_node = default_version_info->this_node;
37202
37203 #ifndef TARGET_LIBC_PROVIDES_HWCAP_IN_TCB
37204   error_at (DECL_SOURCE_LOCATION (default_node->decl),
37205             "%<target_clones%> attribute needs GLIBC (2.23 and newer) that "
37206             "exports hardware capability bits");
37207 #else
37208
37209   if (targetm.has_ifunc_p ())
37210     {
37211       struct cgraph_function_version_info *it_v = NULL;
37212       struct cgraph_node *dispatcher_node = NULL;
37213       struct cgraph_function_version_info *dispatcher_version_info = NULL;
37214
37215       /* Right now, the dispatching is done via ifunc.  */
37216       dispatch_decl = make_dispatcher_decl (default_node->decl);
37217
37218       dispatcher_node = cgraph_node::get_create (dispatch_decl);
37219       gcc_assert (dispatcher_node != NULL);
37220       dispatcher_node->dispatcher_function = 1;
37221       dispatcher_version_info
37222         = dispatcher_node->insert_new_function_version ();
37223       dispatcher_version_info->next = default_version_info;
37224       dispatcher_node->definition = 1;
37225
37226       /* Set the dispatcher for all the versions.  */
37227       it_v = default_version_info;
37228       while (it_v != NULL)
37229         {
37230           it_v->dispatcher_resolver = dispatch_decl;
37231           it_v = it_v->next;
37232         }
37233     }
37234   else
37235     {
37236       error_at (DECL_SOURCE_LOCATION (default_node->decl),
37237                 "multiversioning needs ifunc which is not supported "
37238                 "on this target");
37239     }
37240 #endif
37241
37242   return dispatch_decl;
37243 }
37244
37245 /* Make the resolver function decl to dispatch the versions of a multi-
37246    versioned function, DEFAULT_DECL.  Create an empty basic block in the
37247    resolver and store the pointer in EMPTY_BB.  Return the decl of the resolver
37248    function.  */
37249
37250 static tree
37251 make_resolver_func (const tree default_decl,
37252                     const tree dispatch_decl,
37253                     basic_block *empty_bb)
37254 {
37255   /* Make the resolver function static.  The resolver function returns
37256      void *.  */
37257   tree decl_name = clone_function_name (default_decl, "resolver");
37258   const char *resolver_name = IDENTIFIER_POINTER (decl_name);
37259   tree type = build_function_type_list (ptr_type_node, NULL_TREE);
37260   tree decl = build_fn_decl (resolver_name, type);
37261   SET_DECL_ASSEMBLER_NAME (decl, decl_name);
37262
37263   DECL_NAME (decl) = decl_name;
37264   TREE_USED (decl) = 1;
37265   DECL_ARTIFICIAL (decl) = 1;
37266   DECL_IGNORED_P (decl) = 0;
37267   TREE_PUBLIC (decl) = 0;
37268   DECL_UNINLINABLE (decl) = 1;
37269
37270   /* Resolver is not external, body is generated.  */
37271   DECL_EXTERNAL (decl) = 0;
37272   DECL_EXTERNAL (dispatch_decl) = 0;
37273
37274   DECL_CONTEXT (decl) = NULL_TREE;
37275   DECL_INITIAL (decl) = make_node (BLOCK);
37276   DECL_STATIC_CONSTRUCTOR (decl) = 0;
37277
37278   /* Build result decl and add to function_decl.  */
37279   tree t = build_decl (UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE, ptr_type_node);
37280   DECL_CONTEXT (t) = decl;
37281   DECL_ARTIFICIAL (t) = 1;
37282   DECL_IGNORED_P (t) = 1;
37283   DECL_RESULT (decl) = t;
37284
37285   gimplify_function_tree (decl);
37286   push_cfun (DECL_STRUCT_FUNCTION (decl));
37287   *empty_bb = init_lowered_empty_function (decl, false,
37288                                            profile_count::uninitialized ());
37289
37290   cgraph_node::add_new_function (decl, true);
37291   symtab->call_cgraph_insertion_hooks (cgraph_node::get_create (decl));
37292
37293   pop_cfun ();
37294
37295   /* Mark dispatch_decl as "ifunc" with resolver as resolver_name.  */
37296   DECL_ATTRIBUTES (dispatch_decl)
37297     = make_attribute ("ifunc", resolver_name, DECL_ATTRIBUTES (dispatch_decl));
37298
37299   cgraph_node::create_same_body_alias (dispatch_decl, decl);
37300
37301   return decl;
37302 }
37303
37304 /* This adds a condition to the basic_block NEW_BB in function FUNCTION_DECL to
37305    return a pointer to VERSION_DECL if we are running on a machine that
37306    supports the index CLONE_ISA hardware architecture bits.  This function will
37307    be called during version dispatch to decide which function version to
37308    execute.  It returns the basic block at the end, to which more conditions
37309    can be added.  */
37310
37311 static basic_block
37312 add_condition_to_bb (tree function_decl, tree version_decl,
37313                      int clone_isa, basic_block new_bb)
37314 {
37315   push_cfun (DECL_STRUCT_FUNCTION (function_decl));
37316
37317   gcc_assert (new_bb != NULL);
37318   gimple_seq gseq = bb_seq (new_bb);
37319
37320
37321   tree convert_expr = build1 (CONVERT_EXPR, ptr_type_node,
37322                               build_fold_addr_expr (version_decl));
37323   tree result_var = create_tmp_var (ptr_type_node);
37324   gimple *convert_stmt = gimple_build_assign (result_var, convert_expr);
37325   gimple *return_stmt = gimple_build_return (result_var);
37326
37327   if (clone_isa == CLONE_DEFAULT)
37328     {
37329       gimple_seq_add_stmt (&gseq, convert_stmt);
37330       gimple_seq_add_stmt (&gseq, return_stmt);
37331       set_bb_seq (new_bb, gseq);
37332       gimple_set_bb (convert_stmt, new_bb);
37333       gimple_set_bb (return_stmt, new_bb);
37334       pop_cfun ();
37335       return new_bb;
37336     }
37337
37338   tree bool_zero = build_int_cst (bool_int_type_node, 0);
37339   tree cond_var = create_tmp_var (bool_int_type_node);
37340   tree predicate_decl = rs6000_builtin_decls [(int) RS6000_BUILTIN_CPU_SUPPORTS];
37341   const char *arg_str = rs6000_clone_map[clone_isa].name;
37342   tree predicate_arg = build_string_literal (strlen (arg_str) + 1, arg_str);
37343   gimple *call_cond_stmt = gimple_build_call (predicate_decl, 1, predicate_arg);
37344   gimple_call_set_lhs (call_cond_stmt, cond_var);
37345
37346   gimple_set_block (call_cond_stmt, DECL_INITIAL (function_decl));
37347   gimple_set_bb (call_cond_stmt, new_bb);
37348   gimple_seq_add_stmt (&gseq, call_cond_stmt);
37349
37350   gimple *if_else_stmt = gimple_build_cond (NE_EXPR, cond_var, bool_zero,
37351                                             NULL_TREE, NULL_TREE);
37352   gimple_set_block (if_else_stmt, DECL_INITIAL (function_decl));
37353   gimple_set_bb (if_else_stmt, new_bb);
37354   gimple_seq_add_stmt (&gseq, if_else_stmt);
37355
37356   gimple_seq_add_stmt (&gseq, convert_stmt);
37357   gimple_seq_add_stmt (&gseq, return_stmt);
37358   set_bb_seq (new_bb, gseq);
37359
37360   basic_block bb1 = new_bb;
37361   edge e12 = split_block (bb1, if_else_stmt);
37362   basic_block bb2 = e12->dest;
37363   e12->flags &= ~EDGE_FALLTHRU;
37364   e12->flags |= EDGE_TRUE_VALUE;
37365
37366   edge e23 = split_block (bb2, return_stmt);
37367   gimple_set_bb (convert_stmt, bb2);
37368   gimple_set_bb (return_stmt, bb2);
37369
37370   basic_block bb3 = e23->dest;
37371   make_edge (bb1, bb3, EDGE_FALSE_VALUE);
37372
37373   remove_edge (e23);
37374   make_edge (bb2, EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
37375
37376   pop_cfun ();
37377   return bb3;
37378 }
37379
37380 /* This function generates the dispatch function for multi-versioned functions.
37381    DISPATCH_DECL is the function which will contain the dispatch logic.
37382    FNDECLS are the function choices for dispatch, and is a tree chain.
37383    EMPTY_BB is the basic block pointer in DISPATCH_DECL in which the dispatch
37384    code is generated.  */
37385
37386 static int
37387 dispatch_function_versions (tree dispatch_decl,
37388                             void *fndecls_p,
37389                             basic_block *empty_bb)
37390 {
37391   int ix;
37392   tree ele;
37393   vec<tree> *fndecls;
37394   tree clones[CLONE_MAX];
37395
37396   if (TARGET_DEBUG_TARGET)
37397     fputs ("dispatch_function_versions, top\n", stderr);
37398
37399   gcc_assert (dispatch_decl != NULL
37400               && fndecls_p != NULL
37401               && empty_bb != NULL);
37402
37403   /* fndecls_p is actually a vector.  */
37404   fndecls = static_cast<vec<tree> *> (fndecls_p);
37405
37406   /* At least one more version other than the default.  */
37407   gcc_assert (fndecls->length () >= 2);
37408
37409   /* The first version in the vector is the default decl.  */
37410   memset ((void *) clones, '\0', sizeof (clones));
37411   clones[CLONE_DEFAULT] = (*fndecls)[0];
37412
37413   /* On the PowerPC, we do not need to call __builtin_cpu_init, which is a NOP
37414      on the PowerPC (on the x86_64, it is not a NOP).  The builtin function
37415      __builtin_cpu_support ensures that the TOC fields are setup by requiring a
37416      recent glibc.  If we ever need to call __builtin_cpu_init, we would need
37417      to insert the code here to do the call.  */
37418
37419   for (ix = 1; fndecls->iterate (ix, &ele); ++ix)
37420     {
37421       int priority = rs6000_clone_priority (ele);
37422       if (!clones[priority])
37423         clones[priority] = ele;
37424     }
37425
37426   for (ix = CLONE_MAX - 1; ix >= 0; ix--)
37427     if (clones[ix])
37428       {
37429         if (TARGET_DEBUG_TARGET)
37430           fprintf (stderr, "dispatch_function_versions, clone %d, %s\n",
37431                    ix, get_decl_name (clones[ix]));
37432
37433         *empty_bb = add_condition_to_bb (dispatch_decl, clones[ix], ix,
37434                                          *empty_bb);
37435       }
37436
37437   return 0;
37438 }
37439
37440 /* Generate the dispatching code body to dispatch multi-versioned function
37441    DECL.  The target hook is called to process the "target" attributes and
37442    provide the code to dispatch the right function at run-time.  NODE points
37443    to the dispatcher decl whose body will be created.  */
37444
37445 static tree
37446 rs6000_generate_version_dispatcher_body (void *node_p)
37447 {
37448   tree resolver;
37449   basic_block empty_bb;
37450   struct cgraph_node *node = (cgraph_node *) node_p;
37451   struct cgraph_function_version_info *ninfo = node->function_version ();
37452
37453   if (ninfo->dispatcher_resolver)
37454     return ninfo->dispatcher_resolver;
37455
37456   /* node is going to be an alias, so remove the finalized bit.  */
37457   node->definition = false;
37458
37459   /* The first version in the chain corresponds to the default version.  */
37460   ninfo->dispatcher_resolver = resolver
37461     = make_resolver_func (ninfo->next->this_node->decl, node->decl, &empty_bb);
37462
37463   if (TARGET_DEBUG_TARGET)
37464     fprintf (stderr, "rs6000_get_function_versions_dispatcher, %s\n",
37465              get_decl_name (resolver));
37466
37467   push_cfun (DECL_STRUCT_FUNCTION (resolver));
37468   auto_vec<tree, 2> fn_ver_vec;
37469
37470   for (struct cgraph_function_version_info *vinfo = ninfo->next;
37471        vinfo;
37472        vinfo = vinfo->next)
37473     {
37474       struct cgraph_node *version = vinfo->this_node;
37475       /* Check for virtual functions here again, as by this time it should
37476          have been determined if this function needs a vtable index or
37477          not.  This happens for methods in derived classes that override
37478          virtual methods in base classes but are not explicitly marked as
37479          virtual.  */
37480       if (DECL_VINDEX (version->decl))
37481         sorry ("Virtual function multiversioning not supported");
37482
37483       fn_ver_vec.safe_push (version->decl);
37484     }
37485
37486   dispatch_function_versions (resolver, &fn_ver_vec, &empty_bb);
37487   cgraph_edge::rebuild_edges ();
37488   pop_cfun ();
37489   return resolver;
37490 }
37491
37492 \f
37493 /* Hook to determine if one function can safely inline another.  */
37494
37495 static bool
37496 rs6000_can_inline_p (tree caller, tree callee)
37497 {
37498   bool ret = false;
37499   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
37500   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
37501
37502   /* If callee has no option attributes, then it is ok to inline.  */
37503   if (!callee_tree)
37504     ret = true;
37505
37506   /* If caller has no option attributes, but callee does then it is not ok to
37507      inline.  */
37508   else if (!caller_tree)
37509     ret = false;
37510
37511   else
37512     {
37513       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
37514       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
37515
37516       /* Callee's options should a subset of the caller's, i.e. a vsx function
37517          can inline an altivec function but a non-vsx function can't inline a
37518          vsx function.  */
37519       if ((caller_opts->x_rs6000_isa_flags & callee_opts->x_rs6000_isa_flags)
37520           == callee_opts->x_rs6000_isa_flags)
37521         ret = true;
37522     }
37523
37524   if (TARGET_DEBUG_TARGET)
37525     fprintf (stderr, "rs6000_can_inline_p:, caller %s, callee %s, %s inline\n",
37526              get_decl_name (caller), get_decl_name (callee),
37527              (ret ? "can" : "cannot"));
37528
37529   return ret;
37530 }
37531 \f
37532 /* Allocate a stack temp and fixup the address so it meets the particular
37533    memory requirements (either offetable or REG+REG addressing).  */
37534
37535 rtx
37536 rs6000_allocate_stack_temp (machine_mode mode,
37537                             bool offsettable_p,
37538                             bool reg_reg_p)
37539 {
37540   rtx stack = assign_stack_temp (mode, GET_MODE_SIZE (mode));
37541   rtx addr = XEXP (stack, 0);
37542   int strict_p = reload_completed;
37543
37544   if (!legitimate_indirect_address_p (addr, strict_p))
37545     {
37546       if (offsettable_p
37547           && !rs6000_legitimate_offset_address_p (mode, addr, strict_p, true))
37548         stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
37549
37550       else if (reg_reg_p && !legitimate_indexed_address_p (addr, strict_p))
37551         stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
37552     }
37553
37554   return stack;
37555 }
37556
37557 /* Given a memory reference, if it is not a reg or reg+reg addressing,
37558    convert to such a form to deal with memory reference instructions
37559    like STFIWX and LDBRX that only take reg+reg addressing.  */
37560
37561 rtx
37562 rs6000_force_indexed_or_indirect_mem (rtx x)
37563 {
37564   machine_mode mode = GET_MODE (x);
37565
37566   gcc_assert (MEM_P (x));
37567   if (can_create_pseudo_p () && !indexed_or_indirect_operand (x, mode))
37568     {
37569       rtx addr = XEXP (x, 0);
37570       if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
37571         {
37572           rtx reg = XEXP (addr, 0);
37573           HOST_WIDE_INT size = GET_MODE_SIZE (GET_MODE (x));
37574           rtx size_rtx = GEN_INT ((GET_CODE (addr) == PRE_DEC) ? -size : size);
37575           gcc_assert (REG_P (reg));
37576           emit_insn (gen_add3_insn (reg, reg, size_rtx));
37577           addr = reg;
37578         }
37579       else if (GET_CODE (addr) == PRE_MODIFY)
37580         {
37581           rtx reg = XEXP (addr, 0);
37582           rtx expr = XEXP (addr, 1);
37583           gcc_assert (REG_P (reg));
37584           gcc_assert (GET_CODE (expr) == PLUS);
37585           emit_insn (gen_add3_insn (reg, XEXP (expr, 0), XEXP (expr, 1)));
37586           addr = reg;
37587         }
37588
37589       x = replace_equiv_address (x, force_reg (Pmode, addr));
37590     }
37591
37592   return x;
37593 }
37594
37595 /* Implement TARGET_LEGITIMATE_CONSTANT_P.
37596
37597    On the RS/6000, all integer constants are acceptable, most won't be valid
37598    for particular insns, though.  Only easy FP constants are acceptable.  */
37599
37600 static bool
37601 rs6000_legitimate_constant_p (machine_mode mode, rtx x)
37602 {
37603   if (TARGET_ELF && tls_referenced_p (x))
37604     return false;
37605
37606   if (CONST_DOUBLE_P (x))
37607     return easy_fp_constant (x, mode);
37608
37609   if (GET_CODE (x) == CONST_VECTOR)
37610     return easy_vector_constant (x, mode);
37611
37612   return true;
37613 }
37614
37615 \f
37616 /* Return TRUE iff the sequence ending in LAST sets the static chain.  */
37617
37618 static bool
37619 chain_already_loaded (rtx_insn *last)
37620 {
37621   for (; last != NULL; last = PREV_INSN (last))
37622     {
37623       if (NONJUMP_INSN_P (last))
37624         {
37625           rtx patt = PATTERN (last);
37626
37627           if (GET_CODE (patt) == SET)
37628             {
37629               rtx lhs = XEXP (patt, 0);
37630
37631               if (REG_P (lhs) && REGNO (lhs) == STATIC_CHAIN_REGNUM)
37632                 return true;
37633             }
37634         }
37635     }
37636   return false;
37637 }
37638
37639 /* Expand code to perform a call under the AIX or ELFv2 ABI.  */
37640
37641 void
37642 rs6000_call_aix (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
37643 {
37644   rtx func = func_desc;
37645   rtx toc_reg = gen_rtx_REG (Pmode, TOC_REGNUM);
37646   rtx toc_load = NULL_RTX;
37647   rtx toc_restore = NULL_RTX;
37648   rtx func_addr;
37649   rtx abi_reg = NULL_RTX;
37650   rtx call[4];
37651   int n_call;
37652   rtx insn;
37653   bool is_pltseq_longcall;
37654
37655   if (global_tlsarg)
37656     tlsarg = global_tlsarg;
37657
37658   /* Handle longcall attributes.  */
37659   is_pltseq_longcall = false;
37660   if ((INTVAL (cookie) & CALL_LONG) != 0
37661       && GET_CODE (func_desc) == SYMBOL_REF)
37662     {
37663       func = rs6000_longcall_ref (func_desc, tlsarg);
37664       if (TARGET_PLTSEQ)
37665         is_pltseq_longcall = true;
37666     }
37667
37668   /* Handle indirect calls.  */
37669   if (!SYMBOL_REF_P (func)
37670       || (DEFAULT_ABI == ABI_AIX && !SYMBOL_REF_FUNCTION_P (func)))
37671     {
37672       /* Save the TOC into its reserved slot before the call,
37673          and prepare to restore it after the call.  */
37674       rtx stack_toc_offset = GEN_INT (RS6000_TOC_SAVE_SLOT);
37675       rtx stack_toc_unspec = gen_rtx_UNSPEC (Pmode,
37676                                              gen_rtvec (1, stack_toc_offset),
37677                                              UNSPEC_TOCSLOT);
37678       toc_restore = gen_rtx_SET (toc_reg, stack_toc_unspec);
37679
37680       /* Can we optimize saving the TOC in the prologue or
37681          do we need to do it at every call?  */
37682       if (TARGET_SAVE_TOC_INDIRECT && !cfun->calls_alloca)
37683         cfun->machine->save_toc_in_prologue = true;
37684       else
37685         {
37686           rtx stack_ptr = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
37687           rtx stack_toc_mem = gen_frame_mem (Pmode,
37688                                              gen_rtx_PLUS (Pmode, stack_ptr,
37689                                                            stack_toc_offset));
37690           MEM_VOLATILE_P (stack_toc_mem) = 1;
37691           if (is_pltseq_longcall)
37692             {
37693               /* Use USPEC_PLTSEQ here to emit every instruction in an
37694                  inline PLT call sequence with a reloc, enabling the
37695                  linker to edit the sequence back to a direct call
37696                  when that makes sense.  */
37697               rtvec v = gen_rtvec (3, toc_reg, func_desc, tlsarg);
37698               rtx mark_toc_reg = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
37699               emit_insn (gen_rtx_SET (stack_toc_mem, mark_toc_reg));
37700             }
37701           else
37702             emit_move_insn (stack_toc_mem, toc_reg);
37703         }
37704
37705       if (DEFAULT_ABI == ABI_ELFv2)
37706         {
37707           /* A function pointer in the ELFv2 ABI is just a plain address, but
37708              the ABI requires it to be loaded into r12 before the call.  */
37709           func_addr = gen_rtx_REG (Pmode, 12);
37710           if (!rtx_equal_p (func_addr, func))
37711             emit_move_insn (func_addr, func);
37712           abi_reg = func_addr;
37713           /* Indirect calls via CTR are strongly preferred over indirect
37714              calls via LR, so move the address there.  Needed to mark
37715              this insn for linker plt sequence editing too.  */
37716           func_addr = gen_rtx_REG (Pmode, CTR_REGNO);
37717           if (is_pltseq_longcall)
37718             {
37719               rtvec v = gen_rtvec (3, abi_reg, func_desc, tlsarg);
37720               rtx mark_func = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
37721               emit_insn (gen_rtx_SET (func_addr, mark_func));
37722               v = gen_rtvec (2, func_addr, func_desc);
37723               func_addr = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
37724             }
37725           else
37726             emit_move_insn (func_addr, abi_reg);
37727         }
37728       else
37729         {
37730           /* A function pointer under AIX is a pointer to a data area whose
37731              first word contains the actual address of the function, whose
37732              second word contains a pointer to its TOC, and whose third word
37733              contains a value to place in the static chain register (r11).
37734              Note that if we load the static chain, our "trampoline" need
37735              not have any executable code.  */
37736
37737           /* Load up address of the actual function.  */
37738           func = force_reg (Pmode, func);
37739           func_addr = gen_reg_rtx (Pmode);
37740           emit_move_insn (func_addr, gen_rtx_MEM (Pmode, func));
37741
37742           /* Indirect calls via CTR are strongly preferred over indirect
37743              calls via LR, so move the address there.  */
37744           rtx ctr_reg = gen_rtx_REG (Pmode, CTR_REGNO);
37745           emit_move_insn (ctr_reg, func_addr);
37746           func_addr = ctr_reg;
37747
37748           /* Prepare to load the TOC of the called function.  Note that the
37749              TOC load must happen immediately before the actual call so
37750              that unwinding the TOC registers works correctly.  See the
37751              comment in frob_update_context.  */
37752           rtx func_toc_offset = GEN_INT (GET_MODE_SIZE (Pmode));
37753           rtx func_toc_mem = gen_rtx_MEM (Pmode,
37754                                           gen_rtx_PLUS (Pmode, func,
37755                                                         func_toc_offset));
37756           toc_load = gen_rtx_USE (VOIDmode, func_toc_mem);
37757
37758           /* If we have a static chain, load it up.  But, if the call was
37759              originally direct, the 3rd word has not been written since no
37760              trampoline has been built, so we ought not to load it, lest we
37761              override a static chain value.  */
37762           if (!(GET_CODE (func_desc) == SYMBOL_REF
37763                 && SYMBOL_REF_FUNCTION_P (func_desc))
37764               && TARGET_POINTERS_TO_NESTED_FUNCTIONS
37765               && !chain_already_loaded (get_current_sequence ()->next->last))
37766             {
37767               rtx sc_reg = gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
37768               rtx func_sc_offset = GEN_INT (2 * GET_MODE_SIZE (Pmode));
37769               rtx func_sc_mem = gen_rtx_MEM (Pmode,
37770                                              gen_rtx_PLUS (Pmode, func,
37771                                                            func_sc_offset));
37772               emit_move_insn (sc_reg, func_sc_mem);
37773               abi_reg = sc_reg;
37774             }
37775         }
37776     }
37777   else
37778     {
37779       /* Direct calls use the TOC: for local calls, the callee will
37780          assume the TOC register is set; for non-local calls, the
37781          PLT stub needs the TOC register.  */
37782       abi_reg = toc_reg;
37783       func_addr = func;
37784     }
37785
37786   /* Create the call.  */
37787   call[0] = gen_rtx_CALL (VOIDmode, gen_rtx_MEM (SImode, func_addr), tlsarg);
37788   if (value != NULL_RTX)
37789     call[0] = gen_rtx_SET (value, call[0]);
37790   n_call = 1;
37791
37792   if (toc_load)
37793     call[n_call++] = toc_load;
37794   if (toc_restore)
37795     call[n_call++] = toc_restore;
37796
37797   call[n_call++] = gen_hard_reg_clobber (Pmode, LR_REGNO);
37798
37799   insn = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (n_call, call));
37800   insn = emit_call_insn (insn);
37801
37802   /* Mention all registers defined by the ABI to hold information
37803      as uses in CALL_INSN_FUNCTION_USAGE.  */
37804   if (abi_reg)
37805     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), abi_reg);
37806 }
37807
37808 /* Expand code to perform a sibling call under the AIX or ELFv2 ABI.  */
37809
37810 void
37811 rs6000_sibcall_aix (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
37812 {
37813   rtx call[2];
37814   rtx insn;
37815
37816   gcc_assert (INTVAL (cookie) == 0);
37817
37818   if (global_tlsarg)
37819     tlsarg = global_tlsarg;
37820
37821   /* Create the call.  */
37822   call[0] = gen_rtx_CALL (VOIDmode, gen_rtx_MEM (SImode, func_desc), tlsarg);
37823   if (value != NULL_RTX)
37824     call[0] = gen_rtx_SET (value, call[0]);
37825
37826   call[1] = simple_return_rtx;
37827
37828   insn = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (2, call));
37829   insn = emit_call_insn (insn);
37830
37831   /* Note use of the TOC register.  */
37832   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), gen_rtx_REG (Pmode, TOC_REGNUM));
37833 }
37834
37835 /* Expand code to perform a call under the SYSV4 ABI.  */
37836
37837 void
37838 rs6000_call_sysv (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
37839 {
37840   rtx func = func_desc;
37841   rtx func_addr;
37842   rtx call[4];
37843   rtx insn;
37844   rtx abi_reg = NULL_RTX;
37845   int n;
37846
37847   if (global_tlsarg)
37848     tlsarg = global_tlsarg;
37849
37850   /* Handle longcall attributes.  */
37851   if ((INTVAL (cookie) & CALL_LONG) != 0
37852       && GET_CODE (func_desc) == SYMBOL_REF)
37853     {
37854       func = rs6000_longcall_ref (func_desc, tlsarg);
37855       /* If the longcall was implemented as an inline PLT call using
37856          PLT unspecs then func will be REG:r11.  If not, func will be
37857          a pseudo reg.  The inline PLT call sequence supports lazy
37858          linking (and longcalls to functions in dlopen'd libraries).
37859          The other style of longcalls don't.  The lazy linking entry
37860          to the dynamic symbol resolver requires r11 be the function
37861          address (as it is for linker generated PLT stubs).  Ensure
37862          r11 stays valid to the bctrl by marking r11 used by the call.  */
37863       if (TARGET_PLTSEQ)
37864         abi_reg = func;
37865     }
37866
37867   /* Handle indirect calls.  */
37868   if (GET_CODE (func) != SYMBOL_REF)
37869     {
37870       func = force_reg (Pmode, func);
37871
37872       /* Indirect calls via CTR are strongly preferred over indirect
37873          calls via LR, so move the address there.  That can't be left
37874          to reload because we want to mark every instruction in an
37875          inline PLT call sequence with a reloc, enabling the linker to
37876          edit the sequence back to a direct call when that makes sense.  */
37877       func_addr = gen_rtx_REG (Pmode, CTR_REGNO);
37878       if (abi_reg)
37879         {
37880           rtvec v = gen_rtvec (3, func, func_desc, tlsarg);
37881           rtx mark_func = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
37882           emit_insn (gen_rtx_SET (func_addr, mark_func));
37883           v = gen_rtvec (2, func_addr, func_desc);
37884           func_addr = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
37885         }
37886       else
37887         emit_move_insn (func_addr, func);
37888     }
37889   else
37890     func_addr = func;
37891
37892   /* Create the call.  */
37893   call[0] = gen_rtx_CALL (VOIDmode, gen_rtx_MEM (SImode, func_addr), tlsarg);
37894   if (value != NULL_RTX)
37895     call[0] = gen_rtx_SET (value, call[0]);
37896
37897   call[1] = gen_rtx_USE (VOIDmode, cookie);
37898   n = 2;
37899   if (TARGET_SECURE_PLT
37900       && flag_pic
37901       && GET_CODE (func_addr) == SYMBOL_REF
37902       && !SYMBOL_REF_LOCAL_P (func_addr))
37903     call[n++] = gen_rtx_USE (VOIDmode, pic_offset_table_rtx);
37904
37905   call[n++] = gen_hard_reg_clobber (Pmode, LR_REGNO);
37906
37907   insn = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (n, call));
37908   insn = emit_call_insn (insn);
37909   if (abi_reg)
37910     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), abi_reg);
37911 }
37912
37913 /* Expand code to perform a sibling call under the SysV4 ABI.  */
37914
37915 void
37916 rs6000_sibcall_sysv (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
37917 {
37918   rtx func = func_desc;
37919   rtx func_addr;
37920   rtx call[3];
37921   rtx insn;
37922   rtx abi_reg = NULL_RTX;
37923
37924   if (global_tlsarg)
37925     tlsarg = global_tlsarg;
37926
37927   /* Handle longcall attributes.  */
37928   if ((INTVAL (cookie) & CALL_LONG) != 0
37929       && GET_CODE (func_desc) == SYMBOL_REF)
37930     {
37931       func = rs6000_longcall_ref (func_desc, tlsarg);
37932       /* If the longcall was implemented as an inline PLT call using
37933          PLT unspecs then func will be REG:r11.  If not, func will be
37934          a pseudo reg.  The inline PLT call sequence supports lazy
37935          linking (and longcalls to functions in dlopen'd libraries).
37936          The other style of longcalls don't.  The lazy linking entry
37937          to the dynamic symbol resolver requires r11 be the function
37938          address (as it is for linker generated PLT stubs).  Ensure
37939          r11 stays valid to the bctr by marking r11 used by the call.  */
37940       if (TARGET_PLTSEQ)
37941         abi_reg = func;
37942     }
37943
37944   /* Handle indirect calls.  */
37945   if (GET_CODE (func) != SYMBOL_REF)
37946     {
37947       func = force_reg (Pmode, func);
37948
37949       /* Indirect sibcalls must go via CTR.  That can't be left to
37950          reload because we want to mark every instruction in an inline
37951          PLT call sequence with a reloc, enabling the linker to edit
37952          the sequence back to a direct call when that makes sense.  */
37953       func_addr = gen_rtx_REG (Pmode, CTR_REGNO);
37954       if (abi_reg)
37955         {
37956           rtvec v = gen_rtvec (3, func, func_desc, tlsarg);
37957           rtx mark_func = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
37958           emit_insn (gen_rtx_SET (func_addr, mark_func));
37959           v = gen_rtvec (2, func_addr, func_desc);
37960           func_addr = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
37961         }
37962       else
37963         emit_move_insn (func_addr, func);
37964     }
37965   else
37966     func_addr = func;
37967
37968   /* Create the call.  */
37969   call[0] = gen_rtx_CALL (VOIDmode, gen_rtx_MEM (SImode, func_addr), tlsarg);
37970   if (value != NULL_RTX)
37971     call[0] = gen_rtx_SET (value, call[0]);
37972
37973   call[1] = gen_rtx_USE (VOIDmode, cookie);
37974   call[2] = simple_return_rtx;
37975
37976   insn = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (3, call));
37977   insn = emit_call_insn (insn);
37978   if (abi_reg)
37979     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), abi_reg);
37980 }
37981
37982 #if TARGET_MACHO
37983
37984 /* Expand code to perform a call under the Darwin ABI.
37985    Modulo handling of mlongcall, this is much the same as sysv.
37986    if/when the longcall optimisation is removed, we could drop this
37987    code and use the sysv case (taking care to avoid the tls stuff).
37988
37989    We can use this for sibcalls too, if needed.  */
37990
37991 void
37992 rs6000_call_darwin_1 (rtx value, rtx func_desc, rtx tlsarg,
37993                       rtx cookie, bool sibcall)
37994 {
37995   rtx func = func_desc;
37996   rtx func_addr;
37997   rtx call[3];
37998   rtx insn;
37999   int cookie_val = INTVAL (cookie);
38000   bool make_island = false;
38001
38002   /* Handle longcall attributes, there are two cases for Darwin:
38003      1) Newer linkers are capable of synthesising any branch islands needed.
38004      2) We need a helper branch island synthesised by the compiler.
38005      The second case has mostly been retired and we don't use it for m64.
38006      In fact, it's is an optimisation, we could just indirect as sysv does..
38007      ... however, backwards compatibility for now.
38008      If we're going to use this, then we need to keep the CALL_LONG bit set,
38009      so that we can pick up the special insn form later.  */
38010   if ((cookie_val & CALL_LONG) != 0
38011       && GET_CODE (func_desc) == SYMBOL_REF)
38012     {
38013       if (darwin_emit_branch_islands && TARGET_32BIT)
38014         make_island = true; /* Do nothing yet, retain the CALL_LONG flag.  */
38015       else
38016         {
38017           /* The linker is capable of doing this, but the user explicitly
38018              asked for -mlongcall, so we'll do the 'normal' version.  */
38019           func = rs6000_longcall_ref (func_desc, NULL_RTX);
38020           cookie_val &= ~CALL_LONG; /* Handled, zap it.  */
38021         }
38022     }
38023
38024   /* Handle indirect calls.  */
38025   if (GET_CODE (func) != SYMBOL_REF)
38026     {
38027       func = force_reg (Pmode, func);
38028
38029       /* Indirect calls via CTR are strongly preferred over indirect
38030          calls via LR, and are required for indirect sibcalls, so move
38031          the address there.   */
38032       func_addr = gen_rtx_REG (Pmode, CTR_REGNO);
38033       emit_move_insn (func_addr, func);
38034     }
38035   else
38036     func_addr = func;
38037
38038   /* Create the call.  */
38039   call[0] = gen_rtx_CALL (VOIDmode, gen_rtx_MEM (SImode, func_addr), tlsarg);
38040   if (value != NULL_RTX)
38041     call[0] = gen_rtx_SET (value, call[0]);
38042
38043   call[1] = gen_rtx_USE (VOIDmode, GEN_INT (cookie_val));
38044
38045   if (sibcall)
38046     call[2] = simple_return_rtx;
38047   else
38048     call[2] = gen_hard_reg_clobber (Pmode, LR_REGNO);
38049
38050   insn = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (3, call));
38051   insn = emit_call_insn (insn);
38052   /* Now we have the debug info in the insn, we can set up the branch island
38053      if we're using one.  */
38054   if (make_island)
38055     {
38056       tree funname = get_identifier (XSTR (func_desc, 0));
38057
38058       if (no_previous_def (funname))
38059         {
38060           rtx label_rtx = gen_label_rtx ();
38061           char *label_buf, temp_buf[256];
38062           ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
38063                                        CODE_LABEL_NUMBER (label_rtx));
38064           label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
38065           tree labelname = get_identifier (label_buf);
38066           add_compiler_branch_island (labelname, funname,
38067                                      insn_line ((const rtx_insn*)insn));
38068         }
38069      }
38070 }
38071 #endif
38072
38073 void
38074 rs6000_call_darwin (rtx value ATTRIBUTE_UNUSED, rtx func_desc ATTRIBUTE_UNUSED,
38075                     rtx tlsarg ATTRIBUTE_UNUSED, rtx cookie ATTRIBUTE_UNUSED)
38076 {
38077 #if TARGET_MACHO
38078   rs6000_call_darwin_1 (value, func_desc, tlsarg, cookie, false);
38079 #else
38080   gcc_unreachable();
38081 #endif
38082 }
38083
38084
38085 void
38086 rs6000_sibcall_darwin (rtx value ATTRIBUTE_UNUSED, rtx func_desc ATTRIBUTE_UNUSED,
38087                        rtx tlsarg ATTRIBUTE_UNUSED, rtx cookie ATTRIBUTE_UNUSED)
38088 {
38089 #if TARGET_MACHO
38090   rs6000_call_darwin_1 (value, func_desc, tlsarg, cookie, true);
38091 #else
38092   gcc_unreachable();
38093 #endif
38094 }
38095
38096
38097 /* Return whether we need to always update the saved TOC pointer when we update
38098    the stack pointer.  */
38099
38100 static bool
38101 rs6000_save_toc_in_prologue_p (void)
38102 {
38103   return (cfun && cfun->machine && cfun->machine->save_toc_in_prologue);
38104 }
38105
38106 #ifdef HAVE_GAS_HIDDEN
38107 # define USE_HIDDEN_LINKONCE 1
38108 #else
38109 # define USE_HIDDEN_LINKONCE 0
38110 #endif
38111
38112 /* Fills in the label name that should be used for a 476 link stack thunk.  */
38113
38114 void
38115 get_ppc476_thunk_name (char name[32])
38116 {
38117   gcc_assert (TARGET_LINK_STACK);
38118
38119   if (USE_HIDDEN_LINKONCE)
38120     sprintf (name, "__ppc476.get_thunk");
38121   else
38122     ASM_GENERATE_INTERNAL_LABEL (name, "LPPC476_", 0);
38123 }
38124
38125 /* This function emits the simple thunk routine that is used to preserve
38126    the link stack on the 476 cpu.  */
38127
38128 static void rs6000_code_end (void) ATTRIBUTE_UNUSED;
38129 static void
38130 rs6000_code_end (void)
38131 {
38132   char name[32];
38133   tree decl;
38134
38135   if (!TARGET_LINK_STACK)
38136     return;
38137
38138   get_ppc476_thunk_name (name);
38139
38140   decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, get_identifier (name),
38141                      build_function_type_list (void_type_node, NULL_TREE));
38142   DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
38143                                    NULL_TREE, void_type_node);
38144   TREE_PUBLIC (decl) = 1;
38145   TREE_STATIC (decl) = 1;
38146
38147 #if RS6000_WEAK
38148   if (USE_HIDDEN_LINKONCE && !TARGET_XCOFF)
38149     {
38150       cgraph_node::create (decl)->set_comdat_group (DECL_ASSEMBLER_NAME (decl));
38151       targetm.asm_out.unique_section (decl, 0);
38152       switch_to_section (get_named_section (decl, NULL, 0));
38153       DECL_WEAK (decl) = 1;
38154       ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
38155       targetm.asm_out.globalize_label (asm_out_file, name);
38156       targetm.asm_out.assemble_visibility (decl, VISIBILITY_HIDDEN);
38157       ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
38158     }
38159   else
38160 #endif
38161     {
38162       switch_to_section (text_section);
38163       ASM_OUTPUT_LABEL (asm_out_file, name);
38164     }
38165
38166   DECL_INITIAL (decl) = make_node (BLOCK);
38167   current_function_decl = decl;
38168   allocate_struct_function (decl, false);
38169   init_function_start (decl);
38170   first_function_block_is_cold = false;
38171   /* Make sure unwind info is emitted for the thunk if needed.  */
38172   final_start_function (emit_barrier (), asm_out_file, 1);
38173
38174   fputs ("\tblr\n", asm_out_file);
38175
38176   final_end_function ();
38177   init_insn_lengths ();
38178   free_after_compilation (cfun);
38179   set_cfun (NULL);
38180   current_function_decl = NULL;
38181 }
38182
38183 /* Add r30 to hard reg set if the prologue sets it up and it is not
38184    pic_offset_table_rtx.  */
38185
38186 static void
38187 rs6000_set_up_by_prologue (struct hard_reg_set_container *set)
38188 {
38189   if (!TARGET_SINGLE_PIC_BASE
38190       && TARGET_TOC
38191       && TARGET_MINIMAL_TOC
38192       && !constant_pool_empty_p ())
38193     add_to_hard_reg_set (&set->set, Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
38194   if (cfun->machine->split_stack_argp_used)
38195     add_to_hard_reg_set (&set->set, Pmode, 12);
38196
38197   /* Make sure the hard reg set doesn't include r2, which was possibly added
38198      via PIC_OFFSET_TABLE_REGNUM.  */
38199   if (TARGET_TOC)
38200     remove_from_hard_reg_set (&set->set, Pmode, TOC_REGNUM);
38201 }
38202
38203 \f
38204 /* Helper function for rs6000_split_logical to emit a logical instruction after
38205    spliting the operation to single GPR registers.
38206
38207    DEST is the destination register.
38208    OP1 and OP2 are the input source registers.
38209    CODE is the base operation (AND, IOR, XOR, NOT).
38210    MODE is the machine mode.
38211    If COMPLEMENT_FINAL_P is true, wrap the whole operation with NOT.
38212    If COMPLEMENT_OP1_P is true, wrap operand1 with NOT.
38213    If COMPLEMENT_OP2_P is true, wrap operand2 with NOT.  */
38214
38215 static void
38216 rs6000_split_logical_inner (rtx dest,
38217                             rtx op1,
38218                             rtx op2,
38219                             enum rtx_code code,
38220                             machine_mode mode,
38221                             bool complement_final_p,
38222                             bool complement_op1_p,
38223                             bool complement_op2_p)
38224 {
38225   rtx bool_rtx;
38226
38227   /* Optimize AND of 0/0xffffffff and IOR/XOR of 0.  */
38228   if (op2 && CONST_INT_P (op2)
38229       && (mode == SImode || (mode == DImode && TARGET_POWERPC64))
38230       && !complement_final_p && !complement_op1_p && !complement_op2_p)
38231     {
38232       HOST_WIDE_INT mask = GET_MODE_MASK (mode);
38233       HOST_WIDE_INT value = INTVAL (op2) & mask;
38234
38235       /* Optimize AND of 0 to just set 0.  Optimize AND of -1 to be a move.  */
38236       if (code == AND)
38237         {
38238           if (value == 0)
38239             {
38240               emit_insn (gen_rtx_SET (dest, const0_rtx));
38241               return;
38242             }
38243
38244           else if (value == mask)
38245             {
38246               if (!rtx_equal_p (dest, op1))
38247                 emit_insn (gen_rtx_SET (dest, op1));
38248               return;
38249             }
38250         }
38251
38252       /* Optimize IOR/XOR of 0 to be a simple move.  Split large operations
38253          into separate ORI/ORIS or XORI/XORIS instrucitons.  */
38254       else if (code == IOR || code == XOR)
38255         {
38256           if (value == 0)
38257             {
38258               if (!rtx_equal_p (dest, op1))
38259                 emit_insn (gen_rtx_SET (dest, op1));
38260               return;
38261             }
38262         }
38263     }
38264
38265   if (code == AND && mode == SImode
38266       && !complement_final_p && !complement_op1_p && !complement_op2_p)
38267     {
38268       emit_insn (gen_andsi3 (dest, op1, op2));
38269       return;
38270     }
38271
38272   if (complement_op1_p)
38273     op1 = gen_rtx_NOT (mode, op1);
38274
38275   if (complement_op2_p)
38276     op2 = gen_rtx_NOT (mode, op2);
38277
38278   /* For canonical RTL, if only one arm is inverted it is the first.  */
38279   if (!complement_op1_p && complement_op2_p)
38280     std::swap (op1, op2);
38281
38282   bool_rtx = ((code == NOT)
38283               ? gen_rtx_NOT (mode, op1)
38284               : gen_rtx_fmt_ee (code, mode, op1, op2));
38285
38286   if (complement_final_p)
38287     bool_rtx = gen_rtx_NOT (mode, bool_rtx);
38288
38289   emit_insn (gen_rtx_SET (dest, bool_rtx));
38290 }
38291
38292 /* Split a DImode AND/IOR/XOR with a constant on a 32-bit system.  These
38293    operations are split immediately during RTL generation to allow for more
38294    optimizations of the AND/IOR/XOR.
38295
38296    OPERANDS is an array containing the destination and two input operands.
38297    CODE is the base operation (AND, IOR, XOR, NOT).
38298    MODE is the machine mode.
38299    If COMPLEMENT_FINAL_P is true, wrap the whole operation with NOT.
38300    If COMPLEMENT_OP1_P is true, wrap operand1 with NOT.
38301    If COMPLEMENT_OP2_P is true, wrap operand2 with NOT.
38302    CLOBBER_REG is either NULL or a scratch register of type CC to allow
38303    formation of the AND instructions.  */
38304
38305 static void
38306 rs6000_split_logical_di (rtx operands[3],
38307                          enum rtx_code code,
38308                          bool complement_final_p,
38309                          bool complement_op1_p,
38310                          bool complement_op2_p)
38311 {
38312   const HOST_WIDE_INT lower_32bits = HOST_WIDE_INT_C(0xffffffff);
38313   const HOST_WIDE_INT upper_32bits = ~ lower_32bits;
38314   const HOST_WIDE_INT sign_bit = HOST_WIDE_INT_C(0x80000000);
38315   enum hi_lo { hi = 0, lo = 1 };
38316   rtx op0_hi_lo[2], op1_hi_lo[2], op2_hi_lo[2];
38317   size_t i;
38318
38319   op0_hi_lo[hi] = gen_highpart (SImode, operands[0]);
38320   op1_hi_lo[hi] = gen_highpart (SImode, operands[1]);
38321   op0_hi_lo[lo] = gen_lowpart (SImode, operands[0]);
38322   op1_hi_lo[lo] = gen_lowpart (SImode, operands[1]);
38323
38324   if (code == NOT)
38325     op2_hi_lo[hi] = op2_hi_lo[lo] = NULL_RTX;
38326   else
38327     {
38328       if (!CONST_INT_P (operands[2]))
38329         {
38330           op2_hi_lo[hi] = gen_highpart_mode (SImode, DImode, operands[2]);
38331           op2_hi_lo[lo] = gen_lowpart (SImode, operands[2]);
38332         }
38333       else
38334         {
38335           HOST_WIDE_INT value = INTVAL (operands[2]);
38336           HOST_WIDE_INT value_hi_lo[2];
38337
38338           gcc_assert (!complement_final_p);
38339           gcc_assert (!complement_op1_p);
38340           gcc_assert (!complement_op2_p);
38341
38342           value_hi_lo[hi] = value >> 32;
38343           value_hi_lo[lo] = value & lower_32bits;
38344
38345           for (i = 0; i < 2; i++)
38346             {
38347               HOST_WIDE_INT sub_value = value_hi_lo[i];
38348
38349               if (sub_value & sign_bit)
38350                 sub_value |= upper_32bits;
38351
38352               op2_hi_lo[i] = GEN_INT (sub_value);
38353
38354               /* If this is an AND instruction, check to see if we need to load
38355                  the value in a register.  */
38356               if (code == AND && sub_value != -1 && sub_value != 0
38357                   && !and_operand (op2_hi_lo[i], SImode))
38358                 op2_hi_lo[i] = force_reg (SImode, op2_hi_lo[i]);
38359             }
38360         }
38361     }
38362
38363   for (i = 0; i < 2; i++)
38364     {
38365       /* Split large IOR/XOR operations.  */
38366       if ((code == IOR || code == XOR)
38367           && CONST_INT_P (op2_hi_lo[i])
38368           && !complement_final_p
38369           && !complement_op1_p
38370           && !complement_op2_p
38371           && !logical_const_operand (op2_hi_lo[i], SImode))
38372         {
38373           HOST_WIDE_INT value = INTVAL (op2_hi_lo[i]);
38374           HOST_WIDE_INT hi_16bits = value & HOST_WIDE_INT_C(0xffff0000);
38375           HOST_WIDE_INT lo_16bits = value & HOST_WIDE_INT_C(0x0000ffff);
38376           rtx tmp = gen_reg_rtx (SImode);
38377
38378           /* Make sure the constant is sign extended.  */
38379           if ((hi_16bits & sign_bit) != 0)
38380             hi_16bits |= upper_32bits;
38381
38382           rs6000_split_logical_inner (tmp, op1_hi_lo[i], GEN_INT (hi_16bits),
38383                                       code, SImode, false, false, false);
38384
38385           rs6000_split_logical_inner (op0_hi_lo[i], tmp, GEN_INT (lo_16bits),
38386                                       code, SImode, false, false, false);
38387         }
38388       else
38389         rs6000_split_logical_inner (op0_hi_lo[i], op1_hi_lo[i], op2_hi_lo[i],
38390                                     code, SImode, complement_final_p,
38391                                     complement_op1_p, complement_op2_p);
38392     }
38393
38394   return;
38395 }
38396
38397 /* Split the insns that make up boolean operations operating on multiple GPR
38398    registers.  The boolean MD patterns ensure that the inputs either are
38399    exactly the same as the output registers, or there is no overlap.
38400
38401    OPERANDS is an array containing the destination and two input operands.
38402    CODE is the base operation (AND, IOR, XOR, NOT).
38403    If COMPLEMENT_FINAL_P is true, wrap the whole operation with NOT.
38404    If COMPLEMENT_OP1_P is true, wrap operand1 with NOT.
38405    If COMPLEMENT_OP2_P is true, wrap operand2 with NOT.  */
38406
38407 void
38408 rs6000_split_logical (rtx operands[3],
38409                       enum rtx_code code,
38410                       bool complement_final_p,
38411                       bool complement_op1_p,
38412                       bool complement_op2_p)
38413 {
38414   machine_mode mode = GET_MODE (operands[0]);
38415   machine_mode sub_mode;
38416   rtx op0, op1, op2;
38417   int sub_size, regno0, regno1, nregs, i;
38418
38419   /* If this is DImode, use the specialized version that can run before
38420      register allocation.  */
38421   if (mode == DImode && !TARGET_POWERPC64)
38422     {
38423       rs6000_split_logical_di (operands, code, complement_final_p,
38424                                complement_op1_p, complement_op2_p);
38425       return;
38426     }
38427
38428   op0 = operands[0];
38429   op1 = operands[1];
38430   op2 = (code == NOT) ? NULL_RTX : operands[2];
38431   sub_mode = (TARGET_POWERPC64) ? DImode : SImode;
38432   sub_size = GET_MODE_SIZE (sub_mode);
38433   regno0 = REGNO (op0);
38434   regno1 = REGNO (op1);
38435
38436   gcc_assert (reload_completed);
38437   gcc_assert (IN_RANGE (regno0, FIRST_GPR_REGNO, LAST_GPR_REGNO));
38438   gcc_assert (IN_RANGE (regno1, FIRST_GPR_REGNO, LAST_GPR_REGNO));
38439
38440   nregs = rs6000_hard_regno_nregs[(int)mode][regno0];
38441   gcc_assert (nregs > 1);
38442
38443   if (op2 && REG_P (op2))
38444     gcc_assert (IN_RANGE (REGNO (op2), FIRST_GPR_REGNO, LAST_GPR_REGNO));
38445
38446   for (i = 0; i < nregs; i++)
38447     {
38448       int offset = i * sub_size;
38449       rtx sub_op0 = simplify_subreg (sub_mode, op0, mode, offset);
38450       rtx sub_op1 = simplify_subreg (sub_mode, op1, mode, offset);
38451       rtx sub_op2 = ((code == NOT)
38452                      ? NULL_RTX
38453                      : simplify_subreg (sub_mode, op2, mode, offset));
38454
38455       rs6000_split_logical_inner (sub_op0, sub_op1, sub_op2, code, sub_mode,
38456                                   complement_final_p, complement_op1_p,
38457                                   complement_op2_p);
38458     }
38459
38460   return;
38461 }
38462
38463 \f
38464 /* Return true if the peephole2 can combine a load involving a combination of
38465    an addis instruction and a load with an offset that can be fused together on
38466    a power8.  */
38467
38468 bool
38469 fusion_gpr_load_p (rtx addis_reg,       /* register set via addis.  */
38470                    rtx addis_value,     /* addis value.  */
38471                    rtx target,          /* target register that is loaded.  */
38472                    rtx mem)             /* bottom part of the memory addr.  */
38473 {
38474   rtx addr;
38475   rtx base_reg;
38476
38477   /* Validate arguments.  */
38478   if (!base_reg_operand (addis_reg, GET_MODE (addis_reg)))
38479     return false;
38480
38481   if (!base_reg_operand (target, GET_MODE (target)))
38482     return false;
38483
38484   if (!fusion_gpr_addis (addis_value, GET_MODE (addis_value)))
38485     return false;
38486
38487   /* Allow sign/zero extension.  */
38488   if (GET_CODE (mem) == ZERO_EXTEND
38489       || (GET_CODE (mem) == SIGN_EXTEND && TARGET_P8_FUSION_SIGN))
38490     mem = XEXP (mem, 0);
38491
38492   if (!MEM_P (mem))
38493     return false;
38494
38495   if (!fusion_gpr_mem_load (mem, GET_MODE (mem)))
38496     return false;
38497
38498   addr = XEXP (mem, 0);                 /* either PLUS or LO_SUM.  */
38499   if (GET_CODE (addr) != PLUS && GET_CODE (addr) != LO_SUM)
38500     return false;
38501
38502   /* Validate that the register used to load the high value is either the
38503      register being loaded, or we can safely replace its use.
38504
38505      This function is only called from the peephole2 pass and we assume that
38506      there are 2 instructions in the peephole (addis and load), so we want to
38507      check if the target register was not used in the memory address and the
38508      register to hold the addis result is dead after the peephole.  */
38509   if (REGNO (addis_reg) != REGNO (target))
38510     {
38511       if (reg_mentioned_p (target, mem))
38512         return false;
38513
38514       if (!peep2_reg_dead_p (2, addis_reg))
38515         return false;
38516
38517       /* If the target register being loaded is the stack pointer, we must
38518          avoid loading any other value into it, even temporarily.  */
38519       if (REG_P (target) && REGNO (target) == STACK_POINTER_REGNUM)
38520         return false;
38521     }
38522
38523   base_reg = XEXP (addr, 0);
38524   return REGNO (addis_reg) == REGNO (base_reg);
38525 }
38526
38527 /* During the peephole2 pass, adjust and expand the insns for a load fusion
38528    sequence.  We adjust the addis register to use the target register.  If the
38529    load sign extends, we adjust the code to do the zero extending load, and an
38530    explicit sign extension later since the fusion only covers zero extending
38531    loads.
38532
38533    The operands are:
38534         operands[0]     register set with addis (to be replaced with target)
38535         operands[1]     value set via addis
38536         operands[2]     target register being loaded
38537         operands[3]     D-form memory reference using operands[0].  */
38538
38539 void
38540 expand_fusion_gpr_load (rtx *operands)
38541 {
38542   rtx addis_value = operands[1];
38543   rtx target = operands[2];
38544   rtx orig_mem = operands[3];
38545   rtx  new_addr, new_mem, orig_addr, offset;
38546   enum rtx_code plus_or_lo_sum;
38547   machine_mode target_mode = GET_MODE (target);
38548   machine_mode extend_mode = target_mode;
38549   machine_mode ptr_mode = Pmode;
38550   enum rtx_code extend = UNKNOWN;
38551
38552   if (GET_CODE (orig_mem) == ZERO_EXTEND
38553       || (TARGET_P8_FUSION_SIGN && GET_CODE (orig_mem) == SIGN_EXTEND))
38554     {
38555       extend = GET_CODE (orig_mem);
38556       orig_mem = XEXP (orig_mem, 0);
38557       target_mode = GET_MODE (orig_mem);
38558     }
38559
38560   gcc_assert (MEM_P (orig_mem));
38561
38562   orig_addr = XEXP (orig_mem, 0);
38563   plus_or_lo_sum = GET_CODE (orig_addr);
38564   gcc_assert (plus_or_lo_sum == PLUS || plus_or_lo_sum == LO_SUM);
38565
38566   offset = XEXP (orig_addr, 1);
38567   new_addr = gen_rtx_fmt_ee (plus_or_lo_sum, ptr_mode, addis_value, offset);
38568   new_mem = replace_equiv_address_nv (orig_mem, new_addr, false);
38569
38570   if (extend != UNKNOWN)
38571     new_mem = gen_rtx_fmt_e (ZERO_EXTEND, extend_mode, new_mem);
38572
38573   new_mem = gen_rtx_UNSPEC (extend_mode, gen_rtvec (1, new_mem),
38574                             UNSPEC_FUSION_GPR);
38575   emit_insn (gen_rtx_SET (target, new_mem));
38576
38577   if (extend == SIGN_EXTEND)
38578     {
38579       int sub_off = ((BYTES_BIG_ENDIAN)
38580                      ? GET_MODE_SIZE (extend_mode) - GET_MODE_SIZE (target_mode)
38581                      : 0);
38582       rtx sign_reg
38583         = simplify_subreg (target_mode, target, extend_mode, sub_off);
38584
38585       emit_insn (gen_rtx_SET (target,
38586                               gen_rtx_SIGN_EXTEND (extend_mode, sign_reg)));
38587     }
38588
38589   return;
38590 }
38591
38592 /* Emit the addis instruction that will be part of a fused instruction
38593    sequence.  */
38594
38595 void
38596 emit_fusion_addis (rtx target, rtx addis_value)
38597 {
38598   rtx fuse_ops[10];
38599   const char *addis_str = NULL;
38600
38601   /* Emit the addis instruction.  */
38602   fuse_ops[0] = target;
38603   if (satisfies_constraint_L (addis_value))
38604     {
38605       fuse_ops[1] = addis_value;
38606       addis_str = "lis %0,%v1";
38607     }
38608
38609   else if (GET_CODE (addis_value) == PLUS)
38610     {
38611       rtx op0 = XEXP (addis_value, 0);
38612       rtx op1 = XEXP (addis_value, 1);
38613
38614       if (REG_P (op0) && CONST_INT_P (op1)
38615           && satisfies_constraint_L (op1))
38616         {
38617           fuse_ops[1] = op0;
38618           fuse_ops[2] = op1;
38619           addis_str = "addis %0,%1,%v2";
38620         }
38621     }
38622
38623   else if (GET_CODE (addis_value) == HIGH)
38624     {
38625       rtx value = XEXP (addis_value, 0);
38626       if (GET_CODE (value) == UNSPEC && XINT (value, 1) == UNSPEC_TOCREL)
38627         {
38628           fuse_ops[1] = XVECEXP (value, 0, 0);          /* symbol ref.  */
38629           fuse_ops[2] = XVECEXP (value, 0, 1);          /* TOC register.  */
38630           if (TARGET_ELF)
38631             addis_str = "addis %0,%2,%1@toc@ha";
38632
38633           else if (TARGET_XCOFF)
38634             addis_str = "addis %0,%1@u(%2)";
38635
38636           else
38637             gcc_unreachable ();
38638         }
38639
38640       else if (GET_CODE (value) == PLUS)
38641         {
38642           rtx op0 = XEXP (value, 0);
38643           rtx op1 = XEXP (value, 1);
38644
38645           if (GET_CODE (op0) == UNSPEC
38646               && XINT (op0, 1) == UNSPEC_TOCREL
38647               && CONST_INT_P (op1))
38648             {
38649               fuse_ops[1] = XVECEXP (op0, 0, 0);        /* symbol ref.  */
38650               fuse_ops[2] = XVECEXP (op0, 0, 1);        /* TOC register.  */
38651               fuse_ops[3] = op1;
38652               if (TARGET_ELF)
38653                 addis_str = "addis %0,%2,%1+%3@toc@ha";
38654
38655               else if (TARGET_XCOFF)
38656                 addis_str = "addis %0,%1+%3@u(%2)";
38657
38658               else
38659                 gcc_unreachable ();
38660             }
38661         }
38662
38663       else if (satisfies_constraint_L (value))
38664         {
38665           fuse_ops[1] = value;
38666           addis_str = "lis %0,%v1";
38667         }
38668
38669       else if (TARGET_ELF && !TARGET_POWERPC64 && CONSTANT_P (value))
38670         {
38671           fuse_ops[1] = value;
38672           addis_str = "lis %0,%1@ha";
38673         }
38674     }
38675
38676   if (!addis_str)
38677     fatal_insn ("Could not generate addis value for fusion", addis_value);
38678
38679   output_asm_insn (addis_str, fuse_ops);
38680 }
38681
38682 /* Emit a D-form load or store instruction that is the second instruction
38683    of a fusion sequence.  */
38684
38685 static void
38686 emit_fusion_load (rtx load_reg, rtx addis_reg, rtx offset, const char *insn_str)
38687 {
38688   rtx fuse_ops[10];
38689   char insn_template[80];
38690
38691   fuse_ops[0] = load_reg;
38692   fuse_ops[1] = addis_reg;
38693
38694   if (CONST_INT_P (offset) && satisfies_constraint_I (offset))
38695     {
38696       sprintf (insn_template, "%s %%0,%%2(%%1)", insn_str);
38697       fuse_ops[2] = offset;
38698       output_asm_insn (insn_template, fuse_ops);
38699     }
38700
38701   else if (GET_CODE (offset) == UNSPEC
38702            && XINT (offset, 1) == UNSPEC_TOCREL)
38703     {
38704       if (TARGET_ELF)
38705         sprintf (insn_template, "%s %%0,%%2@toc@l(%%1)", insn_str);
38706
38707       else if (TARGET_XCOFF)
38708         sprintf (insn_template, "%s %%0,%%2@l(%%1)", insn_str);
38709
38710       else
38711         gcc_unreachable ();
38712
38713       fuse_ops[2] = XVECEXP (offset, 0, 0);
38714       output_asm_insn (insn_template, fuse_ops);
38715     }
38716
38717   else if (GET_CODE (offset) == PLUS
38718            && GET_CODE (XEXP (offset, 0)) == UNSPEC
38719            && XINT (XEXP (offset, 0), 1) == UNSPEC_TOCREL
38720            && CONST_INT_P (XEXP (offset, 1)))
38721     {
38722       rtx tocrel_unspec = XEXP (offset, 0);
38723       if (TARGET_ELF)
38724         sprintf (insn_template, "%s %%0,%%2+%%3@toc@l(%%1)", insn_str);
38725
38726       else if (TARGET_XCOFF)
38727         sprintf (insn_template, "%s %%0,%%2+%%3@l(%%1)", insn_str);
38728
38729       else
38730         gcc_unreachable ();
38731
38732       fuse_ops[2] = XVECEXP (tocrel_unspec, 0, 0);
38733       fuse_ops[3] = XEXP (offset, 1);
38734       output_asm_insn (insn_template, fuse_ops);
38735     }
38736
38737   else if (TARGET_ELF && !TARGET_POWERPC64 && CONSTANT_P (offset))
38738     {
38739       sprintf (insn_template, "%s %%0,%%2@l(%%1)", insn_str);
38740
38741       fuse_ops[2] = offset;
38742       output_asm_insn (insn_template, fuse_ops);
38743     }
38744
38745   else
38746     fatal_insn ("Unable to generate load/store offset for fusion", offset);
38747
38748   return;
38749 }
38750
38751 /* Given an address, convert it into the addis and load offset parts.  Addresses
38752    created during the peephole2 process look like:
38753         (lo_sum (high (unspec [(sym)] UNSPEC_TOCREL))
38754                 (unspec [(...)] UNSPEC_TOCREL))  */
38755
38756 static void
38757 fusion_split_address (rtx addr, rtx *p_hi, rtx *p_lo)
38758 {
38759   rtx hi, lo;
38760
38761   if (GET_CODE (addr) == PLUS || GET_CODE (addr) == LO_SUM)
38762     {
38763       hi = XEXP (addr, 0);
38764       lo = XEXP (addr, 1);
38765     }
38766   else
38767     gcc_unreachable ();
38768
38769   *p_hi = hi;
38770   *p_lo = lo;
38771 }
38772
38773 /* Return a string to fuse an addis instruction with a gpr load to the same
38774    register that we loaded up the addis instruction.  The address that is used
38775    is the logical address that was formed during peephole2:
38776         (lo_sum (high) (low-part))
38777
38778    The code is complicated, so we call output_asm_insn directly, and just
38779    return "".  */
38780
38781 const char *
38782 emit_fusion_gpr_load (rtx target, rtx mem)
38783 {
38784   rtx addis_value;
38785   rtx addr;
38786   rtx load_offset;
38787   const char *load_str = NULL;
38788   machine_mode mode;
38789
38790   if (GET_CODE (mem) == ZERO_EXTEND)
38791     mem = XEXP (mem, 0);
38792
38793   gcc_assert (REG_P (target) && MEM_P (mem));
38794
38795   addr = XEXP (mem, 0);
38796   fusion_split_address (addr, &addis_value, &load_offset);
38797
38798   /* Now emit the load instruction to the same register.  */
38799   mode = GET_MODE (mem);
38800   switch (mode)
38801     {
38802     case E_QImode:
38803       load_str = "lbz";
38804       break;
38805
38806     case E_HImode:
38807       load_str = "lhz";
38808       break;
38809
38810     case E_SImode:
38811     case E_SFmode:
38812       load_str = "lwz";
38813       break;
38814
38815     case E_DImode:
38816     case E_DFmode:
38817       gcc_assert (TARGET_POWERPC64);
38818       load_str = "ld";
38819       break;
38820
38821     default:
38822       fatal_insn ("Bad GPR fusion", gen_rtx_SET (target, mem));
38823     }
38824
38825   /* Emit the addis instruction.  */
38826   emit_fusion_addis (target, addis_value);
38827
38828   /* Emit the D-form load instruction.  */
38829   emit_fusion_load (target, target, load_offset, load_str);
38830
38831   return "";
38832 }
38833 \f
38834
38835 #ifdef RS6000_GLIBC_ATOMIC_FENV
38836 /* Function declarations for rs6000_atomic_assign_expand_fenv.  */
38837 static tree atomic_hold_decl, atomic_clear_decl, atomic_update_decl;
38838 #endif
38839
38840 /* Implement TARGET_ATOMIC_ASSIGN_EXPAND_FENV hook.  */
38841
38842 static void
38843 rs6000_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update)
38844 {
38845   if (!TARGET_HARD_FLOAT)
38846     {
38847 #ifdef RS6000_GLIBC_ATOMIC_FENV
38848       if (atomic_hold_decl == NULL_TREE)
38849         {
38850           atomic_hold_decl
38851             = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
38852                           get_identifier ("__atomic_feholdexcept"),
38853                           build_function_type_list (void_type_node,
38854                                                     double_ptr_type_node,
38855                                                     NULL_TREE));
38856           TREE_PUBLIC (atomic_hold_decl) = 1;
38857           DECL_EXTERNAL (atomic_hold_decl) = 1;
38858         }
38859
38860       if (atomic_clear_decl == NULL_TREE)
38861         {
38862           atomic_clear_decl
38863             = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
38864                           get_identifier ("__atomic_feclearexcept"),
38865                           build_function_type_list (void_type_node,
38866                                                     NULL_TREE));
38867           TREE_PUBLIC (atomic_clear_decl) = 1;
38868           DECL_EXTERNAL (atomic_clear_decl) = 1;
38869         }
38870
38871       tree const_double = build_qualified_type (double_type_node,
38872                                                 TYPE_QUAL_CONST);
38873       tree const_double_ptr = build_pointer_type (const_double);
38874       if (atomic_update_decl == NULL_TREE)
38875         {
38876           atomic_update_decl
38877             = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
38878                           get_identifier ("__atomic_feupdateenv"),
38879                           build_function_type_list (void_type_node,
38880                                                     const_double_ptr,
38881                                                     NULL_TREE));
38882           TREE_PUBLIC (atomic_update_decl) = 1;
38883           DECL_EXTERNAL (atomic_update_decl) = 1;
38884         }
38885
38886       tree fenv_var = create_tmp_var_raw (double_type_node);
38887       TREE_ADDRESSABLE (fenv_var) = 1;
38888       tree fenv_addr = build1 (ADDR_EXPR, double_ptr_type_node, fenv_var);
38889
38890       *hold = build_call_expr (atomic_hold_decl, 1, fenv_addr);
38891       *clear = build_call_expr (atomic_clear_decl, 0);
38892       *update = build_call_expr (atomic_update_decl, 1,
38893                                  fold_convert (const_double_ptr, fenv_addr));
38894 #endif
38895       return;
38896     }
38897
38898   tree mffs = rs6000_builtin_decls[RS6000_BUILTIN_MFFS];
38899   tree mtfsf = rs6000_builtin_decls[RS6000_BUILTIN_MTFSF];
38900   tree call_mffs = build_call_expr (mffs, 0);
38901
38902   /* Generates the equivalent of feholdexcept (&fenv_var)
38903
38904      *fenv_var = __builtin_mffs ();
38905      double fenv_hold;
38906      *(uint64_t*)&fenv_hold = *(uint64_t*)fenv_var & 0xffffffff00000007LL;
38907      __builtin_mtfsf (0xff, fenv_hold);  */
38908
38909   /* Mask to clear everything except for the rounding modes and non-IEEE
38910      arithmetic flag.  */
38911   const unsigned HOST_WIDE_INT hold_exception_mask =
38912     HOST_WIDE_INT_C (0xffffffff00000007);
38913
38914   tree fenv_var = create_tmp_var_raw (double_type_node);
38915
38916   tree hold_mffs = build2 (MODIFY_EXPR, void_type_node, fenv_var, call_mffs);
38917
38918   tree fenv_llu = build1 (VIEW_CONVERT_EXPR, uint64_type_node, fenv_var);
38919   tree fenv_llu_and = build2 (BIT_AND_EXPR, uint64_type_node, fenv_llu,
38920                               build_int_cst (uint64_type_node,
38921                                              hold_exception_mask));
38922
38923   tree fenv_hold_mtfsf = build1 (VIEW_CONVERT_EXPR, double_type_node,
38924                                  fenv_llu_and);
38925
38926   tree hold_mtfsf = build_call_expr (mtfsf, 2,
38927                                      build_int_cst (unsigned_type_node, 0xff),
38928                                      fenv_hold_mtfsf);
38929
38930   *hold = build2 (COMPOUND_EXPR, void_type_node, hold_mffs, hold_mtfsf);
38931
38932   /* Generates the equivalent of feclearexcept (FE_ALL_EXCEPT):
38933
38934      double fenv_clear = __builtin_mffs ();
38935      *(uint64_t)&fenv_clear &= 0xffffffff00000000LL;
38936      __builtin_mtfsf (0xff, fenv_clear);  */
38937
38938   /* Mask to clear everything except for the rounding modes and non-IEEE
38939      arithmetic flag.  */
38940   const unsigned HOST_WIDE_INT clear_exception_mask =
38941     HOST_WIDE_INT_C (0xffffffff00000000);
38942
38943   tree fenv_clear = create_tmp_var_raw (double_type_node);
38944
38945   tree clear_mffs = build2 (MODIFY_EXPR, void_type_node, fenv_clear, call_mffs);
38946
38947   tree fenv_clean_llu = build1 (VIEW_CONVERT_EXPR, uint64_type_node, fenv_clear);
38948   tree fenv_clear_llu_and = build2 (BIT_AND_EXPR, uint64_type_node,
38949                                     fenv_clean_llu,
38950                                     build_int_cst (uint64_type_node,
38951                                                    clear_exception_mask));
38952
38953   tree fenv_clear_mtfsf = build1 (VIEW_CONVERT_EXPR, double_type_node,
38954                                   fenv_clear_llu_and);
38955
38956   tree clear_mtfsf = build_call_expr (mtfsf, 2,
38957                                       build_int_cst (unsigned_type_node, 0xff),
38958                                       fenv_clear_mtfsf);
38959
38960   *clear = build2 (COMPOUND_EXPR, void_type_node, clear_mffs, clear_mtfsf);
38961
38962   /* Generates the equivalent of feupdateenv (&fenv_var)
38963
38964      double old_fenv = __builtin_mffs ();
38965      double fenv_update;
38966      *(uint64_t*)&fenv_update = (*(uint64_t*)&old & 0xffffffff1fffff00LL) |
38967                                 (*(uint64_t*)fenv_var 0x1ff80fff);
38968      __builtin_mtfsf (0xff, fenv_update);  */
38969
38970   const unsigned HOST_WIDE_INT update_exception_mask =
38971     HOST_WIDE_INT_C (0xffffffff1fffff00);
38972   const unsigned HOST_WIDE_INT new_exception_mask =
38973     HOST_WIDE_INT_C (0x1ff80fff);
38974
38975   tree old_fenv = create_tmp_var_raw (double_type_node);
38976   tree update_mffs = build2 (MODIFY_EXPR, void_type_node, old_fenv, call_mffs);
38977
38978   tree old_llu = build1 (VIEW_CONVERT_EXPR, uint64_type_node, old_fenv);
38979   tree old_llu_and = build2 (BIT_AND_EXPR, uint64_type_node, old_llu,
38980                              build_int_cst (uint64_type_node,
38981                                             update_exception_mask));
38982
38983   tree new_llu_and = build2 (BIT_AND_EXPR, uint64_type_node, fenv_llu,
38984                              build_int_cst (uint64_type_node,
38985                                             new_exception_mask));
38986
38987   tree new_llu_mask = build2 (BIT_IOR_EXPR, uint64_type_node,
38988                               old_llu_and, new_llu_and);
38989
38990   tree fenv_update_mtfsf = build1 (VIEW_CONVERT_EXPR, double_type_node,
38991                                    new_llu_mask);
38992
38993   tree update_mtfsf = build_call_expr (mtfsf, 2,
38994                                        build_int_cst (unsigned_type_node, 0xff),
38995                                        fenv_update_mtfsf);
38996
38997   *update = build2 (COMPOUND_EXPR, void_type_node, update_mffs, update_mtfsf);
38998 }
38999
39000 void
39001 rs6000_generate_float2_double_code (rtx dst, rtx src1, rtx src2)
39002 {
39003   rtx rtx_tmp0, rtx_tmp1, rtx_tmp2, rtx_tmp3;
39004
39005   rtx_tmp0 = gen_reg_rtx (V2DFmode);
39006   rtx_tmp1 = gen_reg_rtx (V2DFmode);
39007
39008   /* The destination of the vmrgew instruction layout is:
39009      rtx_tmp2[0] rtx_tmp3[0] rtx_tmp2[1] rtx_tmp3[0].
39010      Setup rtx_tmp0 and rtx_tmp1 to ensure the order of the elements after the
39011      vmrgew instruction will be correct.  */
39012   if (BYTES_BIG_ENDIAN)
39013     {
39014        emit_insn (gen_vsx_xxpermdi_v2df_be (rtx_tmp0, src1, src2,
39015                                             GEN_INT (0)));
39016        emit_insn (gen_vsx_xxpermdi_v2df_be (rtx_tmp1, src1, src2,
39017                                             GEN_INT (3)));
39018     }
39019   else
39020     {
39021        emit_insn (gen_vsx_xxpermdi_v2df (rtx_tmp0, src1, src2, GEN_INT (3)));
39022        emit_insn (gen_vsx_xxpermdi_v2df (rtx_tmp1, src1, src2, GEN_INT (0)));
39023     }
39024
39025   rtx_tmp2 = gen_reg_rtx (V4SFmode);
39026   rtx_tmp3 = gen_reg_rtx (V4SFmode);
39027
39028   emit_insn (gen_vsx_xvcdpsp (rtx_tmp2, rtx_tmp0));
39029   emit_insn (gen_vsx_xvcdpsp (rtx_tmp3, rtx_tmp1));
39030
39031   if (BYTES_BIG_ENDIAN)
39032     emit_insn (gen_p8_vmrgew_v4sf (dst, rtx_tmp2, rtx_tmp3));
39033   else
39034     emit_insn (gen_p8_vmrgew_v4sf (dst, rtx_tmp3, rtx_tmp2));
39035 }
39036
39037 void
39038 rs6000_generate_float2_code (bool signed_convert, rtx dst, rtx src1, rtx src2)
39039 {
39040   rtx rtx_tmp0, rtx_tmp1, rtx_tmp2, rtx_tmp3;
39041
39042   rtx_tmp0 = gen_reg_rtx (V2DImode);
39043   rtx_tmp1 = gen_reg_rtx (V2DImode);
39044
39045   /* The destination of the vmrgew instruction layout is:
39046      rtx_tmp2[0] rtx_tmp3[0] rtx_tmp2[1] rtx_tmp3[0].
39047      Setup rtx_tmp0 and rtx_tmp1 to ensure the order of the elements after the
39048      vmrgew instruction will be correct.  */
39049   if (BYTES_BIG_ENDIAN)
39050     {
39051       emit_insn (gen_vsx_xxpermdi_v2di_be (rtx_tmp0, src1, src2, GEN_INT (0)));
39052       emit_insn (gen_vsx_xxpermdi_v2di_be (rtx_tmp1, src1, src2, GEN_INT (3)));
39053     }
39054   else
39055     {
39056       emit_insn (gen_vsx_xxpermdi_v2di (rtx_tmp0, src1, src2, GEN_INT (3)));
39057       emit_insn (gen_vsx_xxpermdi_v2di (rtx_tmp1, src1, src2, GEN_INT (0)));
39058     }
39059
39060   rtx_tmp2 = gen_reg_rtx (V4SFmode);
39061   rtx_tmp3 = gen_reg_rtx (V4SFmode);
39062
39063   if (signed_convert)
39064     {
39065       emit_insn (gen_vsx_xvcvsxdsp (rtx_tmp2, rtx_tmp0));
39066       emit_insn (gen_vsx_xvcvsxdsp (rtx_tmp3, rtx_tmp1));
39067     }
39068   else
39069     {
39070        emit_insn (gen_vsx_xvcvuxdsp (rtx_tmp2, rtx_tmp0));
39071        emit_insn (gen_vsx_xvcvuxdsp (rtx_tmp3, rtx_tmp1));
39072     }
39073
39074   if (BYTES_BIG_ENDIAN)
39075     emit_insn (gen_p8_vmrgew_v4sf (dst, rtx_tmp2, rtx_tmp3));
39076   else
39077     emit_insn (gen_p8_vmrgew_v4sf (dst, rtx_tmp3, rtx_tmp2));
39078 }
39079
39080 void
39081 rs6000_generate_vsigned2_code (bool signed_convert, rtx dst, rtx src1,
39082                                rtx src2)
39083 {
39084   rtx rtx_tmp0, rtx_tmp1, rtx_tmp2, rtx_tmp3;
39085
39086   rtx_tmp0 = gen_reg_rtx (V2DFmode);
39087   rtx_tmp1 = gen_reg_rtx (V2DFmode);
39088
39089   emit_insn (gen_vsx_xxpermdi_v2df (rtx_tmp0, src1, src2, GEN_INT (0)));
39090   emit_insn (gen_vsx_xxpermdi_v2df (rtx_tmp1, src1, src2, GEN_INT (3)));
39091
39092   rtx_tmp2 = gen_reg_rtx (V4SImode);
39093   rtx_tmp3 = gen_reg_rtx (V4SImode);
39094
39095   if (signed_convert)
39096     {
39097       emit_insn (gen_vsx_xvcvdpsxws (rtx_tmp2, rtx_tmp0));
39098       emit_insn (gen_vsx_xvcvdpsxws (rtx_tmp3, rtx_tmp1));
39099     }
39100   else
39101     {
39102       emit_insn (gen_vsx_xvcvdpuxws (rtx_tmp2, rtx_tmp0));
39103       emit_insn (gen_vsx_xvcvdpuxws (rtx_tmp3, rtx_tmp1));
39104     }
39105
39106   emit_insn (gen_p8_vmrgew_v4si (dst, rtx_tmp2, rtx_tmp3));
39107 }
39108
39109 /* Implement the TARGET_OPTAB_SUPPORTED_P hook.  */
39110
39111 static bool
39112 rs6000_optab_supported_p (int op, machine_mode mode1, machine_mode,
39113                           optimization_type opt_type)
39114 {
39115   switch (op)
39116     {
39117     case rsqrt_optab:
39118       return (opt_type == OPTIMIZE_FOR_SPEED
39119               && RS6000_RECIP_AUTO_RSQRTE_P (mode1));
39120
39121     default:
39122       return true;
39123     }
39124 }
39125
39126 /* Implement TARGET_CONSTANT_ALIGNMENT.  */
39127
39128 static HOST_WIDE_INT
39129 rs6000_constant_alignment (const_tree exp, HOST_WIDE_INT align)
39130 {
39131   if (TREE_CODE (exp) == STRING_CST
39132       && (STRICT_ALIGNMENT || !optimize_size))
39133     return MAX (align, BITS_PER_WORD);
39134   return align;
39135 }
39136
39137 /* Implement TARGET_STARTING_FRAME_OFFSET.  */
39138
39139 static HOST_WIDE_INT
39140 rs6000_starting_frame_offset (void)
39141 {
39142   if (FRAME_GROWS_DOWNWARD)
39143     return 0;
39144   return RS6000_STARTING_FRAME_OFFSET;
39145 }
39146 \f
39147
39148 /* Create an alias for a mangled name where we have changed the mangling (in
39149    GCC 8.1, we used U10__float128, and now we use u9__ieee128).  This is called
39150    via the target hook TARGET_ASM_GLOBALIZE_DECL_NAME.  */
39151
39152 #if TARGET_ELF && RS6000_WEAK
39153 static void
39154 rs6000_globalize_decl_name (FILE * stream, tree decl)
39155 {
39156   const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
39157
39158   targetm.asm_out.globalize_label (stream, name);
39159
39160   if (rs6000_passes_ieee128 && name[0] == '_' && name[1] == 'Z')
39161     {
39162       tree save_asm_name = DECL_ASSEMBLER_NAME (decl);
39163       const char *old_name;
39164
39165       ieee128_mangling_gcc_8_1 = true;
39166       lang_hooks.set_decl_assembler_name (decl);
39167       old_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
39168       SET_DECL_ASSEMBLER_NAME (decl, save_asm_name);
39169       ieee128_mangling_gcc_8_1 = false;
39170
39171       if (strcmp (name, old_name) != 0)
39172         {
39173           fprintf (stream, "\t.weak %s\n", old_name);
39174           fprintf (stream, "\t.set %s,%s\n", old_name, name);
39175         }
39176     }
39177 }
39178 #endif
39179
39180 \f
39181 /* On 64-bit Linux and Freebsd systems, possibly switch the long double library
39182    function names from <foo>l to <foo>f128 if the default long double type is
39183    IEEE 128-bit.  Typically, with the C and C++ languages, the standard math.h
39184    include file switches the names on systems that support long double as IEEE
39185    128-bit, but that doesn't work if the user uses __builtin_<foo>l directly.
39186    In the future, glibc will export names like __ieee128_sinf128 and we can
39187    switch to using those instead of using sinf128, which pollutes the user's
39188    namespace.
39189
39190    This will switch the names for Fortran math functions as well (which doesn't
39191    use math.h).  However, Fortran needs other changes to the compiler and
39192    library before you can switch the real*16 type at compile time.
39193
39194    We use the TARGET_MANGLE_DECL_ASSEMBLER_NAME hook to change this name.  We
39195    only do this if the default is that long double is IBM extended double, and
39196    the user asked for IEEE 128-bit.  */
39197
39198 static tree
39199 rs6000_mangle_decl_assembler_name (tree decl, tree id)
39200 {
39201   if (!TARGET_IEEEQUAD_DEFAULT && TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
39202       && TREE_CODE (decl) == FUNCTION_DECL && DECL_IS_BUILTIN (decl) )
39203     {
39204       size_t len = IDENTIFIER_LENGTH (id);
39205       const char *name = IDENTIFIER_POINTER (id);
39206
39207       if (name[len - 1] == 'l')
39208         {
39209           bool uses_ieee128_p = false;
39210           tree type = TREE_TYPE (decl);
39211           machine_mode ret_mode = TYPE_MODE (type);
39212
39213           /* See if the function returns a IEEE 128-bit floating point type or
39214              complex type.  */
39215           if (ret_mode == TFmode || ret_mode == TCmode)
39216             uses_ieee128_p = true;
39217           else
39218             {
39219               function_args_iterator args_iter;
39220               tree arg;
39221
39222               /* See if the function passes a IEEE 128-bit floating point type
39223                  or complex type.  */
39224               FOREACH_FUNCTION_ARGS (type, arg, args_iter)
39225                 {
39226                   machine_mode arg_mode = TYPE_MODE (arg);
39227                   if (arg_mode == TFmode || arg_mode == TCmode)
39228                     {
39229                       uses_ieee128_p = true;
39230                       break;
39231                     }
39232                 }
39233             }
39234
39235           /* If we passed or returned an IEEE 128-bit floating point type,
39236              change the name.  */
39237           if (uses_ieee128_p)
39238             {
39239               char *name2 = (char *) alloca (len + 4);
39240               memcpy (name2, name, len - 1);
39241               strcpy (name2 + len - 1, "f128");
39242               id = get_identifier (name2);
39243             }
39244         }
39245     }
39246
39247   return id;
39248 }
39249
39250 \f
39251 struct gcc_target targetm = TARGET_INITIALIZER;
39252
39253 #include "gt-rs6000.h"