rs6000: ws -> wa
[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            "wp reg_class = %s\n"
2515            "wq reg_class = %s\n"
2516            "wr reg_class = %s\n"
2517            "ww reg_class = %s\n"
2518            "wx reg_class = %s\n"
2519            "wA reg_class = %s\n"
2520            "\n",
2521            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_d]],
2522            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_f]],
2523            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_v]],
2524            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wa]],
2525            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wd]],
2526            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_we]],
2527            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wf]],
2528            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wp]],
2529            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wq]],
2530            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wr]],
2531            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_ww]],
2532            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wx]],
2533            reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wA]]);
2534
2535   nl = "\n";
2536   for (m = 0; m < NUM_MACHINE_MODES; ++m)
2537     rs6000_debug_print_mode (m);
2538
2539   fputs ("\n", stderr);
2540
2541   for (m1 = 0; m1 < ARRAY_SIZE (print_tieable_modes); m1++)
2542     {
2543       machine_mode mode1 = print_tieable_modes[m1];
2544       bool first_time = true;
2545
2546       nl = (const char *)0;
2547       for (m2 = 0; m2 < ARRAY_SIZE (print_tieable_modes); m2++)
2548         {
2549           machine_mode mode2 = print_tieable_modes[m2];
2550           if (mode1 != mode2 && rs6000_modes_tieable_p (mode1, mode2))
2551             {
2552               if (first_time)
2553                 {
2554                   fprintf (stderr, "Tieable modes %s:", GET_MODE_NAME (mode1));
2555                   nl = "\n";
2556                   first_time = false;
2557                 }
2558
2559               fprintf (stderr, " %s", GET_MODE_NAME (mode2));
2560             }
2561         }
2562
2563       if (!first_time)
2564         fputs ("\n", stderr);
2565     }
2566
2567   if (nl)
2568     fputs (nl, stderr);
2569
2570   if (rs6000_recip_control)
2571     {
2572       fprintf (stderr, "\nReciprocal mask = 0x%x\n", rs6000_recip_control);
2573
2574       for (m = 0; m < NUM_MACHINE_MODES; ++m)
2575         if (rs6000_recip_bits[m])
2576           {
2577             fprintf (stderr,
2578                      "Reciprocal estimate mode: %-5s divide: %s rsqrt: %s\n",
2579                      GET_MODE_NAME (m),
2580                      (RS6000_RECIP_AUTO_RE_P (m)
2581                       ? "auto"
2582                       : (RS6000_RECIP_HAVE_RE_P (m) ? "have" : "none")),
2583                      (RS6000_RECIP_AUTO_RSQRTE_P (m)
2584                       ? "auto"
2585                       : (RS6000_RECIP_HAVE_RSQRTE_P (m) ? "have" : "none")));
2586           }
2587
2588       fputs ("\n", stderr);
2589     }
2590
2591   if (rs6000_cpu_index >= 0)
2592     {
2593       const char *name = processor_target_table[rs6000_cpu_index].name;
2594       HOST_WIDE_INT flags
2595         = processor_target_table[rs6000_cpu_index].target_enable;
2596
2597       sprintf (flags_buffer, "-mcpu=%s flags", name);
2598       rs6000_print_isa_options (stderr, 0, flags_buffer, flags);
2599     }
2600   else
2601     fprintf (stderr, DEBUG_FMT_S, "cpu", "<none>");
2602
2603   if (rs6000_tune_index >= 0)
2604     {
2605       const char *name = processor_target_table[rs6000_tune_index].name;
2606       HOST_WIDE_INT flags
2607         = processor_target_table[rs6000_tune_index].target_enable;
2608
2609       sprintf (flags_buffer, "-mtune=%s flags", name);
2610       rs6000_print_isa_options (stderr, 0, flags_buffer, flags);
2611     }
2612   else
2613     fprintf (stderr, DEBUG_FMT_S, "tune", "<none>");
2614
2615   cl_target_option_save (&cl_opts, &global_options);
2616   rs6000_print_isa_options (stderr, 0, "rs6000_isa_flags",
2617                             rs6000_isa_flags);
2618
2619   rs6000_print_isa_options (stderr, 0, "rs6000_isa_flags_explicit",
2620                             rs6000_isa_flags_explicit);
2621
2622   rs6000_print_builtin_options (stderr, 0, "rs6000_builtin_mask",
2623                                 rs6000_builtin_mask);
2624
2625   rs6000_print_isa_options (stderr, 0, "TARGET_DEFAULT", TARGET_DEFAULT);
2626
2627   fprintf (stderr, DEBUG_FMT_S, "--with-cpu default",
2628            OPTION_TARGET_CPU_DEFAULT ? OPTION_TARGET_CPU_DEFAULT : "<none>");
2629
2630   switch (rs6000_sched_costly_dep)
2631     {
2632     case max_dep_latency:
2633       costly_str = "max_dep_latency";
2634       break;
2635
2636     case no_dep_costly:
2637       costly_str = "no_dep_costly";
2638       break;
2639
2640     case all_deps_costly:
2641       costly_str = "all_deps_costly";
2642       break;
2643
2644     case true_store_to_load_dep_costly:
2645       costly_str = "true_store_to_load_dep_costly";
2646       break;
2647
2648     case store_to_load_dep_costly:
2649       costly_str = "store_to_load_dep_costly";
2650       break;
2651
2652     default:
2653       costly_str = costly_num;
2654       sprintf (costly_num, "%d", (int)rs6000_sched_costly_dep);
2655       break;
2656     }
2657
2658   fprintf (stderr, DEBUG_FMT_S, "sched_costly_dep", costly_str);
2659
2660   switch (rs6000_sched_insert_nops)
2661     {
2662     case sched_finish_regroup_exact:
2663       nop_str = "sched_finish_regroup_exact";
2664       break;
2665
2666     case sched_finish_pad_groups:
2667       nop_str = "sched_finish_pad_groups";
2668       break;
2669
2670     case sched_finish_none:
2671       nop_str = "sched_finish_none";
2672       break;
2673
2674     default:
2675       nop_str = nop_num;
2676       sprintf (nop_num, "%d", (int)rs6000_sched_insert_nops);
2677       break;
2678     }
2679
2680   fprintf (stderr, DEBUG_FMT_S, "sched_insert_nops", nop_str);
2681
2682   switch (rs6000_sdata)
2683     {
2684     default:
2685     case SDATA_NONE:
2686       break;
2687
2688     case SDATA_DATA:
2689       fprintf (stderr, DEBUG_FMT_S, "sdata", "data");
2690       break;
2691
2692     case SDATA_SYSV:
2693       fprintf (stderr, DEBUG_FMT_S, "sdata", "sysv");
2694       break;
2695
2696     case SDATA_EABI:
2697       fprintf (stderr, DEBUG_FMT_S, "sdata", "eabi");
2698       break;
2699
2700     }
2701
2702   switch (rs6000_traceback)
2703     {
2704     case traceback_default:     trace_str = "default";  break;
2705     case traceback_none:        trace_str = "none";     break;
2706     case traceback_part:        trace_str = "part";     break;
2707     case traceback_full:        trace_str = "full";     break;
2708     default:                    trace_str = "unknown";  break;
2709     }
2710
2711   fprintf (stderr, DEBUG_FMT_S, "traceback", trace_str);
2712
2713   switch (rs6000_current_cmodel)
2714     {
2715     case CMODEL_SMALL:  cmodel_str = "small";   break;
2716     case CMODEL_MEDIUM: cmodel_str = "medium";  break;
2717     case CMODEL_LARGE:  cmodel_str = "large";   break;
2718     default:            cmodel_str = "unknown"; break;
2719     }
2720
2721   fprintf (stderr, DEBUG_FMT_S, "cmodel", cmodel_str);
2722
2723   switch (rs6000_current_abi)
2724     {
2725     case ABI_NONE:      abi_str = "none";       break;
2726     case ABI_AIX:       abi_str = "aix";        break;
2727     case ABI_ELFv2:     abi_str = "ELFv2";      break;
2728     case ABI_V4:        abi_str = "V4";         break;
2729     case ABI_DARWIN:    abi_str = "darwin";     break;
2730     default:            abi_str = "unknown";    break;
2731     }
2732
2733   fprintf (stderr, DEBUG_FMT_S, "abi", abi_str);
2734
2735   if (rs6000_altivec_abi)
2736     fprintf (stderr, DEBUG_FMT_S, "altivec_abi", "true");
2737
2738   if (rs6000_darwin64_abi)
2739     fprintf (stderr, DEBUG_FMT_S, "darwin64_abi", "true");
2740
2741   fprintf (stderr, DEBUG_FMT_S, "soft_float",
2742            (TARGET_SOFT_FLOAT ? "true" : "false"));
2743
2744   if (TARGET_LINK_STACK)
2745     fprintf (stderr, DEBUG_FMT_S, "link_stack", "true");
2746
2747   if (TARGET_P8_FUSION)
2748     {
2749       char options[80];
2750
2751       strcpy (options, "power8");
2752       if (TARGET_P8_FUSION_SIGN)
2753         strcat (options, ", sign");
2754
2755       fprintf (stderr, DEBUG_FMT_S, "fusion", options);
2756     }
2757
2758   fprintf (stderr, DEBUG_FMT_S, "plt-format",
2759            TARGET_SECURE_PLT ? "secure" : "bss");
2760   fprintf (stderr, DEBUG_FMT_S, "struct-return",
2761            aix_struct_return ? "aix" : "sysv");
2762   fprintf (stderr, DEBUG_FMT_S, "always_hint", tf[!!rs6000_always_hint]);
2763   fprintf (stderr, DEBUG_FMT_S, "sched_groups", tf[!!rs6000_sched_groups]);
2764   fprintf (stderr, DEBUG_FMT_S, "align_branch",
2765            tf[!!rs6000_align_branch_targets]);
2766   fprintf (stderr, DEBUG_FMT_D, "tls_size", rs6000_tls_size);
2767   fprintf (stderr, DEBUG_FMT_D, "long_double_size",
2768            rs6000_long_double_type_size);
2769   if (rs6000_long_double_type_size > 64)
2770     {
2771       fprintf (stderr, DEBUG_FMT_S, "long double type",
2772                TARGET_IEEEQUAD ? "IEEE" : "IBM");
2773       fprintf (stderr, DEBUG_FMT_S, "default long double type",
2774                TARGET_IEEEQUAD_DEFAULT ? "IEEE" : "IBM");
2775     }
2776   fprintf (stderr, DEBUG_FMT_D, "sched_restricted_insns_priority",
2777            (int)rs6000_sched_restricted_insns_priority);
2778   fprintf (stderr, DEBUG_FMT_D, "Number of standard builtins",
2779            (int)END_BUILTINS);
2780   fprintf (stderr, DEBUG_FMT_D, "Number of rs6000 builtins",
2781            (int)RS6000_BUILTIN_COUNT);
2782
2783   fprintf (stderr, DEBUG_FMT_D, "Enable float128 on VSX",
2784            (int)TARGET_FLOAT128_ENABLE_TYPE);
2785
2786   if (TARGET_VSX)
2787     fprintf (stderr, DEBUG_FMT_D, "VSX easy 64-bit scalar element",
2788              (int)VECTOR_ELEMENT_SCALAR_64BIT);
2789
2790   if (TARGET_DIRECT_MOVE_128)
2791     fprintf (stderr, DEBUG_FMT_D, "VSX easy 64-bit mfvsrld element",
2792              (int)VECTOR_ELEMENT_MFVSRLD_64BIT);
2793 }
2794
2795 \f
2796 /* Update the addr mask bits in reg_addr to help secondary reload and go if
2797    legitimate address support to figure out the appropriate addressing to
2798    use.  */
2799
2800 static void
2801 rs6000_setup_reg_addr_masks (void)
2802 {
2803   ssize_t rc, reg, m, nregs;
2804   addr_mask_type any_addr_mask, addr_mask;
2805
2806   for (m = 0; m < NUM_MACHINE_MODES; ++m)
2807     {
2808       machine_mode m2 = (machine_mode) m;
2809       bool complex_p = false;
2810       bool small_int_p = (m2 == QImode || m2 == HImode || m2 == SImode);
2811       size_t msize;
2812
2813       if (COMPLEX_MODE_P (m2))
2814         {
2815           complex_p = true;
2816           m2 = GET_MODE_INNER (m2);
2817         }
2818
2819       msize = GET_MODE_SIZE (m2);
2820
2821       /* SDmode is special in that we want to access it only via REG+REG
2822          addressing on power7 and above, since we want to use the LFIWZX and
2823          STFIWZX instructions to load it.  */
2824       bool indexed_only_p = (m == SDmode && TARGET_NO_SDMODE_STACK);
2825
2826       any_addr_mask = 0;
2827       for (rc = FIRST_RELOAD_REG_CLASS; rc <= LAST_RELOAD_REG_CLASS; rc++)
2828         {
2829           addr_mask = 0;
2830           reg = reload_reg_map[rc].reg;
2831
2832           /* Can mode values go in the GPR/FPR/Altivec registers?  */
2833           if (reg >= 0 && rs6000_hard_regno_mode_ok_p[m][reg])
2834             {
2835               bool small_int_vsx_p = (small_int_p
2836                                       && (rc == RELOAD_REG_FPR
2837                                           || rc == RELOAD_REG_VMX));
2838
2839               nregs = rs6000_hard_regno_nregs[m][reg];
2840               addr_mask |= RELOAD_REG_VALID;
2841
2842               /* Indicate if the mode takes more than 1 physical register.  If
2843                  it takes a single register, indicate it can do REG+REG
2844                  addressing.  Small integers in VSX registers can only do
2845                  REG+REG addressing.  */
2846               if (small_int_vsx_p)
2847                 addr_mask |= RELOAD_REG_INDEXED;
2848               else if (nregs > 1 || m == BLKmode || complex_p)
2849                 addr_mask |= RELOAD_REG_MULTIPLE;
2850               else
2851                 addr_mask |= RELOAD_REG_INDEXED;
2852
2853               /* Figure out if we can do PRE_INC, PRE_DEC, or PRE_MODIFY
2854                  addressing.  If we allow scalars into Altivec registers,
2855                  don't allow PRE_INC, PRE_DEC, or PRE_MODIFY.
2856
2857                  For VSX systems, we don't allow update addressing for
2858                  DFmode/SFmode if those registers can go in both the
2859                  traditional floating point registers and Altivec registers.
2860                  The load/store instructions for the Altivec registers do not
2861                  have update forms.  If we allowed update addressing, it seems
2862                  to break IV-OPT code using floating point if the index type is
2863                  int instead of long (PR target/81550 and target/84042).  */
2864
2865               if (TARGET_UPDATE
2866                   && (rc == RELOAD_REG_GPR || rc == RELOAD_REG_FPR)
2867                   && msize <= 8
2868                   && !VECTOR_MODE_P (m2)
2869                   && !FLOAT128_VECTOR_P (m2)
2870                   && !complex_p
2871                   && (m != E_DFmode || !TARGET_VSX)
2872                   && (m != E_SFmode || !TARGET_P8_VECTOR)
2873                   && !small_int_vsx_p)
2874                 {
2875                   addr_mask |= RELOAD_REG_PRE_INCDEC;
2876
2877                   /* PRE_MODIFY is more restricted than PRE_INC/PRE_DEC in that
2878                      we don't allow PRE_MODIFY for some multi-register
2879                      operations.  */
2880                   switch (m)
2881                     {
2882                     default:
2883                       addr_mask |= RELOAD_REG_PRE_MODIFY;
2884                       break;
2885
2886                     case E_DImode:
2887                       if (TARGET_POWERPC64)
2888                         addr_mask |= RELOAD_REG_PRE_MODIFY;
2889                       break;
2890
2891                     case E_DFmode:
2892                     case E_DDmode:
2893                       if (TARGET_HARD_FLOAT)
2894                         addr_mask |= RELOAD_REG_PRE_MODIFY;
2895                       break;
2896                     }
2897                 }
2898             }
2899
2900           /* GPR and FPR registers can do REG+OFFSET addressing, except
2901              possibly for SDmode.  ISA 3.0 (i.e. power9) adds D-form addressing
2902              for 64-bit scalars and 32-bit SFmode to altivec registers.  */
2903           if ((addr_mask != 0) && !indexed_only_p
2904               && msize <= 8
2905               && (rc == RELOAD_REG_GPR
2906                   || ((msize == 8 || m2 == SFmode)
2907                       && (rc == RELOAD_REG_FPR
2908                           || (rc == RELOAD_REG_VMX && TARGET_P9_VECTOR)))))
2909             addr_mask |= RELOAD_REG_OFFSET;
2910
2911           /* VSX registers can do REG+OFFSET addresssing if ISA 3.0
2912              instructions are enabled.  The offset for 128-bit VSX registers is
2913              only 12-bits.  While GPRs can handle the full offset range, VSX
2914              registers can only handle the restricted range.  */
2915           else if ((addr_mask != 0) && !indexed_only_p
2916                    && msize == 16 && TARGET_P9_VECTOR
2917                    && (ALTIVEC_OR_VSX_VECTOR_MODE (m2)
2918                        || (m2 == TImode && TARGET_VSX)))
2919             {
2920               addr_mask |= RELOAD_REG_OFFSET;
2921               if (rc == RELOAD_REG_FPR || rc == RELOAD_REG_VMX)
2922                 addr_mask |= RELOAD_REG_QUAD_OFFSET;
2923             }
2924
2925           /* VMX registers can do (REG & -16) and ((REG+REG) & -16)
2926              addressing on 128-bit types.  */
2927           if (rc == RELOAD_REG_VMX && msize == 16
2928               && (addr_mask & RELOAD_REG_VALID) != 0)
2929             addr_mask |= RELOAD_REG_AND_M16;
2930
2931           reg_addr[m].addr_mask[rc] = addr_mask;
2932           any_addr_mask |= addr_mask;
2933         }
2934
2935       reg_addr[m].addr_mask[RELOAD_REG_ANY] = any_addr_mask;
2936     }
2937 }
2938
2939 \f
2940 /* Initialize the various global tables that are based on register size.  */
2941 static void
2942 rs6000_init_hard_regno_mode_ok (bool global_init_p)
2943 {
2944   ssize_t r, m, c;
2945   int align64;
2946   int align32;
2947
2948   /* Precalculate REGNO_REG_CLASS.  */
2949   rs6000_regno_regclass[0] = GENERAL_REGS;
2950   for (r = 1; r < 32; ++r)
2951     rs6000_regno_regclass[r] = BASE_REGS;
2952
2953   for (r = 32; r < 64; ++r)
2954     rs6000_regno_regclass[r] = FLOAT_REGS;
2955
2956   for (r = 64; HARD_REGISTER_NUM_P (r); ++r)
2957     rs6000_regno_regclass[r] = NO_REGS;
2958
2959   for (r = FIRST_ALTIVEC_REGNO; r <= LAST_ALTIVEC_REGNO; ++r)
2960     rs6000_regno_regclass[r] = ALTIVEC_REGS;
2961
2962   rs6000_regno_regclass[CR0_REGNO] = CR0_REGS;
2963   for (r = CR1_REGNO; r <= CR7_REGNO; ++r)
2964     rs6000_regno_regclass[r] = CR_REGS;
2965
2966   rs6000_regno_regclass[LR_REGNO] = LINK_REGS;
2967   rs6000_regno_regclass[CTR_REGNO] = CTR_REGS;
2968   rs6000_regno_regclass[CA_REGNO] = NO_REGS;
2969   rs6000_regno_regclass[VRSAVE_REGNO] = VRSAVE_REGS;
2970   rs6000_regno_regclass[VSCR_REGNO] = VRSAVE_REGS;
2971   rs6000_regno_regclass[ARG_POINTER_REGNUM] = BASE_REGS;
2972   rs6000_regno_regclass[FRAME_POINTER_REGNUM] = BASE_REGS;
2973
2974   /* Precalculate register class to simpler reload register class.  We don't
2975      need all of the register classes that are combinations of different
2976      classes, just the simple ones that have constraint letters.  */
2977   for (c = 0; c < N_REG_CLASSES; c++)
2978     reg_class_to_reg_type[c] = NO_REG_TYPE;
2979
2980   reg_class_to_reg_type[(int)GENERAL_REGS] = GPR_REG_TYPE;
2981   reg_class_to_reg_type[(int)BASE_REGS] = GPR_REG_TYPE;
2982   reg_class_to_reg_type[(int)VSX_REGS] = VSX_REG_TYPE;
2983   reg_class_to_reg_type[(int)VRSAVE_REGS] = SPR_REG_TYPE;
2984   reg_class_to_reg_type[(int)VSCR_REGS] = SPR_REG_TYPE;
2985   reg_class_to_reg_type[(int)LINK_REGS] = SPR_REG_TYPE;
2986   reg_class_to_reg_type[(int)CTR_REGS] = SPR_REG_TYPE;
2987   reg_class_to_reg_type[(int)LINK_OR_CTR_REGS] = SPR_REG_TYPE;
2988   reg_class_to_reg_type[(int)CR_REGS] = CR_REG_TYPE;
2989   reg_class_to_reg_type[(int)CR0_REGS] = CR_REG_TYPE;
2990
2991   if (TARGET_VSX)
2992     {
2993       reg_class_to_reg_type[(int)FLOAT_REGS] = VSX_REG_TYPE;
2994       reg_class_to_reg_type[(int)ALTIVEC_REGS] = VSX_REG_TYPE;
2995     }
2996   else
2997     {
2998       reg_class_to_reg_type[(int)FLOAT_REGS] = FPR_REG_TYPE;
2999       reg_class_to_reg_type[(int)ALTIVEC_REGS] = ALTIVEC_REG_TYPE;
3000     }
3001
3002   /* Precalculate the valid memory formats as well as the vector information,
3003      this must be set up before the rs6000_hard_regno_nregs_internal calls
3004      below.  */
3005   gcc_assert ((int)VECTOR_NONE == 0);
3006   memset ((void *) &rs6000_vector_unit[0], '\0', sizeof (rs6000_vector_unit));
3007   memset ((void *) &rs6000_vector_mem[0], '\0', sizeof (rs6000_vector_mem));
3008
3009   gcc_assert ((int)CODE_FOR_nothing == 0);
3010   memset ((void *) &reg_addr[0], '\0', sizeof (reg_addr));
3011
3012   gcc_assert ((int)NO_REGS == 0);
3013   memset ((void *) &rs6000_constraints[0], '\0', sizeof (rs6000_constraints));
3014
3015   /* The VSX hardware allows native alignment for vectors, but control whether the compiler
3016      believes it can use native alignment or still uses 128-bit alignment.  */
3017   if (TARGET_VSX && !TARGET_VSX_ALIGN_128)
3018     {
3019       align64 = 64;
3020       align32 = 32;
3021     }
3022   else
3023     {
3024       align64 = 128;
3025       align32 = 128;
3026     }
3027
3028   /* KF mode (IEEE 128-bit in VSX registers).  We do not have arithmetic, so
3029      only set the memory modes.  Include TFmode if -mabi=ieeelongdouble.  */
3030   if (TARGET_FLOAT128_TYPE)
3031     {
3032       rs6000_vector_mem[KFmode] = VECTOR_VSX;
3033       rs6000_vector_align[KFmode] = 128;
3034
3035       if (FLOAT128_IEEE_P (TFmode))
3036         {
3037           rs6000_vector_mem[TFmode] = VECTOR_VSX;
3038           rs6000_vector_align[TFmode] = 128;
3039         }
3040     }
3041
3042   /* V2DF mode, VSX only.  */
3043   if (TARGET_VSX)
3044     {
3045       rs6000_vector_unit[V2DFmode] = VECTOR_VSX;
3046       rs6000_vector_mem[V2DFmode] = VECTOR_VSX;
3047       rs6000_vector_align[V2DFmode] = align64;
3048     }
3049
3050   /* V4SF mode, either VSX or Altivec.  */
3051   if (TARGET_VSX)
3052     {
3053       rs6000_vector_unit[V4SFmode] = VECTOR_VSX;
3054       rs6000_vector_mem[V4SFmode] = VECTOR_VSX;
3055       rs6000_vector_align[V4SFmode] = align32;
3056     }
3057   else if (TARGET_ALTIVEC)
3058     {
3059       rs6000_vector_unit[V4SFmode] = VECTOR_ALTIVEC;
3060       rs6000_vector_mem[V4SFmode] = VECTOR_ALTIVEC;
3061       rs6000_vector_align[V4SFmode] = align32;
3062     }
3063
3064   /* V16QImode, V8HImode, V4SImode are Altivec only, but possibly do VSX loads
3065      and stores. */
3066   if (TARGET_ALTIVEC)
3067     {
3068       rs6000_vector_unit[V4SImode] = VECTOR_ALTIVEC;
3069       rs6000_vector_unit[V8HImode] = VECTOR_ALTIVEC;
3070       rs6000_vector_unit[V16QImode] = VECTOR_ALTIVEC;
3071       rs6000_vector_align[V4SImode] = align32;
3072       rs6000_vector_align[V8HImode] = align32;
3073       rs6000_vector_align[V16QImode] = align32;
3074
3075       if (TARGET_VSX)
3076         {
3077           rs6000_vector_mem[V4SImode] = VECTOR_VSX;
3078           rs6000_vector_mem[V8HImode] = VECTOR_VSX;
3079           rs6000_vector_mem[V16QImode] = VECTOR_VSX;
3080         }
3081       else
3082         {
3083           rs6000_vector_mem[V4SImode] = VECTOR_ALTIVEC;
3084           rs6000_vector_mem[V8HImode] = VECTOR_ALTIVEC;
3085           rs6000_vector_mem[V16QImode] = VECTOR_ALTIVEC;
3086         }
3087     }
3088
3089   /* V2DImode, full mode depends on ISA 2.07 vector mode.  Allow under VSX to
3090      do insert/splat/extract.  Altivec doesn't have 64-bit integer support.  */
3091   if (TARGET_VSX)
3092     {
3093       rs6000_vector_mem[V2DImode] = VECTOR_VSX;
3094       rs6000_vector_unit[V2DImode]
3095         = (TARGET_P8_VECTOR) ? VECTOR_P8_VECTOR : VECTOR_NONE;
3096       rs6000_vector_align[V2DImode] = align64;
3097
3098       rs6000_vector_mem[V1TImode] = VECTOR_VSX;
3099       rs6000_vector_unit[V1TImode]
3100         = (TARGET_P8_VECTOR) ? VECTOR_P8_VECTOR : VECTOR_NONE;
3101       rs6000_vector_align[V1TImode] = 128;
3102     }
3103
3104   /* DFmode, see if we want to use the VSX unit.  Memory is handled
3105      differently, so don't set rs6000_vector_mem.  */
3106   if (TARGET_VSX)
3107     {
3108       rs6000_vector_unit[DFmode] = VECTOR_VSX;
3109       rs6000_vector_align[DFmode] = 64;
3110     }
3111
3112   /* SFmode, see if we want to use the VSX unit.  */
3113   if (TARGET_P8_VECTOR)
3114     {
3115       rs6000_vector_unit[SFmode] = VECTOR_VSX;
3116       rs6000_vector_align[SFmode] = 32;
3117     }
3118
3119   /* Allow TImode in VSX register and set the VSX memory macros.  */
3120   if (TARGET_VSX)
3121     {
3122       rs6000_vector_mem[TImode] = VECTOR_VSX;
3123       rs6000_vector_align[TImode] = align64;
3124     }
3125
3126   /* Register class constraints for the constraints that depend on compile
3127      switches. When the VSX code was added, different constraints were added
3128      based on the type (DFmode, V2DFmode, V4SFmode).  For the vector types, all
3129      of the VSX registers are used.  The register classes for scalar floating
3130      point types is set, based on whether we allow that type into the upper
3131      (Altivec) registers.  GCC has register classes to target the Altivec
3132      registers for load/store operations, to select using a VSX memory
3133      operation instead of the traditional floating point operation.  The
3134      constraints are:
3135
3136         d  - Register class to use with traditional DFmode instructions.
3137         f  - Register class to use with traditional SFmode instructions.
3138         v  - Altivec register.
3139         wa - Any VSX register.
3140         wc - Reserved to represent individual CR bits (used in LLVM).
3141         wd - Preferred register class for V2DFmode.
3142         wf - Preferred register class for V4SFmode.
3143         wn - always NO_REGS.
3144         wr - GPR if 64-bit mode is permitted.
3145         ww - Register class to do SF conversions in with VSX operations.
3146         wx - Float register if we can do 32-bit int stores.  */
3147
3148   if (TARGET_HARD_FLOAT)
3149     {
3150       rs6000_constraints[RS6000_CONSTRAINT_f] = FLOAT_REGS;     /* SFmode  */
3151       rs6000_constraints[RS6000_CONSTRAINT_d] = FLOAT_REGS;     /* DFmode  */
3152     }
3153
3154   if (TARGET_VSX)
3155     {
3156       rs6000_constraints[RS6000_CONSTRAINT_wa] = VSX_REGS;
3157       rs6000_constraints[RS6000_CONSTRAINT_wd] = VSX_REGS;      /* V2DFmode  */
3158       rs6000_constraints[RS6000_CONSTRAINT_wf] = VSX_REGS;      /* V4SFmode  */
3159     }
3160
3161   /* Add conditional constraints based on various options, to allow us to
3162      collapse multiple insn patterns.  */
3163   if (TARGET_ALTIVEC)
3164     rs6000_constraints[RS6000_CONSTRAINT_v] = ALTIVEC_REGS;
3165
3166   if (TARGET_POWERPC64)
3167     {
3168       rs6000_constraints[RS6000_CONSTRAINT_wr] = GENERAL_REGS;
3169       rs6000_constraints[RS6000_CONSTRAINT_wA] = BASE_REGS;
3170     }
3171
3172   if (TARGET_P8_VECTOR)                                         /* SFmode  */
3173     rs6000_constraints[RS6000_CONSTRAINT_ww] = VSX_REGS;
3174   else if (TARGET_VSX)
3175     rs6000_constraints[RS6000_CONSTRAINT_ww] = FLOAT_REGS;
3176
3177   if (TARGET_STFIWX)
3178     rs6000_constraints[RS6000_CONSTRAINT_wx] = FLOAT_REGS;      /* DImode  */
3179
3180   if (TARGET_FLOAT128_TYPE)
3181     {
3182       rs6000_constraints[RS6000_CONSTRAINT_wq] = VSX_REGS;      /* KFmode  */
3183       if (FLOAT128_IEEE_P (TFmode))
3184         rs6000_constraints[RS6000_CONSTRAINT_wp] = VSX_REGS;    /* TFmode  */
3185     }
3186
3187   /* Support for new direct moves (ISA 3.0 + 64bit).  */
3188   if (TARGET_DIRECT_MOVE_128)
3189     rs6000_constraints[RS6000_CONSTRAINT_we] = VSX_REGS;
3190
3191   /* Set up the reload helper and direct move functions.  */
3192   if (TARGET_VSX || TARGET_ALTIVEC)
3193     {
3194       if (TARGET_64BIT)
3195         {
3196           reg_addr[V16QImode].reload_store = CODE_FOR_reload_v16qi_di_store;
3197           reg_addr[V16QImode].reload_load  = CODE_FOR_reload_v16qi_di_load;
3198           reg_addr[V8HImode].reload_store  = CODE_FOR_reload_v8hi_di_store;
3199           reg_addr[V8HImode].reload_load   = CODE_FOR_reload_v8hi_di_load;
3200           reg_addr[V4SImode].reload_store  = CODE_FOR_reload_v4si_di_store;
3201           reg_addr[V4SImode].reload_load   = CODE_FOR_reload_v4si_di_load;
3202           reg_addr[V2DImode].reload_store  = CODE_FOR_reload_v2di_di_store;
3203           reg_addr[V2DImode].reload_load   = CODE_FOR_reload_v2di_di_load;
3204           reg_addr[V1TImode].reload_store  = CODE_FOR_reload_v1ti_di_store;
3205           reg_addr[V1TImode].reload_load   = CODE_FOR_reload_v1ti_di_load;
3206           reg_addr[V4SFmode].reload_store  = CODE_FOR_reload_v4sf_di_store;
3207           reg_addr[V4SFmode].reload_load   = CODE_FOR_reload_v4sf_di_load;
3208           reg_addr[V2DFmode].reload_store  = CODE_FOR_reload_v2df_di_store;
3209           reg_addr[V2DFmode].reload_load   = CODE_FOR_reload_v2df_di_load;
3210           reg_addr[DFmode].reload_store    = CODE_FOR_reload_df_di_store;
3211           reg_addr[DFmode].reload_load     = CODE_FOR_reload_df_di_load;
3212           reg_addr[DDmode].reload_store    = CODE_FOR_reload_dd_di_store;
3213           reg_addr[DDmode].reload_load     = CODE_FOR_reload_dd_di_load;
3214           reg_addr[SFmode].reload_store    = CODE_FOR_reload_sf_di_store;
3215           reg_addr[SFmode].reload_load     = CODE_FOR_reload_sf_di_load;
3216
3217           if (FLOAT128_VECTOR_P (KFmode))
3218             {
3219               reg_addr[KFmode].reload_store = CODE_FOR_reload_kf_di_store;
3220               reg_addr[KFmode].reload_load  = CODE_FOR_reload_kf_di_load;
3221             }
3222
3223           if (FLOAT128_VECTOR_P (TFmode))
3224             {
3225               reg_addr[TFmode].reload_store = CODE_FOR_reload_tf_di_store;
3226               reg_addr[TFmode].reload_load  = CODE_FOR_reload_tf_di_load;
3227             }
3228
3229           /* Only provide a reload handler for SDmode if lfiwzx/stfiwx are
3230              available.  */
3231           if (TARGET_NO_SDMODE_STACK)
3232             {
3233               reg_addr[SDmode].reload_store = CODE_FOR_reload_sd_di_store;
3234               reg_addr[SDmode].reload_load  = CODE_FOR_reload_sd_di_load;
3235             }
3236
3237           if (TARGET_VSX)
3238             {
3239               reg_addr[TImode].reload_store  = CODE_FOR_reload_ti_di_store;
3240               reg_addr[TImode].reload_load   = CODE_FOR_reload_ti_di_load;
3241             }
3242
3243           if (TARGET_DIRECT_MOVE && !TARGET_DIRECT_MOVE_128)
3244             {
3245               reg_addr[TImode].reload_gpr_vsx    = CODE_FOR_reload_gpr_from_vsxti;
3246               reg_addr[V1TImode].reload_gpr_vsx  = CODE_FOR_reload_gpr_from_vsxv1ti;
3247               reg_addr[V2DFmode].reload_gpr_vsx  = CODE_FOR_reload_gpr_from_vsxv2df;
3248               reg_addr[V2DImode].reload_gpr_vsx  = CODE_FOR_reload_gpr_from_vsxv2di;
3249               reg_addr[V4SFmode].reload_gpr_vsx  = CODE_FOR_reload_gpr_from_vsxv4sf;
3250               reg_addr[V4SImode].reload_gpr_vsx  = CODE_FOR_reload_gpr_from_vsxv4si;
3251               reg_addr[V8HImode].reload_gpr_vsx  = CODE_FOR_reload_gpr_from_vsxv8hi;
3252               reg_addr[V16QImode].reload_gpr_vsx = CODE_FOR_reload_gpr_from_vsxv16qi;
3253               reg_addr[SFmode].reload_gpr_vsx    = CODE_FOR_reload_gpr_from_vsxsf;
3254
3255               reg_addr[TImode].reload_vsx_gpr    = CODE_FOR_reload_vsx_from_gprti;
3256               reg_addr[V1TImode].reload_vsx_gpr  = CODE_FOR_reload_vsx_from_gprv1ti;
3257               reg_addr[V2DFmode].reload_vsx_gpr  = CODE_FOR_reload_vsx_from_gprv2df;
3258               reg_addr[V2DImode].reload_vsx_gpr  = CODE_FOR_reload_vsx_from_gprv2di;
3259               reg_addr[V4SFmode].reload_vsx_gpr  = CODE_FOR_reload_vsx_from_gprv4sf;
3260               reg_addr[V4SImode].reload_vsx_gpr  = CODE_FOR_reload_vsx_from_gprv4si;
3261               reg_addr[V8HImode].reload_vsx_gpr  = CODE_FOR_reload_vsx_from_gprv8hi;
3262               reg_addr[V16QImode].reload_vsx_gpr = CODE_FOR_reload_vsx_from_gprv16qi;
3263               reg_addr[SFmode].reload_vsx_gpr    = CODE_FOR_reload_vsx_from_gprsf;
3264
3265               if (FLOAT128_VECTOR_P (KFmode))
3266                 {
3267                   reg_addr[KFmode].reload_gpr_vsx = CODE_FOR_reload_gpr_from_vsxkf;
3268                   reg_addr[KFmode].reload_vsx_gpr = CODE_FOR_reload_vsx_from_gprkf;
3269                 }
3270
3271               if (FLOAT128_VECTOR_P (TFmode))
3272                 {
3273                   reg_addr[TFmode].reload_gpr_vsx = CODE_FOR_reload_gpr_from_vsxtf;
3274                   reg_addr[TFmode].reload_vsx_gpr = CODE_FOR_reload_vsx_from_gprtf;
3275                 }
3276             }
3277         }
3278       else
3279         {
3280           reg_addr[V16QImode].reload_store = CODE_FOR_reload_v16qi_si_store;
3281           reg_addr[V16QImode].reload_load  = CODE_FOR_reload_v16qi_si_load;
3282           reg_addr[V8HImode].reload_store  = CODE_FOR_reload_v8hi_si_store;
3283           reg_addr[V8HImode].reload_load   = CODE_FOR_reload_v8hi_si_load;
3284           reg_addr[V4SImode].reload_store  = CODE_FOR_reload_v4si_si_store;
3285           reg_addr[V4SImode].reload_load   = CODE_FOR_reload_v4si_si_load;
3286           reg_addr[V2DImode].reload_store  = CODE_FOR_reload_v2di_si_store;
3287           reg_addr[V2DImode].reload_load   = CODE_FOR_reload_v2di_si_load;
3288           reg_addr[V1TImode].reload_store  = CODE_FOR_reload_v1ti_si_store;
3289           reg_addr[V1TImode].reload_load   = CODE_FOR_reload_v1ti_si_load;
3290           reg_addr[V4SFmode].reload_store  = CODE_FOR_reload_v4sf_si_store;
3291           reg_addr[V4SFmode].reload_load   = CODE_FOR_reload_v4sf_si_load;
3292           reg_addr[V2DFmode].reload_store  = CODE_FOR_reload_v2df_si_store;
3293           reg_addr[V2DFmode].reload_load   = CODE_FOR_reload_v2df_si_load;
3294           reg_addr[DFmode].reload_store    = CODE_FOR_reload_df_si_store;
3295           reg_addr[DFmode].reload_load     = CODE_FOR_reload_df_si_load;
3296           reg_addr[DDmode].reload_store    = CODE_FOR_reload_dd_si_store;
3297           reg_addr[DDmode].reload_load     = CODE_FOR_reload_dd_si_load;
3298           reg_addr[SFmode].reload_store    = CODE_FOR_reload_sf_si_store;
3299           reg_addr[SFmode].reload_load     = CODE_FOR_reload_sf_si_load;
3300
3301           if (FLOAT128_VECTOR_P (KFmode))
3302             {
3303               reg_addr[KFmode].reload_store = CODE_FOR_reload_kf_si_store;
3304               reg_addr[KFmode].reload_load  = CODE_FOR_reload_kf_si_load;
3305             }
3306
3307           if (FLOAT128_IEEE_P (TFmode))
3308             {
3309               reg_addr[TFmode].reload_store = CODE_FOR_reload_tf_si_store;
3310               reg_addr[TFmode].reload_load  = CODE_FOR_reload_tf_si_load;
3311             }
3312
3313           /* Only provide a reload handler for SDmode if lfiwzx/stfiwx are
3314              available.  */
3315           if (TARGET_NO_SDMODE_STACK)
3316             {
3317               reg_addr[SDmode].reload_store = CODE_FOR_reload_sd_si_store;
3318               reg_addr[SDmode].reload_load  = CODE_FOR_reload_sd_si_load;
3319             }
3320
3321           if (TARGET_VSX)
3322             {
3323               reg_addr[TImode].reload_store  = CODE_FOR_reload_ti_si_store;
3324               reg_addr[TImode].reload_load   = CODE_FOR_reload_ti_si_load;
3325             }
3326
3327           if (TARGET_DIRECT_MOVE)
3328             {
3329               reg_addr[DImode].reload_fpr_gpr = CODE_FOR_reload_fpr_from_gprdi;
3330               reg_addr[DDmode].reload_fpr_gpr = CODE_FOR_reload_fpr_from_gprdd;
3331               reg_addr[DFmode].reload_fpr_gpr = CODE_FOR_reload_fpr_from_gprdf;
3332             }
3333         }
3334
3335       reg_addr[DFmode].scalar_in_vmx_p = true;
3336       reg_addr[DImode].scalar_in_vmx_p = true;
3337
3338       if (TARGET_P8_VECTOR)
3339         {
3340           reg_addr[SFmode].scalar_in_vmx_p = true;
3341           reg_addr[SImode].scalar_in_vmx_p = true;
3342
3343           if (TARGET_P9_VECTOR)
3344             {
3345               reg_addr[HImode].scalar_in_vmx_p = true;
3346               reg_addr[QImode].scalar_in_vmx_p = true;
3347             }
3348         }
3349     }
3350
3351   /* Precalculate HARD_REGNO_NREGS.  */
3352   for (r = 0; HARD_REGISTER_NUM_P (r); ++r)
3353     for (m = 0; m < NUM_MACHINE_MODES; ++m)
3354       rs6000_hard_regno_nregs[m][r]
3355         = rs6000_hard_regno_nregs_internal (r, (machine_mode) m);
3356
3357   /* Precalculate TARGET_HARD_REGNO_MODE_OK.  */
3358   for (r = 0; HARD_REGISTER_NUM_P (r); ++r)
3359     for (m = 0; m < NUM_MACHINE_MODES; ++m)
3360       rs6000_hard_regno_mode_ok_p[m][r]
3361         = rs6000_hard_regno_mode_ok_uncached (r, (machine_mode) m);
3362
3363   /* Precalculate CLASS_MAX_NREGS sizes.  */
3364   for (c = 0; c < LIM_REG_CLASSES; ++c)
3365     {
3366       int reg_size;
3367
3368       if (TARGET_VSX && VSX_REG_CLASS_P (c))
3369         reg_size = UNITS_PER_VSX_WORD;
3370
3371       else if (c == ALTIVEC_REGS)
3372         reg_size = UNITS_PER_ALTIVEC_WORD;
3373
3374       else if (c == FLOAT_REGS)
3375         reg_size = UNITS_PER_FP_WORD;
3376
3377       else
3378         reg_size = UNITS_PER_WORD;
3379
3380       for (m = 0; m < NUM_MACHINE_MODES; ++m)
3381         {
3382           machine_mode m2 = (machine_mode)m;
3383           int reg_size2 = reg_size;
3384
3385           /* TDmode & IBM 128-bit floating point always takes 2 registers, even
3386              in VSX.  */
3387           if (TARGET_VSX && VSX_REG_CLASS_P (c) && FLOAT128_2REG_P (m))
3388             reg_size2 = UNITS_PER_FP_WORD;
3389
3390           rs6000_class_max_nregs[m][c]
3391             = (GET_MODE_SIZE (m2) + reg_size2 - 1) / reg_size2;
3392         }
3393     }
3394
3395   /* Calculate which modes to automatically generate code to use a the
3396      reciprocal divide and square root instructions.  In the future, possibly
3397      automatically generate the instructions even if the user did not specify
3398      -mrecip.  The older machines double precision reciprocal sqrt estimate is
3399      not accurate enough.  */
3400   memset (rs6000_recip_bits, 0, sizeof (rs6000_recip_bits));
3401   if (TARGET_FRES)
3402     rs6000_recip_bits[SFmode] = RS6000_RECIP_MASK_HAVE_RE;
3403   if (TARGET_FRE)
3404     rs6000_recip_bits[DFmode] = RS6000_RECIP_MASK_HAVE_RE;
3405   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
3406     rs6000_recip_bits[V4SFmode] = RS6000_RECIP_MASK_HAVE_RE;
3407   if (VECTOR_UNIT_VSX_P (V2DFmode))
3408     rs6000_recip_bits[V2DFmode] = RS6000_RECIP_MASK_HAVE_RE;
3409
3410   if (TARGET_FRSQRTES)
3411     rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
3412   if (TARGET_FRSQRTE)
3413     rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
3414   if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
3415     rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
3416   if (VECTOR_UNIT_VSX_P (V2DFmode))
3417     rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
3418
3419   if (rs6000_recip_control)
3420     {
3421       if (!flag_finite_math_only)
3422         warning (0, "%qs requires %qs or %qs", "-mrecip", "-ffinite-math",
3423                  "-ffast-math");
3424       if (flag_trapping_math)
3425         warning (0, "%qs requires %qs or %qs", "-mrecip",
3426                  "-fno-trapping-math", "-ffast-math");
3427       if (!flag_reciprocal_math)
3428         warning (0, "%qs requires %qs or %qs", "-mrecip", "-freciprocal-math",
3429                  "-ffast-math");
3430       if (flag_finite_math_only && !flag_trapping_math && flag_reciprocal_math)
3431         {
3432           if (RS6000_RECIP_HAVE_RE_P (SFmode)
3433               && (rs6000_recip_control & RECIP_SF_DIV) != 0)
3434             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
3435
3436           if (RS6000_RECIP_HAVE_RE_P (DFmode)
3437               && (rs6000_recip_control & RECIP_DF_DIV) != 0)
3438             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
3439
3440           if (RS6000_RECIP_HAVE_RE_P (V4SFmode)
3441               && (rs6000_recip_control & RECIP_V4SF_DIV) != 0)
3442             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
3443
3444           if (RS6000_RECIP_HAVE_RE_P (V2DFmode)
3445               && (rs6000_recip_control & RECIP_V2DF_DIV) != 0)
3446             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
3447
3448           if (RS6000_RECIP_HAVE_RSQRTE_P (SFmode)
3449               && (rs6000_recip_control & RECIP_SF_RSQRT) != 0)
3450             rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
3451
3452           if (RS6000_RECIP_HAVE_RSQRTE_P (DFmode)
3453               && (rs6000_recip_control & RECIP_DF_RSQRT) != 0)
3454             rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
3455
3456           if (RS6000_RECIP_HAVE_RSQRTE_P (V4SFmode)
3457               && (rs6000_recip_control & RECIP_V4SF_RSQRT) != 0)
3458             rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
3459
3460           if (RS6000_RECIP_HAVE_RSQRTE_P (V2DFmode)
3461               && (rs6000_recip_control & RECIP_V2DF_RSQRT) != 0)
3462             rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
3463         }
3464     }
3465
3466   /* Update the addr mask bits in reg_addr to help secondary reload and go if
3467      legitimate address support to figure out the appropriate addressing to
3468      use.  */
3469   rs6000_setup_reg_addr_masks ();
3470
3471   if (global_init_p || TARGET_DEBUG_TARGET)
3472     {
3473       if (TARGET_DEBUG_REG)
3474         rs6000_debug_reg_global ();
3475
3476       if (TARGET_DEBUG_COST || TARGET_DEBUG_REG)
3477         fprintf (stderr,
3478                  "SImode variable mult cost       = %d\n"
3479                  "SImode constant mult cost       = %d\n"
3480                  "SImode short constant mult cost = %d\n"
3481                  "DImode multipliciation cost     = %d\n"
3482                  "SImode division cost            = %d\n"
3483                  "DImode division cost            = %d\n"
3484                  "Simple fp operation cost        = %d\n"
3485                  "DFmode multiplication cost      = %d\n"
3486                  "SFmode division cost            = %d\n"
3487                  "DFmode division cost            = %d\n"
3488                  "cache line size                 = %d\n"
3489                  "l1 cache size                   = %d\n"
3490                  "l2 cache size                   = %d\n"
3491                  "simultaneous prefetches         = %d\n"
3492                  "\n",
3493                  rs6000_cost->mulsi,
3494                  rs6000_cost->mulsi_const,
3495                  rs6000_cost->mulsi_const9,
3496                  rs6000_cost->muldi,
3497                  rs6000_cost->divsi,
3498                  rs6000_cost->divdi,
3499                  rs6000_cost->fp,
3500                  rs6000_cost->dmul,
3501                  rs6000_cost->sdiv,
3502                  rs6000_cost->ddiv,
3503                  rs6000_cost->cache_line_size,
3504                  rs6000_cost->l1_cache_size,
3505                  rs6000_cost->l2_cache_size,
3506                  rs6000_cost->simultaneous_prefetches);
3507     }
3508 }
3509
3510 #if TARGET_MACHO
3511 /* The Darwin version of SUBTARGET_OVERRIDE_OPTIONS.  */
3512
3513 static void
3514 darwin_rs6000_override_options (void)
3515 {
3516   /* The Darwin ABI always includes AltiVec, can't be (validly) turned
3517      off.  */
3518   rs6000_altivec_abi = 1;
3519   TARGET_ALTIVEC_VRSAVE = 1;
3520   rs6000_current_abi = ABI_DARWIN;
3521
3522   if (DEFAULT_ABI == ABI_DARWIN
3523       && TARGET_64BIT)
3524       darwin_one_byte_bool = 1;
3525
3526   if (TARGET_64BIT && ! TARGET_POWERPC64)
3527     {
3528       rs6000_isa_flags |= OPTION_MASK_POWERPC64;
3529       warning (0, "%qs requires PowerPC64 architecture, enabling", "-m64");
3530     }
3531   if (flag_mkernel)
3532     {
3533       rs6000_default_long_calls = 1;
3534       rs6000_isa_flags |= OPTION_MASK_SOFT_FLOAT;
3535     }
3536
3537   /* Make -m64 imply -maltivec.  Darwin's 64-bit ABI includes
3538      Altivec.  */
3539   if (!flag_mkernel && !flag_apple_kext
3540       && TARGET_64BIT
3541       && ! (rs6000_isa_flags_explicit & OPTION_MASK_ALTIVEC))
3542     rs6000_isa_flags |= OPTION_MASK_ALTIVEC;
3543
3544   /* Unless the user (not the configurer) has explicitly overridden
3545      it with -mcpu=G3 or -mno-altivec, then 10.5+ targets default to
3546      G4 unless targeting the kernel.  */
3547   if (!flag_mkernel
3548       && !flag_apple_kext
3549       && strverscmp (darwin_macosx_version_min, "10.5") >= 0
3550       && ! (rs6000_isa_flags_explicit & OPTION_MASK_ALTIVEC)
3551       && ! global_options_set.x_rs6000_cpu_index)
3552     {
3553       rs6000_isa_flags |= OPTION_MASK_ALTIVEC;
3554     }
3555 }
3556 #endif
3557
3558 /* If not otherwise specified by a target, make 'long double' equivalent to
3559    'double'.  */
3560
3561 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
3562 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
3563 #endif
3564
3565 /* Return the builtin mask of the various options used that could affect which
3566    builtins were used.  In the past we used target_flags, but we've run out of
3567    bits, and some options are no longer in target_flags.  */
3568
3569 HOST_WIDE_INT
3570 rs6000_builtin_mask_calculate (void)
3571 {
3572   return (((TARGET_ALTIVEC)                 ? RS6000_BTM_ALTIVEC   : 0)
3573           | ((TARGET_CMPB)                  ? RS6000_BTM_CMPB      : 0)
3574           | ((TARGET_VSX)                   ? RS6000_BTM_VSX       : 0)
3575           | ((TARGET_FRE)                   ? RS6000_BTM_FRE       : 0)
3576           | ((TARGET_FRES)                  ? RS6000_BTM_FRES      : 0)
3577           | ((TARGET_FRSQRTE)               ? RS6000_BTM_FRSQRTE   : 0)
3578           | ((TARGET_FRSQRTES)              ? RS6000_BTM_FRSQRTES  : 0)
3579           | ((TARGET_POPCNTD)               ? RS6000_BTM_POPCNTD   : 0)
3580           | ((rs6000_cpu == PROCESSOR_CELL) ? RS6000_BTM_CELL      : 0)
3581           | ((TARGET_P8_VECTOR)             ? RS6000_BTM_P8_VECTOR : 0)
3582           | ((TARGET_P9_VECTOR)             ? RS6000_BTM_P9_VECTOR : 0)
3583           | ((TARGET_P9_MISC)               ? RS6000_BTM_P9_MISC   : 0)
3584           | ((TARGET_MODULO)                ? RS6000_BTM_MODULO    : 0)
3585           | ((TARGET_64BIT)                 ? RS6000_BTM_64BIT     : 0)
3586           | ((TARGET_POWERPC64)             ? RS6000_BTM_POWERPC64 : 0)
3587           | ((TARGET_CRYPTO)                ? RS6000_BTM_CRYPTO    : 0)
3588           | ((TARGET_HTM)                   ? RS6000_BTM_HTM       : 0)
3589           | ((TARGET_DFP)                   ? RS6000_BTM_DFP       : 0)
3590           | ((TARGET_HARD_FLOAT)            ? RS6000_BTM_HARD_FLOAT : 0)
3591           | ((TARGET_LONG_DOUBLE_128
3592               && TARGET_HARD_FLOAT
3593               && !TARGET_IEEEQUAD)          ? RS6000_BTM_LDBL128   : 0)
3594           | ((TARGET_FLOAT128_TYPE)         ? RS6000_BTM_FLOAT128  : 0)
3595           | ((TARGET_FLOAT128_HW)           ? RS6000_BTM_FLOAT128_HW : 0));
3596 }
3597
3598 /* Implement TARGET_MD_ASM_ADJUST.  All asm statements are considered
3599    to clobber the XER[CA] bit because clobbering that bit without telling
3600    the compiler worked just fine with versions of GCC before GCC 5, and
3601    breaking a lot of older code in ways that are hard to track down is
3602    not such a great idea.  */
3603
3604 static rtx_insn *
3605 rs6000_md_asm_adjust (vec<rtx> &/*outputs*/, vec<rtx> &/*inputs*/,
3606                       vec<const char *> &/*constraints*/,
3607                       vec<rtx> &clobbers, HARD_REG_SET &clobbered_regs)
3608 {
3609   clobbers.safe_push (gen_rtx_REG (SImode, CA_REGNO));
3610   SET_HARD_REG_BIT (clobbered_regs, CA_REGNO);
3611   return NULL;
3612 }
3613
3614 /* Override command line options.
3615
3616    Combine build-specific configuration information with options
3617    specified on the command line to set various state variables which
3618    influence code generation, optimization, and expansion of built-in
3619    functions.  Assure that command-line configuration preferences are
3620    compatible with each other and with the build configuration; issue
3621    warnings while adjusting configuration or error messages while
3622    rejecting configuration.
3623
3624    Upon entry to this function:
3625
3626      This function is called once at the beginning of
3627      compilation, and then again at the start and end of compiling
3628      each section of code that has a different configuration, as
3629      indicated, for example, by adding the
3630
3631        __attribute__((__target__("cpu=power9")))
3632
3633      qualifier to a function definition or, for example, by bracketing
3634      code between
3635
3636        #pragma GCC target("altivec")
3637
3638      and
3639
3640        #pragma GCC reset_options
3641
3642      directives.  Parameter global_init_p is true for the initial
3643      invocation, which initializes global variables, and false for all
3644      subsequent invocations.
3645
3646
3647      Various global state information is assumed to be valid.  This
3648      includes OPTION_TARGET_CPU_DEFAULT, representing the name of the
3649      default CPU specified at build configure time, TARGET_DEFAULT,
3650      representing the default set of option flags for the default
3651      target, and global_options_set.x_rs6000_isa_flags, representing
3652      which options were requested on the command line.
3653
3654    Upon return from this function:
3655
3656      rs6000_isa_flags_explicit has a non-zero bit for each flag that
3657      was set by name on the command line.  Additionally, if certain
3658      attributes are automatically enabled or disabled by this function
3659      in order to assure compatibility between options and
3660      configuration, the flags associated with those attributes are
3661      also set.  By setting these "explicit bits", we avoid the risk
3662      that other code might accidentally overwrite these particular
3663      attributes with "default values".
3664
3665      The various bits of rs6000_isa_flags are set to indicate the
3666      target options that have been selected for the most current
3667      compilation efforts.  This has the effect of also turning on the
3668      associated TARGET_XXX values since these are macros which are
3669      generally defined to test the corresponding bit of the
3670      rs6000_isa_flags variable.
3671
3672      The variable rs6000_builtin_mask is set to represent the target
3673      options for the most current compilation efforts, consistent with
3674      the current contents of rs6000_isa_flags.  This variable controls
3675      expansion of built-in functions.
3676
3677      Various other global variables and fields of global structures
3678      (over 50 in all) are initialized to reflect the desired options
3679      for the most current compilation efforts.  */
3680
3681 static bool
3682 rs6000_option_override_internal (bool global_init_p)
3683 {
3684   bool ret = true;
3685
3686   HOST_WIDE_INT set_masks;
3687   HOST_WIDE_INT ignore_masks;
3688   int cpu_index = -1;
3689   int tune_index;
3690   struct cl_target_option *main_target_opt
3691     = ((global_init_p || target_option_default_node == NULL)
3692        ? NULL : TREE_TARGET_OPTION (target_option_default_node));
3693
3694   /* Print defaults.  */
3695   if ((TARGET_DEBUG_REG || TARGET_DEBUG_TARGET) && global_init_p)
3696     rs6000_print_isa_options (stderr, 0, "TARGET_DEFAULT", TARGET_DEFAULT);
3697
3698   /* Remember the explicit arguments.  */
3699   if (global_init_p)
3700     rs6000_isa_flags_explicit = global_options_set.x_rs6000_isa_flags;
3701
3702   /* On 64-bit Darwin, power alignment is ABI-incompatible with some C
3703      library functions, so warn about it. The flag may be useful for
3704      performance studies from time to time though, so don't disable it
3705      entirely.  */
3706   if (global_options_set.x_rs6000_alignment_flags
3707       && rs6000_alignment_flags == MASK_ALIGN_POWER
3708       && DEFAULT_ABI == ABI_DARWIN
3709       && TARGET_64BIT)
3710     warning (0, "%qs is not supported for 64-bit Darwin;"
3711              " it is incompatible with the installed C and C++ libraries",
3712              "-malign-power");
3713
3714   /* Numerous experiment shows that IRA based loop pressure
3715      calculation works better for RTL loop invariant motion on targets
3716      with enough (>= 32) registers.  It is an expensive optimization.
3717      So it is on only for peak performance.  */
3718   if (optimize >= 3 && global_init_p
3719       && !global_options_set.x_flag_ira_loop_pressure)
3720     flag_ira_loop_pressure = 1;
3721
3722   /* -fsanitize=address needs to turn on -fasynchronous-unwind-tables in order
3723      for tracebacks to be complete but not if any -fasynchronous-unwind-tables
3724      options were already specified.  */
3725   if (flag_sanitize & SANITIZE_USER_ADDRESS
3726       && !global_options_set.x_flag_asynchronous_unwind_tables)
3727     flag_asynchronous_unwind_tables = 1;
3728
3729   /* Set the pointer size.  */
3730   if (TARGET_64BIT)
3731     {
3732       rs6000_pmode = DImode;
3733       rs6000_pointer_size = 64;
3734     }
3735   else
3736     {
3737       rs6000_pmode = SImode;
3738       rs6000_pointer_size = 32;
3739     }
3740
3741   /* Some OSs don't support saving the high part of 64-bit registers on context
3742      switch.  Other OSs don't support saving Altivec registers.  On those OSs,
3743      we don't touch the OPTION_MASK_POWERPC64 or OPTION_MASK_ALTIVEC settings;
3744      if the user wants either, the user must explicitly specify them and we
3745      won't interfere with the user's specification.  */
3746
3747   set_masks = POWERPC_MASKS;
3748 #ifdef OS_MISSING_POWERPC64
3749   if (OS_MISSING_POWERPC64)
3750     set_masks &= ~OPTION_MASK_POWERPC64;
3751 #endif
3752 #ifdef OS_MISSING_ALTIVEC
3753   if (OS_MISSING_ALTIVEC)
3754     set_masks &= ~(OPTION_MASK_ALTIVEC | OPTION_MASK_VSX
3755                    | OTHER_VSX_VECTOR_MASKS);
3756 #endif
3757
3758   /* Don't override by the processor default if given explicitly.  */
3759   set_masks &= ~rs6000_isa_flags_explicit;
3760
3761   if (global_init_p && rs6000_dejagnu_cpu_index >= 0)
3762     rs6000_cpu_index = rs6000_dejagnu_cpu_index;
3763
3764   /* Process the -mcpu=<xxx> and -mtune=<xxx> argument.  If the user changed
3765      the cpu in a target attribute or pragma, but did not specify a tuning
3766      option, use the cpu for the tuning option rather than the option specified
3767      with -mtune on the command line.  Process a '--with-cpu' configuration
3768      request as an implicit --cpu.  */
3769   if (rs6000_cpu_index >= 0)
3770     cpu_index = rs6000_cpu_index;
3771   else if (main_target_opt != NULL && main_target_opt->x_rs6000_cpu_index >= 0)
3772     cpu_index = main_target_opt->x_rs6000_cpu_index;
3773   else if (OPTION_TARGET_CPU_DEFAULT)
3774     cpu_index = rs6000_cpu_name_lookup (OPTION_TARGET_CPU_DEFAULT);
3775
3776   /* If we have a cpu, either through an explicit -mcpu=<xxx> or if the
3777      compiler was configured with --with-cpu=<xxx>, replace all of the ISA bits
3778      with those from the cpu, except for options that were explicitly set.  If
3779      we don't have a cpu, do not override the target bits set in
3780      TARGET_DEFAULT.  */
3781   if (cpu_index >= 0)
3782     {
3783       rs6000_cpu_index = cpu_index;
3784       rs6000_isa_flags &= ~set_masks;
3785       rs6000_isa_flags |= (processor_target_table[cpu_index].target_enable
3786                            & set_masks);
3787     }
3788   else
3789     {
3790       /* If no -mcpu=<xxx>, inherit any default options that were cleared via
3791          POWERPC_MASKS.  Originally, TARGET_DEFAULT was used to initialize
3792          target_flags via the TARGET_DEFAULT_TARGET_FLAGS hook.  When we switched
3793          to using rs6000_isa_flags, we need to do the initialization here.
3794
3795          If there is a TARGET_DEFAULT, use that.  Otherwise fall back to using
3796          -mcpu=powerpc, -mcpu=powerpc64, or -mcpu=powerpc64le defaults.  */
3797       HOST_WIDE_INT flags;
3798       if (TARGET_DEFAULT)
3799         flags = TARGET_DEFAULT;
3800       else
3801         {
3802           /* PowerPC 64-bit LE requires at least ISA 2.07.  */
3803           const char *default_cpu = (!TARGET_POWERPC64
3804                                      ? "powerpc"
3805                                      : (BYTES_BIG_ENDIAN
3806                                         ? "powerpc64"
3807                                         : "powerpc64le"));
3808           int default_cpu_index = rs6000_cpu_name_lookup (default_cpu);
3809           flags = processor_target_table[default_cpu_index].target_enable;
3810         }
3811       rs6000_isa_flags |= (flags & ~rs6000_isa_flags_explicit);
3812     }
3813
3814   if (rs6000_tune_index >= 0)
3815     tune_index = rs6000_tune_index;
3816   else if (cpu_index >= 0)
3817     rs6000_tune_index = tune_index = cpu_index;
3818   else
3819     {
3820       size_t i;
3821       enum processor_type tune_proc
3822         = (TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT);
3823
3824       tune_index = -1;
3825       for (i = 0; i < ARRAY_SIZE (processor_target_table); i++)
3826         if (processor_target_table[i].processor == tune_proc)
3827           {
3828             tune_index = i;
3829             break;
3830           }
3831     }
3832
3833   if (cpu_index >= 0)
3834     rs6000_cpu = processor_target_table[cpu_index].processor;
3835   else
3836     rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
3837
3838   gcc_assert (tune_index >= 0);
3839   rs6000_tune = processor_target_table[tune_index].processor;
3840
3841   if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3
3842       || rs6000_cpu == PROCESSOR_PPCE500MC || rs6000_cpu == PROCESSOR_PPCE500MC64
3843       || rs6000_cpu == PROCESSOR_PPCE5500)
3844     {
3845       if (TARGET_ALTIVEC)
3846         error ("AltiVec not supported in this target");
3847     }
3848
3849   /* If we are optimizing big endian systems for space, use the load/store
3850      multiple instructions.  */
3851   if (BYTES_BIG_ENDIAN && optimize_size)
3852     rs6000_isa_flags |= ~rs6000_isa_flags_explicit & OPTION_MASK_MULTIPLE;
3853
3854   /* Don't allow -mmultiple on little endian systems unless the cpu is a 750,
3855      because the hardware doesn't support the instructions used in little
3856      endian mode, and causes an alignment trap.  The 750 does not cause an
3857      alignment trap (except when the target is unaligned).  */
3858
3859   if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750 && TARGET_MULTIPLE)
3860     {
3861       rs6000_isa_flags &= ~OPTION_MASK_MULTIPLE;
3862       if ((rs6000_isa_flags_explicit & OPTION_MASK_MULTIPLE) != 0)
3863         warning (0, "%qs is not supported on little endian systems",
3864                  "-mmultiple");
3865     }
3866
3867   /* If little-endian, default to -mstrict-align on older processors.
3868      Testing for htm matches power8 and later.  */
3869   if (!BYTES_BIG_ENDIAN
3870       && !(processor_target_table[tune_index].target_enable & OPTION_MASK_HTM))
3871     rs6000_isa_flags |= ~rs6000_isa_flags_explicit & OPTION_MASK_STRICT_ALIGN;
3872
3873   if (!rs6000_fold_gimple)
3874      fprintf (stderr,
3875               "gimple folding of rs6000 builtins has been disabled.\n");
3876
3877   /* Add some warnings for VSX.  */
3878   if (TARGET_VSX)
3879     {
3880       const char *msg = NULL;
3881       if (!TARGET_HARD_FLOAT)
3882         {
3883           if (rs6000_isa_flags_explicit & OPTION_MASK_VSX)
3884             msg = N_("%<-mvsx%> requires hardware floating point");
3885           else
3886             {
3887               rs6000_isa_flags &= ~ OPTION_MASK_VSX;
3888               rs6000_isa_flags_explicit |= OPTION_MASK_VSX;
3889             }
3890         }
3891       else if (TARGET_AVOID_XFORM > 0)
3892         msg = N_("%<-mvsx%> needs indexed addressing");
3893       else if (!TARGET_ALTIVEC && (rs6000_isa_flags_explicit
3894                                    & OPTION_MASK_ALTIVEC))
3895         {
3896           if (rs6000_isa_flags_explicit & OPTION_MASK_VSX)
3897             msg = N_("%<-mvsx%> and %<-mno-altivec%> are incompatible");
3898           else
3899             msg = N_("%<-mno-altivec%> disables vsx");
3900         }
3901
3902       if (msg)
3903         {
3904           warning (0, msg);
3905           rs6000_isa_flags &= ~ OPTION_MASK_VSX;
3906           rs6000_isa_flags_explicit |= OPTION_MASK_VSX;
3907         }
3908     }
3909
3910   /* If hard-float/altivec/vsx were explicitly turned off then don't allow
3911      the -mcpu setting to enable options that conflict. */
3912   if ((!TARGET_HARD_FLOAT || !TARGET_ALTIVEC || !TARGET_VSX)
3913       && (rs6000_isa_flags_explicit & (OPTION_MASK_SOFT_FLOAT
3914                                        | OPTION_MASK_ALTIVEC
3915                                        | OPTION_MASK_VSX)) != 0)
3916     rs6000_isa_flags &= ~((OPTION_MASK_P8_VECTOR | OPTION_MASK_CRYPTO
3917                            | OPTION_MASK_DIRECT_MOVE)
3918                          & ~rs6000_isa_flags_explicit);
3919
3920   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
3921     rs6000_print_isa_options (stderr, 0, "before defaults", rs6000_isa_flags);
3922
3923   /* Handle explicit -mno-{altivec,vsx,power8-vector,power9-vector} and turn
3924      off all of the options that depend on those flags.  */
3925   ignore_masks = rs6000_disable_incompatible_switches ();
3926
3927   /* For the newer switches (vsx, dfp, etc.) set some of the older options,
3928      unless the user explicitly used the -mno-<option> to disable the code.  */
3929   if (TARGET_P9_VECTOR || TARGET_MODULO || TARGET_P9_MISC)
3930     rs6000_isa_flags |= (ISA_3_0_MASKS_SERVER & ~ignore_masks);
3931   else if (TARGET_P9_MINMAX)
3932     {
3933       if (cpu_index >= 0)
3934         {
3935           if (cpu_index == PROCESSOR_POWER9)
3936             {
3937               /* legacy behavior: allow -mcpu=power9 with certain
3938                  capabilities explicitly disabled.  */
3939               rs6000_isa_flags |= (ISA_3_0_MASKS_SERVER & ~ignore_masks);
3940             }
3941           else
3942             error ("power9 target option is incompatible with %<%s=<xxx>%> "
3943                    "for <xxx> less than power9", "-mcpu");
3944         }
3945       else if ((ISA_3_0_MASKS_SERVER & rs6000_isa_flags_explicit)
3946                != (ISA_3_0_MASKS_SERVER & rs6000_isa_flags
3947                    & rs6000_isa_flags_explicit))
3948         /* Enforce that none of the ISA_3_0_MASKS_SERVER flags
3949            were explicitly cleared.  */
3950         error ("%qs incompatible with explicitly disabled options",
3951                "-mpower9-minmax");
3952       else
3953         rs6000_isa_flags |= ISA_3_0_MASKS_SERVER;
3954     }
3955   else if (TARGET_P8_VECTOR || TARGET_DIRECT_MOVE || TARGET_CRYPTO)
3956     rs6000_isa_flags |= (ISA_2_7_MASKS_SERVER & ~ignore_masks);
3957   else if (TARGET_VSX)
3958     rs6000_isa_flags |= (ISA_2_6_MASKS_SERVER & ~ignore_masks);
3959   else if (TARGET_POPCNTD)
3960     rs6000_isa_flags |= (ISA_2_6_MASKS_EMBEDDED & ~ignore_masks);
3961   else if (TARGET_DFP)
3962     rs6000_isa_flags |= (ISA_2_5_MASKS_SERVER & ~ignore_masks);
3963   else if (TARGET_CMPB)
3964     rs6000_isa_flags |= (ISA_2_5_MASKS_EMBEDDED & ~ignore_masks);
3965   else if (TARGET_FPRND)
3966     rs6000_isa_flags |= (ISA_2_4_MASKS & ~ignore_masks);
3967   else if (TARGET_POPCNTB)
3968     rs6000_isa_flags |= (ISA_2_2_MASKS & ~ignore_masks);
3969   else if (TARGET_ALTIVEC)
3970     rs6000_isa_flags |= (OPTION_MASK_PPC_GFXOPT & ~ignore_masks);
3971
3972   if (TARGET_CRYPTO && !TARGET_ALTIVEC)
3973     {
3974       if (rs6000_isa_flags_explicit & OPTION_MASK_CRYPTO)
3975         error ("%qs requires %qs", "-mcrypto", "-maltivec");
3976       rs6000_isa_flags &= ~OPTION_MASK_CRYPTO;
3977     }
3978
3979   if (TARGET_DIRECT_MOVE && !TARGET_VSX)
3980     {
3981       if (rs6000_isa_flags_explicit & OPTION_MASK_DIRECT_MOVE)
3982         error ("%qs requires %qs", "-mdirect-move", "-mvsx");
3983       rs6000_isa_flags &= ~OPTION_MASK_DIRECT_MOVE;
3984     }
3985
3986   if (TARGET_P8_VECTOR && !TARGET_ALTIVEC)
3987     {
3988       if (rs6000_isa_flags_explicit & OPTION_MASK_P8_VECTOR)
3989         error ("%qs requires %qs", "-mpower8-vector", "-maltivec");
3990       rs6000_isa_flags &= ~OPTION_MASK_P8_VECTOR;
3991     }
3992
3993   if (TARGET_P8_VECTOR && !TARGET_VSX)
3994     {
3995       if ((rs6000_isa_flags_explicit & OPTION_MASK_P8_VECTOR)
3996           && (rs6000_isa_flags_explicit & OPTION_MASK_VSX))
3997         error ("%qs requires %qs", "-mpower8-vector", "-mvsx");
3998       else if ((rs6000_isa_flags_explicit & OPTION_MASK_P8_VECTOR) == 0)
3999         {
4000           rs6000_isa_flags &= ~OPTION_MASK_P8_VECTOR;
4001           if (rs6000_isa_flags_explicit & OPTION_MASK_VSX)
4002             rs6000_isa_flags_explicit |= OPTION_MASK_P8_VECTOR;
4003         }
4004       else
4005         {
4006           /* OPTION_MASK_P8_VECTOR is explicit, and OPTION_MASK_VSX is
4007              not explicit.  */
4008           rs6000_isa_flags |= OPTION_MASK_VSX;
4009           rs6000_isa_flags_explicit |= OPTION_MASK_VSX;
4010         }
4011     }
4012
4013   if (TARGET_DFP && !TARGET_HARD_FLOAT)
4014     {
4015       if (rs6000_isa_flags_explicit & OPTION_MASK_DFP)
4016         error ("%qs requires %qs", "-mhard-dfp", "-mhard-float");
4017       rs6000_isa_flags &= ~OPTION_MASK_DFP;
4018     }
4019
4020   /* The quad memory instructions only works in 64-bit mode. In 32-bit mode,
4021      silently turn off quad memory mode.  */
4022   if ((TARGET_QUAD_MEMORY || TARGET_QUAD_MEMORY_ATOMIC) && !TARGET_POWERPC64)
4023     {
4024       if ((rs6000_isa_flags_explicit & OPTION_MASK_QUAD_MEMORY) != 0)
4025         warning (0, N_("%<-mquad-memory%> requires 64-bit mode"));
4026
4027       if ((rs6000_isa_flags_explicit & OPTION_MASK_QUAD_MEMORY_ATOMIC) != 0)
4028         warning (0, N_("%<-mquad-memory-atomic%> requires 64-bit mode"));
4029
4030       rs6000_isa_flags &= ~(OPTION_MASK_QUAD_MEMORY
4031                             | OPTION_MASK_QUAD_MEMORY_ATOMIC);
4032     }
4033
4034   /* Non-atomic quad memory load/store are disabled for little endian, since
4035      the words are reversed, but atomic operations can still be done by
4036      swapping the words.  */
4037   if (TARGET_QUAD_MEMORY && !WORDS_BIG_ENDIAN)
4038     {
4039       if ((rs6000_isa_flags_explicit & OPTION_MASK_QUAD_MEMORY) != 0)
4040         warning (0, N_("%<-mquad-memory%> is not available in little endian "
4041                        "mode"));
4042
4043       rs6000_isa_flags &= ~OPTION_MASK_QUAD_MEMORY;
4044     }
4045
4046   /* Assume if the user asked for normal quad memory instructions, they want
4047      the atomic versions as well, unless they explicity told us not to use quad
4048      word atomic instructions.  */
4049   if (TARGET_QUAD_MEMORY
4050       && !TARGET_QUAD_MEMORY_ATOMIC
4051       && ((rs6000_isa_flags_explicit & OPTION_MASK_QUAD_MEMORY_ATOMIC) == 0))
4052     rs6000_isa_flags |= OPTION_MASK_QUAD_MEMORY_ATOMIC;
4053
4054   /* If we can shrink-wrap the TOC register save separately, then use
4055      -msave-toc-indirect unless explicitly disabled.  */
4056   if ((rs6000_isa_flags_explicit & OPTION_MASK_SAVE_TOC_INDIRECT) == 0
4057       && flag_shrink_wrap_separate
4058       && optimize_function_for_speed_p (cfun))
4059     rs6000_isa_flags |= OPTION_MASK_SAVE_TOC_INDIRECT;
4060
4061   /* Enable power8 fusion if we are tuning for power8, even if we aren't
4062      generating power8 instructions.  Power9 does not optimize power8 fusion
4063      cases.  */
4064   if (!(rs6000_isa_flags_explicit & OPTION_MASK_P8_FUSION))
4065     {
4066       if (processor_target_table[tune_index].processor == PROCESSOR_POWER8)
4067         rs6000_isa_flags |= OPTION_MASK_P8_FUSION;
4068       else
4069         rs6000_isa_flags &= ~OPTION_MASK_P8_FUSION;
4070     }
4071
4072   /* Setting additional fusion flags turns on base fusion.  */
4073   if (!TARGET_P8_FUSION && TARGET_P8_FUSION_SIGN)
4074     {
4075       if (rs6000_isa_flags_explicit & OPTION_MASK_P8_FUSION)
4076         {
4077           if (TARGET_P8_FUSION_SIGN)
4078             error ("%qs requires %qs", "-mpower8-fusion-sign",
4079                    "-mpower8-fusion");
4080
4081           rs6000_isa_flags &= ~OPTION_MASK_P8_FUSION;
4082         }
4083       else
4084         rs6000_isa_flags |= OPTION_MASK_P8_FUSION;
4085     }
4086
4087   /* Power8 does not fuse sign extended loads with the addis.  If we are
4088      optimizing at high levels for speed, convert a sign extended load into a
4089      zero extending load, and an explicit sign extension.  */
4090   if (TARGET_P8_FUSION
4091       && !(rs6000_isa_flags_explicit & OPTION_MASK_P8_FUSION_SIGN)
4092       && optimize_function_for_speed_p (cfun)
4093       && optimize >= 3)
4094     rs6000_isa_flags |= OPTION_MASK_P8_FUSION_SIGN;
4095
4096   /* ISA 3.0 vector instructions include ISA 2.07.  */
4097   if (TARGET_P9_VECTOR && !TARGET_P8_VECTOR)
4098     {
4099       /* We prefer to not mention undocumented options in
4100          error messages.  However, if users have managed to select
4101          power9-vector without selecting power8-vector, they
4102          already know about undocumented flags.  */
4103       if ((rs6000_isa_flags_explicit & OPTION_MASK_P9_VECTOR) &&
4104           (rs6000_isa_flags_explicit & OPTION_MASK_P8_VECTOR))
4105         error ("%qs requires %qs", "-mpower9-vector", "-mpower8-vector");
4106       else if ((rs6000_isa_flags_explicit & OPTION_MASK_P9_VECTOR) == 0)
4107         {
4108           rs6000_isa_flags &= ~OPTION_MASK_P9_VECTOR;
4109           if (rs6000_isa_flags_explicit & OPTION_MASK_P8_VECTOR)
4110             rs6000_isa_flags_explicit |= OPTION_MASK_P9_VECTOR;
4111         }
4112       else
4113         {
4114           /* OPTION_MASK_P9_VECTOR is explicit and
4115              OPTION_MASK_P8_VECTOR is not explicit.  */
4116           rs6000_isa_flags |= OPTION_MASK_P8_VECTOR;
4117           rs6000_isa_flags_explicit |= OPTION_MASK_P8_VECTOR;
4118         }
4119     }
4120
4121   /* Set -mallow-movmisalign to explicitly on if we have full ISA 2.07
4122      support. If we only have ISA 2.06 support, and the user did not specify
4123      the switch, leave it set to -1 so the movmisalign patterns are enabled,
4124      but we don't enable the full vectorization support  */
4125   if (TARGET_ALLOW_MOVMISALIGN == -1 && TARGET_P8_VECTOR && TARGET_DIRECT_MOVE)
4126     TARGET_ALLOW_MOVMISALIGN = 1;
4127
4128   else if (TARGET_ALLOW_MOVMISALIGN && !TARGET_VSX)
4129     {
4130       if (TARGET_ALLOW_MOVMISALIGN > 0
4131           && global_options_set.x_TARGET_ALLOW_MOVMISALIGN)
4132         error ("%qs requires %qs", "-mallow-movmisalign", "-mvsx");
4133
4134       TARGET_ALLOW_MOVMISALIGN = 0;
4135     }
4136
4137   /* Determine when unaligned vector accesses are permitted, and when
4138      they are preferred over masked Altivec loads.  Note that if
4139      TARGET_ALLOW_MOVMISALIGN has been disabled by the user, then
4140      TARGET_EFFICIENT_UNALIGNED_VSX must be as well.  The converse is
4141      not true.  */
4142   if (TARGET_EFFICIENT_UNALIGNED_VSX)
4143     {
4144       if (!TARGET_VSX)
4145         {
4146           if (rs6000_isa_flags_explicit & OPTION_MASK_EFFICIENT_UNALIGNED_VSX)
4147             error ("%qs requires %qs", "-mefficient-unaligned-vsx", "-mvsx");
4148
4149           rs6000_isa_flags &= ~OPTION_MASK_EFFICIENT_UNALIGNED_VSX;
4150         }
4151
4152       else if (!TARGET_ALLOW_MOVMISALIGN)
4153         {
4154           if (rs6000_isa_flags_explicit & OPTION_MASK_EFFICIENT_UNALIGNED_VSX)
4155             error ("%qs requires %qs", "-munefficient-unaligned-vsx",
4156                    "-mallow-movmisalign");
4157
4158           rs6000_isa_flags &= ~OPTION_MASK_EFFICIENT_UNALIGNED_VSX;
4159         }
4160     }
4161
4162   /* Use long double size to select the appropriate long double.  We use
4163      TYPE_PRECISION to differentiate the 3 different long double types.  We map
4164      128 into the precision used for TFmode.  */
4165   int default_long_double_size = (RS6000_DEFAULT_LONG_DOUBLE_SIZE == 64
4166                                   ? 64
4167                                   : FLOAT_PRECISION_TFmode);
4168
4169   /* Set long double size before the IEEE 128-bit tests.  */
4170   if (!global_options_set.x_rs6000_long_double_type_size)
4171     {
4172       if (main_target_opt != NULL
4173           && (main_target_opt->x_rs6000_long_double_type_size
4174               != default_long_double_size))
4175         error ("target attribute or pragma changes %<long double%> size");
4176       else
4177         rs6000_long_double_type_size = default_long_double_size;
4178     }
4179   else if (rs6000_long_double_type_size == 128)
4180     rs6000_long_double_type_size = FLOAT_PRECISION_TFmode;
4181   else if (global_options_set.x_rs6000_ieeequad)
4182     {
4183       if (global_options.x_rs6000_ieeequad)
4184         error ("%qs requires %qs", "-mabi=ieeelongdouble", "-mlong-double-128");
4185       else
4186         error ("%qs requires %qs", "-mabi=ibmlongdouble", "-mlong-double-128");
4187     }
4188
4189   /* Set -mabi=ieeelongdouble on some old targets.  In the future, power server
4190      systems will also set long double to be IEEE 128-bit.  AIX and Darwin
4191      explicitly redefine TARGET_IEEEQUAD and TARGET_IEEEQUAD_DEFAULT to 0, so
4192      those systems will not pick up this default.  Warn if the user changes the
4193      default unless -Wno-psabi.  */
4194   if (!global_options_set.x_rs6000_ieeequad)
4195     rs6000_ieeequad = TARGET_IEEEQUAD_DEFAULT;
4196
4197   else
4198     {
4199       if (global_options.x_rs6000_ieeequad
4200           && (!TARGET_POPCNTD || !TARGET_VSX))
4201         error ("%qs requires full ISA 2.06 support", "-mabi=ieeelongdouble");
4202
4203       if (rs6000_ieeequad != TARGET_IEEEQUAD_DEFAULT && TARGET_LONG_DOUBLE_128)
4204         {
4205           static bool warned_change_long_double;
4206           if (!warned_change_long_double)
4207             {
4208               warned_change_long_double = true;
4209               if (TARGET_IEEEQUAD)
4210                 warning (OPT_Wpsabi, "Using IEEE extended precision "
4211                          "%<long double%>");
4212               else
4213                 warning (OPT_Wpsabi, "Using IBM extended precision "
4214                          "%<long double%>");
4215             }
4216         }
4217     }
4218
4219   /* Enable the default support for IEEE 128-bit floating point on Linux VSX
4220      sytems.  In GCC 7, we would enable the the IEEE 128-bit floating point
4221      infrastructure (-mfloat128-type) but not enable the actual __float128 type
4222      unless the user used the explicit -mfloat128.  In GCC 8, we enable both
4223      the keyword as well as the type.  */
4224   TARGET_FLOAT128_TYPE = TARGET_FLOAT128_ENABLE_TYPE && TARGET_VSX;
4225
4226   /* IEEE 128-bit floating point requires VSX support.  */
4227   if (TARGET_FLOAT128_KEYWORD)
4228     {
4229       if (!TARGET_VSX)
4230         {
4231           if ((rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_KEYWORD) != 0)
4232             error ("%qs requires VSX support", "%<-mfloat128%>");
4233
4234           TARGET_FLOAT128_TYPE = 0;
4235           rs6000_isa_flags &= ~(OPTION_MASK_FLOAT128_KEYWORD
4236                                 | OPTION_MASK_FLOAT128_HW);
4237         }
4238       else if (!TARGET_FLOAT128_TYPE)
4239         {
4240           TARGET_FLOAT128_TYPE = 1;
4241           warning (0, "The %<-mfloat128%> option may not be fully supported");
4242         }
4243     }
4244
4245   /* Enable the __float128 keyword under Linux by default.  */
4246   if (TARGET_FLOAT128_TYPE && !TARGET_FLOAT128_KEYWORD
4247       && (rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_KEYWORD) == 0)
4248     rs6000_isa_flags |= OPTION_MASK_FLOAT128_KEYWORD;
4249
4250   /* If we have are supporting the float128 type and full ISA 3.0 support,
4251      enable -mfloat128-hardware by default.  However, don't enable the
4252      __float128 keyword if it was explicitly turned off.  64-bit mode is needed
4253      because sometimes the compiler wants to put things in an integer
4254      container, and if we don't have __int128 support, it is impossible.  */
4255   if (TARGET_FLOAT128_TYPE && !TARGET_FLOAT128_HW && TARGET_64BIT
4256       && (rs6000_isa_flags & ISA_3_0_MASKS_IEEE) == ISA_3_0_MASKS_IEEE
4257       && !(rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_HW))
4258     rs6000_isa_flags |= OPTION_MASK_FLOAT128_HW;
4259
4260   if (TARGET_FLOAT128_HW
4261       && (rs6000_isa_flags & ISA_3_0_MASKS_IEEE) != ISA_3_0_MASKS_IEEE)
4262     {
4263       if ((rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_HW) != 0)
4264         error ("%qs requires full ISA 3.0 support", "%<-mfloat128-hardware%>");
4265
4266       rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW;
4267     }
4268
4269   if (TARGET_FLOAT128_HW && !TARGET_64BIT)
4270     {
4271       if ((rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_HW) != 0)
4272         error ("%qs requires %qs", "%<-mfloat128-hardware%>", "-m64");
4273
4274       rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW;
4275     }
4276
4277   /* -mpcrel requires prefixed load/store addressing.  */
4278   if (TARGET_PCREL && !TARGET_PREFIXED_ADDR)
4279     {
4280       if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0)
4281         error ("%qs requires %qs", "-mpcrel", "-mprefixed-addr");
4282
4283       rs6000_isa_flags &= ~OPTION_MASK_PCREL;
4284     }
4285
4286   /* -mprefixed-addr (and hence -mpcrel) requires -mcpu=future.  */
4287   if (TARGET_PREFIXED_ADDR && !TARGET_FUTURE)
4288     {
4289       if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0)
4290         error ("%qs requires %qs", "-mprefixed-addr", "-mcpu=future");
4291
4292       rs6000_isa_flags &= ~(OPTION_MASK_PCREL | OPTION_MASK_PREFIXED_ADDR);
4293     }
4294
4295   /* Print the options after updating the defaults.  */
4296   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
4297     rs6000_print_isa_options (stderr, 0, "after defaults", rs6000_isa_flags);
4298
4299   /* E500mc does "better" if we inline more aggressively.  Respect the
4300      user's opinion, though.  */
4301   if (rs6000_block_move_inline_limit == 0
4302       && (rs6000_tune == PROCESSOR_PPCE500MC
4303           || rs6000_tune == PROCESSOR_PPCE500MC64
4304           || rs6000_tune == PROCESSOR_PPCE5500
4305           || rs6000_tune == PROCESSOR_PPCE6500))
4306     rs6000_block_move_inline_limit = 128;
4307
4308   /* store_one_arg depends on expand_block_move to handle at least the
4309      size of reg_parm_stack_space.  */
4310   if (rs6000_block_move_inline_limit < (TARGET_POWERPC64 ? 64 : 32))
4311     rs6000_block_move_inline_limit = (TARGET_POWERPC64 ? 64 : 32);
4312
4313   if (global_init_p)
4314     {
4315       /* If the appropriate debug option is enabled, replace the target hooks
4316          with debug versions that call the real version and then prints
4317          debugging information.  */
4318       if (TARGET_DEBUG_COST)
4319         {
4320           targetm.rtx_costs = rs6000_debug_rtx_costs;
4321           targetm.address_cost = rs6000_debug_address_cost;
4322           targetm.sched.adjust_cost = rs6000_debug_adjust_cost;
4323         }
4324
4325       if (TARGET_DEBUG_ADDR)
4326         {
4327           targetm.legitimate_address_p = rs6000_debug_legitimate_address_p;
4328           targetm.legitimize_address = rs6000_debug_legitimize_address;
4329           rs6000_secondary_reload_class_ptr
4330             = rs6000_debug_secondary_reload_class;
4331           targetm.secondary_memory_needed
4332             = rs6000_debug_secondary_memory_needed;
4333           targetm.can_change_mode_class
4334             = rs6000_debug_can_change_mode_class;
4335           rs6000_preferred_reload_class_ptr
4336             = rs6000_debug_preferred_reload_class;
4337           rs6000_mode_dependent_address_ptr
4338             = rs6000_debug_mode_dependent_address;
4339         }
4340
4341       if (rs6000_veclibabi_name)
4342         {
4343           if (strcmp (rs6000_veclibabi_name, "mass") == 0)
4344             rs6000_veclib_handler = rs6000_builtin_vectorized_libmass;
4345           else
4346             {
4347               error ("unknown vectorization library ABI type (%qs) for "
4348                      "%qs switch", rs6000_veclibabi_name, "-mveclibabi=");
4349               ret = false;
4350             }
4351         }
4352     }
4353
4354   /* Disable VSX and Altivec silently if the user switched cpus to power7 in a
4355      target attribute or pragma which automatically enables both options,
4356      unless the altivec ABI was set.  This is set by default for 64-bit, but
4357      not for 32-bit.  */
4358   if (main_target_opt != NULL && !main_target_opt->x_rs6000_altivec_abi)
4359     {
4360       TARGET_FLOAT128_TYPE = 0;
4361       rs6000_isa_flags &= ~((OPTION_MASK_VSX | OPTION_MASK_ALTIVEC
4362                              | OPTION_MASK_FLOAT128_KEYWORD)
4363                             & ~rs6000_isa_flags_explicit);
4364     }
4365
4366   /* Enable Altivec ABI for AIX -maltivec.  */
4367   if (TARGET_XCOFF && (TARGET_ALTIVEC || TARGET_VSX))
4368     {
4369       if (main_target_opt != NULL && !main_target_opt->x_rs6000_altivec_abi)
4370         error ("target attribute or pragma changes AltiVec ABI");
4371       else
4372         rs6000_altivec_abi = 1;
4373     }
4374
4375   /* The AltiVec ABI is the default for PowerPC-64 GNU/Linux.  For
4376      PowerPC-32 GNU/Linux, -maltivec implies the AltiVec ABI.  It can
4377      be explicitly overridden in either case.  */
4378   if (TARGET_ELF)
4379     {
4380       if (!global_options_set.x_rs6000_altivec_abi
4381           && (TARGET_64BIT || TARGET_ALTIVEC || TARGET_VSX))
4382         {
4383           if (main_target_opt != NULL &&
4384               !main_target_opt->x_rs6000_altivec_abi)
4385             error ("target attribute or pragma changes AltiVec ABI");
4386           else
4387             rs6000_altivec_abi = 1;
4388         }
4389     }
4390
4391   /* Set the Darwin64 ABI as default for 64-bit Darwin.  
4392      So far, the only darwin64 targets are also MACH-O.  */
4393   if (TARGET_MACHO
4394       && DEFAULT_ABI == ABI_DARWIN 
4395       && TARGET_64BIT)
4396     {
4397       if (main_target_opt != NULL && !main_target_opt->x_rs6000_darwin64_abi)
4398         error ("target attribute or pragma changes darwin64 ABI");
4399       else
4400         {
4401           rs6000_darwin64_abi = 1;
4402           /* Default to natural alignment, for better performance.  */
4403           rs6000_alignment_flags = MASK_ALIGN_NATURAL;
4404         }
4405     }
4406
4407   /* Place FP constants in the constant pool instead of TOC
4408      if section anchors enabled.  */
4409   if (flag_section_anchors
4410       && !global_options_set.x_TARGET_NO_FP_IN_TOC)
4411     TARGET_NO_FP_IN_TOC = 1;
4412
4413   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
4414     rs6000_print_isa_options (stderr, 0, "before subtarget", rs6000_isa_flags);
4415
4416 #ifdef SUBTARGET_OVERRIDE_OPTIONS
4417   SUBTARGET_OVERRIDE_OPTIONS;
4418 #endif
4419 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
4420   SUBSUBTARGET_OVERRIDE_OPTIONS;
4421 #endif
4422 #ifdef SUB3TARGET_OVERRIDE_OPTIONS
4423   SUB3TARGET_OVERRIDE_OPTIONS;
4424 #endif
4425
4426   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
4427     rs6000_print_isa_options (stderr, 0, "after subtarget", rs6000_isa_flags);
4428
4429   rs6000_always_hint = (rs6000_tune != PROCESSOR_POWER4
4430                         && rs6000_tune != PROCESSOR_POWER5
4431                         && rs6000_tune != PROCESSOR_POWER6
4432                         && rs6000_tune != PROCESSOR_POWER7
4433                         && rs6000_tune != PROCESSOR_POWER8
4434                         && rs6000_tune != PROCESSOR_POWER9
4435                         && rs6000_tune != PROCESSOR_FUTURE
4436                         && rs6000_tune != PROCESSOR_PPCA2
4437                         && rs6000_tune != PROCESSOR_CELL
4438                         && rs6000_tune != PROCESSOR_PPC476);
4439   rs6000_sched_groups = (rs6000_tune == PROCESSOR_POWER4
4440                          || rs6000_tune == PROCESSOR_POWER5
4441                          || rs6000_tune == PROCESSOR_POWER7
4442                          || rs6000_tune == PROCESSOR_POWER8);
4443   rs6000_align_branch_targets = (rs6000_tune == PROCESSOR_POWER4
4444                                  || rs6000_tune == PROCESSOR_POWER5
4445                                  || rs6000_tune == PROCESSOR_POWER6
4446                                  || rs6000_tune == PROCESSOR_POWER7
4447                                  || rs6000_tune == PROCESSOR_POWER8
4448                                  || rs6000_tune == PROCESSOR_POWER9
4449                                  || rs6000_tune == PROCESSOR_FUTURE
4450                                  || rs6000_tune == PROCESSOR_PPCE500MC
4451                                  || rs6000_tune == PROCESSOR_PPCE500MC64
4452                                  || rs6000_tune == PROCESSOR_PPCE5500
4453                                  || rs6000_tune == PROCESSOR_PPCE6500);
4454
4455   /* Allow debug switches to override the above settings.  These are set to -1
4456      in rs6000.opt to indicate the user hasn't directly set the switch.  */
4457   if (TARGET_ALWAYS_HINT >= 0)
4458     rs6000_always_hint = TARGET_ALWAYS_HINT;
4459
4460   if (TARGET_SCHED_GROUPS >= 0)
4461     rs6000_sched_groups = TARGET_SCHED_GROUPS;
4462
4463   if (TARGET_ALIGN_BRANCH_TARGETS >= 0)
4464     rs6000_align_branch_targets = TARGET_ALIGN_BRANCH_TARGETS;
4465
4466   rs6000_sched_restricted_insns_priority
4467     = (rs6000_sched_groups ? 1 : 0);
4468
4469   /* Handle -msched-costly-dep option.  */
4470   rs6000_sched_costly_dep
4471     = (rs6000_sched_groups ? true_store_to_load_dep_costly : no_dep_costly);
4472
4473   if (rs6000_sched_costly_dep_str)
4474     {
4475       if (! strcmp (rs6000_sched_costly_dep_str, "no"))
4476         rs6000_sched_costly_dep = no_dep_costly;
4477       else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
4478         rs6000_sched_costly_dep = all_deps_costly;
4479       else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
4480         rs6000_sched_costly_dep = true_store_to_load_dep_costly;
4481       else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
4482         rs6000_sched_costly_dep = store_to_load_dep_costly;
4483       else
4484         rs6000_sched_costly_dep = ((enum rs6000_dependence_cost)
4485                                    atoi (rs6000_sched_costly_dep_str));
4486     }
4487
4488   /* Handle -minsert-sched-nops option.  */
4489   rs6000_sched_insert_nops
4490     = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
4491
4492   if (rs6000_sched_insert_nops_str)
4493     {
4494       if (! strcmp (rs6000_sched_insert_nops_str, "no"))
4495         rs6000_sched_insert_nops = sched_finish_none;
4496       else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
4497         rs6000_sched_insert_nops = sched_finish_pad_groups;
4498       else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
4499         rs6000_sched_insert_nops = sched_finish_regroup_exact;
4500       else
4501         rs6000_sched_insert_nops = ((enum rs6000_nop_insertion)
4502                                     atoi (rs6000_sched_insert_nops_str));
4503     }
4504
4505   /* Handle stack protector */
4506   if (!global_options_set.x_rs6000_stack_protector_guard)
4507 #ifdef TARGET_THREAD_SSP_OFFSET
4508     rs6000_stack_protector_guard = SSP_TLS;
4509 #else
4510     rs6000_stack_protector_guard = SSP_GLOBAL;
4511 #endif
4512
4513 #ifdef TARGET_THREAD_SSP_OFFSET
4514   rs6000_stack_protector_guard_offset = TARGET_THREAD_SSP_OFFSET;
4515   rs6000_stack_protector_guard_reg = TARGET_64BIT ? 13 : 2;
4516 #endif
4517
4518   if (global_options_set.x_rs6000_stack_protector_guard_offset_str)
4519     {
4520       char *endp;
4521       const char *str = rs6000_stack_protector_guard_offset_str;
4522
4523       errno = 0;
4524       long offset = strtol (str, &endp, 0);
4525       if (!*str || *endp || errno)
4526         error ("%qs is not a valid number in %qs", str,
4527                "-mstack-protector-guard-offset=");
4528
4529       if (!IN_RANGE (offset, -0x8000, 0x7fff)
4530           || (TARGET_64BIT && (offset & 3)))
4531         error ("%qs is not a valid offset in %qs", str,
4532                "-mstack-protector-guard-offset=");
4533
4534       rs6000_stack_protector_guard_offset = offset;
4535     }
4536
4537   if (global_options_set.x_rs6000_stack_protector_guard_reg_str)
4538     {
4539       const char *str = rs6000_stack_protector_guard_reg_str;
4540       int reg = decode_reg_name (str);
4541
4542       if (!IN_RANGE (reg, 1, 31))
4543         error ("%qs is not a valid base register in %qs", str,
4544                "-mstack-protector-guard-reg=");
4545
4546       rs6000_stack_protector_guard_reg = reg;
4547     }
4548
4549   if (rs6000_stack_protector_guard == SSP_TLS
4550       && !IN_RANGE (rs6000_stack_protector_guard_reg, 1, 31))
4551     error ("%qs needs a valid base register", "-mstack-protector-guard=tls");
4552
4553   if (global_init_p)
4554     {
4555 #ifdef TARGET_REGNAMES
4556       /* If the user desires alternate register names, copy in the
4557          alternate names now.  */
4558       if (TARGET_REGNAMES)
4559         memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
4560 #endif
4561
4562       /* Set aix_struct_return last, after the ABI is determined.
4563          If -maix-struct-return or -msvr4-struct-return was explicitly
4564          used, don't override with the ABI default.  */
4565       if (!global_options_set.x_aix_struct_return)
4566         aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
4567
4568 #if 0
4569       /* IBM XL compiler defaults to unsigned bitfields.  */
4570       if (TARGET_XL_COMPAT)
4571         flag_signed_bitfields = 0;
4572 #endif
4573
4574       if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
4575         REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
4576
4577       ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
4578
4579       /* We can only guarantee the availability of DI pseudo-ops when
4580          assembling for 64-bit targets.  */
4581       if (!TARGET_64BIT)
4582         {
4583           targetm.asm_out.aligned_op.di = NULL;
4584           targetm.asm_out.unaligned_op.di = NULL;
4585         }
4586
4587
4588       /* Set branch target alignment, if not optimizing for size.  */
4589       if (!optimize_size)
4590         {
4591           /* Cell wants to be aligned 8byte for dual issue.  Titan wants to be
4592              aligned 8byte to avoid misprediction by the branch predictor.  */
4593           if (rs6000_tune == PROCESSOR_TITAN
4594               || rs6000_tune == PROCESSOR_CELL)
4595             {
4596               if (flag_align_functions && !str_align_functions)
4597                 str_align_functions = "8";
4598               if (flag_align_jumps && !str_align_jumps)
4599                 str_align_jumps = "8";
4600               if (flag_align_loops && !str_align_loops)
4601                 str_align_loops = "8";
4602             }
4603           if (rs6000_align_branch_targets)
4604             {
4605               if (flag_align_functions && !str_align_functions)
4606                 str_align_functions = "16";
4607               if (flag_align_jumps && !str_align_jumps)
4608                 str_align_jumps = "16";
4609               if (flag_align_loops && !str_align_loops)
4610                 {
4611                   can_override_loop_align = 1;
4612                   str_align_loops = "16";
4613                 }
4614             }
4615
4616           if (flag_align_jumps && !str_align_jumps)
4617             str_align_jumps = "16";
4618           if (flag_align_loops && !str_align_loops)
4619             str_align_loops = "16";
4620         }
4621
4622       /* Arrange to save and restore machine status around nested functions.  */
4623       init_machine_status = rs6000_init_machine_status;
4624
4625       /* We should always be splitting complex arguments, but we can't break
4626          Linux and Darwin ABIs at the moment.  For now, only AIX is fixed.  */
4627       if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
4628         targetm.calls.split_complex_arg = NULL;
4629
4630       /* The AIX and ELFv1 ABIs define standard function descriptors.  */
4631       if (DEFAULT_ABI == ABI_AIX)
4632         targetm.calls.custom_function_descriptors = 0;
4633     }
4634
4635   /* Initialize rs6000_cost with the appropriate target costs.  */
4636   if (optimize_size)
4637     rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
4638   else
4639     switch (rs6000_tune)
4640       {
4641       case PROCESSOR_RS64A:
4642         rs6000_cost = &rs64a_cost;
4643         break;
4644
4645       case PROCESSOR_MPCCORE:
4646         rs6000_cost = &mpccore_cost;
4647         break;
4648
4649       case PROCESSOR_PPC403:
4650         rs6000_cost = &ppc403_cost;
4651         break;
4652
4653       case PROCESSOR_PPC405:
4654         rs6000_cost = &ppc405_cost;
4655         break;
4656
4657       case PROCESSOR_PPC440:
4658         rs6000_cost = &ppc440_cost;
4659         break;
4660
4661       case PROCESSOR_PPC476:
4662         rs6000_cost = &ppc476_cost;
4663         break;
4664
4665       case PROCESSOR_PPC601:
4666         rs6000_cost = &ppc601_cost;
4667         break;
4668
4669       case PROCESSOR_PPC603:
4670         rs6000_cost = &ppc603_cost;
4671         break;
4672
4673       case PROCESSOR_PPC604:
4674         rs6000_cost = &ppc604_cost;
4675         break;
4676
4677       case PROCESSOR_PPC604e:
4678         rs6000_cost = &ppc604e_cost;
4679         break;
4680
4681       case PROCESSOR_PPC620:
4682         rs6000_cost = &ppc620_cost;
4683         break;
4684
4685       case PROCESSOR_PPC630:
4686         rs6000_cost = &ppc630_cost;
4687         break;
4688
4689       case PROCESSOR_CELL:
4690         rs6000_cost = &ppccell_cost;
4691         break;
4692
4693       case PROCESSOR_PPC750:
4694       case PROCESSOR_PPC7400:
4695         rs6000_cost = &ppc750_cost;
4696         break;
4697
4698       case PROCESSOR_PPC7450:
4699         rs6000_cost = &ppc7450_cost;
4700         break;
4701
4702       case PROCESSOR_PPC8540:
4703       case PROCESSOR_PPC8548:
4704         rs6000_cost = &ppc8540_cost;
4705         break;
4706
4707       case PROCESSOR_PPCE300C2:
4708       case PROCESSOR_PPCE300C3:
4709         rs6000_cost = &ppce300c2c3_cost;
4710         break;
4711
4712       case PROCESSOR_PPCE500MC:
4713         rs6000_cost = &ppce500mc_cost;
4714         break;
4715
4716       case PROCESSOR_PPCE500MC64:
4717         rs6000_cost = &ppce500mc64_cost;
4718         break;
4719
4720       case PROCESSOR_PPCE5500:
4721         rs6000_cost = &ppce5500_cost;
4722         break;
4723
4724       case PROCESSOR_PPCE6500:
4725         rs6000_cost = &ppce6500_cost;
4726         break;
4727
4728       case PROCESSOR_TITAN:
4729         rs6000_cost = &titan_cost;
4730         break;
4731
4732       case PROCESSOR_POWER4:
4733       case PROCESSOR_POWER5:
4734         rs6000_cost = &power4_cost;
4735         break;
4736
4737       case PROCESSOR_POWER6:
4738         rs6000_cost = &power6_cost;
4739         break;
4740
4741       case PROCESSOR_POWER7:
4742         rs6000_cost = &power7_cost;
4743         break;
4744
4745       case PROCESSOR_POWER8:
4746         rs6000_cost = &power8_cost;
4747         break;
4748
4749       case PROCESSOR_POWER9:
4750       case PROCESSOR_FUTURE:
4751         rs6000_cost = &power9_cost;
4752         break;
4753
4754       case PROCESSOR_PPCA2:
4755         rs6000_cost = &ppca2_cost;
4756         break;
4757
4758       default:
4759         gcc_unreachable ();
4760       }
4761
4762   if (global_init_p)
4763     {
4764       maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
4765                              rs6000_cost->simultaneous_prefetches,
4766                              global_options.x_param_values,
4767                              global_options_set.x_param_values);
4768       maybe_set_param_value (PARAM_L1_CACHE_SIZE, rs6000_cost->l1_cache_size,
4769                              global_options.x_param_values,
4770                              global_options_set.x_param_values);
4771       maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
4772                              rs6000_cost->cache_line_size,
4773                              global_options.x_param_values,
4774                              global_options_set.x_param_values);
4775       maybe_set_param_value (PARAM_L2_CACHE_SIZE, rs6000_cost->l2_cache_size,
4776                              global_options.x_param_values,
4777                              global_options_set.x_param_values);
4778
4779       /* Increase loop peeling limits based on performance analysis. */
4780       maybe_set_param_value (PARAM_MAX_PEELED_INSNS, 400,
4781                              global_options.x_param_values,
4782                              global_options_set.x_param_values);
4783       maybe_set_param_value (PARAM_MAX_COMPLETELY_PEELED_INSNS, 400,
4784                              global_options.x_param_values,
4785                              global_options_set.x_param_values);
4786
4787       /* Use the 'model' -fsched-pressure algorithm by default.  */
4788       maybe_set_param_value (PARAM_SCHED_PRESSURE_ALGORITHM,
4789                              SCHED_PRESSURE_MODEL,
4790                              global_options.x_param_values,
4791                              global_options_set.x_param_values);
4792
4793       /* If using typedef char *va_list, signal that
4794          __builtin_va_start (&ap, 0) can be optimized to
4795          ap = __builtin_next_arg (0).  */
4796       if (DEFAULT_ABI != ABI_V4)
4797         targetm.expand_builtin_va_start = NULL;
4798     }
4799
4800   /* If not explicitly specified via option, decide whether to generate indexed
4801      load/store instructions.  A value of -1 indicates that the
4802      initial value of this variable has not been overwritten. During
4803      compilation, TARGET_AVOID_XFORM is either 0 or 1. */
4804   if (TARGET_AVOID_XFORM == -1)
4805     /* Avoid indexed addressing when targeting Power6 in order to avoid the
4806      DERAT mispredict penalty.  However the LVE and STVE altivec instructions
4807      need indexed accesses and the type used is the scalar type of the element
4808      being loaded or stored.  */
4809     TARGET_AVOID_XFORM = (rs6000_tune == PROCESSOR_POWER6 && TARGET_CMPB
4810                           && !TARGET_ALTIVEC);
4811
4812   /* Set the -mrecip options.  */
4813   if (rs6000_recip_name)
4814     {
4815       char *p = ASTRDUP (rs6000_recip_name);
4816       char *q;
4817       unsigned int mask, i;
4818       bool invert;
4819
4820       while ((q = strtok (p, ",")) != NULL)
4821         {
4822           p = NULL;
4823           if (*q == '!')
4824             {
4825               invert = true;
4826               q++;
4827             }
4828           else
4829             invert = false;
4830
4831           if (!strcmp (q, "default"))
4832             mask = ((TARGET_RECIP_PRECISION)
4833                     ? RECIP_HIGH_PRECISION : RECIP_LOW_PRECISION);
4834           else
4835             {
4836               for (i = 0; i < ARRAY_SIZE (recip_options); i++)
4837                 if (!strcmp (q, recip_options[i].string))
4838                   {
4839                     mask = recip_options[i].mask;
4840                     break;
4841                   }
4842
4843               if (i == ARRAY_SIZE (recip_options))
4844                 {
4845                   error ("unknown option for %<%s=%s%>", "-mrecip", q);
4846                   invert = false;
4847                   mask = 0;
4848                   ret = false;
4849                 }
4850             }
4851
4852           if (invert)
4853             rs6000_recip_control &= ~mask;
4854           else
4855             rs6000_recip_control |= mask;
4856         }
4857     }
4858
4859   /* Set the builtin mask of the various options used that could affect which
4860      builtins were used.  In the past we used target_flags, but we've run out
4861      of bits, and some options are no longer in target_flags.  */
4862   rs6000_builtin_mask = rs6000_builtin_mask_calculate ();
4863   if (TARGET_DEBUG_BUILTIN || TARGET_DEBUG_TARGET)
4864     rs6000_print_builtin_options (stderr, 0, "builtin mask",
4865                                   rs6000_builtin_mask);
4866
4867   /* Initialize all of the registers.  */
4868   rs6000_init_hard_regno_mode_ok (global_init_p);
4869
4870   /* Save the initial options in case the user does function specific options */
4871   if (global_init_p)
4872     target_option_default_node = target_option_current_node
4873       = build_target_option_node (&global_options);
4874
4875   /* If not explicitly specified via option, decide whether to generate the
4876      extra blr's required to preserve the link stack on some cpus (eg, 476).  */
4877   if (TARGET_LINK_STACK == -1)
4878     SET_TARGET_LINK_STACK (rs6000_tune == PROCESSOR_PPC476 && flag_pic);
4879
4880   /* Deprecate use of -mno-speculate-indirect-jumps.  */
4881   if (!rs6000_speculate_indirect_jumps)
4882     warning (0, "%qs is deprecated and not recommended in any circumstances",
4883              "-mno-speculate-indirect-jumps");
4884
4885   return ret;
4886 }
4887
4888 /* Implement TARGET_OPTION_OVERRIDE.  On the RS/6000 this is used to
4889    define the target cpu type.  */
4890
4891 static void
4892 rs6000_option_override (void)
4893 {
4894   (void) rs6000_option_override_internal (true);
4895 }
4896
4897 \f
4898 /* Implement targetm.vectorize.builtin_mask_for_load.  */
4899 static tree
4900 rs6000_builtin_mask_for_load (void)
4901 {
4902   /* Don't use lvsl/vperm for P8 and similarly efficient machines.  */
4903   if ((TARGET_ALTIVEC && !TARGET_VSX)
4904       || (TARGET_VSX && !TARGET_EFFICIENT_UNALIGNED_VSX))
4905     return altivec_builtin_mask_for_load;
4906   else
4907     return 0;
4908 }
4909
4910 /* Implement LOOP_ALIGN. */
4911 align_flags
4912 rs6000_loop_align (rtx label)
4913 {
4914   basic_block bb;
4915   int ninsns;
4916
4917   /* Don't override loop alignment if -falign-loops was specified. */
4918   if (!can_override_loop_align)
4919     return align_loops;
4920
4921   bb = BLOCK_FOR_INSN (label);
4922   ninsns = num_loop_insns(bb->loop_father);
4923
4924   /* Align small loops to 32 bytes to fit in an icache sector, otherwise return default. */
4925   if (ninsns > 4 && ninsns <= 8
4926       && (rs6000_tune == PROCESSOR_POWER4
4927           || rs6000_tune == PROCESSOR_POWER5
4928           || rs6000_tune == PROCESSOR_POWER6
4929           || rs6000_tune == PROCESSOR_POWER7
4930           || rs6000_tune == PROCESSOR_POWER8))
4931     return align_flags (5);
4932   else
4933     return align_loops;
4934 }
4935
4936 /* Return true iff, data reference of TYPE can reach vector alignment (16)
4937    after applying N number of iterations.  This routine does not determine
4938    how may iterations are required to reach desired alignment.  */
4939
4940 static bool
4941 rs6000_vector_alignment_reachable (const_tree type ATTRIBUTE_UNUSED, bool is_packed)
4942 {
4943   if (is_packed)
4944     return false;
4945
4946   if (TARGET_32BIT)
4947     {
4948       if (rs6000_alignment_flags == MASK_ALIGN_NATURAL)
4949         return true;
4950
4951       if (rs6000_alignment_flags ==  MASK_ALIGN_POWER)
4952         return true;
4953
4954       return false;
4955     }
4956   else
4957     {
4958       if (TARGET_MACHO)
4959         return false;
4960
4961       /* Assuming that all other types are naturally aligned. CHECKME!  */
4962       return true;
4963     }
4964 }
4965
4966 /* Return true if the vector misalignment factor is supported by the
4967    target.  */ 
4968 static bool
4969 rs6000_builtin_support_vector_misalignment (machine_mode mode,
4970                                             const_tree type,
4971                                             int misalignment,
4972                                             bool is_packed)
4973 {
4974   if (TARGET_VSX)
4975     {
4976       if (TARGET_EFFICIENT_UNALIGNED_VSX)
4977         return true;
4978
4979       /* Return if movmisalign pattern is not supported for this mode.  */
4980       if (optab_handler (movmisalign_optab, mode) == CODE_FOR_nothing)
4981         return false;
4982
4983       if (misalignment == -1)
4984         {
4985           /* Misalignment factor is unknown at compile time but we know
4986              it's word aligned.  */
4987           if (rs6000_vector_alignment_reachable (type, is_packed))
4988             {
4989               int element_size = TREE_INT_CST_LOW (TYPE_SIZE (type));
4990
4991               if (element_size == 64 || element_size == 32)
4992                return true;
4993             }
4994
4995           return false;
4996         }
4997
4998       /* VSX supports word-aligned vector.  */
4999       if (misalignment % 4 == 0)
5000         return true;
5001     }
5002   return false;
5003 }
5004
5005 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
5006 static int
5007 rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
5008                                    tree vectype, int misalign)
5009 {
5010   unsigned elements;
5011   tree elem_type;
5012
5013   switch (type_of_cost)
5014     {
5015       case scalar_stmt:
5016       case scalar_load:
5017       case scalar_store:
5018       case vector_stmt:
5019       case vector_load:
5020       case vector_store:
5021       case vec_to_scalar:
5022       case scalar_to_vec:
5023       case cond_branch_not_taken:
5024         return 1;
5025
5026       case vec_perm:
5027         if (TARGET_VSX)
5028           return 3;
5029         else
5030           return 1;
5031
5032       case vec_promote_demote:
5033         if (TARGET_VSX)
5034           return 4;
5035         else
5036           return 1;
5037
5038       case cond_branch_taken:
5039         return 3;
5040
5041       case unaligned_load:
5042       case vector_gather_load:
5043         if (TARGET_EFFICIENT_UNALIGNED_VSX)
5044           return 1;
5045
5046         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
5047           {
5048             elements = TYPE_VECTOR_SUBPARTS (vectype);
5049             if (elements == 2)
5050               /* Double word aligned.  */
5051               return 2;
5052
5053             if (elements == 4)
5054               {
5055                 switch (misalign)
5056                   {
5057                     case 8:
5058                       /* Double word aligned.  */
5059                       return 2;
5060
5061                     case -1:
5062                       /* Unknown misalignment.  */
5063                     case 4:
5064                     case 12:
5065                       /* Word aligned.  */
5066                       return 22;
5067
5068                     default:
5069                       gcc_unreachable ();
5070                   }
5071               }
5072           }
5073
5074         if (TARGET_ALTIVEC)
5075           /* Misaligned loads are not supported.  */
5076           gcc_unreachable ();
5077
5078         return 2;
5079
5080       case unaligned_store:
5081       case vector_scatter_store:
5082         if (TARGET_EFFICIENT_UNALIGNED_VSX)
5083           return 1;
5084
5085         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
5086           {
5087             elements = TYPE_VECTOR_SUBPARTS (vectype);
5088             if (elements == 2)
5089               /* Double word aligned.  */
5090               return 2;
5091
5092             if (elements == 4)
5093               {
5094                 switch (misalign)
5095                   {
5096                     case 8:
5097                       /* Double word aligned.  */
5098                       return 2;
5099
5100                     case -1:
5101                       /* Unknown misalignment.  */
5102                     case 4:
5103                     case 12:
5104                       /* Word aligned.  */
5105                       return 23;
5106
5107                     default:
5108                       gcc_unreachable ();
5109                   }
5110               }
5111           }
5112
5113         if (TARGET_ALTIVEC)
5114           /* Misaligned stores are not supported.  */
5115           gcc_unreachable ();
5116
5117         return 2;
5118
5119       case vec_construct:
5120         /* This is a rough approximation assuming non-constant elements
5121            constructed into a vector via element insertion.  FIXME:
5122            vec_construct is not granular enough for uniformly good
5123            decisions.  If the initialization is a splat, this is
5124            cheaper than we estimate.  Improve this someday.  */
5125         elem_type = TREE_TYPE (vectype);
5126         /* 32-bit vectors loaded into registers are stored as double
5127            precision, so we need 2 permutes, 2 converts, and 1 merge
5128            to construct a vector of short floats from them.  */
5129         if (SCALAR_FLOAT_TYPE_P (elem_type)
5130             && TYPE_PRECISION (elem_type) == 32)
5131           return 5;
5132         /* On POWER9, integer vector types are built up in GPRs and then
5133            use a direct move (2 cycles).  For POWER8 this is even worse,
5134            as we need two direct moves and a merge, and the direct moves
5135            are five cycles.  */
5136         else if (INTEGRAL_TYPE_P (elem_type))
5137           {
5138             if (TARGET_P9_VECTOR)
5139               return TYPE_VECTOR_SUBPARTS (vectype) - 1 + 2;
5140             else
5141               return TYPE_VECTOR_SUBPARTS (vectype) - 1 + 5;
5142           }
5143         else
5144           /* V2DFmode doesn't need a direct move.  */
5145           return 2;
5146
5147       default:
5148         gcc_unreachable ();
5149     }
5150 }
5151
5152 /* Implement targetm.vectorize.preferred_simd_mode.  */
5153
5154 static machine_mode
5155 rs6000_preferred_simd_mode (scalar_mode mode)
5156 {
5157   if (TARGET_VSX)
5158     switch (mode)
5159       {
5160       case E_DFmode:
5161         return V2DFmode;
5162       default:;
5163       }
5164   if (TARGET_ALTIVEC || TARGET_VSX)
5165     switch (mode)
5166       {
5167       case E_SFmode:
5168         return V4SFmode;
5169       case E_TImode:
5170         return V1TImode;
5171       case E_DImode:
5172         return V2DImode;
5173       case E_SImode:
5174         return V4SImode;
5175       case E_HImode:
5176         return V8HImode;
5177       case E_QImode:
5178         return V16QImode;
5179       default:;
5180       }
5181   return word_mode;
5182 }
5183
5184 typedef struct _rs6000_cost_data
5185 {
5186   struct loop *loop_info;
5187   unsigned cost[3];
5188 } rs6000_cost_data;
5189
5190 /* Test for likely overcommitment of vector hardware resources.  If a
5191    loop iteration is relatively large, and too large a percentage of
5192    instructions in the loop are vectorized, the cost model may not
5193    adequately reflect delays from unavailable vector resources.
5194    Penalize the loop body cost for this case.  */
5195
5196 static void
5197 rs6000_density_test (rs6000_cost_data *data)
5198 {
5199   const int DENSITY_PCT_THRESHOLD = 85;
5200   const int DENSITY_SIZE_THRESHOLD = 70;
5201   const int DENSITY_PENALTY = 10;
5202   struct loop *loop = data->loop_info;
5203   basic_block *bbs = get_loop_body (loop);
5204   int nbbs = loop->num_nodes;
5205   loop_vec_info loop_vinfo = loop_vec_info_for_loop (data->loop_info);
5206   int vec_cost = data->cost[vect_body], not_vec_cost = 0;
5207   int i, density_pct;
5208
5209   for (i = 0; i < nbbs; i++)
5210     {
5211       basic_block bb = bbs[i];
5212       gimple_stmt_iterator gsi;
5213
5214       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5215         {
5216           gimple *stmt = gsi_stmt (gsi);
5217           stmt_vec_info stmt_info = loop_vinfo->lookup_stmt (stmt);
5218
5219           if (!STMT_VINFO_RELEVANT_P (stmt_info)
5220               && !STMT_VINFO_IN_PATTERN_P (stmt_info))
5221             not_vec_cost++;
5222         }
5223     }
5224
5225   free (bbs);
5226   density_pct = (vec_cost * 100) / (vec_cost + not_vec_cost);
5227
5228   if (density_pct > DENSITY_PCT_THRESHOLD
5229       && vec_cost + not_vec_cost > DENSITY_SIZE_THRESHOLD)
5230     {
5231       data->cost[vect_body] = vec_cost * (100 + DENSITY_PENALTY) / 100;
5232       if (dump_enabled_p ())
5233         dump_printf_loc (MSG_NOTE, vect_location,
5234                          "density %d%%, cost %d exceeds threshold, penalizing "
5235                          "loop body cost by %d%%", density_pct,
5236                          vec_cost + not_vec_cost, DENSITY_PENALTY);
5237     }
5238 }
5239
5240 /* Implement targetm.vectorize.init_cost.  */
5241
5242 /* For each vectorized loop, this var holds TRUE iff a non-memory vector
5243    instruction is needed by the vectorization.  */
5244 static bool rs6000_vect_nonmem;
5245
5246 static void *
5247 rs6000_init_cost (struct loop *loop_info)
5248 {
5249   rs6000_cost_data *data = XNEW (struct _rs6000_cost_data);
5250   data->loop_info = loop_info;
5251   data->cost[vect_prologue] = 0;
5252   data->cost[vect_body]     = 0;
5253   data->cost[vect_epilogue] = 0;
5254   rs6000_vect_nonmem = false;
5255   return data;
5256 }
5257
5258 /* Implement targetm.vectorize.add_stmt_cost.  */
5259
5260 static unsigned
5261 rs6000_add_stmt_cost (void *data, int count, enum vect_cost_for_stmt kind,
5262                       struct _stmt_vec_info *stmt_info, int misalign,
5263                       enum vect_cost_model_location where)
5264 {
5265   rs6000_cost_data *cost_data = (rs6000_cost_data*) data;
5266   unsigned retval = 0;
5267
5268   if (flag_vect_cost_model)
5269     {
5270       tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE;
5271       int stmt_cost = rs6000_builtin_vectorization_cost (kind, vectype,
5272                                                          misalign);
5273       /* Statements in an inner loop relative to the loop being
5274          vectorized are weighted more heavily.  The value here is
5275          arbitrary and could potentially be improved with analysis.  */
5276       if (where == vect_body && stmt_info && stmt_in_inner_loop_p (stmt_info))
5277         count *= 50;  /* FIXME.  */
5278
5279       retval = (unsigned) (count * stmt_cost);
5280       cost_data->cost[where] += retval;
5281
5282       /* Check whether we're doing something other than just a copy loop.
5283          Not all such loops may be profitably vectorized; see
5284          rs6000_finish_cost.  */
5285       if ((kind == vec_to_scalar || kind == vec_perm
5286            || kind == vec_promote_demote || kind == vec_construct
5287            || kind == scalar_to_vec)
5288           || (where == vect_body && kind == vector_stmt))
5289         rs6000_vect_nonmem = true;
5290     }
5291
5292   return retval;
5293 }
5294
5295 /* Implement targetm.vectorize.finish_cost.  */
5296
5297 static void
5298 rs6000_finish_cost (void *data, unsigned *prologue_cost,
5299                     unsigned *body_cost, unsigned *epilogue_cost)
5300 {
5301   rs6000_cost_data *cost_data = (rs6000_cost_data*) data;
5302
5303   if (cost_data->loop_info)
5304     rs6000_density_test (cost_data);
5305
5306   /* Don't vectorize minimum-vectorization-factor, simple copy loops
5307      that require versioning for any reason.  The vectorization is at
5308      best a wash inside the loop, and the versioning checks make
5309      profitability highly unlikely and potentially quite harmful.  */
5310   if (cost_data->loop_info)
5311     {
5312       loop_vec_info vec_info = loop_vec_info_for_loop (cost_data->loop_info);
5313       if (!rs6000_vect_nonmem
5314           && LOOP_VINFO_VECT_FACTOR (vec_info) == 2
5315           && LOOP_REQUIRES_VERSIONING (vec_info))
5316         cost_data->cost[vect_body] += 10000;
5317     }
5318
5319   *prologue_cost = cost_data->cost[vect_prologue];
5320   *body_cost     = cost_data->cost[vect_body];
5321   *epilogue_cost = cost_data->cost[vect_epilogue];
5322 }
5323
5324 /* Implement targetm.vectorize.destroy_cost_data.  */
5325
5326 static void
5327 rs6000_destroy_cost_data (void *data)
5328 {
5329   free (data);
5330 }
5331
5332 /* Handler for the Mathematical Acceleration Subsystem (mass) interface to a
5333    library with vectorized intrinsics.  */
5334
5335 static tree
5336 rs6000_builtin_vectorized_libmass (combined_fn fn, tree type_out,
5337                                    tree type_in)
5338 {
5339   char name[32];
5340   const char *suffix = NULL;
5341   tree fntype, new_fndecl, bdecl = NULL_TREE;
5342   int n_args = 1;
5343   const char *bname;
5344   machine_mode el_mode, in_mode;
5345   int n, in_n;
5346
5347   /* Libmass is suitable for unsafe math only as it does not correctly support
5348      parts of IEEE with the required precision such as denormals.  Only support
5349      it if we have VSX to use the simd d2 or f4 functions.
5350      XXX: Add variable length support.  */
5351   if (!flag_unsafe_math_optimizations || !TARGET_VSX)
5352     return NULL_TREE;
5353
5354   el_mode = TYPE_MODE (TREE_TYPE (type_out));
5355   n = TYPE_VECTOR_SUBPARTS (type_out);
5356   in_mode = TYPE_MODE (TREE_TYPE (type_in));
5357   in_n = TYPE_VECTOR_SUBPARTS (type_in);
5358   if (el_mode != in_mode
5359       || n != in_n)
5360     return NULL_TREE;
5361
5362   switch (fn)
5363     {
5364     CASE_CFN_ATAN2:
5365     CASE_CFN_HYPOT:
5366     CASE_CFN_POW:
5367       n_args = 2;
5368       gcc_fallthrough ();
5369
5370     CASE_CFN_ACOS:
5371     CASE_CFN_ACOSH:
5372     CASE_CFN_ASIN:
5373     CASE_CFN_ASINH:
5374     CASE_CFN_ATAN:
5375     CASE_CFN_ATANH:
5376     CASE_CFN_CBRT:
5377     CASE_CFN_COS:
5378     CASE_CFN_COSH:
5379     CASE_CFN_ERF:
5380     CASE_CFN_ERFC:
5381     CASE_CFN_EXP2:
5382     CASE_CFN_EXP:
5383     CASE_CFN_EXPM1:
5384     CASE_CFN_LGAMMA:
5385     CASE_CFN_LOG10:
5386     CASE_CFN_LOG1P:
5387     CASE_CFN_LOG2:
5388     CASE_CFN_LOG:
5389     CASE_CFN_SIN:
5390     CASE_CFN_SINH:
5391     CASE_CFN_SQRT:
5392     CASE_CFN_TAN:
5393     CASE_CFN_TANH:
5394       if (el_mode == DFmode && n == 2)
5395         {
5396           bdecl = mathfn_built_in (double_type_node, fn);
5397           suffix = "d2";                                /* pow -> powd2 */
5398         }
5399       else if (el_mode == SFmode && n == 4)
5400         {
5401           bdecl = mathfn_built_in (float_type_node, fn);
5402           suffix = "4";                                 /* powf -> powf4 */
5403         }
5404       else
5405         return NULL_TREE;
5406       if (!bdecl)
5407         return NULL_TREE;
5408       break;
5409
5410     default:
5411       return NULL_TREE;
5412     }
5413
5414   gcc_assert (suffix != NULL);
5415   bname = IDENTIFIER_POINTER (DECL_NAME (bdecl));
5416   if (!bname)
5417     return NULL_TREE;
5418
5419   strcpy (name, bname + sizeof ("__builtin_") - 1);
5420   strcat (name, suffix);
5421
5422   if (n_args == 1)
5423     fntype = build_function_type_list (type_out, type_in, NULL);
5424   else if (n_args == 2)
5425     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
5426   else
5427     gcc_unreachable ();
5428
5429   /* Build a function declaration for the vectorized function.  */
5430   new_fndecl = build_decl (BUILTINS_LOCATION,
5431                            FUNCTION_DECL, get_identifier (name), fntype);
5432   TREE_PUBLIC (new_fndecl) = 1;
5433   DECL_EXTERNAL (new_fndecl) = 1;
5434   DECL_IS_NOVOPS (new_fndecl) = 1;
5435   TREE_READONLY (new_fndecl) = 1;
5436
5437   return new_fndecl;
5438 }
5439
5440 /* Returns a function decl for a vectorized version of the builtin function
5441    with builtin function code FN and the result vector type TYPE, or NULL_TREE
5442    if it is not available.  */
5443
5444 static tree
5445 rs6000_builtin_vectorized_function (unsigned int fn, tree type_out,
5446                                     tree type_in)
5447 {
5448   machine_mode in_mode, out_mode;
5449   int in_n, out_n;
5450
5451   if (TARGET_DEBUG_BUILTIN)
5452     fprintf (stderr, "rs6000_builtin_vectorized_function (%s, %s, %s)\n",
5453              combined_fn_name (combined_fn (fn)),
5454              GET_MODE_NAME (TYPE_MODE (type_out)),
5455              GET_MODE_NAME (TYPE_MODE (type_in)));
5456
5457   if (TREE_CODE (type_out) != VECTOR_TYPE
5458       || TREE_CODE (type_in) != VECTOR_TYPE)
5459     return NULL_TREE;
5460
5461   out_mode = TYPE_MODE (TREE_TYPE (type_out));
5462   out_n = TYPE_VECTOR_SUBPARTS (type_out);
5463   in_mode = TYPE_MODE (TREE_TYPE (type_in));
5464   in_n = TYPE_VECTOR_SUBPARTS (type_in);
5465
5466   switch (fn)
5467     {
5468     CASE_CFN_COPYSIGN:
5469       if (VECTOR_UNIT_VSX_P (V2DFmode)
5470           && out_mode == DFmode && out_n == 2
5471           && in_mode == DFmode && in_n == 2)
5472         return rs6000_builtin_decls[VSX_BUILTIN_CPSGNDP];
5473       if (VECTOR_UNIT_VSX_P (V4SFmode)
5474           && out_mode == SFmode && out_n == 4
5475           && in_mode == SFmode && in_n == 4)
5476         return rs6000_builtin_decls[VSX_BUILTIN_CPSGNSP];
5477       if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
5478           && out_mode == SFmode && out_n == 4
5479           && in_mode == SFmode && in_n == 4)
5480         return rs6000_builtin_decls[ALTIVEC_BUILTIN_COPYSIGN_V4SF];
5481       break;
5482     CASE_CFN_CEIL:
5483       if (VECTOR_UNIT_VSX_P (V2DFmode)
5484           && out_mode == DFmode && out_n == 2
5485           && in_mode == DFmode && in_n == 2)
5486         return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIP];
5487       if (VECTOR_UNIT_VSX_P (V4SFmode)
5488           && out_mode == SFmode && out_n == 4
5489           && in_mode == SFmode && in_n == 4)
5490         return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIP];
5491       if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
5492           && out_mode == SFmode && out_n == 4
5493           && in_mode == SFmode && in_n == 4)
5494         return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIP];
5495       break;
5496     CASE_CFN_FLOOR:
5497       if (VECTOR_UNIT_VSX_P (V2DFmode)
5498           && out_mode == DFmode && out_n == 2
5499           && in_mode == DFmode && in_n == 2)
5500         return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIM];
5501       if (VECTOR_UNIT_VSX_P (V4SFmode)
5502           && out_mode == SFmode && out_n == 4
5503           && in_mode == SFmode && in_n == 4)
5504         return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIM];
5505       if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
5506           && out_mode == SFmode && out_n == 4
5507           && in_mode == SFmode && in_n == 4)
5508         return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIM];
5509       break;
5510     CASE_CFN_FMA:
5511       if (VECTOR_UNIT_VSX_P (V2DFmode)
5512           && out_mode == DFmode && out_n == 2
5513           && in_mode == DFmode && in_n == 2)
5514         return rs6000_builtin_decls[VSX_BUILTIN_XVMADDDP];
5515       if (VECTOR_UNIT_VSX_P (V4SFmode)
5516           && out_mode == SFmode && out_n == 4
5517           && in_mode == SFmode && in_n == 4)
5518         return rs6000_builtin_decls[VSX_BUILTIN_XVMADDSP];
5519       if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
5520           && out_mode == SFmode && out_n == 4
5521           && in_mode == SFmode && in_n == 4)
5522         return rs6000_builtin_decls[ALTIVEC_BUILTIN_VMADDFP];
5523       break;
5524     CASE_CFN_TRUNC:
5525       if (VECTOR_UNIT_VSX_P (V2DFmode)
5526           && out_mode == DFmode && out_n == 2
5527           && in_mode == DFmode && in_n == 2)
5528         return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIZ];
5529       if (VECTOR_UNIT_VSX_P (V4SFmode)
5530           && out_mode == SFmode && out_n == 4
5531           && in_mode == SFmode && in_n == 4)
5532         return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIZ];
5533       if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
5534           && out_mode == SFmode && out_n == 4
5535           && in_mode == SFmode && in_n == 4)
5536         return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIZ];
5537       break;
5538     CASE_CFN_NEARBYINT:
5539       if (VECTOR_UNIT_VSX_P (V2DFmode)
5540           && flag_unsafe_math_optimizations
5541           && out_mode == DFmode && out_n == 2
5542           && in_mode == DFmode && in_n == 2)
5543         return rs6000_builtin_decls[VSX_BUILTIN_XVRDPI];
5544       if (VECTOR_UNIT_VSX_P (V4SFmode)
5545           && flag_unsafe_math_optimizations
5546           && out_mode == SFmode && out_n == 4
5547           && in_mode == SFmode && in_n == 4)
5548         return rs6000_builtin_decls[VSX_BUILTIN_XVRSPI];
5549       break;
5550     CASE_CFN_RINT:
5551       if (VECTOR_UNIT_VSX_P (V2DFmode)
5552           && !flag_trapping_math
5553           && out_mode == DFmode && out_n == 2
5554           && in_mode == DFmode && in_n == 2)
5555         return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIC];
5556       if (VECTOR_UNIT_VSX_P (V4SFmode)
5557           && !flag_trapping_math
5558           && out_mode == SFmode && out_n == 4
5559           && in_mode == SFmode && in_n == 4)
5560         return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIC];
5561       break;
5562     default:
5563       break;
5564     }
5565
5566   /* Generate calls to libmass if appropriate.  */
5567   if (rs6000_veclib_handler)
5568     return rs6000_veclib_handler (combined_fn (fn), type_out, type_in);
5569
5570   return NULL_TREE;
5571 }
5572
5573 /* Implement TARGET_VECTORIZE_BUILTIN_MD_VECTORIZED_FUNCTION.  */
5574
5575 static tree
5576 rs6000_builtin_md_vectorized_function (tree fndecl, tree type_out,
5577                                        tree type_in)
5578 {
5579   machine_mode in_mode, out_mode;
5580   int in_n, out_n;
5581
5582   if (TARGET_DEBUG_BUILTIN)
5583     fprintf (stderr, "rs6000_builtin_md_vectorized_function (%s, %s, %s)\n",
5584              IDENTIFIER_POINTER (DECL_NAME (fndecl)),
5585              GET_MODE_NAME (TYPE_MODE (type_out)),
5586              GET_MODE_NAME (TYPE_MODE (type_in)));
5587
5588   if (TREE_CODE (type_out) != VECTOR_TYPE
5589       || TREE_CODE (type_in) != VECTOR_TYPE)
5590     return NULL_TREE;
5591
5592   out_mode = TYPE_MODE (TREE_TYPE (type_out));
5593   out_n = TYPE_VECTOR_SUBPARTS (type_out);
5594   in_mode = TYPE_MODE (TREE_TYPE (type_in));
5595   in_n = TYPE_VECTOR_SUBPARTS (type_in);
5596
5597   enum rs6000_builtins fn
5598     = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
5599   switch (fn)
5600     {
5601     case RS6000_BUILTIN_RSQRTF:
5602       if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
5603           && out_mode == SFmode && out_n == 4
5604           && in_mode == SFmode && in_n == 4)
5605         return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRSQRTFP];
5606       break;
5607     case RS6000_BUILTIN_RSQRT:
5608       if (VECTOR_UNIT_VSX_P (V2DFmode)
5609           && out_mode == DFmode && out_n == 2
5610           && in_mode == DFmode && in_n == 2)
5611         return rs6000_builtin_decls[VSX_BUILTIN_RSQRT_2DF];
5612       break;
5613     case RS6000_BUILTIN_RECIPF:
5614       if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
5615           && out_mode == SFmode && out_n == 4
5616           && in_mode == SFmode && in_n == 4)
5617         return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRECIPFP];
5618       break;
5619     case RS6000_BUILTIN_RECIP:
5620       if (VECTOR_UNIT_VSX_P (V2DFmode)
5621           && out_mode == DFmode && out_n == 2
5622           && in_mode == DFmode && in_n == 2)
5623         return rs6000_builtin_decls[VSX_BUILTIN_RECIP_V2DF];
5624       break;
5625     default:
5626       break;
5627     }
5628   return NULL_TREE;
5629 }
5630 \f
5631 /* Default CPU string for rs6000*_file_start functions.  */
5632 static const char *rs6000_default_cpu;
5633
5634 #ifdef USING_ELFOS_H
5635 static const char *rs6000_machine;
5636
5637 static const char *
5638 rs6000_machine_from_flags (void)
5639 {
5640   if ((rs6000_isa_flags & (ISA_FUTURE_MASKS_SERVER & ~ISA_3_0_MASKS_SERVER))
5641       != 0)
5642     return "future";
5643   if ((rs6000_isa_flags & (ISA_3_0_MASKS_SERVER & ~ISA_2_7_MASKS_SERVER)) != 0)
5644     return "power9";
5645   if ((rs6000_isa_flags & (ISA_2_7_MASKS_SERVER & ~ISA_2_6_MASKS_SERVER)) != 0)
5646     return "power8";
5647   if ((rs6000_isa_flags & (ISA_2_6_MASKS_SERVER & ~ISA_2_5_MASKS_SERVER)) != 0)
5648     return "power7";
5649   if ((rs6000_isa_flags & (ISA_2_5_MASKS_SERVER & ~ISA_2_4_MASKS)) != 0)
5650     return "power6";
5651   if ((rs6000_isa_flags & (ISA_2_4_MASKS & ~ISA_2_1_MASKS)) != 0)
5652     return "power5";
5653   if ((rs6000_isa_flags & ISA_2_1_MASKS) != 0)
5654     return "power4";
5655   if ((rs6000_isa_flags & OPTION_MASK_POWERPC64) != 0)
5656     return "ppc64";
5657   return "ppc";
5658 }
5659
5660 static void
5661 emit_asm_machine (void)
5662 {
5663   fprintf (asm_out_file, "\t.machine %s\n", rs6000_machine);
5664 }
5665 #endif
5666
5667 /* Do anything needed at the start of the asm file.  */
5668
5669 static void
5670 rs6000_file_start (void)
5671 {
5672   char buffer[80];
5673   const char *start = buffer;
5674   FILE *file = asm_out_file;
5675
5676   rs6000_default_cpu = TARGET_CPU_DEFAULT;
5677
5678   default_file_start ();
5679
5680   if (flag_verbose_asm)
5681     {
5682       sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
5683
5684       if (rs6000_default_cpu != 0 && rs6000_default_cpu[0] != '\0')
5685         {
5686           fprintf (file, "%s --with-cpu=%s", start, rs6000_default_cpu);
5687           start = "";
5688         }
5689
5690       if (global_options_set.x_rs6000_cpu_index)
5691         {
5692           fprintf (file, "%s -mcpu=%s", start,
5693                    processor_target_table[rs6000_cpu_index].name);
5694           start = "";
5695         }
5696
5697       if (global_options_set.x_rs6000_tune_index)
5698         {
5699           fprintf (file, "%s -mtune=%s", start,
5700                    processor_target_table[rs6000_tune_index].name);
5701           start = "";
5702         }
5703
5704       if (PPC405_ERRATUM77)
5705         {
5706           fprintf (file, "%s PPC405CR_ERRATUM77", start);
5707           start = "";
5708         }
5709
5710 #ifdef USING_ELFOS_H
5711       switch (rs6000_sdata)
5712         {
5713         case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
5714         case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
5715         case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
5716         case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
5717         }
5718
5719       if (rs6000_sdata && g_switch_value)
5720         {
5721           fprintf (file, "%s -G %d", start,
5722                    g_switch_value);
5723           start = "";
5724         }
5725 #endif
5726
5727       if (*start == '\0')
5728         putc ('\n', file);
5729     }
5730
5731 #ifdef USING_ELFOS_H
5732   rs6000_machine = rs6000_machine_from_flags ();
5733   if (!(rs6000_default_cpu && rs6000_default_cpu[0])
5734       && !global_options_set.x_rs6000_cpu_index)
5735     emit_asm_machine ();
5736 #endif
5737
5738   if (DEFAULT_ABI == ABI_ELFv2)
5739     fprintf (file, "\t.abiversion 2\n");
5740 }
5741
5742 \f
5743 /* Return nonzero if this function is known to have a null epilogue.  */
5744
5745 int
5746 direct_return (void)
5747 {
5748   if (reload_completed)
5749     {
5750       rs6000_stack_t *info = rs6000_stack_info ();
5751
5752       if (info->first_gp_reg_save == 32
5753           && info->first_fp_reg_save == 64
5754           && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
5755           && ! info->lr_save_p
5756           && ! info->cr_save_p
5757           && info->vrsave_size == 0
5758           && ! info->push_p)
5759         return 1;
5760     }
5761
5762   return 0;
5763 }
5764
5765 /* Helper for num_insns_constant.  Calculate number of instructions to
5766    load VALUE to a single gpr using combinations of addi, addis, ori,
5767    oris and sldi instructions.  */
5768
5769 static int
5770 num_insns_constant_gpr (HOST_WIDE_INT value)
5771 {
5772   /* signed constant loadable with addi */
5773   if (((unsigned HOST_WIDE_INT) value + 0x8000) < 0x10000)
5774     return 1;
5775
5776   /* constant loadable with addis */
5777   else if ((value & 0xffff) == 0
5778            && (value >> 31 == -1 || value >> 31 == 0))
5779     return 1;
5780
5781   else if (TARGET_POWERPC64)
5782     {
5783       HOST_WIDE_INT low  = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
5784       HOST_WIDE_INT high = value >> 31;
5785
5786       if (high == 0 || high == -1)
5787         return 2;
5788
5789       high >>= 1;
5790
5791       if (low == 0)
5792         return num_insns_constant_gpr (high) + 1;
5793       else if (high == 0)
5794         return num_insns_constant_gpr (low) + 1;
5795       else
5796         return (num_insns_constant_gpr (high)
5797                 + num_insns_constant_gpr (low) + 1);
5798     }
5799
5800   else
5801     return 2;
5802 }
5803
5804 /* Helper for num_insns_constant.  Allow constants formed by the
5805    num_insns_constant_gpr sequences, plus li -1, rldicl/rldicr/rlwinm,
5806    and handle modes that require multiple gprs.  */
5807
5808 static int
5809 num_insns_constant_multi (HOST_WIDE_INT value, machine_mode mode)
5810 {
5811   int nregs = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5812   int total = 0;
5813   while (nregs-- > 0)
5814     {
5815       HOST_WIDE_INT low = sext_hwi (value, BITS_PER_WORD);
5816       int insns = num_insns_constant_gpr (low);
5817       if (insns > 2
5818           /* We won't get more than 2 from num_insns_constant_gpr
5819              except when TARGET_POWERPC64 and mode is DImode or
5820              wider, so the register mode must be DImode.  */
5821           && rs6000_is_valid_and_mask (GEN_INT (low), DImode))
5822         insns = 2;
5823       total += insns;
5824       value >>= BITS_PER_WORD;
5825     }
5826   return total;
5827 }
5828
5829 /* Return the number of instructions it takes to form a constant in as
5830    many gprs are needed for MODE.  */
5831
5832 int
5833 num_insns_constant (rtx op, machine_mode mode)
5834 {
5835   HOST_WIDE_INT val;
5836
5837   switch (GET_CODE (op))
5838     {
5839     case CONST_INT:
5840       val = INTVAL (op);
5841       break;
5842
5843     case CONST_WIDE_INT:
5844       {
5845         int insns = 0;
5846         for (int i = 0; i < CONST_WIDE_INT_NUNITS (op); i++)
5847           insns += num_insns_constant_multi (CONST_WIDE_INT_ELT (op, i),
5848                                              DImode);
5849         return insns;
5850       }
5851
5852     case CONST_DOUBLE:
5853       {
5854         const struct real_value *rv = CONST_DOUBLE_REAL_VALUE (op);
5855
5856         if (mode == SFmode || mode == SDmode)
5857           {
5858             long l;
5859
5860             if (mode == SDmode)
5861               REAL_VALUE_TO_TARGET_DECIMAL32 (*rv, l);
5862             else
5863               REAL_VALUE_TO_TARGET_SINGLE (*rv, l);
5864             /* See the first define_split in rs6000.md handling a
5865                const_double_operand.  */
5866             val = l;
5867             mode = SImode;
5868           }
5869         else if (mode == DFmode || mode == DDmode)
5870           {
5871             long l[2];
5872
5873             if (mode == DDmode)
5874               REAL_VALUE_TO_TARGET_DECIMAL64 (*rv, l);
5875             else
5876               REAL_VALUE_TO_TARGET_DOUBLE (*rv, l);
5877
5878             /* See the second (32-bit) and third (64-bit) define_split
5879                in rs6000.md handling a const_double_operand.  */
5880             val = (unsigned HOST_WIDE_INT) l[WORDS_BIG_ENDIAN ? 0 : 1] << 32;
5881             val |= l[WORDS_BIG_ENDIAN ? 1 : 0] & 0xffffffffUL;
5882             mode = DImode;
5883           }
5884         else if (mode == TFmode || mode == TDmode
5885                  || mode == KFmode || mode == IFmode)
5886           {
5887             long l[4];
5888             int insns;
5889
5890             if (mode == TDmode)
5891               REAL_VALUE_TO_TARGET_DECIMAL128 (*rv, l);
5892             else
5893               REAL_VALUE_TO_TARGET_LONG_DOUBLE (*rv, l);
5894
5895             val = (unsigned HOST_WIDE_INT) l[WORDS_BIG_ENDIAN ? 0 : 3] << 32;
5896             val |= l[WORDS_BIG_ENDIAN ? 1 : 2] & 0xffffffffUL;
5897             insns = num_insns_constant_multi (val, DImode);
5898             val = (unsigned HOST_WIDE_INT) l[WORDS_BIG_ENDIAN ? 2 : 1] << 32;
5899             val |= l[WORDS_BIG_ENDIAN ? 3 : 0] & 0xffffffffUL;
5900             insns += num_insns_constant_multi (val, DImode);
5901             return insns;
5902           }
5903         else
5904           gcc_unreachable ();
5905       }
5906       break;
5907
5908     default:
5909       gcc_unreachable ();
5910     }
5911
5912   return num_insns_constant_multi (val, mode);
5913 }
5914
5915 /* Interpret element ELT of the CONST_VECTOR OP as an integer value.
5916    If the mode of OP is MODE_VECTOR_INT, this simply returns the
5917    corresponding element of the vector, but for V4SFmode, the
5918    corresponding "float" is interpreted as an SImode integer.  */
5919
5920 HOST_WIDE_INT
5921 const_vector_elt_as_int (rtx op, unsigned int elt)
5922 {
5923   rtx tmp;
5924
5925   /* We can't handle V2DImode and V2DFmode vector constants here yet.  */
5926   gcc_assert (GET_MODE (op) != V2DImode
5927               && GET_MODE (op) != V2DFmode);
5928
5929   tmp = CONST_VECTOR_ELT (op, elt);
5930   if (GET_MODE (op) == V4SFmode)
5931     tmp = gen_lowpart (SImode, tmp);
5932   return INTVAL (tmp);
5933 }
5934
5935 /* Return true if OP can be synthesized with a particular vspltisb, vspltish
5936    or vspltisw instruction.  OP is a CONST_VECTOR.  Which instruction is used
5937    depends on STEP and COPIES, one of which will be 1.  If COPIES > 1,
5938    all items are set to the same value and contain COPIES replicas of the
5939    vsplt's operand; if STEP > 1, one in STEP elements is set to the vsplt's
5940    operand and the others are set to the value of the operand's msb.  */
5941
5942 static bool
5943 vspltis_constant (rtx op, unsigned step, unsigned copies)
5944 {
5945   machine_mode mode = GET_MODE (op);
5946   machine_mode inner = GET_MODE_INNER (mode);
5947
5948   unsigned i;
5949   unsigned nunits;
5950   unsigned bitsize;
5951   unsigned mask;
5952
5953   HOST_WIDE_INT val;
5954   HOST_WIDE_INT splat_val;
5955   HOST_WIDE_INT msb_val;
5956
5957   if (mode == V2DImode || mode == V2DFmode || mode == V1TImode)
5958     return false;
5959
5960   nunits = GET_MODE_NUNITS (mode);
5961   bitsize = GET_MODE_BITSIZE (inner);
5962   mask = GET_MODE_MASK (inner);
5963
5964   val = const_vector_elt_as_int (op, BYTES_BIG_ENDIAN ? nunits - 1 : 0);
5965   splat_val = val;
5966   msb_val = val >= 0 ? 0 : -1;
5967
5968   /* Construct the value to be splatted, if possible.  If not, return 0.  */
5969   for (i = 2; i <= copies; i *= 2)
5970     {
5971       HOST_WIDE_INT small_val;
5972       bitsize /= 2;
5973       small_val = splat_val >> bitsize;
5974       mask >>= bitsize;
5975       if (splat_val != ((HOST_WIDE_INT)
5976           ((unsigned HOST_WIDE_INT) small_val << bitsize)
5977           | (small_val & mask)))
5978         return false;
5979       splat_val = small_val;
5980     }
5981
5982   /* Check if SPLAT_VAL can really be the operand of a vspltis[bhw].  */
5983   if (EASY_VECTOR_15 (splat_val))
5984     ;
5985
5986   /* Also check if we can splat, and then add the result to itself.  Do so if
5987      the value is positive, of if the splat instruction is using OP's mode;
5988      for splat_val < 0, the splat and the add should use the same mode.  */
5989   else if (EASY_VECTOR_15_ADD_SELF (splat_val)
5990            && (splat_val >= 0 || (step == 1 && copies == 1)))
5991     ;
5992
5993   /* Also check if are loading up the most significant bit which can be done by
5994      loading up -1 and shifting the value left by -1.  */
5995   else if (EASY_VECTOR_MSB (splat_val, inner))
5996     ;
5997
5998   else
5999     return false;
6000
6001   /* Check if VAL is present in every STEP-th element, and the
6002      other elements are filled with its most significant bit.  */
6003   for (i = 1; i < nunits; ++i)
6004     {
6005       HOST_WIDE_INT desired_val;
6006       unsigned elt = BYTES_BIG_ENDIAN ? nunits - 1 - i : i;
6007       if ((i & (step - 1)) == 0)
6008         desired_val = val;
6009       else
6010         desired_val = msb_val;
6011
6012       if (desired_val != const_vector_elt_as_int (op, elt))
6013         return false;
6014     }
6015
6016   return true;
6017 }
6018
6019 /* Like vsplitis_constant, but allow the value to be shifted left with a VSLDOI
6020    instruction, filling in the bottom elements with 0 or -1.
6021
6022    Return 0 if the constant cannot be generated with VSLDOI.  Return positive
6023    for the number of zeroes to shift in, or negative for the number of 0xff
6024    bytes to shift in.
6025
6026    OP is a CONST_VECTOR.  */
6027
6028 int
6029 vspltis_shifted (rtx op)
6030 {
6031   machine_mode mode = GET_MODE (op);
6032   machine_mode inner = GET_MODE_INNER (mode);
6033
6034   unsigned i, j;
6035   unsigned nunits;
6036   unsigned mask;
6037
6038   HOST_WIDE_INT val;
6039
6040   if (mode != V16QImode && mode != V8HImode && mode != V4SImode)
6041     return false;
6042
6043   /* We need to create pseudo registers to do the shift, so don't recognize
6044      shift vector constants after reload.  */
6045   if (!can_create_pseudo_p ())
6046     return false;
6047
6048   nunits = GET_MODE_NUNITS (mode);
6049   mask = GET_MODE_MASK (inner);
6050
6051   val = const_vector_elt_as_int (op, BYTES_BIG_ENDIAN ? 0 : nunits - 1);
6052
6053   /* Check if the value can really be the operand of a vspltis[bhw].  */
6054   if (EASY_VECTOR_15 (val))
6055     ;
6056
6057   /* Also check if we are loading up the most significant bit which can be done
6058      by loading up -1 and shifting the value left by -1.  */
6059   else if (EASY_VECTOR_MSB (val, inner))
6060     ;
6061
6062   else
6063     return 0;
6064
6065   /* Check if VAL is present in every STEP-th element until we find elements
6066      that are 0 or all 1 bits.  */
6067   for (i = 1; i < nunits; ++i)
6068     {
6069       unsigned elt = BYTES_BIG_ENDIAN ? i : nunits - 1 - i;
6070       HOST_WIDE_INT elt_val = const_vector_elt_as_int (op, elt);
6071
6072       /* If the value isn't the splat value, check for the remaining elements
6073          being 0/-1.  */
6074       if (val != elt_val)
6075         {
6076           if (elt_val == 0)
6077             {
6078               for (j = i+1; j < nunits; ++j)
6079                 {
6080                   unsigned elt2 = BYTES_BIG_ENDIAN ? j : nunits - 1 - j;
6081                   if (const_vector_elt_as_int (op, elt2) != 0)
6082                     return 0;
6083                 }
6084
6085               return (nunits - i) * GET_MODE_SIZE (inner);
6086             }
6087
6088           else if ((elt_val & mask) == mask)
6089             {
6090               for (j = i+1; j < nunits; ++j)
6091                 {
6092                   unsigned elt2 = BYTES_BIG_ENDIAN ? j : nunits - 1 - j;
6093                   if ((const_vector_elt_as_int (op, elt2) & mask) != mask)
6094                     return 0;
6095                 }
6096
6097               return -((nunits - i) * GET_MODE_SIZE (inner));
6098             }
6099
6100           else
6101             return 0;
6102         }
6103     }
6104
6105   /* If all elements are equal, we don't need to do VLSDOI.  */
6106   return 0;
6107 }
6108
6109
6110 /* Return true if OP is of the given MODE and can be synthesized
6111    with a vspltisb, vspltish or vspltisw.  */
6112
6113 bool
6114 easy_altivec_constant (rtx op, machine_mode mode)
6115 {
6116   unsigned step, copies;
6117
6118   if (mode == VOIDmode)
6119     mode = GET_MODE (op);
6120   else if (mode != GET_MODE (op))
6121     return false;
6122
6123   /* V2DI/V2DF was added with VSX.  Only allow 0 and all 1's as easy
6124      constants.  */
6125   if (mode == V2DFmode)
6126     return zero_constant (op, mode);
6127
6128   else if (mode == V2DImode)
6129     {
6130       if (!CONST_INT_P (CONST_VECTOR_ELT (op, 0))
6131           || !CONST_INT_P (CONST_VECTOR_ELT (op, 1)))
6132         return false;
6133
6134       if (zero_constant (op, mode))
6135         return true;
6136
6137       if (INTVAL (CONST_VECTOR_ELT (op, 0)) == -1
6138           && INTVAL (CONST_VECTOR_ELT (op, 1)) == -1)
6139         return true;
6140
6141       return false;
6142     }
6143
6144   /* V1TImode is a special container for TImode.  Ignore for now.  */
6145   else if (mode == V1TImode)
6146     return false;
6147
6148   /* Start with a vspltisw.  */
6149   step = GET_MODE_NUNITS (mode) / 4;
6150   copies = 1;
6151
6152   if (vspltis_constant (op, step, copies))
6153     return true;
6154
6155   /* Then try with a vspltish.  */
6156   if (step == 1)
6157     copies <<= 1;
6158   else
6159     step >>= 1;
6160
6161   if (vspltis_constant (op, step, copies))
6162     return true;
6163
6164   /* And finally a vspltisb.  */
6165   if (step == 1)
6166     copies <<= 1;
6167   else
6168     step >>= 1;
6169
6170   if (vspltis_constant (op, step, copies))
6171     return true;
6172
6173   if (vspltis_shifted (op) != 0)
6174     return true;
6175
6176   return false;
6177 }
6178
6179 /* Generate a VEC_DUPLICATE representing a vspltis[bhw] instruction whose
6180    result is OP.  Abort if it is not possible.  */
6181
6182 rtx
6183 gen_easy_altivec_constant (rtx op)
6184 {
6185   machine_mode mode = GET_MODE (op);
6186   int nunits = GET_MODE_NUNITS (mode);
6187   rtx val = CONST_VECTOR_ELT (op, BYTES_BIG_ENDIAN ? nunits - 1 : 0);
6188   unsigned step = nunits / 4;
6189   unsigned copies = 1;
6190
6191   /* Start with a vspltisw.  */
6192   if (vspltis_constant (op, step, copies))
6193     return gen_rtx_VEC_DUPLICATE (V4SImode, gen_lowpart (SImode, val));
6194
6195   /* Then try with a vspltish.  */
6196   if (step == 1)
6197     copies <<= 1;
6198   else
6199     step >>= 1;
6200
6201   if (vspltis_constant (op, step, copies))
6202     return gen_rtx_VEC_DUPLICATE (V8HImode, gen_lowpart (HImode, val));
6203
6204   /* And finally a vspltisb.  */
6205   if (step == 1)
6206     copies <<= 1;
6207   else
6208     step >>= 1;
6209
6210   if (vspltis_constant (op, step, copies))
6211     return gen_rtx_VEC_DUPLICATE (V16QImode, gen_lowpart (QImode, val));
6212
6213   gcc_unreachable ();
6214 }
6215
6216 /* Return true if OP is of the given MODE and can be synthesized with ISA 3.0
6217    instructions (xxspltib, vupkhsb/vextsb2w/vextb2d).
6218
6219    Return the number of instructions needed (1 or 2) into the address pointed
6220    via NUM_INSNS_PTR.
6221
6222    Return the constant that is being split via CONSTANT_PTR.  */
6223
6224 bool
6225 xxspltib_constant_p (rtx op,
6226                      machine_mode mode,
6227                      int *num_insns_ptr,
6228                      int *constant_ptr)
6229 {
6230   size_t nunits = GET_MODE_NUNITS (mode);
6231   size_t i;
6232   HOST_WIDE_INT value;
6233   rtx element;
6234
6235   /* Set the returned values to out of bound values.  */
6236   *num_insns_ptr = -1;
6237   *constant_ptr = 256;
6238
6239   if (!TARGET_P9_VECTOR)
6240     return false;
6241
6242   if (mode == VOIDmode)
6243     mode = GET_MODE (op);
6244
6245   else if (mode != GET_MODE (op) && GET_MODE (op) != VOIDmode)
6246     return false;
6247
6248   /* Handle (vec_duplicate <constant>).  */
6249   if (GET_CODE (op) == VEC_DUPLICATE)
6250     {
6251       if (mode != V16QImode && mode != V8HImode && mode != V4SImode
6252           && mode != V2DImode)
6253         return false;
6254
6255       element = XEXP (op, 0);
6256       if (!CONST_INT_P (element))
6257         return false;
6258
6259       value = INTVAL (element);
6260       if (!IN_RANGE (value, -128, 127))
6261         return false;
6262     }
6263
6264   /* Handle (const_vector [...]).  */
6265   else if (GET_CODE (op) == CONST_VECTOR)
6266     {
6267       if (mode != V16QImode && mode != V8HImode && mode != V4SImode
6268           && mode != V2DImode)
6269         return false;
6270
6271       element = CONST_VECTOR_ELT (op, 0);
6272       if (!CONST_INT_P (element))
6273         return false;
6274
6275       value = INTVAL (element);
6276       if (!IN_RANGE (value, -128, 127))
6277         return false;
6278
6279       for (i = 1; i < nunits; i++)
6280         {
6281           element = CONST_VECTOR_ELT (op, i);
6282           if (!CONST_INT_P (element))
6283             return false;
6284
6285           if (value != INTVAL (element))
6286             return false;
6287         }
6288     }
6289
6290   /* Handle integer constants being loaded into the upper part of the VSX
6291      register as a scalar.  If the value isn't 0/-1, only allow it if the mode
6292      can go in Altivec registers.  Prefer VSPLTISW/VUPKHSW over XXSPLITIB.  */
6293   else if (CONST_INT_P (op))
6294     {
6295       if (!SCALAR_INT_MODE_P (mode))
6296         return false;
6297
6298       value = INTVAL (op);
6299       if (!IN_RANGE (value, -128, 127))
6300         return false;
6301
6302       if (!IN_RANGE (value, -1, 0))
6303         {
6304           if (!(reg_addr[mode].addr_mask[RELOAD_REG_VMX] & RELOAD_REG_VALID))
6305             return false;
6306
6307           if (EASY_VECTOR_15 (value))
6308             return false;
6309         }
6310     }
6311
6312   else
6313     return false;
6314
6315   /* See if we could generate vspltisw/vspltish directly instead of xxspltib +
6316      sign extend.  Special case 0/-1 to allow getting any VSX register instead
6317      of an Altivec register.  */
6318   if ((mode == V4SImode || mode == V8HImode) && !IN_RANGE (value, -1, 0)
6319       && EASY_VECTOR_15 (value))
6320     return false;
6321
6322   /* Return # of instructions and the constant byte for XXSPLTIB.  */
6323   if (mode == V16QImode)
6324     *num_insns_ptr = 1;
6325
6326   else if (IN_RANGE (value, -1, 0))
6327     *num_insns_ptr = 1;
6328
6329   else
6330     *num_insns_ptr = 2;
6331
6332   *constant_ptr = (int) value;
6333   return true;
6334 }
6335
6336 const char *
6337 output_vec_const_move (rtx *operands)
6338 {
6339   int shift;
6340   machine_mode mode;
6341   rtx dest, vec;
6342
6343   dest = operands[0];
6344   vec = operands[1];
6345   mode = GET_MODE (dest);
6346
6347   if (TARGET_VSX)
6348     {
6349       bool dest_vmx_p = ALTIVEC_REGNO_P (REGNO (dest));
6350       int xxspltib_value = 256;
6351       int num_insns = -1;
6352
6353       if (zero_constant (vec, mode))
6354         {
6355           if (TARGET_P9_VECTOR)
6356             return "xxspltib %x0,0";
6357
6358           else if (dest_vmx_p)
6359             return "vspltisw %0,0";
6360
6361           else
6362             return "xxlxor %x0,%x0,%x0";
6363         }
6364
6365       if (all_ones_constant (vec, mode))
6366         {
6367           if (TARGET_P9_VECTOR)
6368             return "xxspltib %x0,255";
6369
6370           else if (dest_vmx_p)
6371             return "vspltisw %0,-1";
6372
6373           else if (TARGET_P8_VECTOR)
6374             return "xxlorc %x0,%x0,%x0";
6375
6376           else
6377             gcc_unreachable ();
6378         }
6379
6380       if (TARGET_P9_VECTOR
6381           && xxspltib_constant_p (vec, mode, &num_insns, &xxspltib_value))
6382         {
6383           if (num_insns == 1)
6384             {
6385               operands[2] = GEN_INT (xxspltib_value & 0xff);
6386               return "xxspltib %x0,%2";
6387             }
6388
6389           return "#";
6390         }
6391     }
6392
6393   if (TARGET_ALTIVEC)
6394     {
6395       rtx splat_vec;
6396
6397       gcc_assert (ALTIVEC_REGNO_P (REGNO (dest)));
6398       if (zero_constant (vec, mode))
6399         return "vspltisw %0,0";
6400
6401       if (all_ones_constant (vec, mode))
6402         return "vspltisw %0,-1";
6403
6404       /* Do we need to construct a value using VSLDOI?  */
6405       shift = vspltis_shifted (vec);
6406       if (shift != 0)
6407         return "#";
6408
6409       splat_vec = gen_easy_altivec_constant (vec);
6410       gcc_assert (GET_CODE (splat_vec) == VEC_DUPLICATE);
6411       operands[1] = XEXP (splat_vec, 0);
6412       if (!EASY_VECTOR_15 (INTVAL (operands[1])))
6413         return "#";
6414
6415       switch (GET_MODE (splat_vec))
6416         {
6417         case E_V4SImode:
6418           return "vspltisw %0,%1";
6419
6420         case E_V8HImode:
6421           return "vspltish %0,%1";
6422
6423         case E_V16QImode:
6424           return "vspltisb %0,%1";
6425
6426         default:
6427           gcc_unreachable ();
6428         }
6429     }
6430
6431   gcc_unreachable ();
6432 }
6433
6434 /* Initialize vector TARGET to VALS.  */
6435
6436 void
6437 rs6000_expand_vector_init (rtx target, rtx vals)
6438 {
6439   machine_mode mode = GET_MODE (target);
6440   machine_mode inner_mode = GET_MODE_INNER (mode);
6441   int n_elts = GET_MODE_NUNITS (mode);
6442   int n_var = 0, one_var = -1;
6443   bool all_same = true, all_const_zero = true;
6444   rtx x, mem;
6445   int i;
6446
6447   for (i = 0; i < n_elts; ++i)
6448     {
6449       x = XVECEXP (vals, 0, i);
6450       if (!(CONST_SCALAR_INT_P (x) || CONST_DOUBLE_P (x) || CONST_FIXED_P (x)))
6451         ++n_var, one_var = i;
6452       else if (x != CONST0_RTX (inner_mode))
6453         all_const_zero = false;
6454
6455       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
6456         all_same = false;
6457     }
6458
6459   if (n_var == 0)
6460     {
6461       rtx const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0));
6462       bool int_vector_p = (GET_MODE_CLASS (mode) == MODE_VECTOR_INT);
6463       if ((int_vector_p || TARGET_VSX) && all_const_zero)
6464         {
6465           /* Zero register.  */
6466           emit_move_insn (target, CONST0_RTX (mode));
6467           return;
6468         }
6469       else if (int_vector_p && easy_vector_constant (const_vec, mode))
6470         {
6471           /* Splat immediate.  */
6472           emit_insn (gen_rtx_SET (target, const_vec));
6473           return;
6474         }
6475       else
6476         {
6477           /* Load from constant pool.  */
6478           emit_move_insn (target, const_vec);
6479           return;
6480         }
6481     }
6482
6483   /* Double word values on VSX can use xxpermdi or lxvdsx.  */
6484   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
6485     {
6486       rtx op[2];
6487       size_t i;
6488       size_t num_elements = all_same ? 1 : 2;
6489       for (i = 0; i < num_elements; i++)
6490         {
6491           op[i] = XVECEXP (vals, 0, i);
6492           /* Just in case there is a SUBREG with a smaller mode, do a
6493              conversion.  */
6494           if (GET_MODE (op[i]) != inner_mode)
6495             {
6496               rtx tmp = gen_reg_rtx (inner_mode);
6497               convert_move (tmp, op[i], 0);
6498               op[i] = tmp;
6499             }
6500           /* Allow load with splat double word.  */
6501           else if (MEM_P (op[i]))
6502             {
6503               if (!all_same)
6504                 op[i] = force_reg (inner_mode, op[i]);
6505             }
6506           else if (!REG_P (op[i]))
6507             op[i] = force_reg (inner_mode, op[i]);
6508         }
6509
6510       if (all_same)
6511         {
6512           if (mode == V2DFmode)
6513             emit_insn (gen_vsx_splat_v2df (target, op[0]));
6514           else
6515             emit_insn (gen_vsx_splat_v2di (target, op[0]));
6516         }
6517       else
6518         {
6519           if (mode == V2DFmode)
6520             emit_insn (gen_vsx_concat_v2df (target, op[0], op[1]));
6521           else
6522             emit_insn (gen_vsx_concat_v2di (target, op[0], op[1]));
6523         }
6524       return;
6525     }
6526
6527   /* Special case initializing vector int if we are on 64-bit systems with
6528      direct move or we have the ISA 3.0 instructions.  */
6529   if (mode == V4SImode  && VECTOR_MEM_VSX_P (V4SImode)
6530       && TARGET_DIRECT_MOVE_64BIT)
6531     {
6532       if (all_same)
6533         {
6534           rtx element0 = XVECEXP (vals, 0, 0);
6535           if (MEM_P (element0))
6536             element0 = rs6000_force_indexed_or_indirect_mem (element0);
6537           else
6538             element0 = force_reg (SImode, element0);
6539
6540           if (TARGET_P9_VECTOR)
6541             emit_insn (gen_vsx_splat_v4si (target, element0));
6542           else
6543             {
6544               rtx tmp = gen_reg_rtx (DImode);
6545               emit_insn (gen_zero_extendsidi2 (tmp, element0));
6546               emit_insn (gen_vsx_splat_v4si_di (target, tmp));
6547             }
6548           return;
6549         }
6550       else
6551         {
6552           rtx elements[4];
6553           size_t i;
6554
6555           for (i = 0; i < 4; i++)
6556             elements[i] = force_reg (SImode, XVECEXP (vals, 0, i));
6557
6558           emit_insn (gen_vsx_init_v4si (target, elements[0], elements[1],
6559                                         elements[2], elements[3]));
6560           return;
6561         }
6562     }
6563
6564   /* With single precision floating point on VSX, know that internally single
6565      precision is actually represented as a double, and either make 2 V2DF
6566      vectors, and convert these vectors to single precision, or do one
6567      conversion, and splat the result to the other elements.  */
6568   if (mode == V4SFmode && VECTOR_MEM_VSX_P (V4SFmode))
6569     {
6570       if (all_same)
6571         {
6572           rtx element0 = XVECEXP (vals, 0, 0);
6573
6574           if (TARGET_P9_VECTOR)
6575             {
6576               if (MEM_P (element0))
6577                 element0 = rs6000_force_indexed_or_indirect_mem (element0);
6578
6579               emit_insn (gen_vsx_splat_v4sf (target, element0));
6580             }
6581
6582           else
6583             {
6584               rtx freg = gen_reg_rtx (V4SFmode);
6585               rtx sreg = force_reg (SFmode, element0);
6586               rtx cvt  = (TARGET_XSCVDPSPN
6587                           ? gen_vsx_xscvdpspn_scalar (freg, sreg)
6588                           : gen_vsx_xscvdpsp_scalar (freg, sreg));
6589
6590               emit_insn (cvt);
6591               emit_insn (gen_vsx_xxspltw_v4sf_direct (target, freg,
6592                                                       const0_rtx));
6593             }
6594         }
6595       else
6596         {
6597           rtx dbl_even = gen_reg_rtx (V2DFmode);
6598           rtx dbl_odd  = gen_reg_rtx (V2DFmode);
6599           rtx flt_even = gen_reg_rtx (V4SFmode);
6600           rtx flt_odd  = gen_reg_rtx (V4SFmode);
6601           rtx op0 = force_reg (SFmode, XVECEXP (vals, 0, 0));
6602           rtx op1 = force_reg (SFmode, XVECEXP (vals, 0, 1));
6603           rtx op2 = force_reg (SFmode, XVECEXP (vals, 0, 2));
6604           rtx op3 = force_reg (SFmode, XVECEXP (vals, 0, 3));
6605
6606           /* Use VMRGEW if we can instead of doing a permute.  */
6607           if (TARGET_P8_VECTOR)
6608             {
6609               emit_insn (gen_vsx_concat_v2sf (dbl_even, op0, op2));
6610               emit_insn (gen_vsx_concat_v2sf (dbl_odd, op1, op3));
6611               emit_insn (gen_vsx_xvcvdpsp (flt_even, dbl_even));
6612               emit_insn (gen_vsx_xvcvdpsp (flt_odd, dbl_odd));
6613               if (BYTES_BIG_ENDIAN)
6614                 emit_insn (gen_p8_vmrgew_v4sf_direct (target, flt_even, flt_odd));
6615               else
6616                 emit_insn (gen_p8_vmrgew_v4sf_direct (target, flt_odd, flt_even));
6617             }
6618           else
6619             {
6620               emit_insn (gen_vsx_concat_v2sf (dbl_even, op0, op1));
6621               emit_insn (gen_vsx_concat_v2sf (dbl_odd, op2, op3));
6622               emit_insn (gen_vsx_xvcvdpsp (flt_even, dbl_even));
6623               emit_insn (gen_vsx_xvcvdpsp (flt_odd, dbl_odd));
6624               rs6000_expand_extract_even (target, flt_even, flt_odd);
6625             }
6626         }
6627       return;
6628     }
6629
6630   /* Special case initializing vector short/char that are splats if we are on
6631      64-bit systems with direct move.  */
6632   if (all_same && TARGET_DIRECT_MOVE_64BIT
6633       && (mode == V16QImode || mode == V8HImode))
6634     {
6635       rtx op0 = XVECEXP (vals, 0, 0);
6636       rtx di_tmp = gen_reg_rtx (DImode);
6637
6638       if (!REG_P (op0))
6639         op0 = force_reg (GET_MODE_INNER (mode), op0);
6640
6641       if (mode == V16QImode)
6642         {
6643           emit_insn (gen_zero_extendqidi2 (di_tmp, op0));
6644           emit_insn (gen_vsx_vspltb_di (target, di_tmp));
6645           return;
6646         }
6647
6648       if (mode == V8HImode)
6649         {
6650           emit_insn (gen_zero_extendhidi2 (di_tmp, op0));
6651           emit_insn (gen_vsx_vsplth_di (target, di_tmp));
6652           return;
6653         }
6654     }
6655
6656   /* Store value to stack temp.  Load vector element.  Splat.  However, splat
6657      of 64-bit items is not supported on Altivec.  */
6658   if (all_same && GET_MODE_SIZE (inner_mode) <= 4)
6659     {
6660       mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode));
6661       emit_move_insn (adjust_address_nv (mem, inner_mode, 0),
6662                       XVECEXP (vals, 0, 0));
6663       x = gen_rtx_UNSPEC (VOIDmode,
6664                           gen_rtvec (1, const0_rtx), UNSPEC_LVE);
6665       emit_insn (gen_rtx_PARALLEL (VOIDmode,
6666                                    gen_rtvec (2,
6667                                               gen_rtx_SET (target, mem),
6668                                               x)));
6669       x = gen_rtx_VEC_SELECT (inner_mode, target,
6670                               gen_rtx_PARALLEL (VOIDmode,
6671                                                 gen_rtvec (1, const0_rtx)));
6672       emit_insn (gen_rtx_SET (target, gen_rtx_VEC_DUPLICATE (mode, x)));
6673       return;
6674     }
6675
6676   /* One field is non-constant.  Load constant then overwrite
6677      varying field.  */
6678   if (n_var == 1)
6679     {
6680       rtx copy = copy_rtx (vals);
6681
6682       /* Load constant part of vector, substitute neighboring value for
6683          varying element.  */
6684       XVECEXP (copy, 0, one_var) = XVECEXP (vals, 0, (one_var + 1) % n_elts);
6685       rs6000_expand_vector_init (target, copy);
6686
6687       /* Insert variable.  */
6688       rs6000_expand_vector_set (target, XVECEXP (vals, 0, one_var), one_var);
6689       return;
6690     }
6691
6692   /* Construct the vector in memory one field at a time
6693      and load the whole vector.  */
6694   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode));
6695   for (i = 0; i < n_elts; i++)
6696     emit_move_insn (adjust_address_nv (mem, inner_mode,
6697                                     i * GET_MODE_SIZE (inner_mode)),
6698                     XVECEXP (vals, 0, i));
6699   emit_move_insn (target, mem);
6700 }
6701
6702 /* Set field ELT of TARGET to VAL.  */
6703
6704 void
6705 rs6000_expand_vector_set (rtx target, rtx val, int elt)
6706 {
6707   machine_mode mode = GET_MODE (target);
6708   machine_mode inner_mode = GET_MODE_INNER (mode);
6709   rtx reg = gen_reg_rtx (mode);
6710   rtx mask, mem, x;
6711   int width = GET_MODE_SIZE (inner_mode);
6712   int i;
6713
6714   val = force_reg (GET_MODE (val), val);
6715
6716   if (VECTOR_MEM_VSX_P (mode))
6717     {
6718       rtx insn = NULL_RTX;
6719       rtx elt_rtx = GEN_INT (elt);
6720
6721       if (mode == V2DFmode)
6722         insn = gen_vsx_set_v2df (target, target, val, elt_rtx);
6723
6724       else if (mode == V2DImode)
6725         insn = gen_vsx_set_v2di (target, target, val, elt_rtx);
6726
6727       else if (TARGET_P9_VECTOR && TARGET_POWERPC64)
6728         {
6729           if (mode == V4SImode)
6730             insn = gen_vsx_set_v4si_p9 (target, target, val, elt_rtx);
6731           else if (mode == V8HImode)
6732             insn = gen_vsx_set_v8hi_p9 (target, target, val, elt_rtx);
6733           else if (mode == V16QImode)
6734             insn = gen_vsx_set_v16qi_p9 (target, target, val, elt_rtx);
6735           else if (mode == V4SFmode)
6736             insn = gen_vsx_set_v4sf_p9 (target, target, val, elt_rtx);
6737         }
6738
6739       if (insn)
6740         {
6741           emit_insn (insn);
6742           return;
6743         }
6744     }
6745
6746   /* Simplify setting single element vectors like V1TImode.  */
6747   if (GET_MODE_SIZE (mode) == GET_MODE_SIZE (inner_mode) && elt == 0)
6748     {
6749       emit_move_insn (target, gen_lowpart (mode, val));
6750       return;
6751     }
6752
6753   /* Load single variable value.  */
6754   mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode));
6755   emit_move_insn (adjust_address_nv (mem, inner_mode, 0), val);
6756   x = gen_rtx_UNSPEC (VOIDmode,
6757                       gen_rtvec (1, const0_rtx), UNSPEC_LVE);
6758   emit_insn (gen_rtx_PARALLEL (VOIDmode,
6759                                gen_rtvec (2,
6760                                           gen_rtx_SET (reg, mem),
6761                                           x)));
6762
6763   /* Linear sequence.  */
6764   mask = gen_rtx_PARALLEL (V16QImode, rtvec_alloc (16));
6765   for (i = 0; i < 16; ++i)
6766     XVECEXP (mask, 0, i) = GEN_INT (i);
6767
6768   /* Set permute mask to insert element into target.  */
6769   for (i = 0; i < width; ++i)
6770     XVECEXP (mask, 0, elt*width + i)
6771       = GEN_INT (i + 0x10);
6772   x = gen_rtx_CONST_VECTOR (V16QImode, XVEC (mask, 0));
6773
6774   if (BYTES_BIG_ENDIAN)
6775     x = gen_rtx_UNSPEC (mode,
6776                         gen_rtvec (3, target, reg,
6777                                    force_reg (V16QImode, x)),
6778                         UNSPEC_VPERM);
6779   else
6780     {
6781       if (TARGET_P9_VECTOR)
6782         x = gen_rtx_UNSPEC (mode,
6783                             gen_rtvec (3, reg, target,
6784                                        force_reg (V16QImode, x)),
6785                             UNSPEC_VPERMR);
6786       else
6787         {
6788           /* Invert selector.  We prefer to generate VNAND on P8 so
6789              that future fusion opportunities can kick in, but must
6790              generate VNOR elsewhere.  */
6791           rtx notx = gen_rtx_NOT (V16QImode, force_reg (V16QImode, x));
6792           rtx iorx = (TARGET_P8_VECTOR
6793                       ? gen_rtx_IOR (V16QImode, notx, notx)
6794                       : gen_rtx_AND (V16QImode, notx, notx));
6795           rtx tmp = gen_reg_rtx (V16QImode);
6796           emit_insn (gen_rtx_SET (tmp, iorx));
6797
6798           /* Permute with operands reversed and adjusted selector.  */
6799           x = gen_rtx_UNSPEC (mode, gen_rtvec (3, reg, target, tmp),
6800                               UNSPEC_VPERM);
6801         }
6802     }
6803
6804   emit_insn (gen_rtx_SET (target, x));
6805 }
6806
6807 /* Extract field ELT from VEC into TARGET.  */
6808
6809 void
6810 rs6000_expand_vector_extract (rtx target, rtx vec, rtx elt)
6811 {
6812   machine_mode mode = GET_MODE (vec);
6813   machine_mode inner_mode = GET_MODE_INNER (mode);
6814   rtx mem;
6815
6816   if (VECTOR_MEM_VSX_P (mode) && CONST_INT_P (elt))
6817     {
6818       switch (mode)
6819         {
6820         default:
6821           break;
6822         case E_V1TImode:
6823           emit_move_insn (target, gen_lowpart (TImode, vec));
6824           break;
6825         case E_V2DFmode:
6826           emit_insn (gen_vsx_extract_v2df (target, vec, elt));
6827           return;
6828         case E_V2DImode:
6829           emit_insn (gen_vsx_extract_v2di (target, vec, elt));
6830           return;
6831         case E_V4SFmode:
6832           emit_insn (gen_vsx_extract_v4sf (target, vec, elt));
6833           return;
6834         case E_V16QImode:
6835           if (TARGET_DIRECT_MOVE_64BIT)
6836             {
6837               emit_insn (gen_vsx_extract_v16qi (target, vec, elt));
6838               return;
6839             }
6840           else
6841             break;
6842         case E_V8HImode:
6843           if (TARGET_DIRECT_MOVE_64BIT)
6844             {
6845               emit_insn (gen_vsx_extract_v8hi (target, vec, elt));
6846               return;
6847             }
6848           else
6849             break;
6850         case E_V4SImode:
6851           if (TARGET_DIRECT_MOVE_64BIT)
6852             {
6853               emit_insn (gen_vsx_extract_v4si (target, vec, elt));
6854               return;
6855             }
6856           break;
6857         }
6858     }
6859   else if (VECTOR_MEM_VSX_P (mode) && !CONST_INT_P (elt)
6860            && TARGET_DIRECT_MOVE_64BIT)
6861     {
6862       if (GET_MODE (elt) != DImode)
6863         {
6864           rtx tmp = gen_reg_rtx (DImode);
6865           convert_move (tmp, elt, 0);
6866           elt = tmp;
6867         }
6868       else if (!REG_P (elt))
6869         elt = force_reg (DImode, elt);
6870
6871       switch (mode)
6872         {
6873         case E_V1TImode:
6874           emit_move_insn (target, gen_lowpart (TImode, vec));
6875           return;
6876
6877         case E_V2DFmode:
6878           emit_insn (gen_vsx_extract_v2df_var (target, vec, elt));
6879           return;
6880
6881         case E_V2DImode:
6882           emit_insn (gen_vsx_extract_v2di_var (target, vec, elt));
6883           return;
6884
6885         case E_V4SFmode:
6886           emit_insn (gen_vsx_extract_v4sf_var (target, vec, elt));
6887           return;
6888
6889         case E_V4SImode:
6890           emit_insn (gen_vsx_extract_v4si_var (target, vec, elt));
6891           return;
6892
6893         case E_V8HImode:
6894           emit_insn (gen_vsx_extract_v8hi_var (target, vec, elt));
6895           return;
6896
6897         case E_V16QImode:
6898           emit_insn (gen_vsx_extract_v16qi_var (target, vec, elt));
6899           return;
6900
6901         default:
6902           gcc_unreachable ();
6903         }
6904     }
6905
6906   /* Allocate mode-sized buffer.  */
6907   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode));
6908
6909   emit_move_insn (mem, vec);
6910   if (CONST_INT_P (elt))
6911     {
6912       int modulo_elt = INTVAL (elt) % GET_MODE_NUNITS (mode);
6913
6914       /* Add offset to field within buffer matching vector element.  */
6915       mem = adjust_address_nv (mem, inner_mode,
6916                                modulo_elt * GET_MODE_SIZE (inner_mode));
6917       emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0));
6918     }
6919   else
6920     {
6921       unsigned int ele_size = GET_MODE_SIZE (inner_mode);
6922       rtx num_ele_m1 = GEN_INT (GET_MODE_NUNITS (mode) - 1);
6923       rtx new_addr = gen_reg_rtx (Pmode);
6924
6925       elt = gen_rtx_AND (Pmode, elt, num_ele_m1);
6926       if (ele_size > 1)
6927         elt = gen_rtx_MULT (Pmode, elt, GEN_INT (ele_size));
6928       new_addr = gen_rtx_PLUS (Pmode, XEXP (mem, 0), elt);
6929       new_addr = change_address (mem, inner_mode, new_addr);
6930       emit_move_insn (target, new_addr);
6931     }
6932 }
6933
6934 /* Adjust a memory address (MEM) of a vector type to point to a scalar field
6935    within the vector (ELEMENT) with a mode (SCALAR_MODE).  Use a base register
6936    temporary (BASE_TMP) to fixup the address.  Return the new memory address
6937    that is valid for reads or writes to a given register (SCALAR_REG).  */
6938
6939 rtx
6940 rs6000_adjust_vec_address (rtx scalar_reg,
6941                            rtx mem,
6942                            rtx element,
6943                            rtx base_tmp,
6944                            machine_mode scalar_mode)
6945 {
6946   unsigned scalar_size = GET_MODE_SIZE (scalar_mode);
6947   rtx addr = XEXP (mem, 0);
6948   rtx element_offset;
6949   rtx new_addr;
6950   bool valid_addr_p;
6951
6952   /* Vector addresses should not have PRE_INC, PRE_DEC, or PRE_MODIFY.  */
6953   gcc_assert (GET_RTX_CLASS (GET_CODE (addr)) != RTX_AUTOINC);
6954
6955   /* Calculate what we need to add to the address to get the element
6956      address.  */
6957   if (CONST_INT_P (element))
6958     element_offset = GEN_INT (INTVAL (element) * scalar_size);
6959   else
6960     {
6961       int byte_shift = exact_log2 (scalar_size);
6962       gcc_assert (byte_shift >= 0);
6963
6964       if (byte_shift == 0)
6965         element_offset = element;
6966
6967       else
6968         {
6969           if (TARGET_POWERPC64)
6970             emit_insn (gen_ashldi3 (base_tmp, element, GEN_INT (byte_shift)));
6971           else
6972             emit_insn (gen_ashlsi3 (base_tmp, element, GEN_INT (byte_shift)));
6973
6974           element_offset = base_tmp;
6975         }
6976     }
6977
6978   /* Create the new address pointing to the element within the vector.  If we
6979      are adding 0, we don't have to change the address.  */
6980   if (element_offset == const0_rtx)
6981     new_addr = addr;
6982
6983   /* A simple indirect address can be converted into a reg + offset
6984      address.  */
6985   else if (REG_P (addr) || SUBREG_P (addr))
6986     new_addr = gen_rtx_PLUS (Pmode, addr, element_offset);
6987
6988   /* Optimize D-FORM addresses with constant offset with a constant element, to
6989      include the element offset in the address directly.  */
6990   else if (GET_CODE (addr) == PLUS)
6991     {
6992       rtx op0 = XEXP (addr, 0);
6993       rtx op1 = XEXP (addr, 1);
6994       rtx insn;
6995
6996       gcc_assert (REG_P (op0) || SUBREG_P (op0));
6997       if (CONST_INT_P (op1) && CONST_INT_P (element_offset))
6998         {
6999           HOST_WIDE_INT offset = INTVAL (op1) + INTVAL (element_offset);
7000           rtx offset_rtx = GEN_INT (offset);
7001
7002           if (IN_RANGE (offset, -32768, 32767)
7003               && (scalar_size < 8 || (offset & 0x3) == 0))
7004             new_addr = gen_rtx_PLUS (Pmode, op0, offset_rtx);
7005           else
7006             {
7007               emit_move_insn (base_tmp, offset_rtx);
7008               new_addr = gen_rtx_PLUS (Pmode, op0, base_tmp);
7009             }
7010         }
7011       else
7012         {
7013           bool op1_reg_p = (REG_P (op1) || SUBREG_P (op1));
7014           bool ele_reg_p = (REG_P (element_offset) || SUBREG_P (element_offset));
7015
7016           /* Note, ADDI requires the register being added to be a base
7017              register.  If the register was R0, load it up into the temporary
7018              and do the add.  */
7019           if (op1_reg_p
7020               && (ele_reg_p || reg_or_subregno (op1) != FIRST_GPR_REGNO))
7021             {
7022               insn = gen_add3_insn (base_tmp, op1, element_offset);
7023               gcc_assert (insn != NULL_RTX);
7024               emit_insn (insn);
7025             }
7026
7027           else if (ele_reg_p
7028                    && reg_or_subregno (element_offset) != FIRST_GPR_REGNO)
7029             {
7030               insn = gen_add3_insn (base_tmp, element_offset, op1);
7031               gcc_assert (insn != NULL_RTX);
7032               emit_insn (insn);
7033             }
7034
7035           else
7036             {
7037               emit_move_insn (base_tmp, op1);
7038               emit_insn (gen_add2_insn (base_tmp, element_offset));
7039             }
7040
7041           new_addr = gen_rtx_PLUS (Pmode, op0, base_tmp);
7042         }
7043     }
7044
7045   else
7046     {
7047       emit_move_insn (base_tmp, addr);
7048       new_addr = gen_rtx_PLUS (Pmode, base_tmp, element_offset);
7049     }
7050
7051   /* If we have a PLUS, we need to see whether the particular register class
7052      allows for D-FORM or X-FORM addressing.  */
7053   if (GET_CODE (new_addr) == PLUS)
7054     {
7055       rtx op1 = XEXP (new_addr, 1);
7056       addr_mask_type addr_mask;
7057       unsigned int scalar_regno = reg_or_subregno (scalar_reg);
7058
7059       gcc_assert (HARD_REGISTER_NUM_P (scalar_regno));
7060       if (INT_REGNO_P (scalar_regno))
7061         addr_mask = reg_addr[scalar_mode].addr_mask[RELOAD_REG_GPR];
7062
7063       else if (FP_REGNO_P (scalar_regno))
7064         addr_mask = reg_addr[scalar_mode].addr_mask[RELOAD_REG_FPR];
7065
7066       else if (ALTIVEC_REGNO_P (scalar_regno))
7067         addr_mask = reg_addr[scalar_mode].addr_mask[RELOAD_REG_VMX];
7068
7069       else
7070         gcc_unreachable ();
7071
7072       if (REG_P (op1) || SUBREG_P (op1))
7073         valid_addr_p = (addr_mask & RELOAD_REG_INDEXED) != 0;
7074       else
7075         valid_addr_p = (addr_mask & RELOAD_REG_OFFSET) != 0;
7076     }
7077
7078   else if (REG_P (new_addr) || SUBREG_P (new_addr))
7079     valid_addr_p = true;
7080
7081   else
7082     valid_addr_p = false;
7083
7084   if (!valid_addr_p)
7085     {
7086       emit_move_insn (base_tmp, new_addr);
7087       new_addr = base_tmp;
7088     }
7089
7090   return change_address (mem, scalar_mode, new_addr);
7091 }
7092
7093 /* Split a variable vec_extract operation into the component instructions.  */
7094
7095 void
7096 rs6000_split_vec_extract_var (rtx dest, rtx src, rtx element, rtx tmp_gpr,
7097                               rtx tmp_altivec)
7098 {
7099   machine_mode mode = GET_MODE (src);
7100   machine_mode scalar_mode = GET_MODE_INNER (GET_MODE (src));
7101   unsigned scalar_size = GET_MODE_SIZE (scalar_mode);
7102   int byte_shift = exact_log2 (scalar_size);
7103
7104   gcc_assert (byte_shift >= 0);
7105
7106   /* If we are given a memory address, optimize to load just the element.  We
7107      don't have to adjust the vector element number on little endian
7108      systems.  */
7109   if (MEM_P (src))
7110     {
7111       int num_elements = GET_MODE_NUNITS (mode);
7112       rtx num_ele_m1 = GEN_INT (num_elements - 1);
7113
7114       emit_insn (gen_anddi3 (element, element, num_ele_m1));
7115       gcc_assert (REG_P (tmp_gpr));
7116       emit_move_insn (dest, rs6000_adjust_vec_address (dest, src, element,
7117                                                        tmp_gpr, scalar_mode));
7118       return;
7119     }
7120
7121   else if (REG_P (src) || SUBREG_P (src))
7122     {
7123       int num_elements = GET_MODE_NUNITS (mode);
7124       int bits_in_element = mode_to_bits (GET_MODE_INNER (mode));
7125       int bit_shift = 7 - exact_log2 (num_elements);
7126       rtx element2;
7127       unsigned int dest_regno = reg_or_subregno (dest);
7128       unsigned int src_regno = reg_or_subregno (src);
7129       unsigned int element_regno = reg_or_subregno (element);
7130
7131       gcc_assert (REG_P (tmp_gpr));
7132
7133       /* See if we want to generate VEXTU{B,H,W}{L,R}X if the destination is in
7134          a general purpose register.  */
7135       if (TARGET_P9_VECTOR
7136           && (mode == V16QImode || mode == V8HImode || mode == V4SImode)
7137           && INT_REGNO_P (dest_regno)
7138           && ALTIVEC_REGNO_P (src_regno)
7139           && INT_REGNO_P (element_regno))
7140         {
7141           rtx dest_si = gen_rtx_REG (SImode, dest_regno);
7142           rtx element_si = gen_rtx_REG (SImode, element_regno);
7143
7144           if (mode == V16QImode)
7145             emit_insn (BYTES_BIG_ENDIAN
7146                        ? gen_vextublx (dest_si, element_si, src)
7147                        : gen_vextubrx (dest_si, element_si, src));
7148
7149           else if (mode == V8HImode)
7150             {
7151               rtx tmp_gpr_si = gen_rtx_REG (SImode, REGNO (tmp_gpr));
7152               emit_insn (gen_ashlsi3 (tmp_gpr_si, element_si, const1_rtx));
7153               emit_insn (BYTES_BIG_ENDIAN
7154                          ? gen_vextuhlx (dest_si, tmp_gpr_si, src)
7155                          : gen_vextuhrx (dest_si, tmp_gpr_si, src));
7156             }
7157
7158
7159           else
7160             {
7161               rtx tmp_gpr_si = gen_rtx_REG (SImode, REGNO (tmp_gpr));
7162               emit_insn (gen_ashlsi3 (tmp_gpr_si, element_si, const2_rtx));
7163               emit_insn (BYTES_BIG_ENDIAN
7164                          ? gen_vextuwlx (dest_si, tmp_gpr_si, src)
7165                          : gen_vextuwrx (dest_si, tmp_gpr_si, src));
7166             }
7167
7168           return;
7169         }
7170
7171
7172       gcc_assert (REG_P (tmp_altivec));
7173
7174       /* For little endian, adjust element ordering.  For V2DI/V2DF, we can use
7175          an XOR, otherwise we need to subtract.  The shift amount is so VSLO
7176          will shift the element into the upper position (adding 3 to convert a
7177          byte shift into a bit shift).  */
7178       if (scalar_size == 8)
7179         {
7180           if (!BYTES_BIG_ENDIAN)
7181             {
7182               emit_insn (gen_xordi3 (tmp_gpr, element, const1_rtx));
7183               element2 = tmp_gpr;
7184             }
7185           else
7186             element2 = element;
7187
7188           /* Generate RLDIC directly to shift left 6 bits and retrieve 1
7189              bit.  */
7190           emit_insn (gen_rtx_SET (tmp_gpr,
7191                                   gen_rtx_AND (DImode,
7192                                                gen_rtx_ASHIFT (DImode,
7193                                                                element2,
7194                                                                GEN_INT (6)),
7195                                                GEN_INT (64))));
7196         }
7197       else
7198         {
7199           if (!BYTES_BIG_ENDIAN)
7200             {
7201               rtx num_ele_m1 = GEN_INT (num_elements - 1);
7202
7203               emit_insn (gen_anddi3 (tmp_gpr, element, num_ele_m1));
7204               emit_insn (gen_subdi3 (tmp_gpr, num_ele_m1, tmp_gpr));
7205               element2 = tmp_gpr;
7206             }
7207           else
7208             element2 = element;
7209
7210           emit_insn (gen_ashldi3 (tmp_gpr, element2, GEN_INT (bit_shift)));
7211         }
7212
7213       /* Get the value into the lower byte of the Altivec register where VSLO
7214          expects it.  */
7215       if (TARGET_P9_VECTOR)
7216         emit_insn (gen_vsx_splat_v2di (tmp_altivec, tmp_gpr));
7217       else if (can_create_pseudo_p ())
7218         emit_insn (gen_vsx_concat_v2di (tmp_altivec, tmp_gpr, tmp_gpr));
7219       else
7220         {
7221           rtx tmp_di = gen_rtx_REG (DImode, REGNO (tmp_altivec));
7222           emit_move_insn (tmp_di, tmp_gpr);
7223           emit_insn (gen_vsx_concat_v2di (tmp_altivec, tmp_di, tmp_di));
7224         }
7225
7226       /* Do the VSLO to get the value into the final location.  */
7227       switch (mode)
7228         {
7229         case E_V2DFmode:
7230           emit_insn (gen_vsx_vslo_v2df (dest, src, tmp_altivec));
7231           return;
7232
7233         case E_V2DImode:
7234           emit_insn (gen_vsx_vslo_v2di (dest, src, tmp_altivec));
7235           return;
7236
7237         case E_V4SFmode:
7238           {
7239             rtx tmp_altivec_di = gen_rtx_REG (DImode, REGNO (tmp_altivec));
7240             rtx tmp_altivec_v4sf = gen_rtx_REG (V4SFmode, REGNO (tmp_altivec));
7241             rtx src_v2di = gen_rtx_REG (V2DImode, REGNO (src));
7242             emit_insn (gen_vsx_vslo_v2di (tmp_altivec_di, src_v2di,
7243                                           tmp_altivec));
7244
7245             emit_insn (gen_vsx_xscvspdp_scalar2 (dest, tmp_altivec_v4sf));
7246             return;
7247           }
7248
7249         case E_V4SImode:
7250         case E_V8HImode:
7251         case E_V16QImode:
7252           {
7253             rtx tmp_altivec_di = gen_rtx_REG (DImode, REGNO (tmp_altivec));
7254             rtx src_v2di = gen_rtx_REG (V2DImode, REGNO (src));
7255             rtx tmp_gpr_di = gen_rtx_REG (DImode, REGNO (dest));
7256             emit_insn (gen_vsx_vslo_v2di (tmp_altivec_di, src_v2di,
7257                                           tmp_altivec));
7258             emit_move_insn (tmp_gpr_di, tmp_altivec_di);
7259             emit_insn (gen_lshrdi3 (tmp_gpr_di, tmp_gpr_di,
7260                                     GEN_INT (64 - bits_in_element)));
7261             return;
7262           }
7263
7264         default:
7265           gcc_unreachable ();
7266         }
7267
7268       return;
7269     }
7270   else
7271     gcc_unreachable ();
7272  }
7273
7274 /* Return alignment of TYPE.  Existing alignment is ALIGN.  HOW
7275    selects whether the alignment is abi mandated, optional, or
7276    both abi and optional alignment.  */
7277    
7278 unsigned int
7279 rs6000_data_alignment (tree type, unsigned int align, enum data_align how)
7280 {
7281   if (how != align_opt)
7282     {
7283       if (TREE_CODE (type) == VECTOR_TYPE && align < 128)
7284         align = 128;
7285     }
7286
7287   if (how != align_abi)
7288     {
7289       if (TREE_CODE (type) == ARRAY_TYPE
7290           && TYPE_MODE (TREE_TYPE (type)) == QImode)
7291         {
7292           if (align < BITS_PER_WORD)
7293             align = BITS_PER_WORD;
7294         }
7295     }
7296
7297   return align;
7298 }
7299
7300 /* Implement TARGET_SLOW_UNALIGNED_ACCESS.  Altivec vector memory
7301    instructions simply ignore the low bits; VSX memory instructions
7302    are aligned to 4 or 8 bytes.  */
7303
7304 static bool
7305 rs6000_slow_unaligned_access (machine_mode mode, unsigned int align)
7306 {
7307   return (STRICT_ALIGNMENT
7308           || (!TARGET_EFFICIENT_UNALIGNED_VSX
7309               && ((SCALAR_FLOAT_MODE_NOT_VECTOR_P (mode) && align < 32)
7310                   || ((VECTOR_MODE_P (mode) || FLOAT128_VECTOR_P (mode))
7311                       && (int) align < VECTOR_ALIGN (mode)))));
7312 }
7313
7314 /* Previous GCC releases forced all vector types to have 16-byte alignment.  */
7315
7316 bool
7317 rs6000_special_adjust_field_align_p (tree type, unsigned int computed)
7318 {
7319   if (TARGET_ALTIVEC && TREE_CODE (type) == VECTOR_TYPE)
7320     {
7321       if (computed != 128)
7322         {
7323           static bool warned;
7324           if (!warned && warn_psabi)
7325             {
7326               warned = true;
7327               inform (input_location,
7328                       "the layout of aggregates containing vectors with"
7329                       " %d-byte alignment has changed in GCC 5",
7330                       computed / BITS_PER_UNIT);
7331             }
7332         }
7333       /* In current GCC there is no special case.  */
7334       return false;
7335     }
7336
7337   return false;
7338 }
7339
7340 /* AIX increases natural record alignment to doubleword if the first
7341    field is an FP double while the FP fields remain word aligned.  */
7342
7343 unsigned int
7344 rs6000_special_round_type_align (tree type, unsigned int computed,
7345                                  unsigned int specified)
7346 {
7347   unsigned int align = MAX (computed, specified);
7348   tree field = TYPE_FIELDS (type);
7349
7350   /* Skip all non field decls */
7351   while (field != NULL && TREE_CODE (field) != FIELD_DECL)
7352     field = DECL_CHAIN (field);
7353
7354   if (field != NULL && field != type)
7355     {
7356       type = TREE_TYPE (field);
7357       while (TREE_CODE (type) == ARRAY_TYPE)
7358         type = TREE_TYPE (type);
7359
7360       if (type != error_mark_node && TYPE_MODE (type) == DFmode)
7361         align = MAX (align, 64);
7362     }
7363
7364   return align;
7365 }
7366
7367 /* Darwin increases record alignment to the natural alignment of
7368    the first field.  */
7369
7370 unsigned int
7371 darwin_rs6000_special_round_type_align (tree type, unsigned int computed,
7372                                         unsigned int specified)
7373 {
7374   unsigned int align = MAX (computed, specified);
7375
7376   if (TYPE_PACKED (type))
7377     return align;
7378
7379   /* Find the first field, looking down into aggregates.  */
7380   do {
7381     tree field = TYPE_FIELDS (type);
7382     /* Skip all non field decls */
7383     while (field != NULL && TREE_CODE (field) != FIELD_DECL)
7384       field = DECL_CHAIN (field);
7385     if (! field)
7386       break;
7387     /* A packed field does not contribute any extra alignment.  */
7388     if (DECL_PACKED (field))
7389       return align;
7390     type = TREE_TYPE (field);
7391     while (TREE_CODE (type) == ARRAY_TYPE)
7392       type = TREE_TYPE (type);
7393   } while (AGGREGATE_TYPE_P (type));
7394
7395   if (! AGGREGATE_TYPE_P (type) && type != error_mark_node)
7396     align = MAX (align, TYPE_ALIGN (type));
7397
7398   return align;
7399 }
7400
7401 /* Return 1 for an operand in small memory on V.4/eabi.  */
7402
7403 int
7404 small_data_operand (rtx op ATTRIBUTE_UNUSED,
7405                     machine_mode mode ATTRIBUTE_UNUSED)
7406 {
7407 #if TARGET_ELF
7408   rtx sym_ref;
7409
7410   if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
7411     return 0;
7412
7413   if (DEFAULT_ABI != ABI_V4)
7414     return 0;
7415
7416   if (SYMBOL_REF_P (op))
7417     sym_ref = op;
7418
7419   else if (GET_CODE (op) != CONST
7420            || GET_CODE (XEXP (op, 0)) != PLUS
7421            || !SYMBOL_REF_P (XEXP (XEXP (op, 0), 0))
7422            || !CONST_INT_P (XEXP (XEXP (op, 0), 1)))
7423     return 0;
7424
7425   else
7426     {
7427       rtx sum = XEXP (op, 0);
7428       HOST_WIDE_INT summand;
7429
7430       /* We have to be careful here, because it is the referenced address
7431          that must be 32k from _SDA_BASE_, not just the symbol.  */
7432       summand = INTVAL (XEXP (sum, 1));
7433       if (summand < 0 || summand > g_switch_value)
7434         return 0;
7435
7436       sym_ref = XEXP (sum, 0);
7437     }
7438
7439   return SYMBOL_REF_SMALL_P (sym_ref);
7440 #else
7441   return 0;
7442 #endif
7443 }
7444
7445 /* Return true if either operand is a general purpose register.  */
7446
7447 bool
7448 gpr_or_gpr_p (rtx op0, rtx op1)
7449 {
7450   return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
7451           || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
7452 }
7453
7454 /* Return true if this is a move direct operation between GPR registers and
7455    floating point/VSX registers.  */
7456
7457 bool
7458 direct_move_p (rtx op0, rtx op1)
7459 {
7460   if (!REG_P (op0) || !REG_P (op1))
7461     return false;
7462
7463   if (!TARGET_DIRECT_MOVE)
7464     return false;
7465
7466   int regno0 = REGNO (op0);
7467   int regno1 = REGNO (op1);
7468   if (!HARD_REGISTER_NUM_P (regno0) || !HARD_REGISTER_NUM_P (regno1))
7469     return false;
7470
7471   if (INT_REGNO_P (regno0) && VSX_REGNO_P (regno1))
7472     return true;
7473
7474   if (VSX_REGNO_P (regno0) && INT_REGNO_P (regno1))
7475     return true;
7476
7477   return false;
7478 }
7479
7480 /* Return true if the OFFSET is valid for the quad address instructions that
7481    use d-form (register + offset) addressing.  */
7482
7483 static inline bool
7484 quad_address_offset_p (HOST_WIDE_INT offset)
7485 {
7486   return (IN_RANGE (offset, -32768, 32767) && ((offset) & 0xf) == 0);
7487 }
7488
7489 /* Return true if the ADDR is an acceptable address for a quad memory
7490    operation of mode MODE (either LQ/STQ for general purpose registers, or
7491    LXV/STXV for vector registers under ISA 3.0.  GPR_P is true if this address
7492    is intended for LQ/STQ.  If it is false, the address is intended for the ISA
7493    3.0 LXV/STXV instruction.  */
7494
7495 bool
7496 quad_address_p (rtx addr, machine_mode mode, bool strict)
7497 {
7498   rtx op0, op1;
7499
7500   if (GET_MODE_SIZE (mode) != 16)
7501     return false;
7502
7503   if (legitimate_indirect_address_p (addr, strict))
7504     return true;
7505
7506   if (VECTOR_MODE_P (mode) && !mode_supports_dq_form (mode))
7507     return false;
7508
7509   if (GET_CODE (addr) != PLUS)
7510     return false;
7511
7512   op0 = XEXP (addr, 0);
7513   if (!REG_P (op0) || !INT_REG_OK_FOR_BASE_P (op0, strict))
7514     return false;
7515
7516   op1 = XEXP (addr, 1);
7517   if (!CONST_INT_P (op1))
7518     return false;
7519
7520   return quad_address_offset_p (INTVAL (op1));
7521 }
7522
7523 /* Return true if this is a load or store quad operation.  This function does
7524    not handle the atomic quad memory instructions.  */
7525
7526 bool
7527 quad_load_store_p (rtx op0, rtx op1)
7528 {
7529   bool ret;
7530
7531   if (!TARGET_QUAD_MEMORY)
7532     ret = false;
7533
7534   else if (REG_P (op0) && MEM_P (op1))
7535     ret = (quad_int_reg_operand (op0, GET_MODE (op0))
7536            && quad_memory_operand (op1, GET_MODE (op1))
7537            && !reg_overlap_mentioned_p (op0, op1));
7538
7539   else if (MEM_P (op0) && REG_P (op1))
7540     ret = (quad_memory_operand (op0, GET_MODE (op0))
7541            && quad_int_reg_operand (op1, GET_MODE (op1)));
7542
7543   else
7544     ret = false;
7545
7546   if (TARGET_DEBUG_ADDR)
7547     {
7548       fprintf (stderr, "\n========== quad_load_store, return %s\n",
7549                ret ? "true" : "false");
7550       debug_rtx (gen_rtx_SET (op0, op1));
7551     }
7552
7553   return ret;
7554 }
7555
7556 /* Given an address, return a constant offset term if one exists.  */
7557
7558 static rtx
7559 address_offset (rtx op)
7560 {
7561   if (GET_CODE (op) == PRE_INC
7562       || GET_CODE (op) == PRE_DEC)
7563     op = XEXP (op, 0);
7564   else if (GET_CODE (op) == PRE_MODIFY
7565            || GET_CODE (op) == LO_SUM)
7566     op = XEXP (op, 1);
7567
7568   if (GET_CODE (op) == CONST)
7569     op = XEXP (op, 0);
7570
7571   if (GET_CODE (op) == PLUS)
7572     op = XEXP (op, 1);
7573
7574   if (CONST_INT_P (op))
7575     return op;
7576
7577   return NULL_RTX;
7578 }
7579
7580 /* Return true if the MEM operand is a memory operand suitable for use
7581    with a (full width, possibly multiple) gpr load/store.  On
7582    powerpc64 this means the offset must be divisible by 4.
7583    Implements 'Y' constraint.
7584
7585    Accept direct, indexed, offset, lo_sum and tocref.  Since this is
7586    a constraint function we know the operand has satisfied a suitable
7587    memory predicate.
7588
7589    Offsetting a lo_sum should not be allowed, except where we know by
7590    alignment that a 32k boundary is not crossed.  Note that by
7591    "offsetting" here we mean a further offset to access parts of the
7592    MEM.  It's fine to have a lo_sum where the inner address is offset
7593    from a sym, since the same sym+offset will appear in the high part
7594    of the address calculation.  */
7595
7596 bool
7597 mem_operand_gpr (rtx op, machine_mode mode)
7598 {
7599   unsigned HOST_WIDE_INT offset;
7600   int extra;
7601   rtx addr = XEXP (op, 0);
7602
7603   /* PR85755: Allow PRE_INC and PRE_DEC addresses.  */
7604   if (TARGET_UPDATE
7605       && (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
7606       && mode_supports_pre_incdec_p (mode)
7607       && legitimate_indirect_address_p (XEXP (addr, 0), false))
7608     return true;
7609
7610   /* Don't allow non-offsettable addresses.  See PRs 83969 and 84279.  */
7611   if (!rs6000_offsettable_memref_p (op, mode, false))
7612     return false;
7613
7614   op = address_offset (addr);
7615   if (op == NULL_RTX)
7616     return true;
7617
7618   offset = INTVAL (op);
7619   if (TARGET_POWERPC64 && (offset & 3) != 0)
7620     return false;
7621
7622   extra = GET_MODE_SIZE (mode) - UNITS_PER_WORD;
7623   if (extra < 0)
7624     extra = 0;
7625
7626   if (GET_CODE (addr) == LO_SUM)
7627     /* For lo_sum addresses, we must allow any offset except one that
7628        causes a wrap, so test only the low 16 bits.  */
7629     offset = ((offset & 0xffff) ^ 0x8000) - 0x8000;
7630
7631   return offset + 0x8000 < 0x10000u - extra;
7632 }
7633
7634 /* As above, but for DS-FORM VSX insns.  Unlike mem_operand_gpr,
7635    enforce an offset divisible by 4 even for 32-bit.  */
7636
7637 bool
7638 mem_operand_ds_form (rtx op, machine_mode mode)
7639 {
7640   unsigned HOST_WIDE_INT offset;
7641   int extra;
7642   rtx addr = XEXP (op, 0);
7643
7644   if (!offsettable_address_p (false, mode, addr))
7645     return false;
7646
7647   op = address_offset (addr);
7648   if (op == NULL_RTX)
7649     return true;
7650
7651   offset = INTVAL (op);
7652   if ((offset & 3) != 0)
7653     return false;
7654
7655   extra = GET_MODE_SIZE (mode) - UNITS_PER_WORD;
7656   if (extra < 0)
7657     extra = 0;
7658
7659   if (GET_CODE (addr) == LO_SUM)
7660     /* For lo_sum addresses, we must allow any offset except one that
7661        causes a wrap, so test only the low 16 bits.  */
7662     offset = ((offset & 0xffff) ^ 0x8000) - 0x8000;
7663
7664   return offset + 0x8000 < 0x10000u - extra;
7665 }
7666 \f
7667 /* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address_p.  */
7668
7669 static bool
7670 reg_offset_addressing_ok_p (machine_mode mode)
7671 {
7672   switch (mode)
7673     {
7674     case E_V16QImode:
7675     case E_V8HImode:
7676     case E_V4SFmode:
7677     case E_V4SImode:
7678     case E_V2DFmode:
7679     case E_V2DImode:
7680     case E_V1TImode:
7681     case E_TImode:
7682     case E_TFmode:
7683     case E_KFmode:
7684       /* AltiVec/VSX vector modes.  Only reg+reg addressing was valid until the
7685          ISA 3.0 vector d-form addressing mode was added.  While TImode is not
7686          a vector mode, if we want to use the VSX registers to move it around,
7687          we need to restrict ourselves to reg+reg addressing.  Similarly for
7688          IEEE 128-bit floating point that is passed in a single vector
7689          register.  */
7690       if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
7691         return mode_supports_dq_form (mode);
7692       break;
7693
7694     case E_SDmode:
7695       /* If we can do direct load/stores of SDmode, restrict it to reg+reg
7696          addressing for the LFIWZX and STFIWX instructions.  */
7697       if (TARGET_NO_SDMODE_STACK)
7698         return false;
7699       break;
7700
7701     default:
7702       break;
7703     }
7704
7705   return true;
7706 }
7707
7708 static bool
7709 virtual_stack_registers_memory_p (rtx op)
7710 {
7711   int regnum;
7712
7713   if (REG_P (op))
7714     regnum = REGNO (op);
7715
7716   else if (GET_CODE (op) == PLUS
7717            && REG_P (XEXP (op, 0))
7718            && CONST_INT_P (XEXP (op, 1)))
7719     regnum = REGNO (XEXP (op, 0));
7720
7721   else
7722     return false;
7723
7724   return (regnum >= FIRST_VIRTUAL_REGISTER
7725           && regnum <= LAST_VIRTUAL_POINTER_REGISTER);
7726 }
7727
7728 /* Return true if a MODE sized memory accesses to OP plus OFFSET
7729    is known to not straddle a 32k boundary.  This function is used
7730    to determine whether -mcmodel=medium code can use TOC pointer
7731    relative addressing for OP.  This means the alignment of the TOC
7732    pointer must also be taken into account, and unfortunately that is
7733    only 8 bytes.  */ 
7734
7735 #ifndef POWERPC64_TOC_POINTER_ALIGNMENT
7736 #define POWERPC64_TOC_POINTER_ALIGNMENT 8
7737 #endif
7738
7739 static bool
7740 offsettable_ok_by_alignment (rtx op, HOST_WIDE_INT offset,
7741                              machine_mode mode)
7742 {
7743   tree decl;
7744   unsigned HOST_WIDE_INT dsize, dalign, lsb, mask;
7745
7746   if (!SYMBOL_REF_P (op))
7747     return false;
7748
7749   /* ISA 3.0 vector d-form addressing is restricted, don't allow
7750      SYMBOL_REF.  */
7751   if (mode_supports_dq_form (mode))
7752     return false;
7753
7754   dsize = GET_MODE_SIZE (mode);
7755   decl = SYMBOL_REF_DECL (op);
7756   if (!decl)
7757     {
7758       if (dsize == 0)
7759         return false;
7760
7761       /* -fsection-anchors loses the original SYMBOL_REF_DECL when
7762          replacing memory addresses with an anchor plus offset.  We
7763          could find the decl by rummaging around in the block->objects
7764          VEC for the given offset but that seems like too much work.  */
7765       dalign = BITS_PER_UNIT;
7766       if (SYMBOL_REF_HAS_BLOCK_INFO_P (op)
7767           && SYMBOL_REF_ANCHOR_P (op)
7768           && SYMBOL_REF_BLOCK (op) != NULL)
7769         {
7770           struct object_block *block = SYMBOL_REF_BLOCK (op);
7771
7772           dalign = block->alignment;
7773           offset += SYMBOL_REF_BLOCK_OFFSET (op);
7774         }
7775       else if (CONSTANT_POOL_ADDRESS_P (op))
7776         {
7777           /* It would be nice to have get_pool_align()..  */
7778           machine_mode cmode = get_pool_mode (op);
7779
7780           dalign = GET_MODE_ALIGNMENT (cmode);
7781         }
7782     }
7783   else if (DECL_P (decl))
7784     {
7785       dalign = DECL_ALIGN (decl);
7786
7787       if (dsize == 0)
7788         {
7789           /* Allow BLKmode when the entire object is known to not
7790              cross a 32k boundary.  */
7791           if (!DECL_SIZE_UNIT (decl))
7792             return false;
7793
7794           if (!tree_fits_uhwi_p (DECL_SIZE_UNIT (decl)))
7795             return false;
7796
7797           dsize = tree_to_uhwi (DECL_SIZE_UNIT (decl));
7798           if (dsize > 32768)
7799             return false;
7800
7801           dalign /= BITS_PER_UNIT;
7802           if (dalign > POWERPC64_TOC_POINTER_ALIGNMENT)
7803             dalign = POWERPC64_TOC_POINTER_ALIGNMENT;
7804           return dalign >= dsize;
7805         }
7806     }
7807   else
7808     gcc_unreachable ();
7809
7810   /* Find how many bits of the alignment we know for this access.  */
7811   dalign /= BITS_PER_UNIT;
7812   if (dalign > POWERPC64_TOC_POINTER_ALIGNMENT)
7813     dalign = POWERPC64_TOC_POINTER_ALIGNMENT;
7814   mask = dalign - 1;
7815   lsb = offset & -offset;
7816   mask &= lsb - 1;
7817   dalign = mask + 1;
7818
7819   return dalign >= dsize;
7820 }
7821
7822 static bool
7823 constant_pool_expr_p (rtx op)
7824 {
7825   rtx base, offset;
7826
7827   split_const (op, &base, &offset);
7828   return (SYMBOL_REF_P (base)
7829           && CONSTANT_POOL_ADDRESS_P (base)
7830           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (base), Pmode));
7831 }
7832
7833 /* These are only used to pass through from print_operand/print_operand_address
7834    to rs6000_output_addr_const_extra over the intervening function
7835    output_addr_const which is not target code.  */
7836 static const_rtx tocrel_base_oac, tocrel_offset_oac;
7837
7838 /* Return true if OP is a toc pointer relative address (the output
7839    of create_TOC_reference).  If STRICT, do not match non-split
7840    -mcmodel=large/medium toc pointer relative addresses.  If the pointers 
7841    are non-NULL, place base and offset pieces in TOCREL_BASE_RET and 
7842    TOCREL_OFFSET_RET respectively.  */
7843
7844 bool
7845 toc_relative_expr_p (const_rtx op, bool strict, const_rtx *tocrel_base_ret,
7846                      const_rtx *tocrel_offset_ret)
7847 {
7848   if (!TARGET_TOC)
7849     return false;
7850
7851   if (TARGET_CMODEL != CMODEL_SMALL)
7852     {
7853       /* When strict ensure we have everything tidy.  */
7854       if (strict
7855           && !(GET_CODE (op) == LO_SUM
7856                && REG_P (XEXP (op, 0))
7857                && INT_REG_OK_FOR_BASE_P (XEXP (op, 0), strict)))
7858         return false;
7859
7860       /* When not strict, allow non-split TOC addresses and also allow
7861          (lo_sum (high ..)) TOC addresses created during reload.  */
7862       if (GET_CODE (op) == LO_SUM)
7863         op = XEXP (op, 1);
7864     }
7865
7866   const_rtx tocrel_base = op;
7867   const_rtx tocrel_offset = const0_rtx;
7868
7869   if (GET_CODE (op) == PLUS && add_cint_operand (XEXP (op, 1), GET_MODE (op)))
7870     {
7871       tocrel_base = XEXP (op, 0);
7872       tocrel_offset = XEXP (op, 1);
7873     }
7874
7875   if (tocrel_base_ret)
7876     *tocrel_base_ret = tocrel_base;
7877   if (tocrel_offset_ret)
7878     *tocrel_offset_ret = tocrel_offset;
7879
7880   return (GET_CODE (tocrel_base) == UNSPEC
7881           && XINT (tocrel_base, 1) == UNSPEC_TOCREL
7882           && REG_P (XVECEXP (tocrel_base, 0, 1))
7883           && REGNO (XVECEXP (tocrel_base, 0, 1)) == TOC_REGISTER);
7884 }
7885
7886 /* Return true if X is a constant pool address, and also for cmodel=medium
7887    if X is a toc-relative address known to be offsettable within MODE.  */
7888
7889 bool
7890 legitimate_constant_pool_address_p (const_rtx x, machine_mode mode,
7891                                     bool strict)
7892 {
7893   const_rtx tocrel_base, tocrel_offset;
7894   return (toc_relative_expr_p (x, strict, &tocrel_base, &tocrel_offset)
7895           && (TARGET_CMODEL != CMODEL_MEDIUM
7896               || constant_pool_expr_p (XVECEXP (tocrel_base, 0, 0))
7897               || mode == QImode
7898               || offsettable_ok_by_alignment (XVECEXP (tocrel_base, 0, 0),
7899                                               INTVAL (tocrel_offset), mode)));
7900 }
7901
7902 static bool
7903 legitimate_small_data_p (machine_mode mode, rtx x)
7904 {
7905   return (DEFAULT_ABI == ABI_V4
7906           && !flag_pic && !TARGET_TOC
7907           && (SYMBOL_REF_P (x) || GET_CODE (x) == CONST)
7908           && small_data_operand (x, mode));
7909 }
7910
7911 bool
7912 rs6000_legitimate_offset_address_p (machine_mode mode, rtx x,
7913                                     bool strict, bool worst_case)
7914 {
7915   unsigned HOST_WIDE_INT offset;
7916   unsigned int extra;
7917
7918   if (GET_CODE (x) != PLUS)
7919     return false;
7920   if (!REG_P (XEXP (x, 0)))
7921     return false;
7922   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
7923     return false;
7924   if (mode_supports_dq_form (mode))
7925     return quad_address_p (x, mode, strict);
7926   if (!reg_offset_addressing_ok_p (mode))
7927     return virtual_stack_registers_memory_p (x);
7928   if (legitimate_constant_pool_address_p (x, mode, strict || lra_in_progress))
7929     return true;
7930   if (!CONST_INT_P (XEXP (x, 1)))
7931     return false;
7932
7933   offset = INTVAL (XEXP (x, 1));
7934   extra = 0;
7935   switch (mode)
7936     {
7937     case E_DFmode:
7938     case E_DDmode:
7939     case E_DImode:
7940       /* If we are using VSX scalar loads, restrict ourselves to reg+reg
7941          addressing.  */
7942       if (VECTOR_MEM_VSX_P (mode))
7943         return false;
7944
7945       if (!worst_case)
7946         break;
7947       if (!TARGET_POWERPC64)
7948         extra = 4;
7949       else if (offset & 3)
7950         return false;
7951       break;
7952
7953     case E_TFmode:
7954     case E_IFmode:
7955     case E_KFmode:
7956     case E_TDmode:
7957     case E_TImode:
7958     case E_PTImode:
7959       extra = 8;
7960       if (!worst_case)
7961         break;
7962       if (!TARGET_POWERPC64)
7963         extra = 12;
7964       else if (offset & 3)
7965         return false;
7966       break;
7967
7968     default:
7969       break;
7970     }
7971
7972   offset += 0x8000;
7973   return offset < 0x10000 - extra;
7974 }
7975
7976 bool
7977 legitimate_indexed_address_p (rtx x, int strict)
7978 {
7979   rtx op0, op1;
7980
7981   if (GET_CODE (x) != PLUS)
7982     return false;
7983
7984   op0 = XEXP (x, 0);
7985   op1 = XEXP (x, 1);
7986
7987   return (REG_P (op0) && REG_P (op1)
7988           && ((INT_REG_OK_FOR_BASE_P (op0, strict)
7989                && INT_REG_OK_FOR_INDEX_P (op1, strict))
7990               || (INT_REG_OK_FOR_BASE_P (op1, strict)
7991                   && INT_REG_OK_FOR_INDEX_P (op0, strict))));
7992 }
7993
7994 bool
7995 avoiding_indexed_address_p (machine_mode mode)
7996 {
7997   /* Avoid indexed addressing for modes that have non-indexed
7998      load/store instruction forms.  */
7999   return (TARGET_AVOID_XFORM && VECTOR_MEM_NONE_P (mode));
8000 }
8001
8002 bool
8003 legitimate_indirect_address_p (rtx x, int strict)
8004 {
8005   return REG_P (x) && INT_REG_OK_FOR_BASE_P (x, strict);
8006 }
8007
8008 bool
8009 macho_lo_sum_memory_operand (rtx x, machine_mode mode)
8010 {
8011   if (!TARGET_MACHO || !flag_pic
8012       || mode != SImode || !MEM_P (x))
8013     return false;
8014   x = XEXP (x, 0);
8015
8016   if (GET_CODE (x) != LO_SUM)
8017     return false;
8018   if (!REG_P (XEXP (x, 0)))
8019     return false;
8020   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
8021     return false;
8022   x = XEXP (x, 1);
8023
8024   return CONSTANT_P (x);
8025 }
8026
8027 static bool
8028 legitimate_lo_sum_address_p (machine_mode mode, rtx x, int strict)
8029 {
8030   if (GET_CODE (x) != LO_SUM)
8031     return false;
8032   if (!REG_P (XEXP (x, 0)))
8033     return false;
8034   if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
8035     return false;
8036   /* quad word addresses are restricted, and we can't use LO_SUM.  */
8037   if (mode_supports_dq_form (mode))
8038     return false;
8039   x = XEXP (x, 1);
8040
8041   if (TARGET_ELF || TARGET_MACHO)
8042     {
8043       bool large_toc_ok;
8044
8045       if (DEFAULT_ABI == ABI_V4 && flag_pic)
8046         return false;
8047       /* LRA doesn't use LEGITIMIZE_RELOAD_ADDRESS as it usually calls
8048          push_reload from reload pass code.  LEGITIMIZE_RELOAD_ADDRESS
8049          recognizes some LO_SUM addresses as valid although this
8050          function says opposite.  In most cases, LRA through different
8051          transformations can generate correct code for address reloads.
8052          It cannot manage only some LO_SUM cases.  So we need to add
8053          code here saying that some addresses are still valid.  */
8054       large_toc_ok = (lra_in_progress && TARGET_CMODEL != CMODEL_SMALL
8055                       && small_toc_ref (x, VOIDmode));
8056       if (TARGET_TOC && ! large_toc_ok)
8057         return false;
8058       if (GET_MODE_NUNITS (mode) != 1)
8059         return false;
8060       if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
8061           && !(/* ??? Assume floating point reg based on mode?  */
8062                TARGET_HARD_FLOAT && (mode == DFmode || mode == DDmode)))
8063         return false;
8064
8065       return CONSTANT_P (x) || large_toc_ok;
8066     }
8067
8068   return false;
8069 }
8070
8071
8072 /* Try machine-dependent ways of modifying an illegitimate address
8073    to be legitimate.  If we find one, return the new, valid address.
8074    This is used from only one place: `memory_address' in explow.c.
8075
8076    OLDX is the address as it was before break_out_memory_refs was
8077    called.  In some cases it is useful to look at this to decide what
8078    needs to be done.
8079
8080    It is always safe for this function to do nothing.  It exists to
8081    recognize opportunities to optimize the output.
8082
8083    On RS/6000, first check for the sum of a register with a constant
8084    integer that is out of range.  If so, generate code to add the
8085    constant with the low-order 16 bits masked to the register and force
8086    this result into another register (this can be done with `cau').
8087    Then generate an address of REG+(CONST&0xffff), allowing for the
8088    possibility of bit 16 being a one.
8089
8090    Then check for the sum of a register and something not constant, try to
8091    load the other things into a register and return the sum.  */
8092
8093 static rtx
8094 rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
8095                            machine_mode mode)
8096 {
8097   unsigned int extra;
8098
8099   if (!reg_offset_addressing_ok_p (mode)
8100       || mode_supports_dq_form (mode))
8101     {
8102       if (virtual_stack_registers_memory_p (x))
8103         return x;
8104
8105       /* In theory we should not be seeing addresses of the form reg+0,
8106          but just in case it is generated, optimize it away.  */
8107       if (GET_CODE (x) == PLUS && XEXP (x, 1) == const0_rtx)
8108         return force_reg (Pmode, XEXP (x, 0));
8109
8110       /* For TImode with load/store quad, restrict addresses to just a single
8111          pointer, so it works with both GPRs and VSX registers.  */
8112       /* Make sure both operands are registers.  */
8113       else if (GET_CODE (x) == PLUS
8114                && (mode != TImode || !TARGET_VSX))
8115         return gen_rtx_PLUS (Pmode,
8116                              force_reg (Pmode, XEXP (x, 0)),
8117                              force_reg (Pmode, XEXP (x, 1)));
8118       else
8119         return force_reg (Pmode, x);
8120     }
8121   if (SYMBOL_REF_P (x))
8122     {
8123       enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
8124       if (model != 0)
8125         return rs6000_legitimize_tls_address (x, model);
8126     }
8127
8128   extra = 0;
8129   switch (mode)
8130     {
8131     case E_TFmode:
8132     case E_TDmode:
8133     case E_TImode:
8134     case E_PTImode:
8135     case E_IFmode:
8136     case E_KFmode:
8137       /* As in legitimate_offset_address_p we do not assume
8138          worst-case.  The mode here is just a hint as to the registers
8139          used.  A TImode is usually in gprs, but may actually be in
8140          fprs.  Leave worst-case scenario for reload to handle via
8141          insn constraints.  PTImode is only GPRs.  */
8142       extra = 8;
8143       break;
8144     default:
8145       break;
8146     }
8147
8148   if (GET_CODE (x) == PLUS
8149       && REG_P (XEXP (x, 0))
8150       && CONST_INT_P (XEXP (x, 1))
8151       && ((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000)
8152           >= 0x10000 - extra))
8153     {
8154       HOST_WIDE_INT high_int, low_int;
8155       rtx sum;
8156       low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
8157       if (low_int >= 0x8000 - extra)
8158         low_int = 0;
8159       high_int = INTVAL (XEXP (x, 1)) - low_int;
8160       sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
8161                                          GEN_INT (high_int)), 0);
8162       return plus_constant (Pmode, sum, low_int);
8163     }
8164   else if (GET_CODE (x) == PLUS
8165            && REG_P (XEXP (x, 0))
8166            && !CONST_INT_P (XEXP (x, 1))
8167            && GET_MODE_NUNITS (mode) == 1
8168            && (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
8169                || (/* ??? Assume floating point reg based on mode?  */
8170                    TARGET_HARD_FLOAT && (mode == DFmode || mode == DDmode)))
8171            && !avoiding_indexed_address_p (mode))
8172     {
8173       return gen_rtx_PLUS (Pmode, XEXP (x, 0),
8174                            force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
8175     }
8176   else if ((TARGET_ELF
8177 #if TARGET_MACHO
8178             || !MACHO_DYNAMIC_NO_PIC_P
8179 #endif
8180             )
8181            && TARGET_32BIT
8182            && TARGET_NO_TOC
8183            && !flag_pic
8184            && !CONST_INT_P (x)
8185            && !CONST_WIDE_INT_P (x)
8186            && !CONST_DOUBLE_P (x)
8187            && CONSTANT_P (x)
8188            && GET_MODE_NUNITS (mode) == 1
8189            && (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
8190                || (/* ??? Assume floating point reg based on mode?  */
8191                    TARGET_HARD_FLOAT && (mode == DFmode || mode == DDmode))))
8192     {
8193       rtx reg = gen_reg_rtx (Pmode);
8194       if (TARGET_ELF)
8195         emit_insn (gen_elf_high (reg, x));
8196       else
8197         emit_insn (gen_macho_high (reg, x));
8198       return gen_rtx_LO_SUM (Pmode, reg, x);
8199     }
8200   else if (TARGET_TOC
8201            && SYMBOL_REF_P (x)
8202            && constant_pool_expr_p (x)
8203            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
8204     return create_TOC_reference (x, NULL_RTX);
8205   else
8206     return x;
8207 }
8208
8209 /* Debug version of rs6000_legitimize_address.  */
8210 static rtx
8211 rs6000_debug_legitimize_address (rtx x, rtx oldx, machine_mode mode)
8212 {
8213   rtx ret;
8214   rtx_insn *insns;
8215
8216   start_sequence ();
8217   ret = rs6000_legitimize_address (x, oldx, mode);
8218   insns = get_insns ();
8219   end_sequence ();
8220
8221   if (ret != x)
8222     {
8223       fprintf (stderr,
8224                "\nrs6000_legitimize_address: mode %s, old code %s, "
8225                "new code %s, modified\n",
8226                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)),
8227                GET_RTX_NAME (GET_CODE (ret)));
8228
8229       fprintf (stderr, "Original address:\n");
8230       debug_rtx (x);
8231
8232       fprintf (stderr, "oldx:\n");
8233       debug_rtx (oldx);
8234
8235       fprintf (stderr, "New address:\n");
8236       debug_rtx (ret);
8237
8238       if (insns)
8239         {
8240           fprintf (stderr, "Insns added:\n");
8241           debug_rtx_list (insns, 20);
8242         }
8243     }
8244   else
8245     {
8246       fprintf (stderr,
8247                "\nrs6000_legitimize_address: mode %s, code %s, no change:\n",
8248                GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)));
8249
8250       debug_rtx (x);
8251     }
8252
8253   if (insns)
8254     emit_insn (insns);
8255
8256   return ret;
8257 }
8258
8259 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
8260    We need to emit DTP-relative relocations.  */
8261
8262 static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
8263 static void
8264 rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
8265 {
8266   switch (size)
8267     {
8268     case 4:
8269       fputs ("\t.long\t", file);
8270       break;
8271     case 8:
8272       fputs (DOUBLE_INT_ASM_OP, file);
8273       break;
8274     default:
8275       gcc_unreachable ();
8276     }
8277   output_addr_const (file, x);
8278   if (TARGET_ELF)
8279     fputs ("@dtprel+0x8000", file);
8280   else if (TARGET_XCOFF && SYMBOL_REF_P (x))
8281     {
8282       switch (SYMBOL_REF_TLS_MODEL (x))
8283         {
8284         case 0:
8285           break;
8286         case TLS_MODEL_LOCAL_EXEC:
8287           fputs ("@le", file);
8288           break;
8289         case TLS_MODEL_INITIAL_EXEC:
8290           fputs ("@ie", file);
8291           break;
8292         case TLS_MODEL_GLOBAL_DYNAMIC:
8293         case TLS_MODEL_LOCAL_DYNAMIC:
8294           fputs ("@m", file);
8295           break;
8296         default:
8297           gcc_unreachable ();
8298         }
8299     }
8300 }
8301
8302 /* Return true if X is a symbol that refers to real (rather than emulated)
8303    TLS.  */
8304
8305 static bool
8306 rs6000_real_tls_symbol_ref_p (rtx x)
8307 {
8308   return (SYMBOL_REF_P (x)
8309           && SYMBOL_REF_TLS_MODEL (x) >= TLS_MODEL_REAL);
8310 }
8311
8312 /* In the name of slightly smaller debug output, and to cater to
8313    general assembler lossage, recognize various UNSPEC sequences
8314    and turn them back into a direct symbol reference.  */
8315
8316 static rtx
8317 rs6000_delegitimize_address (rtx orig_x)
8318 {
8319   rtx x, y, offset;
8320
8321   if (GET_CODE (orig_x) == UNSPEC && XINT (orig_x, 1) == UNSPEC_FUSION_GPR)
8322     orig_x = XVECEXP (orig_x, 0, 0);
8323
8324   orig_x = delegitimize_mem_from_attrs (orig_x);
8325
8326   x = orig_x;
8327   if (MEM_P (x))
8328     x = XEXP (x, 0);
8329
8330   y = x;
8331   if (TARGET_CMODEL != CMODEL_SMALL && GET_CODE (y) == LO_SUM)
8332     y = XEXP (y, 1);
8333
8334   offset = NULL_RTX;
8335   if (GET_CODE (y) == PLUS
8336       && GET_MODE (y) == Pmode
8337       && CONST_INT_P (XEXP (y, 1)))
8338     {
8339       offset = XEXP (y, 1);
8340       y = XEXP (y, 0);
8341     }
8342
8343   if (GET_CODE (y) == UNSPEC && XINT (y, 1) == UNSPEC_TOCREL)
8344     {
8345       y = XVECEXP (y, 0, 0);
8346
8347 #ifdef HAVE_AS_TLS
8348       /* Do not associate thread-local symbols with the original
8349          constant pool symbol.  */
8350       if (TARGET_XCOFF
8351           && SYMBOL_REF_P (y)
8352           && CONSTANT_POOL_ADDRESS_P (y)
8353           && rs6000_real_tls_symbol_ref_p (get_pool_constant (y)))
8354         return orig_x;
8355 #endif
8356
8357       if (offset != NULL_RTX)
8358         y = gen_rtx_PLUS (Pmode, y, offset);
8359       if (!MEM_P (orig_x))
8360         return y;
8361       else
8362         return replace_equiv_address_nv (orig_x, y);
8363     }
8364
8365   if (TARGET_MACHO
8366       && GET_CODE (orig_x) == LO_SUM
8367       && GET_CODE (XEXP (orig_x, 1)) == CONST)
8368     {
8369       y = XEXP (XEXP (orig_x, 1), 0);
8370       if (GET_CODE (y) == UNSPEC && XINT (y, 1) == UNSPEC_MACHOPIC_OFFSET)
8371         return XVECEXP (y, 0, 0);
8372     }
8373
8374   return orig_x;
8375 }
8376
8377 /* Return true if X shouldn't be emitted into the debug info.
8378    The linker doesn't like .toc section references from
8379    .debug_* sections, so reject .toc section symbols.  */
8380
8381 static bool
8382 rs6000_const_not_ok_for_debug_p (rtx x)
8383 {
8384   if (GET_CODE (x) == UNSPEC)
8385     return true;
8386   if (SYMBOL_REF_P (x)
8387       && CONSTANT_POOL_ADDRESS_P (x))
8388     {
8389       rtx c = get_pool_constant (x);
8390       machine_mode cmode = get_pool_mode (x);
8391       if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (c, cmode))
8392         return true;
8393     }
8394
8395   return false;
8396 }
8397
8398 /* Implement the TARGET_LEGITIMATE_COMBINED_INSN hook.  */
8399
8400 static bool
8401 rs6000_legitimate_combined_insn (rtx_insn *insn)
8402 {
8403   int icode = INSN_CODE (insn);
8404
8405   /* Reject creating doloop insns.  Combine should not be allowed
8406      to create these for a number of reasons:
8407      1) In a nested loop, if combine creates one of these in an
8408      outer loop and the register allocator happens to allocate ctr
8409      to the outer loop insn, then the inner loop can't use ctr.
8410      Inner loops ought to be more highly optimized.
8411      2) Combine often wants to create one of these from what was
8412      originally a three insn sequence, first combining the three
8413      insns to two, then to ctrsi/ctrdi.  When ctrsi/ctrdi is not
8414      allocated ctr, the splitter takes use back to the three insn
8415      sequence.  It's better to stop combine at the two insn
8416      sequence.
8417      3) Faced with not being able to allocate ctr for ctrsi/crtdi
8418      insns, the register allocator sometimes uses floating point
8419      or vector registers for the pseudo.  Since ctrsi/ctrdi is a
8420      jump insn and output reloads are not implemented for jumps,
8421      the ctrsi/ctrdi splitters need to handle all possible cases.
8422      That's a pain, and it gets to be seriously difficult when a
8423      splitter that runs after reload needs memory to transfer from
8424      a gpr to fpr.  See PR70098 and PR71763 which are not fixed
8425      for the difficult case.  It's better to not create problems
8426      in the first place.  */
8427   if (icode != CODE_FOR_nothing
8428       && (icode == CODE_FOR_bdz_si
8429           || icode == CODE_FOR_bdz_di
8430           || icode == CODE_FOR_bdnz_si
8431           || icode == CODE_FOR_bdnz_di
8432           || icode == CODE_FOR_bdztf_si
8433           || icode == CODE_FOR_bdztf_di
8434           || icode == CODE_FOR_bdnztf_si
8435           || icode == CODE_FOR_bdnztf_di))
8436     return false;
8437
8438   return true;
8439 }
8440
8441 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
8442
8443 static GTY(()) rtx rs6000_tls_symbol;
8444 static rtx
8445 rs6000_tls_get_addr (void)
8446 {
8447   if (!rs6000_tls_symbol)
8448     rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
8449
8450   return rs6000_tls_symbol;
8451 }
8452
8453 /* Construct the SYMBOL_REF for TLS GOT references.  */
8454
8455 static GTY(()) rtx rs6000_got_symbol;
8456 static rtx
8457 rs6000_got_sym (void)
8458 {
8459   if (!rs6000_got_symbol)
8460     {
8461       rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
8462       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
8463       SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
8464     }
8465
8466   return rs6000_got_symbol;
8467 }
8468
8469 /* AIX Thread-Local Address support.  */
8470
8471 static rtx
8472 rs6000_legitimize_tls_address_aix (rtx addr, enum tls_model model)
8473 {
8474   rtx sym, mem, tocref, tlsreg, tmpreg, dest, tlsaddr;
8475   const char *name;
8476   char *tlsname;
8477
8478   name = XSTR (addr, 0);
8479   /* Append TLS CSECT qualifier, unless the symbol already is qualified
8480      or the symbol will be in TLS private data section.  */
8481   if (name[strlen (name) - 1] != ']'
8482       && (TREE_PUBLIC (SYMBOL_REF_DECL (addr))
8483           || bss_initializer_p (SYMBOL_REF_DECL (addr))))
8484     {
8485       tlsname = XALLOCAVEC (char, strlen (name) + 4);
8486       strcpy (tlsname, name);
8487       strcat (tlsname,
8488               bss_initializer_p (SYMBOL_REF_DECL (addr)) ? "[UL]" : "[TL]");
8489       tlsaddr = copy_rtx (addr);
8490       XSTR (tlsaddr, 0) = ggc_strdup (tlsname);
8491     }
8492   else
8493     tlsaddr = addr;
8494
8495   /* Place addr into TOC constant pool.  */
8496   sym = force_const_mem (GET_MODE (tlsaddr), tlsaddr);
8497
8498   /* Output the TOC entry and create the MEM referencing the value.  */
8499   if (constant_pool_expr_p (XEXP (sym, 0))
8500       && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (XEXP (sym, 0)), Pmode))
8501     {
8502       tocref = create_TOC_reference (XEXP (sym, 0), NULL_RTX);
8503       mem = gen_const_mem (Pmode, tocref);
8504       set_mem_alias_set (mem, get_TOC_alias_set ());
8505     }
8506   else
8507     return sym;
8508
8509   /* Use global-dynamic for local-dynamic.  */
8510   if (model == TLS_MODEL_GLOBAL_DYNAMIC
8511       || model == TLS_MODEL_LOCAL_DYNAMIC)
8512     {
8513       /* Create new TOC reference for @m symbol.  */
8514       name = XSTR (XVECEXP (XEXP (mem, 0), 0, 0), 0);
8515       tlsname = XALLOCAVEC (char, strlen (name) + 1);
8516       strcpy (tlsname, "*LCM");
8517       strcat (tlsname, name + 3);
8518       rtx modaddr = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (tlsname));
8519       SYMBOL_REF_FLAGS (modaddr) |= SYMBOL_FLAG_LOCAL;
8520       tocref = create_TOC_reference (modaddr, NULL_RTX);
8521       rtx modmem = gen_const_mem (Pmode, tocref);
8522       set_mem_alias_set (modmem, get_TOC_alias_set ());
8523       
8524       rtx modreg = gen_reg_rtx (Pmode);
8525       emit_insn (gen_rtx_SET (modreg, modmem));
8526
8527       tmpreg = gen_reg_rtx (Pmode);
8528       emit_insn (gen_rtx_SET (tmpreg, mem));
8529
8530       dest = gen_reg_rtx (Pmode);
8531       if (TARGET_32BIT)
8532         emit_insn (gen_tls_get_addrsi (dest, modreg, tmpreg));
8533       else
8534         emit_insn (gen_tls_get_addrdi (dest, modreg, tmpreg));
8535       return dest;
8536     }
8537   /* Obtain TLS pointer: 32 bit call or 64 bit GPR 13.  */
8538   else if (TARGET_32BIT)
8539     {
8540       tlsreg = gen_reg_rtx (SImode);
8541       emit_insn (gen_tls_get_tpointer (tlsreg));
8542     }
8543   else
8544     tlsreg = gen_rtx_REG (DImode, 13);
8545
8546   /* Load the TOC value into temporary register.  */
8547   tmpreg = gen_reg_rtx (Pmode);
8548   emit_insn (gen_rtx_SET (tmpreg, mem));
8549   set_unique_reg_note (get_last_insn (), REG_EQUAL,
8550                        gen_rtx_MINUS (Pmode, addr, tlsreg));
8551
8552   /* Add TOC symbol value to TLS pointer.  */
8553   dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tmpreg, tlsreg));
8554
8555   return dest;
8556 }
8557
8558 /* Output arg setup instructions for a !TARGET_TLS_MARKERS
8559    __tls_get_addr call.  */
8560
8561 void
8562 rs6000_output_tlsargs (rtx *operands)
8563 {
8564   /* Set up operands for output_asm_insn, without modifying OPERANDS.  */
8565   rtx op[3];
8566
8567   /* The set dest of the call, ie. r3, which is also the first arg reg.  */
8568   op[0] = operands[0];
8569   /* The TLS symbol from global_tlsarg stashed as CALL operand 2.  */
8570   op[1] = XVECEXP (operands[2], 0, 0);
8571   if (XINT (operands[2], 1) == UNSPEC_TLSGD)
8572     {
8573       /* The GOT register.  */
8574       op[2] = XVECEXP (operands[2], 0, 1);
8575       if (TARGET_CMODEL != CMODEL_SMALL)
8576         output_asm_insn ("addis %0,%2,%1@got@tlsgd@ha\n\t"
8577                          "addi %0,%0,%1@got@tlsgd@l", op);
8578       else
8579         output_asm_insn ("addi %0,%2,%1@got@tlsgd", op);
8580     }
8581   else if (XINT (operands[2], 1) == UNSPEC_TLSLD)
8582     {
8583       if (TARGET_CMODEL != CMODEL_SMALL)
8584         output_asm_insn ("addis %0,%1,%&@got@tlsld@ha\n\t"
8585                          "addi %0,%0,%&@got@tlsld@l", op);
8586       else
8587         output_asm_insn ("addi %0,%1,%&@got@tlsld", op);
8588     }
8589   else
8590     gcc_unreachable ();
8591 }
8592
8593 /* Passes the tls arg value for global dynamic and local dynamic
8594    emit_library_call_value in rs6000_legitimize_tls_address to
8595    rs6000_call_aix and rs6000_call_sysv.  This is used to emit the
8596    marker relocs put on __tls_get_addr calls.  */
8597 static rtx global_tlsarg;
8598
8599 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
8600    this (thread-local) address.  */
8601
8602 static rtx
8603 rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
8604 {
8605   rtx dest, insn;
8606
8607   if (TARGET_XCOFF)
8608     return rs6000_legitimize_tls_address_aix (addr, model);
8609
8610   dest = gen_reg_rtx (Pmode);
8611   if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
8612     {
8613       rtx tlsreg;
8614
8615       if (TARGET_64BIT)
8616         {
8617           tlsreg = gen_rtx_REG (Pmode, 13);
8618           insn = gen_tls_tprel_64 (dest, tlsreg, addr);
8619         }
8620       else
8621         {
8622           tlsreg = gen_rtx_REG (Pmode, 2);
8623           insn = gen_tls_tprel_32 (dest, tlsreg, addr);
8624         }
8625       emit_insn (insn);
8626     }
8627   else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
8628     {
8629       rtx tlsreg, tmp;
8630
8631       tmp = gen_reg_rtx (Pmode);
8632       if (TARGET_64BIT)
8633         {
8634           tlsreg = gen_rtx_REG (Pmode, 13);
8635           insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
8636         }
8637       else
8638         {
8639           tlsreg = gen_rtx_REG (Pmode, 2);
8640           insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
8641         }
8642       emit_insn (insn);
8643       if (TARGET_64BIT)
8644         insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
8645       else
8646         insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
8647       emit_insn (insn);
8648     }
8649   else
8650     {
8651       rtx got, tga, tmp1, tmp2;
8652
8653       /* We currently use relocations like @got@tlsgd for tls, which
8654          means the linker will handle allocation of tls entries, placing
8655          them in the .got section.  So use a pointer to the .got section,
8656          not one to secondary TOC sections used by 64-bit -mminimal-toc,
8657          or to secondary GOT sections used by 32-bit -fPIC.  */
8658       if (TARGET_64BIT)
8659         got = gen_rtx_REG (Pmode, 2);
8660       else
8661         {
8662           if (flag_pic == 1)
8663             got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
8664           else
8665             {
8666               rtx gsym = rs6000_got_sym ();
8667               got = gen_reg_rtx (Pmode);
8668               if (flag_pic == 0)
8669                 rs6000_emit_move (got, gsym, Pmode);
8670               else
8671                 {
8672                   rtx mem, lab;
8673
8674                   tmp1 = gen_reg_rtx (Pmode);
8675                   tmp2 = gen_reg_rtx (Pmode);
8676                   mem = gen_const_mem (Pmode, tmp1);
8677                   lab = gen_label_rtx ();
8678                   emit_insn (gen_load_toc_v4_PIC_1b (gsym, lab));
8679                   emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
8680                   if (TARGET_LINK_STACK)
8681                     emit_insn (gen_addsi3 (tmp1, tmp1, GEN_INT (4)));
8682                   emit_move_insn (tmp2, mem);
8683                   rtx_insn *last = emit_insn (gen_addsi3 (got, tmp1, tmp2));
8684                   set_unique_reg_note (last, REG_EQUAL, gsym);
8685                 }
8686             }
8687         }
8688
8689       if (model == TLS_MODEL_GLOBAL_DYNAMIC)
8690         {
8691           rtx arg = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, addr, got),
8692                                     UNSPEC_TLSGD);
8693           tga = rs6000_tls_get_addr ();
8694           global_tlsarg = arg;
8695           if (TARGET_TLS_MARKERS)
8696             {
8697               rtx argreg = gen_rtx_REG (Pmode, 3);
8698               emit_insn (gen_rtx_SET (argreg, arg));
8699               emit_library_call_value (tga, dest, LCT_CONST, Pmode,
8700                                        argreg, Pmode);
8701             }
8702           else
8703             emit_library_call_value (tga, dest, LCT_CONST, Pmode);
8704           global_tlsarg = NULL_RTX;
8705
8706           /* Make a note so that the result of this call can be CSEd.  */
8707           rtvec vec = gen_rtvec (1, copy_rtx (arg));
8708           rtx uns = gen_rtx_UNSPEC (Pmode, vec, UNSPEC_TLS_GET_ADDR);
8709           set_unique_reg_note (get_last_insn (), REG_EQUAL, uns);
8710         }
8711       else if (model == TLS_MODEL_LOCAL_DYNAMIC)
8712         {
8713           rtx arg = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, got), UNSPEC_TLSLD);
8714           tga = rs6000_tls_get_addr ();
8715           tmp1 = gen_reg_rtx (Pmode);
8716           global_tlsarg = arg;
8717           if (TARGET_TLS_MARKERS)
8718             {
8719               rtx argreg = gen_rtx_REG (Pmode, 3);
8720               emit_insn (gen_rtx_SET (argreg, arg));
8721               emit_library_call_value (tga, tmp1, LCT_CONST, Pmode,
8722                                        argreg, Pmode);
8723             }
8724           else
8725             emit_library_call_value (tga, tmp1, LCT_CONST, Pmode);
8726           global_tlsarg = NULL_RTX;
8727
8728           /* Make a note so that the result of this call can be CSEd.  */
8729           rtvec vec = gen_rtvec (1, copy_rtx (arg));
8730           rtx uns = gen_rtx_UNSPEC (Pmode, vec, UNSPEC_TLS_GET_ADDR);
8731           set_unique_reg_note (get_last_insn (), REG_EQUAL, uns);
8732
8733           if (rs6000_tls_size == 16)
8734             {
8735               if (TARGET_64BIT)
8736                 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
8737               else
8738                 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
8739             }
8740           else if (rs6000_tls_size == 32)
8741             {
8742               tmp2 = gen_reg_rtx (Pmode);
8743               if (TARGET_64BIT)
8744                 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
8745               else
8746                 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
8747               emit_insn (insn);
8748               if (TARGET_64BIT)
8749                 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
8750               else
8751                 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
8752             }
8753           else
8754             {
8755               tmp2 = gen_reg_rtx (Pmode);
8756               if (TARGET_64BIT)
8757                 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
8758               else
8759                 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
8760               emit_insn (insn);
8761               insn = gen_rtx_SET (dest, gen_rtx_PLUS (Pmode, tmp2, tmp1));
8762             }
8763           emit_insn (insn);
8764         }
8765       else
8766         {
8767           /* IE, or 64-bit offset LE.  */
8768           tmp2 = gen_reg_rtx (Pmode);
8769           if (TARGET_64BIT)
8770             insn = gen_tls_got_tprel_64 (tmp2, got, addr);
8771           else
8772             insn = gen_tls_got_tprel_32 (tmp2, got, addr);
8773           emit_insn (insn);
8774           if (TARGET_64BIT)
8775             insn = gen_tls_tls_64 (dest, tmp2, addr);
8776           else
8777             insn = gen_tls_tls_32 (dest, tmp2, addr);
8778           emit_insn (insn);
8779         }
8780     }
8781
8782   return dest;
8783 }
8784
8785 /* Only create the global variable for the stack protect guard if we are using
8786    the global flavor of that guard.  */
8787 static tree
8788 rs6000_init_stack_protect_guard (void)
8789 {
8790   if (rs6000_stack_protector_guard == SSP_GLOBAL)
8791     return default_stack_protect_guard ();
8792
8793   return NULL_TREE;
8794 }
8795
8796 /* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
8797
8798 static bool
8799 rs6000_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
8800 {
8801   if (GET_CODE (x) == HIGH
8802       && GET_CODE (XEXP (x, 0)) == UNSPEC)
8803     return true;
8804
8805   /* A TLS symbol in the TOC cannot contain a sum.  */
8806   if (GET_CODE (x) == CONST
8807       && GET_CODE (XEXP (x, 0)) == PLUS
8808       && SYMBOL_REF_P (XEXP (XEXP (x, 0), 0))
8809       && SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0)) != 0)
8810     return true;
8811
8812   /* Do not place an ELF TLS symbol in the constant pool.  */
8813   return TARGET_ELF && tls_referenced_p (x);
8814 }
8815
8816 /* Return true iff the given SYMBOL_REF refers to a constant pool entry
8817    that we have put in the TOC, or for cmodel=medium, if the SYMBOL_REF
8818    can be addressed relative to the toc pointer.  */
8819
8820 static bool
8821 use_toc_relative_ref (rtx sym, machine_mode mode)
8822 {
8823   return ((constant_pool_expr_p (sym)
8824            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (sym),
8825                                                get_pool_mode (sym)))
8826           || (TARGET_CMODEL == CMODEL_MEDIUM
8827               && SYMBOL_REF_LOCAL_P (sym)
8828               && GET_MODE_SIZE (mode) <= POWERPC64_TOC_POINTER_ALIGNMENT));
8829 }
8830
8831 /* TARGET_LEGITIMATE_ADDRESS_P recognizes an RTL expression
8832    that is a valid memory address for an instruction.
8833    The MODE argument is the machine mode for the MEM expression
8834    that wants to use this address.
8835
8836    On the RS/6000, there are four valid address: a SYMBOL_REF that
8837    refers to a constant pool entry of an address (or the sum of it
8838    plus a constant), a short (16-bit signed) constant plus a register,
8839    the sum of two registers, or a register indirect, possibly with an
8840    auto-increment.  For DFmode, DDmode and DImode with a constant plus
8841    register, we must ensure that both words are addressable or PowerPC64
8842    with offset word aligned.
8843
8844    For modes spanning multiple registers (DFmode and DDmode in 32-bit GPRs,
8845    32-bit DImode, TImode, TFmode, TDmode), indexed addressing cannot be used
8846    because adjacent memory cells are accessed by adding word-sized offsets
8847    during assembly output.  */
8848 static bool
8849 rs6000_legitimate_address_p (machine_mode mode, rtx x, bool reg_ok_strict)
8850 {
8851   bool reg_offset_p = reg_offset_addressing_ok_p (mode);
8852   bool quad_offset_p = mode_supports_dq_form (mode);
8853
8854   /* If this is an unaligned stvx/ldvx type address, discard the outer AND.  */
8855   if (VECTOR_MEM_ALTIVEC_P (mode)
8856       && GET_CODE (x) == AND
8857       && CONST_INT_P (XEXP (x, 1))
8858       && INTVAL (XEXP (x, 1)) == -16)
8859     x = XEXP (x, 0);
8860
8861   if (TARGET_ELF && RS6000_SYMBOL_REF_TLS_P (x))
8862     return 0;
8863   if (legitimate_indirect_address_p (x, reg_ok_strict))
8864     return 1;
8865   if (TARGET_UPDATE
8866       && (GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
8867       && mode_supports_pre_incdec_p (mode)
8868       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
8869     return 1;
8870   /* Handle restricted vector d-form offsets in ISA 3.0.  */
8871   if (quad_offset_p)
8872     {
8873       if (quad_address_p (x, mode, reg_ok_strict))
8874         return 1;
8875     }
8876   else if (virtual_stack_registers_memory_p (x))
8877     return 1;
8878
8879   else if (reg_offset_p)
8880     {
8881       if (legitimate_small_data_p (mode, x))
8882         return 1;
8883       if (legitimate_constant_pool_address_p (x, mode,
8884                                              reg_ok_strict || lra_in_progress))
8885         return 1;
8886     }
8887
8888   /* For TImode, if we have TImode in VSX registers, only allow register
8889      indirect addresses.  This will allow the values to go in either GPRs
8890      or VSX registers without reloading.  The vector types would tend to
8891      go into VSX registers, so we allow REG+REG, while TImode seems
8892      somewhat split, in that some uses are GPR based, and some VSX based.  */
8893   /* FIXME: We could loosen this by changing the following to
8894        if (mode == TImode && TARGET_QUAD_MEMORY && TARGET_VSX)
8895      but currently we cannot allow REG+REG addressing for TImode.  See
8896      PR72827 for complete details on how this ends up hoodwinking DSE.  */
8897   if (mode == TImode && TARGET_VSX)
8898     return 0;
8899   /* If not REG_OK_STRICT (before reload) let pass any stack offset.  */
8900   if (! reg_ok_strict
8901       && reg_offset_p
8902       && GET_CODE (x) == PLUS
8903       && REG_P (XEXP (x, 0))
8904       && (XEXP (x, 0) == virtual_stack_vars_rtx
8905           || XEXP (x, 0) == arg_pointer_rtx)
8906       && CONST_INT_P (XEXP (x, 1)))
8907     return 1;
8908   if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict, false))
8909     return 1;
8910   if (!FLOAT128_2REG_P (mode)
8911       && (TARGET_HARD_FLOAT
8912           || TARGET_POWERPC64
8913           || (mode != DFmode && mode != DDmode))
8914       && (TARGET_POWERPC64 || mode != DImode)
8915       && (mode != TImode || VECTOR_MEM_VSX_P (TImode))
8916       && mode != PTImode
8917       && !avoiding_indexed_address_p (mode)
8918       && legitimate_indexed_address_p (x, reg_ok_strict))
8919     return 1;
8920   if (TARGET_UPDATE && GET_CODE (x) == PRE_MODIFY
8921       && mode_supports_pre_modify_p (mode)
8922       && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict)
8923       && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1),
8924                                               reg_ok_strict, false)
8925           || (!avoiding_indexed_address_p (mode)
8926               && legitimate_indexed_address_p (XEXP (x, 1), reg_ok_strict)))
8927       && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
8928     return 1;
8929   if (reg_offset_p && !quad_offset_p
8930       && legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
8931     return 1;
8932   return 0;
8933 }
8934
8935 /* Debug version of rs6000_legitimate_address_p.  */
8936 static bool
8937 rs6000_debug_legitimate_address_p (machine_mode mode, rtx x,
8938                                    bool reg_ok_strict)
8939 {
8940   bool ret = rs6000_legitimate_address_p (mode, x, reg_ok_strict);
8941   fprintf (stderr,
8942            "\nrs6000_legitimate_address_p: return = %s, mode = %s, "
8943            "strict = %d, reload = %s, code = %s\n",
8944            ret ? "true" : "false",
8945            GET_MODE_NAME (mode),
8946            reg_ok_strict,
8947            (reload_completed ? "after" : "before"),
8948            GET_RTX_NAME (GET_CODE (x)));
8949   debug_rtx (x);
8950
8951   return ret;
8952 }
8953
8954 /* Implement TARGET_MODE_DEPENDENT_ADDRESS_P.  */
8955
8956 static bool
8957 rs6000_mode_dependent_address_p (const_rtx addr,
8958                                  addr_space_t as ATTRIBUTE_UNUSED)
8959 {
8960   return rs6000_mode_dependent_address_ptr (addr);
8961 }
8962
8963 /* Go to LABEL if ADDR (a legitimate address expression)
8964    has an effect that depends on the machine mode it is used for.
8965
8966    On the RS/6000 this is true of all integral offsets (since AltiVec
8967    and VSX modes don't allow them) or is a pre-increment or decrement.
8968
8969    ??? Except that due to conceptual problems in offsettable_address_p
8970    we can't really report the problems of integral offsets.  So leave
8971    this assuming that the adjustable offset must be valid for the
8972    sub-words of a TFmode operand, which is what we had before.  */
8973
8974 static bool
8975 rs6000_mode_dependent_address (const_rtx addr)
8976 {
8977   switch (GET_CODE (addr))
8978     {
8979     case PLUS:
8980       /* Any offset from virtual_stack_vars_rtx and arg_pointer_rtx
8981          is considered a legitimate address before reload, so there
8982          are no offset restrictions in that case.  Note that this
8983          condition is safe in strict mode because any address involving
8984          virtual_stack_vars_rtx or arg_pointer_rtx would already have
8985          been rejected as illegitimate.  */
8986       if (XEXP (addr, 0) != virtual_stack_vars_rtx
8987           && XEXP (addr, 0) != arg_pointer_rtx
8988           && CONST_INT_P (XEXP (addr, 1)))
8989         {
8990           unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
8991           return val + 0x8000 >= 0x10000 - (TARGET_POWERPC64 ? 8 : 12);
8992         }
8993       break;
8994
8995     case LO_SUM:
8996       /* Anything in the constant pool is sufficiently aligned that
8997          all bytes have the same high part address.  */
8998       return !legitimate_constant_pool_address_p (addr, QImode, false);
8999
9000     /* Auto-increment cases are now treated generically in recog.c.  */
9001     case PRE_MODIFY:
9002       return TARGET_UPDATE;
9003
9004     /* AND is only allowed in Altivec loads.  */
9005     case AND:
9006       return true;
9007
9008     default:
9009       break;
9010     }
9011
9012   return false;
9013 }
9014
9015 /* Debug version of rs6000_mode_dependent_address.  */
9016 static bool
9017 rs6000_debug_mode_dependent_address (const_rtx addr)
9018 {
9019   bool ret = rs6000_mode_dependent_address (addr);
9020
9021   fprintf (stderr, "\nrs6000_mode_dependent_address: ret = %s\n",
9022            ret ? "true" : "false");
9023   debug_rtx (addr);
9024
9025   return ret;
9026 }
9027
9028 /* Implement FIND_BASE_TERM.  */
9029
9030 rtx
9031 rs6000_find_base_term (rtx op)
9032 {
9033   rtx base;
9034
9035   base = op;
9036   if (GET_CODE (base) == CONST)
9037     base = XEXP (base, 0);
9038   if (GET_CODE (base) == PLUS)
9039     base = XEXP (base, 0);
9040   if (GET_CODE (base) == UNSPEC)
9041     switch (XINT (base, 1))
9042       {
9043       case UNSPEC_TOCREL:
9044       case UNSPEC_MACHOPIC_OFFSET:
9045         /* OP represents SYM [+ OFFSET] - ANCHOR.  SYM is the base term
9046            for aliasing purposes.  */
9047         return XVECEXP (base, 0, 0);
9048       }
9049
9050   return op;
9051 }
9052
9053 /* More elaborate version of recog's offsettable_memref_p predicate
9054    that works around the ??? note of rs6000_mode_dependent_address.
9055    In particular it accepts
9056
9057      (mem:DI (plus:SI (reg/f:SI 31 31) (const_int 32760 [0x7ff8])))
9058
9059    in 32-bit mode, that the recog predicate rejects.  */
9060
9061 static bool
9062 rs6000_offsettable_memref_p (rtx op, machine_mode reg_mode, bool strict)
9063 {
9064   bool worst_case;
9065
9066   if (!MEM_P (op))
9067     return false;
9068
9069   /* First mimic offsettable_memref_p.  */
9070   if (offsettable_address_p (strict, GET_MODE (op), XEXP (op, 0)))
9071     return true;
9072
9073   /* offsettable_address_p invokes rs6000_mode_dependent_address, but
9074      the latter predicate knows nothing about the mode of the memory
9075      reference and, therefore, assumes that it is the largest supported
9076      mode (TFmode).  As a consequence, legitimate offsettable memory
9077      references are rejected.  rs6000_legitimate_offset_address_p contains
9078      the correct logic for the PLUS case of rs6000_mode_dependent_address,
9079      at least with a little bit of help here given that we know the
9080      actual registers used.  */
9081   worst_case = ((TARGET_POWERPC64 && GET_MODE_CLASS (reg_mode) == MODE_INT)
9082                 || GET_MODE_SIZE (reg_mode) == 4);
9083   return rs6000_legitimate_offset_address_p (GET_MODE (op), XEXP (op, 0),
9084                                              strict, worst_case);
9085 }
9086
9087 /* Determine the reassociation width to be used in reassociate_bb.
9088    This takes into account how many parallel operations we
9089    can actually do of a given type, and also the latency.
9090    P8:
9091      int add/sub 6/cycle     
9092          mul 2/cycle
9093      vect add/sub/mul 2/cycle
9094      fp   add/sub/mul 2/cycle
9095      dfp  1/cycle
9096 */
9097  
9098 static int
9099 rs6000_reassociation_width (unsigned int opc ATTRIBUTE_UNUSED,
9100                             machine_mode mode)
9101 {
9102   switch (rs6000_tune)
9103     {
9104     case PROCESSOR_POWER8:
9105     case PROCESSOR_POWER9:
9106     case PROCESSOR_FUTURE:
9107       if (DECIMAL_FLOAT_MODE_P (mode))
9108         return 1;
9109       if (VECTOR_MODE_P (mode))
9110         return 4;
9111       if (INTEGRAL_MODE_P (mode)) 
9112         return 1;
9113       if (FLOAT_MODE_P (mode))
9114         return 4;
9115       break;
9116     default:
9117       break;
9118     }
9119   return 1;
9120 }
9121
9122 /* Change register usage conditional on target flags.  */
9123 static void
9124 rs6000_conditional_register_usage (void)
9125 {
9126   int i;
9127
9128   if (TARGET_DEBUG_TARGET)
9129     fprintf (stderr, "rs6000_conditional_register_usage called\n");
9130
9131   /* 64-bit AIX and Linux reserve GPR13 for thread-private data.  */
9132   if (TARGET_64BIT)
9133     fixed_regs[13] = call_used_regs[13]
9134       = call_really_used_regs[13] = 1;
9135
9136   /* Conditionally disable FPRs.  */
9137   if (TARGET_SOFT_FLOAT)
9138     for (i = 32; i < 64; i++)
9139       fixed_regs[i] = call_used_regs[i]
9140         = call_really_used_regs[i] = 1;
9141
9142   /* The TOC register is not killed across calls in a way that is
9143      visible to the compiler.  */
9144   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
9145     call_really_used_regs[2] = 0;
9146
9147   if (DEFAULT_ABI == ABI_V4 && flag_pic == 2)
9148     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
9149
9150   if (DEFAULT_ABI == ABI_V4 && flag_pic == 1)
9151     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
9152       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
9153       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
9154
9155   if (DEFAULT_ABI == ABI_DARWIN && flag_pic)
9156     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
9157       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
9158       = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
9159
9160   if (TARGET_TOC && TARGET_MINIMAL_TOC)
9161     fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
9162       = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
9163
9164   if (!TARGET_ALTIVEC && !TARGET_VSX)
9165     {
9166       for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
9167         fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
9168       call_really_used_regs[VRSAVE_REGNO] = 1;
9169     }
9170
9171   if (TARGET_ALTIVEC || TARGET_VSX)
9172     global_regs[VSCR_REGNO] = 1;
9173
9174   if (TARGET_ALTIVEC_ABI)
9175     {
9176       for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
9177         call_used_regs[i] = call_really_used_regs[i] = 1;
9178
9179       /* AIX reserves VR20:31 in non-extended ABI mode.  */
9180       if (TARGET_XCOFF)
9181         for (i = FIRST_ALTIVEC_REGNO + 20; i < FIRST_ALTIVEC_REGNO + 32; ++i)
9182           fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
9183     }
9184 }
9185
9186 \f
9187 /* Output insns to set DEST equal to the constant SOURCE as a series of
9188    lis, ori and shl instructions and return TRUE.  */
9189
9190 bool
9191 rs6000_emit_set_const (rtx dest, rtx source)
9192 {
9193   machine_mode mode = GET_MODE (dest);
9194   rtx temp, set;
9195   rtx_insn *insn;
9196   HOST_WIDE_INT c;
9197
9198   gcc_checking_assert (CONST_INT_P (source));
9199   c = INTVAL (source);
9200   switch (mode)
9201     {
9202     case E_QImode:
9203     case E_HImode:
9204       emit_insn (gen_rtx_SET (dest, source));
9205       return true;
9206
9207     case E_SImode:
9208       temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (SImode);
9209
9210       emit_insn (gen_rtx_SET (copy_rtx (temp),
9211                               GEN_INT (c & ~(HOST_WIDE_INT) 0xffff)));
9212       emit_insn (gen_rtx_SET (dest,
9213                               gen_rtx_IOR (SImode, copy_rtx (temp),
9214                                            GEN_INT (c & 0xffff))));
9215       break;
9216
9217     case E_DImode:
9218       if (!TARGET_POWERPC64)
9219         {
9220           rtx hi, lo;
9221
9222           hi = operand_subword_force (copy_rtx (dest), WORDS_BIG_ENDIAN == 0,
9223                                       DImode);
9224           lo = operand_subword_force (dest, WORDS_BIG_ENDIAN != 0,
9225                                       DImode);
9226           emit_move_insn (hi, GEN_INT (c >> 32));
9227           c = ((c & 0xffffffff) ^ 0x80000000) - 0x80000000;
9228           emit_move_insn (lo, GEN_INT (c));
9229         }
9230       else
9231         rs6000_emit_set_long_const (dest, c);
9232       break;
9233
9234     default:
9235       gcc_unreachable ();
9236     }
9237
9238   insn = get_last_insn ();
9239   set = single_set (insn);
9240   if (! CONSTANT_P (SET_SRC (set)))
9241     set_unique_reg_note (insn, REG_EQUAL, GEN_INT (c));
9242
9243   return true;
9244 }
9245
9246 /* Subroutine of rs6000_emit_set_const, handling PowerPC64 DImode.
9247    Output insns to set DEST equal to the constant C as a series of
9248    lis, ori and shl instructions.  */
9249
9250 static void
9251 rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c)
9252 {
9253   rtx temp;
9254   HOST_WIDE_INT ud1, ud2, ud3, ud4;
9255
9256   ud1 = c & 0xffff;
9257   c = c >> 16;
9258   ud2 = c & 0xffff;
9259   c = c >> 16;
9260   ud3 = c & 0xffff;
9261   c = c >> 16;
9262   ud4 = c & 0xffff;
9263
9264   if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
9265       || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
9266     emit_move_insn (dest, GEN_INT ((ud1 ^ 0x8000) - 0x8000));
9267
9268   else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
9269            || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
9270     {
9271       temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
9272
9273       emit_move_insn (ud1 != 0 ? copy_rtx (temp) : dest,
9274                       GEN_INT (((ud2 << 16) ^ 0x80000000) - 0x80000000));
9275       if (ud1 != 0)
9276         emit_move_insn (dest,
9277                         gen_rtx_IOR (DImode, copy_rtx (temp),
9278                                      GEN_INT (ud1)));
9279     }
9280   else if (ud3 == 0 && ud4 == 0)
9281     {
9282       temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
9283
9284       gcc_assert (ud2 & 0x8000);
9285       emit_move_insn (copy_rtx (temp),
9286                       GEN_INT (((ud2 << 16) ^ 0x80000000) - 0x80000000));
9287       if (ud1 != 0)
9288         emit_move_insn (copy_rtx (temp),
9289                         gen_rtx_IOR (DImode, copy_rtx (temp),
9290                                      GEN_INT (ud1)));
9291       emit_move_insn (dest,
9292                       gen_rtx_ZERO_EXTEND (DImode,
9293                                            gen_lowpart (SImode,
9294                                                         copy_rtx (temp))));
9295     }
9296   else if ((ud4 == 0xffff && (ud3 & 0x8000))
9297            || (ud4 == 0 && ! (ud3 & 0x8000)))
9298     {
9299       temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
9300
9301       emit_move_insn (copy_rtx (temp),
9302                       GEN_INT (((ud3 << 16) ^ 0x80000000) - 0x80000000));
9303       if (ud2 != 0)
9304         emit_move_insn (copy_rtx (temp),
9305                         gen_rtx_IOR (DImode, copy_rtx (temp),
9306                                      GEN_INT (ud2)));
9307       emit_move_insn (ud1 != 0 ? copy_rtx (temp) : dest,
9308                       gen_rtx_ASHIFT (DImode, copy_rtx (temp),
9309                                       GEN_INT (16)));
9310       if (ud1 != 0)
9311         emit_move_insn (dest,
9312                         gen_rtx_IOR (DImode, copy_rtx (temp),
9313                                      GEN_INT (ud1)));
9314     }
9315   else
9316     {
9317       temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
9318
9319       emit_move_insn (copy_rtx (temp),
9320                       GEN_INT (((ud4 << 16) ^ 0x80000000) - 0x80000000));
9321       if (ud3 != 0)
9322         emit_move_insn (copy_rtx (temp),
9323                         gen_rtx_IOR (DImode, copy_rtx (temp),
9324                                      GEN_INT (ud3)));
9325
9326       emit_move_insn (ud2 != 0 || ud1 != 0 ? copy_rtx (temp) : dest,
9327                       gen_rtx_ASHIFT (DImode, copy_rtx (temp),
9328                                       GEN_INT (32)));
9329       if (ud2 != 0)
9330         emit_move_insn (ud1 != 0 ? copy_rtx (temp) : dest,
9331                         gen_rtx_IOR (DImode, copy_rtx (temp),
9332                                      GEN_INT (ud2 << 16)));
9333       if (ud1 != 0)
9334         emit_move_insn (dest,
9335                         gen_rtx_IOR (DImode, copy_rtx (temp),
9336                                      GEN_INT (ud1)));
9337     }
9338 }
9339
9340 /* Helper for the following.  Get rid of [r+r] memory refs
9341    in cases where it won't work (TImode, TFmode, TDmode, PTImode).  */
9342
9343 static void
9344 rs6000_eliminate_indexed_memrefs (rtx operands[2])
9345 {
9346   if (MEM_P (operands[0])
9347       && !REG_P (XEXP (operands[0], 0))
9348       && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0),
9349                                                GET_MODE (operands[0]), false))
9350     operands[0]
9351       = replace_equiv_address (operands[0],
9352                                copy_addr_to_reg (XEXP (operands[0], 0)));
9353
9354   if (MEM_P (operands[1])
9355       && !REG_P (XEXP (operands[1], 0))
9356       && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0),
9357                                                GET_MODE (operands[1]), false))
9358     operands[1]
9359       = replace_equiv_address (operands[1],
9360                                copy_addr_to_reg (XEXP (operands[1], 0)));
9361 }
9362
9363 /* Generate a vector of constants to permute MODE for a little-endian
9364    storage operation by swapping the two halves of a vector.  */
9365 static rtvec
9366 rs6000_const_vec (machine_mode mode)
9367 {
9368   int i, subparts;
9369   rtvec v;
9370
9371   switch (mode)
9372     {
9373     case E_V1TImode:
9374       subparts = 1;
9375       break;
9376     case E_V2DFmode:
9377     case E_V2DImode:
9378       subparts = 2;
9379       break;
9380     case E_V4SFmode:
9381     case E_V4SImode:
9382       subparts = 4;
9383       break;
9384     case E_V8HImode:
9385       subparts = 8;
9386       break;
9387     case E_V16QImode:
9388       subparts = 16;
9389       break;
9390     default:
9391       gcc_unreachable();
9392     }
9393
9394   v = rtvec_alloc (subparts);
9395
9396   for (i = 0; i < subparts / 2; ++i)
9397     RTVEC_ELT (v, i) = gen_rtx_CONST_INT (DImode, i + subparts / 2);
9398   for (i = subparts / 2; i < subparts; ++i)
9399     RTVEC_ELT (v, i) = gen_rtx_CONST_INT (DImode, i - subparts / 2);
9400
9401   return v;
9402 }
9403
9404 /* Emit an lxvd2x, stxvd2x, or xxpermdi instruction for a VSX load or
9405    store operation.  */
9406 void
9407 rs6000_emit_le_vsx_permute (rtx dest, rtx source, machine_mode mode)
9408 {
9409   /* Scalar permutations are easier to express in integer modes rather than
9410      floating-point modes, so cast them here.  We use V1TImode instead
9411      of TImode to ensure that the values don't go through GPRs.  */
9412   if (FLOAT128_VECTOR_P (mode))
9413     {
9414       dest = gen_lowpart (V1TImode, dest);
9415       source = gen_lowpart (V1TImode, source);
9416       mode = V1TImode;
9417     }
9418
9419   /* Use ROTATE instead of VEC_SELECT if the mode contains only a single
9420      scalar.  */
9421   if (mode == TImode || mode == V1TImode)
9422     emit_insn (gen_rtx_SET (dest, gen_rtx_ROTATE (mode, source,
9423                                                   GEN_INT (64))));
9424   else
9425     {
9426       rtx par = gen_rtx_PARALLEL (VOIDmode, rs6000_const_vec (mode));
9427       emit_insn (gen_rtx_SET (dest, gen_rtx_VEC_SELECT (mode, source, par)));
9428     }
9429 }
9430
9431 /* Emit a little-endian load from vector memory location SOURCE to VSX
9432    register DEST in mode MODE.  The load is done with two permuting
9433    insn's that represent an lxvd2x and xxpermdi.  */
9434 void
9435 rs6000_emit_le_vsx_load (rtx dest, rtx source, machine_mode mode)
9436 {
9437   /* Use V2DImode to do swaps of types with 128-bit scalare parts (TImode,
9438      V1TImode).  */
9439   if (mode == TImode || mode == V1TImode)
9440     {
9441       mode = V2DImode;
9442       dest = gen_lowpart (V2DImode, dest);
9443       source = adjust_address (source, V2DImode, 0);
9444     }
9445
9446   rtx tmp = can_create_pseudo_p () ? gen_reg_rtx_and_attrs (dest) : dest;
9447   rs6000_emit_le_vsx_permute (tmp, source, mode);
9448   rs6000_emit_le_vsx_permute (dest, tmp, mode);
9449 }
9450
9451 /* Emit a little-endian store to vector memory location DEST from VSX
9452    register SOURCE in mode MODE.  The store is done with two permuting
9453    insn's that represent an xxpermdi and an stxvd2x.  */
9454 void
9455 rs6000_emit_le_vsx_store (rtx dest, rtx source, machine_mode mode)
9456 {
9457   /* This should never be called during or after LRA, because it does
9458      not re-permute the source register.  It is intended only for use
9459      during expand.  */
9460   gcc_assert (!lra_in_progress && !reload_completed);
9461
9462   /* Use V2DImode to do swaps of types with 128-bit scalar parts (TImode,
9463      V1TImode).  */
9464   if (mode == TImode || mode == V1TImode)
9465     {
9466       mode = V2DImode;
9467       dest = adjust_address (dest, V2DImode, 0);
9468       source = gen_lowpart (V2DImode, source);
9469     }
9470
9471   rtx tmp = can_create_pseudo_p () ? gen_reg_rtx_and_attrs (source) : source;
9472   rs6000_emit_le_vsx_permute (tmp, source, mode);
9473   rs6000_emit_le_vsx_permute (dest, tmp, mode);
9474 }
9475
9476 /* Emit a sequence representing a little-endian VSX load or store,
9477    moving data from SOURCE to DEST in mode MODE.  This is done
9478    separately from rs6000_emit_move to ensure it is called only
9479    during expand.  LE VSX loads and stores introduced later are
9480    handled with a split.  The expand-time RTL generation allows
9481    us to optimize away redundant pairs of register-permutes.  */
9482 void
9483 rs6000_emit_le_vsx_move (rtx dest, rtx source, machine_mode mode)
9484 {
9485   gcc_assert (!BYTES_BIG_ENDIAN
9486               && VECTOR_MEM_VSX_P (mode)
9487               && !TARGET_P9_VECTOR
9488               && !gpr_or_gpr_p (dest, source)
9489               && (MEM_P (source) ^ MEM_P (dest)));
9490
9491   if (MEM_P (source))
9492     {
9493       gcc_assert (REG_P (dest) || SUBREG_P (dest));
9494       rs6000_emit_le_vsx_load (dest, source, mode);
9495     }
9496   else
9497     {
9498       if (!REG_P (source))
9499         source = force_reg (mode, source);
9500       rs6000_emit_le_vsx_store (dest, source, mode);
9501     }
9502 }
9503
9504 /* Return whether a SFmode or SImode move can be done without converting one
9505    mode to another.  This arrises when we have:
9506
9507         (SUBREG:SF (REG:SI ...))
9508         (SUBREG:SI (REG:SF ...))
9509
9510    and one of the values is in a floating point/vector register, where SFmode
9511    scalars are stored in DFmode format.  */
9512
9513 bool
9514 valid_sf_si_move (rtx dest, rtx src, machine_mode mode)
9515 {
9516   if (TARGET_ALLOW_SF_SUBREG)
9517     return true;
9518
9519   if (mode != SFmode && GET_MODE_CLASS (mode) != MODE_INT)
9520     return true;
9521
9522   if (!SUBREG_P (src) || !sf_subreg_operand (src, mode))
9523     return true;
9524
9525   /*.  Allow (set (SUBREG:SI (REG:SF)) (SUBREG:SI (REG:SF))).  */
9526   if (SUBREG_P (dest))
9527     {
9528       rtx dest_subreg = SUBREG_REG (dest);
9529       rtx src_subreg = SUBREG_REG (src);
9530       return GET_MODE (dest_subreg) == GET_MODE (src_subreg);
9531     }
9532
9533   return false;
9534 }
9535
9536
9537 /* Helper function to change moves with:
9538
9539         (SUBREG:SF (REG:SI)) and
9540         (SUBREG:SI (REG:SF))
9541
9542    into separate UNSPEC insns.  In the PowerPC architecture, scalar SFmode
9543    values are stored as DFmode values in the VSX registers.  We need to convert
9544    the bits before we can use a direct move or operate on the bits in the
9545    vector register as an integer type.
9546
9547    Skip things like (set (SUBREG:SI (...) (SUBREG:SI (...)).  */
9548
9549 static bool
9550 rs6000_emit_move_si_sf_subreg (rtx dest, rtx source, machine_mode mode)
9551 {
9552   if (TARGET_DIRECT_MOVE_64BIT && !reload_completed
9553       && (!SUBREG_P (dest) || !sf_subreg_operand (dest, mode))
9554       && SUBREG_P (source) && sf_subreg_operand (source, mode))
9555     {
9556       rtx inner_source = SUBREG_REG (source);
9557       machine_mode inner_mode = GET_MODE (inner_source);
9558
9559       if (mode == SImode && inner_mode == SFmode)
9560         {
9561           emit_insn (gen_movsi_from_sf (dest, inner_source));
9562           return true;
9563         }
9564
9565       if (mode == SFmode && inner_mode == SImode)
9566         {
9567           emit_insn (gen_movsf_from_si (dest, inner_source));
9568           return true;
9569         }
9570     }
9571
9572   return false;
9573 }
9574
9575 /* Emit a move from SOURCE to DEST in mode MODE.  */
9576 void
9577 rs6000_emit_move (rtx dest, rtx source, machine_mode mode)
9578 {
9579   rtx operands[2];
9580   operands[0] = dest;
9581   operands[1] = source;
9582
9583   if (TARGET_DEBUG_ADDR)
9584     {
9585       fprintf (stderr,
9586                "\nrs6000_emit_move: mode = %s, lra_in_progress = %d, "
9587                "reload_completed = %d, can_create_pseudos = %d.\ndest:\n",
9588                GET_MODE_NAME (mode),
9589                lra_in_progress,
9590                reload_completed,
9591                can_create_pseudo_p ());
9592       debug_rtx (dest);
9593       fprintf (stderr, "source:\n");
9594       debug_rtx (source);
9595     }
9596
9597   /* Check that we get CONST_WIDE_INT only when we should.  */
9598   if (CONST_WIDE_INT_P (operands[1])
9599       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
9600     gcc_unreachable ();
9601
9602 #ifdef HAVE_AS_GNU_ATTRIBUTE
9603   /* If we use a long double type, set the flags in .gnu_attribute that say
9604      what the long double type is.  This is to allow the linker's warning
9605      message for the wrong long double to be useful, even if the function does
9606      not do a call (for example, doing a 128-bit add on power9 if the long
9607      double type is IEEE 128-bit.  Do not set this if __ibm128 or __floa128 are
9608      used if they aren't the default long dobule type.  */
9609   if (rs6000_gnu_attr && (HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE || TARGET_64BIT))
9610     {
9611       if (TARGET_LONG_DOUBLE_128 && (mode == TFmode || mode == TCmode))
9612         rs6000_passes_float = rs6000_passes_long_double = true;
9613
9614       else if (!TARGET_LONG_DOUBLE_128 && (mode == DFmode || mode == DCmode))
9615         rs6000_passes_float = rs6000_passes_long_double = true;
9616     }
9617 #endif
9618
9619   /* See if we need to special case SImode/SFmode SUBREG moves.  */
9620   if ((mode == SImode || mode == SFmode) && SUBREG_P (source)
9621       && rs6000_emit_move_si_sf_subreg (dest, source, mode))
9622     return;
9623
9624   /* Check if GCC is setting up a block move that will end up using FP
9625      registers as temporaries.  We must make sure this is acceptable.  */
9626   if (MEM_P (operands[0])
9627       && MEM_P (operands[1])
9628       && mode == DImode
9629       && (rs6000_slow_unaligned_access (DImode, MEM_ALIGN (operands[0]))
9630           || rs6000_slow_unaligned_access (DImode, MEM_ALIGN (operands[1])))
9631       && ! (rs6000_slow_unaligned_access (SImode,
9632                                           (MEM_ALIGN (operands[0]) > 32
9633                                            ? 32 : MEM_ALIGN (operands[0])))
9634             || rs6000_slow_unaligned_access (SImode,
9635                                              (MEM_ALIGN (operands[1]) > 32
9636                                               ? 32 : MEM_ALIGN (operands[1]))))
9637       && ! MEM_VOLATILE_P (operands [0])
9638       && ! MEM_VOLATILE_P (operands [1]))
9639     {
9640       emit_move_insn (adjust_address (operands[0], SImode, 0),
9641                       adjust_address (operands[1], SImode, 0));
9642       emit_move_insn (adjust_address (copy_rtx (operands[0]), SImode, 4),
9643                       adjust_address (copy_rtx (operands[1]), SImode, 4));
9644       return;
9645     }
9646
9647   if (can_create_pseudo_p () && MEM_P (operands[0])
9648       && !gpc_reg_operand (operands[1], mode))
9649     operands[1] = force_reg (mode, operands[1]);
9650
9651   /* Recognize the case where operand[1] is a reference to thread-local
9652      data and load its address to a register.  */
9653   if (tls_referenced_p (operands[1]))
9654     {
9655       enum tls_model model;
9656       rtx tmp = operands[1];
9657       rtx addend = NULL;
9658
9659       if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
9660         {
9661           addend = XEXP (XEXP (tmp, 0), 1);
9662           tmp = XEXP (XEXP (tmp, 0), 0);
9663         }
9664
9665       gcc_assert (SYMBOL_REF_P (tmp));
9666       model = SYMBOL_REF_TLS_MODEL (tmp);
9667       gcc_assert (model != 0);
9668
9669       tmp = rs6000_legitimize_tls_address (tmp, model);
9670       if (addend)
9671         {
9672           tmp = gen_rtx_PLUS (mode, tmp, addend);
9673           tmp = force_operand (tmp, operands[0]);
9674         }
9675       operands[1] = tmp;
9676     }
9677
9678   /* 128-bit constant floating-point values on Darwin should really be loaded
9679      as two parts.  However, this premature splitting is a problem when DFmode
9680      values can go into Altivec registers.  */
9681   if (TARGET_MACHO && CONST_DOUBLE_P (operands[1]) && FLOAT128_IBM_P (mode)
9682       && !reg_addr[DFmode].scalar_in_vmx_p)
9683     {
9684       rs6000_emit_move (simplify_gen_subreg (DFmode, operands[0], mode, 0),
9685                         simplify_gen_subreg (DFmode, operands[1], mode, 0),
9686                         DFmode);
9687       rs6000_emit_move (simplify_gen_subreg (DFmode, operands[0], mode,
9688                                              GET_MODE_SIZE (DFmode)),
9689                         simplify_gen_subreg (DFmode, operands[1], mode,
9690                                              GET_MODE_SIZE (DFmode)),
9691                         DFmode);
9692       return;
9693     }
9694
9695   /* Transform (p0:DD, (SUBREG:DD p1:SD)) to ((SUBREG:SD p0:DD),
9696      p1:SD) if p1 is not of floating point class and p0 is spilled as
9697      we can have no analogous movsd_store for this.  */
9698   if (lra_in_progress && mode == DDmode
9699       && REG_P (operands[0]) && !HARD_REGISTER_P (operands[0])
9700       && reg_preferred_class (REGNO (operands[0])) == NO_REGS
9701       && SUBREG_P (operands[1]) && REG_P (SUBREG_REG (operands[1]))
9702       && GET_MODE (SUBREG_REG (operands[1])) == SDmode)
9703     {
9704       enum reg_class cl;
9705       int regno = REGNO (SUBREG_REG (operands[1]));
9706
9707       if (!HARD_REGISTER_NUM_P (regno))
9708         {
9709           cl = reg_preferred_class (regno);
9710           regno = reg_renumber[regno];
9711           if (regno < 0)
9712             regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];
9713         }
9714       if (regno >= 0 && ! FP_REGNO_P (regno))
9715         {
9716           mode = SDmode;
9717           operands[0] = gen_lowpart_SUBREG (SDmode, operands[0]);
9718           operands[1] = SUBREG_REG (operands[1]);
9719         }
9720     }
9721   if (lra_in_progress
9722       && mode == SDmode
9723       && REG_P (operands[0]) && !HARD_REGISTER_P (operands[0])
9724       && reg_preferred_class (REGNO (operands[0])) == NO_REGS
9725       && (REG_P (operands[1])
9726           || (SUBREG_P (operands[1]) && REG_P (SUBREG_REG (operands[1])))))
9727     {
9728       int regno = reg_or_subregno (operands[1]);
9729       enum reg_class cl;
9730
9731       if (!HARD_REGISTER_NUM_P (regno))
9732         {
9733           cl = reg_preferred_class (regno);
9734           gcc_assert (cl != NO_REGS);
9735           regno = reg_renumber[regno];
9736           if (regno < 0)
9737             regno = ira_class_hard_regs[cl][0];
9738         }
9739       if (FP_REGNO_P (regno))
9740         {
9741           if (GET_MODE (operands[0]) != DDmode)
9742             operands[0] = gen_rtx_SUBREG (DDmode, operands[0], 0);
9743           emit_insn (gen_movsd_store (operands[0], operands[1]));
9744         }
9745       else if (INT_REGNO_P (regno))
9746         emit_insn (gen_movsd_hardfloat (operands[0], operands[1]));
9747       else
9748         gcc_unreachable();
9749       return;
9750     }
9751   /* Transform ((SUBREG:DD p0:SD), p1:DD) to (p0:SD, (SUBREG:SD
9752      p:DD)) if p0 is not of floating point class and p1 is spilled as
9753      we can have no analogous movsd_load for this.  */
9754   if (lra_in_progress && mode == DDmode
9755       && SUBREG_P (operands[0]) && REG_P (SUBREG_REG (operands[0]))
9756       && GET_MODE (SUBREG_REG (operands[0])) == SDmode
9757       && REG_P (operands[1]) && !HARD_REGISTER_P (operands[1])
9758       && reg_preferred_class (REGNO (operands[1])) == NO_REGS)
9759     {
9760       enum reg_class cl;
9761       int regno = REGNO (SUBREG_REG (operands[0]));
9762
9763       if (!HARD_REGISTER_NUM_P (regno))
9764         {
9765           cl = reg_preferred_class (regno);
9766           regno = reg_renumber[regno];
9767           if (regno < 0)
9768             regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][0];
9769         }
9770       if (regno >= 0 && ! FP_REGNO_P (regno))
9771         {
9772           mode = SDmode;
9773           operands[0] = SUBREG_REG (operands[0]);
9774           operands[1] = gen_lowpart_SUBREG (SDmode, operands[1]);
9775         }
9776     }
9777   if (lra_in_progress
9778       && mode == SDmode
9779       && (REG_P (operands[0])
9780           || (SUBREG_P (operands[0]) && REG_P (SUBREG_REG (operands[0]))))
9781       && REG_P (operands[1]) && !HARD_REGISTER_P (operands[1])
9782       && reg_preferred_class (REGNO (operands[1])) == NO_REGS)
9783     {
9784       int regno = reg_or_subregno (operands[0]);
9785       enum reg_class cl;
9786
9787       if (!HARD_REGISTER_NUM_P (regno))
9788         {
9789           cl = reg_preferred_class (regno);
9790           gcc_assert (cl != NO_REGS);
9791           regno = reg_renumber[regno];
9792           if (regno < 0)
9793             regno = ira_class_hard_regs[cl][0];
9794         }
9795       if (FP_REGNO_P (regno))
9796         {
9797           if (GET_MODE (operands[1]) != DDmode)
9798             operands[1] = gen_rtx_SUBREG (DDmode, operands[1], 0);
9799           emit_insn (gen_movsd_load (operands[0], operands[1]));
9800         }
9801       else if (INT_REGNO_P (regno))
9802         emit_insn (gen_movsd_hardfloat (operands[0], operands[1]));
9803       else
9804         gcc_unreachable();
9805       return;
9806     }
9807
9808   /* FIXME:  In the long term, this switch statement should go away
9809      and be replaced by a sequence of tests based on things like
9810      mode == Pmode.  */
9811   switch (mode)
9812     {
9813     case E_HImode:
9814     case E_QImode:
9815       if (CONSTANT_P (operands[1])
9816           && !CONST_INT_P (operands[1]))
9817         operands[1] = force_const_mem (mode, operands[1]);
9818       break;
9819
9820     case E_TFmode:
9821     case E_TDmode:
9822     case E_IFmode:
9823     case E_KFmode:
9824       if (FLOAT128_2REG_P (mode))
9825         rs6000_eliminate_indexed_memrefs (operands);
9826       /* fall through */
9827
9828     case E_DFmode:
9829     case E_DDmode:
9830     case E_SFmode:
9831     case E_SDmode:
9832       if (CONSTANT_P (operands[1])
9833           && ! easy_fp_constant (operands[1], mode))
9834         operands[1] = force_const_mem (mode, operands[1]);
9835       break;
9836
9837     case E_V16QImode:
9838     case E_V8HImode:
9839     case E_V4SFmode:
9840     case E_V4SImode:
9841     case E_V2DFmode:
9842     case E_V2DImode:
9843     case E_V1TImode:
9844       if (CONSTANT_P (operands[1])
9845           && !easy_vector_constant (operands[1], mode))
9846         operands[1] = force_const_mem (mode, operands[1]);
9847       break;
9848
9849     case E_SImode:
9850     case E_DImode:
9851       /* Use default pattern for address of ELF small data */
9852       if (TARGET_ELF
9853           && mode == Pmode
9854           && DEFAULT_ABI == ABI_V4
9855           && (SYMBOL_REF_P (operands[1])
9856               || GET_CODE (operands[1]) == CONST)
9857           && small_data_operand (operands[1], mode))
9858         {
9859           emit_insn (gen_rtx_SET (operands[0], operands[1]));
9860           return;
9861         }
9862
9863       if (DEFAULT_ABI == ABI_V4
9864           && mode == Pmode && mode == SImode
9865           && flag_pic == 1 && got_operand (operands[1], mode))
9866         {
9867           emit_insn (gen_movsi_got (operands[0], operands[1]));
9868           return;
9869         }
9870
9871       if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
9872           && TARGET_NO_TOC
9873           && ! flag_pic
9874           && mode == Pmode
9875           && CONSTANT_P (operands[1])
9876           && GET_CODE (operands[1]) != HIGH
9877           && !CONST_INT_P (operands[1]))
9878         {
9879           rtx target = (!can_create_pseudo_p ()
9880                         ? operands[0]
9881                         : gen_reg_rtx (mode));
9882
9883           /* If this is a function address on -mcall-aixdesc,
9884              convert it to the address of the descriptor.  */
9885           if (DEFAULT_ABI == ABI_AIX
9886               && SYMBOL_REF_P (operands[1])
9887               && XSTR (operands[1], 0)[0] == '.')
9888             {
9889               const char *name = XSTR (operands[1], 0);
9890               rtx new_ref;
9891               while (*name == '.')
9892                 name++;
9893               new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
9894               CONSTANT_POOL_ADDRESS_P (new_ref)
9895                 = CONSTANT_POOL_ADDRESS_P (operands[1]);
9896               SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
9897               SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
9898               SYMBOL_REF_DATA (new_ref) = SYMBOL_REF_DATA (operands[1]);
9899               operands[1] = new_ref;
9900             }
9901
9902           if (DEFAULT_ABI == ABI_DARWIN)
9903             {
9904 #if TARGET_MACHO
9905               if (MACHO_DYNAMIC_NO_PIC_P)
9906                 {
9907                   /* Take care of any required data indirection.  */
9908                   operands[1] = rs6000_machopic_legitimize_pic_address (
9909                                   operands[1], mode, operands[0]);
9910                   if (operands[0] != operands[1])
9911                     emit_insn (gen_rtx_SET (operands[0], operands[1]));
9912                   return;
9913                 }
9914 #endif
9915               emit_insn (gen_macho_high (target, operands[1]));
9916               emit_insn (gen_macho_low (operands[0], target, operands[1]));
9917               return;
9918             }
9919
9920           emit_insn (gen_elf_high (target, operands[1]));
9921           emit_insn (gen_elf_low (operands[0], target, operands[1]));
9922           return;
9923         }
9924
9925       /* If this is a SYMBOL_REF that refers to a constant pool entry,
9926          and we have put it in the TOC, we just need to make a TOC-relative
9927          reference to it.  */
9928       if (TARGET_TOC
9929           && SYMBOL_REF_P (operands[1])
9930           && use_toc_relative_ref (operands[1], mode))
9931         operands[1] = create_TOC_reference (operands[1], operands[0]);
9932       else if (mode == Pmode
9933                && CONSTANT_P (operands[1])
9934                && GET_CODE (operands[1]) != HIGH
9935                && ((REG_P (operands[0])
9936                     && FP_REGNO_P (REGNO (operands[0])))
9937                    || !CONST_INT_P (operands[1])
9938                    || (num_insns_constant (operands[1], mode)
9939                        > (TARGET_CMODEL != CMODEL_SMALL ? 3 : 2)))
9940                && !toc_relative_expr_p (operands[1], false, NULL, NULL)
9941                && (TARGET_CMODEL == CMODEL_SMALL
9942                    || can_create_pseudo_p ()
9943                    || (REG_P (operands[0])
9944                        && INT_REG_OK_FOR_BASE_P (operands[0], true))))
9945         {
9946
9947 #if TARGET_MACHO
9948           /* Darwin uses a special PIC legitimizer.  */
9949           if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
9950             {
9951               operands[1] =
9952                 rs6000_machopic_legitimize_pic_address (operands[1], mode,
9953                                                         operands[0]);
9954               if (operands[0] != operands[1])
9955                 emit_insn (gen_rtx_SET (operands[0], operands[1]));
9956               return;
9957             }
9958 #endif
9959
9960           /* If we are to limit the number of things we put in the TOC and
9961              this is a symbol plus a constant we can add in one insn,
9962              just put the symbol in the TOC and add the constant.  */
9963           if (GET_CODE (operands[1]) == CONST
9964               && TARGET_NO_SUM_IN_TOC
9965               && GET_CODE (XEXP (operands[1], 0)) == PLUS
9966               && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
9967               && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
9968                   || SYMBOL_REF_P (XEXP (XEXP (operands[1], 0), 0)))
9969               && ! side_effects_p (operands[0]))
9970             {
9971               rtx sym =
9972                 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
9973               rtx other = XEXP (XEXP (operands[1], 0), 1);
9974
9975               sym = force_reg (mode, sym);
9976               emit_insn (gen_add3_insn (operands[0], sym, other));
9977               return;
9978             }
9979
9980           operands[1] = force_const_mem (mode, operands[1]);
9981
9982           if (TARGET_TOC
9983               && SYMBOL_REF_P (XEXP (operands[1], 0))
9984               && use_toc_relative_ref (XEXP (operands[1], 0), mode))
9985             {
9986               rtx tocref = create_TOC_reference (XEXP (operands[1], 0),
9987                                                  operands[0]);
9988               operands[1] = gen_const_mem (mode, tocref);
9989               set_mem_alias_set (operands[1], get_TOC_alias_set ());
9990             }
9991         }
9992       break;
9993
9994     case E_TImode:
9995       if (!VECTOR_MEM_VSX_P (TImode))
9996         rs6000_eliminate_indexed_memrefs (operands);
9997       break;
9998
9999     case E_PTImode:
10000       rs6000_eliminate_indexed_memrefs (operands);
10001       break;
10002
10003     default:
10004       fatal_insn ("bad move", gen_rtx_SET (dest, source));
10005     }
10006
10007   /* Above, we may have called force_const_mem which may have returned
10008      an invalid address.  If we can, fix this up; otherwise, reload will
10009      have to deal with it.  */
10010   if (MEM_P (operands[1]))
10011     operands[1] = validize_mem (operands[1]);
10012
10013   emit_insn (gen_rtx_SET (operands[0], operands[1]));
10014 }
10015 \f
10016 /* Nonzero if we can use a floating-point register to pass this arg.  */
10017 #define USE_FP_FOR_ARG_P(CUM,MODE)              \
10018   (SCALAR_FLOAT_MODE_NOT_VECTOR_P (MODE)                \
10019    && (CUM)->fregno <= FP_ARG_MAX_REG           \
10020    && TARGET_HARD_FLOAT)
10021
10022 /* Nonzero if we can use an AltiVec register to pass this arg.  */
10023 #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,NAMED)                   \
10024   (ALTIVEC_OR_VSX_VECTOR_MODE (MODE)                            \
10025    && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG                      \
10026    && TARGET_ALTIVEC_ABI                                        \
10027    && (NAMED))
10028
10029 /* Walk down the type tree of TYPE counting consecutive base elements.
10030    If *MODEP is VOIDmode, then set it to the first valid floating point
10031    or vector type.  If a non-floating point or vector type is found, or
10032    if a floating point or vector type that doesn't match a non-VOIDmode
10033    *MODEP is found, then return -1, otherwise return the count in the
10034    sub-tree.  */
10035
10036 static int
10037 rs6000_aggregate_candidate (const_tree type, machine_mode *modep)
10038 {
10039   machine_mode mode;
10040   HOST_WIDE_INT size;
10041
10042   switch (TREE_CODE (type))
10043     {
10044     case REAL_TYPE:
10045       mode = TYPE_MODE (type);
10046       if (!SCALAR_FLOAT_MODE_P (mode))
10047         return -1;
10048
10049       if (*modep == VOIDmode)
10050         *modep = mode;
10051
10052       if (*modep == mode)
10053         return 1;
10054
10055       break;
10056
10057     case COMPLEX_TYPE:
10058       mode = TYPE_MODE (TREE_TYPE (type));
10059       if (!SCALAR_FLOAT_MODE_P (mode))
10060         return -1;
10061
10062       if (*modep == VOIDmode)
10063         *modep = mode;
10064
10065       if (*modep == mode)
10066         return 2;
10067
10068       break;
10069
10070     case VECTOR_TYPE:
10071       if (!TARGET_ALTIVEC_ABI || !TARGET_ALTIVEC)
10072         return -1;
10073
10074       /* Use V4SImode as representative of all 128-bit vector types.  */
10075       size = int_size_in_bytes (type);
10076       switch (size)
10077         {
10078         case 16:
10079           mode = V4SImode;
10080           break;
10081         default:
10082           return -1;
10083         }
10084
10085       if (*modep == VOIDmode)
10086         *modep = mode;
10087
10088       /* Vector modes are considered to be opaque: two vectors are
10089          equivalent for the purposes of being homogeneous aggregates
10090          if they are the same size.  */
10091       if (*modep == mode)
10092         return 1;
10093
10094       break;
10095
10096     case ARRAY_TYPE:
10097       {
10098         int count;
10099         tree index = TYPE_DOMAIN (type);
10100
10101         /* Can't handle incomplete types nor sizes that are not
10102            fixed.  */
10103         if (!COMPLETE_TYPE_P (type)
10104             || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
10105           return -1;
10106
10107         count = rs6000_aggregate_candidate (TREE_TYPE (type), modep);
10108         if (count == -1
10109             || !index
10110             || !TYPE_MAX_VALUE (index)
10111             || !tree_fits_uhwi_p (TYPE_MAX_VALUE (index))
10112             || !TYPE_MIN_VALUE (index)
10113             || !tree_fits_uhwi_p (TYPE_MIN_VALUE (index))
10114             || count < 0)
10115           return -1;
10116
10117         count *= (1 + tree_to_uhwi (TYPE_MAX_VALUE (index))
10118                       - tree_to_uhwi (TYPE_MIN_VALUE (index)));
10119
10120         /* There must be no padding.  */
10121         if (wi::to_wide (TYPE_SIZE (type))
10122             != count * GET_MODE_BITSIZE (*modep))
10123           return -1;
10124
10125         return count;
10126       }
10127
10128     case RECORD_TYPE:
10129       {
10130         int count = 0;
10131         int sub_count;
10132         tree field;
10133
10134         /* Can't handle incomplete types nor sizes that are not
10135            fixed.  */
10136         if (!COMPLETE_TYPE_P (type)
10137             || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
10138           return -1;
10139
10140         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
10141           {
10142             if (TREE_CODE (field) != FIELD_DECL)
10143               continue;
10144
10145             sub_count = rs6000_aggregate_candidate (TREE_TYPE (field), modep);
10146             if (sub_count < 0)
10147               return -1;
10148             count += sub_count;
10149           }
10150
10151         /* There must be no padding.  */
10152         if (wi::to_wide (TYPE_SIZE (type))
10153             != count * GET_MODE_BITSIZE (*modep))
10154           return -1;
10155
10156         return count;
10157       }
10158
10159     case UNION_TYPE:
10160     case QUAL_UNION_TYPE:
10161       {
10162         /* These aren't very interesting except in a degenerate case.  */
10163         int count = 0;
10164         int sub_count;
10165         tree field;
10166
10167         /* Can't handle incomplete types nor sizes that are not
10168            fixed.  */
10169         if (!COMPLETE_TYPE_P (type)
10170             || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
10171           return -1;
10172
10173         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
10174           {
10175             if (TREE_CODE (field) != FIELD_DECL)
10176               continue;
10177
10178             sub_count = rs6000_aggregate_candidate (TREE_TYPE (field), modep);
10179             if (sub_count < 0)
10180               return -1;
10181             count = count > sub_count ? count : sub_count;
10182           }
10183
10184         /* There must be no padding.  */
10185         if (wi::to_wide (TYPE_SIZE (type))
10186             != count * GET_MODE_BITSIZE (*modep))
10187           return -1;
10188
10189         return count;
10190       }
10191
10192     default:
10193       break;
10194     }
10195
10196   return -1;
10197 }
10198
10199 /* If an argument, whose type is described by TYPE and MODE, is a homogeneous
10200    float or vector aggregate that shall be passed in FP/vector registers
10201    according to the ELFv2 ABI, return the homogeneous element mode in
10202    *ELT_MODE and the number of elements in *N_ELTS, and return TRUE.
10203
10204    Otherwise, set *ELT_MODE to MODE and *N_ELTS to 1, and return FALSE.  */
10205
10206 static bool
10207 rs6000_discover_homogeneous_aggregate (machine_mode mode, const_tree type,
10208                                        machine_mode *elt_mode,
10209                                        int *n_elts)
10210 {
10211   /* Note that we do not accept complex types at the top level as
10212      homogeneous aggregates; these types are handled via the
10213      targetm.calls.split_complex_arg mechanism.  Complex types
10214      can be elements of homogeneous aggregates, however.  */
10215   if (TARGET_HARD_FLOAT && DEFAULT_ABI == ABI_ELFv2 && type
10216       && AGGREGATE_TYPE_P (type))
10217     {
10218       machine_mode field_mode = VOIDmode;
10219       int field_count = rs6000_aggregate_candidate (type, &field_mode);
10220
10221       if (field_count > 0)
10222         {
10223           int reg_size = ALTIVEC_OR_VSX_VECTOR_MODE (field_mode) ? 16 : 8;
10224           int field_size = ROUND_UP (GET_MODE_SIZE (field_mode), reg_size);
10225
10226           /* The ELFv2 ABI allows homogeneous aggregates to occupy
10227              up to AGGR_ARG_NUM_REG registers.  */
10228           if (field_count * field_size <= AGGR_ARG_NUM_REG * reg_size)
10229             {
10230               if (elt_mode)
10231                 *elt_mode = field_mode;
10232               if (n_elts)
10233                 *n_elts = field_count;
10234               return true;
10235             }
10236         }
10237     }
10238
10239   if (elt_mode)
10240     *elt_mode = mode;
10241   if (n_elts)
10242     *n_elts = 1;
10243   return false;
10244 }
10245
10246 /* Return a nonzero value to say to return the function value in
10247    memory, just as large structures are always returned.  TYPE will be
10248    the data type of the value, and FNTYPE will be the type of the
10249    function doing the returning, or @code{NULL} for libcalls.
10250
10251    The AIX ABI for the RS/6000 specifies that all structures are
10252    returned in memory.  The Darwin ABI does the same.
10253    
10254    For the Darwin 64 Bit ABI, a function result can be returned in
10255    registers or in memory, depending on the size of the return data
10256    type.  If it is returned in registers, the value occupies the same
10257    registers as it would if it were the first and only function
10258    argument.  Otherwise, the function places its result in memory at
10259    the location pointed to by GPR3.
10260    
10261    The SVR4 ABI specifies that structures <= 8 bytes are returned in r3/r4, 
10262    but a draft put them in memory, and GCC used to implement the draft
10263    instead of the final standard.  Therefore, aix_struct_return
10264    controls this instead of DEFAULT_ABI; V.4 targets needing backward
10265    compatibility can change DRAFT_V4_STRUCT_RET to override the
10266    default, and -m switches get the final word.  See
10267    rs6000_option_override_internal for more details.
10268
10269    The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
10270    long double support is enabled.  These values are returned in memory.
10271
10272    int_size_in_bytes returns -1 for variable size objects, which go in
10273    memory always.  The cast to unsigned makes -1 > 8.  */
10274
10275 static bool
10276 rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
10277 {
10278   /* For the Darwin64 ABI, test if we can fit the return value in regs.  */
10279   if (TARGET_MACHO
10280       && rs6000_darwin64_abi
10281       && TREE_CODE (type) == RECORD_TYPE
10282       && int_size_in_bytes (type) > 0)
10283     {
10284       CUMULATIVE_ARGS valcum;
10285       rtx valret;
10286
10287       valcum.words = 0;
10288       valcum.fregno = FP_ARG_MIN_REG;
10289       valcum.vregno = ALTIVEC_ARG_MIN_REG;
10290       /* Do a trial code generation as if this were going to be passed
10291          as an argument; if any part goes in memory, we return NULL.  */
10292       valret = rs6000_darwin64_record_arg (&valcum, type, true, true);
10293       if (valret)
10294         return false;
10295       /* Otherwise fall through to more conventional ABI rules.  */
10296     }
10297
10298   /* The ELFv2 ABI returns homogeneous VFP aggregates in registers */
10299   if (rs6000_discover_homogeneous_aggregate (TYPE_MODE (type), type,
10300                                              NULL, NULL))
10301     return false;
10302
10303   /* The ELFv2 ABI returns aggregates up to 16B in registers */
10304   if (DEFAULT_ABI == ABI_ELFv2 && AGGREGATE_TYPE_P (type)
10305       && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) <= 16)
10306     return false;
10307
10308   if (AGGREGATE_TYPE_P (type)
10309       && (aix_struct_return
10310           || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
10311     return true;
10312
10313   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
10314      modes only exist for GCC vector types if -maltivec.  */
10315   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
10316       && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
10317     return false;
10318
10319   /* Return synthetic vectors in memory.  */
10320   if (TREE_CODE (type) == VECTOR_TYPE
10321       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
10322     {
10323       static bool warned_for_return_big_vectors = false;
10324       if (!warned_for_return_big_vectors)
10325         {
10326           warning (OPT_Wpsabi, "GCC vector returned by reference: "
10327                    "non-standard ABI extension with no compatibility "
10328                    "guarantee");
10329           warned_for_return_big_vectors = true;
10330         }
10331       return true;
10332     }
10333
10334   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD
10335       && FLOAT128_IEEE_P (TYPE_MODE (type)))
10336     return true;
10337
10338   return false;
10339 }
10340
10341 /* Specify whether values returned in registers should be at the most
10342    significant end of a register.  We want aggregates returned by
10343    value to match the way aggregates are passed to functions.  */
10344
10345 static bool
10346 rs6000_return_in_msb (const_tree valtype)
10347 {
10348   return (DEFAULT_ABI == ABI_ELFv2
10349           && BYTES_BIG_ENDIAN
10350           && AGGREGATE_TYPE_P (valtype)
10351           && (rs6000_function_arg_padding (TYPE_MODE (valtype), valtype)
10352               == PAD_UPWARD));
10353 }
10354
10355 #ifdef HAVE_AS_GNU_ATTRIBUTE
10356 /* Return TRUE if a call to function FNDECL may be one that
10357    potentially affects the function calling ABI of the object file.  */
10358
10359 static bool
10360 call_ABI_of_interest (tree fndecl)
10361 {
10362   if (rs6000_gnu_attr && symtab->state == EXPANSION)
10363     {
10364       struct cgraph_node *c_node;
10365
10366       /* Libcalls are always interesting.  */
10367       if (fndecl == NULL_TREE)
10368         return true;
10369
10370       /* Any call to an external function is interesting.  */
10371       if (DECL_EXTERNAL (fndecl))
10372         return true;
10373
10374       /* Interesting functions that we are emitting in this object file.  */
10375       c_node = cgraph_node::get (fndecl);
10376       c_node = c_node->ultimate_alias_target ();
10377       return !c_node->only_called_directly_p ();
10378     }
10379   return false;
10380 }
10381 #endif
10382
10383 /* Initialize a variable CUM of type CUMULATIVE_ARGS
10384    for a call to a function whose data type is FNTYPE.
10385    For a library call, FNTYPE is 0 and RETURN_MODE the return value mode.
10386
10387    For incoming args we set the number of arguments in the prototype large
10388    so we never return a PARALLEL.  */
10389
10390 void
10391 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
10392                       rtx libname ATTRIBUTE_UNUSED, int incoming,
10393                       int libcall, int n_named_args,
10394                       tree fndecl,
10395                       machine_mode return_mode ATTRIBUTE_UNUSED)
10396 {
10397   static CUMULATIVE_ARGS zero_cumulative;
10398
10399   *cum = zero_cumulative;
10400   cum->words = 0;
10401   cum->fregno = FP_ARG_MIN_REG;
10402   cum->vregno = ALTIVEC_ARG_MIN_REG;
10403   cum->prototype = (fntype && prototype_p (fntype));
10404   cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
10405                       ? CALL_LIBCALL : CALL_NORMAL);
10406   cum->sysv_gregno = GP_ARG_MIN_REG;
10407   cum->stdarg = stdarg_p (fntype);
10408   cum->libcall = libcall;
10409
10410   cum->nargs_prototype = 0;
10411   if (incoming || cum->prototype)
10412     cum->nargs_prototype = n_named_args;
10413
10414   /* Check for a longcall attribute.  */
10415   if ((!fntype && rs6000_default_long_calls)
10416       || (fntype
10417           && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
10418           && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
10419     cum->call_cookie |= CALL_LONG;
10420   else if (DEFAULT_ABI != ABI_DARWIN)
10421     {
10422       bool is_local = (fndecl
10423                        && !DECL_EXTERNAL (fndecl)
10424                        && !DECL_WEAK (fndecl)
10425                        && (*targetm.binds_local_p) (fndecl));
10426       if (is_local)
10427         ;
10428       else if (flag_plt)
10429         {
10430           if (fntype
10431               && lookup_attribute ("noplt", TYPE_ATTRIBUTES (fntype)))
10432             cum->call_cookie |= CALL_LONG;
10433         }
10434       else
10435         {
10436           if (!(fntype
10437                 && lookup_attribute ("plt", TYPE_ATTRIBUTES (fntype))))
10438             cum->call_cookie |= CALL_LONG;
10439         }
10440     }
10441
10442   if (TARGET_DEBUG_ARG)
10443     {
10444       fprintf (stderr, "\ninit_cumulative_args:");
10445       if (fntype)
10446         {
10447           tree ret_type = TREE_TYPE (fntype);
10448           fprintf (stderr, " ret code = %s,",
10449                    get_tree_code_name (TREE_CODE (ret_type)));
10450         }
10451
10452       if (cum->call_cookie & CALL_LONG)
10453         fprintf (stderr, " longcall,");
10454
10455       fprintf (stderr, " proto = %d, nargs = %d\n",
10456                cum->prototype, cum->nargs_prototype);
10457     }
10458
10459 #ifdef HAVE_AS_GNU_ATTRIBUTE
10460   if (TARGET_ELF && (TARGET_64BIT || DEFAULT_ABI == ABI_V4))
10461     {
10462       cum->escapes = call_ABI_of_interest (fndecl);
10463       if (cum->escapes)
10464         {
10465           tree return_type;
10466
10467           if (fntype)
10468             {
10469               return_type = TREE_TYPE (fntype);
10470               return_mode = TYPE_MODE (return_type);
10471             }
10472           else
10473             return_type = lang_hooks.types.type_for_mode (return_mode, 0);
10474
10475           if (return_type != NULL)
10476             {
10477               if (TREE_CODE (return_type) == RECORD_TYPE
10478                   && TYPE_TRANSPARENT_AGGR (return_type))
10479                 {
10480                   return_type = TREE_TYPE (first_field (return_type));
10481                   return_mode = TYPE_MODE (return_type);
10482                 }
10483               if (AGGREGATE_TYPE_P (return_type)
10484                   && ((unsigned HOST_WIDE_INT) int_size_in_bytes (return_type)
10485                       <= 8))
10486                 rs6000_returns_struct = true;
10487             }
10488           if (SCALAR_FLOAT_MODE_P (return_mode))
10489             {
10490               rs6000_passes_float = true;
10491               if ((HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE || TARGET_64BIT)
10492                   && (FLOAT128_IBM_P (return_mode)
10493                       || FLOAT128_IEEE_P (return_mode)
10494                       || (return_type != NULL
10495                           && (TYPE_MAIN_VARIANT (return_type)
10496                               == long_double_type_node))))
10497                 rs6000_passes_long_double = true;
10498
10499               /* Note if we passed or return a IEEE 128-bit type.  We changed
10500                  the mangling for these types, and we may need to make an alias
10501                  with the old mangling.  */
10502               if (FLOAT128_IEEE_P (return_mode))
10503                 rs6000_passes_ieee128 = true;
10504             }
10505           if (ALTIVEC_OR_VSX_VECTOR_MODE (return_mode))
10506             rs6000_passes_vector = true;
10507         }
10508     }
10509 #endif
10510
10511   if (fntype
10512       && !TARGET_ALTIVEC
10513       && TARGET_ALTIVEC_ABI
10514       && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
10515     {
10516       error ("cannot return value in vector register because"
10517              " altivec instructions are disabled, use %qs"
10518              " to enable them", "-maltivec");
10519     }
10520 }
10521 \f
10522 /* The mode the ABI uses for a word.  This is not the same as word_mode
10523    for -m32 -mpowerpc64.  This is used to implement various target hooks.  */
10524
10525 static scalar_int_mode
10526 rs6000_abi_word_mode (void)
10527 {
10528   return TARGET_32BIT ? SImode : DImode;
10529 }
10530
10531 /* Implement the TARGET_OFFLOAD_OPTIONS hook.  */
10532 static char *
10533 rs6000_offload_options (void)
10534 {
10535   if (TARGET_64BIT)
10536     return xstrdup ("-foffload-abi=lp64");
10537   else
10538     return xstrdup ("-foffload-abi=ilp32");
10539 }
10540
10541 /* On rs6000, function arguments are promoted, as are function return
10542    values.  */
10543
10544 static machine_mode
10545 rs6000_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
10546                               machine_mode mode,
10547                               int *punsignedp ATTRIBUTE_UNUSED,
10548                               const_tree, int)
10549 {
10550   PROMOTE_MODE (mode, *punsignedp, type);
10551
10552   return mode;
10553 }
10554
10555 /* Return true if TYPE must be passed on the stack and not in registers.  */
10556
10557 static bool
10558 rs6000_must_pass_in_stack (machine_mode mode, const_tree type)
10559 {
10560   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2 || TARGET_64BIT)
10561     return must_pass_in_stack_var_size (mode, type);
10562   else
10563     return must_pass_in_stack_var_size_or_pad (mode, type);
10564 }
10565
10566 static inline bool
10567 is_complex_IBM_long_double (machine_mode mode)
10568 {
10569   return mode == ICmode || (mode == TCmode && FLOAT128_IBM_P (TCmode));
10570 }
10571
10572 /* Whether ABI_V4 passes MODE args to a function in floating point
10573    registers.  */
10574
10575 static bool
10576 abi_v4_pass_in_fpr (machine_mode mode, bool named)
10577 {
10578   if (!TARGET_HARD_FLOAT)
10579     return false;
10580   if (mode == DFmode)
10581     return true;
10582   if (mode == SFmode && named)
10583     return true;
10584   /* ABI_V4 passes complex IBM long double in 8 gprs.
10585      Stupid, but we can't change the ABI now.  */
10586   if (is_complex_IBM_long_double (mode))
10587     return false;
10588   if (FLOAT128_2REG_P (mode))
10589     return true;
10590   if (DECIMAL_FLOAT_MODE_P (mode))
10591     return true;
10592   return false;
10593 }
10594
10595 /* Implement TARGET_FUNCTION_ARG_PADDING.
10596
10597    For the AIX ABI structs are always stored left shifted in their
10598    argument slot.  */
10599
10600 static pad_direction
10601 rs6000_function_arg_padding (machine_mode mode, const_tree type)
10602 {
10603 #ifndef AGGREGATE_PADDING_FIXED
10604 #define AGGREGATE_PADDING_FIXED 0
10605 #endif
10606 #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
10607 #define AGGREGATES_PAD_UPWARD_ALWAYS 0
10608 #endif
10609
10610   if (!AGGREGATE_PADDING_FIXED)
10611     {
10612       /* GCC used to pass structures of the same size as integer types as
10613          if they were in fact integers, ignoring TARGET_FUNCTION_ARG_PADDING.
10614          i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
10615          passed padded downward, except that -mstrict-align further
10616          muddied the water in that multi-component structures of 2 and 4
10617          bytes in size were passed padded upward.
10618
10619          The following arranges for best compatibility with previous
10620          versions of gcc, but removes the -mstrict-align dependency.  */
10621       if (BYTES_BIG_ENDIAN)
10622         {
10623           HOST_WIDE_INT size = 0;
10624
10625           if (mode == BLKmode)
10626             {
10627               if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
10628                 size = int_size_in_bytes (type);
10629             }
10630           else
10631             size = GET_MODE_SIZE (mode);
10632
10633           if (size == 1 || size == 2 || size == 4)
10634             return PAD_DOWNWARD;
10635         }
10636       return PAD_UPWARD;
10637     }
10638
10639   if (AGGREGATES_PAD_UPWARD_ALWAYS)
10640     {
10641       if (type != 0 && AGGREGATE_TYPE_P (type))
10642         return PAD_UPWARD;
10643     }
10644
10645   /* Fall back to the default.  */
10646   return default_function_arg_padding (mode, type);
10647 }
10648
10649 /* If defined, a C expression that gives the alignment boundary, in bits,
10650    of an argument with the specified mode and type.  If it is not defined,
10651    PARM_BOUNDARY is used for all arguments.
10652
10653    V.4 wants long longs and doubles to be double word aligned.  Just
10654    testing the mode size is a boneheaded way to do this as it means
10655    that other types such as complex int are also double word aligned.
10656    However, we're stuck with this because changing the ABI might break
10657    existing library interfaces.
10658
10659    Quadword align Altivec/VSX vectors.
10660    Quadword align large synthetic vector types.   */
10661
10662 static unsigned int
10663 rs6000_function_arg_boundary (machine_mode mode, const_tree type)
10664 {
10665   machine_mode elt_mode;
10666   int n_elts;
10667
10668   rs6000_discover_homogeneous_aggregate (mode, type, &elt_mode, &n_elts);
10669
10670   if (DEFAULT_ABI == ABI_V4
10671       && (GET_MODE_SIZE (mode) == 8
10672           || (TARGET_HARD_FLOAT
10673               && !is_complex_IBM_long_double (mode)
10674               && FLOAT128_2REG_P (mode))))
10675     return 64;
10676   else if (FLOAT128_VECTOR_P (mode))
10677     return 128;
10678   else if (type && TREE_CODE (type) == VECTOR_TYPE
10679            && int_size_in_bytes (type) >= 8
10680            && int_size_in_bytes (type) < 16)
10681     return 64;
10682   else if (ALTIVEC_OR_VSX_VECTOR_MODE (elt_mode)
10683            || (type && TREE_CODE (type) == VECTOR_TYPE
10684                && int_size_in_bytes (type) >= 16))
10685     return 128;
10686
10687   /* Aggregate types that need > 8 byte alignment are quadword-aligned
10688      in the parameter area in the ELFv2 ABI, and in the AIX ABI unless
10689      -mcompat-align-parm is used.  */
10690   if (((DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm)
10691        || DEFAULT_ABI == ABI_ELFv2)
10692       && type && TYPE_ALIGN (type) > 64)
10693     {
10694       /* "Aggregate" means any AGGREGATE_TYPE except for single-element
10695          or homogeneous float/vector aggregates here.  We already handled
10696          vector aggregates above, but still need to check for float here. */
10697       bool aggregate_p = (AGGREGATE_TYPE_P (type)
10698                           && !SCALAR_FLOAT_MODE_P (elt_mode));
10699
10700       /* We used to check for BLKmode instead of the above aggregate type
10701          check.  Warn when this results in any difference to the ABI.  */
10702       if (aggregate_p != (mode == BLKmode))
10703         {
10704           static bool warned;
10705           if (!warned && warn_psabi)
10706             {
10707               warned = true;
10708               inform (input_location,
10709                       "the ABI of passing aggregates with %d-byte alignment"
10710                       " has changed in GCC 5",
10711                       (int) TYPE_ALIGN (type) / BITS_PER_UNIT);
10712             }
10713         }
10714
10715       if (aggregate_p)
10716         return 128;
10717     }
10718
10719   /* Similar for the Darwin64 ABI.  Note that for historical reasons we
10720      implement the "aggregate type" check as a BLKmode check here; this
10721      means certain aggregate types are in fact not aligned.  */
10722   if (TARGET_MACHO && rs6000_darwin64_abi
10723       && mode == BLKmode
10724       && type && TYPE_ALIGN (type) > 64)
10725     return 128;
10726
10727   return PARM_BOUNDARY;
10728 }
10729
10730 /* The offset in words to the start of the parameter save area.  */
10731
10732 static unsigned int
10733 rs6000_parm_offset (void)
10734 {
10735   return (DEFAULT_ABI == ABI_V4 ? 2
10736           : DEFAULT_ABI == ABI_ELFv2 ? 4
10737           : 6);
10738 }
10739
10740 /* For a function parm of MODE and TYPE, return the starting word in
10741    the parameter area.  NWORDS of the parameter area are already used.  */
10742
10743 static unsigned int
10744 rs6000_parm_start (machine_mode mode, const_tree type,
10745                    unsigned int nwords)
10746 {
10747   unsigned int align;
10748
10749   align = rs6000_function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
10750   return nwords + (-(rs6000_parm_offset () + nwords) & align);
10751 }
10752
10753 /* Compute the size (in words) of a function argument.  */
10754
10755 static unsigned long
10756 rs6000_arg_size (machine_mode mode, const_tree type)
10757 {
10758   unsigned long size;
10759
10760   if (mode != BLKmode)
10761     size = GET_MODE_SIZE (mode);
10762   else
10763     size = int_size_in_bytes (type);
10764
10765   if (TARGET_32BIT)
10766     return (size + 3) >> 2;
10767   else
10768     return (size + 7) >> 3;
10769 }
10770 \f
10771 /* Use this to flush pending int fields.  */
10772
10773 static void
10774 rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
10775                                           HOST_WIDE_INT bitpos, int final)
10776 {
10777   unsigned int startbit, endbit;
10778   int intregs, intoffset;
10779
10780   /* Handle the situations where a float is taking up the first half
10781      of the GPR, and the other half is empty (typically due to
10782      alignment restrictions). We can detect this by a 8-byte-aligned
10783      int field, or by seeing that this is the final flush for this
10784      argument. Count the word and continue on.  */
10785   if (cum->floats_in_gpr == 1
10786       && (cum->intoffset % 64 == 0
10787           || (cum->intoffset == -1 && final)))
10788     {
10789       cum->words++;
10790       cum->floats_in_gpr = 0;
10791     }
10792
10793   if (cum->intoffset == -1)
10794     return;
10795
10796   intoffset = cum->intoffset;
10797   cum->intoffset = -1;
10798   cum->floats_in_gpr = 0;
10799
10800   if (intoffset % BITS_PER_WORD != 0)
10801     {
10802       unsigned int bits = BITS_PER_WORD - intoffset % BITS_PER_WORD;
10803       if (!int_mode_for_size (bits, 0).exists ())
10804         {
10805           /* We couldn't find an appropriate mode, which happens,
10806              e.g., in packed structs when there are 3 bytes to load.
10807              Back intoffset back to the beginning of the word in this
10808              case.  */
10809           intoffset = ROUND_DOWN (intoffset, BITS_PER_WORD);
10810         }
10811     }
10812
10813   startbit = ROUND_DOWN (intoffset, BITS_PER_WORD);
10814   endbit = ROUND_UP (bitpos, BITS_PER_WORD);
10815   intregs = (endbit - startbit) / BITS_PER_WORD;
10816   cum->words += intregs;
10817   /* words should be unsigned. */
10818   if ((unsigned)cum->words < (endbit/BITS_PER_WORD))
10819     {
10820       int pad = (endbit/BITS_PER_WORD) - cum->words;
10821       cum->words += pad;
10822     }
10823 }
10824
10825 /* The darwin64 ABI calls for us to recurse down through structs,
10826    looking for elements passed in registers.  Unfortunately, we have
10827    to track int register count here also because of misalignments
10828    in powerpc alignment mode.  */
10829
10830 static void
10831 rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
10832                                             const_tree type,
10833                                             HOST_WIDE_INT startbitpos)
10834 {
10835   tree f;
10836
10837   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
10838     if (TREE_CODE (f) == FIELD_DECL)
10839       {
10840         HOST_WIDE_INT bitpos = startbitpos;
10841         tree ftype = TREE_TYPE (f);
10842         machine_mode mode;
10843         if (ftype == error_mark_node)
10844           continue;
10845         mode = TYPE_MODE (ftype);
10846
10847         if (DECL_SIZE (f) != 0
10848             && tree_fits_uhwi_p (bit_position (f)))
10849           bitpos += int_bit_position (f);
10850
10851         /* ??? FIXME: else assume zero offset.  */
10852
10853         if (TREE_CODE (ftype) == RECORD_TYPE)
10854           rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
10855         else if (USE_FP_FOR_ARG_P (cum, mode))
10856           {
10857             unsigned n_fpregs = (GET_MODE_SIZE (mode) + 7) >> 3;
10858             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
10859             cum->fregno += n_fpregs;
10860             /* Single-precision floats present a special problem for
10861                us, because they are smaller than an 8-byte GPR, and so
10862                the structure-packing rules combined with the standard
10863                varargs behavior mean that we want to pack float/float
10864                and float/int combinations into a single register's
10865                space. This is complicated by the arg advance flushing,
10866                which works on arbitrarily large groups of int-type
10867                fields.  */
10868             if (mode == SFmode)
10869               {
10870                 if (cum->floats_in_gpr == 1)
10871                   {
10872                     /* Two floats in a word; count the word and reset
10873                        the float count.  */
10874                     cum->words++;
10875                     cum->floats_in_gpr = 0;
10876                   }
10877                 else if (bitpos % 64 == 0)
10878                   {
10879                     /* A float at the beginning of an 8-byte word;
10880                        count it and put off adjusting cum->words until
10881                        we see if a arg advance flush is going to do it
10882                        for us.  */
10883                     cum->floats_in_gpr++;
10884                   }
10885                 else
10886                   {
10887                     /* The float is at the end of a word, preceded
10888                        by integer fields, so the arg advance flush
10889                        just above has already set cum->words and
10890                        everything is taken care of.  */
10891                   }
10892               }
10893             else
10894               cum->words += n_fpregs;
10895           }
10896         else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, 1))
10897           {
10898             rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
10899             cum->vregno++;
10900             cum->words += 2;
10901           }
10902         else if (cum->intoffset == -1)
10903           cum->intoffset = bitpos;
10904       }
10905 }
10906
10907 /* Check for an item that needs to be considered specially under the darwin 64
10908    bit ABI.  These are record types where the mode is BLK or the structure is
10909    8 bytes in size.  */
10910 static int
10911 rs6000_darwin64_struct_check_p (machine_mode mode, const_tree type)
10912 {
10913   return rs6000_darwin64_abi
10914          && ((mode == BLKmode 
10915               && TREE_CODE (type) == RECORD_TYPE 
10916               && int_size_in_bytes (type) > 0)
10917           || (type && TREE_CODE (type) == RECORD_TYPE 
10918               && int_size_in_bytes (type) == 8)) ? 1 : 0;
10919 }
10920
10921 /* Update the data in CUM to advance over an argument
10922    of mode MODE and data type TYPE.
10923    (TYPE is null for libcalls where that information may not be available.)
10924
10925    Note that for args passed by reference, function_arg will be called
10926    with MODE and TYPE set to that of the pointer to the arg, not the arg
10927    itself.  */
10928
10929 static void
10930 rs6000_function_arg_advance_1 (CUMULATIVE_ARGS *cum, machine_mode mode,
10931                                const_tree type, bool named, int depth)
10932 {
10933   machine_mode elt_mode;
10934   int n_elts;
10935
10936   rs6000_discover_homogeneous_aggregate (mode, type, &elt_mode, &n_elts);
10937
10938   /* Only tick off an argument if we're not recursing.  */
10939   if (depth == 0)
10940     cum->nargs_prototype--;
10941
10942 #ifdef HAVE_AS_GNU_ATTRIBUTE
10943   if (TARGET_ELF && (TARGET_64BIT || DEFAULT_ABI == ABI_V4)
10944       && cum->escapes)
10945     {
10946       if (SCALAR_FLOAT_MODE_P (mode))
10947         {
10948           rs6000_passes_float = true;
10949           if ((HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE || TARGET_64BIT)
10950               && (FLOAT128_IBM_P (mode)
10951                   || FLOAT128_IEEE_P (mode)
10952                   || (type != NULL
10953                       && TYPE_MAIN_VARIANT (type) == long_double_type_node)))
10954             rs6000_passes_long_double = true;
10955
10956           /* Note if we passed or return a IEEE 128-bit type.  We changed the
10957              mangling for these types, and we may need to make an alias with
10958              the old mangling.  */
10959           if (FLOAT128_IEEE_P (mode))
10960             rs6000_passes_ieee128 = true;
10961         }
10962       if (named && ALTIVEC_OR_VSX_VECTOR_MODE (mode))
10963         rs6000_passes_vector = true;
10964     }
10965 #endif
10966
10967   if (TARGET_ALTIVEC_ABI
10968       && (ALTIVEC_OR_VSX_VECTOR_MODE (elt_mode)
10969           || (type && TREE_CODE (type) == VECTOR_TYPE
10970               && int_size_in_bytes (type) == 16)))
10971     {
10972       bool stack = false;
10973
10974       if (USE_ALTIVEC_FOR_ARG_P (cum, elt_mode, named))
10975         {
10976           cum->vregno += n_elts;
10977
10978           if (!TARGET_ALTIVEC)
10979             error ("cannot pass argument in vector register because"
10980                    " altivec instructions are disabled, use %qs"
10981                    " to enable them", "-maltivec");
10982
10983           /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
10984              even if it is going to be passed in a vector register.
10985              Darwin does the same for variable-argument functions.  */
10986           if (((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
10987                && TARGET_64BIT)
10988               || (cum->stdarg && DEFAULT_ABI != ABI_V4))
10989             stack = true;
10990         }
10991       else
10992         stack = true;
10993
10994       if (stack)
10995         {
10996           int align;
10997
10998           /* Vector parameters must be 16-byte aligned.  In 32-bit
10999              mode this means we need to take into account the offset
11000              to the parameter save area.  In 64-bit mode, they just
11001              have to start on an even word, since the parameter save
11002              area is 16-byte aligned.  */
11003           if (TARGET_32BIT)
11004             align = -(rs6000_parm_offset () + cum->words) & 3;
11005           else
11006             align = cum->words & 1;
11007           cum->words += align + rs6000_arg_size (mode, type);
11008
11009           if (TARGET_DEBUG_ARG)
11010             {
11011               fprintf (stderr, "function_adv: words = %2d, align=%d, ",
11012                        cum->words, align);
11013               fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
11014                        cum->nargs_prototype, cum->prototype,
11015                        GET_MODE_NAME (mode));
11016             }
11017         }
11018     }
11019   else if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
11020     {
11021       int size = int_size_in_bytes (type);
11022       /* Variable sized types have size == -1 and are
11023          treated as if consisting entirely of ints.
11024          Pad to 16 byte boundary if needed.  */
11025       if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
11026           && (cum->words % 2) != 0)
11027         cum->words++;
11028       /* For varargs, we can just go up by the size of the struct. */
11029       if (!named)
11030         cum->words += (size + 7) / 8;
11031       else
11032         {
11033           /* It is tempting to say int register count just goes up by
11034              sizeof(type)/8, but this is wrong in a case such as
11035              { int; double; int; } [powerpc alignment].  We have to
11036              grovel through the fields for these too.  */
11037           cum->intoffset = 0;
11038           cum->floats_in_gpr = 0;
11039           rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
11040           rs6000_darwin64_record_arg_advance_flush (cum,
11041                                                     size * BITS_PER_UNIT, 1);
11042         }
11043           if (TARGET_DEBUG_ARG)
11044             {
11045               fprintf (stderr, "function_adv: words = %2d, align=%d, size=%d",
11046                        cum->words, TYPE_ALIGN (type), size);
11047               fprintf (stderr, 
11048                    "nargs = %4d, proto = %d, mode = %4s (darwin64 abi)\n",
11049                        cum->nargs_prototype, cum->prototype,
11050                        GET_MODE_NAME (mode));
11051             }
11052     }
11053   else if (DEFAULT_ABI == ABI_V4)
11054     {
11055       if (abi_v4_pass_in_fpr (mode, named))
11056         {
11057           /* _Decimal128 must use an even/odd register pair.  This assumes
11058              that the register number is odd when fregno is odd.  */
11059           if (mode == TDmode && (cum->fregno % 2) == 1)
11060             cum->fregno++;
11061
11062           if (cum->fregno + (FLOAT128_2REG_P (mode) ? 1 : 0)
11063               <= FP_ARG_V4_MAX_REG)
11064             cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
11065           else
11066             {
11067               cum->fregno = FP_ARG_V4_MAX_REG + 1;
11068               if (mode == DFmode || FLOAT128_IBM_P (mode)
11069                   || mode == DDmode || mode == TDmode)
11070                 cum->words += cum->words & 1;
11071               cum->words += rs6000_arg_size (mode, type);
11072             }
11073         }
11074       else
11075         {
11076           int n_words = rs6000_arg_size (mode, type);
11077           int gregno = cum->sysv_gregno;
11078
11079           /* Long long is put in (r3,r4), (r5,r6), (r7,r8) or (r9,r10).
11080              As does any other 2 word item such as complex int due to a
11081              historical mistake.  */
11082           if (n_words == 2)
11083             gregno += (1 - gregno) & 1;
11084
11085           /* Multi-reg args are not split between registers and stack.  */
11086           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
11087             {
11088               /* Long long is aligned on the stack.  So are other 2 word
11089                  items such as complex int due to a historical mistake.  */
11090               if (n_words == 2)
11091                 cum->words += cum->words & 1;
11092               cum->words += n_words;
11093             }
11094
11095           /* Note: continuing to accumulate gregno past when we've started
11096              spilling to the stack indicates the fact that we've started
11097              spilling to the stack to expand_builtin_saveregs.  */
11098           cum->sysv_gregno = gregno + n_words;
11099         }
11100
11101       if (TARGET_DEBUG_ARG)
11102         {
11103           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
11104                    cum->words, cum->fregno);
11105           fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
11106                    cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
11107           fprintf (stderr, "mode = %4s, named = %d\n",
11108                    GET_MODE_NAME (mode), named);
11109         }
11110     }
11111   else
11112     {
11113       int n_words = rs6000_arg_size (mode, type);
11114       int start_words = cum->words;
11115       int align_words = rs6000_parm_start (mode, type, start_words);
11116
11117       cum->words = align_words + n_words;
11118
11119       if (SCALAR_FLOAT_MODE_P (elt_mode) && TARGET_HARD_FLOAT)
11120         {
11121           /* _Decimal128 must be passed in an even/odd float register pair.
11122              This assumes that the register number is odd when fregno is
11123              odd.  */
11124           if (elt_mode == TDmode && (cum->fregno % 2) == 1)
11125             cum->fregno++;
11126           cum->fregno += n_elts * ((GET_MODE_SIZE (elt_mode) + 7) >> 3);
11127         }
11128
11129       if (TARGET_DEBUG_ARG)
11130         {
11131           fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
11132                    cum->words, cum->fregno);
11133           fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
11134                    cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
11135           fprintf (stderr, "named = %d, align = %d, depth = %d\n",
11136                    named, align_words - start_words, depth);
11137         }
11138     }
11139 }
11140
11141 static void
11142 rs6000_function_arg_advance (cumulative_args_t cum, machine_mode mode,
11143                              const_tree type, bool named)
11144 {
11145   rs6000_function_arg_advance_1 (get_cumulative_args (cum), mode, type, named,
11146                                  0);
11147 }
11148
11149 /* A subroutine of rs6000_darwin64_record_arg.  Assign the bits of the
11150    structure between cum->intoffset and bitpos to integer registers.  */
11151
11152 static void
11153 rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
11154                                   HOST_WIDE_INT bitpos, rtx rvec[], int *k)
11155 {
11156   machine_mode mode;
11157   unsigned int regno;
11158   unsigned int startbit, endbit;
11159   int this_regno, intregs, intoffset;
11160   rtx reg;
11161
11162   if (cum->intoffset == -1)
11163     return;
11164
11165   intoffset = cum->intoffset;
11166   cum->intoffset = -1;
11167
11168   /* If this is the trailing part of a word, try to only load that
11169      much into the register.  Otherwise load the whole register.  Note
11170      that in the latter case we may pick up unwanted bits.  It's not a
11171      problem at the moment but may wish to revisit.  */
11172
11173   if (intoffset % BITS_PER_WORD != 0)
11174     {
11175       unsigned int bits = BITS_PER_WORD - intoffset % BITS_PER_WORD;
11176       if (!int_mode_for_size (bits, 0).exists (&mode))
11177         {
11178           /* We couldn't find an appropriate mode, which happens,
11179              e.g., in packed structs when there are 3 bytes to load.
11180              Back intoffset back to the beginning of the word in this
11181              case.  */
11182           intoffset = ROUND_DOWN (intoffset, BITS_PER_WORD);
11183           mode = word_mode;
11184         }
11185     }
11186   else
11187     mode = word_mode;
11188
11189   startbit = ROUND_DOWN (intoffset, BITS_PER_WORD);
11190   endbit = ROUND_UP (bitpos, BITS_PER_WORD);
11191   intregs = (endbit - startbit) / BITS_PER_WORD;
11192   this_regno = cum->words + intoffset / BITS_PER_WORD;
11193
11194   if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
11195     cum->use_stack = 1;
11196
11197   intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
11198   if (intregs <= 0)
11199     return;
11200
11201   intoffset /= BITS_PER_UNIT;
11202   do
11203     {
11204       regno = GP_ARG_MIN_REG + this_regno;
11205       reg = gen_rtx_REG (mode, regno);
11206       rvec[(*k)++] =
11207         gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
11208
11209       this_regno += 1;
11210       intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
11211       mode = word_mode;
11212       intregs -= 1;
11213     }
11214   while (intregs > 0);
11215 }
11216
11217 /* Recursive workhorse for the following.  */
11218
11219 static void
11220 rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type,
11221                                     HOST_WIDE_INT startbitpos, rtx rvec[],
11222                                     int *k)
11223 {
11224   tree f;
11225
11226   for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
11227     if (TREE_CODE (f) == FIELD_DECL)
11228       {
11229         HOST_WIDE_INT bitpos = startbitpos;
11230         tree ftype = TREE_TYPE (f);
11231         machine_mode mode;
11232         if (ftype == error_mark_node)
11233           continue;
11234         mode = TYPE_MODE (ftype);
11235
11236         if (DECL_SIZE (f) != 0
11237             && tree_fits_uhwi_p (bit_position (f)))
11238           bitpos += int_bit_position (f);
11239
11240         /* ??? FIXME: else assume zero offset.  */
11241
11242         if (TREE_CODE (ftype) == RECORD_TYPE)
11243           rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
11244         else if (cum->named && USE_FP_FOR_ARG_P (cum, mode))
11245           {
11246             unsigned n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
11247 #if 0
11248             switch (mode)
11249               {
11250               case E_SCmode: mode = SFmode; break;
11251               case E_DCmode: mode = DFmode; break;
11252               case E_TCmode: mode = TFmode; break;
11253               default: break;
11254               }
11255 #endif
11256             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
11257             if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
11258               {
11259                 gcc_assert (cum->fregno == FP_ARG_MAX_REG
11260                             && (mode == TFmode || mode == TDmode));
11261                 /* Long double or _Decimal128 split over regs and memory.  */
11262                 mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : DFmode;
11263                 cum->use_stack=1;
11264               }
11265             rvec[(*k)++]
11266               = gen_rtx_EXPR_LIST (VOIDmode,
11267                                    gen_rtx_REG (mode, cum->fregno++),
11268                                    GEN_INT (bitpos / BITS_PER_UNIT));
11269             if (FLOAT128_2REG_P (mode))
11270               cum->fregno++;
11271           }
11272         else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, 1))
11273           {
11274             rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
11275             rvec[(*k)++]
11276               = gen_rtx_EXPR_LIST (VOIDmode,
11277                                    gen_rtx_REG (mode, cum->vregno++),
11278                                    GEN_INT (bitpos / BITS_PER_UNIT));
11279           }
11280         else if (cum->intoffset == -1)
11281           cum->intoffset = bitpos;
11282       }
11283 }
11284
11285 /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
11286    the register(s) to be used for each field and subfield of a struct
11287    being passed by value, along with the offset of where the
11288    register's value may be found in the block.  FP fields go in FP
11289    register, vector fields go in vector registers, and everything
11290    else goes in int registers, packed as in memory.
11291
11292    This code is also used for function return values.  RETVAL indicates
11293    whether this is the case.
11294
11295    Much of this is taken from the SPARC V9 port, which has a similar
11296    calling convention.  */
11297
11298 static rtx
11299 rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, const_tree type,
11300                             bool named, bool retval)
11301 {
11302   rtx rvec[FIRST_PSEUDO_REGISTER];
11303   int k = 1, kbase = 1;
11304   HOST_WIDE_INT typesize = int_size_in_bytes (type);
11305   /* This is a copy; modifications are not visible to our caller.  */
11306   CUMULATIVE_ARGS copy_cum = *orig_cum;
11307   CUMULATIVE_ARGS *cum = &copy_cum;
11308
11309   /* Pad to 16 byte boundary if needed.  */
11310   if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
11311       && (cum->words % 2) != 0)
11312     cum->words++;
11313
11314   cum->intoffset = 0;
11315   cum->use_stack = 0;
11316   cum->named = named;
11317
11318   /* Put entries into rvec[] for individual FP and vector fields, and
11319      for the chunks of memory that go in int regs.  Note we start at
11320      element 1; 0 is reserved for an indication of using memory, and
11321      may or may not be filled in below. */
11322   rs6000_darwin64_record_arg_recurse (cum, type, /* startbit pos= */ 0, rvec, &k);
11323   rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
11324
11325   /* If any part of the struct went on the stack put all of it there.
11326      This hack is because the generic code for
11327      FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
11328      parts of the struct are not at the beginning.  */
11329   if (cum->use_stack)
11330     {
11331       if (retval)
11332         return NULL_RTX;    /* doesn't go in registers at all */
11333       kbase = 0;
11334       rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
11335     }
11336   if (k > 1 || cum->use_stack)
11337     return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
11338   else
11339     return NULL_RTX;
11340 }
11341
11342 /* Determine where to place an argument in 64-bit mode with 32-bit ABI.  */
11343
11344 static rtx
11345 rs6000_mixed_function_arg (machine_mode mode, const_tree type,
11346                            int align_words)
11347 {
11348   int n_units;
11349   int i, k;
11350   rtx rvec[GP_ARG_NUM_REG + 1];
11351
11352   if (align_words >= GP_ARG_NUM_REG)
11353     return NULL_RTX;
11354
11355   n_units = rs6000_arg_size (mode, type);
11356
11357   /* Optimize the simple case where the arg fits in one gpr, except in
11358      the case of BLKmode due to assign_parms assuming that registers are
11359      BITS_PER_WORD wide.  */
11360   if (n_units == 0
11361       || (n_units == 1 && mode != BLKmode))
11362     return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
11363
11364   k = 0;
11365   if (align_words + n_units > GP_ARG_NUM_REG)
11366     /* Not all of the arg fits in gprs.  Say that it goes in memory too,
11367        using a magic NULL_RTX component.
11368        This is not strictly correct.  Only some of the arg belongs in
11369        memory, not all of it.  However, the normal scheme using
11370        function_arg_partial_nregs can result in unusual subregs, eg.
11371        (subreg:SI (reg:DF) 4), which are not handled well.  The code to
11372        store the whole arg to memory is often more efficient than code
11373        to store pieces, and we know that space is available in the right
11374        place for the whole arg.  */
11375     rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
11376
11377   i = 0;
11378   do
11379     {
11380       rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
11381       rtx off = GEN_INT (i++ * 4);
11382       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
11383     }
11384   while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
11385
11386   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
11387 }
11388
11389 /* We have an argument of MODE and TYPE that goes into FPRs or VRs,
11390    but must also be copied into the parameter save area starting at
11391    offset ALIGN_WORDS.  Fill in RVEC with the elements corresponding
11392    to the GPRs and/or memory.  Return the number of elements used.  */
11393
11394 static int
11395 rs6000_psave_function_arg (machine_mode mode, const_tree type,
11396                            int align_words, rtx *rvec)
11397 {
11398   int k = 0;
11399
11400   if (align_words < GP_ARG_NUM_REG)
11401     {
11402       int n_words = rs6000_arg_size (mode, type);
11403
11404       if (align_words + n_words > GP_ARG_NUM_REG
11405           || mode == BLKmode
11406           || (TARGET_32BIT && TARGET_POWERPC64))
11407         {
11408           /* If this is partially on the stack, then we only
11409              include the portion actually in registers here.  */
11410           machine_mode rmode = TARGET_32BIT ? SImode : DImode;
11411           int i = 0;
11412
11413           if (align_words + n_words > GP_ARG_NUM_REG)
11414             {
11415               /* Not all of the arg fits in gprs.  Say that it goes in memory
11416                  too, using a magic NULL_RTX component.  Also see comment in
11417                  rs6000_mixed_function_arg for why the normal
11418                  function_arg_partial_nregs scheme doesn't work in this case. */
11419               rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
11420             }
11421
11422           do
11423             {
11424               rtx r = gen_rtx_REG (rmode, GP_ARG_MIN_REG + align_words);
11425               rtx off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
11426               rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
11427             }
11428           while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
11429         }
11430       else
11431         {
11432           /* The whole arg fits in gprs.  */
11433           rtx r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
11434           rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
11435         }
11436     }
11437   else
11438     {
11439       /* It's entirely in memory.  */
11440       rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
11441     }
11442
11443   return k;
11444 }
11445
11446 /* RVEC is a vector of K components of an argument of mode MODE.
11447    Construct the final function_arg return value from it.  */
11448
11449 static rtx
11450 rs6000_finish_function_arg (machine_mode mode, rtx *rvec, int k)
11451 {
11452   gcc_assert (k >= 1);
11453
11454   /* Avoid returning a PARALLEL in the trivial cases.  */
11455   if (k == 1)
11456     {
11457       if (XEXP (rvec[0], 0) == NULL_RTX)
11458         return NULL_RTX;
11459
11460       if (GET_MODE (XEXP (rvec[0], 0)) == mode)
11461         return XEXP (rvec[0], 0);
11462     }
11463
11464   return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
11465 }
11466
11467 /* Determine where to put an argument to a function.
11468    Value is zero to push the argument on the stack,
11469    or a hard register in which to store the argument.
11470
11471    MODE is the argument's machine mode.
11472    TYPE is the data type of the argument (as a tree).
11473     This is null for libcalls where that information may
11474     not be available.
11475    CUM is a variable of type CUMULATIVE_ARGS which gives info about
11476     the preceding args and about the function being called.  It is
11477     not modified in this routine.
11478    NAMED is nonzero if this argument is a named parameter
11479     (otherwise it is an extra parameter matching an ellipsis).
11480
11481    On RS/6000 the first eight words of non-FP are normally in registers
11482    and the rest are pushed.  Under AIX, the first 13 FP args are in registers.
11483    Under V.4, the first 8 FP args are in registers.
11484
11485    If this is floating-point and no prototype is specified, we use
11486    both an FP and integer register (or possibly FP reg and stack).  Library
11487    functions (when CALL_LIBCALL is set) always have the proper types for args,
11488    so we can pass the FP value just in one register.  emit_library_function
11489    doesn't support PARALLEL anyway.
11490
11491    Note that for args passed by reference, function_arg will be called
11492    with MODE and TYPE set to that of the pointer to the arg, not the arg
11493    itself.  */
11494
11495 static rtx
11496 rs6000_function_arg (cumulative_args_t cum_v, machine_mode mode,
11497                      const_tree type, bool named)
11498 {
11499   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
11500   enum rs6000_abi abi = DEFAULT_ABI;
11501   machine_mode elt_mode;
11502   int n_elts;
11503
11504   /* Return a marker to indicate whether CR1 needs to set or clear the
11505      bit that V.4 uses to say fp args were passed in registers.
11506      Assume that we don't need the marker for software floating point,
11507      or compiler generated library calls.  */
11508   if (mode == VOIDmode)
11509     {
11510       if (abi == ABI_V4
11511           && (cum->call_cookie & CALL_LIBCALL) == 0
11512           && (cum->stdarg
11513               || (cum->nargs_prototype < 0
11514                   && (cum->prototype || TARGET_NO_PROTOTYPE)))
11515           && TARGET_HARD_FLOAT)
11516         return GEN_INT (cum->call_cookie
11517                         | ((cum->fregno == FP_ARG_MIN_REG)
11518                            ? CALL_V4_SET_FP_ARGS
11519                            : CALL_V4_CLEAR_FP_ARGS));
11520
11521       return GEN_INT (cum->call_cookie & ~CALL_LIBCALL);
11522     }
11523
11524   rs6000_discover_homogeneous_aggregate (mode, type, &elt_mode, &n_elts);
11525
11526   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
11527     {
11528       rtx rslt = rs6000_darwin64_record_arg (cum, type, named, /*retval= */false);
11529       if (rslt != NULL_RTX)
11530         return rslt;
11531       /* Else fall through to usual handling.  */
11532     }
11533
11534   if (USE_ALTIVEC_FOR_ARG_P (cum, elt_mode, named))
11535     {
11536       rtx rvec[GP_ARG_NUM_REG + AGGR_ARG_NUM_REG + 1];
11537       rtx r, off;
11538       int i, k = 0;
11539
11540       /* Do we also need to pass this argument in the parameter save area?
11541          Library support functions for IEEE 128-bit are assumed to not need the
11542          value passed both in GPRs and in vector registers.  */
11543       if (TARGET_64BIT && !cum->prototype
11544           && (!cum->libcall || !FLOAT128_VECTOR_P (elt_mode)))
11545         {
11546           int align_words = ROUND_UP (cum->words, 2);
11547           k = rs6000_psave_function_arg (mode, type, align_words, rvec);
11548         }
11549
11550       /* Describe where this argument goes in the vector registers.  */
11551       for (i = 0; i < n_elts && cum->vregno + i <= ALTIVEC_ARG_MAX_REG; i++)
11552         {
11553           r = gen_rtx_REG (elt_mode, cum->vregno + i);
11554           off = GEN_INT (i * GET_MODE_SIZE (elt_mode));
11555           rvec[k++] =  gen_rtx_EXPR_LIST (VOIDmode, r, off);
11556         }
11557
11558       return rs6000_finish_function_arg (mode, rvec, k);
11559     }
11560   else if (TARGET_ALTIVEC_ABI
11561            && (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
11562                || (type && TREE_CODE (type) == VECTOR_TYPE
11563                    && int_size_in_bytes (type) == 16)))
11564     {
11565       if (named || abi == ABI_V4)
11566         return NULL_RTX;
11567       else
11568         {
11569           /* Vector parameters to varargs functions under AIX or Darwin
11570              get passed in memory and possibly also in GPRs.  */
11571           int align, align_words, n_words;
11572           machine_mode part_mode;
11573
11574           /* Vector parameters must be 16-byte aligned.  In 32-bit
11575              mode this means we need to take into account the offset
11576              to the parameter save area.  In 64-bit mode, they just
11577              have to start on an even word, since the parameter save
11578              area is 16-byte aligned.  */
11579           if (TARGET_32BIT)
11580             align = -(rs6000_parm_offset () + cum->words) & 3;
11581           else
11582             align = cum->words & 1;
11583           align_words = cum->words + align;
11584
11585           /* Out of registers?  Memory, then.  */
11586           if (align_words >= GP_ARG_NUM_REG)
11587             return NULL_RTX;
11588
11589           if (TARGET_32BIT && TARGET_POWERPC64)
11590             return rs6000_mixed_function_arg (mode, type, align_words);
11591
11592           /* The vector value goes in GPRs.  Only the part of the
11593              value in GPRs is reported here.  */
11594           part_mode = mode;
11595           n_words = rs6000_arg_size (mode, type);
11596           if (align_words + n_words > GP_ARG_NUM_REG)
11597             /* Fortunately, there are only two possibilities, the value
11598                is either wholly in GPRs or half in GPRs and half not.  */
11599             part_mode = DImode;
11600
11601           return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
11602         }
11603     }
11604
11605   else if (abi == ABI_V4)
11606     {
11607       if (abi_v4_pass_in_fpr (mode, named))
11608         {
11609           /* _Decimal128 must use an even/odd register pair.  This assumes
11610              that the register number is odd when fregno is odd.  */
11611           if (mode == TDmode && (cum->fregno % 2) == 1)
11612             cum->fregno++;
11613
11614           if (cum->fregno + (FLOAT128_2REG_P (mode) ? 1 : 0)
11615               <= FP_ARG_V4_MAX_REG)
11616             return gen_rtx_REG (mode, cum->fregno);
11617           else
11618             return NULL_RTX;
11619         }
11620       else
11621         {
11622           int n_words = rs6000_arg_size (mode, type);
11623           int gregno = cum->sysv_gregno;
11624
11625           /* Long long is put in (r3,r4), (r5,r6), (r7,r8) or (r9,r10).
11626              As does any other 2 word item such as complex int due to a
11627              historical mistake.  */
11628           if (n_words == 2)
11629             gregno += (1 - gregno) & 1;
11630
11631           /* Multi-reg args are not split between registers and stack.  */
11632           if (gregno + n_words - 1 > GP_ARG_MAX_REG)
11633             return NULL_RTX;
11634
11635           if (TARGET_32BIT && TARGET_POWERPC64)
11636             return rs6000_mixed_function_arg (mode, type,
11637                                               gregno - GP_ARG_MIN_REG);
11638           return gen_rtx_REG (mode, gregno);
11639         }
11640     }
11641   else
11642     {
11643       int align_words = rs6000_parm_start (mode, type, cum->words);
11644
11645       /* _Decimal128 must be passed in an even/odd float register pair.
11646          This assumes that the register number is odd when fregno is odd.  */
11647       if (elt_mode == TDmode && (cum->fregno % 2) == 1)
11648         cum->fregno++;
11649
11650       if (USE_FP_FOR_ARG_P (cum, elt_mode)
11651           && !(TARGET_AIX && !TARGET_ELF
11652                && type != NULL && AGGREGATE_TYPE_P (type)))
11653         {
11654           rtx rvec[GP_ARG_NUM_REG + AGGR_ARG_NUM_REG + 1];
11655           rtx r, off;
11656           int i, k = 0;
11657           unsigned long n_fpreg = (GET_MODE_SIZE (elt_mode) + 7) >> 3;
11658           int fpr_words;
11659
11660           /* Do we also need to pass this argument in the parameter
11661              save area?  */
11662           if (type && (cum->nargs_prototype <= 0
11663                        || ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
11664                            && TARGET_XL_COMPAT
11665                            && align_words >= GP_ARG_NUM_REG)))
11666             k = rs6000_psave_function_arg (mode, type, align_words, rvec);
11667
11668           /* Describe where this argument goes in the fprs.  */
11669           for (i = 0; i < n_elts
11670                       && cum->fregno + i * n_fpreg <= FP_ARG_MAX_REG; i++)
11671             {
11672               /* Check if the argument is split over registers and memory.
11673                  This can only ever happen for long double or _Decimal128;
11674                  complex types are handled via split_complex_arg.  */
11675               machine_mode fmode = elt_mode;
11676               if (cum->fregno + (i + 1) * n_fpreg > FP_ARG_MAX_REG + 1)
11677                 {
11678                   gcc_assert (FLOAT128_2REG_P (fmode));
11679                   fmode = DECIMAL_FLOAT_MODE_P (fmode) ? DDmode : DFmode;
11680                 }
11681
11682               r = gen_rtx_REG (fmode, cum->fregno + i * n_fpreg);
11683               off = GEN_INT (i * GET_MODE_SIZE (elt_mode));
11684               rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
11685             }
11686
11687           /* If there were not enough FPRs to hold the argument, the rest
11688              usually goes into memory.  However, if the current position
11689              is still within the register parameter area, a portion may
11690              actually have to go into GPRs.
11691
11692              Note that it may happen that the portion of the argument
11693              passed in the first "half" of the first GPR was already
11694              passed in the last FPR as well.
11695
11696              For unnamed arguments, we already set up GPRs to cover the
11697              whole argument in rs6000_psave_function_arg, so there is
11698              nothing further to do at this point.  */
11699           fpr_words = (i * GET_MODE_SIZE (elt_mode)) / (TARGET_32BIT ? 4 : 8);
11700           if (i < n_elts && align_words + fpr_words < GP_ARG_NUM_REG
11701               && cum->nargs_prototype > 0)
11702             {
11703               static bool warned;
11704
11705               machine_mode rmode = TARGET_32BIT ? SImode : DImode;
11706               int n_words = rs6000_arg_size (mode, type);
11707
11708               align_words += fpr_words;
11709               n_words -= fpr_words;
11710
11711               do
11712                 {
11713                   r = gen_rtx_REG (rmode, GP_ARG_MIN_REG + align_words);
11714                   off = GEN_INT (fpr_words++ * GET_MODE_SIZE (rmode));
11715                   rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
11716                 }
11717               while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
11718
11719               if (!warned && warn_psabi)
11720                 {
11721                   warned = true;
11722                   inform (input_location,
11723                           "the ABI of passing homogeneous %<float%> aggregates"
11724                           " has changed in GCC 5");
11725                 }
11726             }
11727
11728           return rs6000_finish_function_arg (mode, rvec, k);
11729         }
11730       else if (align_words < GP_ARG_NUM_REG)
11731         {
11732           if (TARGET_32BIT && TARGET_POWERPC64)
11733             return rs6000_mixed_function_arg (mode, type, align_words);
11734
11735           return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
11736         }
11737       else
11738         return NULL_RTX;
11739     }
11740 }
11741 \f
11742 /* For an arg passed partly in registers and partly in memory, this is
11743    the number of bytes passed in registers.  For args passed entirely in
11744    registers or entirely in memory, zero.  When an arg is described by a
11745    PARALLEL, perhaps using more than one register type, this function
11746    returns the number of bytes used by the first element of the PARALLEL.  */
11747
11748 static int
11749 rs6000_arg_partial_bytes (cumulative_args_t cum_v, machine_mode mode,
11750                           tree type, bool named)
11751 {
11752   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
11753   bool passed_in_gprs = true;
11754   int ret = 0;
11755   int align_words;
11756   machine_mode elt_mode;
11757   int n_elts;
11758
11759   rs6000_discover_homogeneous_aggregate (mode, type, &elt_mode, &n_elts);
11760
11761   if (DEFAULT_ABI == ABI_V4)
11762     return 0;
11763
11764   if (USE_ALTIVEC_FOR_ARG_P (cum, elt_mode, named))
11765     {
11766       /* If we are passing this arg in the fixed parameter save area (gprs or
11767          memory) as well as VRs, we do not use the partial bytes mechanism;
11768          instead, rs6000_function_arg will return a PARALLEL including a memory
11769          element as necessary.  Library support functions for IEEE 128-bit are
11770          assumed to not need the value passed both in GPRs and in vector
11771          registers.  */
11772       if (TARGET_64BIT && !cum->prototype
11773           && (!cum->libcall || !FLOAT128_VECTOR_P (elt_mode)))
11774         return 0;
11775
11776       /* Otherwise, we pass in VRs only.  Check for partial copies.  */
11777       passed_in_gprs = false;
11778       if (cum->vregno + n_elts > ALTIVEC_ARG_MAX_REG + 1)
11779         ret = (ALTIVEC_ARG_MAX_REG + 1 - cum->vregno) * 16;
11780     }
11781
11782   /* In this complicated case we just disable the partial_nregs code.  */
11783   if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
11784     return 0;
11785
11786   align_words = rs6000_parm_start (mode, type, cum->words);
11787
11788   if (USE_FP_FOR_ARG_P (cum, elt_mode)
11789       && !(TARGET_AIX && !TARGET_ELF
11790            && type != NULL && AGGREGATE_TYPE_P (type)))
11791     {
11792       unsigned long n_fpreg = (GET_MODE_SIZE (elt_mode) + 7) >> 3;
11793
11794       /* If we are passing this arg in the fixed parameter save area
11795          (gprs or memory) as well as FPRs, we do not use the partial
11796          bytes mechanism; instead, rs6000_function_arg will return a
11797          PARALLEL including a memory element as necessary.  */
11798       if (type
11799           && (cum->nargs_prototype <= 0
11800               || ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
11801                   && TARGET_XL_COMPAT
11802                   && align_words >= GP_ARG_NUM_REG)))
11803         return 0;
11804
11805       /* Otherwise, we pass in FPRs only.  Check for partial copies.  */
11806       passed_in_gprs = false;
11807       if (cum->fregno + n_elts * n_fpreg > FP_ARG_MAX_REG + 1)
11808         {
11809           /* Compute number of bytes / words passed in FPRs.  If there
11810              is still space available in the register parameter area
11811              *after* that amount, a part of the argument will be passed
11812              in GPRs.  In that case, the total amount passed in any
11813              registers is equal to the amount that would have been passed
11814              in GPRs if everything were passed there, so we fall back to
11815              the GPR code below to compute the appropriate value.  */
11816           int fpr = ((FP_ARG_MAX_REG + 1 - cum->fregno)
11817                      * MIN (8, GET_MODE_SIZE (elt_mode)));
11818           int fpr_words = fpr / (TARGET_32BIT ? 4 : 8);
11819
11820           if (align_words + fpr_words < GP_ARG_NUM_REG)
11821             passed_in_gprs = true;
11822           else
11823             ret = fpr;
11824         }
11825     }
11826
11827   if (passed_in_gprs
11828       && align_words < GP_ARG_NUM_REG
11829       && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
11830     ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
11831
11832   if (ret != 0 && TARGET_DEBUG_ARG)
11833     fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
11834
11835   return ret;
11836 }
11837 \f
11838 /* A C expression that indicates when an argument must be passed by
11839    reference.  If nonzero for an argument, a copy of that argument is
11840    made in memory and a pointer to the argument is passed instead of
11841    the argument itself.  The pointer is passed in whatever way is
11842    appropriate for passing a pointer to that type.
11843
11844    Under V.4, aggregates and long double are passed by reference.
11845
11846    As an extension to all 32-bit ABIs, AltiVec vectors are passed by
11847    reference unless the AltiVec vector extension ABI is in force.
11848
11849    As an extension to all ABIs, variable sized types are passed by
11850    reference.  */
11851
11852 static bool
11853 rs6000_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
11854                           machine_mode mode, const_tree type,
11855                           bool named ATTRIBUTE_UNUSED)
11856 {
11857   if (!type)
11858     return 0;
11859
11860   if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD
11861       && FLOAT128_IEEE_P (TYPE_MODE (type)))
11862     {
11863       if (TARGET_DEBUG_ARG)
11864         fprintf (stderr, "function_arg_pass_by_reference: V4 IEEE 128-bit\n");
11865       return 1;
11866     }
11867
11868   if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
11869     {
11870       if (TARGET_DEBUG_ARG)
11871         fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
11872       return 1;
11873     }
11874
11875   if (int_size_in_bytes (type) < 0)
11876     {
11877       if (TARGET_DEBUG_ARG)
11878         fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
11879       return 1;
11880     }
11881
11882   /* Allow -maltivec -mabi=no-altivec without warning.  Altivec vector
11883      modes only exist for GCC vector types if -maltivec.  */
11884   if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
11885     {
11886       if (TARGET_DEBUG_ARG)
11887         fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
11888       return 1;
11889     }
11890
11891   /* Pass synthetic vectors in memory.  */
11892   if (TREE_CODE (type) == VECTOR_TYPE
11893       && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
11894     {
11895       static bool warned_for_pass_big_vectors = false;
11896       if (TARGET_DEBUG_ARG)
11897         fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
11898       if (!warned_for_pass_big_vectors)
11899         {
11900           warning (OPT_Wpsabi, "GCC vector passed by reference: "
11901                    "non-standard ABI extension with no compatibility "
11902                    "guarantee");
11903           warned_for_pass_big_vectors = true;
11904         }
11905       return 1;
11906     }
11907
11908   return 0;
11909 }
11910
11911 /* Process parameter of type TYPE after ARGS_SO_FAR parameters were
11912    already processes.  Return true if the parameter must be passed
11913    (fully or partially) on the stack.  */
11914
11915 static bool
11916 rs6000_parm_needs_stack (cumulative_args_t args_so_far, tree type)
11917 {
11918   machine_mode mode;
11919   int unsignedp;
11920   rtx entry_parm;
11921
11922   /* Catch errors.  */
11923   if (type == NULL || type == error_mark_node)
11924     return true;
11925
11926   /* Handle types with no storage requirement.  */
11927   if (TYPE_MODE (type) == VOIDmode)
11928     return false;
11929
11930   /* Handle complex types.  */
11931   if (TREE_CODE (type) == COMPLEX_TYPE)
11932     return (rs6000_parm_needs_stack (args_so_far, TREE_TYPE (type))
11933             || rs6000_parm_needs_stack (args_so_far, TREE_TYPE (type)));
11934
11935   /* Handle transparent aggregates.  */
11936   if ((TREE_CODE (type) == UNION_TYPE || TREE_CODE (type) == RECORD_TYPE)
11937       && TYPE_TRANSPARENT_AGGR (type))
11938     type = TREE_TYPE (first_field (type));
11939
11940   /* See if this arg was passed by invisible reference.  */
11941   if (pass_by_reference (get_cumulative_args (args_so_far),
11942                          TYPE_MODE (type), type, true))
11943     type = build_pointer_type (type);
11944
11945   /* Find mode as it is passed by the ABI.  */
11946   unsignedp = TYPE_UNSIGNED (type);
11947   mode = promote_mode (type, TYPE_MODE (type), &unsignedp);
11948
11949   /* If we must pass in stack, we need a stack.  */
11950   if (rs6000_must_pass_in_stack (mode, type))
11951     return true;
11952
11953   /* If there is no incoming register, we need a stack.  */
11954   entry_parm = rs6000_function_arg (args_so_far, mode, type, true);
11955   if (entry_parm == NULL)
11956     return true;
11957
11958   /* Likewise if we need to pass both in registers and on the stack.  */
11959   if (GET_CODE (entry_parm) == PARALLEL
11960       && XEXP (XVECEXP (entry_parm, 0, 0), 0) == NULL_RTX)
11961     return true;
11962
11963   /* Also true if we're partially in registers and partially not.  */
11964   if (rs6000_arg_partial_bytes (args_so_far, mode, type, true) != 0)
11965     return true;
11966
11967   /* Update info on where next arg arrives in registers.  */
11968   rs6000_function_arg_advance (args_so_far, mode, type, true);
11969   return false;
11970 }
11971
11972 /* Return true if FUN has no prototype, has a variable argument
11973    list, or passes any parameter in memory.  */
11974
11975 static bool
11976 rs6000_function_parms_need_stack (tree fun, bool incoming)
11977 {
11978   tree fntype, result;
11979   CUMULATIVE_ARGS args_so_far_v;
11980   cumulative_args_t args_so_far;
11981
11982   if (!fun)
11983     /* Must be a libcall, all of which only use reg parms.  */
11984     return false;
11985
11986   fntype = fun;
11987   if (!TYPE_P (fun))
11988     fntype = TREE_TYPE (fun);
11989
11990   /* Varargs functions need the parameter save area.  */
11991   if ((!incoming && !prototype_p (fntype)) || stdarg_p (fntype))
11992     return true;
11993
11994   INIT_CUMULATIVE_INCOMING_ARGS (args_so_far_v, fntype, NULL_RTX);
11995   args_so_far = pack_cumulative_args (&args_so_far_v);
11996
11997   /* When incoming, we will have been passed the function decl.
11998      It is necessary to use the decl to handle K&R style functions,
11999      where TYPE_ARG_TYPES may not be available.  */
12000   if (incoming)
12001     {
12002       gcc_assert (DECL_P (fun));
12003       result = DECL_RESULT (fun);
12004     }
12005   else
12006     result = TREE_TYPE (fntype);
12007
12008   if (result && aggregate_value_p (result, fntype))
12009     {
12010       if (!TYPE_P (result))
12011         result = TREE_TYPE (result);
12012       result = build_pointer_type (result);
12013       rs6000_parm_needs_stack (args_so_far, result);
12014     }
12015
12016   if (incoming)
12017     {
12018       tree parm;
12019
12020       for (parm = DECL_ARGUMENTS (fun);
12021            parm && parm != void_list_node;
12022            parm = TREE_CHAIN (parm))
12023         if (rs6000_parm_needs_stack (args_so_far, TREE_TYPE (parm)))
12024           return true;
12025     }
12026   else
12027     {
12028       function_args_iterator args_iter;
12029       tree arg_type;
12030
12031       FOREACH_FUNCTION_ARGS (fntype, arg_type, args_iter)
12032         if (rs6000_parm_needs_stack (args_so_far, arg_type))
12033           return true;
12034     }
12035
12036   return false;
12037 }
12038
12039 /* Return the size of the REG_PARM_STACK_SPACE are for FUN.  This is
12040    usually a constant depending on the ABI.  However, in the ELFv2 ABI
12041    the register parameter area is optional when calling a function that
12042    has a prototype is scope, has no variable argument list, and passes
12043    all parameters in registers.  */
12044
12045 int
12046 rs6000_reg_parm_stack_space (tree fun, bool incoming)
12047 {
12048   int reg_parm_stack_space;
12049
12050   switch (DEFAULT_ABI)
12051     {
12052     default:
12053       reg_parm_stack_space = 0;
12054       break;
12055
12056     case ABI_AIX:
12057     case ABI_DARWIN:
12058       reg_parm_stack_space = TARGET_64BIT ? 64 : 32;
12059       break;
12060
12061     case ABI_ELFv2:
12062       /* ??? Recomputing this every time is a bit expensive.  Is there
12063          a place to cache this information?  */
12064       if (rs6000_function_parms_need_stack (fun, incoming))
12065         reg_parm_stack_space = TARGET_64BIT ? 64 : 32;
12066       else
12067         reg_parm_stack_space = 0;
12068       break;
12069     }
12070
12071   return reg_parm_stack_space;
12072 }
12073
12074 static void
12075 rs6000_move_block_from_reg (int regno, rtx x, int nregs)
12076 {
12077   int i;
12078   machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
12079
12080   if (nregs == 0)
12081     return;
12082
12083   for (i = 0; i < nregs; i++)
12084     {
12085       rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
12086       if (reload_completed)
12087         {
12088           if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
12089             tem = NULL_RTX;
12090           else
12091             tem = simplify_gen_subreg (reg_mode, x, BLKmode,
12092                                        i * GET_MODE_SIZE (reg_mode));
12093         }
12094       else
12095         tem = replace_equiv_address (tem, XEXP (tem, 0));
12096
12097       gcc_assert (tem);
12098
12099       emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
12100     }
12101 }
12102 \f
12103 /* Perform any needed actions needed for a function that is receiving a
12104    variable number of arguments.
12105
12106    CUM is as above.
12107
12108    MODE and TYPE are the mode and type of the current parameter.
12109
12110    PRETEND_SIZE is a variable that should be set to the amount of stack
12111    that must be pushed by the prolog to pretend that our caller pushed
12112    it.
12113
12114    Normally, this macro will push all remaining incoming registers on the
12115    stack and set PRETEND_SIZE to the length of the registers pushed.  */
12116
12117 static void
12118 setup_incoming_varargs (cumulative_args_t cum, machine_mode mode,
12119                         tree type, int *pretend_size ATTRIBUTE_UNUSED,
12120                         int no_rtl)
12121 {
12122   CUMULATIVE_ARGS next_cum;
12123   int reg_size = TARGET_32BIT ? 4 : 8;
12124   rtx save_area = NULL_RTX, mem;
12125   int first_reg_offset;
12126   alias_set_type set;
12127
12128   /* Skip the last named argument.  */
12129   next_cum = *get_cumulative_args (cum);
12130   rs6000_function_arg_advance_1 (&next_cum, mode, type, true, 0);
12131
12132   if (DEFAULT_ABI == ABI_V4)
12133     {
12134       first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
12135
12136       if (! no_rtl)
12137         {
12138           int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
12139           HOST_WIDE_INT offset = 0;
12140
12141           /* Try to optimize the size of the varargs save area.
12142              The ABI requires that ap.reg_save_area is doubleword
12143              aligned, but we don't need to allocate space for all
12144              the bytes, only those to which we actually will save
12145              anything.  */
12146           if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
12147             gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
12148           if (TARGET_HARD_FLOAT
12149               && next_cum.fregno <= FP_ARG_V4_MAX_REG
12150               && cfun->va_list_fpr_size)
12151             {
12152               if (gpr_reg_num)
12153                 fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
12154                            * UNITS_PER_FP_WORD;
12155               if (cfun->va_list_fpr_size
12156                   < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
12157                 fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
12158               else
12159                 fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
12160                             * UNITS_PER_FP_WORD;
12161             }
12162           if (gpr_reg_num)
12163             {
12164               offset = -((first_reg_offset * reg_size) & ~7);
12165               if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
12166                 {
12167                   gpr_reg_num = cfun->va_list_gpr_size;
12168                   if (reg_size == 4 && (first_reg_offset & 1))
12169                     gpr_reg_num++;
12170                 }
12171               gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
12172             }
12173           else if (fpr_size)
12174             offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
12175                        * UNITS_PER_FP_WORD
12176                      - (int) (GP_ARG_NUM_REG * reg_size);
12177
12178           if (gpr_size + fpr_size)
12179             {
12180               rtx reg_save_area
12181                 = assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
12182               gcc_assert (MEM_P (reg_save_area));
12183               reg_save_area = XEXP (reg_save_area, 0);
12184               if (GET_CODE (reg_save_area) == PLUS)
12185                 {
12186                   gcc_assert (XEXP (reg_save_area, 0)
12187                               == virtual_stack_vars_rtx);
12188                   gcc_assert (CONST_INT_P (XEXP (reg_save_area, 1)));
12189                   offset += INTVAL (XEXP (reg_save_area, 1));
12190                 }
12191               else
12192                 gcc_assert (reg_save_area == virtual_stack_vars_rtx);
12193             }
12194
12195           cfun->machine->varargs_save_offset = offset;
12196           save_area = plus_constant (Pmode, virtual_stack_vars_rtx, offset);
12197         }
12198     }
12199   else
12200     {
12201       first_reg_offset = next_cum.words;
12202       save_area = crtl->args.internal_arg_pointer;
12203
12204       if (targetm.calls.must_pass_in_stack (mode, type))
12205         first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
12206     }
12207
12208   set = get_varargs_alias_set ();
12209   if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
12210       && cfun->va_list_gpr_size)
12211     {
12212       int n_gpr, nregs = GP_ARG_NUM_REG - first_reg_offset;
12213
12214       if (va_list_gpr_counter_field)
12215         /* V4 va_list_gpr_size counts number of registers needed.  */
12216         n_gpr = cfun->va_list_gpr_size;
12217       else
12218         /* char * va_list instead counts number of bytes needed.  */
12219         n_gpr = (cfun->va_list_gpr_size + reg_size - 1) / reg_size;
12220
12221       if (nregs > n_gpr)
12222         nregs = n_gpr;
12223
12224       mem = gen_rtx_MEM (BLKmode,
12225                          plus_constant (Pmode, save_area,
12226                                         first_reg_offset * reg_size));
12227       MEM_NOTRAP_P (mem) = 1;
12228       set_mem_alias_set (mem, set);
12229       set_mem_align (mem, BITS_PER_WORD);
12230
12231       rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
12232                                   nregs);
12233     }
12234
12235   /* Save FP registers if needed.  */
12236   if (DEFAULT_ABI == ABI_V4
12237       && TARGET_HARD_FLOAT
12238       && ! no_rtl
12239       && next_cum.fregno <= FP_ARG_V4_MAX_REG
12240       && cfun->va_list_fpr_size)
12241     {
12242       int fregno = next_cum.fregno, nregs;
12243       rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
12244       rtx lab = gen_label_rtx ();
12245       int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
12246                                                * UNITS_PER_FP_WORD);
12247
12248       emit_jump_insn
12249         (gen_rtx_SET (pc_rtx,
12250                       gen_rtx_IF_THEN_ELSE (VOIDmode,
12251                                             gen_rtx_NE (VOIDmode, cr1,
12252                                                         const0_rtx),
12253                                             gen_rtx_LABEL_REF (VOIDmode, lab),
12254                                             pc_rtx)));
12255
12256       for (nregs = 0;
12257            fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
12258            fregno++, off += UNITS_PER_FP_WORD, nregs++)
12259         {
12260           mem = gen_rtx_MEM (TARGET_HARD_FLOAT ? DFmode : SFmode,
12261                              plus_constant (Pmode, save_area, off));
12262           MEM_NOTRAP_P (mem) = 1;
12263           set_mem_alias_set (mem, set);
12264           set_mem_align (mem, GET_MODE_ALIGNMENT (
12265                          TARGET_HARD_FLOAT ? DFmode : SFmode));
12266           emit_move_insn (mem, gen_rtx_REG (
12267                           TARGET_HARD_FLOAT ? DFmode : SFmode, fregno));
12268         }
12269
12270       emit_label (lab);
12271     }
12272 }
12273
12274 /* Create the va_list data type.  */
12275
12276 static tree
12277 rs6000_build_builtin_va_list (void)
12278 {
12279   tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
12280
12281   /* For AIX, prefer 'char *' because that's what the system
12282      header files like.  */
12283   if (DEFAULT_ABI != ABI_V4)
12284     return build_pointer_type (char_type_node);
12285
12286   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
12287   type_decl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12288                           get_identifier ("__va_list_tag"), record);
12289
12290   f_gpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("gpr"),
12291                       unsigned_char_type_node);
12292   f_fpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("fpr"),
12293                       unsigned_char_type_node);
12294   /* Give the two bytes of padding a name, so that -Wpadded won't warn on
12295      every user file.  */
12296   f_res = build_decl (BUILTINS_LOCATION, FIELD_DECL,
12297                       get_identifier ("reserved"), short_unsigned_type_node);
12298   f_ovf = build_decl (BUILTINS_LOCATION, FIELD_DECL,
12299                       get_identifier ("overflow_arg_area"),
12300                       ptr_type_node);
12301   f_sav = build_decl (BUILTINS_LOCATION, FIELD_DECL,
12302                       get_identifier ("reg_save_area"),
12303                       ptr_type_node);
12304
12305   va_list_gpr_counter_field = f_gpr;
12306   va_list_fpr_counter_field = f_fpr;
12307
12308   DECL_FIELD_CONTEXT (f_gpr) = record;
12309   DECL_FIELD_CONTEXT (f_fpr) = record;
12310   DECL_FIELD_CONTEXT (f_res) = record;
12311   DECL_FIELD_CONTEXT (f_ovf) = record;
12312   DECL_FIELD_CONTEXT (f_sav) = record;
12313
12314   TYPE_STUB_DECL (record) = type_decl;
12315   TYPE_NAME (record) = type_decl;
12316   TYPE_FIELDS (record) = f_gpr;
12317   DECL_CHAIN (f_gpr) = f_fpr;
12318   DECL_CHAIN (f_fpr) = f_res;
12319   DECL_CHAIN (f_res) = f_ovf;
12320   DECL_CHAIN (f_ovf) = f_sav;
12321
12322   layout_type (record);
12323
12324   /* The correct type is an array type of one element.  */
12325   return build_array_type (record, build_index_type (size_zero_node));
12326 }
12327
12328 /* Implement va_start.  */
12329
12330 static void
12331 rs6000_va_start (tree valist, rtx nextarg)
12332 {
12333   HOST_WIDE_INT words, n_gpr, n_fpr;
12334   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
12335   tree gpr, fpr, ovf, sav, t;
12336
12337   /* Only SVR4 needs something special.  */
12338   if (DEFAULT_ABI != ABI_V4)
12339     {
12340       std_expand_builtin_va_start (valist, nextarg);
12341       return;
12342     }
12343
12344   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
12345   f_fpr = DECL_CHAIN (f_gpr);
12346   f_res = DECL_CHAIN (f_fpr);
12347   f_ovf = DECL_CHAIN (f_res);
12348   f_sav = DECL_CHAIN (f_ovf);
12349
12350   valist = build_simple_mem_ref (valist);
12351   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
12352   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
12353                 f_fpr, NULL_TREE);
12354   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
12355                 f_ovf, NULL_TREE);
12356   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
12357                 f_sav, NULL_TREE);
12358
12359   /* Count number of gp and fp argument registers used.  */
12360   words = crtl->args.info.words;
12361   n_gpr = MIN (crtl->args.info.sysv_gregno - GP_ARG_MIN_REG,
12362                GP_ARG_NUM_REG);
12363   n_fpr = MIN (crtl->args.info.fregno - FP_ARG_MIN_REG,
12364                FP_ARG_NUM_REG);
12365
12366   if (TARGET_DEBUG_ARG)
12367     fprintf (stderr, "va_start: words = " HOST_WIDE_INT_PRINT_DEC", n_gpr = "
12368              HOST_WIDE_INT_PRINT_DEC", n_fpr = " HOST_WIDE_INT_PRINT_DEC"\n",
12369              words, n_gpr, n_fpr);
12370
12371   if (cfun->va_list_gpr_size)
12372     {
12373       t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
12374                   build_int_cst (NULL_TREE, n_gpr));
12375       TREE_SIDE_EFFECTS (t) = 1;
12376       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
12377     }
12378
12379   if (cfun->va_list_fpr_size)
12380     {
12381       t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
12382                   build_int_cst (NULL_TREE, n_fpr));
12383       TREE_SIDE_EFFECTS (t) = 1;
12384       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
12385
12386 #ifdef HAVE_AS_GNU_ATTRIBUTE
12387       if (call_ABI_of_interest (cfun->decl))
12388         rs6000_passes_float = true;
12389 #endif
12390     }
12391
12392   /* Find the overflow area.  */
12393   t = make_tree (TREE_TYPE (ovf), crtl->args.internal_arg_pointer);
12394   if (words != 0)
12395     t = fold_build_pointer_plus_hwi (t, words * MIN_UNITS_PER_WORD);
12396   t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
12397   TREE_SIDE_EFFECTS (t) = 1;
12398   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
12399
12400   /* If there were no va_arg invocations, don't set up the register
12401      save area.  */
12402   if (!cfun->va_list_gpr_size
12403       && !cfun->va_list_fpr_size
12404       && n_gpr < GP_ARG_NUM_REG
12405       && n_fpr < FP_ARG_V4_MAX_REG)
12406     return;
12407
12408   /* Find the register save area.  */
12409   t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
12410   if (cfun->machine->varargs_save_offset)
12411     t = fold_build_pointer_plus_hwi (t, cfun->machine->varargs_save_offset);
12412   t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
12413   TREE_SIDE_EFFECTS (t) = 1;
12414   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
12415 }
12416
12417 /* Implement va_arg.  */
12418
12419 static tree
12420 rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
12421                         gimple_seq *post_p)
12422 {
12423   tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
12424   tree gpr, fpr, ovf, sav, reg, t, u;
12425   int size, rsize, n_reg, sav_ofs, sav_scale;
12426   tree lab_false, lab_over, addr;
12427   int align;
12428   tree ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
12429   int regalign = 0;
12430   gimple *stmt;
12431
12432   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
12433     {
12434       t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
12435       return build_va_arg_indirect_ref (t);
12436     }
12437
12438   /* We need to deal with the fact that the darwin ppc64 ABI is defined by an
12439      earlier version of gcc, with the property that it always applied alignment
12440      adjustments to the va-args (even for zero-sized types).  The cheapest way
12441      to deal with this is to replicate the effect of the part of 
12442      std_gimplify_va_arg_expr that carries out the align adjust, for the case 
12443      of relevance.  
12444      We don't need to check for pass-by-reference because of the test above.
12445      We can return a simplifed answer, since we know there's no offset to add.  */
12446
12447   if (((TARGET_MACHO
12448         && rs6000_darwin64_abi)
12449        || DEFAULT_ABI == ABI_ELFv2
12450        || (DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm))
12451       && integer_zerop (TYPE_SIZE (type)))
12452     {
12453       unsigned HOST_WIDE_INT align, boundary;
12454       tree valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
12455       align = PARM_BOUNDARY / BITS_PER_UNIT;
12456       boundary = rs6000_function_arg_boundary (TYPE_MODE (type), type);
12457       if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
12458         boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
12459       boundary /= BITS_PER_UNIT;
12460       if (boundary > align)
12461         {
12462           tree t ;
12463           /* This updates arg ptr by the amount that would be necessary
12464              to align the zero-sized (but not zero-alignment) item.  */
12465           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
12466                       fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
12467           gimplify_and_add (t, pre_p);
12468
12469           t = fold_convert (sizetype, valist_tmp);
12470           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
12471                   fold_convert (TREE_TYPE (valist),
12472                                 fold_build2 (BIT_AND_EXPR, sizetype, t,
12473                                              size_int (-boundary))));
12474           t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
12475           gimplify_and_add (t, pre_p);
12476         }
12477       /* Since it is zero-sized there's no increment for the item itself. */
12478       valist_tmp = fold_convert (build_pointer_type (type), valist_tmp);
12479       return build_va_arg_indirect_ref (valist_tmp);
12480     }
12481
12482   if (DEFAULT_ABI != ABI_V4)
12483     {
12484       if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
12485         {
12486           tree elem_type = TREE_TYPE (type);
12487           machine_mode elem_mode = TYPE_MODE (elem_type);
12488           int elem_size = GET_MODE_SIZE (elem_mode);
12489
12490           if (elem_size < UNITS_PER_WORD)
12491             {
12492               tree real_part, imag_part;
12493               gimple_seq post = NULL;
12494
12495               real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
12496                                                   &post);
12497               /* Copy the value into a temporary, lest the formal temporary
12498                  be reused out from under us.  */
12499               real_part = get_initialized_tmp_var (real_part, pre_p, &post);
12500               gimple_seq_add_seq (pre_p, post);
12501
12502               imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
12503                                                   post_p);
12504
12505               return build2 (COMPLEX_EXPR, type, real_part, imag_part);
12506             }
12507         }
12508
12509       return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
12510     }
12511
12512   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
12513   f_fpr = DECL_CHAIN (f_gpr);
12514   f_res = DECL_CHAIN (f_fpr);
12515   f_ovf = DECL_CHAIN (f_res);
12516   f_sav = DECL_CHAIN (f_ovf);
12517
12518   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
12519   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
12520                 f_fpr, NULL_TREE);
12521   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
12522                 f_ovf, NULL_TREE);
12523   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
12524                 f_sav, NULL_TREE);
12525
12526   size = int_size_in_bytes (type);
12527   rsize = (size + 3) / 4;
12528   int pad = 4 * rsize - size;
12529   align = 1;
12530
12531   machine_mode mode = TYPE_MODE (type);
12532   if (abi_v4_pass_in_fpr (mode, false))
12533     {
12534       /* FP args go in FP registers, if present.  */
12535       reg = fpr;
12536       n_reg = (size + 7) / 8;
12537       sav_ofs = (TARGET_HARD_FLOAT ? 8 : 4) * 4;
12538       sav_scale = (TARGET_HARD_FLOAT ? 8 : 4);
12539       if (mode != SFmode && mode != SDmode)
12540         align = 8;
12541     }
12542   else
12543     {
12544       /* Otherwise into GP registers.  */
12545       reg = gpr;
12546       n_reg = rsize;
12547       sav_ofs = 0;
12548       sav_scale = 4;
12549       if (n_reg == 2)
12550         align = 8;
12551     }
12552
12553   /* Pull the value out of the saved registers....  */
12554
12555   lab_over = NULL;
12556   addr = create_tmp_var (ptr_type_node, "addr");
12557
12558   /*  AltiVec vectors never go in registers when -mabi=altivec.  */
12559   if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
12560     align = 16;
12561   else
12562     {
12563       lab_false = create_artificial_label (input_location);
12564       lab_over = create_artificial_label (input_location);
12565
12566       /* Long long is aligned in the registers.  As are any other 2 gpr
12567          item such as complex int due to a historical mistake.  */
12568       u = reg;
12569       if (n_reg == 2 && reg == gpr)
12570         {
12571           regalign = 1;
12572           u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), unshare_expr (reg),
12573                      build_int_cst (TREE_TYPE (reg), n_reg - 1));
12574           u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg),
12575                       unshare_expr (reg), u);
12576         }
12577       /* _Decimal128 is passed in even/odd fpr pairs; the stored
12578          reg number is 0 for f1, so we want to make it odd.  */
12579       else if (reg == fpr && mode == TDmode)
12580         {
12581           t = build2 (BIT_IOR_EXPR, TREE_TYPE (reg), unshare_expr (reg),
12582                       build_int_cst (TREE_TYPE (reg), 1));
12583           u = build2 (MODIFY_EXPR, void_type_node, unshare_expr (reg), t);
12584         }
12585
12586       t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
12587       t = build2 (GE_EXPR, boolean_type_node, u, t);
12588       u = build1 (GOTO_EXPR, void_type_node, lab_false);
12589       t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
12590       gimplify_and_add (t, pre_p);
12591
12592       t = sav;
12593       if (sav_ofs)
12594         t = fold_build_pointer_plus_hwi (sav, sav_ofs);
12595
12596       u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
12597                   build_int_cst (TREE_TYPE (reg), n_reg));
12598       u = fold_convert (sizetype, u);
12599       u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
12600       t = fold_build_pointer_plus (t, u);
12601
12602       /* _Decimal32 varargs are located in the second word of the 64-bit
12603          FP register for 32-bit binaries.  */
12604       if (TARGET_32BIT && TARGET_HARD_FLOAT && mode == SDmode)
12605         t = fold_build_pointer_plus_hwi (t, size);
12606
12607       /* Args are passed right-aligned.  */
12608       if (BYTES_BIG_ENDIAN)
12609         t = fold_build_pointer_plus_hwi (t, pad);
12610
12611       gimplify_assign (addr, t, pre_p);
12612
12613       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
12614
12615       stmt = gimple_build_label (lab_false);
12616       gimple_seq_add_stmt (pre_p, stmt);
12617
12618       if ((n_reg == 2 && !regalign) || n_reg > 2)
12619         {
12620           /* Ensure that we don't find any more args in regs.
12621              Alignment has taken care of for special cases.  */
12622           gimplify_assign (reg, build_int_cst (TREE_TYPE (reg), 8), pre_p);
12623         }
12624     }
12625
12626   /* ... otherwise out of the overflow area.  */
12627
12628   /* Care for on-stack alignment if needed.  */
12629   t = ovf;
12630   if (align != 1)
12631     {
12632       t = fold_build_pointer_plus_hwi (t, align - 1);
12633       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
12634                   build_int_cst (TREE_TYPE (t), -align));
12635     }
12636
12637   /* Args are passed right-aligned.  */
12638   if (BYTES_BIG_ENDIAN)
12639     t = fold_build_pointer_plus_hwi (t, pad);
12640
12641   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
12642
12643   gimplify_assign (unshare_expr (addr), t, pre_p);
12644
12645   t = fold_build_pointer_plus_hwi (t, size);
12646   gimplify_assign (unshare_expr (ovf), t, pre_p);
12647
12648   if (lab_over)
12649     {
12650       stmt = gimple_build_label (lab_over);
12651       gimple_seq_add_stmt (pre_p, stmt);
12652     }
12653
12654   if (STRICT_ALIGNMENT
12655       && (TYPE_ALIGN (type)
12656           > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align)))
12657     {
12658       /* The value (of type complex double, for example) may not be
12659          aligned in memory in the saved registers, so copy via a
12660          temporary.  (This is the same code as used for SPARC.)  */
12661       tree tmp = create_tmp_var (type, "va_arg_tmp");
12662       tree dest_addr = build_fold_addr_expr (tmp);
12663
12664       tree copy = build_call_expr (builtin_decl_implicit (BUILT_IN_MEMCPY),
12665                                    3, dest_addr, addr, size_int (rsize * 4));
12666       TREE_ADDRESSABLE (tmp) = 1;
12667
12668       gimplify_and_add (copy, pre_p);
12669       addr = dest_addr;
12670     }
12671
12672   addr = fold_convert (ptrtype, addr);
12673   return build_va_arg_indirect_ref (addr);
12674 }
12675
12676 /* Builtins.  */
12677
12678 static void
12679 def_builtin (const char *name, tree type, enum rs6000_builtins code)
12680 {
12681   tree t;
12682   unsigned classify = rs6000_builtin_info[(int)code].attr;
12683   const char *attr_string = "";
12684
12685   gcc_assert (name != NULL);
12686   gcc_assert (IN_RANGE ((int)code, 0, (int)RS6000_BUILTIN_COUNT));
12687
12688   if (rs6000_builtin_decls[(int)code])
12689     fatal_error (input_location,
12690                  "internal error: builtin function %qs already processed",
12691                  name);
12692
12693   rs6000_builtin_decls[(int)code] = t =
12694     add_builtin_function (name, type, (int)code, BUILT_IN_MD, NULL, NULL_TREE);
12695
12696   /* Set any special attributes.  */
12697   if ((classify & RS6000_BTC_CONST) != 0)
12698     {
12699       /* const function, function only depends on the inputs.  */
12700       TREE_READONLY (t) = 1;
12701       TREE_NOTHROW (t) = 1;
12702       attr_string = ", const";
12703     }
12704   else if ((classify & RS6000_BTC_PURE) != 0)
12705     {
12706       /* pure function, function can read global memory, but does not set any
12707          external state.  */
12708       DECL_PURE_P (t) = 1;
12709       TREE_NOTHROW (t) = 1;
12710       attr_string = ", pure";
12711     }
12712   else if ((classify & RS6000_BTC_FP) != 0)
12713     {
12714       /* Function is a math function.  If rounding mode is on, then treat the
12715          function as not reading global memory, but it can have arbitrary side
12716          effects.  If it is off, then assume the function is a const function.
12717          This mimics the ATTR_MATHFN_FPROUNDING attribute in
12718          builtin-attribute.def that is used for the math functions. */
12719       TREE_NOTHROW (t) = 1;
12720       if (flag_rounding_math)
12721         {
12722           DECL_PURE_P (t) = 1;
12723           DECL_IS_NOVOPS (t) = 1;
12724           attr_string = ", fp, pure";
12725         }
12726       else
12727         {
12728           TREE_READONLY (t) = 1;
12729           attr_string = ", fp, const";
12730         }
12731     }
12732   else if ((classify & RS6000_BTC_ATTR_MASK) != 0)
12733     gcc_unreachable ();
12734
12735   if (TARGET_DEBUG_BUILTIN)
12736     fprintf (stderr, "rs6000_builtin, code = %4d, %s%s\n",
12737              (int)code, name, attr_string);
12738 }
12739
12740 /* Simple ternary operations: VECd = foo (VECa, VECb, VECc).  */
12741
12742 #undef RS6000_BUILTIN_0
12743 #undef RS6000_BUILTIN_1
12744 #undef RS6000_BUILTIN_2
12745 #undef RS6000_BUILTIN_3
12746 #undef RS6000_BUILTIN_A
12747 #undef RS6000_BUILTIN_D
12748 #undef RS6000_BUILTIN_H
12749 #undef RS6000_BUILTIN_P
12750 #undef RS6000_BUILTIN_X
12751
12752 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12753 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12754 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12755 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE) \
12756   { MASK, ICODE, NAME, ENUM },
12757
12758 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12759 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12760 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12761 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12762 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12763
12764 static const struct builtin_description bdesc_3arg[] =
12765 {
12766 #include "rs6000-builtin.def"
12767 };
12768
12769 /* DST operations: void foo (void *, const int, const char).  */
12770
12771 #undef RS6000_BUILTIN_0
12772 #undef RS6000_BUILTIN_1
12773 #undef RS6000_BUILTIN_2
12774 #undef RS6000_BUILTIN_3
12775 #undef RS6000_BUILTIN_A
12776 #undef RS6000_BUILTIN_D
12777 #undef RS6000_BUILTIN_H
12778 #undef RS6000_BUILTIN_P
12779 #undef RS6000_BUILTIN_X
12780
12781 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12782 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12783 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12784 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12785 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12786 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE) \
12787   { MASK, ICODE, NAME, ENUM },
12788
12789 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12790 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12791 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12792
12793 static const struct builtin_description bdesc_dst[] =
12794 {
12795 #include "rs6000-builtin.def"
12796 };
12797
12798 /* Simple binary operations: VECc = foo (VECa, VECb).  */
12799
12800 #undef RS6000_BUILTIN_0
12801 #undef RS6000_BUILTIN_1
12802 #undef RS6000_BUILTIN_2
12803 #undef RS6000_BUILTIN_3
12804 #undef RS6000_BUILTIN_A
12805 #undef RS6000_BUILTIN_D
12806 #undef RS6000_BUILTIN_H
12807 #undef RS6000_BUILTIN_P
12808 #undef RS6000_BUILTIN_X
12809
12810 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12811 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12812 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE) \
12813   { MASK, ICODE, NAME, ENUM },
12814
12815 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12816 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12817 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12818 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12819 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12820 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12821
12822 static const struct builtin_description bdesc_2arg[] =
12823 {
12824 #include "rs6000-builtin.def"
12825 };
12826
12827 #undef RS6000_BUILTIN_0
12828 #undef RS6000_BUILTIN_1
12829 #undef RS6000_BUILTIN_2
12830 #undef RS6000_BUILTIN_3
12831 #undef RS6000_BUILTIN_A
12832 #undef RS6000_BUILTIN_D
12833 #undef RS6000_BUILTIN_H
12834 #undef RS6000_BUILTIN_P
12835 #undef RS6000_BUILTIN_X
12836
12837 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12838 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12839 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12840 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12841 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12842 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12843 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12844 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE) \
12845   { MASK, ICODE, NAME, ENUM },
12846
12847 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12848
12849 /* AltiVec predicates.  */
12850
12851 static const struct builtin_description bdesc_altivec_preds[] =
12852 {
12853 #include "rs6000-builtin.def"
12854 };
12855
12856 /* ABS* operations.  */
12857
12858 #undef RS6000_BUILTIN_0
12859 #undef RS6000_BUILTIN_1
12860 #undef RS6000_BUILTIN_2
12861 #undef RS6000_BUILTIN_3
12862 #undef RS6000_BUILTIN_A
12863 #undef RS6000_BUILTIN_D
12864 #undef RS6000_BUILTIN_H
12865 #undef RS6000_BUILTIN_P
12866 #undef RS6000_BUILTIN_X
12867
12868 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12869 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12870 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12871 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12872 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE) \
12873   { MASK, ICODE, NAME, ENUM },
12874
12875 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12876 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12877 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12878 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12879
12880 static const struct builtin_description bdesc_abs[] =
12881 {
12882 #include "rs6000-builtin.def"
12883 };
12884
12885 /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
12886    foo (VECa).  */
12887
12888 #undef RS6000_BUILTIN_0
12889 #undef RS6000_BUILTIN_1
12890 #undef RS6000_BUILTIN_2
12891 #undef RS6000_BUILTIN_3
12892 #undef RS6000_BUILTIN_A
12893 #undef RS6000_BUILTIN_D
12894 #undef RS6000_BUILTIN_H
12895 #undef RS6000_BUILTIN_P
12896 #undef RS6000_BUILTIN_X
12897
12898 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12899 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE) \
12900   { MASK, ICODE, NAME, ENUM },
12901
12902 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12903 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12904 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12905 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12906 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12907 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12908 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12909
12910 static const struct builtin_description bdesc_1arg[] =
12911 {
12912 #include "rs6000-builtin.def"
12913 };
12914
12915 /* Simple no-argument operations: result = __builtin_darn_32 () */
12916
12917 #undef RS6000_BUILTIN_0
12918 #undef RS6000_BUILTIN_1
12919 #undef RS6000_BUILTIN_2
12920 #undef RS6000_BUILTIN_3
12921 #undef RS6000_BUILTIN_A
12922 #undef RS6000_BUILTIN_D
12923 #undef RS6000_BUILTIN_H
12924 #undef RS6000_BUILTIN_P
12925 #undef RS6000_BUILTIN_X
12926
12927 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE) \
12928   { MASK, ICODE, NAME, ENUM },
12929
12930 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12931 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12932 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12933 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12934 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12935 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE)
12936 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12937 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12938
12939 static const struct builtin_description bdesc_0arg[] =
12940 {
12941 #include "rs6000-builtin.def"
12942 };
12943
12944 /* HTM builtins.  */
12945 #undef RS6000_BUILTIN_0
12946 #undef RS6000_BUILTIN_1
12947 #undef RS6000_BUILTIN_2
12948 #undef RS6000_BUILTIN_3
12949 #undef RS6000_BUILTIN_A
12950 #undef RS6000_BUILTIN_D
12951 #undef RS6000_BUILTIN_H
12952 #undef RS6000_BUILTIN_P
12953 #undef RS6000_BUILTIN_X
12954
12955 #define RS6000_BUILTIN_0(ENUM, NAME, MASK, ATTR, ICODE)
12956 #define RS6000_BUILTIN_1(ENUM, NAME, MASK, ATTR, ICODE)
12957 #define RS6000_BUILTIN_2(ENUM, NAME, MASK, ATTR, ICODE)
12958 #define RS6000_BUILTIN_3(ENUM, NAME, MASK, ATTR, ICODE)
12959 #define RS6000_BUILTIN_A(ENUM, NAME, MASK, ATTR, ICODE)
12960 #define RS6000_BUILTIN_D(ENUM, NAME, MASK, ATTR, ICODE)
12961 #define RS6000_BUILTIN_H(ENUM, NAME, MASK, ATTR, ICODE) \
12962   { MASK, ICODE, NAME, ENUM },
12963
12964 #define RS6000_BUILTIN_P(ENUM, NAME, MASK, ATTR, ICODE)
12965 #define RS6000_BUILTIN_X(ENUM, NAME, MASK, ATTR, ICODE)
12966
12967 static const struct builtin_description bdesc_htm[] =
12968 {
12969 #include "rs6000-builtin.def"
12970 };
12971
12972 #undef RS6000_BUILTIN_0
12973 #undef RS6000_BUILTIN_1
12974 #undef RS6000_BUILTIN_2
12975 #undef RS6000_BUILTIN_3
12976 #undef RS6000_BUILTIN_A
12977 #undef RS6000_BUILTIN_D
12978 #undef RS6000_BUILTIN_H
12979 #undef RS6000_BUILTIN_P
12980
12981 /* Return true if a builtin function is overloaded.  */
12982 bool
12983 rs6000_overloaded_builtin_p (enum rs6000_builtins fncode)
12984 {
12985   return (rs6000_builtin_info[(int)fncode].attr & RS6000_BTC_OVERLOADED) != 0;
12986 }
12987
12988 const char *
12989 rs6000_overloaded_builtin_name (enum rs6000_builtins fncode)
12990 {
12991   return rs6000_builtin_info[(int)fncode].name;
12992 }
12993
12994 /* Expand an expression EXP that calls a builtin without arguments.  */
12995 static rtx
12996 rs6000_expand_zeroop_builtin (enum insn_code icode, rtx target)
12997 {
12998   rtx pat;
12999   machine_mode tmode = insn_data[icode].operand[0].mode;
13000
13001   if (icode == CODE_FOR_nothing)
13002     /* Builtin not supported on this processor.  */
13003     return 0;
13004
13005   if (icode == CODE_FOR_rs6000_mffsl
13006       && rs6000_isa_flags & OPTION_MASK_SOFT_FLOAT)
13007     {
13008       error ("%<__builtin_mffsl%> not supported with %<-msoft-float%>");
13009       return const0_rtx;
13010     }
13011
13012   if (target == 0
13013       || GET_MODE (target) != tmode
13014       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13015     target = gen_reg_rtx (tmode);
13016
13017   pat = GEN_FCN (icode) (target);
13018   if (! pat)
13019     return 0;
13020   emit_insn (pat);
13021
13022   return target;
13023 }
13024
13025
13026 static rtx
13027 rs6000_expand_mtfsf_builtin (enum insn_code icode, tree exp)
13028 {
13029   rtx pat;
13030   tree arg0 = CALL_EXPR_ARG (exp, 0);
13031   tree arg1 = CALL_EXPR_ARG (exp, 1);
13032   rtx op0 = expand_normal (arg0);
13033   rtx op1 = expand_normal (arg1);
13034   machine_mode mode0 = insn_data[icode].operand[0].mode;
13035   machine_mode mode1 = insn_data[icode].operand[1].mode;
13036
13037   if (icode == CODE_FOR_nothing)
13038     /* Builtin not supported on this processor.  */
13039     return 0;
13040
13041   /* If we got invalid arguments bail out before generating bad rtl.  */
13042   if (arg0 == error_mark_node || arg1 == error_mark_node)
13043     return const0_rtx;
13044
13045   if (!CONST_INT_P (op0)
13046       || INTVAL (op0) > 255
13047       || INTVAL (op0) < 0)
13048     {
13049       error ("argument 1 must be an 8-bit field value");
13050       return const0_rtx;
13051     }
13052
13053   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
13054     op0 = copy_to_mode_reg (mode0, op0);
13055
13056   if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
13057     op1 = copy_to_mode_reg (mode1, op1);
13058
13059   pat = GEN_FCN (icode) (op0, op1);
13060   if (!pat)
13061     return const0_rtx;
13062   emit_insn (pat);
13063
13064   return NULL_RTX;
13065 }
13066
13067 static rtx
13068 rs6000_expand_mtfsb_builtin (enum insn_code icode, tree exp)
13069 {
13070   rtx pat;
13071   tree arg0 = CALL_EXPR_ARG (exp, 0);
13072   rtx op0 = expand_normal (arg0);
13073
13074   if (icode == CODE_FOR_nothing)
13075     /* Builtin not supported on this processor.  */
13076     return 0;
13077
13078   if (rs6000_isa_flags & OPTION_MASK_SOFT_FLOAT)
13079     {
13080       error ("%<__builtin_mtfsb0%> and %<__builtin_mtfsb1%> not supported with "
13081              "%<-msoft-float%>");
13082       return const0_rtx;
13083     }
13084
13085   /* If we got invalid arguments bail out before generating bad rtl.  */
13086   if (arg0 == error_mark_node)
13087     return const0_rtx;
13088
13089   /* Only allow bit numbers 0 to 31.  */
13090   if (!u5bit_cint_operand (op0, VOIDmode))
13091     {
13092        error ("Argument must be a constant between 0 and 31.");
13093        return const0_rtx;
13094      }
13095
13096   pat = GEN_FCN (icode) (op0);
13097   if (!pat)
13098     return const0_rtx;
13099   emit_insn (pat);
13100
13101   return NULL_RTX;
13102 }
13103
13104 static rtx
13105 rs6000_expand_set_fpscr_rn_builtin (enum insn_code icode, tree exp)
13106 {
13107   rtx pat;
13108   tree arg0 = CALL_EXPR_ARG (exp, 0);
13109   rtx op0 = expand_normal (arg0);
13110   machine_mode mode0 = insn_data[icode].operand[0].mode;
13111
13112   if (icode == CODE_FOR_nothing)
13113     /* Builtin not supported on this processor.  */
13114     return 0;
13115
13116   if (rs6000_isa_flags & OPTION_MASK_SOFT_FLOAT)
13117     {
13118       error ("%<__builtin_set_fpscr_rn%> not supported with %<-msoft-float%>");
13119       return const0_rtx;
13120     }
13121
13122   /* If we got invalid arguments bail out before generating bad rtl.  */
13123   if (arg0 == error_mark_node)
13124     return const0_rtx;
13125
13126   /* If the argument is a constant, check the range. Argument can only be a
13127      2-bit value.  Unfortunately, can't check the range of the value at
13128      compile time if the argument is a variable.  The least significant two
13129      bits of the argument, regardless of type, are used to set the rounding
13130      mode.  All other bits are ignored.  */
13131   if (CONST_INT_P (op0) && !const_0_to_3_operand(op0, VOIDmode))
13132     {
13133       error ("Argument must be a value between 0 and 3.");
13134       return const0_rtx;
13135     }
13136
13137   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
13138     op0 = copy_to_mode_reg (mode0, op0);
13139
13140   pat = GEN_FCN (icode) (op0);
13141   if (!pat)
13142     return const0_rtx;
13143   emit_insn (pat);
13144
13145   return NULL_RTX;
13146 }
13147 static rtx
13148 rs6000_expand_set_fpscr_drn_builtin (enum insn_code icode, tree exp)
13149 {
13150   rtx pat;
13151   tree arg0 = CALL_EXPR_ARG (exp, 0);
13152   rtx op0 = expand_normal (arg0);
13153   machine_mode mode0 = insn_data[icode].operand[0].mode;
13154
13155   if (TARGET_32BIT)
13156     /* Builtin not supported in 32-bit mode.  */
13157     fatal_error (input_location,
13158                  "%<__builtin_set_fpscr_drn%> is not supported "
13159                  "in 32-bit mode");
13160
13161   if (rs6000_isa_flags & OPTION_MASK_SOFT_FLOAT)
13162     {
13163       error ("%<__builtin_set_fpscr_drn%> not supported with %<-msoft-float%>");
13164       return const0_rtx;
13165     }
13166
13167   if (icode == CODE_FOR_nothing)
13168     /* Builtin not supported on this processor.  */
13169     return 0;
13170
13171   /* If we got invalid arguments bail out before generating bad rtl.  */
13172   if (arg0 == error_mark_node)
13173     return const0_rtx;
13174
13175   /* If the argument is a constant, check the range. Agrument can only be a
13176      3-bit value.  Unfortunately, can't check the range of the value at
13177      compile time if the argument is a variable. The least significant two
13178      bits of the argument, regardless of type, are used to set the rounding
13179      mode.  All other bits are ignored.  */
13180   if (CONST_INT_P (op0) && !const_0_to_7_operand(op0, VOIDmode))
13181    {
13182       error ("Argument must be a value between 0 and 7.");
13183       return const0_rtx;
13184     }
13185
13186   if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
13187     op0 = copy_to_mode_reg (mode0, op0);
13188
13189   pat = GEN_FCN (icode) (op0);
13190   if (! pat)
13191     return const0_rtx;
13192   emit_insn (pat);
13193
13194   return NULL_RTX;
13195 }
13196
13197 static rtx
13198 rs6000_expand_unop_builtin (enum insn_code icode, tree exp, rtx target)
13199 {
13200   rtx pat;
13201   tree arg0 = CALL_EXPR_ARG (exp, 0);
13202   rtx op0 = expand_normal (arg0);
13203   machine_mode tmode = insn_data[icode].operand[0].mode;
13204   machine_mode mode0 = insn_data[icode].operand[1].mode;
13205
13206   if (icode == CODE_FOR_nothing)
13207     /* Builtin not supported on this processor.  */
13208     return 0;
13209
13210   /* If we got invalid arguments bail out before generating bad rtl.  */
13211   if (arg0 == error_mark_node)
13212     return const0_rtx;
13213
13214   if (icode == CODE_FOR_altivec_vspltisb
13215       || icode == CODE_FOR_altivec_vspltish
13216       || icode == CODE_FOR_altivec_vspltisw)
13217     {
13218       /* Only allow 5-bit *signed* literals.  */
13219       if (!CONST_INT_P (op0)
13220           || INTVAL (op0) > 15
13221           || INTVAL (op0) < -16)
13222         {
13223           error ("argument 1 must be a 5-bit signed literal");
13224           return CONST0_RTX (tmode);
13225         }
13226     }
13227
13228   if (target == 0
13229       || GET_MODE (target) != tmode
13230       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13231     target = gen_reg_rtx (tmode);
13232
13233   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13234     op0 = copy_to_mode_reg (mode0, op0);
13235
13236   pat = GEN_FCN (icode) (target, op0);
13237   if (! pat)
13238     return 0;
13239   emit_insn (pat);
13240
13241   return target;
13242 }
13243
13244 static rtx
13245 altivec_expand_abs_builtin (enum insn_code icode, tree exp, rtx target)
13246 {
13247   rtx pat, scratch1, scratch2;
13248   tree arg0 = CALL_EXPR_ARG (exp, 0);
13249   rtx op0 = expand_normal (arg0);
13250   machine_mode tmode = insn_data[icode].operand[0].mode;
13251   machine_mode mode0 = insn_data[icode].operand[1].mode;
13252
13253   /* If we have invalid arguments, bail out before generating bad rtl.  */
13254   if (arg0 == error_mark_node)
13255     return const0_rtx;
13256
13257   if (target == 0
13258       || GET_MODE (target) != tmode
13259       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13260     target = gen_reg_rtx (tmode);
13261
13262   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13263     op0 = copy_to_mode_reg (mode0, op0);
13264
13265   scratch1 = gen_reg_rtx (mode0);
13266   scratch2 = gen_reg_rtx (mode0);
13267
13268   pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
13269   if (! pat)
13270     return 0;
13271   emit_insn (pat);
13272
13273   return target;
13274 }
13275
13276 static rtx
13277 rs6000_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
13278 {
13279   rtx pat;
13280   tree arg0 = CALL_EXPR_ARG (exp, 0);
13281   tree arg1 = CALL_EXPR_ARG (exp, 1);
13282   rtx op0 = expand_normal (arg0);
13283   rtx op1 = expand_normal (arg1);
13284   machine_mode tmode = insn_data[icode].operand[0].mode;
13285   machine_mode mode0 = insn_data[icode].operand[1].mode;
13286   machine_mode mode1 = insn_data[icode].operand[2].mode;
13287
13288   if (icode == CODE_FOR_nothing)
13289     /* Builtin not supported on this processor.  */
13290     return 0;
13291
13292   /* If we got invalid arguments bail out before generating bad rtl.  */
13293   if (arg0 == error_mark_node || arg1 == error_mark_node)
13294     return const0_rtx;
13295
13296   if (icode == CODE_FOR_unpackv1ti
13297            || icode == CODE_FOR_unpackkf
13298            || icode == CODE_FOR_unpacktf
13299            || icode == CODE_FOR_unpackif
13300            || icode == CODE_FOR_unpacktd)
13301     {
13302       /* Only allow 1-bit unsigned literals. */
13303       STRIP_NOPS (arg1);
13304       if (TREE_CODE (arg1) != INTEGER_CST
13305           || !IN_RANGE (TREE_INT_CST_LOW (arg1), 0, 1))
13306         {
13307           error ("argument 2 must be a 1-bit unsigned literal");
13308           return CONST0_RTX (tmode);
13309         }
13310     }
13311   else if (icode == CODE_FOR_altivec_vspltw)
13312     {
13313       /* Only allow 2-bit unsigned literals.  */
13314       STRIP_NOPS (arg1);
13315       if (TREE_CODE (arg1) != INTEGER_CST
13316           || TREE_INT_CST_LOW (arg1) & ~3)
13317         {
13318           error ("argument 2 must be a 2-bit unsigned literal");
13319           return CONST0_RTX (tmode);
13320         }
13321     }
13322   else if (icode == CODE_FOR_altivec_vsplth)
13323     {
13324       /* Only allow 3-bit unsigned literals.  */
13325       STRIP_NOPS (arg1);
13326       if (TREE_CODE (arg1) != INTEGER_CST
13327           || TREE_INT_CST_LOW (arg1) & ~7)
13328         {
13329           error ("argument 2 must be a 3-bit unsigned literal");
13330           return CONST0_RTX (tmode);
13331         }
13332     }
13333   else if (icode == CODE_FOR_altivec_vspltb)
13334     {
13335       /* Only allow 4-bit unsigned literals.  */
13336       STRIP_NOPS (arg1);
13337       if (TREE_CODE (arg1) != INTEGER_CST
13338           || TREE_INT_CST_LOW (arg1) & ~15)
13339         {
13340           error ("argument 2 must be a 4-bit unsigned literal");
13341           return CONST0_RTX (tmode);
13342         }
13343     }
13344   else if (icode == CODE_FOR_altivec_vcfux
13345       || icode == CODE_FOR_altivec_vcfsx
13346       || icode == CODE_FOR_altivec_vctsxs
13347       || icode == CODE_FOR_altivec_vctuxs)
13348     {
13349       /* Only allow 5-bit unsigned literals.  */
13350       STRIP_NOPS (arg1);
13351       if (TREE_CODE (arg1) != INTEGER_CST
13352           || TREE_INT_CST_LOW (arg1) & ~0x1f)
13353         {
13354           error ("argument 2 must be a 5-bit unsigned literal");
13355           return CONST0_RTX (tmode);
13356         }
13357     }
13358   else if (icode == CODE_FOR_dfptstsfi_eq_dd
13359       || icode == CODE_FOR_dfptstsfi_lt_dd
13360       || icode == CODE_FOR_dfptstsfi_gt_dd
13361       || icode == CODE_FOR_dfptstsfi_unordered_dd
13362       || icode == CODE_FOR_dfptstsfi_eq_td
13363       || icode == CODE_FOR_dfptstsfi_lt_td
13364       || icode == CODE_FOR_dfptstsfi_gt_td
13365       || icode == CODE_FOR_dfptstsfi_unordered_td)
13366     {
13367       /* Only allow 6-bit unsigned literals.  */
13368       STRIP_NOPS (arg0);
13369       if (TREE_CODE (arg0) != INTEGER_CST
13370           || !IN_RANGE (TREE_INT_CST_LOW (arg0), 0, 63))
13371         {
13372           error ("argument 1 must be a 6-bit unsigned literal");
13373           return CONST0_RTX (tmode);
13374         }
13375     }
13376   else if (icode == CODE_FOR_xststdcqp_kf
13377            || icode == CODE_FOR_xststdcqp_tf
13378            || icode == CODE_FOR_xststdcdp
13379            || icode == CODE_FOR_xststdcsp
13380            || icode == CODE_FOR_xvtstdcdp
13381            || icode == CODE_FOR_xvtstdcsp)
13382     {
13383       /* Only allow 7-bit unsigned literals. */
13384       STRIP_NOPS (arg1);
13385       if (TREE_CODE (arg1) != INTEGER_CST
13386           || !IN_RANGE (TREE_INT_CST_LOW (arg1), 0, 127))
13387         {
13388           error ("argument 2 must be a 7-bit unsigned literal");
13389           return CONST0_RTX (tmode);
13390         }
13391     }
13392
13393   if (target == 0
13394       || GET_MODE (target) != tmode
13395       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13396     target = gen_reg_rtx (tmode);
13397
13398   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13399     op0 = copy_to_mode_reg (mode0, op0);
13400   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13401     op1 = copy_to_mode_reg (mode1, op1);
13402
13403   pat = GEN_FCN (icode) (target, op0, op1);
13404   if (! pat)
13405     return 0;
13406   emit_insn (pat);
13407
13408   return target;
13409 }
13410
13411 static rtx
13412 altivec_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
13413 {
13414   rtx pat, scratch;
13415   tree cr6_form = CALL_EXPR_ARG (exp, 0);
13416   tree arg0 = CALL_EXPR_ARG (exp, 1);
13417   tree arg1 = CALL_EXPR_ARG (exp, 2);
13418   rtx op0 = expand_normal (arg0);
13419   rtx op1 = expand_normal (arg1);
13420   machine_mode tmode = SImode;
13421   machine_mode mode0 = insn_data[icode].operand[1].mode;
13422   machine_mode mode1 = insn_data[icode].operand[2].mode;
13423   int cr6_form_int;
13424
13425   if (TREE_CODE (cr6_form) != INTEGER_CST)
13426     {
13427       error ("argument 1 of %qs must be a constant",
13428              "__builtin_altivec_predicate");
13429       return const0_rtx;
13430     }
13431   else
13432     cr6_form_int = TREE_INT_CST_LOW (cr6_form);
13433
13434   gcc_assert (mode0 == mode1);
13435
13436   /* If we have invalid arguments, bail out before generating bad rtl.  */
13437   if (arg0 == error_mark_node || arg1 == error_mark_node)
13438     return const0_rtx;
13439
13440   if (target == 0
13441       || GET_MODE (target) != tmode
13442       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13443     target = gen_reg_rtx (tmode);
13444
13445   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13446     op0 = copy_to_mode_reg (mode0, op0);
13447   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13448     op1 = copy_to_mode_reg (mode1, op1);
13449
13450   /* Note that for many of the relevant operations (e.g. cmpne or
13451      cmpeq) with float or double operands, it makes more sense for the
13452      mode of the allocated scratch register to select a vector of
13453      integer.  But the choice to copy the mode of operand 0 was made
13454      long ago and there are no plans to change it.  */
13455   scratch = gen_reg_rtx (mode0);
13456
13457   pat = GEN_FCN (icode) (scratch, op0, op1);
13458   if (! pat)
13459     return 0;
13460   emit_insn (pat);
13461
13462   /* The vec_any* and vec_all* predicates use the same opcodes for two
13463      different operations, but the bits in CR6 will be different
13464      depending on what information we want.  So we have to play tricks
13465      with CR6 to get the right bits out.
13466
13467      If you think this is disgusting, look at the specs for the
13468      AltiVec predicates.  */
13469
13470   switch (cr6_form_int)
13471     {
13472     case 0:
13473       emit_insn (gen_cr6_test_for_zero (target));
13474       break;
13475     case 1:
13476       emit_insn (gen_cr6_test_for_zero_reverse (target));
13477       break;
13478     case 2:
13479       emit_insn (gen_cr6_test_for_lt (target));
13480       break;
13481     case 3:
13482       emit_insn (gen_cr6_test_for_lt_reverse (target));
13483       break;
13484     default:
13485       error ("argument 1 of %qs is out of range",
13486              "__builtin_altivec_predicate");
13487       break;
13488     }
13489
13490   return target;
13491 }
13492
13493 rtx
13494 swap_endian_selector_for_mode (machine_mode mode)
13495 {
13496   unsigned int swap1[16] = {15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0};
13497   unsigned int swap2[16] = {7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8};
13498   unsigned int swap4[16] = {3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12};
13499   unsigned int swap8[16] = {1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14};
13500
13501   unsigned int *swaparray, i;
13502   rtx perm[16];
13503
13504   switch (mode)
13505     {
13506     case E_V1TImode:
13507       swaparray = swap1;
13508       break;
13509     case E_V2DFmode:
13510     case E_V2DImode:
13511       swaparray = swap2;
13512       break;
13513     case E_V4SFmode:
13514     case E_V4SImode:
13515       swaparray = swap4;
13516       break;
13517     case E_V8HImode:
13518       swaparray = swap8;
13519       break;
13520     default:
13521       gcc_unreachable ();
13522     }
13523
13524   for (i = 0; i < 16; ++i)
13525     perm[i] = GEN_INT (swaparray[i]);
13526
13527   return force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode,
13528                                                      gen_rtvec_v (16, perm)));
13529 }
13530
13531 static rtx
13532 altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target, bool blk)
13533 {
13534   rtx pat, addr;
13535   tree arg0 = CALL_EXPR_ARG (exp, 0);
13536   tree arg1 = CALL_EXPR_ARG (exp, 1);
13537   machine_mode tmode = insn_data[icode].operand[0].mode;
13538   machine_mode mode0 = Pmode;
13539   machine_mode mode1 = Pmode;
13540   rtx op0 = expand_normal (arg0);
13541   rtx op1 = expand_normal (arg1);
13542
13543   if (icode == CODE_FOR_nothing)
13544     /* Builtin not supported on this processor.  */
13545     return 0;
13546
13547   /* If we got invalid arguments bail out before generating bad rtl.  */
13548   if (arg0 == error_mark_node || arg1 == error_mark_node)
13549     return const0_rtx;
13550
13551   if (target == 0
13552       || GET_MODE (target) != tmode
13553       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
13554     target = gen_reg_rtx (tmode);
13555
13556   op1 = copy_to_mode_reg (mode1, op1);
13557
13558   /* For LVX, express the RTL accurately by ANDing the address with -16.
13559      LVXL and LVE*X expand to use UNSPECs to hide their special behavior,
13560      so the raw address is fine.  */
13561   if (icode == CODE_FOR_altivec_lvx_v1ti
13562       || icode == CODE_FOR_altivec_lvx_v2df
13563       || icode == CODE_FOR_altivec_lvx_v2di
13564       || icode == CODE_FOR_altivec_lvx_v4sf
13565       || icode == CODE_FOR_altivec_lvx_v4si
13566       || icode == CODE_FOR_altivec_lvx_v8hi
13567       || icode == CODE_FOR_altivec_lvx_v16qi)
13568     {
13569       rtx rawaddr;
13570       if (op0 == const0_rtx)
13571         rawaddr = op1;
13572       else
13573         {
13574           op0 = copy_to_mode_reg (mode0, op0);
13575           rawaddr = gen_rtx_PLUS (Pmode, op1, op0);
13576         }
13577       addr = gen_rtx_AND (Pmode, rawaddr, gen_rtx_CONST_INT (Pmode, -16));
13578       addr = gen_rtx_MEM (blk ? BLKmode : tmode, addr);
13579
13580       emit_insn (gen_rtx_SET (target, addr));
13581     }
13582   else
13583     {
13584       if (op0 == const0_rtx)
13585         addr = gen_rtx_MEM (blk ? BLKmode : tmode, op1);
13586       else
13587         {
13588           op0 = copy_to_mode_reg (mode0, op0);
13589           addr = gen_rtx_MEM (blk ? BLKmode : tmode,
13590                               gen_rtx_PLUS (Pmode, op1, op0));
13591         }
13592
13593       pat = GEN_FCN (icode) (target, addr);
13594       if (! pat)
13595         return 0;
13596       emit_insn (pat);
13597     }
13598
13599   return target;
13600 }
13601
13602 static rtx
13603 altivec_expand_stxvl_builtin (enum insn_code icode, tree exp)
13604 {
13605   rtx pat;
13606   tree arg0 = CALL_EXPR_ARG (exp, 0);
13607   tree arg1 = CALL_EXPR_ARG (exp, 1);
13608   tree arg2 = CALL_EXPR_ARG (exp, 2);
13609   rtx op0 = expand_normal (arg0);
13610   rtx op1 = expand_normal (arg1);
13611   rtx op2 = expand_normal (arg2);
13612   machine_mode mode0 = insn_data[icode].operand[0].mode;
13613   machine_mode mode1 = insn_data[icode].operand[1].mode;
13614   machine_mode mode2 = insn_data[icode].operand[2].mode;
13615
13616   if (icode == CODE_FOR_nothing)
13617     /* Builtin not supported on this processor.  */
13618     return NULL_RTX;
13619
13620   /* If we got invalid arguments bail out before generating bad rtl.  */
13621   if (arg0 == error_mark_node
13622       || arg1 == error_mark_node
13623       || arg2 == error_mark_node)
13624     return NULL_RTX;
13625
13626   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
13627     op0 = copy_to_mode_reg (mode0, op0);
13628   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
13629     op1 = copy_to_mode_reg (mode1, op1);
13630   if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
13631     op2 = copy_to_mode_reg (mode2, op2);
13632
13633   pat = GEN_FCN (icode) (op0, op1, op2);
13634   if (pat)
13635     emit_insn (pat);
13636
13637   return NULL_RTX;
13638 }
13639
13640 static rtx
13641 altivec_expand_stv_builtin (enum insn_code icode, tree exp)
13642 {
13643   tree arg0 = CALL_EXPR_ARG (exp, 0);
13644   tree arg1 = CALL_EXPR_ARG (exp, 1);
13645   tree arg2 = CALL_EXPR_ARG (exp, 2);
13646   rtx op0 = expand_normal (arg0);
13647   rtx op1 = expand_normal (arg1);
13648   rtx op2 = expand_normal (arg2);
13649   rtx pat, addr, rawaddr;
13650   machine_mode tmode = insn_data[icode].operand[0].mode;
13651   machine_mode smode = insn_data[icode].operand[1].mode;
13652   machine_mode mode1 = Pmode;
13653   machine_mode mode2 = Pmode;
13654
13655   /* Invalid arguments.  Bail before doing anything stoopid!  */
13656   if (arg0 == error_mark_node
13657       || arg1 == error_mark_node
13658       || arg2 == error_mark_node)
13659     return const0_rtx;
13660
13661   op2 = copy_to_mode_reg (mode2, op2);
13662
13663   /* For STVX, express the RTL accurately by ANDing the address with -16.
13664      STVXL and STVE*X expand to use UNSPECs to hide their special behavior,
13665      so the raw address is fine.  */
13666   if (icode == CODE_FOR_altivec_stvx_v2df
13667       || icode == CODE_FOR_altivec_stvx_v2di
13668       || icode == CODE_FOR_altivec_stvx_v4sf
13669       || icode == CODE_FOR_altivec_stvx_v4si
13670       || icode == CODE_FOR_altivec_stvx_v8hi
13671       || icode == CODE_FOR_altivec_stvx_v16qi)
13672     {
13673       if (op1 == const0_rtx)
13674         rawaddr = op2;
13675       else
13676         {
13677           op1 = copy_to_mode_reg (mode1, op1);
13678           rawaddr = gen_rtx_PLUS (Pmode, op2, op1);
13679         }
13680
13681       addr = gen_rtx_AND (Pmode, rawaddr, gen_rtx_CONST_INT (Pmode, -16));
13682       addr = gen_rtx_MEM (tmode, addr);
13683
13684       op0 = copy_to_mode_reg (tmode, op0);
13685
13686       emit_insn (gen_rtx_SET (addr, op0));
13687     }
13688   else
13689     {
13690       if (! (*insn_data[icode].operand[1].predicate) (op0, smode))
13691         op0 = copy_to_mode_reg (smode, op0);
13692
13693       if (op1 == const0_rtx)
13694         addr = gen_rtx_MEM (tmode, op2);
13695       else
13696         {
13697           op1 = copy_to_mode_reg (mode1, op1);
13698           addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op2, op1));
13699         }
13700
13701       pat = GEN_FCN (icode) (addr, op0);
13702       if (pat)
13703         emit_insn (pat);
13704     }
13705
13706   return NULL_RTX;
13707 }
13708
13709 /* Return the appropriate SPR number associated with the given builtin.  */
13710 static inline HOST_WIDE_INT
13711 htm_spr_num (enum rs6000_builtins code)
13712 {
13713   if (code == HTM_BUILTIN_GET_TFHAR
13714       || code == HTM_BUILTIN_SET_TFHAR)
13715     return TFHAR_SPR;
13716   else if (code == HTM_BUILTIN_GET_TFIAR
13717            || code == HTM_BUILTIN_SET_TFIAR)
13718     return TFIAR_SPR;
13719   else if (code == HTM_BUILTIN_GET_TEXASR
13720            || code == HTM_BUILTIN_SET_TEXASR)
13721     return TEXASR_SPR;
13722   gcc_assert (code == HTM_BUILTIN_GET_TEXASRU
13723               || code == HTM_BUILTIN_SET_TEXASRU);
13724   return TEXASRU_SPR;
13725 }
13726
13727 /* Return the correct ICODE value depending on whether we are
13728    setting or reading the HTM SPRs.  */
13729 static inline enum insn_code
13730 rs6000_htm_spr_icode (bool nonvoid)
13731 {
13732   if (nonvoid)
13733     return (TARGET_POWERPC64) ? CODE_FOR_htm_mfspr_di : CODE_FOR_htm_mfspr_si;
13734   else
13735     return (TARGET_POWERPC64) ? CODE_FOR_htm_mtspr_di : CODE_FOR_htm_mtspr_si;
13736 }
13737
13738 /* Expand the HTM builtin in EXP and store the result in TARGET.
13739    Store true in *EXPANDEDP if we found a builtin to expand.  */
13740 static rtx
13741 htm_expand_builtin (tree exp, rtx target, bool * expandedp)
13742 {
13743   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
13744   bool nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
13745   enum rs6000_builtins fcode = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
13746   const struct builtin_description *d;
13747   size_t i;
13748
13749   *expandedp = true;
13750
13751   if (!TARGET_POWERPC64
13752       && (fcode == HTM_BUILTIN_TABORTDC
13753           || fcode == HTM_BUILTIN_TABORTDCI))
13754     {
13755       size_t uns_fcode = (size_t)fcode;
13756       const char *name = rs6000_builtin_info[uns_fcode].name;
13757       error ("builtin %qs is only valid in 64-bit mode", name);
13758       return const0_rtx;
13759     }
13760
13761   /* Expand the HTM builtins.  */
13762   d = bdesc_htm;
13763   for (i = 0; i < ARRAY_SIZE (bdesc_htm); i++, d++)
13764     if (d->code == fcode)
13765       {
13766         rtx op[MAX_HTM_OPERANDS], pat;
13767         int nopnds = 0;
13768         tree arg;
13769         call_expr_arg_iterator iter;
13770         unsigned attr = rs6000_builtin_info[fcode].attr;
13771         enum insn_code icode = d->icode;
13772         const struct insn_operand_data *insn_op;
13773         bool uses_spr = (attr & RS6000_BTC_SPR);
13774         rtx cr = NULL_RTX;
13775
13776         if (uses_spr)
13777           icode = rs6000_htm_spr_icode (nonvoid);
13778         insn_op = &insn_data[icode].operand[0];
13779
13780         if (nonvoid)
13781           {
13782             machine_mode tmode = (uses_spr) ? insn_op->mode : E_SImode;
13783             if (!target
13784                 || GET_MODE (target) != tmode
13785                 || (uses_spr && !(*insn_op->predicate) (target, tmode)))
13786               target = gen_reg_rtx (tmode);
13787             if (uses_spr)
13788               op[nopnds++] = target;
13789           }
13790
13791         FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
13792         {
13793           if (arg == error_mark_node || nopnds >= MAX_HTM_OPERANDS)
13794             return const0_rtx;
13795
13796           insn_op = &insn_data[icode].operand[nopnds];
13797
13798           op[nopnds] = expand_normal (arg);
13799
13800           if (!(*insn_op->predicate) (op[nopnds], insn_op->mode))
13801             {
13802               if (!strcmp (insn_op->constraint, "n"))
13803                 {
13804                   int arg_num = (nonvoid) ? nopnds : nopnds + 1;
13805                   if (!CONST_INT_P (op[nopnds]))
13806                     error ("argument %d must be an unsigned literal", arg_num);
13807                   else
13808                     error ("argument %d is an unsigned literal that is "
13809                            "out of range", arg_num);
13810                   return const0_rtx;
13811                 }
13812               op[nopnds] = copy_to_mode_reg (insn_op->mode, op[nopnds]);
13813             }
13814
13815           nopnds++;
13816         }
13817
13818         /* Handle the builtins for extended mnemonics.  These accept
13819            no arguments, but map to builtins that take arguments.  */
13820         switch (fcode)
13821           {
13822           case HTM_BUILTIN_TENDALL:  /* Alias for: tend. 1  */
13823           case HTM_BUILTIN_TRESUME:  /* Alias for: tsr. 1  */
13824             op[nopnds++] = GEN_INT (1);
13825             if (flag_checking)
13826               attr |= RS6000_BTC_UNARY;
13827             break;
13828           case HTM_BUILTIN_TSUSPEND: /* Alias for: tsr. 0  */
13829             op[nopnds++] = GEN_INT (0);
13830             if (flag_checking)
13831               attr |= RS6000_BTC_UNARY;
13832             break;
13833           default:
13834             break;
13835           }
13836
13837         /* If this builtin accesses SPRs, then pass in the appropriate
13838            SPR number and SPR regno as the last two operands.  */
13839         if (uses_spr)
13840           {
13841             machine_mode mode = (TARGET_POWERPC64) ? DImode : SImode;
13842             op[nopnds++] = gen_rtx_CONST_INT (mode, htm_spr_num (fcode));
13843           }
13844         /* If this builtin accesses a CR, then pass in a scratch
13845            CR as the last operand.  */
13846         else if (attr & RS6000_BTC_CR)
13847           { cr = gen_reg_rtx (CCmode);
13848             op[nopnds++] = cr;
13849           }
13850
13851         if (flag_checking)
13852           {
13853             int expected_nopnds = 0;
13854             if ((attr & RS6000_BTC_TYPE_MASK) == RS6000_BTC_UNARY)
13855               expected_nopnds = 1;
13856             else if ((attr & RS6000_BTC_TYPE_MASK) == RS6000_BTC_BINARY)
13857               expected_nopnds = 2;
13858             else if ((attr & RS6000_BTC_TYPE_MASK) == RS6000_BTC_TERNARY)
13859               expected_nopnds = 3;
13860             if (!(attr & RS6000_BTC_VOID))
13861               expected_nopnds += 1;
13862             if (uses_spr)
13863               expected_nopnds += 1;
13864
13865             gcc_assert (nopnds == expected_nopnds
13866                         && nopnds <= MAX_HTM_OPERANDS);
13867           }
13868
13869         switch (nopnds)
13870           {
13871           case 1:
13872             pat = GEN_FCN (icode) (op[0]);
13873             break;
13874           case 2:
13875             pat = GEN_FCN (icode) (op[0], op[1]);
13876             break;
13877           case 3:
13878             pat = GEN_FCN (icode) (op[0], op[1], op[2]);
13879             break;
13880           case 4:
13881             pat = GEN_FCN (icode) (op[0], op[1], op[2], op[3]);
13882             break;
13883           default:
13884             gcc_unreachable ();
13885           }
13886         if (!pat)
13887           return NULL_RTX;
13888         emit_insn (pat);
13889
13890         if (attr & RS6000_BTC_CR)
13891           {
13892             if (fcode == HTM_BUILTIN_TBEGIN)
13893               {
13894                 /* Emit code to set TARGET to true or false depending on
13895                    whether the tbegin. instruction successfully or failed
13896                    to start a transaction.  We do this by placing the 1's
13897                    complement of CR's EQ bit into TARGET.  */
13898                 rtx scratch = gen_reg_rtx (SImode);
13899                 emit_insn (gen_rtx_SET (scratch,
13900                                         gen_rtx_EQ (SImode, cr,
13901                                                      const0_rtx)));
13902                 emit_insn (gen_rtx_SET (target,
13903                                         gen_rtx_XOR (SImode, scratch,
13904                                                      GEN_INT (1))));
13905               }
13906             else
13907               {
13908                 /* Emit code to copy the 4-bit condition register field
13909                    CR into the least significant end of register TARGET.  */
13910                 rtx scratch1 = gen_reg_rtx (SImode);
13911                 rtx scratch2 = gen_reg_rtx (SImode);
13912                 rtx subreg = simplify_gen_subreg (CCmode, scratch1, SImode, 0);
13913                 emit_insn (gen_movcc (subreg, cr));
13914                 emit_insn (gen_lshrsi3 (scratch2, scratch1, GEN_INT (28)));
13915                 emit_insn (gen_andsi3 (target, scratch2, GEN_INT (0xf)));
13916               }
13917           }
13918
13919         if (nonvoid)
13920           return target;
13921         return const0_rtx;
13922       }
13923
13924   *expandedp = false;
13925   return NULL_RTX;
13926 }
13927
13928 /* Expand the CPU builtin in FCODE and store the result in TARGET.  */
13929
13930 static rtx
13931 cpu_expand_builtin (enum rs6000_builtins fcode, tree exp ATTRIBUTE_UNUSED,
13932                     rtx target)
13933 {
13934   /* __builtin_cpu_init () is a nop, so expand to nothing.  */
13935   if (fcode == RS6000_BUILTIN_CPU_INIT)
13936     return const0_rtx;
13937
13938   if (target == 0 || GET_MODE (target) != SImode)
13939     target = gen_reg_rtx (SImode);
13940
13941 #ifdef TARGET_LIBC_PROVIDES_HWCAP_IN_TCB
13942   tree arg = TREE_OPERAND (CALL_EXPR_ARG (exp, 0), 0);
13943   /* Target clones creates an ARRAY_REF instead of STRING_CST, convert it back
13944      to a STRING_CST.  */
13945   if (TREE_CODE (arg) == ARRAY_REF
13946       && TREE_CODE (TREE_OPERAND (arg, 0)) == STRING_CST
13947       && TREE_CODE (TREE_OPERAND (arg, 1)) == INTEGER_CST
13948       && compare_tree_int (TREE_OPERAND (arg, 1), 0) == 0)
13949     arg = TREE_OPERAND (arg, 0);
13950
13951   if (TREE_CODE (arg) != STRING_CST)
13952     {
13953       error ("builtin %qs only accepts a string argument",
13954              rs6000_builtin_info[(size_t) fcode].name);
13955       return const0_rtx;
13956     }
13957
13958   if (fcode == RS6000_BUILTIN_CPU_IS)
13959     {
13960       const char *cpu = TREE_STRING_POINTER (arg);
13961       rtx cpuid = NULL_RTX;
13962       for (size_t i = 0; i < ARRAY_SIZE (cpu_is_info); i++)
13963         if (strcmp (cpu, cpu_is_info[i].cpu) == 0)
13964           {
13965             /* The CPUID value in the TCB is offset by _DL_FIRST_PLATFORM.  */
13966             cpuid = GEN_INT (cpu_is_info[i].cpuid + _DL_FIRST_PLATFORM);
13967             break;
13968           }
13969       if (cpuid == NULL_RTX)
13970         {
13971           /* Invalid CPU argument.  */
13972           error ("cpu %qs is an invalid argument to builtin %qs",
13973                  cpu, rs6000_builtin_info[(size_t) fcode].name);
13974           return const0_rtx;
13975         }
13976
13977       rtx platform = gen_reg_rtx (SImode);
13978       rtx tcbmem = gen_const_mem (SImode,
13979                                   gen_rtx_PLUS (Pmode,
13980                                                 gen_rtx_REG (Pmode, TLS_REGNUM),
13981                                                 GEN_INT (TCB_PLATFORM_OFFSET)));
13982       emit_move_insn (platform, tcbmem);
13983       emit_insn (gen_eqsi3 (target, platform, cpuid));
13984     }
13985   else if (fcode == RS6000_BUILTIN_CPU_SUPPORTS)
13986     {
13987       const char *hwcap = TREE_STRING_POINTER (arg);
13988       rtx mask = NULL_RTX;
13989       int hwcap_offset;
13990       for (size_t i = 0; i < ARRAY_SIZE (cpu_supports_info); i++)
13991         if (strcmp (hwcap, cpu_supports_info[i].hwcap) == 0)
13992           {
13993             mask = GEN_INT (cpu_supports_info[i].mask);
13994             hwcap_offset = TCB_HWCAP_OFFSET (cpu_supports_info[i].id);
13995             break;
13996           }
13997       if (mask == NULL_RTX)
13998         {
13999           /* Invalid HWCAP argument.  */
14000           error ("%s %qs is an invalid argument to builtin %qs",
14001                  "hwcap", hwcap, rs6000_builtin_info[(size_t) fcode].name);
14002           return const0_rtx;
14003         }
14004
14005       rtx tcb_hwcap = gen_reg_rtx (SImode);
14006       rtx tcbmem = gen_const_mem (SImode,
14007                                   gen_rtx_PLUS (Pmode,
14008                                                 gen_rtx_REG (Pmode, TLS_REGNUM),
14009                                                 GEN_INT (hwcap_offset)));
14010       emit_move_insn (tcb_hwcap, tcbmem);
14011       rtx scratch1 = gen_reg_rtx (SImode);
14012       emit_insn (gen_rtx_SET (scratch1, gen_rtx_AND (SImode, tcb_hwcap, mask)));
14013       rtx scratch2 = gen_reg_rtx (SImode);
14014       emit_insn (gen_eqsi3 (scratch2, scratch1, const0_rtx));
14015       emit_insn (gen_rtx_SET (target, gen_rtx_XOR (SImode, scratch2, const1_rtx)));
14016     }
14017   else
14018     gcc_unreachable ();
14019
14020   /* Record that we have expanded a CPU builtin, so that we can later
14021      emit a reference to the special symbol exported by LIBC to ensure we
14022      do not link against an old LIBC that doesn't support this feature.  */
14023   cpu_builtin_p = true;
14024
14025 #else
14026   warning (0, "builtin %qs needs GLIBC (2.23 and newer) that exports hardware "
14027            "capability bits", rs6000_builtin_info[(size_t) fcode].name);
14028   
14029   /* For old LIBCs, always return FALSE.  */
14030   emit_move_insn (target, GEN_INT (0));
14031 #endif /* TARGET_LIBC_PROVIDES_HWCAP_IN_TCB */
14032
14033   return target;
14034 }
14035
14036 static rtx
14037 rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
14038 {
14039   rtx pat;
14040   tree arg0 = CALL_EXPR_ARG (exp, 0);
14041   tree arg1 = CALL_EXPR_ARG (exp, 1);
14042   tree arg2 = CALL_EXPR_ARG (exp, 2);
14043   rtx op0 = expand_normal (arg0);
14044   rtx op1 = expand_normal (arg1);
14045   rtx op2 = expand_normal (arg2);
14046   machine_mode tmode = insn_data[icode].operand[0].mode;
14047   machine_mode mode0 = insn_data[icode].operand[1].mode;
14048   machine_mode mode1 = insn_data[icode].operand[2].mode;
14049   machine_mode mode2 = insn_data[icode].operand[3].mode;
14050
14051   if (icode == CODE_FOR_nothing)
14052     /* Builtin not supported on this processor.  */
14053     return 0;
14054
14055   /* If we got invalid arguments bail out before generating bad rtl.  */
14056   if (arg0 == error_mark_node
14057       || arg1 == error_mark_node
14058       || arg2 == error_mark_node)
14059     return const0_rtx;
14060
14061   /* Check and prepare argument depending on the instruction code.
14062
14063      Note that a switch statement instead of the sequence of tests
14064      would be incorrect as many of the CODE_FOR values could be
14065      CODE_FOR_nothing and that would yield multiple alternatives
14066      with identical values.  We'd never reach here at runtime in
14067      this case.  */
14068   if (icode == CODE_FOR_altivec_vsldoi_v4sf
14069       || icode == CODE_FOR_altivec_vsldoi_v2df
14070       || icode == CODE_FOR_altivec_vsldoi_v4si
14071       || icode == CODE_FOR_altivec_vsldoi_v8hi
14072       || icode == CODE_FOR_altivec_vsldoi_v16qi)
14073     {
14074       /* Only allow 4-bit unsigned literals.  */
14075       STRIP_NOPS (arg2);
14076       if (TREE_CODE (arg2) != INTEGER_CST
14077           || TREE_INT_CST_LOW (arg2) & ~0xf)
14078         {
14079           error ("argument 3 must be a 4-bit unsigned literal");
14080           return CONST0_RTX (tmode);
14081         }
14082     }
14083   else if (icode == CODE_FOR_vsx_xxpermdi_v2df
14084            || icode == CODE_FOR_vsx_xxpermdi_v2di
14085            || icode == CODE_FOR_vsx_xxpermdi_v2df_be
14086            || icode == CODE_FOR_vsx_xxpermdi_v2di_be
14087            || icode == CODE_FOR_vsx_xxpermdi_v1ti
14088            || icode == CODE_FOR_vsx_xxpermdi_v4sf
14089            || icode == CODE_FOR_vsx_xxpermdi_v4si
14090            || icode == CODE_FOR_vsx_xxpermdi_v8hi
14091            || icode == CODE_FOR_vsx_xxpermdi_v16qi
14092            || icode == CODE_FOR_vsx_xxsldwi_v16qi
14093            || icode == CODE_FOR_vsx_xxsldwi_v8hi
14094            || icode == CODE_FOR_vsx_xxsldwi_v4si
14095            || icode == CODE_FOR_vsx_xxsldwi_v4sf
14096            || icode == CODE_FOR_vsx_xxsldwi_v2di
14097            || icode == CODE_FOR_vsx_xxsldwi_v2df)
14098     {
14099       /* Only allow 2-bit unsigned literals.  */
14100       STRIP_NOPS (arg2);
14101       if (TREE_CODE (arg2) != INTEGER_CST
14102           || TREE_INT_CST_LOW (arg2) & ~0x3)
14103         {
14104           error ("argument 3 must be a 2-bit unsigned literal");
14105           return CONST0_RTX (tmode);
14106         }
14107     }
14108   else if (icode == CODE_FOR_vsx_set_v2df
14109            || icode == CODE_FOR_vsx_set_v2di
14110            || icode == CODE_FOR_bcdadd
14111            || icode == CODE_FOR_bcdadd_lt
14112            || icode == CODE_FOR_bcdadd_eq
14113            || icode == CODE_FOR_bcdadd_gt
14114            || icode == CODE_FOR_bcdsub
14115            || icode == CODE_FOR_bcdsub_lt
14116            || icode == CODE_FOR_bcdsub_eq
14117            || icode == CODE_FOR_bcdsub_gt)
14118     {
14119       /* Only allow 1-bit unsigned literals.  */
14120       STRIP_NOPS (arg2);
14121       if (TREE_CODE (arg2) != INTEGER_CST
14122           || TREE_INT_CST_LOW (arg2) & ~0x1)
14123         {
14124           error ("argument 3 must be a 1-bit unsigned literal");
14125           return CONST0_RTX (tmode);
14126         }
14127     }
14128   else if (icode == CODE_FOR_dfp_ddedpd_dd
14129            || icode == CODE_FOR_dfp_ddedpd_td)
14130     {
14131       /* Only allow 2-bit unsigned literals where the value is 0 or 2.  */
14132       STRIP_NOPS (arg0);
14133       if (TREE_CODE (arg0) != INTEGER_CST
14134           || TREE_INT_CST_LOW (arg2) & ~0x3)
14135         {
14136           error ("argument 1 must be 0 or 2");
14137           return CONST0_RTX (tmode);
14138         }
14139     }
14140   else if (icode == CODE_FOR_dfp_denbcd_dd
14141            || icode == CODE_FOR_dfp_denbcd_td)
14142     {
14143       /* Only allow 1-bit unsigned literals.  */
14144       STRIP_NOPS (arg0);
14145       if (TREE_CODE (arg0) != INTEGER_CST
14146           || TREE_INT_CST_LOW (arg0) & ~0x1)
14147         {
14148           error ("argument 1 must be a 1-bit unsigned literal");
14149           return CONST0_RTX (tmode);
14150         }
14151     }
14152   else if (icode == CODE_FOR_dfp_dscli_dd
14153            || icode == CODE_FOR_dfp_dscli_td
14154            || icode == CODE_FOR_dfp_dscri_dd
14155            || icode == CODE_FOR_dfp_dscri_td)
14156     {
14157       /* Only allow 6-bit unsigned literals.  */
14158       STRIP_NOPS (arg1);
14159       if (TREE_CODE (arg1) != INTEGER_CST
14160           || TREE_INT_CST_LOW (arg1) & ~0x3f)
14161         {
14162           error ("argument 2 must be a 6-bit unsigned literal");
14163           return CONST0_RTX (tmode);
14164         }
14165     }
14166   else if (icode == CODE_FOR_crypto_vshasigmaw
14167            || icode == CODE_FOR_crypto_vshasigmad)
14168     {
14169       /* Check whether the 2nd and 3rd arguments are integer constants and in
14170          range and prepare arguments.  */
14171       STRIP_NOPS (arg1);
14172       if (TREE_CODE (arg1) != INTEGER_CST || wi::geu_p (wi::to_wide (arg1), 2))
14173         {
14174           error ("argument 2 must be 0 or 1");
14175           return CONST0_RTX (tmode);
14176         }
14177
14178       STRIP_NOPS (arg2);
14179       if (TREE_CODE (arg2) != INTEGER_CST
14180           || wi::geu_p (wi::to_wide (arg2), 16))
14181         {
14182           error ("argument 3 must be in the range [0, 15]");
14183           return CONST0_RTX (tmode);
14184         }
14185     }
14186
14187   if (target == 0
14188       || GET_MODE (target) != tmode
14189       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
14190     target = gen_reg_rtx (tmode);
14191
14192   if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
14193     op0 = copy_to_mode_reg (mode0, op0);
14194   if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
14195     op1 = copy_to_mode_reg (mode1, op1);
14196   if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
14197     op2 = copy_to_mode_reg (mode2, op2);
14198
14199   pat = GEN_FCN (icode) (target, op0, op1, op2);
14200   if (! pat)
14201     return 0;
14202   emit_insn (pat);
14203
14204   return target;
14205 }
14206
14207
14208 /* Expand the dst builtins.  */
14209 static rtx
14210 altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
14211                             bool *expandedp)
14212 {
14213   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
14214   enum rs6000_builtins fcode = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
14215   tree arg0, arg1, arg2;
14216   machine_mode mode0, mode1;
14217   rtx pat, op0, op1, op2;
14218   const struct builtin_description *d;
14219   size_t i;
14220
14221   *expandedp = false;
14222
14223   /* Handle DST variants.  */
14224   d = bdesc_dst;
14225   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
14226     if (d->code == fcode)
14227       {
14228         arg0 = CALL_EXPR_ARG (exp, 0);
14229         arg1 = CALL_EXPR_ARG (exp, 1);
14230         arg2 = CALL_EXPR_ARG (exp, 2);
14231         op0 = expand_normal (arg0);
14232         op1 = expand_normal (arg1);
14233         op2 = expand_normal (arg2);
14234         mode0 = insn_data[d->icode].operand[0].mode;
14235         mode1 = insn_data[d->icode].operand[1].mode;
14236
14237         /* Invalid arguments, bail out before generating bad rtl.  */
14238         if (arg0 == error_mark_node
14239             || arg1 == error_mark_node
14240             || arg2 == error_mark_node)
14241           return const0_rtx;
14242
14243         *expandedp = true;
14244         STRIP_NOPS (arg2);
14245         if (TREE_CODE (arg2) != INTEGER_CST
14246             || TREE_INT_CST_LOW (arg2) & ~0x3)
14247           {
14248             error ("argument to %qs must be a 2-bit unsigned literal", d->name);
14249             return const0_rtx;
14250           }
14251
14252         if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
14253           op0 = copy_to_mode_reg (Pmode, op0);
14254         if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
14255           op1 = copy_to_mode_reg (mode1, op1);
14256
14257         pat = GEN_FCN (d->icode) (op0, op1, op2);
14258         if (pat != 0)
14259           emit_insn (pat);
14260
14261         return NULL_RTX;
14262       }
14263
14264   return NULL_RTX;
14265 }
14266
14267 /* Expand vec_init builtin.  */
14268 static rtx
14269 altivec_expand_vec_init_builtin (tree type, tree exp, rtx target)
14270 {
14271   machine_mode tmode = TYPE_MODE (type);
14272   machine_mode inner_mode = GET_MODE_INNER (tmode);
14273   int i, n_elt = GET_MODE_NUNITS (tmode);
14274
14275   gcc_assert (VECTOR_MODE_P (tmode));
14276   gcc_assert (n_elt == call_expr_nargs (exp));
14277
14278   if (!target || !register_operand (target, tmode))
14279     target = gen_reg_rtx (tmode);
14280
14281   /* If we have a vector compromised of a single element, such as V1TImode, do
14282      the initialization directly.  */
14283   if (n_elt == 1 && GET_MODE_SIZE (tmode) == GET_MODE_SIZE (inner_mode))
14284     {
14285       rtx x = expand_normal (CALL_EXPR_ARG (exp, 0));
14286       emit_move_insn (target, gen_lowpart (tmode, x));
14287     }
14288   else
14289     {
14290       rtvec v = rtvec_alloc (n_elt);
14291
14292       for (i = 0; i < n_elt; ++i)
14293         {
14294           rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
14295           RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
14296         }
14297
14298       rs6000_expand_vector_init (target, gen_rtx_PARALLEL (tmode, v));
14299     }
14300
14301   return target;
14302 }
14303
14304 /* Return the integer constant in ARG.  Constrain it to be in the range
14305    of the subparts of VEC_TYPE; issue an error if not.  */
14306
14307 static int
14308 get_element_number (tree vec_type, tree arg)
14309 {
14310   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
14311
14312   if (!tree_fits_uhwi_p (arg)
14313       || (elt = tree_to_uhwi (arg), elt > max))
14314     {
14315       error ("selector must be an integer constant in the range [0, %wi]", max);
14316       return 0;
14317     }
14318
14319   return elt;
14320 }
14321
14322 /* Expand vec_set builtin.  */
14323 static rtx
14324 altivec_expand_vec_set_builtin (tree exp)
14325 {
14326   machine_mode tmode, mode1;
14327   tree arg0, arg1, arg2;
14328   int elt;
14329   rtx op0, op1;
14330
14331   arg0 = CALL_EXPR_ARG (exp, 0);
14332   arg1 = CALL_EXPR_ARG (exp, 1);
14333   arg2 = CALL_EXPR_ARG (exp, 2);
14334
14335   tmode = TYPE_MODE (TREE_TYPE (arg0));
14336   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
14337   gcc_assert (VECTOR_MODE_P (tmode));
14338
14339   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
14340   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
14341   elt = get_element_number (TREE_TYPE (arg0), arg2);
14342
14343   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
14344     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
14345
14346   op0 = force_reg (tmode, op0);
14347   op1 = force_reg (mode1, op1);
14348
14349   rs6000_expand_vector_set (op0, op1, elt);
14350
14351   return op0;
14352 }
14353
14354 /* Expand vec_ext builtin.  */
14355 static rtx
14356 altivec_expand_vec_ext_builtin (tree exp, rtx target)
14357 {
14358   machine_mode tmode, mode0;
14359   tree arg0, arg1;
14360   rtx op0;
14361   rtx op1;
14362
14363   arg0 = CALL_EXPR_ARG (exp, 0);
14364   arg1 = CALL_EXPR_ARG (exp, 1);
14365
14366   op0 = expand_normal (arg0);
14367   op1 = expand_normal (arg1);
14368
14369   if (TREE_CODE (arg1) == INTEGER_CST)
14370     {
14371       unsigned HOST_WIDE_INT elt;
14372       unsigned HOST_WIDE_INT size = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0));
14373       unsigned int truncated_selector;
14374       /* Even if !tree_fits_uhwi_p (arg1)), TREE_INT_CST_LOW (arg0)
14375          returns low-order bits of INTEGER_CST for modulo indexing.  */
14376       elt = TREE_INT_CST_LOW (arg1);
14377       truncated_selector = elt % size;
14378       op1 = GEN_INT (truncated_selector);
14379     }
14380
14381   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
14382   mode0 = TYPE_MODE (TREE_TYPE (arg0));
14383   gcc_assert (VECTOR_MODE_P (mode0));
14384
14385   op0 = force_reg (mode0, op0);
14386
14387   if (optimize || !target || !register_operand (target, tmode))
14388     target = gen_reg_rtx (tmode);
14389
14390   rs6000_expand_vector_extract (target, op0, op1);
14391
14392   return target;
14393 }
14394
14395 /* Expand the builtin in EXP and store the result in TARGET.  Store
14396    true in *EXPANDEDP if we found a builtin to expand.  */
14397 static rtx
14398 altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
14399 {
14400   const struct builtin_description *d;
14401   size_t i;
14402   enum insn_code icode;
14403   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
14404   tree arg0, arg1, arg2;
14405   rtx op0, pat;
14406   machine_mode tmode, mode0;
14407   enum rs6000_builtins fcode
14408     = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
14409
14410   if (rs6000_overloaded_builtin_p (fcode))
14411     {
14412       *expandedp = true;
14413       error ("unresolved overload for Altivec builtin %qF", fndecl);
14414
14415       /* Given it is invalid, just generate a normal call.  */
14416       return expand_call (exp, target, false);
14417     }
14418
14419   target = altivec_expand_dst_builtin (exp, target, expandedp);
14420   if (*expandedp)
14421     return target;
14422
14423   *expandedp = true;
14424
14425   switch (fcode)
14426     {
14427     case ALTIVEC_BUILTIN_STVX_V2DF:
14428       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v2df, exp);
14429     case ALTIVEC_BUILTIN_STVX_V2DI:
14430       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v2di, exp);
14431     case ALTIVEC_BUILTIN_STVX_V4SF:
14432       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v4sf, exp);
14433     case ALTIVEC_BUILTIN_STVX:
14434     case ALTIVEC_BUILTIN_STVX_V4SI:
14435       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v4si, exp);
14436     case ALTIVEC_BUILTIN_STVX_V8HI:
14437       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v8hi, exp);
14438     case ALTIVEC_BUILTIN_STVX_V16QI:
14439       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v16qi, exp);
14440     case ALTIVEC_BUILTIN_STVEBX:
14441       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, exp);
14442     case ALTIVEC_BUILTIN_STVEHX:
14443       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, exp);
14444     case ALTIVEC_BUILTIN_STVEWX:
14445       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, exp);
14446     case ALTIVEC_BUILTIN_STVXL_V2DF:
14447       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl_v2df, exp);
14448     case ALTIVEC_BUILTIN_STVXL_V2DI:
14449       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl_v2di, exp);
14450     case ALTIVEC_BUILTIN_STVXL_V4SF:
14451       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl_v4sf, exp);
14452     case ALTIVEC_BUILTIN_STVXL:
14453     case ALTIVEC_BUILTIN_STVXL_V4SI:
14454       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl_v4si, exp);
14455     case ALTIVEC_BUILTIN_STVXL_V8HI:
14456       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl_v8hi, exp);
14457     case ALTIVEC_BUILTIN_STVXL_V16QI:
14458       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl_v16qi, exp);
14459
14460     case ALTIVEC_BUILTIN_STVLX:
14461       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlx, exp);
14462     case ALTIVEC_BUILTIN_STVLXL:
14463       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlxl, exp);
14464     case ALTIVEC_BUILTIN_STVRX:
14465       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrx, exp);
14466     case ALTIVEC_BUILTIN_STVRXL:
14467       return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrxl, exp);
14468
14469     case P9V_BUILTIN_STXVL:
14470       return altivec_expand_stxvl_builtin (CODE_FOR_stxvl, exp);
14471
14472     case P9V_BUILTIN_XST_LEN_R:
14473       return altivec_expand_stxvl_builtin (CODE_FOR_xst_len_r, exp);
14474
14475     case VSX_BUILTIN_STXVD2X_V1TI:
14476       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v1ti, exp);
14477     case VSX_BUILTIN_STXVD2X_V2DF:
14478       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v2df, exp);
14479     case VSX_BUILTIN_STXVD2X_V2DI:
14480       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v2di, exp);
14481     case VSX_BUILTIN_STXVW4X_V4SF:
14482       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v4sf, exp);
14483     case VSX_BUILTIN_STXVW4X_V4SI:
14484       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v4si, exp);
14485     case VSX_BUILTIN_STXVW4X_V8HI:
14486       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v8hi, exp);
14487     case VSX_BUILTIN_STXVW4X_V16QI:
14488       return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v16qi, exp);
14489
14490     /* For the following on big endian, it's ok to use any appropriate
14491        unaligned-supporting store, so use a generic expander.  For
14492        little-endian, the exact element-reversing instruction must
14493        be used.  */
14494    case VSX_BUILTIN_ST_ELEMREV_V1TI:
14495      {
14496         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v1ti
14497                                : CODE_FOR_vsx_st_elemrev_v1ti);
14498         return altivec_expand_stv_builtin (code, exp);
14499       }
14500     case VSX_BUILTIN_ST_ELEMREV_V2DF:
14501       {
14502         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v2df
14503                                : CODE_FOR_vsx_st_elemrev_v2df);
14504         return altivec_expand_stv_builtin (code, exp);
14505       }
14506     case VSX_BUILTIN_ST_ELEMREV_V2DI:
14507       {
14508         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v2di
14509                                : CODE_FOR_vsx_st_elemrev_v2di);
14510         return altivec_expand_stv_builtin (code, exp);
14511       }
14512     case VSX_BUILTIN_ST_ELEMREV_V4SF:
14513       {
14514         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v4sf
14515                                : CODE_FOR_vsx_st_elemrev_v4sf);
14516         return altivec_expand_stv_builtin (code, exp);
14517       }
14518     case VSX_BUILTIN_ST_ELEMREV_V4SI:
14519       {
14520         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v4si
14521                                : CODE_FOR_vsx_st_elemrev_v4si);
14522         return altivec_expand_stv_builtin (code, exp);
14523       }
14524     case VSX_BUILTIN_ST_ELEMREV_V8HI:
14525       {
14526         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v8hi
14527                                : CODE_FOR_vsx_st_elemrev_v8hi);
14528         return altivec_expand_stv_builtin (code, exp);
14529       }
14530     case VSX_BUILTIN_ST_ELEMREV_V16QI:
14531       {
14532         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_store_v16qi
14533                                : CODE_FOR_vsx_st_elemrev_v16qi);
14534         return altivec_expand_stv_builtin (code, exp);
14535       }
14536
14537     case ALTIVEC_BUILTIN_MFVSCR:
14538       icode = CODE_FOR_altivec_mfvscr;
14539       tmode = insn_data[icode].operand[0].mode;
14540
14541       if (target == 0
14542           || GET_MODE (target) != tmode
14543           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
14544         target = gen_reg_rtx (tmode);
14545
14546       pat = GEN_FCN (icode) (target);
14547       if (! pat)
14548         return 0;
14549       emit_insn (pat);
14550       return target;
14551
14552     case ALTIVEC_BUILTIN_MTVSCR:
14553       icode = CODE_FOR_altivec_mtvscr;
14554       arg0 = CALL_EXPR_ARG (exp, 0);
14555       op0 = expand_normal (arg0);
14556       mode0 = insn_data[icode].operand[0].mode;
14557
14558       /* If we got invalid arguments bail out before generating bad rtl.  */
14559       if (arg0 == error_mark_node)
14560         return const0_rtx;
14561
14562       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
14563         op0 = copy_to_mode_reg (mode0, op0);
14564
14565       pat = GEN_FCN (icode) (op0);
14566       if (pat)
14567         emit_insn (pat);
14568       return NULL_RTX;
14569
14570     case ALTIVEC_BUILTIN_DSSALL:
14571       emit_insn (gen_altivec_dssall ());
14572       return NULL_RTX;
14573
14574     case ALTIVEC_BUILTIN_DSS:
14575       icode = CODE_FOR_altivec_dss;
14576       arg0 = CALL_EXPR_ARG (exp, 0);
14577       STRIP_NOPS (arg0);
14578       op0 = expand_normal (arg0);
14579       mode0 = insn_data[icode].operand[0].mode;
14580
14581       /* If we got invalid arguments bail out before generating bad rtl.  */
14582       if (arg0 == error_mark_node)
14583         return const0_rtx;
14584
14585       if (TREE_CODE (arg0) != INTEGER_CST
14586           || TREE_INT_CST_LOW (arg0) & ~0x3)
14587         {
14588           error ("argument to %qs must be a 2-bit unsigned literal", "dss");
14589           return const0_rtx;
14590         }
14591
14592       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
14593         op0 = copy_to_mode_reg (mode0, op0);
14594
14595       emit_insn (gen_altivec_dss (op0));
14596       return NULL_RTX;
14597
14598     case ALTIVEC_BUILTIN_VEC_INIT_V4SI:
14599     case ALTIVEC_BUILTIN_VEC_INIT_V8HI:
14600     case ALTIVEC_BUILTIN_VEC_INIT_V16QI:
14601     case ALTIVEC_BUILTIN_VEC_INIT_V4SF:
14602     case VSX_BUILTIN_VEC_INIT_V2DF:
14603     case VSX_BUILTIN_VEC_INIT_V2DI:
14604     case VSX_BUILTIN_VEC_INIT_V1TI:
14605       return altivec_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
14606
14607     case ALTIVEC_BUILTIN_VEC_SET_V4SI:
14608     case ALTIVEC_BUILTIN_VEC_SET_V8HI:
14609     case ALTIVEC_BUILTIN_VEC_SET_V16QI:
14610     case ALTIVEC_BUILTIN_VEC_SET_V4SF:
14611     case VSX_BUILTIN_VEC_SET_V2DF:
14612     case VSX_BUILTIN_VEC_SET_V2DI:
14613     case VSX_BUILTIN_VEC_SET_V1TI:
14614       return altivec_expand_vec_set_builtin (exp);
14615
14616     case ALTIVEC_BUILTIN_VEC_EXT_V4SI:
14617     case ALTIVEC_BUILTIN_VEC_EXT_V8HI:
14618     case ALTIVEC_BUILTIN_VEC_EXT_V16QI:
14619     case ALTIVEC_BUILTIN_VEC_EXT_V4SF:
14620     case VSX_BUILTIN_VEC_EXT_V2DF:
14621     case VSX_BUILTIN_VEC_EXT_V2DI:
14622     case VSX_BUILTIN_VEC_EXT_V1TI:
14623       return altivec_expand_vec_ext_builtin (exp, target);
14624
14625     case P9V_BUILTIN_VEC_EXTRACT4B:
14626       arg1 = CALL_EXPR_ARG (exp, 1);
14627       STRIP_NOPS (arg1);
14628
14629       /* Generate a normal call if it is invalid.  */
14630       if (arg1 == error_mark_node)
14631         return expand_call (exp, target, false);
14632
14633       if (TREE_CODE (arg1) != INTEGER_CST || TREE_INT_CST_LOW (arg1) > 12)
14634         {
14635           error ("second argument to %qs must be [0, 12]", "vec_vextract4b");
14636           return expand_call (exp, target, false);
14637         }
14638       break;
14639
14640     case P9V_BUILTIN_VEC_INSERT4B:
14641       arg2 = CALL_EXPR_ARG (exp, 2);
14642       STRIP_NOPS (arg2);
14643
14644       /* Generate a normal call if it is invalid.  */
14645       if (arg2 == error_mark_node)
14646         return expand_call (exp, target, false);
14647
14648       if (TREE_CODE (arg2) != INTEGER_CST || TREE_INT_CST_LOW (arg2) > 12)
14649         {
14650           error ("third argument to %qs must be [0, 12]", "vec_vinsert4b");
14651           return expand_call (exp, target, false);
14652         }
14653       break;
14654
14655     default:
14656       break;
14657       /* Fall through.  */
14658     }
14659
14660   /* Expand abs* operations.  */
14661   d = bdesc_abs;
14662   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
14663     if (d->code == fcode)
14664       return altivec_expand_abs_builtin (d->icode, exp, target);
14665
14666   /* Expand the AltiVec predicates.  */
14667   d = bdesc_altivec_preds;
14668   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, d++)
14669     if (d->code == fcode)
14670       return altivec_expand_predicate_builtin (d->icode, exp, target);
14671
14672   /* LV* are funky.  We initialized them differently.  */
14673   switch (fcode)
14674     {
14675     case ALTIVEC_BUILTIN_LVSL:
14676       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
14677                                         exp, target, false);
14678     case ALTIVEC_BUILTIN_LVSR:
14679       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
14680                                         exp, target, false);
14681     case ALTIVEC_BUILTIN_LVEBX:
14682       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
14683                                         exp, target, false);
14684     case ALTIVEC_BUILTIN_LVEHX:
14685       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
14686                                         exp, target, false);
14687     case ALTIVEC_BUILTIN_LVEWX:
14688       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
14689                                         exp, target, false);
14690     case ALTIVEC_BUILTIN_LVXL_V2DF:
14691       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl_v2df,
14692                                         exp, target, false);
14693     case ALTIVEC_BUILTIN_LVXL_V2DI:
14694       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl_v2di,
14695                                         exp, target, false);
14696     case ALTIVEC_BUILTIN_LVXL_V4SF:
14697       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl_v4sf,
14698                                         exp, target, false);
14699     case ALTIVEC_BUILTIN_LVXL:
14700     case ALTIVEC_BUILTIN_LVXL_V4SI:
14701       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl_v4si,
14702                                         exp, target, false);
14703     case ALTIVEC_BUILTIN_LVXL_V8HI:
14704       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl_v8hi,
14705                                         exp, target, false);
14706     case ALTIVEC_BUILTIN_LVXL_V16QI:
14707       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl_v16qi,
14708                                         exp, target, false);
14709     case ALTIVEC_BUILTIN_LVX_V1TI:
14710       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v1ti,
14711                                         exp, target, false);
14712     case ALTIVEC_BUILTIN_LVX_V2DF:
14713       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v2df,
14714                                         exp, target, false);
14715     case ALTIVEC_BUILTIN_LVX_V2DI:
14716       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v2di,
14717                                         exp, target, false);
14718     case ALTIVEC_BUILTIN_LVX_V4SF:
14719       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v4sf,
14720                                         exp, target, false);
14721     case ALTIVEC_BUILTIN_LVX:
14722     case ALTIVEC_BUILTIN_LVX_V4SI:
14723       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v4si,
14724                                         exp, target, false);
14725     case ALTIVEC_BUILTIN_LVX_V8HI:
14726       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v8hi,
14727                                         exp, target, false);
14728     case ALTIVEC_BUILTIN_LVX_V16QI:
14729       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v16qi,
14730                                         exp, target, false);
14731     case ALTIVEC_BUILTIN_LVLX:
14732       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlx,
14733                                         exp, target, true);
14734     case ALTIVEC_BUILTIN_LVLXL:
14735       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlxl,
14736                                         exp, target, true);
14737     case ALTIVEC_BUILTIN_LVRX:
14738       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrx,
14739                                         exp, target, true);
14740     case ALTIVEC_BUILTIN_LVRXL:
14741       return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrxl,
14742                                         exp, target, true);
14743     case VSX_BUILTIN_LXVD2X_V1TI:
14744       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v1ti,
14745                                         exp, target, false);
14746     case VSX_BUILTIN_LXVD2X_V2DF:
14747       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v2df,
14748                                         exp, target, false);
14749     case VSX_BUILTIN_LXVD2X_V2DI:
14750       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v2di,
14751                                         exp, target, false);
14752     case VSX_BUILTIN_LXVW4X_V4SF:
14753       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v4sf,
14754                                         exp, target, false);
14755     case VSX_BUILTIN_LXVW4X_V4SI:
14756       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v4si,
14757                                         exp, target, false);
14758     case VSX_BUILTIN_LXVW4X_V8HI:
14759       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v8hi,
14760                                         exp, target, false);
14761     case VSX_BUILTIN_LXVW4X_V16QI:
14762       return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v16qi,
14763                                         exp, target, false);
14764     /* For the following on big endian, it's ok to use any appropriate
14765        unaligned-supporting load, so use a generic expander.  For
14766        little-endian, the exact element-reversing instruction must
14767        be used.  */
14768     case VSX_BUILTIN_LD_ELEMREV_V2DF:
14769       {
14770         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v2df
14771                                : CODE_FOR_vsx_ld_elemrev_v2df);
14772         return altivec_expand_lv_builtin (code, exp, target, false);
14773       }
14774     case VSX_BUILTIN_LD_ELEMREV_V1TI:
14775       {
14776         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v1ti
14777                                : CODE_FOR_vsx_ld_elemrev_v1ti);
14778         return altivec_expand_lv_builtin (code, exp, target, false);
14779       }
14780     case VSX_BUILTIN_LD_ELEMREV_V2DI:
14781       {
14782         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v2di
14783                                : CODE_FOR_vsx_ld_elemrev_v2di);
14784         return altivec_expand_lv_builtin (code, exp, target, false);
14785       }
14786     case VSX_BUILTIN_LD_ELEMREV_V4SF:
14787       {
14788         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v4sf
14789                                : CODE_FOR_vsx_ld_elemrev_v4sf);
14790         return altivec_expand_lv_builtin (code, exp, target, false);
14791       }
14792     case VSX_BUILTIN_LD_ELEMREV_V4SI:
14793       {
14794         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v4si
14795                                : CODE_FOR_vsx_ld_elemrev_v4si);
14796         return altivec_expand_lv_builtin (code, exp, target, false);
14797       }
14798     case VSX_BUILTIN_LD_ELEMREV_V8HI:
14799       {
14800         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v8hi
14801                                : CODE_FOR_vsx_ld_elemrev_v8hi);
14802         return altivec_expand_lv_builtin (code, exp, target, false);
14803       }
14804     case VSX_BUILTIN_LD_ELEMREV_V16QI:
14805       {
14806         enum insn_code code = (BYTES_BIG_ENDIAN ? CODE_FOR_vsx_load_v16qi
14807                                : CODE_FOR_vsx_ld_elemrev_v16qi);
14808         return altivec_expand_lv_builtin (code, exp, target, false);
14809       }
14810       break;
14811     default:
14812       break;
14813       /* Fall through.  */
14814     }
14815
14816   *expandedp = false;
14817   return NULL_RTX;
14818 }
14819
14820 /* Check whether a builtin function is supported in this target
14821    configuration.  */
14822 bool
14823 rs6000_builtin_is_supported_p (enum rs6000_builtins fncode)
14824 {
14825   HOST_WIDE_INT fnmask = rs6000_builtin_info[fncode].mask;
14826   if ((fnmask & rs6000_builtin_mask) != fnmask)
14827     return false;
14828   else
14829     return true;
14830 }
14831
14832 /* Raise an error message for a builtin function that is called without the
14833    appropriate target options being set.  */
14834
14835 static void
14836 rs6000_invalid_builtin (enum rs6000_builtins fncode)
14837 {
14838   size_t uns_fncode = (size_t) fncode;
14839   const char *name = rs6000_builtin_info[uns_fncode].name;
14840   HOST_WIDE_INT fnmask = rs6000_builtin_info[uns_fncode].mask;
14841
14842   gcc_assert (name != NULL);
14843   if ((fnmask & RS6000_BTM_CELL) != 0)
14844     error ("builtin function %qs is only valid for the cell processor", name);
14845   else if ((fnmask & RS6000_BTM_VSX) != 0)
14846     error ("builtin function %qs requires the %qs option", name, "-mvsx");
14847   else if ((fnmask & RS6000_BTM_HTM) != 0)
14848     error ("builtin function %qs requires the %qs option", name, "-mhtm");
14849   else if ((fnmask & RS6000_BTM_ALTIVEC) != 0)
14850     error ("builtin function %qs requires the %qs option", name, "-maltivec");
14851   else if ((fnmask & (RS6000_BTM_DFP | RS6000_BTM_P8_VECTOR))
14852            == (RS6000_BTM_DFP | RS6000_BTM_P8_VECTOR))
14853     error ("builtin function %qs requires the %qs and %qs options",
14854            name, "-mhard-dfp", "-mpower8-vector");
14855   else if ((fnmask & RS6000_BTM_DFP) != 0)
14856     error ("builtin function %qs requires the %qs option", name, "-mhard-dfp");
14857   else if ((fnmask & RS6000_BTM_P8_VECTOR) != 0)
14858     error ("builtin function %qs requires the %qs option", name,
14859            "-mpower8-vector");
14860   else if ((fnmask & (RS6000_BTM_P9_VECTOR | RS6000_BTM_64BIT))
14861            == (RS6000_BTM_P9_VECTOR | RS6000_BTM_64BIT))
14862     error ("builtin function %qs requires the %qs and %qs options",
14863            name, "-mcpu=power9", "-m64");
14864   else if ((fnmask & RS6000_BTM_P9_VECTOR) != 0)
14865     error ("builtin function %qs requires the %qs option", name,
14866            "-mcpu=power9");
14867   else if ((fnmask & (RS6000_BTM_P9_MISC | RS6000_BTM_64BIT))
14868            == (RS6000_BTM_P9_MISC | RS6000_BTM_64BIT))
14869     error ("builtin function %qs requires the %qs and %qs options",
14870            name, "-mcpu=power9", "-m64");
14871   else if ((fnmask & RS6000_BTM_P9_MISC) == RS6000_BTM_P9_MISC)
14872     error ("builtin function %qs requires the %qs option", name,
14873            "-mcpu=power9");
14874   else if ((fnmask & RS6000_BTM_LDBL128) == RS6000_BTM_LDBL128)
14875     {
14876       if (!TARGET_HARD_FLOAT)
14877         error ("builtin function %qs requires the %qs option", name,
14878                "-mhard-float");
14879       else
14880         error ("builtin function %qs requires the %qs option", name,
14881                TARGET_IEEEQUAD ? "-mabi=ibmlongdouble" : "-mlong-double-128");
14882     }
14883   else if ((fnmask & RS6000_BTM_HARD_FLOAT) != 0)
14884     error ("builtin function %qs requires the %qs option", name,
14885            "-mhard-float");
14886   else if ((fnmask & RS6000_BTM_FLOAT128_HW) != 0)
14887     error ("builtin function %qs requires ISA 3.0 IEEE 128-bit floating point",
14888            name);
14889   else if ((fnmask & RS6000_BTM_FLOAT128) != 0)
14890     error ("builtin function %qs requires the %qs option", name,
14891            "%<-mfloat128%>");
14892   else if ((fnmask & (RS6000_BTM_POPCNTD | RS6000_BTM_POWERPC64))
14893            == (RS6000_BTM_POPCNTD | RS6000_BTM_POWERPC64))
14894     error ("builtin function %qs requires the %qs (or newer), and "
14895            "%qs or %qs options",
14896            name, "-mcpu=power7", "-m64", "-mpowerpc64");
14897   else
14898     error ("builtin function %qs is not supported with the current options",
14899            name);
14900 }
14901
14902 /* Target hook for early folding of built-ins, shamelessly stolen
14903    from ia64.c.  */
14904
14905 static tree
14906 rs6000_fold_builtin (tree fndecl ATTRIBUTE_UNUSED,
14907                      int n_args ATTRIBUTE_UNUSED,
14908                      tree *args ATTRIBUTE_UNUSED,
14909                      bool ignore ATTRIBUTE_UNUSED)
14910 {
14911 #ifdef SUBTARGET_FOLD_BUILTIN
14912   return SUBTARGET_FOLD_BUILTIN (fndecl, n_args, args, ignore);
14913 #else
14914   return NULL_TREE;
14915 #endif
14916 }
14917
14918 /*  Helper function to sort out which built-ins may be valid without having
14919     a LHS.  */
14920 static bool
14921 rs6000_builtin_valid_without_lhs (enum rs6000_builtins fn_code)
14922 {
14923   switch (fn_code)
14924     {
14925     case ALTIVEC_BUILTIN_STVX_V16QI:
14926     case ALTIVEC_BUILTIN_STVX_V8HI:
14927     case ALTIVEC_BUILTIN_STVX_V4SI:
14928     case ALTIVEC_BUILTIN_STVX_V4SF:
14929     case ALTIVEC_BUILTIN_STVX_V2DI:
14930     case ALTIVEC_BUILTIN_STVX_V2DF:
14931     case VSX_BUILTIN_STXVW4X_V16QI:
14932     case VSX_BUILTIN_STXVW4X_V8HI:
14933     case VSX_BUILTIN_STXVW4X_V4SF:
14934     case VSX_BUILTIN_STXVW4X_V4SI:
14935     case VSX_BUILTIN_STXVD2X_V2DF:
14936     case VSX_BUILTIN_STXVD2X_V2DI:
14937       return true;
14938     default:
14939       return false;
14940     }
14941 }
14942
14943 /* Helper function to handle the gimple folding of a vector compare
14944    operation.  This sets up true/false vectors, and uses the
14945    VEC_COND_EXPR operation.
14946    CODE indicates which comparison is to be made. (EQ, GT, ...).
14947    TYPE indicates the type of the result.  */
14948 static tree
14949 fold_build_vec_cmp (tree_code code, tree type,
14950                     tree arg0, tree arg1)
14951 {
14952   tree cmp_type = build_same_sized_truth_vector_type (type);
14953   tree zero_vec = build_zero_cst (type);
14954   tree minus_one_vec = build_minus_one_cst (type);
14955   tree cmp = fold_build2 (code, cmp_type, arg0, arg1);
14956   return fold_build3 (VEC_COND_EXPR, type, cmp, minus_one_vec, zero_vec);
14957 }
14958
14959 /* Helper function to handle the in-between steps for the
14960    vector compare built-ins.  */
14961 static void
14962 fold_compare_helper (gimple_stmt_iterator *gsi, tree_code code, gimple *stmt)
14963 {
14964   tree arg0 = gimple_call_arg (stmt, 0);
14965   tree arg1 = gimple_call_arg (stmt, 1);
14966   tree lhs = gimple_call_lhs (stmt);
14967   tree cmp = fold_build_vec_cmp (code, TREE_TYPE (lhs), arg0, arg1);
14968   gimple *g = gimple_build_assign (lhs, cmp);
14969   gimple_set_location (g, gimple_location (stmt));
14970   gsi_replace (gsi, g, true);
14971 }
14972
14973 /* Helper function to map V2DF and V4SF types to their
14974  integral equivalents (V2DI and V4SI).  */
14975 tree map_to_integral_tree_type (tree input_tree_type)
14976 {
14977   if (INTEGRAL_TYPE_P (TREE_TYPE (input_tree_type)))
14978     return input_tree_type;
14979   else
14980     {
14981       if (types_compatible_p (TREE_TYPE (input_tree_type),
14982                               TREE_TYPE (V2DF_type_node)))
14983         return V2DI_type_node;
14984       else if (types_compatible_p (TREE_TYPE (input_tree_type),
14985                                    TREE_TYPE (V4SF_type_node)))
14986         return V4SI_type_node;
14987       else
14988         gcc_unreachable ();
14989     }
14990 }
14991
14992 /* Helper function to handle the vector merge[hl] built-ins.  The
14993    implementation difference between h and l versions for this code are in
14994    the values used when building of the permute vector for high word versus
14995    low word merge.  The variance is keyed off the use_high parameter.  */
14996 static void
14997 fold_mergehl_helper (gimple_stmt_iterator *gsi, gimple *stmt, int use_high)
14998 {
14999   tree arg0 = gimple_call_arg (stmt, 0);
15000   tree arg1 = gimple_call_arg (stmt, 1);
15001   tree lhs = gimple_call_lhs (stmt);
15002   tree lhs_type = TREE_TYPE (lhs);
15003   int n_elts = TYPE_VECTOR_SUBPARTS (lhs_type);
15004   int midpoint = n_elts / 2;
15005   int offset = 0;
15006
15007   if (use_high == 1)
15008     offset = midpoint;
15009
15010   /* The permute_type will match the lhs for integral types.  For double and
15011      float types, the permute type needs to map to the V2 or V4 type that
15012      matches size.  */
15013   tree permute_type;
15014   permute_type = map_to_integral_tree_type (lhs_type);
15015   tree_vector_builder elts (permute_type, VECTOR_CST_NELTS (arg0), 1);
15016
15017   for (int i = 0; i < midpoint; i++)
15018     {
15019       elts.safe_push (build_int_cst (TREE_TYPE (permute_type),
15020                                      offset + i));
15021       elts.safe_push (build_int_cst (TREE_TYPE (permute_type),
15022                                      offset + n_elts + i));
15023     }
15024
15025   tree permute = elts.build ();
15026
15027   gimple *g = gimple_build_assign (lhs, VEC_PERM_EXPR, arg0, arg1, permute);
15028   gimple_set_location (g, gimple_location (stmt));
15029   gsi_replace (gsi, g, true);
15030 }
15031
15032 /* Helper function to handle the vector merge[eo] built-ins.  */
15033 static void
15034 fold_mergeeo_helper (gimple_stmt_iterator *gsi, gimple *stmt, int use_odd)
15035 {
15036   tree arg0 = gimple_call_arg (stmt, 0);
15037   tree arg1 = gimple_call_arg (stmt, 1);
15038   tree lhs = gimple_call_lhs (stmt);
15039   tree lhs_type = TREE_TYPE (lhs);
15040   int n_elts = TYPE_VECTOR_SUBPARTS (lhs_type);
15041
15042   /* The permute_type will match the lhs for integral types.  For double and
15043      float types, the permute type needs to map to the V2 or V4 type that
15044      matches size.  */
15045   tree permute_type;
15046   permute_type = map_to_integral_tree_type (lhs_type);
15047
15048   tree_vector_builder elts (permute_type, VECTOR_CST_NELTS (arg0), 1);
15049
15050  /* Build the permute vector.  */
15051   for (int i = 0; i < n_elts / 2; i++)
15052     {
15053       elts.safe_push (build_int_cst (TREE_TYPE (permute_type),
15054                                      2*i + use_odd));
15055       elts.safe_push (build_int_cst (TREE_TYPE (permute_type),
15056                                      2*i + use_odd + n_elts));
15057     }
15058
15059   tree permute = elts.build ();
15060
15061   gimple *g = gimple_build_assign (lhs, VEC_PERM_EXPR, arg0, arg1, permute);
15062   gimple_set_location (g, gimple_location (stmt));
15063   gsi_replace (gsi, g, true);
15064 }
15065
15066 /* Fold a machine-dependent built-in in GIMPLE.  (For folding into
15067    a constant, use rs6000_fold_builtin.)  */
15068
15069 bool
15070 rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi)
15071 {
15072   gimple *stmt = gsi_stmt (*gsi);
15073   tree fndecl = gimple_call_fndecl (stmt);
15074   gcc_checking_assert (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD);
15075   enum rs6000_builtins fn_code
15076     = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
15077   tree arg0, arg1, lhs, temp;
15078   enum tree_code bcode;
15079   gimple *g;
15080
15081   size_t uns_fncode = (size_t) fn_code;
15082   enum insn_code icode = rs6000_builtin_info[uns_fncode].icode;
15083   const char *fn_name1 = rs6000_builtin_info[uns_fncode].name;
15084   const char *fn_name2 = (icode != CODE_FOR_nothing)
15085                           ? get_insn_name ((int) icode)
15086                           : "nothing";
15087
15088   if (TARGET_DEBUG_BUILTIN)
15089       fprintf (stderr, "rs6000_gimple_fold_builtin %d %s %s\n",
15090                fn_code, fn_name1, fn_name2);
15091
15092   if (!rs6000_fold_gimple)
15093     return false;
15094
15095   /* Prevent gimple folding for code that does not have a LHS, unless it is
15096      allowed per the rs6000_builtin_valid_without_lhs helper function.  */
15097   if (!gimple_call_lhs (stmt) && !rs6000_builtin_valid_without_lhs (fn_code))
15098     return false;
15099
15100   /* Don't fold invalid builtins, let rs6000_expand_builtin diagnose it.  */
15101   HOST_WIDE_INT mask = rs6000_builtin_info[uns_fncode].mask;
15102   bool func_valid_p = (rs6000_builtin_mask & mask) == mask;
15103   if (!func_valid_p)
15104     return false;
15105
15106   switch (fn_code)
15107     {
15108     /* Flavors of vec_add.  We deliberately don't expand
15109        P8V_BUILTIN_VADDUQM as it gets lowered from V1TImode to
15110        TImode, resulting in much poorer code generation.  */
15111     case ALTIVEC_BUILTIN_VADDUBM:
15112     case ALTIVEC_BUILTIN_VADDUHM:
15113     case ALTIVEC_BUILTIN_VADDUWM:
15114     case P8V_BUILTIN_VADDUDM:
15115     case ALTIVEC_BUILTIN_VADDFP:
15116     case VSX_BUILTIN_XVADDDP:
15117       bcode = PLUS_EXPR;
15118     do_binary:
15119       arg0 = gimple_call_arg (stmt, 0);
15120       arg1 = gimple_call_arg (stmt, 1);
15121       lhs = gimple_call_lhs (stmt);
15122       if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (lhs)))
15123           && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (TREE_TYPE (lhs))))
15124         {
15125           /* Ensure the binary operation is performed in a type
15126              that wraps if it is integral type.  */
15127           gimple_seq stmts = NULL;
15128           tree type = unsigned_type_for (TREE_TYPE (lhs));
15129           tree uarg0 = gimple_build (&stmts, VIEW_CONVERT_EXPR,
15130                                      type, arg0);
15131           tree uarg1 = gimple_build (&stmts, VIEW_CONVERT_EXPR,
15132                                      type, arg1);
15133           tree res = gimple_build (&stmts, gimple_location (stmt), bcode,
15134                                    type, uarg0, uarg1);
15135           gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15136           g = gimple_build_assign (lhs, VIEW_CONVERT_EXPR,
15137                                    build1 (VIEW_CONVERT_EXPR,
15138                                            TREE_TYPE (lhs), res));
15139           gsi_replace (gsi, g, true);
15140           return true;
15141         }
15142       g = gimple_build_assign (lhs, bcode, arg0, arg1);
15143       gimple_set_location (g, gimple_location (stmt));
15144       gsi_replace (gsi, g, true);
15145       return true;
15146     /* Flavors of vec_sub.  We deliberately don't expand
15147        P8V_BUILTIN_VSUBUQM. */
15148     case ALTIVEC_BUILTIN_VSUBUBM:
15149     case ALTIVEC_BUILTIN_VSUBUHM:
15150     case ALTIVEC_BUILTIN_VSUBUWM:
15151     case P8V_BUILTIN_VSUBUDM:
15152     case ALTIVEC_BUILTIN_VSUBFP:
15153     case VSX_BUILTIN_XVSUBDP:
15154       bcode = MINUS_EXPR;
15155       goto do_binary;
15156     case VSX_BUILTIN_XVMULSP:
15157     case VSX_BUILTIN_XVMULDP:
15158       arg0 = gimple_call_arg (stmt, 0);
15159       arg1 = gimple_call_arg (stmt, 1);
15160       lhs = gimple_call_lhs (stmt);
15161       g = gimple_build_assign (lhs, MULT_EXPR, arg0, arg1);
15162       gimple_set_location (g, gimple_location (stmt));
15163       gsi_replace (gsi, g, true);
15164       return true;
15165     /* Even element flavors of vec_mul (signed). */
15166     case ALTIVEC_BUILTIN_VMULESB:
15167     case ALTIVEC_BUILTIN_VMULESH:
15168     case P8V_BUILTIN_VMULESW:
15169     /* Even element flavors of vec_mul (unsigned).  */
15170     case ALTIVEC_BUILTIN_VMULEUB:
15171     case ALTIVEC_BUILTIN_VMULEUH:
15172     case P8V_BUILTIN_VMULEUW:
15173       arg0 = gimple_call_arg (stmt, 0);
15174       arg1 = gimple_call_arg (stmt, 1);
15175       lhs = gimple_call_lhs (stmt);
15176       g = gimple_build_assign (lhs, VEC_WIDEN_MULT_EVEN_EXPR, arg0, arg1);
15177       gimple_set_location (g, gimple_location (stmt));
15178       gsi_replace (gsi, g, true);
15179       return true;
15180     /* Odd element flavors of vec_mul (signed).  */
15181     case ALTIVEC_BUILTIN_VMULOSB:
15182     case ALTIVEC_BUILTIN_VMULOSH:
15183     case P8V_BUILTIN_VMULOSW:
15184     /* Odd element flavors of vec_mul (unsigned). */
15185     case ALTIVEC_BUILTIN_VMULOUB:
15186     case ALTIVEC_BUILTIN_VMULOUH:
15187     case P8V_BUILTIN_VMULOUW:
15188       arg0 = gimple_call_arg (stmt, 0);
15189       arg1 = gimple_call_arg (stmt, 1);
15190       lhs = gimple_call_lhs (stmt);
15191       g = gimple_build_assign (lhs, VEC_WIDEN_MULT_ODD_EXPR, arg0, arg1);
15192       gimple_set_location (g, gimple_location (stmt));
15193       gsi_replace (gsi, g, true);
15194       return true;
15195     /* Flavors of vec_div (Integer).  */
15196     case VSX_BUILTIN_DIV_V2DI:
15197     case VSX_BUILTIN_UDIV_V2DI:
15198       arg0 = gimple_call_arg (stmt, 0);
15199       arg1 = gimple_call_arg (stmt, 1);
15200       lhs = gimple_call_lhs (stmt);
15201       g = gimple_build_assign (lhs, TRUNC_DIV_EXPR, arg0, arg1);
15202       gimple_set_location (g, gimple_location (stmt));
15203       gsi_replace (gsi, g, true);
15204       return true;
15205     /* Flavors of vec_div (Float).  */
15206     case VSX_BUILTIN_XVDIVSP:
15207     case VSX_BUILTIN_XVDIVDP:
15208       arg0 = gimple_call_arg (stmt, 0);
15209       arg1 = gimple_call_arg (stmt, 1);
15210       lhs = gimple_call_lhs (stmt);
15211       g = gimple_build_assign (lhs, RDIV_EXPR, arg0, arg1);
15212       gimple_set_location (g, gimple_location (stmt));
15213       gsi_replace (gsi, g, true);
15214       return true;
15215     /* Flavors of vec_and.  */
15216     case ALTIVEC_BUILTIN_VAND:
15217       arg0 = gimple_call_arg (stmt, 0);
15218       arg1 = gimple_call_arg (stmt, 1);
15219       lhs = gimple_call_lhs (stmt);
15220       g = gimple_build_assign (lhs, BIT_AND_EXPR, arg0, arg1);
15221       gimple_set_location (g, gimple_location (stmt));
15222       gsi_replace (gsi, g, true);
15223       return true;
15224     /* Flavors of vec_andc.  */
15225     case ALTIVEC_BUILTIN_VANDC:
15226       arg0 = gimple_call_arg (stmt, 0);
15227       arg1 = gimple_call_arg (stmt, 1);
15228       lhs = gimple_call_lhs (stmt);
15229       temp = create_tmp_reg_or_ssa_name (TREE_TYPE (arg1));
15230       g = gimple_build_assign (temp, BIT_NOT_EXPR, arg1);
15231       gimple_set_location (g, gimple_location (stmt));
15232       gsi_insert_before (gsi, g, GSI_SAME_STMT);
15233       g = gimple_build_assign (lhs, BIT_AND_EXPR, arg0, temp);
15234       gimple_set_location (g, gimple_location (stmt));
15235       gsi_replace (gsi, g, true);
15236       return true;
15237     /* Flavors of vec_nand.  */
15238     case P8V_BUILTIN_VEC_NAND:
15239     case P8V_BUILTIN_NAND_V16QI:
15240     case P8V_BUILTIN_NAND_V8HI:
15241     case P8V_BUILTIN_NAND_V4SI:
15242     case P8V_BUILTIN_NAND_V4SF:
15243     case P8V_BUILTIN_NAND_V2DF:
15244     case P8V_BUILTIN_NAND_V2DI:
15245       arg0 = gimple_call_arg (stmt, 0);
15246       arg1 = gimple_call_arg (stmt, 1);
15247       lhs = gimple_call_lhs (stmt);
15248       temp = create_tmp_reg_or_ssa_name (TREE_TYPE (arg1));
15249       g = gimple_build_assign (temp, BIT_AND_EXPR, arg0, arg1);
15250       gimple_set_location (g, gimple_location (stmt));
15251       gsi_insert_before (gsi, g, GSI_SAME_STMT);
15252       g = gimple_build_assign (lhs, BIT_NOT_EXPR, temp);
15253       gimple_set_location (g, gimple_location (stmt));
15254       gsi_replace (gsi, g, true);
15255       return true;
15256     /* Flavors of vec_or.  */
15257     case ALTIVEC_BUILTIN_VOR:
15258       arg0 = gimple_call_arg (stmt, 0);
15259       arg1 = gimple_call_arg (stmt, 1);
15260       lhs = gimple_call_lhs (stmt);
15261       g = gimple_build_assign (lhs, BIT_IOR_EXPR, arg0, arg1);
15262       gimple_set_location (g, gimple_location (stmt));
15263       gsi_replace (gsi, g, true);
15264       return true;
15265     /* flavors of vec_orc.  */
15266     case P8V_BUILTIN_ORC_V16QI:
15267     case P8V_BUILTIN_ORC_V8HI:
15268     case P8V_BUILTIN_ORC_V4SI:
15269     case P8V_BUILTIN_ORC_V4SF:
15270     case P8V_BUILTIN_ORC_V2DF:
15271     case P8V_BUILTIN_ORC_V2DI:
15272       arg0 = gimple_call_arg (stmt, 0);
15273       arg1 = gimple_call_arg (stmt, 1);
15274       lhs = gimple_call_lhs (stmt);
15275       temp = create_tmp_reg_or_ssa_name (TREE_TYPE (arg1));
15276       g = gimple_build_assign (temp, BIT_NOT_EXPR, arg1);
15277       gimple_set_location (g, gimple_location (stmt));
15278       gsi_insert_before (gsi, g, GSI_SAME_STMT);
15279       g = gimple_build_assign (lhs, BIT_IOR_EXPR, arg0, temp);
15280       gimple_set_location (g, gimple_location (stmt));
15281       gsi_replace (gsi, g, true);
15282       return true;
15283     /* Flavors of vec_xor.  */
15284     case ALTIVEC_BUILTIN_VXOR:
15285       arg0 = gimple_call_arg (stmt, 0);
15286       arg1 = gimple_call_arg (stmt, 1);
15287       lhs = gimple_call_lhs (stmt);
15288       g = gimple_build_assign (lhs, BIT_XOR_EXPR, arg0, arg1);
15289       gimple_set_location (g, gimple_location (stmt));
15290       gsi_replace (gsi, g, true);
15291       return true;
15292     /* Flavors of vec_nor.  */
15293     case ALTIVEC_BUILTIN_VNOR:
15294       arg0 = gimple_call_arg (stmt, 0);
15295       arg1 = gimple_call_arg (stmt, 1);
15296       lhs = gimple_call_lhs (stmt);
15297       temp = create_tmp_reg_or_ssa_name (TREE_TYPE (arg1));
15298       g = gimple_build_assign (temp, BIT_IOR_EXPR, arg0, arg1);
15299       gimple_set_location (g, gimple_location (stmt));
15300       gsi_insert_before (gsi, g, GSI_SAME_STMT);
15301       g = gimple_build_assign (lhs, BIT_NOT_EXPR, temp);
15302       gimple_set_location (g, gimple_location (stmt));
15303       gsi_replace (gsi, g, true);
15304       return true;
15305     /* flavors of vec_abs.  */
15306     case ALTIVEC_BUILTIN_ABS_V16QI:
15307     case ALTIVEC_BUILTIN_ABS_V8HI:
15308     case ALTIVEC_BUILTIN_ABS_V4SI:
15309     case ALTIVEC_BUILTIN_ABS_V4SF:
15310     case P8V_BUILTIN_ABS_V2DI:
15311     case VSX_BUILTIN_XVABSDP:
15312       arg0 = gimple_call_arg (stmt, 0);
15313       if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (arg0)))
15314           && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (TREE_TYPE (arg0))))
15315         return false;
15316       lhs = gimple_call_lhs (stmt);
15317       g = gimple_build_assign (lhs, ABS_EXPR, arg0);
15318       gimple_set_location (g, gimple_location (stmt));
15319       gsi_replace (gsi, g, true);
15320       return true;
15321     /* flavors of vec_min.  */
15322     case VSX_BUILTIN_XVMINDP:
15323     case P8V_BUILTIN_VMINSD:
15324     case P8V_BUILTIN_VMINUD:
15325     case ALTIVEC_BUILTIN_VMINSB:
15326     case ALTIVEC_BUILTIN_VMINSH:
15327     case ALTIVEC_BUILTIN_VMINSW:
15328     case ALTIVEC_BUILTIN_VMINUB:
15329     case ALTIVEC_BUILTIN_VMINUH:
15330     case ALTIVEC_BUILTIN_VMINUW:
15331     case ALTIVEC_BUILTIN_VMINFP:
15332       arg0 = gimple_call_arg (stmt, 0);
15333       arg1 = gimple_call_arg (stmt, 1);
15334       lhs = gimple_call_lhs (stmt);
15335       g = gimple_build_assign (lhs, MIN_EXPR, arg0, arg1);
15336       gimple_set_location (g, gimple_location (stmt));
15337       gsi_replace (gsi, g, true);
15338       return true;
15339     /* flavors of vec_max.  */
15340     case VSX_BUILTIN_XVMAXDP:
15341     case P8V_BUILTIN_VMAXSD:
15342     case P8V_BUILTIN_VMAXUD:
15343     case ALTIVEC_BUILTIN_VMAXSB:
15344     case ALTIVEC_BUILTIN_VMAXSH:
15345     case ALTIVEC_BUILTIN_VMAXSW:
15346     case ALTIVEC_BUILTIN_VMAXUB:
15347     case ALTIVEC_BUILTIN_VMAXUH:
15348     case ALTIVEC_BUILTIN_VMAXUW:
15349     case ALTIVEC_BUILTIN_VMAXFP:
15350       arg0 = gimple_call_arg (stmt, 0);
15351       arg1 = gimple_call_arg (stmt, 1);
15352       lhs = gimple_call_lhs (stmt);
15353       g = gimple_build_assign (lhs, MAX_EXPR, arg0, arg1);
15354       gimple_set_location (g, gimple_location (stmt));
15355       gsi_replace (gsi, g, true);
15356       return true;
15357     /* Flavors of vec_eqv.  */
15358     case P8V_BUILTIN_EQV_V16QI:
15359     case P8V_BUILTIN_EQV_V8HI:
15360     case P8V_BUILTIN_EQV_V4SI:
15361     case P8V_BUILTIN_EQV_V4SF:
15362     case P8V_BUILTIN_EQV_V2DF:
15363     case P8V_BUILTIN_EQV_V2DI:
15364       arg0 = gimple_call_arg (stmt, 0);
15365       arg1 = gimple_call_arg (stmt, 1);
15366       lhs = gimple_call_lhs (stmt);
15367       temp = create_tmp_reg_or_ssa_name (TREE_TYPE (arg1));
15368       g = gimple_build_assign (temp, BIT_XOR_EXPR, arg0, arg1);
15369       gimple_set_location (g, gimple_location (stmt));
15370       gsi_insert_before (gsi, g, GSI_SAME_STMT);
15371       g = gimple_build_assign (lhs, BIT_NOT_EXPR, temp);
15372       gimple_set_location (g, gimple_location (stmt));
15373       gsi_replace (gsi, g, true);
15374       return true;
15375     /* Flavors of vec_rotate_left.  */
15376     case ALTIVEC_BUILTIN_VRLB:
15377     case ALTIVEC_BUILTIN_VRLH:
15378     case ALTIVEC_BUILTIN_VRLW:
15379     case P8V_BUILTIN_VRLD:
15380       arg0 = gimple_call_arg (stmt, 0);
15381       arg1 = gimple_call_arg (stmt, 1);
15382       lhs = gimple_call_lhs (stmt);
15383       g = gimple_build_assign (lhs, LROTATE_EXPR, arg0, arg1);
15384       gimple_set_location (g, gimple_location (stmt));
15385       gsi_replace (gsi, g, true);
15386       return true;
15387   /* Flavors of vector shift right algebraic.
15388      vec_sra{b,h,w} -> vsra{b,h,w}.  */
15389     case ALTIVEC_BUILTIN_VSRAB:
15390     case ALTIVEC_BUILTIN_VSRAH:
15391     case ALTIVEC_BUILTIN_VSRAW:
15392     case P8V_BUILTIN_VSRAD:
15393       {
15394         arg0 = gimple_call_arg (stmt, 0);
15395         arg1 = gimple_call_arg (stmt, 1);
15396         lhs = gimple_call_lhs (stmt);
15397         tree arg1_type = TREE_TYPE (arg1);
15398         tree unsigned_arg1_type = unsigned_type_for (TREE_TYPE (arg1));
15399         tree unsigned_element_type = unsigned_type_for (TREE_TYPE (arg1_type));
15400         location_t loc = gimple_location (stmt);
15401         /* Force arg1 into the range valid matching the arg0 type.  */
15402         /* Build a vector consisting of the max valid bit-size values.  */
15403         int n_elts = VECTOR_CST_NELTS (arg1);
15404         tree element_size = build_int_cst (unsigned_element_type,
15405                                            128 / n_elts);
15406         tree_vector_builder elts (unsigned_arg1_type, n_elts, 1);
15407         for (int i = 0; i < n_elts; i++)
15408           elts.safe_push (element_size);
15409         tree modulo_tree = elts.build ();
15410         /* Modulo the provided shift value against that vector.  */
15411         gimple_seq stmts = NULL;
15412         tree unsigned_arg1 = gimple_build (&stmts, VIEW_CONVERT_EXPR,
15413                                            unsigned_arg1_type, arg1);
15414         tree new_arg1 = gimple_build (&stmts, loc, TRUNC_MOD_EXPR,
15415                                       unsigned_arg1_type, unsigned_arg1,
15416                                       modulo_tree);
15417         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15418         /* And finally, do the shift.  */
15419         g = gimple_build_assign (lhs, RSHIFT_EXPR, arg0, new_arg1);
15420         gimple_set_location (g, loc);
15421         gsi_replace (gsi, g, true);
15422         return true;
15423       }
15424    /* Flavors of vector shift left.
15425       builtin_altivec_vsl{b,h,w} -> vsl{b,h,w}.  */
15426     case ALTIVEC_BUILTIN_VSLB:
15427     case ALTIVEC_BUILTIN_VSLH:
15428     case ALTIVEC_BUILTIN_VSLW:
15429     case P8V_BUILTIN_VSLD:
15430       {
15431         location_t loc;
15432         gimple_seq stmts = NULL;
15433         arg0 = gimple_call_arg (stmt, 0);
15434         tree arg0_type = TREE_TYPE (arg0);
15435         if (INTEGRAL_TYPE_P (TREE_TYPE (arg0_type))
15436             && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0_type)))
15437           return false;
15438         arg1 = gimple_call_arg (stmt, 1);
15439         tree arg1_type = TREE_TYPE (arg1);
15440         tree unsigned_arg1_type = unsigned_type_for (TREE_TYPE (arg1));
15441         tree unsigned_element_type = unsigned_type_for (TREE_TYPE (arg1_type));
15442         loc = gimple_location (stmt);
15443         lhs = gimple_call_lhs (stmt);
15444         /* Force arg1 into the range valid matching the arg0 type.  */
15445         /* Build a vector consisting of the max valid bit-size values.  */
15446         int n_elts = VECTOR_CST_NELTS (arg1);
15447         int tree_size_in_bits = TREE_INT_CST_LOW (size_in_bytes (arg1_type))
15448                                 * BITS_PER_UNIT;
15449         tree element_size = build_int_cst (unsigned_element_type,
15450                                            tree_size_in_bits / n_elts);
15451         tree_vector_builder elts (unsigned_type_for (arg1_type), n_elts, 1);
15452         for (int i = 0; i < n_elts; i++)
15453           elts.safe_push (element_size);
15454         tree modulo_tree = elts.build ();
15455         /* Modulo the provided shift value against that vector.  */
15456         tree unsigned_arg1 = gimple_build (&stmts, VIEW_CONVERT_EXPR,
15457                                            unsigned_arg1_type, arg1);
15458         tree new_arg1 = gimple_build (&stmts, loc, TRUNC_MOD_EXPR,
15459                                       unsigned_arg1_type, unsigned_arg1,
15460                                       modulo_tree);
15461         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15462         /* And finally, do the shift.  */
15463         g = gimple_build_assign (lhs, LSHIFT_EXPR, arg0, new_arg1);
15464         gimple_set_location (g, gimple_location (stmt));
15465         gsi_replace (gsi, g, true);
15466         return true;
15467       }
15468     /* Flavors of vector shift right.  */
15469     case ALTIVEC_BUILTIN_VSRB:
15470     case ALTIVEC_BUILTIN_VSRH:
15471     case ALTIVEC_BUILTIN_VSRW:
15472     case P8V_BUILTIN_VSRD:
15473       {
15474         arg0 = gimple_call_arg (stmt, 0);
15475         arg1 = gimple_call_arg (stmt, 1);
15476         lhs = gimple_call_lhs (stmt);
15477         tree arg1_type = TREE_TYPE (arg1);
15478         tree unsigned_arg1_type = unsigned_type_for (TREE_TYPE (arg1));
15479         tree unsigned_element_type = unsigned_type_for (TREE_TYPE (arg1_type));
15480         location_t loc = gimple_location (stmt);
15481         gimple_seq stmts = NULL;
15482         /* Convert arg0 to unsigned.  */
15483         tree arg0_unsigned
15484           = gimple_build (&stmts, VIEW_CONVERT_EXPR,
15485                           unsigned_type_for (TREE_TYPE (arg0)), arg0);
15486         /* Force arg1 into the range valid matching the arg0 type.  */
15487         /* Build a vector consisting of the max valid bit-size values.  */
15488         int n_elts = VECTOR_CST_NELTS (arg1);
15489         tree element_size = build_int_cst (unsigned_element_type,
15490                                            128 / n_elts);
15491         tree_vector_builder elts (unsigned_arg1_type, n_elts, 1);
15492         for (int i = 0; i < n_elts; i++)
15493           elts.safe_push (element_size);
15494         tree modulo_tree = elts.build ();
15495         /* Modulo the provided shift value against that vector.  */
15496         tree unsigned_arg1 = gimple_build (&stmts, VIEW_CONVERT_EXPR,
15497                                            unsigned_arg1_type, arg1);
15498         tree new_arg1 = gimple_build (&stmts, loc, TRUNC_MOD_EXPR,
15499                                       unsigned_arg1_type, unsigned_arg1,
15500                                       modulo_tree);
15501         /* Do the shift.  */
15502         tree res
15503           = gimple_build (&stmts, RSHIFT_EXPR,
15504                           TREE_TYPE (arg0_unsigned), arg0_unsigned, new_arg1);
15505         /* Convert result back to the lhs type.  */
15506         res = gimple_build (&stmts, VIEW_CONVERT_EXPR, TREE_TYPE (lhs), res);
15507         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15508         update_call_from_tree (gsi, res);
15509         return true;
15510       }
15511     /* Vector loads.  */
15512     case ALTIVEC_BUILTIN_LVX_V16QI:
15513     case ALTIVEC_BUILTIN_LVX_V8HI:
15514     case ALTIVEC_BUILTIN_LVX_V4SI:
15515     case ALTIVEC_BUILTIN_LVX_V4SF:
15516     case ALTIVEC_BUILTIN_LVX_V2DI:
15517     case ALTIVEC_BUILTIN_LVX_V2DF:
15518     case ALTIVEC_BUILTIN_LVX_V1TI:
15519       {
15520         arg0 = gimple_call_arg (stmt, 0);  // offset
15521         arg1 = gimple_call_arg (stmt, 1);  // address
15522         lhs = gimple_call_lhs (stmt);
15523         location_t loc = gimple_location (stmt);
15524         /* Since arg1 may be cast to a different type, just use ptr_type_node
15525            here instead of trying to enforce TBAA on pointer types.  */
15526         tree arg1_type = ptr_type_node;
15527         tree lhs_type = TREE_TYPE (lhs);
15528         /* POINTER_PLUS_EXPR wants the offset to be of type 'sizetype'.  Create
15529            the tree using the value from arg0.  The resulting type will match
15530            the type of arg1.  */
15531         gimple_seq stmts = NULL;
15532         tree temp_offset = gimple_convert (&stmts, loc, sizetype, arg0);
15533         tree temp_addr = gimple_build (&stmts, loc, POINTER_PLUS_EXPR,
15534                                        arg1_type, arg1, temp_offset);
15535         /* Mask off any lower bits from the address.  */
15536         tree aligned_addr = gimple_build (&stmts, loc, BIT_AND_EXPR,
15537                                           arg1_type, temp_addr,
15538                                           build_int_cst (arg1_type, -16));
15539         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15540         if (!is_gimple_mem_ref_addr (aligned_addr))
15541           {
15542             tree t = make_ssa_name (TREE_TYPE (aligned_addr));
15543             gimple *g = gimple_build_assign (t, aligned_addr);
15544             gsi_insert_before (gsi, g, GSI_SAME_STMT);
15545             aligned_addr = t;
15546           }
15547         /* Use the build2 helper to set up the mem_ref.  The MEM_REF could also
15548            take an offset, but since we've already incorporated the offset
15549            above, here we just pass in a zero.  */
15550         gimple *g
15551           = gimple_build_assign (lhs, build2 (MEM_REF, lhs_type, aligned_addr,
15552                                               build_int_cst (arg1_type, 0)));
15553         gimple_set_location (g, loc);
15554         gsi_replace (gsi, g, true);
15555         return true;
15556       }
15557     /* Vector stores.  */
15558     case ALTIVEC_BUILTIN_STVX_V16QI:
15559     case ALTIVEC_BUILTIN_STVX_V8HI:
15560     case ALTIVEC_BUILTIN_STVX_V4SI:
15561     case ALTIVEC_BUILTIN_STVX_V4SF:
15562     case ALTIVEC_BUILTIN_STVX_V2DI:
15563     case ALTIVEC_BUILTIN_STVX_V2DF:
15564       {
15565         arg0 = gimple_call_arg (stmt, 0); /* Value to be stored.  */
15566         arg1 = gimple_call_arg (stmt, 1); /* Offset.  */
15567         tree arg2 = gimple_call_arg (stmt, 2); /* Store-to address.  */
15568         location_t loc = gimple_location (stmt);
15569         tree arg0_type = TREE_TYPE (arg0);
15570         /* Use ptr_type_node (no TBAA) for the arg2_type.
15571            FIXME: (Richard)  "A proper fix would be to transition this type as
15572            seen from the frontend to GIMPLE, for example in a similar way we
15573            do for MEM_REFs by piggy-backing that on an extra argument, a
15574            constant zero pointer of the alias pointer type to use (which would
15575            also serve as a type indicator of the store itself).  I'd use a
15576            target specific internal function for this (not sure if we can have
15577            those target specific, but I guess if it's folded away then that's
15578            fine) and get away with the overload set."  */
15579         tree arg2_type = ptr_type_node;
15580         /* POINTER_PLUS_EXPR wants the offset to be of type 'sizetype'.  Create
15581            the tree using the value from arg0.  The resulting type will match
15582            the type of arg2.  */
15583         gimple_seq stmts = NULL;
15584         tree temp_offset = gimple_convert (&stmts, loc, sizetype, arg1);
15585         tree temp_addr = gimple_build (&stmts, loc, POINTER_PLUS_EXPR,
15586                                        arg2_type, arg2, temp_offset);
15587         /* Mask off any lower bits from the address.  */
15588         tree aligned_addr = gimple_build (&stmts, loc, BIT_AND_EXPR,
15589                                           arg2_type, temp_addr,
15590                                           build_int_cst (arg2_type, -16));
15591         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15592         if (!is_gimple_mem_ref_addr (aligned_addr))
15593           {
15594             tree t = make_ssa_name (TREE_TYPE (aligned_addr));
15595             gimple *g = gimple_build_assign (t, aligned_addr);
15596             gsi_insert_before (gsi, g, GSI_SAME_STMT);
15597             aligned_addr = t;
15598           }
15599         /* The desired gimple result should be similar to:
15600            MEM[(__vector floatD.1407 *)_1] = vf1D.2697;  */
15601         gimple *g
15602           = gimple_build_assign (build2 (MEM_REF, arg0_type, aligned_addr,
15603                                          build_int_cst (arg2_type, 0)), arg0);
15604         gimple_set_location (g, loc);
15605         gsi_replace (gsi, g, true);
15606         return true;
15607       }
15608
15609     /* unaligned Vector loads.  */
15610     case VSX_BUILTIN_LXVW4X_V16QI:
15611     case VSX_BUILTIN_LXVW4X_V8HI:
15612     case VSX_BUILTIN_LXVW4X_V4SF:
15613     case VSX_BUILTIN_LXVW4X_V4SI:
15614     case VSX_BUILTIN_LXVD2X_V2DF:
15615     case VSX_BUILTIN_LXVD2X_V2DI:
15616       {
15617         arg0 = gimple_call_arg (stmt, 0);  // offset
15618         arg1 = gimple_call_arg (stmt, 1);  // address
15619         lhs = gimple_call_lhs (stmt);
15620         location_t loc = gimple_location (stmt);
15621         /* Since arg1 may be cast to a different type, just use ptr_type_node
15622            here instead of trying to enforce TBAA on pointer types.  */
15623         tree arg1_type = ptr_type_node;
15624         tree lhs_type = TREE_TYPE (lhs);
15625         /* In GIMPLE the type of the MEM_REF specifies the alignment.  The
15626           required alignment (power) is 4 bytes regardless of data type.  */
15627         tree align_ltype = build_aligned_type (lhs_type, 4);
15628         /* POINTER_PLUS_EXPR wants the offset to be of type 'sizetype'.  Create
15629            the tree using the value from arg0.  The resulting type will match
15630            the type of arg1.  */
15631         gimple_seq stmts = NULL;
15632         tree temp_offset = gimple_convert (&stmts, loc, sizetype, arg0);
15633         tree temp_addr = gimple_build (&stmts, loc, POINTER_PLUS_EXPR,
15634                                        arg1_type, arg1, temp_offset);
15635         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15636         if (!is_gimple_mem_ref_addr (temp_addr))
15637           {
15638             tree t = make_ssa_name (TREE_TYPE (temp_addr));
15639             gimple *g = gimple_build_assign (t, temp_addr);
15640             gsi_insert_before (gsi, g, GSI_SAME_STMT);
15641             temp_addr = t;
15642           }
15643         /* Use the build2 helper to set up the mem_ref.  The MEM_REF could also
15644            take an offset, but since we've already incorporated the offset
15645            above, here we just pass in a zero.  */
15646         gimple *g;
15647         g = gimple_build_assign (lhs, build2 (MEM_REF, align_ltype, temp_addr,
15648                                               build_int_cst (arg1_type, 0)));
15649         gimple_set_location (g, loc);
15650         gsi_replace (gsi, g, true);
15651         return true;
15652       }
15653
15654     /* unaligned Vector stores.  */
15655     case VSX_BUILTIN_STXVW4X_V16QI:
15656     case VSX_BUILTIN_STXVW4X_V8HI:
15657     case VSX_BUILTIN_STXVW4X_V4SF:
15658     case VSX_BUILTIN_STXVW4X_V4SI:
15659     case VSX_BUILTIN_STXVD2X_V2DF:
15660     case VSX_BUILTIN_STXVD2X_V2DI:
15661       {
15662         arg0 = gimple_call_arg (stmt, 0); /* Value to be stored.  */
15663         arg1 = gimple_call_arg (stmt, 1); /* Offset.  */
15664         tree arg2 = gimple_call_arg (stmt, 2); /* Store-to address.  */
15665         location_t loc = gimple_location (stmt);
15666         tree arg0_type = TREE_TYPE (arg0);
15667         /* Use ptr_type_node (no TBAA) for the arg2_type.  */
15668         tree arg2_type = ptr_type_node;
15669         /* In GIMPLE the type of the MEM_REF specifies the alignment.  The
15670            required alignment (power) is 4 bytes regardless of data type.  */
15671         tree align_stype = build_aligned_type (arg0_type, 4);
15672         /* POINTER_PLUS_EXPR wants the offset to be of type 'sizetype'.  Create
15673            the tree using the value from arg1.  */
15674         gimple_seq stmts = NULL;
15675         tree temp_offset = gimple_convert (&stmts, loc, sizetype, arg1);
15676         tree temp_addr = gimple_build (&stmts, loc, POINTER_PLUS_EXPR,
15677                                        arg2_type, arg2, temp_offset);
15678         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15679         if (!is_gimple_mem_ref_addr (temp_addr))
15680           {
15681             tree t = make_ssa_name (TREE_TYPE (temp_addr));
15682             gimple *g = gimple_build_assign (t, temp_addr);
15683             gsi_insert_before (gsi, g, GSI_SAME_STMT);
15684             temp_addr = t;
15685           }
15686         gimple *g;
15687         g = gimple_build_assign (build2 (MEM_REF, align_stype, temp_addr,
15688                                          build_int_cst (arg2_type, 0)), arg0);
15689         gimple_set_location (g, loc);
15690         gsi_replace (gsi, g, true);
15691         return true;
15692       }
15693
15694     /* Vector Fused multiply-add (fma).  */
15695     case ALTIVEC_BUILTIN_VMADDFP:
15696     case VSX_BUILTIN_XVMADDDP:
15697     case ALTIVEC_BUILTIN_VMLADDUHM:
15698       {
15699         arg0 = gimple_call_arg (stmt, 0);
15700         arg1 = gimple_call_arg (stmt, 1);
15701         tree arg2 = gimple_call_arg (stmt, 2);
15702         lhs = gimple_call_lhs (stmt);
15703         gcall *g = gimple_build_call_internal (IFN_FMA, 3, arg0, arg1, arg2);
15704         gimple_call_set_lhs (g, lhs);
15705         gimple_call_set_nothrow (g, true);
15706         gimple_set_location (g, gimple_location (stmt));
15707         gsi_replace (gsi, g, true);
15708         return true;
15709       }
15710
15711     /* Vector compares; EQ, NE, GE, GT, LE.  */
15712     case ALTIVEC_BUILTIN_VCMPEQUB:
15713     case ALTIVEC_BUILTIN_VCMPEQUH:
15714     case ALTIVEC_BUILTIN_VCMPEQUW:
15715     case P8V_BUILTIN_VCMPEQUD:
15716       fold_compare_helper (gsi, EQ_EXPR, stmt);
15717       return true;
15718
15719     case P9V_BUILTIN_CMPNEB:
15720     case P9V_BUILTIN_CMPNEH:
15721     case P9V_BUILTIN_CMPNEW:
15722       fold_compare_helper (gsi, NE_EXPR, stmt);
15723       return true;
15724
15725     case VSX_BUILTIN_CMPGE_16QI:
15726     case VSX_BUILTIN_CMPGE_U16QI:
15727     case VSX_BUILTIN_CMPGE_8HI:
15728     case VSX_BUILTIN_CMPGE_U8HI:
15729     case VSX_BUILTIN_CMPGE_4SI:
15730     case VSX_BUILTIN_CMPGE_U4SI:
15731     case VSX_BUILTIN_CMPGE_2DI:
15732     case VSX_BUILTIN_CMPGE_U2DI:
15733       fold_compare_helper (gsi, GE_EXPR, stmt);
15734       return true;
15735
15736     case ALTIVEC_BUILTIN_VCMPGTSB:
15737     case ALTIVEC_BUILTIN_VCMPGTUB:
15738     case ALTIVEC_BUILTIN_VCMPGTSH:
15739     case ALTIVEC_BUILTIN_VCMPGTUH:
15740     case ALTIVEC_BUILTIN_VCMPGTSW:
15741     case ALTIVEC_BUILTIN_VCMPGTUW:
15742     case P8V_BUILTIN_VCMPGTUD:
15743     case P8V_BUILTIN_VCMPGTSD:
15744       fold_compare_helper (gsi, GT_EXPR, stmt);
15745       return true;
15746
15747     case VSX_BUILTIN_CMPLE_16QI:
15748     case VSX_BUILTIN_CMPLE_U16QI:
15749     case VSX_BUILTIN_CMPLE_8HI:
15750     case VSX_BUILTIN_CMPLE_U8HI:
15751     case VSX_BUILTIN_CMPLE_4SI:
15752     case VSX_BUILTIN_CMPLE_U4SI:
15753     case VSX_BUILTIN_CMPLE_2DI:
15754     case VSX_BUILTIN_CMPLE_U2DI:
15755       fold_compare_helper (gsi, LE_EXPR, stmt);
15756       return true;
15757
15758     /* flavors of vec_splat_[us]{8,16,32}.  */
15759     case ALTIVEC_BUILTIN_VSPLTISB:
15760     case ALTIVEC_BUILTIN_VSPLTISH:
15761     case ALTIVEC_BUILTIN_VSPLTISW:
15762       {
15763         arg0 = gimple_call_arg (stmt, 0);
15764         lhs = gimple_call_lhs (stmt);
15765
15766         /* Only fold the vec_splat_*() if the lower bits of arg 0 is a
15767            5-bit signed constant in range -16 to +15.  */
15768         if (TREE_CODE (arg0) != INTEGER_CST
15769             || !IN_RANGE (TREE_INT_CST_LOW (arg0), -16, 15))
15770           return false;
15771         gimple_seq stmts = NULL;
15772         location_t loc = gimple_location (stmt);
15773         tree splat_value = gimple_convert (&stmts, loc,
15774                                            TREE_TYPE (TREE_TYPE (lhs)), arg0);
15775         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15776         tree splat_tree = build_vector_from_val (TREE_TYPE (lhs), splat_value);
15777         g = gimple_build_assign (lhs, splat_tree);
15778         gimple_set_location (g, gimple_location (stmt));
15779         gsi_replace (gsi, g, true);
15780         return true;
15781       }
15782
15783     /* Flavors of vec_splat.  */
15784     /* a = vec_splat (b, 0x3) becomes a = { b[3],b[3],b[3],...};  */
15785     case ALTIVEC_BUILTIN_VSPLTB:
15786     case ALTIVEC_BUILTIN_VSPLTH:
15787     case ALTIVEC_BUILTIN_VSPLTW:
15788     case VSX_BUILTIN_XXSPLTD_V2DI:
15789     case VSX_BUILTIN_XXSPLTD_V2DF:
15790       {
15791         arg0 = gimple_call_arg (stmt, 0); /* input vector.  */
15792         arg1 = gimple_call_arg (stmt, 1); /* index into arg0.  */
15793         /* Only fold the vec_splat_*() if arg1 is both a constant value and
15794            is a valid index into the arg0 vector.  */
15795         unsigned int n_elts = VECTOR_CST_NELTS (arg0);
15796         if (TREE_CODE (arg1) != INTEGER_CST
15797             || TREE_INT_CST_LOW (arg1) > (n_elts -1))
15798           return false;
15799         lhs = gimple_call_lhs (stmt);
15800         tree lhs_type = TREE_TYPE (lhs);
15801         tree arg0_type = TREE_TYPE (arg0);
15802         tree splat;
15803         if (TREE_CODE (arg0) == VECTOR_CST)
15804           splat = VECTOR_CST_ELT (arg0, TREE_INT_CST_LOW (arg1));
15805         else
15806           {
15807             /* Determine (in bits) the length and start location of the
15808                splat value for a call to the tree_vec_extract helper.  */
15809             int splat_elem_size = TREE_INT_CST_LOW (size_in_bytes (arg0_type))
15810                                   * BITS_PER_UNIT / n_elts;
15811             int splat_start_bit = TREE_INT_CST_LOW (arg1) * splat_elem_size;
15812             tree len = build_int_cst (bitsizetype, splat_elem_size);
15813             tree start = build_int_cst (bitsizetype, splat_start_bit);
15814             splat = tree_vec_extract (gsi, TREE_TYPE (lhs_type), arg0,
15815                                       len, start);
15816           }
15817         /* And finally, build the new vector.  */
15818         tree splat_tree = build_vector_from_val (lhs_type, splat);
15819         g = gimple_build_assign (lhs, splat_tree);
15820         gimple_set_location (g, gimple_location (stmt));
15821         gsi_replace (gsi, g, true);
15822         return true;
15823       }
15824
15825     /* vec_mergel (integrals).  */
15826     case ALTIVEC_BUILTIN_VMRGLH:
15827     case ALTIVEC_BUILTIN_VMRGLW:
15828     case VSX_BUILTIN_XXMRGLW_4SI:
15829     case ALTIVEC_BUILTIN_VMRGLB:
15830     case VSX_BUILTIN_VEC_MERGEL_V2DI:
15831     case VSX_BUILTIN_XXMRGLW_4SF:
15832     case VSX_BUILTIN_VEC_MERGEL_V2DF:
15833       fold_mergehl_helper (gsi, stmt, 1);
15834       return true;
15835     /* vec_mergeh (integrals).  */
15836     case ALTIVEC_BUILTIN_VMRGHH:
15837     case ALTIVEC_BUILTIN_VMRGHW:
15838     case VSX_BUILTIN_XXMRGHW_4SI:
15839     case ALTIVEC_BUILTIN_VMRGHB:
15840     case VSX_BUILTIN_VEC_MERGEH_V2DI:
15841     case VSX_BUILTIN_XXMRGHW_4SF:
15842     case VSX_BUILTIN_VEC_MERGEH_V2DF:
15843       fold_mergehl_helper (gsi, stmt, 0);
15844       return true;
15845
15846     /* Flavors of vec_mergee.  */
15847     case P8V_BUILTIN_VMRGEW_V4SI:
15848     case P8V_BUILTIN_VMRGEW_V2DI:
15849     case P8V_BUILTIN_VMRGEW_V4SF:
15850     case P8V_BUILTIN_VMRGEW_V2DF:
15851       fold_mergeeo_helper (gsi, stmt, 0);
15852       return true;
15853     /* Flavors of vec_mergeo.  */
15854     case P8V_BUILTIN_VMRGOW_V4SI:
15855     case P8V_BUILTIN_VMRGOW_V2DI:
15856     case P8V_BUILTIN_VMRGOW_V4SF:
15857     case P8V_BUILTIN_VMRGOW_V2DF:
15858       fold_mergeeo_helper (gsi, stmt, 1);
15859       return true;
15860
15861     /* d = vec_pack (a, b) */
15862     case P8V_BUILTIN_VPKUDUM:
15863     case ALTIVEC_BUILTIN_VPKUHUM:
15864     case ALTIVEC_BUILTIN_VPKUWUM:
15865       {
15866         arg0 = gimple_call_arg (stmt, 0);
15867         arg1 = gimple_call_arg (stmt, 1);
15868         lhs = gimple_call_lhs (stmt);
15869         gimple *g = gimple_build_assign (lhs, VEC_PACK_TRUNC_EXPR, arg0, arg1);
15870         gimple_set_location (g, gimple_location (stmt));
15871         gsi_replace (gsi, g, true);
15872         return true;
15873       }
15874
15875     /* d = vec_unpackh (a) */
15876     /* Note that the UNPACK_{HI,LO}_EXPR used in the gimple_build_assign call
15877        in this code is sensitive to endian-ness, and needs to be inverted to
15878        handle both LE and BE targets.  */
15879     case ALTIVEC_BUILTIN_VUPKHSB:
15880     case ALTIVEC_BUILTIN_VUPKHSH:
15881     case P8V_BUILTIN_VUPKHSW:
15882       {
15883         arg0 = gimple_call_arg (stmt, 0);
15884         lhs = gimple_call_lhs (stmt);
15885         if (BYTES_BIG_ENDIAN)
15886           g = gimple_build_assign (lhs, VEC_UNPACK_HI_EXPR, arg0);
15887         else
15888           g = gimple_build_assign (lhs, VEC_UNPACK_LO_EXPR, arg0);
15889         gimple_set_location (g, gimple_location (stmt));
15890         gsi_replace (gsi, g, true);
15891         return true;
15892       }
15893     /* d = vec_unpackl (a) */
15894     case ALTIVEC_BUILTIN_VUPKLSB:
15895     case ALTIVEC_BUILTIN_VUPKLSH:
15896     case P8V_BUILTIN_VUPKLSW:
15897       {
15898         arg0 = gimple_call_arg (stmt, 0);
15899         lhs = gimple_call_lhs (stmt);
15900         if (BYTES_BIG_ENDIAN)
15901           g = gimple_build_assign (lhs, VEC_UNPACK_LO_EXPR, arg0);
15902         else
15903           g = gimple_build_assign (lhs, VEC_UNPACK_HI_EXPR, arg0);
15904         gimple_set_location (g, gimple_location (stmt));
15905         gsi_replace (gsi, g, true);
15906         return true;
15907       }
15908     /* There is no gimple type corresponding with pixel, so just return.  */
15909     case ALTIVEC_BUILTIN_VUPKHPX:
15910     case ALTIVEC_BUILTIN_VUPKLPX:
15911       return false;
15912
15913     /* vec_perm.  */
15914     case ALTIVEC_BUILTIN_VPERM_16QI:
15915     case ALTIVEC_BUILTIN_VPERM_8HI:
15916     case ALTIVEC_BUILTIN_VPERM_4SI:
15917     case ALTIVEC_BUILTIN_VPERM_2DI:
15918     case ALTIVEC_BUILTIN_VPERM_4SF:
15919     case ALTIVEC_BUILTIN_VPERM_2DF:
15920       {
15921         arg0 = gimple_call_arg (stmt, 0);
15922         arg1 = gimple_call_arg (stmt, 1);
15923         tree permute = gimple_call_arg (stmt, 2);
15924         lhs = gimple_call_lhs (stmt);
15925         location_t loc = gimple_location (stmt);
15926         gimple_seq stmts = NULL;
15927         // convert arg0 and arg1 to match the type of the permute
15928         // for the VEC_PERM_EXPR operation.
15929         tree permute_type = (TREE_TYPE (permute));
15930         tree arg0_ptype = gimple_convert (&stmts, loc, permute_type, arg0);
15931         tree arg1_ptype = gimple_convert (&stmts, loc, permute_type, arg1);
15932         tree lhs_ptype = gimple_build (&stmts, loc, VEC_PERM_EXPR,
15933                                       permute_type, arg0_ptype, arg1_ptype,
15934                                       permute);
15935         // Convert the result back to the desired lhs type upon completion.
15936         tree temp = gimple_convert (&stmts, loc, TREE_TYPE (lhs), lhs_ptype);
15937         gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
15938         g = gimple_build_assign (lhs, temp);
15939         gimple_set_location (g, loc);
15940         gsi_replace (gsi, g, true);
15941         return true;
15942       }
15943
15944     default:
15945       if (TARGET_DEBUG_BUILTIN)
15946         fprintf (stderr, "gimple builtin intrinsic not matched:%d %s %s\n",
15947                  fn_code, fn_name1, fn_name2);
15948       break;
15949     }
15950
15951   return false;
15952 }
15953
15954 /* Expand an expression EXP that calls a built-in function,
15955    with result going to TARGET if that's convenient
15956    (and in mode MODE if that's convenient).
15957    SUBTARGET may be used as the target for computing one of EXP's operands.
15958    IGNORE is nonzero if the value is to be ignored.  */
15959
15960 static rtx
15961 rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
15962                        machine_mode mode ATTRIBUTE_UNUSED,
15963                        int ignore ATTRIBUTE_UNUSED)
15964 {
15965   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
15966   enum rs6000_builtins fcode
15967     = (enum rs6000_builtins)DECL_FUNCTION_CODE (fndecl);
15968   size_t uns_fcode = (size_t)fcode;
15969   const struct builtin_description *d;
15970   size_t i;
15971   rtx ret;
15972   bool success;
15973   HOST_WIDE_INT mask = rs6000_builtin_info[uns_fcode].mask;
15974   bool func_valid_p = ((rs6000_builtin_mask & mask) == mask);
15975   enum insn_code icode = rs6000_builtin_info[uns_fcode].icode;
15976
15977   /* We have two different modes (KFmode, TFmode) that are the IEEE 128-bit
15978      floating point type, depending on whether long double is the IBM extended
15979      double (KFmode) or long double is IEEE 128-bit (TFmode).  It is simpler if
15980      we only define one variant of the built-in function, and switch the code
15981      when defining it, rather than defining two built-ins and using the
15982      overload table in rs6000-c.c to switch between the two.  If we don't have
15983      the proper assembler, don't do this switch because CODE_FOR_*kf* and
15984      CODE_FOR_*tf* will be CODE_FOR_nothing.  */
15985   if (FLOAT128_IEEE_P (TFmode))
15986     switch (icode)
15987       {
15988       default:
15989         break;
15990
15991       case CODE_FOR_sqrtkf2_odd:        icode = CODE_FOR_sqrttf2_odd;   break;
15992       case CODE_FOR_trunckfdf2_odd:     icode = CODE_FOR_trunctfdf2_odd; break;
15993       case CODE_FOR_addkf3_odd:         icode = CODE_FOR_addtf3_odd;    break;
15994       case CODE_FOR_subkf3_odd:         icode = CODE_FOR_subtf3_odd;    break;
15995       case CODE_FOR_mulkf3_odd:         icode = CODE_FOR_multf3_odd;    break;
15996       case CODE_FOR_divkf3_odd:         icode = CODE_FOR_divtf3_odd;    break;
15997       case CODE_FOR_fmakf4_odd:         icode = CODE_FOR_fmatf4_odd;    break;
15998       case CODE_FOR_xsxexpqp_kf:        icode = CODE_FOR_xsxexpqp_tf;   break;
15999       case CODE_FOR_xsxsigqp_kf:        icode = CODE_FOR_xsxsigqp_tf;   break;
16000       case CODE_FOR_xststdcnegqp_kf:    icode = CODE_FOR_xststdcnegqp_tf; break;
16001       case CODE_FOR_xsiexpqp_kf:        icode = CODE_FOR_xsiexpqp_tf;   break;
16002       case CODE_FOR_xsiexpqpf_kf:       icode = CODE_FOR_xsiexpqpf_tf;  break;
16003       case CODE_FOR_xststdcqp_kf:       icode = CODE_FOR_xststdcqp_tf;  break;
16004       }
16005
16006   if (TARGET_DEBUG_BUILTIN)
16007     {
16008       const char *name1 = rs6000_builtin_info[uns_fcode].name;
16009       const char *name2 = (icode != CODE_FOR_nothing)
16010                            ? get_insn_name ((int) icode)
16011                            : "nothing";
16012       const char *name3;
16013
16014       switch (rs6000_builtin_info[uns_fcode].attr & RS6000_BTC_TYPE_MASK)
16015         {
16016         default:                   name3 = "unknown";   break;
16017         case RS6000_BTC_SPECIAL:   name3 = "special";   break;
16018         case RS6000_BTC_UNARY:     name3 = "unary";     break;
16019         case RS6000_BTC_BINARY:    name3 = "binary";    break;
16020         case RS6000_BTC_TERNARY:   name3 = "ternary";   break;
16021         case RS6000_BTC_PREDICATE: name3 = "predicate"; break;
16022         case RS6000_BTC_ABS:       name3 = "abs";       break;
16023         case RS6000_BTC_DST:       name3 = "dst";       break;
16024         }
16025
16026
16027       fprintf (stderr,
16028                "rs6000_expand_builtin, %s (%d), insn = %s (%d), type=%s%s\n",
16029                (name1) ? name1 : "---", fcode,
16030                (name2) ? name2 : "---", (int) icode,
16031                name3,
16032                func_valid_p ? "" : ", not valid");
16033     }        
16034
16035   if (!func_valid_p)
16036     {
16037       rs6000_invalid_builtin (fcode);
16038
16039       /* Given it is invalid, just generate a normal call.  */
16040       return expand_call (exp, target, ignore);
16041     }
16042
16043   switch (fcode)
16044     {
16045     case RS6000_BUILTIN_RECIP:
16046       return rs6000_expand_binop_builtin (CODE_FOR_recipdf3, exp, target);
16047
16048     case RS6000_BUILTIN_RECIPF:
16049       return rs6000_expand_binop_builtin (CODE_FOR_recipsf3, exp, target);
16050
16051     case RS6000_BUILTIN_RSQRTF:
16052       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtsf2, exp, target);
16053
16054     case RS6000_BUILTIN_RSQRT:
16055       return rs6000_expand_unop_builtin (CODE_FOR_rsqrtdf2, exp, target);
16056
16057     case POWER7_BUILTIN_BPERMD:
16058       return rs6000_expand_binop_builtin (((TARGET_64BIT)
16059                                            ? CODE_FOR_bpermd_di
16060                                            : CODE_FOR_bpermd_si), exp, target);
16061
16062     case RS6000_BUILTIN_GET_TB:
16063       return rs6000_expand_zeroop_builtin (CODE_FOR_rs6000_get_timebase,
16064                                            target);
16065
16066     case RS6000_BUILTIN_MFTB:
16067       return rs6000_expand_zeroop_builtin (((TARGET_64BIT)
16068                                             ? CODE_FOR_rs6000_mftb_di
16069                                             : CODE_FOR_rs6000_mftb_si),
16070                                            target);
16071
16072     case RS6000_BUILTIN_MFFS:
16073       return rs6000_expand_zeroop_builtin (CODE_FOR_rs6000_mffs, target);
16074
16075     case RS6000_BUILTIN_MTFSB0:
16076       return rs6000_expand_mtfsb_builtin (CODE_FOR_rs6000_mtfsb0, exp);
16077
16078     case RS6000_BUILTIN_MTFSB1:
16079       return rs6000_expand_mtfsb_builtin (CODE_FOR_rs6000_mtfsb1, exp);
16080
16081     case RS6000_BUILTIN_SET_FPSCR_RN:
16082       return rs6000_expand_set_fpscr_rn_builtin (CODE_FOR_rs6000_set_fpscr_rn,
16083                                                  exp);
16084
16085     case RS6000_BUILTIN_SET_FPSCR_DRN:
16086       return
16087         rs6000_expand_set_fpscr_drn_builtin (CODE_FOR_rs6000_set_fpscr_drn,
16088                                              exp);
16089
16090     case RS6000_BUILTIN_MFFSL:
16091       return rs6000_expand_zeroop_builtin (CODE_FOR_rs6000_mffsl, target);
16092
16093     case RS6000_BUILTIN_MTFSF:
16094       return rs6000_expand_mtfsf_builtin (CODE_FOR_rs6000_mtfsf, exp);
16095
16096     case RS6000_BUILTIN_CPU_INIT:
16097     case RS6000_BUILTIN_CPU_IS:
16098     case RS6000_BUILTIN_CPU_SUPPORTS:
16099       return cpu_expand_builtin (fcode, exp, target);
16100
16101     case MISC_BUILTIN_SPEC_BARRIER:
16102       {
16103         emit_insn (gen_speculation_barrier ());
16104         return NULL_RTX;
16105       }
16106
16107     case ALTIVEC_BUILTIN_MASK_FOR_LOAD:
16108     case ALTIVEC_BUILTIN_MASK_FOR_STORE:
16109       {
16110         int icode2 = (BYTES_BIG_ENDIAN ? (int) CODE_FOR_altivec_lvsr_direct
16111                      : (int) CODE_FOR_altivec_lvsl_direct);
16112         machine_mode tmode = insn_data[icode2].operand[0].mode;
16113         machine_mode mode = insn_data[icode2].operand[1].mode;
16114         tree arg;
16115         rtx op, addr, pat;
16116
16117         gcc_assert (TARGET_ALTIVEC);
16118
16119         arg = CALL_EXPR_ARG (exp, 0);
16120         gcc_assert (POINTER_TYPE_P (TREE_TYPE (arg)));
16121         op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
16122         addr = memory_address (mode, op);
16123         if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
16124           op = addr;
16125         else
16126           {
16127             /* For the load case need to negate the address.  */
16128             op = gen_reg_rtx (GET_MODE (addr));
16129             emit_insn (gen_rtx_SET (op, gen_rtx_NEG (GET_MODE (addr), addr)));
16130           }
16131         op = gen_rtx_MEM (mode, op);
16132
16133         if (target == 0
16134             || GET_MODE (target) != tmode
16135             || ! (*insn_data[icode2].operand[0].predicate) (target, tmode))
16136           target = gen_reg_rtx (tmode);
16137
16138         pat = GEN_FCN (icode2) (target, op);
16139         if (!pat)
16140           return 0;
16141         emit_insn (pat);
16142
16143         return target;
16144       }
16145
16146     case ALTIVEC_BUILTIN_VCFUX:
16147     case ALTIVEC_BUILTIN_VCFSX:
16148     case ALTIVEC_BUILTIN_VCTUXS:
16149     case ALTIVEC_BUILTIN_VCTSXS:
16150   /* FIXME: There's got to be a nicer way to handle this case than
16151      constructing a new CALL_EXPR.  */
16152       if (call_expr_nargs (exp) == 1)
16153         {
16154           exp = build_call_nary (TREE_TYPE (exp), CALL_EXPR_FN (exp),
16155                                  2, CALL_EXPR_ARG (exp, 0), integer_zero_node);
16156         }
16157       break;
16158
16159       /* For the pack and unpack int128 routines, fix up the builtin so it
16160          uses the correct IBM128 type.  */
16161     case MISC_BUILTIN_PACK_IF:
16162       if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
16163         {
16164           icode = CODE_FOR_packtf;
16165           fcode = MISC_BUILTIN_PACK_TF;
16166           uns_fcode = (size_t)fcode;
16167         }
16168       break;
16169
16170     case MISC_BUILTIN_UNPACK_IF:
16171       if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
16172         {
16173           icode = CODE_FOR_unpacktf;
16174           fcode = MISC_BUILTIN_UNPACK_TF;
16175           uns_fcode = (size_t)fcode;
16176         }
16177       break;
16178
16179     default:
16180       break;
16181     }
16182
16183   if (TARGET_ALTIVEC)
16184     {
16185       ret = altivec_expand_builtin (exp, target, &success);
16186
16187       if (success)
16188         return ret;
16189     }
16190   if (TARGET_HTM)
16191     {
16192       ret = htm_expand_builtin (exp, target, &success);
16193
16194       if (success)
16195         return ret;
16196     }  
16197
16198   unsigned attr = rs6000_builtin_info[uns_fcode].attr & RS6000_BTC_TYPE_MASK;
16199   /* RS6000_BTC_SPECIAL represents no-operand operators.  */
16200   gcc_assert (attr == RS6000_BTC_UNARY
16201               || attr == RS6000_BTC_BINARY
16202               || attr == RS6000_BTC_TERNARY
16203               || attr == RS6000_BTC_SPECIAL);
16204   
16205   /* Handle simple unary operations.  */
16206   d = bdesc_1arg;
16207   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
16208     if (d->code == fcode)
16209       return rs6000_expand_unop_builtin (icode, exp, target);
16210
16211   /* Handle simple binary operations.  */
16212   d = bdesc_2arg;
16213   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
16214     if (d->code == fcode)
16215       return rs6000_expand_binop_builtin (icode, exp, target);
16216
16217   /* Handle simple ternary operations.  */
16218   d = bdesc_3arg;
16219   for (i = 0; i < ARRAY_SIZE  (bdesc_3arg); i++, d++)
16220     if (d->code == fcode)
16221       return rs6000_expand_ternop_builtin (icode, exp, target);
16222
16223   /* Handle simple no-argument operations. */
16224   d = bdesc_0arg;
16225   for (i = 0; i < ARRAY_SIZE (bdesc_0arg); i++, d++)
16226     if (d->code == fcode)
16227       return rs6000_expand_zeroop_builtin (icode, target);
16228
16229   gcc_unreachable ();
16230 }
16231
16232 /* Create a builtin vector type with a name.  Taking care not to give
16233    the canonical type a name.  */
16234
16235 static tree
16236 rs6000_vector_type (const char *name, tree elt_type, unsigned num_elts)
16237 {
16238   tree result = build_vector_type (elt_type, num_elts);
16239
16240   /* Copy so we don't give the canonical type a name.  */
16241   result = build_variant_type_copy (result);
16242
16243   add_builtin_type (name, result);
16244
16245   return result;
16246 }
16247
16248 static void
16249 rs6000_init_builtins (void)
16250 {
16251   tree tdecl;
16252   tree ftype;
16253   machine_mode mode;
16254
16255   if (TARGET_DEBUG_BUILTIN)
16256     fprintf (stderr, "rs6000_init_builtins%s%s\n",
16257              (TARGET_ALTIVEC)      ? ", altivec" : "",
16258              (TARGET_VSX)          ? ", vsx"     : "");
16259
16260   V2DI_type_node = rs6000_vector_type (TARGET_POWERPC64 ? "__vector long"
16261                                        : "__vector long long",
16262                                        intDI_type_node, 2);
16263   V2DF_type_node = rs6000_vector_type ("__vector double", double_type_node, 2);
16264   V4SI_type_node = rs6000_vector_type ("__vector signed int",
16265                                        intSI_type_node, 4);
16266   V4SF_type_node = rs6000_vector_type ("__vector float", float_type_node, 4);
16267   V8HI_type_node = rs6000_vector_type ("__vector signed short",
16268                                        intHI_type_node, 8);
16269   V16QI_type_node = rs6000_vector_type ("__vector signed char",
16270                                         intQI_type_node, 16);
16271
16272   unsigned_V16QI_type_node = rs6000_vector_type ("__vector unsigned char",
16273                                         unsigned_intQI_type_node, 16);
16274   unsigned_V8HI_type_node = rs6000_vector_type ("__vector unsigned short",
16275                                        unsigned_intHI_type_node, 8);
16276   unsigned_V4SI_type_node = rs6000_vector_type ("__vector unsigned int",
16277                                        unsigned_intSI_type_node, 4);
16278   unsigned_V2DI_type_node = rs6000_vector_type (TARGET_POWERPC64
16279                                        ? "__vector unsigned long"
16280                                        : "__vector unsigned long long",
16281                                        unsigned_intDI_type_node, 2);
16282
16283   opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4);
16284
16285   const_str_type_node
16286     = build_pointer_type (build_qualified_type (char_type_node,
16287                                                 TYPE_QUAL_CONST));
16288
16289   /* We use V1TI mode as a special container to hold __int128_t items that
16290      must live in VSX registers.  */
16291   if (intTI_type_node)
16292     {
16293       V1TI_type_node = rs6000_vector_type ("__vector __int128",
16294                                            intTI_type_node, 1);
16295       unsigned_V1TI_type_node
16296         = rs6000_vector_type ("__vector unsigned __int128",
16297                               unsigned_intTI_type_node, 1);
16298     }
16299
16300   /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
16301      types, especially in C++ land.  Similarly, 'vector pixel' is distinct from
16302      'vector unsigned short'.  */
16303
16304   bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
16305   bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
16306   bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
16307   bool_long_long_type_node = build_distinct_type_copy (unsigned_intDI_type_node);
16308   pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
16309
16310   long_integer_type_internal_node = long_integer_type_node;
16311   long_unsigned_type_internal_node = long_unsigned_type_node;
16312   long_long_integer_type_internal_node = long_long_integer_type_node;
16313   long_long_unsigned_type_internal_node = long_long_unsigned_type_node;
16314   intQI_type_internal_node = intQI_type_node;
16315   uintQI_type_internal_node = unsigned_intQI_type_node;
16316   intHI_type_internal_node = intHI_type_node;
16317   uintHI_type_internal_node = unsigned_intHI_type_node;
16318   intSI_type_internal_node = intSI_type_node;
16319   uintSI_type_internal_node = unsigned_intSI_type_node;
16320   intDI_type_internal_node = intDI_type_node;
16321   uintDI_type_internal_node = unsigned_intDI_type_node;
16322   intTI_type_internal_node = intTI_type_node;
16323   uintTI_type_internal_node = unsigned_intTI_type_node;
16324   float_type_internal_node = float_type_node;
16325   double_type_internal_node = double_type_node;
16326   long_double_type_internal_node = long_double_type_node;
16327   dfloat64_type_internal_node = dfloat64_type_node;
16328   dfloat128_type_internal_node = dfloat128_type_node;
16329   void_type_internal_node = void_type_node;
16330
16331   /* 128-bit floating point support.  KFmode is IEEE 128-bit floating point.
16332      IFmode is the IBM extended 128-bit format that is a pair of doubles.
16333      TFmode will be either IEEE 128-bit floating point or the IBM double-double
16334      format that uses a pair of doubles, depending on the switches and
16335      defaults.
16336
16337      If we don't support for either 128-bit IBM double double or IEEE 128-bit
16338      floating point, we need make sure the type is non-zero or else self-test
16339      fails during bootstrap.
16340
16341      Always create __ibm128 as a separate type, even if the current long double
16342      format is IBM extended double.
16343
16344      For IEEE 128-bit floating point, always create the type __ieee128.  If the
16345      user used -mfloat128, rs6000-c.c will create a define from __float128 to
16346      __ieee128.  */
16347   if (TARGET_FLOAT128_TYPE)
16348     {
16349       if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128)
16350         ibm128_float_type_node = long_double_type_node;
16351       else
16352         {
16353           ibm128_float_type_node = make_node (REAL_TYPE);
16354           TYPE_PRECISION (ibm128_float_type_node) = 128;
16355           SET_TYPE_MODE (ibm128_float_type_node, IFmode);
16356           layout_type (ibm128_float_type_node);
16357         }
16358
16359       lang_hooks.types.register_builtin_type (ibm128_float_type_node,
16360                                               "__ibm128");
16361
16362       if (TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128)
16363         ieee128_float_type_node = long_double_type_node;
16364       else
16365         ieee128_float_type_node = float128_type_node;
16366
16367       lang_hooks.types.register_builtin_type (ieee128_float_type_node,
16368                                               "__ieee128");
16369     }
16370
16371   else
16372     ieee128_float_type_node = ibm128_float_type_node = long_double_type_node;
16373
16374   /* Initialize the modes for builtin_function_type, mapping a machine mode to
16375      tree type node.  */
16376   builtin_mode_to_type[QImode][0] = integer_type_node;
16377   builtin_mode_to_type[HImode][0] = integer_type_node;
16378   builtin_mode_to_type[SImode][0] = intSI_type_node;
16379   builtin_mode_to_type[SImode][1] = unsigned_intSI_type_node;
16380   builtin_mode_to_type[DImode][0] = intDI_type_node;
16381   builtin_mode_to_type[DImode][1] = unsigned_intDI_type_node;
16382   builtin_mode_to_type[TImode][0] = intTI_type_node;
16383   builtin_mode_to_type[TImode][1] = unsigned_intTI_type_node;
16384   builtin_mode_to_type[SFmode][0] = float_type_node;
16385   builtin_mode_to_type[DFmode][0] = double_type_node;
16386   builtin_mode_to_type[IFmode][0] = ibm128_float_type_node;
16387   builtin_mode_to_type[KFmode][0] = ieee128_float_type_node;
16388   builtin_mode_to_type[TFmode][0] = long_double_type_node;
16389   builtin_mode_to_type[DDmode][0] = dfloat64_type_node;
16390   builtin_mode_to_type[TDmode][0] = dfloat128_type_node;
16391   builtin_mode_to_type[V1TImode][0] = V1TI_type_node;
16392   builtin_mode_to_type[V1TImode][1] = unsigned_V1TI_type_node;
16393   builtin_mode_to_type[V2DImode][0] = V2DI_type_node;
16394   builtin_mode_to_type[V2DImode][1] = unsigned_V2DI_type_node;
16395   builtin_mode_to_type[V2DFmode][0] = V2DF_type_node;
16396   builtin_mode_to_type[V4SImode][0] = V4SI_type_node;
16397   builtin_mode_to_type[V4SImode][1] = unsigned_V4SI_type_node;
16398   builtin_mode_to_type[V4SFmode][0] = V4SF_type_node;
16399   builtin_mode_to_type[V8HImode][0] = V8HI_type_node;
16400   builtin_mode_to_type[V8HImode][1] = unsigned_V8HI_type_node;
16401   builtin_mode_to_type[V16QImode][0] = V16QI_type_node;
16402   builtin_mode_to_type[V16QImode][1] = unsigned_V16QI_type_node;
16403
16404   tdecl = add_builtin_type ("__bool char", bool_char_type_node);
16405   TYPE_NAME (bool_char_type_node) = tdecl;
16406
16407   tdecl = add_builtin_type ("__bool short", bool_short_type_node);
16408   TYPE_NAME (bool_short_type_node) = tdecl;
16409
16410   tdecl = add_builtin_type ("__bool int", bool_int_type_node);
16411   TYPE_NAME (bool_int_type_node) = tdecl;
16412
16413   tdecl = add_builtin_type ("__pixel", pixel_type_node);
16414   TYPE_NAME (pixel_type_node) = tdecl;
16415
16416   bool_V16QI_type_node = rs6000_vector_type ("__vector __bool char",
16417                                              bool_char_type_node, 16);
16418   bool_V8HI_type_node = rs6000_vector_type ("__vector __bool short",
16419                                             bool_short_type_node, 8);
16420   bool_V4SI_type_node = rs6000_vector_type ("__vector __bool int",
16421                                             bool_int_type_node, 4);
16422   bool_V2DI_type_node = rs6000_vector_type (TARGET_POWERPC64
16423                                             ? "__vector __bool long"
16424                                             : "__vector __bool long long",
16425                                             bool_long_long_type_node, 2);
16426   pixel_V8HI_type_node = rs6000_vector_type ("__vector __pixel",
16427                                              pixel_type_node, 8);
16428
16429   /* Create Altivec and VSX builtins on machines with at least the
16430      general purpose extensions (970 and newer) to allow the use of
16431      the target attribute.  */
16432   if (TARGET_EXTRA_BUILTINS)
16433     altivec_init_builtins ();
16434   if (TARGET_HTM)
16435     htm_init_builtins ();
16436
16437   if (TARGET_EXTRA_BUILTINS)
16438     rs6000_common_init_builtins ();
16439
16440   ftype = builtin_function_type (DFmode, DFmode, DFmode, VOIDmode,
16441                                  RS6000_BUILTIN_RECIP, "__builtin_recipdiv");
16442   def_builtin ("__builtin_recipdiv", ftype, RS6000_BUILTIN_RECIP);
16443
16444   ftype = builtin_function_type (SFmode, SFmode, SFmode, VOIDmode,
16445                                  RS6000_BUILTIN_RECIPF, "__builtin_recipdivf");
16446   def_builtin ("__builtin_recipdivf", ftype, RS6000_BUILTIN_RECIPF);
16447
16448   ftype = builtin_function_type (DFmode, DFmode, VOIDmode, VOIDmode,
16449                                  RS6000_BUILTIN_RSQRT, "__builtin_rsqrt");
16450   def_builtin ("__builtin_rsqrt", ftype, RS6000_BUILTIN_RSQRT);
16451
16452   ftype = builtin_function_type (SFmode, SFmode, VOIDmode, VOIDmode,
16453                                  RS6000_BUILTIN_RSQRTF, "__builtin_rsqrtf");
16454   def_builtin ("__builtin_rsqrtf", ftype, RS6000_BUILTIN_RSQRTF);
16455
16456   mode = (TARGET_64BIT) ? DImode : SImode;
16457   ftype = builtin_function_type (mode, mode, mode, VOIDmode,
16458                                  POWER7_BUILTIN_BPERMD, "__builtin_bpermd");
16459   def_builtin ("__builtin_bpermd", ftype, POWER7_BUILTIN_BPERMD);
16460
16461   ftype = build_function_type_list (unsigned_intDI_type_node,
16462                                     NULL_TREE);
16463   def_builtin ("__builtin_ppc_get_timebase", ftype, RS6000_BUILTIN_GET_TB);
16464
16465   if (TARGET_64BIT)
16466     ftype = build_function_type_list (unsigned_intDI_type_node,
16467                                       NULL_TREE);
16468   else
16469     ftype = build_function_type_list (unsigned_intSI_type_node,
16470                                       NULL_TREE);
16471   def_builtin ("__builtin_ppc_mftb", ftype, RS6000_BUILTIN_MFTB);
16472
16473   ftype = build_function_type_list (double_type_node, NULL_TREE);
16474   def_builtin ("__builtin_mffs", ftype, RS6000_BUILTIN_MFFS);
16475
16476   ftype = build_function_type_list (double_type_node, NULL_TREE);
16477   def_builtin ("__builtin_mffsl", ftype, RS6000_BUILTIN_MFFSL);
16478
16479   ftype = build_function_type_list (void_type_node,
16480                                     intSI_type_node,
16481                                     NULL_TREE);
16482   def_builtin ("__builtin_mtfsb0", ftype, RS6000_BUILTIN_MTFSB0);
16483
16484   ftype = build_function_type_list (void_type_node,
16485                                     intSI_type_node,
16486                                     NULL_TREE);
16487   def_builtin ("__builtin_mtfsb1", ftype, RS6000_BUILTIN_MTFSB1);
16488
16489   ftype = build_function_type_list (void_type_node,
16490                                     intDI_type_node,
16491                                     NULL_TREE);
16492   def_builtin ("__builtin_set_fpscr_rn", ftype, RS6000_BUILTIN_SET_FPSCR_RN);
16493
16494   ftype = build_function_type_list (void_type_node,
16495                                     intDI_type_node,
16496                                     NULL_TREE);
16497   def_builtin ("__builtin_set_fpscr_drn", ftype, RS6000_BUILTIN_SET_FPSCR_DRN);
16498
16499   ftype = build_function_type_list (void_type_node,
16500                                     intSI_type_node, double_type_node,
16501                                     NULL_TREE);
16502   def_builtin ("__builtin_mtfsf", ftype, RS6000_BUILTIN_MTFSF);
16503
16504   ftype = build_function_type_list (void_type_node, NULL_TREE);
16505   def_builtin ("__builtin_cpu_init", ftype, RS6000_BUILTIN_CPU_INIT);
16506   def_builtin ("__builtin_ppc_speculation_barrier", ftype,
16507                MISC_BUILTIN_SPEC_BARRIER);
16508
16509   ftype = build_function_type_list (bool_int_type_node, const_ptr_type_node,
16510                                     NULL_TREE);
16511   def_builtin ("__builtin_cpu_is", ftype, RS6000_BUILTIN_CPU_IS);
16512   def_builtin ("__builtin_cpu_supports", ftype, RS6000_BUILTIN_CPU_SUPPORTS);
16513
16514   /* AIX libm provides clog as __clog.  */
16515   if (TARGET_XCOFF &&
16516       (tdecl = builtin_decl_explicit (BUILT_IN_CLOG)) != NULL_TREE)
16517     set_user_assembler_name (tdecl, "__clog");
16518
16519 #ifdef SUBTARGET_INIT_BUILTINS
16520   SUBTARGET_INIT_BUILTINS;
16521 #endif
16522 }
16523
16524 /* Returns the rs6000 builtin decl for CODE.  */
16525
16526 static tree
16527 rs6000_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
16528 {
16529   HOST_WIDE_INT fnmask;
16530
16531   if (code >= RS6000_BUILTIN_COUNT)
16532     return error_mark_node;
16533
16534   fnmask = rs6000_builtin_info[code].mask;
16535   if ((fnmask & rs6000_builtin_mask) != fnmask)
16536     {
16537       rs6000_invalid_builtin ((enum rs6000_builtins)code);
16538       return error_mark_node;
16539     }
16540
16541   return rs6000_builtin_decls[code];
16542 }
16543
16544 static void
16545 altivec_init_builtins (void)
16546 {
16547   const struct builtin_description *d;
16548   size_t i;
16549   tree ftype;
16550   tree decl;
16551   HOST_WIDE_INT builtin_mask = rs6000_builtin_mask;
16552
16553   tree pvoid_type_node = build_pointer_type (void_type_node);
16554
16555   tree pcvoid_type_node
16556     = build_pointer_type (build_qualified_type (void_type_node,
16557                                                 TYPE_QUAL_CONST));
16558
16559   tree int_ftype_opaque
16560     = build_function_type_list (integer_type_node,
16561                                 opaque_V4SI_type_node, NULL_TREE);
16562   tree opaque_ftype_opaque
16563     = build_function_type_list (integer_type_node, NULL_TREE);
16564   tree opaque_ftype_opaque_int
16565     = build_function_type_list (opaque_V4SI_type_node,
16566                                 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
16567   tree opaque_ftype_opaque_opaque_int
16568     = build_function_type_list (opaque_V4SI_type_node,
16569                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
16570                                 integer_type_node, NULL_TREE);
16571   tree opaque_ftype_opaque_opaque_opaque
16572     = build_function_type_list (opaque_V4SI_type_node,
16573                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
16574                                 opaque_V4SI_type_node, NULL_TREE);
16575   tree opaque_ftype_opaque_opaque
16576     = build_function_type_list (opaque_V4SI_type_node,
16577                                 opaque_V4SI_type_node, opaque_V4SI_type_node,
16578                                 NULL_TREE);
16579   tree int_ftype_int_opaque_opaque
16580     = build_function_type_list (integer_type_node,
16581                                 integer_type_node, opaque_V4SI_type_node,
16582                                 opaque_V4SI_type_node, NULL_TREE);
16583   tree int_ftype_int_v4si_v4si
16584     = build_function_type_list (integer_type_node,
16585                                 integer_type_node, V4SI_type_node,
16586                                 V4SI_type_node, NULL_TREE);
16587   tree int_ftype_int_v2di_v2di
16588     = build_function_type_list (integer_type_node,
16589                                 integer_type_node, V2DI_type_node,
16590                                 V2DI_type_node, NULL_TREE);
16591   tree void_ftype_v4si
16592     = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
16593   tree v8hi_ftype_void
16594     = build_function_type_list (V8HI_type_node, NULL_TREE);
16595   tree void_ftype_void
16596     = build_function_type_list (void_type_node, NULL_TREE);
16597   tree void_ftype_int
16598     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
16599
16600   tree opaque_ftype_long_pcvoid
16601     = build_function_type_list (opaque_V4SI_type_node,
16602                                 long_integer_type_node, pcvoid_type_node,
16603                                 NULL_TREE);
16604   tree v16qi_ftype_long_pcvoid
16605     = build_function_type_list (V16QI_type_node,
16606                                 long_integer_type_node, pcvoid_type_node,
16607                                 NULL_TREE);
16608   tree v8hi_ftype_long_pcvoid
16609     = build_function_type_list (V8HI_type_node,
16610                                 long_integer_type_node, pcvoid_type_node,
16611                                 NULL_TREE);
16612   tree v4si_ftype_long_pcvoid
16613     = build_function_type_list (V4SI_type_node,
16614                                 long_integer_type_node, pcvoid_type_node,
16615                                 NULL_TREE);
16616   tree v4sf_ftype_long_pcvoid
16617     = build_function_type_list (V4SF_type_node,
16618                                 long_integer_type_node, pcvoid_type_node,
16619                                 NULL_TREE);
16620   tree v2df_ftype_long_pcvoid
16621     = build_function_type_list (V2DF_type_node,
16622                                 long_integer_type_node, pcvoid_type_node,
16623                                 NULL_TREE);
16624   tree v2di_ftype_long_pcvoid
16625     = build_function_type_list (V2DI_type_node,
16626                                 long_integer_type_node, pcvoid_type_node,
16627                                 NULL_TREE);
16628   tree v1ti_ftype_long_pcvoid
16629     = build_function_type_list (V1TI_type_node,
16630                                 long_integer_type_node, pcvoid_type_node,
16631                                 NULL_TREE);
16632
16633   tree void_ftype_opaque_long_pvoid
16634     = build_function_type_list (void_type_node,
16635                                 opaque_V4SI_type_node, long_integer_type_node,
16636                                 pvoid_type_node, NULL_TREE);
16637   tree void_ftype_v4si_long_pvoid
16638     = build_function_type_list (void_type_node,
16639                                 V4SI_type_node, long_integer_type_node,
16640                                 pvoid_type_node, NULL_TREE);
16641   tree void_ftype_v16qi_long_pvoid
16642     = build_function_type_list (void_type_node,
16643                                 V16QI_type_node, long_integer_type_node,
16644                                 pvoid_type_node, NULL_TREE);
16645
16646   tree void_ftype_v16qi_pvoid_long
16647     = build_function_type_list (void_type_node,
16648                                 V16QI_type_node, pvoid_type_node,
16649                                 long_integer_type_node, NULL_TREE);
16650
16651   tree void_ftype_v8hi_long_pvoid
16652     = build_function_type_list (void_type_node,
16653                                 V8HI_type_node, long_integer_type_node,
16654                                 pvoid_type_node, NULL_TREE);
16655   tree void_ftype_v4sf_long_pvoid
16656     = build_function_type_list (void_type_node,
16657                                 V4SF_type_node, long_integer_type_node,
16658                                 pvoid_type_node, NULL_TREE);
16659   tree void_ftype_v2df_long_pvoid
16660     = build_function_type_list (void_type_node,
16661                                 V2DF_type_node, long_integer_type_node,
16662                                 pvoid_type_node, NULL_TREE);
16663   tree void_ftype_v1ti_long_pvoid
16664     = build_function_type_list (void_type_node,
16665                                 V1TI_type_node, long_integer_type_node,
16666                                 pvoid_type_node, NULL_TREE);
16667   tree void_ftype_v2di_long_pvoid
16668     = build_function_type_list (void_type_node,
16669                                 V2DI_type_node, long_integer_type_node,
16670                                 pvoid_type_node, NULL_TREE);
16671   tree int_ftype_int_v8hi_v8hi
16672     = build_function_type_list (integer_type_node,
16673                                 integer_type_node, V8HI_type_node,
16674                                 V8HI_type_node, NULL_TREE);
16675   tree int_ftype_int_v16qi_v16qi
16676     = build_function_type_list (integer_type_node,
16677                                 integer_type_node, V16QI_type_node,
16678                                 V16QI_type_node, NULL_TREE);
16679   tree int_ftype_int_v4sf_v4sf
16680     = build_function_type_list (integer_type_node,
16681                                 integer_type_node, V4SF_type_node,
16682                                 V4SF_type_node, NULL_TREE);
16683   tree int_ftype_int_v2df_v2df
16684     = build_function_type_list (integer_type_node,
16685                                 integer_type_node, V2DF_type_node,
16686                                 V2DF_type_node, NULL_TREE);
16687   tree v2di_ftype_v2di
16688     = build_function_type_list (V2DI_type_node, V2DI_type_node, NULL_TREE);
16689   tree v4si_ftype_v4si
16690     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
16691   tree v8hi_ftype_v8hi
16692     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
16693   tree v16qi_ftype_v16qi
16694     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
16695   tree v4sf_ftype_v4sf
16696     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
16697   tree v2df_ftype_v2df
16698     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
16699   tree void_ftype_pcvoid_int_int
16700     = build_function_type_list (void_type_node,
16701                                 pcvoid_type_node, integer_type_node,
16702                                 integer_type_node, NULL_TREE);
16703
16704   def_builtin ("__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
16705   def_builtin ("__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
16706   def_builtin ("__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
16707   def_builtin ("__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
16708   def_builtin ("__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
16709   def_builtin ("__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
16710   def_builtin ("__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
16711   def_builtin ("__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
16712   def_builtin ("__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
16713   def_builtin ("__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
16714   def_builtin ("__builtin_altivec_lvxl_v2df", v2df_ftype_long_pcvoid,
16715                ALTIVEC_BUILTIN_LVXL_V2DF);
16716   def_builtin ("__builtin_altivec_lvxl_v2di", v2di_ftype_long_pcvoid,
16717                ALTIVEC_BUILTIN_LVXL_V2DI);
16718   def_builtin ("__builtin_altivec_lvxl_v4sf", v4sf_ftype_long_pcvoid,
16719                ALTIVEC_BUILTIN_LVXL_V4SF);
16720   def_builtin ("__builtin_altivec_lvxl_v4si", v4si_ftype_long_pcvoid,
16721                ALTIVEC_BUILTIN_LVXL_V4SI);
16722   def_builtin ("__builtin_altivec_lvxl_v8hi", v8hi_ftype_long_pcvoid,
16723                ALTIVEC_BUILTIN_LVXL_V8HI);
16724   def_builtin ("__builtin_altivec_lvxl_v16qi", v16qi_ftype_long_pcvoid,
16725                ALTIVEC_BUILTIN_LVXL_V16QI);
16726   def_builtin ("__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
16727   def_builtin ("__builtin_altivec_lvx_v1ti", v1ti_ftype_long_pcvoid,
16728                ALTIVEC_BUILTIN_LVX_V1TI);
16729   def_builtin ("__builtin_altivec_lvx_v2df", v2df_ftype_long_pcvoid,
16730                ALTIVEC_BUILTIN_LVX_V2DF);
16731   def_builtin ("__builtin_altivec_lvx_v2di", v2di_ftype_long_pcvoid,
16732                ALTIVEC_BUILTIN_LVX_V2DI);
16733   def_builtin ("__builtin_altivec_lvx_v4sf", v4sf_ftype_long_pcvoid,
16734                ALTIVEC_BUILTIN_LVX_V4SF);
16735   def_builtin ("__builtin_altivec_lvx_v4si", v4si_ftype_long_pcvoid,
16736                ALTIVEC_BUILTIN_LVX_V4SI);
16737   def_builtin ("__builtin_altivec_lvx_v8hi", v8hi_ftype_long_pcvoid,
16738                ALTIVEC_BUILTIN_LVX_V8HI);
16739   def_builtin ("__builtin_altivec_lvx_v16qi", v16qi_ftype_long_pcvoid,
16740                ALTIVEC_BUILTIN_LVX_V16QI);
16741   def_builtin ("__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
16742   def_builtin ("__builtin_altivec_stvx_v2df", void_ftype_v2df_long_pvoid,
16743                ALTIVEC_BUILTIN_STVX_V2DF);
16744   def_builtin ("__builtin_altivec_stvx_v2di", void_ftype_v2di_long_pvoid,
16745                ALTIVEC_BUILTIN_STVX_V2DI);
16746   def_builtin ("__builtin_altivec_stvx_v4sf", void_ftype_v4sf_long_pvoid,
16747                ALTIVEC_BUILTIN_STVX_V4SF);
16748   def_builtin ("__builtin_altivec_stvx_v4si", void_ftype_v4si_long_pvoid,
16749                ALTIVEC_BUILTIN_STVX_V4SI);
16750   def_builtin ("__builtin_altivec_stvx_v8hi", void_ftype_v8hi_long_pvoid,
16751                ALTIVEC_BUILTIN_STVX_V8HI);
16752   def_builtin ("__builtin_altivec_stvx_v16qi", void_ftype_v16qi_long_pvoid,
16753                ALTIVEC_BUILTIN_STVX_V16QI);
16754   def_builtin ("__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
16755   def_builtin ("__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
16756   def_builtin ("__builtin_altivec_stvxl_v2df", void_ftype_v2df_long_pvoid,
16757                ALTIVEC_BUILTIN_STVXL_V2DF);
16758   def_builtin ("__builtin_altivec_stvxl_v2di", void_ftype_v2di_long_pvoid,
16759                ALTIVEC_BUILTIN_STVXL_V2DI);
16760   def_builtin ("__builtin_altivec_stvxl_v4sf", void_ftype_v4sf_long_pvoid,
16761                ALTIVEC_BUILTIN_STVXL_V4SF);
16762   def_builtin ("__builtin_altivec_stvxl_v4si", void_ftype_v4si_long_pvoid,
16763                ALTIVEC_BUILTIN_STVXL_V4SI);
16764   def_builtin ("__builtin_altivec_stvxl_v8hi", void_ftype_v8hi_long_pvoid,
16765                ALTIVEC_BUILTIN_STVXL_V8HI);
16766   def_builtin ("__builtin_altivec_stvxl_v16qi", void_ftype_v16qi_long_pvoid,
16767                ALTIVEC_BUILTIN_STVXL_V16QI);
16768   def_builtin ("__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
16769   def_builtin ("__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
16770   def_builtin ("__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
16771   def_builtin ("__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
16772   def_builtin ("__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
16773   def_builtin ("__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
16774   def_builtin ("__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
16775   def_builtin ("__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
16776   def_builtin ("__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
16777   def_builtin ("__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
16778   def_builtin ("__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
16779   def_builtin ("__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
16780   def_builtin ("__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
16781   def_builtin ("__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
16782   def_builtin ("__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
16783   def_builtin ("__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
16784
16785   def_builtin ("__builtin_vsx_lxvd2x_v2df", v2df_ftype_long_pcvoid,
16786                VSX_BUILTIN_LXVD2X_V2DF);
16787   def_builtin ("__builtin_vsx_lxvd2x_v2di", v2di_ftype_long_pcvoid,
16788                VSX_BUILTIN_LXVD2X_V2DI);
16789   def_builtin ("__builtin_vsx_lxvw4x_v4sf", v4sf_ftype_long_pcvoid,
16790                VSX_BUILTIN_LXVW4X_V4SF);
16791   def_builtin ("__builtin_vsx_lxvw4x_v4si", v4si_ftype_long_pcvoid,
16792                VSX_BUILTIN_LXVW4X_V4SI);
16793   def_builtin ("__builtin_vsx_lxvw4x_v8hi", v8hi_ftype_long_pcvoid,
16794                VSX_BUILTIN_LXVW4X_V8HI);
16795   def_builtin ("__builtin_vsx_lxvw4x_v16qi", v16qi_ftype_long_pcvoid,
16796                VSX_BUILTIN_LXVW4X_V16QI);
16797   def_builtin ("__builtin_vsx_stxvd2x_v2df", void_ftype_v2df_long_pvoid,
16798                VSX_BUILTIN_STXVD2X_V2DF);
16799   def_builtin ("__builtin_vsx_stxvd2x_v2di", void_ftype_v2di_long_pvoid,
16800                VSX_BUILTIN_STXVD2X_V2DI);
16801   def_builtin ("__builtin_vsx_stxvw4x_v4sf", void_ftype_v4sf_long_pvoid,
16802                VSX_BUILTIN_STXVW4X_V4SF);
16803   def_builtin ("__builtin_vsx_stxvw4x_v4si", void_ftype_v4si_long_pvoid,
16804                VSX_BUILTIN_STXVW4X_V4SI);
16805   def_builtin ("__builtin_vsx_stxvw4x_v8hi", void_ftype_v8hi_long_pvoid,
16806                VSX_BUILTIN_STXVW4X_V8HI);
16807   def_builtin ("__builtin_vsx_stxvw4x_v16qi", void_ftype_v16qi_long_pvoid,
16808                VSX_BUILTIN_STXVW4X_V16QI);
16809
16810   def_builtin ("__builtin_vsx_ld_elemrev_v2df", v2df_ftype_long_pcvoid,
16811                VSX_BUILTIN_LD_ELEMREV_V2DF);
16812   def_builtin ("__builtin_vsx_ld_elemrev_v2di", v2di_ftype_long_pcvoid,
16813                VSX_BUILTIN_LD_ELEMREV_V2DI);
16814   def_builtin ("__builtin_vsx_ld_elemrev_v4sf", v4sf_ftype_long_pcvoid,
16815                VSX_BUILTIN_LD_ELEMREV_V4SF);
16816   def_builtin ("__builtin_vsx_ld_elemrev_v4si", v4si_ftype_long_pcvoid,
16817                VSX_BUILTIN_LD_ELEMREV_V4SI);
16818   def_builtin ("__builtin_vsx_ld_elemrev_v8hi", v8hi_ftype_long_pcvoid,
16819                VSX_BUILTIN_LD_ELEMREV_V8HI);
16820   def_builtin ("__builtin_vsx_ld_elemrev_v16qi", v16qi_ftype_long_pcvoid,
16821                VSX_BUILTIN_LD_ELEMREV_V16QI);
16822   def_builtin ("__builtin_vsx_st_elemrev_v2df", void_ftype_v2df_long_pvoid,
16823                VSX_BUILTIN_ST_ELEMREV_V2DF);
16824   def_builtin ("__builtin_vsx_st_elemrev_v1ti", void_ftype_v1ti_long_pvoid,
16825                VSX_BUILTIN_ST_ELEMREV_V1TI);
16826   def_builtin ("__builtin_vsx_st_elemrev_v2di", void_ftype_v2di_long_pvoid,
16827                VSX_BUILTIN_ST_ELEMREV_V2DI);
16828   def_builtin ("__builtin_vsx_st_elemrev_v4sf", void_ftype_v4sf_long_pvoid,
16829                VSX_BUILTIN_ST_ELEMREV_V4SF);
16830   def_builtin ("__builtin_vsx_st_elemrev_v4si", void_ftype_v4si_long_pvoid,
16831                VSX_BUILTIN_ST_ELEMREV_V4SI);
16832   def_builtin ("__builtin_vsx_st_elemrev_v8hi", void_ftype_v8hi_long_pvoid,
16833                VSX_BUILTIN_ST_ELEMREV_V8HI);
16834   def_builtin ("__builtin_vsx_st_elemrev_v16qi", void_ftype_v16qi_long_pvoid,
16835                VSX_BUILTIN_ST_ELEMREV_V16QI);
16836
16837   def_builtin ("__builtin_vec_vsx_ld", opaque_ftype_long_pcvoid,
16838                VSX_BUILTIN_VEC_LD);
16839   def_builtin ("__builtin_vec_vsx_st", void_ftype_opaque_long_pvoid,
16840                VSX_BUILTIN_VEC_ST);
16841   def_builtin ("__builtin_vec_xl", opaque_ftype_long_pcvoid,
16842                VSX_BUILTIN_VEC_XL);
16843   def_builtin ("__builtin_vec_xl_be", opaque_ftype_long_pcvoid,
16844                VSX_BUILTIN_VEC_XL_BE);
16845   def_builtin ("__builtin_vec_xst", void_ftype_opaque_long_pvoid,
16846                VSX_BUILTIN_VEC_XST);
16847   def_builtin ("__builtin_vec_xst_be", void_ftype_opaque_long_pvoid,
16848                VSX_BUILTIN_VEC_XST_BE);
16849
16850   def_builtin ("__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
16851   def_builtin ("__builtin_vec_splats", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_SPLATS);
16852   def_builtin ("__builtin_vec_promote", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_PROMOTE);
16853
16854   def_builtin ("__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
16855   def_builtin ("__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
16856   def_builtin ("__builtin_vec_extract", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_EXTRACT);
16857   def_builtin ("__builtin_vec_insert", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_INSERT);
16858   def_builtin ("__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
16859   def_builtin ("__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
16860   def_builtin ("__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
16861   def_builtin ("__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
16862   def_builtin ("__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
16863   def_builtin ("__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
16864   def_builtin ("__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
16865   def_builtin ("__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
16866
16867   def_builtin ("__builtin_vec_adde", opaque_ftype_opaque_opaque_opaque,
16868                 ALTIVEC_BUILTIN_VEC_ADDE);
16869   def_builtin ("__builtin_vec_addec", opaque_ftype_opaque_opaque_opaque,
16870                 ALTIVEC_BUILTIN_VEC_ADDEC);
16871   def_builtin ("__builtin_vec_cmpne", opaque_ftype_opaque_opaque,
16872                 ALTIVEC_BUILTIN_VEC_CMPNE);
16873   def_builtin ("__builtin_vec_mul", opaque_ftype_opaque_opaque,
16874                 ALTIVEC_BUILTIN_VEC_MUL);
16875   def_builtin ("__builtin_vec_sube", opaque_ftype_opaque_opaque_opaque,
16876                 ALTIVEC_BUILTIN_VEC_SUBE);
16877   def_builtin ("__builtin_vec_subec", opaque_ftype_opaque_opaque_opaque,
16878                 ALTIVEC_BUILTIN_VEC_SUBEC);
16879
16880   /* Cell builtins.  */
16881   def_builtin ("__builtin_altivec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLX);
16882   def_builtin ("__builtin_altivec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLXL);
16883   def_builtin ("__builtin_altivec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRX);
16884   def_builtin ("__builtin_altivec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRXL);
16885
16886   def_builtin ("__builtin_vec_lvlx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLX);
16887   def_builtin ("__builtin_vec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLXL);
16888   def_builtin ("__builtin_vec_lvrx",  v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRX);
16889   def_builtin ("__builtin_vec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRXL);
16890
16891   def_builtin ("__builtin_altivec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLX);
16892   def_builtin ("__builtin_altivec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLXL);
16893   def_builtin ("__builtin_altivec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRX);
16894   def_builtin ("__builtin_altivec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRXL);
16895
16896   def_builtin ("__builtin_vec_stvlx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLX);
16897   def_builtin ("__builtin_vec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLXL);
16898   def_builtin ("__builtin_vec_stvrx",  void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRX);
16899   def_builtin ("__builtin_vec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRXL);
16900
16901   if (TARGET_P9_VECTOR)
16902     {
16903       def_builtin ("__builtin_altivec_stxvl", void_ftype_v16qi_pvoid_long,
16904                    P9V_BUILTIN_STXVL);
16905       def_builtin ("__builtin_xst_len_r", void_ftype_v16qi_pvoid_long,
16906                    P9V_BUILTIN_XST_LEN_R);
16907     }
16908
16909   /* Add the DST variants.  */
16910   d = bdesc_dst;
16911   for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
16912     {
16913       HOST_WIDE_INT mask = d->mask;
16914
16915       /* It is expected that these dst built-in functions may have
16916          d->icode equal to CODE_FOR_nothing.  */
16917       if ((mask & builtin_mask) != mask)
16918         {
16919           if (TARGET_DEBUG_BUILTIN)
16920             fprintf (stderr, "altivec_init_builtins, skip dst %s\n",
16921                      d->name);
16922           continue;
16923         }
16924       def_builtin (d->name, void_ftype_pcvoid_int_int, d->code);
16925     }
16926
16927   /* Initialize the predicates.  */
16928   d = bdesc_altivec_preds;
16929   for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, d++)
16930     {
16931       machine_mode mode1;
16932       tree type;
16933       HOST_WIDE_INT mask = d->mask;
16934
16935       if ((mask & builtin_mask) != mask)
16936         {
16937           if (TARGET_DEBUG_BUILTIN)
16938             fprintf (stderr, "altivec_init_builtins, skip predicate %s\n",
16939                      d->name);
16940           continue;
16941         }
16942
16943       if (rs6000_overloaded_builtin_p (d->code))
16944         mode1 = VOIDmode;
16945       else
16946         {
16947           /* Cannot define builtin if the instruction is disabled.  */
16948           gcc_assert (d->icode != CODE_FOR_nothing);
16949           mode1 = insn_data[d->icode].operand[1].mode;
16950         }
16951
16952       switch (mode1)
16953         {
16954         case E_VOIDmode:
16955           type = int_ftype_int_opaque_opaque;
16956           break;
16957         case E_V2DImode:
16958           type = int_ftype_int_v2di_v2di;
16959           break;
16960         case E_V4SImode:
16961           type = int_ftype_int_v4si_v4si;
16962           break;
16963         case E_V8HImode:
16964           type = int_ftype_int_v8hi_v8hi;
16965           break;
16966         case E_V16QImode:
16967           type = int_ftype_int_v16qi_v16qi;
16968           break;
16969         case E_V4SFmode:
16970           type = int_ftype_int_v4sf_v4sf;
16971           break;
16972         case E_V2DFmode:
16973           type = int_ftype_int_v2df_v2df;
16974           break;
16975         default:
16976           gcc_unreachable ();
16977         }
16978
16979       def_builtin (d->name, type, d->code);
16980     }
16981
16982   /* Initialize the abs* operators.  */
16983   d = bdesc_abs;
16984   for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
16985     {
16986       machine_mode mode0;
16987       tree type;
16988       HOST_WIDE_INT mask = d->mask;
16989
16990       if ((mask & builtin_mask) != mask)
16991         {
16992           if (TARGET_DEBUG_BUILTIN)
16993             fprintf (stderr, "altivec_init_builtins, skip abs %s\n",
16994                      d->name);
16995           continue;
16996         }
16997
16998       /* Cannot define builtin if the instruction is disabled.  */
16999       gcc_assert (d->icode != CODE_FOR_nothing);
17000       mode0 = insn_data[d->icode].operand[0].mode;
17001
17002       switch (mode0)
17003         {
17004         case E_V2DImode:
17005           type = v2di_ftype_v2di;
17006           break;
17007         case E_V4SImode:
17008           type = v4si_ftype_v4si;
17009           break;
17010         case E_V8HImode:
17011           type = v8hi_ftype_v8hi;
17012           break;
17013         case E_V16QImode:
17014           type = v16qi_ftype_v16qi;
17015           break;
17016         case E_V4SFmode:
17017           type = v4sf_ftype_v4sf;
17018           break;
17019         case E_V2DFmode:
17020           type = v2df_ftype_v2df;
17021           break;
17022         default:
17023           gcc_unreachable ();
17024         }
17025
17026       def_builtin (d->name, type, d->code);
17027     }
17028
17029   /* Initialize target builtin that implements
17030      targetm.vectorize.builtin_mask_for_load.  */
17031
17032   decl = add_builtin_function ("__builtin_altivec_mask_for_load",
17033                                v16qi_ftype_long_pcvoid,
17034                                ALTIVEC_BUILTIN_MASK_FOR_LOAD,
17035                                BUILT_IN_MD, NULL, NULL_TREE);
17036   TREE_READONLY (decl) = 1;
17037   /* Record the decl. Will be used by rs6000_builtin_mask_for_load.  */
17038   altivec_builtin_mask_for_load = decl;
17039
17040   /* Access to the vec_init patterns.  */
17041   ftype = build_function_type_list (V4SI_type_node, integer_type_node,
17042                                     integer_type_node, integer_type_node,
17043                                     integer_type_node, NULL_TREE);
17044   def_builtin ("__builtin_vec_init_v4si", ftype, ALTIVEC_BUILTIN_VEC_INIT_V4SI);
17045
17046   ftype = build_function_type_list (V8HI_type_node, short_integer_type_node,
17047                                     short_integer_type_node,
17048                                     short_integer_type_node,
17049                                     short_integer_type_node,
17050                                     short_integer_type_node,
17051                                     short_integer_type_node,
17052                                     short_integer_type_node,
17053                                     short_integer_type_node, NULL_TREE);
17054   def_builtin ("__builtin_vec_init_v8hi", ftype, ALTIVEC_BUILTIN_VEC_INIT_V8HI);
17055
17056   ftype = build_function_type_list (V16QI_type_node, char_type_node,
17057                                     char_type_node, char_type_node,
17058                                     char_type_node, char_type_node,
17059                                     char_type_node, char_type_node,
17060                                     char_type_node, char_type_node,
17061                                     char_type_node, char_type_node,
17062                                     char_type_node, char_type_node,
17063                                     char_type_node, char_type_node,
17064                                     char_type_node, NULL_TREE);
17065   def_builtin ("__builtin_vec_init_v16qi", ftype,
17066                ALTIVEC_BUILTIN_VEC_INIT_V16QI);
17067
17068   ftype = build_function_type_list (V4SF_type_node, float_type_node,
17069                                     float_type_node, float_type_node,
17070                                     float_type_node, NULL_TREE);
17071   def_builtin ("__builtin_vec_init_v4sf", ftype, ALTIVEC_BUILTIN_VEC_INIT_V4SF);
17072
17073   /* VSX builtins.  */
17074   ftype = build_function_type_list (V2DF_type_node, double_type_node,
17075                                     double_type_node, NULL_TREE);
17076   def_builtin ("__builtin_vec_init_v2df", ftype, VSX_BUILTIN_VEC_INIT_V2DF);
17077
17078   ftype = build_function_type_list (V2DI_type_node, intDI_type_node,
17079                                     intDI_type_node, NULL_TREE);
17080   def_builtin ("__builtin_vec_init_v2di", ftype, VSX_BUILTIN_VEC_INIT_V2DI);
17081
17082   /* Access to the vec_set patterns.  */
17083   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
17084                                     intSI_type_node,
17085                                     integer_type_node, NULL_TREE);
17086   def_builtin ("__builtin_vec_set_v4si", ftype, ALTIVEC_BUILTIN_VEC_SET_V4SI);
17087
17088   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
17089                                     intHI_type_node,
17090                                     integer_type_node, NULL_TREE);
17091   def_builtin ("__builtin_vec_set_v8hi", ftype, ALTIVEC_BUILTIN_VEC_SET_V8HI);
17092
17093   ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
17094                                     intQI_type_node,
17095                                     integer_type_node, NULL_TREE);
17096   def_builtin ("__builtin_vec_set_v16qi", ftype, ALTIVEC_BUILTIN_VEC_SET_V16QI);
17097
17098   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
17099                                     float_type_node,
17100                                     integer_type_node, NULL_TREE);
17101   def_builtin ("__builtin_vec_set_v4sf", ftype, ALTIVEC_BUILTIN_VEC_SET_V4SF);
17102
17103   ftype = build_function_type_list (V2DF_type_node, V2DF_type_node,
17104                                     double_type_node,
17105                                     integer_type_node, NULL_TREE);
17106   def_builtin ("__builtin_vec_set_v2df", ftype, VSX_BUILTIN_VEC_SET_V2DF);
17107
17108   ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
17109                                     intDI_type_node,
17110                                     integer_type_node, NULL_TREE);
17111   def_builtin ("__builtin_vec_set_v2di", ftype, VSX_BUILTIN_VEC_SET_V2DI);
17112
17113   /* Access to the vec_extract patterns.  */
17114   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
17115                                     integer_type_node, NULL_TREE);
17116   def_builtin ("__builtin_vec_ext_v4si", ftype, ALTIVEC_BUILTIN_VEC_EXT_V4SI);
17117
17118   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
17119                                     integer_type_node, NULL_TREE);
17120   def_builtin ("__builtin_vec_ext_v8hi", ftype, ALTIVEC_BUILTIN_VEC_EXT_V8HI);
17121
17122   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
17123                                     integer_type_node, NULL_TREE);
17124   def_builtin ("__builtin_vec_ext_v16qi", ftype, ALTIVEC_BUILTIN_VEC_EXT_V16QI);
17125
17126   ftype = build_function_type_list (float_type_node, V4SF_type_node,
17127                                     integer_type_node, NULL_TREE);
17128   def_builtin ("__builtin_vec_ext_v4sf", ftype, ALTIVEC_BUILTIN_VEC_EXT_V4SF);
17129
17130   ftype = build_function_type_list (double_type_node, V2DF_type_node,
17131                                     integer_type_node, NULL_TREE);
17132   def_builtin ("__builtin_vec_ext_v2df", ftype, VSX_BUILTIN_VEC_EXT_V2DF);
17133
17134   ftype = build_function_type_list (intDI_type_node, V2DI_type_node,
17135                                     integer_type_node, NULL_TREE);
17136   def_builtin ("__builtin_vec_ext_v2di", ftype, VSX_BUILTIN_VEC_EXT_V2DI);
17137
17138
17139   if (V1TI_type_node)
17140     {
17141       tree v1ti_ftype_long_pcvoid
17142         = build_function_type_list (V1TI_type_node,
17143                                     long_integer_type_node, pcvoid_type_node,
17144                                     NULL_TREE);
17145       tree void_ftype_v1ti_long_pvoid
17146         = build_function_type_list (void_type_node,
17147                                     V1TI_type_node, long_integer_type_node,
17148                                     pvoid_type_node, NULL_TREE);
17149       def_builtin ("__builtin_vsx_ld_elemrev_v1ti", v1ti_ftype_long_pcvoid,
17150                    VSX_BUILTIN_LD_ELEMREV_V1TI);
17151       def_builtin ("__builtin_vsx_lxvd2x_v1ti", v1ti_ftype_long_pcvoid,
17152                    VSX_BUILTIN_LXVD2X_V1TI);
17153       def_builtin ("__builtin_vsx_stxvd2x_v1ti", void_ftype_v1ti_long_pvoid,
17154                    VSX_BUILTIN_STXVD2X_V1TI);
17155       ftype = build_function_type_list (V1TI_type_node, intTI_type_node,
17156                                         NULL_TREE, NULL_TREE);
17157       def_builtin ("__builtin_vec_init_v1ti", ftype, VSX_BUILTIN_VEC_INIT_V1TI);
17158       ftype = build_function_type_list (V1TI_type_node, V1TI_type_node,
17159                                         intTI_type_node,
17160                                         integer_type_node, NULL_TREE);
17161       def_builtin ("__builtin_vec_set_v1ti", ftype, VSX_BUILTIN_VEC_SET_V1TI);
17162       ftype = build_function_type_list (intTI_type_node, V1TI_type_node,
17163                                         integer_type_node, NULL_TREE);
17164       def_builtin ("__builtin_vec_ext_v1ti", ftype, VSX_BUILTIN_VEC_EXT_V1TI);
17165     }
17166
17167 }
17168
17169 static void
17170 htm_init_builtins (void)
17171 {
17172   HOST_WIDE_INT builtin_mask = rs6000_builtin_mask;
17173   const struct builtin_description *d;
17174   size_t i;
17175
17176   d = bdesc_htm;
17177   for (i = 0; i < ARRAY_SIZE (bdesc_htm); i++, d++)
17178     {
17179       tree op[MAX_HTM_OPERANDS], type;
17180       HOST_WIDE_INT mask = d->mask;
17181       unsigned attr = rs6000_builtin_info[d->code].attr;
17182       bool void_func = (attr & RS6000_BTC_VOID);
17183       int attr_args = (attr & RS6000_BTC_TYPE_MASK);
17184       int nopnds = 0;
17185       tree gpr_type_node;
17186       tree rettype;
17187       tree argtype;
17188
17189       /* It is expected that these htm built-in functions may have
17190          d->icode equal to CODE_FOR_nothing.  */
17191
17192       if (TARGET_32BIT && TARGET_POWERPC64)
17193         gpr_type_node = long_long_unsigned_type_node;
17194       else
17195         gpr_type_node = long_unsigned_type_node;
17196
17197       if (attr & RS6000_BTC_SPR)
17198         {
17199           rettype = gpr_type_node;
17200           argtype = gpr_type_node;
17201         }
17202       else if (d->code == HTM_BUILTIN_TABORTDC
17203                || d->code == HTM_BUILTIN_TABORTDCI)
17204         {
17205           rettype = unsigned_type_node;
17206           argtype = gpr_type_node;
17207         }
17208       else
17209         {
17210           rettype = unsigned_type_node;
17211           argtype = unsigned_type_node;
17212         }
17213
17214       if ((mask & builtin_mask) != mask)
17215         {
17216           if (TARGET_DEBUG_BUILTIN)
17217             fprintf (stderr, "htm_builtin, skip binary %s\n", d->name);
17218           continue;
17219         }
17220
17221       if (d->name == 0)
17222         {
17223           if (TARGET_DEBUG_BUILTIN)
17224             fprintf (stderr, "htm_builtin, bdesc_htm[%ld] no name\n",
17225                      (long unsigned) i);
17226           continue;
17227         }
17228
17229       op[nopnds++] = (void_func) ? void_type_node : rettype;
17230
17231       if (attr_args == RS6000_BTC_UNARY)
17232         op[nopnds++] = argtype;
17233       else if (attr_args == RS6000_BTC_BINARY)
17234         {
17235           op[nopnds++] = argtype;
17236           op[nopnds++] = argtype;
17237         }
17238       else if (attr_args == RS6000_BTC_TERNARY)
17239         {
17240           op[nopnds++] = argtype;
17241           op[nopnds++] = argtype;
17242           op[nopnds++] = argtype;
17243         }
17244
17245       switch (nopnds)
17246         {
17247         case 1:
17248           type = build_function_type_list (op[0], NULL_TREE);
17249           break;
17250         case 2:
17251           type = build_function_type_list (op[0], op[1], NULL_TREE);
17252           break;
17253         case 3:
17254           type = build_function_type_list (op[0], op[1], op[2], NULL_TREE);
17255           break;
17256         case 4:
17257           type = build_function_type_list (op[0], op[1], op[2], op[3],
17258                                            NULL_TREE);
17259           break;
17260         default:
17261           gcc_unreachable ();
17262         }
17263
17264       def_builtin (d->name, type, d->code);
17265     }
17266 }
17267
17268 /* Hash function for builtin functions with up to 3 arguments and a return
17269    type.  */
17270 hashval_t
17271 builtin_hasher::hash (builtin_hash_struct *bh)
17272 {
17273   unsigned ret = 0;
17274   int i;
17275
17276   for (i = 0; i < 4; i++)
17277     {
17278       ret = (ret * (unsigned)MAX_MACHINE_MODE) + ((unsigned)bh->mode[i]);
17279       ret = (ret * 2) + bh->uns_p[i];
17280     }
17281
17282   return ret;
17283 }
17284
17285 /* Compare builtin hash entries H1 and H2 for equivalence.  */
17286 bool
17287 builtin_hasher::equal (builtin_hash_struct *p1, builtin_hash_struct *p2)
17288 {
17289   return ((p1->mode[0] == p2->mode[0])
17290           && (p1->mode[1] == p2->mode[1])
17291           && (p1->mode[2] == p2->mode[2])
17292           && (p1->mode[3] == p2->mode[3])
17293           && (p1->uns_p[0] == p2->uns_p[0])
17294           && (p1->uns_p[1] == p2->uns_p[1])
17295           && (p1->uns_p[2] == p2->uns_p[2])
17296           && (p1->uns_p[3] == p2->uns_p[3]));
17297 }
17298
17299 /* Map types for builtin functions with an explicit return type and up to 3
17300    arguments.  Functions with fewer than 3 arguments use VOIDmode as the type
17301    of the argument.  */
17302 static tree
17303 builtin_function_type (machine_mode mode_ret, machine_mode mode_arg0,
17304                        machine_mode mode_arg1, machine_mode mode_arg2,
17305                        enum rs6000_builtins builtin, const char *name)
17306 {
17307   struct builtin_hash_struct h;
17308   struct builtin_hash_struct *h2;
17309   int num_args = 3;
17310   int i;
17311   tree ret_type = NULL_TREE;
17312   tree arg_type[3] = { NULL_TREE, NULL_TREE, NULL_TREE };
17313
17314   /* Create builtin_hash_table.  */
17315   if (builtin_hash_table == NULL)
17316     builtin_hash_table = hash_table<builtin_hasher>::create_ggc (1500);
17317
17318   h.type = NULL_TREE;
17319   h.mode[0] = mode_ret;
17320   h.mode[1] = mode_arg0;
17321   h.mode[2] = mode_arg1;
17322   h.mode[3] = mode_arg2;
17323   h.uns_p[0] = 0;
17324   h.uns_p[1] = 0;
17325   h.uns_p[2] = 0;
17326   h.uns_p[3] = 0;
17327
17328   /* If the builtin is a type that produces unsigned results or takes unsigned
17329      arguments, and it is returned as a decl for the vectorizer (such as
17330      widening multiplies, permute), make sure the arguments and return value
17331      are type correct.  */
17332   switch (builtin)
17333     {
17334     /* unsigned 1 argument functions.  */
17335     case CRYPTO_BUILTIN_VSBOX:
17336     case CRYPTO_BUILTIN_VSBOX_BE:
17337     case P8V_BUILTIN_VGBBD:
17338     case MISC_BUILTIN_CDTBCD:
17339     case MISC_BUILTIN_CBCDTD:
17340       h.uns_p[0] = 1;
17341       h.uns_p[1] = 1;
17342       break;
17343
17344     /* unsigned 2 argument functions.  */
17345     case ALTIVEC_BUILTIN_VMULEUB:
17346     case ALTIVEC_BUILTIN_VMULEUH:
17347     case P8V_BUILTIN_VMULEUW:
17348     case ALTIVEC_BUILTIN_VMULOUB:
17349     case ALTIVEC_BUILTIN_VMULOUH:
17350     case P8V_BUILTIN_VMULOUW:
17351     case CRYPTO_BUILTIN_VCIPHER:
17352     case CRYPTO_BUILTIN_VCIPHER_BE:
17353     case CRYPTO_BUILTIN_VCIPHERLAST:
17354     case CRYPTO_BUILTIN_VCIPHERLAST_BE:
17355     case CRYPTO_BUILTIN_VNCIPHER:
17356     case CRYPTO_BUILTIN_VNCIPHER_BE:
17357     case CRYPTO_BUILTIN_VNCIPHERLAST:
17358     case CRYPTO_BUILTIN_VNCIPHERLAST_BE:
17359     case CRYPTO_BUILTIN_VPMSUMB:
17360     case CRYPTO_BUILTIN_VPMSUMH:
17361     case CRYPTO_BUILTIN_VPMSUMW:
17362     case CRYPTO_BUILTIN_VPMSUMD:
17363     case CRYPTO_BUILTIN_VPMSUM:
17364     case MISC_BUILTIN_ADDG6S:
17365     case MISC_BUILTIN_DIVWEU:
17366     case MISC_BUILTIN_DIVDEU:
17367     case VSX_BUILTIN_UDIV_V2DI:
17368     case ALTIVEC_BUILTIN_VMAXUB:
17369     case ALTIVEC_BUILTIN_VMINUB:
17370     case ALTIVEC_BUILTIN_VMAXUH:
17371     case ALTIVEC_BUILTIN_VMINUH:
17372     case ALTIVEC_BUILTIN_VMAXUW:
17373     case ALTIVEC_BUILTIN_VMINUW:
17374     case P8V_BUILTIN_VMAXUD:
17375     case P8V_BUILTIN_VMINUD:
17376       h.uns_p[0] = 1;
17377       h.uns_p[1] = 1;
17378       h.uns_p[2] = 1;
17379       break;
17380
17381     /* unsigned 3 argument functions.  */
17382     case ALTIVEC_BUILTIN_VPERM_16QI_UNS:
17383     case ALTIVEC_BUILTIN_VPERM_8HI_UNS:
17384     case ALTIVEC_BUILTIN_VPERM_4SI_UNS:
17385     case ALTIVEC_BUILTIN_VPERM_2DI_UNS:
17386     case ALTIVEC_BUILTIN_VSEL_16QI_UNS:
17387     case ALTIVEC_BUILTIN_VSEL_8HI_UNS:
17388     case ALTIVEC_BUILTIN_VSEL_4SI_UNS:
17389     case ALTIVEC_BUILTIN_VSEL_2DI_UNS:
17390     case VSX_BUILTIN_VPERM_16QI_UNS:
17391     case VSX_BUILTIN_VPERM_8HI_UNS:
17392     case VSX_BUILTIN_VPERM_4SI_UNS:
17393     case VSX_BUILTIN_VPERM_2DI_UNS:
17394     case VSX_BUILTIN_XXSEL_16QI_UNS:
17395     case VSX_BUILTIN_XXSEL_8HI_UNS:
17396     case VSX_BUILTIN_XXSEL_4SI_UNS:
17397     case VSX_BUILTIN_XXSEL_2DI_UNS:
17398     case CRYPTO_BUILTIN_VPERMXOR:
17399     case CRYPTO_BUILTIN_VPERMXOR_V2DI:
17400     case CRYPTO_BUILTIN_VPERMXOR_V4SI:
17401     case CRYPTO_BUILTIN_VPERMXOR_V8HI:
17402     case CRYPTO_BUILTIN_VPERMXOR_V16QI:
17403     case CRYPTO_BUILTIN_VSHASIGMAW:
17404     case CRYPTO_BUILTIN_VSHASIGMAD:
17405     case CRYPTO_BUILTIN_VSHASIGMA:
17406       h.uns_p[0] = 1;
17407       h.uns_p[1] = 1;
17408       h.uns_p[2] = 1;
17409       h.uns_p[3] = 1;
17410       break;
17411
17412     /* signed permute functions with unsigned char mask.  */
17413     case ALTIVEC_BUILTIN_VPERM_16QI:
17414     case ALTIVEC_BUILTIN_VPERM_8HI:
17415     case ALTIVEC_BUILTIN_VPERM_4SI:
17416     case ALTIVEC_BUILTIN_VPERM_4SF:
17417     case ALTIVEC_BUILTIN_VPERM_2DI:
17418     case ALTIVEC_BUILTIN_VPERM_2DF:
17419     case VSX_BUILTIN_VPERM_16QI:
17420     case VSX_BUILTIN_VPERM_8HI:
17421     case VSX_BUILTIN_VPERM_4SI:
17422     case VSX_BUILTIN_VPERM_4SF:
17423     case VSX_BUILTIN_VPERM_2DI:
17424     case VSX_BUILTIN_VPERM_2DF:
17425       h.uns_p[3] = 1;
17426       break;
17427
17428     /* unsigned args, signed return.  */
17429     case VSX_BUILTIN_XVCVUXDSP:
17430     case VSX_BUILTIN_XVCVUXDDP_UNS:
17431     case ALTIVEC_BUILTIN_UNSFLOAT_V4SI_V4SF:
17432       h.uns_p[1] = 1;
17433       break;
17434
17435     /* signed args, unsigned return.  */
17436     case VSX_BUILTIN_XVCVDPUXDS_UNS:
17437     case ALTIVEC_BUILTIN_FIXUNS_V4SF_V4SI:
17438     case MISC_BUILTIN_UNPACK_TD:
17439     case MISC_BUILTIN_UNPACK_V1TI:
17440       h.uns_p[0] = 1;
17441       break;
17442
17443     /* unsigned arguments, bool return (compares).  */
17444     case ALTIVEC_BUILTIN_VCMPEQUB:
17445     case ALTIVEC_BUILTIN_VCMPEQUH:
17446     case ALTIVEC_BUILTIN_VCMPEQUW:
17447     case P8V_BUILTIN_VCMPEQUD:
17448     case VSX_BUILTIN_CMPGE_U16QI:
17449     case VSX_BUILTIN_CMPGE_U8HI:
17450     case VSX_BUILTIN_CMPGE_U4SI:
17451     case VSX_BUILTIN_CMPGE_U2DI:
17452     case ALTIVEC_BUILTIN_VCMPGTUB:
17453     case ALTIVEC_BUILTIN_VCMPGTUH:
17454     case ALTIVEC_BUILTIN_VCMPGTUW:
17455     case P8V_BUILTIN_VCMPGTUD:
17456       h.uns_p[1] = 1;
17457       h.uns_p[2] = 1;
17458       break;
17459
17460     /* unsigned arguments for 128-bit pack instructions.  */
17461     case MISC_BUILTIN_PACK_TD:
17462     case MISC_BUILTIN_PACK_V1TI:
17463       h.uns_p[1] = 1;
17464       h.uns_p[2] = 1;
17465       break;
17466
17467     /* unsigned second arguments (vector shift right).  */
17468     case ALTIVEC_BUILTIN_VSRB:
17469     case ALTIVEC_BUILTIN_VSRH:
17470     case ALTIVEC_BUILTIN_VSRW:
17471     case P8V_BUILTIN_VSRD:
17472       h.uns_p[2] = 1;
17473       break;
17474
17475     default:
17476       break;
17477     }
17478
17479   /* Figure out how many args are present.  */
17480   while (num_args > 0 && h.mode[num_args] == VOIDmode)
17481     num_args--;
17482
17483   ret_type = builtin_mode_to_type[h.mode[0]][h.uns_p[0]];
17484   if (!ret_type && h.uns_p[0])
17485     ret_type = builtin_mode_to_type[h.mode[0]][0];
17486
17487   if (!ret_type)
17488     fatal_error (input_location,
17489                  "internal error: builtin function %qs had an unexpected "
17490                  "return type %qs", name, GET_MODE_NAME (h.mode[0]));
17491
17492   for (i = 0; i < (int) ARRAY_SIZE (arg_type); i++)
17493     arg_type[i] = NULL_TREE;
17494
17495   for (i = 0; i < num_args; i++)
17496     {
17497       int m = (int) h.mode[i+1];
17498       int uns_p = h.uns_p[i+1];
17499
17500       arg_type[i] = builtin_mode_to_type[m][uns_p];
17501       if (!arg_type[i] && uns_p)
17502         arg_type[i] = builtin_mode_to_type[m][0];
17503
17504       if (!arg_type[i])
17505         fatal_error (input_location,
17506                      "internal error: builtin function %qs, argument %d "
17507                      "had unexpected argument type %qs", name, i,
17508                      GET_MODE_NAME (m));
17509     }
17510
17511   builtin_hash_struct **found = builtin_hash_table->find_slot (&h, INSERT);
17512   if (*found == NULL)
17513     {
17514       h2 = ggc_alloc<builtin_hash_struct> ();
17515       *h2 = h;
17516       *found = h2;
17517
17518       h2->type = build_function_type_list (ret_type, arg_type[0], arg_type[1],
17519                                            arg_type[2], NULL_TREE);
17520     }
17521
17522   return (*found)->type;
17523 }
17524
17525 static void
17526 rs6000_common_init_builtins (void)
17527 {
17528   const struct builtin_description *d;
17529   size_t i;
17530
17531   tree opaque_ftype_opaque = NULL_TREE;
17532   tree opaque_ftype_opaque_opaque = NULL_TREE;
17533   tree opaque_ftype_opaque_opaque_opaque = NULL_TREE;
17534   HOST_WIDE_INT builtin_mask = rs6000_builtin_mask;
17535
17536   /* Create Altivec and VSX builtins on machines with at least the
17537      general purpose extensions (970 and newer) to allow the use of
17538      the target attribute.  */
17539
17540   if (TARGET_EXTRA_BUILTINS)
17541     builtin_mask |= RS6000_BTM_COMMON;
17542
17543   /* Add the ternary operators.  */
17544   d = bdesc_3arg;
17545   for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
17546     {
17547       tree type;
17548       HOST_WIDE_INT mask = d->mask;
17549
17550       if ((mask & builtin_mask) != mask)
17551         {
17552           if (TARGET_DEBUG_BUILTIN)
17553             fprintf (stderr, "rs6000_builtin, skip ternary %s\n", d->name);
17554           continue;
17555         }
17556
17557       if (rs6000_overloaded_builtin_p (d->code))
17558         {
17559           if (! (type = opaque_ftype_opaque_opaque_opaque))
17560             type = opaque_ftype_opaque_opaque_opaque
17561               = build_function_type_list (opaque_V4SI_type_node,
17562                                           opaque_V4SI_type_node,
17563                                           opaque_V4SI_type_node,
17564                                           opaque_V4SI_type_node,
17565                                           NULL_TREE);
17566         }
17567       else
17568         {
17569           enum insn_code icode = d->icode;
17570           if (d->name == 0)
17571             {
17572               if (TARGET_DEBUG_BUILTIN)
17573                 fprintf (stderr, "rs6000_builtin, bdesc_3arg[%ld] no name\n",
17574                          (long unsigned)i);
17575
17576               continue;
17577             }
17578
17579           if (icode == CODE_FOR_nothing)
17580             {
17581               if (TARGET_DEBUG_BUILTIN)
17582                 fprintf (stderr, "rs6000_builtin, skip ternary %s (no code)\n",
17583                          d->name);
17584
17585               continue;
17586             }
17587
17588           type = builtin_function_type (insn_data[icode].operand[0].mode,
17589                                         insn_data[icode].operand[1].mode,
17590                                         insn_data[icode].operand[2].mode,
17591                                         insn_data[icode].operand[3].mode,
17592                                         d->code, d->name);
17593         }
17594
17595       def_builtin (d->name, type, d->code);
17596     }
17597
17598   /* Add the binary operators.  */
17599   d = bdesc_2arg;
17600   for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
17601     {
17602       machine_mode mode0, mode1, mode2;
17603       tree type;
17604       HOST_WIDE_INT mask = d->mask;
17605
17606       if ((mask & builtin_mask) != mask)
17607         {
17608           if (TARGET_DEBUG_BUILTIN)
17609             fprintf (stderr, "rs6000_builtin, skip binary %s\n", d->name);
17610           continue;
17611         }
17612
17613       if (rs6000_overloaded_builtin_p (d->code))
17614         {
17615           if (! (type = opaque_ftype_opaque_opaque))
17616             type = opaque_ftype_opaque_opaque
17617               = build_function_type_list (opaque_V4SI_type_node,
17618                                           opaque_V4SI_type_node,
17619                                           opaque_V4SI_type_node,
17620                                           NULL_TREE);
17621         }
17622       else
17623         {
17624           enum insn_code icode = d->icode;
17625           if (d->name == 0)
17626             {
17627               if (TARGET_DEBUG_BUILTIN)
17628                 fprintf (stderr, "rs6000_builtin, bdesc_2arg[%ld] no name\n",
17629                          (long unsigned)i);
17630
17631               continue;
17632             }
17633
17634           if (icode == CODE_FOR_nothing)
17635             {
17636               if (TARGET_DEBUG_BUILTIN)
17637                 fprintf (stderr, "rs6000_builtin, skip binary %s (no code)\n",
17638                          d->name);
17639
17640               continue;
17641             }
17642
17643           mode0 = insn_data[icode].operand[0].mode;
17644           mode1 = insn_data[icode].operand[1].mode;
17645           mode2 = insn_data[icode].operand[2].mode;
17646
17647           type = builtin_function_type (mode0, mode1, mode2, VOIDmode,
17648                                         d->code, d->name);
17649         }
17650
17651       def_builtin (d->name, type, d->code);
17652     }
17653
17654   /* Add the simple unary operators.  */
17655   d = bdesc_1arg;
17656   for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
17657     {
17658       machine_mode mode0, mode1;
17659       tree type;
17660       HOST_WIDE_INT mask = d->mask;
17661
17662       if ((mask & builtin_mask) != mask)
17663         {
17664           if (TARGET_DEBUG_BUILTIN)
17665             fprintf (stderr, "rs6000_builtin, skip unary %s\n", d->name);
17666           continue;
17667         }
17668
17669       if (rs6000_overloaded_builtin_p (d->code))
17670         {
17671           if (! (type = opaque_ftype_opaque))
17672             type = opaque_ftype_opaque
17673               = build_function_type_list (opaque_V4SI_type_node,
17674                                           opaque_V4SI_type_node,
17675                                           NULL_TREE);
17676         }
17677       else
17678         {
17679           enum insn_code icode = d->icode;
17680           if (d->name == 0)
17681             {
17682               if (TARGET_DEBUG_BUILTIN)
17683                 fprintf (stderr, "rs6000_builtin, bdesc_1arg[%ld] no name\n",
17684                          (long unsigned)i);
17685
17686               continue;
17687             }
17688
17689           if (icode == CODE_FOR_nothing)
17690             {
17691               if (TARGET_DEBUG_BUILTIN)
17692                 fprintf (stderr, "rs6000_builtin, skip unary %s (no code)\n",
17693                          d->name);
17694
17695               continue;
17696             }
17697
17698           mode0 = insn_data[icode].operand[0].mode;
17699           mode1 = insn_data[icode].operand[1].mode;
17700
17701           type = builtin_function_type (mode0, mode1, VOIDmode, VOIDmode,
17702                                         d->code, d->name);
17703         }
17704
17705       def_builtin (d->name, type, d->code);
17706     }
17707
17708   /* Add the simple no-argument operators.  */
17709   d = bdesc_0arg;
17710   for (i = 0; i < ARRAY_SIZE (bdesc_0arg); i++, d++)
17711     {
17712       machine_mode mode0;
17713       tree type;
17714       HOST_WIDE_INT mask = d->mask;
17715
17716       if ((mask & builtin_mask) != mask)
17717         {
17718           if (TARGET_DEBUG_BUILTIN)
17719             fprintf (stderr, "rs6000_builtin, skip no-argument %s\n", d->name);
17720           continue;
17721         }
17722       if (rs6000_overloaded_builtin_p (d->code))
17723         {
17724           if (!opaque_ftype_opaque)
17725             opaque_ftype_opaque
17726               = build_function_type_list (opaque_V4SI_type_node, NULL_TREE);
17727           type = opaque_ftype_opaque;
17728         }
17729       else
17730         {
17731           enum insn_code icode = d->icode;
17732           if (d->name == 0)
17733             {
17734               if (TARGET_DEBUG_BUILTIN)
17735                 fprintf (stderr, "rs6000_builtin, bdesc_0arg[%lu] no name\n",
17736                          (long unsigned) i);
17737               continue;
17738             }
17739           if (icode == CODE_FOR_nothing)
17740             {
17741               if (TARGET_DEBUG_BUILTIN)
17742                 fprintf (stderr,
17743                          "rs6000_builtin, skip no-argument %s (no code)\n",
17744                          d->name);
17745               continue;
17746             }
17747           mode0 = insn_data[icode].operand[0].mode;
17748           type = builtin_function_type (mode0, VOIDmode, VOIDmode, VOIDmode,
17749                                         d->code, d->name);
17750         }
17751       def_builtin (d->name, type, d->code);
17752     }
17753 }
17754
17755 /* Set up AIX/Darwin/64-bit Linux quad floating point routines.  */
17756 static void
17757 init_float128_ibm (machine_mode mode)
17758 {
17759   if (!TARGET_XL_COMPAT)
17760     {
17761       set_optab_libfunc (add_optab, mode, "__gcc_qadd");
17762       set_optab_libfunc (sub_optab, mode, "__gcc_qsub");
17763       set_optab_libfunc (smul_optab, mode, "__gcc_qmul");
17764       set_optab_libfunc (sdiv_optab, mode, "__gcc_qdiv");
17765
17766       if (!TARGET_HARD_FLOAT)
17767         {
17768           set_optab_libfunc (neg_optab, mode, "__gcc_qneg");
17769           set_optab_libfunc (eq_optab, mode, "__gcc_qeq");
17770           set_optab_libfunc (ne_optab, mode, "__gcc_qne");
17771           set_optab_libfunc (gt_optab, mode, "__gcc_qgt");
17772           set_optab_libfunc (ge_optab, mode, "__gcc_qge");
17773           set_optab_libfunc (lt_optab, mode, "__gcc_qlt");
17774           set_optab_libfunc (le_optab, mode, "__gcc_qle");
17775           set_optab_libfunc (unord_optab, mode, "__gcc_qunord");
17776
17777           set_conv_libfunc (sext_optab, mode, SFmode, "__gcc_stoq");
17778           set_conv_libfunc (sext_optab, mode, DFmode, "__gcc_dtoq");
17779           set_conv_libfunc (trunc_optab, SFmode, mode, "__gcc_qtos");
17780           set_conv_libfunc (trunc_optab, DFmode, mode, "__gcc_qtod");
17781           set_conv_libfunc (sfix_optab, SImode, mode, "__gcc_qtoi");
17782           set_conv_libfunc (ufix_optab, SImode, mode, "__gcc_qtou");
17783           set_conv_libfunc (sfloat_optab, mode, SImode, "__gcc_itoq");
17784           set_conv_libfunc (ufloat_optab, mode, SImode, "__gcc_utoq");
17785         }
17786     }
17787   else
17788     {
17789       set_optab_libfunc (add_optab, mode, "_xlqadd");
17790       set_optab_libfunc (sub_optab, mode, "_xlqsub");
17791       set_optab_libfunc (smul_optab, mode, "_xlqmul");
17792       set_optab_libfunc (sdiv_optab, mode, "_xlqdiv");
17793     }
17794
17795   /* Add various conversions for IFmode to use the traditional TFmode
17796      names.  */
17797   if (mode == IFmode)
17798     {
17799       set_conv_libfunc (sext_optab, mode, SDmode, "__dpd_extendsdtf");
17800       set_conv_libfunc (sext_optab, mode, DDmode, "__dpd_extendddtf");
17801       set_conv_libfunc (trunc_optab, mode, TDmode, "__dpd_trunctdtf");
17802       set_conv_libfunc (trunc_optab, SDmode, mode, "__dpd_trunctfsd");
17803       set_conv_libfunc (trunc_optab, DDmode, mode, "__dpd_trunctfdd");
17804       set_conv_libfunc (sext_optab, TDmode, mode, "__dpd_extendtftd");
17805
17806       if (TARGET_POWERPC64)
17807         {
17808           set_conv_libfunc (sfix_optab, TImode, mode, "__fixtfti");
17809           set_conv_libfunc (ufix_optab, TImode, mode, "__fixunstfti");
17810           set_conv_libfunc (sfloat_optab, mode, TImode, "__floattitf");
17811           set_conv_libfunc (ufloat_optab, mode, TImode, "__floatuntitf");
17812         }
17813     }
17814 }
17815
17816 /* Create a decl for either complex long double multiply or complex long double
17817    divide when long double is IEEE 128-bit floating point.  We can't use
17818    __multc3 and __divtc3 because the original long double using IBM extended
17819    double used those names.  The complex multiply/divide functions are encoded
17820    as builtin functions with a complex result and 4 scalar inputs.  */
17821
17822 static void
17823 create_complex_muldiv (const char *name, built_in_function fncode, tree fntype)
17824 {
17825   tree fndecl = add_builtin_function (name, fntype, fncode, BUILT_IN_NORMAL,
17826                                       name, NULL_TREE);
17827
17828   set_builtin_decl (fncode, fndecl, true);
17829
17830   if (TARGET_DEBUG_BUILTIN)
17831     fprintf (stderr, "create complex %s, fncode: %d\n", name, (int) fncode);
17832
17833   return;
17834 }
17835
17836 /* Set up IEEE 128-bit floating point routines.  Use different names if the
17837    arguments can be passed in a vector register.  The historical PowerPC
17838    implementation of IEEE 128-bit floating point used _q_<op> for the names, so
17839    continue to use that if we aren't using vector registers to pass IEEE
17840    128-bit floating point.  */
17841
17842 static void
17843 init_float128_ieee (machine_mode mode)
17844 {
17845   if (FLOAT128_VECTOR_P (mode))
17846     {
17847       static bool complex_muldiv_init_p = false;
17848
17849       /* Set up to call __mulkc3 and __divkc3 under -mabi=ieeelongdouble.  If
17850          we have clone or target attributes, this will be called a second
17851          time.  We want to create the built-in function only once.  */
17852      if (mode == TFmode && TARGET_IEEEQUAD && !complex_muldiv_init_p)
17853        {
17854          complex_muldiv_init_p = true;
17855          built_in_function fncode_mul =
17856            (built_in_function) (BUILT_IN_COMPLEX_MUL_MIN + TCmode
17857                                 - MIN_MODE_COMPLEX_FLOAT);
17858          built_in_function fncode_div =
17859            (built_in_function) (BUILT_IN_COMPLEX_DIV_MIN + TCmode
17860                                 - MIN_MODE_COMPLEX_FLOAT);
17861
17862          tree fntype = build_function_type_list (complex_long_double_type_node,
17863                                                  long_double_type_node,
17864                                                  long_double_type_node,
17865                                                  long_double_type_node,
17866                                                  long_double_type_node,
17867                                                  NULL_TREE);
17868
17869          create_complex_muldiv ("__mulkc3", fncode_mul, fntype);
17870          create_complex_muldiv ("__divkc3", fncode_div, fntype);
17871        }
17872
17873       set_optab_libfunc (add_optab, mode, "__addkf3");
17874       set_optab_libfunc (sub_optab, mode, "__subkf3");
17875       set_optab_libfunc (neg_optab, mode, "__negkf2");
17876       set_optab_libfunc (smul_optab, mode, "__mulkf3");
17877       set_optab_libfunc (sdiv_optab, mode, "__divkf3");
17878       set_optab_libfunc (sqrt_optab, mode, "__sqrtkf2");
17879       set_optab_libfunc (abs_optab, mode, "__abskf2");
17880       set_optab_libfunc (powi_optab, mode, "__powikf2");
17881
17882       set_optab_libfunc (eq_optab, mode, "__eqkf2");
17883       set_optab_libfunc (ne_optab, mode, "__nekf2");
17884       set_optab_libfunc (gt_optab, mode, "__gtkf2");
17885       set_optab_libfunc (ge_optab, mode, "__gekf2");
17886       set_optab_libfunc (lt_optab, mode, "__ltkf2");
17887       set_optab_libfunc (le_optab, mode, "__lekf2");
17888       set_optab_libfunc (unord_optab, mode, "__unordkf2");
17889
17890       set_conv_libfunc (sext_optab, mode, SFmode, "__extendsfkf2");
17891       set_conv_libfunc (sext_optab, mode, DFmode, "__extenddfkf2");
17892       set_conv_libfunc (trunc_optab, SFmode, mode, "__trunckfsf2");
17893       set_conv_libfunc (trunc_optab, DFmode, mode, "__trunckfdf2");
17894
17895       set_conv_libfunc (sext_optab, mode, IFmode, "__trunctfkf2");
17896       if (mode != TFmode && FLOAT128_IBM_P (TFmode))
17897         set_conv_libfunc (sext_optab, mode, TFmode, "__trunctfkf2");
17898
17899       set_conv_libfunc (trunc_optab, IFmode, mode, "__extendkftf2");
17900       if (mode != TFmode && FLOAT128_IBM_P (TFmode))
17901         set_conv_libfunc (trunc_optab, TFmode, mode, "__extendkftf2");
17902
17903       set_conv_libfunc (sext_optab, mode, SDmode, "__dpd_extendsdkf");
17904       set_conv_libfunc (sext_optab, mode, DDmode, "__dpd_extendddkf");
17905       set_conv_libfunc (trunc_optab, mode, TDmode, "__dpd_trunctdkf");
17906       set_conv_libfunc (trunc_optab, SDmode, mode, "__dpd_trunckfsd");
17907       set_conv_libfunc (trunc_optab, DDmode, mode, "__dpd_trunckfdd");
17908       set_conv_libfunc (sext_optab, TDmode, mode, "__dpd_extendkftd");
17909
17910       set_conv_libfunc (sfix_optab, SImode, mode, "__fixkfsi");
17911       set_conv_libfunc (ufix_optab, SImode, mode, "__fixunskfsi");
17912       set_conv_libfunc (sfix_optab, DImode, mode, "__fixkfdi");
17913       set_conv_libfunc (ufix_optab, DImode, mode, "__fixunskfdi");
17914
17915       set_conv_libfunc (sfloat_optab, mode, SImode, "__floatsikf");
17916       set_conv_libfunc (ufloat_optab, mode, SImode, "__floatunsikf");
17917       set_conv_libfunc (sfloat_optab, mode, DImode, "__floatdikf");
17918       set_conv_libfunc (ufloat_optab, mode, DImode, "__floatundikf");
17919
17920       if (TARGET_POWERPC64)
17921         {
17922           set_conv_libfunc (sfix_optab, TImode, mode, "__fixkfti");
17923           set_conv_libfunc (ufix_optab, TImode, mode, "__fixunskfti");
17924           set_conv_libfunc (sfloat_optab, mode, TImode, "__floattikf");
17925           set_conv_libfunc (ufloat_optab, mode, TImode, "__floatuntikf");
17926         }
17927     }
17928
17929   else
17930     {
17931       set_optab_libfunc (add_optab, mode, "_q_add");
17932       set_optab_libfunc (sub_optab, mode, "_q_sub");
17933       set_optab_libfunc (neg_optab, mode, "_q_neg");
17934       set_optab_libfunc (smul_optab, mode, "_q_mul");
17935       set_optab_libfunc (sdiv_optab, mode, "_q_div");
17936       if (TARGET_PPC_GPOPT)
17937         set_optab_libfunc (sqrt_optab, mode, "_q_sqrt");
17938
17939       set_optab_libfunc (eq_optab, mode, "_q_feq");
17940       set_optab_libfunc (ne_optab, mode, "_q_fne");
17941       set_optab_libfunc (gt_optab, mode, "_q_fgt");
17942       set_optab_libfunc (ge_optab, mode, "_q_fge");
17943       set_optab_libfunc (lt_optab, mode, "_q_flt");
17944       set_optab_libfunc (le_optab, mode, "_q_fle");
17945
17946       set_conv_libfunc (sext_optab, mode, SFmode, "_q_stoq");
17947       set_conv_libfunc (sext_optab, mode, DFmode, "_q_dtoq");
17948       set_conv_libfunc (trunc_optab, SFmode, mode, "_q_qtos");
17949       set_conv_libfunc (trunc_optab, DFmode, mode, "_q_qtod");
17950       set_conv_libfunc (sfix_optab, SImode, mode, "_q_qtoi");
17951       set_conv_libfunc (ufix_optab, SImode, mode, "_q_qtou");
17952       set_conv_libfunc (sfloat_optab, mode, SImode, "_q_itoq");
17953       set_conv_libfunc (ufloat_optab, mode, SImode, "_q_utoq");
17954     }
17955 }
17956
17957 static void
17958 rs6000_init_libfuncs (void)
17959 {
17960   /* __float128 support.  */
17961   if (TARGET_FLOAT128_TYPE)
17962     {
17963       init_float128_ibm (IFmode);
17964       init_float128_ieee (KFmode);
17965     }
17966
17967   /* AIX/Darwin/64-bit Linux quad floating point routines.  */
17968   if (TARGET_LONG_DOUBLE_128)
17969     {
17970       if (!TARGET_IEEEQUAD)
17971         init_float128_ibm (TFmode);
17972
17973       /* IEEE 128-bit including 32-bit SVR4 quad floating point routines.  */
17974       else
17975         init_float128_ieee (TFmode);
17976     }
17977 }
17978
17979 /* Emit a potentially record-form instruction, setting DST from SRC.
17980    If DOT is 0, that is all; otherwise, set CCREG to the result of the
17981    signed comparison of DST with zero.  If DOT is 1, the generated RTL
17982    doesn't care about the DST result; if DOT is 2, it does.  If CCREG
17983    is CR0 do a single dot insn (as a PARALLEL); otherwise, do a SET and
17984    a separate COMPARE.  */
17985
17986 void
17987 rs6000_emit_dot_insn (rtx dst, rtx src, int dot, rtx ccreg)
17988 {
17989   if (dot == 0)
17990     {
17991       emit_move_insn (dst, src);
17992       return;
17993     }
17994
17995   if (cc_reg_not_cr0_operand (ccreg, CCmode))
17996     {
17997       emit_move_insn (dst, src);
17998       emit_move_insn (ccreg, gen_rtx_COMPARE (CCmode, dst, const0_rtx));
17999       return;
18000     }
18001
18002   rtx ccset = gen_rtx_SET (ccreg, gen_rtx_COMPARE (CCmode, src, const0_rtx));
18003   if (dot == 1)
18004     {
18005       rtx clobber = gen_rtx_CLOBBER (VOIDmode, dst);
18006       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, ccset, clobber)));
18007     }
18008   else
18009     {
18010       rtx set = gen_rtx_SET (dst, src);
18011       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, ccset, set)));
18012     }
18013 }
18014
18015 \f
18016 /* A validation routine: say whether CODE, a condition code, and MODE
18017    match.  The other alternatives either don't make sense or should
18018    never be generated.  */
18019
18020 void
18021 validate_condition_mode (enum rtx_code code, machine_mode mode)
18022 {
18023   gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
18024                || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
18025               && GET_MODE_CLASS (mode) == MODE_CC);
18026
18027   /* These don't make sense.  */
18028   gcc_assert ((code != GT && code != LT && code != GE && code != LE)
18029               || mode != CCUNSmode);
18030
18031   gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
18032               || mode == CCUNSmode);
18033
18034   gcc_assert (mode == CCFPmode
18035               || (code != ORDERED && code != UNORDERED
18036                   && code != UNEQ && code != LTGT
18037                   && code != UNGT && code != UNLT
18038                   && code != UNGE && code != UNLE));
18039
18040   /* These should never be generated except for
18041      flag_finite_math_only.  */
18042   gcc_assert (mode != CCFPmode
18043               || flag_finite_math_only
18044               || (code != LE && code != GE
18045                   && code != UNEQ && code != LTGT
18046                   && code != UNGT && code != UNLT));
18047
18048   /* These are invalid; the information is not there.  */
18049   gcc_assert (mode != CCEQmode || code == EQ || code == NE);
18050 }
18051
18052 \f
18053 /* Return whether MASK (a CONST_INT) is a valid mask for any rlwinm,
18054    rldicl, rldicr, or rldic instruction in mode MODE.  If so, if E is
18055    not zero, store there the bit offset (counted from the right) where
18056    the single stretch of 1 bits begins; and similarly for B, the bit
18057    offset where it ends.  */
18058
18059 bool
18060 rs6000_is_valid_mask (rtx mask, int *b, int *e, machine_mode mode)
18061 {
18062   unsigned HOST_WIDE_INT val = INTVAL (mask);
18063   unsigned HOST_WIDE_INT bit;
18064   int nb, ne;
18065   int n = GET_MODE_PRECISION (mode);
18066
18067   if (mode != DImode && mode != SImode)
18068     return false;
18069
18070   if (INTVAL (mask) >= 0)
18071     {
18072       bit = val & -val;
18073       ne = exact_log2 (bit);
18074       nb = exact_log2 (val + bit);
18075     }
18076   else if (val + 1 == 0)
18077     {
18078       nb = n;
18079       ne = 0;
18080     }
18081   else if (val & 1)
18082     {
18083       val = ~val;
18084       bit = val & -val;
18085       nb = exact_log2 (bit);
18086       ne = exact_log2 (val + bit);
18087     }
18088   else
18089     {
18090       bit = val & -val;
18091       ne = exact_log2 (bit);
18092       if (val + bit == 0)
18093         nb = n;
18094       else
18095         nb = 0;
18096     }
18097
18098   nb--;
18099
18100   if (nb < 0 || ne < 0 || nb >= n || ne >= n)
18101     return false;
18102
18103   if (b)
18104     *b = nb;
18105   if (e)
18106     *e = ne;
18107
18108   return true;
18109 }
18110
18111 /* Return whether MASK (a CONST_INT) is a valid mask for any rlwinm, rldicl,
18112    or rldicr instruction, to implement an AND with it in mode MODE.  */
18113
18114 bool
18115 rs6000_is_valid_and_mask (rtx mask, machine_mode mode)
18116 {
18117   int nb, ne;
18118
18119   if (!rs6000_is_valid_mask (mask, &nb, &ne, mode))
18120     return false;
18121
18122   /* For DImode, we need a rldicl, rldicr, or a rlwinm with mask that
18123      does not wrap.  */
18124   if (mode == DImode)
18125     return (ne == 0 || nb == 63 || (nb < 32 && ne <= nb));
18126
18127   /* For SImode, rlwinm can do everything.  */
18128   if (mode == SImode)
18129     return (nb < 32 && ne < 32);
18130
18131   return false;
18132 }
18133
18134 /* Return the instruction template for an AND with mask in mode MODE, with
18135    operands OPERANDS.  If DOT is true, make it a record-form instruction.  */
18136
18137 const char *
18138 rs6000_insn_for_and_mask (machine_mode mode, rtx *operands, bool dot)
18139 {
18140   int nb, ne;
18141
18142   if (!rs6000_is_valid_mask (operands[2], &nb, &ne, mode))
18143     gcc_unreachable ();
18144
18145   if (mode == DImode && ne == 0)
18146     {
18147       operands[3] = GEN_INT (63 - nb);
18148       if (dot)
18149         return "rldicl. %0,%1,0,%3";
18150       return "rldicl %0,%1,0,%3";
18151     }
18152
18153   if (mode == DImode && nb == 63)
18154     {
18155       operands[3] = GEN_INT (63 - ne);
18156       if (dot)
18157         return "rldicr. %0,%1,0,%3";
18158       return "rldicr %0,%1,0,%3";
18159     }
18160
18161   if (nb < 32 && ne < 32)
18162     {
18163       operands[3] = GEN_INT (31 - nb);
18164       operands[4] = GEN_INT (31 - ne);
18165       if (dot)
18166         return "rlwinm. %0,%1,0,%3,%4";
18167       return "rlwinm %0,%1,0,%3,%4";
18168     }
18169
18170   gcc_unreachable ();
18171 }
18172
18173 /* Return whether MASK (a CONST_INT) is a valid mask for any rlw[i]nm,
18174    rld[i]cl, rld[i]cr, or rld[i]c instruction, to implement an AND with
18175    shift SHIFT (a ROTATE, ASHIFT, or LSHIFTRT) in mode MODE.  */
18176
18177 bool
18178 rs6000_is_valid_shift_mask (rtx mask, rtx shift, machine_mode mode)
18179 {
18180   int nb, ne;
18181
18182   if (!rs6000_is_valid_mask (mask, &nb, &ne, mode))
18183     return false;
18184
18185   int n = GET_MODE_PRECISION (mode);
18186   int sh = -1;
18187
18188   if (CONST_INT_P (XEXP (shift, 1)))
18189     {
18190       sh = INTVAL (XEXP (shift, 1));
18191       if (sh < 0 || sh >= n)
18192         return false;
18193     }
18194
18195   rtx_code code = GET_CODE (shift);
18196
18197   /* Convert any shift by 0 to a rotate, to simplify below code.  */
18198   if (sh == 0)
18199     code = ROTATE;
18200
18201   /* Convert rotate to simple shift if we can, to make analysis simpler.  */
18202   if (code == ROTATE && sh >= 0 && nb >= ne && ne >= sh)
18203     code = ASHIFT;
18204   if (code == ROTATE && sh >= 0 && nb >= ne && nb < sh)
18205     {
18206       code = LSHIFTRT;
18207       sh = n - sh;
18208     }
18209
18210   /* DImode rotates need rld*.  */
18211   if (mode == DImode && code == ROTATE)
18212     return (nb == 63 || ne == 0 || ne == sh);
18213
18214   /* SImode rotates need rlw*.  */
18215   if (mode == SImode && code == ROTATE)
18216     return (nb < 32 && ne < 32 && sh < 32);
18217
18218   /* Wrap-around masks are only okay for rotates.  */
18219   if (ne > nb)
18220     return false;
18221
18222   /* Variable shifts are only okay for rotates.  */
18223   if (sh < 0)
18224     return false;
18225
18226   /* Don't allow ASHIFT if the mask is wrong for that.  */
18227   if (code == ASHIFT && ne < sh)
18228     return false;
18229
18230   /* If we can do it with an rlw*, we can do it.  Don't allow LSHIFTRT
18231      if the mask is wrong for that.  */
18232   if (nb < 32 && ne < 32 && sh < 32
18233       && !(code == LSHIFTRT && nb >= 32 - sh))
18234     return true;
18235
18236   /* If we can do it with an rld*, we can do it.  Don't allow LSHIFTRT
18237      if the mask is wrong for that.  */
18238   if (code == LSHIFTRT)
18239     sh = 64 - sh;
18240   if (nb == 63 || ne == 0 || ne == sh)
18241     return !(code == LSHIFTRT && nb >= sh);
18242
18243   return false;
18244 }
18245
18246 /* Return the instruction template for a shift with mask in mode MODE, with
18247    operands OPERANDS.  If DOT is true, make it a record-form instruction.  */
18248
18249 const char *
18250 rs6000_insn_for_shift_mask (machine_mode mode, rtx *operands, bool dot)
18251 {
18252   int nb, ne;
18253
18254   if (!rs6000_is_valid_mask (operands[3], &nb, &ne, mode))
18255     gcc_unreachable ();
18256
18257   if (mode == DImode && ne == 0)
18258     {
18259       if (GET_CODE (operands[4]) == LSHIFTRT && INTVAL (operands[2]))
18260         operands[2] = GEN_INT (64 - INTVAL (operands[2]));
18261       operands[3] = GEN_INT (63 - nb);
18262       if (dot)
18263         return "rld%I2cl. %0,%1,%2,%3";
18264       return "rld%I2cl %0,%1,%2,%3";
18265     }
18266
18267   if (mode == DImode && nb == 63)
18268     {
18269       operands[3] = GEN_INT (63 - ne);
18270       if (dot)
18271         return "rld%I2cr. %0,%1,%2,%3";
18272       return "rld%I2cr %0,%1,%2,%3";
18273     }
18274
18275   if (mode == DImode
18276       && GET_CODE (operands[4]) != LSHIFTRT
18277       && CONST_INT_P (operands[2])
18278       && ne == INTVAL (operands[2]))
18279     {
18280       operands[3] = GEN_INT (63 - nb);
18281       if (dot)
18282         return "rld%I2c. %0,%1,%2,%3";
18283       return "rld%I2c %0,%1,%2,%3";
18284     }
18285
18286   if (nb < 32 && ne < 32)
18287     {
18288       if (GET_CODE (operands[4]) == LSHIFTRT && INTVAL (operands[2]))
18289         operands[2] = GEN_INT (32 - INTVAL (operands[2]));
18290       operands[3] = GEN_INT (31 - nb);
18291       operands[4] = GEN_INT (31 - ne);
18292       /* This insn can also be a 64-bit rotate with mask that really makes
18293          it just a shift right (with mask); the %h below are to adjust for
18294          that situation (shift count is >= 32 in that case).  */
18295       if (dot)
18296         return "rlw%I2nm. %0,%1,%h2,%3,%4";
18297       return "rlw%I2nm %0,%1,%h2,%3,%4";
18298     }
18299
18300   gcc_unreachable ();
18301 }
18302
18303 /* Return whether MASK (a CONST_INT) is a valid mask for any rlwimi or
18304    rldimi instruction, to implement an insert with shift SHIFT (a ROTATE,
18305    ASHIFT, or LSHIFTRT) in mode MODE.  */
18306
18307 bool
18308 rs6000_is_valid_insert_mask (rtx mask, rtx shift, machine_mode mode)
18309 {
18310   int nb, ne;
18311
18312   if (!rs6000_is_valid_mask (mask, &nb, &ne, mode))
18313     return false;
18314
18315   int n = GET_MODE_PRECISION (mode);
18316
18317   int sh = INTVAL (XEXP (shift, 1));
18318   if (sh < 0 || sh >= n)
18319     return false;
18320
18321   rtx_code code = GET_CODE (shift);
18322
18323   /* Convert any shift by 0 to a rotate, to simplify below code.  */
18324   if (sh == 0)
18325     code = ROTATE;
18326
18327   /* Convert rotate to simple shift if we can, to make analysis simpler.  */
18328   if (code == ROTATE && sh >= 0 && nb >= ne && ne >= sh)
18329     code = ASHIFT;
18330   if (code == ROTATE && sh >= 0 && nb >= ne && nb < sh)
18331     {
18332       code = LSHIFTRT;
18333       sh = n - sh;
18334     }
18335
18336   /* DImode rotates need rldimi.  */
18337   if (mode == DImode && code == ROTATE)
18338     return (ne == sh);
18339
18340   /* SImode rotates need rlwimi.  */
18341   if (mode == SImode && code == ROTATE)
18342     return (nb < 32 && ne < 32 && sh < 32);
18343
18344   /* Wrap-around masks are only okay for rotates.  */
18345   if (ne > nb)
18346     return false;
18347
18348   /* Don't allow ASHIFT if the mask is wrong for that.  */
18349   if (code == ASHIFT && ne < sh)
18350     return false;
18351
18352   /* If we can do it with an rlwimi, we can do it.  Don't allow LSHIFTRT
18353      if the mask is wrong for that.  */
18354   if (nb < 32 && ne < 32 && sh < 32
18355       && !(code == LSHIFTRT && nb >= 32 - sh))
18356     return true;
18357
18358   /* If we can do it with an rldimi, we can do it.  Don't allow LSHIFTRT
18359      if the mask is wrong for that.  */
18360   if (code == LSHIFTRT)
18361     sh = 64 - sh;
18362   if (ne == sh)
18363     return !(code == LSHIFTRT && nb >= sh);
18364
18365   return false;
18366 }
18367
18368 /* Return the instruction template for an insert with mask in mode MODE, with
18369    operands OPERANDS.  If DOT is true, make it a record-form instruction.  */
18370
18371 const char *
18372 rs6000_insn_for_insert_mask (machine_mode mode, rtx *operands, bool dot)
18373 {
18374   int nb, ne;
18375
18376   if (!rs6000_is_valid_mask (operands[3], &nb, &ne, mode))
18377     gcc_unreachable ();
18378
18379   /* Prefer rldimi because rlwimi is cracked.  */
18380   if (TARGET_POWERPC64
18381       && (!dot || mode == DImode)
18382       && GET_CODE (operands[4]) != LSHIFTRT
18383       && ne == INTVAL (operands[2]))
18384     {
18385       operands[3] = GEN_INT (63 - nb);
18386       if (dot)
18387         return "rldimi. %0,%1,%2,%3";
18388       return "rldimi %0,%1,%2,%3";
18389     }
18390
18391   if (nb < 32 && ne < 32)
18392     {
18393       if (GET_CODE (operands[4]) == LSHIFTRT && INTVAL (operands[2]))
18394         operands[2] = GEN_INT (32 - INTVAL (operands[2]));
18395       operands[3] = GEN_INT (31 - nb);
18396       operands[4] = GEN_INT (31 - ne);
18397       if (dot)
18398         return "rlwimi. %0,%1,%2,%3,%4";
18399       return "rlwimi %0,%1,%2,%3,%4";
18400     }
18401
18402   gcc_unreachable ();
18403 }
18404
18405 /* Return whether an AND with C (a CONST_INT) in mode MODE can be done
18406    using two machine instructions.  */
18407
18408 bool
18409 rs6000_is_valid_2insn_and (rtx c, machine_mode mode)
18410 {
18411   /* There are two kinds of AND we can handle with two insns:
18412      1) those we can do with two rl* insn;
18413      2) ori[s];xori[s].
18414
18415      We do not handle that last case yet.  */
18416
18417   /* If there is just one stretch of ones, we can do it.  */
18418   if (rs6000_is_valid_mask (c, NULL, NULL, mode))
18419     return true;
18420
18421   /* Otherwise, fill in the lowest "hole"; if we can do the result with
18422      one insn, we can do the whole thing with two.  */
18423   unsigned HOST_WIDE_INT val = INTVAL (c);
18424   unsigned HOST_WIDE_INT bit1 = val & -val;
18425   unsigned HOST_WIDE_INT bit2 = (val + bit1) & ~val;
18426   unsigned HOST_WIDE_INT val1 = (val + bit1) & val;
18427   unsigned HOST_WIDE_INT bit3 = val1 & -val1;
18428   return rs6000_is_valid_and_mask (GEN_INT (val + bit3 - bit2), mode);
18429 }
18430
18431 /* Emit the two insns to do an AND in mode MODE, with operands OPERANDS.
18432    If EXPAND is true, split rotate-and-mask instructions we generate to
18433    their constituent parts as well (this is used during expand); if DOT
18434    is 1, make the last insn a record-form instruction clobbering the
18435    destination GPR and setting the CC reg (from operands[3]); if 2, set
18436    that GPR as well as the CC reg.  */
18437
18438 void
18439 rs6000_emit_2insn_and (machine_mode mode, rtx *operands, bool expand, int dot)
18440 {
18441   gcc_assert (!(expand && dot));
18442
18443   unsigned HOST_WIDE_INT val = INTVAL (operands[2]);
18444
18445   /* If it is one stretch of ones, it is DImode; shift left, mask, then
18446      shift right.  This generates better code than doing the masks without
18447      shifts, or shifting first right and then left.  */
18448   int nb, ne;
18449   if (rs6000_is_valid_mask (operands[2], &nb, &ne, mode) && nb >= ne)
18450     {
18451       gcc_assert (mode == DImode);
18452
18453       int shift = 63 - nb;
18454       if (expand)
18455         {
18456           rtx tmp1 = gen_reg_rtx (DImode);
18457           rtx tmp2 = gen_reg_rtx (DImode);
18458           emit_insn (gen_ashldi3 (tmp1, operands[1], GEN_INT (shift)));
18459           emit_insn (gen_anddi3 (tmp2, tmp1, GEN_INT (val << shift)));
18460           emit_insn (gen_lshrdi3 (operands[0], tmp2, GEN_INT (shift)));
18461         }
18462       else
18463         {
18464           rtx tmp = gen_rtx_ASHIFT (mode, operands[1], GEN_INT (shift));
18465           tmp = gen_rtx_AND (mode, tmp, GEN_INT (val << shift));
18466           emit_move_insn (operands[0], tmp);
18467           tmp = gen_rtx_LSHIFTRT (mode, operands[0], GEN_INT (shift));
18468           rs6000_emit_dot_insn (operands[0], tmp, dot, dot ? operands[3] : 0);
18469         }
18470       return;
18471     }
18472
18473   /* Otherwise, make a mask2 that cuts out the lowest "hole", and a mask1
18474      that does the rest.  */
18475   unsigned HOST_WIDE_INT bit1 = val & -val;
18476   unsigned HOST_WIDE_INT bit2 = (val + bit1) & ~val;
18477   unsigned HOST_WIDE_INT val1 = (val + bit1) & val;
18478   unsigned HOST_WIDE_INT bit3 = val1 & -val1;
18479
18480   unsigned HOST_WIDE_INT mask1 = -bit3 + bit2 - 1;
18481   unsigned HOST_WIDE_INT mask2 = val + bit3 - bit2;
18482
18483   gcc_assert (rs6000_is_valid_and_mask (GEN_INT (mask2), mode));
18484
18485   /* Two "no-rotate"-and-mask instructions, for SImode.  */
18486   if (rs6000_is_valid_and_mask (GEN_INT (mask1), mode))
18487     {
18488       gcc_assert (mode == SImode);
18489
18490       rtx reg = expand ? gen_reg_rtx (mode) : operands[0];
18491       rtx tmp = gen_rtx_AND (mode, operands[1], GEN_INT (mask1));
18492       emit_move_insn (reg, tmp);
18493       tmp = gen_rtx_AND (mode, reg, GEN_INT (mask2));
18494       rs6000_emit_dot_insn (operands[0], tmp, dot, dot ? operands[3] : 0);
18495       return;
18496     }
18497
18498   gcc_assert (mode == DImode);
18499
18500   /* Two "no-rotate"-and-mask instructions, for DImode: both are rlwinm
18501      insns; we have to do the first in SImode, because it wraps.  */
18502   if (mask2 <= 0xffffffff
18503       && rs6000_is_valid_and_mask (GEN_INT (mask1), SImode))
18504     {
18505       rtx reg = expand ? gen_reg_rtx (mode) : operands[0];
18506       rtx tmp = gen_rtx_AND (SImode, gen_lowpart (SImode, operands[1]),
18507                              GEN_INT (mask1));
18508       rtx reg_low = gen_lowpart (SImode, reg);
18509       emit_move_insn (reg_low, 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   /* Two rld* insns: rotate, clear the hole in the middle (which now is
18516      at the top end), rotate back and clear the other hole.  */
18517   int right = exact_log2 (bit3);
18518   int left = 64 - right;
18519
18520   /* Rotate the mask too.  */
18521   mask1 = (mask1 >> right) | ((bit2 - 1) << left);
18522
18523   if (expand)
18524     {
18525       rtx tmp1 = gen_reg_rtx (DImode);
18526       rtx tmp2 = gen_reg_rtx (DImode);
18527       rtx tmp3 = gen_reg_rtx (DImode);
18528       emit_insn (gen_rotldi3 (tmp1, operands[1], GEN_INT (left)));
18529       emit_insn (gen_anddi3 (tmp2, tmp1, GEN_INT (mask1)));
18530       emit_insn (gen_rotldi3 (tmp3, tmp2, GEN_INT (right)));
18531       emit_insn (gen_anddi3 (operands[0], tmp3, GEN_INT (mask2)));
18532     }
18533   else
18534     {
18535       rtx tmp = gen_rtx_ROTATE (mode, operands[1], GEN_INT (left));
18536       tmp = gen_rtx_AND (mode, tmp, GEN_INT (mask1));
18537       emit_move_insn (operands[0], tmp);
18538       tmp = gen_rtx_ROTATE (mode, operands[0], GEN_INT (right));
18539       tmp = gen_rtx_AND (mode, tmp, GEN_INT (mask2));
18540       rs6000_emit_dot_insn (operands[0], tmp, dot, dot ? operands[3] : 0);
18541     }
18542 }
18543 \f
18544 /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
18545    for lfq and stfq insns iff the registers are hard registers.   */
18546
18547 int
18548 registers_ok_for_quad_peep (rtx reg1, rtx reg2)
18549 {
18550   /* We might have been passed a SUBREG.  */
18551   if (!REG_P (reg1) || !REG_P (reg2))
18552     return 0;
18553
18554   /* We might have been passed non floating point registers.  */
18555   if (!FP_REGNO_P (REGNO (reg1))
18556       || !FP_REGNO_P (REGNO (reg2)))
18557     return 0;
18558
18559   return (REGNO (reg1) == REGNO (reg2) - 1);
18560 }
18561
18562 /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
18563    addr1 and addr2 must be in consecutive memory locations
18564    (addr2 == addr1 + 8).  */
18565
18566 int
18567 mems_ok_for_quad_peep (rtx mem1, rtx mem2)
18568 {
18569   rtx addr1, addr2;
18570   unsigned int reg1, reg2;
18571   int offset1, offset2;
18572
18573   /* The mems cannot be volatile.  */
18574   if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
18575     return 0;
18576
18577   addr1 = XEXP (mem1, 0);
18578   addr2 = XEXP (mem2, 0);
18579
18580   /* Extract an offset (if used) from the first addr.  */
18581   if (GET_CODE (addr1) == PLUS)
18582     {
18583       /* If not a REG, return zero.  */
18584       if (!REG_P (XEXP (addr1, 0)))
18585         return 0;
18586       else
18587         {
18588           reg1 = REGNO (XEXP (addr1, 0));
18589           /* The offset must be constant!  */
18590           if (!CONST_INT_P (XEXP (addr1, 1)))
18591             return 0;
18592           offset1 = INTVAL (XEXP (addr1, 1));
18593         }
18594     }
18595   else if (!REG_P (addr1))
18596     return 0;
18597   else
18598     {
18599       reg1 = REGNO (addr1);
18600       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
18601       offset1 = 0;
18602     }
18603
18604   /* And now for the second addr.  */
18605   if (GET_CODE (addr2) == PLUS)
18606     {
18607       /* If not a REG, return zero.  */
18608       if (!REG_P (XEXP (addr2, 0)))
18609         return 0;
18610       else
18611         {
18612           reg2 = REGNO (XEXP (addr2, 0));
18613           /* The offset must be constant. */
18614           if (!CONST_INT_P (XEXP (addr2, 1)))
18615             return 0;
18616           offset2 = INTVAL (XEXP (addr2, 1));
18617         }
18618     }
18619   else if (!REG_P (addr2))
18620     return 0;
18621   else
18622     {
18623       reg2 = REGNO (addr2);
18624       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
18625       offset2 = 0;
18626     }
18627
18628   /* Both of these must have the same base register.  */
18629   if (reg1 != reg2)
18630     return 0;
18631
18632   /* The offset for the second addr must be 8 more than the first addr.  */
18633   if (offset2 != offset1 + 8)
18634     return 0;
18635
18636   /* All the tests passed.  addr1 and addr2 are valid for lfq or stfq
18637      instructions.  */
18638   return 1;
18639 }
18640 \f
18641 /* Implement TARGET_SECONDARY_RELOAD_NEEDED_MODE.  For SDmode values we
18642    need to use DDmode, in all other cases we can use the same mode.  */
18643 static machine_mode
18644 rs6000_secondary_memory_needed_mode (machine_mode mode)
18645 {
18646   if (lra_in_progress && mode == SDmode)
18647     return DDmode;
18648   return mode;
18649 }
18650
18651 /* Classify a register type.  Because the FMRGOW/FMRGEW instructions only work
18652    on traditional floating point registers, and the VMRGOW/VMRGEW instructions
18653    only work on the traditional altivec registers, note if an altivec register
18654    was chosen.  */
18655
18656 static enum rs6000_reg_type
18657 register_to_reg_type (rtx reg, bool *is_altivec)
18658 {
18659   HOST_WIDE_INT regno;
18660   enum reg_class rclass;
18661
18662   if (SUBREG_P (reg))
18663     reg = SUBREG_REG (reg);
18664
18665   if (!REG_P (reg))
18666     return NO_REG_TYPE;
18667
18668   regno = REGNO (reg);
18669   if (!HARD_REGISTER_NUM_P (regno))
18670     {
18671       if (!lra_in_progress && !reload_completed)
18672         return PSEUDO_REG_TYPE;
18673
18674       regno = true_regnum (reg);
18675       if (regno < 0 || !HARD_REGISTER_NUM_P (regno))
18676         return PSEUDO_REG_TYPE;
18677     }
18678
18679   gcc_assert (regno >= 0);
18680
18681   if (is_altivec && ALTIVEC_REGNO_P (regno))
18682     *is_altivec = true;
18683
18684   rclass = rs6000_regno_regclass[regno];
18685   return reg_class_to_reg_type[(int)rclass];
18686 }
18687
18688 /* Helper function to return the cost of adding a TOC entry address.  */
18689
18690 static inline int
18691 rs6000_secondary_reload_toc_costs (addr_mask_type addr_mask)
18692 {
18693   int ret;
18694
18695   if (TARGET_CMODEL != CMODEL_SMALL)
18696     ret = ((addr_mask & RELOAD_REG_OFFSET) == 0) ? 1 : 2;
18697
18698   else
18699     ret = (TARGET_MINIMAL_TOC) ? 6 : 3;
18700
18701   return ret;
18702 }
18703
18704 /* Helper function for rs6000_secondary_reload to determine whether the memory
18705    address (ADDR) with a given register class (RCLASS) and machine mode (MODE)
18706    needs reloading.  Return negative if the memory is not handled by the memory
18707    helper functions and to try a different reload method, 0 if no additional
18708    instructions are need, and positive to give the extra cost for the
18709    memory.  */
18710
18711 static int
18712 rs6000_secondary_reload_memory (rtx addr,
18713                                 enum reg_class rclass,
18714                                 machine_mode mode)
18715 {
18716   int extra_cost = 0;
18717   rtx reg, and_arg, plus_arg0, plus_arg1;
18718   addr_mask_type addr_mask;
18719   const char *type = NULL;
18720   const char *fail_msg = NULL;
18721
18722   if (GPR_REG_CLASS_P (rclass))
18723     addr_mask = reg_addr[mode].addr_mask[RELOAD_REG_GPR];
18724
18725   else if (rclass == FLOAT_REGS)
18726     addr_mask = reg_addr[mode].addr_mask[RELOAD_REG_FPR];
18727
18728   else if (rclass == ALTIVEC_REGS)
18729     addr_mask = reg_addr[mode].addr_mask[RELOAD_REG_VMX];
18730
18731   /* For the combined VSX_REGS, turn off Altivec AND -16.  */
18732   else if (rclass == VSX_REGS)
18733     addr_mask = (reg_addr[mode].addr_mask[RELOAD_REG_VMX]
18734                  & ~RELOAD_REG_AND_M16);
18735
18736   /* If the register allocator hasn't made up its mind yet on the register
18737      class to use, settle on defaults to use.  */
18738   else if (rclass == NO_REGS)
18739     {
18740       addr_mask = (reg_addr[mode].addr_mask[RELOAD_REG_ANY]
18741                    & ~RELOAD_REG_AND_M16);
18742
18743       if ((addr_mask & RELOAD_REG_MULTIPLE) != 0)
18744         addr_mask &= ~(RELOAD_REG_INDEXED
18745                        | RELOAD_REG_PRE_INCDEC
18746                        | RELOAD_REG_PRE_MODIFY);
18747     }
18748
18749   else
18750     addr_mask = 0;
18751
18752   /* If the register isn't valid in this register class, just return now.  */
18753   if ((addr_mask & RELOAD_REG_VALID) == 0)
18754     {
18755       if (TARGET_DEBUG_ADDR)
18756         {
18757           fprintf (stderr,
18758                    "rs6000_secondary_reload_memory: mode = %s, class = %s, "
18759                    "not valid in class\n",
18760                    GET_MODE_NAME (mode), reg_class_names[rclass]);
18761           debug_rtx (addr);
18762         }
18763
18764       return -1;
18765     }
18766
18767   switch (GET_CODE (addr))
18768     {
18769       /* Does the register class supports auto update forms for this mode?  We
18770          don't need a scratch register, since the powerpc only supports
18771          PRE_INC, PRE_DEC, and PRE_MODIFY.  */
18772     case PRE_INC:
18773     case PRE_DEC:
18774       reg = XEXP (addr, 0);
18775       if (!base_reg_operand (addr, GET_MODE (reg)))
18776         {
18777           fail_msg = "no base register #1";
18778           extra_cost = -1;
18779         }
18780
18781       else if ((addr_mask & RELOAD_REG_PRE_INCDEC) == 0)
18782         {
18783           extra_cost = 1;
18784           type = "update";
18785         }
18786       break;
18787
18788     case PRE_MODIFY:
18789       reg = XEXP (addr, 0);
18790       plus_arg1 = XEXP (addr, 1);
18791       if (!base_reg_operand (reg, GET_MODE (reg))
18792           || GET_CODE (plus_arg1) != PLUS
18793           || !rtx_equal_p (reg, XEXP (plus_arg1, 0)))
18794         {
18795           fail_msg = "bad PRE_MODIFY";
18796           extra_cost = -1;
18797         }
18798
18799       else if ((addr_mask & RELOAD_REG_PRE_MODIFY) == 0)
18800         {
18801           extra_cost = 1;
18802           type = "update";
18803         }
18804       break;
18805
18806       /* Do we need to simulate AND -16 to clear the bottom address bits used
18807          in VMX load/stores?  Only allow the AND for vector sizes.  */
18808     case AND:
18809       and_arg = XEXP (addr, 0);
18810       if (GET_MODE_SIZE (mode) != 16
18811           || !CONST_INT_P (XEXP (addr, 1))
18812           || INTVAL (XEXP (addr, 1)) != -16)
18813         {
18814           fail_msg = "bad Altivec AND #1";
18815           extra_cost = -1;
18816         }
18817
18818       if (rclass != ALTIVEC_REGS)
18819         {
18820           if (legitimate_indirect_address_p (and_arg, false))
18821             extra_cost = 1;
18822
18823           else if (legitimate_indexed_address_p (and_arg, false))
18824             extra_cost = 2;
18825
18826           else
18827             {
18828               fail_msg = "bad Altivec AND #2";
18829               extra_cost = -1;
18830             }
18831
18832           type = "and";
18833         }
18834       break;
18835
18836       /* If this is an indirect address, make sure it is a base register.  */
18837     case REG:
18838     case SUBREG:
18839       if (!legitimate_indirect_address_p (addr, false))
18840         {
18841           extra_cost = 1;
18842           type = "move";
18843         }
18844       break;
18845
18846       /* If this is an indexed address, make sure the register class can handle
18847          indexed addresses for this mode.  */
18848     case PLUS:
18849       plus_arg0 = XEXP (addr, 0);
18850       plus_arg1 = XEXP (addr, 1);
18851
18852       /* (plus (plus (reg) (constant)) (constant)) is generated during
18853          push_reload processing, so handle it now.  */
18854       if (GET_CODE (plus_arg0) == PLUS && CONST_INT_P (plus_arg1))
18855         {
18856           if ((addr_mask & RELOAD_REG_OFFSET) == 0)
18857             {
18858               extra_cost = 1;
18859               type = "offset";
18860             }
18861         }
18862
18863       /* (plus (plus (reg) (constant)) (reg)) is also generated during
18864          push_reload processing, so handle it now.  */
18865       else if (GET_CODE (plus_arg0) == PLUS && REG_P (plus_arg1))
18866         {
18867           if ((addr_mask & RELOAD_REG_INDEXED) == 0)
18868             {
18869               extra_cost = 1;
18870               type = "indexed #2";
18871             }
18872         }
18873
18874       else if (!base_reg_operand (plus_arg0, GET_MODE (plus_arg0)))
18875         {
18876           fail_msg = "no base register #2";
18877           extra_cost = -1;
18878         }
18879
18880       else if (int_reg_operand (plus_arg1, GET_MODE (plus_arg1)))
18881         {
18882           if ((addr_mask & RELOAD_REG_INDEXED) == 0
18883               || !legitimate_indexed_address_p (addr, false))
18884             {
18885               extra_cost = 1;
18886               type = "indexed";
18887             }
18888         }
18889
18890       else if ((addr_mask & RELOAD_REG_QUAD_OFFSET) != 0
18891                && CONST_INT_P (plus_arg1))
18892         {
18893           if (!quad_address_offset_p (INTVAL (plus_arg1)))
18894             {
18895               extra_cost = 1;
18896               type = "vector d-form offset";
18897             }
18898         }
18899
18900       /* Make sure the register class can handle offset addresses.  */
18901       else if (rs6000_legitimate_offset_address_p (mode, addr, false, true))
18902         {
18903           if ((addr_mask & RELOAD_REG_OFFSET) == 0)
18904             {
18905               extra_cost = 1;
18906               type = "offset #2";
18907             }
18908         }
18909
18910       else
18911         {
18912           fail_msg = "bad PLUS";
18913           extra_cost = -1;
18914         }
18915
18916       break;
18917
18918     case LO_SUM:
18919       /* Quad offsets are restricted and can't handle normal addresses.  */
18920       if ((addr_mask & RELOAD_REG_QUAD_OFFSET) != 0)
18921         {
18922           extra_cost = -1;
18923           type = "vector d-form lo_sum";
18924         }
18925
18926       else if (!legitimate_lo_sum_address_p (mode, addr, false))
18927         {
18928           fail_msg = "bad LO_SUM";
18929           extra_cost = -1;
18930         }
18931
18932       if ((addr_mask & RELOAD_REG_OFFSET) == 0)
18933         {
18934           extra_cost = 1;
18935           type = "lo_sum";
18936         }
18937       break;
18938
18939       /* Static addresses need to create a TOC entry.  */
18940     case CONST:
18941     case SYMBOL_REF:
18942     case LABEL_REF:
18943       if ((addr_mask & RELOAD_REG_QUAD_OFFSET) != 0)
18944         {
18945           extra_cost = -1;
18946           type = "vector d-form lo_sum #2";
18947         }
18948
18949       else
18950         {
18951           type = "address";
18952           extra_cost = rs6000_secondary_reload_toc_costs (addr_mask);
18953         }
18954       break;
18955
18956       /* TOC references look like offsetable memory.  */
18957     case UNSPEC:
18958       if (TARGET_CMODEL == CMODEL_SMALL || XINT (addr, 1) != UNSPEC_TOCREL)
18959         {
18960           fail_msg = "bad UNSPEC";
18961           extra_cost = -1;
18962         }
18963
18964       else if ((addr_mask & RELOAD_REG_QUAD_OFFSET) != 0)
18965         {
18966           extra_cost = -1;
18967           type = "vector d-form lo_sum #3";
18968         }
18969
18970       else if ((addr_mask & RELOAD_REG_OFFSET) == 0)
18971         {
18972           extra_cost = 1;
18973           type = "toc reference";
18974         }
18975       break;
18976
18977     default:
18978         {
18979           fail_msg = "bad address";
18980           extra_cost = -1;
18981         }
18982     }
18983
18984   if (TARGET_DEBUG_ADDR /* && extra_cost != 0 */)
18985     {
18986       if (extra_cost < 0)
18987         fprintf (stderr,
18988                  "rs6000_secondary_reload_memory error: mode = %s, "
18989                  "class = %s, addr_mask = '%s', %s\n",
18990                  GET_MODE_NAME (mode),
18991                  reg_class_names[rclass],
18992                  rs6000_debug_addr_mask (addr_mask, false),
18993                  (fail_msg != NULL) ? fail_msg : "<bad address>");
18994
18995       else
18996         fprintf (stderr,
18997                  "rs6000_secondary_reload_memory: mode = %s, class = %s, "
18998                  "addr_mask = '%s', extra cost = %d, %s\n",
18999                  GET_MODE_NAME (mode),
19000                  reg_class_names[rclass],
19001                  rs6000_debug_addr_mask (addr_mask, false),
19002                  extra_cost,
19003                  (type) ? type : "<none>");
19004
19005       debug_rtx (addr);
19006     }
19007
19008   return extra_cost;
19009 }
19010
19011 /* Helper function for rs6000_secondary_reload to return true if a move to a
19012    different register classe is really a simple move.  */
19013
19014 static bool
19015 rs6000_secondary_reload_simple_move (enum rs6000_reg_type to_type,
19016                                      enum rs6000_reg_type from_type,
19017                                      machine_mode mode)
19018 {
19019   int size = GET_MODE_SIZE (mode);
19020
19021   /* Add support for various direct moves available.  In this function, we only
19022      look at cases where we don't need any extra registers, and one or more
19023      simple move insns are issued.  Originally small integers are not allowed
19024      in FPR/VSX registers.  Single precision binary floating is not a simple
19025      move because we need to convert to the single precision memory layout.
19026      The 4-byte SDmode can be moved.  TDmode values are disallowed since they
19027      need special direct move handling, which we do not support yet.  */
19028   if (TARGET_DIRECT_MOVE
19029       && ((to_type == GPR_REG_TYPE && from_type == VSX_REG_TYPE)
19030           || (to_type == VSX_REG_TYPE && from_type == GPR_REG_TYPE)))
19031     {
19032       if (TARGET_POWERPC64)
19033         {
19034           /* ISA 2.07: MTVSRD or MVFVSRD.  */
19035           if (size == 8)
19036             return true;
19037
19038           /* ISA 3.0: MTVSRDD or MFVSRD + MFVSRLD.  */
19039           if (size == 16 && TARGET_P9_VECTOR && mode != TDmode)
19040             return true;
19041         }
19042
19043       /* ISA 2.07: MTVSRWZ or  MFVSRWZ.  */
19044       if (TARGET_P8_VECTOR)
19045         {
19046           if (mode == SImode)
19047             return true;
19048
19049           if (TARGET_P9_VECTOR && (mode == HImode || mode == QImode))
19050             return true;
19051         }
19052
19053       /* ISA 2.07: MTVSRWZ or  MFVSRWZ.  */
19054       if (mode == SDmode)
19055         return true;
19056     }
19057
19058   /* Move to/from SPR.  */
19059   else if ((size == 4 || (TARGET_POWERPC64 && size == 8))
19060            && ((to_type == GPR_REG_TYPE && from_type == SPR_REG_TYPE)
19061                || (to_type == SPR_REG_TYPE && from_type == GPR_REG_TYPE)))
19062     return true;
19063
19064   return false;
19065 }
19066
19067 /* Direct move helper function for rs6000_secondary_reload, handle all of the
19068    special direct moves that involve allocating an extra register, return the
19069    insn code of the helper function if there is such a function or
19070    CODE_FOR_nothing if not.  */
19071
19072 static bool
19073 rs6000_secondary_reload_direct_move (enum rs6000_reg_type to_type,
19074                                      enum rs6000_reg_type from_type,
19075                                      machine_mode mode,
19076                                      secondary_reload_info *sri,
19077                                      bool altivec_p)
19078 {
19079   bool ret = false;
19080   enum insn_code icode = CODE_FOR_nothing;
19081   int cost = 0;
19082   int size = GET_MODE_SIZE (mode);
19083
19084   if (TARGET_POWERPC64 && size == 16)
19085     {
19086       /* Handle moving 128-bit values from GPRs to VSX point registers on
19087          ISA 2.07 (power8, power9) when running in 64-bit mode using
19088          XXPERMDI to glue the two 64-bit values back together.  */
19089       if (to_type == VSX_REG_TYPE && from_type == GPR_REG_TYPE)
19090         {
19091           cost = 3;                     /* 2 mtvsrd's, 1 xxpermdi.  */
19092           icode = reg_addr[mode].reload_vsx_gpr;
19093         }
19094
19095       /* Handle moving 128-bit values from VSX point registers to GPRs on
19096          ISA 2.07 when running in 64-bit mode using XXPERMDI to get access to the
19097          bottom 64-bit value.  */
19098       else if (to_type == GPR_REG_TYPE && from_type == VSX_REG_TYPE)
19099         {
19100           cost = 3;                     /* 2 mfvsrd's, 1 xxpermdi.  */
19101           icode = reg_addr[mode].reload_gpr_vsx;
19102         }
19103     }
19104
19105   else if (TARGET_POWERPC64 && mode == SFmode)
19106     {
19107       if (to_type == GPR_REG_TYPE && from_type == VSX_REG_TYPE)
19108         {
19109           cost = 3;                     /* xscvdpspn, mfvsrd, and.  */
19110           icode = reg_addr[mode].reload_gpr_vsx;
19111         }
19112
19113       else if (to_type == VSX_REG_TYPE && from_type == GPR_REG_TYPE)
19114         {
19115           cost = 2;                     /* mtvsrz, xscvspdpn.  */
19116           icode = reg_addr[mode].reload_vsx_gpr;
19117         }
19118     }
19119
19120   else if (!TARGET_POWERPC64 && size == 8)
19121     {
19122       /* Handle moving 64-bit values from GPRs to floating point registers on
19123          ISA 2.07 when running in 32-bit mode using FMRGOW to glue the two
19124          32-bit values back together.  Altivec register classes must be handled
19125          specially since a different instruction is used, and the secondary
19126          reload support requires a single instruction class in the scratch
19127          register constraint.  However, right now TFmode is not allowed in
19128          Altivec registers, so the pattern will never match.  */
19129       if (to_type == VSX_REG_TYPE && from_type == GPR_REG_TYPE && !altivec_p)
19130         {
19131           cost = 3;                     /* 2 mtvsrwz's, 1 fmrgow.  */
19132           icode = reg_addr[mode].reload_fpr_gpr;
19133         }
19134     }
19135
19136   if (icode != CODE_FOR_nothing)
19137     {
19138       ret = true;
19139       if (sri)
19140         {
19141           sri->icode = icode;
19142           sri->extra_cost = cost;
19143         }
19144     }
19145
19146   return ret;
19147 }
19148
19149 /* Return whether a move between two register classes can be done either
19150    directly (simple move) or via a pattern that uses a single extra temporary
19151    (using ISA 2.07's direct move in this case.  */
19152
19153 static bool
19154 rs6000_secondary_reload_move (enum rs6000_reg_type to_type,
19155                               enum rs6000_reg_type from_type,
19156                               machine_mode mode,
19157                               secondary_reload_info *sri,
19158                               bool altivec_p)
19159 {
19160   /* Fall back to load/store reloads if either type is not a register.  */
19161   if (to_type == NO_REG_TYPE || from_type == NO_REG_TYPE)
19162     return false;
19163
19164   /* If we haven't allocated registers yet, assume the move can be done for the
19165      standard register types.  */
19166   if ((to_type == PSEUDO_REG_TYPE && from_type == PSEUDO_REG_TYPE)
19167       || (to_type == PSEUDO_REG_TYPE && IS_STD_REG_TYPE (from_type))
19168       || (from_type == PSEUDO_REG_TYPE && IS_STD_REG_TYPE (to_type)))
19169     return true;
19170
19171   /* Moves to the same set of registers is a simple move for non-specialized
19172      registers.  */
19173   if (to_type == from_type && IS_STD_REG_TYPE (to_type))
19174     return true;
19175
19176   /* Check whether a simple move can be done directly.  */
19177   if (rs6000_secondary_reload_simple_move (to_type, from_type, mode))
19178     {
19179       if (sri)
19180         {
19181           sri->icode = CODE_FOR_nothing;
19182           sri->extra_cost = 0;
19183         }
19184       return true;
19185     }
19186
19187   /* Now check if we can do it in a few steps.  */
19188   return rs6000_secondary_reload_direct_move (to_type, from_type, mode, sri,
19189                                               altivec_p);
19190 }
19191
19192 /* Inform reload about cases where moving X with a mode MODE to a register in
19193    RCLASS requires an extra scratch or immediate register.  Return the class
19194    needed for the immediate register.
19195
19196    For VSX and Altivec, we may need a register to convert sp+offset into
19197    reg+sp.
19198
19199    For misaligned 64-bit gpr loads and stores we need a register to
19200    convert an offset address to indirect.  */
19201
19202 static reg_class_t
19203 rs6000_secondary_reload (bool in_p,
19204                          rtx x,
19205                          reg_class_t rclass_i,
19206                          machine_mode mode,
19207                          secondary_reload_info *sri)
19208 {
19209   enum reg_class rclass = (enum reg_class) rclass_i;
19210   reg_class_t ret = ALL_REGS;
19211   enum insn_code icode;
19212   bool default_p = false;
19213   bool done_p = false;
19214
19215   /* Allow subreg of memory before/during reload.  */
19216   bool memory_p = (MEM_P (x)
19217                    || (!reload_completed && SUBREG_P (x)
19218                        && MEM_P (SUBREG_REG (x))));
19219
19220   sri->icode = CODE_FOR_nothing;
19221   sri->t_icode = CODE_FOR_nothing;
19222   sri->extra_cost = 0;
19223   icode = ((in_p)
19224            ? reg_addr[mode].reload_load
19225            : reg_addr[mode].reload_store);
19226
19227   if (REG_P (x) || register_operand (x, mode))
19228     {
19229       enum rs6000_reg_type to_type = reg_class_to_reg_type[(int)rclass];
19230       bool altivec_p = (rclass == ALTIVEC_REGS);
19231       enum rs6000_reg_type from_type = register_to_reg_type (x, &altivec_p);
19232
19233       if (!in_p)
19234         std::swap (to_type, from_type);
19235
19236       /* Can we do a direct move of some sort?  */
19237       if (rs6000_secondary_reload_move (to_type, from_type, mode, sri,
19238                                         altivec_p))
19239         {
19240           icode = (enum insn_code)sri->icode;
19241           default_p = false;
19242           done_p = true;
19243           ret = NO_REGS;
19244         }
19245     }
19246
19247   /* Make sure 0.0 is not reloaded or forced into memory.  */
19248   if (x == CONST0_RTX (mode) && VSX_REG_CLASS_P (rclass))
19249     {
19250       ret = NO_REGS;
19251       default_p = false;
19252       done_p = true;
19253     }
19254
19255   /* If this is a scalar floating point value and we want to load it into the
19256      traditional Altivec registers, do it via a move via a traditional floating
19257      point register, unless we have D-form addressing.  Also make sure that
19258      non-zero constants use a FPR.  */
19259   if (!done_p && reg_addr[mode].scalar_in_vmx_p
19260       && !mode_supports_vmx_dform (mode)
19261       && (rclass == VSX_REGS || rclass == ALTIVEC_REGS)
19262       && (memory_p || CONST_DOUBLE_P (x)))
19263     {
19264       ret = FLOAT_REGS;
19265       default_p = false;
19266       done_p = true;
19267     }
19268
19269   /* Handle reload of load/stores if we have reload helper functions.  */
19270   if (!done_p && icode != CODE_FOR_nothing && memory_p)
19271     {
19272       int extra_cost = rs6000_secondary_reload_memory (XEXP (x, 0), rclass,
19273                                                        mode);
19274
19275       if (extra_cost >= 0)
19276         {
19277           done_p = true;
19278           ret = NO_REGS;
19279           if (extra_cost > 0)
19280             {
19281               sri->extra_cost = extra_cost;
19282               sri->icode = icode;
19283             }
19284         }
19285     }
19286
19287   /* Handle unaligned loads and stores of integer registers.  */
19288   if (!done_p && TARGET_POWERPC64
19289       && reg_class_to_reg_type[(int)rclass] == GPR_REG_TYPE
19290       && memory_p
19291       && GET_MODE_SIZE (GET_MODE (x)) >= UNITS_PER_WORD)
19292     {
19293       rtx addr = XEXP (x, 0);
19294       rtx off = address_offset (addr);
19295
19296       if (off != NULL_RTX)
19297         {
19298           unsigned int extra = GET_MODE_SIZE (GET_MODE (x)) - UNITS_PER_WORD;
19299           unsigned HOST_WIDE_INT offset = INTVAL (off);
19300
19301           /* We need a secondary reload when our legitimate_address_p
19302              says the address is good (as otherwise the entire address
19303              will be reloaded), and the offset is not a multiple of
19304              four or we have an address wrap.  Address wrap will only
19305              occur for LO_SUMs since legitimate_offset_address_p
19306              rejects addresses for 16-byte mems that will wrap.  */
19307           if (GET_CODE (addr) == LO_SUM
19308               ? (1 /* legitimate_address_p allows any offset for lo_sum */
19309                  && ((offset & 3) != 0
19310                      || ((offset & 0xffff) ^ 0x8000) >= 0x10000 - extra))
19311               : (offset + 0x8000 < 0x10000 - extra /* legitimate_address_p */
19312                  && (offset & 3) != 0))
19313             {
19314               /* -m32 -mpowerpc64 needs to use a 32-bit scratch register.  */
19315               if (in_p)
19316                 sri->icode = ((TARGET_32BIT) ? CODE_FOR_reload_si_load
19317                               : CODE_FOR_reload_di_load);
19318               else
19319                 sri->icode = ((TARGET_32BIT) ? CODE_FOR_reload_si_store
19320                               : CODE_FOR_reload_di_store);
19321               sri->extra_cost = 2;
19322               ret = NO_REGS;
19323               done_p = true;
19324             }
19325           else
19326             default_p = true;
19327         }
19328       else
19329         default_p = true;
19330     }
19331
19332   if (!done_p && !TARGET_POWERPC64
19333       && reg_class_to_reg_type[(int)rclass] == GPR_REG_TYPE
19334       && memory_p
19335       && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD)
19336     {
19337       rtx addr = XEXP (x, 0);
19338       rtx off = address_offset (addr);
19339
19340       if (off != NULL_RTX)
19341         {
19342           unsigned int extra = GET_MODE_SIZE (GET_MODE (x)) - UNITS_PER_WORD;
19343           unsigned HOST_WIDE_INT offset = INTVAL (off);
19344
19345           /* We need a secondary reload when our legitimate_address_p
19346              says the address is good (as otherwise the entire address
19347              will be reloaded), and we have a wrap.
19348
19349              legitimate_lo_sum_address_p allows LO_SUM addresses to
19350              have any offset so test for wrap in the low 16 bits.
19351
19352              legitimate_offset_address_p checks for the range
19353              [-0x8000,0x7fff] for mode size of 8 and [-0x8000,0x7ff7]
19354              for mode size of 16.  We wrap at [0x7ffc,0x7fff] and
19355              [0x7ff4,0x7fff] respectively, so test for the
19356              intersection of these ranges, [0x7ffc,0x7fff] and
19357              [0x7ff4,0x7ff7] respectively.
19358
19359              Note that the address we see here may have been
19360              manipulated by legitimize_reload_address.  */
19361           if (GET_CODE (addr) == LO_SUM
19362               ? ((offset & 0xffff) ^ 0x8000) >= 0x10000 - extra
19363               : offset - (0x8000 - extra) < UNITS_PER_WORD)
19364             {
19365               if (in_p)
19366                 sri->icode = CODE_FOR_reload_si_load;
19367               else
19368                 sri->icode = CODE_FOR_reload_si_store;
19369               sri->extra_cost = 2;
19370               ret = NO_REGS;
19371               done_p = true;
19372             }
19373           else
19374             default_p = true;
19375         }
19376       else
19377         default_p = true;
19378     }
19379
19380   if (!done_p)
19381     default_p = true;
19382
19383   if (default_p)
19384     ret = default_secondary_reload (in_p, x, rclass, mode, sri);
19385
19386   gcc_assert (ret != ALL_REGS);
19387
19388   if (TARGET_DEBUG_ADDR)
19389     {
19390       fprintf (stderr,
19391                "\nrs6000_secondary_reload, return %s, in_p = %s, rclass = %s, "
19392                "mode = %s",
19393                reg_class_names[ret],
19394                in_p ? "true" : "false",
19395                reg_class_names[rclass],
19396                GET_MODE_NAME (mode));
19397
19398       if (reload_completed)
19399         fputs (", after reload", stderr);
19400
19401       if (!done_p)
19402         fputs (", done_p not set", stderr);
19403
19404       if (default_p)
19405         fputs (", default secondary reload", stderr);
19406
19407       if (sri->icode != CODE_FOR_nothing)
19408         fprintf (stderr, ", reload func = %s, extra cost = %d",
19409                  insn_data[sri->icode].name, sri->extra_cost);
19410
19411       else if (sri->extra_cost > 0)
19412         fprintf (stderr, ", extra cost = %d", sri->extra_cost);
19413
19414       fputs ("\n", stderr);
19415       debug_rtx (x);
19416     }
19417
19418   return ret;
19419 }
19420
19421 /* Better tracing for rs6000_secondary_reload_inner.  */
19422
19423 static void
19424 rs6000_secondary_reload_trace (int line, rtx reg, rtx mem, rtx scratch,
19425                                bool store_p)
19426 {
19427   rtx set, clobber;
19428
19429   gcc_assert (reg != NULL_RTX && mem != NULL_RTX && scratch != NULL_RTX);
19430
19431   fprintf (stderr, "rs6000_secondary_reload_inner:%d, type = %s\n", line,
19432            store_p ? "store" : "load");
19433
19434   if (store_p)
19435     set = gen_rtx_SET (mem, reg);
19436   else
19437     set = gen_rtx_SET (reg, mem);
19438
19439   clobber = gen_rtx_CLOBBER (VOIDmode, scratch);
19440   debug_rtx (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber)));
19441 }
19442
19443 static void rs6000_secondary_reload_fail (int, rtx, rtx, rtx, bool)
19444   ATTRIBUTE_NORETURN;
19445
19446 static void
19447 rs6000_secondary_reload_fail (int line, rtx reg, rtx mem, rtx scratch,
19448                               bool store_p)
19449 {
19450   rs6000_secondary_reload_trace (line, reg, mem, scratch, store_p);
19451   gcc_unreachable ();
19452 }
19453
19454 /* Fixup reload addresses for values in GPR, FPR, and VMX registers that have
19455    reload helper functions.  These were identified in
19456    rs6000_secondary_reload_memory, and if reload decided to use the secondary
19457    reload, it calls the insns:
19458         reload_<RELOAD:mode>_<P:mptrsize>_store
19459         reload_<RELOAD:mode>_<P:mptrsize>_load
19460
19461    which in turn calls this function, to do whatever is necessary to create
19462    valid addresses.  */
19463
19464 void
19465 rs6000_secondary_reload_inner (rtx reg, rtx mem, rtx scratch, bool store_p)
19466 {
19467   int regno = true_regnum (reg);
19468   machine_mode mode = GET_MODE (reg);
19469   addr_mask_type addr_mask;
19470   rtx addr;
19471   rtx new_addr;
19472   rtx op_reg, op0, op1;
19473   rtx and_op;
19474   rtx cc_clobber;
19475   rtvec rv;
19476
19477   if (regno < 0 || !HARD_REGISTER_NUM_P (regno) || !MEM_P (mem)
19478       || !base_reg_operand (scratch, GET_MODE (scratch)))
19479     rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19480
19481   if (IN_RANGE (regno, FIRST_GPR_REGNO, LAST_GPR_REGNO))
19482     addr_mask = reg_addr[mode].addr_mask[RELOAD_REG_GPR];
19483
19484   else if (IN_RANGE (regno, FIRST_FPR_REGNO, LAST_FPR_REGNO))
19485     addr_mask = reg_addr[mode].addr_mask[RELOAD_REG_FPR];
19486
19487   else if (IN_RANGE (regno, FIRST_ALTIVEC_REGNO, LAST_ALTIVEC_REGNO))
19488     addr_mask = reg_addr[mode].addr_mask[RELOAD_REG_VMX];
19489
19490   else
19491     rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19492
19493   /* Make sure the mode is valid in this register class.  */
19494   if ((addr_mask & RELOAD_REG_VALID) == 0)
19495     rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19496
19497   if (TARGET_DEBUG_ADDR)
19498     rs6000_secondary_reload_trace (__LINE__, reg, mem, scratch, store_p);
19499
19500   new_addr = addr = XEXP (mem, 0);
19501   switch (GET_CODE (addr))
19502     {
19503       /* Does the register class support auto update forms for this mode?  If
19504          not, do the update now.  We don't need a scratch register, since the
19505          powerpc only supports PRE_INC, PRE_DEC, and PRE_MODIFY.  */
19506     case PRE_INC:
19507     case PRE_DEC:
19508       op_reg = XEXP (addr, 0);
19509       if (!base_reg_operand (op_reg, Pmode))
19510         rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19511
19512       if ((addr_mask & RELOAD_REG_PRE_INCDEC) == 0)
19513         {
19514           int delta = GET_MODE_SIZE (mode);
19515           if (GET_CODE (addr) == PRE_DEC)
19516             delta = -delta;
19517           emit_insn (gen_add2_insn (op_reg, GEN_INT (delta)));
19518           new_addr = op_reg;
19519         }
19520       break;
19521
19522     case PRE_MODIFY:
19523       op0 = XEXP (addr, 0);
19524       op1 = XEXP (addr, 1);
19525       if (!base_reg_operand (op0, Pmode)
19526           || GET_CODE (op1) != PLUS
19527           || !rtx_equal_p (op0, XEXP (op1, 0)))
19528         rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19529
19530       if ((addr_mask & RELOAD_REG_PRE_MODIFY) == 0)
19531         {
19532           emit_insn (gen_rtx_SET (op0, op1));
19533           new_addr = reg;
19534         }
19535       break;
19536
19537       /* Do we need to simulate AND -16 to clear the bottom address bits used
19538          in VMX load/stores?  */
19539     case AND:
19540       op0 = XEXP (addr, 0);
19541       op1 = XEXP (addr, 1);
19542       if ((addr_mask & RELOAD_REG_AND_M16) == 0)
19543         {
19544           if (REG_P (op0) || SUBREG_P (op0))
19545             op_reg = op0;
19546
19547           else if (GET_CODE (op1) == PLUS)
19548             {
19549               emit_insn (gen_rtx_SET (scratch, op1));
19550               op_reg = scratch;
19551             }
19552
19553           else
19554             rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19555
19556           and_op = gen_rtx_AND (GET_MODE (scratch), op_reg, op1);
19557           cc_clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
19558           rv = gen_rtvec (2, gen_rtx_SET (scratch, and_op), cc_clobber);
19559           emit_insn (gen_rtx_PARALLEL (VOIDmode, rv));
19560           new_addr = scratch;
19561         }
19562       break;
19563
19564       /* If this is an indirect address, make sure it is a base register.  */
19565     case REG:
19566     case SUBREG:
19567       if (!base_reg_operand (addr, GET_MODE (addr)))
19568         {
19569           emit_insn (gen_rtx_SET (scratch, addr));
19570           new_addr = scratch;
19571         }
19572       break;
19573
19574       /* If this is an indexed address, make sure the register class can handle
19575          indexed addresses for this mode.  */
19576     case PLUS:
19577       op0 = XEXP (addr, 0);
19578       op1 = XEXP (addr, 1);
19579       if (!base_reg_operand (op0, Pmode))
19580         rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19581
19582       else if (int_reg_operand (op1, Pmode))
19583         {
19584           if ((addr_mask & RELOAD_REG_INDEXED) == 0)
19585             {
19586               emit_insn (gen_rtx_SET (scratch, addr));
19587               new_addr = scratch;
19588             }
19589         }
19590
19591       else if (mode_supports_dq_form (mode) && CONST_INT_P (op1))
19592         {
19593           if (((addr_mask & RELOAD_REG_QUAD_OFFSET) == 0)
19594               || !quad_address_p (addr, mode, false))
19595             {
19596               emit_insn (gen_rtx_SET (scratch, addr));
19597               new_addr = scratch;
19598             }
19599         }
19600
19601       /* Make sure the register class can handle offset addresses.  */
19602       else if (rs6000_legitimate_offset_address_p (mode, addr, false, true))
19603         {
19604           if ((addr_mask & RELOAD_REG_OFFSET) == 0)
19605             {
19606               emit_insn (gen_rtx_SET (scratch, addr));
19607               new_addr = scratch;
19608             }
19609         }
19610
19611       else
19612         rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19613
19614       break;
19615
19616     case LO_SUM:
19617       op0 = XEXP (addr, 0);
19618       op1 = XEXP (addr, 1);
19619       if (!base_reg_operand (op0, Pmode))
19620         rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19621
19622       else if (int_reg_operand (op1, Pmode))
19623         {
19624           if ((addr_mask & RELOAD_REG_INDEXED) == 0)
19625             {
19626               emit_insn (gen_rtx_SET (scratch, addr));
19627               new_addr = scratch;
19628             }
19629         }
19630
19631       /* Quad offsets are restricted and can't handle normal addresses.  */
19632       else if (mode_supports_dq_form (mode))
19633         {
19634           emit_insn (gen_rtx_SET (scratch, addr));
19635           new_addr = scratch;
19636         }
19637
19638       /* Make sure the register class can handle offset addresses.  */
19639       else if (legitimate_lo_sum_address_p (mode, addr, false))
19640         {
19641           if ((addr_mask & RELOAD_REG_OFFSET) == 0)
19642             {
19643               emit_insn (gen_rtx_SET (scratch, addr));
19644               new_addr = scratch;
19645             }
19646         }
19647
19648       else
19649         rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19650
19651       break;
19652
19653     case SYMBOL_REF:
19654     case CONST:
19655     case LABEL_REF:
19656       rs6000_emit_move (scratch, addr, Pmode);
19657       new_addr = scratch;
19658       break;
19659
19660     default:
19661       rs6000_secondary_reload_fail (__LINE__, reg, mem, scratch, store_p);
19662     }
19663
19664   /* Adjust the address if it changed.  */
19665   if (addr != new_addr)
19666     {
19667       mem = replace_equiv_address_nv (mem, new_addr);
19668       if (TARGET_DEBUG_ADDR)
19669         fprintf (stderr, "\nrs6000_secondary_reload_inner, mem adjusted.\n");
19670     }
19671
19672   /* Now create the move.  */
19673   if (store_p)
19674     emit_insn (gen_rtx_SET (mem, reg));
19675   else
19676     emit_insn (gen_rtx_SET (reg, mem));
19677
19678   return;
19679 }
19680
19681 /* Convert reloads involving 64-bit gprs and misaligned offset
19682    addressing, or multiple 32-bit gprs and offsets that are too large,
19683    to use indirect addressing.  */
19684
19685 void
19686 rs6000_secondary_reload_gpr (rtx reg, rtx mem, rtx scratch, bool store_p)
19687 {
19688   int regno = true_regnum (reg);
19689   enum reg_class rclass;
19690   rtx addr;
19691   rtx scratch_or_premodify = scratch;
19692
19693   if (TARGET_DEBUG_ADDR)
19694     {
19695       fprintf (stderr, "\nrs6000_secondary_reload_gpr, type = %s\n",
19696                store_p ? "store" : "load");
19697       fprintf (stderr, "reg:\n");
19698       debug_rtx (reg);
19699       fprintf (stderr, "mem:\n");
19700       debug_rtx (mem);
19701       fprintf (stderr, "scratch:\n");
19702       debug_rtx (scratch);
19703     }
19704
19705   gcc_assert (regno >= 0 && HARD_REGISTER_NUM_P (regno));
19706   gcc_assert (MEM_P (mem));
19707   rclass = REGNO_REG_CLASS (regno);
19708   gcc_assert (rclass == GENERAL_REGS || rclass == BASE_REGS);
19709   addr = XEXP (mem, 0);
19710
19711   if (GET_CODE (addr) == PRE_MODIFY)
19712     {
19713       gcc_assert (REG_P (XEXP (addr, 0))
19714                   && GET_CODE (XEXP (addr, 1)) == PLUS
19715                   && XEXP (XEXP (addr, 1), 0) == XEXP (addr, 0));
19716       scratch_or_premodify = XEXP (addr, 0);
19717       addr = XEXP (addr, 1);
19718     }
19719   gcc_assert (GET_CODE (addr) == PLUS || GET_CODE (addr) == LO_SUM);
19720
19721   rs6000_emit_move (scratch_or_premodify, addr, Pmode);
19722
19723   mem = replace_equiv_address_nv (mem, scratch_or_premodify);
19724
19725   /* Now create the move.  */
19726   if (store_p)
19727     emit_insn (gen_rtx_SET (mem, reg));
19728   else
19729     emit_insn (gen_rtx_SET (reg, mem));
19730
19731   return;
19732 }
19733
19734 /* Given an rtx X being reloaded into a reg required to be
19735    in class CLASS, return the class of reg to actually use.
19736    In general this is just CLASS; but on some machines
19737    in some cases it is preferable to use a more restrictive class.
19738
19739    On the RS/6000, we have to return NO_REGS when we want to reload a
19740    floating-point CONST_DOUBLE to force it to be copied to memory.
19741
19742    We also don't want to reload integer values into floating-point
19743    registers if we can at all help it.  In fact, this can
19744    cause reload to die, if it tries to generate a reload of CTR
19745    into a FP register and discovers it doesn't have the memory location
19746    required.
19747
19748    ??? Would it be a good idea to have reload do the converse, that is
19749    try to reload floating modes into FP registers if possible?
19750  */
19751
19752 static enum reg_class
19753 rs6000_preferred_reload_class (rtx x, enum reg_class rclass)
19754 {
19755   machine_mode mode = GET_MODE (x);
19756   bool is_constant = CONSTANT_P (x);
19757
19758   /* If a mode can't go in FPR/ALTIVEC/VSX registers, don't return a preferred
19759      reload class for it.  */
19760   if ((rclass == ALTIVEC_REGS || rclass == VSX_REGS)
19761       && (reg_addr[mode].addr_mask[RELOAD_REG_VMX] & RELOAD_REG_VALID) == 0)
19762     return NO_REGS;
19763
19764   if ((rclass == FLOAT_REGS || rclass == VSX_REGS)
19765       && (reg_addr[mode].addr_mask[RELOAD_REG_FPR] & RELOAD_REG_VALID) == 0)
19766     return NO_REGS;
19767
19768   /* For VSX, see if we should prefer FLOAT_REGS or ALTIVEC_REGS.  Do not allow
19769      the reloading of address expressions using PLUS into floating point
19770      registers.  */
19771   if (TARGET_VSX && VSX_REG_CLASS_P (rclass) && GET_CODE (x) != PLUS)
19772     {
19773       if (is_constant)
19774         {
19775           /* Zero is always allowed in all VSX registers.  */
19776           if (x == CONST0_RTX (mode))
19777             return rclass;
19778
19779           /* If this is a vector constant that can be formed with a few Altivec
19780              instructions, we want altivec registers.  */
19781           if (GET_CODE (x) == CONST_VECTOR && easy_vector_constant (x, mode))
19782             return ALTIVEC_REGS;
19783
19784           /* If this is an integer constant that can easily be loaded into
19785              vector registers, allow it.  */
19786           if (CONST_INT_P (x))
19787             {
19788               HOST_WIDE_INT value = INTVAL (x);
19789
19790               /* ISA 2.07 can generate -1 in all registers with XXLORC.  ISA
19791                  2.06 can generate it in the Altivec registers with
19792                  VSPLTI<x>.  */
19793               if (value == -1)
19794                 {
19795                   if (TARGET_P8_VECTOR)
19796                     return rclass;
19797                   else if (rclass == ALTIVEC_REGS || rclass == VSX_REGS)
19798                     return ALTIVEC_REGS;
19799                   else
19800                     return NO_REGS;
19801                 }
19802
19803               /* ISA 3.0 can load -128..127 using the XXSPLTIB instruction and
19804                  a sign extend in the Altivec registers.  */
19805               if (IN_RANGE (value, -128, 127) && TARGET_P9_VECTOR
19806                   && (rclass == ALTIVEC_REGS || rclass == VSX_REGS))
19807                 return ALTIVEC_REGS;
19808             }
19809
19810           /* Force constant to memory.  */
19811           return NO_REGS;
19812         }
19813
19814       /* D-form addressing can easily reload the value.  */
19815       if (mode_supports_vmx_dform (mode)
19816           || mode_supports_dq_form (mode))
19817         return rclass;
19818
19819       /* If this is a scalar floating point value and we don't have D-form
19820          addressing, prefer the traditional floating point registers so that we
19821          can use D-form (register+offset) addressing.  */
19822       if (rclass == VSX_REGS
19823           && (mode == SFmode || GET_MODE_SIZE (mode) == 8))
19824         return FLOAT_REGS;
19825
19826       /* Prefer the Altivec registers if Altivec is handling the vector
19827          operations (i.e. V16QI, V8HI, and V4SI), or if we prefer Altivec
19828          loads.  */
19829       if (VECTOR_UNIT_ALTIVEC_P (mode) || VECTOR_MEM_ALTIVEC_P (mode)
19830           || mode == V1TImode)
19831         return ALTIVEC_REGS;
19832
19833       return rclass;
19834     }
19835
19836   if (is_constant || GET_CODE (x) == PLUS)
19837     {
19838       if (reg_class_subset_p (GENERAL_REGS, rclass))
19839         return GENERAL_REGS;
19840       if (reg_class_subset_p (BASE_REGS, rclass))
19841         return BASE_REGS;
19842       return NO_REGS;
19843     }
19844
19845   if (GET_MODE_CLASS (mode) == MODE_INT && rclass == GEN_OR_FLOAT_REGS)
19846     return GENERAL_REGS;
19847
19848   return rclass;
19849 }
19850
19851 /* Debug version of rs6000_preferred_reload_class.  */
19852 static enum reg_class
19853 rs6000_debug_preferred_reload_class (rtx x, enum reg_class rclass)
19854 {
19855   enum reg_class ret = rs6000_preferred_reload_class (x, rclass);
19856
19857   fprintf (stderr,
19858            "\nrs6000_preferred_reload_class, return %s, rclass = %s, "
19859            "mode = %s, x:\n",
19860            reg_class_names[ret], reg_class_names[rclass],
19861            GET_MODE_NAME (GET_MODE (x)));
19862   debug_rtx (x);
19863
19864   return ret;
19865 }
19866
19867 /* If we are copying between FP or AltiVec registers and anything else, we need
19868    a memory location.  The exception is when we are targeting ppc64 and the
19869    move to/from fpr to gpr instructions are available.  Also, under VSX, you
19870    can copy vector registers from the FP register set to the Altivec register
19871    set and vice versa.  */
19872
19873 static bool
19874 rs6000_secondary_memory_needed (machine_mode mode,
19875                                 reg_class_t from_class,
19876                                 reg_class_t to_class)
19877 {
19878   enum rs6000_reg_type from_type, to_type;
19879   bool altivec_p = ((from_class == ALTIVEC_REGS)
19880                     || (to_class == ALTIVEC_REGS));
19881
19882   /* If a simple/direct move is available, we don't need secondary memory  */
19883   from_type = reg_class_to_reg_type[(int)from_class];
19884   to_type = reg_class_to_reg_type[(int)to_class];
19885
19886   if (rs6000_secondary_reload_move (to_type, from_type, mode,
19887                                     (secondary_reload_info *)0, altivec_p))
19888     return false;
19889
19890   /* If we have a floating point or vector register class, we need to use
19891      memory to transfer the data.  */
19892   if (IS_FP_VECT_REG_TYPE (from_type) || IS_FP_VECT_REG_TYPE (to_type))
19893     return true;
19894
19895   return false;
19896 }
19897
19898 /* Debug version of rs6000_secondary_memory_needed.  */
19899 static bool
19900 rs6000_debug_secondary_memory_needed (machine_mode mode,
19901                                       reg_class_t from_class,
19902                                       reg_class_t to_class)
19903 {
19904   bool ret = rs6000_secondary_memory_needed (mode, from_class, to_class);
19905
19906   fprintf (stderr,
19907            "rs6000_secondary_memory_needed, return: %s, from_class = %s, "
19908            "to_class = %s, mode = %s\n",
19909            ret ? "true" : "false",
19910            reg_class_names[from_class],
19911            reg_class_names[to_class],
19912            GET_MODE_NAME (mode));
19913
19914   return ret;
19915 }
19916
19917 /* Return the register class of a scratch register needed to copy IN into
19918    or out of a register in RCLASS in MODE.  If it can be done directly,
19919    NO_REGS is returned.  */
19920
19921 static enum reg_class
19922 rs6000_secondary_reload_class (enum reg_class rclass, machine_mode mode,
19923                                rtx in)
19924 {
19925   int regno;
19926
19927   if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
19928 #if TARGET_MACHO
19929                      && MACHOPIC_INDIRECT
19930 #endif
19931                      ))
19932     {
19933       /* We cannot copy a symbolic operand directly into anything
19934          other than BASE_REGS for TARGET_ELF.  So indicate that a
19935          register from BASE_REGS is needed as an intermediate
19936          register.
19937
19938          On Darwin, pic addresses require a load from memory, which
19939          needs a base register.  */
19940       if (rclass != BASE_REGS
19941           && (SYMBOL_REF_P (in)
19942               || GET_CODE (in) == HIGH
19943               || GET_CODE (in) == LABEL_REF
19944               || GET_CODE (in) == CONST))
19945         return BASE_REGS;
19946     }
19947
19948   if (REG_P (in))
19949     {
19950       regno = REGNO (in);
19951       if (!HARD_REGISTER_NUM_P (regno))
19952         {
19953           regno = true_regnum (in);
19954           if (!HARD_REGISTER_NUM_P (regno))
19955             regno = -1;
19956         }
19957     }
19958   else if (SUBREG_P (in))
19959     {
19960       regno = true_regnum (in);
19961       if (!HARD_REGISTER_NUM_P (regno))
19962         regno = -1;
19963     }
19964   else
19965     regno = -1;
19966
19967   /* If we have VSX register moves, prefer moving scalar values between
19968      Altivec registers and GPR by going via an FPR (and then via memory)
19969      instead of reloading the secondary memory address for Altivec moves.  */
19970   if (TARGET_VSX
19971       && GET_MODE_SIZE (mode) < 16
19972       && !mode_supports_vmx_dform (mode)
19973       && (((rclass == GENERAL_REGS || rclass == BASE_REGS)
19974            && (regno >= 0 && ALTIVEC_REGNO_P (regno)))
19975           || ((rclass == VSX_REGS || rclass == ALTIVEC_REGS)
19976               && (regno >= 0 && INT_REGNO_P (regno)))))
19977     return FLOAT_REGS;
19978
19979   /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
19980      into anything.  */
19981   if (rclass == GENERAL_REGS || rclass == BASE_REGS
19982       || (regno >= 0 && INT_REGNO_P (regno)))
19983     return NO_REGS;
19984
19985   /* Constants, memory, and VSX registers can go into VSX registers (both the
19986      traditional floating point and the altivec registers).  */
19987   if (rclass == VSX_REGS
19988       && (regno == -1 || VSX_REGNO_P (regno)))
19989     return NO_REGS;
19990
19991   /* Constants, memory, and FP registers can go into FP registers.  */
19992   if ((regno == -1 || FP_REGNO_P (regno))
19993       && (rclass == FLOAT_REGS || rclass == GEN_OR_FLOAT_REGS))
19994     return (mode != SDmode || lra_in_progress) ? NO_REGS : GENERAL_REGS;
19995
19996   /* Memory, and AltiVec registers can go into AltiVec registers.  */
19997   if ((regno == -1 || ALTIVEC_REGNO_P (regno))
19998       && rclass == ALTIVEC_REGS)
19999     return NO_REGS;
20000
20001   /* We can copy among the CR registers.  */
20002   if ((rclass == CR_REGS || rclass == CR0_REGS)
20003       && regno >= 0 && CR_REGNO_P (regno))
20004     return NO_REGS;
20005
20006   /* Otherwise, we need GENERAL_REGS.  */
20007   return GENERAL_REGS;
20008 }
20009
20010 /* Debug version of rs6000_secondary_reload_class.  */
20011 static enum reg_class
20012 rs6000_debug_secondary_reload_class (enum reg_class rclass,
20013                                      machine_mode mode, rtx in)
20014 {
20015   enum reg_class ret = rs6000_secondary_reload_class (rclass, mode, in);
20016   fprintf (stderr,
20017            "\nrs6000_secondary_reload_class, return %s, rclass = %s, "
20018            "mode = %s, input rtx:\n",
20019            reg_class_names[ret], reg_class_names[rclass],
20020            GET_MODE_NAME (mode));
20021   debug_rtx (in);
20022
20023   return ret;
20024 }
20025
20026 /* Implement TARGET_CAN_CHANGE_MODE_CLASS.  */
20027
20028 static bool
20029 rs6000_can_change_mode_class (machine_mode from,
20030                               machine_mode to,
20031                               reg_class_t rclass)
20032 {
20033   unsigned from_size = GET_MODE_SIZE (from);
20034   unsigned to_size = GET_MODE_SIZE (to);
20035
20036   if (from_size != to_size)
20037     {
20038       enum reg_class xclass = (TARGET_VSX) ? VSX_REGS : FLOAT_REGS;
20039
20040       if (reg_classes_intersect_p (xclass, rclass))
20041         {
20042           unsigned to_nregs = hard_regno_nregs (FIRST_FPR_REGNO, to);
20043           unsigned from_nregs = hard_regno_nregs (FIRST_FPR_REGNO, from);
20044           bool to_float128_vector_p = FLOAT128_VECTOR_P (to);
20045           bool from_float128_vector_p = FLOAT128_VECTOR_P (from);
20046
20047           /* Don't allow 64-bit types to overlap with 128-bit types that take a
20048              single register under VSX because the scalar part of the register
20049              is in the upper 64-bits, and not the lower 64-bits.  Types like
20050              TFmode/TDmode that take 2 scalar register can overlap.  128-bit
20051              IEEE floating point can't overlap, and neither can small
20052              values.  */
20053
20054           if (to_float128_vector_p && from_float128_vector_p)
20055             return true;
20056
20057           else if (to_float128_vector_p || from_float128_vector_p)
20058             return false;
20059
20060           /* TDmode in floating-mode registers must always go into a register
20061              pair with the most significant word in the even-numbered register
20062              to match ISA requirements.  In little-endian mode, this does not
20063              match subreg numbering, so we cannot allow subregs.  */
20064           if (!BYTES_BIG_ENDIAN && (to == TDmode || from == TDmode))
20065             return false;
20066
20067           if (from_size < 8 || to_size < 8)
20068             return false;
20069
20070           if (from_size == 8 && (8 * to_nregs) != to_size)
20071             return false;
20072
20073           if (to_size == 8 && (8 * from_nregs) != from_size)
20074             return false;
20075
20076           return true;
20077         }
20078       else
20079         return true;
20080     }
20081
20082   /* Since the VSX register set includes traditional floating point registers
20083      and altivec registers, just check for the size being different instead of
20084      trying to check whether the modes are vector modes.  Otherwise it won't
20085      allow say DF and DI to change classes.  For types like TFmode and TDmode
20086      that take 2 64-bit registers, rather than a single 128-bit register, don't
20087      allow subregs of those types to other 128 bit types.  */
20088   if (TARGET_VSX && VSX_REG_CLASS_P (rclass))
20089     {
20090       unsigned num_regs = (from_size + 15) / 16;
20091       if (hard_regno_nregs (FIRST_FPR_REGNO, to) > num_regs
20092           || hard_regno_nregs (FIRST_FPR_REGNO, from) > num_regs)
20093         return false;
20094
20095       return (from_size == 8 || from_size == 16);
20096     }
20097
20098   if (TARGET_ALTIVEC && rclass == ALTIVEC_REGS
20099       && (ALTIVEC_VECTOR_MODE (from) + ALTIVEC_VECTOR_MODE (to)) == 1)
20100     return false;
20101
20102   return true;
20103 }
20104
20105 /* Debug version of rs6000_can_change_mode_class.  */
20106 static bool
20107 rs6000_debug_can_change_mode_class (machine_mode from,
20108                                     machine_mode to,
20109                                     reg_class_t rclass)
20110 {
20111   bool ret = rs6000_can_change_mode_class (from, to, rclass);
20112
20113   fprintf (stderr,
20114            "rs6000_can_change_mode_class, return %s, from = %s, "
20115            "to = %s, rclass = %s\n",
20116            ret ? "true" : "false",
20117            GET_MODE_NAME (from), GET_MODE_NAME (to),
20118            reg_class_names[rclass]);
20119
20120   return ret;
20121 }
20122 \f
20123 /* Return a string to do a move operation of 128 bits of data.  */
20124
20125 const char *
20126 rs6000_output_move_128bit (rtx operands[])
20127 {
20128   rtx dest = operands[0];
20129   rtx src = operands[1];
20130   machine_mode mode = GET_MODE (dest);
20131   int dest_regno;
20132   int src_regno;
20133   bool dest_gpr_p, dest_fp_p, dest_vmx_p, dest_vsx_p;
20134   bool src_gpr_p, src_fp_p, src_vmx_p, src_vsx_p;
20135
20136   if (REG_P (dest))
20137     {
20138       dest_regno = REGNO (dest);
20139       dest_gpr_p = INT_REGNO_P (dest_regno);
20140       dest_fp_p = FP_REGNO_P (dest_regno);
20141       dest_vmx_p = ALTIVEC_REGNO_P (dest_regno);
20142       dest_vsx_p = dest_fp_p | dest_vmx_p;
20143     }
20144   else
20145     {
20146       dest_regno = -1;
20147       dest_gpr_p = dest_fp_p = dest_vmx_p = dest_vsx_p = false;
20148     }
20149
20150   if (REG_P (src))
20151     {
20152       src_regno = REGNO (src);
20153       src_gpr_p = INT_REGNO_P (src_regno);
20154       src_fp_p = FP_REGNO_P (src_regno);
20155       src_vmx_p = ALTIVEC_REGNO_P (src_regno);
20156       src_vsx_p = src_fp_p | src_vmx_p;
20157     }
20158   else
20159     {
20160       src_regno = -1;
20161       src_gpr_p = src_fp_p = src_vmx_p = src_vsx_p = false;
20162     }
20163
20164   /* Register moves.  */
20165   if (dest_regno >= 0 && src_regno >= 0)
20166     {
20167       if (dest_gpr_p)
20168         {
20169           if (src_gpr_p)
20170             return "#";
20171
20172           if (TARGET_DIRECT_MOVE_128 && src_vsx_p)
20173             return (WORDS_BIG_ENDIAN
20174                     ? "mfvsrd %0,%x1\n\tmfvsrld %L0,%x1"
20175                     : "mfvsrd %L0,%x1\n\tmfvsrld %0,%x1");
20176
20177           else if (TARGET_VSX && TARGET_DIRECT_MOVE && src_vsx_p)
20178             return "#";
20179         }
20180
20181       else if (TARGET_VSX && dest_vsx_p)
20182         {
20183           if (src_vsx_p)
20184             return "xxlor %x0,%x1,%x1";
20185
20186           else if (TARGET_DIRECT_MOVE_128 && src_gpr_p)
20187             return (WORDS_BIG_ENDIAN
20188                     ? "mtvsrdd %x0,%1,%L1"
20189                     : "mtvsrdd %x0,%L1,%1");
20190
20191           else if (TARGET_DIRECT_MOVE && src_gpr_p)
20192             return "#";
20193         }
20194
20195       else if (TARGET_ALTIVEC && dest_vmx_p && src_vmx_p)
20196         return "vor %0,%1,%1";
20197
20198       else if (dest_fp_p && src_fp_p)
20199         return "#";
20200     }
20201
20202   /* Loads.  */
20203   else if (dest_regno >= 0 && MEM_P (src))
20204     {
20205       if (dest_gpr_p)
20206         {
20207           if (TARGET_QUAD_MEMORY && quad_load_store_p (dest, src))
20208             return "lq %0,%1";
20209           else
20210             return "#";
20211         }
20212
20213       else if (TARGET_ALTIVEC && dest_vmx_p
20214                && altivec_indexed_or_indirect_operand (src, mode))
20215         return "lvx %0,%y1";
20216
20217       else if (TARGET_VSX && dest_vsx_p)
20218         {
20219           if (mode_supports_dq_form (mode)
20220               && quad_address_p (XEXP (src, 0), mode, true))
20221             return "lxv %x0,%1";
20222
20223           else if (TARGET_P9_VECTOR)
20224             return "lxvx %x0,%y1";
20225
20226           else if (mode == V16QImode || mode == V8HImode || mode == V4SImode)
20227             return "lxvw4x %x0,%y1";
20228
20229           else
20230             return "lxvd2x %x0,%y1";
20231         }
20232
20233       else if (TARGET_ALTIVEC && dest_vmx_p)
20234         return "lvx %0,%y1";
20235
20236       else if (dest_fp_p)
20237         return "#";
20238     }
20239
20240   /* Stores.  */
20241   else if (src_regno >= 0 && MEM_P (dest))
20242     {
20243       if (src_gpr_p)
20244         {
20245           if (TARGET_QUAD_MEMORY && quad_load_store_p (dest, src))
20246             return "stq %1,%0";
20247           else
20248             return "#";
20249         }
20250
20251       else if (TARGET_ALTIVEC && src_vmx_p
20252                && altivec_indexed_or_indirect_operand (dest, mode))
20253         return "stvx %1,%y0";
20254
20255       else if (TARGET_VSX && src_vsx_p)
20256         {
20257           if (mode_supports_dq_form (mode)
20258               && quad_address_p (XEXP (dest, 0), mode, true))
20259             return "stxv %x1,%0";
20260
20261           else if (TARGET_P9_VECTOR)
20262             return "stxvx %x1,%y0";
20263
20264           else if (mode == V16QImode || mode == V8HImode || mode == V4SImode)
20265             return "stxvw4x %x1,%y0";
20266
20267           else
20268             return "stxvd2x %x1,%y0";
20269         }
20270
20271       else if (TARGET_ALTIVEC && src_vmx_p)
20272         return "stvx %1,%y0";
20273
20274       else if (src_fp_p)
20275         return "#";
20276     }
20277
20278   /* Constants.  */
20279   else if (dest_regno >= 0
20280            && (CONST_INT_P (src)
20281                || CONST_WIDE_INT_P (src)
20282                || CONST_DOUBLE_P (src)
20283                || GET_CODE (src) == CONST_VECTOR))
20284     {
20285       if (dest_gpr_p)
20286         return "#";
20287
20288       else if ((dest_vmx_p && TARGET_ALTIVEC)
20289                || (dest_vsx_p && TARGET_VSX))
20290         return output_vec_const_move (operands);
20291     }
20292
20293   fatal_insn ("Bad 128-bit move", gen_rtx_SET (dest, src));
20294 }
20295
20296 /* Validate a 128-bit move.  */
20297 bool
20298 rs6000_move_128bit_ok_p (rtx operands[])
20299 {
20300   machine_mode mode = GET_MODE (operands[0]);
20301   return (gpc_reg_operand (operands[0], mode)
20302           || gpc_reg_operand (operands[1], mode));
20303 }
20304
20305 /* Return true if a 128-bit move needs to be split.  */
20306 bool
20307 rs6000_split_128bit_ok_p (rtx operands[])
20308 {
20309   if (!reload_completed)
20310     return false;
20311
20312   if (!gpr_or_gpr_p (operands[0], operands[1]))
20313     return false;
20314
20315   if (quad_load_store_p (operands[0], operands[1]))
20316     return false;
20317
20318   return true;
20319 }
20320
20321 \f
20322 /* Given a comparison operation, return the bit number in CCR to test.  We
20323    know this is a valid comparison.
20324
20325    SCC_P is 1 if this is for an scc.  That means that %D will have been
20326    used instead of %C, so the bits will be in different places.
20327
20328    Return -1 if OP isn't a valid comparison for some reason.  */
20329
20330 int
20331 ccr_bit (rtx op, int scc_p)
20332 {
20333   enum rtx_code code = GET_CODE (op);
20334   machine_mode cc_mode;
20335   int cc_regnum;
20336   int base_bit;
20337   rtx reg;
20338
20339   if (!COMPARISON_P (op))
20340     return -1;
20341
20342   reg = XEXP (op, 0);
20343
20344   if (!REG_P (reg) || !CR_REGNO_P (REGNO (reg)))
20345     return -1;
20346
20347   cc_mode = GET_MODE (reg);
20348   cc_regnum = REGNO (reg);
20349   base_bit = 4 * (cc_regnum - CR0_REGNO);
20350
20351   validate_condition_mode (code, cc_mode);
20352
20353   /* When generating a sCOND operation, only positive conditions are
20354      allowed.  */
20355   if (scc_p)
20356     switch (code)
20357       {
20358       case EQ:
20359       case GT:
20360       case LT:
20361       case UNORDERED:
20362       case GTU:
20363       case LTU:
20364         break;
20365       default:
20366         return -1;
20367       }
20368
20369   switch (code)
20370     {
20371     case NE:
20372       return scc_p ? base_bit + 3 : base_bit + 2;
20373     case EQ:
20374       return base_bit + 2;
20375     case GT:  case GTU:  case UNLE:
20376       return base_bit + 1;
20377     case LT:  case LTU:  case UNGE:
20378       return base_bit;
20379     case ORDERED:  case UNORDERED:
20380       return base_bit + 3;
20381
20382     case GE:  case GEU:
20383       /* If scc, we will have done a cror to put the bit in the
20384          unordered position.  So test that bit.  For integer, this is ! LT
20385          unless this is an scc insn.  */
20386       return scc_p ? base_bit + 3 : base_bit;
20387
20388     case LE:  case LEU:
20389       return scc_p ? base_bit + 3 : base_bit + 1;
20390
20391     default:
20392       return -1;
20393     }
20394 }
20395 \f
20396 /* Return the GOT register.  */
20397
20398 rtx
20399 rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
20400 {
20401   /* The second flow pass currently (June 1999) can't update
20402      regs_ever_live without disturbing other parts of the compiler, so
20403      update it here to make the prolog/epilogue code happy.  */
20404   if (!can_create_pseudo_p ()
20405       && !df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
20406     df_set_regs_ever_live (RS6000_PIC_OFFSET_TABLE_REGNUM, true);
20407
20408   crtl->uses_pic_offset_table = 1;
20409
20410   return pic_offset_table_rtx;
20411 }
20412 \f
20413 static rs6000_stack_t stack_info;
20414
20415 /* Function to init struct machine_function.
20416    This will be called, via a pointer variable,
20417    from push_function_context.  */
20418
20419 static struct machine_function *
20420 rs6000_init_machine_status (void)
20421 {
20422   stack_info.reload_completed = 0;
20423   return ggc_cleared_alloc<machine_function> ();
20424 }
20425 \f
20426 #define INT_P(X) (CONST_INT_P (X) && GET_MODE (X) == VOIDmode)
20427
20428 /* Write out a function code label.  */
20429
20430 void
20431 rs6000_output_function_entry (FILE *file, const char *fname)
20432 {
20433   if (fname[0] != '.')
20434     {
20435       switch (DEFAULT_ABI)
20436         {
20437         default:
20438           gcc_unreachable ();
20439
20440         case ABI_AIX:
20441           if (DOT_SYMBOLS)
20442             putc ('.', file);
20443           else
20444             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
20445           break;
20446
20447         case ABI_ELFv2:
20448         case ABI_V4:
20449         case ABI_DARWIN:
20450           break;
20451         }
20452     }
20453
20454   RS6000_OUTPUT_BASENAME (file, fname);
20455 }
20456
20457 /* Print an operand.  Recognize special options, documented below.  */
20458
20459 #if TARGET_ELF
20460 /* Access to .sdata2 through r2 (see -msdata=eabi in invoke.texi) is
20461    only introduced by the linker, when applying the sda21
20462    relocation.  */
20463 #define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
20464 #define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
20465 #else
20466 #define SMALL_DATA_RELOC "sda21"
20467 #define SMALL_DATA_REG 0
20468 #endif
20469
20470 void
20471 print_operand (FILE *file, rtx x, int code)
20472 {
20473   int i;
20474   unsigned HOST_WIDE_INT uval;
20475
20476   switch (code)
20477     {
20478       /* %a is output_address.  */
20479
20480       /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
20481          output_operand.  */
20482
20483     case 'D':
20484       /* Like 'J' but get to the GT bit only.  */
20485       if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
20486         {
20487           output_operand_lossage ("invalid %%D value");
20488           return;
20489         }
20490
20491       /* Bit 1 is GT bit.  */
20492       i = 4 * (REGNO (x) - CR0_REGNO) + 1;
20493
20494       /* Add one for shift count in rlinm for scc.  */
20495       fprintf (file, "%d", i + 1);
20496       return;
20497
20498     case 'e':
20499       /* If the low 16 bits are 0, but some other bit is set, write 's'.  */
20500       if (! INT_P (x))
20501         {
20502           output_operand_lossage ("invalid %%e value");
20503           return;
20504         }
20505
20506       uval = INTVAL (x);
20507       if ((uval & 0xffff) == 0 && uval != 0)
20508         putc ('s', file);
20509       return;
20510
20511     case 'E':
20512       /* X is a CR register.  Print the number of the EQ bit of the CR */
20513       if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
20514         output_operand_lossage ("invalid %%E value");
20515       else
20516         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
20517       return;
20518
20519     case 'f':
20520       /* X is a CR register.  Print the shift count needed to move it
20521          to the high-order four bits.  */
20522       if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
20523         output_operand_lossage ("invalid %%f value");
20524       else
20525         fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
20526       return;
20527
20528     case 'F':
20529       /* Similar, but print the count for the rotate in the opposite
20530          direction.  */
20531       if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
20532         output_operand_lossage ("invalid %%F value");
20533       else
20534         fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
20535       return;
20536
20537     case 'G':
20538       /* X is a constant integer.  If it is negative, print "m",
20539          otherwise print "z".  This is to make an aze or ame insn.  */
20540       if (!CONST_INT_P (x))
20541         output_operand_lossage ("invalid %%G value");
20542       else if (INTVAL (x) >= 0)
20543         putc ('z', file);
20544       else
20545         putc ('m', file);
20546       return;
20547
20548     case 'h':
20549       /* If constant, output low-order five bits.  Otherwise, write
20550          normally.  */
20551       if (INT_P (x))
20552         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x) & 31);
20553       else
20554         print_operand (file, x, 0);
20555       return;
20556
20557     case 'H':
20558       /* If constant, output low-order six bits.  Otherwise, write
20559          normally.  */
20560       if (INT_P (x))
20561         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x) & 63);
20562       else
20563         print_operand (file, x, 0);
20564       return;
20565
20566     case 'I':
20567       /* Print `i' if this is a constant, else nothing.  */
20568       if (INT_P (x))
20569         putc ('i', file);
20570       return;
20571
20572     case 'j':
20573       /* Write the bit number in CCR for jump.  */
20574       i = ccr_bit (x, 0);
20575       if (i == -1)
20576         output_operand_lossage ("invalid %%j code");
20577       else
20578         fprintf (file, "%d", i);
20579       return;
20580
20581     case 'J':
20582       /* Similar, but add one for shift count in rlinm for scc and pass
20583          scc flag to `ccr_bit'.  */
20584       i = ccr_bit (x, 1);
20585       if (i == -1)
20586         output_operand_lossage ("invalid %%J code");
20587       else
20588         /* If we want bit 31, write a shift count of zero, not 32.  */
20589         fprintf (file, "%d", i == 31 ? 0 : i + 1);
20590       return;
20591
20592     case 'k':
20593       /* X must be a constant.  Write the 1's complement of the
20594          constant.  */
20595       if (! INT_P (x))
20596         output_operand_lossage ("invalid %%k value");
20597       else
20598         fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INTVAL (x));
20599       return;
20600
20601     case 'K':
20602       /* X must be a symbolic constant on ELF.  Write an
20603          expression suitable for an 'addi' that adds in the low 16
20604          bits of the MEM.  */
20605       if (GET_CODE (x) == CONST)
20606         {
20607           if (GET_CODE (XEXP (x, 0)) != PLUS
20608               || (!SYMBOL_REF_P (XEXP (XEXP (x, 0), 0))
20609                   && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
20610               || !CONST_INT_P (XEXP (XEXP (x, 0), 1)))
20611             output_operand_lossage ("invalid %%K value");
20612         }
20613       print_operand_address (file, x);
20614       fputs ("@l", file);
20615       return;
20616
20617       /* %l is output_asm_label.  */
20618
20619     case 'L':
20620       /* Write second word of DImode or DFmode reference.  Works on register
20621          or non-indexed memory only.  */
20622       if (REG_P (x))
20623         fputs (reg_names[REGNO (x) + 1], file);
20624       else if (MEM_P (x))
20625         {
20626           machine_mode mode = GET_MODE (x);
20627           /* Handle possible auto-increment.  Since it is pre-increment and
20628              we have already done it, we can just use an offset of word.  */
20629           if (GET_CODE (XEXP (x, 0)) == PRE_INC
20630               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
20631             output_address (mode, plus_constant (Pmode, XEXP (XEXP (x, 0), 0),
20632                                                  UNITS_PER_WORD));
20633           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
20634             output_address (mode, plus_constant (Pmode, XEXP (XEXP (x, 0), 0),
20635                                                  UNITS_PER_WORD));
20636           else
20637             output_address (mode, XEXP (adjust_address_nv (x, SImode,
20638                                                            UNITS_PER_WORD),
20639                                   0));
20640
20641           if (small_data_operand (x, GET_MODE (x)))
20642             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
20643                      reg_names[SMALL_DATA_REG]);
20644         }
20645       return;
20646
20647     case 'N': /* Unused */
20648       /* Write the number of elements in the vector times 4.  */
20649       if (GET_CODE (x) != PARALLEL)
20650         output_operand_lossage ("invalid %%N value");
20651       else
20652         fprintf (file, "%d", XVECLEN (x, 0) * 4);
20653       return;
20654
20655     case 'O': /* Unused */
20656       /* Similar, but subtract 1 first.  */
20657       if (GET_CODE (x) != PARALLEL)
20658         output_operand_lossage ("invalid %%O value");
20659       else
20660         fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
20661       return;
20662
20663     case 'p':
20664       /* X is a CONST_INT that is a power of two.  Output the logarithm.  */
20665       if (! INT_P (x)
20666           || INTVAL (x) < 0
20667           || (i = exact_log2 (INTVAL (x))) < 0)
20668         output_operand_lossage ("invalid %%p value");
20669       else
20670         fprintf (file, "%d", i);
20671       return;
20672
20673     case 'P':
20674       /* The operand must be an indirect memory reference.  The result
20675          is the register name.  */
20676       if (!MEM_P (x) || !REG_P (XEXP (x, 0))
20677           || REGNO (XEXP (x, 0)) >= 32)
20678         output_operand_lossage ("invalid %%P value");
20679       else
20680         fputs (reg_names[REGNO (XEXP (x, 0))], file);
20681       return;
20682
20683     case 'q':
20684       /* This outputs the logical code corresponding to a boolean
20685          expression.  The expression may have one or both operands
20686          negated (if one, only the first one).  For condition register
20687          logical operations, it will also treat the negated
20688          CR codes as NOTs, but not handle NOTs of them.  */
20689       {
20690         const char *const *t = 0;
20691         const char *s;
20692         enum rtx_code code = GET_CODE (x);
20693         static const char * const tbl[3][3] = {
20694           { "and", "andc", "nor" },
20695           { "or", "orc", "nand" },
20696           { "xor", "eqv", "xor" } };
20697
20698         if (code == AND)
20699           t = tbl[0];
20700         else if (code == IOR)
20701           t = tbl[1];
20702         else if (code == XOR)
20703           t = tbl[2];
20704         else
20705           output_operand_lossage ("invalid %%q value");
20706
20707         if (GET_CODE (XEXP (x, 0)) != NOT)
20708           s = t[0];
20709         else
20710           {
20711             if (GET_CODE (XEXP (x, 1)) == NOT)
20712               s = t[2];
20713             else
20714               s = t[1];
20715           }
20716
20717         fputs (s, file);
20718       }
20719       return;
20720
20721     case 'Q':
20722       if (! TARGET_MFCRF)
20723         return;
20724       fputc (',', file);
20725       /* FALLTHRU */
20726
20727     case 'R':
20728       /* X is a CR register.  Print the mask for `mtcrf'.  */
20729       if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
20730         output_operand_lossage ("invalid %%R value");
20731       else
20732         fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
20733       return;
20734
20735     case 's':
20736       /* Low 5 bits of 32 - value */
20737       if (! INT_P (x))
20738         output_operand_lossage ("invalid %%s value");
20739       else
20740         fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INTVAL (x)) & 31);
20741       return;
20742
20743     case 't':
20744       /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
20745       if (!REG_P (x) || !CR_REGNO_P (REGNO (x)))
20746         {
20747           output_operand_lossage ("invalid %%t value");
20748           return;
20749         }
20750
20751       /* Bit 3 is OV bit.  */
20752       i = 4 * (REGNO (x) - CR0_REGNO) + 3;
20753
20754       /* If we want bit 31, write a shift count of zero, not 32.  */
20755       fprintf (file, "%d", i == 31 ? 0 : i + 1);
20756       return;
20757
20758     case 'T':
20759       /* Print the symbolic name of a branch target register.  */
20760       if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_PLTSEQ)
20761         x = XVECEXP (x, 0, 0);
20762       if (!REG_P (x) || (REGNO (x) != LR_REGNO
20763                          && REGNO (x) != CTR_REGNO))
20764         output_operand_lossage ("invalid %%T value");
20765       else if (REGNO (x) == LR_REGNO)
20766         fputs ("lr", file);
20767       else
20768         fputs ("ctr", file);
20769       return;
20770
20771     case 'u':
20772       /* High-order or low-order 16 bits of constant, whichever is non-zero,
20773          for use in unsigned operand.  */
20774       if (! INT_P (x))
20775         {
20776           output_operand_lossage ("invalid %%u value");
20777           return;
20778         }
20779
20780       uval = INTVAL (x);
20781       if ((uval & 0xffff) == 0)
20782         uval >>= 16;
20783
20784       fprintf (file, HOST_WIDE_INT_PRINT_HEX, uval & 0xffff);
20785       return;
20786
20787     case 'v':
20788       /* High-order 16 bits of constant for use in signed operand.  */
20789       if (! INT_P (x))
20790         output_operand_lossage ("invalid %%v value");
20791       else
20792         fprintf (file, HOST_WIDE_INT_PRINT_HEX,
20793                  (INTVAL (x) >> 16) & 0xffff);
20794       return;
20795
20796     case 'U':
20797       /* Print `u' if this has an auto-increment or auto-decrement.  */
20798       if (MEM_P (x)
20799           && (GET_CODE (XEXP (x, 0)) == PRE_INC
20800               || GET_CODE (XEXP (x, 0)) == PRE_DEC
20801               || GET_CODE (XEXP (x, 0)) == PRE_MODIFY))
20802         putc ('u', file);
20803       return;
20804
20805     case 'V':
20806       /* Print the trap code for this operand.  */
20807       switch (GET_CODE (x))
20808         {
20809         case EQ:
20810           fputs ("eq", file);   /* 4 */
20811           break;
20812         case NE:
20813           fputs ("ne", file);   /* 24 */
20814           break;
20815         case LT:
20816           fputs ("lt", file);   /* 16 */
20817           break;
20818         case LE:
20819           fputs ("le", file);   /* 20 */
20820           break;
20821         case GT:
20822           fputs ("gt", file);   /* 8 */
20823           break;
20824         case GE:
20825           fputs ("ge", file);   /* 12 */
20826           break;
20827         case LTU:
20828           fputs ("llt", file);  /* 2 */
20829           break;
20830         case LEU:
20831           fputs ("lle", file);  /* 6 */
20832           break;
20833         case GTU:
20834           fputs ("lgt", file);  /* 1 */
20835           break;
20836         case GEU:
20837           fputs ("lge", file);  /* 5 */
20838           break;
20839         default:
20840           output_operand_lossage ("invalid %%V value");
20841         }
20842       break;
20843
20844     case 'w':
20845       /* If constant, low-order 16 bits of constant, signed.  Otherwise, write
20846          normally.  */
20847       if (INT_P (x))
20848         fprintf (file, HOST_WIDE_INT_PRINT_DEC,
20849                  ((INTVAL (x) & 0xffff) ^ 0x8000) - 0x8000);
20850       else
20851         print_operand (file, x, 0);
20852       return;
20853
20854     case 'x':
20855       /* X is a FPR or Altivec register used in a VSX context.  */
20856       if (!REG_P (x) || !VSX_REGNO_P (REGNO (x)))
20857         output_operand_lossage ("invalid %%x value");
20858       else
20859         {
20860           int reg = REGNO (x);
20861           int vsx_reg = (FP_REGNO_P (reg)
20862                          ? reg - 32
20863                          : reg - FIRST_ALTIVEC_REGNO + 32);
20864
20865 #ifdef TARGET_REGNAMES      
20866           if (TARGET_REGNAMES)
20867             fprintf (file, "%%vs%d", vsx_reg);
20868           else
20869 #endif
20870             fprintf (file, "%d", vsx_reg);
20871         }
20872       return;
20873
20874     case 'X':
20875       if (MEM_P (x)
20876           && (legitimate_indexed_address_p (XEXP (x, 0), 0)
20877               || (GET_CODE (XEXP (x, 0)) == PRE_MODIFY
20878                   && legitimate_indexed_address_p (XEXP (XEXP (x, 0), 1), 0))))
20879         putc ('x', file);
20880       return;
20881
20882     case 'Y':
20883       /* Like 'L', for third word of TImode/PTImode  */
20884       if (REG_P (x))
20885         fputs (reg_names[REGNO (x) + 2], file);
20886       else if (MEM_P (x))
20887         {
20888           machine_mode mode = GET_MODE (x);
20889           if (GET_CODE (XEXP (x, 0)) == PRE_INC
20890               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
20891             output_address (mode, plus_constant (Pmode,
20892                                                  XEXP (XEXP (x, 0), 0), 8));
20893           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
20894             output_address (mode, plus_constant (Pmode,
20895                                                  XEXP (XEXP (x, 0), 0), 8));
20896           else
20897             output_address (mode, XEXP (adjust_address_nv (x, SImode, 8), 0));
20898           if (small_data_operand (x, GET_MODE (x)))
20899             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
20900                      reg_names[SMALL_DATA_REG]);
20901         }
20902       return;
20903
20904     case 'z':
20905       if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_PLTSEQ)
20906         x = XVECEXP (x, 0, 1);
20907       /* X is a SYMBOL_REF.  Write out the name preceded by a
20908          period and without any trailing data in brackets.  Used for function
20909          names.  If we are configured for System V (or the embedded ABI) on
20910          the PowerPC, do not emit the period, since those systems do not use
20911          TOCs and the like.  */
20912       if (!SYMBOL_REF_P (x))
20913         {
20914           output_operand_lossage ("invalid %%z value");
20915           return;
20916         }
20917
20918       /* For macho, check to see if we need a stub.  */
20919       if (TARGET_MACHO)
20920         {
20921           const char *name = XSTR (x, 0);
20922 #if TARGET_MACHO
20923           if (darwin_emit_branch_islands
20924               && MACHOPIC_INDIRECT
20925               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
20926             name = machopic_indirection_name (x, /*stub_p=*/true);
20927 #endif
20928           assemble_name (file, name);
20929         }
20930       else if (!DOT_SYMBOLS)
20931         assemble_name (file, XSTR (x, 0));
20932       else
20933         rs6000_output_function_entry (file, XSTR (x, 0));
20934       return;
20935
20936     case 'Z':
20937       /* Like 'L', for last word of TImode/PTImode.  */
20938       if (REG_P (x))
20939         fputs (reg_names[REGNO (x) + 3], file);
20940       else if (MEM_P (x))
20941         {
20942           machine_mode mode = GET_MODE (x);
20943           if (GET_CODE (XEXP (x, 0)) == PRE_INC
20944               || GET_CODE (XEXP (x, 0)) == PRE_DEC)
20945             output_address (mode, plus_constant (Pmode,
20946                                                  XEXP (XEXP (x, 0), 0), 12));
20947           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
20948             output_address (mode, plus_constant (Pmode,
20949                                                  XEXP (XEXP (x, 0), 0), 12));
20950           else
20951             output_address (mode, XEXP (adjust_address_nv (x, SImode, 12), 0));
20952           if (small_data_operand (x, GET_MODE (x)))
20953             fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
20954                      reg_names[SMALL_DATA_REG]);
20955         }
20956       return;
20957
20958       /* Print AltiVec memory operand.  */
20959     case 'y':
20960       {
20961         rtx tmp;
20962
20963         gcc_assert (MEM_P (x));
20964
20965         tmp = XEXP (x, 0);
20966
20967         if (VECTOR_MEM_ALTIVEC_OR_VSX_P (GET_MODE (x))
20968             && GET_CODE (tmp) == AND
20969             && CONST_INT_P (XEXP (tmp, 1))
20970             && INTVAL (XEXP (tmp, 1)) == -16)
20971           tmp = XEXP (tmp, 0);
20972         else if (VECTOR_MEM_VSX_P (GET_MODE (x))
20973                  && GET_CODE (tmp) == PRE_MODIFY)
20974           tmp = XEXP (tmp, 1);
20975         if (REG_P (tmp))
20976           fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
20977         else
20978           {
20979             if (GET_CODE (tmp) != PLUS
20980                 || !REG_P (XEXP (tmp, 0))
20981                 || !REG_P (XEXP (tmp, 1)))
20982               {
20983                 output_operand_lossage ("invalid %%y value, try using the 'Z' constraint");
20984                 break;
20985               }
20986
20987             if (REGNO (XEXP (tmp, 0)) == 0)
20988               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
20989                        reg_names[ REGNO (XEXP (tmp, 0)) ]);
20990             else
20991               fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
20992                        reg_names[ REGNO (XEXP (tmp, 1)) ]);
20993           }
20994         break;
20995       }
20996
20997     case 0:
20998       if (REG_P (x))
20999         fprintf (file, "%s", reg_names[REGNO (x)]);
21000       else if (MEM_P (x))
21001         {
21002           /* We need to handle PRE_INC and PRE_DEC here, since we need to
21003              know the width from the mode.  */
21004           if (GET_CODE (XEXP (x, 0)) == PRE_INC)
21005             fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
21006                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
21007           else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
21008             fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
21009                      reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
21010           else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
21011             output_address (GET_MODE (x), XEXP (XEXP (x, 0), 1));
21012           else
21013             output_address (GET_MODE (x), XEXP (x, 0));
21014         }
21015       else if (toc_relative_expr_p (x, false,
21016                                     &tocrel_base_oac, &tocrel_offset_oac))
21017         /* This hack along with a corresponding hack in
21018            rs6000_output_addr_const_extra arranges to output addends
21019            where the assembler expects to find them.  eg.
21020            (plus (unspec [(symbol_ref ("x")) (reg 2)] tocrel) 4)
21021            without this hack would be output as "x@toc+4".  We
21022            want "x+4@toc".  */
21023         output_addr_const (file, CONST_CAST_RTX (tocrel_base_oac));
21024       else if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_TLSGD)
21025         output_addr_const (file, XVECEXP (x, 0, 0));
21026       else if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_PLTSEQ)
21027         output_addr_const (file, XVECEXP (x, 0, 1));
21028       else
21029         output_addr_const (file, x);
21030       return;
21031
21032     case '&':
21033       if (const char *name = get_some_local_dynamic_name ())
21034         assemble_name (file, name);
21035       else
21036         output_operand_lossage ("'%%&' used without any "
21037                                 "local dynamic TLS references");
21038       return;
21039
21040     default:
21041       output_operand_lossage ("invalid %%xn code");
21042     }
21043 }
21044 \f
21045 /* Print the address of an operand.  */
21046
21047 void
21048 print_operand_address (FILE *file, rtx x)
21049 {
21050   if (REG_P (x))
21051     fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
21052
21053   /* Is it a pc-relative address?  */
21054   else if (pcrel_address (x, Pmode))
21055     {
21056       HOST_WIDE_INT offset;
21057
21058       if (GET_CODE (x) == CONST)
21059         x = XEXP (x, 0);
21060
21061       if (GET_CODE (x) == PLUS)
21062         {
21063           offset = INTVAL (XEXP (x, 1));
21064           x = XEXP (x, 0);
21065         }
21066       else
21067         offset = 0;
21068
21069       output_addr_const (file, x);
21070
21071       if (offset)
21072         fprintf (file, "%+" PRId64, offset);
21073
21074       fputs ("@pcrel", file);
21075     }
21076   else if (SYMBOL_REF_P (x) || GET_CODE (x) == CONST
21077            || GET_CODE (x) == LABEL_REF)
21078     {
21079       output_addr_const (file, x);
21080       if (small_data_operand (x, GET_MODE (x)))
21081         fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
21082                  reg_names[SMALL_DATA_REG]);
21083       else
21084         gcc_assert (!TARGET_TOC);
21085     }
21086   else if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 0))
21087            && REG_P (XEXP (x, 1)))
21088     {
21089       if (REGNO (XEXP (x, 0)) == 0)
21090         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
21091                  reg_names[ REGNO (XEXP (x, 0)) ]);
21092       else
21093         fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
21094                  reg_names[ REGNO (XEXP (x, 1)) ]);
21095     }
21096   else if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 0))
21097            && CONST_INT_P (XEXP (x, 1)))
21098     fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
21099              INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
21100 #if TARGET_MACHO
21101   else if (GET_CODE (x) == LO_SUM && REG_P (XEXP (x, 0))
21102            && CONSTANT_P (XEXP (x, 1)))
21103     {
21104       fprintf (file, "lo16(");
21105       output_addr_const (file, XEXP (x, 1));
21106       fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
21107     }
21108 #endif
21109 #if TARGET_ELF
21110   else if (GET_CODE (x) == LO_SUM && REG_P (XEXP (x, 0))
21111            && CONSTANT_P (XEXP (x, 1)))
21112     {
21113       output_addr_const (file, XEXP (x, 1));
21114       fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
21115     }
21116 #endif
21117   else if (toc_relative_expr_p (x, false, &tocrel_base_oac, &tocrel_offset_oac))
21118     {
21119       /* This hack along with a corresponding hack in
21120          rs6000_output_addr_const_extra arranges to output addends
21121          where the assembler expects to find them.  eg.
21122          (lo_sum (reg 9)
21123          .       (plus (unspec [(symbol_ref ("x")) (reg 2)] tocrel) 8))
21124          without this hack would be output as "x@toc+8@l(9)".  We
21125          want "x+8@toc@l(9)".  */
21126       output_addr_const (file, CONST_CAST_RTX (tocrel_base_oac));
21127       if (GET_CODE (x) == LO_SUM)
21128         fprintf (file, "@l(%s)", reg_names[REGNO (XEXP (x, 0))]);
21129       else
21130         fprintf (file, "(%s)", reg_names[REGNO (XVECEXP (tocrel_base_oac, 0, 1))]);
21131     }
21132   else
21133     output_addr_const (file, x);
21134 }
21135 \f
21136 /* Implement TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA.  */
21137
21138 static bool
21139 rs6000_output_addr_const_extra (FILE *file, rtx x)
21140 {
21141   if (GET_CODE (x) == UNSPEC)
21142     switch (XINT (x, 1))
21143       {
21144       case UNSPEC_TOCREL:
21145         gcc_checking_assert (SYMBOL_REF_P (XVECEXP (x, 0, 0))
21146                              && REG_P (XVECEXP (x, 0, 1))
21147                              && REGNO (XVECEXP (x, 0, 1)) == TOC_REGISTER);
21148         output_addr_const (file, XVECEXP (x, 0, 0));
21149         if (x == tocrel_base_oac && tocrel_offset_oac != const0_rtx)
21150           {
21151             if (INTVAL (tocrel_offset_oac) >= 0)
21152               fprintf (file, "+");
21153             output_addr_const (file, CONST_CAST_RTX (tocrel_offset_oac));
21154           }
21155         if (!TARGET_AIX || (TARGET_ELF && TARGET_MINIMAL_TOC))
21156           {
21157             putc ('-', file);
21158             assemble_name (file, toc_label_name);
21159             need_toc_init = 1;
21160           }
21161         else if (TARGET_ELF)
21162           fputs ("@toc", file);
21163         return true;
21164
21165 #if TARGET_MACHO
21166       case UNSPEC_MACHOPIC_OFFSET:
21167         output_addr_const (file, XVECEXP (x, 0, 0));
21168         putc ('-', file);
21169         machopic_output_function_base_name (file);
21170         return true;
21171 #endif
21172       }
21173   return false;
21174 }
21175 \f
21176 /* Target hook for assembling integer objects.  The PowerPC version has
21177    to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
21178    is defined.  It also needs to handle DI-mode objects on 64-bit
21179    targets.  */
21180
21181 static bool
21182 rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
21183 {
21184 #ifdef RELOCATABLE_NEEDS_FIXUP
21185   /* Special handling for SI values.  */
21186   if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
21187     {
21188       static int recurse = 0;
21189
21190       /* For -mrelocatable, we mark all addresses that need to be fixed up in
21191          the .fixup section.  Since the TOC section is already relocated, we
21192          don't need to mark it here.  We used to skip the text section, but it
21193          should never be valid for relocated addresses to be placed in the text
21194          section.  */
21195       if (DEFAULT_ABI == ABI_V4
21196           && (TARGET_RELOCATABLE || flag_pic > 1)
21197           && in_section != toc_section
21198           && !recurse
21199           && !CONST_SCALAR_INT_P (x)
21200           && CONSTANT_P (x))
21201         {
21202           char buf[256];
21203
21204           recurse = 1;
21205           ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
21206           fixuplabelno++;
21207           ASM_OUTPUT_LABEL (asm_out_file, buf);
21208           fprintf (asm_out_file, "\t.long\t(");
21209           output_addr_const (asm_out_file, x);
21210           fprintf (asm_out_file, ")@fixup\n");
21211           fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
21212           ASM_OUTPUT_ALIGN (asm_out_file, 2);
21213           fprintf (asm_out_file, "\t.long\t");
21214           assemble_name (asm_out_file, buf);
21215           fprintf (asm_out_file, "\n\t.previous\n");
21216           recurse = 0;
21217           return true;
21218         }
21219       /* Remove initial .'s to turn a -mcall-aixdesc function
21220          address into the address of the descriptor, not the function
21221          itself.  */
21222       else if (SYMBOL_REF_P (x)
21223                && XSTR (x, 0)[0] == '.'
21224                && DEFAULT_ABI == ABI_AIX)
21225         {
21226           const char *name = XSTR (x, 0);
21227           while (*name == '.')
21228             name++;
21229
21230           fprintf (asm_out_file, "\t.long\t%s\n", name);
21231           return true;
21232         }
21233     }
21234 #endif /* RELOCATABLE_NEEDS_FIXUP */
21235   return default_assemble_integer (x, size, aligned_p);
21236 }
21237
21238 /* Return a template string for assembly to emit when making an
21239    external call.  FUNOP is the call mem argument operand number.  */
21240
21241 static const char *
21242 rs6000_call_template_1 (rtx *operands, unsigned int funop, bool sibcall)
21243 {
21244   /* -Wformat-overflow workaround, without which gcc thinks that %u
21245       might produce 10 digits.  */
21246   gcc_assert (funop <= MAX_RECOG_OPERANDS);
21247
21248   char arg[12];
21249   arg[0] = 0;
21250   if (TARGET_TLS_MARKERS && GET_CODE (operands[funop + 1]) == UNSPEC)
21251     {
21252       if (XINT (operands[funop + 1], 1) == UNSPEC_TLSGD)
21253         sprintf (arg, "(%%%u@tlsgd)", funop + 1);
21254       else if (XINT (operands[funop + 1], 1) == UNSPEC_TLSLD)
21255         sprintf (arg, "(%%&@tlsld)");
21256       else
21257         gcc_unreachable ();
21258     }
21259
21260   /* The magic 32768 offset here corresponds to the offset of
21261      r30 in .got2, as given by LCTOC1.  See sysv4.h:toc_section.  */
21262   char z[11];
21263   sprintf (z, "%%z%u%s", funop,
21264            (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic == 2
21265             ? "+32768" : ""));
21266
21267   static char str[32];  /* 1 spare */
21268   if (rs6000_pcrel_p (cfun))
21269     sprintf (str, "b%s %s@notoc%s", sibcall ? "" : "l", z, arg);
21270   else if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
21271     sprintf (str, "b%s %s%s%s", sibcall ? "" : "l", z, arg,
21272              sibcall ? "" : "\n\tnop");
21273   else if (DEFAULT_ABI == ABI_V4)
21274     sprintf (str, "b%s %s%s%s", sibcall ? "" : "l", z, arg,
21275              flag_pic ? "@plt" : "");
21276 #if TARGET_MACHO
21277   /* If/when we remove the mlongcall opt, we can share the AIX/ELGv2 case. */
21278    else if (DEFAULT_ABI == ABI_DARWIN)
21279     {
21280       /* The cookie is in operand func+2.  */
21281       gcc_checking_assert (GET_CODE (operands[funop + 2]) == CONST_INT);
21282       int cookie = INTVAL (operands[funop + 2]);
21283       if (cookie & CALL_LONG)
21284         {
21285           tree funname = get_identifier (XSTR (operands[funop], 0));
21286           tree labelname = get_prev_label (funname);
21287           gcc_checking_assert (labelname && !sibcall);
21288
21289           /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
21290              instruction will reach 'foo', otherwise link as 'bl L42'".
21291              "L42" should be a 'branch island', that will do a far jump to
21292              'foo'.  Branch islands are generated in
21293              macho_branch_islands().  */
21294           sprintf (str, "jbsr %%z%u,%.10s", funop,
21295                    IDENTIFIER_POINTER (labelname));
21296         }
21297       else
21298         /* Same as AIX or ELFv2, except to keep backwards compat, no nop
21299            after the call.  */
21300         sprintf (str, "b%s %s%s", sibcall ? "" : "l", z, arg);
21301     }
21302 #endif
21303   else
21304     gcc_unreachable ();
21305   return str;
21306 }
21307
21308 const char *
21309 rs6000_call_template (rtx *operands, unsigned int funop)
21310 {
21311   return rs6000_call_template_1 (operands, funop, false);
21312 }
21313
21314 const char *
21315 rs6000_sibcall_template (rtx *operands, unsigned int funop)
21316 {
21317   return rs6000_call_template_1 (operands, funop, true);
21318 }
21319
21320 /* As above, for indirect calls.  */
21321
21322 static const char *
21323 rs6000_indirect_call_template_1 (rtx *operands, unsigned int funop,
21324                                  bool sibcall)
21325 {
21326   /* -Wformat-overflow workaround, without which gcc thinks that %u
21327      might produce 10 digits.  Note that -Wformat-overflow will not
21328      currently warn here for str[], so do not rely on a warning to
21329      ensure str[] is correctly sized.  */
21330   gcc_assert (funop <= MAX_RECOG_OPERANDS);
21331
21332   /* Currently, funop is either 0 or 1.  The maximum string is always
21333      a !speculate 64-bit __tls_get_addr call.
21334
21335      ABI_ELFv2, pcrel:
21336      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21337      . 35       .reloc .,R_PPC64_PLTSEQ_NOTOC,%z1\n\t
21338      .  9       crset 2\n\t
21339      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21340      . 36       .reloc .,R_PPC64_PLTCALL_NOTOC,%z1\n\t
21341      .  8       beq%T1l-
21342      .---
21343      .142
21344
21345      ABI_AIX:
21346      .  9       ld 2,%3\n\t
21347      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21348      . 29       .reloc .,R_PPC64_PLTSEQ,%z1\n\t
21349      .  9       crset 2\n\t
21350      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21351      . 30       .reloc .,R_PPC64_PLTCALL,%z1\n\t
21352      . 10       beq%T1l-\n\t
21353      . 10       ld 2,%4(1)
21354      .---
21355      .151
21356
21357      ABI_ELFv2:
21358      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21359      . 29       .reloc .,R_PPC64_PLTSEQ,%z1\n\t
21360      .  9       crset 2\n\t
21361      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21362      . 30       .reloc .,R_PPC64_PLTCALL,%z1\n\t
21363      . 10       beq%T1l-\n\t
21364      . 10       ld 2,%3(1)
21365      .---
21366      .142
21367
21368      ABI_V4:
21369      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21370      . 35       .reloc .,R_PPC64_PLTSEQ,%z1+32768\n\t
21371      .  9       crset 2\n\t
21372      . 27       .reloc .,R_PPC64_TLSGD,%2\n\t
21373      . 36       .reloc .,R_PPC64_PLTCALL,%z1+32768\n\t
21374      .  8       beq%T1l-
21375      .---
21376      .141  */
21377   static char str[160];  /* 8 spare */
21378   char *s = str;
21379   const char *ptrload = TARGET_64BIT ? "d" : "wz";
21380
21381   if (DEFAULT_ABI == ABI_AIX)
21382     s += sprintf (s,
21383                   "l%s 2,%%%u\n\t",
21384                   ptrload, funop + 2);
21385
21386   /* We don't need the extra code to stop indirect call speculation if
21387      calling via LR.  */
21388   bool speculate = (TARGET_MACHO
21389                     || rs6000_speculate_indirect_jumps
21390                     || (REG_P (operands[funop])
21391                         && REGNO (operands[funop]) == LR_REGNO));
21392
21393   if (TARGET_PLTSEQ && GET_CODE (operands[funop]) == UNSPEC)
21394     {
21395       const char *rel64 = TARGET_64BIT ? "64" : "";
21396       char tls[29];
21397       tls[0] = 0;
21398       if (TARGET_TLS_MARKERS && GET_CODE (operands[funop + 1]) == UNSPEC)
21399         {
21400           if (XINT (operands[funop + 1], 1) == UNSPEC_TLSGD)
21401             sprintf (tls, ".reloc .,R_PPC%s_TLSGD,%%%u\n\t",
21402                      rel64, funop + 1);
21403           else if (XINT (operands[funop + 1], 1) == UNSPEC_TLSLD)
21404             sprintf (tls, ".reloc .,R_PPC%s_TLSLD,%%&\n\t",
21405                      rel64);
21406           else
21407             gcc_unreachable ();
21408         }
21409
21410       const char *notoc = rs6000_pcrel_p (cfun) ? "_NOTOC" : "";
21411       const char *addend = (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT
21412                             && flag_pic == 2 ? "+32768" : "");
21413       if (!speculate)
21414         {
21415           s += sprintf (s,
21416                         "%s.reloc .,R_PPC%s_PLTSEQ%s,%%z%u%s\n\t",
21417                         tls, rel64, notoc, funop, addend);
21418           s += sprintf (s, "crset 2\n\t");
21419         }
21420       s += sprintf (s,
21421                     "%s.reloc .,R_PPC%s_PLTCALL%s,%%z%u%s\n\t",
21422                     tls, rel64, notoc, funop, addend);
21423     }
21424   else if (!speculate)
21425     s += sprintf (s, "crset 2\n\t");
21426
21427   if (rs6000_pcrel_p (cfun))
21428     {
21429       if (speculate)
21430         sprintf (s, "b%%T%ul", funop);
21431       else
21432         sprintf (s, "beq%%T%ul-", funop);
21433     }
21434   else if (DEFAULT_ABI == ABI_AIX)
21435     {
21436       if (speculate)
21437         sprintf (s,
21438                  "b%%T%ul\n\t"
21439                  "l%s 2,%%%u(1)",
21440                  funop, ptrload, funop + 3);
21441       else
21442         sprintf (s,
21443                  "beq%%T%ul-\n\t"
21444                  "l%s 2,%%%u(1)",
21445                  funop, ptrload, funop + 3);
21446     }
21447   else if (DEFAULT_ABI == ABI_ELFv2)
21448     {
21449       if (speculate)
21450         sprintf (s,
21451                  "b%%T%ul\n\t"
21452                  "l%s 2,%%%u(1)",
21453                  funop, ptrload, funop + 2);
21454       else
21455         sprintf (s,
21456                  "beq%%T%ul-\n\t"
21457                  "l%s 2,%%%u(1)",
21458                  funop, ptrload, funop + 2);
21459     }
21460   else
21461     {
21462       if (speculate)
21463         sprintf (s,
21464                  "b%%T%u%s",
21465                  funop, sibcall ? "" : "l");
21466       else
21467         sprintf (s,
21468                  "beq%%T%u%s-%s",
21469                  funop, sibcall ? "" : "l", sibcall ? "\n\tb $" : "");
21470     }
21471   return str;
21472 }
21473
21474 const char *
21475 rs6000_indirect_call_template (rtx *operands, unsigned int funop)
21476 {
21477   return rs6000_indirect_call_template_1 (operands, funop, false);
21478 }
21479
21480 const char *
21481 rs6000_indirect_sibcall_template (rtx *operands, unsigned int funop)
21482 {
21483   return rs6000_indirect_call_template_1 (operands, funop, true);
21484 }
21485
21486 #if HAVE_AS_PLTSEQ
21487 /* Output indirect call insns.  WHICH identifies the type of sequence.  */
21488 const char *
21489 rs6000_pltseq_template (rtx *operands, int which)
21490 {
21491   const char *rel64 = TARGET_64BIT ? "64" : "";
21492   char tls[30];
21493   tls[0] = 0;
21494   if (TARGET_TLS_MARKERS && GET_CODE (operands[3]) == UNSPEC)
21495     {
21496       char off = which == RS6000_PLTSEQ_PLT_PCREL34 ? '8' : '4';
21497       if (XINT (operands[3], 1) == UNSPEC_TLSGD)
21498         sprintf (tls, ".reloc .-%c,R_PPC%s_TLSGD,%%3\n\t",
21499                  off, rel64);
21500       else if (XINT (operands[3], 1) == UNSPEC_TLSLD)
21501         sprintf (tls, ".reloc .-%c,R_PPC%s_TLSLD,%%&\n\t",
21502                  off, rel64);
21503       else
21504         gcc_unreachable ();
21505     }
21506
21507   gcc_assert (DEFAULT_ABI == ABI_ELFv2 || DEFAULT_ABI == ABI_V4);
21508   static char str[96];  /* 10 spare */
21509   char off = WORDS_BIG_ENDIAN ? '2' : '4';
21510   const char *addend = (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT
21511                         && flag_pic == 2 ? "+32768" : "");
21512   switch (which)
21513     {
21514     case RS6000_PLTSEQ_TOCSAVE:
21515       sprintf (str,
21516                "st%s\n\t"
21517                "%s.reloc .-4,R_PPC%s_PLTSEQ,%%z2",
21518                TARGET_64BIT ? "d 2,24(1)" : "w 2,12(1)",
21519                tls, rel64);
21520       break;
21521     case RS6000_PLTSEQ_PLT16_HA:
21522       if (DEFAULT_ABI == ABI_V4 && !flag_pic)
21523         sprintf (str,
21524                  "lis %%0,0\n\t"
21525                  "%s.reloc .-%c,R_PPC%s_PLT16_HA,%%z2",
21526                  tls, off, rel64);
21527       else
21528         sprintf (str,
21529                  "addis %%0,%%1,0\n\t"
21530                  "%s.reloc .-%c,R_PPC%s_PLT16_HA,%%z2%s",
21531                  tls, off, rel64, addend);
21532       break;
21533     case RS6000_PLTSEQ_PLT16_LO:
21534       sprintf (str,
21535                "l%s %%0,0(%%1)\n\t"
21536                "%s.reloc .-%c,R_PPC%s_PLT16_LO%s,%%z2%s",
21537                TARGET_64BIT ? "d" : "wz",
21538                tls, off, rel64, TARGET_64BIT ? "_DS" : "", addend);
21539       break;
21540     case RS6000_PLTSEQ_MTCTR:
21541       sprintf (str,
21542                "mtctr %%1\n\t"
21543                "%s.reloc .-4,R_PPC%s_PLTSEQ,%%z2%s",
21544                tls, rel64, addend);
21545       break;
21546     case RS6000_PLTSEQ_PLT_PCREL34:
21547       sprintf (str,
21548                "pl%s %%0,0(0),1\n\t"
21549                "%s.reloc .-8,R_PPC%s_PLT_PCREL34_NOTOC,%%z2",
21550                TARGET_64BIT ? "d" : "wz",
21551                tls, rel64);
21552       break;
21553     default:
21554       gcc_unreachable ();
21555     }
21556   return str;
21557 }
21558 #endif
21559
21560 /* Helper function to return whether a MODE can do prefixed loads/stores.
21561    VOIDmode is used when we are loading the pc-relative address into a base
21562    register, but we are not using it as part of a memory operation.  As modes
21563    add support for prefixed memory, they will be added here.  */
21564
21565 static bool
21566 mode_supports_prefixed_address_p (machine_mode mode)
21567 {
21568   return mode == VOIDmode;
21569 }
21570
21571 /* Function to return true if ADDR is a valid prefixed memory address that uses
21572    mode MODE.  */
21573
21574 bool
21575 rs6000_prefixed_address (rtx addr, machine_mode mode)
21576 {
21577   if (!TARGET_PREFIXED_ADDR || !mode_supports_prefixed_address_p (mode))
21578     return false;
21579
21580   /* Check for PC-relative addresses.  */
21581   if (pcrel_address (addr, Pmode))
21582     return true;
21583
21584   /* Check for prefixed memory addresses that have a large numeric offset,
21585      or an offset that can't be used for a DS/DQ-form memory operation.  */
21586   if (GET_CODE (addr) == PLUS)
21587     {
21588       rtx op0 = XEXP (addr, 0);
21589       rtx op1 = XEXP (addr, 1);
21590
21591       if (!base_reg_operand (op0, Pmode) || !CONST_INT_P (op1))
21592         return false;
21593
21594       HOST_WIDE_INT value = INTVAL (op1);
21595       if (!SIGNED_34BIT_OFFSET_P (value, 0))
21596         return false;
21597
21598       /* Offset larger than 16-bits?  */
21599       if (!SIGNED_16BIT_OFFSET_P (value, 0))
21600         return true;
21601
21602       /* DQ instruction (bottom 4 bits must be 0) for vectors.  */
21603       HOST_WIDE_INT mask;
21604       if (GET_MODE_SIZE (mode) >= 16)
21605         mask = 15;
21606
21607       /* DS instruction (bottom 2 bits must be 0).  For 32-bit integers, we
21608          need to use DS instructions if we are sign-extending the value with
21609          LWA.  For 32-bit floating point, we need DS instructions to load and
21610          store values to the traditional Altivec registers.  */
21611       else if (GET_MODE_SIZE (mode) >= 4)
21612         mask = 3;
21613
21614       /* QImode/HImode has no restrictions.  */
21615       else
21616         return true;
21617
21618       /* Return true if we must use a prefixed instruction.  */
21619       return (value & mask) != 0;
21620     }
21621
21622   return false;
21623 }
21624 \f
21625 #if defined (HAVE_GAS_HIDDEN) && !TARGET_MACHO
21626 /* Emit an assembler directive to set symbol visibility for DECL to
21627    VISIBILITY_TYPE.  */
21628
21629 static void
21630 rs6000_assemble_visibility (tree decl, int vis)
21631 {
21632   if (TARGET_XCOFF)
21633     return;
21634
21635   /* Functions need to have their entry point symbol visibility set as
21636      well as their descriptor symbol visibility.  */
21637   if (DEFAULT_ABI == ABI_AIX
21638       && DOT_SYMBOLS
21639       && TREE_CODE (decl) == FUNCTION_DECL)
21640     {
21641       static const char * const visibility_types[] = {
21642         NULL, "protected", "hidden", "internal"
21643       };
21644
21645       const char *name, *type;
21646
21647       name = ((* targetm.strip_name_encoding)
21648               (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
21649       type = visibility_types[vis];
21650
21651       fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
21652       fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
21653     }
21654   else
21655     default_assemble_visibility (decl, vis);
21656 }
21657 #endif
21658 \f
21659 enum rtx_code
21660 rs6000_reverse_condition (machine_mode mode, enum rtx_code code)
21661 {
21662   /* Reversal of FP compares takes care -- an ordered compare
21663      becomes an unordered compare and vice versa.  */
21664   if (mode == CCFPmode
21665       && (!flag_finite_math_only
21666           || code == UNLT || code == UNLE || code == UNGT || code == UNGE
21667           || code == UNEQ || code == LTGT))
21668     return reverse_condition_maybe_unordered (code);
21669   else
21670     return reverse_condition (code);
21671 }
21672
21673 /* Generate a compare for CODE.  Return a brand-new rtx that
21674    represents the result of the compare.  */
21675
21676 static rtx
21677 rs6000_generate_compare (rtx cmp, machine_mode mode)
21678 {
21679   machine_mode comp_mode;
21680   rtx compare_result;
21681   enum rtx_code code = GET_CODE (cmp);
21682   rtx op0 = XEXP (cmp, 0);
21683   rtx op1 = XEXP (cmp, 1);
21684
21685   if (!TARGET_FLOAT128_HW && FLOAT128_VECTOR_P (mode))
21686     comp_mode = CCmode;
21687   else if (FLOAT_MODE_P (mode))
21688     comp_mode = CCFPmode;
21689   else if (code == GTU || code == LTU
21690            || code == GEU || code == LEU)
21691     comp_mode = CCUNSmode;
21692   else if ((code == EQ || code == NE)
21693            && unsigned_reg_p (op0)
21694            && (unsigned_reg_p (op1)
21695                || (CONST_INT_P (op1) && INTVAL (op1) != 0)))
21696     /* These are unsigned values, perhaps there will be a later
21697        ordering compare that can be shared with this one.  */
21698     comp_mode = CCUNSmode;
21699   else
21700     comp_mode = CCmode;
21701
21702   /* If we have an unsigned compare, make sure we don't have a signed value as
21703      an immediate.  */
21704   if (comp_mode == CCUNSmode && CONST_INT_P (op1)
21705       && INTVAL (op1) < 0)
21706     {
21707       op0 = copy_rtx_if_shared (op0);
21708       op1 = force_reg (GET_MODE (op0), op1);
21709       cmp = gen_rtx_fmt_ee (code, GET_MODE (cmp), op0, op1);
21710     }
21711
21712   /* First, the compare.  */
21713   compare_result = gen_reg_rtx (comp_mode);
21714
21715   /* IEEE 128-bit support in VSX registers when we do not have hardware
21716      support.  */
21717   if (!TARGET_FLOAT128_HW && FLOAT128_VECTOR_P (mode))
21718     {
21719       rtx libfunc = NULL_RTX;
21720       bool check_nan = false;
21721       rtx dest;
21722
21723       switch (code)
21724         {
21725         case EQ:
21726         case NE:
21727           libfunc = optab_libfunc (eq_optab, mode);
21728           break;
21729
21730         case GT:
21731         case GE:
21732           libfunc = optab_libfunc (ge_optab, mode);
21733           break;
21734
21735         case LT:
21736         case LE:
21737           libfunc = optab_libfunc (le_optab, mode);
21738           break;
21739
21740         case UNORDERED:
21741         case ORDERED:
21742           libfunc = optab_libfunc (unord_optab, mode);
21743           code = (code == UNORDERED) ? NE : EQ;
21744           break;
21745
21746         case UNGE:
21747         case UNGT:
21748           check_nan = true;
21749           libfunc = optab_libfunc (ge_optab, mode);
21750           code = (code == UNGE) ? GE : GT;
21751           break;
21752
21753         case UNLE:
21754         case UNLT:
21755           check_nan = true;
21756           libfunc = optab_libfunc (le_optab, mode);
21757           code = (code == UNLE) ? LE : LT;
21758           break;
21759
21760         case UNEQ:
21761         case LTGT:
21762           check_nan = true;
21763           libfunc = optab_libfunc (eq_optab, mode);
21764           code = (code = UNEQ) ? EQ : NE;
21765           break;
21766
21767         default:
21768           gcc_unreachable ();
21769         }
21770
21771       gcc_assert (libfunc);
21772
21773       if (!check_nan)
21774         dest = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
21775                                         SImode, op0, mode, op1, mode);
21776
21777       /* The library signals an exception for signalling NaNs, so we need to
21778          handle isgreater, etc. by first checking isordered.  */
21779       else
21780         {
21781           rtx ne_rtx, normal_dest, unord_dest;
21782           rtx unord_func = optab_libfunc (unord_optab, mode);
21783           rtx join_label = gen_label_rtx ();
21784           rtx join_ref = gen_rtx_LABEL_REF (VOIDmode, join_label);
21785           rtx unord_cmp = gen_reg_rtx (comp_mode);
21786
21787
21788           /* Test for either value being a NaN.  */
21789           gcc_assert (unord_func);
21790           unord_dest = emit_library_call_value (unord_func, NULL_RTX, LCT_CONST,
21791                                                 SImode, op0, mode, op1, mode);
21792
21793           /* Set value (0) if either value is a NaN, and jump to the join
21794              label.  */
21795           dest = gen_reg_rtx (SImode);
21796           emit_move_insn (dest, const1_rtx);
21797           emit_insn (gen_rtx_SET (unord_cmp,
21798                                   gen_rtx_COMPARE (comp_mode, unord_dest,
21799                                                    const0_rtx)));
21800
21801           ne_rtx = gen_rtx_NE (comp_mode, unord_cmp, const0_rtx);
21802           emit_jump_insn (gen_rtx_SET (pc_rtx,
21803                                        gen_rtx_IF_THEN_ELSE (VOIDmode, ne_rtx,
21804                                                              join_ref,
21805                                                              pc_rtx)));
21806
21807           /* Do the normal comparison, knowing that the values are not
21808              NaNs.  */
21809           normal_dest = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
21810                                                  SImode, op0, mode, op1, mode);
21811
21812           emit_insn (gen_cstoresi4 (dest,
21813                                     gen_rtx_fmt_ee (code, SImode, normal_dest,
21814                                                     const0_rtx),
21815                                     normal_dest, const0_rtx));
21816
21817           /* Join NaN and non-Nan paths.  Compare dest against 0.  */
21818           emit_label (join_label);
21819           code = NE;
21820         }
21821
21822       emit_insn (gen_rtx_SET (compare_result,
21823                               gen_rtx_COMPARE (comp_mode, dest, const0_rtx)));
21824     }
21825
21826   else
21827     {
21828       /* Generate XLC-compatible TFmode compare as PARALLEL with extra
21829          CLOBBERs to match cmptf_internal2 pattern.  */
21830       if (comp_mode == CCFPmode && TARGET_XL_COMPAT
21831           && FLOAT128_IBM_P (GET_MODE (op0))
21832           && TARGET_HARD_FLOAT)
21833         emit_insn (gen_rtx_PARALLEL (VOIDmode,
21834           gen_rtvec (10,
21835                      gen_rtx_SET (compare_result,
21836                                   gen_rtx_COMPARE (comp_mode, op0, op1)),
21837                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21838                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21839                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21840                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21841                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21842                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21843                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21844                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
21845                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (Pmode)))));
21846       else if (GET_CODE (op1) == UNSPEC
21847                && XINT (op1, 1) == UNSPEC_SP_TEST)
21848         {
21849           rtx op1b = XVECEXP (op1, 0, 0);
21850           comp_mode = CCEQmode;
21851           compare_result = gen_reg_rtx (CCEQmode);
21852           if (TARGET_64BIT)
21853             emit_insn (gen_stack_protect_testdi (compare_result, op0, op1b));
21854           else
21855             emit_insn (gen_stack_protect_testsi (compare_result, op0, op1b));
21856         }
21857       else
21858         emit_insn (gen_rtx_SET (compare_result,
21859                                 gen_rtx_COMPARE (comp_mode, op0, op1)));
21860     }
21861
21862   /* Some kinds of FP comparisons need an OR operation;
21863      under flag_finite_math_only we don't bother.  */
21864   if (FLOAT_MODE_P (mode)
21865       && (!FLOAT128_IEEE_P (mode) || TARGET_FLOAT128_HW)
21866       && !flag_finite_math_only
21867       && (code == LE || code == GE
21868           || code == UNEQ || code == LTGT
21869           || code == UNGT || code == UNLT))
21870     {
21871       enum rtx_code or1, or2;
21872       rtx or1_rtx, or2_rtx, compare2_rtx;
21873       rtx or_result = gen_reg_rtx (CCEQmode);
21874
21875       switch (code)
21876         {
21877         case LE: or1 = LT;  or2 = EQ;  break;
21878         case GE: or1 = GT;  or2 = EQ;  break;
21879         case UNEQ: or1 = UNORDERED;  or2 = EQ;  break;
21880         case LTGT: or1 = LT;  or2 = GT;  break;
21881         case UNGT: or1 = UNORDERED;  or2 = GT;  break;
21882         case UNLT: or1 = UNORDERED;  or2 = LT;  break;
21883         default:  gcc_unreachable ();
21884         }
21885       validate_condition_mode (or1, comp_mode);
21886       validate_condition_mode (or2, comp_mode);
21887       or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
21888       or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
21889       compare2_rtx = gen_rtx_COMPARE (CCEQmode,
21890                                       gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
21891                                       const_true_rtx);
21892       emit_insn (gen_rtx_SET (or_result, compare2_rtx));
21893
21894       compare_result = or_result;
21895       code = EQ;
21896     }
21897
21898   validate_condition_mode (code, GET_MODE (compare_result));
21899
21900   return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
21901 }
21902
21903 \f
21904 /* Return the diagnostic message string if the binary operation OP is
21905    not permitted on TYPE1 and TYPE2, NULL otherwise.  */
21906
21907 static const char*
21908 rs6000_invalid_binary_op (int op ATTRIBUTE_UNUSED,
21909                           const_tree type1,
21910                           const_tree type2)
21911 {
21912   machine_mode mode1 = TYPE_MODE (type1);
21913   machine_mode mode2 = TYPE_MODE (type2);
21914
21915   /* For complex modes, use the inner type.  */
21916   if (COMPLEX_MODE_P (mode1))
21917     mode1 = GET_MODE_INNER (mode1);
21918
21919   if (COMPLEX_MODE_P (mode2))
21920     mode2 = GET_MODE_INNER (mode2);
21921
21922   /* Don't allow IEEE 754R 128-bit binary floating point and IBM extended
21923      double to intermix unless -mfloat128-convert.  */
21924   if (mode1 == mode2)
21925     return NULL;
21926
21927   if (!TARGET_FLOAT128_CVT)
21928     {
21929       if ((mode1 == KFmode && mode2 == IFmode)
21930           || (mode1 == IFmode && mode2 == KFmode))
21931         return N_("__float128 and __ibm128 cannot be used in the same "
21932                   "expression");
21933
21934       if (TARGET_IEEEQUAD
21935           && ((mode1 == IFmode && mode2 == TFmode)
21936               || (mode1 == TFmode && mode2 == IFmode)))
21937         return N_("__ibm128 and long double cannot be used in the same "
21938                   "expression");
21939
21940       if (!TARGET_IEEEQUAD
21941           && ((mode1 == KFmode && mode2 == TFmode)
21942               || (mode1 == TFmode && mode2 == KFmode)))
21943         return N_("__float128 and long double cannot be used in the same "
21944                   "expression");
21945     }
21946
21947   return NULL;
21948 }
21949
21950 \f
21951 /* Expand floating point conversion to/from __float128 and __ibm128.  */
21952
21953 void
21954 rs6000_expand_float128_convert (rtx dest, rtx src, bool unsigned_p)
21955 {
21956   machine_mode dest_mode = GET_MODE (dest);
21957   machine_mode src_mode = GET_MODE (src);
21958   convert_optab cvt = unknown_optab;
21959   bool do_move = false;
21960   rtx libfunc = NULL_RTX;
21961   rtx dest2;
21962   typedef rtx (*rtx_2func_t) (rtx, rtx);
21963   rtx_2func_t hw_convert = (rtx_2func_t)0;
21964   size_t kf_or_tf;
21965
21966   struct hw_conv_t {
21967     rtx_2func_t from_df;
21968     rtx_2func_t from_sf;
21969     rtx_2func_t from_si_sign;
21970     rtx_2func_t from_si_uns;
21971     rtx_2func_t from_di_sign;
21972     rtx_2func_t from_di_uns;
21973     rtx_2func_t to_df;
21974     rtx_2func_t to_sf;
21975     rtx_2func_t to_si_sign;
21976     rtx_2func_t to_si_uns;
21977     rtx_2func_t to_di_sign;
21978     rtx_2func_t to_di_uns;
21979   } hw_conversions[2] = {
21980     /* convertions to/from KFmode */
21981     {
21982       gen_extenddfkf2_hw,               /* KFmode <- DFmode.  */
21983       gen_extendsfkf2_hw,               /* KFmode <- SFmode.  */
21984       gen_float_kfsi2_hw,               /* KFmode <- SImode (signed).  */
21985       gen_floatuns_kfsi2_hw,            /* KFmode <- SImode (unsigned).  */
21986       gen_float_kfdi2_hw,               /* KFmode <- DImode (signed).  */
21987       gen_floatuns_kfdi2_hw,            /* KFmode <- DImode (unsigned).  */
21988       gen_trunckfdf2_hw,                /* DFmode <- KFmode.  */
21989       gen_trunckfsf2_hw,                /* SFmode <- KFmode.  */
21990       gen_fix_kfsi2_hw,                 /* SImode <- KFmode (signed).  */
21991       gen_fixuns_kfsi2_hw,              /* SImode <- KFmode (unsigned).  */
21992       gen_fix_kfdi2_hw,                 /* DImode <- KFmode (signed).  */
21993       gen_fixuns_kfdi2_hw,              /* DImode <- KFmode (unsigned).  */
21994     },
21995
21996     /* convertions to/from TFmode */
21997     {
21998       gen_extenddftf2_hw,               /* TFmode <- DFmode.  */
21999       gen_extendsftf2_hw,               /* TFmode <- SFmode.  */
22000       gen_float_tfsi2_hw,               /* TFmode <- SImode (signed).  */
22001       gen_floatuns_tfsi2_hw,            /* TFmode <- SImode (unsigned).  */
22002       gen_float_tfdi2_hw,               /* TFmode <- DImode (signed).  */
22003       gen_floatuns_tfdi2_hw,            /* TFmode <- DImode (unsigned).  */
22004       gen_trunctfdf2_hw,                /* DFmode <- TFmode.  */
22005       gen_trunctfsf2_hw,                /* SFmode <- TFmode.  */
22006       gen_fix_tfsi2_hw,                 /* SImode <- TFmode (signed).  */
22007       gen_fixuns_tfsi2_hw,              /* SImode <- TFmode (unsigned).  */
22008       gen_fix_tfdi2_hw,                 /* DImode <- TFmode (signed).  */
22009       gen_fixuns_tfdi2_hw,              /* DImode <- TFmode (unsigned).  */
22010     },
22011   };
22012
22013   if (dest_mode == src_mode)
22014     gcc_unreachable ();
22015
22016   /* Eliminate memory operations.  */
22017   if (MEM_P (src))
22018     src = force_reg (src_mode, src);
22019
22020   if (MEM_P (dest))
22021     {
22022       rtx tmp = gen_reg_rtx (dest_mode);
22023       rs6000_expand_float128_convert (tmp, src, unsigned_p);
22024       rs6000_emit_move (dest, tmp, dest_mode);
22025       return;
22026     }
22027
22028   /* Convert to IEEE 128-bit floating point.  */
22029   if (FLOAT128_IEEE_P (dest_mode))
22030     {
22031       if (dest_mode == KFmode)
22032         kf_or_tf = 0;
22033       else if (dest_mode == TFmode)
22034         kf_or_tf = 1;
22035       else
22036         gcc_unreachable ();
22037
22038       switch (src_mode)
22039         {
22040         case E_DFmode:
22041           cvt = sext_optab;
22042           hw_convert = hw_conversions[kf_or_tf].from_df;
22043           break;
22044
22045         case E_SFmode:
22046           cvt = sext_optab;
22047           hw_convert = hw_conversions[kf_or_tf].from_sf;
22048           break;
22049
22050         case E_KFmode:
22051         case E_IFmode:
22052         case E_TFmode:
22053           if (FLOAT128_IBM_P (src_mode))
22054             cvt = sext_optab;
22055           else
22056             do_move = true;
22057           break;
22058
22059         case E_SImode:
22060           if (unsigned_p)
22061             {
22062               cvt = ufloat_optab;
22063               hw_convert = hw_conversions[kf_or_tf].from_si_uns;
22064             }
22065           else
22066             {
22067               cvt = sfloat_optab;
22068               hw_convert = hw_conversions[kf_or_tf].from_si_sign;
22069             }
22070           break;
22071
22072         case E_DImode:
22073           if (unsigned_p)
22074             {
22075               cvt = ufloat_optab;
22076               hw_convert = hw_conversions[kf_or_tf].from_di_uns;
22077             }
22078           else
22079             {
22080               cvt = sfloat_optab;
22081               hw_convert = hw_conversions[kf_or_tf].from_di_sign;
22082             }
22083           break;
22084
22085         default:
22086           gcc_unreachable ();
22087         }
22088     }
22089
22090   /* Convert from IEEE 128-bit floating point.  */
22091   else if (FLOAT128_IEEE_P (src_mode))
22092     {
22093       if (src_mode == KFmode)
22094         kf_or_tf = 0;
22095       else if (src_mode == TFmode)
22096         kf_or_tf = 1;
22097       else
22098         gcc_unreachable ();
22099
22100       switch (dest_mode)
22101         {
22102         case E_DFmode:
22103           cvt = trunc_optab;
22104           hw_convert = hw_conversions[kf_or_tf].to_df;
22105           break;
22106
22107         case E_SFmode:
22108           cvt = trunc_optab;
22109           hw_convert = hw_conversions[kf_or_tf].to_sf;
22110           break;
22111
22112         case E_KFmode:
22113         case E_IFmode:
22114         case E_TFmode:
22115           if (FLOAT128_IBM_P (dest_mode))
22116             cvt = trunc_optab;
22117           else
22118             do_move = true;
22119           break;
22120
22121         case E_SImode:
22122           if (unsigned_p)
22123             {
22124               cvt = ufix_optab;
22125               hw_convert = hw_conversions[kf_or_tf].to_si_uns;
22126             }
22127           else
22128             {
22129               cvt = sfix_optab;
22130               hw_convert = hw_conversions[kf_or_tf].to_si_sign;
22131             }
22132           break;
22133
22134         case E_DImode:
22135           if (unsigned_p)
22136             {
22137               cvt = ufix_optab;
22138               hw_convert = hw_conversions[kf_or_tf].to_di_uns;
22139             }
22140           else
22141             {
22142               cvt = sfix_optab;
22143               hw_convert = hw_conversions[kf_or_tf].to_di_sign;
22144             }
22145           break;
22146
22147         default:
22148           gcc_unreachable ();
22149         }
22150     }
22151
22152   /* Both IBM format.  */
22153   else if (FLOAT128_IBM_P (dest_mode) && FLOAT128_IBM_P (src_mode))
22154     do_move = true;
22155
22156   else
22157     gcc_unreachable ();
22158
22159   /* Handle conversion between TFmode/KFmode/IFmode.  */
22160   if (do_move)
22161     emit_insn (gen_rtx_SET (dest, gen_rtx_FLOAT_EXTEND (dest_mode, src)));
22162
22163   /* Handle conversion if we have hardware support.  */
22164   else if (TARGET_FLOAT128_HW && hw_convert)
22165     emit_insn ((hw_convert) (dest, src));
22166
22167   /* Call an external function to do the conversion.  */
22168   else if (cvt != unknown_optab)
22169     {
22170       libfunc = convert_optab_libfunc (cvt, dest_mode, src_mode);
22171       gcc_assert (libfunc != NULL_RTX);
22172
22173       dest2 = emit_library_call_value (libfunc, dest, LCT_CONST, dest_mode,
22174                                        src, src_mode);
22175
22176       gcc_assert (dest2 != NULL_RTX);
22177       if (!rtx_equal_p (dest, dest2))
22178         emit_move_insn (dest, dest2);
22179     }
22180
22181   else
22182     gcc_unreachable ();
22183
22184   return;
22185 }
22186
22187 \f
22188 /* Emit RTL that sets a register to zero if OP1 and OP2 are equal.  SCRATCH
22189    can be used as that dest register.  Return the dest register.  */
22190
22191 rtx
22192 rs6000_emit_eqne (machine_mode mode, rtx op1, rtx op2, rtx scratch)
22193 {
22194   if (op2 == const0_rtx)
22195     return op1;
22196
22197   if (GET_CODE (scratch) == SCRATCH)
22198     scratch = gen_reg_rtx (mode);
22199
22200   if (logical_operand (op2, mode))
22201     emit_insn (gen_rtx_SET (scratch, gen_rtx_XOR (mode, op1, op2)));
22202   else
22203     emit_insn (gen_rtx_SET (scratch,
22204                             gen_rtx_PLUS (mode, op1, negate_rtx (mode, op2))));
22205
22206   return scratch;
22207 }
22208
22209 void
22210 rs6000_emit_sCOND (machine_mode mode, rtx operands[])
22211 {
22212   rtx condition_rtx;
22213   machine_mode op_mode;
22214   enum rtx_code cond_code;
22215   rtx result = operands[0];
22216
22217   condition_rtx = rs6000_generate_compare (operands[1], mode);
22218   cond_code = GET_CODE (condition_rtx);
22219
22220   if (cond_code == NE
22221       || cond_code == GE || cond_code == LE
22222       || cond_code == GEU || cond_code == LEU
22223       || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
22224     {
22225       rtx not_result = gen_reg_rtx (CCEQmode);
22226       rtx not_op, rev_cond_rtx;
22227       machine_mode cc_mode;
22228
22229       cc_mode = GET_MODE (XEXP (condition_rtx, 0));
22230
22231       rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
22232                                      SImode, XEXP (condition_rtx, 0), const0_rtx);
22233       not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
22234       emit_insn (gen_rtx_SET (not_result, not_op));
22235       condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
22236     }
22237
22238   op_mode = GET_MODE (XEXP (operands[1], 0));
22239   if (op_mode == VOIDmode)
22240     op_mode = GET_MODE (XEXP (operands[1], 1));
22241
22242   if (TARGET_POWERPC64 && (op_mode == DImode || FLOAT_MODE_P (mode)))
22243     {
22244       PUT_MODE (condition_rtx, DImode);
22245       convert_move (result, condition_rtx, 0);
22246     }
22247   else
22248     {
22249       PUT_MODE (condition_rtx, SImode);
22250       emit_insn (gen_rtx_SET (result, condition_rtx));
22251     }
22252 }
22253
22254 /* Emit a branch of kind CODE to location LOC.  */
22255
22256 void
22257 rs6000_emit_cbranch (machine_mode mode, rtx operands[])
22258 {
22259   rtx condition_rtx, loc_ref;
22260
22261   condition_rtx = rs6000_generate_compare (operands[0], mode);
22262   loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
22263   emit_jump_insn (gen_rtx_SET (pc_rtx,
22264                                gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
22265                                                      loc_ref, pc_rtx)));
22266 }
22267
22268 /* Return the string to output a conditional branch to LABEL, which is
22269    the operand template of the label, or NULL if the branch is really a
22270    conditional return.
22271
22272    OP is the conditional expression.  XEXP (OP, 0) is assumed to be a
22273    condition code register and its mode specifies what kind of
22274    comparison we made.
22275
22276    REVERSED is nonzero if we should reverse the sense of the comparison.
22277
22278    INSN is the insn.  */
22279
22280 char *
22281 output_cbranch (rtx op, const char *label, int reversed, rtx_insn *insn)
22282 {
22283   static char string[64];
22284   enum rtx_code code = GET_CODE (op);
22285   rtx cc_reg = XEXP (op, 0);
22286   machine_mode mode = GET_MODE (cc_reg);
22287   int cc_regno = REGNO (cc_reg) - CR0_REGNO;
22288   int need_longbranch = label != NULL && get_attr_length (insn) == 8;
22289   int really_reversed = reversed ^ need_longbranch;
22290   char *s = string;
22291   const char *ccode;
22292   const char *pred;
22293   rtx note;
22294
22295   validate_condition_mode (code, mode);
22296
22297   /* Work out which way this really branches.  We could use
22298      reverse_condition_maybe_unordered here always but this
22299      makes the resulting assembler clearer.  */
22300   if (really_reversed)
22301     {
22302       /* Reversal of FP compares takes care -- an ordered compare
22303          becomes an unordered compare and vice versa.  */
22304       if (mode == CCFPmode)
22305         code = reverse_condition_maybe_unordered (code);
22306       else
22307         code = reverse_condition (code);
22308     }
22309
22310   switch (code)
22311     {
22312       /* Not all of these are actually distinct opcodes, but
22313          we distinguish them for clarity of the resulting assembler.  */
22314     case NE: case LTGT:
22315       ccode = "ne"; break;
22316     case EQ: case UNEQ:
22317       ccode = "eq"; break;
22318     case GE: case GEU:
22319       ccode = "ge"; break;
22320     case GT: case GTU: case UNGT:
22321       ccode = "gt"; break;
22322     case LE: case LEU:
22323       ccode = "le"; break;
22324     case LT: case LTU: case UNLT:
22325       ccode = "lt"; break;
22326     case UNORDERED: ccode = "un"; break;
22327     case ORDERED: ccode = "nu"; break;
22328     case UNGE: ccode = "nl"; break;
22329     case UNLE: ccode = "ng"; break;
22330     default:
22331       gcc_unreachable ();
22332     }
22333
22334   /* Maybe we have a guess as to how likely the branch is.  */
22335   pred = "";
22336   note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
22337   if (note != NULL_RTX)
22338     {
22339       /* PROB is the difference from 50%.  */
22340       int prob = profile_probability::from_reg_br_prob_note (XINT (note, 0))
22341                    .to_reg_br_prob_base () - REG_BR_PROB_BASE / 2;
22342
22343       /* Only hint for highly probable/improbable branches on newer cpus when
22344          we have real profile data, as static prediction overrides processor
22345          dynamic prediction.  For older cpus we may as well always hint, but
22346          assume not taken for branches that are very close to 50% as a
22347          mispredicted taken branch is more expensive than a
22348          mispredicted not-taken branch.  */
22349       if (rs6000_always_hint
22350           || (abs (prob) > REG_BR_PROB_BASE / 100 * 48
22351               && (profile_status_for_fn (cfun) != PROFILE_GUESSED)
22352               && br_prob_note_reliable_p (note)))
22353         {
22354           if (abs (prob) > REG_BR_PROB_BASE / 20
22355               && ((prob > 0) ^ need_longbranch))
22356             pred = "+";
22357           else
22358             pred = "-";
22359         }
22360     }
22361
22362   if (label == NULL)
22363     s += sprintf (s, "b%slr%s ", ccode, pred);
22364   else
22365     s += sprintf (s, "b%s%s ", ccode, pred);
22366
22367   /* We need to escape any '%' characters in the reg_names string.
22368      Assume they'd only be the first character....  */
22369   if (reg_names[cc_regno + CR0_REGNO][0] == '%')
22370     *s++ = '%';
22371   s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
22372
22373   if (label != NULL)
22374     {
22375       /* If the branch distance was too far, we may have to use an
22376          unconditional branch to go the distance.  */
22377       if (need_longbranch)
22378         s += sprintf (s, ",$+8\n\tb %s", label);
22379       else
22380         s += sprintf (s, ",%s", label);
22381     }
22382
22383   return string;
22384 }
22385
22386 /* Return insn for VSX or Altivec comparisons.  */
22387
22388 static rtx
22389 rs6000_emit_vector_compare_inner (enum rtx_code code, rtx op0, rtx op1)
22390 {
22391   rtx mask;
22392   machine_mode mode = GET_MODE (op0);
22393
22394   switch (code)
22395     {
22396     default:
22397       break;
22398
22399     case GE:
22400       if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
22401         return NULL_RTX;
22402       /* FALLTHRU */
22403
22404     case EQ:
22405     case GT:
22406     case GTU:
22407     case ORDERED:
22408     case UNORDERED:
22409     case UNEQ:
22410     case LTGT:
22411       mask = gen_reg_rtx (mode);
22412       emit_insn (gen_rtx_SET (mask, gen_rtx_fmt_ee (code, mode, op0, op1)));
22413       return mask;
22414     }
22415
22416   return NULL_RTX;
22417 }
22418
22419 /* Emit vector compare for operands OP0 and OP1 using code RCODE.
22420    DMODE is expected destination mode. This is a recursive function.  */
22421
22422 static rtx
22423 rs6000_emit_vector_compare (enum rtx_code rcode,
22424                             rtx op0, rtx op1,
22425                             machine_mode dmode)
22426 {
22427   rtx mask;
22428   bool swap_operands = false;
22429   bool try_again = false;
22430
22431   gcc_assert (VECTOR_UNIT_ALTIVEC_OR_VSX_P (dmode));
22432   gcc_assert (GET_MODE (op0) == GET_MODE (op1));
22433
22434   /* See if the comparison works as is.  */
22435   mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
22436   if (mask)
22437     return mask;
22438
22439   switch (rcode)
22440     {
22441     case LT:
22442       rcode = GT;
22443       swap_operands = true;
22444       try_again = true;
22445       break;
22446     case LTU:
22447       rcode = GTU;
22448       swap_operands = true;
22449       try_again = true;
22450       break;
22451     case NE:
22452     case UNLE:
22453     case UNLT:
22454     case UNGE:
22455     case UNGT:
22456       /* Invert condition and try again.
22457          e.g., A != B becomes ~(A==B).  */
22458       {
22459         enum rtx_code rev_code;
22460         enum insn_code nor_code;
22461         rtx mask2;
22462
22463         rev_code = reverse_condition_maybe_unordered (rcode);
22464         if (rev_code == UNKNOWN)
22465           return NULL_RTX;
22466
22467         nor_code = optab_handler (one_cmpl_optab, dmode);
22468         if (nor_code == CODE_FOR_nothing)
22469           return NULL_RTX;
22470
22471         mask2 = rs6000_emit_vector_compare (rev_code, op0, op1, dmode);
22472         if (!mask2)
22473           return NULL_RTX;
22474
22475         mask = gen_reg_rtx (dmode);
22476         emit_insn (GEN_FCN (nor_code) (mask, mask2));
22477         return mask;
22478       }
22479       break;
22480     case GE:
22481     case GEU:
22482     case LE:
22483     case LEU:
22484       /* Try GT/GTU/LT/LTU OR EQ */
22485       {
22486         rtx c_rtx, eq_rtx;
22487         enum insn_code ior_code;
22488         enum rtx_code new_code;
22489
22490         switch (rcode)
22491           {
22492           case  GE:
22493             new_code = GT;
22494             break;
22495
22496           case GEU:
22497             new_code = GTU;
22498             break;
22499
22500           case LE:
22501             new_code = LT;
22502             break;
22503
22504           case LEU:
22505             new_code = LTU;
22506             break;
22507
22508           default:
22509             gcc_unreachable ();
22510           }
22511
22512         ior_code = optab_handler (ior_optab, dmode);
22513         if (ior_code == CODE_FOR_nothing)
22514           return NULL_RTX;
22515
22516         c_rtx = rs6000_emit_vector_compare (new_code, op0, op1, dmode);
22517         if (!c_rtx)
22518           return NULL_RTX;
22519
22520         eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1, dmode);
22521         if (!eq_rtx)
22522           return NULL_RTX;
22523
22524         mask = gen_reg_rtx (dmode);
22525         emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
22526         return mask;
22527       }
22528       break;
22529     default:
22530       return NULL_RTX;
22531     }
22532
22533   if (try_again)
22534     {
22535       if (swap_operands)
22536         std::swap (op0, op1);
22537
22538       mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
22539       if (mask)
22540         return mask;
22541     }
22542
22543   /* You only get two chances.  */
22544   return NULL_RTX;
22545 }
22546
22547 /* Emit vector conditional expression.  DEST is destination. OP_TRUE and
22548    OP_FALSE are two VEC_COND_EXPR operands.  CC_OP0 and CC_OP1 are the two
22549    operands for the relation operation COND.  */
22550
22551 int
22552 rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false,
22553                               rtx cond, rtx cc_op0, rtx cc_op1)
22554 {
22555   machine_mode dest_mode = GET_MODE (dest);
22556   machine_mode mask_mode = GET_MODE (cc_op0);
22557   enum rtx_code rcode = GET_CODE (cond);
22558   machine_mode cc_mode = CCmode;
22559   rtx mask;
22560   rtx cond2;
22561   bool invert_move = false;
22562
22563   if (VECTOR_UNIT_NONE_P (dest_mode))
22564     return 0;
22565
22566   gcc_assert (GET_MODE_SIZE (dest_mode) == GET_MODE_SIZE (mask_mode)
22567               && GET_MODE_NUNITS (dest_mode) == GET_MODE_NUNITS (mask_mode));
22568
22569   switch (rcode)
22570     {
22571       /* Swap operands if we can, and fall back to doing the operation as
22572          specified, and doing a NOR to invert the test.  */
22573     case NE:
22574     case UNLE:
22575     case UNLT:
22576     case UNGE:
22577     case UNGT:
22578       /* Invert condition and try again.
22579          e.g., A  = (B != C) ? D : E becomes A = (B == C) ? E : D.  */
22580       invert_move = true;
22581       rcode = reverse_condition_maybe_unordered (rcode);
22582       if (rcode == UNKNOWN)
22583         return 0;
22584       break;
22585
22586     case GE:
22587     case LE:
22588       if (GET_MODE_CLASS (mask_mode) == MODE_VECTOR_INT)
22589         {
22590           /* Invert condition to avoid compound test.  */
22591           invert_move = true;
22592           rcode = reverse_condition (rcode);
22593         }
22594       break;
22595
22596     case GTU:
22597     case GEU:
22598     case LTU:
22599     case LEU:
22600       /* Mark unsigned tests with CCUNSmode.  */
22601       cc_mode = CCUNSmode;
22602
22603       /* Invert condition to avoid compound test if necessary.  */
22604       if (rcode == GEU || rcode == LEU)
22605         {
22606           invert_move = true;
22607           rcode = reverse_condition (rcode);
22608         }
22609       break;
22610
22611     default:
22612       break;
22613     }
22614
22615   /* Get the vector mask for the given relational operations.  */
22616   mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, mask_mode);
22617
22618   if (!mask)
22619     return 0;
22620
22621   if (invert_move)
22622     std::swap (op_true, op_false);
22623
22624   /* Optimize vec1 == vec2, to know the mask generates -1/0.  */
22625   if (GET_MODE_CLASS (dest_mode) == MODE_VECTOR_INT
22626       && (GET_CODE (op_true) == CONST_VECTOR
22627           || GET_CODE (op_false) == CONST_VECTOR))
22628     {
22629       rtx constant_0 = CONST0_RTX (dest_mode);
22630       rtx constant_m1 = CONSTM1_RTX (dest_mode);
22631
22632       if (op_true == constant_m1 && op_false == constant_0)
22633         {
22634           emit_move_insn (dest, mask);
22635           return 1;
22636         }
22637
22638       else if (op_true == constant_0 && op_false == constant_m1)
22639         {
22640           emit_insn (gen_rtx_SET (dest, gen_rtx_NOT (dest_mode, mask)));
22641           return 1;
22642         }
22643
22644       /* If we can't use the vector comparison directly, perhaps we can use
22645          the mask for the true or false fields, instead of loading up a
22646          constant.  */
22647       if (op_true == constant_m1)
22648         op_true = mask;
22649
22650       if (op_false == constant_0)
22651         op_false = mask;
22652     }
22653
22654   if (!REG_P (op_true) && !SUBREG_P (op_true))
22655     op_true = force_reg (dest_mode, op_true);
22656
22657   if (!REG_P (op_false) && !SUBREG_P (op_false))
22658     op_false = force_reg (dest_mode, op_false);
22659
22660   cond2 = gen_rtx_fmt_ee (NE, cc_mode, gen_lowpart (dest_mode, mask),
22661                           CONST0_RTX (dest_mode));
22662   emit_insn (gen_rtx_SET (dest,
22663                           gen_rtx_IF_THEN_ELSE (dest_mode,
22664                                                 cond2,
22665                                                 op_true,
22666                                                 op_false)));
22667   return 1;
22668 }
22669
22670 /* ISA 3.0 (power9) minmax subcase to emit a XSMAXCDP or XSMINCDP instruction
22671    for SF/DF scalars.  Move TRUE_COND to DEST if OP of the operands of the last
22672    comparison is nonzero/true, FALSE_COND if it is zero/false.  Return 0 if the
22673    hardware has no such operation.  */
22674
22675 static int
22676 rs6000_emit_p9_fp_minmax (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   bool max_p = false;
22684
22685   if (result_mode != compare_mode)
22686     return 0;
22687
22688   if (code == GE || code == GT)
22689     max_p = true;
22690   else if (code == LE || code == LT)
22691     max_p = false;
22692   else
22693     return 0;
22694
22695   if (rtx_equal_p (op0, true_cond) && rtx_equal_p (op1, false_cond))
22696     ;
22697
22698   else if (rtx_equal_p (op1, true_cond) && rtx_equal_p (op0, false_cond))
22699     max_p = !max_p;
22700
22701   else
22702     return 0;
22703
22704   rs6000_emit_minmax (dest, max_p ? SMAX : SMIN, op0, op1);
22705   return 1;
22706 }
22707
22708 /* ISA 3.0 (power9) conditional move subcase to emit XSCMP{EQ,GE,GT,NE}DP and
22709    XXSEL instructions for SF/DF scalars.  Move TRUE_COND to DEST if OP of the
22710    operands of the last comparison is nonzero/true, FALSE_COND if it is
22711    zero/false.  Return 0 if the hardware has no such operation.  */
22712
22713 static int
22714 rs6000_emit_p9_fp_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
22715 {
22716   enum rtx_code code = GET_CODE (op);
22717   rtx op0 = XEXP (op, 0);
22718   rtx op1 = XEXP (op, 1);
22719   machine_mode result_mode = GET_MODE (dest);
22720   rtx compare_rtx;
22721   rtx cmove_rtx;
22722   rtx clobber_rtx;
22723
22724   if (!can_create_pseudo_p ())
22725     return 0;
22726
22727   switch (code)
22728     {
22729     case EQ:
22730     case GE:
22731     case GT:
22732       break;
22733
22734     case NE:
22735     case LT:
22736     case LE:
22737       code = swap_condition (code);
22738       std::swap (op0, op1);
22739       break;
22740
22741     default:
22742       return 0;
22743     }
22744
22745   /* Generate:  [(parallel [(set (dest)
22746                                  (if_then_else (op (cmp1) (cmp2))
22747                                                (true)
22748                                                (false)))
22749                             (clobber (scratch))])].  */
22750
22751   compare_rtx = gen_rtx_fmt_ee (code, CCFPmode, op0, op1);
22752   cmove_rtx = gen_rtx_SET (dest,
22753                            gen_rtx_IF_THEN_ELSE (result_mode,
22754                                                  compare_rtx,
22755                                                  true_cond,
22756                                                  false_cond));
22757
22758   clobber_rtx = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (V2DImode));
22759   emit_insn (gen_rtx_PARALLEL (VOIDmode,
22760                                gen_rtvec (2, cmove_rtx, clobber_rtx)));
22761
22762   return 1;
22763 }
22764
22765 /* Emit a conditional move: move TRUE_COND to DEST if OP of the
22766    operands of the last comparison is nonzero/true, FALSE_COND if it
22767    is zero/false.  Return 0 if the hardware has no such operation.  */
22768
22769 int
22770 rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
22771 {
22772   enum rtx_code code = GET_CODE (op);
22773   rtx op0 = XEXP (op, 0);
22774   rtx op1 = XEXP (op, 1);
22775   machine_mode compare_mode = GET_MODE (op0);
22776   machine_mode result_mode = GET_MODE (dest);
22777   rtx temp;
22778   bool is_against_zero;
22779
22780   /* These modes should always match.  */
22781   if (GET_MODE (op1) != compare_mode
22782       /* In the isel case however, we can use a compare immediate, so
22783          op1 may be a small constant.  */
22784       && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
22785     return 0;
22786   if (GET_MODE (true_cond) != result_mode)
22787     return 0;
22788   if (GET_MODE (false_cond) != result_mode)
22789     return 0;
22790
22791   /* See if we can use the ISA 3.0 (power9) min/max/compare functions.  */
22792   if (TARGET_P9_MINMAX
22793       && (compare_mode == SFmode || compare_mode == DFmode)
22794       && (result_mode == SFmode || result_mode == DFmode))
22795     {
22796       if (rs6000_emit_p9_fp_minmax (dest, op, true_cond, false_cond))
22797         return 1;
22798
22799       if (rs6000_emit_p9_fp_cmove (dest, op, true_cond, false_cond))
22800         return 1;
22801     }
22802
22803   /* Don't allow using floating point comparisons for integer results for
22804      now.  */
22805   if (FLOAT_MODE_P (compare_mode) && !FLOAT_MODE_P (result_mode))
22806     return 0;
22807
22808   /* First, work out if the hardware can do this at all, or
22809      if it's too slow....  */
22810   if (!FLOAT_MODE_P (compare_mode))
22811     {
22812       if (TARGET_ISEL)
22813         return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
22814       return 0;
22815     }
22816
22817   is_against_zero = op1 == CONST0_RTX (compare_mode);
22818
22819   /* A floating-point subtract might overflow, underflow, or produce
22820      an inexact result, thus changing the floating-point flags, so it
22821      can't be generated if we care about that.  It's safe if one side
22822      of the construct is zero, since then no subtract will be
22823      generated.  */
22824   if (SCALAR_FLOAT_MODE_P (compare_mode)
22825       && flag_trapping_math && ! is_against_zero)
22826     return 0;
22827
22828   /* Eliminate half of the comparisons by switching operands, this
22829      makes the remaining code simpler.  */
22830   if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
22831       || code == LTGT || code == LT || code == UNLE)
22832     {
22833       code = reverse_condition_maybe_unordered (code);
22834       temp = true_cond;
22835       true_cond = false_cond;
22836       false_cond = temp;
22837     }
22838
22839   /* UNEQ and LTGT take four instructions for a comparison with zero,
22840      it'll probably be faster to use a branch here too.  */
22841   if (code == UNEQ && HONOR_NANS (compare_mode))
22842     return 0;
22843
22844   /* We're going to try to implement comparisons by performing
22845      a subtract, then comparing against zero.  Unfortunately,
22846      Inf - Inf is NaN which is not zero, and so if we don't
22847      know that the operand is finite and the comparison
22848      would treat EQ different to UNORDERED, we can't do it.  */
22849   if (HONOR_INFINITIES (compare_mode)
22850       && code != GT && code != UNGE
22851       && (!CONST_DOUBLE_P (op1)
22852           || real_isinf (CONST_DOUBLE_REAL_VALUE (op1)))
22853       /* Constructs of the form (a OP b ? a : b) are safe.  */
22854       && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
22855           || (! rtx_equal_p (op0, true_cond)
22856               && ! rtx_equal_p (op1, true_cond))))
22857     return 0;
22858
22859   /* At this point we know we can use fsel.  */
22860
22861   /* Reduce the comparison to a comparison against zero.  */
22862   if (! is_against_zero)
22863     {
22864       temp = gen_reg_rtx (compare_mode);
22865       emit_insn (gen_rtx_SET (temp, gen_rtx_MINUS (compare_mode, op0, op1)));
22866       op0 = temp;
22867       op1 = CONST0_RTX (compare_mode);
22868     }
22869
22870   /* If we don't care about NaNs we can reduce some of the comparisons
22871      down to faster ones.  */
22872   if (! HONOR_NANS (compare_mode))
22873     switch (code)
22874       {
22875       case GT:
22876         code = LE;
22877         temp = true_cond;
22878         true_cond = false_cond;
22879         false_cond = temp;
22880         break;
22881       case UNGE:
22882         code = GE;
22883         break;
22884       case UNEQ:
22885         code = EQ;
22886         break;
22887       default:
22888         break;
22889       }
22890
22891   /* Now, reduce everything down to a GE.  */
22892   switch (code)
22893     {
22894     case GE:
22895       break;
22896
22897     case LE:
22898       temp = gen_reg_rtx (compare_mode);
22899       emit_insn (gen_rtx_SET (temp, gen_rtx_NEG (compare_mode, op0)));
22900       op0 = temp;
22901       break;
22902
22903     case ORDERED:
22904       temp = gen_reg_rtx (compare_mode);
22905       emit_insn (gen_rtx_SET (temp, gen_rtx_ABS (compare_mode, op0)));
22906       op0 = temp;
22907       break;
22908
22909     case EQ:
22910       temp = gen_reg_rtx (compare_mode);
22911       emit_insn (gen_rtx_SET (temp,
22912                               gen_rtx_NEG (compare_mode,
22913                                            gen_rtx_ABS (compare_mode, op0))));
22914       op0 = temp;
22915       break;
22916
22917     case UNGE:
22918       /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
22919       temp = gen_reg_rtx (result_mode);
22920       emit_insn (gen_rtx_SET (temp,
22921                               gen_rtx_IF_THEN_ELSE (result_mode,
22922                                                     gen_rtx_GE (VOIDmode,
22923                                                                 op0, op1),
22924                                                     true_cond, false_cond)));
22925       false_cond = true_cond;
22926       true_cond = temp;
22927
22928       temp = gen_reg_rtx (compare_mode);
22929       emit_insn (gen_rtx_SET (temp, gen_rtx_NEG (compare_mode, op0)));
22930       op0 = temp;
22931       break;
22932
22933     case GT:
22934       /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
22935       temp = gen_reg_rtx (result_mode);
22936       emit_insn (gen_rtx_SET (temp,
22937                               gen_rtx_IF_THEN_ELSE (result_mode,
22938                                                     gen_rtx_GE (VOIDmode,
22939                                                                 op0, op1),
22940                                                     true_cond, false_cond)));
22941       true_cond = false_cond;
22942       false_cond = temp;
22943
22944       temp = gen_reg_rtx (compare_mode);
22945       emit_insn (gen_rtx_SET (temp, gen_rtx_NEG (compare_mode, op0)));
22946       op0 = temp;
22947       break;
22948
22949     default:
22950       gcc_unreachable ();
22951     }
22952
22953   emit_insn (gen_rtx_SET (dest,
22954                           gen_rtx_IF_THEN_ELSE (result_mode,
22955                                                 gen_rtx_GE (VOIDmode,
22956                                                             op0, op1),
22957                                                 true_cond, false_cond)));
22958   return 1;
22959 }
22960
22961 /* Same as above, but for ints (isel).  */
22962
22963 int
22964 rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
22965 {
22966   rtx condition_rtx, cr;
22967   machine_mode mode = GET_MODE (dest);
22968   enum rtx_code cond_code;
22969   rtx (*isel_func) (rtx, rtx, rtx, rtx, rtx);
22970   bool signedp;
22971
22972   if (mode != SImode && (!TARGET_POWERPC64 || mode != DImode))
22973     return 0;
22974
22975   /* We still have to do the compare, because isel doesn't do a
22976      compare, it just looks at the CRx bits set by a previous compare
22977      instruction.  */
22978   condition_rtx = rs6000_generate_compare (op, mode);
22979   cond_code = GET_CODE (condition_rtx);
22980   cr = XEXP (condition_rtx, 0);
22981   signedp = GET_MODE (cr) == CCmode;
22982
22983   isel_func = (mode == SImode
22984                ? (signedp ? gen_isel_signed_si : gen_isel_unsigned_si)
22985                : (signedp ? gen_isel_signed_di : gen_isel_unsigned_di));
22986
22987   switch (cond_code)
22988     {
22989     case LT: case GT: case LTU: case GTU: case EQ:
22990       /* isel handles these directly.  */
22991       break;
22992
22993     default:
22994       /* We need to swap the sense of the comparison.  */
22995       {
22996         std::swap (false_cond, true_cond);
22997         PUT_CODE (condition_rtx, reverse_condition (cond_code));
22998       }
22999       break;
23000     }
23001
23002   false_cond = force_reg (mode, false_cond);
23003   if (true_cond != const0_rtx)
23004     true_cond = force_reg (mode, true_cond);
23005
23006   emit_insn (isel_func (dest, condition_rtx, true_cond, false_cond, cr));
23007
23008   return 1;
23009 }
23010
23011 void
23012 rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
23013 {
23014   machine_mode mode = GET_MODE (op0);
23015   enum rtx_code c;
23016   rtx target;
23017
23018   /* VSX/altivec have direct min/max insns.  */
23019   if ((code == SMAX || code == SMIN)
23020       && (VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode)
23021           || (mode == SFmode && VECTOR_UNIT_VSX_P (DFmode))))
23022     {
23023       emit_insn (gen_rtx_SET (dest, gen_rtx_fmt_ee (code, mode, op0, op1)));
23024       return;
23025     }
23026
23027   if (code == SMAX || code == SMIN)
23028     c = GE;
23029   else
23030     c = GEU;
23031
23032   if (code == SMAX || code == UMAX)
23033     target = emit_conditional_move (dest, c, op0, op1, mode,
23034                                     op0, op1, mode, 0);
23035   else
23036     target = emit_conditional_move (dest, c, op0, op1, mode,
23037                                     op1, op0, mode, 0);
23038   gcc_assert (target);
23039   if (target != dest)
23040     emit_move_insn (dest, target);
23041 }
23042
23043 /* A subroutine of the atomic operation splitters.  Jump to LABEL if
23044    COND is true.  Mark the jump as unlikely to be taken.  */
23045
23046 static void
23047 emit_unlikely_jump (rtx cond, rtx label)
23048 {
23049   rtx x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
23050   rtx_insn *insn = emit_jump_insn (gen_rtx_SET (pc_rtx, x));
23051   add_reg_br_prob_note (insn, profile_probability::very_unlikely ());
23052 }
23053
23054 /* A subroutine of the atomic operation splitters.  Emit a load-locked
23055    instruction in MODE.  For QI/HImode, possibly use a pattern than includes
23056    the zero_extend operation.  */
23057
23058 static void
23059 emit_load_locked (machine_mode mode, rtx reg, rtx mem)
23060 {
23061   rtx (*fn) (rtx, rtx) = NULL;
23062
23063   switch (mode)
23064     {
23065     case E_QImode:
23066       fn = gen_load_lockedqi;
23067       break;
23068     case E_HImode:
23069       fn = gen_load_lockedhi;
23070       break;
23071     case E_SImode:
23072       if (GET_MODE (mem) == QImode)
23073         fn = gen_load_lockedqi_si;
23074       else if (GET_MODE (mem) == HImode)
23075         fn = gen_load_lockedhi_si;
23076       else
23077         fn = gen_load_lockedsi;
23078       break;
23079     case E_DImode:
23080       fn = gen_load_lockeddi;
23081       break;
23082     case E_TImode:
23083       fn = gen_load_lockedti;
23084       break;
23085     default:
23086       gcc_unreachable ();
23087     }
23088   emit_insn (fn (reg, mem));
23089 }
23090
23091 /* A subroutine of the atomic operation splitters.  Emit a store-conditional
23092    instruction in MODE.  */
23093
23094 static void
23095 emit_store_conditional (machine_mode mode, rtx res, rtx mem, rtx val)
23096 {
23097   rtx (*fn) (rtx, rtx, rtx) = NULL;
23098
23099   switch (mode)
23100     {
23101     case E_QImode:
23102       fn = gen_store_conditionalqi;
23103       break;
23104     case E_HImode:
23105       fn = gen_store_conditionalhi;
23106       break;
23107     case E_SImode:
23108       fn = gen_store_conditionalsi;
23109       break;
23110     case E_DImode:
23111       fn = gen_store_conditionaldi;
23112       break;
23113     case E_TImode:
23114       fn = gen_store_conditionalti;
23115       break;
23116     default:
23117       gcc_unreachable ();
23118     }
23119
23120   /* Emit sync before stwcx. to address PPC405 Erratum.  */
23121   if (PPC405_ERRATUM77)
23122     emit_insn (gen_hwsync ());
23123
23124   emit_insn (fn (res, mem, val));
23125 }
23126
23127 /* Expand barriers before and after a load_locked/store_cond sequence.  */
23128
23129 static rtx
23130 rs6000_pre_atomic_barrier (rtx mem, enum memmodel model)
23131 {
23132   rtx addr = XEXP (mem, 0);
23133
23134   if (!legitimate_indirect_address_p (addr, reload_completed)
23135       && !legitimate_indexed_address_p (addr, reload_completed))
23136     {
23137       addr = force_reg (Pmode, addr);
23138       mem = replace_equiv_address_nv (mem, addr);
23139     }
23140
23141   switch (model)
23142     {
23143     case MEMMODEL_RELAXED:
23144     case MEMMODEL_CONSUME:
23145     case MEMMODEL_ACQUIRE:
23146       break;
23147     case MEMMODEL_RELEASE:
23148     case MEMMODEL_ACQ_REL:
23149       emit_insn (gen_lwsync ());
23150       break;
23151     case MEMMODEL_SEQ_CST:
23152       emit_insn (gen_hwsync ());
23153       break;
23154     default:
23155       gcc_unreachable ();
23156     }
23157   return mem;
23158 }
23159
23160 static void
23161 rs6000_post_atomic_barrier (enum memmodel model)
23162 {
23163   switch (model)
23164     {
23165     case MEMMODEL_RELAXED:
23166     case MEMMODEL_CONSUME:
23167     case MEMMODEL_RELEASE:
23168       break;
23169     case MEMMODEL_ACQUIRE:
23170     case MEMMODEL_ACQ_REL:
23171     case MEMMODEL_SEQ_CST:
23172       emit_insn (gen_isync ());
23173       break;
23174     default:
23175       gcc_unreachable ();
23176     }
23177 }
23178
23179 /* A subroutine of the various atomic expanders.  For sub-word operations,
23180    we must adjust things to operate on SImode.  Given the original MEM,
23181    return a new aligned memory.  Also build and return the quantities by
23182    which to shift and mask.  */
23183
23184 static rtx
23185 rs6000_adjust_atomic_subword (rtx orig_mem, rtx *pshift, rtx *pmask)
23186 {
23187   rtx addr, align, shift, mask, mem;
23188   HOST_WIDE_INT shift_mask;
23189   machine_mode mode = GET_MODE (orig_mem);
23190
23191   /* For smaller modes, we have to implement this via SImode.  */
23192   shift_mask = (mode == QImode ? 0x18 : 0x10);
23193
23194   addr = XEXP (orig_mem, 0);
23195   addr = force_reg (GET_MODE (addr), addr);
23196
23197   /* Aligned memory containing subword.  Generate a new memory.  We
23198      do not want any of the existing MEM_ATTR data, as we're now
23199      accessing memory outside the original object.  */
23200   align = expand_simple_binop (Pmode, AND, addr, GEN_INT (-4),
23201                                NULL_RTX, 1, OPTAB_LIB_WIDEN);
23202   mem = gen_rtx_MEM (SImode, align);
23203   MEM_VOLATILE_P (mem) = MEM_VOLATILE_P (orig_mem);
23204   if (MEM_ALIAS_SET (orig_mem) == ALIAS_SET_MEMORY_BARRIER)
23205     set_mem_alias_set (mem, ALIAS_SET_MEMORY_BARRIER);
23206
23207   /* Shift amount for subword relative to aligned word.  */
23208   shift = gen_reg_rtx (SImode);
23209   addr = gen_lowpart (SImode, addr);
23210   rtx tmp = gen_reg_rtx (SImode);
23211   emit_insn (gen_ashlsi3 (tmp, addr, GEN_INT (3)));
23212   emit_insn (gen_andsi3 (shift, tmp, GEN_INT (shift_mask)));
23213   if (BYTES_BIG_ENDIAN)
23214     shift = expand_simple_binop (SImode, XOR, shift, GEN_INT (shift_mask),
23215                                  shift, 1, OPTAB_LIB_WIDEN);
23216   *pshift = shift;
23217
23218   /* Mask for insertion.  */
23219   mask = expand_simple_binop (SImode, ASHIFT, GEN_INT (GET_MODE_MASK (mode)),
23220                               shift, NULL_RTX, 1, OPTAB_LIB_WIDEN);
23221   *pmask = mask;
23222
23223   return mem;
23224 }
23225
23226 /* A subroutine of the various atomic expanders.  For sub-word operands,
23227    combine OLDVAL and NEWVAL via MASK.  Returns a new pseduo.  */
23228
23229 static rtx
23230 rs6000_mask_atomic_subword (rtx oldval, rtx newval, rtx mask)
23231 {
23232   rtx x;
23233
23234   x = gen_reg_rtx (SImode);
23235   emit_insn (gen_rtx_SET (x, gen_rtx_AND (SImode,
23236                                           gen_rtx_NOT (SImode, mask),
23237                                           oldval)));
23238
23239   x = expand_simple_binop (SImode, IOR, newval, x, x, 1, OPTAB_LIB_WIDEN);
23240
23241   return x;
23242 }
23243
23244 /* A subroutine of the various atomic expanders.  For sub-word operands,
23245    extract WIDE to NARROW via SHIFT.  */
23246
23247 static void
23248 rs6000_finish_atomic_subword (rtx narrow, rtx wide, rtx shift)
23249 {
23250   wide = expand_simple_binop (SImode, LSHIFTRT, wide, shift,
23251                               wide, 1, OPTAB_LIB_WIDEN);
23252   emit_move_insn (narrow, gen_lowpart (GET_MODE (narrow), wide));
23253 }
23254
23255 /* Expand an atomic compare and swap operation.  */
23256
23257 void
23258 rs6000_expand_atomic_compare_and_swap (rtx operands[])
23259 {
23260   rtx boolval, retval, mem, oldval, newval, cond;
23261   rtx label1, label2, x, mask, shift;
23262   machine_mode mode, orig_mode;
23263   enum memmodel mod_s, mod_f;
23264   bool is_weak;
23265
23266   boolval = operands[0];
23267   retval = operands[1];
23268   mem = operands[2];
23269   oldval = operands[3];
23270   newval = operands[4];
23271   is_weak = (INTVAL (operands[5]) != 0);
23272   mod_s = memmodel_base (INTVAL (operands[6]));
23273   mod_f = memmodel_base (INTVAL (operands[7]));
23274   orig_mode = mode = GET_MODE (mem);
23275
23276   mask = shift = NULL_RTX;
23277   if (mode == QImode || mode == HImode)
23278     {
23279       /* Before power8, we didn't have access to lbarx/lharx, so generate a
23280          lwarx and shift/mask operations.  With power8, we need to do the
23281          comparison in SImode, but the store is still done in QI/HImode.  */
23282       oldval = convert_modes (SImode, mode, oldval, 1);
23283
23284       if (!TARGET_SYNC_HI_QI)
23285         {
23286           mem = rs6000_adjust_atomic_subword (mem, &shift, &mask);
23287
23288           /* Shift and mask OLDVAL into position with the word.  */
23289           oldval = expand_simple_binop (SImode, ASHIFT, oldval, shift,
23290                                         NULL_RTX, 1, OPTAB_LIB_WIDEN);
23291
23292           /* Shift and mask NEWVAL into position within the word.  */
23293           newval = convert_modes (SImode, mode, newval, 1);
23294           newval = expand_simple_binop (SImode, ASHIFT, newval, shift,
23295                                         NULL_RTX, 1, OPTAB_LIB_WIDEN);
23296         }
23297
23298       /* Prepare to adjust the return value.  */
23299       retval = gen_reg_rtx (SImode);
23300       mode = SImode;
23301     }
23302   else if (reg_overlap_mentioned_p (retval, oldval))
23303     oldval = copy_to_reg (oldval);
23304
23305   if (mode != TImode && !reg_or_short_operand (oldval, mode))
23306     oldval = copy_to_mode_reg (mode, oldval);
23307
23308   if (reg_overlap_mentioned_p (retval, newval))
23309     newval = copy_to_reg (newval);
23310
23311   mem = rs6000_pre_atomic_barrier (mem, mod_s);
23312
23313   label1 = NULL_RTX;
23314   if (!is_weak)
23315     {
23316       label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
23317       emit_label (XEXP (label1, 0));
23318     }
23319   label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
23320
23321   emit_load_locked (mode, retval, mem);
23322
23323   x = retval;
23324   if (mask)
23325     x = expand_simple_binop (SImode, AND, retval, mask,
23326                              NULL_RTX, 1, OPTAB_LIB_WIDEN);
23327
23328   cond = gen_reg_rtx (CCmode);
23329   /* If we have TImode, synthesize a comparison.  */
23330   if (mode != TImode)
23331     x = gen_rtx_COMPARE (CCmode, x, oldval);
23332   else
23333     {
23334       rtx xor1_result = gen_reg_rtx (DImode);
23335       rtx xor2_result = gen_reg_rtx (DImode);
23336       rtx or_result = gen_reg_rtx (DImode);
23337       rtx new_word0 = simplify_gen_subreg (DImode, x, TImode, 0);
23338       rtx new_word1 = simplify_gen_subreg (DImode, x, TImode, 8);
23339       rtx old_word0 = simplify_gen_subreg (DImode, oldval, TImode, 0);
23340       rtx old_word1 = simplify_gen_subreg (DImode, oldval, TImode, 8);
23341
23342       emit_insn (gen_xordi3 (xor1_result, new_word0, old_word0));
23343       emit_insn (gen_xordi3 (xor2_result, new_word1, old_word1));
23344       emit_insn (gen_iordi3 (or_result, xor1_result, xor2_result));
23345       x = gen_rtx_COMPARE (CCmode, or_result, const0_rtx);
23346     }
23347
23348   emit_insn (gen_rtx_SET (cond, x));
23349
23350   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
23351   emit_unlikely_jump (x, label2);
23352
23353   x = newval;
23354   if (mask)
23355     x = rs6000_mask_atomic_subword (retval, newval, mask);
23356
23357   emit_store_conditional (orig_mode, cond, mem, x);
23358
23359   if (!is_weak)
23360     {
23361       x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
23362       emit_unlikely_jump (x, label1);
23363     }
23364
23365   if (!is_mm_relaxed (mod_f))
23366     emit_label (XEXP (label2, 0));
23367
23368   rs6000_post_atomic_barrier (mod_s);
23369
23370   if (is_mm_relaxed (mod_f))
23371     emit_label (XEXP (label2, 0));
23372
23373   if (shift)
23374     rs6000_finish_atomic_subword (operands[1], retval, shift);
23375   else if (mode != GET_MODE (operands[1]))
23376     convert_move (operands[1], retval, 1);
23377
23378   /* In all cases, CR0 contains EQ on success, and NE on failure.  */
23379   x = gen_rtx_EQ (SImode, cond, const0_rtx);
23380   emit_insn (gen_rtx_SET (boolval, x));
23381 }
23382
23383 /* Expand an atomic exchange operation.  */
23384
23385 void
23386 rs6000_expand_atomic_exchange (rtx operands[])
23387 {
23388   rtx retval, mem, val, cond;
23389   machine_mode mode;
23390   enum memmodel model;
23391   rtx label, x, mask, shift;
23392
23393   retval = operands[0];
23394   mem = operands[1];
23395   val = operands[2];
23396   model = memmodel_base (INTVAL (operands[3]));
23397   mode = GET_MODE (mem);
23398
23399   mask = shift = NULL_RTX;
23400   if (!TARGET_SYNC_HI_QI && (mode == QImode || mode == HImode))
23401     {
23402       mem = rs6000_adjust_atomic_subword (mem, &shift, &mask);
23403
23404       /* Shift and mask VAL into position with the word.  */
23405       val = convert_modes (SImode, mode, val, 1);
23406       val = expand_simple_binop (SImode, ASHIFT, val, shift,
23407                                  NULL_RTX, 1, OPTAB_LIB_WIDEN);
23408
23409       /* Prepare to adjust the return value.  */
23410       retval = gen_reg_rtx (SImode);
23411       mode = SImode;
23412     }
23413
23414   mem = rs6000_pre_atomic_barrier (mem, model);
23415
23416   label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
23417   emit_label (XEXP (label, 0));
23418
23419   emit_load_locked (mode, retval, mem);
23420
23421   x = val;
23422   if (mask)
23423     x = rs6000_mask_atomic_subword (retval, val, mask);
23424
23425   cond = gen_reg_rtx (CCmode);
23426   emit_store_conditional (mode, cond, mem, x);
23427
23428   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
23429   emit_unlikely_jump (x, label);
23430
23431   rs6000_post_atomic_barrier (model);
23432
23433   if (shift)
23434     rs6000_finish_atomic_subword (operands[0], retval, shift);
23435 }
23436
23437 /* Expand an atomic fetch-and-operate pattern.  CODE is the binary operation
23438    to perform.  MEM is the memory on which to operate.  VAL is the second
23439    operand of the binary operator.  BEFORE and AFTER are optional locations to
23440    return the value of MEM either before of after the operation.  MODEL_RTX
23441    is a CONST_INT containing the memory model to use.  */
23442
23443 void
23444 rs6000_expand_atomic_op (enum rtx_code code, rtx mem, rtx val,
23445                          rtx orig_before, rtx orig_after, rtx model_rtx)
23446 {
23447   enum memmodel model = memmodel_base (INTVAL (model_rtx));
23448   machine_mode mode = GET_MODE (mem);
23449   machine_mode store_mode = mode;
23450   rtx label, x, cond, mask, shift;
23451   rtx before = orig_before, after = orig_after;
23452
23453   mask = shift = NULL_RTX;
23454   /* On power8, we want to use SImode for the operation.  On previous systems,
23455      use the operation in a subword and shift/mask to get the proper byte or
23456      halfword.  */
23457   if (mode == QImode || mode == HImode)
23458     {
23459       if (TARGET_SYNC_HI_QI)
23460         {
23461           val = convert_modes (SImode, mode, val, 1);
23462
23463           /* Prepare to adjust the return value.  */
23464           before = gen_reg_rtx (SImode);
23465           if (after)
23466             after = gen_reg_rtx (SImode);
23467           mode = SImode;
23468         }
23469       else
23470         {
23471           mem = rs6000_adjust_atomic_subword (mem, &shift, &mask);
23472
23473           /* Shift and mask VAL into position with the word.  */
23474           val = convert_modes (SImode, mode, val, 1);
23475           val = expand_simple_binop (SImode, ASHIFT, val, shift,
23476                                      NULL_RTX, 1, OPTAB_LIB_WIDEN);
23477
23478           switch (code)
23479             {
23480             case IOR:
23481             case XOR:
23482               /* We've already zero-extended VAL.  That is sufficient to
23483                  make certain that it does not affect other bits.  */
23484               mask = NULL;
23485               break;
23486
23487             case AND:
23488               /* If we make certain that all of the other bits in VAL are
23489                  set, that will be sufficient to not affect other bits.  */
23490               x = gen_rtx_NOT (SImode, mask);
23491               x = gen_rtx_IOR (SImode, x, val);
23492               emit_insn (gen_rtx_SET (val, x));
23493               mask = NULL;
23494               break;
23495
23496             case NOT:
23497             case PLUS:
23498             case MINUS:
23499               /* These will all affect bits outside the field and need
23500                  adjustment via MASK within the loop.  */
23501               break;
23502
23503             default:
23504               gcc_unreachable ();
23505             }
23506
23507           /* Prepare to adjust the return value.  */
23508           before = gen_reg_rtx (SImode);
23509           if (after)
23510             after = gen_reg_rtx (SImode);
23511           store_mode = mode = SImode;
23512         }
23513     }
23514
23515   mem = rs6000_pre_atomic_barrier (mem, model);
23516
23517   label = gen_label_rtx ();
23518   emit_label (label);
23519   label = gen_rtx_LABEL_REF (VOIDmode, label);
23520
23521   if (before == NULL_RTX)
23522     before = gen_reg_rtx (mode);
23523
23524   emit_load_locked (mode, before, mem);
23525
23526   if (code == NOT)
23527     {
23528       x = expand_simple_binop (mode, AND, before, val,
23529                                NULL_RTX, 1, OPTAB_LIB_WIDEN);
23530       after = expand_simple_unop (mode, NOT, x, after, 1);
23531     }
23532   else
23533     {
23534       after = expand_simple_binop (mode, code, before, val,
23535                                    after, 1, OPTAB_LIB_WIDEN);
23536     }
23537
23538   x = after;
23539   if (mask)
23540     {
23541       x = expand_simple_binop (SImode, AND, after, mask,
23542                                NULL_RTX, 1, OPTAB_LIB_WIDEN);
23543       x = rs6000_mask_atomic_subword (before, x, mask);
23544     }
23545   else if (store_mode != mode)
23546     x = convert_modes (store_mode, mode, x, 1);
23547
23548   cond = gen_reg_rtx (CCmode);
23549   emit_store_conditional (store_mode, cond, mem, x);
23550
23551   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
23552   emit_unlikely_jump (x, label);
23553
23554   rs6000_post_atomic_barrier (model);
23555
23556   if (shift)
23557     {
23558       /* QImode/HImode on machines without lbarx/lharx where we do a lwarx and
23559          then do the calcuations in a SImode register.  */
23560       if (orig_before)
23561         rs6000_finish_atomic_subword (orig_before, before, shift);
23562       if (orig_after)
23563         rs6000_finish_atomic_subword (orig_after, after, shift);
23564     }
23565   else if (store_mode != mode)
23566     {
23567       /* QImode/HImode on machines with lbarx/lharx where we do the native
23568          operation and then do the calcuations in a SImode register.  */
23569       if (orig_before)
23570         convert_move (orig_before, before, 1);
23571       if (orig_after)
23572         convert_move (orig_after, after, 1);
23573     }
23574   else if (orig_after && after != orig_after)
23575     emit_move_insn (orig_after, after);
23576 }
23577
23578 /* Emit instructions to move SRC to DST.  Called by splitters for
23579    multi-register moves.  It will emit at most one instruction for
23580    each register that is accessed; that is, it won't emit li/lis pairs
23581    (or equivalent for 64-bit code).  One of SRC or DST must be a hard
23582    register.  */
23583
23584 void
23585 rs6000_split_multireg_move (rtx dst, rtx src)
23586 {
23587   /* The register number of the first register being moved.  */
23588   int reg;
23589   /* The mode that is to be moved.  */
23590   machine_mode mode;
23591   /* The mode that the move is being done in, and its size.  */
23592   machine_mode reg_mode;
23593   int reg_mode_size;
23594   /* The number of registers that will be moved.  */
23595   int nregs;
23596
23597   reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
23598   mode = GET_MODE (dst);
23599   nregs = hard_regno_nregs (reg, mode);
23600   if (FP_REGNO_P (reg))
23601     reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode :
23602         (TARGET_HARD_FLOAT ? DFmode : SFmode);
23603   else if (ALTIVEC_REGNO_P (reg))
23604     reg_mode = V16QImode;
23605   else
23606     reg_mode = word_mode;
23607   reg_mode_size = GET_MODE_SIZE (reg_mode);
23608
23609   gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
23610
23611   /* TDmode residing in FP registers is special, since the ISA requires that
23612      the lower-numbered word of a register pair is always the most significant
23613      word, even in little-endian mode.  This does not match the usual subreg
23614      semantics, so we cannnot use simplify_gen_subreg in those cases.  Access
23615      the appropriate constituent registers "by hand" in little-endian mode.
23616
23617      Note we do not need to check for destructive overlap here since TDmode
23618      can only reside in even/odd register pairs.  */
23619   if (FP_REGNO_P (reg) && DECIMAL_FLOAT_MODE_P (mode) && !BYTES_BIG_ENDIAN)
23620     {
23621       rtx p_src, p_dst;
23622       int i;
23623
23624       for (i = 0; i < nregs; i++)
23625         {
23626           if (REG_P (src) && FP_REGNO_P (REGNO (src)))
23627             p_src = gen_rtx_REG (reg_mode, REGNO (src) + nregs - 1 - i);
23628           else
23629             p_src = simplify_gen_subreg (reg_mode, src, mode,
23630                                          i * reg_mode_size);
23631
23632           if (REG_P (dst) && FP_REGNO_P (REGNO (dst)))
23633             p_dst = gen_rtx_REG (reg_mode, REGNO (dst) + nregs - 1 - i);
23634           else
23635             p_dst = simplify_gen_subreg (reg_mode, dst, mode,
23636                                          i * reg_mode_size);
23637
23638           emit_insn (gen_rtx_SET (p_dst, p_src));
23639         }
23640
23641       return;
23642     }
23643
23644   if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
23645     {
23646       /* Move register range backwards, if we might have destructive
23647          overlap.  */
23648       int i;
23649       for (i = nregs - 1; i >= 0; i--)
23650         emit_insn (gen_rtx_SET (simplify_gen_subreg (reg_mode, dst, mode,
23651                                                      i * reg_mode_size),
23652                                 simplify_gen_subreg (reg_mode, src, mode,
23653                                                      i * reg_mode_size)));
23654     }
23655   else
23656     {
23657       int i;
23658       int j = -1;
23659       bool used_update = false;
23660       rtx restore_basereg = NULL_RTX;
23661
23662       if (MEM_P (src) && INT_REGNO_P (reg))
23663         {
23664           rtx breg;
23665
23666           if (GET_CODE (XEXP (src, 0)) == PRE_INC
23667               || GET_CODE (XEXP (src, 0)) == PRE_DEC)
23668             {
23669               rtx delta_rtx;
23670               breg = XEXP (XEXP (src, 0), 0);
23671               delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
23672                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
23673                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
23674               emit_insn (gen_add3_insn (breg, breg, delta_rtx));
23675               src = replace_equiv_address (src, breg);
23676             }
23677           else if (! rs6000_offsettable_memref_p (src, reg_mode, true))
23678             {
23679               if (GET_CODE (XEXP (src, 0)) == PRE_MODIFY)
23680                 {
23681                   rtx basereg = XEXP (XEXP (src, 0), 0);
23682                   if (TARGET_UPDATE)
23683                     {
23684                       rtx ndst = simplify_gen_subreg (reg_mode, dst, mode, 0);
23685                       emit_insn (gen_rtx_SET (ndst,
23686                                               gen_rtx_MEM (reg_mode,
23687                                                            XEXP (src, 0))));
23688                       used_update = true;
23689                     }
23690                   else
23691                     emit_insn (gen_rtx_SET (basereg,
23692                                             XEXP (XEXP (src, 0), 1)));
23693                   src = replace_equiv_address (src, basereg);
23694                 }
23695               else
23696                 {
23697                   rtx basereg = gen_rtx_REG (Pmode, reg);
23698                   emit_insn (gen_rtx_SET (basereg, XEXP (src, 0)));
23699                   src = replace_equiv_address (src, basereg);
23700                 }
23701             }
23702
23703           breg = XEXP (src, 0);
23704           if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
23705             breg = XEXP (breg, 0);
23706
23707           /* If the base register we are using to address memory is
23708              also a destination reg, then change that register last.  */
23709           if (REG_P (breg)
23710               && REGNO (breg) >= REGNO (dst)
23711               && REGNO (breg) < REGNO (dst) + nregs)
23712             j = REGNO (breg) - REGNO (dst);
23713         }
23714       else if (MEM_P (dst) && INT_REGNO_P (reg))
23715         {
23716           rtx breg;
23717
23718           if (GET_CODE (XEXP (dst, 0)) == PRE_INC
23719               || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
23720             {
23721               rtx delta_rtx;
23722               breg = XEXP (XEXP (dst, 0), 0);
23723               delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
23724                            ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
23725                            : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
23726
23727               /* We have to update the breg before doing the store.
23728                  Use store with update, if available.  */
23729
23730               if (TARGET_UPDATE)
23731                 {
23732                   rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
23733                   emit_insn (TARGET_32BIT
23734                              ? (TARGET_POWERPC64
23735                                 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
23736                                 : gen_movsi_si_update (breg, breg, delta_rtx, nsrc))
23737                              : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
23738                   used_update = true;
23739                 }
23740               else
23741                 emit_insn (gen_add3_insn (breg, breg, delta_rtx));
23742               dst = replace_equiv_address (dst, breg);
23743             }
23744           else if (!rs6000_offsettable_memref_p (dst, reg_mode, true)
23745                    && GET_CODE (XEXP (dst, 0)) != LO_SUM)
23746             {
23747               if (GET_CODE (XEXP (dst, 0)) == PRE_MODIFY)
23748                 {
23749                   rtx basereg = XEXP (XEXP (dst, 0), 0);
23750                   if (TARGET_UPDATE)
23751                     {
23752                       rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
23753                       emit_insn (gen_rtx_SET (gen_rtx_MEM (reg_mode,
23754                                                            XEXP (dst, 0)),
23755                                               nsrc));
23756                       used_update = true;
23757                     }
23758                   else
23759                     emit_insn (gen_rtx_SET (basereg,
23760                                             XEXP (XEXP (dst, 0), 1)));
23761                   dst = replace_equiv_address (dst, basereg);
23762                 }
23763               else
23764                 {
23765                   rtx basereg = XEXP (XEXP (dst, 0), 0);
23766                   rtx offsetreg = XEXP (XEXP (dst, 0), 1);
23767                   gcc_assert (GET_CODE (XEXP (dst, 0)) == PLUS
23768                               && REG_P (basereg)
23769                               && REG_P (offsetreg)
23770                               && REGNO (basereg) != REGNO (offsetreg));
23771                   if (REGNO (basereg) == 0)
23772                     {
23773                       rtx tmp = offsetreg;
23774                       offsetreg = basereg;
23775                       basereg = tmp;
23776                     }
23777                   emit_insn (gen_add3_insn (basereg, basereg, offsetreg));
23778                   restore_basereg = gen_sub3_insn (basereg, basereg, offsetreg);
23779                   dst = replace_equiv_address (dst, basereg);
23780                 }
23781             }
23782           else if (GET_CODE (XEXP (dst, 0)) != LO_SUM)
23783             gcc_assert (rs6000_offsettable_memref_p (dst, reg_mode, true));
23784         }
23785
23786       for (i = 0; i < nregs; i++)
23787         {
23788           /* Calculate index to next subword.  */
23789           ++j;
23790           if (j == nregs)
23791             j = 0;
23792
23793           /* If compiler already emitted move of first word by
23794              store with update, no need to do anything.  */
23795           if (j == 0 && used_update)
23796             continue;
23797
23798           emit_insn (gen_rtx_SET (simplify_gen_subreg (reg_mode, dst, mode,
23799                                                        j * reg_mode_size),
23800                                   simplify_gen_subreg (reg_mode, src, mode,
23801                                                        j * reg_mode_size)));
23802         }
23803       if (restore_basereg != NULL_RTX)
23804         emit_insn (restore_basereg);
23805     }
23806 }
23807
23808 \f
23809 /* This page contains routines that are used to determine what the
23810    function prologue and epilogue code will do and write them out.  */
23811
23812 /* Determine whether the REG is really used.  */
23813
23814 static bool
23815 save_reg_p (int reg)
23816 {
23817   if (reg == RS6000_PIC_OFFSET_TABLE_REGNUM && !TARGET_SINGLE_PIC_BASE)
23818     {
23819       /* When calling eh_return, we must return true for all the cases
23820          where conditional_register_usage marks the PIC offset reg
23821          call used or fixed.  */
23822       if (crtl->calls_eh_return
23823           && ((DEFAULT_ABI == ABI_V4 && flag_pic)
23824               || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
23825               || (TARGET_TOC && TARGET_MINIMAL_TOC)))
23826         return true;
23827
23828       /* We need to mark the PIC offset register live for the same
23829          conditions as it is set up in rs6000_emit_prologue, or
23830          otherwise it won't be saved before we clobber it.  */
23831       if (TARGET_TOC && TARGET_MINIMAL_TOC
23832           && !constant_pool_empty_p ())
23833         return true;
23834
23835       if (DEFAULT_ABI == ABI_V4
23836           && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
23837           && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
23838         return true;
23839
23840       if (DEFAULT_ABI == ABI_DARWIN
23841           && flag_pic && crtl->uses_pic_offset_table)
23842         return true;
23843     }
23844
23845   return !call_used_regs[reg] && df_regs_ever_live_p (reg);
23846 }
23847
23848 /* Return the first fixed-point register that is required to be
23849    saved. 32 if none.  */
23850
23851 int
23852 first_reg_to_save (void)
23853 {
23854   int first_reg;
23855
23856   /* Find lowest numbered live register.  */
23857   for (first_reg = 13; first_reg <= 31; first_reg++)
23858     if (save_reg_p (first_reg))
23859       break;
23860
23861   return first_reg;
23862 }
23863
23864 /* Similar, for FP regs.  */
23865
23866 int
23867 first_fp_reg_to_save (void)
23868 {
23869   int first_reg;
23870
23871   /* Find lowest numbered live register.  */
23872   for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
23873     if (save_reg_p (first_reg))
23874       break;
23875
23876   return first_reg;
23877 }
23878
23879 /* Similar, for AltiVec regs.  */
23880
23881 static int
23882 first_altivec_reg_to_save (void)
23883 {
23884   int i;
23885
23886   /* Stack frame remains as is unless we are in AltiVec ABI.  */
23887   if (! TARGET_ALTIVEC_ABI)
23888     return LAST_ALTIVEC_REGNO + 1;
23889
23890   /* On Darwin, the unwind routines are compiled without
23891      TARGET_ALTIVEC, and use save_world to save/restore the
23892      altivec registers when necessary.  */
23893   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
23894       && ! TARGET_ALTIVEC)
23895     return FIRST_ALTIVEC_REGNO + 20;
23896
23897   /* Find lowest numbered live register.  */
23898   for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
23899     if (save_reg_p (i))
23900       break;
23901
23902   return i;
23903 }
23904
23905 /* Return a 32-bit mask of the AltiVec registers we need to set in
23906    VRSAVE.  Bit n of the return value is 1 if Vn is live.  The MSB in
23907    the 32-bit word is 0.  */
23908
23909 static unsigned int
23910 compute_vrsave_mask (void)
23911 {
23912   unsigned int i, mask = 0;
23913
23914   /* On Darwin, the unwind routines are compiled without
23915      TARGET_ALTIVEC, and use save_world to save/restore the
23916      call-saved altivec registers when necessary.  */
23917   if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
23918       && ! TARGET_ALTIVEC)
23919     mask |= 0xFFF;
23920
23921   /* First, find out if we use _any_ altivec registers.  */
23922   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
23923     if (df_regs_ever_live_p (i))
23924       mask |= ALTIVEC_REG_BIT (i);
23925
23926   if (mask == 0)
23927     return mask;
23928
23929   /* Next, remove the argument registers from the set.  These must
23930      be in the VRSAVE mask set by the caller, so we don't need to add
23931      them in again.  More importantly, the mask we compute here is
23932      used to generate CLOBBERs in the set_vrsave insn, and we do not
23933      wish the argument registers to die.  */
23934   for (i = ALTIVEC_ARG_MIN_REG; i < (unsigned) crtl->args.info.vregno; i++)
23935     mask &= ~ALTIVEC_REG_BIT (i);
23936
23937   /* Similarly, remove the return value from the set.  */
23938   {
23939     bool yes = false;
23940     diddle_return_value (is_altivec_return_reg, &yes);
23941     if (yes)
23942       mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
23943   }
23944
23945   return mask;
23946 }
23947
23948 /* For a very restricted set of circumstances, we can cut down the
23949    size of prologues/epilogues by calling our own save/restore-the-world
23950    routines.  */
23951
23952 static void
23953 compute_save_world_info (rs6000_stack_t *info)
23954 {
23955   info->world_save_p = 1;
23956   info->world_save_p
23957     = (WORLD_SAVE_P (info)
23958        && DEFAULT_ABI == ABI_DARWIN
23959        && !cfun->has_nonlocal_label
23960        && info->first_fp_reg_save == FIRST_SAVED_FP_REGNO
23961        && info->first_gp_reg_save == FIRST_SAVED_GP_REGNO
23962        && info->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
23963        && info->cr_save_p);
23964
23965   /* This will not work in conjunction with sibcalls.  Make sure there
23966      are none.  (This check is expensive, but seldom executed.) */
23967   if (WORLD_SAVE_P (info))
23968     {
23969       rtx_insn *insn;
23970       for (insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
23971         if (CALL_P (insn) && SIBLING_CALL_P (insn))
23972           {
23973             info->world_save_p = 0;
23974             break;
23975           }
23976     }
23977
23978   if (WORLD_SAVE_P (info))
23979     {
23980       /* Even if we're not touching VRsave, make sure there's room on the
23981          stack for it, if it looks like we're calling SAVE_WORLD, which
23982          will attempt to save it. */
23983       info->vrsave_size  = 4;
23984
23985       /* If we are going to save the world, we need to save the link register too.  */
23986       info->lr_save_p = 1;
23987
23988       /* "Save" the VRsave register too if we're saving the world.  */
23989       if (info->vrsave_mask == 0)
23990         info->vrsave_mask = compute_vrsave_mask ();
23991
23992       /* Because the Darwin register save/restore routines only handle
23993          F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
23994          check.  */
23995       gcc_assert (info->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
23996                   && (info->first_altivec_reg_save
23997                       >= FIRST_SAVED_ALTIVEC_REGNO));
23998     }
23999
24000   return;
24001 }
24002
24003
24004 static void
24005 is_altivec_return_reg (rtx reg, void *xyes)
24006 {
24007   bool *yes = (bool *) xyes;
24008   if (REGNO (reg) == ALTIVEC_ARG_RETURN)
24009     *yes = true;
24010 }
24011
24012 \f
24013 /* Return whether REG is a global user reg or has been specifed by
24014    -ffixed-REG.  We should not restore these, and so cannot use
24015    lmw or out-of-line restore functions if there are any.  We also
24016    can't save them (well, emit frame notes for them), because frame
24017    unwinding during exception handling will restore saved registers.  */
24018
24019 static bool
24020 fixed_reg_p (int reg)
24021 {
24022   /* Ignore fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] when the
24023      backend sets it, overriding anything the user might have given.  */
24024   if (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
24025       && ((DEFAULT_ABI == ABI_V4 && flag_pic)
24026           || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
24027           || (TARGET_TOC && TARGET_MINIMAL_TOC)))
24028     return false;
24029
24030   return fixed_regs[reg];
24031 }
24032
24033 /* Determine the strategy for savings/restoring registers.  */
24034
24035 enum {
24036   SAVE_MULTIPLE = 0x1,
24037   SAVE_INLINE_GPRS = 0x2,
24038   SAVE_INLINE_FPRS = 0x4,
24039   SAVE_NOINLINE_GPRS_SAVES_LR = 0x8,
24040   SAVE_NOINLINE_FPRS_SAVES_LR = 0x10,
24041   SAVE_INLINE_VRS = 0x20,
24042   REST_MULTIPLE = 0x100,
24043   REST_INLINE_GPRS = 0x200,
24044   REST_INLINE_FPRS = 0x400,
24045   REST_NOINLINE_FPRS_DOESNT_RESTORE_LR = 0x800,
24046   REST_INLINE_VRS = 0x1000
24047 };
24048
24049 static int
24050 rs6000_savres_strategy (rs6000_stack_t *info,
24051                         bool using_static_chain_p)
24052 {
24053   int strategy = 0;
24054
24055   /* Select between in-line and out-of-line save and restore of regs.
24056      First, all the obvious cases where we don't use out-of-line.  */
24057   if (crtl->calls_eh_return
24058       || cfun->machine->ra_need_lr)
24059     strategy |= (SAVE_INLINE_FPRS | REST_INLINE_FPRS
24060                  | SAVE_INLINE_GPRS | REST_INLINE_GPRS
24061                  | SAVE_INLINE_VRS | REST_INLINE_VRS);
24062
24063   if (info->first_gp_reg_save == 32)
24064     strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
24065
24066   if (info->first_fp_reg_save == 64)
24067     strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
24068
24069   if (info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1)
24070     strategy |= SAVE_INLINE_VRS | REST_INLINE_VRS;
24071
24072   /* Define cutoff for using out-of-line functions to save registers.  */
24073   if (DEFAULT_ABI == ABI_V4 || TARGET_ELF)
24074     {
24075       if (!optimize_size)
24076         {
24077           strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
24078           strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
24079           strategy |= SAVE_INLINE_VRS | REST_INLINE_VRS;
24080         }
24081       else
24082         {
24083           /* Prefer out-of-line restore if it will exit.  */
24084           if (info->first_fp_reg_save > 61)
24085             strategy |= SAVE_INLINE_FPRS;
24086           if (info->first_gp_reg_save > 29)
24087             {
24088               if (info->first_fp_reg_save == 64)
24089                 strategy |= SAVE_INLINE_GPRS;
24090               else
24091                 strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
24092             }
24093           if (info->first_altivec_reg_save == LAST_ALTIVEC_REGNO)
24094             strategy |= SAVE_INLINE_VRS | REST_INLINE_VRS;
24095         }
24096     }
24097   else if (DEFAULT_ABI == ABI_DARWIN)
24098     {
24099       if (info->first_fp_reg_save > 60)
24100         strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
24101       if (info->first_gp_reg_save > 29)
24102         strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
24103       strategy |= SAVE_INLINE_VRS | REST_INLINE_VRS;
24104     }
24105   else
24106     {
24107       gcc_checking_assert (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2);
24108       if ((flag_shrink_wrap_separate && optimize_function_for_speed_p (cfun))
24109           || info->first_fp_reg_save > 61)
24110         strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
24111       strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
24112       strategy |= SAVE_INLINE_VRS | REST_INLINE_VRS;
24113     }
24114
24115   /* Don't bother to try to save things out-of-line if r11 is occupied
24116      by the static chain.  It would require too much fiddling and the
24117      static chain is rarely used anyway.  FPRs are saved w.r.t the stack
24118      pointer on Darwin, and AIX uses r1 or r12.  */
24119   if (using_static_chain_p
24120       && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN))
24121     strategy |= ((DEFAULT_ABI == ABI_DARWIN ? 0 : SAVE_INLINE_FPRS)
24122                  | SAVE_INLINE_GPRS
24123                  | SAVE_INLINE_VRS);
24124
24125   /* Don't ever restore fixed regs.  That means we can't use the
24126      out-of-line register restore functions if a fixed reg is in the
24127      range of regs restored.   */
24128   if (!(strategy & REST_INLINE_FPRS))
24129     for (int i = info->first_fp_reg_save; i < 64; i++)
24130       if (fixed_regs[i])
24131         {
24132           strategy |= REST_INLINE_FPRS;
24133           break;
24134         }
24135
24136   /* We can only use the out-of-line routines to restore fprs if we've
24137      saved all the registers from first_fp_reg_save in the prologue.
24138      Otherwise, we risk loading garbage.  Of course, if we have saved
24139      out-of-line then we know we haven't skipped any fprs.  */
24140   if ((strategy & SAVE_INLINE_FPRS)
24141       && !(strategy & REST_INLINE_FPRS))
24142     for (int i = info->first_fp_reg_save; i < 64; i++)
24143       if (!save_reg_p (i))
24144         {
24145           strategy |= REST_INLINE_FPRS;
24146           break;
24147         }
24148
24149   /* Similarly, for altivec regs.  */
24150   if (!(strategy & REST_INLINE_VRS))
24151     for (int i = info->first_altivec_reg_save; i < LAST_ALTIVEC_REGNO + 1; i++)
24152       if (fixed_regs[i])
24153         {
24154           strategy |= REST_INLINE_VRS;
24155           break;
24156         }
24157
24158   if ((strategy & SAVE_INLINE_VRS)
24159       && !(strategy & REST_INLINE_VRS))
24160     for (int i = info->first_altivec_reg_save; i < LAST_ALTIVEC_REGNO + 1; i++)
24161       if (!save_reg_p (i))
24162         {
24163           strategy |= REST_INLINE_VRS;
24164           break;
24165         }
24166
24167   /* info->lr_save_p isn't yet set if the only reason lr needs to be
24168      saved is an out-of-line save or restore.  Set up the value for
24169      the next test (excluding out-of-line gprs).  */
24170   bool lr_save_p = (info->lr_save_p
24171                     || !(strategy & SAVE_INLINE_FPRS)
24172                     || !(strategy & SAVE_INLINE_VRS)
24173                     || !(strategy & REST_INLINE_FPRS)
24174                     || !(strategy & REST_INLINE_VRS));
24175
24176   if (TARGET_MULTIPLE
24177       && !TARGET_POWERPC64
24178       && info->first_gp_reg_save < 31
24179       && !(flag_shrink_wrap
24180            && flag_shrink_wrap_separate
24181            && optimize_function_for_speed_p (cfun)))
24182     {
24183       int count = 0;
24184       for (int i = info->first_gp_reg_save; i < 32; i++)
24185         if (save_reg_p (i))
24186           count++;
24187
24188       if (count <= 1)
24189         /* Don't use store multiple if only one reg needs to be
24190            saved.  This can occur for example when the ABI_V4 pic reg
24191            (r30) needs to be saved to make calls, but r31 is not
24192            used.  */
24193         strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
24194       else
24195         {
24196           /* Prefer store multiple for saves over out-of-line
24197              routines, since the store-multiple instruction will
24198              always be smaller.  */
24199           strategy |= SAVE_INLINE_GPRS | SAVE_MULTIPLE;
24200
24201           /* The situation is more complicated with load multiple.
24202              We'd prefer to use the out-of-line routines for restores,
24203              since the "exit" out-of-line routines can handle the
24204              restore of LR and the frame teardown.  However if doesn't
24205              make sense to use the out-of-line routine if that is the
24206              only reason we'd need to save LR, and we can't use the
24207              "exit" out-of-line gpr restore if we have saved some
24208              fprs; In those cases it is advantageous to use load
24209              multiple when available.  */
24210           if (info->first_fp_reg_save != 64 || !lr_save_p)
24211             strategy |= REST_INLINE_GPRS | REST_MULTIPLE;
24212         }
24213     }
24214
24215   /* Using the "exit" out-of-line routine does not improve code size
24216      if using it would require lr to be saved and if only saving one
24217      or two gprs.  */
24218   else if (!lr_save_p && info->first_gp_reg_save > 29)
24219     strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
24220
24221   /* Don't ever restore fixed regs.  */
24222   if ((strategy & (REST_INLINE_GPRS | REST_MULTIPLE)) != REST_INLINE_GPRS)
24223     for (int i = info->first_gp_reg_save; i < 32; i++)
24224       if (fixed_reg_p (i))
24225         {
24226           strategy |= REST_INLINE_GPRS;
24227           strategy &= ~REST_MULTIPLE;
24228           break;
24229         }
24230
24231   /* We can only use load multiple or the out-of-line routines to
24232      restore gprs if we've saved all the registers from
24233      first_gp_reg_save.  Otherwise, we risk loading garbage.
24234      Of course, if we have saved out-of-line or used stmw then we know
24235      we haven't skipped any gprs.  */
24236   if ((strategy & (SAVE_INLINE_GPRS | SAVE_MULTIPLE)) == SAVE_INLINE_GPRS
24237       && (strategy & (REST_INLINE_GPRS | REST_MULTIPLE)) != REST_INLINE_GPRS)
24238     for (int i = info->first_gp_reg_save; i < 32; i++)
24239       if (!save_reg_p (i))
24240         {
24241           strategy |= REST_INLINE_GPRS;
24242           strategy &= ~REST_MULTIPLE;
24243           break;
24244         }
24245
24246   if (TARGET_ELF && TARGET_64BIT)
24247     {
24248       if (!(strategy & SAVE_INLINE_FPRS))
24249         strategy |= SAVE_NOINLINE_FPRS_SAVES_LR;
24250       else if (!(strategy & SAVE_INLINE_GPRS)
24251                && info->first_fp_reg_save == 64)
24252         strategy |= SAVE_NOINLINE_GPRS_SAVES_LR;
24253     }
24254   else if (TARGET_AIX && !(strategy & REST_INLINE_FPRS))
24255     strategy |= REST_NOINLINE_FPRS_DOESNT_RESTORE_LR;
24256
24257   if (TARGET_MACHO && !(strategy & SAVE_INLINE_FPRS))
24258     strategy |= SAVE_NOINLINE_FPRS_SAVES_LR;
24259
24260   return strategy;
24261 }
24262
24263 /* Calculate the stack information for the current function.  This is
24264    complicated by having two separate calling sequences, the AIX calling
24265    sequence and the V.4 calling sequence.
24266
24267    AIX (and Darwin/Mac OS X) stack frames look like:
24268                                                           32-bit  64-bit
24269         SP----> +---------------------------------------+
24270                 | back chain to caller                  | 0       0
24271                 +---------------------------------------+
24272                 | saved CR                              | 4       8 (8-11)
24273                 +---------------------------------------+
24274                 | saved LR                              | 8       16
24275                 +---------------------------------------+
24276                 | reserved for compilers                | 12      24
24277                 +---------------------------------------+
24278                 | reserved for binders                  | 16      32
24279                 +---------------------------------------+
24280                 | saved TOC pointer                     | 20      40
24281                 +---------------------------------------+
24282                 | Parameter save area (+padding*) (P)   | 24      48
24283                 +---------------------------------------+
24284                 | Alloca space (A)                      | 24+P    etc.
24285                 +---------------------------------------+
24286                 | Local variable space (L)              | 24+P+A
24287                 +---------------------------------------+
24288                 | Float/int conversion temporary (X)    | 24+P+A+L
24289                 +---------------------------------------+
24290                 | Save area for AltiVec registers (W)   | 24+P+A+L+X
24291                 +---------------------------------------+
24292                 | AltiVec alignment padding (Y)         | 24+P+A+L+X+W
24293                 +---------------------------------------+
24294                 | Save area for VRSAVE register (Z)     | 24+P+A+L+X+W+Y
24295                 +---------------------------------------+
24296                 | Save area for GP registers (G)        | 24+P+A+X+L+X+W+Y+Z
24297                 +---------------------------------------+
24298                 | Save area for FP registers (F)        | 24+P+A+X+L+X+W+Y+Z+G
24299                 +---------------------------------------+
24300         old SP->| back chain to caller's caller         |
24301                 +---------------------------------------+
24302
24303      * If the alloca area is present, the parameter save area is
24304        padded so that the former starts 16-byte aligned.
24305
24306    The required alignment for AIX configurations is two words (i.e., 8
24307    or 16 bytes).
24308
24309    The ELFv2 ABI is a variant of the AIX ABI.  Stack frames look like:
24310
24311         SP----> +---------------------------------------+
24312                 | Back chain to caller                  |  0
24313                 +---------------------------------------+
24314                 | Save area for CR                      |  8
24315                 +---------------------------------------+
24316                 | Saved LR                              |  16
24317                 +---------------------------------------+
24318                 | Saved TOC pointer                     |  24
24319                 +---------------------------------------+
24320                 | Parameter save area (+padding*) (P)   |  32
24321                 +---------------------------------------+
24322                 | Alloca space (A)                      |  32+P
24323                 +---------------------------------------+
24324                 | Local variable space (L)              |  32+P+A
24325                 +---------------------------------------+
24326                 | Save area for AltiVec registers (W)   |  32+P+A+L
24327                 +---------------------------------------+
24328                 | AltiVec alignment padding (Y)         |  32+P+A+L+W
24329                 +---------------------------------------+
24330                 | Save area for GP registers (G)        |  32+P+A+L+W+Y
24331                 +---------------------------------------+
24332                 | Save area for FP registers (F)        |  32+P+A+L+W+Y+G
24333                 +---------------------------------------+
24334         old SP->| back chain to caller's caller         |  32+P+A+L+W+Y+G+F
24335                 +---------------------------------------+
24336
24337      * If the alloca area is present, the parameter save area is
24338        padded so that the former starts 16-byte aligned.
24339
24340    V.4 stack frames look like:
24341
24342         SP----> +---------------------------------------+
24343                 | back chain to caller                  | 0
24344                 +---------------------------------------+
24345                 | caller's saved LR                     | 4
24346                 +---------------------------------------+
24347                 | Parameter save area (+padding*) (P)   | 8
24348                 +---------------------------------------+
24349                 | Alloca space (A)                      | 8+P
24350                 +---------------------------------------+
24351                 | Varargs save area (V)                 | 8+P+A
24352                 +---------------------------------------+
24353                 | Local variable space (L)              | 8+P+A+V
24354                 +---------------------------------------+
24355                 | Float/int conversion temporary (X)    | 8+P+A+V+L
24356                 +---------------------------------------+
24357                 | Save area for AltiVec registers (W)   | 8+P+A+V+L+X
24358                 +---------------------------------------+
24359                 | AltiVec alignment padding (Y)         | 8+P+A+V+L+X+W
24360                 +---------------------------------------+
24361                 | Save area for VRSAVE register (Z)     | 8+P+A+V+L+X+W+Y
24362                 +---------------------------------------+
24363                 | saved CR (C)                          | 8+P+A+V+L+X+W+Y+Z
24364                 +---------------------------------------+
24365                 | Save area for GP registers (G)        | 8+P+A+V+L+X+W+Y+Z+C
24366                 +---------------------------------------+
24367                 | Save area for FP registers (F)        | 8+P+A+V+L+X+W+Y+Z+C+G
24368                 +---------------------------------------+
24369         old SP->| back chain to caller's caller         |
24370                 +---------------------------------------+
24371
24372      * If the alloca area is present and the required alignment is
24373        16 bytes, the parameter save area is padded so that the
24374        alloca area starts 16-byte aligned.
24375
24376    The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
24377    given.  (But note below and in sysv4.h that we require only 8 and
24378    may round up the size of our stack frame anyways.  The historical
24379    reason is early versions of powerpc-linux which didn't properly
24380    align the stack at program startup.  A happy side-effect is that
24381    -mno-eabi libraries can be used with -meabi programs.)
24382
24383    The EABI configuration defaults to the V.4 layout.  However,
24384    the stack alignment requirements may differ.  If -mno-eabi is not
24385    given, the required stack alignment is 8 bytes; if -mno-eabi is
24386    given, the required alignment is 16 bytes.  (But see V.4 comment
24387    above.)  */
24388
24389 #ifndef ABI_STACK_BOUNDARY
24390 #define ABI_STACK_BOUNDARY STACK_BOUNDARY
24391 #endif
24392
24393 static rs6000_stack_t *
24394 rs6000_stack_info (void)
24395 {
24396   /* We should never be called for thunks, we are not set up for that.  */
24397   gcc_assert (!cfun->is_thunk);
24398
24399   rs6000_stack_t *info = &stack_info;
24400   int reg_size = TARGET_32BIT ? 4 : 8;
24401   int ehrd_size;
24402   int ehcr_size;
24403   int save_align;
24404   int first_gp;
24405   HOST_WIDE_INT non_fixed_size;
24406   bool using_static_chain_p;
24407
24408   if (reload_completed && info->reload_completed)
24409     return info;
24410
24411   memset (info, 0, sizeof (*info));
24412   info->reload_completed = reload_completed;
24413
24414   /* Select which calling sequence.  */
24415   info->abi = DEFAULT_ABI;
24416
24417   /* Calculate which registers need to be saved & save area size.  */
24418   info->first_gp_reg_save = first_reg_to_save ();
24419   /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
24420      even if it currently looks like we won't.  Reload may need it to
24421      get at a constant; if so, it will have already created a constant
24422      pool entry for it.  */
24423   if (((TARGET_TOC && TARGET_MINIMAL_TOC)
24424        || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
24425        || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
24426       && crtl->uses_const_pool
24427       && info->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
24428     first_gp = RS6000_PIC_OFFSET_TABLE_REGNUM;
24429   else
24430     first_gp = info->first_gp_reg_save;
24431
24432   info->gp_size = reg_size * (32 - first_gp);
24433
24434   info->first_fp_reg_save = first_fp_reg_to_save ();
24435   info->fp_size = 8 * (64 - info->first_fp_reg_save);
24436
24437   info->first_altivec_reg_save = first_altivec_reg_to_save ();
24438   info->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
24439                                  - info->first_altivec_reg_save);
24440
24441   /* Does this function call anything?  */
24442   info->calls_p = (!crtl->is_leaf || cfun->machine->ra_needs_full_frame);
24443
24444   /* Determine if we need to save the condition code registers.  */
24445   if (save_reg_p (CR2_REGNO)
24446       || save_reg_p (CR3_REGNO)
24447       || save_reg_p (CR4_REGNO))
24448     {
24449       info->cr_save_p = 1;
24450       if (DEFAULT_ABI == ABI_V4)
24451         info->cr_size = reg_size;
24452     }
24453
24454   /* If the current function calls __builtin_eh_return, then we need
24455      to allocate stack space for registers that will hold data for
24456      the exception handler.  */
24457   if (crtl->calls_eh_return)
24458     {
24459       unsigned int i;
24460       for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
24461         continue;
24462
24463       ehrd_size = i * UNITS_PER_WORD;
24464     }
24465   else
24466     ehrd_size = 0;
24467
24468   /* In the ELFv2 ABI, we also need to allocate space for separate
24469      CR field save areas if the function calls __builtin_eh_return.  */
24470   if (DEFAULT_ABI == ABI_ELFv2 && crtl->calls_eh_return)
24471     {
24472       /* This hard-codes that we have three call-saved CR fields.  */
24473       ehcr_size = 3 * reg_size;
24474       /* We do *not* use the regular CR save mechanism.  */
24475       info->cr_save_p = 0;
24476     }
24477   else
24478     ehcr_size = 0;
24479
24480   /* Determine various sizes.  */
24481   info->reg_size     = reg_size;
24482   info->fixed_size   = RS6000_SAVE_AREA;
24483   info->vars_size    = RS6000_ALIGN (get_frame_size (), 8);
24484   if (cfun->calls_alloca)
24485     info->parm_size  =
24486       RS6000_ALIGN (crtl->outgoing_args_size + info->fixed_size,
24487                     STACK_BOUNDARY / BITS_PER_UNIT) - info->fixed_size;
24488   else
24489     info->parm_size  = RS6000_ALIGN (crtl->outgoing_args_size,
24490                                      TARGET_ALTIVEC ? 16 : 8);
24491   if (FRAME_GROWS_DOWNWARD)
24492     info->vars_size
24493       += RS6000_ALIGN (info->fixed_size + info->vars_size + info->parm_size,
24494                        ABI_STACK_BOUNDARY / BITS_PER_UNIT)
24495          - (info->fixed_size + info->vars_size + info->parm_size);
24496
24497   if (TARGET_ALTIVEC_ABI)
24498     info->vrsave_mask = compute_vrsave_mask ();
24499
24500   if (TARGET_ALTIVEC_VRSAVE && info->vrsave_mask)
24501     info->vrsave_size = 4;
24502
24503   compute_save_world_info (info);
24504
24505   /* Calculate the offsets.  */
24506   switch (DEFAULT_ABI)
24507     {
24508     case ABI_NONE:
24509     default:
24510       gcc_unreachable ();
24511
24512     case ABI_AIX:
24513     case ABI_ELFv2:
24514     case ABI_DARWIN:
24515       info->fp_save_offset = -info->fp_size;
24516       info->gp_save_offset = info->fp_save_offset - info->gp_size;
24517
24518       if (TARGET_ALTIVEC_ABI)
24519         {
24520           info->vrsave_save_offset = info->gp_save_offset - info->vrsave_size;
24521
24522           /* Align stack so vector save area is on a quadword boundary.
24523              The padding goes above the vectors.  */
24524           if (info->altivec_size != 0)
24525             info->altivec_padding_size = info->vrsave_save_offset & 0xF;
24526
24527           info->altivec_save_offset = info->vrsave_save_offset
24528                                       - info->altivec_padding_size
24529                                       - info->altivec_size;
24530           gcc_assert (info->altivec_size == 0
24531                       || info->altivec_save_offset % 16 == 0);
24532
24533           /* Adjust for AltiVec case.  */
24534           info->ehrd_offset = info->altivec_save_offset - ehrd_size;
24535         }
24536       else
24537         info->ehrd_offset = info->gp_save_offset - ehrd_size;
24538
24539       info->ehcr_offset = info->ehrd_offset - ehcr_size;
24540       info->cr_save_offset = reg_size; /* first word when 64-bit.  */
24541       info->lr_save_offset = 2*reg_size;
24542       break;
24543
24544     case ABI_V4:
24545       info->fp_save_offset = -info->fp_size;
24546       info->gp_save_offset = info->fp_save_offset - info->gp_size;
24547       info->cr_save_offset = info->gp_save_offset - info->cr_size;
24548
24549       if (TARGET_ALTIVEC_ABI)
24550         {
24551           info->vrsave_save_offset = info->cr_save_offset - info->vrsave_size;
24552
24553           /* Align stack so vector save area is on a quadword boundary.  */
24554           if (info->altivec_size != 0)
24555             info->altivec_padding_size = 16 - (-info->vrsave_save_offset % 16);
24556
24557           info->altivec_save_offset = info->vrsave_save_offset
24558                                       - info->altivec_padding_size
24559                                       - info->altivec_size;
24560
24561           /* Adjust for AltiVec case.  */
24562           info->ehrd_offset = info->altivec_save_offset;
24563         }
24564       else
24565         info->ehrd_offset = info->cr_save_offset;
24566
24567       info->ehrd_offset -= ehrd_size;
24568       info->lr_save_offset = reg_size;
24569     }
24570
24571   save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
24572   info->save_size = RS6000_ALIGN (info->fp_size
24573                                   + info->gp_size
24574                                   + info->altivec_size
24575                                   + info->altivec_padding_size
24576                                   + ehrd_size
24577                                   + ehcr_size
24578                                   + info->cr_size
24579                                   + info->vrsave_size,
24580                                   save_align);
24581
24582   non_fixed_size = info->vars_size + info->parm_size + info->save_size;
24583
24584   info->total_size = RS6000_ALIGN (non_fixed_size + info->fixed_size,
24585                                    ABI_STACK_BOUNDARY / BITS_PER_UNIT);
24586
24587   /* Determine if we need to save the link register.  */
24588   if (info->calls_p
24589       || ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
24590           && crtl->profile
24591           && !TARGET_PROFILE_KERNEL)
24592       || (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca)
24593 #ifdef TARGET_RELOCATABLE
24594       || (DEFAULT_ABI == ABI_V4
24595           && (TARGET_RELOCATABLE || flag_pic > 1)
24596           && !constant_pool_empty_p ())
24597 #endif
24598       || rs6000_ra_ever_killed ())
24599     info->lr_save_p = 1;
24600
24601   using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
24602                           && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
24603                           && call_used_regs[STATIC_CHAIN_REGNUM]);
24604   info->savres_strategy = rs6000_savres_strategy (info, using_static_chain_p);
24605
24606   if (!(info->savres_strategy & SAVE_INLINE_GPRS)
24607       || !(info->savres_strategy & SAVE_INLINE_FPRS)
24608       || !(info->savres_strategy & SAVE_INLINE_VRS)
24609       || !(info->savres_strategy & REST_INLINE_GPRS)
24610       || !(info->savres_strategy & REST_INLINE_FPRS)
24611       || !(info->savres_strategy & REST_INLINE_VRS))
24612     info->lr_save_p = 1;
24613
24614   if (info->lr_save_p)
24615     df_set_regs_ever_live (LR_REGNO, true);
24616
24617   /* Determine if we need to allocate any stack frame:
24618
24619      For AIX we need to push the stack if a frame pointer is needed
24620      (because the stack might be dynamically adjusted), if we are
24621      debugging, if we make calls, or if the sum of fp_save, gp_save,
24622      and local variables are more than the space needed to save all
24623      non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
24624      + 18*8 = 288 (GPR13 reserved).
24625
24626      For V.4 we don't have the stack cushion that AIX uses, but assume
24627      that the debugger can handle stackless frames.  */
24628
24629   if (info->calls_p)
24630     info->push_p = 1;
24631
24632   else if (DEFAULT_ABI == ABI_V4)
24633     info->push_p = non_fixed_size != 0;
24634
24635   else if (frame_pointer_needed)
24636     info->push_p = 1;
24637
24638   else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
24639     info->push_p = 1;
24640
24641   else
24642     info->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
24643
24644   return info;
24645 }
24646
24647 static void
24648 debug_stack_info (rs6000_stack_t *info)
24649 {
24650   const char *abi_string;
24651
24652   if (! info)
24653     info = rs6000_stack_info ();
24654
24655   fprintf (stderr, "\nStack information for function %s:\n",
24656            ((current_function_decl && DECL_NAME (current_function_decl))
24657             ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
24658             : "<unknown>"));
24659
24660   switch (info->abi)
24661     {
24662     default:             abi_string = "Unknown";        break;
24663     case ABI_NONE:       abi_string = "NONE";           break;
24664     case ABI_AIX:        abi_string = "AIX";            break;
24665     case ABI_ELFv2:      abi_string = "ELFv2";          break;
24666     case ABI_DARWIN:     abi_string = "Darwin";         break;
24667     case ABI_V4:         abi_string = "V.4";            break;
24668     }
24669
24670   fprintf (stderr, "\tABI                 = %5s\n", abi_string);
24671
24672   if (TARGET_ALTIVEC_ABI)
24673     fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
24674
24675   if (info->first_gp_reg_save != 32)
24676     fprintf (stderr, "\tfirst_gp_reg_save   = %5d\n", info->first_gp_reg_save);
24677
24678   if (info->first_fp_reg_save != 64)
24679     fprintf (stderr, "\tfirst_fp_reg_save   = %5d\n", info->first_fp_reg_save);
24680
24681   if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
24682     fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
24683              info->first_altivec_reg_save);
24684
24685   if (info->lr_save_p)
24686     fprintf (stderr, "\tlr_save_p           = %5d\n", info->lr_save_p);
24687
24688   if (info->cr_save_p)
24689     fprintf (stderr, "\tcr_save_p           = %5d\n", info->cr_save_p);
24690
24691   if (info->vrsave_mask)
24692     fprintf (stderr, "\tvrsave_mask         = 0x%x\n", info->vrsave_mask);
24693
24694   if (info->push_p)
24695     fprintf (stderr, "\tpush_p              = %5d\n", info->push_p);
24696
24697   if (info->calls_p)
24698     fprintf (stderr, "\tcalls_p             = %5d\n", info->calls_p);
24699
24700   if (info->gp_size)
24701     fprintf (stderr, "\tgp_save_offset      = %5d\n", info->gp_save_offset);
24702
24703   if (info->fp_size)
24704     fprintf (stderr, "\tfp_save_offset      = %5d\n", info->fp_save_offset);
24705
24706   if (info->altivec_size)
24707     fprintf (stderr, "\taltivec_save_offset = %5d\n",
24708              info->altivec_save_offset);
24709
24710   if (info->vrsave_size)
24711     fprintf (stderr, "\tvrsave_save_offset  = %5d\n",
24712              info->vrsave_save_offset);
24713
24714   if (info->lr_save_p)
24715     fprintf (stderr, "\tlr_save_offset      = %5d\n", info->lr_save_offset);
24716
24717   if (info->cr_save_p)
24718     fprintf (stderr, "\tcr_save_offset      = %5d\n", info->cr_save_offset);
24719
24720   if (info->varargs_save_offset)
24721     fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
24722
24723   if (info->total_size)
24724     fprintf (stderr, "\ttotal_size          = " HOST_WIDE_INT_PRINT_DEC"\n",
24725              info->total_size);
24726
24727   if (info->vars_size)
24728     fprintf (stderr, "\tvars_size           = " HOST_WIDE_INT_PRINT_DEC"\n",
24729              info->vars_size);
24730
24731   if (info->parm_size)
24732     fprintf (stderr, "\tparm_size           = %5d\n", info->parm_size);
24733
24734   if (info->fixed_size)
24735     fprintf (stderr, "\tfixed_size          = %5d\n", info->fixed_size);
24736
24737   if (info->gp_size)
24738     fprintf (stderr, "\tgp_size             = %5d\n", info->gp_size);
24739
24740   if (info->fp_size)
24741     fprintf (stderr, "\tfp_size             = %5d\n", info->fp_size);
24742
24743   if (info->altivec_size)
24744     fprintf (stderr, "\taltivec_size        = %5d\n", info->altivec_size);
24745
24746   if (info->vrsave_size)
24747     fprintf (stderr, "\tvrsave_size         = %5d\n", info->vrsave_size);
24748
24749   if (info->altivec_padding_size)
24750     fprintf (stderr, "\taltivec_padding_size= %5d\n",
24751              info->altivec_padding_size);
24752
24753   if (info->cr_size)
24754     fprintf (stderr, "\tcr_size             = %5d\n", info->cr_size);
24755
24756   if (info->save_size)
24757     fprintf (stderr, "\tsave_size           = %5d\n", info->save_size);
24758
24759   if (info->reg_size != 4)
24760     fprintf (stderr, "\treg_size            = %5d\n", info->reg_size);
24761
24762     fprintf (stderr, "\tsave-strategy       =  %04x\n", info->savres_strategy);
24763
24764   if (info->abi == ABI_DARWIN)
24765     fprintf (stderr, "\tWORLD_SAVE_P        = %5d\n", WORLD_SAVE_P(info));
24766
24767   fprintf (stderr, "\n");
24768 }
24769
24770 rtx
24771 rs6000_return_addr (int count, rtx frame)
24772 {
24773   /* We can't use get_hard_reg_initial_val for LR when count == 0 if LR
24774      is trashed by the prologue, as it is for PIC on ABI_V4 and Darwin.  */
24775   if (count != 0
24776       || ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN) && flag_pic))
24777     {
24778       cfun->machine->ra_needs_full_frame = 1;
24779
24780       if (count == 0)
24781         /* FRAME is set to frame_pointer_rtx by the generic code, but that
24782            is good for loading 0(r1) only when !FRAME_GROWS_DOWNWARD.  */
24783         frame = stack_pointer_rtx;
24784       rtx prev_frame_addr = memory_address (Pmode, frame);
24785       rtx prev_frame = copy_to_reg (gen_rtx_MEM (Pmode, prev_frame_addr));
24786       rtx lr_save_off = plus_constant (Pmode,
24787                                        prev_frame, RETURN_ADDRESS_OFFSET);
24788       rtx lr_save_addr = memory_address (Pmode, lr_save_off);
24789       return gen_rtx_MEM (Pmode, lr_save_addr);
24790     }
24791
24792   cfun->machine->ra_need_lr = 1;
24793   return get_hard_reg_initial_val (Pmode, LR_REGNO);
24794 }
24795
24796 /* Helper function for rs6000_function_ok_for_sibcall.  */
24797
24798 static bool
24799 rs6000_decl_ok_for_sibcall (tree decl)
24800 {
24801   /* Sibcalls are always fine for the Darwin ABI.  */
24802   if (DEFAULT_ABI == ABI_DARWIN)
24803     return true;
24804
24805   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
24806     {
24807       /* Under the AIX or ELFv2 ABIs we can't allow calls to non-local
24808          functions, because the callee may have a different TOC pointer to
24809          the caller and there's no way to ensure we restore the TOC when
24810          we return.  */
24811       if (!decl || DECL_EXTERNAL (decl) || DECL_WEAK (decl)
24812           || !(*targetm.binds_local_p) (decl))
24813         return false;
24814
24815       /* Similarly, if the caller preserves the TOC pointer and the callee
24816          doesn't (or vice versa), proper TOC setup or restoration will be
24817          missed.  For example, suppose A, B, and C are in the same binary
24818          and A -> B -> C.  A and B preserve the TOC pointer but C does not,
24819          and B -> C is eligible as a sibcall.  A will call B through its
24820          local entry point, so A will not restore its TOC itself.  B calls
24821          C with a sibcall, so it will not restore the TOC.  C does not
24822          preserve the TOC, so it may clobber r2 with impunity.  Returning
24823          from C will result in a corrupted TOC for A.  */
24824       else if (rs6000_fndecl_pcrel_p (decl) != rs6000_pcrel_p (cfun))
24825         return false;
24826
24827       else
24828         return true;
24829     }
24830
24831   /*  With the secure-plt SYSV ABI we can't make non-local calls when
24832       -fpic/PIC because the plt call stubs use r30.  */
24833   if (DEFAULT_ABI != ABI_V4
24834       || (TARGET_SECURE_PLT
24835           && flag_pic
24836           && (!decl || !((*targetm.binds_local_p) (decl)))))
24837     return false;
24838
24839   return true;
24840 }
24841
24842 /* Say whether a function is a candidate for sibcall handling or not.  */
24843
24844 static bool
24845 rs6000_function_ok_for_sibcall (tree decl, tree exp)
24846 {
24847   tree fntype;
24848
24849   /* The sibcall epilogue may clobber the static chain register.
24850      ??? We could work harder and avoid that, but it's probably
24851      not worth the hassle in practice.  */
24852   if (CALL_EXPR_STATIC_CHAIN (exp))
24853     return false;
24854
24855   if (decl)
24856     fntype = TREE_TYPE (decl);
24857   else
24858     fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (exp)));
24859
24860   /* We can't do it if the called function has more vector parameters
24861      than the current function; there's nowhere to put the VRsave code.  */
24862   if (TARGET_ALTIVEC_ABI
24863       && TARGET_ALTIVEC_VRSAVE
24864       && !(decl && decl == current_function_decl))
24865     {
24866       function_args_iterator args_iter;
24867       tree type;
24868       int nvreg = 0;
24869
24870       /* Functions with vector parameters are required to have a
24871          prototype, so the argument type info must be available
24872          here.  */
24873       FOREACH_FUNCTION_ARGS(fntype, type, args_iter)
24874         if (TREE_CODE (type) == VECTOR_TYPE
24875             && ALTIVEC_OR_VSX_VECTOR_MODE (TYPE_MODE (type)))
24876           nvreg++;
24877
24878       FOREACH_FUNCTION_ARGS(TREE_TYPE (current_function_decl), type, args_iter)
24879         if (TREE_CODE (type) == VECTOR_TYPE
24880             && ALTIVEC_OR_VSX_VECTOR_MODE (TYPE_MODE (type)))
24881           nvreg--;
24882
24883       if (nvreg > 0)
24884         return false;
24885     }
24886
24887   if (rs6000_decl_ok_for_sibcall (decl))
24888     {
24889       tree attr_list = TYPE_ATTRIBUTES (fntype);
24890
24891       if (!lookup_attribute ("longcall", attr_list)
24892           || lookup_attribute ("shortcall", attr_list))
24893         return true;
24894     }
24895
24896   return false;
24897 }
24898
24899 static int
24900 rs6000_ra_ever_killed (void)
24901 {
24902   rtx_insn *top;
24903   rtx reg;
24904   rtx_insn *insn;
24905
24906   if (cfun->is_thunk)
24907     return 0;
24908
24909   if (cfun->machine->lr_save_state)
24910     return cfun->machine->lr_save_state - 1;
24911
24912   /* regs_ever_live has LR marked as used if any sibcalls are present,
24913      but this should not force saving and restoring in the
24914      pro/epilogue.  Likewise, reg_set_between_p thinks a sibcall
24915      clobbers LR, so that is inappropriate.  */
24916
24917   /* Also, the prologue can generate a store into LR that
24918      doesn't really count, like this:
24919
24920         move LR->R0
24921         bcl to set PIC register
24922         move LR->R31
24923         move R0->LR
24924
24925      When we're called from the epilogue, we need to avoid counting
24926      this as a store.  */
24927
24928   push_topmost_sequence ();
24929   top = get_insns ();
24930   pop_topmost_sequence ();
24931   reg = gen_rtx_REG (Pmode, LR_REGNO);
24932
24933   for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
24934     {
24935       if (INSN_P (insn))
24936         {
24937           if (CALL_P (insn))
24938             {
24939               if (!SIBLING_CALL_P (insn))
24940                 return 1;
24941             }
24942           else if (find_regno_note (insn, REG_INC, LR_REGNO))
24943             return 1;
24944           else if (set_of (reg, insn) != NULL_RTX
24945                    && !prologue_epilogue_contains (insn))
24946             return 1;
24947         }
24948     }
24949   return 0;
24950 }
24951 \f
24952 /* Emit instructions needed to load the TOC register.
24953    This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
24954    a constant pool; or for SVR4 -fpic.  */
24955
24956 void
24957 rs6000_emit_load_toc_table (int fromprolog)
24958 {
24959   rtx dest;
24960   dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
24961
24962   if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI == ABI_V4 && flag_pic)
24963     {
24964       char buf[30];
24965       rtx lab, tmp1, tmp2, got;
24966
24967       lab = gen_label_rtx ();
24968       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (lab));
24969       lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
24970       if (flag_pic == 2)
24971         {
24972           got = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (toc_label_name));
24973           need_toc_init = 1;
24974         }
24975       else
24976         got = rs6000_got_sym ();
24977       tmp1 = tmp2 = dest;
24978       if (!fromprolog)
24979         {
24980           tmp1 = gen_reg_rtx (Pmode);
24981           tmp2 = gen_reg_rtx (Pmode);
24982         }
24983       emit_insn (gen_load_toc_v4_PIC_1 (lab));
24984       emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
24985       emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
24986       emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
24987     }
24988   else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
24989     {
24990       emit_insn (gen_load_toc_v4_pic_si ());
24991       emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
24992     }
24993   else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 2)
24994     {
24995       char buf[30];
24996       rtx temp0 = (fromprolog
24997                    ? gen_rtx_REG (Pmode, 0)
24998                    : gen_reg_rtx (Pmode));
24999
25000       if (fromprolog)
25001         {
25002           rtx symF, symL;
25003
25004           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
25005           symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
25006
25007           ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
25008           symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
25009
25010           emit_insn (gen_load_toc_v4_PIC_1 (symF));
25011           emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
25012           emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest, symL, symF));
25013         }
25014       else
25015         {
25016           rtx tocsym, lab;
25017
25018           tocsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (toc_label_name));
25019           need_toc_init = 1;
25020           lab = gen_label_rtx ();
25021           emit_insn (gen_load_toc_v4_PIC_1b (tocsym, lab));
25022           emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
25023           if (TARGET_LINK_STACK)
25024             emit_insn (gen_addsi3 (dest, dest, GEN_INT (4)));
25025           emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
25026         }
25027       emit_insn (gen_addsi3 (dest, temp0, dest));
25028     }
25029   else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
25030     {
25031       /* This is for AIX code running in non-PIC ELF32.  */
25032       rtx realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (toc_label_name));
25033
25034       need_toc_init = 1;
25035       emit_insn (gen_elf_high (dest, realsym));
25036       emit_insn (gen_elf_low (dest, dest, realsym));
25037     }
25038   else
25039     {
25040       gcc_assert (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2);
25041
25042       if (TARGET_32BIT)
25043         emit_insn (gen_load_toc_aix_si (dest));
25044       else
25045         emit_insn (gen_load_toc_aix_di (dest));
25046     }
25047 }
25048
25049 /* Emit instructions to restore the link register after determining where
25050    its value has been stored.  */
25051
25052 void
25053 rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
25054 {
25055   rs6000_stack_t *info = rs6000_stack_info ();
25056   rtx operands[2];
25057
25058   operands[0] = source;
25059   operands[1] = scratch;
25060
25061   if (info->lr_save_p)
25062     {
25063       rtx frame_rtx = stack_pointer_rtx;
25064       HOST_WIDE_INT sp_offset = 0;
25065       rtx tmp;
25066
25067       if (frame_pointer_needed
25068           || cfun->calls_alloca
25069           || info->total_size > 32767)
25070         {
25071           tmp = gen_frame_mem (Pmode, frame_rtx);
25072           emit_move_insn (operands[1], tmp);
25073           frame_rtx = operands[1];
25074         }
25075       else if (info->push_p)
25076         sp_offset = info->total_size;
25077
25078       tmp = plus_constant (Pmode, frame_rtx,
25079                            info->lr_save_offset + sp_offset);
25080       tmp = gen_frame_mem (Pmode, tmp);
25081       emit_move_insn (tmp, operands[0]);
25082     }
25083   else
25084     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO), operands[0]);
25085
25086   /* Freeze lr_save_p.  We've just emitted rtl that depends on the
25087      state of lr_save_p so any change from here on would be a bug.  In
25088      particular, stop rs6000_ra_ever_killed from considering the SET
25089      of lr we may have added just above.  */ 
25090   cfun->machine->lr_save_state = info->lr_save_p + 1;
25091 }
25092
25093 static GTY(()) alias_set_type set = -1;
25094
25095 alias_set_type
25096 get_TOC_alias_set (void)
25097 {
25098   if (set == -1)
25099     set = new_alias_set ();
25100   return set;
25101 }
25102
25103 /* This returns nonzero if the current function uses the TOC.  This is
25104    determined by the presence of (use (unspec ... UNSPEC_TOC)), which
25105    is generated by the ABI_V4 load_toc_* patterns.
25106    Return 2 instead of 1 if the load_toc_* pattern is in the function
25107    partition that doesn't start the function.  */
25108 #if TARGET_ELF
25109 static int
25110 uses_TOC (void)
25111 {
25112   rtx_insn *insn;
25113   int ret = 1;
25114
25115   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
25116     {
25117       if (INSN_P (insn))
25118         {
25119           rtx pat = PATTERN (insn);
25120           int i;
25121
25122           if (GET_CODE (pat) == PARALLEL)
25123             for (i = 0; i < XVECLEN (pat, 0); i++)
25124               {
25125                 rtx sub = XVECEXP (pat, 0, i);
25126                 if (GET_CODE (sub) == USE)
25127                   {
25128                     sub = XEXP (sub, 0);
25129                     if (GET_CODE (sub) == UNSPEC
25130                         && XINT (sub, 1) == UNSPEC_TOC)
25131                       return ret;
25132                   }
25133               }
25134         }
25135       else if (crtl->has_bb_partition
25136                && NOTE_P (insn)
25137                && NOTE_KIND (insn) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
25138         ret = 2;
25139     }
25140   return 0;
25141 }
25142 #endif
25143
25144 rtx
25145 create_TOC_reference (rtx symbol, rtx largetoc_reg)
25146 {
25147   rtx tocrel, tocreg, hi;
25148
25149   if (TARGET_DEBUG_ADDR)
25150     {
25151       if (SYMBOL_REF_P (symbol))
25152         fprintf (stderr, "\ncreate_TOC_reference, (symbol_ref %s)\n",
25153                  XSTR (symbol, 0));
25154       else
25155         {
25156           fprintf (stderr, "\ncreate_TOC_reference, code %s:\n",
25157                    GET_RTX_NAME (GET_CODE (symbol)));
25158           debug_rtx (symbol);
25159         }
25160     }
25161
25162   if (!can_create_pseudo_p ())
25163     df_set_regs_ever_live (TOC_REGISTER, true);
25164
25165   tocreg = gen_rtx_REG (Pmode, TOC_REGISTER);
25166   tocrel = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, symbol, tocreg), UNSPEC_TOCREL);
25167   if (TARGET_CMODEL == CMODEL_SMALL || can_create_pseudo_p ())
25168     return tocrel;
25169
25170   hi = gen_rtx_HIGH (Pmode, copy_rtx (tocrel));
25171   if (largetoc_reg != NULL)
25172     {
25173       emit_move_insn (largetoc_reg, hi);
25174       hi = largetoc_reg;
25175     }
25176   return gen_rtx_LO_SUM (Pmode, hi, tocrel);
25177 }
25178
25179 /* Issue assembly directives that create a reference to the given DWARF
25180    FRAME_TABLE_LABEL from the current function section.  */
25181 void
25182 rs6000_aix_asm_output_dwarf_table_ref (char * frame_table_label)
25183 {
25184   fprintf (asm_out_file, "\t.ref %s\n",
25185            (* targetm.strip_name_encoding) (frame_table_label));
25186 }
25187 \f
25188 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
25189    and the change to the stack pointer.  */
25190
25191 static void
25192 rs6000_emit_stack_tie (rtx fp, bool hard_frame_needed)
25193 {
25194   rtvec p;
25195   int i;
25196   rtx regs[3];
25197
25198   i = 0;
25199   regs[i++] = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
25200   if (hard_frame_needed)
25201     regs[i++] = gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM);
25202   if (!(REGNO (fp) == STACK_POINTER_REGNUM
25203         || (hard_frame_needed
25204             && REGNO (fp) == HARD_FRAME_POINTER_REGNUM)))
25205     regs[i++] = fp;
25206
25207   p = rtvec_alloc (i);
25208   while (--i >= 0)
25209     {
25210       rtx mem = gen_frame_mem (BLKmode, regs[i]);
25211       RTVEC_ELT (p, i) = gen_rtx_SET (mem, const0_rtx);
25212     }
25213
25214   emit_insn (gen_stack_tie (gen_rtx_PARALLEL (VOIDmode, p)));
25215 }
25216
25217 /* Allocate SIZE_INT bytes on the stack using a store with update style insn
25218    and set the appropriate attributes for the generated insn.  Return the
25219    first insn which adjusts the stack pointer or the last insn before
25220    the stack adjustment loop. 
25221
25222    SIZE_INT is used to create the CFI note for the allocation.
25223
25224    SIZE_RTX is an rtx containing the size of the adjustment.  Note that
25225    since stacks grow to lower addresses its runtime value is -SIZE_INT.
25226
25227    ORIG_SP contains the backchain value that must be stored at *sp.  */
25228
25229 static rtx_insn *
25230 rs6000_emit_allocate_stack_1 (HOST_WIDE_INT size_int, rtx orig_sp)
25231 {
25232   rtx_insn *insn;
25233
25234   rtx size_rtx = GEN_INT (-size_int);
25235   if (size_int > 32767)
25236     {
25237       rtx tmp_reg = gen_rtx_REG (Pmode, 0);
25238       /* Need a note here so that try_split doesn't get confused.  */
25239       if (get_last_insn () == NULL_RTX)
25240         emit_note (NOTE_INSN_DELETED);
25241       insn = emit_move_insn (tmp_reg, size_rtx);
25242       try_split (PATTERN (insn), insn, 0);
25243       size_rtx = tmp_reg;
25244     }
25245   
25246   if (TARGET_32BIT)
25247     insn = emit_insn (gen_movsi_update_stack (stack_pointer_rtx,
25248                                               stack_pointer_rtx,
25249                                               size_rtx,
25250                                               orig_sp));
25251   else
25252     insn = emit_insn (gen_movdi_update_stack (stack_pointer_rtx,
25253                                               stack_pointer_rtx,
25254                                               size_rtx,
25255                                               orig_sp));
25256   rtx par = PATTERN (insn);
25257   gcc_assert (GET_CODE (par) == PARALLEL);
25258   rtx set = XVECEXP (par, 0, 0);
25259   gcc_assert (GET_CODE (set) == SET);
25260   rtx mem = SET_DEST (set);
25261   gcc_assert (MEM_P (mem));
25262   MEM_NOTRAP_P (mem) = 1;
25263   set_mem_alias_set (mem, get_frame_alias_set ());
25264
25265   RTX_FRAME_RELATED_P (insn) = 1;
25266   add_reg_note (insn, REG_FRAME_RELATED_EXPR,
25267                 gen_rtx_SET (stack_pointer_rtx,
25268                              gen_rtx_PLUS (Pmode,
25269                                            stack_pointer_rtx,
25270                                            GEN_INT (-size_int))));
25271
25272   /* Emit a blockage to ensure the allocation/probing insns are
25273      not optimized, combined, removed, etc.  Add REG_STACK_CHECK
25274      note for similar reasons.  */
25275   if (flag_stack_clash_protection)
25276     {
25277       add_reg_note (insn, REG_STACK_CHECK, const0_rtx);
25278       emit_insn (gen_blockage ());
25279     }
25280
25281   return insn;
25282 }
25283
25284 static HOST_WIDE_INT
25285 get_stack_clash_protection_probe_interval (void)
25286 {
25287   return (HOST_WIDE_INT_1U
25288           << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL));
25289 }
25290
25291 static HOST_WIDE_INT
25292 get_stack_clash_protection_guard_size (void)
25293 {
25294   return (HOST_WIDE_INT_1U
25295           << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE));
25296 }
25297
25298 /* Allocate ORIG_SIZE bytes on the stack and probe the newly
25299    allocated space every STACK_CLASH_PROTECTION_PROBE_INTERVAL bytes.
25300
25301    COPY_REG, if non-null, should contain a copy of the original
25302    stack pointer at exit from this function.
25303
25304    This is subtly different than the Ada probing in that it tries hard to
25305    prevent attacks that jump the stack guard.  Thus it is never allowed to
25306    allocate more than STACK_CLASH_PROTECTION_PROBE_INTERVAL bytes of stack
25307    space without a suitable probe.  */
25308 static rtx_insn *
25309 rs6000_emit_probe_stack_range_stack_clash (HOST_WIDE_INT orig_size,
25310                                            rtx copy_reg)
25311 {
25312   rtx orig_sp = copy_reg;
25313
25314   HOST_WIDE_INT probe_interval = get_stack_clash_protection_probe_interval ();
25315
25316   /* Round the size down to a multiple of PROBE_INTERVAL.  */
25317   HOST_WIDE_INT rounded_size = ROUND_DOWN (orig_size, probe_interval);
25318
25319   /* If explicitly requested,
25320        or the rounded size is not the same as the original size
25321        or the the rounded size is greater than a page,
25322      then we will need a copy of the original stack pointer.  */
25323   if (rounded_size != orig_size
25324       || rounded_size > probe_interval
25325       || copy_reg)
25326     {
25327       /* If the caller did not request a copy of the incoming stack
25328          pointer, then we use r0 to hold the copy.  */
25329       if (!copy_reg)
25330         orig_sp = gen_rtx_REG (Pmode, 0);
25331       emit_move_insn (orig_sp, stack_pointer_rtx);
25332     }
25333
25334   /* There's three cases here.
25335
25336      One is a single probe which is the most common and most efficiently
25337      implemented as it does not have to have a copy of the original
25338      stack pointer if there are no residuals.
25339
25340      Second is unrolled allocation/probes which we use if there's just
25341      a few of them.  It needs to save the original stack pointer into a
25342      temporary for use as a source register in the allocation/probe.
25343
25344      Last is a loop.  This is the most uncommon case and least efficient.  */
25345   rtx_insn *retval = NULL;
25346   if (rounded_size == probe_interval)
25347     {
25348       retval = rs6000_emit_allocate_stack_1 (probe_interval, stack_pointer_rtx);
25349
25350       dump_stack_clash_frame_info (PROBE_INLINE, rounded_size != orig_size);
25351     }
25352   else if (rounded_size <= 8 * probe_interval)
25353     {
25354       /* The ABI requires using the store with update insns to allocate
25355          space and store the backchain into the stack
25356
25357          So we save the current stack pointer into a temporary, then
25358          emit the store-with-update insns to store the saved stack pointer
25359          into the right location in each new page.  */
25360       for (int i = 0; i < rounded_size; i += probe_interval)
25361         {
25362           rtx_insn *insn
25363             = rs6000_emit_allocate_stack_1 (probe_interval, orig_sp);
25364
25365           /* Save the first stack adjustment in RETVAL.  */
25366           if (i == 0)
25367             retval = insn;
25368         }
25369
25370       dump_stack_clash_frame_info (PROBE_INLINE, rounded_size != orig_size);
25371     }
25372   else
25373     {
25374       /* Compute the ending address.  */
25375       rtx end_addr
25376         = copy_reg ? gen_rtx_REG (Pmode, 0) : gen_rtx_REG (Pmode, 12);
25377       rtx rs = GEN_INT (-rounded_size);
25378       rtx_insn *insn;
25379       if (add_operand (rs, Pmode))
25380         insn = emit_insn (gen_add3_insn (end_addr, stack_pointer_rtx, rs));
25381       else
25382         {
25383           emit_move_insn (end_addr, GEN_INT (-rounded_size));
25384           insn = emit_insn (gen_add3_insn (end_addr, end_addr,
25385                                            stack_pointer_rtx));
25386           /* Describe the effect of INSN to the CFI engine.  */
25387           add_reg_note (insn, REG_FRAME_RELATED_EXPR,
25388                         gen_rtx_SET (end_addr,
25389                                      gen_rtx_PLUS (Pmode, stack_pointer_rtx,
25390                                                    rs)));
25391         }
25392       RTX_FRAME_RELATED_P (insn) = 1;
25393
25394       /* Emit the loop.  */
25395       if (TARGET_64BIT)
25396         retval = emit_insn (gen_probe_stack_rangedi (stack_pointer_rtx,
25397                                                      stack_pointer_rtx, orig_sp,
25398                                                      end_addr));
25399       else
25400         retval = emit_insn (gen_probe_stack_rangesi (stack_pointer_rtx,
25401                                                      stack_pointer_rtx, orig_sp,
25402                                                      end_addr));
25403       RTX_FRAME_RELATED_P (retval) = 1;
25404       /* Describe the effect of INSN to the CFI engine.  */
25405       add_reg_note (retval, REG_FRAME_RELATED_EXPR,
25406                     gen_rtx_SET (stack_pointer_rtx, end_addr));
25407
25408       /* Emit a blockage to ensure the allocation/probing insns are
25409          not optimized, combined, removed, etc.  Other cases handle this
25410          within their call to rs6000_emit_allocate_stack_1.  */
25411       emit_insn (gen_blockage ());
25412
25413       dump_stack_clash_frame_info (PROBE_LOOP, rounded_size != orig_size);
25414     }
25415
25416   if (orig_size != rounded_size)
25417     {
25418       /* Allocate (and implicitly probe) any residual space.   */
25419       HOST_WIDE_INT residual = orig_size - rounded_size;
25420
25421       rtx_insn *insn = rs6000_emit_allocate_stack_1 (residual, orig_sp);
25422
25423       /* If the residual was the only allocation, then we can return the
25424          allocating insn.  */
25425       if (!retval)
25426         retval = insn;
25427     }
25428
25429   return retval;
25430 }
25431
25432 /* Emit the correct code for allocating stack space, as insns.
25433    If COPY_REG, make sure a copy of the old frame is left there.
25434    The generated code may use hard register 0 as a temporary.  */
25435
25436 static rtx_insn *
25437 rs6000_emit_allocate_stack (HOST_WIDE_INT size, rtx copy_reg, int copy_off)
25438 {
25439   rtx_insn *insn;
25440   rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
25441   rtx tmp_reg = gen_rtx_REG (Pmode, 0);
25442   rtx todec = gen_int_mode (-size, Pmode);
25443
25444   if (INTVAL (todec) != -size)
25445     {
25446       warning (0, "stack frame too large");
25447       emit_insn (gen_trap ());
25448       return 0;
25449     }
25450
25451   if (crtl->limit_stack)
25452     {
25453       if (REG_P (stack_limit_rtx)
25454           && REGNO (stack_limit_rtx) > 1
25455           && REGNO (stack_limit_rtx) <= 31)
25456         {
25457           rtx_insn *insn
25458             = gen_add3_insn (tmp_reg, stack_limit_rtx, GEN_INT (size));
25459           gcc_assert (insn);
25460           emit_insn (insn);
25461           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg, const0_rtx));
25462         }
25463       else if (SYMBOL_REF_P (stack_limit_rtx)
25464                && TARGET_32BIT
25465                && DEFAULT_ABI == ABI_V4
25466                && !flag_pic)
25467         {
25468           rtx toload = gen_rtx_CONST (VOIDmode,
25469                                       gen_rtx_PLUS (Pmode,
25470                                                     stack_limit_rtx,
25471                                                     GEN_INT (size)));
25472
25473           emit_insn (gen_elf_high (tmp_reg, toload));
25474           emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
25475           emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
25476                                     const0_rtx));
25477         }
25478       else
25479         warning (0, "stack limit expression is not supported");
25480     }
25481
25482   if (flag_stack_clash_protection)
25483     {
25484       if (size < get_stack_clash_protection_guard_size ())
25485         dump_stack_clash_frame_info (NO_PROBE_SMALL_FRAME, true);
25486       else
25487         {
25488           rtx_insn *insn = rs6000_emit_probe_stack_range_stack_clash (size,
25489                                                                       copy_reg);
25490
25491           /* If we asked for a copy with an offset, then we still need add in
25492              the offset.  */
25493           if (copy_reg && copy_off)
25494             emit_insn (gen_add3_insn (copy_reg, copy_reg, GEN_INT (copy_off)));
25495           return insn;
25496         }
25497     }
25498
25499   if (copy_reg)
25500     {
25501       if (copy_off != 0)
25502         emit_insn (gen_add3_insn (copy_reg, stack_reg, GEN_INT (copy_off)));
25503       else
25504         emit_move_insn (copy_reg, stack_reg);
25505     }
25506
25507   /* Since we didn't use gen_frame_mem to generate the MEM, grab
25508      it now and set the alias set/attributes. The above gen_*_update
25509      calls will generate a PARALLEL with the MEM set being the first
25510      operation. */
25511   insn = rs6000_emit_allocate_stack_1 (size, stack_reg);
25512   return insn;
25513 }
25514
25515 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
25516
25517 #if PROBE_INTERVAL > 32768
25518 #error Cannot use indexed addressing mode for stack probing
25519 #endif
25520
25521 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
25522    inclusive.  These are offsets from the current stack pointer.  */
25523
25524 static void
25525 rs6000_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
25526 {
25527   /* See if we have a constant small number of probes to generate.  If so,
25528      that's the easy case.  */
25529   if (first + size <= 32768)
25530     {
25531       HOST_WIDE_INT i;
25532
25533       /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
25534          it exceeds SIZE.  If only one probe is needed, this will not
25535          generate any code.  Then probe at FIRST + SIZE.  */
25536       for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
25537         emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
25538                                          -(first + i)));
25539
25540       emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
25541                                        -(first + size)));
25542     }
25543
25544   /* Otherwise, do the same as above, but in a loop.  Note that we must be
25545      extra careful with variables wrapping around because we might be at
25546      the very top (or the very bottom) of the address space and we have
25547      to be able to handle this case properly; in particular, we use an
25548      equality test for the loop condition.  */
25549   else
25550     {
25551       HOST_WIDE_INT rounded_size;
25552       rtx r12 = gen_rtx_REG (Pmode, 12);
25553       rtx r0 = gen_rtx_REG (Pmode, 0);
25554
25555       /* Sanity check for the addressing mode we're going to use.  */
25556       gcc_assert (first <= 32768);
25557
25558       /* Step 1: round SIZE to the previous multiple of the interval.  */
25559
25560       rounded_size = ROUND_DOWN (size, PROBE_INTERVAL);
25561
25562
25563       /* Step 2: compute initial and final value of the loop counter.  */
25564
25565       /* TEST_ADDR = SP + FIRST.  */
25566       emit_insn (gen_rtx_SET (r12, plus_constant (Pmode, stack_pointer_rtx,
25567                                                   -first)));
25568
25569       /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE.  */
25570       if (rounded_size > 32768)
25571         {
25572           emit_move_insn (r0, GEN_INT (-rounded_size));
25573           emit_insn (gen_rtx_SET (r0, gen_rtx_PLUS (Pmode, r12, r0)));
25574         }
25575       else
25576         emit_insn (gen_rtx_SET (r0, plus_constant (Pmode, r12,
25577                                                    -rounded_size)));
25578
25579
25580       /* Step 3: the loop
25581
25582          do
25583            {
25584              TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
25585              probe at TEST_ADDR
25586            }
25587          while (TEST_ADDR != LAST_ADDR)
25588
25589          probes at FIRST + N * PROBE_INTERVAL for values of N from 1
25590          until it is equal to ROUNDED_SIZE.  */
25591
25592       if (TARGET_64BIT)
25593         emit_insn (gen_probe_stack_rangedi (r12, r12, stack_pointer_rtx, r0));
25594       else
25595         emit_insn (gen_probe_stack_rangesi (r12, r12, stack_pointer_rtx, r0));
25596
25597
25598       /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
25599          that SIZE is equal to ROUNDED_SIZE.  */
25600
25601       if (size != rounded_size)
25602         emit_stack_probe (plus_constant (Pmode, r12, rounded_size - size));
25603     }
25604 }
25605
25606 /* Probe a range of stack addresses from REG1 to REG2 inclusive.  These are
25607    addresses, not offsets.  */
25608
25609 static const char *
25610 output_probe_stack_range_1 (rtx reg1, rtx reg2)
25611 {
25612   static int labelno = 0;
25613   char loop_lab[32];
25614   rtx xops[2];
25615
25616   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno++);
25617
25618   /* Loop.  */
25619   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
25620
25621   /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
25622   xops[0] = reg1;
25623   xops[1] = GEN_INT (-PROBE_INTERVAL);
25624   output_asm_insn ("addi %0,%0,%1", xops);
25625
25626   /* Probe at TEST_ADDR.  */
25627   xops[1] = gen_rtx_REG (Pmode, 0);
25628   output_asm_insn ("stw %1,0(%0)", xops);
25629
25630   /* Test if TEST_ADDR == LAST_ADDR.  */
25631   xops[1] = reg2;
25632   if (TARGET_64BIT)
25633     output_asm_insn ("cmpd 0,%0,%1", xops);
25634   else
25635     output_asm_insn ("cmpw 0,%0,%1", xops);
25636
25637   /* Branch.  */
25638   fputs ("\tbne 0,", asm_out_file);
25639   assemble_name_raw (asm_out_file, loop_lab);
25640   fputc ('\n', asm_out_file);
25641
25642   return "";
25643 }
25644
25645 /* This function is called when rs6000_frame_related is processing
25646    SETs within a PARALLEL, and returns whether the REGNO save ought to
25647    be marked RTX_FRAME_RELATED_P.  The PARALLELs involved are those
25648    for out-of-line register save functions, store multiple, and the
25649    Darwin world_save.  They may contain registers that don't really
25650    need saving.  */
25651
25652 static bool
25653 interesting_frame_related_regno (unsigned int regno)
25654 {
25655   /* Saves apparently of r0 are actually saving LR.  It doesn't make
25656      sense to substitute the regno here to test save_reg_p (LR_REGNO).
25657      We *know* LR needs saving, and dwarf2cfi.c is able to deduce that
25658      (set (mem) (r0)) is saving LR from a prior (set (r0) (lr)) marked
25659      as frame related.  */
25660   if (regno == 0)
25661     return true;
25662   /* If we see CR2 then we are here on a Darwin world save.  Saves of
25663      CR2 signify the whole CR is being saved.  This is a long-standing
25664      ABI wart fixed by ELFv2.  As for r0/lr there is no need to check
25665      that CR needs to be saved.  */
25666   if (regno == CR2_REGNO)
25667     return true;
25668   /* Omit frame info for any user-defined global regs.  If frame info
25669      is supplied for them, frame unwinding will restore a user reg.
25670      Also omit frame info for any reg we don't need to save, as that
25671      bloats frame info and can cause problems with shrink wrapping.
25672      Since global regs won't be seen as needing to be saved, both of
25673      these conditions are covered by save_reg_p.  */
25674   return save_reg_p (regno);
25675 }
25676
25677 /* Probe a range of stack addresses from REG1 to REG3 inclusive.  These are
25678    addresses, not offsets.
25679
25680    REG2 contains the backchain that must be stored into *sp at each allocation.
25681
25682    This is subtly different than the Ada probing above in that it tries hard
25683    to prevent attacks that jump the stack guard.  Thus, it is never allowed
25684    to allocate more than PROBE_INTERVAL bytes of stack space without a
25685    suitable probe.  */
25686
25687 static const char *
25688 output_probe_stack_range_stack_clash (rtx reg1, rtx reg2, rtx reg3)
25689 {
25690   static int labelno = 0;
25691   char loop_lab[32];
25692   rtx xops[3];
25693
25694   HOST_WIDE_INT probe_interval = get_stack_clash_protection_probe_interval ();
25695
25696   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno++);
25697
25698   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
25699
25700   /* This allocates and probes.  */
25701   xops[0] = reg1;
25702   xops[1] = reg2;
25703   xops[2] = GEN_INT (-probe_interval);
25704   if (TARGET_64BIT)
25705     output_asm_insn ("stdu %1,%2(%0)", xops);
25706   else
25707     output_asm_insn ("stwu %1,%2(%0)", xops);
25708
25709   /* Jump to LOOP_LAB if TEST_ADDR != LAST_ADDR.  */
25710   xops[0] = reg1;
25711   xops[1] = reg3;
25712   if (TARGET_64BIT)
25713     output_asm_insn ("cmpd 0,%0,%1", xops);
25714   else
25715     output_asm_insn ("cmpw 0,%0,%1", xops);
25716
25717   fputs ("\tbne 0,", asm_out_file);
25718   assemble_name_raw (asm_out_file, loop_lab);
25719   fputc ('\n', asm_out_file);
25720
25721   return "";
25722 }
25723
25724 /* Wrapper around the output_probe_stack_range routines.  */
25725 const char *
25726 output_probe_stack_range (rtx reg1, rtx reg2, rtx reg3)
25727 {
25728   if (flag_stack_clash_protection)
25729     return output_probe_stack_range_stack_clash (reg1, reg2, reg3);
25730   else
25731     return output_probe_stack_range_1 (reg1, reg3);
25732 }
25733
25734 /* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
25735    with (plus:P (reg 1) VAL), and with REG2 replaced with REPL2 if REG2
25736    is not NULL.  It would be nice if dwarf2out_frame_debug_expr could
25737    deduce these equivalences by itself so it wasn't necessary to hold
25738    its hand so much.  Don't be tempted to always supply d2_f_d_e with
25739    the actual cfa register, ie. r31 when we are using a hard frame
25740    pointer.  That fails when saving regs off r1, and sched moves the
25741    r31 setup past the reg saves.  */
25742
25743 static rtx_insn *
25744 rs6000_frame_related (rtx_insn *insn, rtx reg, HOST_WIDE_INT val,
25745                       rtx reg2, rtx repl2)
25746 {
25747   rtx repl;
25748
25749   if (REGNO (reg) == STACK_POINTER_REGNUM)
25750     {
25751       gcc_checking_assert (val == 0);
25752       repl = NULL_RTX;
25753     }
25754   else
25755     repl = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, STACK_POINTER_REGNUM),
25756                          GEN_INT (val));
25757
25758   rtx pat = PATTERN (insn);
25759   if (!repl && !reg2)
25760     {
25761       /* No need for any replacement.  Just set RTX_FRAME_RELATED_P.  */
25762       if (GET_CODE (pat) == PARALLEL)
25763         for (int i = 0; i < XVECLEN (pat, 0); i++)
25764           if (GET_CODE (XVECEXP (pat, 0, i)) == SET)
25765             {
25766               rtx set = XVECEXP (pat, 0, i);
25767
25768               if (!REG_P (SET_SRC (set))
25769                   || interesting_frame_related_regno (REGNO (SET_SRC (set))))
25770                 RTX_FRAME_RELATED_P (set) = 1;
25771             }
25772       RTX_FRAME_RELATED_P (insn) = 1;
25773       return insn;
25774     }
25775
25776   /* We expect that 'pat' is either a SET or a PARALLEL containing
25777      SETs (and possibly other stuff).  In a PARALLEL, all the SETs
25778      are important so they all have to be marked RTX_FRAME_RELATED_P.
25779      Call simplify_replace_rtx on the SETs rather than the whole insn
25780      so as to leave the other stuff alone (for example USE of r12).  */
25781
25782   set_used_flags (pat);
25783   if (GET_CODE (pat) == SET)
25784     {
25785       if (repl)
25786         pat = simplify_replace_rtx (pat, reg, repl);
25787       if (reg2)
25788         pat = simplify_replace_rtx (pat, reg2, repl2);
25789     }
25790   else if (GET_CODE (pat) == PARALLEL)
25791     {
25792       pat = shallow_copy_rtx (pat);
25793       XVEC (pat, 0) = shallow_copy_rtvec (XVEC (pat, 0));
25794
25795       for (int i = 0; i < XVECLEN (pat, 0); i++)
25796         if (GET_CODE (XVECEXP (pat, 0, i)) == SET)
25797           {
25798             rtx set = XVECEXP (pat, 0, i);
25799
25800             if (repl)
25801               set = simplify_replace_rtx (set, reg, repl);
25802             if (reg2)
25803               set = simplify_replace_rtx (set, reg2, repl2);
25804             XVECEXP (pat, 0, i) = set;
25805
25806             if (!REG_P (SET_SRC (set))
25807                 || interesting_frame_related_regno (REGNO (SET_SRC (set))))
25808               RTX_FRAME_RELATED_P (set) = 1;
25809           }
25810     }
25811   else
25812     gcc_unreachable ();
25813
25814   RTX_FRAME_RELATED_P (insn) = 1;
25815   add_reg_note (insn, REG_FRAME_RELATED_EXPR, copy_rtx_if_shared (pat));
25816
25817   return insn;
25818 }
25819
25820 /* Returns an insn that has a vrsave set operation with the
25821    appropriate CLOBBERs.  */
25822
25823 static rtx
25824 generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
25825 {
25826   int nclobs, i;
25827   rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
25828   rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
25829
25830   clobs[0]
25831     = gen_rtx_SET (vrsave,
25832                    gen_rtx_UNSPEC_VOLATILE (SImode,
25833                                             gen_rtvec (2, reg, vrsave),
25834                                             UNSPECV_SET_VRSAVE));
25835
25836   nclobs = 1;
25837
25838   /* We need to clobber the registers in the mask so the scheduler
25839      does not move sets to VRSAVE before sets of AltiVec registers.
25840
25841      However, if the function receives nonlocal gotos, reload will set
25842      all call saved registers live.  We will end up with:
25843
25844         (set (reg 999) (mem))
25845         (parallel [ (set (reg vrsave) (unspec blah))
25846                     (clobber (reg 999))])
25847
25848      The clobber will cause the store into reg 999 to be dead, and
25849      flow will attempt to delete an epilogue insn.  In this case, we
25850      need an unspec use/set of the register.  */
25851
25852   for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
25853     if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
25854       {
25855         if (!epiloguep || call_used_regs [i])
25856           clobs[nclobs++] = gen_hard_reg_clobber (V4SImode, i);
25857         else
25858           {
25859             rtx reg = gen_rtx_REG (V4SImode, i);
25860
25861             clobs[nclobs++]
25862               = gen_rtx_SET (reg,
25863                              gen_rtx_UNSPEC (V4SImode,
25864                                              gen_rtvec (1, reg), 27));
25865           }
25866       }
25867
25868   insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
25869
25870   for (i = 0; i < nclobs; ++i)
25871     XVECEXP (insn, 0, i) = clobs[i];
25872
25873   return insn;
25874 }
25875
25876 static rtx
25877 gen_frame_set (rtx reg, rtx frame_reg, int offset, bool store)
25878 {
25879   rtx addr, mem;
25880
25881   addr = gen_rtx_PLUS (Pmode, frame_reg, GEN_INT (offset));
25882   mem = gen_frame_mem (GET_MODE (reg), addr);
25883   return gen_rtx_SET (store ? mem : reg, store ? reg : mem);
25884 }
25885
25886 static rtx
25887 gen_frame_load (rtx reg, rtx frame_reg, int offset)
25888 {
25889   return gen_frame_set (reg, frame_reg, offset, false);
25890 }
25891
25892 static rtx
25893 gen_frame_store (rtx reg, rtx frame_reg, int offset)
25894 {
25895   return gen_frame_set (reg, frame_reg, offset, true);
25896 }
25897
25898 /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
25899    Save REGNO into [FRAME_REG + OFFSET] in mode MODE.  */
25900
25901 static rtx_insn *
25902 emit_frame_save (rtx frame_reg, machine_mode mode,
25903                  unsigned int regno, int offset, HOST_WIDE_INT frame_reg_to_sp)
25904 {
25905   rtx reg;
25906
25907   /* Some cases that need register indexed addressing.  */
25908   gcc_checking_assert (!(TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
25909                          || (TARGET_VSX && ALTIVEC_OR_VSX_VECTOR_MODE (mode)));
25910
25911   reg = gen_rtx_REG (mode, regno);
25912   rtx_insn *insn = emit_insn (gen_frame_store (reg, frame_reg, offset));
25913   return rs6000_frame_related (insn, frame_reg, frame_reg_to_sp,
25914                                NULL_RTX, NULL_RTX);
25915 }
25916
25917 /* Emit an offset memory reference suitable for a frame store, while
25918    converting to a valid addressing mode.  */
25919
25920 static rtx
25921 gen_frame_mem_offset (machine_mode mode, rtx reg, int offset)
25922 {
25923   return gen_frame_mem (mode, gen_rtx_PLUS (Pmode, reg, GEN_INT (offset)));
25924 }
25925
25926 #ifndef TARGET_FIX_AND_CONTINUE
25927 #define TARGET_FIX_AND_CONTINUE 0
25928 #endif
25929
25930 /* It's really GPR 13 or 14, FPR 14 and VR 20.  We need the smallest.  */
25931 #define FIRST_SAVRES_REGISTER FIRST_SAVED_GP_REGNO
25932 #define LAST_SAVRES_REGISTER 31
25933 #define N_SAVRES_REGISTERS (LAST_SAVRES_REGISTER - FIRST_SAVRES_REGISTER + 1)
25934
25935 enum {
25936   SAVRES_LR = 0x1,
25937   SAVRES_SAVE = 0x2,
25938   SAVRES_REG = 0x0c,
25939   SAVRES_GPR = 0,
25940   SAVRES_FPR = 4,
25941   SAVRES_VR  = 8
25942 };
25943
25944 static GTY(()) rtx savres_routine_syms[N_SAVRES_REGISTERS][12];
25945
25946 /* Temporary holding space for an out-of-line register save/restore
25947    routine name.  */
25948 static char savres_routine_name[30];
25949
25950 /* Return the name for an out-of-line register save/restore routine.
25951    We are saving/restoring GPRs if GPR is true.  */
25952
25953 static char *
25954 rs6000_savres_routine_name (int regno, int sel)
25955 {
25956   const char *prefix = "";
25957   const char *suffix = "";
25958
25959   /* Different targets are supposed to define
25960      {SAVE,RESTORE}_FP_{PREFIX,SUFFIX} with the idea that the needed
25961      routine name could be defined with:
25962
25963      sprintf (name, "%s%d%s", SAVE_FP_PREFIX, regno, SAVE_FP_SUFFIX)
25964
25965      This is a nice idea in practice, but in reality, things are
25966      complicated in several ways:
25967
25968      - ELF targets have save/restore routines for GPRs.
25969
25970      - PPC64 ELF targets have routines for save/restore of GPRs that
25971        differ in what they do with the link register, so having a set
25972        prefix doesn't work.  (We only use one of the save routines at
25973        the moment, though.)
25974
25975      - PPC32 elf targets have "exit" versions of the restore routines
25976        that restore the link register and can save some extra space.
25977        These require an extra suffix.  (There are also "tail" versions
25978        of the restore routines and "GOT" versions of the save routines,
25979        but we don't generate those at present.  Same problems apply,
25980        though.)
25981
25982      We deal with all this by synthesizing our own prefix/suffix and
25983      using that for the simple sprintf call shown above.  */
25984   if (DEFAULT_ABI == ABI_V4)
25985     {
25986       if (TARGET_64BIT)
25987         goto aix_names;
25988
25989       if ((sel & SAVRES_REG) == SAVRES_GPR)
25990         prefix = (sel & SAVRES_SAVE) ? "_savegpr_" : "_restgpr_";
25991       else if ((sel & SAVRES_REG) == SAVRES_FPR)
25992         prefix = (sel & SAVRES_SAVE) ? "_savefpr_" : "_restfpr_";
25993       else if ((sel & SAVRES_REG) == SAVRES_VR)
25994         prefix = (sel & SAVRES_SAVE) ? "_savevr_" : "_restvr_";
25995       else
25996         abort ();
25997
25998       if ((sel & SAVRES_LR))
25999         suffix = "_x";
26000     }
26001   else if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
26002     {
26003 #if !defined (POWERPC_LINUX) && !defined (POWERPC_FREEBSD)
26004       /* No out-of-line save/restore routines for GPRs on AIX.  */
26005       gcc_assert (!TARGET_AIX || (sel & SAVRES_REG) != SAVRES_GPR);
26006 #endif
26007
26008     aix_names:
26009       if ((sel & SAVRES_REG) == SAVRES_GPR)
26010         prefix = ((sel & SAVRES_SAVE)
26011                   ? ((sel & SAVRES_LR) ? "_savegpr0_" : "_savegpr1_")
26012                   : ((sel & SAVRES_LR) ? "_restgpr0_" : "_restgpr1_"));
26013       else if ((sel & SAVRES_REG) == SAVRES_FPR)
26014         {
26015 #if defined (POWERPC_LINUX) || defined (POWERPC_FREEBSD)
26016           if ((sel & SAVRES_LR))
26017             prefix = ((sel & SAVRES_SAVE) ? "_savefpr_" : "_restfpr_");
26018           else
26019 #endif
26020             {
26021               prefix = (sel & SAVRES_SAVE) ? SAVE_FP_PREFIX : RESTORE_FP_PREFIX;
26022               suffix = (sel & SAVRES_SAVE) ? SAVE_FP_SUFFIX : RESTORE_FP_SUFFIX;
26023             }
26024         }
26025       else if ((sel & SAVRES_REG) == SAVRES_VR)
26026         prefix = (sel & SAVRES_SAVE) ? "_savevr_" : "_restvr_";
26027       else
26028         abort ();
26029     }
26030
26031    if (DEFAULT_ABI == ABI_DARWIN)
26032     {
26033       /* The Darwin approach is (slightly) different, in order to be
26034          compatible with code generated by the system toolchain.  There is a
26035          single symbol for the start of save sequence, and the code here
26036          embeds an offset into that code on the basis of the first register
26037          to be saved.  */
26038       prefix = (sel & SAVRES_SAVE) ? "save" : "rest" ;
26039       if ((sel & SAVRES_REG) == SAVRES_GPR)
26040         sprintf (savres_routine_name, "*%sGPR%s%s%.0d ; %s r%d-r31", prefix,
26041                  ((sel & SAVRES_LR) ? "x" : ""), (regno == 13 ? "" : "+"),
26042                  (regno - 13) * 4, prefix, regno);
26043       else if ((sel & SAVRES_REG) == SAVRES_FPR)
26044         sprintf (savres_routine_name, "*%sFP%s%.0d ; %s f%d-f31", prefix,
26045                  (regno == 14 ? "" : "+"), (regno - 14) * 4, prefix, regno);
26046       else if ((sel & SAVRES_REG) == SAVRES_VR)
26047         sprintf (savres_routine_name, "*%sVEC%s%.0d ; %s v%d-v31", prefix,
26048                  (regno == 20 ? "" : "+"), (regno - 20) * 8, prefix, regno);
26049       else
26050         abort ();
26051     }
26052   else
26053     sprintf (savres_routine_name, "%s%d%s", prefix, regno, suffix);
26054
26055   return savres_routine_name;
26056 }
26057
26058 /* Return an RTL SYMBOL_REF for an out-of-line register save/restore routine.
26059    We are saving/restoring GPRs if GPR is true.  */
26060
26061 static rtx
26062 rs6000_savres_routine_sym (rs6000_stack_t *info, int sel)
26063 {
26064   int regno = ((sel & SAVRES_REG) == SAVRES_GPR
26065                ? info->first_gp_reg_save
26066                : (sel & SAVRES_REG) == SAVRES_FPR
26067                ? info->first_fp_reg_save - 32
26068                : (sel & SAVRES_REG) == SAVRES_VR
26069                ? info->first_altivec_reg_save - FIRST_ALTIVEC_REGNO
26070                : -1);
26071   rtx sym;
26072   int select = sel;
26073
26074   /* Don't generate bogus routine names.  */
26075   gcc_assert (FIRST_SAVRES_REGISTER <= regno
26076               && regno <= LAST_SAVRES_REGISTER
26077               && select >= 0 && select <= 12);
26078
26079   sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select];
26080
26081   if (sym == NULL)
26082     {
26083       char *name;
26084
26085       name = rs6000_savres_routine_name (regno, sel);
26086
26087       sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select]
26088         = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
26089       SYMBOL_REF_FLAGS (sym) |= SYMBOL_FLAG_FUNCTION;
26090     }
26091
26092   return sym;
26093 }
26094
26095 /* Emit a sequence of insns, including a stack tie if needed, for
26096    resetting the stack pointer.  If UPDT_REGNO is not 1, then don't
26097    reset the stack pointer, but move the base of the frame into
26098    reg UPDT_REGNO for use by out-of-line register restore routines.  */
26099
26100 static rtx
26101 rs6000_emit_stack_reset (rtx frame_reg_rtx, HOST_WIDE_INT frame_off,
26102                          unsigned updt_regno)
26103 {
26104   /* If there is nothing to do, don't do anything.  */
26105   if (frame_off == 0 && REGNO (frame_reg_rtx) == updt_regno)
26106     return NULL_RTX;
26107
26108   rtx updt_reg_rtx = gen_rtx_REG (Pmode, updt_regno);
26109
26110   /* This blockage is needed so that sched doesn't decide to move
26111      the sp change before the register restores.  */
26112   if (DEFAULT_ABI == ABI_V4)
26113     return emit_insn (gen_stack_restore_tie (updt_reg_rtx, frame_reg_rtx,
26114                                              GEN_INT (frame_off)));
26115
26116   /* If we are restoring registers out-of-line, we will be using the
26117      "exit" variants of the restore routines, which will reset the
26118      stack for us.  But we do need to point updt_reg into the
26119      right place for those routines.  */
26120   if (frame_off != 0)
26121     return emit_insn (gen_add3_insn (updt_reg_rtx,
26122                                      frame_reg_rtx, GEN_INT (frame_off)));
26123   else
26124     return emit_move_insn (updt_reg_rtx, frame_reg_rtx);
26125
26126   return NULL_RTX;
26127 }
26128
26129 /* Return the register number used as a pointer by out-of-line
26130    save/restore functions.  */
26131
26132 static inline unsigned
26133 ptr_regno_for_savres (int sel)
26134 {
26135   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
26136     return (sel & SAVRES_REG) == SAVRES_FPR || (sel & SAVRES_LR) ? 1 : 12;
26137   return DEFAULT_ABI == ABI_DARWIN && (sel & SAVRES_REG) == SAVRES_FPR ? 1 : 11;
26138 }
26139
26140 /* Construct a parallel rtx describing the effect of a call to an
26141    out-of-line register save/restore routine, and emit the insn
26142    or jump_insn as appropriate.  */
26143
26144 static rtx_insn *
26145 rs6000_emit_savres_rtx (rs6000_stack_t *info,
26146                         rtx frame_reg_rtx, int save_area_offset, int lr_offset,
26147                         machine_mode reg_mode, int sel)
26148 {
26149   int i;
26150   int offset, start_reg, end_reg, n_regs, use_reg;
26151   int reg_size = GET_MODE_SIZE (reg_mode);
26152   rtx sym;
26153   rtvec p;
26154   rtx par;
26155   rtx_insn *insn;
26156
26157   offset = 0;
26158   start_reg = ((sel & SAVRES_REG) == SAVRES_GPR
26159                ? info->first_gp_reg_save
26160                : (sel & SAVRES_REG) == SAVRES_FPR
26161                ? info->first_fp_reg_save
26162                : (sel & SAVRES_REG) == SAVRES_VR
26163                ? info->first_altivec_reg_save
26164                : -1);
26165   end_reg = ((sel & SAVRES_REG) == SAVRES_GPR
26166              ? 32
26167              : (sel & SAVRES_REG) == SAVRES_FPR
26168              ? 64
26169              : (sel & SAVRES_REG) == SAVRES_VR
26170              ? LAST_ALTIVEC_REGNO + 1
26171              : -1);
26172   n_regs = end_reg - start_reg;
26173   p = rtvec_alloc (3 + ((sel & SAVRES_LR) ? 1 : 0)
26174                    + ((sel & SAVRES_REG) == SAVRES_VR ? 1 : 0)
26175                    + n_regs);
26176
26177   if (!(sel & SAVRES_SAVE) && (sel & SAVRES_LR))
26178     RTVEC_ELT (p, offset++) = ret_rtx;
26179
26180   RTVEC_ELT (p, offset++) = gen_hard_reg_clobber (Pmode, LR_REGNO);
26181
26182   sym = rs6000_savres_routine_sym (info, sel);
26183   RTVEC_ELT (p, offset++) = gen_rtx_USE (VOIDmode, sym);
26184
26185   use_reg = ptr_regno_for_savres (sel);
26186   if ((sel & SAVRES_REG) == SAVRES_VR)
26187     {
26188       /* Vector regs are saved/restored using [reg+reg] addressing.  */
26189       RTVEC_ELT (p, offset++) = gen_hard_reg_clobber (Pmode, use_reg);
26190       RTVEC_ELT (p, offset++)
26191         = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 0));
26192     }
26193   else
26194     RTVEC_ELT (p, offset++)
26195       = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, use_reg));
26196
26197   for (i = 0; i < end_reg - start_reg; i++)
26198     RTVEC_ELT (p, i + offset)
26199       = gen_frame_set (gen_rtx_REG (reg_mode, start_reg + i),
26200                        frame_reg_rtx, save_area_offset + reg_size * i,
26201                        (sel & SAVRES_SAVE) != 0);
26202
26203   if ((sel & SAVRES_SAVE) && (sel & SAVRES_LR))
26204     RTVEC_ELT (p, i + offset)
26205       = gen_frame_store (gen_rtx_REG (Pmode, 0), frame_reg_rtx, lr_offset);
26206
26207   par = gen_rtx_PARALLEL (VOIDmode, p);
26208
26209   if (!(sel & SAVRES_SAVE) && (sel & SAVRES_LR))
26210     {
26211       insn = emit_jump_insn (par);
26212       JUMP_LABEL (insn) = ret_rtx;
26213     }
26214   else
26215     insn = emit_insn (par);
26216   return insn;
26217 }
26218
26219 /* Emit prologue code to store CR fields that need to be saved into REG.  This
26220    function should only be called when moving the non-volatile CRs to REG, it
26221    is not a general purpose routine to move the entire set of CRs to REG.
26222    Specifically, gen_prologue_movesi_from_cr() does not contain uses of the
26223    volatile CRs.  */
26224
26225 static void
26226 rs6000_emit_prologue_move_from_cr (rtx reg)
26227 {
26228   /* Only the ELFv2 ABI allows storing only selected fields.  */
26229   if (DEFAULT_ABI == ABI_ELFv2 && TARGET_MFCRF)
26230     {
26231       int i, cr_reg[8], count = 0;
26232
26233       /* Collect CR fields that must be saved.  */
26234       for (i = 0; i < 8; i++)
26235         if (save_reg_p (CR0_REGNO + i))
26236           cr_reg[count++] = i;
26237
26238       /* If it's just a single one, use mfcrf.  */
26239       if (count == 1)
26240         {
26241           rtvec p = rtvec_alloc (1);
26242           rtvec r = rtvec_alloc (2);
26243           RTVEC_ELT (r, 0) = gen_rtx_REG (CCmode, CR0_REGNO + cr_reg[0]);
26244           RTVEC_ELT (r, 1) = GEN_INT (1 << (7 - cr_reg[0]));
26245           RTVEC_ELT (p, 0)
26246             = gen_rtx_SET (reg,
26247                            gen_rtx_UNSPEC (SImode, r, UNSPEC_MOVESI_FROM_CR));
26248
26249           emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
26250           return;
26251         }
26252
26253       /* ??? It might be better to handle count == 2 / 3 cases here
26254          as well, using logical operations to combine the values.  */
26255     }
26256
26257   emit_insn (gen_prologue_movesi_from_cr (reg));
26258 }
26259
26260 /* Return whether the split-stack arg pointer (r12) is used.  */
26261
26262 static bool
26263 split_stack_arg_pointer_used_p (void)
26264 {
26265   /* If the pseudo holding the arg pointer is no longer a pseudo,
26266      then the arg pointer is used.  */
26267   if (cfun->machine->split_stack_arg_pointer != NULL_RTX
26268       && (!REG_P (cfun->machine->split_stack_arg_pointer)
26269           || HARD_REGISTER_P (cfun->machine->split_stack_arg_pointer)))
26270     return true;
26271
26272   /* Unfortunately we also need to do some code scanning, since
26273      r12 may have been substituted for the pseudo.  */
26274   rtx_insn *insn;
26275   basic_block bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb;
26276   FOR_BB_INSNS (bb, insn)
26277     if (NONDEBUG_INSN_P (insn))
26278       {
26279         /* A call destroys r12.  */
26280         if (CALL_P (insn))
26281           return false;
26282
26283         df_ref use;
26284         FOR_EACH_INSN_USE (use, insn)
26285           {
26286             rtx x = DF_REF_REG (use);
26287             if (REG_P (x) && REGNO (x) == 12)
26288               return true;
26289           }
26290         df_ref def;
26291         FOR_EACH_INSN_DEF (def, insn)
26292           {
26293             rtx x = DF_REF_REG (def);
26294             if (REG_P (x) && REGNO (x) == 12)
26295               return false;
26296           }
26297       }
26298   return bitmap_bit_p (DF_LR_OUT (bb), 12);
26299 }
26300
26301 /* Return whether we need to emit an ELFv2 global entry point prologue.  */
26302
26303 static bool
26304 rs6000_global_entry_point_prologue_needed_p (void)
26305 {
26306   /* Only needed for the ELFv2 ABI.  */
26307   if (DEFAULT_ABI != ABI_ELFv2)
26308     return false;
26309
26310   /* With -msingle-pic-base, we assume the whole program shares the same
26311      TOC, so no global entry point prologues are needed anywhere.  */
26312   if (TARGET_SINGLE_PIC_BASE)
26313     return false;
26314
26315   /* PC-relative functions never generate a global entry point prologue.  */
26316   if (rs6000_pcrel_p (cfun))
26317     return false;
26318
26319   /* Ensure we have a global entry point for thunks.   ??? We could
26320      avoid that if the target routine doesn't need a global entry point,
26321      but we do not know whether this is the case at this point.  */
26322   if (cfun->is_thunk)
26323     return true;
26324
26325   /* For regular functions, rs6000_emit_prologue sets this flag if the
26326      routine ever uses the TOC pointer.  */
26327   return cfun->machine->r2_setup_needed;
26328 }
26329
26330 /* Implement TARGET_SHRINK_WRAP_GET_SEPARATE_COMPONENTS.  */
26331 static sbitmap
26332 rs6000_get_separate_components (void)
26333 {
26334   rs6000_stack_t *info = rs6000_stack_info ();
26335
26336   if (WORLD_SAVE_P (info))
26337     return NULL;
26338
26339   gcc_assert (!(info->savres_strategy & SAVE_MULTIPLE)
26340               && !(info->savres_strategy & REST_MULTIPLE));
26341
26342   /* Component 0 is the save/restore of LR (done via GPR0).
26343      Component 2 is the save of the TOC (GPR2).
26344      Components 13..31 are the save/restore of GPR13..GPR31.
26345      Components 46..63 are the save/restore of FPR14..FPR31.  */
26346
26347   cfun->machine->n_components = 64;
26348
26349   sbitmap components = sbitmap_alloc (cfun->machine->n_components);
26350   bitmap_clear (components);
26351
26352   int reg_size = TARGET_32BIT ? 4 : 8;
26353   int fp_reg_size = 8;
26354
26355   /* The GPRs we need saved to the frame.  */
26356   if ((info->savres_strategy & SAVE_INLINE_GPRS)
26357       && (info->savres_strategy & REST_INLINE_GPRS))
26358     {
26359       int offset = info->gp_save_offset;
26360       if (info->push_p)
26361         offset += info->total_size;
26362
26363       for (unsigned regno = info->first_gp_reg_save; regno < 32; regno++)
26364         {
26365           if (IN_RANGE (offset, -0x8000, 0x7fff)
26366               && save_reg_p (regno))
26367             bitmap_set_bit (components, regno);
26368
26369           offset += reg_size;
26370         }
26371     }
26372
26373   /* Don't mess with the hard frame pointer.  */
26374   if (frame_pointer_needed)
26375     bitmap_clear_bit (components, HARD_FRAME_POINTER_REGNUM);
26376
26377   /* Don't mess with the fixed TOC register.  */
26378   if ((TARGET_TOC && TARGET_MINIMAL_TOC)
26379       || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
26380       || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
26381     bitmap_clear_bit (components, RS6000_PIC_OFFSET_TABLE_REGNUM);
26382
26383   /* The FPRs we need saved to the frame.  */
26384   if ((info->savres_strategy & SAVE_INLINE_FPRS)
26385       && (info->savres_strategy & REST_INLINE_FPRS))
26386     {
26387       int offset = info->fp_save_offset;
26388       if (info->push_p)
26389         offset += info->total_size;
26390
26391       for (unsigned regno = info->first_fp_reg_save; regno < 64; regno++)
26392         {
26393           if (IN_RANGE (offset, -0x8000, 0x7fff) && save_reg_p (regno))
26394             bitmap_set_bit (components, regno);
26395
26396           offset += fp_reg_size;
26397         }
26398     }
26399
26400   /* Optimize LR save and restore if we can.  This is component 0.  Any
26401      out-of-line register save/restore routines need LR.  */
26402   if (info->lr_save_p
26403       && !(flag_pic && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN))
26404       && (info->savres_strategy & SAVE_INLINE_GPRS)
26405       && (info->savres_strategy & REST_INLINE_GPRS)
26406       && (info->savres_strategy & SAVE_INLINE_FPRS)
26407       && (info->savres_strategy & REST_INLINE_FPRS)
26408       && (info->savres_strategy & SAVE_INLINE_VRS)
26409       && (info->savres_strategy & REST_INLINE_VRS))
26410     {
26411       int offset = info->lr_save_offset;
26412       if (info->push_p)
26413         offset += info->total_size;
26414       if (IN_RANGE (offset, -0x8000, 0x7fff))
26415         bitmap_set_bit (components, 0);
26416     }
26417
26418   /* Optimize saving the TOC.  This is component 2.  */
26419   if (cfun->machine->save_toc_in_prologue)
26420     bitmap_set_bit (components, 2);
26421
26422   return components;
26423 }
26424
26425 /* Implement TARGET_SHRINK_WRAP_COMPONENTS_FOR_BB.  */
26426 static sbitmap
26427 rs6000_components_for_bb (basic_block bb)
26428 {
26429   rs6000_stack_t *info = rs6000_stack_info ();
26430
26431   bitmap in = DF_LIVE_IN (bb);
26432   bitmap gen = &DF_LIVE_BB_INFO (bb)->gen;
26433   bitmap kill = &DF_LIVE_BB_INFO (bb)->kill;
26434
26435   sbitmap components = sbitmap_alloc (cfun->machine->n_components);
26436   bitmap_clear (components);
26437
26438   /* A register is used in a bb if it is in the IN, GEN, or KILL sets.  */
26439
26440   /* GPRs.  */
26441   for (unsigned regno = info->first_gp_reg_save; regno < 32; regno++)
26442     if (bitmap_bit_p (in, regno)
26443         || bitmap_bit_p (gen, regno)
26444         || bitmap_bit_p (kill, regno))
26445       bitmap_set_bit (components, regno);
26446
26447   /* FPRs.  */
26448   for (unsigned regno = info->first_fp_reg_save; regno < 64; regno++)
26449     if (bitmap_bit_p (in, regno)
26450         || bitmap_bit_p (gen, regno)
26451         || bitmap_bit_p (kill, regno))
26452       bitmap_set_bit (components, regno);
26453
26454   /* The link register.  */
26455   if (bitmap_bit_p (in, LR_REGNO)
26456       || bitmap_bit_p (gen, LR_REGNO)
26457       || bitmap_bit_p (kill, LR_REGNO))
26458     bitmap_set_bit (components, 0);
26459
26460   /* The TOC save.  */
26461   if (bitmap_bit_p (in, TOC_REGNUM)
26462       || bitmap_bit_p (gen, TOC_REGNUM)
26463       || bitmap_bit_p (kill, TOC_REGNUM))
26464     bitmap_set_bit (components, 2);
26465
26466   return components;
26467 }
26468
26469 /* Implement TARGET_SHRINK_WRAP_DISQUALIFY_COMPONENTS.  */
26470 static void
26471 rs6000_disqualify_components (sbitmap components, edge e,
26472                               sbitmap edge_components, bool /*is_prologue*/)
26473 {
26474   /* Our LR pro/epilogue code moves LR via R0, so R0 had better not be
26475      live where we want to place that code.  */
26476   if (bitmap_bit_p (edge_components, 0)
26477       && bitmap_bit_p (DF_LIVE_IN (e->dest), 0))
26478     {
26479       if (dump_file)
26480         fprintf (dump_file, "Disqualifying LR because GPR0 is live "
26481                  "on entry to bb %d\n", e->dest->index);
26482       bitmap_clear_bit (components, 0);
26483     }
26484 }
26485
26486 /* Implement TARGET_SHRINK_WRAP_EMIT_PROLOGUE_COMPONENTS.  */
26487 static void
26488 rs6000_emit_prologue_components (sbitmap components)
26489 {
26490   rs6000_stack_t *info = rs6000_stack_info ();
26491   rtx ptr_reg = gen_rtx_REG (Pmode, frame_pointer_needed
26492                              ? HARD_FRAME_POINTER_REGNUM
26493                              : STACK_POINTER_REGNUM);
26494
26495   machine_mode reg_mode = Pmode;
26496   int reg_size = TARGET_32BIT ? 4 : 8;
26497   machine_mode fp_reg_mode = TARGET_HARD_FLOAT ? DFmode : SFmode;
26498   int fp_reg_size = 8;
26499
26500   /* Prologue for LR.  */
26501   if (bitmap_bit_p (components, 0))
26502     {
26503       rtx lr = gen_rtx_REG (reg_mode, LR_REGNO);
26504       rtx reg = gen_rtx_REG (reg_mode, 0);
26505       rtx_insn *insn = emit_move_insn (reg, lr);
26506       RTX_FRAME_RELATED_P (insn) = 1;
26507       add_reg_note (insn, REG_CFA_REGISTER, gen_rtx_SET (reg, lr));
26508
26509       int offset = info->lr_save_offset;
26510       if (info->push_p)
26511         offset += info->total_size;
26512
26513       insn = emit_insn (gen_frame_store (reg, ptr_reg, offset));
26514       RTX_FRAME_RELATED_P (insn) = 1;
26515       rtx mem = copy_rtx (SET_DEST (single_set (insn)));
26516       add_reg_note (insn, REG_CFA_OFFSET, gen_rtx_SET (mem, lr));
26517     }
26518
26519   /* Prologue for TOC.  */
26520   if (bitmap_bit_p (components, 2))
26521     {
26522       rtx reg = gen_rtx_REG (reg_mode, TOC_REGNUM);
26523       rtx sp_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
26524       emit_insn (gen_frame_store (reg, sp_reg, RS6000_TOC_SAVE_SLOT));
26525     }
26526
26527   /* Prologue for the GPRs.  */
26528   int offset = info->gp_save_offset;
26529   if (info->push_p)
26530     offset += info->total_size;
26531
26532   for (int i = info->first_gp_reg_save; i < 32; i++)
26533     {
26534       if (bitmap_bit_p (components, i))
26535         {
26536           rtx reg = gen_rtx_REG (reg_mode, i);
26537           rtx_insn *insn = emit_insn (gen_frame_store (reg, ptr_reg, offset));
26538           RTX_FRAME_RELATED_P (insn) = 1;
26539           rtx set = copy_rtx (single_set (insn));
26540           add_reg_note (insn, REG_CFA_OFFSET, set);
26541         }
26542
26543       offset += reg_size;
26544     }
26545
26546   /* Prologue for the FPRs.  */
26547   offset = info->fp_save_offset;
26548   if (info->push_p)
26549     offset += info->total_size;
26550
26551   for (int i = info->first_fp_reg_save; i < 64; i++)
26552     {
26553       if (bitmap_bit_p (components, i))
26554         {
26555           rtx reg = gen_rtx_REG (fp_reg_mode, i);
26556           rtx_insn *insn = emit_insn (gen_frame_store (reg, ptr_reg, offset));
26557           RTX_FRAME_RELATED_P (insn) = 1;
26558           rtx set = copy_rtx (single_set (insn));
26559           add_reg_note (insn, REG_CFA_OFFSET, set);
26560         }
26561
26562       offset += fp_reg_size;
26563     }
26564 }
26565
26566 /* Implement TARGET_SHRINK_WRAP_EMIT_EPILOGUE_COMPONENTS.  */
26567 static void
26568 rs6000_emit_epilogue_components (sbitmap components)
26569 {
26570   rs6000_stack_t *info = rs6000_stack_info ();
26571   rtx ptr_reg = gen_rtx_REG (Pmode, frame_pointer_needed
26572                              ? HARD_FRAME_POINTER_REGNUM
26573                              : STACK_POINTER_REGNUM);
26574
26575   machine_mode reg_mode = Pmode;
26576   int reg_size = TARGET_32BIT ? 4 : 8;
26577
26578   machine_mode fp_reg_mode = TARGET_HARD_FLOAT ? DFmode : SFmode;
26579   int fp_reg_size = 8;
26580
26581   /* Epilogue for the FPRs.  */
26582   int offset = info->fp_save_offset;
26583   if (info->push_p)
26584     offset += info->total_size;
26585
26586   for (int i = info->first_fp_reg_save; i < 64; i++)
26587     {
26588       if (bitmap_bit_p (components, i))
26589         {
26590           rtx reg = gen_rtx_REG (fp_reg_mode, i);
26591           rtx_insn *insn = emit_insn (gen_frame_load (reg, ptr_reg, offset));
26592           RTX_FRAME_RELATED_P (insn) = 1;
26593           add_reg_note (insn, REG_CFA_RESTORE, reg);
26594         }
26595
26596       offset += fp_reg_size;
26597     }
26598
26599   /* Epilogue for the GPRs.  */
26600   offset = info->gp_save_offset;
26601   if (info->push_p)
26602     offset += info->total_size;
26603
26604   for (int i = info->first_gp_reg_save; i < 32; i++)
26605     {
26606       if (bitmap_bit_p (components, i))
26607         {
26608           rtx reg = gen_rtx_REG (reg_mode, i);
26609           rtx_insn *insn = emit_insn (gen_frame_load (reg, ptr_reg, offset));
26610           RTX_FRAME_RELATED_P (insn) = 1;
26611           add_reg_note (insn, REG_CFA_RESTORE, reg);
26612         }
26613
26614       offset += reg_size;
26615     }
26616
26617   /* Epilogue for LR.  */
26618   if (bitmap_bit_p (components, 0))
26619     {
26620       int offset = info->lr_save_offset;
26621       if (info->push_p)
26622         offset += info->total_size;
26623
26624       rtx reg = gen_rtx_REG (reg_mode, 0);
26625       rtx_insn *insn = emit_insn (gen_frame_load (reg, ptr_reg, offset));
26626
26627       rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
26628       insn = emit_move_insn (lr, reg);
26629       RTX_FRAME_RELATED_P (insn) = 1;
26630       add_reg_note (insn, REG_CFA_RESTORE, lr);
26631     }
26632 }
26633
26634 /* Implement TARGET_SHRINK_WRAP_SET_HANDLED_COMPONENTS.  */
26635 static void
26636 rs6000_set_handled_components (sbitmap components)
26637 {
26638   rs6000_stack_t *info = rs6000_stack_info ();
26639
26640   for (int i = info->first_gp_reg_save; i < 32; i++)
26641     if (bitmap_bit_p (components, i))
26642       cfun->machine->gpr_is_wrapped_separately[i] = true;
26643
26644   for (int i = info->first_fp_reg_save; i < 64; i++)
26645     if (bitmap_bit_p (components, i))
26646       cfun->machine->fpr_is_wrapped_separately[i - 32] = true;
26647
26648   if (bitmap_bit_p (components, 0))
26649     cfun->machine->lr_is_wrapped_separately = true;
26650
26651   if (bitmap_bit_p (components, 2))
26652     cfun->machine->toc_is_wrapped_separately = true;
26653 }
26654
26655 /* VRSAVE is a bit vector representing which AltiVec registers
26656    are used.  The OS uses this to determine which vector
26657    registers to save on a context switch.  We need to save
26658    VRSAVE on the stack frame, add whatever AltiVec registers we
26659    used in this function, and do the corresponding magic in the
26660    epilogue.  */
26661 static void
26662 emit_vrsave_prologue (rs6000_stack_t *info, int save_regno,
26663                       HOST_WIDE_INT frame_off, rtx frame_reg_rtx)
26664 {
26665   /* Get VRSAVE into a GPR.  */
26666   rtx reg = gen_rtx_REG (SImode, save_regno);
26667   rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
26668   if (TARGET_MACHO)
26669     emit_insn (gen_get_vrsave_internal (reg));
26670   else
26671     emit_insn (gen_rtx_SET (reg, vrsave));
26672
26673   /* Save VRSAVE.  */
26674   int offset = info->vrsave_save_offset + frame_off;
26675   emit_insn (gen_frame_store (reg, frame_reg_rtx, offset));
26676
26677   /* Include the registers in the mask.  */
26678   emit_insn (gen_iorsi3 (reg, reg, GEN_INT (info->vrsave_mask)));
26679
26680   emit_insn (generate_set_vrsave (reg, info, 0));
26681 }
26682
26683 /* Set up the arg pointer (r12) for -fsplit-stack code.  If __morestack was
26684    called, it left the arg pointer to the old stack in r29.  Otherwise, the
26685    arg pointer is the top of the current frame.  */
26686 static void
26687 emit_split_stack_prologue (rs6000_stack_t *info, rtx_insn *sp_adjust,
26688                            HOST_WIDE_INT frame_off, rtx frame_reg_rtx)
26689 {
26690   cfun->machine->split_stack_argp_used = true;
26691
26692   if (sp_adjust)
26693     {
26694       rtx r12 = gen_rtx_REG (Pmode, 12);
26695       rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
26696       rtx set_r12 = gen_rtx_SET (r12, sp_reg_rtx);
26697       emit_insn_before (set_r12, sp_adjust);
26698     }
26699   else if (frame_off != 0 || REGNO (frame_reg_rtx) != 12)
26700     {
26701       rtx r12 = gen_rtx_REG (Pmode, 12);
26702       if (frame_off == 0)
26703         emit_move_insn (r12, frame_reg_rtx);
26704       else
26705         emit_insn (gen_add3_insn (r12, frame_reg_rtx, GEN_INT (frame_off)));
26706     }
26707
26708   if (info->push_p)
26709     {
26710       rtx r12 = gen_rtx_REG (Pmode, 12);
26711       rtx r29 = gen_rtx_REG (Pmode, 29);
26712       rtx cr7 = gen_rtx_REG (CCUNSmode, CR7_REGNO);
26713       rtx not_more = gen_label_rtx ();
26714       rtx jump;
26715
26716       jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
26717                                    gen_rtx_GEU (VOIDmode, cr7, const0_rtx),
26718                                    gen_rtx_LABEL_REF (VOIDmode, not_more),
26719                                    pc_rtx);
26720       jump = emit_jump_insn (gen_rtx_SET (pc_rtx, jump));
26721       JUMP_LABEL (jump) = not_more;
26722       LABEL_NUSES (not_more) += 1;
26723       emit_move_insn (r12, r29);
26724       emit_label (not_more);
26725     }
26726 }
26727
26728 /* Emit function prologue as insns.  */
26729
26730 void
26731 rs6000_emit_prologue (void)
26732 {
26733   rs6000_stack_t *info = rs6000_stack_info ();
26734   machine_mode reg_mode = Pmode;
26735   int reg_size = TARGET_32BIT ? 4 : 8;
26736   machine_mode fp_reg_mode = TARGET_HARD_FLOAT ? DFmode : SFmode;
26737   int fp_reg_size = 8;
26738   rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
26739   rtx frame_reg_rtx = sp_reg_rtx;
26740   unsigned int cr_save_regno;
26741   rtx cr_save_rtx = NULL_RTX;
26742   rtx_insn *insn;
26743   int strategy;
26744   int using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
26745                               && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
26746                               && call_used_regs[STATIC_CHAIN_REGNUM]);
26747   int using_split_stack = (flag_split_stack
26748                            && (lookup_attribute ("no_split_stack",
26749                                                  DECL_ATTRIBUTES (cfun->decl))
26750                                == NULL));
26751  
26752   /* Offset to top of frame for frame_reg and sp respectively.  */
26753   HOST_WIDE_INT frame_off = 0;
26754   HOST_WIDE_INT sp_off = 0;
26755   /* sp_adjust is the stack adjusting instruction, tracked so that the
26756      insn setting up the split-stack arg pointer can be emitted just
26757      prior to it, when r12 is not used here for other purposes.  */
26758   rtx_insn *sp_adjust = 0;
26759
26760 #if CHECKING_P
26761   /* Track and check usage of r0, r11, r12.  */
26762   int reg_inuse = using_static_chain_p ? 1 << 11 : 0;
26763 #define START_USE(R) do \
26764   {                                             \
26765     gcc_assert ((reg_inuse & (1 << (R))) == 0); \
26766     reg_inuse |= 1 << (R);                      \
26767   } while (0)
26768 #define END_USE(R) do \
26769   {                                             \
26770     gcc_assert ((reg_inuse & (1 << (R))) != 0); \
26771     reg_inuse &= ~(1 << (R));                   \
26772   } while (0)
26773 #define NOT_INUSE(R) do \
26774   {                                             \
26775     gcc_assert ((reg_inuse & (1 << (R))) == 0); \
26776   } while (0)
26777 #else
26778 #define START_USE(R) do {} while (0)
26779 #define END_USE(R) do {} while (0)
26780 #define NOT_INUSE(R) do {} while (0)
26781 #endif
26782
26783   if (DEFAULT_ABI == ABI_ELFv2
26784       && !TARGET_SINGLE_PIC_BASE)
26785     {
26786       cfun->machine->r2_setup_needed = df_regs_ever_live_p (TOC_REGNUM);
26787
26788       /* With -mminimal-toc we may generate an extra use of r2 below.  */
26789       if (TARGET_TOC && TARGET_MINIMAL_TOC
26790           && !constant_pool_empty_p ())
26791         cfun->machine->r2_setup_needed = true;
26792     }
26793
26794
26795   if (flag_stack_usage_info)
26796     current_function_static_stack_size = info->total_size;
26797
26798   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
26799     {
26800       HOST_WIDE_INT size = info->total_size;
26801
26802       if (crtl->is_leaf && !cfun->calls_alloca)
26803         {
26804           if (size > PROBE_INTERVAL && size > get_stack_check_protect ())
26805             rs6000_emit_probe_stack_range (get_stack_check_protect (),
26806                                            size - get_stack_check_protect ());
26807         }
26808       else if (size > 0)
26809         rs6000_emit_probe_stack_range (get_stack_check_protect (), size);
26810     }
26811
26812   if (TARGET_FIX_AND_CONTINUE)
26813     {
26814       /* gdb on darwin arranges to forward a function from the old
26815          address by modifying the first 5 instructions of the function
26816          to branch to the overriding function.  This is necessary to
26817          permit function pointers that point to the old function to
26818          actually forward to the new function.  */
26819       emit_insn (gen_nop ());
26820       emit_insn (gen_nop ());
26821       emit_insn (gen_nop ());
26822       emit_insn (gen_nop ());
26823       emit_insn (gen_nop ());
26824     }
26825
26826   /* Handle world saves specially here.  */
26827   if (WORLD_SAVE_P (info))
26828     {
26829       int i, j, sz;
26830       rtx treg;
26831       rtvec p;
26832       rtx reg0;
26833
26834       /* save_world expects lr in r0. */
26835       reg0 = gen_rtx_REG (Pmode, 0);
26836       if (info->lr_save_p)
26837         {
26838           insn = emit_move_insn (reg0,
26839                                  gen_rtx_REG (Pmode, LR_REGNO));
26840           RTX_FRAME_RELATED_P (insn) = 1;
26841         }
26842
26843       /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
26844          assumptions about the offsets of various bits of the stack
26845          frame.  */
26846       gcc_assert (info->gp_save_offset == -220
26847                   && info->fp_save_offset == -144
26848                   && info->lr_save_offset == 8
26849                   && info->cr_save_offset == 4
26850                   && info->push_p
26851                   && info->lr_save_p
26852                   && (!crtl->calls_eh_return
26853                       || info->ehrd_offset == -432)
26854                   && info->vrsave_save_offset == -224
26855                   && info->altivec_save_offset == -416);
26856
26857       treg = gen_rtx_REG (SImode, 11);
26858       emit_move_insn (treg, GEN_INT (-info->total_size));
26859
26860       /* SAVE_WORLD takes the caller's LR in R0 and the frame size
26861          in R11.  It also clobbers R12, so beware!  */
26862
26863       /* Preserve CR2 for save_world prologues */
26864       sz = 5;
26865       sz += 32 - info->first_gp_reg_save;
26866       sz += 64 - info->first_fp_reg_save;
26867       sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
26868       p = rtvec_alloc (sz);
26869       j = 0;
26870       RTVEC_ELT (p, j++) = gen_hard_reg_clobber (SImode, LR_REGNO);
26871       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
26872                                         gen_rtx_SYMBOL_REF (Pmode,
26873                                                             "*save_world"));
26874       /* We do floats first so that the instruction pattern matches
26875          properly.  */
26876       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
26877         RTVEC_ELT (p, j++)
26878           = gen_frame_store (gen_rtx_REG (TARGET_HARD_FLOAT ? DFmode : SFmode,
26879                                           info->first_fp_reg_save + i),
26880                              frame_reg_rtx,
26881                              info->fp_save_offset + frame_off + 8 * i);
26882       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
26883         RTVEC_ELT (p, j++)
26884           = gen_frame_store (gen_rtx_REG (V4SImode,
26885                                           info->first_altivec_reg_save + i),
26886                              frame_reg_rtx,
26887                              info->altivec_save_offset + frame_off + 16 * i);
26888       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
26889         RTVEC_ELT (p, j++)
26890           = gen_frame_store (gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
26891                              frame_reg_rtx,
26892                              info->gp_save_offset + frame_off + reg_size * i);
26893
26894       /* CR register traditionally saved as CR2.  */
26895       RTVEC_ELT (p, j++)
26896         = gen_frame_store (gen_rtx_REG (SImode, CR2_REGNO),
26897                            frame_reg_rtx, info->cr_save_offset + frame_off);
26898       /* Explain about use of R0.  */
26899       if (info->lr_save_p)
26900         RTVEC_ELT (p, j++)
26901           = gen_frame_store (reg0,
26902                              frame_reg_rtx, info->lr_save_offset + frame_off);
26903       /* Explain what happens to the stack pointer.  */
26904       {
26905         rtx newval = gen_rtx_PLUS (Pmode, sp_reg_rtx, treg);
26906         RTVEC_ELT (p, j++) = gen_rtx_SET (sp_reg_rtx, newval);
26907       }
26908
26909       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
26910       rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
26911                             treg, GEN_INT (-info->total_size));
26912       sp_off = frame_off = info->total_size;
26913     }
26914
26915   strategy = info->savres_strategy;
26916
26917   /* For V.4, update stack before we do any saving and set back pointer.  */
26918   if (! WORLD_SAVE_P (info)
26919       && info->push_p
26920       && (DEFAULT_ABI == ABI_V4
26921           || crtl->calls_eh_return))
26922     {
26923       bool need_r11 = (!(strategy & SAVE_INLINE_FPRS)
26924                        || !(strategy & SAVE_INLINE_GPRS)
26925                        || !(strategy & SAVE_INLINE_VRS));
26926       int ptr_regno = -1;
26927       rtx ptr_reg = NULL_RTX;
26928       int ptr_off = 0;
26929
26930       if (info->total_size < 32767)
26931         frame_off = info->total_size;
26932       else if (need_r11)
26933         ptr_regno = 11;
26934       else if (info->cr_save_p
26935                || info->lr_save_p
26936                || info->first_fp_reg_save < 64
26937                || info->first_gp_reg_save < 32
26938                || info->altivec_size != 0
26939                || info->vrsave_size != 0
26940                || crtl->calls_eh_return)
26941         ptr_regno = 12;
26942       else
26943         {
26944           /* The prologue won't be saving any regs so there is no need
26945              to set up a frame register to access any frame save area.
26946              We also won't be using frame_off anywhere below, but set
26947              the correct value anyway to protect against future
26948              changes to this function.  */
26949           frame_off = info->total_size;
26950         }
26951       if (ptr_regno != -1)
26952         {
26953           /* Set up the frame offset to that needed by the first
26954              out-of-line save function.  */
26955           START_USE (ptr_regno);
26956           ptr_reg = gen_rtx_REG (Pmode, ptr_regno);
26957           frame_reg_rtx = ptr_reg;
26958           if (!(strategy & SAVE_INLINE_FPRS) && info->fp_size != 0)
26959             gcc_checking_assert (info->fp_save_offset + info->fp_size == 0);
26960           else if (!(strategy & SAVE_INLINE_GPRS) && info->first_gp_reg_save < 32)
26961             ptr_off = info->gp_save_offset + info->gp_size;
26962           else if (!(strategy & SAVE_INLINE_VRS) && info->altivec_size != 0)
26963             ptr_off = info->altivec_save_offset + info->altivec_size;
26964           frame_off = -ptr_off;
26965         }
26966       sp_adjust = rs6000_emit_allocate_stack (info->total_size,
26967                                               ptr_reg, ptr_off);
26968       if (REGNO (frame_reg_rtx) == 12)
26969         sp_adjust = 0;
26970       sp_off = info->total_size;
26971       if (frame_reg_rtx != sp_reg_rtx)
26972         rs6000_emit_stack_tie (frame_reg_rtx, false);
26973     }
26974
26975   /* If we use the link register, get it into r0.  */
26976   if (!WORLD_SAVE_P (info) && info->lr_save_p
26977       && !cfun->machine->lr_is_wrapped_separately)
26978     {
26979       rtx addr, reg, mem;
26980
26981       reg = gen_rtx_REG (Pmode, 0);
26982       START_USE (0);
26983       insn = emit_move_insn (reg, gen_rtx_REG (Pmode, LR_REGNO));
26984       RTX_FRAME_RELATED_P (insn) = 1;
26985
26986       if (!(strategy & (SAVE_NOINLINE_GPRS_SAVES_LR
26987                         | SAVE_NOINLINE_FPRS_SAVES_LR)))
26988         {
26989           addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
26990                                GEN_INT (info->lr_save_offset + frame_off));
26991           mem = gen_rtx_MEM (Pmode, addr);
26992           /* This should not be of rs6000_sr_alias_set, because of
26993              __builtin_return_address.  */
26994
26995           insn = emit_move_insn (mem, reg);
26996           rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
26997                                 NULL_RTX, NULL_RTX);
26998           END_USE (0);
26999         }
27000     }
27001
27002   /* If we need to save CR, put it into r12 or r11.  Choose r12 except when
27003      r12 will be needed by out-of-line gpr save.  */
27004   cr_save_regno = ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
27005                    && !(strategy & (SAVE_INLINE_GPRS
27006                                     | SAVE_NOINLINE_GPRS_SAVES_LR))
27007                    ? 11 : 12);
27008   if (!WORLD_SAVE_P (info)
27009       && info->cr_save_p
27010       && REGNO (frame_reg_rtx) != cr_save_regno
27011       && !(using_static_chain_p && cr_save_regno == 11)
27012       && !(using_split_stack && cr_save_regno == 12 && sp_adjust))
27013     {
27014       cr_save_rtx = gen_rtx_REG (SImode, cr_save_regno);
27015       START_USE (cr_save_regno);
27016       rs6000_emit_prologue_move_from_cr (cr_save_rtx);
27017     }
27018
27019   /* Do any required saving of fpr's.  If only one or two to save, do
27020      it ourselves.  Otherwise, call function.  */
27021   if (!WORLD_SAVE_P (info) && (strategy & SAVE_INLINE_FPRS))
27022     {
27023       int offset = info->fp_save_offset + frame_off;
27024       for (int i = info->first_fp_reg_save; i < 64; i++)
27025         {
27026           if (save_reg_p (i)
27027               && !cfun->machine->fpr_is_wrapped_separately[i - 32])
27028             emit_frame_save (frame_reg_rtx, fp_reg_mode, i, offset,
27029                              sp_off - frame_off);
27030
27031           offset += fp_reg_size;
27032         }
27033     }
27034   else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
27035     {
27036       bool lr = (strategy & SAVE_NOINLINE_FPRS_SAVES_LR) != 0;
27037       int sel = SAVRES_SAVE | SAVRES_FPR | (lr ? SAVRES_LR : 0);
27038       unsigned ptr_regno = ptr_regno_for_savres (sel);
27039       rtx ptr_reg = frame_reg_rtx;
27040
27041       if (REGNO (frame_reg_rtx) == ptr_regno)
27042         gcc_checking_assert (frame_off == 0);
27043       else
27044         {
27045           ptr_reg = gen_rtx_REG (Pmode, ptr_regno);
27046           NOT_INUSE (ptr_regno);
27047           emit_insn (gen_add3_insn (ptr_reg,
27048                                     frame_reg_rtx, GEN_INT (frame_off)));
27049         }
27050       insn = rs6000_emit_savres_rtx (info, ptr_reg,
27051                                      info->fp_save_offset,
27052                                      info->lr_save_offset,
27053                                      DFmode, sel);
27054       rs6000_frame_related (insn, ptr_reg, sp_off,
27055                             NULL_RTX, NULL_RTX);
27056       if (lr)
27057         END_USE (0);
27058     }
27059
27060   /* Save GPRs.  This is done as a PARALLEL if we are using
27061      the store-multiple instructions.  */
27062   if (!WORLD_SAVE_P (info) && !(strategy & SAVE_INLINE_GPRS))
27063     {
27064       bool lr = (strategy & SAVE_NOINLINE_GPRS_SAVES_LR) != 0;
27065       int sel = SAVRES_SAVE | SAVRES_GPR | (lr ? SAVRES_LR : 0);
27066       unsigned ptr_regno = ptr_regno_for_savres (sel);
27067       rtx ptr_reg = frame_reg_rtx;
27068       bool ptr_set_up = REGNO (ptr_reg) == ptr_regno;
27069       int end_save = info->gp_save_offset + info->gp_size;
27070       int ptr_off;
27071
27072       if (ptr_regno == 12)
27073         sp_adjust = 0;
27074       if (!ptr_set_up)
27075         ptr_reg = gen_rtx_REG (Pmode, ptr_regno);
27076
27077       /* Need to adjust r11 (r12) if we saved any FPRs.  */
27078       if (end_save + frame_off != 0)
27079         {
27080           rtx offset = GEN_INT (end_save + frame_off);
27081
27082           if (ptr_set_up)
27083             frame_off = -end_save;
27084           else
27085             NOT_INUSE (ptr_regno);
27086           emit_insn (gen_add3_insn (ptr_reg, frame_reg_rtx, offset));
27087         }
27088       else if (!ptr_set_up)
27089         {
27090           NOT_INUSE (ptr_regno);
27091           emit_move_insn (ptr_reg, frame_reg_rtx);
27092         }
27093       ptr_off = -end_save;
27094       insn = rs6000_emit_savres_rtx (info, ptr_reg,
27095                                      info->gp_save_offset + ptr_off,
27096                                      info->lr_save_offset + ptr_off,
27097                                      reg_mode, sel);
27098       rs6000_frame_related (insn, ptr_reg, sp_off - ptr_off,
27099                             NULL_RTX, NULL_RTX);
27100       if (lr)
27101         END_USE (0);
27102     }
27103   else if (!WORLD_SAVE_P (info) && (strategy & SAVE_MULTIPLE))
27104     {
27105       rtvec p;
27106       int i;
27107       p = rtvec_alloc (32 - info->first_gp_reg_save);
27108       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
27109         RTVEC_ELT (p, i)
27110           = gen_frame_store (gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
27111                              frame_reg_rtx,
27112                              info->gp_save_offset + frame_off + reg_size * i);
27113       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
27114       rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
27115                             NULL_RTX, NULL_RTX);
27116     }
27117   else if (!WORLD_SAVE_P (info))
27118     {
27119       int offset = info->gp_save_offset + frame_off;
27120       for (int i = info->first_gp_reg_save; i < 32; i++)
27121         {
27122           if (save_reg_p (i)
27123               && !cfun->machine->gpr_is_wrapped_separately[i])
27124             emit_frame_save (frame_reg_rtx, reg_mode, i, offset,
27125                              sp_off - frame_off);
27126
27127           offset += reg_size;
27128         }
27129     }
27130
27131   if (crtl->calls_eh_return)
27132     {
27133       unsigned int i;
27134       rtvec p;
27135
27136       for (i = 0; ; ++i)
27137         {
27138           unsigned int regno = EH_RETURN_DATA_REGNO (i);
27139           if (regno == INVALID_REGNUM)
27140             break;
27141         }
27142
27143       p = rtvec_alloc (i);
27144
27145       for (i = 0; ; ++i)
27146         {
27147           unsigned int regno = EH_RETURN_DATA_REGNO (i);
27148           if (regno == INVALID_REGNUM)
27149             break;
27150
27151           rtx set
27152             = gen_frame_store (gen_rtx_REG (reg_mode, regno),
27153                                sp_reg_rtx,
27154                                info->ehrd_offset + sp_off + reg_size * (int) i);
27155           RTVEC_ELT (p, i) = set;
27156           RTX_FRAME_RELATED_P (set) = 1;
27157         }
27158
27159       insn = emit_insn (gen_blockage ());
27160       RTX_FRAME_RELATED_P (insn) = 1;
27161       add_reg_note (insn, REG_FRAME_RELATED_EXPR, gen_rtx_PARALLEL (VOIDmode, p));
27162     }
27163
27164   /* In AIX ABI we need to make sure r2 is really saved.  */
27165   if (TARGET_AIX && crtl->calls_eh_return)
27166     {
27167       rtx tmp_reg, tmp_reg_si, hi, lo, compare_result, toc_save_done, jump;
27168       rtx join_insn, note;
27169       rtx_insn *save_insn;
27170       long toc_restore_insn;
27171
27172       tmp_reg = gen_rtx_REG (Pmode, 11);
27173       tmp_reg_si = gen_rtx_REG (SImode, 11);
27174       if (using_static_chain_p)
27175         {
27176           START_USE (0);
27177           emit_move_insn (gen_rtx_REG (Pmode, 0), tmp_reg);
27178         }
27179       else
27180         START_USE (11);
27181       emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, LR_REGNO));
27182       /* Peek at instruction to which this function returns.  If it's
27183          restoring r2, then we know we've already saved r2.  We can't
27184          unconditionally save r2 because the value we have will already
27185          be updated if we arrived at this function via a plt call or
27186          toc adjusting stub.  */
27187       emit_move_insn (tmp_reg_si, gen_rtx_MEM (SImode, tmp_reg));
27188       toc_restore_insn = ((TARGET_32BIT ? 0x80410000 : 0xE8410000)
27189                           + RS6000_TOC_SAVE_SLOT);
27190       hi = gen_int_mode (toc_restore_insn & ~0xffff, SImode);
27191       emit_insn (gen_xorsi3 (tmp_reg_si, tmp_reg_si, hi));
27192       compare_result = gen_rtx_REG (CCUNSmode, CR0_REGNO);
27193       validate_condition_mode (EQ, CCUNSmode);
27194       lo = gen_int_mode (toc_restore_insn & 0xffff, SImode);
27195       emit_insn (gen_rtx_SET (compare_result,
27196                               gen_rtx_COMPARE (CCUNSmode, tmp_reg_si, lo)));
27197       toc_save_done = gen_label_rtx ();
27198       jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
27199                                    gen_rtx_EQ (VOIDmode, compare_result,
27200                                                const0_rtx),
27201                                    gen_rtx_LABEL_REF (VOIDmode, toc_save_done),
27202                                    pc_rtx);
27203       jump = emit_jump_insn (gen_rtx_SET (pc_rtx, jump));
27204       JUMP_LABEL (jump) = toc_save_done;
27205       LABEL_NUSES (toc_save_done) += 1;
27206
27207       save_insn = emit_frame_save (frame_reg_rtx, reg_mode,
27208                                    TOC_REGNUM, frame_off + RS6000_TOC_SAVE_SLOT,
27209                                    sp_off - frame_off);
27210
27211       emit_label (toc_save_done);
27212
27213       /* ??? If we leave SAVE_INSN as marked as saving R2, then we'll
27214          have a CFG that has different saves along different paths.
27215          Move the note to a dummy blockage insn, which describes that
27216          R2 is unconditionally saved after the label.  */
27217       /* ??? An alternate representation might be a special insn pattern
27218          containing both the branch and the store.  That might let the
27219          code that minimizes the number of DW_CFA_advance opcodes better
27220          freedom in placing the annotations.  */
27221       note = find_reg_note (save_insn, REG_FRAME_RELATED_EXPR, NULL);
27222       if (note)
27223         remove_note (save_insn, note);
27224       else
27225         note = alloc_reg_note (REG_FRAME_RELATED_EXPR,
27226                                copy_rtx (PATTERN (save_insn)), NULL_RTX);
27227       RTX_FRAME_RELATED_P (save_insn) = 0;
27228
27229       join_insn = emit_insn (gen_blockage ());
27230       REG_NOTES (join_insn) = note;
27231       RTX_FRAME_RELATED_P (join_insn) = 1;
27232
27233       if (using_static_chain_p)
27234         {
27235           emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, 0));
27236           END_USE (0);
27237         }
27238       else
27239         END_USE (11);
27240     }
27241
27242   /* Save CR if we use any that must be preserved.  */
27243   if (!WORLD_SAVE_P (info) && info->cr_save_p)
27244     {
27245       rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
27246                                GEN_INT (info->cr_save_offset + frame_off));
27247       rtx mem = gen_frame_mem (SImode, addr);
27248
27249       /* If we didn't copy cr before, do so now using r0.  */
27250       if (cr_save_rtx == NULL_RTX)
27251         {
27252           START_USE (0);
27253           cr_save_rtx = gen_rtx_REG (SImode, 0);
27254           rs6000_emit_prologue_move_from_cr (cr_save_rtx);
27255         }
27256
27257       /* Saving CR requires a two-instruction sequence: one instruction
27258          to move the CR to a general-purpose register, and a second
27259          instruction that stores the GPR to memory.
27260
27261          We do not emit any DWARF CFI records for the first of these,
27262          because we cannot properly represent the fact that CR is saved in
27263          a register.  One reason is that we cannot express that multiple
27264          CR fields are saved; another reason is that on 64-bit, the size
27265          of the CR register in DWARF (4 bytes) differs from the size of
27266          a general-purpose register.
27267
27268          This means if any intervening instruction were to clobber one of
27269          the call-saved CR fields, we'd have incorrect CFI.  To prevent
27270          this from happening, we mark the store to memory as a use of
27271          those CR fields, which prevents any such instruction from being
27272          scheduled in between the two instructions.  */
27273       rtx crsave_v[9];
27274       int n_crsave = 0;
27275       int i;
27276
27277       crsave_v[n_crsave++] = gen_rtx_SET (mem, cr_save_rtx);
27278       for (i = 0; i < 8; i++)
27279         if (save_reg_p (CR0_REGNO + i))
27280           crsave_v[n_crsave++]
27281             = gen_rtx_USE (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO + i));
27282
27283       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode,
27284                                           gen_rtvec_v (n_crsave, crsave_v)));
27285       END_USE (REGNO (cr_save_rtx));
27286
27287       /* Now, there's no way that dwarf2out_frame_debug_expr is going to
27288          understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)',
27289          so we need to construct a frame expression manually.  */
27290       RTX_FRAME_RELATED_P (insn) = 1;
27291
27292       /* Update address to be stack-pointer relative, like
27293          rs6000_frame_related would do.  */
27294       addr = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, STACK_POINTER_REGNUM),
27295                            GEN_INT (info->cr_save_offset + sp_off));
27296       mem = gen_frame_mem (SImode, addr);
27297
27298       if (DEFAULT_ABI == ABI_ELFv2)
27299         {
27300           /* In the ELFv2 ABI we generate separate CFI records for each
27301              CR field that was actually saved.  They all point to the
27302              same 32-bit stack slot.  */
27303           rtx crframe[8];
27304           int n_crframe = 0;
27305
27306           for (i = 0; i < 8; i++)
27307             if (save_reg_p (CR0_REGNO + i))
27308               {
27309                 crframe[n_crframe]
27310                   = gen_rtx_SET (mem, gen_rtx_REG (SImode, CR0_REGNO + i));
27311
27312                 RTX_FRAME_RELATED_P (crframe[n_crframe]) = 1;
27313                 n_crframe++;
27314              }
27315
27316           add_reg_note (insn, REG_FRAME_RELATED_EXPR,
27317                         gen_rtx_PARALLEL (VOIDmode,
27318                                           gen_rtvec_v (n_crframe, crframe)));
27319         }
27320       else
27321         {
27322           /* In other ABIs, by convention, we use a single CR regnum to
27323              represent the fact that all call-saved CR fields are saved.
27324              We use CR2_REGNO to be compatible with gcc-2.95 on Linux.  */
27325           rtx set = gen_rtx_SET (mem, gen_rtx_REG (SImode, CR2_REGNO));
27326           add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
27327         }
27328     }
27329
27330   /* In the ELFv2 ABI we need to save all call-saved CR fields into
27331      *separate* slots if the routine calls __builtin_eh_return, so
27332      that they can be independently restored by the unwinder.  */
27333   if (DEFAULT_ABI == ABI_ELFv2 && crtl->calls_eh_return)
27334     {
27335       int i, cr_off = info->ehcr_offset;
27336       rtx crsave;
27337
27338       /* ??? We might get better performance by using multiple mfocrf
27339          instructions.  */
27340       crsave = gen_rtx_REG (SImode, 0);
27341       emit_insn (gen_prologue_movesi_from_cr (crsave));
27342
27343       for (i = 0; i < 8; i++)
27344         if (!call_used_regs[CR0_REGNO + i])
27345           {
27346             rtvec p = rtvec_alloc (2);
27347             RTVEC_ELT (p, 0)
27348               = gen_frame_store (crsave, frame_reg_rtx, cr_off + frame_off);
27349             RTVEC_ELT (p, 1)
27350               = gen_rtx_USE (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO + i));
27351
27352             insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
27353
27354             RTX_FRAME_RELATED_P (insn) = 1;
27355             add_reg_note (insn, REG_FRAME_RELATED_EXPR,
27356                           gen_frame_store (gen_rtx_REG (SImode, CR0_REGNO + i),
27357                                            sp_reg_rtx, cr_off + sp_off));
27358
27359             cr_off += reg_size;
27360           }
27361     }
27362
27363   /* If we are emitting stack probes, but allocate no stack, then
27364      just note that in the dump file.  */
27365   if (flag_stack_clash_protection
27366       && dump_file
27367       && !info->push_p)
27368     dump_stack_clash_frame_info (NO_PROBE_NO_FRAME, false);
27369
27370   /* Update stack and set back pointer unless this is V.4,
27371      for which it was done previously.  */
27372   if (!WORLD_SAVE_P (info) && info->push_p
27373       && !(DEFAULT_ABI == ABI_V4 || crtl->calls_eh_return))
27374     {
27375       rtx ptr_reg = NULL;
27376       int ptr_off = 0;
27377
27378       /* If saving altivec regs we need to be able to address all save
27379          locations using a 16-bit offset.  */
27380       if ((strategy & SAVE_INLINE_VRS) == 0
27381           || (info->altivec_size != 0
27382               && (info->altivec_save_offset + info->altivec_size - 16
27383                   + info->total_size - frame_off) > 32767)
27384           || (info->vrsave_size != 0
27385               && (info->vrsave_save_offset
27386                   + info->total_size - frame_off) > 32767))
27387         {
27388           int sel = SAVRES_SAVE | SAVRES_VR;
27389           unsigned ptr_regno = ptr_regno_for_savres (sel);
27390
27391           if (using_static_chain_p
27392               && ptr_regno == STATIC_CHAIN_REGNUM)
27393             ptr_regno = 12;
27394           if (REGNO (frame_reg_rtx) != ptr_regno)
27395             START_USE (ptr_regno);
27396           ptr_reg = gen_rtx_REG (Pmode, ptr_regno);
27397           frame_reg_rtx = ptr_reg;
27398           ptr_off = info->altivec_save_offset + info->altivec_size;
27399           frame_off = -ptr_off;
27400         }
27401       else if (REGNO (frame_reg_rtx) == 1)
27402         frame_off = info->total_size;
27403       sp_adjust = rs6000_emit_allocate_stack (info->total_size,
27404                                               ptr_reg, ptr_off);
27405       if (REGNO (frame_reg_rtx) == 12)
27406         sp_adjust = 0;
27407       sp_off = info->total_size;
27408       if (frame_reg_rtx != sp_reg_rtx)
27409         rs6000_emit_stack_tie (frame_reg_rtx, false);
27410     }
27411
27412   /* Set frame pointer, if needed.  */
27413   if (frame_pointer_needed)
27414     {
27415       insn = emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
27416                              sp_reg_rtx);
27417       RTX_FRAME_RELATED_P (insn) = 1;
27418     }
27419
27420   /* Save AltiVec registers if needed.  Save here because the red zone does
27421      not always include AltiVec registers.  */
27422   if (!WORLD_SAVE_P (info)
27423       && info->altivec_size != 0 && (strategy & SAVE_INLINE_VRS) == 0)
27424     {
27425       int end_save = info->altivec_save_offset + info->altivec_size;
27426       int ptr_off;
27427       /* Oddly, the vector save/restore functions point r0 at the end
27428          of the save area, then use r11 or r12 to load offsets for
27429          [reg+reg] addressing.  */
27430       rtx ptr_reg = gen_rtx_REG (Pmode, 0);
27431       int scratch_regno = ptr_regno_for_savres (SAVRES_SAVE | SAVRES_VR);
27432       rtx scratch_reg = gen_rtx_REG (Pmode, scratch_regno);
27433
27434       gcc_checking_assert (scratch_regno == 11 || scratch_regno == 12);
27435       NOT_INUSE (0);
27436       if (scratch_regno == 12)
27437         sp_adjust = 0;
27438       if (end_save + frame_off != 0)
27439         {
27440           rtx offset = GEN_INT (end_save + frame_off);
27441
27442           emit_insn (gen_add3_insn (ptr_reg, frame_reg_rtx, offset));
27443         }
27444       else
27445         emit_move_insn (ptr_reg, frame_reg_rtx);
27446
27447       ptr_off = -end_save;
27448       insn = rs6000_emit_savres_rtx (info, scratch_reg,
27449                                      info->altivec_save_offset + ptr_off,
27450                                      0, V4SImode, SAVRES_SAVE | SAVRES_VR);
27451       rs6000_frame_related (insn, scratch_reg, sp_off - ptr_off,
27452                             NULL_RTX, NULL_RTX);
27453       if (REGNO (frame_reg_rtx) == REGNO (scratch_reg))
27454         {
27455           /* The oddity mentioned above clobbered our frame reg.  */
27456           emit_move_insn (frame_reg_rtx, ptr_reg);
27457           frame_off = ptr_off;
27458         }
27459     }
27460   else if (!WORLD_SAVE_P (info)
27461            && info->altivec_size != 0)
27462     {
27463       int i;
27464
27465       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
27466         if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
27467           {
27468             rtx areg, savereg, mem;
27469             HOST_WIDE_INT offset;
27470
27471             offset = (info->altivec_save_offset + frame_off
27472                       + 16 * (i - info->first_altivec_reg_save));
27473
27474             savereg = gen_rtx_REG (V4SImode, i);
27475
27476             if (TARGET_P9_VECTOR && quad_address_offset_p (offset))
27477               {
27478                 mem = gen_frame_mem (V4SImode,
27479                                      gen_rtx_PLUS (Pmode, frame_reg_rtx,
27480                                                    GEN_INT (offset)));
27481                 insn = emit_insn (gen_rtx_SET (mem, savereg));
27482                 areg = NULL_RTX;
27483               }
27484             else
27485               {
27486                 NOT_INUSE (0);
27487                 areg = gen_rtx_REG (Pmode, 0);
27488                 emit_move_insn (areg, GEN_INT (offset));
27489
27490                 /* AltiVec addressing mode is [reg+reg].  */
27491                 mem = gen_frame_mem (V4SImode,
27492                                      gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
27493
27494                 /* Rather than emitting a generic move, force use of the stvx
27495                    instruction, which we always want on ISA 2.07 (power8) systems.
27496                    In particular we don't want xxpermdi/stxvd2x for little
27497                    endian.  */
27498                 insn = emit_insn (gen_altivec_stvx_v4si_internal (mem, savereg));
27499               }
27500
27501             rs6000_frame_related (insn, frame_reg_rtx, sp_off - frame_off,
27502                                   areg, GEN_INT (offset));
27503           }
27504     }
27505
27506   /* VRSAVE is a bit vector representing which AltiVec registers
27507      are used.  The OS uses this to determine which vector
27508      registers to save on a context switch.  We need to save
27509      VRSAVE on the stack frame, add whatever AltiVec registers we
27510      used in this function, and do the corresponding magic in the
27511      epilogue.  */
27512
27513   if (!WORLD_SAVE_P (info) && info->vrsave_size != 0)
27514     {
27515       /* Get VRSAVE into a GPR.  Note that ABI_V4 and ABI_DARWIN might
27516          be using r12 as frame_reg_rtx and r11 as the static chain
27517          pointer for nested functions.  */
27518       int save_regno = 12;
27519       if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
27520           && !using_static_chain_p)
27521         save_regno = 11;
27522       else if (using_split_stack || REGNO (frame_reg_rtx) == 12)
27523         {
27524           save_regno = 11;
27525           if (using_static_chain_p)
27526             save_regno = 0;
27527         }
27528       NOT_INUSE (save_regno);
27529
27530       emit_vrsave_prologue (info, save_regno, frame_off, frame_reg_rtx);
27531     }
27532
27533   /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up.  */
27534   if (!TARGET_SINGLE_PIC_BASE
27535       && ((TARGET_TOC && TARGET_MINIMAL_TOC
27536            && !constant_pool_empty_p ())
27537           || (DEFAULT_ABI == ABI_V4
27538               && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
27539               && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))))
27540     {
27541       /* If emit_load_toc_table will use the link register, we need to save
27542          it.  We use R12 for this purpose because emit_load_toc_table
27543          can use register 0.  This allows us to use a plain 'blr' to return
27544          from the procedure more often.  */
27545       int save_LR_around_toc_setup = (TARGET_ELF
27546                                       && DEFAULT_ABI == ABI_V4
27547                                       && flag_pic
27548                                       && ! info->lr_save_p
27549                                       && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) > 0);
27550       if (save_LR_around_toc_setup)
27551         {
27552           rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
27553           rtx tmp = gen_rtx_REG (Pmode, 12);
27554
27555           sp_adjust = 0;
27556           insn = emit_move_insn (tmp, lr);
27557           RTX_FRAME_RELATED_P (insn) = 1;
27558
27559           rs6000_emit_load_toc_table (TRUE);
27560
27561           insn = emit_move_insn (lr, tmp);
27562           add_reg_note (insn, REG_CFA_RESTORE, lr);
27563           RTX_FRAME_RELATED_P (insn) = 1;
27564         }
27565       else
27566         rs6000_emit_load_toc_table (TRUE);
27567     }
27568
27569 #if TARGET_MACHO
27570   if (!TARGET_SINGLE_PIC_BASE
27571       && DEFAULT_ABI == ABI_DARWIN
27572       && flag_pic && crtl->uses_pic_offset_table)
27573     {
27574       rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
27575       rtx src = gen_rtx_SYMBOL_REF (Pmode, MACHOPIC_FUNCTION_BASE_NAME);
27576
27577       /* Save and restore LR locally around this call (in R0).  */
27578       if (!info->lr_save_p)
27579         emit_move_insn (gen_rtx_REG (Pmode, 0), lr);
27580
27581       emit_insn (gen_load_macho_picbase (src));
27582
27583       emit_move_insn (gen_rtx_REG (Pmode,
27584                                    RS6000_PIC_OFFSET_TABLE_REGNUM),
27585                       lr);
27586
27587       if (!info->lr_save_p)
27588         emit_move_insn (lr, gen_rtx_REG (Pmode, 0));
27589     }
27590 #endif
27591
27592   /* If we need to, save the TOC register after doing the stack setup.
27593      Do not emit eh frame info for this save.  The unwinder wants info,
27594      conceptually attached to instructions in this function, about
27595      register values in the caller of this function.  This R2 may have
27596      already been changed from the value in the caller.
27597      We don't attempt to write accurate DWARF EH frame info for R2
27598      because code emitted by gcc for a (non-pointer) function call
27599      doesn't save and restore R2.  Instead, R2 is managed out-of-line
27600      by a linker generated plt call stub when the function resides in
27601      a shared library.  This behavior is costly to describe in DWARF,
27602      both in terms of the size of DWARF info and the time taken in the
27603      unwinder to interpret it.  R2 changes, apart from the
27604      calls_eh_return case earlier in this function, are handled by
27605      linux-unwind.h frob_update_context.  */
27606   if (rs6000_save_toc_in_prologue_p ()
27607       && !cfun->machine->toc_is_wrapped_separately)
27608     {
27609       rtx reg = gen_rtx_REG (reg_mode, TOC_REGNUM);
27610       emit_insn (gen_frame_store (reg, sp_reg_rtx, RS6000_TOC_SAVE_SLOT));
27611     }
27612
27613   /* Set up the arg pointer (r12) for -fsplit-stack code.  */
27614   if (using_split_stack && split_stack_arg_pointer_used_p ())
27615     emit_split_stack_prologue (info, sp_adjust, frame_off, frame_reg_rtx);
27616 }
27617
27618 /* Output .extern statements for the save/restore routines we use.  */
27619
27620 static void
27621 rs6000_output_savres_externs (FILE *file)
27622 {
27623   rs6000_stack_t *info = rs6000_stack_info ();
27624
27625   if (TARGET_DEBUG_STACK)
27626     debug_stack_info (info);
27627
27628   /* Write .extern for any function we will call to save and restore
27629      fp values.  */
27630   if (info->first_fp_reg_save < 64
27631       && !TARGET_MACHO
27632       && !TARGET_ELF)
27633     {
27634       char *name;
27635       int regno = info->first_fp_reg_save - 32;
27636
27637       if ((info->savres_strategy & SAVE_INLINE_FPRS) == 0)
27638         {
27639           bool lr = (info->savres_strategy & SAVE_NOINLINE_FPRS_SAVES_LR) != 0;
27640           int sel = SAVRES_SAVE | SAVRES_FPR | (lr ? SAVRES_LR : 0);
27641           name = rs6000_savres_routine_name (regno, sel);
27642           fprintf (file, "\t.extern %s\n", name);
27643         }
27644       if ((info->savres_strategy & REST_INLINE_FPRS) == 0)
27645         {
27646           bool lr = (info->savres_strategy
27647                      & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0;
27648           int sel = SAVRES_FPR | (lr ? SAVRES_LR : 0);
27649           name = rs6000_savres_routine_name (regno, sel);
27650           fprintf (file, "\t.extern %s\n", name);
27651         }
27652     }
27653 }
27654
27655 /* Write function prologue.  */
27656
27657 static void
27658 rs6000_output_function_prologue (FILE *file)
27659 {
27660   if (!cfun->is_thunk)
27661     {
27662       rs6000_output_savres_externs (file);
27663 #ifdef USING_ELFOS_H
27664       const char *curr_machine = rs6000_machine_from_flags ();
27665       if (rs6000_machine != curr_machine)
27666         {
27667           rs6000_machine = curr_machine;
27668           emit_asm_machine ();
27669         }
27670 #endif
27671     }
27672
27673   /* ELFv2 ABI r2 setup code and local entry point.  This must follow
27674      immediately after the global entry point label.  */
27675   if (rs6000_global_entry_point_prologue_needed_p ())
27676     {
27677       const char *name = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
27678       (*targetm.asm_out.internal_label) (file, "LCF", rs6000_pic_labelno);
27679
27680       if (TARGET_CMODEL != CMODEL_LARGE)
27681         {
27682           /* In the small and medium code models, we assume the TOC is less
27683              2 GB away from the text section, so it can be computed via the
27684              following two-instruction sequence.  */
27685           char buf[256];
27686
27687           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
27688           fprintf (file, "0:\taddis 2,12,.TOC.-");
27689           assemble_name (file, buf);
27690           fprintf (file, "@ha\n");
27691           fprintf (file, "\taddi 2,2,.TOC.-");
27692           assemble_name (file, buf);
27693           fprintf (file, "@l\n");
27694         }
27695       else
27696         {
27697           /* In the large code model, we allow arbitrary offsets between the
27698              TOC and the text section, so we have to load the offset from
27699              memory.  The data field is emitted directly before the global
27700              entry point in rs6000_elf_declare_function_name.  */
27701           char buf[256];
27702
27703 #ifdef HAVE_AS_ENTRY_MARKERS
27704           /* If supported by the linker, emit a marker relocation.  If the
27705              total code size of the final executable or shared library
27706              happens to fit into 2 GB after all, the linker will replace
27707              this code sequence with the sequence for the small or medium
27708              code model.  */
27709           fprintf (file, "\t.reloc .,R_PPC64_ENTRY\n");
27710 #endif
27711           fprintf (file, "\tld 2,");
27712           ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
27713           assemble_name (file, buf);
27714           fprintf (file, "-");
27715           ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
27716           assemble_name (file, buf);
27717           fprintf (file, "(12)\n");
27718           fprintf (file, "\tadd 2,2,12\n");
27719         }
27720
27721       fputs ("\t.localentry\t", file);
27722       assemble_name (file, name);
27723       fputs (",.-", file);
27724       assemble_name (file, name);
27725       fputs ("\n", file);
27726     }
27727
27728   else if (rs6000_pcrel_p (cfun))
27729     {
27730       const char *name = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
27731       /* All functions compiled to use PC-relative addressing will
27732          have a .localentry value of 0 or 1.  For now we set it to
27733          1 all the time, indicating that the function may clobber
27734          the TOC register r2.  Later we may optimize this by setting
27735          it to 0 if the function is a leaf and does not clobber r2.  */
27736       fputs ("\t.localentry\t", file);
27737       assemble_name (file, name);
27738       fputs (",1\n", file);
27739     }
27740
27741   /* Output -mprofile-kernel code.  This needs to be done here instead of
27742      in output_function_profile since it must go after the ELFv2 ABI
27743      local entry point.  */
27744   if (TARGET_PROFILE_KERNEL && crtl->profile)
27745     {
27746       gcc_assert (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2);
27747       gcc_assert (!TARGET_32BIT);
27748
27749       asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
27750
27751       /* In the ELFv2 ABI we have no compiler stack word.  It must be
27752          the resposibility of _mcount to preserve the static chain
27753          register if required.  */
27754       if (DEFAULT_ABI != ABI_ELFv2
27755           && cfun->static_chain_decl != NULL)
27756         {
27757           asm_fprintf (file, "\tstd %s,24(%s)\n",
27758                        reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
27759           fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
27760           asm_fprintf (file, "\tld %s,24(%s)\n",
27761                        reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
27762         }
27763       else
27764         fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
27765     }
27766
27767   rs6000_pic_labelno++;
27768 }
27769
27770 /* -mprofile-kernel code calls mcount before the function prolog,
27771    so a profiled leaf function should stay a leaf function.  */
27772 static bool
27773 rs6000_keep_leaf_when_profiled ()
27774 {
27775   return TARGET_PROFILE_KERNEL;
27776 }
27777
27778 /* Non-zero if vmx regs are restored before the frame pop, zero if
27779    we restore after the pop when possible.  */
27780 #define ALWAYS_RESTORE_ALTIVEC_BEFORE_POP 0
27781
27782 /* Restoring cr is a two step process: loading a reg from the frame
27783    save, then moving the reg to cr.  For ABI_V4 we must let the
27784    unwinder know that the stack location is no longer valid at or
27785    before the stack deallocation, but we can't emit a cfa_restore for
27786    cr at the stack deallocation like we do for other registers.
27787    The trouble is that it is possible for the move to cr to be
27788    scheduled after the stack deallocation.  So say exactly where cr
27789    is located on each of the two insns.  */
27790
27791 static rtx
27792 load_cr_save (int regno, rtx frame_reg_rtx, int offset, bool exit_func)
27793 {
27794   rtx mem = gen_frame_mem_offset (SImode, frame_reg_rtx, offset);
27795   rtx reg = gen_rtx_REG (SImode, regno);
27796   rtx_insn *insn = emit_move_insn (reg, mem);
27797
27798   if (!exit_func && DEFAULT_ABI == ABI_V4)
27799     {
27800       rtx cr = gen_rtx_REG (SImode, CR2_REGNO);
27801       rtx set = gen_rtx_SET (reg, cr);
27802
27803       add_reg_note (insn, REG_CFA_REGISTER, set);
27804       RTX_FRAME_RELATED_P (insn) = 1;
27805     }
27806   return reg;
27807 }
27808
27809 /* Reload CR from REG.  */
27810
27811 static void
27812 restore_saved_cr (rtx reg, bool using_mfcr_multiple, bool exit_func)
27813 {
27814   int count = 0;
27815   int i;
27816
27817   if (using_mfcr_multiple)
27818     {
27819       for (i = 0; i < 8; i++)
27820         if (save_reg_p (CR0_REGNO + i))
27821           count++;
27822       gcc_assert (count);
27823     }
27824
27825   if (using_mfcr_multiple && count > 1)
27826     {
27827       rtx_insn *insn;
27828       rtvec p;
27829       int ndx;
27830
27831       p = rtvec_alloc (count);
27832
27833       ndx = 0;
27834       for (i = 0; i < 8; i++)
27835         if (save_reg_p (CR0_REGNO + i))
27836           {
27837             rtvec r = rtvec_alloc (2);
27838             RTVEC_ELT (r, 0) = reg;
27839             RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
27840             RTVEC_ELT (p, ndx) =
27841               gen_rtx_SET (gen_rtx_REG (CCmode, CR0_REGNO + i),
27842                            gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
27843             ndx++;
27844           }
27845       insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
27846       gcc_assert (ndx == count);
27847
27848       /* For the ELFv2 ABI we generate a CFA_RESTORE for each
27849          CR field separately.  */
27850       if (!exit_func && DEFAULT_ABI == ABI_ELFv2 && flag_shrink_wrap)
27851         {
27852           for (i = 0; i < 8; i++)
27853             if (save_reg_p (CR0_REGNO + i))
27854               add_reg_note (insn, REG_CFA_RESTORE,
27855                             gen_rtx_REG (SImode, CR0_REGNO + i));
27856
27857           RTX_FRAME_RELATED_P (insn) = 1;
27858         }
27859     }
27860   else
27861     for (i = 0; i < 8; i++)
27862       if (save_reg_p (CR0_REGNO + i))
27863         {
27864           rtx insn = emit_insn (gen_movsi_to_cr_one
27865                                  (gen_rtx_REG (CCmode, CR0_REGNO + i), reg));
27866
27867           /* For the ELFv2 ABI we generate a CFA_RESTORE for each
27868              CR field separately, attached to the insn that in fact
27869              restores this particular CR field.  */
27870           if (!exit_func && DEFAULT_ABI == ABI_ELFv2 && flag_shrink_wrap)
27871             {
27872               add_reg_note (insn, REG_CFA_RESTORE,
27873                             gen_rtx_REG (SImode, CR0_REGNO + i));
27874
27875               RTX_FRAME_RELATED_P (insn) = 1;
27876             }
27877         }
27878
27879   /* For other ABIs, we just generate a single CFA_RESTORE for CR2.  */
27880   if (!exit_func && DEFAULT_ABI != ABI_ELFv2
27881       && (DEFAULT_ABI == ABI_V4 || flag_shrink_wrap))
27882     {
27883       rtx_insn *insn = get_last_insn ();
27884       rtx cr = gen_rtx_REG (SImode, CR2_REGNO);
27885
27886       add_reg_note (insn, REG_CFA_RESTORE, cr);
27887       RTX_FRAME_RELATED_P (insn) = 1;
27888     }
27889 }
27890
27891 /* Like cr, the move to lr instruction can be scheduled after the
27892    stack deallocation, but unlike cr, its stack frame save is still
27893    valid.  So we only need to emit the cfa_restore on the correct
27894    instruction.  */
27895
27896 static void
27897 load_lr_save (int regno, rtx frame_reg_rtx, int offset)
27898 {
27899   rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx, offset);
27900   rtx reg = gen_rtx_REG (Pmode, regno);
27901
27902   emit_move_insn (reg, mem);
27903 }
27904
27905 static void
27906 restore_saved_lr (int regno, bool exit_func)
27907 {
27908   rtx reg = gen_rtx_REG (Pmode, regno);
27909   rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
27910   rtx_insn *insn = emit_move_insn (lr, reg);
27911
27912   if (!exit_func && flag_shrink_wrap)
27913     {
27914       add_reg_note (insn, REG_CFA_RESTORE, lr);
27915       RTX_FRAME_RELATED_P (insn) = 1;
27916     }
27917 }
27918
27919 static rtx
27920 add_crlr_cfa_restore (const rs6000_stack_t *info, rtx cfa_restores)
27921 {
27922   if (DEFAULT_ABI == ABI_ELFv2)
27923     {
27924       int i;
27925       for (i = 0; i < 8; i++)
27926         if (save_reg_p (CR0_REGNO + i))
27927           {
27928             rtx cr = gen_rtx_REG (SImode, CR0_REGNO + i);
27929             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, cr,
27930                                            cfa_restores);
27931           }
27932     }
27933   else if (info->cr_save_p)
27934     cfa_restores = alloc_reg_note (REG_CFA_RESTORE,
27935                                    gen_rtx_REG (SImode, CR2_REGNO),
27936                                    cfa_restores);
27937
27938   if (info->lr_save_p)
27939     cfa_restores = alloc_reg_note (REG_CFA_RESTORE,
27940                                    gen_rtx_REG (Pmode, LR_REGNO),
27941                                    cfa_restores);
27942   return cfa_restores;
27943 }
27944
27945 /* Return true if OFFSET from stack pointer can be clobbered by signals.
27946    V.4 doesn't have any stack cushion, AIX ABIs have 220 or 288 bytes
27947    below stack pointer not cloberred by signals.  */
27948
27949 static inline bool
27950 offset_below_red_zone_p (HOST_WIDE_INT offset)
27951 {
27952   return offset < (DEFAULT_ABI == ABI_V4
27953                    ? 0
27954                    : TARGET_32BIT ? -220 : -288);
27955 }
27956
27957 /* Append CFA_RESTORES to any existing REG_NOTES on the last insn.  */
27958
27959 static void
27960 emit_cfa_restores (rtx cfa_restores)
27961 {
27962   rtx_insn *insn = get_last_insn ();
27963   rtx *loc = &REG_NOTES (insn);
27964
27965   while (*loc)
27966     loc = &XEXP (*loc, 1);
27967   *loc = cfa_restores;
27968   RTX_FRAME_RELATED_P (insn) = 1;
27969 }
27970
27971 /* Emit function epilogue as insns.  */
27972
27973 void
27974 rs6000_emit_epilogue (enum epilogue_type epilogue_type)
27975 {
27976   HOST_WIDE_INT frame_off = 0;
27977   rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
27978   rtx frame_reg_rtx = sp_reg_rtx;
27979   rtx cfa_restores = NULL_RTX;
27980   rtx insn;
27981   rtx cr_save_reg = NULL_RTX;
27982   machine_mode reg_mode = Pmode;
27983   int reg_size = TARGET_32BIT ? 4 : 8;
27984   machine_mode fp_reg_mode = TARGET_HARD_FLOAT ? DFmode : SFmode;
27985   int fp_reg_size = 8;
27986   int i;
27987   unsigned ptr_regno;
27988
27989   rs6000_stack_t *info = rs6000_stack_info ();
27990
27991   if (epilogue_type == EPILOGUE_TYPE_NORMAL && crtl->calls_eh_return)
27992     epilogue_type = EPILOGUE_TYPE_EH_RETURN;
27993
27994   int strategy = info->savres_strategy;
27995   bool using_load_multiple = !!(strategy & REST_MULTIPLE);
27996   bool restoring_GPRs_inline = !!(strategy & REST_INLINE_GPRS);
27997   bool restoring_FPRs_inline = !!(strategy & REST_INLINE_FPRS);
27998   if (epilogue_type == EPILOGUE_TYPE_SIBCALL)
27999     {
28000       restoring_GPRs_inline = true;
28001       restoring_FPRs_inline = true;
28002     }
28003
28004   bool using_mtcr_multiple = (rs6000_tune == PROCESSOR_PPC601
28005                               || rs6000_tune == PROCESSOR_PPC603
28006                               || rs6000_tune == PROCESSOR_PPC750
28007                               || optimize_size);
28008
28009   /* Restore via the backchain when we have a large frame, since this
28010      is more efficient than an addis, addi pair.  The second condition
28011      here will not trigger at the moment;  We don't actually need a
28012      frame pointer for alloca, but the generic parts of the compiler
28013      give us one anyway.  */
28014   bool use_backchain_to_restore_sp
28015     = (info->total_size + (info->lr_save_p ? info->lr_save_offset : 0) > 32767
28016        || (cfun->calls_alloca && !frame_pointer_needed));
28017
28018   bool restore_lr = (info->lr_save_p
28019                 && (restoring_FPRs_inline
28020                     || (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR))
28021                 && (restoring_GPRs_inline
28022                     || info->first_fp_reg_save < 64)
28023                 && !cfun->machine->lr_is_wrapped_separately);
28024
28025
28026   if (WORLD_SAVE_P (info))
28027     {
28028       gcc_assert (epilogue_type != EPILOGUE_TYPE_SIBCALL);
28029
28030       /* eh_rest_world_r10 will return to the location saved in the LR
28031          stack slot (which is not likely to be our caller.)
28032          Input: R10 -- stack adjustment.  Clobbers R0, R11, R12, R7, R8.
28033          rest_world is similar, except any R10 parameter is ignored.
28034          The exception-handling stuff that was here in 2.95 is no
28035          longer necessary.  */
28036
28037       rtvec p;
28038       p = rtvec_alloc (9
28039                        + 32 - info->first_gp_reg_save
28040                        + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
28041                        + 63 + 1 - info->first_fp_reg_save);
28042
28043       const char *rname;
28044       switch (epilogue_type)
28045         {
28046         case EPILOGUE_TYPE_NORMAL:
28047           rname = ggc_strdup ("*rest_world");
28048           break;
28049
28050         case EPILOGUE_TYPE_EH_RETURN:
28051           rname = ggc_strdup ("*eh_rest_world_r10");
28052           break;
28053
28054         default:
28055           gcc_unreachable ();
28056         }
28057
28058       int j = 0;
28059       RTVEC_ELT (p, j++) = ret_rtx;
28060       RTVEC_ELT (p, j++)
28061         = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, rname));
28062       /* The instruction pattern requires a clobber here;
28063          it is shared with the restVEC helper. */
28064       RTVEC_ELT (p, j++) = gen_hard_reg_clobber (Pmode, 11);
28065
28066       {
28067         /* CR register traditionally saved as CR2.  */
28068         rtx reg = gen_rtx_REG (SImode, CR2_REGNO);
28069         RTVEC_ELT (p, j++)
28070           = gen_frame_load (reg, frame_reg_rtx, info->cr_save_offset);
28071         if (flag_shrink_wrap)
28072           {
28073             cfa_restores = alloc_reg_note (REG_CFA_RESTORE,
28074                                            gen_rtx_REG (Pmode, LR_REGNO),
28075                                            cfa_restores);
28076             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
28077           }
28078       }
28079
28080       int i;
28081       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
28082         {
28083           rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
28084           RTVEC_ELT (p, j++)
28085             = gen_frame_load (reg,
28086                               frame_reg_rtx, info->gp_save_offset + reg_size * i);
28087           if (flag_shrink_wrap
28088               && save_reg_p (info->first_gp_reg_save + i))
28089             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
28090         }
28091       for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
28092         {
28093           rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
28094           RTVEC_ELT (p, j++)
28095             = gen_frame_load (reg,
28096                               frame_reg_rtx, info->altivec_save_offset + 16 * i);
28097           if (flag_shrink_wrap
28098               && save_reg_p (info->first_altivec_reg_save + i))
28099             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
28100         }
28101       for (i = 0; info->first_fp_reg_save + i <= 63; i++)
28102         {
28103           rtx reg = gen_rtx_REG (TARGET_HARD_FLOAT ? DFmode : SFmode,
28104                                  info->first_fp_reg_save + i);
28105           RTVEC_ELT (p, j++)
28106             = gen_frame_load (reg, frame_reg_rtx, info->fp_save_offset + 8 * i);
28107           if (flag_shrink_wrap
28108               && save_reg_p (info->first_fp_reg_save + i))
28109             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
28110         }
28111       RTVEC_ELT (p, j++) = gen_hard_reg_clobber (Pmode, 0);
28112       RTVEC_ELT (p, j++) = gen_hard_reg_clobber (SImode, 12);
28113       RTVEC_ELT (p, j++) = gen_hard_reg_clobber (SImode, 7);
28114       RTVEC_ELT (p, j++) = gen_hard_reg_clobber (SImode, 8);
28115       RTVEC_ELT (p, j++)
28116         = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
28117       insn = emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
28118
28119       if (flag_shrink_wrap)
28120         {
28121           REG_NOTES (insn) = cfa_restores;
28122           add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
28123           RTX_FRAME_RELATED_P (insn) = 1;
28124         }
28125       return;
28126     }
28127
28128   /* frame_reg_rtx + frame_off points to the top of this stack frame.  */
28129   if (info->push_p)
28130     frame_off = info->total_size;
28131
28132   /* Restore AltiVec registers if we must do so before adjusting the
28133      stack.  */
28134   if (info->altivec_size != 0
28135       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
28136           || (DEFAULT_ABI != ABI_V4
28137               && offset_below_red_zone_p (info->altivec_save_offset))))
28138     {
28139       int i;
28140       int scratch_regno = ptr_regno_for_savres (SAVRES_VR);
28141
28142       gcc_checking_assert (scratch_regno == 11 || scratch_regno == 12);
28143       if (use_backchain_to_restore_sp)
28144         {
28145           int frame_regno = 11;
28146
28147           if ((strategy & REST_INLINE_VRS) == 0)
28148             {
28149               /* Of r11 and r12, select the one not clobbered by an
28150                  out-of-line restore function for the frame register.  */
28151               frame_regno = 11 + 12 - scratch_regno;
28152             }
28153           frame_reg_rtx = gen_rtx_REG (Pmode, frame_regno);
28154           emit_move_insn (frame_reg_rtx,
28155                           gen_rtx_MEM (Pmode, sp_reg_rtx));
28156           frame_off = 0;
28157         }
28158       else if (frame_pointer_needed)
28159         frame_reg_rtx = hard_frame_pointer_rtx;
28160
28161       if ((strategy & REST_INLINE_VRS) == 0)
28162         {
28163           int end_save = info->altivec_save_offset + info->altivec_size;
28164           int ptr_off;
28165           rtx ptr_reg = gen_rtx_REG (Pmode, 0);
28166           rtx scratch_reg = gen_rtx_REG (Pmode, scratch_regno);
28167
28168           if (end_save + frame_off != 0)
28169             {
28170               rtx offset = GEN_INT (end_save + frame_off);
28171
28172               emit_insn (gen_add3_insn (ptr_reg, frame_reg_rtx, offset));
28173             }
28174           else
28175             emit_move_insn (ptr_reg, frame_reg_rtx);
28176
28177           ptr_off = -end_save;
28178           insn = rs6000_emit_savres_rtx (info, scratch_reg,
28179                                          info->altivec_save_offset + ptr_off,
28180                                          0, V4SImode, SAVRES_VR);
28181         }
28182       else
28183         {
28184           for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
28185             if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
28186               {
28187                 rtx addr, areg, mem, insn;
28188                 rtx reg = gen_rtx_REG (V4SImode, i);
28189                 HOST_WIDE_INT offset
28190                   = (info->altivec_save_offset + frame_off
28191                      + 16 * (i - info->first_altivec_reg_save));
28192
28193                 if (TARGET_P9_VECTOR && quad_address_offset_p (offset))
28194                   {
28195                     mem = gen_frame_mem (V4SImode,
28196                                          gen_rtx_PLUS (Pmode, frame_reg_rtx,
28197                                                        GEN_INT (offset)));
28198                     insn = gen_rtx_SET (reg, mem);
28199                   }
28200                 else
28201                   {
28202                     areg = gen_rtx_REG (Pmode, 0);
28203                     emit_move_insn (areg, GEN_INT (offset));
28204
28205                     /* AltiVec addressing mode is [reg+reg].  */
28206                     addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
28207                     mem = gen_frame_mem (V4SImode, addr);
28208
28209                     /* Rather than emitting a generic move, force use of the
28210                        lvx instruction, which we always want.  In particular we
28211                        don't want lxvd2x/xxpermdi for little endian.  */
28212                     insn = gen_altivec_lvx_v4si_internal (reg, mem);
28213                   }
28214
28215                 (void) emit_insn (insn);
28216               }
28217         }
28218
28219       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
28220         if (((strategy & REST_INLINE_VRS) == 0
28221              || (info->vrsave_mask & ALTIVEC_REG_BIT (i)) != 0)
28222             && (flag_shrink_wrap
28223                 || (offset_below_red_zone_p
28224                     (info->altivec_save_offset
28225                      + 16 * (i - info->first_altivec_reg_save))))
28226             && save_reg_p (i))
28227           {
28228             rtx reg = gen_rtx_REG (V4SImode, i);
28229             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
28230           }
28231     }
28232
28233   /* Restore VRSAVE if we must do so before adjusting the stack.  */
28234   if (info->vrsave_size != 0
28235       && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
28236           || (DEFAULT_ABI != ABI_V4
28237               && offset_below_red_zone_p (info->vrsave_save_offset))))
28238     {
28239       rtx reg;
28240
28241       if (frame_reg_rtx == sp_reg_rtx)
28242         {
28243           if (use_backchain_to_restore_sp)
28244             {
28245               frame_reg_rtx = gen_rtx_REG (Pmode, 11);
28246               emit_move_insn (frame_reg_rtx,
28247                               gen_rtx_MEM (Pmode, sp_reg_rtx));
28248               frame_off = 0;
28249             }
28250           else if (frame_pointer_needed)
28251             frame_reg_rtx = hard_frame_pointer_rtx;
28252         }
28253
28254       reg = gen_rtx_REG (SImode, 12);
28255       emit_insn (gen_frame_load (reg, frame_reg_rtx,
28256                                  info->vrsave_save_offset + frame_off));
28257
28258       emit_insn (generate_set_vrsave (reg, info, 1));
28259     }
28260
28261   insn = NULL_RTX;
28262   /* If we have a large stack frame, restore the old stack pointer
28263      using the backchain.  */
28264   if (use_backchain_to_restore_sp)
28265     {
28266       if (frame_reg_rtx == sp_reg_rtx)
28267         {
28268           /* Under V.4, don't reset the stack pointer until after we're done
28269              loading the saved registers.  */
28270           if (DEFAULT_ABI == ABI_V4)
28271             frame_reg_rtx = gen_rtx_REG (Pmode, 11);
28272
28273           insn = emit_move_insn (frame_reg_rtx,
28274                                  gen_rtx_MEM (Pmode, sp_reg_rtx));
28275           frame_off = 0;
28276         }
28277       else if (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
28278                && DEFAULT_ABI == ABI_V4)
28279         /* frame_reg_rtx has been set up by the altivec restore.  */
28280         ;
28281       else
28282         {
28283           insn = emit_move_insn (sp_reg_rtx, frame_reg_rtx);
28284           frame_reg_rtx = sp_reg_rtx;
28285         }
28286     }
28287   /* If we have a frame pointer, we can restore the old stack pointer
28288      from it.  */
28289   else if (frame_pointer_needed)
28290     {
28291       frame_reg_rtx = sp_reg_rtx;
28292       if (DEFAULT_ABI == ABI_V4)
28293         frame_reg_rtx = gen_rtx_REG (Pmode, 11);
28294       /* Prevent reordering memory accesses against stack pointer restore.  */
28295       else if (cfun->calls_alloca
28296                || offset_below_red_zone_p (-info->total_size))
28297         rs6000_emit_stack_tie (frame_reg_rtx, true);
28298
28299       insn = emit_insn (gen_add3_insn (frame_reg_rtx, hard_frame_pointer_rtx,
28300                                        GEN_INT (info->total_size)));
28301       frame_off = 0;
28302     }
28303   else if (info->push_p
28304            && DEFAULT_ABI != ABI_V4
28305            && epilogue_type != EPILOGUE_TYPE_EH_RETURN)
28306     {
28307       /* Prevent reordering memory accesses against stack pointer restore.  */
28308       if (cfun->calls_alloca
28309           || offset_below_red_zone_p (-info->total_size))
28310         rs6000_emit_stack_tie (frame_reg_rtx, false);
28311       insn = emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx,
28312                                        GEN_INT (info->total_size)));
28313       frame_off = 0;
28314     }
28315   if (insn && frame_reg_rtx == sp_reg_rtx)
28316     {
28317       if (cfa_restores)
28318         {
28319           REG_NOTES (insn) = cfa_restores;
28320           cfa_restores = NULL_RTX;
28321         }
28322       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
28323       RTX_FRAME_RELATED_P (insn) = 1;
28324     }
28325
28326   /* Restore AltiVec registers if we have not done so already.  */
28327   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
28328       && info->altivec_size != 0
28329       && (DEFAULT_ABI == ABI_V4
28330           || !offset_below_red_zone_p (info->altivec_save_offset)))
28331     {
28332       int i;
28333
28334       if ((strategy & REST_INLINE_VRS) == 0)
28335         {
28336           int end_save = info->altivec_save_offset + info->altivec_size;
28337           int ptr_off;
28338           rtx ptr_reg = gen_rtx_REG (Pmode, 0);
28339           int scratch_regno = ptr_regno_for_savres (SAVRES_VR);
28340           rtx scratch_reg = gen_rtx_REG (Pmode, scratch_regno);
28341
28342           if (end_save + frame_off != 0)
28343             {
28344               rtx offset = GEN_INT (end_save + frame_off);
28345
28346               emit_insn (gen_add3_insn (ptr_reg, frame_reg_rtx, offset));
28347             }
28348           else
28349             emit_move_insn (ptr_reg, frame_reg_rtx);
28350
28351           ptr_off = -end_save;
28352           insn = rs6000_emit_savres_rtx (info, scratch_reg,
28353                                          info->altivec_save_offset + ptr_off,
28354                                          0, V4SImode, SAVRES_VR);
28355           if (REGNO (frame_reg_rtx) == REGNO (scratch_reg))
28356             {
28357               /* Frame reg was clobbered by out-of-line save.  Restore it
28358                  from ptr_reg, and if we are calling out-of-line gpr or
28359                  fpr restore set up the correct pointer and offset.  */
28360               unsigned newptr_regno = 1;
28361               if (!restoring_GPRs_inline)
28362                 {
28363                   bool lr = info->gp_save_offset + info->gp_size == 0;
28364                   int sel = SAVRES_GPR | (lr ? SAVRES_LR : 0);
28365                   newptr_regno = ptr_regno_for_savres (sel);
28366                   end_save = info->gp_save_offset + info->gp_size;
28367                 }
28368               else if (!restoring_FPRs_inline)
28369                 {
28370                   bool lr = !(strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR);
28371                   int sel = SAVRES_FPR | (lr ? SAVRES_LR : 0);
28372                   newptr_regno = ptr_regno_for_savres (sel);
28373                   end_save = info->fp_save_offset + info->fp_size;
28374                 }
28375
28376               if (newptr_regno != 1 && REGNO (frame_reg_rtx) != newptr_regno)
28377                 frame_reg_rtx = gen_rtx_REG (Pmode, newptr_regno);
28378                 
28379               if (end_save + ptr_off != 0)
28380                 {
28381                   rtx offset = GEN_INT (end_save + ptr_off);
28382
28383                   frame_off = -end_save;
28384                   if (TARGET_32BIT)
28385                     emit_insn (gen_addsi3_carry (frame_reg_rtx,
28386                                                  ptr_reg, offset));
28387                   else
28388                     emit_insn (gen_adddi3_carry (frame_reg_rtx,
28389                                                  ptr_reg, offset));
28390                 }
28391               else
28392                 {
28393                   frame_off = ptr_off;
28394                   emit_move_insn (frame_reg_rtx, ptr_reg);
28395                 }
28396             }
28397         }
28398       else
28399         {
28400           for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
28401             if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
28402               {
28403                 rtx addr, areg, mem, insn;
28404                 rtx reg = gen_rtx_REG (V4SImode, i);
28405                 HOST_WIDE_INT offset
28406                   = (info->altivec_save_offset + frame_off
28407                      + 16 * (i - info->first_altivec_reg_save));
28408
28409                 if (TARGET_P9_VECTOR && quad_address_offset_p (offset))
28410                   {
28411                     mem = gen_frame_mem (V4SImode,
28412                                          gen_rtx_PLUS (Pmode, frame_reg_rtx,
28413                                                        GEN_INT (offset)));
28414                     insn = gen_rtx_SET (reg, mem);
28415                   }
28416                 else
28417                   {
28418                     areg = gen_rtx_REG (Pmode, 0);
28419                     emit_move_insn (areg, GEN_INT (offset));
28420
28421                     /* AltiVec addressing mode is [reg+reg].  */
28422                     addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
28423                     mem = gen_frame_mem (V4SImode, addr);
28424
28425                     /* Rather than emitting a generic move, force use of the
28426                        lvx instruction, which we always want.  In particular we
28427                        don't want lxvd2x/xxpermdi for little endian.  */
28428                     insn = gen_altivec_lvx_v4si_internal (reg, mem);
28429                   }
28430
28431                 (void) emit_insn (insn);
28432               }
28433         }
28434
28435       for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
28436         if (((strategy & REST_INLINE_VRS) == 0
28437              || (info->vrsave_mask & ALTIVEC_REG_BIT (i)) != 0)
28438             && (DEFAULT_ABI == ABI_V4 || flag_shrink_wrap)
28439             && save_reg_p (i))
28440           {
28441             rtx reg = gen_rtx_REG (V4SImode, i);
28442             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
28443           }
28444     }
28445
28446   /* Restore VRSAVE if we have not done so already.  */
28447   if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
28448       && info->vrsave_size != 0
28449       && (DEFAULT_ABI == ABI_V4
28450           || !offset_below_red_zone_p (info->vrsave_save_offset)))
28451     {
28452       rtx reg;
28453
28454       reg = gen_rtx_REG (SImode, 12);
28455       emit_insn (gen_frame_load (reg, frame_reg_rtx,
28456                                  info->vrsave_save_offset + frame_off));
28457
28458       emit_insn (generate_set_vrsave (reg, info, 1));
28459     }
28460
28461   /* If we exit by an out-of-line restore function on ABI_V4 then that
28462      function will deallocate the stack, so we don't need to worry
28463      about the unwinder restoring cr from an invalid stack frame
28464      location.  */
28465   bool exit_func = (!restoring_FPRs_inline
28466                     || (!restoring_GPRs_inline
28467                         && info->first_fp_reg_save == 64));
28468
28469   /* In the ELFv2 ABI we need to restore all call-saved CR fields from
28470      *separate* slots if the routine calls __builtin_eh_return, so
28471      that they can be independently restored by the unwinder.  */
28472   if (DEFAULT_ABI == ABI_ELFv2 && crtl->calls_eh_return)
28473     {
28474       int i, cr_off = info->ehcr_offset;
28475
28476       for (i = 0; i < 8; i++)
28477         if (!call_used_regs[CR0_REGNO + i])
28478           {
28479             rtx reg = gen_rtx_REG (SImode, 0);
28480             emit_insn (gen_frame_load (reg, frame_reg_rtx,
28481                                        cr_off + frame_off));
28482
28483             insn = emit_insn (gen_movsi_to_cr_one
28484                                 (gen_rtx_REG (CCmode, CR0_REGNO + i), reg));
28485
28486             if (!exit_func && flag_shrink_wrap)
28487               {
28488                 add_reg_note (insn, REG_CFA_RESTORE,
28489                               gen_rtx_REG (SImode, CR0_REGNO + i));
28490
28491                 RTX_FRAME_RELATED_P (insn) = 1;
28492               }
28493
28494             cr_off += reg_size;
28495           }
28496     }
28497
28498   /* Get the old lr if we saved it.  If we are restoring registers
28499      out-of-line, then the out-of-line routines can do this for us.  */
28500   if (restore_lr && restoring_GPRs_inline)
28501     load_lr_save (0, frame_reg_rtx, info->lr_save_offset + frame_off);
28502
28503   /* Get the old cr if we saved it.  */
28504   if (info->cr_save_p)
28505     {
28506       unsigned cr_save_regno = 12;
28507
28508       if (!restoring_GPRs_inline)
28509         {
28510           /* Ensure we don't use the register used by the out-of-line
28511              gpr register restore below.  */
28512           bool lr = info->gp_save_offset + info->gp_size == 0;
28513           int sel = SAVRES_GPR | (lr ? SAVRES_LR : 0);
28514           int gpr_ptr_regno = ptr_regno_for_savres (sel);
28515
28516           if (gpr_ptr_regno == 12)
28517             cr_save_regno = 11;
28518           gcc_checking_assert (REGNO (frame_reg_rtx) != cr_save_regno);
28519         }
28520       else if (REGNO (frame_reg_rtx) == 12)
28521         cr_save_regno = 11;
28522
28523       cr_save_reg = load_cr_save (cr_save_regno, frame_reg_rtx,
28524                                   info->cr_save_offset + frame_off,
28525                                   exit_func);
28526     }
28527
28528   /* Set LR here to try to overlap restores below.  */
28529   if (restore_lr && restoring_GPRs_inline)
28530     restore_saved_lr (0, exit_func);
28531
28532   /* Load exception handler data registers, if needed.  */
28533   if (epilogue_type == EPILOGUE_TYPE_EH_RETURN)
28534     {
28535       unsigned int i, regno;
28536
28537       if (TARGET_AIX)
28538         {
28539           rtx reg = gen_rtx_REG (reg_mode, 2);
28540           emit_insn (gen_frame_load (reg, frame_reg_rtx,
28541                                      frame_off + RS6000_TOC_SAVE_SLOT));
28542         }
28543
28544       for (i = 0; ; ++i)
28545         {
28546           rtx mem;
28547
28548           regno = EH_RETURN_DATA_REGNO (i);
28549           if (regno == INVALID_REGNUM)
28550             break;
28551
28552           mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
28553                                       info->ehrd_offset + frame_off
28554                                       + reg_size * (int) i);
28555
28556           emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
28557         }
28558     }
28559
28560   /* Restore GPRs.  This is done as a PARALLEL if we are using
28561      the load-multiple instructions.  */
28562   if (!restoring_GPRs_inline)
28563     {
28564       /* We are jumping to an out-of-line function.  */
28565       rtx ptr_reg;
28566       int end_save = info->gp_save_offset + info->gp_size;
28567       bool can_use_exit = end_save == 0;
28568       int sel = SAVRES_GPR | (can_use_exit ? SAVRES_LR : 0);
28569       int ptr_off;
28570
28571       /* Emit stack reset code if we need it.  */
28572       ptr_regno = ptr_regno_for_savres (sel);
28573       ptr_reg = gen_rtx_REG (Pmode, ptr_regno);
28574       if (can_use_exit)
28575         rs6000_emit_stack_reset (frame_reg_rtx, frame_off, ptr_regno);
28576       else if (end_save + frame_off != 0)
28577         emit_insn (gen_add3_insn (ptr_reg, frame_reg_rtx,
28578                                   GEN_INT (end_save + frame_off)));
28579       else if (REGNO (frame_reg_rtx) != ptr_regno)
28580         emit_move_insn (ptr_reg, frame_reg_rtx);
28581       if (REGNO (frame_reg_rtx) == ptr_regno)
28582         frame_off = -end_save;
28583
28584       if (can_use_exit && info->cr_save_p)
28585         restore_saved_cr (cr_save_reg, using_mtcr_multiple, true);
28586
28587       ptr_off = -end_save;
28588       rs6000_emit_savres_rtx (info, ptr_reg,
28589                               info->gp_save_offset + ptr_off,
28590                               info->lr_save_offset + ptr_off,
28591                               reg_mode, sel);
28592     }
28593   else if (using_load_multiple)
28594     {
28595       rtvec p;
28596       p = rtvec_alloc (32 - info->first_gp_reg_save);
28597       for (i = 0; i < 32 - info->first_gp_reg_save; i++)
28598         RTVEC_ELT (p, i)
28599           = gen_frame_load (gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
28600                             frame_reg_rtx,
28601                             info->gp_save_offset + frame_off + reg_size * i);
28602       emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
28603     }
28604   else
28605     {
28606       int offset = info->gp_save_offset + frame_off;
28607       for (i = info->first_gp_reg_save; i < 32; i++)
28608         {
28609           if (save_reg_p (i)
28610               && !cfun->machine->gpr_is_wrapped_separately[i])
28611             {
28612               rtx reg = gen_rtx_REG (reg_mode, i);
28613               emit_insn (gen_frame_load (reg, frame_reg_rtx, offset));
28614             }
28615
28616           offset += reg_size;
28617         }
28618     }
28619
28620   if (DEFAULT_ABI == ABI_V4 || flag_shrink_wrap)
28621     {
28622       /* If the frame pointer was used then we can't delay emitting
28623          a REG_CFA_DEF_CFA note.  This must happen on the insn that
28624          restores the frame pointer, r31.  We may have already emitted
28625          a REG_CFA_DEF_CFA note, but that's OK;  A duplicate is
28626          discarded by dwarf2cfi.c/dwarf2out.c, and in any case would
28627          be harmless if emitted.  */
28628       if (frame_pointer_needed)
28629         {
28630           insn = get_last_insn ();
28631           add_reg_note (insn, REG_CFA_DEF_CFA,
28632                         plus_constant (Pmode, frame_reg_rtx, frame_off));
28633           RTX_FRAME_RELATED_P (insn) = 1;
28634         }
28635
28636       /* Set up cfa_restores.  We always need these when
28637          shrink-wrapping.  If not shrink-wrapping then we only need
28638          the cfa_restore when the stack location is no longer valid.
28639          The cfa_restores must be emitted on or before the insn that
28640          invalidates the stack, and of course must not be emitted
28641          before the insn that actually does the restore.  The latter
28642          is why it is a bad idea to emit the cfa_restores as a group
28643          on the last instruction here that actually does a restore:
28644          That insn may be reordered with respect to others doing
28645          restores.  */
28646       if (flag_shrink_wrap
28647           && !restoring_GPRs_inline
28648           && info->first_fp_reg_save == 64)
28649         cfa_restores = add_crlr_cfa_restore (info, cfa_restores);
28650
28651       for (i = info->first_gp_reg_save; i < 32; i++)
28652         if (save_reg_p (i)
28653             && !cfun->machine->gpr_is_wrapped_separately[i])
28654           {
28655             rtx reg = gen_rtx_REG (reg_mode, i);
28656             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
28657           }
28658     }
28659
28660   if (!restoring_GPRs_inline
28661       && info->first_fp_reg_save == 64)
28662     {
28663       /* We are jumping to an out-of-line function.  */
28664       if (cfa_restores)
28665         emit_cfa_restores (cfa_restores);
28666       return;
28667     }
28668
28669   if (restore_lr && !restoring_GPRs_inline)
28670     {
28671       load_lr_save (0, frame_reg_rtx, info->lr_save_offset + frame_off);
28672       restore_saved_lr (0, exit_func);
28673     }
28674
28675   /* Restore fpr's if we need to do it without calling a function.  */
28676   if (restoring_FPRs_inline)
28677     {
28678       int offset = info->fp_save_offset + frame_off;
28679       for (i = info->first_fp_reg_save; i < 64; i++)
28680         {
28681           if (save_reg_p (i)
28682               && !cfun->machine->fpr_is_wrapped_separately[i - 32])
28683             {
28684               rtx reg = gen_rtx_REG (fp_reg_mode, i);
28685               emit_insn (gen_frame_load (reg, frame_reg_rtx, offset));
28686               if (DEFAULT_ABI == ABI_V4 || flag_shrink_wrap)
28687                 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
28688                                                cfa_restores);
28689             }
28690
28691           offset += fp_reg_size;
28692         }
28693     }
28694
28695   /* If we saved cr, restore it here.  Just those that were used.  */
28696   if (info->cr_save_p)
28697     restore_saved_cr (cr_save_reg, using_mtcr_multiple, exit_func);
28698
28699   /* If this is V.4, unwind the stack pointer after all of the loads
28700      have been done, or set up r11 if we are restoring fp out of line.  */
28701   ptr_regno = 1;
28702   if (!restoring_FPRs_inline)
28703     {
28704       bool lr = (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0;
28705       int sel = SAVRES_FPR | (lr ? SAVRES_LR : 0);
28706       ptr_regno = ptr_regno_for_savres (sel);
28707     }
28708
28709   insn = rs6000_emit_stack_reset (frame_reg_rtx, frame_off, ptr_regno);
28710   if (REGNO (frame_reg_rtx) == ptr_regno)
28711     frame_off = 0;
28712
28713   if (insn && restoring_FPRs_inline)
28714     {
28715       if (cfa_restores)
28716         {
28717           REG_NOTES (insn) = cfa_restores;
28718           cfa_restores = NULL_RTX;
28719         }
28720       add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
28721       RTX_FRAME_RELATED_P (insn) = 1;
28722     }
28723
28724   if (epilogue_type == EPILOGUE_TYPE_EH_RETURN)
28725     {
28726       rtx sa = EH_RETURN_STACKADJ_RTX;
28727       emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx, sa));
28728     }
28729
28730   if (epilogue_type != EPILOGUE_TYPE_SIBCALL && restoring_FPRs_inline)
28731     {
28732       if (cfa_restores)
28733         {
28734           /* We can't hang the cfa_restores off a simple return,
28735              since the shrink-wrap code sometimes uses an existing
28736              return.  This means there might be a path from
28737              pre-prologue code to this return, and dwarf2cfi code
28738              wants the eh_frame unwinder state to be the same on
28739              all paths to any point.  So we need to emit the
28740              cfa_restores before the return.  For -m64 we really
28741              don't need epilogue cfa_restores at all, except for
28742              this irritating dwarf2cfi with shrink-wrap
28743              requirement;  The stack red-zone means eh_frame info
28744              from the prologue telling the unwinder to restore
28745              from the stack is perfectly good right to the end of
28746              the function.  */
28747           emit_insn (gen_blockage ());
28748           emit_cfa_restores (cfa_restores);
28749           cfa_restores = NULL_RTX;
28750         }
28751
28752       emit_jump_insn (targetm.gen_simple_return ());
28753     }
28754
28755   if (epilogue_type != EPILOGUE_TYPE_SIBCALL && !restoring_FPRs_inline)
28756     {
28757       bool lr = (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0;
28758       rtvec p = rtvec_alloc (3 + !!lr + 64 - info->first_fp_reg_save);
28759       int elt = 0;
28760       RTVEC_ELT (p, elt++) = ret_rtx;
28761       if (lr)
28762         RTVEC_ELT (p, elt++) = gen_hard_reg_clobber (Pmode, LR_REGNO);
28763
28764       /* We have to restore more than two FP registers, so branch to the
28765          restore function.  It will return to our caller.  */
28766       int i;
28767       int reg;
28768       rtx sym;
28769
28770       if (flag_shrink_wrap)
28771         cfa_restores = add_crlr_cfa_restore (info, cfa_restores);
28772
28773       sym = rs6000_savres_routine_sym (info, SAVRES_FPR | (lr ? SAVRES_LR : 0));
28774       RTVEC_ELT (p, elt++) = gen_rtx_USE (VOIDmode, sym);
28775       reg = (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)? 1 : 11;
28776       RTVEC_ELT (p, elt++) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, reg));
28777
28778       for (i = 0; i < 64 - info->first_fp_reg_save; i++)
28779         {
28780           rtx reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
28781
28782           RTVEC_ELT (p, elt++)
28783             = gen_frame_load (reg, sp_reg_rtx, info->fp_save_offset + 8 * i);
28784           if (flag_shrink_wrap
28785               && save_reg_p (info->first_fp_reg_save + i))
28786             cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg, cfa_restores);
28787         }
28788
28789       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
28790     }
28791
28792   if (cfa_restores)
28793     {
28794       if (epilogue_type == EPILOGUE_TYPE_SIBCALL)
28795         /* Ensure the cfa_restores are hung off an insn that won't
28796            be reordered above other restores.  */
28797         emit_insn (gen_blockage ());
28798
28799       emit_cfa_restores (cfa_restores);
28800     }
28801 }
28802
28803 /* Write function epilogue.  */
28804
28805 static void
28806 rs6000_output_function_epilogue (FILE *file)
28807 {
28808 #if TARGET_MACHO
28809   macho_branch_islands ();
28810
28811   {
28812     rtx_insn *insn = get_last_insn ();
28813     rtx_insn *deleted_debug_label = NULL;
28814
28815     /* Mach-O doesn't support labels at the end of objects, so if
28816        it looks like we might want one, take special action.
28817
28818        First, collect any sequence of deleted debug labels.  */
28819     while (insn
28820            && NOTE_P (insn)
28821            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
28822       {
28823         /* Don't insert a nop for NOTE_INSN_DELETED_DEBUG_LABEL
28824            notes only, instead set their CODE_LABEL_NUMBER to -1,
28825            otherwise there would be code generation differences
28826            in between -g and -g0.  */
28827         if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_DELETED_DEBUG_LABEL)
28828           deleted_debug_label = insn;
28829         insn = PREV_INSN (insn);
28830       }
28831
28832     /* Second, if we have:
28833        label:
28834          barrier
28835        then this needs to be detected, so skip past the barrier.  */
28836
28837     if (insn && BARRIER_P (insn))
28838       insn = PREV_INSN (insn);
28839
28840     /* Up to now we've only seen notes or barriers.  */
28841     if (insn)
28842       {
28843         if (LABEL_P (insn)
28844             || (NOTE_P (insn)
28845                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL))
28846           /* Trailing label: <barrier>.  */
28847           fputs ("\tnop\n", file);
28848         else
28849           {
28850             /* Lastly, see if we have a completely empty function body.  */
28851             while (insn && ! INSN_P (insn))
28852               insn = PREV_INSN (insn);
28853             /* If we don't find any insns, we've got an empty function body;
28854                I.e. completely empty - without a return or branch.  This is
28855                taken as the case where a function body has been removed
28856                because it contains an inline __builtin_unreachable().  GCC
28857                states that reaching __builtin_unreachable() means UB so we're
28858                not obliged to do anything special; however, we want
28859                non-zero-sized function bodies.  To meet this, and help the
28860                user out, let's trap the case.  */
28861             if (insn == NULL)
28862               fputs ("\ttrap\n", file);
28863           }
28864       }
28865     else if (deleted_debug_label)
28866       for (insn = deleted_debug_label; insn; insn = NEXT_INSN (insn))
28867         if (NOTE_KIND (insn) == NOTE_INSN_DELETED_DEBUG_LABEL)
28868           CODE_LABEL_NUMBER (insn) = -1;
28869   }
28870 #endif
28871
28872   /* Output a traceback table here.  See /usr/include/sys/debug.h for info
28873      on its format.
28874
28875      We don't output a traceback table if -finhibit-size-directive was
28876      used.  The documentation for -finhibit-size-directive reads
28877      ``don't output a @code{.size} assembler directive, or anything
28878      else that would cause trouble if the function is split in the
28879      middle, and the two halves are placed at locations far apart in
28880      memory.''  The traceback table has this property, since it
28881      includes the offset from the start of the function to the
28882      traceback table itself.
28883
28884      System V.4 Powerpc's (and the embedded ABI derived from it) use a
28885      different traceback table.  */
28886   if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
28887       && ! flag_inhibit_size_directive
28888       && rs6000_traceback != traceback_none && !cfun->is_thunk)
28889     {
28890       const char *fname = NULL;
28891       const char *language_string = lang_hooks.name;
28892       int fixed_parms = 0, float_parms = 0, parm_info = 0;
28893       int i;
28894       int optional_tbtab;
28895       rs6000_stack_t *info = rs6000_stack_info ();
28896
28897       if (rs6000_traceback == traceback_full)
28898         optional_tbtab = 1;
28899       else if (rs6000_traceback == traceback_part)
28900         optional_tbtab = 0;
28901       else
28902         optional_tbtab = !optimize_size && !TARGET_ELF;
28903
28904       if (optional_tbtab)
28905         {
28906           fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
28907           while (*fname == '.') /* V.4 encodes . in the name */
28908             fname++;
28909
28910           /* Need label immediately before tbtab, so we can compute
28911              its offset from the function start.  */
28912           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
28913           ASM_OUTPUT_LABEL (file, fname);
28914         }
28915
28916       /* The .tbtab pseudo-op can only be used for the first eight
28917          expressions, since it can't handle the possibly variable
28918          length fields that follow.  However, if you omit the optional
28919          fields, the assembler outputs zeros for all optional fields
28920          anyways, giving each variable length field is minimum length
28921          (as defined in sys/debug.h).  Thus we cannot use the .tbtab
28922          pseudo-op at all.  */
28923
28924       /* An all-zero word flags the start of the tbtab, for debuggers
28925          that have to find it by searching forward from the entry
28926          point or from the current pc.  */
28927       fputs ("\t.long 0\n", file);
28928
28929       /* Tbtab format type.  Use format type 0.  */
28930       fputs ("\t.byte 0,", file);
28931
28932       /* Language type.  Unfortunately, there does not seem to be any
28933          official way to discover the language being compiled, so we
28934          use language_string.
28935          C is 0.  Fortran is 1.  Ada is 3.  C++ is 9.
28936          Java is 13.  Objective-C is 14.  Objective-C++ isn't assigned
28937          a number, so for now use 9.  LTO, Go, D, and JIT aren't assigned
28938          numbers either, so for now use 0.  */
28939       if (lang_GNU_C ()
28940           || ! strcmp (language_string, "GNU GIMPLE")
28941           || ! strcmp (language_string, "GNU Go")
28942           || ! strcmp (language_string, "GNU D")
28943           || ! strcmp (language_string, "libgccjit"))
28944         i = 0;
28945       else if (! strcmp (language_string, "GNU F77")
28946                || lang_GNU_Fortran ())
28947         i = 1;
28948       else if (! strcmp (language_string, "GNU Ada"))
28949         i = 3;
28950       else if (lang_GNU_CXX ()
28951                || ! strcmp (language_string, "GNU Objective-C++"))
28952         i = 9;
28953       else if (! strcmp (language_string, "GNU Java"))
28954         i = 13;
28955       else if (! strcmp (language_string, "GNU Objective-C"))
28956         i = 14;
28957       else
28958         gcc_unreachable ();
28959       fprintf (file, "%d,", i);
28960
28961       /* 8 single bit fields: global linkage (not set for C extern linkage,
28962          apparently a PL/I convention?), out-of-line epilogue/prologue, offset
28963          from start of procedure stored in tbtab, internal function, function
28964          has controlled storage, function has no toc, function uses fp,
28965          function logs/aborts fp operations.  */
28966       /* Assume that fp operations are used if any fp reg must be saved.  */
28967       fprintf (file, "%d,",
28968                (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
28969
28970       /* 6 bitfields: function is interrupt handler, name present in
28971          proc table, function calls alloca, on condition directives
28972          (controls stack walks, 3 bits), saves condition reg, saves
28973          link reg.  */
28974       /* The `function calls alloca' bit seems to be set whenever reg 31 is
28975          set up as a frame pointer, even when there is no alloca call.  */
28976       fprintf (file, "%d,",
28977                ((optional_tbtab << 6)
28978                 | ((optional_tbtab & frame_pointer_needed) << 5)
28979                 | (info->cr_save_p << 1)
28980                 | (info->lr_save_p)));
28981
28982       /* 3 bitfields: saves backchain, fixup code, number of fpr saved
28983          (6 bits).  */
28984       fprintf (file, "%d,",
28985                (info->push_p << 7) | (64 - info->first_fp_reg_save));
28986
28987       /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits).  */
28988       fprintf (file, "%d,", (32 - first_reg_to_save ()));
28989
28990       if (optional_tbtab)
28991         {
28992           /* Compute the parameter info from the function decl argument
28993              list.  */
28994           tree decl;
28995           int next_parm_info_bit = 31;
28996
28997           for (decl = DECL_ARGUMENTS (current_function_decl);
28998                decl; decl = DECL_CHAIN (decl))
28999             {
29000               rtx parameter = DECL_INCOMING_RTL (decl);
29001               machine_mode mode = GET_MODE (parameter);
29002
29003               if (REG_P (parameter))
29004                 {
29005                   if (SCALAR_FLOAT_MODE_P (mode))
29006                     {
29007                       int bits;
29008
29009                       float_parms++;
29010
29011                       switch (mode)
29012                         {
29013                         case E_SFmode:
29014                         case E_SDmode:
29015                           bits = 0x2;
29016                           break;
29017
29018                         case E_DFmode:
29019                         case E_DDmode:
29020                         case E_TFmode:
29021                         case E_TDmode:
29022                         case E_IFmode:
29023                         case E_KFmode:
29024                           bits = 0x3;
29025                           break;
29026
29027                         default:
29028                           gcc_unreachable ();
29029                         }
29030
29031                       /* If only one bit will fit, don't or in this entry.  */
29032                       if (next_parm_info_bit > 0)
29033                         parm_info |= (bits << (next_parm_info_bit - 1));
29034                       next_parm_info_bit -= 2;
29035                     }
29036                   else
29037                     {
29038                       fixed_parms += ((GET_MODE_SIZE (mode)
29039                                        + (UNITS_PER_WORD - 1))
29040                                       / UNITS_PER_WORD);
29041                       next_parm_info_bit -= 1;
29042                     }
29043                 }
29044             }
29045         }
29046
29047       /* Number of fixed point parameters.  */
29048       /* This is actually the number of words of fixed point parameters; thus
29049          an 8 byte struct counts as 2; and thus the maximum value is 8.  */
29050       fprintf (file, "%d,", fixed_parms);
29051
29052       /* 2 bitfields: number of floating point parameters (7 bits), parameters
29053          all on stack.  */
29054       /* This is actually the number of fp registers that hold parameters;
29055          and thus the maximum value is 13.  */
29056       /* Set parameters on stack bit if parameters are not in their original
29057          registers, regardless of whether they are on the stack?  Xlc
29058          seems to set the bit when not optimizing.  */
29059       fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
29060
29061       if (optional_tbtab)
29062         {
29063           /* Optional fields follow.  Some are variable length.  */
29064
29065           /* Parameter types, left adjusted bit fields: 0 fixed, 10 single
29066              float, 11 double float.  */
29067           /* There is an entry for each parameter in a register, in the order
29068              that they occur in the parameter list.  Any intervening arguments
29069              on the stack are ignored.  If the list overflows a long (max
29070              possible length 34 bits) then completely leave off all elements
29071              that don't fit.  */
29072           /* Only emit this long if there was at least one parameter.  */
29073           if (fixed_parms || float_parms)
29074             fprintf (file, "\t.long %d\n", parm_info);
29075
29076           /* Offset from start of code to tb table.  */
29077           fputs ("\t.long ", file);
29078           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
29079           RS6000_OUTPUT_BASENAME (file, fname);
29080           putc ('-', file);
29081           rs6000_output_function_entry (file, fname);
29082           putc ('\n', file);
29083
29084           /* Interrupt handler mask.  */
29085           /* Omit this long, since we never set the interrupt handler bit
29086              above.  */
29087
29088           /* Number of CTL (controlled storage) anchors.  */
29089           /* Omit this long, since the has_ctl bit is never set above.  */
29090
29091           /* Displacement into stack of each CTL anchor.  */
29092           /* Omit this list of longs, because there are no CTL anchors.  */
29093
29094           /* Length of function name.  */
29095           if (*fname == '*')
29096             ++fname;
29097           fprintf (file, "\t.short %d\n", (int) strlen (fname));
29098
29099           /* Function name.  */
29100           assemble_string (fname, strlen (fname));
29101
29102           /* Register for alloca automatic storage; this is always reg 31.
29103              Only emit this if the alloca bit was set above.  */
29104           if (frame_pointer_needed)
29105             fputs ("\t.byte 31\n", file);
29106
29107           fputs ("\t.align 2\n", file);
29108         }
29109     }
29110
29111   /* Arrange to define .LCTOC1 label, if not already done.  */
29112   if (need_toc_init)
29113     {
29114       need_toc_init = 0;
29115       if (!toc_initialized)
29116         {
29117           switch_to_section (toc_section);
29118           switch_to_section (current_function_section ());
29119         }
29120     }
29121 }
29122
29123 /* -fsplit-stack support.  */
29124
29125 /* A SYMBOL_REF for __morestack.  */
29126 static GTY(()) rtx morestack_ref;
29127
29128 static rtx
29129 gen_add3_const (rtx rt, rtx ra, long c)
29130 {
29131   if (TARGET_64BIT)
29132     return gen_adddi3 (rt, ra, GEN_INT (c));
29133  else
29134     return gen_addsi3 (rt, ra, GEN_INT (c));
29135 }
29136
29137 /* Emit -fsplit-stack prologue, which goes before the regular function
29138    prologue (at local entry point in the case of ELFv2).  */
29139
29140 void
29141 rs6000_expand_split_stack_prologue (void)
29142 {
29143   rs6000_stack_t *info = rs6000_stack_info ();
29144   unsigned HOST_WIDE_INT allocate;
29145   long alloc_hi, alloc_lo;
29146   rtx r0, r1, r12, lr, ok_label, compare, jump, call_fusage;
29147   rtx_insn *insn;
29148
29149   gcc_assert (flag_split_stack && reload_completed);
29150
29151   if (!info->push_p)
29152     return;
29153
29154   if (global_regs[29])
29155     {
29156       error ("%qs uses register r29", "%<-fsplit-stack%>");
29157       inform (DECL_SOURCE_LOCATION (global_regs_decl[29]),
29158               "conflicts with %qD", global_regs_decl[29]);
29159     }
29160
29161   allocate = info->total_size;
29162   if (allocate > (unsigned HOST_WIDE_INT) 1 << 31)
29163     {
29164       sorry ("Stack frame larger than 2G is not supported for "
29165              "%<-fsplit-stack%>");
29166       return;
29167     }
29168   if (morestack_ref == NULL_RTX)
29169     {
29170       morestack_ref = gen_rtx_SYMBOL_REF (Pmode, "__morestack");
29171       SYMBOL_REF_FLAGS (morestack_ref) |= (SYMBOL_FLAG_LOCAL
29172                                            | SYMBOL_FLAG_FUNCTION);
29173     }
29174
29175   r0 = gen_rtx_REG (Pmode, 0);
29176   r1 = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
29177   r12 = gen_rtx_REG (Pmode, 12);
29178   emit_insn (gen_load_split_stack_limit (r0));
29179   /* Always emit two insns here to calculate the requested stack,
29180      so that the linker can edit them when adjusting size for calling
29181      non-split-stack code.  */
29182   alloc_hi = (-allocate + 0x8000) & ~0xffffL;
29183   alloc_lo = -allocate - alloc_hi;
29184   if (alloc_hi != 0)
29185     {
29186       emit_insn (gen_add3_const (r12, r1, alloc_hi));
29187       if (alloc_lo != 0)
29188         emit_insn (gen_add3_const (r12, r12, alloc_lo));
29189       else
29190         emit_insn (gen_nop ());
29191     }
29192   else
29193     {
29194       emit_insn (gen_add3_const (r12, r1, alloc_lo));
29195       emit_insn (gen_nop ());
29196     }
29197
29198   compare = gen_rtx_REG (CCUNSmode, CR7_REGNO);
29199   emit_insn (gen_rtx_SET (compare, gen_rtx_COMPARE (CCUNSmode, r12, r0)));
29200   ok_label = gen_label_rtx ();
29201   jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
29202                                gen_rtx_GEU (VOIDmode, compare, const0_rtx),
29203                                gen_rtx_LABEL_REF (VOIDmode, ok_label),
29204                                pc_rtx);
29205   insn = emit_jump_insn (gen_rtx_SET (pc_rtx, jump));
29206   JUMP_LABEL (insn) = ok_label;
29207   /* Mark the jump as very likely to be taken.  */
29208   add_reg_br_prob_note (insn, profile_probability::very_likely ());
29209
29210   lr = gen_rtx_REG (Pmode, LR_REGNO);
29211   insn = emit_move_insn (r0, lr);
29212   RTX_FRAME_RELATED_P (insn) = 1;
29213   insn = emit_insn (gen_frame_store (r0, r1, info->lr_save_offset));
29214   RTX_FRAME_RELATED_P (insn) = 1;
29215
29216   insn = emit_call_insn (gen_call (gen_rtx_MEM (SImode, morestack_ref),
29217                                    const0_rtx, const0_rtx));
29218   call_fusage = NULL_RTX;
29219   use_reg (&call_fusage, r12);
29220   /* Say the call uses r0, even though it doesn't, to stop regrename
29221      from twiddling with the insns saving lr, trashing args for cfun.
29222      The insns restoring lr are similarly protected by making
29223      split_stack_return use r0.  */
29224   use_reg (&call_fusage, r0);
29225   add_function_usage_to (insn, call_fusage);
29226   /* Indicate that this function can't jump to non-local gotos.  */
29227   make_reg_eh_region_note_nothrow_nononlocal (insn);
29228   emit_insn (gen_frame_load (r0, r1, info->lr_save_offset));
29229   insn = emit_move_insn (lr, r0);
29230   add_reg_note (insn, REG_CFA_RESTORE, lr);
29231   RTX_FRAME_RELATED_P (insn) = 1;
29232   emit_insn (gen_split_stack_return ());
29233
29234   emit_label (ok_label);
29235   LABEL_NUSES (ok_label) = 1;
29236 }
29237
29238 /* Return the internal arg pointer used for function incoming
29239    arguments.  When -fsplit-stack, the arg pointer is r12 so we need
29240    to copy it to a pseudo in order for it to be preserved over calls
29241    and suchlike.  We'd really like to use a pseudo here for the
29242    internal arg pointer but data-flow analysis is not prepared to
29243    accept pseudos as live at the beginning of a function.  */
29244
29245 static rtx
29246 rs6000_internal_arg_pointer (void)
29247 {
29248   if (flag_split_stack
29249      && (lookup_attribute ("no_split_stack", DECL_ATTRIBUTES (cfun->decl))
29250          == NULL))
29251
29252     {
29253       if (cfun->machine->split_stack_arg_pointer == NULL_RTX)
29254         {
29255           rtx pat;
29256
29257           cfun->machine->split_stack_arg_pointer = gen_reg_rtx (Pmode);
29258           REG_POINTER (cfun->machine->split_stack_arg_pointer) = 1;
29259
29260           /* Put the pseudo initialization right after the note at the
29261              beginning of the function.  */
29262           pat = gen_rtx_SET (cfun->machine->split_stack_arg_pointer,
29263                              gen_rtx_REG (Pmode, 12));
29264           push_topmost_sequence ();
29265           emit_insn_after (pat, get_insns ());
29266           pop_topmost_sequence ();
29267         }
29268       rtx ret = plus_constant (Pmode, cfun->machine->split_stack_arg_pointer,
29269                                FIRST_PARM_OFFSET (current_function_decl));
29270       return copy_to_reg (ret);
29271     }
29272   return virtual_incoming_args_rtx;
29273 }
29274
29275 /* We may have to tell the dataflow pass that the split stack prologue
29276    is initializing a register.  */
29277
29278 static void
29279 rs6000_live_on_entry (bitmap regs)
29280 {
29281   if (flag_split_stack)
29282     bitmap_set_bit (regs, 12);
29283 }
29284
29285 /* Emit -fsplit-stack dynamic stack allocation space check.  */
29286
29287 void
29288 rs6000_split_stack_space_check (rtx size, rtx label)
29289 {
29290   rtx sp = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
29291   rtx limit = gen_reg_rtx (Pmode);
29292   rtx requested = gen_reg_rtx (Pmode);
29293   rtx cmp = gen_reg_rtx (CCUNSmode);
29294   rtx jump;
29295
29296   emit_insn (gen_load_split_stack_limit (limit));
29297   if (CONST_INT_P (size))
29298     emit_insn (gen_add3_insn (requested, sp, GEN_INT (-INTVAL (size))));
29299   else
29300     {
29301       size = force_reg (Pmode, size);
29302       emit_move_insn (requested, gen_rtx_MINUS (Pmode, sp, size));
29303     }
29304   emit_insn (gen_rtx_SET (cmp, gen_rtx_COMPARE (CCUNSmode, requested, limit)));
29305   jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
29306                                gen_rtx_GEU (VOIDmode, cmp, const0_rtx),
29307                                gen_rtx_LABEL_REF (VOIDmode, label),
29308                                pc_rtx);
29309   jump = emit_jump_insn (gen_rtx_SET (pc_rtx, jump));
29310   JUMP_LABEL (jump) = label;
29311 }
29312 \f
29313 /* A C compound statement that outputs the assembler code for a thunk
29314    function, used to implement C++ virtual function calls with
29315    multiple inheritance.  The thunk acts as a wrapper around a virtual
29316    function, adjusting the implicit object parameter before handing
29317    control off to the real function.
29318
29319    First, emit code to add the integer DELTA to the location that
29320    contains the incoming first argument.  Assume that this argument
29321    contains a pointer, and is the one used to pass the `this' pointer
29322    in C++.  This is the incoming argument *before* the function
29323    prologue, e.g. `%o0' on a sparc.  The addition must preserve the
29324    values of all other incoming arguments.
29325
29326    After the addition, emit code to jump to FUNCTION, which is a
29327    `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
29328    not touch the return address.  Hence returning from FUNCTION will
29329    return to whoever called the current `thunk'.
29330
29331    The effect must be as if FUNCTION had been called directly with the
29332    adjusted first argument.  This macro is responsible for emitting
29333    all of the code for a thunk function; output_function_prologue()
29334    and output_function_epilogue() are not invoked.
29335
29336    The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
29337    been extracted from it.)  It might possibly be useful on some
29338    targets, but probably not.
29339
29340    If you do not define this macro, the target-independent code in the
29341    C++ frontend will generate a less efficient heavyweight thunk that
29342    calls FUNCTION instead of jumping to it.  The generic approach does
29343    not support varargs.  */
29344
29345 static void
29346 rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
29347                         HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
29348                         tree function)
29349 {
29350   const char *fnname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk_fndecl));
29351   rtx this_rtx, funexp;
29352   rtx_insn *insn;
29353
29354   reload_completed = 1;
29355   epilogue_completed = 1;
29356
29357   /* Mark the end of the (empty) prologue.  */
29358   emit_note (NOTE_INSN_PROLOGUE_END);
29359
29360   /* Find the "this" pointer.  If the function returns a structure,
29361      the structure return pointer is in r3.  */
29362   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
29363     this_rtx = gen_rtx_REG (Pmode, 4);
29364   else
29365     this_rtx = gen_rtx_REG (Pmode, 3);
29366
29367   /* Apply the constant offset, if required.  */
29368   if (delta)
29369     emit_insn (gen_add3_insn (this_rtx, this_rtx, GEN_INT (delta)));
29370
29371   /* Apply the offset from the vtable, if required.  */
29372   if (vcall_offset)
29373     {
29374       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
29375       rtx tmp = gen_rtx_REG (Pmode, 12);
29376
29377       emit_move_insn (tmp, gen_rtx_MEM (Pmode, this_rtx));
29378       if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
29379         {
29380           emit_insn (gen_add3_insn (tmp, tmp, vcall_offset_rtx));
29381           emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
29382         }
29383       else
29384         {
29385           rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
29386
29387           emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
29388         }
29389       emit_insn (gen_add3_insn (this_rtx, this_rtx, tmp));
29390     }
29391
29392   /* Generate a tail call to the target function.  */
29393   if (!TREE_USED (function))
29394     {
29395       assemble_external (function);
29396       TREE_USED (function) = 1;
29397     }
29398   funexp = XEXP (DECL_RTL (function), 0);
29399   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
29400
29401 #if TARGET_MACHO
29402   if (MACHOPIC_INDIRECT)
29403     funexp = machopic_indirect_call_target (funexp);
29404 #endif
29405
29406   /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
29407      generate sibcall RTL explicitly.  */
29408   insn = emit_call_insn (
29409            gen_rtx_PARALLEL (VOIDmode,
29410              gen_rtvec (3,
29411                         gen_rtx_CALL (VOIDmode,
29412                                       funexp, const0_rtx),
29413                         gen_rtx_USE (VOIDmode, const0_rtx),
29414                         simple_return_rtx)));
29415   SIBLING_CALL_P (insn) = 1;
29416   emit_barrier ();
29417
29418   /* Run just enough of rest_of_compilation to get the insns emitted.
29419      There's not really enough bulk here to make other passes such as
29420      instruction scheduling worth while.  */
29421   insn = get_insns ();
29422   shorten_branches (insn);
29423   assemble_start_function (thunk_fndecl, fnname);
29424   final_start_function (insn, file, 1);
29425   final (insn, file, 1);
29426   final_end_function ();
29427   assemble_end_function (thunk_fndecl, fnname);
29428
29429   reload_completed = 0;
29430   epilogue_completed = 0;
29431 }
29432 \f
29433 /* A quick summary of the various types of 'constant-pool tables'
29434    under PowerPC:
29435
29436    Target       Flags           Name            One table per
29437    AIX          (none)          AIX TOC         object file
29438    AIX          -mfull-toc      AIX TOC         object file
29439    AIX          -mminimal-toc   AIX minimal TOC translation unit
29440    SVR4/EABI    (none)          SVR4 SDATA      object file
29441    SVR4/EABI    -fpic           SVR4 pic        object file
29442    SVR4/EABI    -fPIC           SVR4 PIC        translation unit
29443    SVR4/EABI    -mrelocatable   EABI TOC        function
29444    SVR4/EABI    -maix           AIX TOC         object file
29445    SVR4/EABI    -maix -mminimal-toc
29446                                 AIX minimal TOC translation unit
29447
29448    Name                 Reg.    Set by  entries       contains:
29449                                         made by  addrs? fp?     sum?
29450
29451    AIX TOC              2       crt0    as       Y      option  option
29452    AIX minimal TOC      30      prolog  gcc      Y      Y       option
29453    SVR4 SDATA           13      crt0    gcc      N      Y       N
29454    SVR4 pic             30      prolog  ld       Y      not yet N
29455    SVR4 PIC             30      prolog  gcc      Y      option  option
29456    EABI TOC             30      prolog  gcc      Y      option  option
29457
29458 */
29459
29460 /* Hash functions for the hash table.  */
29461
29462 static unsigned
29463 rs6000_hash_constant (rtx k)
29464 {
29465   enum rtx_code code = GET_CODE (k);
29466   machine_mode mode = GET_MODE (k);
29467   unsigned result = (code << 3) ^ mode;
29468   const char *format;
29469   int flen, fidx;
29470
29471   format = GET_RTX_FORMAT (code);
29472   flen = strlen (format);
29473   fidx = 0;
29474
29475   switch (code)
29476     {
29477     case LABEL_REF:
29478       return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
29479
29480     case CONST_WIDE_INT:
29481       {
29482         int i;
29483         flen = CONST_WIDE_INT_NUNITS (k);
29484         for (i = 0; i < flen; i++)
29485           result = result * 613 + CONST_WIDE_INT_ELT (k, i);
29486         return result;
29487       }
29488
29489     case CONST_DOUBLE:
29490       return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
29491
29492     case CODE_LABEL:
29493       fidx = 3;
29494       break;
29495
29496     default:
29497       break;
29498     }
29499
29500   for (; fidx < flen; fidx++)
29501     switch (format[fidx])
29502       {
29503       case 's':
29504         {
29505           unsigned i, len;
29506           const char *str = XSTR (k, fidx);
29507           len = strlen (str);
29508           result = result * 613 + len;
29509           for (i = 0; i < len; i++)
29510             result = result * 613 + (unsigned) str[i];
29511           break;
29512         }
29513       case 'u':
29514       case 'e':
29515         result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
29516         break;
29517       case 'i':
29518       case 'n':
29519         result = result * 613 + (unsigned) XINT (k, fidx);
29520         break;
29521       case 'w':
29522         if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
29523           result = result * 613 + (unsigned) XWINT (k, fidx);
29524         else
29525           {
29526             size_t i;
29527             for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
29528               result = result * 613 + (unsigned) (XWINT (k, fidx)
29529                                                   >> CHAR_BIT * i);
29530           }
29531         break;
29532       case '0':
29533         break;
29534       default:
29535         gcc_unreachable ();
29536       }
29537
29538   return result;
29539 }
29540
29541 hashval_t
29542 toc_hasher::hash (toc_hash_struct *thc)
29543 {
29544   return rs6000_hash_constant (thc->key) ^ thc->key_mode;
29545 }
29546
29547 /* Compare H1 and H2 for equivalence.  */
29548
29549 bool
29550 toc_hasher::equal (toc_hash_struct *h1, toc_hash_struct *h2)
29551 {
29552   rtx r1 = h1->key;
29553   rtx r2 = h2->key;
29554
29555   if (h1->key_mode != h2->key_mode)
29556     return 0;
29557
29558   return rtx_equal_p (r1, r2);
29559 }
29560
29561 /* These are the names given by the C++ front-end to vtables, and
29562    vtable-like objects.  Ideally, this logic should not be here;
29563    instead, there should be some programmatic way of inquiring as
29564    to whether or not an object is a vtable.  */
29565
29566 #define VTABLE_NAME_P(NAME)                             \
29567   (strncmp ("_vt.", name, strlen ("_vt.")) == 0         \
29568   || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0       \
29569   || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0       \
29570   || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0       \
29571   || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
29572
29573 #ifdef NO_DOLLAR_IN_LABEL
29574 /* Return a GGC-allocated character string translating dollar signs in
29575    input NAME to underscores.  Used by XCOFF ASM_OUTPUT_LABELREF.  */
29576
29577 const char *
29578 rs6000_xcoff_strip_dollar (const char *name)
29579 {
29580   char *strip, *p;
29581   const char *q;
29582   size_t len;
29583
29584   q = (const char *) strchr (name, '$');
29585
29586   if (q == 0 || q == name)
29587     return name;
29588
29589   len = strlen (name);
29590   strip = XALLOCAVEC (char, len + 1);
29591   strcpy (strip, name);
29592   p = strip + (q - name);
29593   while (p)
29594     {
29595       *p = '_';
29596       p = strchr (p + 1, '$');
29597     }
29598
29599   return ggc_alloc_string (strip, len);
29600 }
29601 #endif
29602
29603 void
29604 rs6000_output_symbol_ref (FILE *file, rtx x)
29605 {
29606   const char *name = XSTR (x, 0);
29607
29608   /* Currently C++ toc references to vtables can be emitted before it
29609      is decided whether the vtable is public or private.  If this is
29610      the case, then the linker will eventually complain that there is
29611      a reference to an unknown section.  Thus, for vtables only,
29612      we emit the TOC reference to reference the identifier and not the
29613      symbol.  */
29614   if (VTABLE_NAME_P (name))
29615     {
29616       RS6000_OUTPUT_BASENAME (file, name);
29617     }
29618   else
29619     assemble_name (file, name);
29620 }
29621
29622 /* Output a TOC entry.  We derive the entry name from what is being
29623    written.  */
29624
29625 void
29626 output_toc (FILE *file, rtx x, int labelno, machine_mode mode)
29627 {
29628   char buf[256];
29629   const char *name = buf;
29630   rtx base = x;
29631   HOST_WIDE_INT offset = 0;
29632
29633   gcc_assert (!TARGET_NO_TOC);
29634
29635   /* When the linker won't eliminate them, don't output duplicate
29636      TOC entries (this happens on AIX if there is any kind of TOC,
29637      and on SVR4 under -fPIC or -mrelocatable).  Don't do this for
29638      CODE_LABELs.  */
29639   if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
29640     {
29641       struct toc_hash_struct *h;
29642
29643       /* Create toc_hash_table.  This can't be done at TARGET_OPTION_OVERRIDE
29644          time because GGC is not initialized at that point.  */
29645       if (toc_hash_table == NULL)
29646         toc_hash_table = hash_table<toc_hasher>::create_ggc (1021);
29647
29648       h = ggc_alloc<toc_hash_struct> ();
29649       h->key = x;
29650       h->key_mode = mode;
29651       h->labelno = labelno;
29652
29653       toc_hash_struct **found = toc_hash_table->find_slot (h, INSERT);
29654       if (*found == NULL)
29655         *found = h;
29656       else  /* This is indeed a duplicate.
29657                Set this label equal to that label.  */
29658         {
29659           fputs ("\t.set ", file);
29660           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
29661           fprintf (file, "%d,", labelno);
29662           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
29663           fprintf (file, "%d\n", ((*found)->labelno));
29664
29665 #ifdef HAVE_AS_TLS
29666           if (TARGET_XCOFF && SYMBOL_REF_P (x)
29667               && (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_GLOBAL_DYNAMIC
29668                   || SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC))
29669             {
29670               fputs ("\t.set ", file);
29671               ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LCM");
29672               fprintf (file, "%d,", labelno);
29673               ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LCM");
29674               fprintf (file, "%d\n", ((*found)->labelno));
29675             }
29676 #endif
29677           return;
29678         }
29679     }
29680
29681   /* If we're going to put a double constant in the TOC, make sure it's
29682      aligned properly when strict alignment is on.  */
29683   if ((CONST_DOUBLE_P (x) || CONST_WIDE_INT_P (x))
29684       && STRICT_ALIGNMENT
29685       && GET_MODE_BITSIZE (mode) >= 64
29686       && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
29687     ASM_OUTPUT_ALIGN (file, 3);
29688   }
29689
29690   (*targetm.asm_out.internal_label) (file, "LC", labelno);
29691
29692   /* Handle FP constants specially.  Note that if we have a minimal
29693      TOC, things we put here aren't actually in the TOC, so we can allow
29694      FP constants.  */
29695   if (CONST_DOUBLE_P (x)
29696       && (GET_MODE (x) == TFmode || GET_MODE (x) == TDmode
29697           || GET_MODE (x) == IFmode || GET_MODE (x) == KFmode))
29698     {
29699       long k[4];
29700
29701       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
29702         REAL_VALUE_TO_TARGET_DECIMAL128 (*CONST_DOUBLE_REAL_VALUE (x), k);
29703       else
29704         REAL_VALUE_TO_TARGET_LONG_DOUBLE (*CONST_DOUBLE_REAL_VALUE (x), k);
29705
29706       if (TARGET_64BIT)
29707         {
29708           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29709             fputs (DOUBLE_INT_ASM_OP, file);
29710           else
29711             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
29712                      k[0] & 0xffffffff, k[1] & 0xffffffff,
29713                      k[2] & 0xffffffff, k[3] & 0xffffffff);
29714           fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
29715                    k[WORDS_BIG_ENDIAN ? 0 : 1] & 0xffffffff,
29716                    k[WORDS_BIG_ENDIAN ? 1 : 0] & 0xffffffff,
29717                    k[WORDS_BIG_ENDIAN ? 2 : 3] & 0xffffffff,
29718                    k[WORDS_BIG_ENDIAN ? 3 : 2] & 0xffffffff);
29719           return;
29720         }
29721       else
29722         {
29723           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29724             fputs ("\t.long ", file);
29725           else
29726             fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
29727                      k[0] & 0xffffffff, k[1] & 0xffffffff,
29728                      k[2] & 0xffffffff, k[3] & 0xffffffff);
29729           fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
29730                    k[0] & 0xffffffff, k[1] & 0xffffffff,
29731                    k[2] & 0xffffffff, k[3] & 0xffffffff);
29732           return;
29733         }
29734     }
29735   else if (CONST_DOUBLE_P (x)
29736            && (GET_MODE (x) == DFmode || GET_MODE (x) == DDmode))
29737     {
29738       long k[2];
29739
29740       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
29741         REAL_VALUE_TO_TARGET_DECIMAL64 (*CONST_DOUBLE_REAL_VALUE (x), k);
29742       else
29743         REAL_VALUE_TO_TARGET_DOUBLE (*CONST_DOUBLE_REAL_VALUE (x), k);
29744
29745       if (TARGET_64BIT)
29746         {
29747           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29748             fputs (DOUBLE_INT_ASM_OP, file);
29749           else
29750             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
29751                      k[0] & 0xffffffff, k[1] & 0xffffffff);
29752           fprintf (file, "0x%lx%08lx\n",
29753                    k[WORDS_BIG_ENDIAN ? 0 : 1] & 0xffffffff,
29754                    k[WORDS_BIG_ENDIAN ? 1 : 0] & 0xffffffff);
29755           return;
29756         }
29757       else
29758         {
29759           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29760             fputs ("\t.long ", file);
29761           else
29762             fprintf (file, "\t.tc FD_%lx_%lx[TC],",
29763                      k[0] & 0xffffffff, k[1] & 0xffffffff);
29764           fprintf (file, "0x%lx,0x%lx\n",
29765                    k[0] & 0xffffffff, k[1] & 0xffffffff);
29766           return;
29767         }
29768     }
29769   else if (CONST_DOUBLE_P (x)
29770            && (GET_MODE (x) == SFmode || GET_MODE (x) == SDmode))
29771     {
29772       long l;
29773
29774       if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
29775         REAL_VALUE_TO_TARGET_DECIMAL32 (*CONST_DOUBLE_REAL_VALUE (x), l);
29776       else
29777         REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), l);
29778
29779       if (TARGET_64BIT)
29780         {
29781           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29782             fputs (DOUBLE_INT_ASM_OP, file);
29783           else
29784             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
29785           if (WORDS_BIG_ENDIAN)
29786             fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
29787           else
29788             fprintf (file, "0x%lx\n", l & 0xffffffff);
29789           return;
29790         }
29791       else
29792         {
29793           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29794             fputs ("\t.long ", file);
29795           else
29796             fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
29797           fprintf (file, "0x%lx\n", l & 0xffffffff);
29798           return;
29799         }
29800     }
29801   else if (GET_MODE (x) == VOIDmode && CONST_INT_P (x))
29802     {
29803       unsigned HOST_WIDE_INT low;
29804       HOST_WIDE_INT high;
29805
29806       low = INTVAL (x) & 0xffffffff;
29807       high = (HOST_WIDE_INT) INTVAL (x) >> 32;
29808
29809       /* TOC entries are always Pmode-sized, so when big-endian
29810          smaller integer constants in the TOC need to be padded.
29811          (This is still a win over putting the constants in
29812          a separate constant pool, because then we'd have
29813          to have both a TOC entry _and_ the actual constant.)
29814
29815          For a 32-bit target, CONST_INT values are loaded and shifted
29816          entirely within `low' and can be stored in one TOC entry.  */
29817
29818       /* It would be easy to make this work, but it doesn't now.  */
29819       gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
29820
29821       if (WORDS_BIG_ENDIAN && POINTER_SIZE > GET_MODE_BITSIZE (mode))
29822         {
29823           low |= high << 32;
29824           low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
29825           high = (HOST_WIDE_INT) low >> 32;
29826           low &= 0xffffffff;
29827         }
29828
29829       if (TARGET_64BIT)
29830         {
29831           if (TARGET_ELF || TARGET_MINIMAL_TOC)
29832             fputs (DOUBLE_INT_ASM_OP, file);
29833           else
29834             fprintf (file, "\t.tc ID_%lx_%lx[TC],",
29835                      (long) high & 0xffffffff, (long) low & 0xffffffff);
29836           fprintf (file, "0x%lx%08lx\n",
29837                    (long) high & 0xffffffff, (long) low & 0xffffffff);
29838           return;
29839         }
29840       else
29841         {
29842           if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
29843             {
29844               if (TARGET_ELF || TARGET_MINIMAL_TOC)
29845                 fputs ("\t.long ", file);
29846               else
29847                 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
29848                          (long) high & 0xffffffff, (long) low & 0xffffffff);
29849               fprintf (file, "0x%lx,0x%lx\n",
29850                        (long) high & 0xffffffff, (long) low & 0xffffffff);
29851             }
29852           else
29853             {
29854               if (TARGET_ELF || TARGET_MINIMAL_TOC)
29855                 fputs ("\t.long ", file);
29856               else
29857                 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
29858               fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
29859             }
29860           return;
29861         }
29862     }
29863
29864   if (GET_CODE (x) == CONST)
29865     {
29866       gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS
29867                   && CONST_INT_P (XEXP (XEXP (x, 0), 1)));
29868
29869       base = XEXP (XEXP (x, 0), 0);
29870       offset = INTVAL (XEXP (XEXP (x, 0), 1));
29871     }
29872
29873   switch (GET_CODE (base))
29874     {
29875     case SYMBOL_REF:
29876       name = XSTR (base, 0);
29877       break;
29878
29879     case LABEL_REF:
29880       ASM_GENERATE_INTERNAL_LABEL (buf, "L",
29881                                    CODE_LABEL_NUMBER (XEXP (base, 0)));
29882       break;
29883
29884     case CODE_LABEL:
29885       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
29886       break;
29887
29888     default:
29889       gcc_unreachable ();
29890     }
29891
29892   if (TARGET_ELF || TARGET_MINIMAL_TOC)
29893     fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
29894   else
29895     {
29896       fputs ("\t.tc ", file);
29897       RS6000_OUTPUT_BASENAME (file, name);
29898
29899       if (offset < 0)
29900         fprintf (file, ".N" HOST_WIDE_INT_PRINT_UNSIGNED, - offset);
29901       else if (offset)
29902         fprintf (file, ".P" HOST_WIDE_INT_PRINT_UNSIGNED, offset);
29903
29904       /* Mark large TOC symbols on AIX with [TE] so they are mapped
29905          after other TOC symbols, reducing overflow of small TOC access
29906          to [TC] symbols.  */
29907       fputs (TARGET_XCOFF && TARGET_CMODEL != CMODEL_SMALL
29908              ? "[TE]," : "[TC],", file);
29909     }
29910
29911   /* Currently C++ toc references to vtables can be emitted before it
29912      is decided whether the vtable is public or private.  If this is
29913      the case, then the linker will eventually complain that there is
29914      a TOC reference to an unknown section.  Thus, for vtables only,
29915      we emit the TOC reference to reference the symbol and not the
29916      section.  */
29917   if (VTABLE_NAME_P (name))
29918     {
29919       RS6000_OUTPUT_BASENAME (file, name);
29920       if (offset < 0)
29921         fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset);
29922       else if (offset > 0)
29923         fprintf (file, "+" HOST_WIDE_INT_PRINT_DEC, offset);
29924     }
29925   else
29926     output_addr_const (file, x);
29927
29928 #if HAVE_AS_TLS
29929   if (TARGET_XCOFF && SYMBOL_REF_P (base))
29930     {
29931       switch (SYMBOL_REF_TLS_MODEL (base))
29932         {
29933         case 0:
29934           break;
29935         case TLS_MODEL_LOCAL_EXEC:
29936           fputs ("@le", file);
29937           break;
29938         case TLS_MODEL_INITIAL_EXEC:
29939           fputs ("@ie", file);
29940           break;
29941         /* Use global-dynamic for local-dynamic.  */
29942         case TLS_MODEL_GLOBAL_DYNAMIC:
29943         case TLS_MODEL_LOCAL_DYNAMIC:
29944           putc ('\n', file);
29945           (*targetm.asm_out.internal_label) (file, "LCM", labelno);
29946           fputs ("\t.tc .", file);
29947           RS6000_OUTPUT_BASENAME (file, name);
29948           fputs ("[TC],", file);
29949           output_addr_const (file, x);
29950           fputs ("@m", file);
29951           break;
29952         default:
29953           gcc_unreachable ();
29954         }
29955     }
29956 #endif
29957
29958   putc ('\n', file);
29959 }
29960 \f
29961 /* Output an assembler pseudo-op to write an ASCII string of N characters
29962    starting at P to FILE.
29963
29964    On the RS/6000, we have to do this using the .byte operation and
29965    write out special characters outside the quoted string.
29966    Also, the assembler is broken; very long strings are truncated,
29967    so we must artificially break them up early.  */
29968
29969 void
29970 output_ascii (FILE *file, const char *p, int n)
29971 {
29972   char c;
29973   int i, count_string;
29974   const char *for_string = "\t.byte \"";
29975   const char *for_decimal = "\t.byte ";
29976   const char *to_close = NULL;
29977
29978   count_string = 0;
29979   for (i = 0; i < n; i++)
29980     {
29981       c = *p++;
29982       if (c >= ' ' && c < 0177)
29983         {
29984           if (for_string)
29985             fputs (for_string, file);
29986           putc (c, file);
29987
29988           /* Write two quotes to get one.  */
29989           if (c == '"')
29990             {
29991               putc (c, file);
29992               ++count_string;
29993             }
29994
29995           for_string = NULL;
29996           for_decimal = "\"\n\t.byte ";
29997           to_close = "\"\n";
29998           ++count_string;
29999
30000           if (count_string >= 512)
30001             {
30002               fputs (to_close, file);
30003
30004               for_string = "\t.byte \"";
30005               for_decimal = "\t.byte ";
30006               to_close = NULL;
30007               count_string = 0;
30008             }
30009         }
30010       else
30011         {
30012           if (for_decimal)
30013             fputs (for_decimal, file);
30014           fprintf (file, "%d", c);
30015
30016           for_string = "\n\t.byte \"";
30017           for_decimal = ", ";
30018           to_close = "\n";
30019           count_string = 0;
30020         }
30021     }
30022
30023   /* Now close the string if we have written one.  Then end the line.  */
30024   if (to_close)
30025     fputs (to_close, file);
30026 }
30027 \f
30028 /* Generate a unique section name for FILENAME for a section type
30029    represented by SECTION_DESC.  Output goes into BUF.
30030
30031    SECTION_DESC can be any string, as long as it is different for each
30032    possible section type.
30033
30034    We name the section in the same manner as xlc.  The name begins with an
30035    underscore followed by the filename (after stripping any leading directory
30036    names) with the last period replaced by the string SECTION_DESC.  If
30037    FILENAME does not contain a period, SECTION_DESC is appended to the end of
30038    the name.  */
30039
30040 void
30041 rs6000_gen_section_name (char **buf, const char *filename,
30042                          const char *section_desc)
30043 {
30044   const char *q, *after_last_slash, *last_period = 0;
30045   char *p;
30046   int len;
30047
30048   after_last_slash = filename;
30049   for (q = filename; *q; q++)
30050     {
30051       if (*q == '/')
30052         after_last_slash = q + 1;
30053       else if (*q == '.')
30054         last_period = q;
30055     }
30056
30057   len = strlen (after_last_slash) + strlen (section_desc) + 2;
30058   *buf = (char *) xmalloc (len);
30059
30060   p = *buf;
30061   *p++ = '_';
30062
30063   for (q = after_last_slash; *q; q++)
30064     {
30065       if (q == last_period)
30066         {
30067           strcpy (p, section_desc);
30068           p += strlen (section_desc);
30069           break;
30070         }
30071
30072       else if (ISALNUM (*q))
30073         *p++ = *q;
30074     }
30075
30076   if (last_period == 0)
30077     strcpy (p, section_desc);
30078   else
30079     *p = '\0';
30080 }
30081 \f
30082 /* Emit profile function.  */
30083
30084 void
30085 output_profile_hook (int labelno ATTRIBUTE_UNUSED)
30086 {
30087   /* Non-standard profiling for kernels, which just saves LR then calls
30088      _mcount without worrying about arg saves.  The idea is to change
30089      the function prologue as little as possible as it isn't easy to
30090      account for arg save/restore code added just for _mcount.  */
30091   if (TARGET_PROFILE_KERNEL)
30092     return;
30093
30094   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
30095     {
30096 #ifndef NO_PROFILE_COUNTERS
30097 # define NO_PROFILE_COUNTERS 0
30098 #endif
30099       if (NO_PROFILE_COUNTERS)
30100         emit_library_call (init_one_libfunc (RS6000_MCOUNT),
30101                            LCT_NORMAL, VOIDmode);
30102       else
30103         {
30104           char buf[30];
30105           const char *label_name;
30106           rtx fun;
30107
30108           ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
30109           label_name = ggc_strdup ((*targetm.strip_name_encoding) (buf));
30110           fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
30111
30112           emit_library_call (init_one_libfunc (RS6000_MCOUNT),
30113                              LCT_NORMAL, VOIDmode, fun, Pmode);
30114         }
30115     }
30116   else if (DEFAULT_ABI == ABI_DARWIN)
30117     {
30118       const char *mcount_name = RS6000_MCOUNT;
30119       int caller_addr_regno = LR_REGNO;
30120
30121       /* Be conservative and always set this, at least for now.  */
30122       crtl->uses_pic_offset_table = 1;
30123
30124 #if TARGET_MACHO
30125       /* For PIC code, set up a stub and collect the caller's address
30126          from r0, which is where the prologue puts it.  */
30127       if (MACHOPIC_INDIRECT
30128           && crtl->uses_pic_offset_table)
30129         caller_addr_regno = 0;
30130 #endif
30131       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
30132                          LCT_NORMAL, VOIDmode,
30133                          gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
30134     }
30135 }
30136
30137 /* Write function profiler code.  */
30138
30139 void
30140 output_function_profiler (FILE *file, int labelno)
30141 {
30142   char buf[100];
30143
30144   switch (DEFAULT_ABI)
30145     {
30146     default:
30147       gcc_unreachable ();
30148
30149     case ABI_V4:
30150       if (!TARGET_32BIT)
30151         {
30152           warning (0, "no profiling of 64-bit code for this ABI");
30153           return;
30154         }
30155       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
30156       fprintf (file, "\tmflr %s\n", reg_names[0]);
30157       if (NO_PROFILE_COUNTERS)
30158         {
30159           asm_fprintf (file, "\tstw %s,4(%s)\n",
30160                        reg_names[0], reg_names[1]);
30161         }
30162       else if (TARGET_SECURE_PLT && flag_pic)
30163         {
30164           if (TARGET_LINK_STACK)
30165             {
30166               char name[32];
30167               get_ppc476_thunk_name (name);
30168               asm_fprintf (file, "\tbl %s\n", name);
30169             }
30170           else
30171             asm_fprintf (file, "\tbcl 20,31,1f\n1:\n");
30172           asm_fprintf (file, "\tstw %s,4(%s)\n",
30173                        reg_names[0], reg_names[1]);
30174           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
30175           asm_fprintf (file, "\taddis %s,%s,",
30176                        reg_names[12], reg_names[12]);
30177           assemble_name (file, buf);
30178           asm_fprintf (file, "-1b@ha\n\tla %s,", reg_names[0]);
30179           assemble_name (file, buf);
30180           asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
30181         }
30182       else if (flag_pic == 1)
30183         {
30184           fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
30185           asm_fprintf (file, "\tstw %s,4(%s)\n",
30186                        reg_names[0], reg_names[1]);
30187           asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
30188           asm_fprintf (file, "\tlwz %s,", reg_names[0]);
30189           assemble_name (file, buf);
30190           asm_fprintf (file, "@got(%s)\n", reg_names[12]);
30191         }
30192       else if (flag_pic > 1)
30193         {
30194           asm_fprintf (file, "\tstw %s,4(%s)\n",
30195                        reg_names[0], reg_names[1]);
30196           /* Now, we need to get the address of the label.  */
30197           if (TARGET_LINK_STACK)
30198             {
30199               char name[32];
30200               get_ppc476_thunk_name (name);
30201               asm_fprintf (file, "\tbl %s\n\tb 1f\n\t.long ", name);
30202               assemble_name (file, buf);
30203               fputs ("-.\n1:", file);
30204               asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
30205               asm_fprintf (file, "\taddi %s,%s,4\n",
30206                            reg_names[11], reg_names[11]);
30207             }
30208           else
30209             {
30210               fputs ("\tbcl 20,31,1f\n\t.long ", file);
30211               assemble_name (file, buf);
30212               fputs ("-.\n1:", file);
30213               asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
30214             }
30215           asm_fprintf (file, "\tlwz %s,0(%s)\n",
30216                        reg_names[0], reg_names[11]);
30217           asm_fprintf (file, "\tadd %s,%s,%s\n",
30218                        reg_names[0], reg_names[0], reg_names[11]);
30219         }
30220       else
30221         {
30222           asm_fprintf (file, "\tlis %s,", reg_names[12]);
30223           assemble_name (file, buf);
30224           fputs ("@ha\n", file);
30225           asm_fprintf (file, "\tstw %s,4(%s)\n",
30226                        reg_names[0], reg_names[1]);
30227           asm_fprintf (file, "\tla %s,", reg_names[0]);
30228           assemble_name (file, buf);
30229           asm_fprintf (file, "@l(%s)\n", reg_names[12]);
30230         }
30231
30232       /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH.  */
30233       fprintf (file, "\tbl %s%s\n",
30234                RS6000_MCOUNT, flag_pic ? "@plt" : "");
30235       break;
30236
30237     case ABI_AIX:
30238     case ABI_ELFv2:
30239     case ABI_DARWIN:
30240       /* Don't do anything, done in output_profile_hook ().  */
30241       break;
30242     }
30243 }
30244
30245 \f
30246
30247 /* The following variable value is the last issued insn.  */
30248
30249 static rtx_insn *last_scheduled_insn;
30250
30251 /* The following variable helps to balance issuing of load and
30252    store instructions */
30253
30254 static int load_store_pendulum;
30255
30256 /* The following variable helps pair divide insns during scheduling.  */
30257 static int divide_cnt;
30258 /* The following variable helps pair and alternate vector and vector load
30259    insns during scheduling.  */
30260 static int vec_pairing;
30261
30262
30263 /* Power4 load update and store update instructions are cracked into a
30264    load or store and an integer insn which are executed in the same cycle.
30265    Branches have their own dispatch slot which does not count against the
30266    GCC issue rate, but it changes the program flow so there are no other
30267    instructions to issue in this cycle.  */
30268
30269 static int
30270 rs6000_variable_issue_1 (rtx_insn *insn, int more)
30271 {
30272   last_scheduled_insn = insn;
30273   if (GET_CODE (PATTERN (insn)) == USE
30274       || GET_CODE (PATTERN (insn)) == CLOBBER)
30275     {
30276       cached_can_issue_more = more;
30277       return cached_can_issue_more;
30278     }
30279
30280   if (insn_terminates_group_p (insn, current_group))
30281     {
30282       cached_can_issue_more = 0;
30283       return cached_can_issue_more;
30284     }
30285
30286   /* If no reservation, but reach here */
30287   if (recog_memoized (insn) < 0)
30288     return more;
30289
30290   if (rs6000_sched_groups)
30291     {
30292       if (is_microcoded_insn (insn))
30293         cached_can_issue_more = 0;
30294       else if (is_cracked_insn (insn))
30295         cached_can_issue_more = more > 2 ? more - 2 : 0;
30296       else
30297         cached_can_issue_more = more - 1;
30298
30299       return cached_can_issue_more;
30300     }
30301
30302   if (rs6000_tune == PROCESSOR_CELL && is_nonpipeline_insn (insn))
30303     return 0;
30304
30305   cached_can_issue_more = more - 1;
30306   return cached_can_issue_more;
30307 }
30308
30309 static int
30310 rs6000_variable_issue (FILE *stream, int verbose, rtx_insn *insn, int more)
30311 {
30312   int r = rs6000_variable_issue_1 (insn, more);
30313   if (verbose)
30314     fprintf (stream, "// rs6000_variable_issue (more = %d) = %d\n", more, r);
30315   return r;
30316 }
30317
30318 /* Adjust the cost of a scheduling dependency.  Return the new cost of
30319    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
30320
30321 static int
30322 rs6000_adjust_cost (rtx_insn *insn, int dep_type, rtx_insn *dep_insn, int cost,
30323                     unsigned int)
30324 {
30325   enum attr_type attr_type;
30326
30327   if (recog_memoized (insn) < 0 || recog_memoized (dep_insn) < 0)
30328     return cost;
30329
30330   switch (dep_type)
30331     {
30332     case REG_DEP_TRUE:
30333       {
30334         /* Data dependency; DEP_INSN writes a register that INSN reads
30335            some cycles later.  */
30336
30337         /* Separate a load from a narrower, dependent store.  */
30338         if ((rs6000_sched_groups || rs6000_tune == PROCESSOR_POWER9
30339              || rs6000_tune == PROCESSOR_FUTURE)
30340             && GET_CODE (PATTERN (insn)) == SET
30341             && GET_CODE (PATTERN (dep_insn)) == SET
30342             && MEM_P (XEXP (PATTERN (insn), 1))
30343             && MEM_P (XEXP (PATTERN (dep_insn), 0))
30344             && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
30345                 > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
30346           return cost + 14;
30347
30348         attr_type = get_attr_type (insn);
30349
30350         switch (attr_type)
30351           {
30352           case TYPE_JMPREG:
30353             /* Tell the first scheduling pass about the latency between
30354                a mtctr and bctr (and mtlr and br/blr).  The first
30355                scheduling pass will not know about this latency since
30356                the mtctr instruction, which has the latency associated
30357                to it, will be generated by reload.  */
30358             return 4;
30359           case TYPE_BRANCH:
30360             /* Leave some extra cycles between a compare and its
30361                dependent branch, to inhibit expensive mispredicts.  */
30362             if ((rs6000_tune == PROCESSOR_PPC603
30363                  || rs6000_tune == PROCESSOR_PPC604
30364                  || rs6000_tune == PROCESSOR_PPC604e
30365                  || rs6000_tune == PROCESSOR_PPC620
30366                  || rs6000_tune == PROCESSOR_PPC630
30367                  || rs6000_tune == PROCESSOR_PPC750
30368                  || rs6000_tune == PROCESSOR_PPC7400
30369                  || rs6000_tune == PROCESSOR_PPC7450
30370                  || rs6000_tune == PROCESSOR_PPCE5500
30371                  || rs6000_tune == PROCESSOR_PPCE6500
30372                  || rs6000_tune == PROCESSOR_POWER4
30373                  || rs6000_tune == PROCESSOR_POWER5
30374                  || rs6000_tune == PROCESSOR_POWER7
30375                  || rs6000_tune == PROCESSOR_POWER8
30376                  || rs6000_tune == PROCESSOR_POWER9
30377                  || rs6000_tune == PROCESSOR_FUTURE
30378                  || rs6000_tune == PROCESSOR_CELL)
30379                 && recog_memoized (dep_insn)
30380                 && (INSN_CODE (dep_insn) >= 0))
30381
30382               switch (get_attr_type (dep_insn))
30383                 {
30384                 case TYPE_CMP:
30385                 case TYPE_FPCOMPARE:
30386                 case TYPE_CR_LOGICAL:
30387                   return cost + 2;
30388                 case TYPE_EXTS:
30389                 case TYPE_MUL:
30390                   if (get_attr_dot (dep_insn) == DOT_YES)
30391                     return cost + 2;
30392                   else
30393                     break;
30394                 case TYPE_SHIFT:
30395                   if (get_attr_dot (dep_insn) == DOT_YES
30396                       && get_attr_var_shift (dep_insn) == VAR_SHIFT_NO)
30397                     return cost + 2;
30398                   else
30399                     break;
30400                 default:
30401                   break;
30402                 }
30403             break;
30404
30405           case TYPE_STORE:
30406           case TYPE_FPSTORE:
30407             if ((rs6000_tune == PROCESSOR_POWER6)
30408                 && recog_memoized (dep_insn)
30409                 && (INSN_CODE (dep_insn) >= 0))
30410               {
30411
30412                 if (GET_CODE (PATTERN (insn)) != SET)
30413                   /* If this happens, we have to extend this to schedule
30414                      optimally.  Return default for now.  */
30415                   return cost;
30416
30417                 /* Adjust the cost for the case where the value written
30418                    by a fixed point operation is used as the address
30419                    gen value on a store. */
30420                 switch (get_attr_type (dep_insn))
30421                   {
30422                   case TYPE_LOAD:
30423                   case TYPE_CNTLZ:
30424                     {
30425                       if (! rs6000_store_data_bypass_p (dep_insn, insn))
30426                         return get_attr_sign_extend (dep_insn)
30427                                == SIGN_EXTEND_YES ? 6 : 4;
30428                       break;
30429                     }
30430                   case TYPE_SHIFT:
30431                     {
30432                       if (! rs6000_store_data_bypass_p (dep_insn, insn))
30433                         return get_attr_var_shift (dep_insn) == VAR_SHIFT_YES ?
30434                                6 : 3;
30435                       break;
30436                     }
30437                   case TYPE_INTEGER:
30438                   case TYPE_ADD:
30439                   case TYPE_LOGICAL:
30440                   case TYPE_EXTS:
30441                   case TYPE_INSERT:
30442                     {
30443                       if (! rs6000_store_data_bypass_p (dep_insn, insn))
30444                         return 3;
30445                       break;
30446                     }
30447                   case TYPE_STORE:
30448                   case TYPE_FPLOAD:
30449                   case TYPE_FPSTORE:
30450                     {
30451                       if (get_attr_update (dep_insn) == UPDATE_YES
30452                           && ! rs6000_store_data_bypass_p (dep_insn, insn))
30453                         return 3;
30454                       break;
30455                     }
30456                   case TYPE_MUL:
30457                     {
30458                       if (! rs6000_store_data_bypass_p (dep_insn, insn))
30459                         return 17;
30460                       break;
30461                     }
30462                   case TYPE_DIV:
30463                     {
30464                       if (! rs6000_store_data_bypass_p (dep_insn, insn))
30465                         return get_attr_size (dep_insn) == SIZE_32 ? 45 : 57;
30466                       break;
30467                     }
30468                   default:
30469                     break;
30470                   }
30471               }
30472             break;
30473
30474           case TYPE_LOAD:
30475             if ((rs6000_tune == PROCESSOR_POWER6)
30476                 && recog_memoized (dep_insn)
30477                 && (INSN_CODE (dep_insn) >= 0))
30478               {
30479
30480                 /* Adjust the cost for the case where the value written
30481                    by a fixed point instruction is used within the address
30482                    gen portion of a subsequent load(u)(x) */
30483                 switch (get_attr_type (dep_insn))
30484                   {
30485                   case TYPE_LOAD:
30486                   case TYPE_CNTLZ:
30487                     {
30488                       if (set_to_load_agen (dep_insn, insn))
30489                         return get_attr_sign_extend (dep_insn)
30490                                == SIGN_EXTEND_YES ? 6 : 4;
30491                       break;
30492                     }
30493                   case TYPE_SHIFT:
30494                     {
30495                       if (set_to_load_agen (dep_insn, insn))
30496                         return get_attr_var_shift (dep_insn) == VAR_SHIFT_YES ?
30497                                6 : 3;
30498                       break;
30499                     }
30500                   case TYPE_INTEGER:
30501                   case TYPE_ADD:
30502                   case TYPE_LOGICAL:
30503                   case TYPE_EXTS:
30504                   case TYPE_INSERT:
30505                     {
30506                       if (set_to_load_agen (dep_insn, insn))
30507                         return 3;
30508                       break;
30509                     }
30510                   case TYPE_STORE:
30511                   case TYPE_FPLOAD:
30512                   case TYPE_FPSTORE:
30513                     {
30514                       if (get_attr_update (dep_insn) == UPDATE_YES
30515                           && set_to_load_agen (dep_insn, insn))
30516                         return 3;
30517                       break;
30518                     }
30519                   case TYPE_MUL:
30520                     {
30521                       if (set_to_load_agen (dep_insn, insn))
30522                         return 17;
30523                       break;
30524                     }
30525                   case TYPE_DIV:
30526                     {
30527                       if (set_to_load_agen (dep_insn, insn))
30528                         return get_attr_size (dep_insn) == SIZE_32 ? 45 : 57;
30529                       break;
30530                     }
30531                   default:
30532                     break;
30533                   }
30534               }
30535             break;
30536
30537           case TYPE_FPLOAD:
30538             if ((rs6000_tune == PROCESSOR_POWER6)
30539                 && get_attr_update (insn) == UPDATE_NO
30540                 && recog_memoized (dep_insn)
30541                 && (INSN_CODE (dep_insn) >= 0)
30542                 && (get_attr_type (dep_insn) == TYPE_MFFGPR))
30543               return 2;
30544
30545           default:
30546             break;
30547           }
30548
30549         /* Fall out to return default cost.  */
30550       }
30551       break;
30552
30553     case REG_DEP_OUTPUT:
30554       /* Output dependency; DEP_INSN writes a register that INSN writes some
30555          cycles later.  */
30556       if ((rs6000_tune == PROCESSOR_POWER6)
30557           && recog_memoized (dep_insn)
30558           && (INSN_CODE (dep_insn) >= 0))
30559         {
30560           attr_type = get_attr_type (insn);
30561
30562           switch (attr_type)
30563             {
30564             case TYPE_FP:
30565             case TYPE_FPSIMPLE:
30566               if (get_attr_type (dep_insn) == TYPE_FP
30567                   || get_attr_type (dep_insn) == TYPE_FPSIMPLE)
30568                 return 1;
30569               break;
30570             case TYPE_FPLOAD:
30571               if (get_attr_update (insn) == UPDATE_NO
30572                   && get_attr_type (dep_insn) == TYPE_MFFGPR)
30573                 return 2;
30574               break;
30575             default:
30576               break;
30577             }
30578         }
30579       /* Fall through, no cost for output dependency.  */
30580       /* FALLTHRU */
30581
30582     case REG_DEP_ANTI:
30583       /* Anti dependency; DEP_INSN reads a register that INSN writes some
30584          cycles later.  */
30585       return 0;
30586
30587     default:
30588       gcc_unreachable ();
30589     }
30590
30591   return cost;
30592 }
30593
30594 /* Debug version of rs6000_adjust_cost.  */
30595
30596 static int
30597 rs6000_debug_adjust_cost (rtx_insn *insn, int dep_type, rtx_insn *dep_insn,
30598                           int cost, unsigned int dw)
30599 {
30600   int ret = rs6000_adjust_cost (insn, dep_type, dep_insn, cost, dw);
30601
30602   if (ret != cost)
30603     {
30604       const char *dep;
30605
30606       switch (dep_type)
30607         {
30608         default:             dep = "unknown depencency"; break;
30609         case REG_DEP_TRUE:   dep = "data dependency";    break;
30610         case REG_DEP_OUTPUT: dep = "output dependency";  break;
30611         case REG_DEP_ANTI:   dep = "anti depencency";    break;
30612         }
30613
30614       fprintf (stderr,
30615                "\nrs6000_adjust_cost, final cost = %d, orig cost = %d, "
30616                "%s, insn:\n", ret, cost, dep);
30617
30618       debug_rtx (insn);
30619     }
30620
30621   return ret;
30622 }
30623
30624 /* The function returns a true if INSN is microcoded.
30625    Return false otherwise.  */
30626
30627 static bool
30628 is_microcoded_insn (rtx_insn *insn)
30629 {
30630   if (!insn || !NONDEBUG_INSN_P (insn)
30631       || GET_CODE (PATTERN (insn)) == USE
30632       || GET_CODE (PATTERN (insn)) == CLOBBER)
30633     return false;
30634
30635   if (rs6000_tune == PROCESSOR_CELL)
30636     return get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS;
30637
30638   if (rs6000_sched_groups
30639       && (rs6000_tune == PROCESSOR_POWER4 || rs6000_tune == PROCESSOR_POWER5))
30640     {
30641       enum attr_type type = get_attr_type (insn);
30642       if ((type == TYPE_LOAD
30643            && get_attr_update (insn) == UPDATE_YES
30644            && get_attr_sign_extend (insn) == SIGN_EXTEND_YES)
30645           || ((type == TYPE_LOAD || type == TYPE_STORE)
30646               && get_attr_update (insn) == UPDATE_YES
30647               && get_attr_indexed (insn) == INDEXED_YES)
30648           || type == TYPE_MFCR)
30649         return true;
30650     }
30651
30652   return false;
30653 }
30654
30655 /* The function returns true if INSN is cracked into 2 instructions
30656    by the processor (and therefore occupies 2 issue slots).  */
30657
30658 static bool
30659 is_cracked_insn (rtx_insn *insn)
30660 {
30661   if (!insn || !NONDEBUG_INSN_P (insn)
30662       || GET_CODE (PATTERN (insn)) == USE
30663       || GET_CODE (PATTERN (insn)) == CLOBBER)
30664     return false;
30665
30666   if (rs6000_sched_groups
30667       && (rs6000_tune == PROCESSOR_POWER4 || rs6000_tune == PROCESSOR_POWER5))
30668     {
30669       enum attr_type type = get_attr_type (insn);
30670       if ((type == TYPE_LOAD
30671            && get_attr_sign_extend (insn) == SIGN_EXTEND_YES
30672            && get_attr_update (insn) == UPDATE_NO)
30673           || (type == TYPE_LOAD
30674               && get_attr_sign_extend (insn) == SIGN_EXTEND_NO
30675               && get_attr_update (insn) == UPDATE_YES
30676               && get_attr_indexed (insn) == INDEXED_NO)
30677           || (type == TYPE_STORE
30678               && get_attr_update (insn) == UPDATE_YES
30679               && get_attr_indexed (insn) == INDEXED_NO)
30680           || ((type == TYPE_FPLOAD || type == TYPE_FPSTORE)
30681               && get_attr_update (insn) == UPDATE_YES)
30682           || (type == TYPE_CR_LOGICAL
30683               && get_attr_cr_logical_3op (insn) == CR_LOGICAL_3OP_YES)
30684           || (type == TYPE_EXTS
30685               && get_attr_dot (insn) == DOT_YES)
30686           || (type == TYPE_SHIFT
30687               && get_attr_dot (insn) == DOT_YES
30688               && get_attr_var_shift (insn) == VAR_SHIFT_NO)
30689           || (type == TYPE_MUL
30690               && get_attr_dot (insn) == DOT_YES)
30691           || type == TYPE_DIV
30692           || (type == TYPE_INSERT
30693               && get_attr_size (insn) == SIZE_32))
30694         return true;
30695     }
30696
30697   return false;
30698 }
30699
30700 /* The function returns true if INSN can be issued only from
30701    the branch slot.  */
30702
30703 static bool
30704 is_branch_slot_insn (rtx_insn *insn)
30705 {
30706   if (!insn || !NONDEBUG_INSN_P (insn)
30707       || GET_CODE (PATTERN (insn)) == USE
30708       || GET_CODE (PATTERN (insn)) == CLOBBER)
30709     return false;
30710
30711   if (rs6000_sched_groups)
30712     {
30713       enum attr_type type = get_attr_type (insn);
30714       if (type == TYPE_BRANCH || type == TYPE_JMPREG)
30715         return true;
30716       return false;
30717     }
30718
30719   return false;
30720 }
30721
30722 /* The function returns true if out_inst sets a value that is
30723    used in the address generation computation of in_insn */
30724 static bool
30725 set_to_load_agen (rtx_insn *out_insn, rtx_insn *in_insn)
30726 {
30727   rtx out_set, in_set;
30728
30729   /* For performance reasons, only handle the simple case where
30730      both loads are a single_set. */
30731   out_set = single_set (out_insn);
30732   if (out_set)
30733     {
30734       in_set = single_set (in_insn);
30735       if (in_set)
30736         return reg_mentioned_p (SET_DEST (out_set), SET_SRC (in_set));
30737     }
30738
30739   return false;
30740 }
30741
30742 /* Try to determine base/offset/size parts of the given MEM.
30743    Return true if successful, false if all the values couldn't
30744    be determined.
30745
30746    This function only looks for REG or REG+CONST address forms.
30747    REG+REG address form will return false. */
30748
30749 static bool
30750 get_memref_parts (rtx mem, rtx *base, HOST_WIDE_INT *offset,
30751                   HOST_WIDE_INT *size)
30752 {
30753   rtx addr_rtx;
30754   if MEM_SIZE_KNOWN_P (mem)
30755     *size = MEM_SIZE (mem);
30756   else
30757     return false;
30758
30759   addr_rtx = (XEXP (mem, 0));
30760   if (GET_CODE (addr_rtx) == PRE_MODIFY)
30761     addr_rtx = XEXP (addr_rtx, 1);
30762
30763   *offset = 0;
30764   while (GET_CODE (addr_rtx) == PLUS
30765          && CONST_INT_P (XEXP (addr_rtx, 1)))
30766     {
30767       *offset += INTVAL (XEXP (addr_rtx, 1));
30768       addr_rtx = XEXP (addr_rtx, 0);
30769     }
30770   if (!REG_P (addr_rtx))
30771     return false;
30772
30773   *base = addr_rtx;
30774   return true;
30775 }
30776
30777 /* The function returns true if the target storage location of
30778    mem1 is adjacent to the target storage location of mem2 */
30779 /* Return 1 if memory locations are adjacent.  */
30780
30781 static bool
30782 adjacent_mem_locations (rtx mem1, rtx mem2)
30783 {
30784   rtx reg1, reg2;
30785   HOST_WIDE_INT off1, size1, off2, size2;
30786
30787   if (get_memref_parts (mem1, &reg1, &off1, &size1)
30788       && get_memref_parts (mem2, &reg2, &off2, &size2))
30789     return ((REGNO (reg1) == REGNO (reg2))
30790             && ((off1 + size1 == off2)
30791                 || (off2 + size2 == off1)));
30792
30793   return false;
30794 }
30795
30796 /* This function returns true if it can be determined that the two MEM
30797    locations overlap by at least 1 byte based on base reg/offset/size. */
30798
30799 static bool
30800 mem_locations_overlap (rtx mem1, rtx mem2)
30801 {
30802   rtx reg1, reg2;
30803   HOST_WIDE_INT off1, size1, off2, size2;
30804
30805   if (get_memref_parts (mem1, &reg1, &off1, &size1)
30806       && get_memref_parts (mem2, &reg2, &off2, &size2))
30807     return ((REGNO (reg1) == REGNO (reg2))
30808             && (((off1 <= off2) && (off1 + size1 > off2))
30809                 || ((off2 <= off1) && (off2 + size2 > off1))));
30810
30811   return false;
30812 }
30813
30814 /* A C statement (sans semicolon) to update the integer scheduling
30815    priority INSN_PRIORITY (INSN). Increase the priority to execute the
30816    INSN earlier, reduce the priority to execute INSN later.  Do not
30817    define this macro if you do not need to adjust the scheduling
30818    priorities of insns.  */
30819
30820 static int
30821 rs6000_adjust_priority (rtx_insn *insn ATTRIBUTE_UNUSED, int priority)
30822 {
30823   rtx load_mem, str_mem;
30824   /* On machines (like the 750) which have asymmetric integer units,
30825      where one integer unit can do multiply and divides and the other
30826      can't, reduce the priority of multiply/divide so it is scheduled
30827      before other integer operations.  */
30828
30829 #if 0
30830   if (! INSN_P (insn))
30831     return priority;
30832
30833   if (GET_CODE (PATTERN (insn)) == USE)
30834     return priority;
30835
30836   switch (rs6000_tune) {
30837   case PROCESSOR_PPC750:
30838     switch (get_attr_type (insn))
30839       {
30840       default:
30841         break;
30842
30843       case TYPE_MUL:
30844       case TYPE_DIV:
30845         fprintf (stderr, "priority was %#x (%d) before adjustment\n",
30846                  priority, priority);
30847         if (priority >= 0 && priority < 0x01000000)
30848           priority >>= 3;
30849         break;
30850       }
30851   }
30852 #endif
30853
30854   if (insn_must_be_first_in_group (insn)
30855       && reload_completed
30856       && current_sched_info->sched_max_insns_priority
30857       && rs6000_sched_restricted_insns_priority)
30858     {
30859
30860       /* Prioritize insns that can be dispatched only in the first
30861          dispatch slot.  */
30862       if (rs6000_sched_restricted_insns_priority == 1)
30863         /* Attach highest priority to insn. This means that in
30864            haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
30865            precede 'priority' (critical path) considerations.  */
30866         return current_sched_info->sched_max_insns_priority;
30867       else if (rs6000_sched_restricted_insns_priority == 2)
30868         /* Increase priority of insn by a minimal amount. This means that in
30869            haifa-sched.c:ready_sort(), only 'priority' (critical path)
30870            considerations precede dispatch-slot restriction considerations.  */
30871         return (priority + 1);
30872     }
30873
30874   if (rs6000_tune == PROCESSOR_POWER6
30875       && ((load_store_pendulum == -2 && is_load_insn (insn, &load_mem))
30876           || (load_store_pendulum == 2 && is_store_insn (insn, &str_mem))))
30877     /* Attach highest priority to insn if the scheduler has just issued two
30878        stores and this instruction is a load, or two loads and this instruction
30879        is a store. Power6 wants loads and stores scheduled alternately
30880        when possible */
30881     return current_sched_info->sched_max_insns_priority;
30882
30883   return priority;
30884 }
30885
30886 /* Return true if the instruction is nonpipelined on the Cell. */
30887 static bool
30888 is_nonpipeline_insn (rtx_insn *insn)
30889 {
30890   enum attr_type type;
30891   if (!insn || !NONDEBUG_INSN_P (insn)
30892       || GET_CODE (PATTERN (insn)) == USE
30893       || GET_CODE (PATTERN (insn)) == CLOBBER)
30894     return false;
30895
30896   type = get_attr_type (insn);
30897   if (type == TYPE_MUL
30898       || type == TYPE_DIV
30899       || type == TYPE_SDIV
30900       || type == TYPE_DDIV
30901       || type == TYPE_SSQRT
30902       || type == TYPE_DSQRT
30903       || type == TYPE_MFCR
30904       || type == TYPE_MFCRF
30905       || type == TYPE_MFJMPR)
30906     {
30907       return true;
30908     }
30909   return false;
30910 }
30911
30912
30913 /* Return how many instructions the machine can issue per cycle.  */
30914
30915 static int
30916 rs6000_issue_rate (void)
30917 {
30918   /* Unless scheduling for register pressure, use issue rate of 1 for
30919      first scheduling pass to decrease degradation.  */
30920   if (!reload_completed && !flag_sched_pressure)
30921     return 1;
30922
30923   switch (rs6000_tune) {
30924   case PROCESSOR_RS64A:
30925   case PROCESSOR_PPC601: /* ? */
30926   case PROCESSOR_PPC7450:
30927     return 3;
30928   case PROCESSOR_PPC440:
30929   case PROCESSOR_PPC603:
30930   case PROCESSOR_PPC750:
30931   case PROCESSOR_PPC7400:
30932   case PROCESSOR_PPC8540:
30933   case PROCESSOR_PPC8548:
30934   case PROCESSOR_CELL:
30935   case PROCESSOR_PPCE300C2:
30936   case PROCESSOR_PPCE300C3:
30937   case PROCESSOR_PPCE500MC:
30938   case PROCESSOR_PPCE500MC64:
30939   case PROCESSOR_PPCE5500:
30940   case PROCESSOR_PPCE6500:
30941   case PROCESSOR_TITAN:
30942     return 2;
30943   case PROCESSOR_PPC476:
30944   case PROCESSOR_PPC604:
30945   case PROCESSOR_PPC604e:
30946   case PROCESSOR_PPC620:
30947   case PROCESSOR_PPC630:
30948     return 4;
30949   case PROCESSOR_POWER4:
30950   case PROCESSOR_POWER5:
30951   case PROCESSOR_POWER6:
30952   case PROCESSOR_POWER7:
30953     return 5;
30954   case PROCESSOR_POWER8:
30955     return 7;
30956   case PROCESSOR_POWER9:
30957   case PROCESSOR_FUTURE:
30958     return 6;
30959   default:
30960     return 1;
30961   }
30962 }
30963
30964 /* Return how many instructions to look ahead for better insn
30965    scheduling.  */
30966
30967 static int
30968 rs6000_use_sched_lookahead (void)
30969 {
30970   switch (rs6000_tune)
30971     {
30972     case PROCESSOR_PPC8540:
30973     case PROCESSOR_PPC8548:
30974       return 4;
30975
30976     case PROCESSOR_CELL:
30977       return (reload_completed ? 8 : 0);
30978
30979     default:
30980       return 0;
30981     }
30982 }
30983
30984 /* We are choosing insn from the ready queue.  Return zero if INSN can be
30985    chosen.  */
30986 static int
30987 rs6000_use_sched_lookahead_guard (rtx_insn *insn, int ready_index)
30988 {
30989   if (ready_index == 0)
30990     return 0;
30991
30992   if (rs6000_tune != PROCESSOR_CELL)
30993     return 0;
30994
30995   gcc_assert (insn != NULL_RTX && INSN_P (insn));
30996
30997   if (!reload_completed
30998       || is_nonpipeline_insn (insn)
30999       || is_microcoded_insn (insn))
31000     return 1;
31001
31002   return 0;
31003 }
31004
31005 /* Determine if PAT refers to memory. If so, set MEM_REF to the MEM rtx
31006    and return true.  */
31007
31008 static bool
31009 find_mem_ref (rtx pat, rtx *mem_ref)
31010 {
31011   const char * fmt;
31012   int i, j;
31013
31014   /* stack_tie does not produce any real memory traffic.  */
31015   if (tie_operand (pat, VOIDmode))
31016     return false;
31017
31018   if (MEM_P (pat))
31019     {
31020       *mem_ref = pat;
31021       return true;
31022     }
31023
31024   /* Recursively process the pattern.  */
31025   fmt = GET_RTX_FORMAT (GET_CODE (pat));
31026
31027   for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0; i--)
31028     {
31029       if (fmt[i] == 'e')
31030         {
31031           if (find_mem_ref (XEXP (pat, i), mem_ref))
31032             return true;
31033         }
31034       else if (fmt[i] == 'E')
31035         for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
31036           {
31037             if (find_mem_ref (XVECEXP (pat, i, j), mem_ref))
31038               return true;
31039           }
31040     }
31041
31042   return false;
31043 }
31044
31045 /* Determine if PAT is a PATTERN of a load insn.  */
31046
31047 static bool
31048 is_load_insn1 (rtx pat, rtx *load_mem)
31049 {
31050   if (!pat || pat == NULL_RTX)
31051     return false;
31052
31053   if (GET_CODE (pat) == SET)
31054     return find_mem_ref (SET_SRC (pat), load_mem);
31055
31056   if (GET_CODE (pat) == PARALLEL)
31057     {
31058       int i;
31059
31060       for (i = 0; i < XVECLEN (pat, 0); i++)
31061         if (is_load_insn1 (XVECEXP (pat, 0, i), load_mem))
31062           return true;
31063     }
31064
31065   return false;
31066 }
31067
31068 /* Determine if INSN loads from memory.  */
31069
31070 static bool
31071 is_load_insn (rtx insn, rtx *load_mem)
31072 {
31073   if (!insn || !INSN_P (insn))
31074     return false;
31075
31076   if (CALL_P (insn))
31077     return false;
31078
31079   return is_load_insn1 (PATTERN (insn), load_mem);
31080 }
31081
31082 /* Determine if PAT is a PATTERN of a store insn.  */
31083
31084 static bool
31085 is_store_insn1 (rtx pat, rtx *str_mem)
31086 {
31087   if (!pat || pat == NULL_RTX)
31088     return false;
31089
31090   if (GET_CODE (pat) == SET)
31091     return find_mem_ref (SET_DEST (pat), str_mem);
31092
31093   if (GET_CODE (pat) == PARALLEL)
31094     {
31095       int i;
31096
31097       for (i = 0; i < XVECLEN (pat, 0); i++)
31098         if (is_store_insn1 (XVECEXP (pat, 0, i), str_mem))
31099           return true;
31100     }
31101
31102   return false;
31103 }
31104
31105 /* Determine if INSN stores to memory.  */
31106
31107 static bool
31108 is_store_insn (rtx insn, rtx *str_mem)
31109 {
31110   if (!insn || !INSN_P (insn))
31111     return false;
31112
31113   return is_store_insn1 (PATTERN (insn), str_mem);
31114 }
31115
31116 /* Return whether TYPE is a Power9 pairable vector instruction type.  */
31117
31118 static bool
31119 is_power9_pairable_vec_type (enum attr_type type)
31120 {
31121   switch (type)
31122     {
31123       case TYPE_VECSIMPLE:
31124       case TYPE_VECCOMPLEX:
31125       case TYPE_VECDIV:
31126       case TYPE_VECCMP:
31127       case TYPE_VECPERM:
31128       case TYPE_VECFLOAT:
31129       case TYPE_VECFDIV:
31130       case TYPE_VECDOUBLE:
31131         return true;
31132       default:
31133         break;
31134     }
31135   return false;
31136 }
31137
31138 /* Returns whether the dependence between INSN and NEXT is considered
31139    costly by the given target.  */
31140
31141 static bool
31142 rs6000_is_costly_dependence (dep_t dep, int cost, int distance)
31143 {
31144   rtx insn;
31145   rtx next;
31146   rtx load_mem, str_mem;
31147
31148   /* If the flag is not enabled - no dependence is considered costly;
31149      allow all dependent insns in the same group.
31150      This is the most aggressive option.  */
31151   if (rs6000_sched_costly_dep == no_dep_costly)
31152     return false;
31153
31154   /* If the flag is set to 1 - a dependence is always considered costly;
31155      do not allow dependent instructions in the same group.
31156      This is the most conservative option.  */
31157   if (rs6000_sched_costly_dep == all_deps_costly)
31158     return true;
31159
31160   insn = DEP_PRO (dep);
31161   next = DEP_CON (dep);
31162
31163   if (rs6000_sched_costly_dep == store_to_load_dep_costly
31164       && is_load_insn (next, &load_mem)
31165       && is_store_insn (insn, &str_mem))
31166     /* Prevent load after store in the same group.  */
31167     return true;
31168
31169   if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
31170       && is_load_insn (next, &load_mem)
31171       && is_store_insn (insn, &str_mem)
31172       && DEP_TYPE (dep) == REG_DEP_TRUE
31173       && mem_locations_overlap(str_mem, load_mem))
31174      /* Prevent load after store in the same group if it is a true
31175         dependence.  */
31176      return true;
31177
31178   /* The flag is set to X; dependences with latency >= X are considered costly,
31179      and will not be scheduled in the same group.  */
31180   if (rs6000_sched_costly_dep <= max_dep_latency
31181       && ((cost - distance) >= (int)rs6000_sched_costly_dep))
31182     return true;
31183
31184   return false;
31185 }
31186
31187 /* Return the next insn after INSN that is found before TAIL is reached,
31188    skipping any "non-active" insns - insns that will not actually occupy
31189    an issue slot.  Return NULL_RTX if such an insn is not found.  */
31190
31191 static rtx_insn *
31192 get_next_active_insn (rtx_insn *insn, rtx_insn *tail)
31193 {
31194   if (insn == NULL_RTX || insn == tail)
31195     return NULL;
31196
31197   while (1)
31198     {
31199       insn = NEXT_INSN (insn);
31200       if (insn == NULL_RTX || insn == tail)
31201         return NULL;
31202
31203       if (CALL_P (insn)
31204           || JUMP_P (insn) || JUMP_TABLE_DATA_P (insn)
31205           || (NONJUMP_INSN_P (insn)
31206               && GET_CODE (PATTERN (insn)) != USE
31207               && GET_CODE (PATTERN (insn)) != CLOBBER
31208               && INSN_CODE (insn) != CODE_FOR_stack_tie))
31209         break;
31210     }
31211   return insn;
31212 }
31213
31214 /* Do Power9 specific sched_reorder2 reordering of ready list.  */
31215
31216 static int
31217 power9_sched_reorder2 (rtx_insn **ready, int lastpos)
31218 {
31219   int pos;
31220   int i;
31221   rtx_insn *tmp;
31222   enum attr_type type, type2;
31223
31224   type = get_attr_type (last_scheduled_insn);
31225
31226   /* Try to issue fixed point divides back-to-back in pairs so they will be
31227      routed to separate execution units and execute in parallel.  */
31228   if (type == TYPE_DIV && divide_cnt == 0)
31229     {
31230       /* First divide has been scheduled.  */
31231       divide_cnt = 1;
31232
31233       /* Scan the ready list looking for another divide, if found move it
31234          to the end of the list so it is chosen next.  */
31235       pos = lastpos;
31236       while (pos >= 0)
31237         {
31238           if (recog_memoized (ready[pos]) >= 0
31239               && get_attr_type (ready[pos]) == TYPE_DIV)
31240             {
31241               tmp = ready[pos];
31242               for (i = pos; i < lastpos; i++)
31243                 ready[i] = ready[i + 1];
31244               ready[lastpos] = tmp;
31245               break;
31246             }
31247           pos--;
31248         }
31249     }
31250   else
31251     {
31252       /* Last insn was the 2nd divide or not a divide, reset the counter.  */
31253       divide_cnt = 0;
31254
31255       /* The best dispatch throughput for vector and vector load insns can be
31256          achieved by interleaving a vector and vector load such that they'll
31257          dispatch to the same superslice. If this pairing cannot be achieved
31258          then it is best to pair vector insns together and vector load insns
31259          together.
31260
31261          To aid in this pairing, vec_pairing maintains the current state with
31262          the following values:
31263
31264              0  : Initial state, no vecload/vector pairing has been started.
31265
31266              1  : A vecload or vector insn has been issued and a candidate for
31267                   pairing has been found and moved to the end of the ready
31268                   list.  */
31269       if (type == TYPE_VECLOAD)
31270         {
31271           /* Issued a vecload.  */
31272           if (vec_pairing == 0)
31273             {
31274               int vecload_pos = -1;
31275               /* We issued a single vecload, look for a vector insn to pair it
31276                  with.  If one isn't found, try to pair another vecload.  */
31277               pos = lastpos;
31278               while (pos >= 0)
31279                 {
31280                   if (recog_memoized (ready[pos]) >= 0)
31281                     {
31282                       type2 = get_attr_type (ready[pos]);
31283                       if (is_power9_pairable_vec_type (type2))
31284                         {
31285                           /* Found a vector insn to pair with, move it to the
31286                              end of the ready list so it is scheduled next.  */
31287                           tmp = ready[pos];
31288                           for (i = pos; i < lastpos; i++)
31289                             ready[i] = ready[i + 1];
31290                           ready[lastpos] = tmp;
31291                           vec_pairing = 1;
31292                           return cached_can_issue_more;
31293                         }
31294                       else if (type2 == TYPE_VECLOAD && vecload_pos == -1)
31295                         /* Remember position of first vecload seen.  */
31296                         vecload_pos = pos;
31297                     }
31298                   pos--;
31299                 }
31300               if (vecload_pos >= 0)
31301                 {
31302                   /* Didn't find a vector to pair with but did find a vecload,
31303                      move it to the end of the ready list.  */
31304                   tmp = ready[vecload_pos];
31305                   for (i = vecload_pos; i < lastpos; i++)
31306                     ready[i] = ready[i + 1];
31307                   ready[lastpos] = tmp;
31308                   vec_pairing = 1;
31309                   return cached_can_issue_more;
31310                 }
31311             }
31312         }
31313       else if (is_power9_pairable_vec_type (type))
31314         {
31315           /* Issued a vector operation.  */
31316           if (vec_pairing == 0)
31317             {
31318               int vec_pos = -1;
31319               /* We issued a single vector insn, look for a vecload to pair it
31320                  with.  If one isn't found, try to pair another vector.  */
31321               pos = lastpos;
31322               while (pos >= 0)
31323                 {
31324                   if (recog_memoized (ready[pos]) >= 0)
31325                     {
31326                       type2 = get_attr_type (ready[pos]);
31327                       if (type2 == TYPE_VECLOAD)
31328                         {
31329                           /* Found a vecload insn to pair with, move it to the
31330                              end of the ready list so it is scheduled next.  */
31331                           tmp = ready[pos];
31332                           for (i = pos; i < lastpos; i++)
31333                             ready[i] = ready[i + 1];
31334                           ready[lastpos] = tmp;
31335                           vec_pairing = 1;
31336                           return cached_can_issue_more;
31337                         }
31338                       else if (is_power9_pairable_vec_type (type2)
31339                                && vec_pos == -1)
31340                         /* Remember position of first vector insn seen.  */
31341                         vec_pos = pos;
31342                     }
31343                   pos--;
31344                 }
31345               if (vec_pos >= 0)
31346                 {
31347                   /* Didn't find a vecload to pair with but did find a vector
31348                      insn, move it to the end of the ready list.  */
31349                   tmp = ready[vec_pos];
31350                   for (i = vec_pos; i < lastpos; i++)
31351                     ready[i] = ready[i + 1];
31352                   ready[lastpos] = tmp;
31353                   vec_pairing = 1;
31354                   return cached_can_issue_more;
31355                 }
31356             }
31357         }
31358
31359       /* We've either finished a vec/vecload pair, couldn't find an insn to
31360          continue the current pair, or the last insn had nothing to do with
31361          with pairing.  In any case, reset the state.  */
31362       vec_pairing = 0;
31363     }
31364
31365   return cached_can_issue_more;
31366 }
31367
31368 /* We are about to begin issuing insns for this clock cycle. */
31369
31370 static int
31371 rs6000_sched_reorder (FILE *dump ATTRIBUTE_UNUSED, int sched_verbose,
31372                         rtx_insn **ready ATTRIBUTE_UNUSED,
31373                         int *pn_ready ATTRIBUTE_UNUSED,
31374                         int clock_var ATTRIBUTE_UNUSED)
31375 {
31376   int n_ready = *pn_ready;
31377
31378   if (sched_verbose)
31379     fprintf (dump, "// rs6000_sched_reorder :\n");
31380
31381   /* Reorder the ready list, if the second to last ready insn
31382      is a nonepipeline insn.  */
31383   if (rs6000_tune == PROCESSOR_CELL && n_ready > 1)
31384   {
31385     if (is_nonpipeline_insn (ready[n_ready - 1])
31386         && (recog_memoized (ready[n_ready - 2]) > 0))
31387       /* Simply swap first two insns.  */
31388       std::swap (ready[n_ready - 1], ready[n_ready - 2]);
31389   }
31390
31391   if (rs6000_tune == PROCESSOR_POWER6)
31392     load_store_pendulum = 0;
31393
31394   return rs6000_issue_rate ();
31395 }
31396
31397 /* Like rs6000_sched_reorder, but called after issuing each insn.  */
31398
31399 static int
31400 rs6000_sched_reorder2 (FILE *dump, int sched_verbose, rtx_insn **ready,
31401                          int *pn_ready, int clock_var ATTRIBUTE_UNUSED)
31402 {
31403   if (sched_verbose)
31404     fprintf (dump, "// rs6000_sched_reorder2 :\n");
31405
31406   /* For Power6, we need to handle some special cases to try and keep the
31407      store queue from overflowing and triggering expensive flushes.
31408
31409      This code monitors how load and store instructions are being issued
31410      and skews the ready list one way or the other to increase the likelihood
31411      that a desired instruction is issued at the proper time.
31412
31413      A couple of things are done.  First, we maintain a "load_store_pendulum"
31414      to track the current state of load/store issue.
31415
31416        - If the pendulum is at zero, then no loads or stores have been
31417          issued in the current cycle so we do nothing.
31418
31419        - If the pendulum is 1, then a single load has been issued in this
31420          cycle and we attempt to locate another load in the ready list to
31421          issue with it.
31422
31423        - If the pendulum is -2, then two stores have already been
31424          issued in this cycle, so we increase the priority of the first load
31425          in the ready list to increase it's likelihood of being chosen first
31426          in the next cycle.
31427
31428        - If the pendulum is -1, then a single store has been issued in this
31429          cycle and we attempt to locate another store in the ready list to
31430          issue with it, preferring a store to an adjacent memory location to
31431          facilitate store pairing in the store queue.
31432
31433        - If the pendulum is 2, then two loads have already been
31434          issued in this cycle, so we increase the priority of the first store
31435          in the ready list to increase it's likelihood of being chosen first
31436          in the next cycle.
31437
31438        - If the pendulum < -2 or > 2, then do nothing.
31439
31440        Note: This code covers the most common scenarios.  There exist non
31441              load/store instructions which make use of the LSU and which
31442              would need to be accounted for to strictly model the behavior
31443              of the machine.  Those instructions are currently unaccounted
31444              for to help minimize compile time overhead of this code.
31445    */
31446   if (rs6000_tune == PROCESSOR_POWER6 && last_scheduled_insn)
31447     {
31448       int pos;
31449       int i;
31450       rtx_insn *tmp;
31451       rtx load_mem, str_mem;
31452
31453       if (is_store_insn (last_scheduled_insn, &str_mem))
31454         /* Issuing a store, swing the load_store_pendulum to the left */
31455         load_store_pendulum--;
31456       else if (is_load_insn (last_scheduled_insn, &load_mem))
31457         /* Issuing a load, swing the load_store_pendulum to the right */
31458         load_store_pendulum++;
31459       else
31460         return cached_can_issue_more;
31461
31462       /* If the pendulum is balanced, or there is only one instruction on
31463          the ready list, then all is well, so return. */
31464       if ((load_store_pendulum == 0) || (*pn_ready <= 1))
31465         return cached_can_issue_more;
31466
31467       if (load_store_pendulum == 1)
31468         {
31469           /* A load has been issued in this cycle.  Scan the ready list
31470              for another load to issue with it */
31471           pos = *pn_ready-1;
31472
31473           while (pos >= 0)
31474             {
31475               if (is_load_insn (ready[pos], &load_mem))
31476                 {
31477                   /* Found a load.  Move it to the head of the ready list,
31478                      and adjust it's priority so that it is more likely to
31479                      stay there */
31480                   tmp = ready[pos];
31481                   for (i=pos; i<*pn_ready-1; i++)
31482                     ready[i] = ready[i + 1];
31483                   ready[*pn_ready-1] = tmp;
31484
31485                   if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
31486                     INSN_PRIORITY (tmp)++;
31487                   break;
31488                 }
31489               pos--;
31490             }
31491         }
31492       else if (load_store_pendulum == -2)
31493         {
31494           /* Two stores have been issued in this cycle.  Increase the
31495              priority of the first load in the ready list to favor it for
31496              issuing in the next cycle. */
31497           pos = *pn_ready-1;
31498
31499           while (pos >= 0)
31500             {
31501               if (is_load_insn (ready[pos], &load_mem)
31502                   && !sel_sched_p ()
31503                   && INSN_PRIORITY_KNOWN (ready[pos]))
31504                 {
31505                   INSN_PRIORITY (ready[pos])++;
31506
31507                   /* Adjust the pendulum to account for the fact that a load
31508                      was found and increased in priority.  This is to prevent
31509                      increasing the priority of multiple loads */
31510                   load_store_pendulum--;
31511
31512                   break;
31513                 }
31514               pos--;
31515             }
31516         }
31517       else if (load_store_pendulum == -1)
31518         {
31519           /* A store has been issued in this cycle.  Scan the ready list for
31520              another store to issue with it, preferring a store to an adjacent
31521              memory location */
31522           int first_store_pos = -1;
31523
31524           pos = *pn_ready-1;
31525
31526           while (pos >= 0)
31527             {
31528               if (is_store_insn (ready[pos], &str_mem))
31529                 {
31530                   rtx str_mem2;
31531                   /* Maintain the index of the first store found on the
31532                      list */
31533                   if (first_store_pos == -1)
31534                     first_store_pos = pos;
31535
31536                   if (is_store_insn (last_scheduled_insn, &str_mem2)
31537                       && adjacent_mem_locations (str_mem, str_mem2))
31538                     {
31539                       /* Found an adjacent store.  Move it to the head of the
31540                          ready list, and adjust it's priority so that it is
31541                          more likely to stay there */
31542                       tmp = ready[pos];
31543                       for (i=pos; i<*pn_ready-1; i++)
31544                         ready[i] = ready[i + 1];
31545                       ready[*pn_ready-1] = tmp;
31546
31547                       if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
31548                         INSN_PRIORITY (tmp)++;
31549
31550                       first_store_pos = -1;
31551
31552                       break;
31553                     };
31554                 }
31555               pos--;
31556             }
31557
31558           if (first_store_pos >= 0)
31559             {
31560               /* An adjacent store wasn't found, but a non-adjacent store was,
31561                  so move the non-adjacent store to the front of the ready
31562                  list, and adjust its priority so that it is more likely to
31563                  stay there. */
31564               tmp = ready[first_store_pos];
31565               for (i=first_store_pos; i<*pn_ready-1; i++)
31566                 ready[i] = ready[i + 1];
31567               ready[*pn_ready-1] = tmp;
31568               if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
31569                 INSN_PRIORITY (tmp)++;
31570             }
31571         }
31572       else if (load_store_pendulum == 2)
31573        {
31574            /* Two loads have been issued in this cycle.  Increase the priority
31575               of the first store in the ready list to favor it for issuing in
31576               the next cycle. */
31577           pos = *pn_ready-1;
31578
31579           while (pos >= 0)
31580             {
31581               if (is_store_insn (ready[pos], &str_mem)
31582                   && !sel_sched_p ()
31583                   && INSN_PRIORITY_KNOWN (ready[pos]))
31584                 {
31585                   INSN_PRIORITY (ready[pos])++;
31586
31587                   /* Adjust the pendulum to account for the fact that a store
31588                      was found and increased in priority.  This is to prevent
31589                      increasing the priority of multiple stores */
31590                   load_store_pendulum++;
31591
31592                   break;
31593                 }
31594               pos--;
31595             }
31596         }
31597     }
31598
31599   /* Do Power9 dependent reordering if necessary.  */
31600   if (rs6000_tune == PROCESSOR_POWER9 && last_scheduled_insn
31601       && recog_memoized (last_scheduled_insn) >= 0)
31602     return power9_sched_reorder2 (ready, *pn_ready - 1);
31603
31604   return cached_can_issue_more;
31605 }
31606
31607 /* Return whether the presence of INSN causes a dispatch group termination
31608    of group WHICH_GROUP.
31609
31610    If WHICH_GROUP == current_group, this function will return true if INSN
31611    causes the termination of the current group (i.e, the dispatch group to
31612    which INSN belongs). This means that INSN will be the last insn in the
31613    group it belongs to.
31614
31615    If WHICH_GROUP == previous_group, this function will return true if INSN
31616    causes the termination of the previous group (i.e, the dispatch group that
31617    precedes the group to which INSN belongs).  This means that INSN will be
31618    the first insn in the group it belongs to).  */
31619
31620 static bool
31621 insn_terminates_group_p (rtx_insn *insn, enum group_termination which_group)
31622 {
31623   bool first, last;
31624
31625   if (! insn)
31626     return false;
31627
31628   first = insn_must_be_first_in_group (insn);
31629   last = insn_must_be_last_in_group (insn);
31630
31631   if (first && last)
31632     return true;
31633
31634   if (which_group == current_group)
31635     return last;
31636   else if (which_group == previous_group)
31637     return first;
31638
31639   return false;
31640 }
31641
31642
31643 static bool
31644 insn_must_be_first_in_group (rtx_insn *insn)
31645 {
31646   enum attr_type type;
31647
31648   if (!insn
31649       || NOTE_P (insn)
31650       || DEBUG_INSN_P (insn)
31651       || GET_CODE (PATTERN (insn)) == USE
31652       || GET_CODE (PATTERN (insn)) == CLOBBER)
31653     return false;
31654
31655   switch (rs6000_tune)
31656     {
31657     case PROCESSOR_POWER5:
31658       if (is_cracked_insn (insn))
31659         return true;
31660       /* FALLTHRU */
31661     case PROCESSOR_POWER4:
31662       if (is_microcoded_insn (insn))
31663         return true;
31664
31665       if (!rs6000_sched_groups)
31666         return false;
31667
31668       type = get_attr_type (insn);
31669
31670       switch (type)
31671         {
31672         case TYPE_MFCR:
31673         case TYPE_MFCRF:
31674         case TYPE_MTCR:
31675         case TYPE_CR_LOGICAL:
31676         case TYPE_MTJMPR:
31677         case TYPE_MFJMPR:
31678         case TYPE_DIV:
31679         case TYPE_LOAD_L:
31680         case TYPE_STORE_C:
31681         case TYPE_ISYNC:
31682         case TYPE_SYNC:
31683           return true;
31684         default:
31685           break;
31686         }
31687       break;
31688     case PROCESSOR_POWER6:
31689       type = get_attr_type (insn);
31690
31691       switch (type)
31692         {
31693         case TYPE_EXTS:
31694         case TYPE_CNTLZ:
31695         case TYPE_TRAP:
31696         case TYPE_MUL:
31697         case TYPE_INSERT:
31698         case TYPE_FPCOMPARE:
31699         case TYPE_MFCR:
31700         case TYPE_MTCR:
31701         case TYPE_MFJMPR:
31702         case TYPE_MTJMPR:
31703         case TYPE_ISYNC:
31704         case TYPE_SYNC:
31705         case TYPE_LOAD_L:
31706         case TYPE_STORE_C:
31707           return true;
31708         case TYPE_SHIFT:
31709           if (get_attr_dot (insn) == DOT_NO
31710               || get_attr_var_shift (insn) == VAR_SHIFT_NO)
31711             return true;
31712           else
31713             break;
31714         case TYPE_DIV:
31715           if (get_attr_size (insn) == SIZE_32)
31716             return true;
31717           else
31718             break;
31719         case TYPE_LOAD:
31720         case TYPE_STORE:
31721         case TYPE_FPLOAD:
31722         case TYPE_FPSTORE:
31723           if (get_attr_update (insn) == UPDATE_YES)
31724             return true;
31725           else
31726             break;
31727         default:
31728           break;
31729         }
31730       break;
31731     case PROCESSOR_POWER7:
31732       type = get_attr_type (insn);
31733
31734       switch (type)
31735         {
31736         case TYPE_CR_LOGICAL:
31737         case TYPE_MFCR:
31738         case TYPE_MFCRF:
31739         case TYPE_MTCR:
31740         case TYPE_DIV:
31741         case TYPE_ISYNC:
31742         case TYPE_LOAD_L:
31743         case TYPE_STORE_C:
31744         case TYPE_MFJMPR:
31745         case TYPE_MTJMPR:
31746           return true;
31747         case TYPE_MUL:
31748         case TYPE_SHIFT:
31749         case TYPE_EXTS:
31750           if (get_attr_dot (insn) == DOT_YES)
31751             return true;
31752           else
31753             break;
31754         case TYPE_LOAD:
31755           if (get_attr_sign_extend (insn) == SIGN_EXTEND_YES
31756               || get_attr_update (insn) == UPDATE_YES)
31757             return true;
31758           else
31759             break;
31760         case TYPE_STORE:
31761         case TYPE_FPLOAD:
31762         case TYPE_FPSTORE:
31763           if (get_attr_update (insn) == UPDATE_YES)
31764             return true;
31765           else
31766             break;
31767         default:
31768           break;
31769         }
31770       break;
31771     case PROCESSOR_POWER8:
31772       type = get_attr_type (insn);
31773
31774       switch (type)
31775         {
31776         case TYPE_CR_LOGICAL:
31777         case TYPE_MFCR:
31778         case TYPE_MFCRF:
31779         case TYPE_MTCR:
31780         case TYPE_SYNC:
31781         case TYPE_ISYNC:
31782         case TYPE_LOAD_L:
31783         case TYPE_STORE_C:
31784         case TYPE_VECSTORE:
31785         case TYPE_MFJMPR:
31786         case TYPE_MTJMPR:
31787           return true;
31788         case TYPE_SHIFT:
31789         case TYPE_EXTS:
31790         case TYPE_MUL:
31791           if (get_attr_dot (insn) == DOT_YES)
31792             return true;
31793           else
31794             break;
31795         case TYPE_LOAD:
31796           if (get_attr_sign_extend (insn) == SIGN_EXTEND_YES
31797               || get_attr_update (insn) == UPDATE_YES)
31798             return true;
31799           else
31800             break;
31801         case TYPE_STORE:
31802           if (get_attr_update (insn) == UPDATE_YES
31803               && get_attr_indexed (insn) == INDEXED_YES)
31804             return true;
31805           else
31806             break;
31807         default:
31808           break;
31809         }
31810       break;
31811     default:
31812       break;
31813     }
31814
31815   return false;
31816 }
31817
31818 static bool
31819 insn_must_be_last_in_group (rtx_insn *insn)
31820 {
31821   enum attr_type type;
31822
31823   if (!insn
31824       || NOTE_P (insn)
31825       || DEBUG_INSN_P (insn)
31826       || GET_CODE (PATTERN (insn)) == USE
31827       || GET_CODE (PATTERN (insn)) == CLOBBER)
31828     return false;
31829
31830   switch (rs6000_tune) {
31831   case PROCESSOR_POWER4:
31832   case PROCESSOR_POWER5:
31833     if (is_microcoded_insn (insn))
31834       return true;
31835
31836     if (is_branch_slot_insn (insn))
31837       return true;
31838
31839     break;
31840   case PROCESSOR_POWER6:
31841     type = get_attr_type (insn);
31842
31843     switch (type)
31844       {
31845       case TYPE_EXTS:
31846       case TYPE_CNTLZ:
31847       case TYPE_TRAP:
31848       case TYPE_MUL:
31849       case TYPE_FPCOMPARE:
31850       case TYPE_MFCR:
31851       case TYPE_MTCR:
31852       case TYPE_MFJMPR:
31853       case TYPE_MTJMPR:
31854       case TYPE_ISYNC:
31855       case TYPE_SYNC:
31856       case TYPE_LOAD_L:
31857       case TYPE_STORE_C:
31858         return true;
31859       case TYPE_SHIFT:
31860         if (get_attr_dot (insn) == DOT_NO
31861             || get_attr_var_shift (insn) == VAR_SHIFT_NO)
31862           return true;
31863         else
31864           break;
31865       case TYPE_DIV:
31866         if (get_attr_size (insn) == SIZE_32)
31867           return true;
31868         else
31869           break;
31870       default:
31871         break;
31872     }
31873     break;
31874   case PROCESSOR_POWER7:
31875     type = get_attr_type (insn);
31876
31877     switch (type)
31878       {
31879       case TYPE_ISYNC:
31880       case TYPE_SYNC:
31881       case TYPE_LOAD_L:
31882       case TYPE_STORE_C:
31883         return true;
31884       case TYPE_LOAD:
31885         if (get_attr_sign_extend (insn) == SIGN_EXTEND_YES
31886             && get_attr_update (insn) == UPDATE_YES)
31887           return true;
31888         else
31889           break;
31890       case TYPE_STORE:
31891         if (get_attr_update (insn) == UPDATE_YES
31892             && get_attr_indexed (insn) == INDEXED_YES)
31893           return true;
31894         else
31895           break;
31896       default:
31897         break;
31898     }
31899     break;
31900   case PROCESSOR_POWER8:
31901     type = get_attr_type (insn);
31902
31903     switch (type)
31904       {
31905       case TYPE_MFCR:
31906       case TYPE_MTCR:
31907       case TYPE_ISYNC:
31908       case TYPE_SYNC:
31909       case TYPE_LOAD_L:
31910       case TYPE_STORE_C:
31911         return true;
31912       case TYPE_LOAD:
31913         if (get_attr_sign_extend (insn) == SIGN_EXTEND_YES
31914             && get_attr_update (insn) == UPDATE_YES)
31915           return true;
31916         else
31917           break;
31918       case TYPE_STORE:
31919         if (get_attr_update (insn) == UPDATE_YES
31920             && get_attr_indexed (insn) == INDEXED_YES)
31921           return true;
31922         else
31923           break;
31924       default:
31925         break;
31926     }
31927     break;
31928   default:
31929     break;
31930   }
31931
31932   return false;
31933 }
31934
31935 /* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
31936    dispatch group) from the insns in GROUP_INSNS.  Return false otherwise.  */
31937
31938 static bool
31939 is_costly_group (rtx *group_insns, rtx next_insn)
31940 {
31941   int i;
31942   int issue_rate = rs6000_issue_rate ();
31943
31944   for (i = 0; i < issue_rate; i++)
31945     {
31946       sd_iterator_def sd_it;
31947       dep_t dep;
31948       rtx insn = group_insns[i];
31949
31950       if (!insn)
31951         continue;
31952
31953       FOR_EACH_DEP (insn, SD_LIST_RES_FORW, sd_it, dep)
31954         {
31955           rtx next = DEP_CON (dep);
31956
31957           if (next == next_insn
31958               && rs6000_is_costly_dependence (dep, dep_cost (dep), 0))
31959             return true;
31960         }
31961     }
31962
31963   return false;
31964 }
31965
31966 /* Utility of the function redefine_groups.
31967    Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
31968    in the same dispatch group.  If so, insert nops before NEXT_INSN, in order
31969    to keep it "far" (in a separate group) from GROUP_INSNS, following
31970    one of the following schemes, depending on the value of the flag
31971    -minsert_sched_nops = X:
31972    (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
31973        in order to force NEXT_INSN into a separate group.
31974    (2) X < sched_finish_regroup_exact: insert exactly X nops.
31975    GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
31976    insertion (has a group just ended, how many vacant issue slots remain in the
31977    last group, and how many dispatch groups were encountered so far).  */
31978
31979 static int
31980 force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
31981                  rtx_insn *next_insn, bool *group_end, int can_issue_more,
31982                  int *group_count)
31983 {
31984   rtx nop;
31985   bool force;
31986   int issue_rate = rs6000_issue_rate ();
31987   bool end = *group_end;
31988   int i;
31989
31990   if (next_insn == NULL_RTX || DEBUG_INSN_P (next_insn))
31991     return can_issue_more;
31992
31993   if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
31994     return can_issue_more;
31995
31996   force = is_costly_group (group_insns, next_insn);
31997   if (!force)
31998     return can_issue_more;
31999
32000   if (sched_verbose > 6)
32001     fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
32002              *group_count ,can_issue_more);
32003
32004   if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
32005     {
32006       if (*group_end)
32007         can_issue_more = 0;
32008
32009       /* Since only a branch can be issued in the last issue_slot, it is
32010          sufficient to insert 'can_issue_more - 1' nops if next_insn is not
32011          a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
32012          in this case the last nop will start a new group and the branch
32013          will be forced to the new group.  */
32014       if (can_issue_more && !is_branch_slot_insn (next_insn))
32015         can_issue_more--;
32016
32017       /* Do we have a special group ending nop? */
32018       if (rs6000_tune == PROCESSOR_POWER6 || rs6000_tune == PROCESSOR_POWER7
32019           || rs6000_tune == PROCESSOR_POWER8)
32020         {
32021           nop = gen_group_ending_nop ();
32022           emit_insn_before (nop, next_insn);
32023           can_issue_more = 0;
32024         }
32025       else
32026         while (can_issue_more > 0)
32027           {
32028             nop = gen_nop ();
32029             emit_insn_before (nop, next_insn);
32030             can_issue_more--;
32031           }
32032
32033       *group_end = true;
32034       return 0;
32035     }
32036
32037   if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
32038     {
32039       int n_nops = rs6000_sched_insert_nops;
32040
32041       /* Nops can't be issued from the branch slot, so the effective
32042          issue_rate for nops is 'issue_rate - 1'.  */
32043       if (can_issue_more == 0)
32044         can_issue_more = issue_rate;
32045       can_issue_more--;
32046       if (can_issue_more == 0)
32047         {
32048           can_issue_more = issue_rate - 1;
32049           (*group_count)++;
32050           end = true;
32051           for (i = 0; i < issue_rate; i++)
32052             {
32053               group_insns[i] = 0;
32054             }
32055         }
32056
32057       while (n_nops > 0)
32058         {
32059           nop = gen_nop ();
32060           emit_insn_before (nop, next_insn);
32061           if (can_issue_more == issue_rate - 1) /* new group begins */
32062             end = false;
32063           can_issue_more--;
32064           if (can_issue_more == 0)
32065             {
32066               can_issue_more = issue_rate - 1;
32067               (*group_count)++;
32068               end = true;
32069               for (i = 0; i < issue_rate; i++)
32070                 {
32071                   group_insns[i] = 0;
32072                 }
32073             }
32074           n_nops--;
32075         }
32076
32077       /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1').  */
32078       can_issue_more++;
32079
32080       /* Is next_insn going to start a new group?  */
32081       *group_end
32082         = (end
32083            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
32084            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
32085            || (can_issue_more < issue_rate &&
32086                insn_terminates_group_p (next_insn, previous_group)));
32087       if (*group_end && end)
32088         (*group_count)--;
32089
32090       if (sched_verbose > 6)
32091         fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
32092                  *group_count, can_issue_more);
32093       return can_issue_more;
32094     }
32095
32096   return can_issue_more;
32097 }
32098
32099 /* This function tries to synch the dispatch groups that the compiler "sees"
32100    with the dispatch groups that the processor dispatcher is expected to
32101    form in practice.  It tries to achieve this synchronization by forcing the
32102    estimated processor grouping on the compiler (as opposed to the function
32103    'pad_goups' which tries to force the scheduler's grouping on the processor).
32104
32105    The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
32106    examines the (estimated) dispatch groups that will be formed by the processor
32107    dispatcher.  It marks these group boundaries to reflect the estimated
32108    processor grouping, overriding the grouping that the scheduler had marked.
32109    Depending on the value of the flag '-minsert-sched-nops' this function can
32110    force certain insns into separate groups or force a certain distance between
32111    them by inserting nops, for example, if there exists a "costly dependence"
32112    between the insns.
32113
32114    The function estimates the group boundaries that the processor will form as
32115    follows:  It keeps track of how many vacant issue slots are available after
32116    each insn.  A subsequent insn will start a new group if one of the following
32117    4 cases applies:
32118    - no more vacant issue slots remain in the current dispatch group.
32119    - only the last issue slot, which is the branch slot, is vacant, but the next
32120      insn is not a branch.
32121    - only the last 2 or less issue slots, including the branch slot, are vacant,
32122      which means that a cracked insn (which occupies two issue slots) can't be
32123      issued in this group.
32124    - less than 'issue_rate' slots are vacant, and the next insn always needs to
32125      start a new group.  */
32126
32127 static int
32128 redefine_groups (FILE *dump, int sched_verbose, rtx_insn *prev_head_insn,
32129                  rtx_insn *tail)
32130 {
32131   rtx_insn *insn, *next_insn;
32132   int issue_rate;
32133   int can_issue_more;
32134   int slot, i;
32135   bool group_end;
32136   int group_count = 0;
32137   rtx *group_insns;
32138
32139   /* Initialize.  */
32140   issue_rate = rs6000_issue_rate ();
32141   group_insns = XALLOCAVEC (rtx, issue_rate);
32142   for (i = 0; i < issue_rate; i++)
32143     {
32144       group_insns[i] = 0;
32145     }
32146   can_issue_more = issue_rate;
32147   slot = 0;
32148   insn = get_next_active_insn (prev_head_insn, tail);
32149   group_end = false;
32150
32151   while (insn != NULL_RTX)
32152     {
32153       slot = (issue_rate - can_issue_more);
32154       group_insns[slot] = insn;
32155       can_issue_more =
32156         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
32157       if (insn_terminates_group_p (insn, current_group))
32158         can_issue_more = 0;
32159
32160       next_insn = get_next_active_insn (insn, tail);
32161       if (next_insn == NULL_RTX)
32162         return group_count + 1;
32163
32164       /* Is next_insn going to start a new group?  */
32165       group_end
32166         = (can_issue_more == 0
32167            || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
32168            || (can_issue_more <= 2 && is_cracked_insn (next_insn))
32169            || (can_issue_more < issue_rate &&
32170                insn_terminates_group_p (next_insn, previous_group)));
32171
32172       can_issue_more = force_new_group (sched_verbose, dump, group_insns,
32173                                         next_insn, &group_end, can_issue_more,
32174                                         &group_count);
32175
32176       if (group_end)
32177         {
32178           group_count++;
32179           can_issue_more = 0;
32180           for (i = 0; i < issue_rate; i++)
32181             {
32182               group_insns[i] = 0;
32183             }
32184         }
32185
32186       if (GET_MODE (next_insn) == TImode && can_issue_more)
32187         PUT_MODE (next_insn, VOIDmode);
32188       else if (!can_issue_more && GET_MODE (next_insn) != TImode)
32189         PUT_MODE (next_insn, TImode);
32190
32191       insn = next_insn;
32192       if (can_issue_more == 0)
32193         can_issue_more = issue_rate;
32194     } /* while */
32195
32196   return group_count;
32197 }
32198
32199 /* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
32200    dispatch group boundaries that the scheduler had marked.  Pad with nops
32201    any dispatch groups which have vacant issue slots, in order to force the
32202    scheduler's grouping on the processor dispatcher.  The function
32203    returns the number of dispatch groups found.  */
32204
32205 static int
32206 pad_groups (FILE *dump, int sched_verbose, rtx_insn *prev_head_insn,
32207             rtx_insn *tail)
32208 {
32209   rtx_insn *insn, *next_insn;
32210   rtx nop;
32211   int issue_rate;
32212   int can_issue_more;
32213   int group_end;
32214   int group_count = 0;
32215
32216   /* Initialize issue_rate.  */
32217   issue_rate = rs6000_issue_rate ();
32218   can_issue_more = issue_rate;
32219
32220   insn = get_next_active_insn (prev_head_insn, tail);
32221   next_insn = get_next_active_insn (insn, tail);
32222
32223   while (insn != NULL_RTX)
32224     {
32225       can_issue_more =
32226         rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
32227
32228       group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
32229
32230       if (next_insn == NULL_RTX)
32231         break;
32232
32233       if (group_end)
32234         {
32235           /* If the scheduler had marked group termination at this location
32236              (between insn and next_insn), and neither insn nor next_insn will
32237              force group termination, pad the group with nops to force group
32238              termination.  */
32239           if (can_issue_more
32240               && (rs6000_sched_insert_nops == sched_finish_pad_groups)
32241               && !insn_terminates_group_p (insn, current_group)
32242               && !insn_terminates_group_p (next_insn, previous_group))
32243             {
32244               if (!is_branch_slot_insn (next_insn))
32245                 can_issue_more--;
32246
32247               while (can_issue_more)
32248                 {
32249                   nop = gen_nop ();
32250                   emit_insn_before (nop, next_insn);
32251                   can_issue_more--;
32252                 }
32253             }
32254
32255           can_issue_more = issue_rate;
32256           group_count++;
32257         }
32258
32259       insn = next_insn;
32260       next_insn = get_next_active_insn (insn, tail);
32261     }
32262
32263   return group_count;
32264 }
32265
32266 /* We're beginning a new block.  Initialize data structures as necessary.  */
32267
32268 static void
32269 rs6000_sched_init (FILE *dump ATTRIBUTE_UNUSED,
32270                      int sched_verbose ATTRIBUTE_UNUSED,
32271                      int max_ready ATTRIBUTE_UNUSED)
32272 {
32273   last_scheduled_insn = NULL;
32274   load_store_pendulum = 0;
32275   divide_cnt = 0;
32276   vec_pairing = 0;
32277 }
32278
32279 /* The following function is called at the end of scheduling BB.
32280    After reload, it inserts nops at insn group bundling.  */
32281
32282 static void
32283 rs6000_sched_finish (FILE *dump, int sched_verbose)
32284 {
32285   int n_groups;
32286
32287   if (sched_verbose)
32288     fprintf (dump, "=== Finishing schedule.\n");
32289
32290   if (reload_completed && rs6000_sched_groups)
32291     {
32292       /* Do not run sched_finish hook when selective scheduling enabled.  */
32293       if (sel_sched_p ())
32294         return;
32295
32296       if (rs6000_sched_insert_nops == sched_finish_none)
32297         return;
32298
32299       if (rs6000_sched_insert_nops == sched_finish_pad_groups)
32300         n_groups = pad_groups (dump, sched_verbose,
32301                                current_sched_info->prev_head,
32302                                current_sched_info->next_tail);
32303       else
32304         n_groups = redefine_groups (dump, sched_verbose,
32305                                     current_sched_info->prev_head,
32306                                     current_sched_info->next_tail);
32307
32308       if (sched_verbose >= 6)
32309         {
32310           fprintf (dump, "ngroups = %d\n", n_groups);
32311           print_rtl (dump, current_sched_info->prev_head);
32312           fprintf (dump, "Done finish_sched\n");
32313         }
32314     }
32315 }
32316
32317 struct rs6000_sched_context
32318 {
32319   short cached_can_issue_more;
32320   rtx_insn *last_scheduled_insn;
32321   int load_store_pendulum;
32322   int divide_cnt;
32323   int vec_pairing;
32324 };
32325
32326 typedef struct rs6000_sched_context rs6000_sched_context_def;
32327 typedef rs6000_sched_context_def *rs6000_sched_context_t;
32328
32329 /* Allocate store for new scheduling context.  */
32330 static void *
32331 rs6000_alloc_sched_context (void)
32332 {
32333   return xmalloc (sizeof (rs6000_sched_context_def));
32334 }
32335
32336 /* If CLEAN_P is true then initializes _SC with clean data,
32337    and from the global context otherwise.  */
32338 static void
32339 rs6000_init_sched_context (void *_sc, bool clean_p)
32340 {
32341   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
32342
32343   if (clean_p)
32344     {
32345       sc->cached_can_issue_more = 0;
32346       sc->last_scheduled_insn = NULL;
32347       sc->load_store_pendulum = 0;
32348       sc->divide_cnt = 0;
32349       sc->vec_pairing = 0;
32350     }
32351   else
32352     {
32353       sc->cached_can_issue_more = cached_can_issue_more;
32354       sc->last_scheduled_insn = last_scheduled_insn;
32355       sc->load_store_pendulum = load_store_pendulum;
32356       sc->divide_cnt = divide_cnt;
32357       sc->vec_pairing = vec_pairing;
32358     }
32359 }
32360
32361 /* Sets the global scheduling context to the one pointed to by _SC.  */
32362 static void
32363 rs6000_set_sched_context (void *_sc)
32364 {
32365   rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
32366
32367   gcc_assert (sc != NULL);
32368
32369   cached_can_issue_more = sc->cached_can_issue_more;
32370   last_scheduled_insn = sc->last_scheduled_insn;
32371   load_store_pendulum = sc->load_store_pendulum;
32372   divide_cnt = sc->divide_cnt;
32373   vec_pairing = sc->vec_pairing;
32374 }
32375
32376 /* Free _SC.  */
32377 static void
32378 rs6000_free_sched_context (void *_sc)
32379 {
32380   gcc_assert (_sc != NULL);
32381
32382   free (_sc);
32383 }
32384
32385 static bool
32386 rs6000_sched_can_speculate_insn (rtx_insn *insn)
32387 {
32388   switch (get_attr_type (insn))
32389     {
32390     case TYPE_DIV:
32391     case TYPE_SDIV:
32392     case TYPE_DDIV:
32393     case TYPE_VECDIV:
32394     case TYPE_SSQRT:
32395     case TYPE_DSQRT:
32396       return false;
32397
32398     default:
32399       return true;
32400   }
32401 }
32402 \f
32403 /* Length in units of the trampoline for entering a nested function.  */
32404
32405 int
32406 rs6000_trampoline_size (void)
32407 {
32408   int ret = 0;
32409
32410   switch (DEFAULT_ABI)
32411     {
32412     default:
32413       gcc_unreachable ();
32414
32415     case ABI_AIX:
32416       ret = (TARGET_32BIT) ? 12 : 24;
32417       break;
32418
32419     case ABI_ELFv2:
32420       gcc_assert (!TARGET_32BIT);
32421       ret = 32;
32422       break;
32423
32424     case ABI_DARWIN:
32425     case ABI_V4:
32426       ret = (TARGET_32BIT) ? 40 : 48;
32427       break;
32428     }
32429
32430   return ret;
32431 }
32432
32433 /* Emit RTL insns to initialize the variable parts of a trampoline.
32434    FNADDR is an RTX for the address of the function's pure code.
32435    CXT is an RTX for the static chain value for the function.  */
32436
32437 static void
32438 rs6000_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
32439 {
32440   int regsize = (TARGET_32BIT) ? 4 : 8;
32441   rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
32442   rtx ctx_reg = force_reg (Pmode, cxt);
32443   rtx addr = force_reg (Pmode, XEXP (m_tramp, 0));
32444
32445   switch (DEFAULT_ABI)
32446     {
32447     default:
32448       gcc_unreachable ();
32449
32450     /* Under AIX, just build the 3 word function descriptor */
32451     case ABI_AIX:
32452       {
32453         rtx fnmem, fn_reg, toc_reg;
32454
32455         if (!TARGET_POINTERS_TO_NESTED_FUNCTIONS)
32456           error ("you cannot take the address of a nested function if you use "
32457                  "the %qs option", "-mno-pointers-to-nested-functions");
32458
32459         fnmem = gen_const_mem (Pmode, force_reg (Pmode, fnaddr));
32460         fn_reg = gen_reg_rtx (Pmode);
32461         toc_reg = gen_reg_rtx (Pmode);
32462
32463   /* Macro to shorten the code expansions below.  */
32464 # define MEM_PLUS(MEM, OFFSET) adjust_address (MEM, Pmode, OFFSET)
32465
32466         m_tramp = replace_equiv_address (m_tramp, addr);
32467
32468         emit_move_insn (fn_reg, MEM_PLUS (fnmem, 0));
32469         emit_move_insn (toc_reg, MEM_PLUS (fnmem, regsize));
32470         emit_move_insn (MEM_PLUS (m_tramp, 0), fn_reg);
32471         emit_move_insn (MEM_PLUS (m_tramp, regsize), toc_reg);
32472         emit_move_insn (MEM_PLUS (m_tramp, 2*regsize), ctx_reg);
32473
32474 # undef MEM_PLUS
32475       }
32476       break;
32477
32478     /* Under V.4/eabi/darwin, __trampoline_setup does the real work.  */
32479     case ABI_ELFv2:
32480     case ABI_DARWIN:
32481     case ABI_V4:
32482       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
32483                          LCT_NORMAL, VOIDmode,
32484                          addr, Pmode,
32485                          GEN_INT (rs6000_trampoline_size ()), SImode,
32486                          fnaddr, Pmode,
32487                          ctx_reg, Pmode);
32488       break;
32489     }
32490 }
32491
32492 \f
32493 /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain
32494    identifier as an argument, so the front end shouldn't look it up.  */
32495
32496 static bool
32497 rs6000_attribute_takes_identifier_p (const_tree attr_id)
32498 {
32499   return is_attribute_p ("altivec", attr_id);
32500 }
32501
32502 /* Handle the "altivec" attribute.  The attribute may have
32503    arguments as follows:
32504
32505         __attribute__((altivec(vector__)))
32506         __attribute__((altivec(pixel__)))       (always followed by 'unsigned short')
32507         __attribute__((altivec(bool__)))        (always followed by 'unsigned')
32508
32509   and may appear more than once (e.g., 'vector bool char') in a
32510   given declaration.  */
32511
32512 static tree
32513 rs6000_handle_altivec_attribute (tree *node,
32514                                  tree name ATTRIBUTE_UNUSED,
32515                                  tree args,
32516                                  int flags ATTRIBUTE_UNUSED,
32517                                  bool *no_add_attrs)
32518 {
32519   tree type = *node, result = NULL_TREE;
32520   machine_mode mode;
32521   int unsigned_p;
32522   char altivec_type
32523     = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
32524         && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
32525        ? *IDENTIFIER_POINTER (TREE_VALUE (args))
32526        : '?');
32527
32528   while (POINTER_TYPE_P (type)
32529          || TREE_CODE (type) == FUNCTION_TYPE
32530          || TREE_CODE (type) == METHOD_TYPE
32531          || TREE_CODE (type) == ARRAY_TYPE)
32532     type = TREE_TYPE (type);
32533
32534   mode = TYPE_MODE (type);
32535
32536   /* Check for invalid AltiVec type qualifiers.  */
32537   if (type == long_double_type_node)
32538     error ("use of %<long double%> in AltiVec types is invalid");
32539   else if (type == boolean_type_node)
32540     error ("use of boolean types in AltiVec types is invalid");
32541   else if (TREE_CODE (type) == COMPLEX_TYPE)
32542     error ("use of %<complex%> in AltiVec types is invalid");
32543   else if (DECIMAL_FLOAT_MODE_P (mode))
32544     error ("use of decimal floating point types in AltiVec types is invalid");
32545   else if (!TARGET_VSX)
32546     {
32547       if (type == long_unsigned_type_node || type == long_integer_type_node)
32548         {
32549           if (TARGET_64BIT)
32550             error ("use of %<long%> in AltiVec types is invalid for "
32551                    "64-bit code without %qs", "-mvsx");
32552           else if (rs6000_warn_altivec_long)
32553             warning (0, "use of %<long%> in AltiVec types is deprecated; "
32554                      "use %<int%>");
32555         }
32556       else if (type == long_long_unsigned_type_node
32557                || type == long_long_integer_type_node)
32558         error ("use of %<long long%> in AltiVec types is invalid without %qs",
32559                "-mvsx");
32560       else if (type == double_type_node)
32561         error ("use of %<double%> in AltiVec types is invalid without %qs",
32562                "-mvsx");
32563     }
32564
32565   switch (altivec_type)
32566     {
32567     case 'v':
32568       unsigned_p = TYPE_UNSIGNED (type);
32569       switch (mode)
32570         {
32571         case E_TImode:
32572           result = (unsigned_p ? unsigned_V1TI_type_node : V1TI_type_node);
32573           break;
32574         case E_DImode:
32575           result = (unsigned_p ? unsigned_V2DI_type_node : V2DI_type_node);
32576           break;
32577         case E_SImode:
32578           result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
32579           break;
32580         case E_HImode:
32581           result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
32582           break;
32583         case E_QImode:
32584           result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
32585           break;
32586         case E_SFmode: result = V4SF_type_node; break;
32587         case E_DFmode: result = V2DF_type_node; break;
32588           /* If the user says 'vector int bool', we may be handed the 'bool'
32589              attribute _before_ the 'vector' attribute, and so select the
32590              proper type in the 'b' case below.  */
32591         case E_V4SImode: case E_V8HImode: case E_V16QImode: case E_V4SFmode:
32592         case E_V2DImode: case E_V2DFmode:
32593           result = type;
32594         default: break;
32595         }
32596       break;
32597     case 'b':
32598       switch (mode)
32599         {
32600         case E_DImode: case E_V2DImode: result = bool_V2DI_type_node; break;
32601         case E_SImode: case E_V4SImode: result = bool_V4SI_type_node; break;
32602         case E_HImode: case E_V8HImode: result = bool_V8HI_type_node; break;
32603         case E_QImode: case E_V16QImode: result = bool_V16QI_type_node;
32604         default: break;
32605         }
32606       break;
32607     case 'p':
32608       switch (mode)
32609         {
32610         case E_V8HImode: result = pixel_V8HI_type_node;
32611         default: break;
32612         }
32613     default: break;
32614     }
32615
32616   /* Propagate qualifiers attached to the element type
32617      onto the vector type.  */
32618   if (result && result != type && TYPE_QUALS (type))
32619     result = build_qualified_type (result, TYPE_QUALS (type));
32620
32621   *no_add_attrs = true;  /* No need to hang on to the attribute.  */
32622
32623   if (result)
32624     *node = lang_hooks.types.reconstruct_complex_type (*node, result);
32625
32626   return NULL_TREE;
32627 }
32628
32629 /* AltiVec defines five built-in scalar types that serve as vector
32630    elements; we must teach the compiler how to mangle them.  The 128-bit
32631    floating point mangling is target-specific as well.  */
32632
32633 static const char *
32634 rs6000_mangle_type (const_tree type)
32635 {
32636   type = TYPE_MAIN_VARIANT (type);
32637
32638   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
32639       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
32640     return NULL;
32641
32642   if (type == bool_char_type_node) return "U6__boolc";
32643   if (type == bool_short_type_node) return "U6__bools";
32644   if (type == pixel_type_node) return "u7__pixel";
32645   if (type == bool_int_type_node) return "U6__booli";
32646   if (type == bool_long_long_type_node) return "U6__boolx";
32647
32648   if (SCALAR_FLOAT_TYPE_P (type) && FLOAT128_IBM_P (TYPE_MODE (type)))
32649     return "g";
32650   if (SCALAR_FLOAT_TYPE_P (type) && FLOAT128_IEEE_P (TYPE_MODE (type)))
32651     return ieee128_mangling_gcc_8_1 ? "U10__float128" : "u9__ieee128";
32652
32653   /* For all other types, use the default mangling.  */
32654   return NULL;
32655 }
32656
32657 /* Handle a "longcall" or "shortcall" attribute; arguments as in
32658    struct attribute_spec.handler.  */
32659
32660 static tree
32661 rs6000_handle_longcall_attribute (tree *node, tree name,
32662                                   tree args ATTRIBUTE_UNUSED,
32663                                   int flags ATTRIBUTE_UNUSED,
32664                                   bool *no_add_attrs)
32665 {
32666   if (TREE_CODE (*node) != FUNCTION_TYPE
32667       && TREE_CODE (*node) != FIELD_DECL
32668       && TREE_CODE (*node) != TYPE_DECL)
32669     {
32670       warning (OPT_Wattributes, "%qE attribute only applies to functions",
32671                name);
32672       *no_add_attrs = true;
32673     }
32674
32675   return NULL_TREE;
32676 }
32677
32678 /* Set longcall attributes on all functions declared when
32679    rs6000_default_long_calls is true.  */
32680 static void
32681 rs6000_set_default_type_attributes (tree type)
32682 {
32683   if (rs6000_default_long_calls
32684       && (TREE_CODE (type) == FUNCTION_TYPE
32685           || TREE_CODE (type) == METHOD_TYPE))
32686     TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
32687                                         NULL_TREE,
32688                                         TYPE_ATTRIBUTES (type));
32689
32690 #if TARGET_MACHO
32691   darwin_set_default_type_attributes (type);
32692 #endif
32693 }
32694
32695 /* Return a reference suitable for calling a function with the
32696    longcall attribute.  */
32697
32698 static rtx
32699 rs6000_longcall_ref (rtx call_ref, rtx arg)
32700 {
32701   /* System V adds '.' to the internal name, so skip them.  */
32702   const char *call_name = XSTR (call_ref, 0);
32703   if (*call_name == '.')
32704     {
32705       while (*call_name == '.')
32706         call_name++;
32707
32708       tree node = get_identifier (call_name);
32709       call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
32710     }
32711
32712   if (TARGET_PLTSEQ)
32713     {
32714       rtx base = const0_rtx;
32715       int regno = 12;
32716       if (rs6000_pcrel_p (cfun))
32717         {
32718           rtx reg = gen_rtx_REG (Pmode, regno);
32719           rtx u = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, base, call_ref, arg),
32720                                   UNSPEC_PLT_PCREL);
32721           emit_insn (gen_rtx_SET (reg, u));
32722           return reg;
32723         }
32724
32725       if (DEFAULT_ABI == ABI_ELFv2)
32726         base = gen_rtx_REG (Pmode, TOC_REGISTER);
32727       else
32728         {
32729           if (flag_pic)
32730             base = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
32731           regno = 11;
32732         }
32733       /* Reg must match that used by linker PLT stubs.  For ELFv2, r12
32734          may be used by a function global entry point.  For SysV4, r11
32735          is used by __glink_PLTresolve lazy resolver entry.  */
32736       rtx reg = gen_rtx_REG (Pmode, regno);
32737       rtx hi = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, base, call_ref, arg),
32738                                UNSPEC_PLT16_HA);
32739       rtx lo = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, reg, call_ref, arg),
32740                                UNSPEC_PLT16_LO);
32741       emit_insn (gen_rtx_SET (reg, hi));
32742       emit_insn (gen_rtx_SET (reg, lo));
32743       return reg;
32744     }
32745
32746   return force_reg (Pmode, call_ref);
32747 }
32748 \f
32749 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
32750 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
32751 #endif
32752
32753 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
32754    struct attribute_spec.handler.  */
32755 static tree
32756 rs6000_handle_struct_attribute (tree *node, tree name,
32757                                 tree args ATTRIBUTE_UNUSED,
32758                                 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
32759 {
32760   tree *type = NULL;
32761   if (DECL_P (*node))
32762     {
32763       if (TREE_CODE (*node) == TYPE_DECL)
32764         type = &TREE_TYPE (*node);
32765     }
32766   else
32767     type = node;
32768
32769   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
32770                  || TREE_CODE (*type) == UNION_TYPE)))
32771     {
32772       warning (OPT_Wattributes, "%qE attribute ignored", name);
32773       *no_add_attrs = true;
32774     }
32775
32776   else if ((is_attribute_p ("ms_struct", name)
32777             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
32778            || ((is_attribute_p ("gcc_struct", name)
32779                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
32780     {
32781       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
32782                name);
32783       *no_add_attrs = true;
32784     }
32785
32786   return NULL_TREE;
32787 }
32788
32789 static bool
32790 rs6000_ms_bitfield_layout_p (const_tree record_type)
32791 {
32792   return (TARGET_USE_MS_BITFIELD_LAYOUT &&
32793           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
32794     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
32795 }
32796 \f
32797 #ifdef USING_ELFOS_H
32798
32799 /* A get_unnamed_section callback, used for switching to toc_section.  */
32800
32801 static void
32802 rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
32803 {
32804   if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
32805       && TARGET_MINIMAL_TOC)
32806     {
32807       if (!toc_initialized)
32808         {
32809           fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
32810           ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
32811           (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0);
32812           fprintf (asm_out_file, "\t.tc ");
32813           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],");
32814           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
32815           fprintf (asm_out_file, "\n");
32816
32817           fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
32818           ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
32819           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
32820           fprintf (asm_out_file, " = .+32768\n");
32821           toc_initialized = 1;
32822         }
32823       else
32824         fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
32825     }
32826   else if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
32827     {
32828       fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
32829       if (!toc_initialized)
32830         {
32831           ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
32832           toc_initialized = 1;
32833         }
32834     }
32835   else
32836     {
32837       fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
32838       if (!toc_initialized)
32839         {
32840           ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
32841           ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
32842           fprintf (asm_out_file, " = .+32768\n");
32843           toc_initialized = 1;
32844         }
32845     }
32846 }
32847
32848 /* Implement TARGET_ASM_INIT_SECTIONS.  */
32849
32850 static void
32851 rs6000_elf_asm_init_sections (void)
32852 {
32853   toc_section
32854     = get_unnamed_section (0, rs6000_elf_output_toc_section_asm_op, NULL);
32855
32856   sdata2_section
32857     = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
32858                            SDATA2_SECTION_ASM_OP);
32859 }
32860
32861 /* Implement TARGET_SELECT_RTX_SECTION.  */
32862
32863 static section *
32864 rs6000_elf_select_rtx_section (machine_mode mode, rtx x,
32865                                unsigned HOST_WIDE_INT align)
32866 {
32867   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
32868     return toc_section;
32869   else
32870     return default_elf_select_rtx_section (mode, x, align);
32871 }
32872 \f
32873 /* For a SYMBOL_REF, set generic flags and then perform some
32874    target-specific processing.
32875
32876    When the AIX ABI is requested on a non-AIX system, replace the
32877    function name with the real name (with a leading .) rather than the
32878    function descriptor name.  This saves a lot of overriding code to
32879    read the prefixes.  */
32880
32881 static void rs6000_elf_encode_section_info (tree, rtx, int) ATTRIBUTE_UNUSED;
32882 static void
32883 rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
32884 {
32885   default_encode_section_info (decl, rtl, first);
32886
32887   if (first
32888       && TREE_CODE (decl) == FUNCTION_DECL
32889       && !TARGET_AIX
32890       && DEFAULT_ABI == ABI_AIX)
32891     {
32892       rtx sym_ref = XEXP (rtl, 0);
32893       size_t len = strlen (XSTR (sym_ref, 0));
32894       char *str = XALLOCAVEC (char, len + 2);
32895       str[0] = '.';
32896       memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
32897       XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
32898     }
32899 }
32900
32901 static inline bool
32902 compare_section_name (const char *section, const char *templ)
32903 {
32904   int len;
32905
32906   len = strlen (templ);
32907   return (strncmp (section, templ, len) == 0
32908           && (section[len] == 0 || section[len] == '.'));
32909 }
32910
32911 bool
32912 rs6000_elf_in_small_data_p (const_tree decl)
32913 {
32914   if (rs6000_sdata == SDATA_NONE)
32915     return false;
32916
32917   /* We want to merge strings, so we never consider them small data.  */
32918   if (TREE_CODE (decl) == STRING_CST)
32919     return false;
32920
32921   /* Functions are never in the small data area.  */
32922   if (TREE_CODE (decl) == FUNCTION_DECL)
32923     return false;
32924
32925   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
32926     {
32927       const char *section = DECL_SECTION_NAME (decl);
32928       if (compare_section_name (section, ".sdata")
32929           || compare_section_name (section, ".sdata2")
32930           || compare_section_name (section, ".gnu.linkonce.s")
32931           || compare_section_name (section, ".sbss")
32932           || compare_section_name (section, ".sbss2")
32933           || compare_section_name (section, ".gnu.linkonce.sb")
32934           || strcmp (section, ".PPC.EMB.sdata0") == 0
32935           || strcmp (section, ".PPC.EMB.sbss0") == 0)
32936         return true;
32937     }
32938   else
32939     {
32940       /* If we are told not to put readonly data in sdata, then don't.  */
32941       if (TREE_READONLY (decl) && rs6000_sdata != SDATA_EABI
32942           && !rs6000_readonly_in_sdata)
32943         return false;
32944
32945       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
32946
32947       if (size > 0
32948           && size <= g_switch_value
32949           /* If it's not public, and we're not going to reference it there,
32950              there's no need to put it in the small data section.  */
32951           && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
32952         return true;
32953     }
32954
32955   return false;
32956 }
32957
32958 #endif /* USING_ELFOS_H */
32959 \f
32960 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  */
32961
32962 static bool
32963 rs6000_use_blocks_for_constant_p (machine_mode mode, const_rtx x)
32964 {
32965   return !ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode);
32966 }
32967
32968 /* Do not place thread-local symbols refs in the object blocks.  */
32969
32970 static bool
32971 rs6000_use_blocks_for_decl_p (const_tree decl)
32972 {
32973   return !DECL_THREAD_LOCAL_P (decl);
32974 }
32975 \f
32976 /* Return a REG that occurs in ADDR with coefficient 1.
32977    ADDR can be effectively incremented by incrementing REG.
32978
32979    r0 is special and we must not select it as an address
32980    register by this routine since our caller will try to
32981    increment the returned register via an "la" instruction.  */
32982
32983 rtx
32984 find_addr_reg (rtx addr)
32985 {
32986   while (GET_CODE (addr) == PLUS)
32987     {
32988       if (REG_P (XEXP (addr, 0))
32989           && REGNO (XEXP (addr, 0)) != 0)
32990         addr = XEXP (addr, 0);
32991       else if (REG_P (XEXP (addr, 1))
32992                && REGNO (XEXP (addr, 1)) != 0)
32993         addr = XEXP (addr, 1);
32994       else if (CONSTANT_P (XEXP (addr, 0)))
32995         addr = XEXP (addr, 1);
32996       else if (CONSTANT_P (XEXP (addr, 1)))
32997         addr = XEXP (addr, 0);
32998       else
32999         gcc_unreachable ();
33000     }
33001   gcc_assert (REG_P (addr) && REGNO (addr) != 0);
33002   return addr;
33003 }
33004
33005 void
33006 rs6000_fatal_bad_address (rtx op)
33007 {
33008   fatal_insn ("bad address", op);
33009 }
33010
33011 #if TARGET_MACHO
33012
33013 typedef struct branch_island_d {
33014   tree function_name;
33015   tree label_name;
33016   int line_number;
33017 } branch_island;
33018
33019
33020 static vec<branch_island, va_gc> *branch_islands;
33021
33022 /* Remember to generate a branch island for far calls to the given
33023    function.  */
33024
33025 static void
33026 add_compiler_branch_island (tree label_name, tree function_name,
33027                             int line_number)
33028 {
33029   branch_island bi = {function_name, label_name, line_number};
33030   vec_safe_push (branch_islands, bi);
33031 }
33032
33033 /* Generate far-jump branch islands for everything recorded in
33034    branch_islands.  Invoked immediately after the last instruction of
33035    the epilogue has been emitted; the branch islands must be appended
33036    to, and contiguous with, the function body.  Mach-O stubs are
33037    generated in machopic_output_stub().  */
33038
33039 static void
33040 macho_branch_islands (void)
33041 {
33042   char tmp_buf[512];
33043
33044   while (!vec_safe_is_empty (branch_islands))
33045     {
33046       branch_island *bi = &branch_islands->last ();
33047       const char *label = IDENTIFIER_POINTER (bi->label_name);
33048       const char *name = IDENTIFIER_POINTER (bi->function_name);
33049       char name_buf[512];
33050       /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF().  */
33051       if (name[0] == '*' || name[0] == '&')
33052         strcpy (name_buf, name+1);
33053       else
33054         {
33055           name_buf[0] = '_';
33056           strcpy (name_buf+1, name);
33057         }
33058       strcpy (tmp_buf, "\n");
33059       strcat (tmp_buf, label);
33060 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
33061       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
33062         dbxout_stabd (N_SLINE, bi->line_number);
33063 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
33064       if (flag_pic)
33065         {
33066           if (TARGET_LINK_STACK)
33067             {
33068               char name[32];
33069               get_ppc476_thunk_name (name);
33070               strcat (tmp_buf, ":\n\tmflr r0\n\tbl ");
33071               strcat (tmp_buf, name);
33072               strcat (tmp_buf, "\n");
33073               strcat (tmp_buf, label);
33074               strcat (tmp_buf, "_pic:\n\tmflr r11\n");
33075             }
33076           else
33077             {
33078               strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
33079               strcat (tmp_buf, label);
33080               strcat (tmp_buf, "_pic\n");
33081               strcat (tmp_buf, label);
33082               strcat (tmp_buf, "_pic:\n\tmflr r11\n");
33083             }
33084
33085           strcat (tmp_buf, "\taddis r11,r11,ha16(");
33086           strcat (tmp_buf, name_buf);
33087           strcat (tmp_buf, " - ");
33088           strcat (tmp_buf, label);
33089           strcat (tmp_buf, "_pic)\n");
33090
33091           strcat (tmp_buf, "\tmtlr r0\n");
33092
33093           strcat (tmp_buf, "\taddi r12,r11,lo16(");
33094           strcat (tmp_buf, name_buf);
33095           strcat (tmp_buf, " - ");
33096           strcat (tmp_buf, label);
33097           strcat (tmp_buf, "_pic)\n");
33098
33099           strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
33100         }
33101       else
33102         {
33103           strcat (tmp_buf, ":\n\tlis r12,hi16(");
33104           strcat (tmp_buf, name_buf);
33105           strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
33106           strcat (tmp_buf, name_buf);
33107           strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
33108         }
33109       output_asm_insn (tmp_buf, 0);
33110 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
33111       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
33112         dbxout_stabd (N_SLINE, bi->line_number);
33113 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
33114       branch_islands->pop ();
33115     }
33116 }
33117
33118 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
33119    already there or not.  */
33120
33121 static int
33122 no_previous_def (tree function_name)
33123 {
33124   branch_island *bi;
33125   unsigned ix;
33126
33127   FOR_EACH_VEC_SAFE_ELT (branch_islands, ix, bi)
33128     if (function_name == bi->function_name)
33129       return 0;
33130   return 1;
33131 }
33132
33133 /* GET_PREV_LABEL gets the label name from the previous definition of
33134    the function.  */
33135
33136 static tree
33137 get_prev_label (tree function_name)
33138 {
33139   branch_island *bi;
33140   unsigned ix;
33141
33142   FOR_EACH_VEC_SAFE_ELT (branch_islands, ix, bi)
33143     if (function_name == bi->function_name)
33144       return bi->label_name;
33145   return NULL_TREE;
33146 }
33147
33148 /* Generate PIC and indirect symbol stubs.  */
33149
33150 void
33151 machopic_output_stub (FILE *file, const char *symb, const char *stub)
33152 {
33153   unsigned int length;
33154   char *symbol_name, *lazy_ptr_name;
33155   char *local_label_0;
33156   static unsigned label = 0;
33157
33158   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
33159   symb = (*targetm.strip_name_encoding) (symb);
33160
33161
33162   length = strlen (symb);
33163   symbol_name = XALLOCAVEC (char, length + 32);
33164   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
33165
33166   lazy_ptr_name = XALLOCAVEC (char, length + 32);
33167   GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
33168
33169   if (flag_pic == 2)
33170     switch_to_section (darwin_sections[machopic_picsymbol_stub1_section]);
33171   else
33172     switch_to_section (darwin_sections[machopic_symbol_stub1_section]);
33173
33174   if (flag_pic == 2)
33175     {
33176       fprintf (file, "\t.align 5\n");
33177
33178       fprintf (file, "%s:\n", stub);
33179       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
33180
33181       label++;
33182       local_label_0 = XALLOCAVEC (char, 16);
33183       sprintf (local_label_0, "L%u$spb", label);
33184
33185       fprintf (file, "\tmflr r0\n");
33186       if (TARGET_LINK_STACK)
33187         {
33188           char name[32];
33189           get_ppc476_thunk_name (name);
33190           fprintf (file, "\tbl %s\n", name);
33191           fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
33192         }
33193       else
33194         {
33195           fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
33196           fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
33197         }
33198       fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
33199                lazy_ptr_name, local_label_0);
33200       fprintf (file, "\tmtlr r0\n");
33201       fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
33202                (TARGET_64BIT ? "ldu" : "lwzu"),
33203                lazy_ptr_name, local_label_0);
33204       fprintf (file, "\tmtctr r12\n");
33205       fprintf (file, "\tbctr\n");
33206     }
33207   else
33208     {
33209       fprintf (file, "\t.align 4\n");
33210
33211       fprintf (file, "%s:\n", stub);
33212       fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
33213
33214       fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
33215       fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
33216                (TARGET_64BIT ? "ldu" : "lwzu"),
33217                lazy_ptr_name);
33218       fprintf (file, "\tmtctr r12\n");
33219       fprintf (file, "\tbctr\n");
33220     }
33221
33222   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
33223   fprintf (file, "%s:\n", lazy_ptr_name);
33224   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
33225   fprintf (file, "%sdyld_stub_binding_helper\n",
33226            (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
33227 }
33228
33229 /* Legitimize PIC addresses.  If the address is already
33230    position-independent, we return ORIG.  Newly generated
33231    position-independent addresses go into a reg.  This is REG if non
33232    zero, otherwise we allocate register(s) as necessary.  */
33233
33234 #define SMALL_INT(X) ((UINTVAL (X) + 0x8000) < 0x10000)
33235
33236 rtx
33237 rs6000_machopic_legitimize_pic_address (rtx orig, machine_mode mode,
33238                                         rtx reg)
33239 {
33240   rtx base, offset;
33241
33242   if (reg == NULL && !reload_completed)
33243     reg = gen_reg_rtx (Pmode);
33244
33245   if (GET_CODE (orig) == CONST)
33246     {
33247       rtx reg_temp;
33248
33249       if (GET_CODE (XEXP (orig, 0)) == PLUS
33250           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
33251         return orig;
33252
33253       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
33254
33255       /* Use a different reg for the intermediate value, as
33256          it will be marked UNCHANGING.  */
33257       reg_temp = !can_create_pseudo_p () ? reg : gen_reg_rtx (Pmode);
33258       base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
33259                                                      Pmode, reg_temp);
33260       offset =
33261         rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
33262                                                 Pmode, reg);
33263
33264       if (CONST_INT_P (offset))
33265         {
33266           if (SMALL_INT (offset))
33267             return plus_constant (Pmode, base, INTVAL (offset));
33268           else if (!reload_completed)
33269             offset = force_reg (Pmode, offset);
33270           else
33271             {
33272               rtx mem = force_const_mem (Pmode, orig);
33273               return machopic_legitimize_pic_address (mem, Pmode, reg);
33274             }
33275         }
33276       return gen_rtx_PLUS (Pmode, base, offset);
33277     }
33278
33279   /* Fall back on generic machopic code.  */
33280   return machopic_legitimize_pic_address (orig, mode, reg);
33281 }
33282
33283 /* Output a .machine directive for the Darwin assembler, and call
33284    the generic start_file routine.  */
33285
33286 static void
33287 rs6000_darwin_file_start (void)
33288 {
33289   static const struct
33290   {
33291     const char *arg;
33292     const char *name;
33293     HOST_WIDE_INT if_set;
33294   } mapping[] = {
33295     { "ppc64", "ppc64", MASK_64BIT },
33296     { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
33297     { "power4", "ppc970", 0 },
33298     { "G5", "ppc970", 0 },
33299     { "7450", "ppc7450", 0 },
33300     { "7400", "ppc7400", MASK_ALTIVEC },
33301     { "G4", "ppc7400", 0 },
33302     { "750", "ppc750", 0 },
33303     { "740", "ppc750", 0 },
33304     { "G3", "ppc750", 0 },
33305     { "604e", "ppc604e", 0 },
33306     { "604", "ppc604", 0 },
33307     { "603e", "ppc603", 0 },
33308     { "603", "ppc603", 0 },
33309     { "601", "ppc601", 0 },
33310     { NULL, "ppc", 0 } };
33311   const char *cpu_id = "";
33312   size_t i;
33313
33314   rs6000_file_start ();
33315   darwin_file_start ();
33316
33317   /* Determine the argument to -mcpu=.  Default to G3 if not specified.  */
33318   
33319   if (rs6000_default_cpu != 0 && rs6000_default_cpu[0] != '\0')
33320     cpu_id = rs6000_default_cpu;
33321
33322   if (global_options_set.x_rs6000_cpu_index)
33323     cpu_id = processor_target_table[rs6000_cpu_index].name;
33324
33325   /* Look through the mapping array.  Pick the first name that either
33326      matches the argument, has a bit set in IF_SET that is also set
33327      in the target flags, or has a NULL name.  */
33328
33329   i = 0;
33330   while (mapping[i].arg != NULL
33331          && strcmp (mapping[i].arg, cpu_id) != 0
33332          && (mapping[i].if_set & rs6000_isa_flags) == 0)
33333     i++;
33334
33335   fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
33336 }
33337
33338 #endif /* TARGET_MACHO */
33339
33340 #if TARGET_ELF
33341 static int
33342 rs6000_elf_reloc_rw_mask (void)
33343 {
33344   if (flag_pic)
33345     return 3;
33346   else if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
33347     return 2;
33348   else
33349     return 0;
33350 }
33351
33352 /* Record an element in the table of global constructors.  SYMBOL is
33353    a SYMBOL_REF of the function to be called; PRIORITY is a number
33354    between 0 and MAX_INIT_PRIORITY.
33355
33356    This differs from default_named_section_asm_out_constructor in
33357    that we have special handling for -mrelocatable.  */
33358
33359 static void rs6000_elf_asm_out_constructor (rtx, int) ATTRIBUTE_UNUSED;
33360 static void
33361 rs6000_elf_asm_out_constructor (rtx symbol, int priority)
33362 {
33363   const char *section = ".ctors";
33364   char buf[18];
33365
33366   if (priority != DEFAULT_INIT_PRIORITY)
33367     {
33368       sprintf (buf, ".ctors.%.5u",
33369                /* Invert the numbering so the linker puts us in the proper
33370                   order; constructors are run from right to left, and the
33371                   linker sorts in increasing order.  */
33372                MAX_INIT_PRIORITY - priority);
33373       section = buf;
33374     }
33375
33376   switch_to_section (get_section (section, SECTION_WRITE, NULL));
33377   assemble_align (POINTER_SIZE);
33378
33379   if (DEFAULT_ABI == ABI_V4
33380       && (TARGET_RELOCATABLE || flag_pic > 1))
33381     {
33382       fputs ("\t.long (", asm_out_file);
33383       output_addr_const (asm_out_file, symbol);
33384       fputs (")@fixup\n", asm_out_file);
33385     }
33386   else
33387     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
33388 }
33389
33390 static void rs6000_elf_asm_out_destructor (rtx, int) ATTRIBUTE_UNUSED;
33391 static void
33392 rs6000_elf_asm_out_destructor (rtx symbol, int priority)
33393 {
33394   const char *section = ".dtors";
33395   char buf[18];
33396
33397   if (priority != DEFAULT_INIT_PRIORITY)
33398     {
33399       sprintf (buf, ".dtors.%.5u",
33400                /* Invert the numbering so the linker puts us in the proper
33401                   order; constructors are run from right to left, and the
33402                   linker sorts in increasing order.  */
33403                MAX_INIT_PRIORITY - priority);
33404       section = buf;
33405     }
33406
33407   switch_to_section (get_section (section, SECTION_WRITE, NULL));
33408   assemble_align (POINTER_SIZE);
33409
33410   if (DEFAULT_ABI == ABI_V4
33411       && (TARGET_RELOCATABLE || flag_pic > 1))
33412     {
33413       fputs ("\t.long (", asm_out_file);
33414       output_addr_const (asm_out_file, symbol);
33415       fputs (")@fixup\n", asm_out_file);
33416     }
33417   else
33418     assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
33419 }
33420
33421 void
33422 rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
33423 {
33424   if (TARGET_64BIT && DEFAULT_ABI != ABI_ELFv2)
33425     {
33426       fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
33427       ASM_OUTPUT_LABEL (file, name);
33428       fputs (DOUBLE_INT_ASM_OP, file);
33429       rs6000_output_function_entry (file, name);
33430       fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
33431       if (DOT_SYMBOLS)
33432         {
33433           fputs ("\t.size\t", file);
33434           assemble_name (file, name);
33435           fputs (",24\n\t.type\t.", file);
33436           assemble_name (file, name);
33437           fputs (",@function\n", file);
33438           if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
33439             {
33440               fputs ("\t.globl\t.", file);
33441               assemble_name (file, name);
33442               putc ('\n', file);
33443             }
33444         }
33445       else
33446         ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
33447       ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
33448       rs6000_output_function_entry (file, name);
33449       fputs (":\n", file);
33450       return;
33451     }
33452
33453   int uses_toc;
33454   if (DEFAULT_ABI == ABI_V4
33455       && (TARGET_RELOCATABLE || flag_pic > 1)
33456       && !TARGET_SECURE_PLT
33457       && (!constant_pool_empty_p () || crtl->profile)
33458       && (uses_toc = uses_TOC ()))
33459     {
33460       char buf[256];
33461
33462       if (uses_toc == 2)
33463         switch_to_other_text_partition ();
33464       (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
33465
33466       fprintf (file, "\t.long ");
33467       assemble_name (file, toc_label_name);
33468       need_toc_init = 1;
33469       putc ('-', file);
33470       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
33471       assemble_name (file, buf);
33472       putc ('\n', file);
33473       if (uses_toc == 2)
33474         switch_to_other_text_partition ();
33475     }
33476
33477   ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
33478   ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
33479
33480   if (TARGET_CMODEL == CMODEL_LARGE
33481       && rs6000_global_entry_point_prologue_needed_p ())
33482     {
33483       char buf[256];
33484
33485       (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
33486
33487       fprintf (file, "\t.quad .TOC.-");
33488       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
33489       assemble_name (file, buf);
33490       putc ('\n', file);
33491     }
33492
33493   if (DEFAULT_ABI == ABI_AIX)
33494     {
33495       const char *desc_name, *orig_name;
33496
33497       orig_name = (*targetm.strip_name_encoding) (name);
33498       desc_name = orig_name;
33499       while (*desc_name == '.')
33500         desc_name++;
33501
33502       if (TREE_PUBLIC (decl))
33503         fprintf (file, "\t.globl %s\n", desc_name);
33504
33505       fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
33506       fprintf (file, "%s:\n", desc_name);
33507       fprintf (file, "\t.long %s\n", orig_name);
33508       fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
33509       fputs ("\t.long 0\n", file);
33510       fprintf (file, "\t.previous\n");
33511     }
33512   ASM_OUTPUT_LABEL (file, name);
33513 }
33514
33515 static void rs6000_elf_file_end (void) ATTRIBUTE_UNUSED;
33516 static void
33517 rs6000_elf_file_end (void)
33518 {
33519 #ifdef HAVE_AS_GNU_ATTRIBUTE
33520   /* ??? The value emitted depends on options active at file end.
33521      Assume anyone using #pragma or attributes that might change
33522      options knows what they are doing.  */
33523   if ((TARGET_64BIT || DEFAULT_ABI == ABI_V4)
33524       && rs6000_passes_float)
33525     {
33526       int fp;
33527
33528       if (TARGET_HARD_FLOAT)
33529         fp = 1;
33530       else
33531         fp = 2;
33532       if (rs6000_passes_long_double)
33533         {
33534           if (!TARGET_LONG_DOUBLE_128)
33535             fp |= 2 * 4;
33536           else if (TARGET_IEEEQUAD)
33537             fp |= 3 * 4;
33538           else
33539             fp |= 1 * 4;
33540         }
33541       fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n", fp);
33542     }
33543   if (TARGET_32BIT && DEFAULT_ABI == ABI_V4)
33544     {
33545       if (rs6000_passes_vector)
33546         fprintf (asm_out_file, "\t.gnu_attribute 8, %d\n",
33547                  (TARGET_ALTIVEC_ABI ? 2 : 1));
33548       if (rs6000_returns_struct)
33549         fprintf (asm_out_file, "\t.gnu_attribute 12, %d\n",
33550                  aix_struct_return ? 2 : 1);
33551     }
33552 #endif
33553 #if defined (POWERPC_LINUX) || defined (POWERPC_FREEBSD)
33554   if (TARGET_32BIT || DEFAULT_ABI == ABI_ELFv2)
33555     file_end_indicate_exec_stack ();
33556 #endif
33557
33558   if (flag_split_stack)
33559     file_end_indicate_split_stack ();
33560
33561   if (cpu_builtin_p)
33562     {
33563       /* We have expanded a CPU builtin, so we need to emit a reference to
33564          the special symbol that LIBC uses to declare it supports the
33565          AT_PLATFORM and AT_HWCAP/AT_HWCAP2 in the TCB feature.  */
33566       switch_to_section (data_section);
33567       fprintf (asm_out_file, "\t.align %u\n", TARGET_32BIT ? 2 : 3);
33568       fprintf (asm_out_file, "\t%s %s\n",
33569                TARGET_32BIT ? ".long" : ".quad", tcb_verification_symbol);
33570     }
33571 }
33572 #endif
33573
33574 #if TARGET_XCOFF
33575
33576 #ifndef HAVE_XCOFF_DWARF_EXTRAS
33577 #define HAVE_XCOFF_DWARF_EXTRAS 0
33578 #endif
33579
33580 static enum unwind_info_type
33581 rs6000_xcoff_debug_unwind_info (void)
33582 {
33583   return UI_NONE;
33584 }
33585
33586 static void
33587 rs6000_xcoff_asm_output_anchor (rtx symbol)
33588 {
33589   char buffer[100];
33590
33591   sprintf (buffer, "$ + " HOST_WIDE_INT_PRINT_DEC,
33592            SYMBOL_REF_BLOCK_OFFSET (symbol));
33593   fprintf (asm_out_file, "%s", SET_ASM_OP);
33594   RS6000_OUTPUT_BASENAME (asm_out_file, XSTR (symbol, 0));
33595   fprintf (asm_out_file, ",");
33596   RS6000_OUTPUT_BASENAME (asm_out_file, buffer);
33597   fprintf (asm_out_file, "\n");
33598 }
33599
33600 static void
33601 rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
33602 {
33603   fputs (GLOBAL_ASM_OP, stream);
33604   RS6000_OUTPUT_BASENAME (stream, name);
33605   putc ('\n', stream);
33606 }
33607
33608 /* A get_unnamed_decl callback, used for read-only sections.  PTR
33609    points to the section string variable.  */
33610
33611 static void
33612 rs6000_xcoff_output_readonly_section_asm_op (const void *directive)
33613 {
33614   fprintf (asm_out_file, "\t.csect %s[RO],%s\n",
33615            *(const char *const *) directive,
33616            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
33617 }
33618
33619 /* Likewise for read-write sections.  */
33620
33621 static void
33622 rs6000_xcoff_output_readwrite_section_asm_op (const void *directive)
33623 {
33624   fprintf (asm_out_file, "\t.csect %s[RW],%s\n",
33625            *(const char *const *) directive,
33626            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
33627 }
33628
33629 static void
33630 rs6000_xcoff_output_tls_section_asm_op (const void *directive)
33631 {
33632   fprintf (asm_out_file, "\t.csect %s[TL],%s\n",
33633            *(const char *const *) directive,
33634            XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
33635 }
33636
33637 /* A get_unnamed_section callback, used for switching to toc_section.  */
33638
33639 static void
33640 rs6000_xcoff_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
33641 {
33642   if (TARGET_MINIMAL_TOC)
33643     {
33644       /* toc_section is always selected at least once from
33645          rs6000_xcoff_file_start, so this is guaranteed to
33646          always be defined once and only once in each file.  */
33647       if (!toc_initialized)
33648         {
33649           fputs ("\t.toc\nLCTOC..1:\n", asm_out_file);
33650           fputs ("\t.tc toc_table[TC],toc_table[RW]\n", asm_out_file);
33651           toc_initialized = 1;
33652         }
33653       fprintf (asm_out_file, "\t.csect toc_table[RW]%s\n",
33654                (TARGET_32BIT ? "" : ",3"));
33655     }
33656   else
33657     fputs ("\t.toc\n", asm_out_file);
33658 }
33659
33660 /* Implement TARGET_ASM_INIT_SECTIONS.  */
33661
33662 static void
33663 rs6000_xcoff_asm_init_sections (void)
33664 {
33665   read_only_data_section
33666     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
33667                            &xcoff_read_only_section_name);
33668
33669   private_data_section
33670     = get_unnamed_section (SECTION_WRITE,
33671                            rs6000_xcoff_output_readwrite_section_asm_op,
33672                            &xcoff_private_data_section_name);
33673
33674   read_only_private_data_section
33675     = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
33676                            &xcoff_private_rodata_section_name);
33677
33678   tls_data_section
33679     = get_unnamed_section (SECTION_TLS,
33680                            rs6000_xcoff_output_tls_section_asm_op,
33681                            &xcoff_tls_data_section_name);
33682
33683   tls_private_data_section
33684     = get_unnamed_section (SECTION_TLS,
33685                            rs6000_xcoff_output_tls_section_asm_op,
33686                            &xcoff_private_data_section_name);
33687
33688   toc_section
33689     = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);
33690
33691   readonly_data_section = read_only_data_section;
33692 }
33693
33694 static int
33695 rs6000_xcoff_reloc_rw_mask (void)
33696 {
33697   return 3;
33698 }
33699
33700 static void
33701 rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
33702                                 tree decl ATTRIBUTE_UNUSED)
33703 {
33704   int smclass;
33705   static const char * const suffix[5] = { "PR", "RO", "RW", "TL", "XO" };
33706
33707   if (flags & SECTION_EXCLUDE)
33708     smclass = 4;
33709   else if (flags & SECTION_DEBUG)
33710     {
33711       fprintf (asm_out_file, "\t.dwsect %s\n", name);
33712       return;
33713     }
33714   else if (flags & SECTION_CODE)
33715     smclass = 0;
33716   else if (flags & SECTION_TLS)
33717     smclass = 3;
33718   else if (flags & SECTION_WRITE)
33719     smclass = 2;
33720   else
33721     smclass = 1;
33722
33723   fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
33724            (flags & SECTION_CODE) ? "." : "",
33725            name, suffix[smclass], flags & SECTION_ENTSIZE);
33726 }
33727
33728 #define IN_NAMED_SECTION(DECL) \
33729   ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
33730    && DECL_SECTION_NAME (DECL) != NULL)
33731
33732 static section *
33733 rs6000_xcoff_select_section (tree decl, int reloc,
33734                              unsigned HOST_WIDE_INT align)
33735 {
33736   /* Place variables with alignment stricter than BIGGEST_ALIGNMENT into
33737      named section.  */
33738   if (align > BIGGEST_ALIGNMENT)
33739     {
33740       resolve_unique_section (decl, reloc, true);
33741       if (IN_NAMED_SECTION (decl))
33742         return get_named_section (decl, NULL, reloc);
33743     }
33744
33745   if (decl_readonly_section (decl, reloc))
33746     {
33747       if (TREE_PUBLIC (decl))
33748         return read_only_data_section;
33749       else
33750         return read_only_private_data_section;
33751     }
33752   else
33753     {
33754 #if HAVE_AS_TLS
33755       if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
33756         {
33757           if (TREE_PUBLIC (decl))
33758             return tls_data_section;
33759           else if (bss_initializer_p (decl))
33760             {
33761               /* Convert to COMMON to emit in BSS.  */
33762               DECL_COMMON (decl) = 1;
33763               return tls_comm_section;
33764             }
33765           else
33766             return tls_private_data_section;
33767         }
33768       else
33769 #endif
33770         if (TREE_PUBLIC (decl))
33771         return data_section;
33772       else
33773         return private_data_section;
33774     }
33775 }
33776
33777 static void
33778 rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
33779 {
33780   const char *name;
33781
33782   /* Use select_section for private data and uninitialized data with
33783      alignment <= BIGGEST_ALIGNMENT.  */
33784   if (!TREE_PUBLIC (decl)
33785       || DECL_COMMON (decl)
33786       || (DECL_INITIAL (decl) == NULL_TREE
33787           && DECL_ALIGN (decl) <= BIGGEST_ALIGNMENT)
33788       || DECL_INITIAL (decl) == error_mark_node
33789       || (flag_zero_initialized_in_bss
33790           && initializer_zerop (DECL_INITIAL (decl))))
33791     return;
33792
33793   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
33794   name = (*targetm.strip_name_encoding) (name);
33795   set_decl_section_name (decl, name);
33796 }
33797
33798 /* Select section for constant in constant pool.
33799
33800    On RS/6000, all constants are in the private read-only data area.
33801    However, if this is being placed in the TOC it must be output as a
33802    toc entry.  */
33803
33804 static section *
33805 rs6000_xcoff_select_rtx_section (machine_mode mode, rtx x,
33806                                  unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
33807 {
33808   if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
33809     return toc_section;
33810   else
33811     return read_only_private_data_section;
33812 }
33813
33814 /* Remove any trailing [DS] or the like from the symbol name.  */
33815
33816 static const char *
33817 rs6000_xcoff_strip_name_encoding (const char *name)
33818 {
33819   size_t len;
33820   if (*name == '*')
33821     name++;
33822   len = strlen (name);
33823   if (name[len - 1] == ']')
33824     return ggc_alloc_string (name, len - 4);
33825   else
33826     return name;
33827 }
33828
33829 /* Section attributes.  AIX is always PIC.  */
33830
33831 static unsigned int
33832 rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
33833 {
33834   unsigned int align;
33835   unsigned int flags = default_section_type_flags (decl, name, reloc);
33836
33837   /* Align to at least UNIT size.  */
33838   if ((flags & SECTION_CODE) != 0 || !decl || !DECL_P (decl))
33839     align = MIN_UNITS_PER_WORD;
33840   else
33841     /* Increase alignment of large objects if not already stricter.  */
33842     align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
33843                  int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
33844                  ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
33845
33846   return flags | (exact_log2 (align) & SECTION_ENTSIZE);
33847 }
33848
33849 /* Output at beginning of assembler file.
33850
33851    Initialize the section names for the RS/6000 at this point.
33852
33853    Specify filename, including full path, to assembler.
33854
33855    We want to go into the TOC section so at least one .toc will be emitted.
33856    Also, in order to output proper .bs/.es pairs, we need at least one static
33857    [RW] section emitted.
33858
33859    Finally, declare mcount when profiling to make the assembler happy.  */
33860
33861 static void
33862 rs6000_xcoff_file_start (void)
33863 {
33864   rs6000_gen_section_name (&xcoff_bss_section_name,
33865                            main_input_filename, ".bss_");
33866   rs6000_gen_section_name (&xcoff_private_data_section_name,
33867                            main_input_filename, ".rw_");
33868   rs6000_gen_section_name (&xcoff_private_rodata_section_name,
33869                            main_input_filename, ".rop_");
33870   rs6000_gen_section_name (&xcoff_read_only_section_name,
33871                            main_input_filename, ".ro_");
33872   rs6000_gen_section_name (&xcoff_tls_data_section_name,
33873                            main_input_filename, ".tls_");
33874   rs6000_gen_section_name (&xcoff_tbss_section_name,
33875                            main_input_filename, ".tbss_[UL]");
33876
33877   fputs ("\t.file\t", asm_out_file);
33878   output_quoted_string (asm_out_file, main_input_filename);
33879   fputc ('\n', asm_out_file);
33880   if (write_symbols != NO_DEBUG)
33881     switch_to_section (private_data_section);
33882   switch_to_section (toc_section);
33883   switch_to_section (text_section);
33884   if (profile_flag)
33885     fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
33886   rs6000_file_start ();
33887 }
33888
33889 /* Output at end of assembler file.
33890    On the RS/6000, referencing data should automatically pull in text.  */
33891
33892 static void
33893 rs6000_xcoff_file_end (void)
33894 {
33895   switch_to_section (text_section);
33896   fputs ("_section_.text:\n", asm_out_file);
33897   switch_to_section (data_section);
33898   fputs (TARGET_32BIT
33899          ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
33900          asm_out_file);
33901 }
33902
33903 struct declare_alias_data
33904 {
33905   FILE *file;
33906   bool function_descriptor;
33907 };
33908
33909 /* Declare alias N.  A helper function for for_node_and_aliases.  */
33910
33911 static bool
33912 rs6000_declare_alias (struct symtab_node *n, void *d)
33913 {
33914   struct declare_alias_data *data = (struct declare_alias_data *)d;
33915   /* Main symbol is output specially, because varasm machinery does part of
33916      the job for us - we do not need to declare .globl/lglobs and such.  */
33917   if (!n->alias || n->weakref)
33918     return false;
33919
33920   if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (n->decl)))
33921     return false;
33922
33923   /* Prevent assemble_alias from trying to use .set pseudo operation
33924      that does not behave as expected by the middle-end.  */
33925   TREE_ASM_WRITTEN (n->decl) = true;
33926
33927   const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (n->decl));
33928   char *buffer = (char *) alloca (strlen (name) + 2);
33929   char *p;
33930   int dollar_inside = 0;
33931
33932   strcpy (buffer, name);
33933   p = strchr (buffer, '$');
33934   while (p) {
33935     *p = '_';
33936     dollar_inside++;
33937     p = strchr (p + 1, '$');
33938   }
33939   if (TREE_PUBLIC (n->decl))
33940     {
33941       if (!RS6000_WEAK || !DECL_WEAK (n->decl))
33942         {
33943           if (dollar_inside) {
33944               if (data->function_descriptor)
33945                 fprintf(data->file, "\t.rename .%s,\".%s\"\n", buffer, name);
33946               fprintf(data->file, "\t.rename %s,\"%s\"\n", buffer, name);
33947             }
33948           if (data->function_descriptor)
33949             {
33950               fputs ("\t.globl .", data->file);
33951               RS6000_OUTPUT_BASENAME (data->file, buffer);
33952               putc ('\n', data->file);
33953             }
33954           fputs ("\t.globl ", data->file);
33955           RS6000_OUTPUT_BASENAME (data->file, buffer);
33956           putc ('\n', data->file);
33957         }
33958 #ifdef ASM_WEAKEN_DECL
33959       else if (DECL_WEAK (n->decl) && !data->function_descriptor)
33960         ASM_WEAKEN_DECL (data->file, n->decl, name, NULL);
33961 #endif
33962     }
33963   else
33964     {
33965       if (dollar_inside)
33966         {
33967           if (data->function_descriptor)
33968             fprintf(data->file, "\t.rename .%s,\".%s\"\n", buffer, name);
33969           fprintf(data->file, "\t.rename %s,\"%s\"\n", buffer, name);
33970         }
33971       if (data->function_descriptor)
33972         {
33973           fputs ("\t.lglobl .", data->file);
33974           RS6000_OUTPUT_BASENAME (data->file, buffer);
33975           putc ('\n', data->file);
33976         }
33977       fputs ("\t.lglobl ", data->file);
33978       RS6000_OUTPUT_BASENAME (data->file, buffer);
33979       putc ('\n', data->file);
33980     }
33981   if (data->function_descriptor)
33982     fputs (".", data->file);
33983   RS6000_OUTPUT_BASENAME (data->file, buffer);
33984   fputs (":\n", data->file);
33985   return false;
33986 }
33987
33988
33989 #ifdef HAVE_GAS_HIDDEN
33990 /* Helper function to calculate visibility of a DECL
33991    and return the value as a const string.  */
33992
33993 static const char *
33994 rs6000_xcoff_visibility (tree decl)
33995 {
33996   static const char * const visibility_types[] = {
33997     "", ",protected", ",hidden", ",internal"
33998   };
33999
34000   enum symbol_visibility vis = DECL_VISIBILITY (decl);
34001   return visibility_types[vis];
34002 }
34003 #endif
34004
34005
34006 /* This macro produces the initial definition of a function name.
34007    On the RS/6000, we need to place an extra '.' in the function name and
34008    output the function descriptor.
34009    Dollar signs are converted to underscores.
34010
34011    The csect for the function will have already been created when
34012    text_section was selected.  We do have to go back to that csect, however.
34013
34014    The third and fourth parameters to the .function pseudo-op (16 and 044)
34015    are placeholders which no longer have any use.
34016
34017    Because AIX assembler's .set command has unexpected semantics, we output
34018    all aliases as alternative labels in front of the definition.  */
34019
34020 void
34021 rs6000_xcoff_declare_function_name (FILE *file, const char *name, tree decl)
34022 {
34023   char *buffer = (char *) alloca (strlen (name) + 1);
34024   char *p;
34025   int dollar_inside = 0;
34026   struct declare_alias_data data = {file, false};
34027
34028   strcpy (buffer, name);
34029   p = strchr (buffer, '$');
34030   while (p) {
34031     *p = '_';
34032     dollar_inside++;
34033     p = strchr (p + 1, '$');
34034   }
34035   if (TREE_PUBLIC (decl))
34036     {
34037       if (!RS6000_WEAK || !DECL_WEAK (decl))
34038         {
34039           if (dollar_inside) {
34040               fprintf(file, "\t.rename .%s,\".%s\"\n", buffer, name);
34041               fprintf(file, "\t.rename %s,\"%s\"\n", buffer, name);
34042             }
34043           fputs ("\t.globl .", file);
34044           RS6000_OUTPUT_BASENAME (file, buffer);
34045 #ifdef HAVE_GAS_HIDDEN
34046           fputs (rs6000_xcoff_visibility (decl), file);
34047 #endif
34048           putc ('\n', file);
34049         }
34050     }
34051   else
34052     {
34053       if (dollar_inside) {
34054           fprintf(file, "\t.rename .%s,\".%s\"\n", buffer, name);
34055           fprintf(file, "\t.rename %s,\"%s\"\n", buffer, name);
34056         }
34057       fputs ("\t.lglobl .", file);
34058       RS6000_OUTPUT_BASENAME (file, buffer);
34059       putc ('\n', file);
34060     }
34061   fputs ("\t.csect ", file);
34062   RS6000_OUTPUT_BASENAME (file, buffer);
34063   fputs (TARGET_32BIT ? "[DS]\n" : "[DS],3\n", file);
34064   RS6000_OUTPUT_BASENAME (file, buffer);
34065   fputs (":\n", file);
34066   symtab_node::get (decl)->call_for_symbol_and_aliases (rs6000_declare_alias,
34067                                                         &data, true);
34068   fputs (TARGET_32BIT ? "\t.long ." : "\t.llong .", file);
34069   RS6000_OUTPUT_BASENAME (file, buffer);
34070   fputs (", TOC[tc0], 0\n", file);
34071   in_section = NULL;
34072   switch_to_section (function_section (decl));
34073   putc ('.', file);
34074   RS6000_OUTPUT_BASENAME (file, buffer);
34075   fputs (":\n", file);
34076   data.function_descriptor = true;
34077   symtab_node::get (decl)->call_for_symbol_and_aliases (rs6000_declare_alias,
34078                                                         &data, true);
34079   if (!DECL_IGNORED_P (decl))
34080     {
34081       if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
34082         xcoffout_declare_function (file, decl, buffer);
34083       else if (write_symbols == DWARF2_DEBUG)
34084         {
34085           name = (*targetm.strip_name_encoding) (name);
34086           fprintf (file, "\t.function .%s,.%s,2,0\n", name, name);
34087         }
34088     }
34089   return;
34090 }
34091
34092
34093 /* Output assembly language to globalize a symbol from a DECL,
34094    possibly with visibility.  */
34095
34096 void
34097 rs6000_xcoff_asm_globalize_decl_name (FILE *stream, tree decl)
34098 {
34099   const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
34100   fputs (GLOBAL_ASM_OP, stream);
34101   RS6000_OUTPUT_BASENAME (stream, name);
34102 #ifdef HAVE_GAS_HIDDEN
34103   fputs (rs6000_xcoff_visibility (decl), stream);
34104 #endif
34105   putc ('\n', stream);
34106 }
34107
34108 /* Output assembly language to define a symbol as COMMON from a DECL,
34109    possibly with visibility.  */
34110
34111 void
34112 rs6000_xcoff_asm_output_aligned_decl_common (FILE *stream,
34113                                              tree decl ATTRIBUTE_UNUSED,
34114                                              const char *name,
34115                                              unsigned HOST_WIDE_INT size,
34116                                              unsigned HOST_WIDE_INT align)
34117 {
34118   unsigned HOST_WIDE_INT align2 = 2;
34119
34120   if (align > 32)
34121     align2 = floor_log2 (align / BITS_PER_UNIT);
34122   else if (size > 4)
34123     align2 = 3;
34124
34125   fputs (COMMON_ASM_OP, stream);
34126   RS6000_OUTPUT_BASENAME (stream, name);
34127
34128   fprintf (stream,
34129            "," HOST_WIDE_INT_PRINT_UNSIGNED "," HOST_WIDE_INT_PRINT_UNSIGNED,
34130            size, align2);
34131
34132 #ifdef HAVE_GAS_HIDDEN
34133   if (decl != NULL)
34134     fputs (rs6000_xcoff_visibility (decl), stream);
34135 #endif
34136   putc ('\n', stream);
34137 }
34138
34139 /* This macro produces the initial definition of a object (variable) name.
34140    Because AIX assembler's .set command has unexpected semantics, we output
34141    all aliases as alternative labels in front of the definition.  */
34142
34143 void
34144 rs6000_xcoff_declare_object_name (FILE *file, const char *name, tree decl)
34145 {
34146   struct declare_alias_data data = {file, false};
34147   RS6000_OUTPUT_BASENAME (file, name);
34148   fputs (":\n", file);
34149   symtab_node::get_create (decl)->call_for_symbol_and_aliases (rs6000_declare_alias,
34150                                                                &data, true);
34151 }
34152
34153 /* Overide the default 'SYMBOL-.' syntax with AIX compatible 'SYMBOL-$'. */
34154
34155 void
34156 rs6000_asm_output_dwarf_pcrel (FILE *file, int size, const char *label)
34157 {
34158   fputs (integer_asm_op (size, FALSE), file);
34159   assemble_name (file, label);
34160   fputs ("-$", file);
34161 }
34162
34163 /* Output a symbol offset relative to the dbase for the current object.
34164    We use __gcc_unwind_dbase as an arbitrary base for dbase and assume
34165    signed offsets.
34166
34167    __gcc_unwind_dbase is embedded in all executables/libraries through
34168    libgcc/config/rs6000/crtdbase.S.  */
34169
34170 void
34171 rs6000_asm_output_dwarf_datarel (FILE *file, int size, const char *label)
34172 {
34173   fputs (integer_asm_op (size, FALSE), file);
34174   assemble_name (file, label);
34175   fputs("-__gcc_unwind_dbase", file);
34176 }
34177
34178 #ifdef HAVE_AS_TLS
34179 static void
34180 rs6000_xcoff_encode_section_info (tree decl, rtx rtl, int first)
34181 {
34182   rtx symbol;
34183   int flags;
34184   const char *symname;
34185
34186   default_encode_section_info (decl, rtl, first);
34187
34188   /* Careful not to prod global register variables.  */
34189   if (!MEM_P (rtl))
34190     return;
34191   symbol = XEXP (rtl, 0);
34192   if (!SYMBOL_REF_P (symbol))
34193     return;
34194
34195   flags = SYMBOL_REF_FLAGS (symbol);
34196
34197   if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
34198     flags &= ~SYMBOL_FLAG_HAS_BLOCK_INFO;
34199
34200   SYMBOL_REF_FLAGS (symbol) = flags;
34201
34202   /* Append mapping class to extern decls.  */
34203   symname = XSTR (symbol, 0);
34204   if (decl /* sync condition with assemble_external () */
34205       && DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl)
34206       && ((TREE_CODE (decl) == VAR_DECL && !DECL_THREAD_LOCAL_P (decl))
34207           || TREE_CODE (decl) == FUNCTION_DECL)
34208       && symname[strlen (symname) - 1] != ']')
34209     {
34210       char *newname = (char *) alloca (strlen (symname) + 5);
34211       strcpy (newname, symname);
34212       strcat (newname, (TREE_CODE (decl) == FUNCTION_DECL
34213                         ? "[DS]" : "[UA]"));
34214       XSTR (symbol, 0) = ggc_strdup (newname);
34215     }
34216 }
34217 #endif /* HAVE_AS_TLS */
34218 #endif /* TARGET_XCOFF */
34219
34220 void
34221 rs6000_asm_weaken_decl (FILE *stream, tree decl,
34222                         const char *name, const char *val)
34223 {
34224   fputs ("\t.weak\t", stream);
34225   RS6000_OUTPUT_BASENAME (stream, name);
34226   if (decl && TREE_CODE (decl) == FUNCTION_DECL
34227       && DEFAULT_ABI == ABI_AIX && DOT_SYMBOLS)
34228     {
34229       if (TARGET_XCOFF)                                         
34230         fputs ("[DS]", stream);
34231 #if TARGET_XCOFF && HAVE_GAS_HIDDEN
34232       if (TARGET_XCOFF)
34233         fputs (rs6000_xcoff_visibility (decl), stream);
34234 #endif
34235       fputs ("\n\t.weak\t.", stream);
34236       RS6000_OUTPUT_BASENAME (stream, name);
34237     }
34238 #if TARGET_XCOFF && HAVE_GAS_HIDDEN
34239   if (TARGET_XCOFF)
34240     fputs (rs6000_xcoff_visibility (decl), stream);
34241 #endif
34242   fputc ('\n', stream);
34243   if (val)
34244     {
34245 #ifdef ASM_OUTPUT_DEF
34246       ASM_OUTPUT_DEF (stream, name, val);
34247 #endif
34248       if (decl && TREE_CODE (decl) == FUNCTION_DECL
34249           && DEFAULT_ABI == ABI_AIX && DOT_SYMBOLS)
34250         {
34251           fputs ("\t.set\t.", stream);
34252           RS6000_OUTPUT_BASENAME (stream, name);
34253           fputs (",.", stream);
34254           RS6000_OUTPUT_BASENAME (stream, val);
34255           fputc ('\n', stream);
34256         }
34257     }
34258 }
34259
34260
34261 /* Return true if INSN should not be copied.  */
34262
34263 static bool
34264 rs6000_cannot_copy_insn_p (rtx_insn *insn)
34265 {
34266   return recog_memoized (insn) >= 0
34267          && get_attr_cannot_copy (insn);
34268 }
34269
34270 /* Compute a (partial) cost for rtx X.  Return true if the complete
34271    cost has been computed, and false if subexpressions should be
34272    scanned.  In either case, *TOTAL contains the cost result.  */
34273
34274 static bool
34275 rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code,
34276                   int opno ATTRIBUTE_UNUSED, int *total, bool speed)
34277 {
34278   int code = GET_CODE (x);
34279
34280   switch (code)
34281     {
34282       /* On the RS/6000, if it is valid in the insn, it is free.  */
34283     case CONST_INT:
34284       if (((outer_code == SET
34285             || outer_code == PLUS
34286             || outer_code == MINUS)
34287            && (satisfies_constraint_I (x)
34288                || satisfies_constraint_L (x)))
34289           || (outer_code == AND
34290               && (satisfies_constraint_K (x)
34291                   || (mode == SImode
34292                       ? satisfies_constraint_L (x)
34293                       : satisfies_constraint_J (x))))
34294           || ((outer_code == IOR || outer_code == XOR)
34295               && (satisfies_constraint_K (x)
34296                   || (mode == SImode
34297                       ? satisfies_constraint_L (x)
34298                       : satisfies_constraint_J (x))))
34299           || outer_code == ASHIFT
34300           || outer_code == ASHIFTRT
34301           || outer_code == LSHIFTRT
34302           || outer_code == ROTATE
34303           || outer_code == ROTATERT
34304           || outer_code == ZERO_EXTRACT
34305           || (outer_code == MULT
34306               && satisfies_constraint_I (x))
34307           || ((outer_code == DIV || outer_code == UDIV
34308                || outer_code == MOD || outer_code == UMOD)
34309               && exact_log2 (INTVAL (x)) >= 0)
34310           || (outer_code == COMPARE
34311               && (satisfies_constraint_I (x)
34312                   || satisfies_constraint_K (x)))
34313           || ((outer_code == EQ || outer_code == NE)
34314               && (satisfies_constraint_I (x)
34315                   || satisfies_constraint_K (x)
34316                   || (mode == SImode
34317                       ? satisfies_constraint_L (x)
34318                       : satisfies_constraint_J (x))))
34319           || (outer_code == GTU
34320               && satisfies_constraint_I (x))
34321           || (outer_code == LTU
34322               && satisfies_constraint_P (x)))
34323         {
34324           *total = 0;
34325           return true;
34326         }
34327       else if ((outer_code == PLUS
34328                 && reg_or_add_cint_operand (x, VOIDmode))
34329                || (outer_code == MINUS
34330                    && reg_or_sub_cint_operand (x, VOIDmode))
34331                || ((outer_code == SET
34332                     || outer_code == IOR
34333                     || outer_code == XOR)
34334                    && (INTVAL (x)
34335                        & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
34336         {
34337           *total = COSTS_N_INSNS (1);
34338           return true;
34339         }
34340       /* FALLTHRU */
34341
34342     case CONST_DOUBLE:
34343     case CONST_WIDE_INT:
34344     case CONST:
34345     case HIGH:
34346     case SYMBOL_REF:
34347       *total = !speed ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
34348       return true;
34349
34350     case MEM:
34351       /* When optimizing for size, MEM should be slightly more expensive
34352          than generating address, e.g., (plus (reg) (const)).
34353          L1 cache latency is about two instructions.  */
34354       *total = !speed ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
34355       if (rs6000_slow_unaligned_access (mode, MEM_ALIGN (x)))
34356         *total += COSTS_N_INSNS (100);
34357       return true;
34358
34359     case LABEL_REF:
34360       *total = 0;
34361       return true;
34362
34363     case PLUS:
34364     case MINUS:
34365       if (FLOAT_MODE_P (mode))
34366         *total = rs6000_cost->fp;
34367       else
34368         *total = COSTS_N_INSNS (1);
34369       return false;
34370
34371     case MULT:
34372       if (CONST_INT_P (XEXP (x, 1))
34373           && satisfies_constraint_I (XEXP (x, 1)))
34374         {
34375           if (INTVAL (XEXP (x, 1)) >= -256
34376               && INTVAL (XEXP (x, 1)) <= 255)
34377             *total = rs6000_cost->mulsi_const9;
34378           else
34379             *total = rs6000_cost->mulsi_const;
34380         }
34381       else if (mode == SFmode)
34382         *total = rs6000_cost->fp;
34383       else if (FLOAT_MODE_P (mode))
34384         *total = rs6000_cost->dmul;
34385       else if (mode == DImode)
34386         *total = rs6000_cost->muldi;
34387       else
34388         *total = rs6000_cost->mulsi;
34389       return false;
34390
34391     case FMA:
34392       if (mode == SFmode)
34393         *total = rs6000_cost->fp;
34394       else
34395         *total = rs6000_cost->dmul;
34396       break;
34397
34398     case DIV:
34399     case MOD:
34400       if (FLOAT_MODE_P (mode))
34401         {
34402           *total = mode == DFmode ? rs6000_cost->ddiv
34403                                   : rs6000_cost->sdiv;
34404           return false;
34405         }
34406       /* FALLTHRU */
34407
34408     case UDIV:
34409     case UMOD:
34410       if (CONST_INT_P (XEXP (x, 1))
34411           && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
34412         {
34413           if (code == DIV || code == MOD)
34414             /* Shift, addze */
34415             *total = COSTS_N_INSNS (2);
34416           else
34417             /* Shift */
34418             *total = COSTS_N_INSNS (1);
34419         }
34420       else
34421         {
34422           if (GET_MODE (XEXP (x, 1)) == DImode)
34423             *total = rs6000_cost->divdi;
34424           else
34425             *total = rs6000_cost->divsi;
34426         }
34427       /* Add in shift and subtract for MOD unless we have a mod instruction. */
34428       if (!TARGET_MODULO && (code == MOD || code == UMOD))
34429         *total += COSTS_N_INSNS (2);
34430       return false;
34431
34432     case CTZ:
34433       *total = COSTS_N_INSNS (TARGET_CTZ ? 1 : 4);
34434       return false;
34435
34436     case FFS:
34437       *total = COSTS_N_INSNS (4);
34438       return false;
34439
34440     case POPCOUNT:
34441       *total = COSTS_N_INSNS (TARGET_POPCNTD ? 1 : 6);
34442       return false;
34443
34444     case PARITY:
34445       *total = COSTS_N_INSNS (TARGET_CMPB ? 2 : 6);
34446       return false;
34447
34448     case NOT:
34449       if (outer_code == AND || outer_code == IOR || outer_code == XOR)
34450         *total = 0;
34451       else
34452         *total = COSTS_N_INSNS (1);
34453       return false;
34454
34455     case AND:
34456       if (CONST_INT_P (XEXP (x, 1)))
34457         {
34458           rtx left = XEXP (x, 0);
34459           rtx_code left_code = GET_CODE (left);
34460
34461           /* rotate-and-mask: 1 insn.  */
34462           if ((left_code == ROTATE
34463                || left_code == ASHIFT
34464                || left_code == LSHIFTRT)
34465               && rs6000_is_valid_shift_mask (XEXP (x, 1), left, mode))
34466             {
34467               *total = rtx_cost (XEXP (left, 0), mode, left_code, 0, speed);
34468               if (!CONST_INT_P (XEXP (left, 1)))
34469                 *total += rtx_cost (XEXP (left, 1), SImode, left_code, 1, speed);
34470               *total += COSTS_N_INSNS (1);
34471               return true;
34472             }
34473
34474           /* rotate-and-mask (no rotate), andi., andis.: 1 insn.  */
34475           HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
34476           if (rs6000_is_valid_and_mask (XEXP (x, 1), mode)
34477               || (val & 0xffff) == val
34478               || (val & 0xffff0000) == val
34479               || ((val & 0xffff) == 0 && mode == SImode))
34480             {
34481               *total = rtx_cost (left, mode, AND, 0, speed);
34482               *total += COSTS_N_INSNS (1);
34483               return true;
34484             }
34485
34486           /* 2 insns.  */
34487           if (rs6000_is_valid_2insn_and (XEXP (x, 1), mode))
34488             {
34489               *total = rtx_cost (left, mode, AND, 0, speed);
34490               *total += COSTS_N_INSNS (2);
34491               return true;
34492             }
34493         }
34494
34495       *total = COSTS_N_INSNS (1);
34496       return false;
34497
34498     case IOR:
34499       /* FIXME */
34500       *total = COSTS_N_INSNS (1);
34501       return true;
34502
34503     case CLZ:
34504     case XOR:
34505     case ZERO_EXTRACT:
34506       *total = COSTS_N_INSNS (1);
34507       return false;
34508
34509     case ASHIFT:
34510       /* The EXTSWSLI instruction is a combined instruction.  Don't count both
34511          the sign extend and shift separately within the insn.  */
34512       if (TARGET_EXTSWSLI && mode == DImode
34513           && GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
34514           && GET_MODE (XEXP (XEXP (x, 0), 0)) == SImode)
34515         {
34516           *total = 0;
34517           return false;
34518         }
34519       /* fall through */
34520           
34521     case ASHIFTRT:
34522     case LSHIFTRT:
34523     case ROTATE:
34524     case ROTATERT:
34525       /* Handle mul_highpart.  */
34526       if (outer_code == TRUNCATE
34527           && GET_CODE (XEXP (x, 0)) == MULT)
34528         {
34529           if (mode == DImode)
34530             *total = rs6000_cost->muldi;
34531           else
34532             *total = rs6000_cost->mulsi;
34533           return true;
34534         }
34535       else if (outer_code == AND)
34536         *total = 0;
34537       else
34538         *total = COSTS_N_INSNS (1);
34539       return false;
34540
34541     case SIGN_EXTEND:
34542     case ZERO_EXTEND:
34543       if (MEM_P (XEXP (x, 0)))
34544         *total = 0;
34545       else
34546         *total = COSTS_N_INSNS (1);
34547       return false;
34548
34549     case COMPARE:
34550     case NEG:
34551     case ABS:
34552       if (!FLOAT_MODE_P (mode))
34553         {
34554           *total = COSTS_N_INSNS (1);
34555           return false;
34556         }
34557       /* FALLTHRU */
34558
34559     case FLOAT:
34560     case UNSIGNED_FLOAT:
34561     case FIX:
34562     case UNSIGNED_FIX:
34563     case FLOAT_TRUNCATE:
34564       *total = rs6000_cost->fp;
34565       return false;
34566
34567     case FLOAT_EXTEND:
34568       if (mode == DFmode)
34569         *total = rs6000_cost->sfdf_convert;
34570       else
34571         *total = rs6000_cost->fp;
34572       return false;
34573
34574     case UNSPEC:
34575       switch (XINT (x, 1))
34576         {
34577         case UNSPEC_FRSP:
34578           *total = rs6000_cost->fp;
34579           return true;
34580
34581         default:
34582           break;
34583         }
34584       break;
34585
34586     case CALL:
34587     case IF_THEN_ELSE:
34588       if (!speed)
34589         {
34590           *total = COSTS_N_INSNS (1);
34591           return true;
34592         }
34593       else if (FLOAT_MODE_P (mode) && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT)
34594         {
34595           *total = rs6000_cost->fp;
34596           return false;
34597         }
34598       break;
34599
34600     case NE:
34601     case EQ:
34602     case GTU:
34603     case LTU:
34604       /* Carry bit requires mode == Pmode.
34605          NEG or PLUS already counted so only add one.  */
34606       if (mode == Pmode
34607           && (outer_code == NEG || outer_code == PLUS))
34608         {
34609           *total = COSTS_N_INSNS (1);
34610           return true;
34611         }
34612       /* FALLTHRU */
34613
34614     case GT:
34615     case LT:
34616     case UNORDERED:
34617       if (outer_code == SET)
34618         {
34619           if (XEXP (x, 1) == const0_rtx)
34620             {
34621               *total = COSTS_N_INSNS (2);
34622               return true;
34623             }
34624           else
34625             {
34626               *total = COSTS_N_INSNS (3);
34627               return false;
34628             }
34629         }
34630       /* CC COMPARE.  */
34631       if (outer_code == COMPARE)
34632         {
34633           *total = 0;
34634           return true;
34635         }
34636       break;
34637
34638     default:
34639       break;
34640     }
34641
34642   return false;
34643 }
34644
34645 /* Debug form of r6000_rtx_costs that is selected if -mdebug=cost.  */
34646
34647 static bool
34648 rs6000_debug_rtx_costs (rtx x, machine_mode mode, int outer_code,
34649                         int opno, int *total, bool speed)
34650 {
34651   bool ret = rs6000_rtx_costs (x, mode, outer_code, opno, total, speed);
34652
34653   fprintf (stderr,
34654            "\nrs6000_rtx_costs, return = %s, mode = %s, outer_code = %s, "
34655            "opno = %d, total = %d, speed = %s, x:\n",
34656            ret ? "complete" : "scan inner",
34657            GET_MODE_NAME (mode),
34658            GET_RTX_NAME (outer_code),
34659            opno,
34660            *total,
34661            speed ? "true" : "false");
34662
34663   debug_rtx (x);
34664
34665   return ret;
34666 }
34667
34668 static int
34669 rs6000_insn_cost (rtx_insn *insn, bool speed)
34670 {
34671   if (recog_memoized (insn) < 0)
34672     return 0;
34673
34674   if (!speed)
34675     return get_attr_length (insn);
34676
34677   int cost = get_attr_cost (insn);
34678   if (cost > 0)
34679     return cost;
34680
34681   int n = get_attr_length (insn) / 4;
34682   enum attr_type type = get_attr_type (insn);
34683
34684   switch (type)
34685     {
34686     case TYPE_LOAD:
34687     case TYPE_FPLOAD:
34688     case TYPE_VECLOAD:
34689       cost = COSTS_N_INSNS (n + 1);
34690       break;
34691
34692     case TYPE_MUL:
34693       switch (get_attr_size (insn))
34694         {
34695         case SIZE_8:
34696           cost = COSTS_N_INSNS (n - 1) + rs6000_cost->mulsi_const9;
34697           break;
34698         case SIZE_16:
34699           cost = COSTS_N_INSNS (n - 1) + rs6000_cost->mulsi_const;
34700           break;
34701         case SIZE_32:
34702           cost = COSTS_N_INSNS (n - 1) + rs6000_cost->mulsi;
34703           break;
34704         case SIZE_64:
34705           cost = COSTS_N_INSNS (n - 1) + rs6000_cost->muldi;
34706           break;
34707         default:
34708           gcc_unreachable ();
34709         }
34710       break;
34711     case TYPE_DIV:
34712       switch (get_attr_size (insn))
34713         {
34714         case SIZE_32:
34715           cost = COSTS_N_INSNS (n - 1) + rs6000_cost->divsi;
34716           break;
34717         case SIZE_64:
34718           cost = COSTS_N_INSNS (n - 1) + rs6000_cost->divdi;
34719           break;
34720         default:
34721           gcc_unreachable ();
34722         }
34723       break;
34724
34725     case TYPE_FP:
34726       cost = n * rs6000_cost->fp;
34727       break;
34728     case TYPE_DMUL:
34729       cost = n * rs6000_cost->dmul;
34730       break;
34731     case TYPE_SDIV:
34732       cost = n * rs6000_cost->sdiv;
34733       break;
34734     case TYPE_DDIV:
34735       cost = n * rs6000_cost->ddiv;
34736       break;
34737
34738     case TYPE_SYNC:
34739     case TYPE_LOAD_L:
34740     case TYPE_MFCR:
34741     case TYPE_MFCRF:
34742       cost = COSTS_N_INSNS (n + 2);
34743       break;
34744
34745     default:
34746       cost = COSTS_N_INSNS (n);
34747     }
34748
34749   return cost;
34750 }
34751
34752 /* Debug form of ADDRESS_COST that is selected if -mdebug=cost.  */
34753
34754 static int
34755 rs6000_debug_address_cost (rtx x, machine_mode mode,
34756                            addr_space_t as, bool speed)
34757 {
34758   int ret = TARGET_ADDRESS_COST (x, mode, as, speed);
34759
34760   fprintf (stderr, "\nrs6000_address_cost, return = %d, speed = %s, x:\n",
34761            ret, speed ? "true" : "false");
34762   debug_rtx (x);
34763
34764   return ret;
34765 }
34766
34767
34768 /* A C expression returning the cost of moving data from a register of class
34769    CLASS1 to one of CLASS2.  */
34770
34771 static int
34772 rs6000_register_move_cost (machine_mode mode,
34773                            reg_class_t from, reg_class_t to)
34774 {
34775   int ret;
34776   reg_class_t rclass;
34777
34778   if (TARGET_DEBUG_COST)
34779     dbg_cost_ctrl++;
34780
34781   /* If we have VSX, we can easily move between FPR or Altivec registers,
34782      otherwise we can only easily move within classes.
34783      Do this first so we give best-case answers for union classes
34784      containing both gprs and vsx regs.  */
34785   HARD_REG_SET to_vsx, from_vsx;
34786   COPY_HARD_REG_SET (to_vsx, reg_class_contents[to]);
34787   AND_HARD_REG_SET (to_vsx, reg_class_contents[VSX_REGS]);
34788   COPY_HARD_REG_SET (from_vsx, reg_class_contents[from]);
34789   AND_HARD_REG_SET (from_vsx, reg_class_contents[VSX_REGS]);
34790   if (!hard_reg_set_empty_p (to_vsx)
34791       && !hard_reg_set_empty_p (from_vsx)
34792       && (TARGET_VSX
34793           || hard_reg_set_intersect_p (to_vsx, from_vsx)))
34794     {
34795       int reg = FIRST_FPR_REGNO;
34796       if (TARGET_VSX
34797           || (TEST_HARD_REG_BIT (to_vsx, FIRST_ALTIVEC_REGNO)
34798               && TEST_HARD_REG_BIT (from_vsx, FIRST_ALTIVEC_REGNO)))
34799         reg = FIRST_ALTIVEC_REGNO;
34800       ret = 2 * hard_regno_nregs (reg, mode);
34801     }
34802
34803   /*  Moves from/to GENERAL_REGS.  */
34804   else if ((rclass = from, reg_classes_intersect_p (to, GENERAL_REGS))
34805            || (rclass = to, reg_classes_intersect_p (from, GENERAL_REGS)))
34806     {
34807       if (rclass == FLOAT_REGS || rclass == ALTIVEC_REGS || rclass == VSX_REGS)
34808         {
34809           if (TARGET_DIRECT_MOVE)
34810             {
34811               /* Keep the cost for direct moves above that for within
34812                  a register class even if the actual processor cost is
34813                  comparable.  We do this because a direct move insn
34814                  can't be a nop, whereas with ideal register
34815                  allocation a move within the same class might turn
34816                  out to be a nop.  */
34817               if (rs6000_tune == PROCESSOR_POWER9
34818                   || rs6000_tune == PROCESSOR_FUTURE)
34819                 ret = 3 * hard_regno_nregs (FIRST_GPR_REGNO, mode);
34820               else
34821                 ret = 4 * hard_regno_nregs (FIRST_GPR_REGNO, mode);
34822               /* SFmode requires a conversion when moving between gprs
34823                  and vsx.  */
34824               if (mode == SFmode)
34825                 ret += 2;
34826             }
34827           else
34828             ret = (rs6000_memory_move_cost (mode, rclass, false)
34829                    + rs6000_memory_move_cost (mode, GENERAL_REGS, false));
34830         }
34831
34832       /* It's more expensive to move CR_REGS than CR0_REGS because of the
34833          shift.  */
34834       else if (rclass == CR_REGS)
34835         ret = 4;
34836
34837       /* For those processors that have slow LR/CTR moves, make them more
34838          expensive than memory in order to bias spills to memory .*/
34839       else if ((rs6000_tune == PROCESSOR_POWER6
34840                 || rs6000_tune == PROCESSOR_POWER7
34841                 || rs6000_tune == PROCESSOR_POWER8
34842                 || rs6000_tune == PROCESSOR_POWER9)
34843                && reg_class_subset_p (rclass, SPECIAL_REGS))
34844         ret = 6 * hard_regno_nregs (FIRST_GPR_REGNO, mode);
34845
34846       else
34847         /* A move will cost one instruction per GPR moved.  */
34848         ret = 2 * hard_regno_nregs (FIRST_GPR_REGNO, mode);
34849     }
34850
34851   /* Everything else has to go through GENERAL_REGS.  */
34852   else
34853     ret = (rs6000_register_move_cost (mode, GENERAL_REGS, to)
34854            + rs6000_register_move_cost (mode, from, GENERAL_REGS));
34855
34856   if (TARGET_DEBUG_COST)
34857     {
34858       if (dbg_cost_ctrl == 1)
34859         fprintf (stderr,
34860                  "rs6000_register_move_cost: ret=%d, mode=%s, from=%s, to=%s\n",
34861                  ret, GET_MODE_NAME (mode), reg_class_names[from],
34862                  reg_class_names[to]);
34863       dbg_cost_ctrl--;
34864     }
34865
34866   return ret;
34867 }
34868
34869 /* A C expressions returning the cost of moving data of MODE from a register to
34870    or from memory.  */
34871
34872 static int
34873 rs6000_memory_move_cost (machine_mode mode, reg_class_t rclass,
34874                          bool in ATTRIBUTE_UNUSED)
34875 {
34876   int ret;
34877
34878   if (TARGET_DEBUG_COST)
34879     dbg_cost_ctrl++;
34880
34881   if (reg_classes_intersect_p (rclass, GENERAL_REGS))
34882     ret = 4 * hard_regno_nregs (0, mode);
34883   else if ((reg_classes_intersect_p (rclass, FLOAT_REGS)
34884             || reg_classes_intersect_p (rclass, VSX_REGS)))
34885     ret = 4 * hard_regno_nregs (32, mode);
34886   else if (reg_classes_intersect_p (rclass, ALTIVEC_REGS))
34887     ret = 4 * hard_regno_nregs (FIRST_ALTIVEC_REGNO, mode);
34888   else
34889     ret = 4 + rs6000_register_move_cost (mode, rclass, GENERAL_REGS);
34890
34891   if (TARGET_DEBUG_COST)
34892     {
34893       if (dbg_cost_ctrl == 1)
34894         fprintf (stderr,
34895                  "rs6000_memory_move_cost: ret=%d, mode=%s, rclass=%s, in=%d\n",
34896                  ret, GET_MODE_NAME (mode), reg_class_names[rclass], in);
34897       dbg_cost_ctrl--;
34898     }
34899
34900   return ret;
34901 }
34902
34903 /* Implement TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS.
34904
34905    The register allocator chooses GEN_OR_VSX_REGS for the allocno
34906    class if GENERAL_REGS and VSX_REGS cost is lower than the memory
34907    cost.  This happens a lot when TARGET_DIRECT_MOVE makes the register
34908    move cost between GENERAL_REGS and VSX_REGS low.
34909
34910    It might seem reasonable to use a union class.  After all, if usage
34911    of vsr is low and gpr high, it might make sense to spill gpr to vsr
34912    rather than memory.  However, in cases where register pressure of
34913    both is high, like the cactus_adm spec test, allowing
34914    GEN_OR_VSX_REGS as the allocno class results in bad decisions in
34915    the first scheduling pass.  This is partly due to an allocno of
34916    GEN_OR_VSX_REGS wrongly contributing to the GENERAL_REGS pressure
34917    class, which gives too high a pressure for GENERAL_REGS and too low
34918    for VSX_REGS.  So, force a choice of the subclass here.
34919
34920    The best class is also the union if GENERAL_REGS and VSX_REGS have
34921    the same cost.  In that case we do use GEN_OR_VSX_REGS as the
34922    allocno class, since trying to narrow down the class by regno mode
34923    is prone to error.  For example, SImode is allowed in VSX regs and
34924    in some cases (eg. gcc.target/powerpc/p9-xxbr-3.c do_bswap32_vect)
34925    it would be wrong to choose an allocno of GENERAL_REGS based on
34926    SImode.  */
34927
34928 static reg_class_t
34929 rs6000_ira_change_pseudo_allocno_class (int regno ATTRIBUTE_UNUSED,
34930                                         reg_class_t allocno_class,
34931                                         reg_class_t best_class)
34932 {
34933   switch (allocno_class)
34934     {
34935     case GEN_OR_VSX_REGS:
34936       /* best_class must be a subset of allocno_class.  */
34937       gcc_checking_assert (best_class == GEN_OR_VSX_REGS
34938                            || best_class == GEN_OR_FLOAT_REGS
34939                            || best_class == VSX_REGS
34940                            || best_class == ALTIVEC_REGS
34941                            || best_class == FLOAT_REGS
34942                            || best_class == GENERAL_REGS
34943                            || best_class == BASE_REGS);
34944       /* Use best_class but choose wider classes when copying from the
34945          wider class to best_class is cheap.  This mimics IRA choice
34946          of allocno class.  */
34947       if (best_class == BASE_REGS)
34948         return GENERAL_REGS;
34949       if (TARGET_VSX
34950           && (best_class == FLOAT_REGS || best_class == ALTIVEC_REGS))
34951         return VSX_REGS;
34952       return best_class;
34953
34954     default:
34955       break;
34956     }
34957
34958   return allocno_class;
34959 }
34960
34961 /* Returns a code for a target-specific builtin that implements
34962    reciprocal of the function, or NULL_TREE if not available.  */
34963
34964 static tree
34965 rs6000_builtin_reciprocal (tree fndecl)
34966 {
34967   switch (DECL_FUNCTION_CODE (fndecl))
34968     {
34969     case VSX_BUILTIN_XVSQRTDP:
34970       if (!RS6000_RECIP_AUTO_RSQRTE_P (V2DFmode))
34971         return NULL_TREE;
34972
34973       return rs6000_builtin_decls[VSX_BUILTIN_RSQRT_2DF];
34974
34975     case VSX_BUILTIN_XVSQRTSP:
34976       if (!RS6000_RECIP_AUTO_RSQRTE_P (V4SFmode))
34977         return NULL_TREE;
34978
34979       return rs6000_builtin_decls[VSX_BUILTIN_RSQRT_4SF];
34980
34981     default:
34982       return NULL_TREE;
34983     }
34984 }
34985
34986 /* Load up a constant.  If the mode is a vector mode, splat the value across
34987    all of the vector elements.  */
34988
34989 static rtx
34990 rs6000_load_constant_and_splat (machine_mode mode, REAL_VALUE_TYPE dconst)
34991 {
34992   rtx reg;
34993
34994   if (mode == SFmode || mode == DFmode)
34995     {
34996       rtx d = const_double_from_real_value (dconst, mode);
34997       reg = force_reg (mode, d);
34998     }
34999   else if (mode == V4SFmode)
35000     {
35001       rtx d = const_double_from_real_value (dconst, SFmode);
35002       rtvec v = gen_rtvec (4, d, d, d, d);
35003       reg = gen_reg_rtx (mode);
35004       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
35005     }
35006   else if (mode == V2DFmode)
35007     {
35008       rtx d = const_double_from_real_value (dconst, DFmode);
35009       rtvec v = gen_rtvec (2, d, d);
35010       reg = gen_reg_rtx (mode);
35011       rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
35012     }
35013   else
35014     gcc_unreachable ();
35015
35016   return reg;
35017 }
35018
35019 /* Generate an FMA instruction.  */
35020
35021 static void
35022 rs6000_emit_madd (rtx target, rtx m1, rtx m2, rtx a)
35023 {
35024   machine_mode mode = GET_MODE (target);
35025   rtx dst;
35026
35027   dst = expand_ternary_op (mode, fma_optab, m1, m2, a, target, 0);
35028   gcc_assert (dst != NULL);
35029
35030   if (dst != target)
35031     emit_move_insn (target, dst);
35032 }
35033
35034 /* Generate a FNMSUB instruction: dst = -fma(m1, m2, -a).  */
35035
35036 static void
35037 rs6000_emit_nmsub (rtx dst, rtx m1, rtx m2, rtx a)
35038 {
35039   machine_mode mode = GET_MODE (dst);
35040   rtx r;
35041
35042   /* This is a tad more complicated, since the fnma_optab is for
35043      a different expression: fma(-m1, m2, a), which is the same
35044      thing except in the case of signed zeros.
35045
35046      Fortunately we know that if FMA is supported that FNMSUB is
35047      also supported in the ISA.  Just expand it directly.  */
35048
35049   gcc_assert (optab_handler (fma_optab, mode) != CODE_FOR_nothing);
35050
35051   r = gen_rtx_NEG (mode, a);
35052   r = gen_rtx_FMA (mode, m1, m2, r);
35053   r = gen_rtx_NEG (mode, r);
35054   emit_insn (gen_rtx_SET (dst, r));
35055 }
35056
35057 /* Newton-Raphson approximation of floating point divide DST = N/D.  If NOTE_P,
35058    add a reg_note saying that this was a division.  Support both scalar and
35059    vector divide.  Assumes no trapping math and finite arguments.  */
35060
35061 void
35062 rs6000_emit_swdiv (rtx dst, rtx n, rtx d, bool note_p)
35063 {
35064   machine_mode mode = GET_MODE (dst);
35065   rtx one, x0, e0, x1, xprev, eprev, xnext, enext, u, v;
35066   int i;
35067
35068   /* Low precision estimates guarantee 5 bits of accuracy.  High
35069      precision estimates guarantee 14 bits of accuracy.  SFmode
35070      requires 23 bits of accuracy.  DFmode requires 52 bits of
35071      accuracy.  Each pass at least doubles the accuracy, leading
35072      to the following.  */
35073   int passes = (TARGET_RECIP_PRECISION) ? 1 : 3;
35074   if (mode == DFmode || mode == V2DFmode)
35075     passes++;
35076
35077   enum insn_code code = optab_handler (smul_optab, mode);
35078   insn_gen_fn gen_mul = GEN_FCN (code);
35079
35080   gcc_assert (code != CODE_FOR_nothing);
35081
35082   one = rs6000_load_constant_and_splat (mode, dconst1);
35083
35084   /* x0 = 1./d estimate */
35085   x0 = gen_reg_rtx (mode);
35086   emit_insn (gen_rtx_SET (x0, gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
35087                                               UNSPEC_FRES)));
35088
35089   /* Each iteration but the last calculates x_(i+1) = x_i * (2 - d * x_i).  */
35090   if (passes > 1) {
35091
35092     /* e0 = 1. - d * x0  */
35093     e0 = gen_reg_rtx (mode);
35094     rs6000_emit_nmsub (e0, d, x0, one);
35095
35096     /* x1 = x0 + e0 * x0  */
35097     x1 = gen_reg_rtx (mode);
35098     rs6000_emit_madd (x1, e0, x0, x0);
35099
35100     for (i = 0, xprev = x1, eprev = e0; i < passes - 2;
35101          ++i, xprev = xnext, eprev = enext) {
35102       
35103       /* enext = eprev * eprev  */
35104       enext = gen_reg_rtx (mode);
35105       emit_insn (gen_mul (enext, eprev, eprev));
35106
35107       /* xnext = xprev + enext * xprev  */
35108       xnext = gen_reg_rtx (mode);
35109       rs6000_emit_madd (xnext, enext, xprev, xprev);
35110     }
35111
35112   } else
35113     xprev = x0;
35114
35115   /* The last iteration calculates x_(i+1) = n * x_i * (2 - d * x_i).  */
35116
35117   /* u = n * xprev  */
35118   u = gen_reg_rtx (mode);
35119   emit_insn (gen_mul (u, n, xprev));
35120
35121   /* v = n - (d * u)  */
35122   v = gen_reg_rtx (mode);
35123   rs6000_emit_nmsub (v, d, u, n);
35124
35125   /* dst = (v * xprev) + u  */
35126   rs6000_emit_madd (dst, v, xprev, u);
35127
35128   if (note_p)
35129     add_reg_note (get_last_insn (), REG_EQUAL, gen_rtx_DIV (mode, n, d));
35130 }
35131
35132 /* Goldschmidt's Algorithm for single/double-precision floating point
35133    sqrt and rsqrt.  Assumes no trapping math and finite arguments.  */
35134
35135 void
35136 rs6000_emit_swsqrt (rtx dst, rtx src, bool recip)
35137 {
35138   machine_mode mode = GET_MODE (src);
35139   rtx e = gen_reg_rtx (mode);
35140   rtx g = gen_reg_rtx (mode);
35141   rtx h = gen_reg_rtx (mode);
35142
35143   /* Low precision estimates guarantee 5 bits of accuracy.  High
35144      precision estimates guarantee 14 bits of accuracy.  SFmode
35145      requires 23 bits of accuracy.  DFmode requires 52 bits of
35146      accuracy.  Each pass at least doubles the accuracy, leading
35147      to the following.  */
35148   int passes = (TARGET_RECIP_PRECISION) ? 1 : 3;
35149   if (mode == DFmode || mode == V2DFmode)
35150     passes++;
35151
35152   int i;
35153   rtx mhalf;
35154   enum insn_code code = optab_handler (smul_optab, mode);
35155   insn_gen_fn gen_mul = GEN_FCN (code);
35156
35157   gcc_assert (code != CODE_FOR_nothing);
35158
35159   mhalf = rs6000_load_constant_and_splat (mode, dconsthalf);
35160
35161   /* e = rsqrt estimate */
35162   emit_insn (gen_rtx_SET (e, gen_rtx_UNSPEC (mode, gen_rtvec (1, src),
35163                                              UNSPEC_RSQRT)));
35164
35165   /* If (src == 0.0) filter infinity to prevent NaN for sqrt(0.0).  */
35166   if (!recip)
35167     {
35168       rtx zero = force_reg (mode, CONST0_RTX (mode));
35169
35170       if (mode == SFmode)
35171         {
35172           rtx target = emit_conditional_move (e, GT, src, zero, mode,
35173                                               e, zero, mode, 0);
35174           if (target != e)
35175             emit_move_insn (e, target);
35176         }
35177       else
35178         {
35179           rtx cond = gen_rtx_GT (VOIDmode, e, zero);
35180           rs6000_emit_vector_cond_expr (e, e, zero, cond, src, zero);
35181         }
35182     }
35183
35184   /* g = sqrt estimate.  */
35185   emit_insn (gen_mul (g, e, src));
35186   /* h = 1/(2*sqrt) estimate.  */
35187   emit_insn (gen_mul (h, e, mhalf));
35188
35189   if (recip)
35190     {
35191       if (passes == 1)
35192         {
35193           rtx t = gen_reg_rtx (mode);
35194           rs6000_emit_nmsub (t, g, h, mhalf);
35195           /* Apply correction directly to 1/rsqrt estimate.  */
35196           rs6000_emit_madd (dst, e, t, e);
35197         }
35198       else
35199         {
35200           for (i = 0; i < passes; i++)
35201             {
35202               rtx t1 = gen_reg_rtx (mode);
35203               rtx g1 = gen_reg_rtx (mode);
35204               rtx h1 = gen_reg_rtx (mode);
35205
35206               rs6000_emit_nmsub (t1, g, h, mhalf);
35207               rs6000_emit_madd (g1, g, t1, g);
35208               rs6000_emit_madd (h1, h, t1, h);
35209
35210               g = g1;
35211               h = h1;
35212             }
35213           /* Multiply by 2 for 1/rsqrt.  */
35214           emit_insn (gen_add3_insn (dst, h, h));
35215         }
35216     }
35217   else
35218     {
35219       rtx t = gen_reg_rtx (mode);
35220       rs6000_emit_nmsub (t, g, h, mhalf);
35221       rs6000_emit_madd (dst, g, t, g);
35222     }
35223
35224   return;
35225 }
35226
35227 /* Emit popcount intrinsic on TARGET_POPCNTB (Power5) and TARGET_POPCNTD
35228    (Power7) targets.  DST is the target, and SRC is the argument operand.  */
35229
35230 void
35231 rs6000_emit_popcount (rtx dst, rtx src)
35232 {
35233   machine_mode mode = GET_MODE (dst);
35234   rtx tmp1, tmp2;
35235
35236   /* Use the PPC ISA 2.06 popcnt{w,d} instruction if we can.  */
35237   if (TARGET_POPCNTD)
35238     {
35239       if (mode == SImode)
35240         emit_insn (gen_popcntdsi2 (dst, src));
35241       else
35242         emit_insn (gen_popcntddi2 (dst, src));
35243       return;
35244     }
35245
35246   tmp1 = gen_reg_rtx (mode);
35247
35248   if (mode == SImode)
35249     {
35250       emit_insn (gen_popcntbsi2 (tmp1, src));
35251       tmp2 = expand_mult (SImode, tmp1, GEN_INT (0x01010101),
35252                            NULL_RTX, 0);
35253       tmp2 = force_reg (SImode, tmp2);
35254       emit_insn (gen_lshrsi3 (dst, tmp2, GEN_INT (24)));
35255     }
35256   else
35257     {
35258       emit_insn (gen_popcntbdi2 (tmp1, src));
35259       tmp2 = expand_mult (DImode, tmp1,
35260                           GEN_INT ((HOST_WIDE_INT)
35261                                    0x01010101 << 32 | 0x01010101),
35262                           NULL_RTX, 0);
35263       tmp2 = force_reg (DImode, tmp2);
35264       emit_insn (gen_lshrdi3 (dst, tmp2, GEN_INT (56)));
35265     }
35266 }
35267
35268
35269 /* Emit parity intrinsic on TARGET_POPCNTB targets.  DST is the
35270    target, and SRC is the argument operand.  */
35271
35272 void
35273 rs6000_emit_parity (rtx dst, rtx src)
35274 {
35275   machine_mode mode = GET_MODE (dst);
35276   rtx tmp;
35277
35278   tmp = gen_reg_rtx (mode);
35279
35280   /* Use the PPC ISA 2.05 prtyw/prtyd instruction if we can.  */
35281   if (TARGET_CMPB)
35282     {
35283       if (mode == SImode)
35284         {
35285           emit_insn (gen_popcntbsi2 (tmp, src));
35286           emit_insn (gen_paritysi2_cmpb (dst, tmp));
35287         }
35288       else
35289         {
35290           emit_insn (gen_popcntbdi2 (tmp, src));
35291           emit_insn (gen_paritydi2_cmpb (dst, tmp));
35292         }
35293       return;
35294     }
35295
35296   if (mode == SImode)
35297     {
35298       /* Is mult+shift >= shift+xor+shift+xor?  */
35299       if (rs6000_cost->mulsi_const >= COSTS_N_INSNS (3))
35300         {
35301           rtx tmp1, tmp2, tmp3, tmp4;
35302
35303           tmp1 = gen_reg_rtx (SImode);
35304           emit_insn (gen_popcntbsi2 (tmp1, src));
35305
35306           tmp2 = gen_reg_rtx (SImode);
35307           emit_insn (gen_lshrsi3 (tmp2, tmp1, GEN_INT (16)));
35308           tmp3 = gen_reg_rtx (SImode);
35309           emit_insn (gen_xorsi3 (tmp3, tmp1, tmp2));
35310
35311           tmp4 = gen_reg_rtx (SImode);
35312           emit_insn (gen_lshrsi3 (tmp4, tmp3, GEN_INT (8)));
35313           emit_insn (gen_xorsi3 (tmp, tmp3, tmp4));
35314         }
35315       else
35316         rs6000_emit_popcount (tmp, src);
35317       emit_insn (gen_andsi3 (dst, tmp, const1_rtx));
35318     }
35319   else
35320     {
35321       /* Is mult+shift >= shift+xor+shift+xor+shift+xor?  */
35322       if (rs6000_cost->muldi >= COSTS_N_INSNS (5))
35323         {
35324           rtx tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
35325
35326           tmp1 = gen_reg_rtx (DImode);
35327           emit_insn (gen_popcntbdi2 (tmp1, src));
35328
35329           tmp2 = gen_reg_rtx (DImode);
35330           emit_insn (gen_lshrdi3 (tmp2, tmp1, GEN_INT (32)));
35331           tmp3 = gen_reg_rtx (DImode);
35332           emit_insn (gen_xordi3 (tmp3, tmp1, tmp2));
35333
35334           tmp4 = gen_reg_rtx (DImode);
35335           emit_insn (gen_lshrdi3 (tmp4, tmp3, GEN_INT (16)));
35336           tmp5 = gen_reg_rtx (DImode);
35337           emit_insn (gen_xordi3 (tmp5, tmp3, tmp4));
35338
35339           tmp6 = gen_reg_rtx (DImode);
35340           emit_insn (gen_lshrdi3 (tmp6, tmp5, GEN_INT (8)));
35341           emit_insn (gen_xordi3 (tmp, tmp5, tmp6));
35342         }
35343       else
35344         rs6000_emit_popcount (tmp, src);
35345       emit_insn (gen_anddi3 (dst, tmp, const1_rtx));
35346     }
35347 }
35348
35349 /* Expand an Altivec constant permutation for little endian mode.
35350    OP0 and OP1 are the input vectors and TARGET is the output vector.
35351    SEL specifies the constant permutation vector.
35352
35353    There are two issues: First, the two input operands must be
35354    swapped so that together they form a double-wide array in LE
35355    order.  Second, the vperm instruction has surprising behavior
35356    in LE mode:  it interprets the elements of the source vectors
35357    in BE mode ("left to right") and interprets the elements of
35358    the destination vector in LE mode ("right to left").  To
35359    correct for this, we must subtract each element of the permute
35360    control vector from 31.
35361
35362    For example, suppose we want to concatenate vr10 = {0, 1, 2, 3}
35363    with vr11 = {4, 5, 6, 7} and extract {0, 2, 4, 6} using a vperm.
35364    We place {0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27} in vr12 to
35365    serve as the permute control vector.  Then, in BE mode,
35366
35367      vperm 9,10,11,12
35368
35369    places the desired result in vr9.  However, in LE mode the 
35370    vector contents will be
35371
35372      vr10 = 00000003 00000002 00000001 00000000
35373      vr11 = 00000007 00000006 00000005 00000004
35374
35375    The result of the vperm using the same permute control vector is
35376
35377      vr9  = 05000000 07000000 01000000 03000000
35378
35379    That is, the leftmost 4 bytes of vr10 are interpreted as the
35380    source for the rightmost 4 bytes of vr9, and so on.
35381
35382    If we change the permute control vector to
35383
35384      vr12 = {31,20,29,28,23,22,21,20,15,14,13,12,7,6,5,4}
35385
35386    and issue
35387
35388      vperm 9,11,10,12
35389
35390    we get the desired
35391
35392    vr9  = 00000006 00000004 00000002 00000000.  */
35393
35394 static void
35395 altivec_expand_vec_perm_const_le (rtx target, rtx op0, rtx op1,
35396                                   const vec_perm_indices &sel)
35397 {
35398   unsigned int i;
35399   rtx perm[16];
35400   rtx constv, unspec;
35401
35402   /* Unpack and adjust the constant selector.  */
35403   for (i = 0; i < 16; ++i)
35404     {
35405       unsigned int elt = 31 - (sel[i] & 31);
35406       perm[i] = GEN_INT (elt);
35407     }
35408
35409   /* Expand to a permute, swapping the inputs and using the
35410      adjusted selector.  */
35411   if (!REG_P (op0))
35412     op0 = force_reg (V16QImode, op0);
35413   if (!REG_P (op1))
35414     op1 = force_reg (V16QImode, op1);
35415
35416   constv = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, perm));
35417   constv = force_reg (V16QImode, constv);
35418   unspec = gen_rtx_UNSPEC (V16QImode, gen_rtvec (3, op1, op0, constv),
35419                            UNSPEC_VPERM);
35420   if (!REG_P (target))
35421     {
35422       rtx tmp = gen_reg_rtx (V16QImode);
35423       emit_move_insn (tmp, unspec);
35424       unspec = tmp;
35425     }
35426
35427   emit_move_insn (target, unspec);
35428 }
35429
35430 /* Similarly to altivec_expand_vec_perm_const_le, we must adjust the
35431    permute control vector.  But here it's not a constant, so we must
35432    generate a vector NAND or NOR to do the adjustment.  */
35433
35434 void
35435 altivec_expand_vec_perm_le (rtx operands[4])
35436 {
35437   rtx notx, iorx, unspec;
35438   rtx target = operands[0];
35439   rtx op0 = operands[1];
35440   rtx op1 = operands[2];
35441   rtx sel = operands[3];
35442   rtx tmp = target;
35443   rtx norreg = gen_reg_rtx (V16QImode);
35444   machine_mode mode = GET_MODE (target);
35445
35446   /* Get everything in regs so the pattern matches.  */
35447   if (!REG_P (op0))
35448     op0 = force_reg (mode, op0);
35449   if (!REG_P (op1))
35450     op1 = force_reg (mode, op1);
35451   if (!REG_P (sel))
35452     sel = force_reg (V16QImode, sel);
35453   if (!REG_P (target))
35454     tmp = gen_reg_rtx (mode);
35455
35456   if (TARGET_P9_VECTOR)
35457     {
35458       unspec = gen_rtx_UNSPEC (mode, gen_rtvec (3, op1, op0, sel),
35459                                UNSPEC_VPERMR);
35460     }
35461   else
35462     {
35463       /* Invert the selector with a VNAND if available, else a VNOR.
35464          The VNAND is preferred for future fusion opportunities.  */
35465       notx = gen_rtx_NOT (V16QImode, sel);
35466       iorx = (TARGET_P8_VECTOR
35467               ? gen_rtx_IOR (V16QImode, notx, notx)
35468               : gen_rtx_AND (V16QImode, notx, notx));
35469       emit_insn (gen_rtx_SET (norreg, iorx));
35470
35471       /* Permute with operands reversed and adjusted selector.  */
35472       unspec = gen_rtx_UNSPEC (mode, gen_rtvec (3, op1, op0, norreg),
35473                                UNSPEC_VPERM);
35474     }
35475
35476   /* Copy into target, possibly by way of a register.  */
35477   if (!REG_P (target))
35478     {
35479       emit_move_insn (tmp, unspec);
35480       unspec = tmp;
35481     }
35482
35483   emit_move_insn (target, unspec);
35484 }
35485
35486 /* Expand an Altivec constant permutation.  Return true if we match
35487    an efficient implementation; false to fall back to VPERM.
35488
35489    OP0 and OP1 are the input vectors and TARGET is the output vector.
35490    SEL specifies the constant permutation vector.  */
35491
35492 static bool
35493 altivec_expand_vec_perm_const (rtx target, rtx op0, rtx op1,
35494                                const vec_perm_indices &sel)
35495 {
35496   struct altivec_perm_insn {
35497     HOST_WIDE_INT mask;
35498     enum insn_code impl;
35499     unsigned char perm[16];
35500   };
35501   static const struct altivec_perm_insn patterns[] = {
35502     { OPTION_MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum_direct,
35503       {  1,  3,  5,  7,  9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 } },
35504     { OPTION_MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum_direct,
35505       {  2,  3,  6,  7, 10, 11, 14, 15, 18, 19, 22, 23, 26, 27, 30, 31 } },
35506     { OPTION_MASK_ALTIVEC, 
35507       (BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghb_direct
35508        : CODE_FOR_altivec_vmrglb_direct),
35509       {  0, 16,  1, 17,  2, 18,  3, 19,  4, 20,  5, 21,  6, 22,  7, 23 } },
35510     { OPTION_MASK_ALTIVEC,
35511       (BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghh_direct
35512        : CODE_FOR_altivec_vmrglh_direct),
35513       {  0,  1, 16, 17,  2,  3, 18, 19,  4,  5, 20, 21,  6,  7, 22, 23 } },
35514     { OPTION_MASK_ALTIVEC,
35515       (BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghw_direct
35516        : CODE_FOR_altivec_vmrglw_direct),
35517       {  0,  1,  2,  3, 16, 17, 18, 19,  4,  5,  6,  7, 20, 21, 22, 23 } },
35518     { OPTION_MASK_ALTIVEC,
35519       (BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglb_direct
35520        : CODE_FOR_altivec_vmrghb_direct),
35521       {  8, 24,  9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 } },
35522     { OPTION_MASK_ALTIVEC,
35523       (BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglh_direct
35524        : CODE_FOR_altivec_vmrghh_direct),
35525       {  8,  9, 24, 25, 10, 11, 26, 27, 12, 13, 28, 29, 14, 15, 30, 31 } },
35526     { OPTION_MASK_ALTIVEC,
35527       (BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglw_direct
35528        : CODE_FOR_altivec_vmrghw_direct),
35529       {  8,  9, 10, 11, 24, 25, 26, 27, 12, 13, 14, 15, 28, 29, 30, 31 } },
35530     { OPTION_MASK_P8_VECTOR,
35531       (BYTES_BIG_ENDIAN ? CODE_FOR_p8_vmrgew_v4sf_direct
35532        : CODE_FOR_p8_vmrgow_v4sf_direct),
35533       {  0,  1,  2,  3, 16, 17, 18, 19,  8,  9, 10, 11, 24, 25, 26, 27 } },
35534     { OPTION_MASK_P8_VECTOR,
35535       (BYTES_BIG_ENDIAN ? CODE_FOR_p8_vmrgow_v4sf_direct
35536        : CODE_FOR_p8_vmrgew_v4sf_direct),
35537       {  4,  5,  6,  7, 20, 21, 22, 23, 12, 13, 14, 15, 28, 29, 30, 31 } }
35538   };
35539
35540   unsigned int i, j, elt, which;
35541   unsigned char perm[16];
35542   rtx x;
35543   bool one_vec;
35544
35545   /* Unpack the constant selector.  */
35546   for (i = which = 0; i < 16; ++i)
35547     {
35548       elt = sel[i] & 31;
35549       which |= (elt < 16 ? 1 : 2);
35550       perm[i] = elt;
35551     }
35552
35553   /* Simplify the constant selector based on operands.  */
35554   switch (which)
35555     {
35556     default:
35557       gcc_unreachable ();
35558
35559     case 3:
35560       one_vec = false;
35561       if (!rtx_equal_p (op0, op1))
35562         break;
35563       /* FALLTHRU */
35564
35565     case 2:
35566       for (i = 0; i < 16; ++i)
35567         perm[i] &= 15;
35568       op0 = op1;
35569       one_vec = true;
35570       break;
35571
35572     case 1:
35573       op1 = op0;
35574       one_vec = true;
35575       break;
35576     }
35577  
35578   /* Look for splat patterns.  */
35579   if (one_vec)
35580     {
35581       elt = perm[0];
35582
35583       for (i = 0; i < 16; ++i)
35584         if (perm[i] != elt)
35585           break;
35586       if (i == 16)
35587         {
35588           if (!BYTES_BIG_ENDIAN)
35589             elt = 15 - elt;
35590           emit_insn (gen_altivec_vspltb_direct (target, op0, GEN_INT (elt)));
35591           return true;
35592         }
35593
35594       if (elt % 2 == 0)
35595         {
35596           for (i = 0; i < 16; i += 2)
35597             if (perm[i] != elt || perm[i + 1] != elt + 1)
35598               break;
35599           if (i == 16)
35600             {
35601               int field = BYTES_BIG_ENDIAN ? elt / 2 : 7 - elt / 2;
35602               x = gen_reg_rtx (V8HImode);
35603               emit_insn (gen_altivec_vsplth_direct (x, gen_lowpart (V8HImode, op0),
35604                                                     GEN_INT (field)));
35605               emit_move_insn (target, gen_lowpart (V16QImode, x));
35606               return true;
35607             }
35608         }
35609
35610       if (elt % 4 == 0)
35611         {
35612           for (i = 0; i < 16; i += 4)
35613             if (perm[i] != elt
35614                 || perm[i + 1] != elt + 1
35615                 || perm[i + 2] != elt + 2
35616                 || perm[i + 3] != elt + 3)
35617               break;
35618           if (i == 16)
35619             {
35620               int field = BYTES_BIG_ENDIAN ? elt / 4 : 3 - elt / 4;
35621               x = gen_reg_rtx (V4SImode);
35622               emit_insn (gen_altivec_vspltw_direct (x, gen_lowpart (V4SImode, op0),
35623                                                     GEN_INT (field)));
35624               emit_move_insn (target, gen_lowpart (V16QImode, x));
35625               return true;
35626             }
35627         }
35628     }
35629
35630   /* Look for merge and pack patterns.  */
35631   for (j = 0; j < ARRAY_SIZE (patterns); ++j)
35632     {
35633       bool swapped;
35634
35635       if ((patterns[j].mask & rs6000_isa_flags) == 0)
35636         continue;
35637
35638       elt = patterns[j].perm[0];
35639       if (perm[0] == elt)
35640         swapped = false;
35641       else if (perm[0] == elt + 16)
35642         swapped = true;
35643       else
35644         continue;
35645       for (i = 1; i < 16; ++i)
35646         {
35647           elt = patterns[j].perm[i];
35648           if (swapped)
35649             elt = (elt >= 16 ? elt - 16 : elt + 16);
35650           else if (one_vec && elt >= 16)
35651             elt -= 16;
35652           if (perm[i] != elt)
35653             break;
35654         }
35655       if (i == 16)
35656         {
35657           enum insn_code icode = patterns[j].impl;
35658           machine_mode omode = insn_data[icode].operand[0].mode;
35659           machine_mode imode = insn_data[icode].operand[1].mode;
35660
35661           /* For little-endian, don't use vpkuwum and vpkuhum if the
35662              underlying vector type is not V4SI and V8HI, respectively.
35663              For example, using vpkuwum with a V8HI picks up the even
35664              halfwords (BE numbering) when the even halfwords (LE
35665              numbering) are what we need.  */
35666           if (!BYTES_BIG_ENDIAN
35667               && icode == CODE_FOR_altivec_vpkuwum_direct
35668               && ((REG_P (op0)
35669                    && GET_MODE (op0) != V4SImode)
35670                   || (SUBREG_P (op0)
35671                       && GET_MODE (XEXP (op0, 0)) != V4SImode)))
35672             continue;
35673           if (!BYTES_BIG_ENDIAN
35674               && icode == CODE_FOR_altivec_vpkuhum_direct
35675               && ((REG_P (op0)
35676                    && GET_MODE (op0) != V8HImode)
35677                   || (SUBREG_P (op0)
35678                       && GET_MODE (XEXP (op0, 0)) != V8HImode)))
35679             continue;
35680
35681           /* For little-endian, the two input operands must be swapped
35682              (or swapped back) to ensure proper right-to-left numbering
35683              from 0 to 2N-1.  */
35684           if (swapped ^ !BYTES_BIG_ENDIAN)
35685             std::swap (op0, op1);
35686           if (imode != V16QImode)
35687             {
35688               op0 = gen_lowpart (imode, op0);
35689               op1 = gen_lowpart (imode, op1);
35690             }
35691           if (omode == V16QImode)
35692             x = target;
35693           else
35694             x = gen_reg_rtx (omode);
35695           emit_insn (GEN_FCN (icode) (x, op0, op1));
35696           if (omode != V16QImode)
35697             emit_move_insn (target, gen_lowpart (V16QImode, x));
35698           return true;
35699         }
35700     }
35701
35702   if (!BYTES_BIG_ENDIAN)
35703     {
35704       altivec_expand_vec_perm_const_le (target, op0, op1, sel);
35705       return true;
35706     }
35707
35708   return false;
35709 }
35710
35711 /* Expand a VSX Permute Doubleword constant permutation.
35712    Return true if we match an efficient implementation.  */
35713
35714 static bool
35715 rs6000_expand_vec_perm_const_1 (rtx target, rtx op0, rtx op1,
35716                                 unsigned char perm0, unsigned char perm1)
35717 {
35718   rtx x;
35719
35720   /* If both selectors come from the same operand, fold to single op.  */
35721   if ((perm0 & 2) == (perm1 & 2))
35722     {
35723       if (perm0 & 2)
35724         op0 = op1;
35725       else
35726         op1 = op0;
35727     }
35728   /* If both operands are equal, fold to simpler permutation.  */
35729   if (rtx_equal_p (op0, op1))
35730     {
35731       perm0 = perm0 & 1;
35732       perm1 = (perm1 & 1) + 2;
35733     }
35734   /* If the first selector comes from the second operand, swap.  */
35735   else if (perm0 & 2)
35736     {
35737       if (perm1 & 2)
35738         return false;
35739       perm0 -= 2;
35740       perm1 += 2;
35741       std::swap (op0, op1);
35742     }
35743   /* If the second selector does not come from the second operand, fail.  */
35744   else if ((perm1 & 2) == 0)
35745     return false;
35746
35747   /* Success! */
35748   if (target != NULL)
35749     {
35750       machine_mode vmode, dmode;
35751       rtvec v;
35752
35753       vmode = GET_MODE (target);
35754       gcc_assert (GET_MODE_NUNITS (vmode) == 2);
35755       dmode = mode_for_vector (GET_MODE_INNER (vmode), 4).require ();
35756       x = gen_rtx_VEC_CONCAT (dmode, op0, op1);
35757       v = gen_rtvec (2, GEN_INT (perm0), GEN_INT (perm1));
35758       x = gen_rtx_VEC_SELECT (vmode, x, gen_rtx_PARALLEL (VOIDmode, v));
35759       emit_insn (gen_rtx_SET (target, x));
35760     }
35761   return true;
35762 }
35763
35764 /* Implement TARGET_VECTORIZE_VEC_PERM_CONST.  */
35765
35766 static bool
35767 rs6000_vectorize_vec_perm_const (machine_mode vmode, rtx target, rtx op0,
35768                                  rtx op1, const vec_perm_indices &sel)
35769 {
35770   bool testing_p = !target;
35771
35772   /* AltiVec (and thus VSX) can handle arbitrary permutations.  */
35773   if (TARGET_ALTIVEC && testing_p)
35774     return true;
35775
35776   /* Check for ps_merge* or xxpermdi insns.  */
35777   if ((vmode == V2DFmode || vmode == V2DImode) && VECTOR_MEM_VSX_P (vmode))
35778     {
35779       if (testing_p)
35780         {
35781           op0 = gen_raw_REG (vmode, LAST_VIRTUAL_REGISTER + 1);
35782           op1 = gen_raw_REG (vmode, LAST_VIRTUAL_REGISTER + 2);
35783         }
35784       if (rs6000_expand_vec_perm_const_1 (target, op0, op1, sel[0], sel[1]))
35785         return true;
35786     }
35787
35788   if (TARGET_ALTIVEC)
35789     {
35790       /* Force the target-independent code to lower to V16QImode.  */
35791       if (vmode != V16QImode)
35792         return false;
35793       if (altivec_expand_vec_perm_const (target, op0, op1, sel))
35794         return true;
35795     }
35796
35797   return false;
35798 }
35799
35800 /* A subroutine for rs6000_expand_extract_even & rs6000_expand_interleave.
35801    OP0 and OP1 are the input vectors and TARGET is the output vector.
35802    PERM specifies the constant permutation vector.  */
35803
35804 static void
35805 rs6000_do_expand_vec_perm (rtx target, rtx op0, rtx op1,
35806                            machine_mode vmode, const vec_perm_builder &perm)
35807 {
35808   rtx x = expand_vec_perm_const (vmode, op0, op1, perm, BLKmode, target);
35809   if (x != target)
35810     emit_move_insn (target, x);
35811 }
35812
35813 /* Expand an extract even operation.  */
35814
35815 void
35816 rs6000_expand_extract_even (rtx target, rtx op0, rtx op1)
35817 {
35818   machine_mode vmode = GET_MODE (target);
35819   unsigned i, nelt = GET_MODE_NUNITS (vmode);
35820   vec_perm_builder perm (nelt, nelt, 1);
35821
35822   for (i = 0; i < nelt; i++)
35823     perm.quick_push (i * 2);
35824
35825   rs6000_do_expand_vec_perm (target, op0, op1, vmode, perm);
35826 }
35827
35828 /* Expand a vector interleave operation.  */
35829
35830 void
35831 rs6000_expand_interleave (rtx target, rtx op0, rtx op1, bool highp)
35832 {
35833   machine_mode vmode = GET_MODE (target);
35834   unsigned i, high, nelt = GET_MODE_NUNITS (vmode);
35835   vec_perm_builder perm (nelt, nelt, 1);
35836
35837   high = (highp ? 0 : nelt / 2);
35838   for (i = 0; i < nelt / 2; i++)
35839     {
35840       perm.quick_push (i + high);
35841       perm.quick_push (i + nelt + high);
35842     }
35843
35844   rs6000_do_expand_vec_perm (target, op0, op1, vmode, perm);
35845 }
35846
35847 /* Scale a V2DF vector SRC by two to the SCALE and place in TGT.  */
35848 void
35849 rs6000_scale_v2df (rtx tgt, rtx src, int scale)
35850 {
35851   HOST_WIDE_INT hwi_scale (scale);
35852   REAL_VALUE_TYPE r_pow;
35853   rtvec v = rtvec_alloc (2);
35854   rtx elt;
35855   rtx scale_vec = gen_reg_rtx (V2DFmode);
35856   (void)real_powi (&r_pow, DFmode, &dconst2, hwi_scale);
35857   elt = const_double_from_real_value (r_pow, DFmode);
35858   RTVEC_ELT (v, 0) = elt;
35859   RTVEC_ELT (v, 1) = elt;
35860   rs6000_expand_vector_init (scale_vec, gen_rtx_PARALLEL (V2DFmode, v));
35861   emit_insn (gen_mulv2df3 (tgt, src, scale_vec));
35862 }
35863
35864 /* Return an RTX representing where to find the function value of a
35865    function returning MODE.  */
35866 static rtx
35867 rs6000_complex_function_value (machine_mode mode)
35868 {
35869   unsigned int regno;
35870   rtx r1, r2;
35871   machine_mode inner = GET_MODE_INNER (mode);
35872   unsigned int inner_bytes = GET_MODE_UNIT_SIZE (mode);
35873
35874   if (TARGET_FLOAT128_TYPE
35875       && (mode == KCmode
35876           || (mode == TCmode && TARGET_IEEEQUAD)))
35877     regno = ALTIVEC_ARG_RETURN;
35878
35879   else if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT)
35880     regno = FP_ARG_RETURN;
35881
35882   else
35883     {
35884       regno = GP_ARG_RETURN;
35885
35886       /* 32-bit is OK since it'll go in r3/r4.  */
35887       if (TARGET_32BIT && inner_bytes >= 4)
35888         return gen_rtx_REG (mode, regno);
35889     }
35890
35891   if (inner_bytes >= 8)
35892     return gen_rtx_REG (mode, regno);
35893
35894   r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
35895                           const0_rtx);
35896   r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
35897                           GEN_INT (inner_bytes));
35898   return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
35899 }
35900
35901 /* Return an rtx describing a return value of MODE as a PARALLEL
35902    in N_ELTS registers, each of mode ELT_MODE, starting at REGNO,
35903    stride REG_STRIDE.  */
35904
35905 static rtx
35906 rs6000_parallel_return (machine_mode mode,
35907                         int n_elts, machine_mode elt_mode,
35908                         unsigned int regno, unsigned int reg_stride)
35909 {
35910   rtx par = gen_rtx_PARALLEL (mode, rtvec_alloc (n_elts));
35911
35912   int i;
35913   for (i = 0; i < n_elts; i++)
35914     {
35915       rtx r = gen_rtx_REG (elt_mode, regno);
35916       rtx off = GEN_INT (i * GET_MODE_SIZE (elt_mode));
35917       XVECEXP (par, 0, i) = gen_rtx_EXPR_LIST (VOIDmode, r, off);
35918       regno += reg_stride;
35919     }
35920
35921   return par;
35922 }
35923
35924 /* Target hook for TARGET_FUNCTION_VALUE.
35925
35926    An integer value is in r3 and a floating-point value is in fp1,
35927    unless -msoft-float.  */
35928
35929 static rtx
35930 rs6000_function_value (const_tree valtype,
35931                        const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
35932                        bool outgoing ATTRIBUTE_UNUSED)
35933 {
35934   machine_mode mode;
35935   unsigned int regno;
35936   machine_mode elt_mode;
35937   int n_elts;
35938
35939   /* Special handling for structs in darwin64.  */
35940   if (TARGET_MACHO 
35941       && rs6000_darwin64_struct_check_p (TYPE_MODE (valtype), valtype))
35942     {
35943       CUMULATIVE_ARGS valcum;
35944       rtx valret;
35945
35946       valcum.words = 0;
35947       valcum.fregno = FP_ARG_MIN_REG;
35948       valcum.vregno = ALTIVEC_ARG_MIN_REG;
35949       /* Do a trial code generation as if this were going to be passed as
35950          an argument; if any part goes in memory, we return NULL.  */
35951       valret = rs6000_darwin64_record_arg (&valcum, valtype, true, /* retval= */ true);
35952       if (valret)
35953         return valret;
35954       /* Otherwise fall through to standard ABI rules.  */
35955     }
35956
35957   mode = TYPE_MODE (valtype);
35958
35959   /* The ELFv2 ABI returns homogeneous VFP aggregates in registers.  */
35960   if (rs6000_discover_homogeneous_aggregate (mode, valtype, &elt_mode, &n_elts))
35961     {
35962       int first_reg, n_regs;
35963
35964       if (SCALAR_FLOAT_MODE_NOT_VECTOR_P (elt_mode))
35965         {
35966           /* _Decimal128 must use even/odd register pairs.  */
35967           first_reg = (elt_mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
35968           n_regs = (GET_MODE_SIZE (elt_mode) + 7) >> 3;
35969         }
35970       else
35971         {
35972           first_reg = ALTIVEC_ARG_RETURN;
35973           n_regs = 1;
35974         }
35975
35976       return rs6000_parallel_return (mode, n_elts, elt_mode, first_reg, n_regs);
35977     }
35978
35979   /* Some return value types need be split in -mpowerpc64, 32bit ABI.  */
35980   if (TARGET_32BIT && TARGET_POWERPC64)
35981     switch (mode)
35982       {
35983       default:
35984         break;
35985       case E_DImode:
35986       case E_SCmode:
35987       case E_DCmode:
35988       case E_TCmode:
35989         int count = GET_MODE_SIZE (mode) / 4;
35990         return rs6000_parallel_return (mode, count, SImode, GP_ARG_RETURN, 1);
35991       }
35992
35993   if ((INTEGRAL_TYPE_P (valtype)
35994        && GET_MODE_BITSIZE (mode) < (TARGET_32BIT ? 32 : 64))
35995       || POINTER_TYPE_P (valtype))
35996     mode = TARGET_32BIT ? SImode : DImode;
35997
35998   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT)
35999     /* _Decimal128 must use an even/odd register pair.  */
36000     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
36001   else if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT
36002            && !FLOAT128_VECTOR_P (mode))
36003     regno = FP_ARG_RETURN;
36004   else if (TREE_CODE (valtype) == COMPLEX_TYPE
36005            && targetm.calls.split_complex_arg)
36006     return rs6000_complex_function_value (mode);
36007   /* VSX is a superset of Altivec and adds V2DImode/V2DFmode.  Since the same
36008      return register is used in both cases, and we won't see V2DImode/V2DFmode
36009      for pure altivec, combine the two cases.  */
36010   else if ((TREE_CODE (valtype) == VECTOR_TYPE || FLOAT128_VECTOR_P (mode))
36011            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
36012            && ALTIVEC_OR_VSX_VECTOR_MODE (mode))
36013     regno = ALTIVEC_ARG_RETURN;
36014   else
36015     regno = GP_ARG_RETURN;
36016
36017   return gen_rtx_REG (mode, regno);
36018 }
36019
36020 /* Define how to find the value returned by a library function
36021    assuming the value has mode MODE.  */
36022 rtx
36023 rs6000_libcall_value (machine_mode mode)
36024 {
36025   unsigned int regno;
36026
36027   /* Long long return value need be split in -mpowerpc64, 32bit ABI.  */
36028   if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
36029     return rs6000_parallel_return (mode, 2, SImode, GP_ARG_RETURN, 1);
36030
36031   if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT)
36032     /* _Decimal128 must use an even/odd register pair.  */
36033     regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
36034   else if (SCALAR_FLOAT_MODE_NOT_VECTOR_P (mode) && TARGET_HARD_FLOAT)
36035     regno = FP_ARG_RETURN;
36036   /* VSX is a superset of Altivec and adds V2DImode/V2DFmode.  Since the same
36037      return register is used in both cases, and we won't see V2DImode/V2DFmode
36038      for pure altivec, combine the two cases.  */
36039   else if (ALTIVEC_OR_VSX_VECTOR_MODE (mode)
36040            && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
36041     regno = ALTIVEC_ARG_RETURN;
36042   else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
36043     return rs6000_complex_function_value (mode);
36044   else
36045     regno = GP_ARG_RETURN;
36046
36047   return gen_rtx_REG (mode, regno);
36048 }
36049
36050 /* Compute register pressure classes.  We implement the target hook to avoid
36051    IRA picking something like GEN_OR_FLOAT_REGS as a pressure class, which can
36052    lead to incorrect estimates of number of available registers and therefor
36053    increased register pressure/spill.   */
36054 static int
36055 rs6000_compute_pressure_classes (enum reg_class *pressure_classes)
36056 {
36057   int n;
36058
36059   n = 0;
36060   pressure_classes[n++] = GENERAL_REGS;
36061   if (TARGET_VSX)
36062     pressure_classes[n++] = VSX_REGS;
36063   else
36064     {
36065       if (TARGET_ALTIVEC)
36066         pressure_classes[n++] = ALTIVEC_REGS;
36067       if (TARGET_HARD_FLOAT)
36068         pressure_classes[n++] = FLOAT_REGS;
36069     }
36070   pressure_classes[n++] = CR_REGS;
36071   pressure_classes[n++] = SPECIAL_REGS;
36072
36073   return n;
36074 }
36075
36076 /* Given FROM and TO register numbers, say whether this elimination is allowed.
36077    Frame pointer elimination is automatically handled.
36078
36079    For the RS/6000, if frame pointer elimination is being done, we would like
36080    to convert ap into fp, not sp.
36081
36082    We need r30 if -mminimal-toc was specified, and there are constant pool
36083    references.  */
36084
36085 static bool
36086 rs6000_can_eliminate (const int from, const int to)
36087 {
36088   return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
36089           ? ! frame_pointer_needed
36090           : from == RS6000_PIC_OFFSET_TABLE_REGNUM
36091             ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC
36092                 || constant_pool_empty_p ()
36093             : true);
36094 }
36095
36096 /* Define the offset between two registers, FROM to be eliminated and its
36097    replacement TO, at the start of a routine.  */
36098 HOST_WIDE_INT
36099 rs6000_initial_elimination_offset (int from, int to)
36100 {
36101   rs6000_stack_t *info = rs6000_stack_info ();
36102   HOST_WIDE_INT offset;
36103
36104   if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
36105     offset = info->push_p ? 0 : -info->total_size;
36106   else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
36107     {
36108       offset = info->push_p ? 0 : -info->total_size;
36109       if (FRAME_GROWS_DOWNWARD)
36110         offset += info->fixed_size + info->vars_size + info->parm_size;
36111     }
36112   else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
36113     offset = FRAME_GROWS_DOWNWARD
36114              ? info->fixed_size + info->vars_size + info->parm_size
36115              : 0;
36116   else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
36117     offset = info->total_size;
36118   else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
36119     offset = info->push_p ? info->total_size : 0;
36120   else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
36121     offset = 0;
36122   else
36123     gcc_unreachable ();
36124
36125   return offset;
36126 }
36127
36128 /* Fill in sizes of registers used by unwinder.  */
36129
36130 static void
36131 rs6000_init_dwarf_reg_sizes_extra (tree address)
36132 {
36133   if (TARGET_MACHO && ! TARGET_ALTIVEC)
36134     {
36135       int i;
36136       machine_mode mode = TYPE_MODE (char_type_node);
36137       rtx addr = expand_expr (address, NULL_RTX, VOIDmode, EXPAND_NORMAL);
36138       rtx mem = gen_rtx_MEM (BLKmode, addr);
36139       rtx value = gen_int_mode (16, mode);
36140
36141       /* On Darwin, libgcc may be built to run on both G3 and G4/5.
36142          The unwinder still needs to know the size of Altivec registers.  */
36143
36144       for (i = FIRST_ALTIVEC_REGNO; i < LAST_ALTIVEC_REGNO+1; i++)
36145         {
36146           int column = DWARF_REG_TO_UNWIND_COLUMN
36147                 (DWARF2_FRAME_REG_OUT (DWARF_FRAME_REGNUM (i), true));
36148           HOST_WIDE_INT offset = column * GET_MODE_SIZE (mode);
36149
36150           emit_move_insn (adjust_address (mem, mode, offset), value);
36151         }
36152     }
36153 }
36154
36155 /* Map internal gcc register numbers to debug format register numbers.
36156    FORMAT specifies the type of debug register number to use:
36157      0 -- debug information, except for frame-related sections
36158      1 -- DWARF .debug_frame section
36159      2 -- DWARF .eh_frame section  */
36160
36161 unsigned int
36162 rs6000_dbx_register_number (unsigned int regno, unsigned int format)
36163 {
36164   /* On some platforms, we use the standard DWARF register
36165      numbering for .debug_info and .debug_frame.  */
36166   if ((format == 0 && write_symbols == DWARF2_DEBUG) || format == 1)
36167     {
36168 #ifdef RS6000_USE_DWARF_NUMBERING
36169       if (regno <= 31)
36170         return regno;
36171       if (FP_REGNO_P (regno))
36172         return regno - FIRST_FPR_REGNO + 32;
36173       if (ALTIVEC_REGNO_P (regno))
36174         return regno - FIRST_ALTIVEC_REGNO + 1124;
36175       if (regno == LR_REGNO)
36176         return 108;
36177       if (regno == CTR_REGNO)
36178         return 109;
36179       if (regno == CA_REGNO)
36180         return 101;  /* XER */
36181       /* Special handling for CR for .debug_frame: rs6000_emit_prologue has
36182          translated any combination of CR2, CR3, CR4 saves to a save of CR2.
36183          The actual code emitted saves the whole of CR, so we map CR2_REGNO
36184          to the DWARF reg for CR.  */
36185       if (format == 1 && regno == CR2_REGNO)
36186         return 64;
36187       if (CR_REGNO_P (regno))
36188         return regno - CR0_REGNO + 86;
36189       if (regno == VRSAVE_REGNO)
36190         return 356;
36191       if (regno == VSCR_REGNO)
36192         return 67;
36193
36194       /* These do not make much sense.  */
36195       if (regno == FRAME_POINTER_REGNUM)
36196         return 111;
36197       if (regno == ARG_POINTER_REGNUM)
36198         return 67;
36199       if (regno == 64)
36200         return 100;
36201
36202       gcc_unreachable ();
36203 #endif
36204     }
36205
36206   /* We use the GCC 7 (and before) internal number for non-DWARF debug
36207      information, and also for .eh_frame.  */
36208   /* Translate the regnos to their numbers in GCC 7 (and before).  */
36209   if (regno <= 31)
36210     return regno;
36211   if (FP_REGNO_P (regno))
36212     return regno - FIRST_FPR_REGNO + 32;
36213   if (ALTIVEC_REGNO_P (regno))
36214     return regno - FIRST_ALTIVEC_REGNO + 77;
36215   if (regno == LR_REGNO)
36216     return 65;
36217   if (regno == CTR_REGNO)
36218     return 66;
36219   if (regno == CA_REGNO)
36220     return 76;  /* XER */
36221   if (CR_REGNO_P (regno))
36222     return regno - CR0_REGNO + 68;
36223   if (regno == VRSAVE_REGNO)
36224     return 109;
36225   if (regno == VSCR_REGNO)
36226     return 110;
36227
36228   if (regno == FRAME_POINTER_REGNUM)
36229     return 111;
36230   if (regno == ARG_POINTER_REGNUM)
36231     return 67;
36232   if (regno == 64)
36233     return 64;
36234
36235   gcc_unreachable ();
36236 }
36237
36238 /* target hook eh_return_filter_mode */
36239 static scalar_int_mode
36240 rs6000_eh_return_filter_mode (void)
36241 {
36242   return TARGET_32BIT ? SImode : word_mode;
36243 }
36244
36245 /* Target hook for translate_mode_attribute.  */
36246 static machine_mode
36247 rs6000_translate_mode_attribute (machine_mode mode)
36248 {
36249   if ((FLOAT128_IEEE_P (mode)
36250        && ieee128_float_type_node == long_double_type_node)
36251       || (FLOAT128_IBM_P (mode)
36252           && ibm128_float_type_node == long_double_type_node))
36253     return COMPLEX_MODE_P (mode) ? E_TCmode : E_TFmode;
36254   return mode;
36255 }
36256
36257 /* Target hook for scalar_mode_supported_p.  */
36258 static bool
36259 rs6000_scalar_mode_supported_p (scalar_mode mode)
36260 {
36261   /* -m32 does not support TImode.  This is the default, from
36262      default_scalar_mode_supported_p.  For -m32 -mpowerpc64 we want the
36263      same ABI as for -m32.  But default_scalar_mode_supported_p allows
36264      integer modes of precision 2 * BITS_PER_WORD, which matches TImode
36265      for -mpowerpc64.  */
36266   if (TARGET_32BIT && mode == TImode)
36267     return false;
36268
36269   if (DECIMAL_FLOAT_MODE_P (mode))
36270     return default_decimal_float_supported_p ();
36271   else if (TARGET_FLOAT128_TYPE && (mode == KFmode || mode == IFmode))
36272     return true;
36273   else
36274     return default_scalar_mode_supported_p (mode);
36275 }
36276
36277 /* Target hook for vector_mode_supported_p.  */
36278 static bool
36279 rs6000_vector_mode_supported_p (machine_mode mode)
36280 {
36281   /* There is no vector form for IEEE 128-bit.  If we return true for IEEE
36282      128-bit, the compiler might try to widen IEEE 128-bit to IBM
36283      double-double.  */
36284   if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode) && !FLOAT128_IEEE_P (mode))
36285     return true;
36286
36287   else
36288     return false;
36289 }
36290
36291 /* Target hook for floatn_mode.  */
36292 static opt_scalar_float_mode
36293 rs6000_floatn_mode (int n, bool extended)
36294 {
36295   if (extended)
36296     {
36297       switch (n)
36298         {
36299         case 32:
36300           return DFmode;
36301
36302         case 64:
36303           if (TARGET_FLOAT128_TYPE)
36304             return (FLOAT128_IEEE_P (TFmode)) ? TFmode : KFmode;
36305           else
36306             return opt_scalar_float_mode ();
36307
36308         case 128:
36309           return opt_scalar_float_mode ();
36310
36311         default:
36312           /* Those are the only valid _FloatNx types.  */
36313           gcc_unreachable ();
36314         }
36315     }
36316   else
36317     {
36318       switch (n)
36319         {
36320         case 32:
36321           return SFmode;
36322
36323         case 64:
36324           return DFmode;
36325
36326         case 128:
36327           if (TARGET_FLOAT128_TYPE)
36328             return (FLOAT128_IEEE_P (TFmode)) ? TFmode : KFmode;
36329           else
36330             return opt_scalar_float_mode ();
36331
36332         default:
36333           return opt_scalar_float_mode ();
36334         }
36335     }
36336
36337 }
36338
36339 /* Target hook for c_mode_for_suffix.  */
36340 static machine_mode
36341 rs6000_c_mode_for_suffix (char suffix)
36342 {
36343   if (TARGET_FLOAT128_TYPE)
36344     {
36345       if (suffix == 'q' || suffix == 'Q')
36346         return (FLOAT128_IEEE_P (TFmode)) ? TFmode : KFmode;
36347
36348       /* At the moment, we are not defining a suffix for IBM extended double.
36349          If/when the default for -mabi=ieeelongdouble is changed, and we want
36350          to support __ibm128 constants in legacy library code, we may need to
36351          re-evalaute this decision.  Currently, c-lex.c only supports 'w' and
36352          'q' as machine dependent suffixes.  The x86_64 port uses 'w' for
36353          __float80 constants.  */
36354     }
36355
36356   return VOIDmode;
36357 }
36358
36359 /* Target hook for invalid_arg_for_unprototyped_fn. */
36360 static const char *
36361 invalid_arg_for_unprototyped_fn (const_tree typelist, const_tree funcdecl, const_tree val)
36362 {
36363   return (!rs6000_darwin64_abi
36364           && typelist == 0
36365           && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
36366           && (funcdecl == NULL_TREE
36367               || (TREE_CODE (funcdecl) == FUNCTION_DECL
36368                   && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
36369           ? N_("AltiVec argument passed to unprototyped function")
36370           : NULL;
36371 }
36372
36373 /* For TARGET_SECURE_PLT 32-bit PIC code we can save PIC register
36374    setup by using __stack_chk_fail_local hidden function instead of
36375    calling __stack_chk_fail directly.  Otherwise it is better to call
36376    __stack_chk_fail directly.  */
36377
36378 static tree ATTRIBUTE_UNUSED
36379 rs6000_stack_protect_fail (void)
36380 {
36381   return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
36382          ? default_hidden_stack_protect_fail ()
36383          : default_external_stack_protect_fail ();
36384 }
36385
36386 /* Implement the TARGET_ASAN_SHADOW_OFFSET hook.  */
36387
36388 #if TARGET_ELF
36389 static unsigned HOST_WIDE_INT
36390 rs6000_asan_shadow_offset (void)
36391 {
36392   return (unsigned HOST_WIDE_INT) 1 << (TARGET_64BIT ? 41 : 29);
36393 }
36394 #endif
36395 \f
36396 /* Mask options that we want to support inside of attribute((target)) and
36397    #pragma GCC target operations.  Note, we do not include things like
36398    64/32-bit, endianness, hard/soft floating point, etc. that would have
36399    different calling sequences.  */
36400
36401 struct rs6000_opt_mask {
36402   const char *name;             /* option name */
36403   HOST_WIDE_INT mask;           /* mask to set */
36404   bool invert;                  /* invert sense of mask */
36405   bool valid_target;            /* option is a target option */
36406 };
36407
36408 static struct rs6000_opt_mask const rs6000_opt_masks[] =
36409 {
36410   { "altivec",                  OPTION_MASK_ALTIVEC,            false, true  },
36411   { "cmpb",                     OPTION_MASK_CMPB,               false, true  },
36412   { "crypto",                   OPTION_MASK_CRYPTO,             false, true  },
36413   { "direct-move",              OPTION_MASK_DIRECT_MOVE,        false, true  },
36414   { "dlmzb",                    OPTION_MASK_DLMZB,              false, true  },
36415   { "efficient-unaligned-vsx",  OPTION_MASK_EFFICIENT_UNALIGNED_VSX,
36416                                                                 false, true  },
36417   { "float128",                 OPTION_MASK_FLOAT128_KEYWORD,   false, true  },
36418   { "float128-hardware",        OPTION_MASK_FLOAT128_HW,        false, true  },
36419   { "fprnd",                    OPTION_MASK_FPRND,              false, true  },
36420   { "future",                   OPTION_MASK_FUTURE,             false, true  },
36421   { "hard-dfp",                 OPTION_MASK_DFP,                false, true  },
36422   { "htm",                      OPTION_MASK_HTM,                false, true  },
36423   { "isel",                     OPTION_MASK_ISEL,               false, true  },
36424   { "mfcrf",                    OPTION_MASK_MFCRF,              false, true  },
36425   { "mfpgpr",                   0,                              false, true  },
36426   { "modulo",                   OPTION_MASK_MODULO,             false, true  },
36427   { "mulhw",                    OPTION_MASK_MULHW,              false, true  },
36428   { "multiple",                 OPTION_MASK_MULTIPLE,           false, true  },
36429   { "pcrel",                    OPTION_MASK_PCREL,              false, true  },
36430   { "popcntb",                  OPTION_MASK_POPCNTB,            false, true  },
36431   { "popcntd",                  OPTION_MASK_POPCNTD,            false, true  },
36432   { "power8-fusion",            OPTION_MASK_P8_FUSION,          false, true  },
36433   { "power8-fusion-sign",       OPTION_MASK_P8_FUSION_SIGN,     false, true  },
36434   { "power8-vector",            OPTION_MASK_P8_VECTOR,          false, true  },
36435   { "power9-minmax",            OPTION_MASK_P9_MINMAX,          false, true  },
36436   { "power9-misc",              OPTION_MASK_P9_MISC,            false, true  },
36437   { "power9-vector",            OPTION_MASK_P9_VECTOR,          false, true  },
36438   { "powerpc-gfxopt",           OPTION_MASK_PPC_GFXOPT,         false, true  },
36439   { "powerpc-gpopt",            OPTION_MASK_PPC_GPOPT,          false, true  },
36440   { "prefixed-addr",            OPTION_MASK_PREFIXED_ADDR,      false, true  },
36441   { "quad-memory",              OPTION_MASK_QUAD_MEMORY,        false, true  },
36442   { "quad-memory-atomic",       OPTION_MASK_QUAD_MEMORY_ATOMIC, false, true  },
36443   { "recip-precision",          OPTION_MASK_RECIP_PRECISION,    false, true  },
36444   { "save-toc-indirect",        OPTION_MASK_SAVE_TOC_INDIRECT,  false, true  },
36445   { "string",                   0,                              false, true  },
36446   { "update",                   OPTION_MASK_NO_UPDATE,          true , true  },
36447   { "vsx",                      OPTION_MASK_VSX,                false, true  },
36448 #ifdef OPTION_MASK_64BIT
36449 #if TARGET_AIX_OS
36450   { "aix64",                    OPTION_MASK_64BIT,              false, false },
36451   { "aix32",                    OPTION_MASK_64BIT,              true,  false },
36452 #else
36453   { "64",                       OPTION_MASK_64BIT,              false, false },
36454   { "32",                       OPTION_MASK_64BIT,              true,  false },
36455 #endif
36456 #endif
36457 #ifdef OPTION_MASK_EABI
36458   { "eabi",                     OPTION_MASK_EABI,               false, false },
36459 #endif
36460 #ifdef OPTION_MASK_LITTLE_ENDIAN
36461   { "little",                   OPTION_MASK_LITTLE_ENDIAN,      false, false },
36462   { "big",                      OPTION_MASK_LITTLE_ENDIAN,      true,  false },
36463 #endif
36464 #ifdef OPTION_MASK_RELOCATABLE
36465   { "relocatable",              OPTION_MASK_RELOCATABLE,        false, false },
36466 #endif
36467 #ifdef OPTION_MASK_STRICT_ALIGN
36468   { "strict-align",             OPTION_MASK_STRICT_ALIGN,       false, false },
36469 #endif
36470   { "soft-float",               OPTION_MASK_SOFT_FLOAT,         false, false },
36471   { "string",                   0,                              false, false },
36472 };
36473
36474 /* Builtin mask mapping for printing the flags.  */
36475 static struct rs6000_opt_mask const rs6000_builtin_mask_names[] =
36476 {
36477   { "altivec",           RS6000_BTM_ALTIVEC,    false, false },
36478   { "vsx",               RS6000_BTM_VSX,        false, false },
36479   { "fre",               RS6000_BTM_FRE,        false, false },
36480   { "fres",              RS6000_BTM_FRES,       false, false },
36481   { "frsqrte",           RS6000_BTM_FRSQRTE,    false, false },
36482   { "frsqrtes",          RS6000_BTM_FRSQRTES,   false, false },
36483   { "popcntd",           RS6000_BTM_POPCNTD,    false, false },
36484   { "cell",              RS6000_BTM_CELL,       false, false },
36485   { "power8-vector",     RS6000_BTM_P8_VECTOR,  false, false },
36486   { "power9-vector",     RS6000_BTM_P9_VECTOR,  false, false },
36487   { "power9-misc",       RS6000_BTM_P9_MISC,    false, false },
36488   { "crypto",            RS6000_BTM_CRYPTO,     false, false },
36489   { "htm",               RS6000_BTM_HTM,        false, false },
36490   { "hard-dfp",          RS6000_BTM_DFP,        false, false },
36491   { "hard-float",        RS6000_BTM_HARD_FLOAT, false, false },
36492   { "long-double-128",   RS6000_BTM_LDBL128,    false, false },
36493   { "powerpc64",         RS6000_BTM_POWERPC64,  false, false },
36494   { "float128",          RS6000_BTM_FLOAT128,   false, false },
36495   { "float128-hw",       RS6000_BTM_FLOAT128_HW,false, false },
36496 };
36497
36498 /* Option variables that we want to support inside attribute((target)) and
36499    #pragma GCC target operations.  */
36500
36501 struct rs6000_opt_var {
36502   const char *name;             /* option name */
36503   size_t global_offset;         /* offset of the option in global_options.  */
36504   size_t target_offset;         /* offset of the option in target options.  */
36505 };
36506
36507 static struct rs6000_opt_var const rs6000_opt_vars[] =
36508 {
36509   { "friz",
36510     offsetof (struct gcc_options, x_TARGET_FRIZ),
36511     offsetof (struct cl_target_option, x_TARGET_FRIZ), },
36512   { "avoid-indexed-addresses",
36513     offsetof (struct gcc_options, x_TARGET_AVOID_XFORM),
36514     offsetof (struct cl_target_option, x_TARGET_AVOID_XFORM) },
36515   { "longcall",
36516     offsetof (struct gcc_options, x_rs6000_default_long_calls),
36517     offsetof (struct cl_target_option, x_rs6000_default_long_calls), },
36518   { "optimize-swaps",
36519     offsetof (struct gcc_options, x_rs6000_optimize_swaps),
36520     offsetof (struct cl_target_option, x_rs6000_optimize_swaps), },
36521   { "allow-movmisalign",
36522     offsetof (struct gcc_options, x_TARGET_ALLOW_MOVMISALIGN),
36523     offsetof (struct cl_target_option, x_TARGET_ALLOW_MOVMISALIGN), },
36524   { "sched-groups",
36525     offsetof (struct gcc_options, x_TARGET_SCHED_GROUPS),
36526     offsetof (struct cl_target_option, x_TARGET_SCHED_GROUPS), },
36527   { "always-hint",
36528     offsetof (struct gcc_options, x_TARGET_ALWAYS_HINT),
36529     offsetof (struct cl_target_option, x_TARGET_ALWAYS_HINT), },
36530   { "align-branch-targets",
36531     offsetof (struct gcc_options, x_TARGET_ALIGN_BRANCH_TARGETS),
36532     offsetof (struct cl_target_option, x_TARGET_ALIGN_BRANCH_TARGETS), },
36533   { "tls-markers",
36534     offsetof (struct gcc_options, x_tls_markers),
36535     offsetof (struct cl_target_option, x_tls_markers), },
36536   { "sched-prolog",
36537     offsetof (struct gcc_options, x_TARGET_SCHED_PROLOG),
36538     offsetof (struct cl_target_option, x_TARGET_SCHED_PROLOG), },
36539   { "sched-epilog",
36540     offsetof (struct gcc_options, x_TARGET_SCHED_PROLOG),
36541     offsetof (struct cl_target_option, x_TARGET_SCHED_PROLOG), },
36542   { "speculate-indirect-jumps",
36543     offsetof (struct gcc_options, x_rs6000_speculate_indirect_jumps),
36544     offsetof (struct cl_target_option, x_rs6000_speculate_indirect_jumps), },
36545 };
36546
36547 /* Inner function to handle attribute((target("..."))) and #pragma GCC target
36548    parsing.  Return true if there were no errors.  */
36549
36550 static bool
36551 rs6000_inner_target_options (tree args, bool attr_p)
36552 {
36553   bool ret = true;
36554
36555   if (args == NULL_TREE)
36556     ;
36557
36558   else if (TREE_CODE (args) == STRING_CST)
36559     {
36560       char *p = ASTRDUP (TREE_STRING_POINTER (args));
36561       char *q;
36562
36563       while ((q = strtok (p, ",")) != NULL)
36564         {
36565           bool error_p = false;
36566           bool not_valid_p = false;
36567           const char *cpu_opt = NULL;
36568
36569           p = NULL;
36570           if (strncmp (q, "cpu=", 4) == 0)
36571             {
36572               int cpu_index = rs6000_cpu_name_lookup (q+4);
36573               if (cpu_index >= 0)
36574                 rs6000_cpu_index = cpu_index;
36575               else
36576                 {
36577                   error_p = true;
36578                   cpu_opt = q+4;
36579                 }
36580             }
36581           else if (strncmp (q, "tune=", 5) == 0)
36582             {
36583               int tune_index = rs6000_cpu_name_lookup (q+5);
36584               if (tune_index >= 0)
36585                 rs6000_tune_index = tune_index;
36586               else
36587                 {
36588                   error_p = true;
36589                   cpu_opt = q+5;
36590                 }
36591             }
36592           else
36593             {
36594               size_t i;
36595               bool invert = false;
36596               char *r = q;
36597
36598               error_p = true;
36599               if (strncmp (r, "no-", 3) == 0)
36600                 {
36601                   invert = true;
36602                   r += 3;
36603                 }
36604
36605               for (i = 0; i < ARRAY_SIZE (rs6000_opt_masks); i++)
36606                 if (strcmp (r, rs6000_opt_masks[i].name) == 0)
36607                   {
36608                     HOST_WIDE_INT mask = rs6000_opt_masks[i].mask;
36609
36610                     if (!rs6000_opt_masks[i].valid_target)
36611                       not_valid_p = true;
36612                     else
36613                       {
36614                         error_p = false;
36615                         rs6000_isa_flags_explicit |= mask;
36616
36617                         /* VSX needs altivec, so -mvsx automagically sets
36618                            altivec and disables -mavoid-indexed-addresses.  */
36619                         if (!invert)
36620                           {
36621                             if (mask == OPTION_MASK_VSX)
36622                               {
36623                                 mask |= OPTION_MASK_ALTIVEC;
36624                                 TARGET_AVOID_XFORM = 0;
36625                               }
36626                           }
36627
36628                         if (rs6000_opt_masks[i].invert)
36629                           invert = !invert;
36630
36631                         if (invert)
36632                           rs6000_isa_flags &= ~mask;
36633                         else
36634                           rs6000_isa_flags |= mask;
36635                       }
36636                     break;
36637                   }
36638
36639               if (error_p && !not_valid_p)
36640                 {
36641                   for (i = 0; i < ARRAY_SIZE (rs6000_opt_vars); i++)
36642                     if (strcmp (r, rs6000_opt_vars[i].name) == 0)
36643                       {
36644                         size_t j = rs6000_opt_vars[i].global_offset;
36645                         *((int *) ((char *)&global_options + j)) = !invert;
36646                         error_p = false;
36647                         not_valid_p = false;
36648                         break;
36649                       }
36650                 }
36651             }
36652
36653           if (error_p)
36654             {
36655               const char *eprefix, *esuffix;
36656
36657               ret = false;
36658               if (attr_p)
36659                 {
36660                   eprefix = "__attribute__((__target__(";
36661                   esuffix = ")))";
36662                 }
36663               else
36664                 {
36665                   eprefix = "#pragma GCC target ";
36666                   esuffix = "";
36667                 }
36668
36669               if (cpu_opt)
36670                 error ("invalid cpu %qs for %s%qs%s", cpu_opt, eprefix,
36671                        q, esuffix);
36672               else if (not_valid_p)
36673                 error ("%s%qs%s is not allowed", eprefix, q, esuffix);
36674               else
36675                 error ("%s%qs%s is invalid", eprefix, q, esuffix);
36676             }
36677         }
36678     }
36679
36680   else if (TREE_CODE (args) == TREE_LIST)
36681     {
36682       do
36683         {
36684           tree value = TREE_VALUE (args);
36685           if (value)
36686             {
36687               bool ret2 = rs6000_inner_target_options (value, attr_p);
36688               if (!ret2)
36689                 ret = false;
36690             }
36691           args = TREE_CHAIN (args);
36692         }
36693       while (args != NULL_TREE);
36694     }
36695
36696   else
36697     {
36698       error ("attribute %<target%> argument not a string");
36699       return false;
36700     }
36701
36702   return ret;
36703 }
36704
36705 /* Print out the target options as a list for -mdebug=target.  */
36706
36707 static void
36708 rs6000_debug_target_options (tree args, const char *prefix)
36709 {
36710   if (args == NULL_TREE)
36711     fprintf (stderr, "%s<NULL>", prefix);
36712
36713   else if (TREE_CODE (args) == STRING_CST)
36714     {
36715       char *p = ASTRDUP (TREE_STRING_POINTER (args));
36716       char *q;
36717
36718       while ((q = strtok (p, ",")) != NULL)
36719         {
36720           p = NULL;
36721           fprintf (stderr, "%s\"%s\"", prefix, q);
36722           prefix = ", ";
36723         }
36724     }
36725
36726   else if (TREE_CODE (args) == TREE_LIST)
36727     {
36728       do
36729         {
36730           tree value = TREE_VALUE (args);
36731           if (value)
36732             {
36733               rs6000_debug_target_options (value, prefix);
36734               prefix = ", ";
36735             }
36736           args = TREE_CHAIN (args);
36737         }
36738       while (args != NULL_TREE);
36739     }
36740
36741   else
36742     gcc_unreachable ();
36743
36744   return;
36745 }
36746
36747 \f
36748 /* Hook to validate attribute((target("..."))).  */
36749
36750 static bool
36751 rs6000_valid_attribute_p (tree fndecl,
36752                           tree ARG_UNUSED (name),
36753                           tree args,
36754                           int flags)
36755 {
36756   struct cl_target_option cur_target;
36757   bool ret;
36758   tree old_optimize;
36759   tree new_target, new_optimize;
36760   tree func_optimize;
36761
36762   gcc_assert ((fndecl != NULL_TREE) && (args != NULL_TREE));
36763
36764   if (TARGET_DEBUG_TARGET)
36765     {
36766       tree tname = DECL_NAME (fndecl);
36767       fprintf (stderr, "\n==================== rs6000_valid_attribute_p:\n");
36768       if (tname)
36769         fprintf (stderr, "function: %.*s\n",
36770                  (int) IDENTIFIER_LENGTH (tname),
36771                  IDENTIFIER_POINTER (tname));
36772       else
36773         fprintf (stderr, "function: unknown\n");
36774   
36775       fprintf (stderr, "args:");
36776       rs6000_debug_target_options (args, " ");
36777       fprintf (stderr, "\n");
36778
36779       if (flags)
36780         fprintf (stderr, "flags: 0x%x\n", flags);
36781
36782       fprintf (stderr, "--------------------\n");
36783     }
36784
36785   /* attribute((target("default"))) does nothing, beyond
36786      affecting multi-versioning.  */
36787   if (TREE_VALUE (args)
36788       && TREE_CODE (TREE_VALUE (args)) == STRING_CST
36789       && TREE_CHAIN (args) == NULL_TREE
36790       && strcmp (TREE_STRING_POINTER (TREE_VALUE (args)), "default") == 0)
36791     return true;
36792
36793   old_optimize = build_optimization_node (&global_options);
36794   func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
36795
36796   /* If the function changed the optimization levels as well as setting target
36797      options, start with the optimizations specified.  */
36798   if (func_optimize && func_optimize != old_optimize)
36799     cl_optimization_restore (&global_options,
36800                              TREE_OPTIMIZATION (func_optimize));
36801
36802   /* The target attributes may also change some optimization flags, so update
36803      the optimization options if necessary.  */
36804   cl_target_option_save (&cur_target, &global_options);
36805   rs6000_cpu_index = rs6000_tune_index = -1;
36806   ret = rs6000_inner_target_options (args, true);
36807
36808   /* Set up any additional state.  */
36809   if (ret)
36810     {
36811       ret = rs6000_option_override_internal (false);
36812       new_target = build_target_option_node (&global_options);
36813     }
36814   else
36815     new_target = NULL;
36816
36817   new_optimize = build_optimization_node (&global_options);
36818
36819   if (!new_target)
36820     ret = false;
36821
36822   else if (fndecl)
36823     {
36824       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
36825
36826       if (old_optimize != new_optimize)
36827         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
36828     }
36829
36830   cl_target_option_restore (&global_options, &cur_target);
36831
36832   if (old_optimize != new_optimize)
36833     cl_optimization_restore (&global_options,
36834                              TREE_OPTIMIZATION (old_optimize));
36835
36836   return ret;
36837 }
36838
36839 \f
36840 /* Hook to validate the current #pragma GCC target and set the state, and
36841    update the macros based on what was changed.  If ARGS is NULL, then
36842    POP_TARGET is used to reset the options.  */
36843
36844 bool
36845 rs6000_pragma_target_parse (tree args, tree pop_target)
36846 {
36847   tree prev_tree = build_target_option_node (&global_options);
36848   tree cur_tree;
36849   struct cl_target_option *prev_opt, *cur_opt;
36850   HOST_WIDE_INT prev_flags, cur_flags, diff_flags;
36851   HOST_WIDE_INT prev_bumask, cur_bumask, diff_bumask;
36852
36853   if (TARGET_DEBUG_TARGET)
36854     {
36855       fprintf (stderr, "\n==================== rs6000_pragma_target_parse\n");
36856       fprintf (stderr, "args:");
36857       rs6000_debug_target_options (args, " ");
36858       fprintf (stderr, "\n");
36859
36860       if (pop_target)
36861         {
36862           fprintf (stderr, "pop_target:\n");
36863           debug_tree (pop_target);
36864         }
36865       else
36866         fprintf (stderr, "pop_target: <NULL>\n");
36867
36868       fprintf (stderr, "--------------------\n");
36869     }
36870
36871   if (! args)
36872     {
36873       cur_tree = ((pop_target)
36874                   ? pop_target
36875                   : target_option_default_node);
36876       cl_target_option_restore (&global_options,
36877                                 TREE_TARGET_OPTION (cur_tree));
36878     }
36879   else
36880     {
36881       rs6000_cpu_index = rs6000_tune_index = -1;
36882       if (!rs6000_inner_target_options (args, false)
36883           || !rs6000_option_override_internal (false)
36884           || (cur_tree = build_target_option_node (&global_options))
36885              == NULL_TREE)
36886         {
36887           if (TARGET_DEBUG_BUILTIN || TARGET_DEBUG_TARGET)
36888             fprintf (stderr, "invalid pragma\n");
36889
36890           return false;
36891         }
36892     }
36893
36894   target_option_current_node = cur_tree;
36895   rs6000_activate_target_options (target_option_current_node);
36896
36897   /* If we have the preprocessor linked in (i.e. C or C++ languages), possibly
36898      change the macros that are defined.  */
36899   if (rs6000_target_modify_macros_ptr)
36900     {
36901       prev_opt    = TREE_TARGET_OPTION (prev_tree);
36902       prev_bumask = prev_opt->x_rs6000_builtin_mask;
36903       prev_flags  = prev_opt->x_rs6000_isa_flags;
36904
36905       cur_opt     = TREE_TARGET_OPTION (cur_tree);
36906       cur_flags   = cur_opt->x_rs6000_isa_flags;
36907       cur_bumask  = cur_opt->x_rs6000_builtin_mask;
36908
36909       diff_bumask = (prev_bumask ^ cur_bumask);
36910       diff_flags  = (prev_flags ^ cur_flags);
36911
36912       if ((diff_flags != 0) || (diff_bumask != 0))
36913         {
36914           /* Delete old macros.  */
36915           rs6000_target_modify_macros_ptr (false,
36916                                            prev_flags & diff_flags,
36917                                            prev_bumask & diff_bumask);
36918
36919           /* Define new macros.  */
36920           rs6000_target_modify_macros_ptr (true,
36921                                            cur_flags & diff_flags,
36922                                            cur_bumask & diff_bumask);
36923         }
36924     }
36925
36926   return true;
36927 }
36928
36929 \f
36930 /* Remember the last target of rs6000_set_current_function.  */
36931 static GTY(()) tree rs6000_previous_fndecl;
36932
36933 /* Restore target's globals from NEW_TREE and invalidate the
36934    rs6000_previous_fndecl cache.  */
36935
36936 void
36937 rs6000_activate_target_options (tree new_tree)
36938 {
36939   cl_target_option_restore (&global_options, TREE_TARGET_OPTION (new_tree));
36940   if (TREE_TARGET_GLOBALS (new_tree))
36941     restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
36942   else if (new_tree == target_option_default_node)
36943     restore_target_globals (&default_target_globals);
36944   else
36945     TREE_TARGET_GLOBALS (new_tree) = save_target_globals_default_opts ();
36946   rs6000_previous_fndecl = NULL_TREE;
36947 }
36948
36949 /* Establish appropriate back-end context for processing the function
36950    FNDECL.  The argument might be NULL to indicate processing at top
36951    level, outside of any function scope.  */
36952 static void
36953 rs6000_set_current_function (tree fndecl)
36954 {
36955   if (TARGET_DEBUG_TARGET)
36956     {
36957       fprintf (stderr, "\n==================== rs6000_set_current_function");
36958
36959       if (fndecl)
36960         fprintf (stderr, ", fndecl %s (%p)",
36961                  (DECL_NAME (fndecl)
36962                   ? IDENTIFIER_POINTER (DECL_NAME (fndecl))
36963                   : "<unknown>"), (void *)fndecl);
36964
36965       if (rs6000_previous_fndecl)
36966         fprintf (stderr, ", prev_fndecl (%p)", (void *)rs6000_previous_fndecl);
36967
36968       fprintf (stderr, "\n");
36969     }
36970
36971   /* Only change the context if the function changes.  This hook is called
36972      several times in the course of compiling a function, and we don't want to
36973      slow things down too much or call target_reinit when it isn't safe.  */
36974   if (fndecl == rs6000_previous_fndecl)
36975     return;
36976
36977   tree old_tree;
36978   if (rs6000_previous_fndecl == NULL_TREE)
36979     old_tree = target_option_current_node;
36980   else if (DECL_FUNCTION_SPECIFIC_TARGET (rs6000_previous_fndecl))
36981     old_tree = DECL_FUNCTION_SPECIFIC_TARGET (rs6000_previous_fndecl);
36982   else
36983     old_tree = target_option_default_node;
36984
36985   tree new_tree;
36986   if (fndecl == NULL_TREE)
36987     {
36988       if (old_tree != target_option_current_node)
36989         new_tree = target_option_current_node;
36990       else
36991         new_tree = NULL_TREE;
36992     }
36993   else
36994     {
36995       new_tree = DECL_FUNCTION_SPECIFIC_TARGET (fndecl);
36996       if (new_tree == NULL_TREE)
36997         new_tree = target_option_default_node;
36998     }
36999
37000   if (TARGET_DEBUG_TARGET)
37001     {
37002       if (new_tree)
37003         {
37004           fprintf (stderr, "\nnew fndecl target specific options:\n");
37005           debug_tree (new_tree);
37006         }
37007
37008       if (old_tree)
37009         {
37010           fprintf (stderr, "\nold fndecl target specific options:\n");
37011           debug_tree (old_tree);
37012         }
37013
37014       if (old_tree != NULL_TREE || new_tree != NULL_TREE)
37015         fprintf (stderr, "--------------------\n");
37016     }
37017
37018   if (new_tree && old_tree != new_tree)
37019     rs6000_activate_target_options (new_tree);
37020
37021   if (fndecl)
37022     rs6000_previous_fndecl = fndecl;
37023 }
37024
37025 \f
37026 /* Save the current options */
37027
37028 static void
37029 rs6000_function_specific_save (struct cl_target_option *ptr,
37030                                struct gcc_options *opts)
37031 {
37032   ptr->x_rs6000_isa_flags = opts->x_rs6000_isa_flags;
37033   ptr->x_rs6000_isa_flags_explicit = opts->x_rs6000_isa_flags_explicit;
37034 }
37035
37036 /* Restore the current options */
37037
37038 static void
37039 rs6000_function_specific_restore (struct gcc_options *opts,
37040                                   struct cl_target_option *ptr)
37041                                   
37042 {
37043   opts->x_rs6000_isa_flags = ptr->x_rs6000_isa_flags;
37044   opts->x_rs6000_isa_flags_explicit = ptr->x_rs6000_isa_flags_explicit;
37045   (void) rs6000_option_override_internal (false);
37046 }
37047
37048 /* Print the current options */
37049
37050 static void
37051 rs6000_function_specific_print (FILE *file, int indent,
37052                                 struct cl_target_option *ptr)
37053 {
37054   rs6000_print_isa_options (file, indent, "Isa options set",
37055                             ptr->x_rs6000_isa_flags);
37056
37057   rs6000_print_isa_options (file, indent, "Isa options explicit",
37058                             ptr->x_rs6000_isa_flags_explicit);
37059 }
37060
37061 /* Helper function to print the current isa or misc options on a line.  */
37062
37063 static void
37064 rs6000_print_options_internal (FILE *file,
37065                                int indent,
37066                                const char *string,
37067                                HOST_WIDE_INT flags,
37068                                const char *prefix,
37069                                const struct rs6000_opt_mask *opts,
37070                                size_t num_elements)
37071 {
37072   size_t i;
37073   size_t start_column = 0;
37074   size_t cur_column;
37075   size_t max_column = 120;
37076   size_t prefix_len = strlen (prefix);
37077   size_t comma_len = 0;
37078   const char *comma = "";
37079
37080   if (indent)
37081     start_column += fprintf (file, "%*s", indent, "");
37082
37083   if (!flags)
37084     {
37085       fprintf (stderr, DEBUG_FMT_S, string, "<none>");
37086       return;
37087     }
37088
37089   start_column += fprintf (stderr, DEBUG_FMT_WX, string, flags);
37090
37091   /* Print the various mask options.  */
37092   cur_column = start_column;
37093   for (i = 0; i < num_elements; i++)
37094     {
37095       bool invert = opts[i].invert;
37096       const char *name = opts[i].name;
37097       const char *no_str = "";
37098       HOST_WIDE_INT mask = opts[i].mask;
37099       size_t len = comma_len + prefix_len + strlen (name);
37100
37101       if (!invert)
37102         {
37103           if ((flags & mask) == 0)
37104             {
37105               no_str = "no-";
37106               len += sizeof ("no-") - 1;
37107             }
37108
37109           flags &= ~mask;
37110         }
37111
37112       else
37113         {
37114           if ((flags & mask) != 0)
37115             {
37116               no_str = "no-";
37117               len += sizeof ("no-") - 1;
37118             }
37119
37120           flags |= mask;
37121         }
37122
37123       cur_column += len;
37124       if (cur_column > max_column)
37125         {
37126           fprintf (stderr, ", \\\n%*s", (int)start_column, "");
37127           cur_column = start_column + len;
37128           comma = "";
37129         }
37130
37131       fprintf (file, "%s%s%s%s", comma, prefix, no_str, name);
37132       comma = ", ";
37133       comma_len = sizeof (", ") - 1;
37134     }
37135
37136   fputs ("\n", file);
37137 }
37138
37139 /* Helper function to print the current isa options on a line.  */
37140
37141 static void
37142 rs6000_print_isa_options (FILE *file, int indent, const char *string,
37143                           HOST_WIDE_INT flags)
37144 {
37145   rs6000_print_options_internal (file, indent, string, flags, "-m",
37146                                  &rs6000_opt_masks[0],
37147                                  ARRAY_SIZE (rs6000_opt_masks));
37148 }
37149
37150 static void
37151 rs6000_print_builtin_options (FILE *file, int indent, const char *string,
37152                               HOST_WIDE_INT flags)
37153 {
37154   rs6000_print_options_internal (file, indent, string, flags, "",
37155                                  &rs6000_builtin_mask_names[0],
37156                                  ARRAY_SIZE (rs6000_builtin_mask_names));
37157 }
37158
37159 /* If the user used -mno-vsx, we need turn off all of the implicit ISA 2.06,
37160    2.07, and 3.0 options that relate to the vector unit (-mdirect-move,
37161    -mupper-regs-df, etc.).
37162
37163    If the user used -mno-power8-vector, we need to turn off all of the implicit
37164    ISA 2.07 and 3.0 options that relate to the vector unit.
37165
37166    If the user used -mno-power9-vector, we need to turn off all of the implicit
37167    ISA 3.0 options that relate to the vector unit.
37168
37169    This function does not handle explicit options such as the user specifying
37170    -mdirect-move.  These are handled in rs6000_option_override_internal, and
37171    the appropriate error is given if needed.
37172
37173    We return a mask of all of the implicit options that should not be enabled
37174    by default.  */
37175
37176 static HOST_WIDE_INT
37177 rs6000_disable_incompatible_switches (void)
37178 {
37179   HOST_WIDE_INT ignore_masks = rs6000_isa_flags_explicit;
37180   size_t i, j;
37181
37182   static const struct {
37183     const HOST_WIDE_INT no_flag;        /* flag explicitly turned off.  */
37184     const HOST_WIDE_INT dep_flags;      /* flags that depend on this option.  */
37185     const char *const name;             /* name of the switch.  */
37186   } flags[] = {
37187     { OPTION_MASK_P9_VECTOR,    OTHER_P9_VECTOR_MASKS,  "power9-vector" },
37188     { OPTION_MASK_P8_VECTOR,    OTHER_P8_VECTOR_MASKS,  "power8-vector" },
37189     { OPTION_MASK_VSX,          OTHER_VSX_VECTOR_MASKS, "vsx"           },
37190   };
37191
37192   for (i = 0; i < ARRAY_SIZE (flags); i++)
37193     {
37194       HOST_WIDE_INT no_flag = flags[i].no_flag;
37195
37196       if ((rs6000_isa_flags & no_flag) == 0
37197           && (rs6000_isa_flags_explicit & no_flag) != 0)
37198         {
37199           HOST_WIDE_INT dep_flags = flags[i].dep_flags;
37200           HOST_WIDE_INT set_flags = (rs6000_isa_flags_explicit
37201                                      & rs6000_isa_flags
37202                                      & dep_flags);
37203
37204           if (set_flags)
37205             {
37206               for (j = 0; j < ARRAY_SIZE (rs6000_opt_masks); j++)
37207                 if ((set_flags & rs6000_opt_masks[j].mask) != 0)
37208                   {
37209                     set_flags &= ~rs6000_opt_masks[j].mask;
37210                     error ("%<-mno-%s%> turns off %<-m%s%>",
37211                            flags[i].name,
37212                            rs6000_opt_masks[j].name);
37213                   }
37214
37215               gcc_assert (!set_flags);
37216             }
37217
37218           rs6000_isa_flags &= ~dep_flags;
37219           ignore_masks |= no_flag | dep_flags;
37220         }
37221     }
37222
37223   return ignore_masks;
37224 }
37225
37226 \f
37227 /* Helper function for printing the function name when debugging.  */
37228
37229 static const char *
37230 get_decl_name (tree fn)
37231 {
37232   tree name;
37233
37234   if (!fn)
37235     return "<null>";
37236
37237   name = DECL_NAME (fn);
37238   if (!name)
37239     return "<no-name>";
37240
37241   return IDENTIFIER_POINTER (name);
37242 }
37243
37244 /* Return the clone id of the target we are compiling code for in a target
37245    clone.  The clone id is ordered from 0 (default) to CLONE_MAX-1 and gives
37246    the priority list for the target clones (ordered from lowest to
37247    highest).  */
37248
37249 static int
37250 rs6000_clone_priority (tree fndecl)
37251 {
37252   tree fn_opts = DECL_FUNCTION_SPECIFIC_TARGET (fndecl);
37253   HOST_WIDE_INT isa_masks;
37254   int ret = CLONE_DEFAULT;
37255   tree attrs = lookup_attribute ("target", DECL_ATTRIBUTES (fndecl));
37256   const char *attrs_str = NULL;
37257
37258   attrs = TREE_VALUE (TREE_VALUE (attrs));
37259   attrs_str = TREE_STRING_POINTER (attrs);
37260
37261   /* Return priority zero for default function.  Return the ISA needed for the
37262      function if it is not the default.  */
37263   if (strcmp (attrs_str, "default") != 0)
37264     {
37265       if (fn_opts == NULL_TREE)
37266         fn_opts = target_option_default_node;
37267
37268       if (!fn_opts || !TREE_TARGET_OPTION (fn_opts))
37269         isa_masks = rs6000_isa_flags;
37270       else
37271         isa_masks = TREE_TARGET_OPTION (fn_opts)->x_rs6000_isa_flags;
37272
37273       for (ret = CLONE_MAX - 1; ret != 0; ret--)
37274         if ((rs6000_clone_map[ret].isa_mask & isa_masks) != 0)
37275           break;
37276     }
37277
37278   if (TARGET_DEBUG_TARGET)
37279     fprintf (stderr, "rs6000_get_function_version_priority (%s) => %d\n",
37280              get_decl_name (fndecl), ret);
37281
37282   return ret;
37283 }
37284
37285 /* This compares the priority of target features in function DECL1 and DECL2.
37286    It returns positive value if DECL1 is higher priority, negative value if
37287    DECL2 is higher priority and 0 if they are the same.  Note, priorities are
37288    ordered from lowest (CLONE_DEFAULT) to highest (currently CLONE_ISA_3_0).  */
37289
37290 static int
37291 rs6000_compare_version_priority (tree decl1, tree decl2)
37292 {
37293   int priority1 = rs6000_clone_priority (decl1);
37294   int priority2 = rs6000_clone_priority (decl2);
37295   int ret = priority1 - priority2;
37296
37297   if (TARGET_DEBUG_TARGET)
37298     fprintf (stderr, "rs6000_compare_version_priority (%s, %s) => %d\n",
37299              get_decl_name (decl1), get_decl_name (decl2), ret);
37300
37301   return ret;
37302 }
37303
37304 /* Make a dispatcher declaration for the multi-versioned function DECL.
37305    Calls to DECL function will be replaced with calls to the dispatcher
37306    by the front-end.  Returns the decl of the dispatcher function.  */
37307
37308 static tree
37309 rs6000_get_function_versions_dispatcher (void *decl)
37310 {
37311   tree fn = (tree) decl;
37312   struct cgraph_node *node = NULL;
37313   struct cgraph_node *default_node = NULL;
37314   struct cgraph_function_version_info *node_v = NULL;
37315   struct cgraph_function_version_info *first_v = NULL;
37316
37317   tree dispatch_decl = NULL;
37318
37319   struct cgraph_function_version_info *default_version_info = NULL;
37320   gcc_assert (fn != NULL && DECL_FUNCTION_VERSIONED (fn));
37321
37322   if (TARGET_DEBUG_TARGET)
37323     fprintf (stderr, "rs6000_get_function_versions_dispatcher (%s)\n",
37324              get_decl_name (fn));
37325
37326   node = cgraph_node::get (fn);
37327   gcc_assert (node != NULL);
37328
37329   node_v = node->function_version ();
37330   gcc_assert (node_v != NULL);
37331
37332   if (node_v->dispatcher_resolver != NULL)
37333     return node_v->dispatcher_resolver;
37334
37335   /* Find the default version and make it the first node.  */
37336   first_v = node_v;
37337   /* Go to the beginning of the chain.  */
37338   while (first_v->prev != NULL)
37339     first_v = first_v->prev;
37340
37341   default_version_info = first_v;
37342   while (default_version_info != NULL)
37343     {
37344       const tree decl2 = default_version_info->this_node->decl;
37345       if (is_function_default_version (decl2))
37346         break;
37347       default_version_info = default_version_info->next;
37348     }
37349
37350   /* If there is no default node, just return NULL.  */
37351   if (default_version_info == NULL)
37352     return NULL;
37353
37354   /* Make default info the first node.  */
37355   if (first_v != default_version_info)
37356     {
37357       default_version_info->prev->next = default_version_info->next;
37358       if (default_version_info->next)
37359         default_version_info->next->prev = default_version_info->prev;
37360       first_v->prev = default_version_info;
37361       default_version_info->next = first_v;
37362       default_version_info->prev = NULL;
37363     }
37364
37365   default_node = default_version_info->this_node;
37366
37367 #ifndef TARGET_LIBC_PROVIDES_HWCAP_IN_TCB
37368   error_at (DECL_SOURCE_LOCATION (default_node->decl),
37369             "%<target_clones%> attribute needs GLIBC (2.23 and newer) that "
37370             "exports hardware capability bits");
37371 #else
37372
37373   if (targetm.has_ifunc_p ())
37374     {
37375       struct cgraph_function_version_info *it_v = NULL;
37376       struct cgraph_node *dispatcher_node = NULL;
37377       struct cgraph_function_version_info *dispatcher_version_info = NULL;
37378
37379       /* Right now, the dispatching is done via ifunc.  */
37380       dispatch_decl = make_dispatcher_decl (default_node->decl);
37381
37382       dispatcher_node = cgraph_node::get_create (dispatch_decl);
37383       gcc_assert (dispatcher_node != NULL);
37384       dispatcher_node->dispatcher_function = 1;
37385       dispatcher_version_info
37386         = dispatcher_node->insert_new_function_version ();
37387       dispatcher_version_info->next = default_version_info;
37388       dispatcher_node->definition = 1;
37389
37390       /* Set the dispatcher for all the versions.  */
37391       it_v = default_version_info;
37392       while (it_v != NULL)
37393         {
37394           it_v->dispatcher_resolver = dispatch_decl;
37395           it_v = it_v->next;
37396         }
37397     }
37398   else
37399     {
37400       error_at (DECL_SOURCE_LOCATION (default_node->decl),
37401                 "multiversioning needs ifunc which is not supported "
37402                 "on this target");
37403     }
37404 #endif
37405
37406   return dispatch_decl;
37407 }
37408
37409 /* Make the resolver function decl to dispatch the versions of a multi-
37410    versioned function, DEFAULT_DECL.  Create an empty basic block in the
37411    resolver and store the pointer in EMPTY_BB.  Return the decl of the resolver
37412    function.  */
37413
37414 static tree
37415 make_resolver_func (const tree default_decl,
37416                     const tree dispatch_decl,
37417                     basic_block *empty_bb)
37418 {
37419   /* Make the resolver function static.  The resolver function returns
37420      void *.  */
37421   tree decl_name = clone_function_name (default_decl, "resolver");
37422   const char *resolver_name = IDENTIFIER_POINTER (decl_name);
37423   tree type = build_function_type_list (ptr_type_node, NULL_TREE);
37424   tree decl = build_fn_decl (resolver_name, type);
37425   SET_DECL_ASSEMBLER_NAME (decl, decl_name);
37426
37427   DECL_NAME (decl) = decl_name;
37428   TREE_USED (decl) = 1;
37429   DECL_ARTIFICIAL (decl) = 1;
37430   DECL_IGNORED_P (decl) = 0;
37431   TREE_PUBLIC (decl) = 0;
37432   DECL_UNINLINABLE (decl) = 1;
37433
37434   /* Resolver is not external, body is generated.  */
37435   DECL_EXTERNAL (decl) = 0;
37436   DECL_EXTERNAL (dispatch_decl) = 0;
37437
37438   DECL_CONTEXT (decl) = NULL_TREE;
37439   DECL_INITIAL (decl) = make_node (BLOCK);
37440   DECL_STATIC_CONSTRUCTOR (decl) = 0;
37441
37442   /* Build result decl and add to function_decl.  */
37443   tree t = build_decl (UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE, ptr_type_node);
37444   DECL_CONTEXT (t) = decl;
37445   DECL_ARTIFICIAL (t) = 1;
37446   DECL_IGNORED_P (t) = 1;
37447   DECL_RESULT (decl) = t;
37448
37449   gimplify_function_tree (decl);
37450   push_cfun (DECL_STRUCT_FUNCTION (decl));
37451   *empty_bb = init_lowered_empty_function (decl, false,
37452                                            profile_count::uninitialized ());
37453
37454   cgraph_node::add_new_function (decl, true);
37455   symtab->call_cgraph_insertion_hooks (cgraph_node::get_create (decl));
37456
37457   pop_cfun ();
37458
37459   /* Mark dispatch_decl as "ifunc" with resolver as resolver_name.  */
37460   DECL_ATTRIBUTES (dispatch_decl)
37461     = make_attribute ("ifunc", resolver_name, DECL_ATTRIBUTES (dispatch_decl));
37462
37463   cgraph_node::create_same_body_alias (dispatch_decl, decl);
37464
37465   return decl;
37466 }
37467
37468 /* This adds a condition to the basic_block NEW_BB in function FUNCTION_DECL to
37469    return a pointer to VERSION_DECL if we are running on a machine that
37470    supports the index CLONE_ISA hardware architecture bits.  This function will
37471    be called during version dispatch to decide which function version to
37472    execute.  It returns the basic block at the end, to which more conditions
37473    can be added.  */
37474
37475 static basic_block
37476 add_condition_to_bb (tree function_decl, tree version_decl,
37477                      int clone_isa, basic_block new_bb)
37478 {
37479   push_cfun (DECL_STRUCT_FUNCTION (function_decl));
37480
37481   gcc_assert (new_bb != NULL);
37482   gimple_seq gseq = bb_seq (new_bb);
37483
37484
37485   tree convert_expr = build1 (CONVERT_EXPR, ptr_type_node,
37486                               build_fold_addr_expr (version_decl));
37487   tree result_var = create_tmp_var (ptr_type_node);
37488   gimple *convert_stmt = gimple_build_assign (result_var, convert_expr);
37489   gimple *return_stmt = gimple_build_return (result_var);
37490
37491   if (clone_isa == CLONE_DEFAULT)
37492     {
37493       gimple_seq_add_stmt (&gseq, convert_stmt);
37494       gimple_seq_add_stmt (&gseq, return_stmt);
37495       set_bb_seq (new_bb, gseq);
37496       gimple_set_bb (convert_stmt, new_bb);
37497       gimple_set_bb (return_stmt, new_bb);
37498       pop_cfun ();
37499       return new_bb;
37500     }
37501
37502   tree bool_zero = build_int_cst (bool_int_type_node, 0);
37503   tree cond_var = create_tmp_var (bool_int_type_node);
37504   tree predicate_decl = rs6000_builtin_decls [(int) RS6000_BUILTIN_CPU_SUPPORTS];
37505   const char *arg_str = rs6000_clone_map[clone_isa].name;
37506   tree predicate_arg = build_string_literal (strlen (arg_str) + 1, arg_str);
37507   gimple *call_cond_stmt = gimple_build_call (predicate_decl, 1, predicate_arg);
37508   gimple_call_set_lhs (call_cond_stmt, cond_var);
37509
37510   gimple_set_block (call_cond_stmt, DECL_INITIAL (function_decl));
37511   gimple_set_bb (call_cond_stmt, new_bb);
37512   gimple_seq_add_stmt (&gseq, call_cond_stmt);
37513
37514   gimple *if_else_stmt = gimple_build_cond (NE_EXPR, cond_var, bool_zero,
37515                                             NULL_TREE, NULL_TREE);
37516   gimple_set_block (if_else_stmt, DECL_INITIAL (function_decl));
37517   gimple_set_bb (if_else_stmt, new_bb);
37518   gimple_seq_add_stmt (&gseq, if_else_stmt);
37519
37520   gimple_seq_add_stmt (&gseq, convert_stmt);
37521   gimple_seq_add_stmt (&gseq, return_stmt);
37522   set_bb_seq (new_bb, gseq);
37523
37524   basic_block bb1 = new_bb;
37525   edge e12 = split_block (bb1, if_else_stmt);
37526   basic_block bb2 = e12->dest;
37527   e12->flags &= ~EDGE_FALLTHRU;
37528   e12->flags |= EDGE_TRUE_VALUE;
37529
37530   edge e23 = split_block (bb2, return_stmt);
37531   gimple_set_bb (convert_stmt, bb2);
37532   gimple_set_bb (return_stmt, bb2);
37533
37534   basic_block bb3 = e23->dest;
37535   make_edge (bb1, bb3, EDGE_FALSE_VALUE);
37536
37537   remove_edge (e23);
37538   make_edge (bb2, EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
37539
37540   pop_cfun ();
37541   return bb3;
37542 }
37543
37544 /* This function generates the dispatch function for multi-versioned functions.
37545    DISPATCH_DECL is the function which will contain the dispatch logic.
37546    FNDECLS are the function choices for dispatch, and is a tree chain.
37547    EMPTY_BB is the basic block pointer in DISPATCH_DECL in which the dispatch
37548    code is generated.  */
37549
37550 static int
37551 dispatch_function_versions (tree dispatch_decl,
37552                             void *fndecls_p,
37553                             basic_block *empty_bb)
37554 {
37555   int ix;
37556   tree ele;
37557   vec<tree> *fndecls;
37558   tree clones[CLONE_MAX];
37559
37560   if (TARGET_DEBUG_TARGET)
37561     fputs ("dispatch_function_versions, top\n", stderr);
37562
37563   gcc_assert (dispatch_decl != NULL
37564               && fndecls_p != NULL
37565               && empty_bb != NULL);
37566
37567   /* fndecls_p is actually a vector.  */
37568   fndecls = static_cast<vec<tree> *> (fndecls_p);
37569
37570   /* At least one more version other than the default.  */
37571   gcc_assert (fndecls->length () >= 2);
37572
37573   /* The first version in the vector is the default decl.  */
37574   memset ((void *) clones, '\0', sizeof (clones));
37575   clones[CLONE_DEFAULT] = (*fndecls)[0];
37576
37577   /* On the PowerPC, we do not need to call __builtin_cpu_init, which is a NOP
37578      on the PowerPC (on the x86_64, it is not a NOP).  The builtin function
37579      __builtin_cpu_support ensures that the TOC fields are setup by requiring a
37580      recent glibc.  If we ever need to call __builtin_cpu_init, we would need
37581      to insert the code here to do the call.  */
37582
37583   for (ix = 1; fndecls->iterate (ix, &ele); ++ix)
37584     {
37585       int priority = rs6000_clone_priority (ele);
37586       if (!clones[priority])
37587         clones[priority] = ele;
37588     }
37589
37590   for (ix = CLONE_MAX - 1; ix >= 0; ix--)
37591     if (clones[ix])
37592       {
37593         if (TARGET_DEBUG_TARGET)
37594           fprintf (stderr, "dispatch_function_versions, clone %d, %s\n",
37595                    ix, get_decl_name (clones[ix]));
37596
37597         *empty_bb = add_condition_to_bb (dispatch_decl, clones[ix], ix,
37598                                          *empty_bb);
37599       }
37600
37601   return 0;
37602 }
37603
37604 /* Generate the dispatching code body to dispatch multi-versioned function
37605    DECL.  The target hook is called to process the "target" attributes and
37606    provide the code to dispatch the right function at run-time.  NODE points
37607    to the dispatcher decl whose body will be created.  */
37608
37609 static tree
37610 rs6000_generate_version_dispatcher_body (void *node_p)
37611 {
37612   tree resolver;
37613   basic_block empty_bb;
37614   struct cgraph_node *node = (cgraph_node *) node_p;
37615   struct cgraph_function_version_info *ninfo = node->function_version ();
37616
37617   if (ninfo->dispatcher_resolver)
37618     return ninfo->dispatcher_resolver;
37619
37620   /* node is going to be an alias, so remove the finalized bit.  */
37621   node->definition = false;
37622
37623   /* The first version in the chain corresponds to the default version.  */
37624   ninfo->dispatcher_resolver = resolver
37625     = make_resolver_func (ninfo->next->this_node->decl, node->decl, &empty_bb);
37626
37627   if (TARGET_DEBUG_TARGET)
37628     fprintf (stderr, "rs6000_get_function_versions_dispatcher, %s\n",
37629              get_decl_name (resolver));
37630
37631   push_cfun (DECL_STRUCT_FUNCTION (resolver));
37632   auto_vec<tree, 2> fn_ver_vec;
37633
37634   for (struct cgraph_function_version_info *vinfo = ninfo->next;
37635        vinfo;
37636        vinfo = vinfo->next)
37637     {
37638       struct cgraph_node *version = vinfo->this_node;
37639       /* Check for virtual functions here again, as by this time it should
37640          have been determined if this function needs a vtable index or
37641          not.  This happens for methods in derived classes that override
37642          virtual methods in base classes but are not explicitly marked as
37643          virtual.  */
37644       if (DECL_VINDEX (version->decl))
37645         sorry ("Virtual function multiversioning not supported");
37646
37647       fn_ver_vec.safe_push (version->decl);
37648     }
37649
37650   dispatch_function_versions (resolver, &fn_ver_vec, &empty_bb);
37651   cgraph_edge::rebuild_edges ();
37652   pop_cfun ();
37653   return resolver;
37654 }
37655
37656 \f
37657 /* Hook to determine if one function can safely inline another.  */
37658
37659 static bool
37660 rs6000_can_inline_p (tree caller, tree callee)
37661 {
37662   bool ret = false;
37663   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
37664   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
37665
37666   /* If callee has no option attributes, then it is ok to inline.  */
37667   if (!callee_tree)
37668     ret = true;
37669
37670   /* If caller has no option attributes, but callee does then it is not ok to
37671      inline.  */
37672   else if (!caller_tree)
37673     ret = false;
37674
37675   else
37676     {
37677       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
37678       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
37679
37680       /* Callee's options should a subset of the caller's, i.e. a vsx function
37681          can inline an altivec function but a non-vsx function can't inline a
37682          vsx function.  */
37683       if ((caller_opts->x_rs6000_isa_flags & callee_opts->x_rs6000_isa_flags)
37684           == callee_opts->x_rs6000_isa_flags)
37685         ret = true;
37686     }
37687
37688   if (TARGET_DEBUG_TARGET)
37689     fprintf (stderr, "rs6000_can_inline_p:, caller %s, callee %s, %s inline\n",
37690              get_decl_name (caller), get_decl_name (callee),
37691              (ret ? "can" : "cannot"));
37692
37693   return ret;
37694 }
37695 \f
37696 /* Allocate a stack temp and fixup the address so it meets the particular
37697    memory requirements (either offetable or REG+REG addressing).  */
37698
37699 rtx
37700 rs6000_allocate_stack_temp (machine_mode mode,
37701                             bool offsettable_p,
37702                             bool reg_reg_p)
37703 {
37704   rtx stack = assign_stack_temp (mode, GET_MODE_SIZE (mode));
37705   rtx addr = XEXP (stack, 0);
37706   int strict_p = reload_completed;
37707
37708   if (!legitimate_indirect_address_p (addr, strict_p))
37709     {
37710       if (offsettable_p
37711           && !rs6000_legitimate_offset_address_p (mode, addr, strict_p, true))
37712         stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
37713
37714       else if (reg_reg_p && !legitimate_indexed_address_p (addr, strict_p))
37715         stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
37716     }
37717
37718   return stack;
37719 }
37720
37721 /* Given a memory reference, if it is not a reg or reg+reg addressing,
37722    convert to such a form to deal with memory reference instructions
37723    like STFIWX and LDBRX that only take reg+reg addressing.  */
37724
37725 rtx
37726 rs6000_force_indexed_or_indirect_mem (rtx x)
37727 {
37728   machine_mode mode = GET_MODE (x);
37729
37730   gcc_assert (MEM_P (x));
37731   if (can_create_pseudo_p () && !indexed_or_indirect_operand (x, mode))
37732     {
37733       rtx addr = XEXP (x, 0);
37734       if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
37735         {
37736           rtx reg = XEXP (addr, 0);
37737           HOST_WIDE_INT size = GET_MODE_SIZE (GET_MODE (x));
37738           rtx size_rtx = GEN_INT ((GET_CODE (addr) == PRE_DEC) ? -size : size);
37739           gcc_assert (REG_P (reg));
37740           emit_insn (gen_add3_insn (reg, reg, size_rtx));
37741           addr = reg;
37742         }
37743       else if (GET_CODE (addr) == PRE_MODIFY)
37744         {
37745           rtx reg = XEXP (addr, 0);
37746           rtx expr = XEXP (addr, 1);
37747           gcc_assert (REG_P (reg));
37748           gcc_assert (GET_CODE (expr) == PLUS);
37749           emit_insn (gen_add3_insn (reg, XEXP (expr, 0), XEXP (expr, 1)));
37750           addr = reg;
37751         }
37752
37753       x = replace_equiv_address (x, force_reg (Pmode, addr));
37754     }
37755
37756   return x;
37757 }
37758
37759 /* Implement TARGET_LEGITIMATE_CONSTANT_P.
37760
37761    On the RS/6000, all integer constants are acceptable, most won't be valid
37762    for particular insns, though.  Only easy FP constants are acceptable.  */
37763
37764 static bool
37765 rs6000_legitimate_constant_p (machine_mode mode, rtx x)
37766 {
37767   if (TARGET_ELF && tls_referenced_p (x))
37768     return false;
37769
37770   if (CONST_DOUBLE_P (x))
37771     return easy_fp_constant (x, mode);
37772
37773   if (GET_CODE (x) == CONST_VECTOR)
37774     return easy_vector_constant (x, mode);
37775
37776   return true;
37777 }
37778
37779 \f
37780 /* Return TRUE iff the sequence ending in LAST sets the static chain.  */
37781
37782 static bool
37783 chain_already_loaded (rtx_insn *last)
37784 {
37785   for (; last != NULL; last = PREV_INSN (last))
37786     {
37787       if (NONJUMP_INSN_P (last))
37788         {
37789           rtx patt = PATTERN (last);
37790
37791           if (GET_CODE (patt) == SET)
37792             {
37793               rtx lhs = XEXP (patt, 0);
37794
37795               if (REG_P (lhs) && REGNO (lhs) == STATIC_CHAIN_REGNUM)
37796                 return true;
37797             }
37798         }
37799     }
37800   return false;
37801 }
37802
37803 /* Expand code to perform a call under the AIX or ELFv2 ABI.  */
37804
37805 void
37806 rs6000_call_aix (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
37807 {
37808   rtx func = func_desc;
37809   rtx toc_reg = gen_rtx_REG (Pmode, TOC_REGNUM);
37810   rtx toc_load = NULL_RTX;
37811   rtx toc_restore = NULL_RTX;
37812   rtx func_addr;
37813   rtx abi_reg = NULL_RTX;
37814   rtx call[4];
37815   int n_call;
37816   rtx insn;
37817   bool is_pltseq_longcall;
37818
37819   if (global_tlsarg)
37820     tlsarg = global_tlsarg;
37821
37822   /* Handle longcall attributes.  */
37823   is_pltseq_longcall = false;
37824   if ((INTVAL (cookie) & CALL_LONG) != 0
37825       && GET_CODE (func_desc) == SYMBOL_REF)
37826     {
37827       func = rs6000_longcall_ref (func_desc, tlsarg);
37828       if (TARGET_PLTSEQ)
37829         is_pltseq_longcall = true;
37830     }
37831
37832   /* Handle indirect calls.  */
37833   if (!SYMBOL_REF_P (func)
37834       || (DEFAULT_ABI == ABI_AIX && !SYMBOL_REF_FUNCTION_P (func)))
37835     {
37836       if (!rs6000_pcrel_p (cfun))
37837         {
37838           /* Save the TOC into its reserved slot before the call,
37839              and prepare to restore it after the call.  */
37840           rtx stack_toc_offset = GEN_INT (RS6000_TOC_SAVE_SLOT);
37841           rtx stack_toc_unspec = gen_rtx_UNSPEC (Pmode,
37842                                                  gen_rtvec (1, stack_toc_offset),
37843                                                  UNSPEC_TOCSLOT);
37844           toc_restore = gen_rtx_SET (toc_reg, stack_toc_unspec);
37845
37846           /* Can we optimize saving the TOC in the prologue or
37847              do we need to do it at every call?  */
37848           if (TARGET_SAVE_TOC_INDIRECT && !cfun->calls_alloca)
37849             cfun->machine->save_toc_in_prologue = true;
37850           else
37851             {
37852               rtx stack_ptr = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
37853               rtx stack_toc_mem = gen_frame_mem (Pmode,
37854                                                  gen_rtx_PLUS (Pmode, stack_ptr,
37855                                                                stack_toc_offset));
37856               MEM_VOLATILE_P (stack_toc_mem) = 1;
37857               if (is_pltseq_longcall)
37858                 {
37859                   rtvec v = gen_rtvec (3, toc_reg, func_desc, tlsarg);
37860                   rtx mark_toc_reg = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
37861                   emit_insn (gen_rtx_SET (stack_toc_mem, mark_toc_reg));
37862                 }
37863               else
37864                 emit_move_insn (stack_toc_mem, toc_reg);
37865             }
37866         }
37867
37868       if (DEFAULT_ABI == ABI_ELFv2)
37869         {
37870           /* A function pointer in the ELFv2 ABI is just a plain address, but
37871              the ABI requires it to be loaded into r12 before the call.  */
37872           func_addr = gen_rtx_REG (Pmode, 12);
37873           if (!rtx_equal_p (func_addr, func))
37874             emit_move_insn (func_addr, func);
37875           abi_reg = func_addr;
37876           /* Indirect calls via CTR are strongly preferred over indirect
37877              calls via LR, so move the address there.  Needed to mark
37878              this insn for linker plt sequence editing too.  */
37879           func_addr = gen_rtx_REG (Pmode, CTR_REGNO);
37880           if (is_pltseq_longcall)
37881             {
37882               rtvec v = gen_rtvec (3, abi_reg, func_desc, tlsarg);
37883               rtx mark_func = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
37884               emit_insn (gen_rtx_SET (func_addr, mark_func));
37885               v = gen_rtvec (2, func_addr, func_desc);
37886               func_addr = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
37887             }
37888           else
37889             emit_move_insn (func_addr, abi_reg);
37890         }
37891       else
37892         {
37893           /* A function pointer under AIX is a pointer to a data area whose
37894              first word contains the actual address of the function, whose
37895              second word contains a pointer to its TOC, and whose third word
37896              contains a value to place in the static chain register (r11).
37897              Note that if we load the static chain, our "trampoline" need
37898              not have any executable code.  */
37899
37900           /* Load up address of the actual function.  */
37901           func = force_reg (Pmode, func);
37902           func_addr = gen_reg_rtx (Pmode);
37903           emit_move_insn (func_addr, gen_rtx_MEM (Pmode, func));
37904
37905           /* Indirect calls via CTR are strongly preferred over indirect
37906              calls via LR, so move the address there.  */
37907           rtx ctr_reg = gen_rtx_REG (Pmode, CTR_REGNO);
37908           emit_move_insn (ctr_reg, func_addr);
37909           func_addr = ctr_reg;
37910
37911           /* Prepare to load the TOC of the called function.  Note that the
37912              TOC load must happen immediately before the actual call so
37913              that unwinding the TOC registers works correctly.  See the
37914              comment in frob_update_context.  */
37915           rtx func_toc_offset = GEN_INT (GET_MODE_SIZE (Pmode));
37916           rtx func_toc_mem = gen_rtx_MEM (Pmode,
37917                                           gen_rtx_PLUS (Pmode, func,
37918                                                         func_toc_offset));
37919           toc_load = gen_rtx_USE (VOIDmode, func_toc_mem);
37920
37921           /* If we have a static chain, load it up.  But, if the call was
37922              originally direct, the 3rd word has not been written since no
37923              trampoline has been built, so we ought not to load it, lest we
37924              override a static chain value.  */
37925           if (!(GET_CODE (func_desc) == SYMBOL_REF
37926                 && SYMBOL_REF_FUNCTION_P (func_desc))
37927               && TARGET_POINTERS_TO_NESTED_FUNCTIONS
37928               && !chain_already_loaded (get_current_sequence ()->next->last))
37929             {
37930               rtx sc_reg = gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
37931               rtx func_sc_offset = GEN_INT (2 * GET_MODE_SIZE (Pmode));
37932               rtx func_sc_mem = gen_rtx_MEM (Pmode,
37933                                              gen_rtx_PLUS (Pmode, func,
37934                                                            func_sc_offset));
37935               emit_move_insn (sc_reg, func_sc_mem);
37936               abi_reg = sc_reg;
37937             }
37938         }
37939     }
37940   else
37941     {
37942       /* No TOC register needed for calls from PC-relative callers.  */
37943       if (!rs6000_pcrel_p (cfun))
37944         /* Direct calls use the TOC: for local calls, the callee will
37945            assume the TOC register is set; for non-local calls, the
37946            PLT stub needs the TOC register.  */
37947         abi_reg = toc_reg;
37948       func_addr = func;
37949     }
37950
37951   /* Create the call.  */
37952   call[0] = gen_rtx_CALL (VOIDmode, gen_rtx_MEM (SImode, func_addr), tlsarg);
37953   if (value != NULL_RTX)
37954     call[0] = gen_rtx_SET (value, call[0]);
37955   n_call = 1;
37956
37957   if (toc_load)
37958     call[n_call++] = toc_load;
37959   if (toc_restore)
37960     call[n_call++] = toc_restore;
37961
37962   call[n_call++] = gen_hard_reg_clobber (Pmode, LR_REGNO);
37963
37964   insn = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (n_call, call));
37965   insn = emit_call_insn (insn);
37966
37967   /* Mention all registers defined by the ABI to hold information
37968      as uses in CALL_INSN_FUNCTION_USAGE.  */
37969   if (abi_reg)
37970     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), abi_reg);
37971 }
37972
37973 /* Expand code to perform a sibling call under the AIX or ELFv2 ABI.  */
37974
37975 void
37976 rs6000_sibcall_aix (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
37977 {
37978   rtx call[2];
37979   rtx insn;
37980
37981   gcc_assert (INTVAL (cookie) == 0);
37982
37983   if (global_tlsarg)
37984     tlsarg = global_tlsarg;
37985
37986   /* Create the call.  */
37987   call[0] = gen_rtx_CALL (VOIDmode, gen_rtx_MEM (SImode, func_desc), tlsarg);
37988   if (value != NULL_RTX)
37989     call[0] = gen_rtx_SET (value, call[0]);
37990
37991   call[1] = simple_return_rtx;
37992
37993   insn = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (2, call));
37994   insn = emit_call_insn (insn);
37995
37996   /* Note use of the TOC register.  */
37997   if (!rs6000_pcrel_p (cfun))
37998     use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
37999              gen_rtx_REG (Pmode, TOC_REGNUM));
38000 }
38001
38002 /* Expand code to perform a call under the SYSV4 ABI.  */
38003
38004 void
38005 rs6000_call_sysv (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
38006 {
38007   rtx func = func_desc;
38008   rtx func_addr;
38009   rtx call[4];
38010   rtx insn;
38011   rtx abi_reg = NULL_RTX;
38012   int n;
38013
38014   if (global_tlsarg)
38015     tlsarg = global_tlsarg;
38016
38017   /* Handle longcall attributes.  */
38018   if ((INTVAL (cookie) & CALL_LONG) != 0
38019       && GET_CODE (func_desc) == SYMBOL_REF)
38020     {
38021       func = rs6000_longcall_ref (func_desc, tlsarg);
38022       /* If the longcall was implemented as an inline PLT call using
38023          PLT unspecs then func will be REG:r11.  If not, func will be
38024          a pseudo reg.  The inline PLT call sequence supports lazy
38025          linking (and longcalls to functions in dlopen'd libraries).
38026          The other style of longcalls don't.  The lazy linking entry
38027          to the dynamic symbol resolver requires r11 be the function
38028          address (as it is for linker generated PLT stubs).  Ensure
38029          r11 stays valid to the bctrl by marking r11 used by the call.  */
38030       if (TARGET_PLTSEQ)
38031         abi_reg = func;
38032     }
38033
38034   /* Handle indirect calls.  */
38035   if (GET_CODE (func) != SYMBOL_REF)
38036     {
38037       func = force_reg (Pmode, func);
38038
38039       /* Indirect calls via CTR are strongly preferred over indirect
38040          calls via LR, so move the address there.  That can't be left
38041          to reload because we want to mark every instruction in an
38042          inline PLT call sequence with a reloc, enabling the linker to
38043          edit the sequence back to a direct call when that makes sense.  */
38044       func_addr = gen_rtx_REG (Pmode, CTR_REGNO);
38045       if (abi_reg)
38046         {
38047           rtvec v = gen_rtvec (3, func, func_desc, tlsarg);
38048           rtx mark_func = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
38049           emit_insn (gen_rtx_SET (func_addr, mark_func));
38050           v = gen_rtvec (2, func_addr, func_desc);
38051           func_addr = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
38052         }
38053       else
38054         emit_move_insn (func_addr, func);
38055     }
38056   else
38057     func_addr = func;
38058
38059   /* Create the call.  */
38060   call[0] = gen_rtx_CALL (VOIDmode, gen_rtx_MEM (SImode, func_addr), tlsarg);
38061   if (value != NULL_RTX)
38062     call[0] = gen_rtx_SET (value, call[0]);
38063
38064   call[1] = gen_rtx_USE (VOIDmode, cookie);
38065   n = 2;
38066   if (TARGET_SECURE_PLT
38067       && flag_pic
38068       && GET_CODE (func_addr) == SYMBOL_REF
38069       && !SYMBOL_REF_LOCAL_P (func_addr))
38070     call[n++] = gen_rtx_USE (VOIDmode, pic_offset_table_rtx);
38071
38072   call[n++] = gen_hard_reg_clobber (Pmode, LR_REGNO);
38073
38074   insn = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (n, call));
38075   insn = emit_call_insn (insn);
38076   if (abi_reg)
38077     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), abi_reg);
38078 }
38079
38080 /* Expand code to perform a sibling call under the SysV4 ABI.  */
38081
38082 void
38083 rs6000_sibcall_sysv (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
38084 {
38085   rtx func = func_desc;
38086   rtx func_addr;
38087   rtx call[3];
38088   rtx insn;
38089   rtx abi_reg = NULL_RTX;
38090
38091   if (global_tlsarg)
38092     tlsarg = global_tlsarg;
38093
38094   /* Handle longcall attributes.  */
38095   if ((INTVAL (cookie) & CALL_LONG) != 0
38096       && GET_CODE (func_desc) == SYMBOL_REF)
38097     {
38098       func = rs6000_longcall_ref (func_desc, tlsarg);
38099       /* If the longcall was implemented as an inline PLT call using
38100          PLT unspecs then func will be REG:r11.  If not, func will be
38101          a pseudo reg.  The inline PLT call sequence supports lazy
38102          linking (and longcalls to functions in dlopen'd libraries).
38103          The other style of longcalls don't.  The lazy linking entry
38104          to the dynamic symbol resolver requires r11 be the function
38105          address (as it is for linker generated PLT stubs).  Ensure
38106          r11 stays valid to the bctr by marking r11 used by the call.  */
38107       if (TARGET_PLTSEQ)
38108         abi_reg = func;
38109     }
38110
38111   /* Handle indirect calls.  */
38112   if (GET_CODE (func) != SYMBOL_REF)
38113     {
38114       func = force_reg (Pmode, func);
38115
38116       /* Indirect sibcalls must go via CTR.  That can't be left to
38117          reload because we want to mark every instruction in an inline
38118          PLT call sequence with a reloc, enabling the linker to edit
38119          the sequence back to a direct call when that makes sense.  */
38120       func_addr = gen_rtx_REG (Pmode, CTR_REGNO);
38121       if (abi_reg)
38122         {
38123           rtvec v = gen_rtvec (3, func, func_desc, tlsarg);
38124           rtx mark_func = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
38125           emit_insn (gen_rtx_SET (func_addr, mark_func));
38126           v = gen_rtvec (2, func_addr, func_desc);
38127           func_addr = gen_rtx_UNSPEC (Pmode, v, UNSPEC_PLTSEQ);
38128         }
38129       else
38130         emit_move_insn (func_addr, func);
38131     }
38132   else
38133     func_addr = func;
38134
38135   /* Create the call.  */
38136   call[0] = gen_rtx_CALL (VOIDmode, gen_rtx_MEM (SImode, func_addr), tlsarg);
38137   if (value != NULL_RTX)
38138     call[0] = gen_rtx_SET (value, call[0]);
38139
38140   call[1] = gen_rtx_USE (VOIDmode, cookie);
38141   call[2] = simple_return_rtx;
38142
38143   insn = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (3, call));
38144   insn = emit_call_insn (insn);
38145   if (abi_reg)
38146     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), abi_reg);
38147 }
38148
38149 #if TARGET_MACHO
38150
38151 /* Expand code to perform a call under the Darwin ABI.
38152    Modulo handling of mlongcall, this is much the same as sysv.
38153    if/when the longcall optimisation is removed, we could drop this
38154    code and use the sysv case (taking care to avoid the tls stuff).
38155
38156    We can use this for sibcalls too, if needed.  */
38157
38158 void
38159 rs6000_call_darwin_1 (rtx value, rtx func_desc, rtx tlsarg,
38160                       rtx cookie, bool sibcall)
38161 {
38162   rtx func = func_desc;
38163   rtx func_addr;
38164   rtx call[3];
38165   rtx insn;
38166   int cookie_val = INTVAL (cookie);
38167   bool make_island = false;
38168
38169   /* Handle longcall attributes, there are two cases for Darwin:
38170      1) Newer linkers are capable of synthesising any branch islands needed.
38171      2) We need a helper branch island synthesised by the compiler.
38172      The second case has mostly been retired and we don't use it for m64.
38173      In fact, it's is an optimisation, we could just indirect as sysv does..
38174      ... however, backwards compatibility for now.
38175      If we're going to use this, then we need to keep the CALL_LONG bit set,
38176      so that we can pick up the special insn form later.  */
38177   if ((cookie_val & CALL_LONG) != 0
38178       && GET_CODE (func_desc) == SYMBOL_REF)
38179     {
38180       if (darwin_emit_branch_islands && TARGET_32BIT)
38181         make_island = true; /* Do nothing yet, retain the CALL_LONG flag.  */
38182       else
38183         {
38184           /* The linker is capable of doing this, but the user explicitly
38185              asked for -mlongcall, so we'll do the 'normal' version.  */
38186           func = rs6000_longcall_ref (func_desc, NULL_RTX);
38187           cookie_val &= ~CALL_LONG; /* Handled, zap it.  */
38188         }
38189     }
38190
38191   /* Handle indirect calls.  */
38192   if (GET_CODE (func) != SYMBOL_REF)
38193     {
38194       func = force_reg (Pmode, func);
38195
38196       /* Indirect calls via CTR are strongly preferred over indirect
38197          calls via LR, and are required for indirect sibcalls, so move
38198          the address there.   */
38199       func_addr = gen_rtx_REG (Pmode, CTR_REGNO);
38200       emit_move_insn (func_addr, func);
38201     }
38202   else
38203     func_addr = func;
38204
38205   /* Create the call.  */
38206   call[0] = gen_rtx_CALL (VOIDmode, gen_rtx_MEM (SImode, func_addr), tlsarg);
38207   if (value != NULL_RTX)
38208     call[0] = gen_rtx_SET (value, call[0]);
38209
38210   call[1] = gen_rtx_USE (VOIDmode, GEN_INT (cookie_val));
38211
38212   if (sibcall)
38213     call[2] = simple_return_rtx;
38214   else
38215     call[2] = gen_hard_reg_clobber (Pmode, LR_REGNO);
38216
38217   insn = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (3, call));
38218   insn = emit_call_insn (insn);
38219   /* Now we have the debug info in the insn, we can set up the branch island
38220      if we're using one.  */
38221   if (make_island)
38222     {
38223       tree funname = get_identifier (XSTR (func_desc, 0));
38224
38225       if (no_previous_def (funname))
38226         {
38227           rtx label_rtx = gen_label_rtx ();
38228           char *label_buf, temp_buf[256];
38229           ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
38230                                        CODE_LABEL_NUMBER (label_rtx));
38231           label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
38232           tree labelname = get_identifier (label_buf);
38233           add_compiler_branch_island (labelname, funname,
38234                                      insn_line ((const rtx_insn*)insn));
38235         }
38236      }
38237 }
38238 #endif
38239
38240 void
38241 rs6000_call_darwin (rtx value ATTRIBUTE_UNUSED, rtx func_desc ATTRIBUTE_UNUSED,
38242                     rtx tlsarg ATTRIBUTE_UNUSED, rtx cookie ATTRIBUTE_UNUSED)
38243 {
38244 #if TARGET_MACHO
38245   rs6000_call_darwin_1 (value, func_desc, tlsarg, cookie, false);
38246 #else
38247   gcc_unreachable();
38248 #endif
38249 }
38250
38251
38252 void
38253 rs6000_sibcall_darwin (rtx value ATTRIBUTE_UNUSED, rtx func_desc ATTRIBUTE_UNUSED,
38254                        rtx tlsarg ATTRIBUTE_UNUSED, rtx cookie ATTRIBUTE_UNUSED)
38255 {
38256 #if TARGET_MACHO
38257   rs6000_call_darwin_1 (value, func_desc, tlsarg, cookie, true);
38258 #else
38259   gcc_unreachable();
38260 #endif
38261 }
38262
38263
38264 /* Return whether we need to always update the saved TOC pointer when we update
38265    the stack pointer.  */
38266
38267 static bool
38268 rs6000_save_toc_in_prologue_p (void)
38269 {
38270   return (cfun && cfun->machine && cfun->machine->save_toc_in_prologue);
38271 }
38272
38273 /* Return whether we should generate PC-relative code for FNDECL.  */
38274 bool
38275 rs6000_fndecl_pcrel_p (const_tree fndecl)
38276 {
38277   if (DEFAULT_ABI != ABI_ELFv2)
38278     return false;
38279
38280   struct cl_target_option *opts = target_opts_for_fn (fndecl);
38281
38282   return ((opts->x_rs6000_isa_flags & OPTION_MASK_PCREL) != 0
38283           && TARGET_CMODEL == CMODEL_MEDIUM);
38284 }
38285
38286 /* Return whether we should generate PC-relative code for *FN.  */
38287 bool
38288 rs6000_pcrel_p (struct function *fn)
38289 {
38290   if (DEFAULT_ABI != ABI_ELFv2)
38291     return false;
38292
38293   /* Optimize usual case.  */
38294   if (fn == cfun)
38295     return ((rs6000_isa_flags & OPTION_MASK_PCREL) != 0
38296             && TARGET_CMODEL == CMODEL_MEDIUM);
38297
38298   return rs6000_fndecl_pcrel_p (fn->decl);
38299 }
38300
38301 #ifdef HAVE_GAS_HIDDEN
38302 # define USE_HIDDEN_LINKONCE 1
38303 #else
38304 # define USE_HIDDEN_LINKONCE 0
38305 #endif
38306
38307 /* Fills in the label name that should be used for a 476 link stack thunk.  */
38308
38309 void
38310 get_ppc476_thunk_name (char name[32])
38311 {
38312   gcc_assert (TARGET_LINK_STACK);
38313
38314   if (USE_HIDDEN_LINKONCE)
38315     sprintf (name, "__ppc476.get_thunk");
38316   else
38317     ASM_GENERATE_INTERNAL_LABEL (name, "LPPC476_", 0);
38318 }
38319
38320 /* This function emits the simple thunk routine that is used to preserve
38321    the link stack on the 476 cpu.  */
38322
38323 static void rs6000_code_end (void) ATTRIBUTE_UNUSED;
38324 static void
38325 rs6000_code_end (void)
38326 {
38327   char name[32];
38328   tree decl;
38329
38330   if (!TARGET_LINK_STACK)
38331     return;
38332
38333   get_ppc476_thunk_name (name);
38334
38335   decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, get_identifier (name),
38336                      build_function_type_list (void_type_node, NULL_TREE));
38337   DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
38338                                    NULL_TREE, void_type_node);
38339   TREE_PUBLIC (decl) = 1;
38340   TREE_STATIC (decl) = 1;
38341
38342 #if RS6000_WEAK
38343   if (USE_HIDDEN_LINKONCE && !TARGET_XCOFF)
38344     {
38345       cgraph_node::create (decl)->set_comdat_group (DECL_ASSEMBLER_NAME (decl));
38346       targetm.asm_out.unique_section (decl, 0);
38347       switch_to_section (get_named_section (decl, NULL, 0));
38348       DECL_WEAK (decl) = 1;
38349       ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
38350       targetm.asm_out.globalize_label (asm_out_file, name);
38351       targetm.asm_out.assemble_visibility (decl, VISIBILITY_HIDDEN);
38352       ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
38353     }
38354   else
38355 #endif
38356     {
38357       switch_to_section (text_section);
38358       ASM_OUTPUT_LABEL (asm_out_file, name);
38359     }
38360
38361   DECL_INITIAL (decl) = make_node (BLOCK);
38362   current_function_decl = decl;
38363   allocate_struct_function (decl, false);
38364   init_function_start (decl);
38365   first_function_block_is_cold = false;
38366   /* Make sure unwind info is emitted for the thunk if needed.  */
38367   final_start_function (emit_barrier (), asm_out_file, 1);
38368
38369   fputs ("\tblr\n", asm_out_file);
38370
38371   final_end_function ();
38372   init_insn_lengths ();
38373   free_after_compilation (cfun);
38374   set_cfun (NULL);
38375   current_function_decl = NULL;
38376 }
38377
38378 /* Add r30 to hard reg set if the prologue sets it up and it is not
38379    pic_offset_table_rtx.  */
38380
38381 static void
38382 rs6000_set_up_by_prologue (struct hard_reg_set_container *set)
38383 {
38384   if (!TARGET_SINGLE_PIC_BASE
38385       && TARGET_TOC
38386       && TARGET_MINIMAL_TOC
38387       && !constant_pool_empty_p ())
38388     add_to_hard_reg_set (&set->set, Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
38389   if (cfun->machine->split_stack_argp_used)
38390     add_to_hard_reg_set (&set->set, Pmode, 12);
38391
38392   /* Make sure the hard reg set doesn't include r2, which was possibly added
38393      via PIC_OFFSET_TABLE_REGNUM.  */
38394   if (TARGET_TOC)
38395     remove_from_hard_reg_set (&set->set, Pmode, TOC_REGNUM);
38396 }
38397
38398 \f
38399 /* Helper function for rs6000_split_logical to emit a logical instruction after
38400    spliting the operation to single GPR registers.
38401
38402    DEST is the destination register.
38403    OP1 and OP2 are the input source registers.
38404    CODE is the base operation (AND, IOR, XOR, NOT).
38405    MODE is the machine mode.
38406    If COMPLEMENT_FINAL_P is true, wrap the whole operation with NOT.
38407    If COMPLEMENT_OP1_P is true, wrap operand1 with NOT.
38408    If COMPLEMENT_OP2_P is true, wrap operand2 with NOT.  */
38409
38410 static void
38411 rs6000_split_logical_inner (rtx dest,
38412                             rtx op1,
38413                             rtx op2,
38414                             enum rtx_code code,
38415                             machine_mode mode,
38416                             bool complement_final_p,
38417                             bool complement_op1_p,
38418                             bool complement_op2_p)
38419 {
38420   rtx bool_rtx;
38421
38422   /* Optimize AND of 0/0xffffffff and IOR/XOR of 0.  */
38423   if (op2 && CONST_INT_P (op2)
38424       && (mode == SImode || (mode == DImode && TARGET_POWERPC64))
38425       && !complement_final_p && !complement_op1_p && !complement_op2_p)
38426     {
38427       HOST_WIDE_INT mask = GET_MODE_MASK (mode);
38428       HOST_WIDE_INT value = INTVAL (op2) & mask;
38429
38430       /* Optimize AND of 0 to just set 0.  Optimize AND of -1 to be a move.  */
38431       if (code == AND)
38432         {
38433           if (value == 0)
38434             {
38435               emit_insn (gen_rtx_SET (dest, const0_rtx));
38436               return;
38437             }
38438
38439           else if (value == mask)
38440             {
38441               if (!rtx_equal_p (dest, op1))
38442                 emit_insn (gen_rtx_SET (dest, op1));
38443               return;
38444             }
38445         }
38446
38447       /* Optimize IOR/XOR of 0 to be a simple move.  Split large operations
38448          into separate ORI/ORIS or XORI/XORIS instrucitons.  */
38449       else if (code == IOR || code == XOR)
38450         {
38451           if (value == 0)
38452             {
38453               if (!rtx_equal_p (dest, op1))
38454                 emit_insn (gen_rtx_SET (dest, op1));
38455               return;
38456             }
38457         }
38458     }
38459
38460   if (code == AND && mode == SImode
38461       && !complement_final_p && !complement_op1_p && !complement_op2_p)
38462     {
38463       emit_insn (gen_andsi3 (dest, op1, op2));
38464       return;
38465     }
38466
38467   if (complement_op1_p)
38468     op1 = gen_rtx_NOT (mode, op1);
38469
38470   if (complement_op2_p)
38471     op2 = gen_rtx_NOT (mode, op2);
38472
38473   /* For canonical RTL, if only one arm is inverted it is the first.  */
38474   if (!complement_op1_p && complement_op2_p)
38475     std::swap (op1, op2);
38476
38477   bool_rtx = ((code == NOT)
38478               ? gen_rtx_NOT (mode, op1)
38479               : gen_rtx_fmt_ee (code, mode, op1, op2));
38480
38481   if (complement_final_p)
38482     bool_rtx = gen_rtx_NOT (mode, bool_rtx);
38483
38484   emit_insn (gen_rtx_SET (dest, bool_rtx));
38485 }
38486
38487 /* Split a DImode AND/IOR/XOR with a constant on a 32-bit system.  These
38488    operations are split immediately during RTL generation to allow for more
38489    optimizations of the AND/IOR/XOR.
38490
38491    OPERANDS is an array containing the destination and two input operands.
38492    CODE is the base operation (AND, IOR, XOR, NOT).
38493    MODE is the machine mode.
38494    If COMPLEMENT_FINAL_P is true, wrap the whole operation with NOT.
38495    If COMPLEMENT_OP1_P is true, wrap operand1 with NOT.
38496    If COMPLEMENT_OP2_P is true, wrap operand2 with NOT.
38497    CLOBBER_REG is either NULL or a scratch register of type CC to allow
38498    formation of the AND instructions.  */
38499
38500 static void
38501 rs6000_split_logical_di (rtx operands[3],
38502                          enum rtx_code code,
38503                          bool complement_final_p,
38504                          bool complement_op1_p,
38505                          bool complement_op2_p)
38506 {
38507   const HOST_WIDE_INT lower_32bits = HOST_WIDE_INT_C(0xffffffff);
38508   const HOST_WIDE_INT upper_32bits = ~ lower_32bits;
38509   const HOST_WIDE_INT sign_bit = HOST_WIDE_INT_C(0x80000000);
38510   enum hi_lo { hi = 0, lo = 1 };
38511   rtx op0_hi_lo[2], op1_hi_lo[2], op2_hi_lo[2];
38512   size_t i;
38513
38514   op0_hi_lo[hi] = gen_highpart (SImode, operands[0]);
38515   op1_hi_lo[hi] = gen_highpart (SImode, operands[1]);
38516   op0_hi_lo[lo] = gen_lowpart (SImode, operands[0]);
38517   op1_hi_lo[lo] = gen_lowpart (SImode, operands[1]);
38518
38519   if (code == NOT)
38520     op2_hi_lo[hi] = op2_hi_lo[lo] = NULL_RTX;
38521   else
38522     {
38523       if (!CONST_INT_P (operands[2]))
38524         {
38525           op2_hi_lo[hi] = gen_highpart_mode (SImode, DImode, operands[2]);
38526           op2_hi_lo[lo] = gen_lowpart (SImode, operands[2]);
38527         }
38528       else
38529         {
38530           HOST_WIDE_INT value = INTVAL (operands[2]);
38531           HOST_WIDE_INT value_hi_lo[2];
38532
38533           gcc_assert (!complement_final_p);
38534           gcc_assert (!complement_op1_p);
38535           gcc_assert (!complement_op2_p);
38536
38537           value_hi_lo[hi] = value >> 32;
38538           value_hi_lo[lo] = value & lower_32bits;
38539
38540           for (i = 0; i < 2; i++)
38541             {
38542               HOST_WIDE_INT sub_value = value_hi_lo[i];
38543
38544               if (sub_value & sign_bit)
38545                 sub_value |= upper_32bits;
38546
38547               op2_hi_lo[i] = GEN_INT (sub_value);
38548
38549               /* If this is an AND instruction, check to see if we need to load
38550                  the value in a register.  */
38551               if (code == AND && sub_value != -1 && sub_value != 0
38552                   && !and_operand (op2_hi_lo[i], SImode))
38553                 op2_hi_lo[i] = force_reg (SImode, op2_hi_lo[i]);
38554             }
38555         }
38556     }
38557
38558   for (i = 0; i < 2; i++)
38559     {
38560       /* Split large IOR/XOR operations.  */
38561       if ((code == IOR || code == XOR)
38562           && CONST_INT_P (op2_hi_lo[i])
38563           && !complement_final_p
38564           && !complement_op1_p
38565           && !complement_op2_p
38566           && !logical_const_operand (op2_hi_lo[i], SImode))
38567         {
38568           HOST_WIDE_INT value = INTVAL (op2_hi_lo[i]);
38569           HOST_WIDE_INT hi_16bits = value & HOST_WIDE_INT_C(0xffff0000);
38570           HOST_WIDE_INT lo_16bits = value & HOST_WIDE_INT_C(0x0000ffff);
38571           rtx tmp = gen_reg_rtx (SImode);
38572
38573           /* Make sure the constant is sign extended.  */
38574           if ((hi_16bits & sign_bit) != 0)
38575             hi_16bits |= upper_32bits;
38576
38577           rs6000_split_logical_inner (tmp, op1_hi_lo[i], GEN_INT (hi_16bits),
38578                                       code, SImode, false, false, false);
38579
38580           rs6000_split_logical_inner (op0_hi_lo[i], tmp, GEN_INT (lo_16bits),
38581                                       code, SImode, false, false, false);
38582         }
38583       else
38584         rs6000_split_logical_inner (op0_hi_lo[i], op1_hi_lo[i], op2_hi_lo[i],
38585                                     code, SImode, complement_final_p,
38586                                     complement_op1_p, complement_op2_p);
38587     }
38588
38589   return;
38590 }
38591
38592 /* Split the insns that make up boolean operations operating on multiple GPR
38593    registers.  The boolean MD patterns ensure that the inputs either are
38594    exactly the same as the output registers, or there is no overlap.
38595
38596    OPERANDS is an array containing the destination and two input operands.
38597    CODE is the base operation (AND, IOR, XOR, NOT).
38598    If COMPLEMENT_FINAL_P is true, wrap the whole operation with NOT.
38599    If COMPLEMENT_OP1_P is true, wrap operand1 with NOT.
38600    If COMPLEMENT_OP2_P is true, wrap operand2 with NOT.  */
38601
38602 void
38603 rs6000_split_logical (rtx operands[3],
38604                       enum rtx_code code,
38605                       bool complement_final_p,
38606                       bool complement_op1_p,
38607                       bool complement_op2_p)
38608 {
38609   machine_mode mode = GET_MODE (operands[0]);
38610   machine_mode sub_mode;
38611   rtx op0, op1, op2;
38612   int sub_size, regno0, regno1, nregs, i;
38613
38614   /* If this is DImode, use the specialized version that can run before
38615      register allocation.  */
38616   if (mode == DImode && !TARGET_POWERPC64)
38617     {
38618       rs6000_split_logical_di (operands, code, complement_final_p,
38619                                complement_op1_p, complement_op2_p);
38620       return;
38621     }
38622
38623   op0 = operands[0];
38624   op1 = operands[1];
38625   op2 = (code == NOT) ? NULL_RTX : operands[2];
38626   sub_mode = (TARGET_POWERPC64) ? DImode : SImode;
38627   sub_size = GET_MODE_SIZE (sub_mode);
38628   regno0 = REGNO (op0);
38629   regno1 = REGNO (op1);
38630
38631   gcc_assert (reload_completed);
38632   gcc_assert (IN_RANGE (regno0, FIRST_GPR_REGNO, LAST_GPR_REGNO));
38633   gcc_assert (IN_RANGE (regno1, FIRST_GPR_REGNO, LAST_GPR_REGNO));
38634
38635   nregs = rs6000_hard_regno_nregs[(int)mode][regno0];
38636   gcc_assert (nregs > 1);
38637
38638   if (op2 && REG_P (op2))
38639     gcc_assert (IN_RANGE (REGNO (op2), FIRST_GPR_REGNO, LAST_GPR_REGNO));
38640
38641   for (i = 0; i < nregs; i++)
38642     {
38643       int offset = i * sub_size;
38644       rtx sub_op0 = simplify_subreg (sub_mode, op0, mode, offset);
38645       rtx sub_op1 = simplify_subreg (sub_mode, op1, mode, offset);
38646       rtx sub_op2 = ((code == NOT)
38647                      ? NULL_RTX
38648                      : simplify_subreg (sub_mode, op2, mode, offset));
38649
38650       rs6000_split_logical_inner (sub_op0, sub_op1, sub_op2, code, sub_mode,
38651                                   complement_final_p, complement_op1_p,
38652                                   complement_op2_p);
38653     }
38654
38655   return;
38656 }
38657
38658 \f
38659 /* Return true if the peephole2 can combine a load involving a combination of
38660    an addis instruction and a load with an offset that can be fused together on
38661    a power8.  */
38662
38663 bool
38664 fusion_gpr_load_p (rtx addis_reg,       /* register set via addis.  */
38665                    rtx addis_value,     /* addis value.  */
38666                    rtx target,          /* target register that is loaded.  */
38667                    rtx mem)             /* bottom part of the memory addr.  */
38668 {
38669   rtx addr;
38670   rtx base_reg;
38671
38672   /* Validate arguments.  */
38673   if (!base_reg_operand (addis_reg, GET_MODE (addis_reg)))
38674     return false;
38675
38676   if (!base_reg_operand (target, GET_MODE (target)))
38677     return false;
38678
38679   if (!fusion_gpr_addis (addis_value, GET_MODE (addis_value)))
38680     return false;
38681
38682   /* Allow sign/zero extension.  */
38683   if (GET_CODE (mem) == ZERO_EXTEND
38684       || (GET_CODE (mem) == SIGN_EXTEND && TARGET_P8_FUSION_SIGN))
38685     mem = XEXP (mem, 0);
38686
38687   if (!MEM_P (mem))
38688     return false;
38689
38690   if (!fusion_gpr_mem_load (mem, GET_MODE (mem)))
38691     return false;
38692
38693   addr = XEXP (mem, 0);                 /* either PLUS or LO_SUM.  */
38694   if (GET_CODE (addr) != PLUS && GET_CODE (addr) != LO_SUM)
38695     return false;
38696
38697   /* Validate that the register used to load the high value is either the
38698      register being loaded, or we can safely replace its use.
38699
38700      This function is only called from the peephole2 pass and we assume that
38701      there are 2 instructions in the peephole (addis and load), so we want to
38702      check if the target register was not used in the memory address and the
38703      register to hold the addis result is dead after the peephole.  */
38704   if (REGNO (addis_reg) != REGNO (target))
38705     {
38706       if (reg_mentioned_p (target, mem))
38707         return false;
38708
38709       if (!peep2_reg_dead_p (2, addis_reg))
38710         return false;
38711
38712       /* If the target register being loaded is the stack pointer, we must
38713          avoid loading any other value into it, even temporarily.  */
38714       if (REG_P (target) && REGNO (target) == STACK_POINTER_REGNUM)
38715         return false;
38716     }
38717
38718   base_reg = XEXP (addr, 0);
38719   return REGNO (addis_reg) == REGNO (base_reg);
38720 }
38721
38722 /* During the peephole2 pass, adjust and expand the insns for a load fusion
38723    sequence.  We adjust the addis register to use the target register.  If the
38724    load sign extends, we adjust the code to do the zero extending load, and an
38725    explicit sign extension later since the fusion only covers zero extending
38726    loads.
38727
38728    The operands are:
38729         operands[0]     register set with addis (to be replaced with target)
38730         operands[1]     value set via addis
38731         operands[2]     target register being loaded
38732         operands[3]     D-form memory reference using operands[0].  */
38733
38734 void
38735 expand_fusion_gpr_load (rtx *operands)
38736 {
38737   rtx addis_value = operands[1];
38738   rtx target = operands[2];
38739   rtx orig_mem = operands[3];
38740   rtx  new_addr, new_mem, orig_addr, offset;
38741   enum rtx_code plus_or_lo_sum;
38742   machine_mode target_mode = GET_MODE (target);
38743   machine_mode extend_mode = target_mode;
38744   machine_mode ptr_mode = Pmode;
38745   enum rtx_code extend = UNKNOWN;
38746
38747   if (GET_CODE (orig_mem) == ZERO_EXTEND
38748       || (TARGET_P8_FUSION_SIGN && GET_CODE (orig_mem) == SIGN_EXTEND))
38749     {
38750       extend = GET_CODE (orig_mem);
38751       orig_mem = XEXP (orig_mem, 0);
38752       target_mode = GET_MODE (orig_mem);
38753     }
38754
38755   gcc_assert (MEM_P (orig_mem));
38756
38757   orig_addr = XEXP (orig_mem, 0);
38758   plus_or_lo_sum = GET_CODE (orig_addr);
38759   gcc_assert (plus_or_lo_sum == PLUS || plus_or_lo_sum == LO_SUM);
38760
38761   offset = XEXP (orig_addr, 1);
38762   new_addr = gen_rtx_fmt_ee (plus_or_lo_sum, ptr_mode, addis_value, offset);
38763   new_mem = replace_equiv_address_nv (orig_mem, new_addr, false);
38764
38765   if (extend != UNKNOWN)
38766     new_mem = gen_rtx_fmt_e (ZERO_EXTEND, extend_mode, new_mem);
38767
38768   new_mem = gen_rtx_UNSPEC (extend_mode, gen_rtvec (1, new_mem),
38769                             UNSPEC_FUSION_GPR);
38770   emit_insn (gen_rtx_SET (target, new_mem));
38771
38772   if (extend == SIGN_EXTEND)
38773     {
38774       int sub_off = ((BYTES_BIG_ENDIAN)
38775                      ? GET_MODE_SIZE (extend_mode) - GET_MODE_SIZE (target_mode)
38776                      : 0);
38777       rtx sign_reg
38778         = simplify_subreg (target_mode, target, extend_mode, sub_off);
38779
38780       emit_insn (gen_rtx_SET (target,
38781                               gen_rtx_SIGN_EXTEND (extend_mode, sign_reg)));
38782     }
38783
38784   return;
38785 }
38786
38787 /* Emit the addis instruction that will be part of a fused instruction
38788    sequence.  */
38789
38790 void
38791 emit_fusion_addis (rtx target, rtx addis_value)
38792 {
38793   rtx fuse_ops[10];
38794   const char *addis_str = NULL;
38795
38796   /* Emit the addis instruction.  */
38797   fuse_ops[0] = target;
38798   if (satisfies_constraint_L (addis_value))
38799     {
38800       fuse_ops[1] = addis_value;
38801       addis_str = "lis %0,%v1";
38802     }
38803
38804   else if (GET_CODE (addis_value) == PLUS)
38805     {
38806       rtx op0 = XEXP (addis_value, 0);
38807       rtx op1 = XEXP (addis_value, 1);
38808
38809       if (REG_P (op0) && CONST_INT_P (op1)
38810           && satisfies_constraint_L (op1))
38811         {
38812           fuse_ops[1] = op0;
38813           fuse_ops[2] = op1;
38814           addis_str = "addis %0,%1,%v2";
38815         }
38816     }
38817
38818   else if (GET_CODE (addis_value) == HIGH)
38819     {
38820       rtx value = XEXP (addis_value, 0);
38821       if (GET_CODE (value) == UNSPEC && XINT (value, 1) == UNSPEC_TOCREL)
38822         {
38823           fuse_ops[1] = XVECEXP (value, 0, 0);          /* symbol ref.  */
38824           fuse_ops[2] = XVECEXP (value, 0, 1);          /* TOC register.  */
38825           if (TARGET_ELF)
38826             addis_str = "addis %0,%2,%1@toc@ha";
38827
38828           else if (TARGET_XCOFF)
38829             addis_str = "addis %0,%1@u(%2)";
38830
38831           else
38832             gcc_unreachable ();
38833         }
38834
38835       else if (GET_CODE (value) == PLUS)
38836         {
38837           rtx op0 = XEXP (value, 0);
38838           rtx op1 = XEXP (value, 1);
38839
38840           if (GET_CODE (op0) == UNSPEC
38841               && XINT (op0, 1) == UNSPEC_TOCREL
38842               && CONST_INT_P (op1))
38843             {
38844               fuse_ops[1] = XVECEXP (op0, 0, 0);        /* symbol ref.  */
38845               fuse_ops[2] = XVECEXP (op0, 0, 1);        /* TOC register.  */
38846               fuse_ops[3] = op1;
38847               if (TARGET_ELF)
38848                 addis_str = "addis %0,%2,%1+%3@toc@ha";
38849
38850               else if (TARGET_XCOFF)
38851                 addis_str = "addis %0,%1+%3@u(%2)";
38852
38853               else
38854                 gcc_unreachable ();
38855             }
38856         }
38857
38858       else if (satisfies_constraint_L (value))
38859         {
38860           fuse_ops[1] = value;
38861           addis_str = "lis %0,%v1";
38862         }
38863
38864       else if (TARGET_ELF && !TARGET_POWERPC64 && CONSTANT_P (value))
38865         {
38866           fuse_ops[1] = value;
38867           addis_str = "lis %0,%1@ha";
38868         }
38869     }
38870
38871   if (!addis_str)
38872     fatal_insn ("Could not generate addis value for fusion", addis_value);
38873
38874   output_asm_insn (addis_str, fuse_ops);
38875 }
38876
38877 /* Emit a D-form load or store instruction that is the second instruction
38878    of a fusion sequence.  */
38879
38880 static void
38881 emit_fusion_load (rtx load_reg, rtx addis_reg, rtx offset, const char *insn_str)
38882 {
38883   rtx fuse_ops[10];
38884   char insn_template[80];
38885
38886   fuse_ops[0] = load_reg;
38887   fuse_ops[1] = addis_reg;
38888
38889   if (CONST_INT_P (offset) && satisfies_constraint_I (offset))
38890     {
38891       sprintf (insn_template, "%s %%0,%%2(%%1)", insn_str);
38892       fuse_ops[2] = offset;
38893       output_asm_insn (insn_template, fuse_ops);
38894     }
38895
38896   else if (GET_CODE (offset) == UNSPEC
38897            && XINT (offset, 1) == UNSPEC_TOCREL)
38898     {
38899       if (TARGET_ELF)
38900         sprintf (insn_template, "%s %%0,%%2@toc@l(%%1)", insn_str);
38901
38902       else if (TARGET_XCOFF)
38903         sprintf (insn_template, "%s %%0,%%2@l(%%1)", insn_str);
38904
38905       else
38906         gcc_unreachable ();
38907
38908       fuse_ops[2] = XVECEXP (offset, 0, 0);
38909       output_asm_insn (insn_template, fuse_ops);
38910     }
38911
38912   else if (GET_CODE (offset) == PLUS
38913            && GET_CODE (XEXP (offset, 0)) == UNSPEC
38914            && XINT (XEXP (offset, 0), 1) == UNSPEC_TOCREL
38915            && CONST_INT_P (XEXP (offset, 1)))
38916     {
38917       rtx tocrel_unspec = XEXP (offset, 0);
38918       if (TARGET_ELF)
38919         sprintf (insn_template, "%s %%0,%%2+%%3@toc@l(%%1)", insn_str);
38920
38921       else if (TARGET_XCOFF)
38922         sprintf (insn_template, "%s %%0,%%2+%%3@l(%%1)", insn_str);
38923
38924       else
38925         gcc_unreachable ();
38926
38927       fuse_ops[2] = XVECEXP (tocrel_unspec, 0, 0);
38928       fuse_ops[3] = XEXP (offset, 1);
38929       output_asm_insn (insn_template, fuse_ops);
38930     }
38931
38932   else if (TARGET_ELF && !TARGET_POWERPC64 && CONSTANT_P (offset))
38933     {
38934       sprintf (insn_template, "%s %%0,%%2@l(%%1)", insn_str);
38935
38936       fuse_ops[2] = offset;
38937       output_asm_insn (insn_template, fuse_ops);
38938     }
38939
38940   else
38941     fatal_insn ("Unable to generate load/store offset for fusion", offset);
38942
38943   return;
38944 }
38945
38946 /* Given an address, convert it into the addis and load offset parts.  Addresses
38947    created during the peephole2 process look like:
38948         (lo_sum (high (unspec [(sym)] UNSPEC_TOCREL))
38949                 (unspec [(...)] UNSPEC_TOCREL))  */
38950
38951 static void
38952 fusion_split_address (rtx addr, rtx *p_hi, rtx *p_lo)
38953 {
38954   rtx hi, lo;
38955
38956   if (GET_CODE (addr) == PLUS || GET_CODE (addr) == LO_SUM)
38957     {
38958       hi = XEXP (addr, 0);
38959       lo = XEXP (addr, 1);
38960     }
38961   else
38962     gcc_unreachable ();
38963
38964   *p_hi = hi;
38965   *p_lo = lo;
38966 }
38967
38968 /* Return a string to fuse an addis instruction with a gpr load to the same
38969    register that we loaded up the addis instruction.  The address that is used
38970    is the logical address that was formed during peephole2:
38971         (lo_sum (high) (low-part))
38972
38973    The code is complicated, so we call output_asm_insn directly, and just
38974    return "".  */
38975
38976 const char *
38977 emit_fusion_gpr_load (rtx target, rtx mem)
38978 {
38979   rtx addis_value;
38980   rtx addr;
38981   rtx load_offset;
38982   const char *load_str = NULL;
38983   machine_mode mode;
38984
38985   if (GET_CODE (mem) == ZERO_EXTEND)
38986     mem = XEXP (mem, 0);
38987
38988   gcc_assert (REG_P (target) && MEM_P (mem));
38989
38990   addr = XEXP (mem, 0);
38991   fusion_split_address (addr, &addis_value, &load_offset);
38992
38993   /* Now emit the load instruction to the same register.  */
38994   mode = GET_MODE (mem);
38995   switch (mode)
38996     {
38997     case E_QImode:
38998       load_str = "lbz";
38999       break;
39000
39001     case E_HImode:
39002       load_str = "lhz";
39003       break;
39004
39005     case E_SImode:
39006     case E_SFmode:
39007       load_str = "lwz";
39008       break;
39009
39010     case E_DImode:
39011     case E_DFmode:
39012       gcc_assert (TARGET_POWERPC64);
39013       load_str = "ld";
39014       break;
39015
39016     default:
39017       fatal_insn ("Bad GPR fusion", gen_rtx_SET (target, mem));
39018     }
39019
39020   /* Emit the addis instruction.  */
39021   emit_fusion_addis (target, addis_value);
39022
39023   /* Emit the D-form load instruction.  */
39024   emit_fusion_load (target, target, load_offset, load_str);
39025
39026   return "";
39027 }
39028 \f
39029
39030 #ifdef RS6000_GLIBC_ATOMIC_FENV
39031 /* Function declarations for rs6000_atomic_assign_expand_fenv.  */
39032 static tree atomic_hold_decl, atomic_clear_decl, atomic_update_decl;
39033 #endif
39034
39035 /* Implement TARGET_ATOMIC_ASSIGN_EXPAND_FENV hook.  */
39036
39037 static void
39038 rs6000_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update)
39039 {
39040   if (!TARGET_HARD_FLOAT)
39041     {
39042 #ifdef RS6000_GLIBC_ATOMIC_FENV
39043       if (atomic_hold_decl == NULL_TREE)
39044         {
39045           atomic_hold_decl
39046             = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
39047                           get_identifier ("__atomic_feholdexcept"),
39048                           build_function_type_list (void_type_node,
39049                                                     double_ptr_type_node,
39050                                                     NULL_TREE));
39051           TREE_PUBLIC (atomic_hold_decl) = 1;
39052           DECL_EXTERNAL (atomic_hold_decl) = 1;
39053         }
39054
39055       if (atomic_clear_decl == NULL_TREE)
39056         {
39057           atomic_clear_decl
39058             = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
39059                           get_identifier ("__atomic_feclearexcept"),
39060                           build_function_type_list (void_type_node,
39061                                                     NULL_TREE));
39062           TREE_PUBLIC (atomic_clear_decl) = 1;
39063           DECL_EXTERNAL (atomic_clear_decl) = 1;
39064         }
39065
39066       tree const_double = build_qualified_type (double_type_node,
39067                                                 TYPE_QUAL_CONST);
39068       tree const_double_ptr = build_pointer_type (const_double);
39069       if (atomic_update_decl == NULL_TREE)
39070         {
39071           atomic_update_decl
39072             = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
39073                           get_identifier ("__atomic_feupdateenv"),
39074                           build_function_type_list (void_type_node,
39075                                                     const_double_ptr,
39076                                                     NULL_TREE));
39077           TREE_PUBLIC (atomic_update_decl) = 1;
39078           DECL_EXTERNAL (atomic_update_decl) = 1;
39079         }
39080
39081       tree fenv_var = create_tmp_var_raw (double_type_node);
39082       TREE_ADDRESSABLE (fenv_var) = 1;
39083       tree fenv_addr = build1 (ADDR_EXPR, double_ptr_type_node, fenv_var);
39084
39085       *hold = build_call_expr (atomic_hold_decl, 1, fenv_addr);
39086       *clear = build_call_expr (atomic_clear_decl, 0);
39087       *update = build_call_expr (atomic_update_decl, 1,
39088                                  fold_convert (const_double_ptr, fenv_addr));
39089 #endif
39090       return;
39091     }
39092
39093   tree mffs = rs6000_builtin_decls[RS6000_BUILTIN_MFFS];
39094   tree mtfsf = rs6000_builtin_decls[RS6000_BUILTIN_MTFSF];
39095   tree call_mffs = build_call_expr (mffs, 0);
39096
39097   /* Generates the equivalent of feholdexcept (&fenv_var)
39098
39099      *fenv_var = __builtin_mffs ();
39100      double fenv_hold;
39101      *(uint64_t*)&fenv_hold = *(uint64_t*)fenv_var & 0xffffffff00000007LL;
39102      __builtin_mtfsf (0xff, fenv_hold);  */
39103
39104   /* Mask to clear everything except for the rounding modes and non-IEEE
39105      arithmetic flag.  */
39106   const unsigned HOST_WIDE_INT hold_exception_mask =
39107     HOST_WIDE_INT_C (0xffffffff00000007);
39108
39109   tree fenv_var = create_tmp_var_raw (double_type_node);
39110
39111   tree hold_mffs = build2 (MODIFY_EXPR, void_type_node, fenv_var, call_mffs);
39112
39113   tree fenv_llu = build1 (VIEW_CONVERT_EXPR, uint64_type_node, fenv_var);
39114   tree fenv_llu_and = build2 (BIT_AND_EXPR, uint64_type_node, fenv_llu,
39115                               build_int_cst (uint64_type_node,
39116                                              hold_exception_mask));
39117
39118   tree fenv_hold_mtfsf = build1 (VIEW_CONVERT_EXPR, double_type_node,
39119                                  fenv_llu_and);
39120
39121   tree hold_mtfsf = build_call_expr (mtfsf, 2,
39122                                      build_int_cst (unsigned_type_node, 0xff),
39123                                      fenv_hold_mtfsf);
39124
39125   *hold = build2 (COMPOUND_EXPR, void_type_node, hold_mffs, hold_mtfsf);
39126
39127   /* Generates the equivalent of feclearexcept (FE_ALL_EXCEPT):
39128
39129      double fenv_clear = __builtin_mffs ();
39130      *(uint64_t)&fenv_clear &= 0xffffffff00000000LL;
39131      __builtin_mtfsf (0xff, fenv_clear);  */
39132
39133   /* Mask to clear everything except for the rounding modes and non-IEEE
39134      arithmetic flag.  */
39135   const unsigned HOST_WIDE_INT clear_exception_mask =
39136     HOST_WIDE_INT_C (0xffffffff00000000);
39137
39138   tree fenv_clear = create_tmp_var_raw (double_type_node);
39139
39140   tree clear_mffs = build2 (MODIFY_EXPR, void_type_node, fenv_clear, call_mffs);
39141
39142   tree fenv_clean_llu = build1 (VIEW_CONVERT_EXPR, uint64_type_node, fenv_clear);
39143   tree fenv_clear_llu_and = build2 (BIT_AND_EXPR, uint64_type_node,
39144                                     fenv_clean_llu,
39145                                     build_int_cst (uint64_type_node,
39146                                                    clear_exception_mask));
39147
39148   tree fenv_clear_mtfsf = build1 (VIEW_CONVERT_EXPR, double_type_node,
39149                                   fenv_clear_llu_and);
39150
39151   tree clear_mtfsf = build_call_expr (mtfsf, 2,
39152                                       build_int_cst (unsigned_type_node, 0xff),
39153                                       fenv_clear_mtfsf);
39154
39155   *clear = build2 (COMPOUND_EXPR, void_type_node, clear_mffs, clear_mtfsf);
39156
39157   /* Generates the equivalent of feupdateenv (&fenv_var)
39158
39159      double old_fenv = __builtin_mffs ();
39160      double fenv_update;
39161      *(uint64_t*)&fenv_update = (*(uint64_t*)&old & 0xffffffff1fffff00LL) |
39162                                 (*(uint64_t*)fenv_var 0x1ff80fff);
39163      __builtin_mtfsf (0xff, fenv_update);  */
39164
39165   const unsigned HOST_WIDE_INT update_exception_mask =
39166     HOST_WIDE_INT_C (0xffffffff1fffff00);
39167   const unsigned HOST_WIDE_INT new_exception_mask =
39168     HOST_WIDE_INT_C (0x1ff80fff);
39169
39170   tree old_fenv = create_tmp_var_raw (double_type_node);
39171   tree update_mffs = build2 (MODIFY_EXPR, void_type_node, old_fenv, call_mffs);
39172
39173   tree old_llu = build1 (VIEW_CONVERT_EXPR, uint64_type_node, old_fenv);
39174   tree old_llu_and = build2 (BIT_AND_EXPR, uint64_type_node, old_llu,
39175                              build_int_cst (uint64_type_node,
39176                                             update_exception_mask));
39177
39178   tree new_llu_and = build2 (BIT_AND_EXPR, uint64_type_node, fenv_llu,
39179                              build_int_cst (uint64_type_node,
39180                                             new_exception_mask));
39181
39182   tree new_llu_mask = build2 (BIT_IOR_EXPR, uint64_type_node,
39183                               old_llu_and, new_llu_and);
39184
39185   tree fenv_update_mtfsf = build1 (VIEW_CONVERT_EXPR, double_type_node,
39186                                    new_llu_mask);
39187
39188   tree update_mtfsf = build_call_expr (mtfsf, 2,
39189                                        build_int_cst (unsigned_type_node, 0xff),
39190                                        fenv_update_mtfsf);
39191
39192   *update = build2 (COMPOUND_EXPR, void_type_node, update_mffs, update_mtfsf);
39193 }
39194
39195 void
39196 rs6000_generate_float2_double_code (rtx dst, rtx src1, rtx src2)
39197 {
39198   rtx rtx_tmp0, rtx_tmp1, rtx_tmp2, rtx_tmp3;
39199
39200   rtx_tmp0 = gen_reg_rtx (V2DFmode);
39201   rtx_tmp1 = gen_reg_rtx (V2DFmode);
39202
39203   /* The destination of the vmrgew instruction layout is:
39204      rtx_tmp2[0] rtx_tmp3[0] rtx_tmp2[1] rtx_tmp3[0].
39205      Setup rtx_tmp0 and rtx_tmp1 to ensure the order of the elements after the
39206      vmrgew instruction will be correct.  */
39207   if (BYTES_BIG_ENDIAN)
39208     {
39209        emit_insn (gen_vsx_xxpermdi_v2df_be (rtx_tmp0, src1, src2,
39210                                             GEN_INT (0)));
39211        emit_insn (gen_vsx_xxpermdi_v2df_be (rtx_tmp1, src1, src2,
39212                                             GEN_INT (3)));
39213     }
39214   else
39215     {
39216        emit_insn (gen_vsx_xxpermdi_v2df (rtx_tmp0, src1, src2, GEN_INT (3)));
39217        emit_insn (gen_vsx_xxpermdi_v2df (rtx_tmp1, src1, src2, GEN_INT (0)));
39218     }
39219
39220   rtx_tmp2 = gen_reg_rtx (V4SFmode);
39221   rtx_tmp3 = gen_reg_rtx (V4SFmode);
39222
39223   emit_insn (gen_vsx_xvcdpsp (rtx_tmp2, rtx_tmp0));
39224   emit_insn (gen_vsx_xvcdpsp (rtx_tmp3, rtx_tmp1));
39225
39226   if (BYTES_BIG_ENDIAN)
39227     emit_insn (gen_p8_vmrgew_v4sf (dst, rtx_tmp2, rtx_tmp3));
39228   else
39229     emit_insn (gen_p8_vmrgew_v4sf (dst, rtx_tmp3, rtx_tmp2));
39230 }
39231
39232 void
39233 rs6000_generate_float2_code (bool signed_convert, rtx dst, rtx src1, rtx src2)
39234 {
39235   rtx rtx_tmp0, rtx_tmp1, rtx_tmp2, rtx_tmp3;
39236
39237   rtx_tmp0 = gen_reg_rtx (V2DImode);
39238   rtx_tmp1 = gen_reg_rtx (V2DImode);
39239
39240   /* The destination of the vmrgew instruction layout is:
39241      rtx_tmp2[0] rtx_tmp3[0] rtx_tmp2[1] rtx_tmp3[0].
39242      Setup rtx_tmp0 and rtx_tmp1 to ensure the order of the elements after the
39243      vmrgew instruction will be correct.  */
39244   if (BYTES_BIG_ENDIAN)
39245     {
39246       emit_insn (gen_vsx_xxpermdi_v2di_be (rtx_tmp0, src1, src2, GEN_INT (0)));
39247       emit_insn (gen_vsx_xxpermdi_v2di_be (rtx_tmp1, src1, src2, GEN_INT (3)));
39248     }
39249   else
39250     {
39251       emit_insn (gen_vsx_xxpermdi_v2di (rtx_tmp0, src1, src2, GEN_INT (3)));
39252       emit_insn (gen_vsx_xxpermdi_v2di (rtx_tmp1, src1, src2, GEN_INT (0)));
39253     }
39254
39255   rtx_tmp2 = gen_reg_rtx (V4SFmode);
39256   rtx_tmp3 = gen_reg_rtx (V4SFmode);
39257
39258   if (signed_convert)
39259     {
39260       emit_insn (gen_vsx_xvcvsxdsp (rtx_tmp2, rtx_tmp0));
39261       emit_insn (gen_vsx_xvcvsxdsp (rtx_tmp3, rtx_tmp1));
39262     }
39263   else
39264     {
39265        emit_insn (gen_vsx_xvcvuxdsp (rtx_tmp2, rtx_tmp0));
39266        emit_insn (gen_vsx_xvcvuxdsp (rtx_tmp3, rtx_tmp1));
39267     }
39268
39269   if (BYTES_BIG_ENDIAN)
39270     emit_insn (gen_p8_vmrgew_v4sf (dst, rtx_tmp2, rtx_tmp3));
39271   else
39272     emit_insn (gen_p8_vmrgew_v4sf (dst, rtx_tmp3, rtx_tmp2));
39273 }
39274
39275 void
39276 rs6000_generate_vsigned2_code (bool signed_convert, rtx dst, rtx src1,
39277                                rtx src2)
39278 {
39279   rtx rtx_tmp0, rtx_tmp1, rtx_tmp2, rtx_tmp3;
39280
39281   rtx_tmp0 = gen_reg_rtx (V2DFmode);
39282   rtx_tmp1 = gen_reg_rtx (V2DFmode);
39283
39284   emit_insn (gen_vsx_xxpermdi_v2df (rtx_tmp0, src1, src2, GEN_INT (0)));
39285   emit_insn (gen_vsx_xxpermdi_v2df (rtx_tmp1, src1, src2, GEN_INT (3)));
39286
39287   rtx_tmp2 = gen_reg_rtx (V4SImode);
39288   rtx_tmp3 = gen_reg_rtx (V4SImode);
39289
39290   if (signed_convert)
39291     {
39292       emit_insn (gen_vsx_xvcvdpsxws (rtx_tmp2, rtx_tmp0));
39293       emit_insn (gen_vsx_xvcvdpsxws (rtx_tmp3, rtx_tmp1));
39294     }
39295   else
39296     {
39297       emit_insn (gen_vsx_xvcvdpuxws (rtx_tmp2, rtx_tmp0));
39298       emit_insn (gen_vsx_xvcvdpuxws (rtx_tmp3, rtx_tmp1));
39299     }
39300
39301   emit_insn (gen_p8_vmrgew_v4si (dst, rtx_tmp2, rtx_tmp3));
39302 }
39303
39304 /* Implement the TARGET_OPTAB_SUPPORTED_P hook.  */
39305
39306 static bool
39307 rs6000_optab_supported_p (int op, machine_mode mode1, machine_mode,
39308                           optimization_type opt_type)
39309 {
39310   switch (op)
39311     {
39312     case rsqrt_optab:
39313       return (opt_type == OPTIMIZE_FOR_SPEED
39314               && RS6000_RECIP_AUTO_RSQRTE_P (mode1));
39315
39316     default:
39317       return true;
39318     }
39319 }
39320
39321 /* Implement TARGET_CONSTANT_ALIGNMENT.  */
39322
39323 static HOST_WIDE_INT
39324 rs6000_constant_alignment (const_tree exp, HOST_WIDE_INT align)
39325 {
39326   if (TREE_CODE (exp) == STRING_CST
39327       && (STRICT_ALIGNMENT || !optimize_size))
39328     return MAX (align, BITS_PER_WORD);
39329   return align;
39330 }
39331
39332 /* Implement TARGET_STARTING_FRAME_OFFSET.  */
39333
39334 static HOST_WIDE_INT
39335 rs6000_starting_frame_offset (void)
39336 {
39337   if (FRAME_GROWS_DOWNWARD)
39338     return 0;
39339   return RS6000_STARTING_FRAME_OFFSET;
39340 }
39341 \f
39342
39343 /* Create an alias for a mangled name where we have changed the mangling (in
39344    GCC 8.1, we used U10__float128, and now we use u9__ieee128).  This is called
39345    via the target hook TARGET_ASM_GLOBALIZE_DECL_NAME.  */
39346
39347 #if TARGET_ELF && RS6000_WEAK
39348 static void
39349 rs6000_globalize_decl_name (FILE * stream, tree decl)
39350 {
39351   const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
39352
39353   targetm.asm_out.globalize_label (stream, name);
39354
39355   if (rs6000_passes_ieee128 && name[0] == '_' && name[1] == 'Z')
39356     {
39357       tree save_asm_name = DECL_ASSEMBLER_NAME (decl);
39358       const char *old_name;
39359
39360       ieee128_mangling_gcc_8_1 = true;
39361       lang_hooks.set_decl_assembler_name (decl);
39362       old_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
39363       SET_DECL_ASSEMBLER_NAME (decl, save_asm_name);
39364       ieee128_mangling_gcc_8_1 = false;
39365
39366       if (strcmp (name, old_name) != 0)
39367         {
39368           fprintf (stream, "\t.weak %s\n", old_name);
39369           fprintf (stream, "\t.set %s,%s\n", old_name, name);
39370         }
39371     }
39372 }
39373 #endif
39374
39375 \f
39376 /* On 64-bit Linux and Freebsd systems, possibly switch the long double library
39377    function names from <foo>l to <foo>f128 if the default long double type is
39378    IEEE 128-bit.  Typically, with the C and C++ languages, the standard math.h
39379    include file switches the names on systems that support long double as IEEE
39380    128-bit, but that doesn't work if the user uses __builtin_<foo>l directly.
39381    In the future, glibc will export names like __ieee128_sinf128 and we can
39382    switch to using those instead of using sinf128, which pollutes the user's
39383    namespace.
39384
39385    This will switch the names for Fortran math functions as well (which doesn't
39386    use math.h).  However, Fortran needs other changes to the compiler and
39387    library before you can switch the real*16 type at compile time.
39388
39389    We use the TARGET_MANGLE_DECL_ASSEMBLER_NAME hook to change this name.  We
39390    only do this if the default is that long double is IBM extended double, and
39391    the user asked for IEEE 128-bit.  */
39392
39393 static tree
39394 rs6000_mangle_decl_assembler_name (tree decl, tree id)
39395 {
39396   if (!TARGET_IEEEQUAD_DEFAULT && TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
39397       && TREE_CODE (decl) == FUNCTION_DECL && DECL_IS_BUILTIN (decl) )
39398     {
39399       size_t len = IDENTIFIER_LENGTH (id);
39400       const char *name = IDENTIFIER_POINTER (id);
39401
39402       if (name[len - 1] == 'l')
39403         {
39404           bool uses_ieee128_p = false;
39405           tree type = TREE_TYPE (decl);
39406           machine_mode ret_mode = TYPE_MODE (type);
39407
39408           /* See if the function returns a IEEE 128-bit floating point type or
39409              complex type.  */
39410           if (ret_mode == TFmode || ret_mode == TCmode)
39411             uses_ieee128_p = true;
39412           else
39413             {
39414               function_args_iterator args_iter;
39415               tree arg;
39416
39417               /* See if the function passes a IEEE 128-bit floating point type
39418                  or complex type.  */
39419               FOREACH_FUNCTION_ARGS (type, arg, args_iter)
39420                 {
39421                   machine_mode arg_mode = TYPE_MODE (arg);
39422                   if (arg_mode == TFmode || arg_mode == TCmode)
39423                     {
39424                       uses_ieee128_p = true;
39425                       break;
39426                     }
39427                 }
39428             }
39429
39430           /* If we passed or returned an IEEE 128-bit floating point type,
39431              change the name.  */
39432           if (uses_ieee128_p)
39433             {
39434               char *name2 = (char *) alloca (len + 4);
39435               memcpy (name2, name, len - 1);
39436               strcpy (name2 + len - 1, "f128");
39437               id = get_identifier (name2);
39438             }
39439         }
39440     }
39441
39442   return id;
39443 }
39444
39445 \f
39446 struct gcc_target targetm = TARGET_INITIALIZER;
39447
39448 #include "gt-rs6000.h"