8182bf0b70d2d989e3b5c15ee9dcb1ff24f94bdf
[gcc.git] / gcc / config / rs6000 / rs6000.c
1 /* Subroutines used for code generation on IBM RS/6000.
2 Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4 Free Software Foundation, Inc.
5 Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published
11 by the Free Software Foundation; either version 3, or (at your
12 option) any later version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "rtl.h"
28 #include "regs.h"
29 #include "hard-reg-set.h"
30 #include "insn-config.h"
31 #include "conditions.h"
32 #include "insn-attr.h"
33 #include "flags.h"
34 #include "recog.h"
35 #include "obstack.h"
36 #include "tree.h"
37 #include "expr.h"
38 #include "optabs.h"
39 #include "except.h"
40 #include "function.h"
41 #include "output.h"
42 #include "basic-block.h"
43 #include "integrate.h"
44 #include "diagnostic-core.h"
45 #include "toplev.h"
46 #include "ggc.h"
47 #include "hashtab.h"
48 #include "tm_p.h"
49 #include "target.h"
50 #include "target-def.h"
51 #include "langhooks.h"
52 #include "reload.h"
53 #include "cfglayout.h"
54 #include "cfgloop.h"
55 #include "sched-int.h"
56 #include "gimple.h"
57 #include "tree-flow.h"
58 #include "intl.h"
59 #include "params.h"
60 #include "tm-constrs.h"
61 #include "opts.h"
62 #if TARGET_XCOFF
63 #include "xcoffout.h" /* get declarations of xcoff_*_section_name */
64 #endif
65 #if TARGET_MACHO
66 #include "gstab.h" /* for N_SLINE */
67 #endif
68
69 #ifndef TARGET_NO_PROTOTYPE
70 #define TARGET_NO_PROTOTYPE 0
71 #endif
72
73 #define min(A,B) ((A) < (B) ? (A) : (B))
74 #define max(A,B) ((A) > (B) ? (A) : (B))
75
76 /* Structure used to define the rs6000 stack */
77 typedef struct rs6000_stack {
78 int reload_completed; /* stack info won't change from here on */
79 int first_gp_reg_save; /* first callee saved GP register used */
80 int first_fp_reg_save; /* first callee saved FP register used */
81 int first_altivec_reg_save; /* first callee saved AltiVec register used */
82 int lr_save_p; /* true if the link reg needs to be saved */
83 int cr_save_p; /* true if the CR reg needs to be saved */
84 unsigned int vrsave_mask; /* mask of vec registers to save */
85 int push_p; /* true if we need to allocate stack space */
86 int calls_p; /* true if the function makes any calls */
87 int world_save_p; /* true if we're saving *everything*:
88 r13-r31, cr, f14-f31, vrsave, v20-v31 */
89 enum rs6000_abi abi; /* which ABI to use */
90 int gp_save_offset; /* offset to save GP regs from initial SP */
91 int fp_save_offset; /* offset to save FP regs from initial SP */
92 int altivec_save_offset; /* offset to save AltiVec regs from initial SP */
93 int lr_save_offset; /* offset to save LR from initial SP */
94 int cr_save_offset; /* offset to save CR from initial SP */
95 int vrsave_save_offset; /* offset to save VRSAVE from initial SP */
96 int spe_gp_save_offset; /* offset to save spe 64-bit gprs */
97 int varargs_save_offset; /* offset to save the varargs registers */
98 int ehrd_offset; /* offset to EH return data */
99 int reg_size; /* register size (4 or 8) */
100 HOST_WIDE_INT vars_size; /* variable save area size */
101 int parm_size; /* outgoing parameter size */
102 int save_size; /* save area size */
103 int fixed_size; /* fixed size of stack frame */
104 int gp_size; /* size of saved GP registers */
105 int fp_size; /* size of saved FP registers */
106 int altivec_size; /* size of saved AltiVec registers */
107 int cr_size; /* size to hold CR if not in save_size */
108 int vrsave_size; /* size to hold VRSAVE if not in save_size */
109 int altivec_padding_size; /* size of altivec alignment padding if
110 not in save_size */
111 int spe_gp_size; /* size of 64-bit GPR save size for SPE */
112 int spe_padding_size;
113 HOST_WIDE_INT total_size; /* total bytes allocated for stack */
114 int spe_64bit_regs_used;
115 int savres_strategy;
116 } rs6000_stack_t;
117
118 /* A C structure for machine-specific, per-function data.
119 This is added to the cfun structure. */
120 typedef struct GTY(()) machine_function
121 {
122 /* Some local-dynamic symbol. */
123 const char *some_ld_name;
124 /* Whether the instruction chain has been scanned already. */
125 int insn_chain_scanned_p;
126 /* Flags if __builtin_return_address (n) with n >= 1 was used. */
127 int ra_needs_full_frame;
128 /* Flags if __builtin_return_address (0) was used. */
129 int ra_need_lr;
130 /* Cache lr_save_p after expansion of builtin_eh_return. */
131 int lr_save_state;
132 /* Offset from virtual_stack_vars_rtx to the start of the ABI_V4
133 varargs save area. */
134 HOST_WIDE_INT varargs_save_offset;
135 /* Temporary stack slot to use for SDmode copies. This slot is
136 64-bits wide and is allocated early enough so that the offset
137 does not overflow the 16-bit load/store offset field. */
138 rtx sdmode_stack_slot;
139 } machine_function;
140
141 /* Target cpu type */
142
143 struct rs6000_cpu_select rs6000_select[3] =
144 {
145 /* switch name, tune arch */
146 { (const char *)0, "--with-cpu=", 1, 1 },
147 { (const char *)0, "-mcpu=", 1, 1 },
148 { (const char *)0, "-mtune=", 1, 0 },
149 };
150
151 /* String variables to hold the various options. */
152 static const char *rs6000_sched_insert_nops_str;
153 static const char *rs6000_sched_costly_dep_str;
154 static const char *rs6000_recip_name;
155
156 #ifdef USING_ELFOS_H
157 static const char *rs6000_abi_name;
158 static const char *rs6000_sdata_name;
159 #endif
160
161 /* Support targetm.vectorize.builtin_mask_for_load. */
162 static GTY(()) tree altivec_builtin_mask_for_load;
163
164 /* Set to nonzero once AIX common-mode calls have been defined. */
165 static GTY(()) int common_mode_defined;
166
167 /* Label number of label created for -mrelocatable, to call to so we can
168 get the address of the GOT section */
169 static int rs6000_pic_labelno;
170
171 #ifdef USING_ELFOS_H
172 /* Counter for labels which are to be placed in .fixup. */
173 int fixuplabelno = 0;
174 #endif
175
176 /* Whether to use variant of AIX ABI for PowerPC64 Linux. */
177 int dot_symbols;
178
179 /* Specify the machine mode that pointers have. After generation of rtl, the
180 compiler makes no further distinction between pointers and any other objects
181 of this machine mode. The type is unsigned since not all things that
182 include rs6000.h also include machmode.h. */
183 unsigned rs6000_pmode;
184
185 /* Width in bits of a pointer. */
186 unsigned rs6000_pointer_size;
187
188 #ifdef HAVE_AS_GNU_ATTRIBUTE
189 /* Flag whether floating point values have been passed/returned. */
190 static bool rs6000_passes_float;
191 /* Flag whether vector values have been passed/returned. */
192 static bool rs6000_passes_vector;
193 /* Flag whether small (<= 8 byte) structures have been returned. */
194 static bool rs6000_returns_struct;
195 #endif
196
197 /* Value is TRUE if register/mode pair is acceptable. */
198 bool rs6000_hard_regno_mode_ok_p[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
199
200 /* Maximum number of registers needed for a given register class and mode. */
201 unsigned char rs6000_class_max_nregs[NUM_MACHINE_MODES][LIM_REG_CLASSES];
202
203 /* How many registers are needed for a given register and mode. */
204 unsigned char rs6000_hard_regno_nregs[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
205
206 /* Map register number to register class. */
207 enum reg_class rs6000_regno_regclass[FIRST_PSEUDO_REGISTER];
208
209 /* Reload functions based on the type and the vector unit. */
210 static enum insn_code rs6000_vector_reload[NUM_MACHINE_MODES][2];
211
212 /* Built in types. */
213 tree rs6000_builtin_types[RS6000_BTI_MAX];
214 tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
215
216 /* Flag to say the TOC is initialized */
217 int toc_initialized;
218 char toc_label_name[10];
219
220 /* Cached value of rs6000_variable_issue. This is cached in
221 rs6000_variable_issue hook and returned from rs6000_sched_reorder2. */
222 static short cached_can_issue_more;
223
224 static GTY(()) section *read_only_data_section;
225 static GTY(()) section *private_data_section;
226 static GTY(()) section *read_only_private_data_section;
227 static GTY(()) section *sdata2_section;
228 static GTY(()) section *toc_section;
229
230 /* True for any options that were explicitly set. */
231 static struct {
232 bool aix_struct_ret; /* True if -maix-struct-ret was used. */
233 bool alignment; /* True if -malign- was used. */
234 bool spe_abi; /* True if -mabi=spe/no-spe was used. */
235 bool altivec_abi; /* True if -mabi=altivec/no-altivec used. */
236 bool spe; /* True if -mspe= was used. */
237 bool float_gprs; /* True if -mfloat-gprs= was used. */
238 bool long_double; /* True if -mlong-double- was used. */
239 bool ieee; /* True if -mabi=ieee/ibmlongdouble used. */
240 bool vrsave; /* True if -mvrsave was used. */
241 bool cmodel; /* True if -mcmodel was used. */
242 } rs6000_explicit_options;
243
244 struct builtin_description
245 {
246 /* mask is not const because we're going to alter it below. This
247 nonsense will go away when we rewrite the -march infrastructure
248 to give us more target flag bits. */
249 unsigned int mask;
250 const enum insn_code icode;
251 const char *const name;
252 const enum rs6000_builtins code;
253 };
254
255 /* Describe the vector unit used for modes. */
256 enum rs6000_vector rs6000_vector_unit[NUM_MACHINE_MODES];
257 enum rs6000_vector rs6000_vector_mem[NUM_MACHINE_MODES];
258
259 /* Register classes for various constraints that are based on the target
260 switches. */
261 enum reg_class rs6000_constraints[RS6000_CONSTRAINT_MAX];
262
263 /* Describe the alignment of a vector. */
264 int rs6000_vector_align[NUM_MACHINE_MODES];
265
266 /* Map selected modes to types for builtins. */
267 static GTY(()) tree builtin_mode_to_type[MAX_MACHINE_MODE][2];
268
269 /* What modes to automatically generate reciprocal divide estimate (fre) and
270 reciprocal sqrt (frsqrte) for. */
271 unsigned char rs6000_recip_bits[MAX_MACHINE_MODE];
272
273 /* Masks to determine which reciprocal esitmate instructions to generate
274 automatically. */
275 enum rs6000_recip_mask {
276 RECIP_SF_DIV = 0x001, /* Use divide estimate */
277 RECIP_DF_DIV = 0x002,
278 RECIP_V4SF_DIV = 0x004,
279 RECIP_V2DF_DIV = 0x008,
280
281 RECIP_SF_RSQRT = 0x010, /* Use reciprocal sqrt estimate. */
282 RECIP_DF_RSQRT = 0x020,
283 RECIP_V4SF_RSQRT = 0x040,
284 RECIP_V2DF_RSQRT = 0x080,
285
286 /* Various combination of flags for -mrecip=xxx. */
287 RECIP_NONE = 0,
288 RECIP_ALL = (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
289 | RECIP_V2DF_DIV | RECIP_SF_RSQRT | RECIP_DF_RSQRT
290 | RECIP_V4SF_RSQRT | RECIP_V2DF_RSQRT),
291
292 RECIP_HIGH_PRECISION = RECIP_ALL,
293
294 /* On low precision machines like the power5, don't enable double precision
295 reciprocal square root estimate, since it isn't accurate enough. */
296 RECIP_LOW_PRECISION = (RECIP_ALL & ~(RECIP_DF_RSQRT | RECIP_V2DF_RSQRT))
297 };
298
299 /* -mrecip options. */
300 static struct
301 {
302 const char *string; /* option name */
303 unsigned int mask; /* mask bits to set */
304 } recip_options[] = {
305 { "all", RECIP_ALL },
306 { "none", RECIP_NONE },
307 { "div", (RECIP_SF_DIV | RECIP_DF_DIV | RECIP_V4SF_DIV
308 | RECIP_V2DF_DIV) },
309 { "divf", (RECIP_SF_DIV | RECIP_V4SF_DIV) },
310 { "divd", (RECIP_DF_DIV | RECIP_V2DF_DIV) },
311 { "rsqrt", (RECIP_SF_RSQRT | RECIP_DF_RSQRT | RECIP_V4SF_RSQRT
312 | RECIP_V2DF_RSQRT) },
313 { "rsqrtf", (RECIP_SF_RSQRT | RECIP_V4SF_RSQRT) },
314 { "rsqrtd", (RECIP_DF_RSQRT | RECIP_V2DF_RSQRT) },
315 };
316
317 /* 2 argument gen function typedef. */
318 typedef rtx (*gen_2arg_fn_t) (rtx, rtx, rtx);
319
320 \f
321 /* Target cpu costs. */
322
323 struct processor_costs {
324 const int mulsi; /* cost of SImode multiplication. */
325 const int mulsi_const; /* cost of SImode multiplication by constant. */
326 const int mulsi_const9; /* cost of SImode mult by short constant. */
327 const int muldi; /* cost of DImode multiplication. */
328 const int divsi; /* cost of SImode division. */
329 const int divdi; /* cost of DImode division. */
330 const int fp; /* cost of simple SFmode and DFmode insns. */
331 const int dmul; /* cost of DFmode multiplication (and fmadd). */
332 const int sdiv; /* cost of SFmode division (fdivs). */
333 const int ddiv; /* cost of DFmode division (fdiv). */
334 const int cache_line_size; /* cache line size in bytes. */
335 const int l1_cache_size; /* size of l1 cache, in kilobytes. */
336 const int l2_cache_size; /* size of l2 cache, in kilobytes. */
337 const int simultaneous_prefetches; /* number of parallel prefetch
338 operations. */
339 };
340
341 const struct processor_costs *rs6000_cost;
342
343 /* Processor costs (relative to an add) */
344
345 /* Instruction size costs on 32bit processors. */
346 static const
347 struct processor_costs size32_cost = {
348 COSTS_N_INSNS (1), /* mulsi */
349 COSTS_N_INSNS (1), /* mulsi_const */
350 COSTS_N_INSNS (1), /* mulsi_const9 */
351 COSTS_N_INSNS (1), /* muldi */
352 COSTS_N_INSNS (1), /* divsi */
353 COSTS_N_INSNS (1), /* divdi */
354 COSTS_N_INSNS (1), /* fp */
355 COSTS_N_INSNS (1), /* dmul */
356 COSTS_N_INSNS (1), /* sdiv */
357 COSTS_N_INSNS (1), /* ddiv */
358 32,
359 0,
360 0,
361 0,
362 };
363
364 /* Instruction size costs on 64bit processors. */
365 static const
366 struct processor_costs size64_cost = {
367 COSTS_N_INSNS (1), /* mulsi */
368 COSTS_N_INSNS (1), /* mulsi_const */
369 COSTS_N_INSNS (1), /* mulsi_const9 */
370 COSTS_N_INSNS (1), /* muldi */
371 COSTS_N_INSNS (1), /* divsi */
372 COSTS_N_INSNS (1), /* divdi */
373 COSTS_N_INSNS (1), /* fp */
374 COSTS_N_INSNS (1), /* dmul */
375 COSTS_N_INSNS (1), /* sdiv */
376 COSTS_N_INSNS (1), /* ddiv */
377 128,
378 0,
379 0,
380 0,
381 };
382
383 /* Instruction costs on RIOS1 processors. */
384 static const
385 struct processor_costs rios1_cost = {
386 COSTS_N_INSNS (5), /* mulsi */
387 COSTS_N_INSNS (4), /* mulsi_const */
388 COSTS_N_INSNS (3), /* mulsi_const9 */
389 COSTS_N_INSNS (5), /* muldi */
390 COSTS_N_INSNS (19), /* divsi */
391 COSTS_N_INSNS (19), /* divdi */
392 COSTS_N_INSNS (2), /* fp */
393 COSTS_N_INSNS (2), /* dmul */
394 COSTS_N_INSNS (19), /* sdiv */
395 COSTS_N_INSNS (19), /* ddiv */
396 128, /* cache line size */
397 64, /* l1 cache */
398 512, /* l2 cache */
399 0, /* streams */
400 };
401
402 /* Instruction costs on RIOS2 processors. */
403 static const
404 struct processor_costs rios2_cost = {
405 COSTS_N_INSNS (2), /* mulsi */
406 COSTS_N_INSNS (2), /* mulsi_const */
407 COSTS_N_INSNS (2), /* mulsi_const9 */
408 COSTS_N_INSNS (2), /* muldi */
409 COSTS_N_INSNS (13), /* divsi */
410 COSTS_N_INSNS (13), /* divdi */
411 COSTS_N_INSNS (2), /* fp */
412 COSTS_N_INSNS (2), /* dmul */
413 COSTS_N_INSNS (17), /* sdiv */
414 COSTS_N_INSNS (17), /* ddiv */
415 256, /* cache line size */
416 256, /* l1 cache */
417 1024, /* l2 cache */
418 0, /* streams */
419 };
420
421 /* Instruction costs on RS64A processors. */
422 static const
423 struct processor_costs rs64a_cost = {
424 COSTS_N_INSNS (20), /* mulsi */
425 COSTS_N_INSNS (12), /* mulsi_const */
426 COSTS_N_INSNS (8), /* mulsi_const9 */
427 COSTS_N_INSNS (34), /* muldi */
428 COSTS_N_INSNS (65), /* divsi */
429 COSTS_N_INSNS (67), /* divdi */
430 COSTS_N_INSNS (4), /* fp */
431 COSTS_N_INSNS (4), /* dmul */
432 COSTS_N_INSNS (31), /* sdiv */
433 COSTS_N_INSNS (31), /* ddiv */
434 128, /* cache line size */
435 128, /* l1 cache */
436 2048, /* l2 cache */
437 1, /* streams */
438 };
439
440 /* Instruction costs on MPCCORE processors. */
441 static const
442 struct processor_costs mpccore_cost = {
443 COSTS_N_INSNS (2), /* mulsi */
444 COSTS_N_INSNS (2), /* mulsi_const */
445 COSTS_N_INSNS (2), /* mulsi_const9 */
446 COSTS_N_INSNS (2), /* muldi */
447 COSTS_N_INSNS (6), /* divsi */
448 COSTS_N_INSNS (6), /* divdi */
449 COSTS_N_INSNS (4), /* fp */
450 COSTS_N_INSNS (5), /* dmul */
451 COSTS_N_INSNS (10), /* sdiv */
452 COSTS_N_INSNS (17), /* ddiv */
453 32, /* cache line size */
454 4, /* l1 cache */
455 16, /* l2 cache */
456 1, /* streams */
457 };
458
459 /* Instruction costs on PPC403 processors. */
460 static const
461 struct processor_costs ppc403_cost = {
462 COSTS_N_INSNS (4), /* mulsi */
463 COSTS_N_INSNS (4), /* mulsi_const */
464 COSTS_N_INSNS (4), /* mulsi_const9 */
465 COSTS_N_INSNS (4), /* muldi */
466 COSTS_N_INSNS (33), /* divsi */
467 COSTS_N_INSNS (33), /* divdi */
468 COSTS_N_INSNS (11), /* fp */
469 COSTS_N_INSNS (11), /* dmul */
470 COSTS_N_INSNS (11), /* sdiv */
471 COSTS_N_INSNS (11), /* ddiv */
472 32, /* cache line size */
473 4, /* l1 cache */
474 16, /* l2 cache */
475 1, /* streams */
476 };
477
478 /* Instruction costs on PPC405 processors. */
479 static const
480 struct processor_costs ppc405_cost = {
481 COSTS_N_INSNS (5), /* mulsi */
482 COSTS_N_INSNS (4), /* mulsi_const */
483 COSTS_N_INSNS (3), /* mulsi_const9 */
484 COSTS_N_INSNS (5), /* muldi */
485 COSTS_N_INSNS (35), /* divsi */
486 COSTS_N_INSNS (35), /* divdi */
487 COSTS_N_INSNS (11), /* fp */
488 COSTS_N_INSNS (11), /* dmul */
489 COSTS_N_INSNS (11), /* sdiv */
490 COSTS_N_INSNS (11), /* ddiv */
491 32, /* cache line size */
492 16, /* l1 cache */
493 128, /* l2 cache */
494 1, /* streams */
495 };
496
497 /* Instruction costs on PPC440 processors. */
498 static const
499 struct processor_costs ppc440_cost = {
500 COSTS_N_INSNS (3), /* mulsi */
501 COSTS_N_INSNS (2), /* mulsi_const */
502 COSTS_N_INSNS (2), /* mulsi_const9 */
503 COSTS_N_INSNS (3), /* muldi */
504 COSTS_N_INSNS (34), /* divsi */
505 COSTS_N_INSNS (34), /* divdi */
506 COSTS_N_INSNS (5), /* fp */
507 COSTS_N_INSNS (5), /* dmul */
508 COSTS_N_INSNS (19), /* sdiv */
509 COSTS_N_INSNS (33), /* ddiv */
510 32, /* cache line size */
511 32, /* l1 cache */
512 256, /* l2 cache */
513 1, /* streams */
514 };
515
516 /* Instruction costs on PPC476 processors. */
517 static const
518 struct processor_costs ppc476_cost = {
519 COSTS_N_INSNS (4), /* mulsi */
520 COSTS_N_INSNS (4), /* mulsi_const */
521 COSTS_N_INSNS (4), /* mulsi_const9 */
522 COSTS_N_INSNS (4), /* muldi */
523 COSTS_N_INSNS (11), /* divsi */
524 COSTS_N_INSNS (11), /* divdi */
525 COSTS_N_INSNS (6), /* fp */
526 COSTS_N_INSNS (6), /* dmul */
527 COSTS_N_INSNS (19), /* sdiv */
528 COSTS_N_INSNS (33), /* ddiv */
529 32, /* l1 cache line size */
530 32, /* l1 cache */
531 512, /* l2 cache */
532 1, /* streams */
533 };
534
535 /* Instruction costs on PPC601 processors. */
536 static const
537 struct processor_costs ppc601_cost = {
538 COSTS_N_INSNS (5), /* mulsi */
539 COSTS_N_INSNS (5), /* mulsi_const */
540 COSTS_N_INSNS (5), /* mulsi_const9 */
541 COSTS_N_INSNS (5), /* muldi */
542 COSTS_N_INSNS (36), /* divsi */
543 COSTS_N_INSNS (36), /* divdi */
544 COSTS_N_INSNS (4), /* fp */
545 COSTS_N_INSNS (5), /* dmul */
546 COSTS_N_INSNS (17), /* sdiv */
547 COSTS_N_INSNS (31), /* ddiv */
548 32, /* cache line size */
549 32, /* l1 cache */
550 256, /* l2 cache */
551 1, /* streams */
552 };
553
554 /* Instruction costs on PPC603 processors. */
555 static const
556 struct processor_costs ppc603_cost = {
557 COSTS_N_INSNS (5), /* mulsi */
558 COSTS_N_INSNS (3), /* mulsi_const */
559 COSTS_N_INSNS (2), /* mulsi_const9 */
560 COSTS_N_INSNS (5), /* muldi */
561 COSTS_N_INSNS (37), /* divsi */
562 COSTS_N_INSNS (37), /* divdi */
563 COSTS_N_INSNS (3), /* fp */
564 COSTS_N_INSNS (4), /* dmul */
565 COSTS_N_INSNS (18), /* sdiv */
566 COSTS_N_INSNS (33), /* ddiv */
567 32, /* cache line size */
568 8, /* l1 cache */
569 64, /* l2 cache */
570 1, /* streams */
571 };
572
573 /* Instruction costs on PPC604 processors. */
574 static const
575 struct processor_costs ppc604_cost = {
576 COSTS_N_INSNS (4), /* mulsi */
577 COSTS_N_INSNS (4), /* mulsi_const */
578 COSTS_N_INSNS (4), /* mulsi_const9 */
579 COSTS_N_INSNS (4), /* muldi */
580 COSTS_N_INSNS (20), /* divsi */
581 COSTS_N_INSNS (20), /* divdi */
582 COSTS_N_INSNS (3), /* fp */
583 COSTS_N_INSNS (3), /* dmul */
584 COSTS_N_INSNS (18), /* sdiv */
585 COSTS_N_INSNS (32), /* ddiv */
586 32, /* cache line size */
587 16, /* l1 cache */
588 512, /* l2 cache */
589 1, /* streams */
590 };
591
592 /* Instruction costs on PPC604e processors. */
593 static const
594 struct processor_costs ppc604e_cost = {
595 COSTS_N_INSNS (2), /* mulsi */
596 COSTS_N_INSNS (2), /* mulsi_const */
597 COSTS_N_INSNS (2), /* mulsi_const9 */
598 COSTS_N_INSNS (2), /* muldi */
599 COSTS_N_INSNS (20), /* divsi */
600 COSTS_N_INSNS (20), /* divdi */
601 COSTS_N_INSNS (3), /* fp */
602 COSTS_N_INSNS (3), /* dmul */
603 COSTS_N_INSNS (18), /* sdiv */
604 COSTS_N_INSNS (32), /* ddiv */
605 32, /* cache line size */
606 32, /* l1 cache */
607 1024, /* l2 cache */
608 1, /* streams */
609 };
610
611 /* Instruction costs on PPC620 processors. */
612 static const
613 struct processor_costs ppc620_cost = {
614 COSTS_N_INSNS (5), /* mulsi */
615 COSTS_N_INSNS (4), /* mulsi_const */
616 COSTS_N_INSNS (3), /* mulsi_const9 */
617 COSTS_N_INSNS (7), /* muldi */
618 COSTS_N_INSNS (21), /* divsi */
619 COSTS_N_INSNS (37), /* divdi */
620 COSTS_N_INSNS (3), /* fp */
621 COSTS_N_INSNS (3), /* dmul */
622 COSTS_N_INSNS (18), /* sdiv */
623 COSTS_N_INSNS (32), /* ddiv */
624 128, /* cache line size */
625 32, /* l1 cache */
626 1024, /* l2 cache */
627 1, /* streams */
628 };
629
630 /* Instruction costs on PPC630 processors. */
631 static const
632 struct processor_costs ppc630_cost = {
633 COSTS_N_INSNS (5), /* mulsi */
634 COSTS_N_INSNS (4), /* mulsi_const */
635 COSTS_N_INSNS (3), /* mulsi_const9 */
636 COSTS_N_INSNS (7), /* muldi */
637 COSTS_N_INSNS (21), /* divsi */
638 COSTS_N_INSNS (37), /* divdi */
639 COSTS_N_INSNS (3), /* fp */
640 COSTS_N_INSNS (3), /* dmul */
641 COSTS_N_INSNS (17), /* sdiv */
642 COSTS_N_INSNS (21), /* ddiv */
643 128, /* cache line size */
644 64, /* l1 cache */
645 1024, /* l2 cache */
646 1, /* streams */
647 };
648
649 /* Instruction costs on Cell processor. */
650 /* COSTS_N_INSNS (1) ~ one add. */
651 static const
652 struct processor_costs ppccell_cost = {
653 COSTS_N_INSNS (9/2)+2, /* mulsi */
654 COSTS_N_INSNS (6/2), /* mulsi_const */
655 COSTS_N_INSNS (6/2), /* mulsi_const9 */
656 COSTS_N_INSNS (15/2)+2, /* muldi */
657 COSTS_N_INSNS (38/2), /* divsi */
658 COSTS_N_INSNS (70/2), /* divdi */
659 COSTS_N_INSNS (10/2), /* fp */
660 COSTS_N_INSNS (10/2), /* dmul */
661 COSTS_N_INSNS (74/2), /* sdiv */
662 COSTS_N_INSNS (74/2), /* ddiv */
663 128, /* cache line size */
664 32, /* l1 cache */
665 512, /* l2 cache */
666 6, /* streams */
667 };
668
669 /* Instruction costs on PPC750 and PPC7400 processors. */
670 static const
671 struct processor_costs ppc750_cost = {
672 COSTS_N_INSNS (5), /* mulsi */
673 COSTS_N_INSNS (3), /* mulsi_const */
674 COSTS_N_INSNS (2), /* mulsi_const9 */
675 COSTS_N_INSNS (5), /* muldi */
676 COSTS_N_INSNS (17), /* divsi */
677 COSTS_N_INSNS (17), /* divdi */
678 COSTS_N_INSNS (3), /* fp */
679 COSTS_N_INSNS (3), /* dmul */
680 COSTS_N_INSNS (17), /* sdiv */
681 COSTS_N_INSNS (31), /* ddiv */
682 32, /* cache line size */
683 32, /* l1 cache */
684 512, /* l2 cache */
685 1, /* streams */
686 };
687
688 /* Instruction costs on PPC7450 processors. */
689 static const
690 struct processor_costs ppc7450_cost = {
691 COSTS_N_INSNS (4), /* mulsi */
692 COSTS_N_INSNS (3), /* mulsi_const */
693 COSTS_N_INSNS (3), /* mulsi_const9 */
694 COSTS_N_INSNS (4), /* muldi */
695 COSTS_N_INSNS (23), /* divsi */
696 COSTS_N_INSNS (23), /* divdi */
697 COSTS_N_INSNS (5), /* fp */
698 COSTS_N_INSNS (5), /* dmul */
699 COSTS_N_INSNS (21), /* sdiv */
700 COSTS_N_INSNS (35), /* ddiv */
701 32, /* cache line size */
702 32, /* l1 cache */
703 1024, /* l2 cache */
704 1, /* streams */
705 };
706
707 /* Instruction costs on PPC8540 processors. */
708 static const
709 struct processor_costs ppc8540_cost = {
710 COSTS_N_INSNS (4), /* mulsi */
711 COSTS_N_INSNS (4), /* mulsi_const */
712 COSTS_N_INSNS (4), /* mulsi_const9 */
713 COSTS_N_INSNS (4), /* muldi */
714 COSTS_N_INSNS (19), /* divsi */
715 COSTS_N_INSNS (19), /* divdi */
716 COSTS_N_INSNS (4), /* fp */
717 COSTS_N_INSNS (4), /* dmul */
718 COSTS_N_INSNS (29), /* sdiv */
719 COSTS_N_INSNS (29), /* ddiv */
720 32, /* cache line size */
721 32, /* l1 cache */
722 256, /* l2 cache */
723 1, /* prefetch streams /*/
724 };
725
726 /* Instruction costs on E300C2 and E300C3 cores. */
727 static const
728 struct processor_costs ppce300c2c3_cost = {
729 COSTS_N_INSNS (4), /* mulsi */
730 COSTS_N_INSNS (4), /* mulsi_const */
731 COSTS_N_INSNS (4), /* mulsi_const9 */
732 COSTS_N_INSNS (4), /* muldi */
733 COSTS_N_INSNS (19), /* divsi */
734 COSTS_N_INSNS (19), /* divdi */
735 COSTS_N_INSNS (3), /* fp */
736 COSTS_N_INSNS (4), /* dmul */
737 COSTS_N_INSNS (18), /* sdiv */
738 COSTS_N_INSNS (33), /* ddiv */
739 32,
740 16, /* l1 cache */
741 16, /* l2 cache */
742 1, /* prefetch streams /*/
743 };
744
745 /* Instruction costs on PPCE500MC processors. */
746 static const
747 struct processor_costs ppce500mc_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 (14), /* divsi */
753 COSTS_N_INSNS (14), /* divdi */
754 COSTS_N_INSNS (8), /* fp */
755 COSTS_N_INSNS (10), /* dmul */
756 COSTS_N_INSNS (36), /* sdiv */
757 COSTS_N_INSNS (66), /* ddiv */
758 64, /* cache line size */
759 32, /* l1 cache */
760 128, /* l2 cache */
761 1, /* prefetch streams /*/
762 };
763
764 /* Instruction costs on PPCE500MC64 processors. */
765 static const
766 struct processor_costs ppce500mc64_cost = {
767 COSTS_N_INSNS (4), /* mulsi */
768 COSTS_N_INSNS (4), /* mulsi_const */
769 COSTS_N_INSNS (4), /* mulsi_const9 */
770 COSTS_N_INSNS (4), /* muldi */
771 COSTS_N_INSNS (14), /* divsi */
772 COSTS_N_INSNS (14), /* divdi */
773 COSTS_N_INSNS (4), /* fp */
774 COSTS_N_INSNS (10), /* dmul */
775 COSTS_N_INSNS (36), /* sdiv */
776 COSTS_N_INSNS (66), /* ddiv */
777 64, /* cache line size */
778 32, /* l1 cache */
779 128, /* l2 cache */
780 1, /* prefetch streams /*/
781 };
782
783 /* Instruction costs on AppliedMicro Titan processors. */
784 static const
785 struct processor_costs titan_cost = {
786 COSTS_N_INSNS (5), /* mulsi */
787 COSTS_N_INSNS (5), /* mulsi_const */
788 COSTS_N_INSNS (5), /* mulsi_const9 */
789 COSTS_N_INSNS (5), /* muldi */
790 COSTS_N_INSNS (18), /* divsi */
791 COSTS_N_INSNS (18), /* divdi */
792 COSTS_N_INSNS (10), /* fp */
793 COSTS_N_INSNS (10), /* dmul */
794 COSTS_N_INSNS (46), /* sdiv */
795 COSTS_N_INSNS (72), /* ddiv */
796 32, /* cache line size */
797 32, /* l1 cache */
798 512, /* l2 cache */
799 1, /* prefetch streams /*/
800 };
801
802 /* Instruction costs on POWER4 and POWER5 processors. */
803 static const
804 struct processor_costs power4_cost = {
805 COSTS_N_INSNS (3), /* mulsi */
806 COSTS_N_INSNS (2), /* mulsi_const */
807 COSTS_N_INSNS (2), /* mulsi_const9 */
808 COSTS_N_INSNS (4), /* muldi */
809 COSTS_N_INSNS (18), /* divsi */
810 COSTS_N_INSNS (34), /* divdi */
811 COSTS_N_INSNS (3), /* fp */
812 COSTS_N_INSNS (3), /* dmul */
813 COSTS_N_INSNS (17), /* sdiv */
814 COSTS_N_INSNS (17), /* ddiv */
815 128, /* cache line size */
816 32, /* l1 cache */
817 1024, /* l2 cache */
818 8, /* prefetch streams /*/
819 };
820
821 /* Instruction costs on POWER6 processors. */
822 static const
823 struct processor_costs power6_cost = {
824 COSTS_N_INSNS (8), /* mulsi */
825 COSTS_N_INSNS (8), /* mulsi_const */
826 COSTS_N_INSNS (8), /* mulsi_const9 */
827 COSTS_N_INSNS (8), /* muldi */
828 COSTS_N_INSNS (22), /* divsi */
829 COSTS_N_INSNS (28), /* divdi */
830 COSTS_N_INSNS (3), /* fp */
831 COSTS_N_INSNS (3), /* dmul */
832 COSTS_N_INSNS (13), /* sdiv */
833 COSTS_N_INSNS (16), /* ddiv */
834 128, /* cache line size */
835 64, /* l1 cache */
836 2048, /* l2 cache */
837 16, /* prefetch streams */
838 };
839
840 /* Instruction costs on POWER7 processors. */
841 static const
842 struct processor_costs power7_cost = {
843 COSTS_N_INSNS (2), /* mulsi */
844 COSTS_N_INSNS (2), /* mulsi_const */
845 COSTS_N_INSNS (2), /* mulsi_const9 */
846 COSTS_N_INSNS (2), /* muldi */
847 COSTS_N_INSNS (18), /* divsi */
848 COSTS_N_INSNS (34), /* divdi */
849 COSTS_N_INSNS (3), /* fp */
850 COSTS_N_INSNS (3), /* dmul */
851 COSTS_N_INSNS (13), /* sdiv */
852 COSTS_N_INSNS (16), /* ddiv */
853 128, /* cache line size */
854 32, /* l1 cache */
855 256, /* l2 cache */
856 12, /* prefetch streams */
857 };
858
859 /* Instruction costs on POWER A2 processors. */
860 static const
861 struct processor_costs ppca2_cost = {
862 COSTS_N_INSNS (16), /* mulsi */
863 COSTS_N_INSNS (16), /* mulsi_const */
864 COSTS_N_INSNS (16), /* mulsi_const9 */
865 COSTS_N_INSNS (16), /* muldi */
866 COSTS_N_INSNS (22), /* divsi */
867 COSTS_N_INSNS (28), /* divdi */
868 COSTS_N_INSNS (3), /* fp */
869 COSTS_N_INSNS (3), /* dmul */
870 COSTS_N_INSNS (59), /* sdiv */
871 COSTS_N_INSNS (72), /* ddiv */
872 64,
873 16, /* l1 cache */
874 2048, /* l2 cache */
875 16, /* prefetch streams */
876 };
877
878 \f
879 /* Table that classifies rs6000 builtin functions (pure, const, etc.). */
880 #undef RS6000_BUILTIN
881 #undef RS6000_BUILTIN_EQUATE
882 #define RS6000_BUILTIN(NAME, TYPE) TYPE,
883 #define RS6000_BUILTIN_EQUATE(NAME, VALUE)
884
885 static const enum rs6000_btc builtin_classify[(int)RS6000_BUILTIN_COUNT] =
886 {
887 #include "rs6000-builtin.def"
888 };
889
890 #undef RS6000_BUILTIN
891 #undef RS6000_BUILTIN_EQUATE
892
893 /* Support for -mveclibabi=<xxx> to control which vector library to use. */
894 static tree (*rs6000_veclib_handler) (tree, tree, tree);
895
896 \f
897 static bool rs6000_function_ok_for_sibcall (tree, tree);
898 static const char *rs6000_invalid_within_doloop (const_rtx);
899 static bool rs6000_legitimate_address_p (enum machine_mode, rtx, bool);
900 static bool rs6000_debug_legitimate_address_p (enum machine_mode, rtx, bool);
901 static rtx rs6000_generate_compare (rtx, enum machine_mode);
902 static void rs6000_emit_stack_tie (void);
903 static void rs6000_frame_related (rtx, rtx, HOST_WIDE_INT, rtx, rtx);
904 static bool spe_func_has_64bit_regs_p (void);
905 static void emit_frame_save (rtx, rtx, enum machine_mode, unsigned int,
906 int, HOST_WIDE_INT);
907 static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
908 static unsigned rs6000_hash_constant (rtx);
909 static unsigned toc_hash_function (const void *);
910 static int toc_hash_eq (const void *, const void *);
911 static bool reg_offset_addressing_ok_p (enum machine_mode);
912 static bool virtual_stack_registers_memory_p (rtx);
913 static bool constant_pool_expr_p (rtx);
914 static bool legitimate_small_data_p (enum machine_mode, rtx);
915 static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
916 static struct machine_function * rs6000_init_machine_status (void);
917 static bool rs6000_assemble_integer (rtx, unsigned int, int);
918 static bool no_global_regs_above (int, bool);
919 #ifdef HAVE_GAS_HIDDEN
920 static void rs6000_assemble_visibility (tree, int);
921 #endif
922 static int rs6000_ra_ever_killed (void);
923 static bool rs6000_attribute_takes_identifier_p (const_tree);
924 static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
925 static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
926 static bool rs6000_ms_bitfield_layout_p (const_tree);
927 static tree rs6000_handle_struct_attribute (tree *, tree, tree, int, bool *);
928 static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
929 static const char *rs6000_mangle_type (const_tree);
930 static void rs6000_set_default_type_attributes (tree);
931 static rtx rs6000_savres_routine_sym (rs6000_stack_t *, bool, bool, bool);
932 static rtx rs6000_emit_stack_reset (rs6000_stack_t *, rtx, rtx, int, bool);
933 static rtx rs6000_make_savres_rtx (rs6000_stack_t *, rtx, int,
934 enum machine_mode, bool, bool, bool);
935 static bool rs6000_reg_live_or_pic_offset_p (int);
936 static tree rs6000_builtin_vectorized_libmass (tree, tree, tree);
937 static tree rs6000_builtin_vectorized_function (tree, tree, tree);
938 static void rs6000_restore_saved_cr (rtx, int);
939 static bool rs6000_output_addr_const_extra (FILE *, rtx);
940 static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT);
941 static void rs6000_output_function_epilogue (FILE *, HOST_WIDE_INT);
942 static void rs6000_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
943 tree);
944 static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
945 static bool rs6000_return_in_memory (const_tree, const_tree);
946 static rtx rs6000_function_value (const_tree, const_tree, bool);
947 static void rs6000_file_start (void);
948 #if TARGET_ELF
949 static int rs6000_elf_reloc_rw_mask (void);
950 static void rs6000_elf_asm_out_constructor (rtx, int) ATTRIBUTE_UNUSED;
951 static void rs6000_elf_asm_out_destructor (rtx, int) ATTRIBUTE_UNUSED;
952 static void rs6000_elf_file_end (void) ATTRIBUTE_UNUSED;
953 static void rs6000_elf_asm_init_sections (void);
954 static section *rs6000_elf_select_rtx_section (enum machine_mode, rtx,
955 unsigned HOST_WIDE_INT);
956 static void rs6000_elf_encode_section_info (tree, rtx, int)
957 ATTRIBUTE_UNUSED;
958 #endif
959 static bool rs6000_use_blocks_for_constant_p (enum machine_mode, const_rtx);
960 static void rs6000_alloc_sdmode_stack_slot (void);
961 static void rs6000_instantiate_decls (void);
962 #if TARGET_XCOFF
963 static void rs6000_xcoff_asm_output_anchor (rtx);
964 static void rs6000_xcoff_asm_globalize_label (FILE *, const char *);
965 static void rs6000_xcoff_asm_init_sections (void);
966 static int rs6000_xcoff_reloc_rw_mask (void);
967 static void rs6000_xcoff_asm_named_section (const char *, unsigned int, tree);
968 static section *rs6000_xcoff_select_section (tree, int,
969 unsigned HOST_WIDE_INT);
970 static void rs6000_xcoff_unique_section (tree, int);
971 static section *rs6000_xcoff_select_rtx_section
972 (enum machine_mode, rtx, unsigned HOST_WIDE_INT);
973 static const char * rs6000_xcoff_strip_name_encoding (const char *);
974 static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
975 static void rs6000_xcoff_file_start (void);
976 static void rs6000_xcoff_file_end (void);
977 #endif
978 static int rs6000_variable_issue (FILE *, int, rtx, int);
979 static int rs6000_register_move_cost (enum machine_mode,
980 reg_class_t, reg_class_t);
981 static int rs6000_memory_move_cost (enum machine_mode, reg_class_t, bool);
982 static bool rs6000_rtx_costs (rtx, int, int, int *, bool);
983 static bool rs6000_debug_rtx_costs (rtx, int, int, int *, bool);
984 static int rs6000_debug_address_cost (rtx, bool);
985 static int rs6000_adjust_cost (rtx, rtx, rtx, int);
986 static int rs6000_debug_adjust_cost (rtx, rtx, rtx, int);
987 static void rs6000_sched_init (FILE *, int, int);
988 static bool is_microcoded_insn (rtx);
989 static bool is_nonpipeline_insn (rtx);
990 static bool is_cracked_insn (rtx);
991 static bool is_branch_slot_insn (rtx);
992 static bool is_load_insn (rtx);
993 static rtx get_store_dest (rtx pat);
994 static bool is_store_insn (rtx);
995 static bool set_to_load_agen (rtx,rtx);
996 static bool adjacent_mem_locations (rtx,rtx);
997 static int rs6000_adjust_priority (rtx, int);
998 static int rs6000_issue_rate (void);
999 static bool rs6000_is_costly_dependence (dep_t, int, int);
1000 static rtx get_next_active_insn (rtx, rtx);
1001 static bool insn_terminates_group_p (rtx , enum group_termination);
1002 static bool insn_must_be_first_in_group (rtx);
1003 static bool insn_must_be_last_in_group (rtx);
1004 static bool is_costly_group (rtx *, rtx);
1005 static int force_new_group (int, FILE *, rtx *, rtx, bool *, int, int *);
1006 static int redefine_groups (FILE *, int, rtx, rtx);
1007 static int pad_groups (FILE *, int, rtx, rtx);
1008 static void rs6000_sched_finish (FILE *, int);
1009 static int rs6000_sched_reorder (FILE *, int, rtx *, int *, int);
1010 static int rs6000_sched_reorder2 (FILE *, int, rtx *, int *, int);
1011 static int rs6000_use_sched_lookahead (void);
1012 static int rs6000_use_sched_lookahead_guard (rtx);
1013 static void * rs6000_alloc_sched_context (void);
1014 static void rs6000_init_sched_context (void *, bool);
1015 static void rs6000_set_sched_context (void *);
1016 static void rs6000_free_sched_context (void *);
1017 static tree rs6000_builtin_reciprocal (unsigned int, bool, bool);
1018 static tree rs6000_builtin_mask_for_load (void);
1019 static tree rs6000_builtin_mul_widen_even (tree);
1020 static tree rs6000_builtin_mul_widen_odd (tree);
1021 static tree rs6000_builtin_conversion (unsigned int, tree, tree);
1022 static tree rs6000_builtin_vec_perm (tree, tree *);
1023 static bool rs6000_builtin_support_vector_misalignment (enum
1024 machine_mode,
1025 const_tree,
1026 int, bool);
1027 static int rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt,
1028 tree, int);
1029 static enum machine_mode rs6000_preferred_simd_mode (enum machine_mode);
1030
1031 static void def_builtin (int, const char *, tree, int);
1032 static bool rs6000_vector_alignment_reachable (const_tree, bool);
1033 static void rs6000_init_builtins (void);
1034 static tree rs6000_builtin_decl (unsigned, bool);
1035
1036 static rtx rs6000_expand_unop_builtin (enum insn_code, tree, rtx);
1037 static rtx rs6000_expand_binop_builtin (enum insn_code, tree, rtx);
1038 static rtx rs6000_expand_ternop_builtin (enum insn_code, tree, rtx);
1039 static rtx rs6000_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
1040 static void altivec_init_builtins (void);
1041 static unsigned builtin_hash_function (const void *);
1042 static int builtin_hash_eq (const void *, const void *);
1043 static tree builtin_function_type (enum machine_mode, enum machine_mode,
1044 enum machine_mode, enum machine_mode,
1045 enum rs6000_builtins, const char *name);
1046 static void rs6000_common_init_builtins (void);
1047 static void rs6000_init_libfuncs (void);
1048
1049 static void paired_init_builtins (void);
1050 static rtx paired_expand_builtin (tree, rtx, bool *);
1051 static rtx paired_expand_lv_builtin (enum insn_code, tree, rtx);
1052 static rtx paired_expand_stv_builtin (enum insn_code, tree);
1053 static rtx paired_expand_predicate_builtin (enum insn_code, tree, rtx);
1054
1055 static void enable_mask_for_builtins (struct builtin_description *, int,
1056 enum rs6000_builtins,
1057 enum rs6000_builtins);
1058 static void spe_init_builtins (void);
1059 static rtx spe_expand_builtin (tree, rtx, bool *);
1060 static rtx spe_expand_stv_builtin (enum insn_code, tree);
1061 static rtx spe_expand_predicate_builtin (enum insn_code, tree, rtx);
1062 static rtx spe_expand_evsel_builtin (enum insn_code, tree, rtx);
1063 static int rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
1064 static rs6000_stack_t *rs6000_stack_info (void);
1065 static void debug_stack_info (rs6000_stack_t *);
1066
1067 static rtx altivec_expand_builtin (tree, rtx, bool *);
1068 static rtx altivec_expand_ld_builtin (tree, rtx, bool *);
1069 static rtx altivec_expand_st_builtin (tree, rtx, bool *);
1070 static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
1071 static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
1072 static rtx altivec_expand_predicate_builtin (enum insn_code, tree, rtx);
1073 static rtx altivec_expand_stv_builtin (enum insn_code, tree);
1074 static rtx altivec_expand_vec_init_builtin (tree, tree, rtx);
1075 static rtx altivec_expand_vec_set_builtin (tree);
1076 static rtx altivec_expand_vec_ext_builtin (tree, rtx);
1077 static int get_element_number (tree, tree);
1078 static void rs6000_option_override (void);
1079 static void rs6000_option_init_struct (struct gcc_options *);
1080 static void rs6000_option_default_params (void);
1081 static bool rs6000_handle_option (struct gcc_options *, struct gcc_options *,
1082 const struct cl_decoded_option *,
1083 location_t);
1084 static int rs6000_loop_align_max_skip (rtx);
1085 static int first_altivec_reg_to_save (void);
1086 static unsigned int compute_vrsave_mask (void);
1087 static void compute_save_world_info (rs6000_stack_t *info_ptr);
1088 static void is_altivec_return_reg (rtx, void *);
1089 static rtx generate_set_vrsave (rtx, rs6000_stack_t *, int);
1090 int easy_vector_constant (rtx, enum machine_mode);
1091 static rtx rs6000_dwarf_register_span (rtx);
1092 static void rs6000_init_dwarf_reg_sizes_extra (tree);
1093 static rtx rs6000_legitimize_address (rtx, rtx, enum machine_mode);
1094 static rtx rs6000_debug_legitimize_address (rtx, rtx, enum machine_mode);
1095 static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
1096 static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
1097 static rtx rs6000_delegitimize_address (rtx);
1098 static rtx rs6000_tls_get_addr (void);
1099 static rtx rs6000_got_sym (void);
1100 static int rs6000_tls_symbol_ref_1 (rtx *, void *);
1101 static const char *rs6000_get_some_local_dynamic_name (void);
1102 static int rs6000_get_some_local_dynamic_name_1 (rtx *, void *);
1103 static rtx rs6000_complex_function_value (enum machine_mode);
1104 static rtx rs6000_spe_function_arg (const CUMULATIVE_ARGS *,
1105 enum machine_mode, const_tree);
1106 static void rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *,
1107 HOST_WIDE_INT, int);
1108 static void rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *,
1109 const_tree,
1110 HOST_WIDE_INT);
1111 static void rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *,
1112 HOST_WIDE_INT,
1113 rtx[], int *);
1114 static void rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *,
1115 const_tree, HOST_WIDE_INT,
1116 rtx[], int *);
1117 static rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, const_tree, bool, bool);
1118 static rtx rs6000_mixed_function_arg (enum machine_mode, const_tree, int);
1119 static void rs6000_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
1120 const_tree, bool);
1121 static rtx rs6000_function_arg (CUMULATIVE_ARGS *, enum machine_mode,
1122 const_tree, bool);
1123 static unsigned int rs6000_function_arg_boundary (enum machine_mode,
1124 const_tree);
1125 static void rs6000_move_block_from_reg (int regno, rtx x, int nregs);
1126 static void setup_incoming_varargs (CUMULATIVE_ARGS *,
1127 enum machine_mode, tree,
1128 int *, int);
1129 static bool rs6000_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
1130 const_tree, bool);
1131 static int rs6000_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
1132 tree, bool);
1133 static const char *invalid_arg_for_unprototyped_fn (const_tree, const_tree, const_tree);
1134 #if TARGET_MACHO
1135 static void macho_branch_islands (void);
1136 static int no_previous_def (tree function_name);
1137 static tree get_prev_label (tree function_name);
1138 static void rs6000_darwin_file_start (void);
1139 #endif
1140
1141 static tree rs6000_build_builtin_va_list (void);
1142 static void rs6000_va_start (tree, rtx);
1143 static tree rs6000_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
1144 static bool rs6000_must_pass_in_stack (enum machine_mode, const_tree);
1145 static bool rs6000_scalar_mode_supported_p (enum machine_mode);
1146 static bool rs6000_vector_mode_supported_p (enum machine_mode);
1147 static rtx rs6000_emit_vector_compare_inner (enum rtx_code, rtx, rtx);
1148 static rtx rs6000_emit_vector_compare (enum rtx_code, rtx, rtx,
1149 enum machine_mode);
1150 static tree rs6000_stack_protect_fail (void);
1151
1152 static rtx rs6000_legitimize_reload_address (rtx, enum machine_mode, int, int,
1153 int, int *);
1154
1155 static rtx rs6000_debug_legitimize_reload_address (rtx, enum machine_mode, int,
1156 int, int, int *);
1157
1158 rtx (*rs6000_legitimize_reload_address_ptr) (rtx, enum machine_mode, int, int,
1159 int, int *)
1160 = rs6000_legitimize_reload_address;
1161
1162 static bool rs6000_mode_dependent_address_p (const_rtx);
1163 static bool rs6000_mode_dependent_address (const_rtx);
1164 static bool rs6000_debug_mode_dependent_address (const_rtx);
1165 static bool (*rs6000_mode_dependent_address_ptr) (const_rtx)
1166 = rs6000_mode_dependent_address;
1167
1168 static enum reg_class rs6000_secondary_reload_class (enum reg_class,
1169 enum machine_mode, rtx);
1170 static enum reg_class rs6000_debug_secondary_reload_class (enum reg_class,
1171 enum machine_mode,
1172 rtx);
1173 enum reg_class (*rs6000_secondary_reload_class_ptr) (enum reg_class,
1174 enum machine_mode, rtx)
1175 = rs6000_secondary_reload_class;
1176
1177 static enum reg_class rs6000_preferred_reload_class (rtx, enum reg_class);
1178 static enum reg_class rs6000_debug_preferred_reload_class (rtx,
1179 enum reg_class);
1180 enum reg_class (*rs6000_preferred_reload_class_ptr) (rtx, enum reg_class)
1181 = rs6000_preferred_reload_class;
1182
1183 static bool rs6000_secondary_memory_needed (enum reg_class, enum reg_class,
1184 enum machine_mode);
1185
1186 static bool rs6000_debug_secondary_memory_needed (enum reg_class,
1187 enum reg_class,
1188 enum machine_mode);
1189
1190 bool (*rs6000_secondary_memory_needed_ptr) (enum reg_class, enum reg_class,
1191 enum machine_mode)
1192 = rs6000_secondary_memory_needed;
1193
1194 static bool rs6000_cannot_change_mode_class (enum machine_mode,
1195 enum machine_mode,
1196 enum reg_class);
1197 static bool rs6000_debug_cannot_change_mode_class (enum machine_mode,
1198 enum machine_mode,
1199 enum reg_class);
1200
1201 bool (*rs6000_cannot_change_mode_class_ptr) (enum machine_mode,
1202 enum machine_mode,
1203 enum reg_class)
1204 = rs6000_cannot_change_mode_class;
1205
1206 static reg_class_t rs6000_secondary_reload (bool, rtx, reg_class_t,
1207 enum machine_mode,
1208 struct secondary_reload_info *);
1209
1210 const int INSN_NOT_AVAILABLE = -1;
1211 static enum machine_mode rs6000_eh_return_filter_mode (void);
1212 static bool rs6000_can_eliminate (const int, const int);
1213 static void rs6000_conditional_register_usage (void);
1214 static void rs6000_trampoline_init (rtx, tree, rtx);
1215
1216 /* Hash table stuff for keeping track of TOC entries. */
1217
1218 struct GTY(()) toc_hash_struct
1219 {
1220 /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
1221 ASM_OUTPUT_SPECIAL_POOL_ENTRY_P. */
1222 rtx key;
1223 enum machine_mode key_mode;
1224 int labelno;
1225 };
1226
1227 static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
1228
1229 /* Hash table to keep track of the argument types for builtin functions. */
1230
1231 struct GTY(()) builtin_hash_struct
1232 {
1233 tree type;
1234 enum machine_mode mode[4]; /* return value + 3 arguments. */
1235 unsigned char uns_p[4]; /* and whether the types are unsigned. */
1236 };
1237
1238 static GTY ((param_is (struct builtin_hash_struct))) htab_t builtin_hash_table;
1239
1240 static bool rs6000_valid_attribute_p (tree, tree, tree, int);
1241 static void rs6000_function_specific_save (struct cl_target_option *);
1242 static void rs6000_function_specific_restore (struct cl_target_option *);
1243 static void rs6000_function_specific_print (FILE *, int,
1244 struct cl_target_option *);
1245 static bool rs6000_can_inline_p (tree, tree);
1246 static void rs6000_set_current_function (tree);
1247
1248 \f
1249 /* Default register names. */
1250 char rs6000_reg_names[][8] =
1251 {
1252 "0", "1", "2", "3", "4", "5", "6", "7",
1253 "8", "9", "10", "11", "12", "13", "14", "15",
1254 "16", "17", "18", "19", "20", "21", "22", "23",
1255 "24", "25", "26", "27", "28", "29", "30", "31",
1256 "0", "1", "2", "3", "4", "5", "6", "7",
1257 "8", "9", "10", "11", "12", "13", "14", "15",
1258 "16", "17", "18", "19", "20", "21", "22", "23",
1259 "24", "25", "26", "27", "28", "29", "30", "31",
1260 "mq", "lr", "ctr","ap",
1261 "0", "1", "2", "3", "4", "5", "6", "7",
1262 "ca",
1263 /* AltiVec registers. */
1264 "0", "1", "2", "3", "4", "5", "6", "7",
1265 "8", "9", "10", "11", "12", "13", "14", "15",
1266 "16", "17", "18", "19", "20", "21", "22", "23",
1267 "24", "25", "26", "27", "28", "29", "30", "31",
1268 "vrsave", "vscr",
1269 /* SPE registers. */
1270 "spe_acc", "spefscr",
1271 /* Soft frame pointer. */
1272 "sfp"
1273 };
1274
1275 #ifdef TARGET_REGNAMES
1276 static const char alt_reg_names[][8] =
1277 {
1278 "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7",
1279 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
1280 "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
1281 "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
1282 "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
1283 "%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
1284 "%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
1285 "%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
1286 "mq", "lr", "ctr", "ap",
1287 "%cr0", "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
1288 "ca",
1289 /* AltiVec registers. */
1290 "%v0", "%v1", "%v2", "%v3", "%v4", "%v5", "%v6", "%v7",
1291 "%v8", "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
1292 "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
1293 "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
1294 "vrsave", "vscr",
1295 /* SPE registers. */
1296 "spe_acc", "spefscr",
1297 /* Soft frame pointer. */
1298 "sfp"
1299 };
1300 #endif
1301
1302 /* Table of valid machine attributes. */
1303
1304 static const struct attribute_spec rs6000_attribute_table[] =
1305 {
1306 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
1307 affects_type_identity } */
1308 { "altivec", 1, 1, false, true, false, rs6000_handle_altivec_attribute,
1309 false },
1310 { "longcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute,
1311 false },
1312 { "shortcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute,
1313 false },
1314 { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
1315 false },
1316 { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
1317 false },
1318 #ifdef SUBTARGET_ATTRIBUTE_TABLE
1319 SUBTARGET_ATTRIBUTE_TABLE,
1320 #endif
1321 { NULL, 0, 0, false, false, false, NULL, false }
1322 };
1323
1324 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE. */
1325 static const struct default_options rs6000_option_optimization_table[] =
1326 {
1327 { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
1328 { OPT_LEVELS_NONE, 0, NULL, 0 }
1329 };
1330 \f
1331 #ifndef MASK_STRICT_ALIGN
1332 #define MASK_STRICT_ALIGN 0
1333 #endif
1334 #ifndef TARGET_PROFILE_KERNEL
1335 #define TARGET_PROFILE_KERNEL 0
1336 #endif
1337
1338 /* The VRSAVE bitmask puts bit %v0 as the most significant bit. */
1339 #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
1340 \f
1341 /* Initialize the GCC target structure. */
1342 #undef TARGET_ATTRIBUTE_TABLE
1343 #define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
1344 #undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
1345 #define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
1346 #undef TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P
1347 #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P rs6000_attribute_takes_identifier_p
1348
1349 #undef TARGET_ASM_ALIGNED_DI_OP
1350 #define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
1351
1352 /* Default unaligned ops are only provided for ELF. Find the ops needed
1353 for non-ELF systems. */
1354 #ifndef OBJECT_FORMAT_ELF
1355 #if TARGET_XCOFF
1356 /* For XCOFF. rs6000_assemble_integer will handle unaligned DIs on
1357 64-bit targets. */
1358 #undef TARGET_ASM_UNALIGNED_HI_OP
1359 #define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
1360 #undef TARGET_ASM_UNALIGNED_SI_OP
1361 #define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
1362 #undef TARGET_ASM_UNALIGNED_DI_OP
1363 #define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
1364 #else
1365 /* For Darwin. */
1366 #undef TARGET_ASM_UNALIGNED_HI_OP
1367 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
1368 #undef TARGET_ASM_UNALIGNED_SI_OP
1369 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
1370 #undef TARGET_ASM_UNALIGNED_DI_OP
1371 #define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
1372 #undef TARGET_ASM_ALIGNED_DI_OP
1373 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
1374 #endif
1375 #endif
1376
1377 /* This hook deals with fixups for relocatable code and DI-mode objects
1378 in 64-bit code. */
1379 #undef TARGET_ASM_INTEGER
1380 #define TARGET_ASM_INTEGER rs6000_assemble_integer
1381
1382 #ifdef HAVE_GAS_HIDDEN
1383 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
1384 #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
1385 #endif
1386
1387 #undef TARGET_HAVE_TLS
1388 #define TARGET_HAVE_TLS HAVE_AS_TLS
1389
1390 #undef TARGET_CANNOT_FORCE_CONST_MEM
1391 #define TARGET_CANNOT_FORCE_CONST_MEM rs6000_tls_referenced_p
1392
1393 #undef TARGET_DELEGITIMIZE_ADDRESS
1394 #define TARGET_DELEGITIMIZE_ADDRESS rs6000_delegitimize_address
1395
1396 #undef TARGET_ASM_FUNCTION_PROLOGUE
1397 #define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
1398 #undef TARGET_ASM_FUNCTION_EPILOGUE
1399 #define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
1400
1401 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
1402 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA rs6000_output_addr_const_extra
1403
1404 #undef TARGET_LEGITIMIZE_ADDRESS
1405 #define TARGET_LEGITIMIZE_ADDRESS rs6000_legitimize_address
1406
1407 #undef TARGET_SCHED_VARIABLE_ISSUE
1408 #define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
1409
1410 #undef TARGET_SCHED_ISSUE_RATE
1411 #define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
1412 #undef TARGET_SCHED_ADJUST_COST
1413 #define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
1414 #undef TARGET_SCHED_ADJUST_PRIORITY
1415 #define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
1416 #undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
1417 #define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
1418 #undef TARGET_SCHED_INIT
1419 #define TARGET_SCHED_INIT rs6000_sched_init
1420 #undef TARGET_SCHED_FINISH
1421 #define TARGET_SCHED_FINISH rs6000_sched_finish
1422 #undef TARGET_SCHED_REORDER
1423 #define TARGET_SCHED_REORDER rs6000_sched_reorder
1424 #undef TARGET_SCHED_REORDER2
1425 #define TARGET_SCHED_REORDER2 rs6000_sched_reorder2
1426
1427 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
1428 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
1429
1430 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD
1431 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD rs6000_use_sched_lookahead_guard
1432
1433 #undef TARGET_SCHED_ALLOC_SCHED_CONTEXT
1434 #define TARGET_SCHED_ALLOC_SCHED_CONTEXT rs6000_alloc_sched_context
1435 #undef TARGET_SCHED_INIT_SCHED_CONTEXT
1436 #define TARGET_SCHED_INIT_SCHED_CONTEXT rs6000_init_sched_context
1437 #undef TARGET_SCHED_SET_SCHED_CONTEXT
1438 #define TARGET_SCHED_SET_SCHED_CONTEXT rs6000_set_sched_context
1439 #undef TARGET_SCHED_FREE_SCHED_CONTEXT
1440 #define TARGET_SCHED_FREE_SCHED_CONTEXT rs6000_free_sched_context
1441
1442 #undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD
1443 #define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load
1444 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN
1445 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN rs6000_builtin_mul_widen_even
1446 #undef TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD
1447 #define TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD rs6000_builtin_mul_widen_odd
1448 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
1449 #define TARGET_VECTORIZE_BUILTIN_CONVERSION rs6000_builtin_conversion
1450 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM
1451 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM rs6000_builtin_vec_perm
1452 #undef TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
1453 #define TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT \
1454 rs6000_builtin_support_vector_misalignment
1455 #undef TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE
1456 #define TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE rs6000_vector_alignment_reachable
1457 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
1458 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
1459 rs6000_builtin_vectorization_cost
1460 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
1461 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE \
1462 rs6000_preferred_simd_mode
1463
1464 #undef TARGET_INIT_BUILTINS
1465 #define TARGET_INIT_BUILTINS rs6000_init_builtins
1466 #undef TARGET_BUILTIN_DECL
1467 #define TARGET_BUILTIN_DECL rs6000_builtin_decl
1468
1469 #undef TARGET_EXPAND_BUILTIN
1470 #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
1471
1472 #undef TARGET_MANGLE_TYPE
1473 #define TARGET_MANGLE_TYPE rs6000_mangle_type
1474
1475 #undef TARGET_INIT_LIBFUNCS
1476 #define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
1477
1478 #if TARGET_MACHO
1479 #undef TARGET_BINDS_LOCAL_P
1480 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
1481 #endif
1482
1483 #undef TARGET_MS_BITFIELD_LAYOUT_P
1484 #define TARGET_MS_BITFIELD_LAYOUT_P rs6000_ms_bitfield_layout_p
1485
1486 #undef TARGET_ASM_OUTPUT_MI_THUNK
1487 #define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
1488
1489 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
1490 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
1491
1492 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
1493 #define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
1494
1495 #undef TARGET_INVALID_WITHIN_DOLOOP
1496 #define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop
1497
1498 #undef TARGET_REGISTER_MOVE_COST
1499 #define TARGET_REGISTER_MOVE_COST rs6000_register_move_cost
1500 #undef TARGET_MEMORY_MOVE_COST
1501 #define TARGET_MEMORY_MOVE_COST rs6000_memory_move_cost
1502 #undef TARGET_RTX_COSTS
1503 #define TARGET_RTX_COSTS rs6000_rtx_costs
1504 #undef TARGET_ADDRESS_COST
1505 #define TARGET_ADDRESS_COST hook_int_rtx_bool_0
1506
1507 #undef TARGET_DWARF_REGISTER_SPAN
1508 #define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
1509
1510 #undef TARGET_INIT_DWARF_REG_SIZES_EXTRA
1511 #define TARGET_INIT_DWARF_REG_SIZES_EXTRA rs6000_init_dwarf_reg_sizes_extra
1512
1513 /* On rs6000, function arguments are promoted, as are function return
1514 values. */
1515 #undef TARGET_PROMOTE_FUNCTION_MODE
1516 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
1517
1518 #undef TARGET_RETURN_IN_MEMORY
1519 #define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
1520
1521 #undef TARGET_SETUP_INCOMING_VARARGS
1522 #define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
1523
1524 /* Always strict argument naming on rs6000. */
1525 #undef TARGET_STRICT_ARGUMENT_NAMING
1526 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
1527 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
1528 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
1529 #undef TARGET_SPLIT_COMPLEX_ARG
1530 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true
1531 #undef TARGET_MUST_PASS_IN_STACK
1532 #define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
1533 #undef TARGET_PASS_BY_REFERENCE
1534 #define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
1535 #undef TARGET_ARG_PARTIAL_BYTES
1536 #define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes
1537 #undef TARGET_FUNCTION_ARG_ADVANCE
1538 #define TARGET_FUNCTION_ARG_ADVANCE rs6000_function_arg_advance
1539 #undef TARGET_FUNCTION_ARG
1540 #define TARGET_FUNCTION_ARG rs6000_function_arg
1541 #undef TARGET_FUNCTION_ARG_BOUNDARY
1542 #define TARGET_FUNCTION_ARG_BOUNDARY rs6000_function_arg_boundary
1543
1544 #undef TARGET_BUILD_BUILTIN_VA_LIST
1545 #define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
1546
1547 #undef TARGET_EXPAND_BUILTIN_VA_START
1548 #define TARGET_EXPAND_BUILTIN_VA_START rs6000_va_start
1549
1550 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
1551 #define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
1552
1553 #undef TARGET_EH_RETURN_FILTER_MODE
1554 #define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
1555
1556 #undef TARGET_SCALAR_MODE_SUPPORTED_P
1557 #define TARGET_SCALAR_MODE_SUPPORTED_P rs6000_scalar_mode_supported_p
1558
1559 #undef TARGET_VECTOR_MODE_SUPPORTED_P
1560 #define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p
1561
1562 #undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
1563 #define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn
1564
1565 #undef TARGET_HANDLE_OPTION
1566 #define TARGET_HANDLE_OPTION rs6000_handle_option
1567
1568 #undef TARGET_ASM_LOOP_ALIGN_MAX_SKIP
1569 #define TARGET_ASM_LOOP_ALIGN_MAX_SKIP rs6000_loop_align_max_skip
1570
1571 #undef TARGET_OPTION_OVERRIDE
1572 #define TARGET_OPTION_OVERRIDE rs6000_option_override
1573
1574 #undef TARGET_OPTION_INIT_STRUCT
1575 #define TARGET_OPTION_INIT_STRUCT rs6000_option_init_struct
1576
1577 #undef TARGET_OPTION_DEFAULT_PARAMS
1578 #define TARGET_OPTION_DEFAULT_PARAMS rs6000_option_default_params
1579
1580 #undef TARGET_OPTION_OPTIMIZATION_TABLE
1581 #define TARGET_OPTION_OPTIMIZATION_TABLE rs6000_option_optimization_table
1582
1583 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
1584 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
1585 rs6000_builtin_vectorized_function
1586
1587 #undef TARGET_DEFAULT_TARGET_FLAGS
1588 #define TARGET_DEFAULT_TARGET_FLAGS \
1589 (TARGET_DEFAULT)
1590
1591 #undef TARGET_STACK_PROTECT_FAIL
1592 #define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail
1593
1594 /* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors
1595 The PowerPC architecture requires only weak consistency among
1596 processors--that is, memory accesses between processors need not be
1597 sequentially consistent and memory accesses among processors can occur
1598 in any order. The ability to order memory accesses weakly provides
1599 opportunities for more efficient use of the system bus. Unless a
1600 dependency exists, the 604e allows read operations to precede store
1601 operations. */
1602 #undef TARGET_RELAXED_ORDERING
1603 #define TARGET_RELAXED_ORDERING true
1604
1605 #ifdef HAVE_AS_TLS
1606 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
1607 #define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
1608 #endif
1609
1610 /* Use a 32-bit anchor range. This leads to sequences like:
1611
1612 addis tmp,anchor,high
1613 add dest,tmp,low
1614
1615 where tmp itself acts as an anchor, and can be shared between
1616 accesses to the same 64k page. */
1617 #undef TARGET_MIN_ANCHOR_OFFSET
1618 #define TARGET_MIN_ANCHOR_OFFSET -0x7fffffff - 1
1619 #undef TARGET_MAX_ANCHOR_OFFSET
1620 #define TARGET_MAX_ANCHOR_OFFSET 0x7fffffff
1621 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
1622 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P rs6000_use_blocks_for_constant_p
1623
1624 #undef TARGET_BUILTIN_RECIPROCAL
1625 #define TARGET_BUILTIN_RECIPROCAL rs6000_builtin_reciprocal
1626
1627 #undef TARGET_EXPAND_TO_RTL_HOOK
1628 #define TARGET_EXPAND_TO_RTL_HOOK rs6000_alloc_sdmode_stack_slot
1629
1630 #undef TARGET_INSTANTIATE_DECLS
1631 #define TARGET_INSTANTIATE_DECLS rs6000_instantiate_decls
1632
1633 #undef TARGET_SECONDARY_RELOAD
1634 #define TARGET_SECONDARY_RELOAD rs6000_secondary_reload
1635
1636 #undef TARGET_LEGITIMATE_ADDRESS_P
1637 #define TARGET_LEGITIMATE_ADDRESS_P rs6000_legitimate_address_p
1638
1639 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
1640 #define TARGET_MODE_DEPENDENT_ADDRESS_P rs6000_mode_dependent_address_p
1641
1642 #undef TARGET_CAN_ELIMINATE
1643 #define TARGET_CAN_ELIMINATE rs6000_can_eliminate
1644
1645 #undef TARGET_CONDITIONAL_REGISTER_USAGE
1646 #define TARGET_CONDITIONAL_REGISTER_USAGE rs6000_conditional_register_usage
1647
1648 #undef TARGET_TRAMPOLINE_INIT
1649 #define TARGET_TRAMPOLINE_INIT rs6000_trampoline_init
1650
1651 #undef TARGET_FUNCTION_VALUE
1652 #define TARGET_FUNCTION_VALUE rs6000_function_value
1653
1654 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
1655 #define TARGET_OPTION_VALID_ATTRIBUTE_P rs6000_valid_attribute_p
1656
1657 #undef TARGET_OPTION_SAVE
1658 #define TARGET_OPTION_SAVE rs6000_function_specific_save
1659
1660 #undef TARGET_OPTION_RESTORE
1661 #define TARGET_OPTION_RESTORE rs6000_function_specific_restore
1662
1663 #undef TARGET_OPTION_PRINT
1664 #define TARGET_OPTION_PRINT rs6000_function_specific_print
1665
1666 #undef TARGET_CAN_INLINE_P
1667 #define TARGET_CAN_INLINE_P rs6000_can_inline_p
1668
1669 #undef TARGET_SET_CURRENT_FUNCTION
1670 #define TARGET_SET_CURRENT_FUNCTION rs6000_set_current_function
1671
1672 struct gcc_target targetm = TARGET_INITIALIZER;
1673 \f
1674
1675 /* Simplifications for entries below. */
1676
1677 enum {
1678 POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS,
1679 POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC
1680 };
1681
1682 /* Some OSs don't support saving the high part of 64-bit registers on context
1683 switch. Other OSs don't support saving Altivec registers. On those OSs, we
1684 don't touch the MASK_POWERPC64 or MASK_ALTIVEC settings; if the user wants
1685 either, the user must explicitly specify them and we won't interfere with
1686 the user's specification. */
1687
1688 enum {
1689 POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
1690 POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT | MASK_STRICT_ALIGN
1691 | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
1692 | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_MULHW
1693 | MASK_DLMZB | MASK_CMPB | MASK_MFPGPR | MASK_DFP
1694 | MASK_POPCNTD | MASK_VSX | MASK_ISEL | MASK_NO_UPDATE
1695 | MASK_RECIP_PRECISION)
1696 };
1697
1698 /* Masks for instructions set at various powerpc ISAs. */
1699 enum {
1700 ISA_2_1_MASKS = MASK_MFCRF,
1701 ISA_2_2_MASKS = (ISA_2_1_MASKS | MASK_POPCNTB),
1702 ISA_2_4_MASKS = (ISA_2_2_MASKS | MASK_FPRND),
1703
1704 /* For ISA 2.05, do not add MFPGPR, since it isn't in ISA 2.06, and don't add
1705 ALTIVEC, since in general it isn't a win on power6. In ISA 2.04, fsel,
1706 fre, fsqrt, etc. were no longer documented as optional. Group masks by
1707 server and embedded. */
1708 ISA_2_5_MASKS_EMBEDDED = (ISA_2_2_MASKS | MASK_CMPB | MASK_RECIP_PRECISION
1709 | MASK_PPC_GFXOPT | MASK_PPC_GPOPT),
1710 ISA_2_5_MASKS_SERVER = (ISA_2_5_MASKS_EMBEDDED | MASK_DFP),
1711
1712 /* For ISA 2.06, don't add ISEL, since in general it isn't a win, but
1713 altivec is a win so enable it. */
1714 ISA_2_6_MASKS_EMBEDDED = (ISA_2_5_MASKS_EMBEDDED | MASK_POPCNTD),
1715 ISA_2_6_MASKS_SERVER = (ISA_2_5_MASKS_SERVER | MASK_POPCNTD | MASK_ALTIVEC
1716 | MASK_VSX)
1717 };
1718
1719 /* This table occasionally claims that a processor does not support a
1720 particular feature even though it does, but the feature is slower than the
1721 alternative. Thus, it shouldn't be relied on as a complete description of
1722 the processor's support.
1723
1724 Please keep this list in order, and don't forget to update the documentation
1725 in invoke.texi when adding a new processor or flag. */
1726
1727 struct rs6000_ptt
1728 {
1729 const char *const name; /* Canonical processor name. */
1730 const enum processor_type processor; /* Processor type enum value. */
1731 const int target_enable; /* Target flags to enable. */
1732 };
1733
1734 static struct rs6000_ptt const processor_target_table[] =
1735 {
1736 {"401", PROCESSOR_PPC403, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1737 {"403", PROCESSOR_PPC403,
1738 POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_STRICT_ALIGN},
1739 {"405", PROCESSOR_PPC405,
1740 POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1741 {"405fp", PROCESSOR_PPC405,
1742 POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1743 {"440", PROCESSOR_PPC440,
1744 POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1745 {"440fp", PROCESSOR_PPC440,
1746 POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1747 {"464", PROCESSOR_PPC440,
1748 POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB},
1749 {"464fp", PROCESSOR_PPC440,
1750 POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1751 {"476", PROCESSOR_PPC476,
1752 POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_PPC_GFXOPT | MASK_MFCRF
1753 | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_MULHW | MASK_DLMZB},
1754 {"476fp", PROCESSOR_PPC476,
1755 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POPCNTB
1756 | MASK_FPRND | MASK_CMPB | MASK_MULHW | MASK_DLMZB},
1757 {"505", PROCESSOR_MPCCORE, POWERPC_BASE_MASK},
1758 {"601", PROCESSOR_PPC601,
1759 MASK_POWER | POWERPC_BASE_MASK | MASK_MULTIPLE | MASK_STRING},
1760 {"602", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1761 {"603", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1762 {"603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1763 {"604", PROCESSOR_PPC604, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1764 {"604e", PROCESSOR_PPC604e, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1765 {"620", PROCESSOR_PPC620,
1766 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1767 {"630", PROCESSOR_PPC630,
1768 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1769 {"740", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1770 {"7400", PROCESSOR_PPC7400, POWERPC_7400_MASK},
1771 {"7450", PROCESSOR_PPC7450, POWERPC_7400_MASK},
1772 {"750", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1773 {"801", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1774 {"821", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1775 {"823", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1776 {"8540", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN
1777 | MASK_ISEL},
1778 /* 8548 has a dummy entry for now. */
1779 {"8548", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_STRICT_ALIGN
1780 | MASK_ISEL},
1781 {"a2", PROCESSOR_PPCA2,
1782 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_POPCNTB
1783 | MASK_CMPB | MASK_NO_UPDATE },
1784 {"e300c2", PROCESSOR_PPCE300C2, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1785 {"e300c3", PROCESSOR_PPCE300C3, POWERPC_BASE_MASK},
1786 {"e500mc", PROCESSOR_PPCE500MC, POWERPC_BASE_MASK | MASK_PPC_GFXOPT
1787 | MASK_ISEL},
1788 {"e500mc64", PROCESSOR_PPCE500MC64, POWERPC_BASE_MASK | MASK_POWERPC64
1789 | MASK_PPC_GFXOPT | MASK_ISEL},
1790 {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1791 {"970", PROCESSOR_POWER4,
1792 POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1793 {"cell", PROCESSOR_CELL,
1794 POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1795 {"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS},
1796 {"ec603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1797 {"G3", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1798 {"G4", PROCESSOR_PPC7450, POWERPC_7400_MASK},
1799 {"G5", PROCESSOR_POWER4,
1800 POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1801 {"titan", PROCESSOR_TITAN,
1802 POWERPC_BASE_MASK | MASK_MULHW | MASK_DLMZB},
1803 {"power", PROCESSOR_POWER, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1804 {"power2", PROCESSOR_POWER,
1805 MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1806 {"power3", PROCESSOR_PPC630,
1807 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1808 {"power4", PROCESSOR_POWER4,
1809 POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1810 | MASK_MFCRF},
1811 {"power5", PROCESSOR_POWER5,
1812 POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1813 | MASK_MFCRF | MASK_POPCNTB},
1814 {"power5+", PROCESSOR_POWER5,
1815 POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1816 | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND},
1817 {"power6", PROCESSOR_POWER6,
1818 POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1819 | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP
1820 | MASK_RECIP_PRECISION},
1821 {"power6x", PROCESSOR_POWER6,
1822 POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_PPC_GFXOPT
1823 | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP
1824 | MASK_MFPGPR | MASK_RECIP_PRECISION},
1825 {"power7", PROCESSOR_POWER7, /* Don't add MASK_ISEL by default */
1826 POWERPC_7400_MASK | MASK_POWERPC64 | MASK_PPC_GPOPT | MASK_MFCRF
1827 | MASK_POPCNTB | MASK_FPRND | MASK_CMPB | MASK_DFP | MASK_POPCNTD
1828 | MASK_VSX | MASK_RECIP_PRECISION},
1829 {"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK},
1830 {"powerpc64", PROCESSOR_POWERPC64,
1831 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1832 {"rios", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1833 {"rios1", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1834 {"rios2", PROCESSOR_RIOS2,
1835 MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1836 {"rsc", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1837 {"rsc1", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1838 {"rs64", PROCESSOR_RS64A,
1839 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}
1840 };
1841
1842 /* Look up a processor name for -mcpu=xxx and -mtune=xxx. Return -1 if the
1843 name is invalid. */
1844
1845 static int
1846 rs6000_cpu_name_lookup (const char *name)
1847 {
1848 size_t i;
1849
1850 if (name != NULL)
1851 {
1852 for (i = 0; i < ARRAY_SIZE (processor_target_table); i++)
1853 if (! strcmp (name, processor_target_table[i].name))
1854 return (int)i;
1855 }
1856
1857 return -1;
1858 }
1859
1860 \f
1861 /* Return number of consecutive hard regs needed starting at reg REGNO
1862 to hold something of mode MODE.
1863 This is ordinarily the length in words of a value of mode MODE
1864 but can be less for certain modes in special long registers.
1865
1866 For the SPE, GPRs are 64 bits but only 32 bits are visible in
1867 scalar instructions. The upper 32 bits are only available to the
1868 SIMD instructions.
1869
1870 POWER and PowerPC GPRs hold 32 bits worth;
1871 PowerPC64 GPRs and FPRs point register holds 64 bits worth. */
1872
1873 static int
1874 rs6000_hard_regno_nregs_internal (int regno, enum machine_mode mode)
1875 {
1876 unsigned HOST_WIDE_INT reg_size;
1877
1878 if (FP_REGNO_P (regno))
1879 reg_size = (VECTOR_MEM_VSX_P (mode)
1880 ? UNITS_PER_VSX_WORD
1881 : UNITS_PER_FP_WORD);
1882
1883 else if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1884 reg_size = UNITS_PER_SPE_WORD;
1885
1886 else if (ALTIVEC_REGNO_P (regno))
1887 reg_size = UNITS_PER_ALTIVEC_WORD;
1888
1889 /* The value returned for SCmode in the E500 double case is 2 for
1890 ABI compatibility; storing an SCmode value in a single register
1891 would require function_arg and rs6000_spe_function_arg to handle
1892 SCmode so as to pass the value correctly in a pair of
1893 registers. */
1894 else if (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode) && mode != SCmode
1895 && !DECIMAL_FLOAT_MODE_P (mode))
1896 reg_size = UNITS_PER_FP_WORD;
1897
1898 else
1899 reg_size = UNITS_PER_WORD;
1900
1901 return (GET_MODE_SIZE (mode) + reg_size - 1) / reg_size;
1902 }
1903
1904 /* Value is 1 if hard register REGNO can hold a value of machine-mode
1905 MODE. */
1906 static int
1907 rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
1908 {
1909 int last_regno = regno + rs6000_hard_regno_nregs[mode][regno] - 1;
1910
1911 /* VSX registers that overlap the FPR registers are larger than for non-VSX
1912 implementations. Don't allow an item to be split between a FP register
1913 and an Altivec register. */
1914 if (VECTOR_MEM_VSX_P (mode))
1915 {
1916 if (FP_REGNO_P (regno))
1917 return FP_REGNO_P (last_regno);
1918
1919 if (ALTIVEC_REGNO_P (regno))
1920 return ALTIVEC_REGNO_P (last_regno);
1921 }
1922
1923 /* The GPRs can hold any mode, but values bigger than one register
1924 cannot go past R31. */
1925 if (INT_REGNO_P (regno))
1926 return INT_REGNO_P (last_regno);
1927
1928 /* The float registers (except for VSX vector modes) can only hold floating
1929 modes and DImode. This excludes the 32-bit decimal float mode for
1930 now. */
1931 if (FP_REGNO_P (regno))
1932 {
1933 if (SCALAR_FLOAT_MODE_P (mode)
1934 && (mode != TDmode || (regno % 2) == 0)
1935 && FP_REGNO_P (last_regno))
1936 return 1;
1937
1938 if (GET_MODE_CLASS (mode) == MODE_INT
1939 && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD)
1940 return 1;
1941
1942 if (PAIRED_SIMD_REGNO_P (regno) && TARGET_PAIRED_FLOAT
1943 && PAIRED_VECTOR_MODE (mode))
1944 return 1;
1945
1946 return 0;
1947 }
1948
1949 /* The CR register can only hold CC modes. */
1950 if (CR_REGNO_P (regno))
1951 return GET_MODE_CLASS (mode) == MODE_CC;
1952
1953 if (CA_REGNO_P (regno))
1954 return mode == BImode;
1955
1956 /* AltiVec only in AldyVec registers. */
1957 if (ALTIVEC_REGNO_P (regno))
1958 return VECTOR_MEM_ALTIVEC_OR_VSX_P (mode);
1959
1960 /* ...but GPRs can hold SIMD data on the SPE in one register. */
1961 if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1962 return 1;
1963
1964 /* We cannot put TImode anywhere except general register and it must be able
1965 to fit within the register set. In the future, allow TImode in the
1966 Altivec or VSX registers. */
1967
1968 return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
1969 }
1970
1971 /* Print interesting facts about registers. */
1972 static void
1973 rs6000_debug_reg_print (int first_regno, int last_regno, const char *reg_name)
1974 {
1975 int r, m;
1976
1977 for (r = first_regno; r <= last_regno; ++r)
1978 {
1979 const char *comma = "";
1980 int len;
1981
1982 if (first_regno == last_regno)
1983 fprintf (stderr, "%s:\t", reg_name);
1984 else
1985 fprintf (stderr, "%s%d:\t", reg_name, r - first_regno);
1986
1987 len = 8;
1988 for (m = 0; m < NUM_MACHINE_MODES; ++m)
1989 if (rs6000_hard_regno_mode_ok_p[m][r] && rs6000_hard_regno_nregs[m][r])
1990 {
1991 if (len > 70)
1992 {
1993 fprintf (stderr, ",\n\t");
1994 len = 8;
1995 comma = "";
1996 }
1997
1998 if (rs6000_hard_regno_nregs[m][r] > 1)
1999 len += fprintf (stderr, "%s%s/%d", comma, GET_MODE_NAME (m),
2000 rs6000_hard_regno_nregs[m][r]);
2001 else
2002 len += fprintf (stderr, "%s%s", comma, GET_MODE_NAME (m));
2003
2004 comma = ", ";
2005 }
2006
2007 if (call_used_regs[r])
2008 {
2009 if (len > 70)
2010 {
2011 fprintf (stderr, ",\n\t");
2012 len = 8;
2013 comma = "";
2014 }
2015
2016 len += fprintf (stderr, "%s%s", comma, "call-used");
2017 comma = ", ";
2018 }
2019
2020 if (fixed_regs[r])
2021 {
2022 if (len > 70)
2023 {
2024 fprintf (stderr, ",\n\t");
2025 len = 8;
2026 comma = "";
2027 }
2028
2029 len += fprintf (stderr, "%s%s", comma, "fixed");
2030 comma = ", ";
2031 }
2032
2033 if (len > 70)
2034 {
2035 fprintf (stderr, ",\n\t");
2036 comma = "";
2037 }
2038
2039 fprintf (stderr, "%sregno = %d\n", comma, r);
2040 }
2041 }
2042
2043 #define DEBUG_FMT_D "%-32s= %d\n"
2044 #define DEBUG_FMT_S "%-32s= %s\n"
2045
2046 /* Print various interesting information with -mdebug=reg. */
2047 static void
2048 rs6000_debug_reg_global (void)
2049 {
2050 static const char *const tf[2] = { "false", "true" };
2051 const char *nl = (const char *)0;
2052 int m;
2053 char costly_num[20];
2054 char nop_num[20];
2055 const char *costly_str;
2056 const char *nop_str;
2057 const char *trace_str;
2058 const char *abi_str;
2059 const char *cmodel_str;
2060
2061 /* Map enum rs6000_vector to string. */
2062 static const char *rs6000_debug_vector_unit[] = {
2063 "none",
2064 "altivec",
2065 "vsx",
2066 "paired",
2067 "spe",
2068 "other"
2069 };
2070
2071 fprintf (stderr, "Register information: (last virtual reg = %d)\n",
2072 LAST_VIRTUAL_REGISTER);
2073 rs6000_debug_reg_print (0, 31, "gr");
2074 rs6000_debug_reg_print (32, 63, "fp");
2075 rs6000_debug_reg_print (FIRST_ALTIVEC_REGNO,
2076 LAST_ALTIVEC_REGNO,
2077 "vs");
2078 rs6000_debug_reg_print (LR_REGNO, LR_REGNO, "lr");
2079 rs6000_debug_reg_print (CTR_REGNO, CTR_REGNO, "ctr");
2080 rs6000_debug_reg_print (CR0_REGNO, CR7_REGNO, "cr");
2081 rs6000_debug_reg_print (MQ_REGNO, MQ_REGNO, "mq");
2082 rs6000_debug_reg_print (CA_REGNO, CA_REGNO, "ca");
2083 rs6000_debug_reg_print (VRSAVE_REGNO, VRSAVE_REGNO, "vrsave");
2084 rs6000_debug_reg_print (VSCR_REGNO, VSCR_REGNO, "vscr");
2085 rs6000_debug_reg_print (SPE_ACC_REGNO, SPE_ACC_REGNO, "spe_a");
2086 rs6000_debug_reg_print (SPEFSCR_REGNO, SPEFSCR_REGNO, "spe_f");
2087
2088 fprintf (stderr,
2089 "\n"
2090 "d reg_class = %s\n"
2091 "f reg_class = %s\n"
2092 "v reg_class = %s\n"
2093 "wa reg_class = %s\n"
2094 "wd reg_class = %s\n"
2095 "wf reg_class = %s\n"
2096 "ws reg_class = %s\n\n",
2097 reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_d]],
2098 reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_f]],
2099 reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_v]],
2100 reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wa]],
2101 reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wd]],
2102 reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wf]],
2103 reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_ws]]);
2104
2105 for (m = 0; m < NUM_MACHINE_MODES; ++m)
2106 if (rs6000_vector_unit[m] || rs6000_vector_mem[m])
2107 {
2108 nl = "\n";
2109 fprintf (stderr, "Vector mode: %-5s arithmetic: %-8s move: %-8s\n",
2110 GET_MODE_NAME (m),
2111 rs6000_debug_vector_unit[ rs6000_vector_unit[m] ],
2112 rs6000_debug_vector_unit[ rs6000_vector_mem[m] ]);
2113 }
2114
2115 if (nl)
2116 fputs (nl, stderr);
2117
2118 if (rs6000_recip_control)
2119 {
2120 fprintf (stderr, "\nReciprocal mask = 0x%x\n", rs6000_recip_control);
2121
2122 for (m = 0; m < NUM_MACHINE_MODES; ++m)
2123 if (rs6000_recip_bits[m])
2124 {
2125 fprintf (stderr,
2126 "Reciprocal estimate mode: %-5s divide: %s rsqrt: %s\n",
2127 GET_MODE_NAME (m),
2128 (RS6000_RECIP_AUTO_RE_P (m)
2129 ? "auto"
2130 : (RS6000_RECIP_HAVE_RE_P (m) ? "have" : "none")),
2131 (RS6000_RECIP_AUTO_RSQRTE_P (m)
2132 ? "auto"
2133 : (RS6000_RECIP_HAVE_RSQRTE_P (m) ? "have" : "none")));
2134 }
2135
2136 fputs ("\n", stderr);
2137 }
2138
2139 if (rs6000_cpu_index >= 0)
2140 fprintf (stderr, DEBUG_FMT_S, "cpu",
2141 processor_target_table[rs6000_cpu_index].name);
2142
2143 if (rs6000_tune_index >= 0)
2144 fprintf (stderr, DEBUG_FMT_S, "tune",
2145 processor_target_table[rs6000_tune_index].name);
2146
2147 switch (rs6000_sched_costly_dep)
2148 {
2149 case max_dep_latency:
2150 costly_str = "max_dep_latency";
2151 break;
2152
2153 case no_dep_costly:
2154 costly_str = "no_dep_costly";
2155 break;
2156
2157 case all_deps_costly:
2158 costly_str = "all_deps_costly";
2159 break;
2160
2161 case true_store_to_load_dep_costly:
2162 costly_str = "true_store_to_load_dep_costly";
2163 break;
2164
2165 case store_to_load_dep_costly:
2166 costly_str = "store_to_load_dep_costly";
2167 break;
2168
2169 default:
2170 costly_str = costly_num;
2171 sprintf (costly_num, "%d", (int)rs6000_sched_costly_dep);
2172 break;
2173 }
2174
2175 fprintf (stderr, DEBUG_FMT_S, "sched_costly_dep", costly_str);
2176
2177 switch (rs6000_sched_insert_nops)
2178 {
2179 case sched_finish_regroup_exact:
2180 nop_str = "sched_finish_regroup_exact";
2181 break;
2182
2183 case sched_finish_pad_groups:
2184 nop_str = "sched_finish_pad_groups";
2185 break;
2186
2187 case sched_finish_none:
2188 nop_str = "sched_finish_none";
2189 break;
2190
2191 default:
2192 nop_str = nop_num;
2193 sprintf (nop_num, "%d", (int)rs6000_sched_insert_nops);
2194 break;
2195 }
2196
2197 fprintf (stderr, DEBUG_FMT_S, "sched_insert_nops", nop_str);
2198
2199 switch (rs6000_sdata)
2200 {
2201 default:
2202 case SDATA_NONE:
2203 break;
2204
2205 case SDATA_DATA:
2206 fprintf (stderr, DEBUG_FMT_S, "sdata", "data");
2207 break;
2208
2209 case SDATA_SYSV:
2210 fprintf (stderr, DEBUG_FMT_S, "sdata", "sysv");
2211 break;
2212
2213 case SDATA_EABI:
2214 fprintf (stderr, DEBUG_FMT_S, "sdata", "eabi");
2215 break;
2216
2217 }
2218
2219 switch (rs6000_traceback)
2220 {
2221 case traceback_default: trace_str = "default"; break;
2222 case traceback_none: trace_str = "none"; break;
2223 case traceback_part: trace_str = "part"; break;
2224 case traceback_full: trace_str = "full"; break;
2225 default: trace_str = "unknown"; break;
2226 }
2227
2228 fprintf (stderr, DEBUG_FMT_S, "traceback", trace_str);
2229
2230 switch (rs6000_current_cmodel)
2231 {
2232 case CMODEL_SMALL: cmodel_str = "small"; break;
2233 case CMODEL_MEDIUM: cmodel_str = "medium"; break;
2234 case CMODEL_LARGE: cmodel_str = "large"; break;
2235 default: cmodel_str = "unknown"; break;
2236 }
2237
2238 fprintf (stderr, DEBUG_FMT_S, "cmodel", cmodel_str);
2239
2240 switch (rs6000_current_abi)
2241 {
2242 case ABI_NONE: abi_str = "none"; break;
2243 case ABI_AIX: abi_str = "aix"; break;
2244 case ABI_V4: abi_str = "V4"; break;
2245 case ABI_DARWIN: abi_str = "darwin"; break;
2246 default: abi_str = "unknown"; break;
2247 }
2248
2249 fprintf (stderr, DEBUG_FMT_S, "abi", abi_str);
2250
2251 if (rs6000_altivec_abi)
2252 fprintf (stderr, DEBUG_FMT_S, "altivec_abi", "true");
2253
2254 if (rs6000_spe_abi)
2255 fprintf (stderr, DEBUG_FMT_S, "spe_abi", "true");
2256
2257 if (rs6000_darwin64_abi)
2258 fprintf (stderr, DEBUG_FMT_S, "darwin64_abi", "true");
2259
2260 if (rs6000_float_gprs)
2261 fprintf (stderr, DEBUG_FMT_S, "float_gprs", "true");
2262
2263 fprintf (stderr, DEBUG_FMT_S, "always_hint", tf[!!rs6000_always_hint]);
2264 fprintf (stderr, DEBUG_FMT_S, "align_branch",
2265 tf[!!rs6000_align_branch_targets]);
2266 fprintf (stderr, DEBUG_FMT_D, "tls_size", rs6000_tls_size);
2267 fprintf (stderr, DEBUG_FMT_D, "long_double_size",
2268 rs6000_long_double_type_size);
2269 fprintf (stderr, DEBUG_FMT_D, "sched_restricted_insns_priority",
2270 (int)rs6000_sched_restricted_insns_priority);
2271 }
2272
2273 /* Initialize the various global tables that are based on register size. */
2274 static void
2275 rs6000_init_hard_regno_mode_ok (bool global_init_p)
2276 {
2277 int r, m, c;
2278 int align64;
2279 int align32;
2280
2281 /* Precalculate REGNO_REG_CLASS. */
2282 rs6000_regno_regclass[0] = GENERAL_REGS;
2283 for (r = 1; r < 32; ++r)
2284 rs6000_regno_regclass[r] = BASE_REGS;
2285
2286 for (r = 32; r < 64; ++r)
2287 rs6000_regno_regclass[r] = FLOAT_REGS;
2288
2289 for (r = 64; r < FIRST_PSEUDO_REGISTER; ++r)
2290 rs6000_regno_regclass[r] = NO_REGS;
2291
2292 for (r = FIRST_ALTIVEC_REGNO; r <= LAST_ALTIVEC_REGNO; ++r)
2293 rs6000_regno_regclass[r] = ALTIVEC_REGS;
2294
2295 rs6000_regno_regclass[CR0_REGNO] = CR0_REGS;
2296 for (r = CR1_REGNO; r <= CR7_REGNO; ++r)
2297 rs6000_regno_regclass[r] = CR_REGS;
2298
2299 rs6000_regno_regclass[MQ_REGNO] = MQ_REGS;
2300 rs6000_regno_regclass[LR_REGNO] = LINK_REGS;
2301 rs6000_regno_regclass[CTR_REGNO] = CTR_REGS;
2302 rs6000_regno_regclass[CA_REGNO] = CA_REGS;
2303 rs6000_regno_regclass[VRSAVE_REGNO] = VRSAVE_REGS;
2304 rs6000_regno_regclass[VSCR_REGNO] = VRSAVE_REGS;
2305 rs6000_regno_regclass[SPE_ACC_REGNO] = SPE_ACC_REGS;
2306 rs6000_regno_regclass[SPEFSCR_REGNO] = SPEFSCR_REGS;
2307 rs6000_regno_regclass[ARG_POINTER_REGNUM] = BASE_REGS;
2308 rs6000_regno_regclass[FRAME_POINTER_REGNUM] = BASE_REGS;
2309
2310 /* Precalculate vector information, this must be set up before the
2311 rs6000_hard_regno_nregs_internal below. */
2312 for (m = 0; m < NUM_MACHINE_MODES; ++m)
2313 {
2314 rs6000_vector_unit[m] = rs6000_vector_mem[m] = VECTOR_NONE;
2315 rs6000_vector_reload[m][0] = CODE_FOR_nothing;
2316 rs6000_vector_reload[m][1] = CODE_FOR_nothing;
2317 }
2318
2319 for (c = 0; c < (int)(int)RS6000_CONSTRAINT_MAX; c++)
2320 rs6000_constraints[c] = NO_REGS;
2321
2322 /* The VSX hardware allows native alignment for vectors, but control whether the compiler
2323 believes it can use native alignment or still uses 128-bit alignment. */
2324 if (TARGET_VSX && !TARGET_VSX_ALIGN_128)
2325 {
2326 align64 = 64;
2327 align32 = 32;
2328 }
2329 else
2330 {
2331 align64 = 128;
2332 align32 = 128;
2333 }
2334
2335 /* V2DF mode, VSX only. */
2336 if (TARGET_VSX)
2337 {
2338 rs6000_vector_unit[V2DFmode] = VECTOR_VSX;
2339 rs6000_vector_mem[V2DFmode] = VECTOR_VSX;
2340 rs6000_vector_align[V2DFmode] = align64;
2341 }
2342
2343 /* V4SF mode, either VSX or Altivec. */
2344 if (TARGET_VSX)
2345 {
2346 rs6000_vector_unit[V4SFmode] = VECTOR_VSX;
2347 rs6000_vector_mem[V4SFmode] = VECTOR_VSX;
2348 rs6000_vector_align[V4SFmode] = align32;
2349 }
2350 else if (TARGET_ALTIVEC)
2351 {
2352 rs6000_vector_unit[V4SFmode] = VECTOR_ALTIVEC;
2353 rs6000_vector_mem[V4SFmode] = VECTOR_ALTIVEC;
2354 rs6000_vector_align[V4SFmode] = align32;
2355 }
2356
2357 /* V16QImode, V8HImode, V4SImode are Altivec only, but possibly do VSX loads
2358 and stores. */
2359 if (TARGET_ALTIVEC)
2360 {
2361 rs6000_vector_unit[V4SImode] = VECTOR_ALTIVEC;
2362 rs6000_vector_unit[V8HImode] = VECTOR_ALTIVEC;
2363 rs6000_vector_unit[V16QImode] = VECTOR_ALTIVEC;
2364 rs6000_vector_align[V4SImode] = align32;
2365 rs6000_vector_align[V8HImode] = align32;
2366 rs6000_vector_align[V16QImode] = align32;
2367
2368 if (TARGET_VSX)
2369 {
2370 rs6000_vector_mem[V4SImode] = VECTOR_VSX;
2371 rs6000_vector_mem[V8HImode] = VECTOR_VSX;
2372 rs6000_vector_mem[V16QImode] = VECTOR_VSX;
2373 }
2374 else
2375 {
2376 rs6000_vector_mem[V4SImode] = VECTOR_ALTIVEC;
2377 rs6000_vector_mem[V8HImode] = VECTOR_ALTIVEC;
2378 rs6000_vector_mem[V16QImode] = VECTOR_ALTIVEC;
2379 }
2380 }
2381
2382 /* V2DImode, only allow under VSX, which can do V2DI insert/splat/extract.
2383 Altivec doesn't have 64-bit support. */
2384 if (TARGET_VSX)
2385 {
2386 rs6000_vector_mem[V2DImode] = VECTOR_VSX;
2387 rs6000_vector_unit[V2DImode] = VECTOR_NONE;
2388 rs6000_vector_align[V2DImode] = align64;
2389 }
2390
2391 /* DFmode, see if we want to use the VSX unit. */
2392 if (TARGET_VSX && TARGET_VSX_SCALAR_DOUBLE)
2393 {
2394 rs6000_vector_unit[DFmode] = VECTOR_VSX;
2395 rs6000_vector_mem[DFmode]
2396 = (TARGET_VSX_SCALAR_MEMORY ? VECTOR_VSX : VECTOR_NONE);
2397 rs6000_vector_align[DFmode] = align64;
2398 }
2399
2400 /* TODO add SPE and paired floating point vector support. */
2401
2402 /* Register class constaints for the constraints that depend on compile
2403 switches. */
2404 if (TARGET_HARD_FLOAT && TARGET_FPRS)
2405 rs6000_constraints[RS6000_CONSTRAINT_f] = FLOAT_REGS;
2406
2407 if (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
2408 rs6000_constraints[RS6000_CONSTRAINT_d] = FLOAT_REGS;
2409
2410 if (TARGET_VSX)
2411 {
2412 /* At present, we just use VSX_REGS, but we have different constraints
2413 based on the use, in case we want to fine tune the default register
2414 class used. wa = any VSX register, wf = register class to use for
2415 V4SF, wd = register class to use for V2DF, and ws = register classs to
2416 use for DF scalars. */
2417 rs6000_constraints[RS6000_CONSTRAINT_wa] = VSX_REGS;
2418 rs6000_constraints[RS6000_CONSTRAINT_wf] = VSX_REGS;
2419 rs6000_constraints[RS6000_CONSTRAINT_wd] = VSX_REGS;
2420 rs6000_constraints[RS6000_CONSTRAINT_ws] = (TARGET_VSX_SCALAR_MEMORY
2421 ? VSX_REGS
2422 : FLOAT_REGS);
2423 }
2424
2425 if (TARGET_ALTIVEC)
2426 rs6000_constraints[RS6000_CONSTRAINT_v] = ALTIVEC_REGS;
2427
2428 /* Set up the reload helper functions. */
2429 if (TARGET_VSX || TARGET_ALTIVEC)
2430 {
2431 if (TARGET_64BIT)
2432 {
2433 rs6000_vector_reload[V16QImode][0] = CODE_FOR_reload_v16qi_di_store;
2434 rs6000_vector_reload[V16QImode][1] = CODE_FOR_reload_v16qi_di_load;
2435 rs6000_vector_reload[V8HImode][0] = CODE_FOR_reload_v8hi_di_store;
2436 rs6000_vector_reload[V8HImode][1] = CODE_FOR_reload_v8hi_di_load;
2437 rs6000_vector_reload[V4SImode][0] = CODE_FOR_reload_v4si_di_store;
2438 rs6000_vector_reload[V4SImode][1] = CODE_FOR_reload_v4si_di_load;
2439 rs6000_vector_reload[V2DImode][0] = CODE_FOR_reload_v2di_di_store;
2440 rs6000_vector_reload[V2DImode][1] = CODE_FOR_reload_v2di_di_load;
2441 rs6000_vector_reload[V4SFmode][0] = CODE_FOR_reload_v4sf_di_store;
2442 rs6000_vector_reload[V4SFmode][1] = CODE_FOR_reload_v4sf_di_load;
2443 rs6000_vector_reload[V2DFmode][0] = CODE_FOR_reload_v2df_di_store;
2444 rs6000_vector_reload[V2DFmode][1] = CODE_FOR_reload_v2df_di_load;
2445 }
2446 else
2447 {
2448 rs6000_vector_reload[V16QImode][0] = CODE_FOR_reload_v16qi_si_store;
2449 rs6000_vector_reload[V16QImode][1] = CODE_FOR_reload_v16qi_si_load;
2450 rs6000_vector_reload[V8HImode][0] = CODE_FOR_reload_v8hi_si_store;
2451 rs6000_vector_reload[V8HImode][1] = CODE_FOR_reload_v8hi_si_load;
2452 rs6000_vector_reload[V4SImode][0] = CODE_FOR_reload_v4si_si_store;
2453 rs6000_vector_reload[V4SImode][1] = CODE_FOR_reload_v4si_si_load;
2454 rs6000_vector_reload[V2DImode][0] = CODE_FOR_reload_v2di_si_store;
2455 rs6000_vector_reload[V2DImode][1] = CODE_FOR_reload_v2di_si_load;
2456 rs6000_vector_reload[V4SFmode][0] = CODE_FOR_reload_v4sf_si_store;
2457 rs6000_vector_reload[V4SFmode][1] = CODE_FOR_reload_v4sf_si_load;
2458 rs6000_vector_reload[V2DFmode][0] = CODE_FOR_reload_v2df_si_store;
2459 rs6000_vector_reload[V2DFmode][1] = CODE_FOR_reload_v2df_si_load;
2460 }
2461 }
2462
2463 /* Precalculate HARD_REGNO_NREGS. */
2464 for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
2465 for (m = 0; m < NUM_MACHINE_MODES; ++m)
2466 rs6000_hard_regno_nregs[m][r]
2467 = rs6000_hard_regno_nregs_internal (r, (enum machine_mode)m);
2468
2469 /* Precalculate HARD_REGNO_MODE_OK. */
2470 for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
2471 for (m = 0; m < NUM_MACHINE_MODES; ++m)
2472 if (rs6000_hard_regno_mode_ok (r, (enum machine_mode)m))
2473 rs6000_hard_regno_mode_ok_p[m][r] = true;
2474
2475 /* Precalculate CLASS_MAX_NREGS sizes. */
2476 for (c = 0; c < LIM_REG_CLASSES; ++c)
2477 {
2478 int reg_size;
2479
2480 if (TARGET_VSX && VSX_REG_CLASS_P (c))
2481 reg_size = UNITS_PER_VSX_WORD;
2482
2483 else if (c == ALTIVEC_REGS)
2484 reg_size = UNITS_PER_ALTIVEC_WORD;
2485
2486 else if (c == FLOAT_REGS)
2487 reg_size = UNITS_PER_FP_WORD;
2488
2489 else
2490 reg_size = UNITS_PER_WORD;
2491
2492 for (m = 0; m < NUM_MACHINE_MODES; ++m)
2493 rs6000_class_max_nregs[m][c]
2494 = (GET_MODE_SIZE (m) + reg_size - 1) / reg_size;
2495 }
2496
2497 if (TARGET_E500_DOUBLE)
2498 rs6000_class_max_nregs[DFmode][GENERAL_REGS] = 1;
2499
2500 /* Calculate which modes to automatically generate code to use a the
2501 reciprocal divide and square root instructions. In the future, possibly
2502 automatically generate the instructions even if the user did not specify
2503 -mrecip. The older machines double precision reciprocal sqrt estimate is
2504 not accurate enough. */
2505 memset (rs6000_recip_bits, 0, sizeof (rs6000_recip_bits));
2506 if (TARGET_FRES)
2507 rs6000_recip_bits[SFmode] = RS6000_RECIP_MASK_HAVE_RE;
2508 if (TARGET_FRE)
2509 rs6000_recip_bits[DFmode] = RS6000_RECIP_MASK_HAVE_RE;
2510 if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
2511 rs6000_recip_bits[V4SFmode] = RS6000_RECIP_MASK_HAVE_RE;
2512 if (VECTOR_UNIT_VSX_P (V2DFmode))
2513 rs6000_recip_bits[V2DFmode] = RS6000_RECIP_MASK_HAVE_RE;
2514
2515 if (TARGET_FRSQRTES)
2516 rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2517 if (TARGET_FRSQRTE)
2518 rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2519 if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode))
2520 rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2521 if (VECTOR_UNIT_VSX_P (V2DFmode))
2522 rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_HAVE_RSQRTE;
2523
2524 if (rs6000_recip_control)
2525 {
2526 if (!flag_finite_math_only)
2527 warning (0, "-mrecip requires -ffinite-math or -ffast-math");
2528 if (flag_trapping_math)
2529 warning (0, "-mrecip requires -fno-trapping-math or -ffast-math");
2530 if (!flag_reciprocal_math)
2531 warning (0, "-mrecip requires -freciprocal-math or -ffast-math");
2532 if (flag_finite_math_only && !flag_trapping_math && flag_reciprocal_math)
2533 {
2534 if (RS6000_RECIP_HAVE_RE_P (SFmode)
2535 && (rs6000_recip_control & RECIP_SF_DIV) != 0)
2536 rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2537
2538 if (RS6000_RECIP_HAVE_RE_P (DFmode)
2539 && (rs6000_recip_control & RECIP_DF_DIV) != 0)
2540 rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2541
2542 if (RS6000_RECIP_HAVE_RE_P (V4SFmode)
2543 && (rs6000_recip_control & RECIP_V4SF_DIV) != 0)
2544 rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2545
2546 if (RS6000_RECIP_HAVE_RE_P (V2DFmode)
2547 && (rs6000_recip_control & RECIP_V2DF_DIV) != 0)
2548 rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RE;
2549
2550 if (RS6000_RECIP_HAVE_RSQRTE_P (SFmode)
2551 && (rs6000_recip_control & RECIP_SF_RSQRT) != 0)
2552 rs6000_recip_bits[SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2553
2554 if (RS6000_RECIP_HAVE_RSQRTE_P (DFmode)
2555 && (rs6000_recip_control & RECIP_DF_RSQRT) != 0)
2556 rs6000_recip_bits[DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2557
2558 if (RS6000_RECIP_HAVE_RSQRTE_P (V4SFmode)
2559 && (rs6000_recip_control & RECIP_V4SF_RSQRT) != 0)
2560 rs6000_recip_bits[V4SFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2561
2562 if (RS6000_RECIP_HAVE_RSQRTE_P (V2DFmode)
2563 && (rs6000_recip_control & RECIP_V2DF_RSQRT) != 0)
2564 rs6000_recip_bits[V2DFmode] |= RS6000_RECIP_MASK_AUTO_RSQRTE;
2565 }
2566 }
2567
2568 if (global_init_p || TARGET_DEBUG_TARGET)
2569 {
2570 if (TARGET_DEBUG_REG)
2571 rs6000_debug_reg_global ();
2572
2573 if (TARGET_DEBUG_COST || TARGET_DEBUG_REG)
2574 fprintf (stderr,
2575 "SImode variable mult cost = %d\n"
2576 "SImode constant mult cost = %d\n"
2577 "SImode short constant mult cost = %d\n"
2578 "DImode multipliciation cost = %d\n"
2579 "SImode division cost = %d\n"
2580 "DImode division cost = %d\n"
2581 "Simple fp operation cost = %d\n"
2582 "DFmode multiplication cost = %d\n"
2583 "SFmode division cost = %d\n"
2584 "DFmode division cost = %d\n"
2585 "cache line size = %d\n"
2586 "l1 cache size = %d\n"
2587 "l2 cache size = %d\n"
2588 "simultaneous prefetches = %d\n"
2589 "\n",
2590 rs6000_cost->mulsi,
2591 rs6000_cost->mulsi_const,
2592 rs6000_cost->mulsi_const9,
2593 rs6000_cost->muldi,
2594 rs6000_cost->divsi,
2595 rs6000_cost->divdi,
2596 rs6000_cost->fp,
2597 rs6000_cost->dmul,
2598 rs6000_cost->sdiv,
2599 rs6000_cost->ddiv,
2600 rs6000_cost->cache_line_size,
2601 rs6000_cost->l1_cache_size,
2602 rs6000_cost->l2_cache_size,
2603 rs6000_cost->simultaneous_prefetches);
2604 }
2605 }
2606
2607 #if TARGET_MACHO
2608 /* The Darwin version of SUBTARGET_OVERRIDE_OPTIONS. */
2609
2610 static void
2611 darwin_rs6000_override_options (void)
2612 {
2613 /* The Darwin ABI always includes AltiVec, can't be (validly) turned
2614 off. */
2615 rs6000_altivec_abi = 1;
2616 TARGET_ALTIVEC_VRSAVE = 1;
2617
2618 if (DEFAULT_ABI == ABI_DARWIN
2619 && TARGET_64BIT)
2620 darwin_one_byte_bool = 1;
2621
2622 if (TARGET_64BIT && ! TARGET_POWERPC64)
2623 {
2624 target_flags |= MASK_POWERPC64;
2625 warning (0, "-m64 requires PowerPC64 architecture, enabling");
2626 }
2627 if (flag_mkernel)
2628 {
2629 rs6000_default_long_calls = 1;
2630 target_flags |= MASK_SOFT_FLOAT;
2631 }
2632
2633 /* Make -m64 imply -maltivec. Darwin's 64-bit ABI includes
2634 Altivec. */
2635 if (!flag_mkernel && !flag_apple_kext
2636 && TARGET_64BIT
2637 && ! (target_flags_explicit & MASK_ALTIVEC))
2638 target_flags |= MASK_ALTIVEC;
2639
2640 /* Unless the user (not the configurer) has explicitly overridden
2641 it with -mcpu=G3 or -mno-altivec, then 10.5+ targets default to
2642 G4 unless targetting the kernel. */
2643 if (!flag_mkernel
2644 && !flag_apple_kext
2645 && strverscmp (darwin_macosx_version_min, "10.5") >= 0
2646 && ! (target_flags_explicit & MASK_ALTIVEC)
2647 && ! rs6000_select[1].string)
2648 {
2649 target_flags |= MASK_ALTIVEC;
2650 }
2651 }
2652 #endif
2653
2654 /* If not otherwise specified by a target, make 'long double' equivalent to
2655 'double'. */
2656
2657 #ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
2658 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
2659 #endif
2660
2661 /* Override command line options. Mostly we process the processor type and
2662 sometimes adjust other TARGET_ options. */
2663
2664 static bool
2665 rs6000_option_override_internal (bool global_init_p)
2666 {
2667 bool ret = true;
2668 const char *default_cpu = OPTION_TARGET_CPU_DEFAULT;
2669 int set_masks;
2670 int cpu_index;
2671 int tune_index;
2672 struct cl_target_option *main_target_opt
2673 = ((global_init_p || target_option_default_node == NULL)
2674 ? NULL : TREE_TARGET_OPTION (target_option_default_node));
2675
2676 /* Numerous experiment shows that IRA based loop pressure
2677 calculation works better for RTL loop invariant motion on targets
2678 with enough (>= 32) registers. It is an expensive optimization.
2679 So it is on only for peak performance. */
2680 if (optimize >= 3 && global_init_p)
2681 flag_ira_loop_pressure = 1;
2682
2683 /* Set the pointer size. */
2684 if (TARGET_64BIT)
2685 {
2686 rs6000_pmode = (int)DImode;
2687 rs6000_pointer_size = 64;
2688 }
2689 else
2690 {
2691 rs6000_pmode = (int)SImode;
2692 rs6000_pointer_size = 32;
2693 }
2694
2695 set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;
2696 #ifdef OS_MISSING_POWERPC64
2697 if (OS_MISSING_POWERPC64)
2698 set_masks &= ~MASK_POWERPC64;
2699 #endif
2700 #ifdef OS_MISSING_ALTIVEC
2701 if (OS_MISSING_ALTIVEC)
2702 set_masks &= ~MASK_ALTIVEC;
2703 #endif
2704
2705 /* Don't override by the processor default if given explicitly. */
2706 set_masks &= ~target_flags_explicit;
2707
2708 /* Identify the processor type. */
2709 if (!default_cpu)
2710 {
2711 if (TARGET_POWERPC64)
2712 default_cpu = "powerpc64";
2713 else if (TARGET_POWERPC)
2714 default_cpu = "powerpc";
2715 }
2716
2717 /* Process the -mcpu=<xxx> and -mtune=<xxx> argument. If the user changed
2718 the cpu in a target attribute or pragma, but did not specify a tuning
2719 option, use the cpu for the tuning option rather than the option specified
2720 with -mtune on the command line. */
2721 if (rs6000_cpu_index > 0)
2722 cpu_index = rs6000_cpu_index;
2723 else if (main_target_opt != NULL && main_target_opt->x_rs6000_cpu_index > 0)
2724 rs6000_cpu_index = cpu_index = main_target_opt->x_rs6000_cpu_index;
2725 else
2726 rs6000_cpu_index = cpu_index = rs6000_cpu_name_lookup (default_cpu);
2727
2728 if (rs6000_tune_index > 0)
2729 tune_index = rs6000_tune_index;
2730 else
2731 rs6000_tune_index = tune_index = cpu_index;
2732
2733 if (cpu_index >= 0)
2734 {
2735 target_flags &= ~set_masks;
2736 target_flags |= (processor_target_table[cpu_index].target_enable
2737 & set_masks);
2738 }
2739
2740 rs6000_cpu = ((tune_index >= 0)
2741 ? processor_target_table[tune_index].processor
2742 : (TARGET_POWERPC64
2743 ? PROCESSOR_DEFAULT64
2744 : PROCESSOR_DEFAULT));
2745
2746 if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3
2747 || rs6000_cpu == PROCESSOR_PPCE500MC || rs6000_cpu == PROCESSOR_PPCE500MC64)
2748 {
2749 if (TARGET_ALTIVEC)
2750 error ("AltiVec not supported in this target");
2751 if (TARGET_SPE)
2752 error ("SPE not supported in this target");
2753 }
2754
2755 /* Disable Cell microcode if we are optimizing for the Cell
2756 and not optimizing for size. */
2757 if (rs6000_gen_cell_microcode == -1)
2758 rs6000_gen_cell_microcode = !(rs6000_cpu == PROCESSOR_CELL
2759 && !optimize_size);
2760
2761 /* If we are optimizing big endian systems for space and it's OK to
2762 use instructions that would be microcoded on the Cell, use the
2763 load/store multiple and string instructions. */
2764 if (BYTES_BIG_ENDIAN && optimize_size && rs6000_gen_cell_microcode)
2765 target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
2766
2767 /* Don't allow -mmultiple or -mstring on little endian systems
2768 unless the cpu is a 750, because the hardware doesn't support the
2769 instructions used in little endian mode, and causes an alignment
2770 trap. The 750 does not cause an alignment trap (except when the
2771 target is unaligned). */
2772
2773 if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
2774 {
2775 if (TARGET_MULTIPLE)
2776 {
2777 target_flags &= ~MASK_MULTIPLE;
2778 if ((target_flags_explicit & MASK_MULTIPLE) != 0)
2779 warning (0, "-mmultiple is not supported on little endian systems");
2780 }
2781
2782 if (TARGET_STRING)
2783 {
2784 target_flags &= ~MASK_STRING;
2785 if ((target_flags_explicit & MASK_STRING) != 0)
2786 warning (0, "-mstring is not supported on little endian systems");
2787 }
2788 }
2789
2790 /* Add some warnings for VSX. */
2791 if (TARGET_VSX)
2792 {
2793 const char *msg = NULL;
2794 if (!TARGET_HARD_FLOAT || !TARGET_FPRS
2795 || !TARGET_SINGLE_FLOAT || !TARGET_DOUBLE_FLOAT)
2796 {
2797 if (target_flags_explicit & MASK_VSX)
2798 msg = N_("-mvsx requires hardware floating point");
2799 else
2800 target_flags &= ~ MASK_VSX;
2801 }
2802 else if (TARGET_PAIRED_FLOAT)
2803 msg = N_("-mvsx and -mpaired are incompatible");
2804 /* The hardware will allow VSX and little endian, but until we make sure
2805 things like vector select, etc. work don't allow VSX on little endian
2806 systems at this point. */
2807 else if (!BYTES_BIG_ENDIAN)
2808 msg = N_("-mvsx used with little endian code");
2809 else if (TARGET_AVOID_XFORM > 0)
2810 msg = N_("-mvsx needs indexed addressing");
2811 else if (!TARGET_ALTIVEC && (target_flags_explicit & MASK_ALTIVEC))
2812 {
2813 if (target_flags_explicit & MASK_VSX)
2814 msg = N_("-mvsx and -mno-altivec are incompatible");
2815 else
2816 msg = N_("-mno-altivec disables vsx");
2817 }
2818
2819 if (msg)
2820 {
2821 warning (0, msg);
2822 target_flags &= ~ MASK_VSX;
2823 target_flags_explicit |= MASK_VSX;
2824 }
2825 }
2826
2827 /* For the newer switches (vsx, dfp, etc.) set some of the older options,
2828 unless the user explicitly used the -mno-<option> to disable the code. */
2829 if (TARGET_VSX)
2830 target_flags |= (ISA_2_6_MASKS_SERVER & ~target_flags_explicit);
2831 else if (TARGET_POPCNTD)
2832 target_flags |= (ISA_2_6_MASKS_EMBEDDED & ~target_flags_explicit);
2833 else if (TARGET_DFP)
2834 target_flags |= (ISA_2_5_MASKS_SERVER & ~target_flags_explicit);
2835 else if (TARGET_CMPB)
2836 target_flags |= (ISA_2_5_MASKS_EMBEDDED & ~target_flags_explicit);
2837 else if (TARGET_FPRND)
2838 target_flags |= (ISA_2_4_MASKS & ~target_flags_explicit);
2839 else if (TARGET_POPCNTB)
2840 target_flags |= (ISA_2_2_MASKS & ~target_flags_explicit);
2841 else if (TARGET_ALTIVEC)
2842 target_flags |= (MASK_PPC_GFXOPT & ~target_flags_explicit);
2843
2844 /* E500mc does "better" if we inline more aggressively. Respect the
2845 user's opinion, though. */
2846 if (rs6000_block_move_inline_limit == 0
2847 && (rs6000_cpu == PROCESSOR_PPCE500MC
2848 || rs6000_cpu == PROCESSOR_PPCE500MC64))
2849 rs6000_block_move_inline_limit = 128;
2850
2851 /* store_one_arg depends on expand_block_move to handle at least the
2852 size of reg_parm_stack_space. */
2853 if (rs6000_block_move_inline_limit < (TARGET_POWERPC64 ? 64 : 32))
2854 rs6000_block_move_inline_limit = (TARGET_POWERPC64 ? 64 : 32);
2855
2856 if (global_init_p)
2857 {
2858 /* If the appropriate debug option is enabled, replace the target hooks
2859 with debug versions that call the real version and then prints
2860 debugging information. */
2861 if (TARGET_DEBUG_COST)
2862 {
2863 targetm.rtx_costs = rs6000_debug_rtx_costs;
2864 targetm.address_cost = rs6000_debug_address_cost;
2865 targetm.sched.adjust_cost = rs6000_debug_adjust_cost;
2866 }
2867
2868 if (TARGET_DEBUG_ADDR)
2869 {
2870 targetm.legitimate_address_p = rs6000_debug_legitimate_address_p;
2871 targetm.legitimize_address = rs6000_debug_legitimize_address;
2872 rs6000_secondary_reload_class_ptr
2873 = rs6000_debug_secondary_reload_class;
2874 rs6000_secondary_memory_needed_ptr
2875 = rs6000_debug_secondary_memory_needed;
2876 rs6000_cannot_change_mode_class_ptr
2877 = rs6000_debug_cannot_change_mode_class;
2878 rs6000_preferred_reload_class_ptr
2879 = rs6000_debug_preferred_reload_class;
2880 rs6000_legitimize_reload_address_ptr
2881 = rs6000_debug_legitimize_reload_address;
2882 rs6000_mode_dependent_address_ptr
2883 = rs6000_debug_mode_dependent_address;
2884 }
2885
2886 if (rs6000_veclibabi_name)
2887 {
2888 if (strcmp (rs6000_veclibabi_name, "mass") == 0)
2889 rs6000_veclib_handler = rs6000_builtin_vectorized_libmass;
2890 else
2891 {
2892 error ("unknown vectorization library ABI type (%s) for "
2893 "-mveclibabi= switch", rs6000_veclibabi_name);
2894 ret = false;
2895 }
2896 }
2897 }
2898
2899 if (!rs6000_explicit_options.long_double)
2900 {
2901 if (main_target_opt != NULL
2902 && (main_target_opt->x_rs6000_long_double_type_size
2903 != RS6000_DEFAULT_LONG_DOUBLE_SIZE))
2904 error ("target attribute or pragma changes long double size");
2905 else
2906 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
2907 }
2908
2909 #ifndef POWERPC_LINUX
2910 if (!rs6000_explicit_options.ieee)
2911 rs6000_ieeequad = 1;
2912 #endif
2913
2914 /* Disable VSX and Altivec silently if the user switched cpus to power7 in a
2915 target attribute or pragma which automatically enables both options,
2916 unless the altivec ABI was set. This is set by default for 64-bit, but
2917 not for 32-bit. */
2918 if (main_target_opt != NULL && !main_target_opt->x_rs6000_altivec_abi)
2919 target_flags &= ~((MASK_VSX | MASK_ALTIVEC) & ~target_flags_explicit);
2920
2921 /* Enable Altivec ABI for AIX -maltivec. */
2922 if (TARGET_XCOFF && (TARGET_ALTIVEC || TARGET_VSX))
2923 {
2924 if (main_target_opt != NULL && !main_target_opt->x_rs6000_altivec_abi)
2925 error ("target attribute or pragma changes AltiVec ABI");
2926 else
2927 rs6000_altivec_abi = 1;
2928 }
2929
2930 /* The AltiVec ABI is the default for PowerPC-64 GNU/Linux. For
2931 PowerPC-32 GNU/Linux, -maltivec implies the AltiVec ABI. It can
2932 be explicitly overridden in either case. */
2933 if (TARGET_ELF)
2934 {
2935 if (!rs6000_explicit_options.altivec_abi
2936 && (TARGET_64BIT || TARGET_ALTIVEC || TARGET_VSX))
2937 {
2938 if (main_target_opt != NULL &&
2939 !main_target_opt->x_rs6000_altivec_abi)
2940 error ("target attribute or pragma changes AltiVec ABI");
2941 else
2942 rs6000_altivec_abi = 1;
2943 }
2944
2945 /* Enable VRSAVE for AltiVec ABI, unless explicitly overridden. */
2946 if (!rs6000_explicit_options.vrsave)
2947 TARGET_ALTIVEC_VRSAVE = rs6000_altivec_abi;
2948 }
2949
2950 /* Set the Darwin64 ABI as default for 64-bit Darwin.
2951 So far, the only darwin64 targets are also MACH-O. */
2952 if (TARGET_MACHO
2953 && DEFAULT_ABI == ABI_DARWIN
2954 && TARGET_64BIT)
2955 {
2956 if (main_target_opt != NULL && !main_target_opt->x_rs6000_darwin64_abi)
2957 error ("target attribute or pragma changes darwin64 ABI");
2958 else
2959 {
2960 rs6000_darwin64_abi = 1;
2961 /* Default to natural alignment, for better performance. */
2962 rs6000_alignment_flags = MASK_ALIGN_NATURAL;
2963 }
2964 }
2965
2966 /* Place FP constants in the constant pool instead of TOC
2967 if section anchors enabled. */
2968 if (flag_section_anchors)
2969 TARGET_NO_FP_IN_TOC = 1;
2970
2971 #ifdef SUBTARGET_OVERRIDE_OPTIONS
2972 SUBTARGET_OVERRIDE_OPTIONS;
2973 #endif
2974 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
2975 SUBSUBTARGET_OVERRIDE_OPTIONS;
2976 #endif
2977 #ifdef SUB3TARGET_OVERRIDE_OPTIONS
2978 SUB3TARGET_OVERRIDE_OPTIONS;
2979 #endif
2980
2981 if (TARGET_E500 || rs6000_cpu == PROCESSOR_PPCE500MC
2982 || rs6000_cpu == PROCESSOR_PPCE500MC64)
2983 {
2984 /* The e500 and e500mc do not have string instructions, and we set
2985 MASK_STRING above when optimizing for size. */
2986 if ((target_flags & MASK_STRING) != 0)
2987 target_flags = target_flags & ~MASK_STRING;
2988 }
2989 else if (rs6000_select[1].string != NULL)
2990 {
2991 /* For the powerpc-eabispe configuration, we set all these by
2992 default, so let's unset them if we manually set another
2993 CPU that is not the E500. */
2994 if (main_target_opt != NULL
2995 && ((main_target_opt->x_rs6000_spe_abi != rs6000_spe_abi)
2996 || (main_target_opt->x_rs6000_spe != rs6000_spe)
2997 || (main_target_opt->x_rs6000_float_gprs != rs6000_float_gprs)))
2998 error ("target attribute or pragma changes SPE ABI");
2999 else
3000 {
3001 if (!rs6000_explicit_options.spe_abi)
3002 rs6000_spe_abi = 0;
3003 if (!rs6000_explicit_options.spe)
3004 rs6000_spe = 0;
3005 if (!rs6000_explicit_options.float_gprs)
3006 rs6000_float_gprs = 0;
3007 }
3008 if (!(target_flags_explicit & MASK_ISEL))
3009 target_flags &= ~MASK_ISEL;
3010 }
3011
3012 /* Detect invalid option combinations with E500. */
3013 CHECK_E500_OPTIONS;
3014
3015 rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4
3016 && rs6000_cpu != PROCESSOR_POWER5
3017 && rs6000_cpu != PROCESSOR_POWER6
3018 && rs6000_cpu != PROCESSOR_POWER7
3019 && rs6000_cpu != PROCESSOR_PPCA2
3020 && rs6000_cpu != PROCESSOR_CELL);
3021 rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
3022 || rs6000_cpu == PROCESSOR_POWER5
3023 || rs6000_cpu == PROCESSOR_POWER7);
3024 rs6000_align_branch_targets = (rs6000_cpu == PROCESSOR_POWER4
3025 || rs6000_cpu == PROCESSOR_POWER5
3026 || rs6000_cpu == PROCESSOR_POWER6
3027 || rs6000_cpu == PROCESSOR_POWER7
3028 || rs6000_cpu == PROCESSOR_PPCE500MC
3029 || rs6000_cpu == PROCESSOR_PPCE500MC64);
3030
3031 /* Allow debug switches to override the above settings. These are set to -1
3032 in rs6000.opt to indicate the user hasn't directly set the switch. */
3033 if (TARGET_ALWAYS_HINT >= 0)
3034 rs6000_always_hint = TARGET_ALWAYS_HINT;
3035
3036 if (TARGET_SCHED_GROUPS >= 0)
3037 rs6000_sched_groups = TARGET_SCHED_GROUPS;
3038
3039 if (TARGET_ALIGN_BRANCH_TARGETS >= 0)
3040 rs6000_align_branch_targets = TARGET_ALIGN_BRANCH_TARGETS;
3041
3042 rs6000_sched_restricted_insns_priority
3043 = (rs6000_sched_groups ? 1 : 0);
3044
3045 /* Handle -msched-costly-dep option. */
3046 rs6000_sched_costly_dep
3047 = (rs6000_sched_groups ? store_to_load_dep_costly : no_dep_costly);
3048
3049 if (rs6000_sched_costly_dep_str)
3050 {
3051 if (! strcmp (rs6000_sched_costly_dep_str, "no"))
3052 rs6000_sched_costly_dep = no_dep_costly;
3053 else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
3054 rs6000_sched_costly_dep = all_deps_costly;
3055 else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
3056 rs6000_sched_costly_dep = true_store_to_load_dep_costly;
3057 else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
3058 rs6000_sched_costly_dep = store_to_load_dep_costly;
3059 else
3060 rs6000_sched_costly_dep = ((enum rs6000_dependence_cost)
3061 atoi (rs6000_sched_costly_dep_str));
3062 }
3063
3064 /* Handle -minsert-sched-nops option. */
3065 rs6000_sched_insert_nops
3066 = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
3067
3068 if (rs6000_sched_insert_nops_str)
3069 {
3070 if (! strcmp (rs6000_sched_insert_nops_str, "no"))
3071 rs6000_sched_insert_nops = sched_finish_none;
3072 else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
3073 rs6000_sched_insert_nops = sched_finish_pad_groups;
3074 else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
3075 rs6000_sched_insert_nops = sched_finish_regroup_exact;
3076 else
3077 rs6000_sched_insert_nops = ((enum rs6000_nop_insertion)
3078 atoi (rs6000_sched_insert_nops_str));
3079 }
3080
3081 if (global_init_p)
3082 {
3083 #ifdef TARGET_REGNAMES
3084 /* If the user desires alternate register names, copy in the
3085 alternate names now. */
3086 if (TARGET_REGNAMES)
3087 memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
3088 #endif
3089
3090 /* Set aix_struct_return last, after the ABI is determined.
3091 If -maix-struct-return or -msvr4-struct-return was explicitly
3092 used, don't override with the ABI default. */
3093 if (!rs6000_explicit_options.aix_struct_ret)
3094 aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
3095
3096 #if 0
3097 /* IBM XL compiler defaults to unsigned bitfields. */
3098 if (TARGET_XL_COMPAT)
3099 flag_signed_bitfields = 0;
3100 #endif
3101
3102 if (TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD)
3103 REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
3104
3105 if (TARGET_TOC)
3106 ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
3107
3108 /* We can only guarantee the availability of DI pseudo-ops when
3109 assembling for 64-bit targets. */
3110 if (!TARGET_64BIT)
3111 {
3112 targetm.asm_out.aligned_op.di = NULL;
3113 targetm.asm_out.unaligned_op.di = NULL;
3114 }
3115
3116
3117 /* Set branch target alignment, if not optimizing for size. */
3118 if (!optimize_size)
3119 {
3120 /* Cell wants to be aligned 8byte for dual issue. Titan wants to be
3121 aligned 8byte to avoid misprediction by the branch predictor. */
3122 if (rs6000_cpu == PROCESSOR_TITAN
3123 || rs6000_cpu == PROCESSOR_CELL)
3124 {
3125 if (align_functions <= 0)
3126 align_functions = 8;
3127 if (align_jumps <= 0)
3128 align_jumps = 8;
3129 if (align_loops <= 0)
3130 align_loops = 8;
3131 }
3132 if (rs6000_align_branch_targets)
3133 {
3134 if (align_functions <= 0)
3135 align_functions = 16;
3136 if (align_jumps <= 0)
3137 align_jumps = 16;
3138 if (align_loops <= 0)
3139 {
3140 can_override_loop_align = 1;
3141 align_loops = 16;
3142 }
3143 }
3144 if (align_jumps_max_skip <= 0)
3145 align_jumps_max_skip = 15;
3146 if (align_loops_max_skip <= 0)
3147 align_loops_max_skip = 15;
3148 }
3149
3150 /* Arrange to save and restore machine status around nested functions. */
3151 init_machine_status = rs6000_init_machine_status;
3152
3153 /* We should always be splitting complex arguments, but we can't break
3154 Linux and Darwin ABIs at the moment. For now, only AIX is fixed. */
3155 if (DEFAULT_ABI != ABI_AIX)
3156 targetm.calls.split_complex_arg = NULL;
3157 }
3158
3159 /* Initialize rs6000_cost with the appropriate target costs. */
3160 if (optimize_size)
3161 rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
3162 else
3163 switch (rs6000_cpu)
3164 {
3165 case PROCESSOR_RIOS1:
3166 rs6000_cost = &rios1_cost;
3167 break;
3168
3169 case PROCESSOR_RIOS2:
3170 rs6000_cost = &rios2_cost;
3171 break;
3172
3173 case PROCESSOR_RS64A:
3174 rs6000_cost = &rs64a_cost;
3175 break;
3176
3177 case PROCESSOR_MPCCORE:
3178 rs6000_cost = &mpccore_cost;
3179 break;
3180
3181 case PROCESSOR_PPC403:
3182 rs6000_cost = &ppc403_cost;
3183 break;
3184
3185 case PROCESSOR_PPC405:
3186 rs6000_cost = &ppc405_cost;
3187 break;
3188
3189 case PROCESSOR_PPC440:
3190 rs6000_cost = &ppc440_cost;
3191 break;
3192
3193 case PROCESSOR_PPC476:
3194 rs6000_cost = &ppc476_cost;
3195 break;
3196
3197 case PROCESSOR_PPC601:
3198 rs6000_cost = &ppc601_cost;
3199 break;
3200
3201 case PROCESSOR_PPC603:
3202 rs6000_cost = &ppc603_cost;
3203 break;
3204
3205 case PROCESSOR_PPC604:
3206 rs6000_cost = &ppc604_cost;
3207 break;
3208
3209 case PROCESSOR_PPC604e:
3210 rs6000_cost = &ppc604e_cost;
3211 break;
3212
3213 case PROCESSOR_PPC620:
3214 rs6000_cost = &ppc620_cost;
3215 break;
3216
3217 case PROCESSOR_PPC630:
3218 rs6000_cost = &ppc630_cost;
3219 break;
3220
3221 case PROCESSOR_CELL:
3222 rs6000_cost = &ppccell_cost;
3223 break;
3224
3225 case PROCESSOR_PPC750:
3226 case PROCESSOR_PPC7400:
3227 rs6000_cost = &ppc750_cost;
3228 break;
3229
3230 case PROCESSOR_PPC7450:
3231 rs6000_cost = &ppc7450_cost;
3232 break;
3233
3234 case PROCESSOR_PPC8540:
3235 rs6000_cost = &ppc8540_cost;
3236 break;
3237
3238 case PROCESSOR_PPCE300C2:
3239 case PROCESSOR_PPCE300C3:
3240 rs6000_cost = &ppce300c2c3_cost;
3241 break;
3242
3243 case PROCESSOR_PPCE500MC:
3244 rs6000_cost = &ppce500mc_cost;
3245 break;
3246
3247 case PROCESSOR_PPCE500MC64:
3248 rs6000_cost = &ppce500mc64_cost;
3249 break;
3250
3251 case PROCESSOR_TITAN:
3252 rs6000_cost = &titan_cost;
3253 break;
3254
3255 case PROCESSOR_POWER4:
3256 case PROCESSOR_POWER5:
3257 rs6000_cost = &power4_cost;
3258 break;
3259
3260 case PROCESSOR_POWER6:
3261 rs6000_cost = &power6_cost;
3262 break;
3263
3264 case PROCESSOR_POWER7:
3265 rs6000_cost = &power7_cost;
3266 break;
3267
3268 case PROCESSOR_PPCA2:
3269 rs6000_cost = &ppca2_cost;
3270 break;
3271
3272 default:
3273 gcc_unreachable ();
3274 }
3275
3276 if (global_init_p)
3277 {
3278 maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
3279 rs6000_cost->simultaneous_prefetches,
3280 global_options.x_param_values,
3281 global_options_set.x_param_values);
3282 maybe_set_param_value (PARAM_L1_CACHE_SIZE, rs6000_cost->l1_cache_size,
3283 global_options.x_param_values,
3284 global_options_set.x_param_values);
3285 maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
3286 rs6000_cost->cache_line_size,
3287 global_options.x_param_values,
3288 global_options_set.x_param_values);
3289 maybe_set_param_value (PARAM_L2_CACHE_SIZE, rs6000_cost->l2_cache_size,
3290 global_options.x_param_values,
3291 global_options_set.x_param_values);
3292
3293 /* If using typedef char *va_list, signal that
3294 __builtin_va_start (&ap, 0) can be optimized to
3295 ap = __builtin_next_arg (0). */
3296 if (DEFAULT_ABI != ABI_V4)
3297 targetm.expand_builtin_va_start = NULL;
3298 }
3299
3300 /* Set up single/double float flags.
3301 If TARGET_HARD_FLOAT is set, but neither single or double is set,
3302 then set both flags. */
3303 if (TARGET_HARD_FLOAT && TARGET_FPRS
3304 && rs6000_single_float == 0 && rs6000_double_float == 0)
3305 rs6000_single_float = rs6000_double_float = 1;
3306
3307 /* Reset single and double FP flags if target is E500. */
3308 if (TARGET_E500)
3309 {
3310 rs6000_single_float = rs6000_double_float = 0;
3311 if (TARGET_E500_SINGLE)
3312 rs6000_single_float = 1;
3313 if (TARGET_E500_DOUBLE)
3314 rs6000_single_float = rs6000_double_float = 1;
3315 }
3316
3317 if (main_target_opt)
3318 {
3319 if (main_target_opt->x_rs6000_single_float != rs6000_single_float)
3320 error ("target attribute or pragma changes single precision floating "
3321 "point");
3322 if (main_target_opt->x_rs6000_double_float != rs6000_double_float)
3323 error ("target attribute or pragma changes double precision floating "
3324 "point");
3325 }
3326
3327 /* If not explicitly specified via option, decide whether to generate indexed
3328 load/store instructions. */
3329 if (TARGET_AVOID_XFORM == -1)
3330 /* Avoid indexed addressing when targeting Power6 in order to avoid the
3331 DERAT mispredict penalty. However the LVE and STVE altivec instructions
3332 need indexed accesses and the type used is the scalar type of the element
3333 being loaded or stored. */
3334 TARGET_AVOID_XFORM = (rs6000_cpu == PROCESSOR_POWER6 && TARGET_CMPB
3335 && !TARGET_ALTIVEC);
3336
3337 /* Set the -mrecip options. */
3338 if (rs6000_recip_name)
3339 {
3340 char *p = ASTRDUP (rs6000_recip_name);
3341 char *q;
3342 unsigned int mask, i;
3343 bool invert;
3344
3345 while ((q = strtok (p, ",")) != NULL)
3346 {
3347 p = NULL;
3348 if (*q == '!')
3349 {
3350 invert = true;
3351 q++;
3352 }
3353 else
3354 invert = false;
3355
3356 if (!strcmp (q, "default"))
3357 mask = ((TARGET_RECIP_PRECISION)
3358 ? RECIP_HIGH_PRECISION : RECIP_LOW_PRECISION);
3359 else
3360 {
3361 for (i = 0; i < ARRAY_SIZE (recip_options); i++)
3362 if (!strcmp (q, recip_options[i].string))
3363 {
3364 mask = recip_options[i].mask;
3365 break;
3366 }
3367
3368 if (i == ARRAY_SIZE (recip_options))
3369 {
3370 error ("unknown option for -mrecip=%s", q);
3371 invert = false;
3372 mask = 0;
3373 ret = false;
3374 }
3375 }
3376
3377 if (invert)
3378 rs6000_recip_control &= ~mask;
3379 else
3380 rs6000_recip_control |= mask;
3381 }
3382 }
3383
3384 rs6000_init_hard_regno_mode_ok (global_init_p);
3385
3386 /* Save the initial options in case the user does function specific options */
3387 if (global_init_p)
3388 target_option_default_node = target_option_current_node
3389 = build_target_option_node ();
3390
3391 return ret;
3392 }
3393
3394 /* Implement TARGET_OPTION_OVERRIDE. On the RS/6000 this is used to
3395 define the target cpu type. */
3396
3397 static void
3398 rs6000_option_override (void)
3399 {
3400 (void) rs6000_option_override_internal (true);
3401 }
3402
3403 \f
3404 /* Implement targetm.vectorize.builtin_mask_for_load. */
3405 static tree
3406 rs6000_builtin_mask_for_load (void)
3407 {
3408 if (TARGET_ALTIVEC || TARGET_VSX)
3409 return altivec_builtin_mask_for_load;
3410 else
3411 return 0;
3412 }
3413
3414 /* Implement LOOP_ALIGN. */
3415 int
3416 rs6000_loop_align (rtx label)
3417 {
3418 basic_block bb;
3419 int ninsns;
3420
3421 /* Don't override loop alignment if -falign-loops was specified. */
3422 if (!can_override_loop_align)
3423 return align_loops_log;
3424
3425 bb = BLOCK_FOR_INSN (label);
3426 ninsns = num_loop_insns(bb->loop_father);
3427
3428 /* Align small loops to 32 bytes to fit in an icache sector, otherwise return default. */
3429 if (ninsns > 4 && ninsns <= 8
3430 && (rs6000_cpu == PROCESSOR_POWER4
3431 || rs6000_cpu == PROCESSOR_POWER5
3432 || rs6000_cpu == PROCESSOR_POWER6
3433 || rs6000_cpu == PROCESSOR_POWER7))
3434 return 5;
3435 else
3436 return align_loops_log;
3437 }
3438
3439 /* Implement TARGET_LOOP_ALIGN_MAX_SKIP. */
3440 static int
3441 rs6000_loop_align_max_skip (rtx label)
3442 {
3443 return (1 << rs6000_loop_align (label)) - 1;
3444 }
3445
3446 /* Implement targetm.vectorize.builtin_conversion.
3447 Returns a decl of a function that implements conversion of an integer vector
3448 into a floating-point vector, or vice-versa. DEST_TYPE is the
3449 destination type and SRC_TYPE the source type of the conversion.
3450 Return NULL_TREE if it is not available. */
3451 static tree
3452 rs6000_builtin_conversion (unsigned int tcode, tree dest_type, tree src_type)
3453 {
3454 enum tree_code code = (enum tree_code) tcode;
3455
3456 switch (code)
3457 {
3458 case FIX_TRUNC_EXPR:
3459 switch (TYPE_MODE (dest_type))
3460 {
3461 case V2DImode:
3462 if (!VECTOR_UNIT_VSX_P (V2DFmode))
3463 return NULL_TREE;
3464
3465 return TYPE_UNSIGNED (dest_type)
3466 ? rs6000_builtin_decls[VSX_BUILTIN_XVCVDPUXDS_UNS]
3467 : rs6000_builtin_decls[VSX_BUILTIN_XVCVDPSXDS];
3468
3469 case V4SImode:
3470 if (VECTOR_UNIT_NONE_P (V4SImode) || VECTOR_UNIT_NONE_P (V4SFmode))
3471 return NULL_TREE;
3472
3473 return TYPE_UNSIGNED (dest_type)
3474 ? rs6000_builtin_decls[VECTOR_BUILTIN_FIXUNS_V4SF_V4SI]
3475 : rs6000_builtin_decls[VECTOR_BUILTIN_FIX_V4SF_V4SI];
3476
3477 default:
3478 return NULL_TREE;
3479 }
3480
3481 case FLOAT_EXPR:
3482 switch (TYPE_MODE (src_type))
3483 {
3484 case V2DImode:
3485 if (!VECTOR_UNIT_VSX_P (V2DFmode))
3486 return NULL_TREE;
3487
3488 return TYPE_UNSIGNED (src_type)
3489 ? rs6000_builtin_decls[VSX_BUILTIN_XVCVUXDDP]
3490 : rs6000_builtin_decls[VSX_BUILTIN_XVCVSXDDP];
3491
3492 case V4SImode:
3493 if (VECTOR_UNIT_NONE_P (V4SImode) || VECTOR_UNIT_NONE_P (V4SFmode))
3494 return NULL_TREE;
3495
3496 return TYPE_UNSIGNED (src_type)
3497 ? rs6000_builtin_decls[VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF]
3498 : rs6000_builtin_decls[VECTOR_BUILTIN_FLOAT_V4SI_V4SF];
3499
3500 default:
3501 return NULL_TREE;
3502 }
3503
3504 default:
3505 return NULL_TREE;
3506 }
3507 }
3508
3509 /* Implement targetm.vectorize.builtin_mul_widen_even. */
3510 static tree
3511 rs6000_builtin_mul_widen_even (tree type)
3512 {
3513 if (!TARGET_ALTIVEC)
3514 return NULL_TREE;
3515
3516 switch (TYPE_MODE (type))
3517 {
3518 case V8HImode:
3519 return TYPE_UNSIGNED (type)
3520 ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUH_UNS]
3521 : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESH];
3522
3523 case V16QImode:
3524 return TYPE_UNSIGNED (type)
3525 ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULEUB_UNS]
3526 : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULESB];
3527 default:
3528 return NULL_TREE;
3529 }
3530 }
3531
3532 /* Implement targetm.vectorize.builtin_mul_widen_odd. */
3533 static tree
3534 rs6000_builtin_mul_widen_odd (tree type)
3535 {
3536 if (!TARGET_ALTIVEC)
3537 return NULL_TREE;
3538
3539 switch (TYPE_MODE (type))
3540 {
3541 case V8HImode:
3542 return TYPE_UNSIGNED (type)
3543 ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUH_UNS]
3544 : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSH];
3545
3546 case V16QImode:
3547 return TYPE_UNSIGNED (type)
3548 ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOUB_UNS]
3549 : rs6000_builtin_decls[ALTIVEC_BUILTIN_VMULOSB];
3550 default:
3551 return NULL_TREE;
3552 }
3553 }
3554
3555
3556 /* Return true iff, data reference of TYPE can reach vector alignment (16)
3557 after applying N number of iterations. This routine does not determine
3558 how may iterations are required to reach desired alignment. */
3559
3560 static bool
3561 rs6000_vector_alignment_reachable (const_tree type ATTRIBUTE_UNUSED, bool is_packed)
3562 {
3563 if (is_packed)
3564 return false;
3565
3566 if (TARGET_32BIT)
3567 {
3568 if (rs6000_alignment_flags == MASK_ALIGN_NATURAL)
3569 return true;
3570
3571 if (rs6000_alignment_flags == MASK_ALIGN_POWER)
3572 return true;
3573
3574 return false;
3575 }
3576 else
3577 {
3578 if (TARGET_MACHO)
3579 return false;
3580
3581 /* Assuming that all other types are naturally aligned. CHECKME! */
3582 return true;
3583 }
3584 }
3585
3586 /* Return true if the vector misalignment factor is supported by the
3587 target. */
3588 bool
3589 rs6000_builtin_support_vector_misalignment (enum machine_mode mode,
3590 const_tree type,
3591 int misalignment,
3592 bool is_packed)
3593 {
3594 if (TARGET_VSX)
3595 {
3596 /* Return if movmisalign pattern is not supported for this mode. */
3597 if (optab_handler (movmisalign_optab, mode) == CODE_FOR_nothing)
3598 return false;
3599
3600 if (misalignment == -1)
3601 {
3602 /* Misalignment factor is unknown at compile time but we know
3603 it's word aligned. */
3604 if (rs6000_vector_alignment_reachable (type, is_packed))
3605 {
3606 int element_size = TREE_INT_CST_LOW (TYPE_SIZE (type));
3607
3608 if (element_size == 64 || element_size == 32)
3609 return true;
3610 }
3611
3612 return false;
3613 }
3614
3615 /* VSX supports word-aligned vector. */
3616 if (misalignment % 4 == 0)
3617 return true;
3618 }
3619 return false;
3620 }
3621
3622 /* Implement targetm.vectorize.builtin_vec_perm. */
3623 tree
3624 rs6000_builtin_vec_perm (tree type, tree *mask_element_type)
3625 {
3626 tree inner_type = TREE_TYPE (type);
3627 bool uns_p = TYPE_UNSIGNED (inner_type);
3628 tree d;
3629
3630 *mask_element_type = unsigned_char_type_node;
3631
3632 switch (TYPE_MODE (type))
3633 {
3634 case V16QImode:
3635 d = (uns_p
3636 ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI_UNS]
3637 : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_16QI]);
3638 break;
3639
3640 case V8HImode:
3641 d = (uns_p
3642 ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI_UNS]
3643 : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_8HI]);
3644 break;
3645
3646 case V4SImode:
3647 d = (uns_p
3648 ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI_UNS]
3649 : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SI]);
3650 break;
3651
3652 case V4SFmode:
3653 d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_4SF];
3654 break;
3655
3656 case V2DFmode:
3657 if (!TARGET_ALLOW_DF_PERMUTE)
3658 return NULL_TREE;
3659
3660 d = rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DF];
3661 break;
3662
3663 case V2DImode:
3664 if (!TARGET_ALLOW_DF_PERMUTE)
3665 return NULL_TREE;
3666
3667 d = (uns_p
3668 ? rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DI_UNS]
3669 : rs6000_builtin_decls[ALTIVEC_BUILTIN_VPERM_2DI]);
3670 break;
3671
3672 default:
3673 return NULL_TREE;
3674 }
3675
3676 gcc_assert (d);
3677 return d;
3678 }
3679
3680
3681 /* Implement targetm.vectorize.builtin_vectorization_cost. */
3682 static int
3683 rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
3684 tree vectype, int misalign)
3685 {
3686 unsigned elements;
3687
3688 switch (type_of_cost)
3689 {
3690 case scalar_stmt:
3691 case scalar_load:
3692 case scalar_store:
3693 case vector_stmt:
3694 case vector_load:
3695 case vector_store:
3696 case vec_to_scalar:
3697 case scalar_to_vec:
3698 case cond_branch_not_taken:
3699 case vec_perm:
3700 return 1;
3701
3702 case cond_branch_taken:
3703 return 3;
3704
3705 case unaligned_load:
3706 if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
3707 {
3708 elements = TYPE_VECTOR_SUBPARTS (vectype);
3709 if (elements == 2)
3710 /* Double word aligned. */
3711 return 2;
3712
3713 if (elements == 4)
3714 {
3715 switch (misalign)
3716 {
3717 case 8:
3718 /* Double word aligned. */
3719 return 2;
3720
3721 case -1:
3722 /* Unknown misalignment. */
3723 case 4:
3724 case 12:
3725 /* Word aligned. */
3726 return 22;
3727
3728 default:
3729 gcc_unreachable ();
3730 }
3731 }
3732 }
3733
3734 if (TARGET_ALTIVEC)
3735 /* Misaligned loads are not supported. */
3736 gcc_unreachable ();
3737
3738 return 2;
3739
3740 case unaligned_store:
3741 if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
3742 {
3743 elements = TYPE_VECTOR_SUBPARTS (vectype);
3744 if (elements == 2)
3745 /* Double word aligned. */
3746 return 2;
3747
3748 if (elements == 4)
3749 {
3750 switch (misalign)
3751 {
3752 case 8:
3753 /* Double word aligned. */
3754 return 2;
3755
3756 case -1:
3757 /* Unknown misalignment. */
3758 case 4:
3759 case 12:
3760 /* Word aligned. */
3761 return 23;
3762
3763 default:
3764 gcc_unreachable ();
3765 }
3766 }
3767 }
3768
3769 if (TARGET_ALTIVEC)
3770 /* Misaligned stores are not supported. */
3771 gcc_unreachable ();
3772
3773 return 2;
3774
3775 default:
3776 gcc_unreachable ();
3777 }
3778 }
3779
3780 /* Implement targetm.vectorize.preferred_simd_mode. */
3781
3782 static enum machine_mode
3783 rs6000_preferred_simd_mode (enum machine_mode mode)
3784 {
3785 if (TARGET_VSX)
3786 switch (mode)
3787 {
3788 case DFmode:
3789 return V2DFmode;
3790 default:;
3791 }
3792 if (TARGET_ALTIVEC || TARGET_VSX)
3793 switch (mode)
3794 {
3795 case SFmode:
3796 return V4SFmode;
3797 case DImode:
3798 return V2DImode;
3799 case SImode:
3800 return V4SImode;
3801 case HImode:
3802 return V8HImode;
3803 case QImode:
3804 return V16QImode;
3805 default:;
3806 }
3807 if (TARGET_SPE)
3808 switch (mode)
3809 {
3810 case SFmode:
3811 return V2SFmode;
3812 case SImode:
3813 return V2SImode;
3814 default:;
3815 }
3816 if (TARGET_PAIRED_FLOAT
3817 && mode == SFmode)
3818 return V2SFmode;
3819 return word_mode;
3820 }
3821
3822 /* Implement TARGET_OPTION_INIT_STRUCT. */
3823
3824 static void
3825 rs6000_option_init_struct (struct gcc_options *opts)
3826 {
3827 if (DEFAULT_ABI == ABI_DARWIN)
3828 /* The Darwin libraries never set errno, so we might as well
3829 avoid calling them when that's the only reason we would. */
3830 opts->x_flag_errno_math = 0;
3831
3832 /* Enable section anchors by default. */
3833 if (!TARGET_MACHO)
3834 opts->x_flag_section_anchors = 1;
3835 }
3836
3837 /* Implement TARGET_OPTION_DEFAULT_PARAMS. */
3838
3839 static void
3840 rs6000_option_default_params (void)
3841 {
3842 /* Double growth factor to counter reduced min jump length. */
3843 set_default_param_value (PARAM_MAX_GROW_COPY_BB_INSNS, 16);
3844 }
3845
3846 static enum fpu_type_t
3847 rs6000_parse_fpu_option (const char *option)
3848 {
3849 if (!strcmp("none", option)) return FPU_NONE;
3850 if (!strcmp("sp_lite", option)) return FPU_SF_LITE;
3851 if (!strcmp("dp_lite", option)) return FPU_DF_LITE;
3852 if (!strcmp("sp_full", option)) return FPU_SF_FULL;
3853 if (!strcmp("dp_full", option)) return FPU_DF_FULL;
3854 error("unknown value %s for -mfpu", option);
3855 return FPU_NONE;
3856 }
3857
3858
3859 /* Handler for the Mathematical Acceleration Subsystem (mass) interface to a
3860 library with vectorized intrinsics. */
3861
3862 static tree
3863 rs6000_builtin_vectorized_libmass (tree fndecl, tree type_out, tree type_in)
3864 {
3865 char name[32];
3866 const char *suffix = NULL;
3867 tree fntype, new_fndecl, bdecl = NULL_TREE;
3868 int n_args = 1;
3869 const char *bname;
3870 enum machine_mode el_mode, in_mode;
3871 int n, in_n;
3872
3873 /* Libmass is suitable for unsafe math only as it does not correctly support
3874 parts of IEEE with the required precision such as denormals. Only support
3875 it if we have VSX to use the simd d2 or f4 functions.
3876 XXX: Add variable length support. */
3877 if (!flag_unsafe_math_optimizations || !TARGET_VSX)
3878 return NULL_TREE;
3879
3880 el_mode = TYPE_MODE (TREE_TYPE (type_out));
3881 n = TYPE_VECTOR_SUBPARTS (type_out);
3882 in_mode = TYPE_MODE (TREE_TYPE (type_in));
3883 in_n = TYPE_VECTOR_SUBPARTS (type_in);
3884 if (el_mode != in_mode
3885 || n != in_n)
3886 return NULL_TREE;
3887
3888 if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
3889 {
3890 enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
3891 switch (fn)
3892 {
3893 case BUILT_IN_ATAN2:
3894 case BUILT_IN_HYPOT:
3895 case BUILT_IN_POW:
3896 n_args = 2;
3897 /* fall through */
3898
3899 case BUILT_IN_ACOS:
3900 case BUILT_IN_ACOSH:
3901 case BUILT_IN_ASIN:
3902 case BUILT_IN_ASINH:
3903 case BUILT_IN_ATAN:
3904 case BUILT_IN_ATANH:
3905 case BUILT_IN_CBRT:
3906 case BUILT_IN_COS:
3907 case BUILT_IN_COSH:
3908 case BUILT_IN_ERF:
3909 case BUILT_IN_ERFC:
3910 case BUILT_IN_EXP2:
3911 case BUILT_IN_EXP:
3912 case BUILT_IN_EXPM1:
3913 case BUILT_IN_LGAMMA:
3914 case BUILT_IN_LOG10:
3915 case BUILT_IN_LOG1P:
3916 case BUILT_IN_LOG2:
3917 case BUILT_IN_LOG:
3918 case BUILT_IN_SIN:
3919 case BUILT_IN_SINH:
3920 case BUILT_IN_SQRT:
3921 case BUILT_IN_TAN:
3922 case BUILT_IN_TANH:
3923 bdecl = implicit_built_in_decls[fn];
3924 suffix = "d2"; /* pow -> powd2 */
3925 if (el_mode != DFmode
3926 || n != 2)
3927 return NULL_TREE;
3928 break;
3929
3930 case BUILT_IN_ATAN2F:
3931 case BUILT_IN_HYPOTF:
3932 case BUILT_IN_POWF:
3933 n_args = 2;
3934 /* fall through */
3935
3936 case BUILT_IN_ACOSF:
3937 case BUILT_IN_ACOSHF:
3938 case BUILT_IN_ASINF:
3939 case BUILT_IN_ASINHF:
3940 case BUILT_IN_ATANF:
3941 case BUILT_IN_ATANHF:
3942 case BUILT_IN_CBRTF:
3943 case BUILT_IN_COSF:
3944 case BUILT_IN_COSHF:
3945 case BUILT_IN_ERFF:
3946 case BUILT_IN_ERFCF:
3947 case BUILT_IN_EXP2F:
3948 case BUILT_IN_EXPF:
3949 case BUILT_IN_EXPM1F:
3950 case BUILT_IN_LGAMMAF:
3951 case BUILT_IN_LOG10F:
3952 case BUILT_IN_LOG1PF:
3953 case BUILT_IN_LOG2F:
3954 case BUILT_IN_LOGF:
3955 case BUILT_IN_SINF:
3956 case BUILT_IN_SINHF:
3957 case BUILT_IN_SQRTF:
3958 case BUILT_IN_TANF:
3959 case BUILT_IN_TANHF:
3960 bdecl = implicit_built_in_decls[fn];
3961 suffix = "4"; /* powf -> powf4 */
3962 if (el_mode != SFmode
3963 || n != 4)
3964 return NULL_TREE;
3965 break;
3966
3967 default:
3968 return NULL_TREE;
3969 }
3970 }
3971 else
3972 return NULL_TREE;
3973
3974 gcc_assert (suffix != NULL);
3975 bname = IDENTIFIER_POINTER (DECL_NAME (bdecl));
3976 strcpy (name, bname + sizeof ("__builtin_") - 1);
3977 strcat (name, suffix);
3978
3979 if (n_args == 1)
3980 fntype = build_function_type_list (type_out, type_in, NULL);
3981 else if (n_args == 2)
3982 fntype = build_function_type_list (type_out, type_in, type_in, NULL);
3983 else
3984 gcc_unreachable ();
3985
3986 /* Build a function declaration for the vectorized function. */
3987 new_fndecl = build_decl (BUILTINS_LOCATION,
3988 FUNCTION_DECL, get_identifier (name), fntype);
3989 TREE_PUBLIC (new_fndecl) = 1;
3990 DECL_EXTERNAL (new_fndecl) = 1;
3991 DECL_IS_NOVOPS (new_fndecl) = 1;
3992 TREE_READONLY (new_fndecl) = 1;
3993
3994 return new_fndecl;
3995 }
3996
3997 /* Returns a function decl for a vectorized version of the builtin function
3998 with builtin function code FN and the result vector type TYPE, or NULL_TREE
3999 if it is not available. */
4000
4001 static tree
4002 rs6000_builtin_vectorized_function (tree fndecl, tree type_out,
4003 tree type_in)
4004 {
4005 enum machine_mode in_mode, out_mode;
4006 int in_n, out_n;
4007
4008 if (TREE_CODE (type_out) != VECTOR_TYPE
4009 || TREE_CODE (type_in) != VECTOR_TYPE
4010 || !TARGET_VECTORIZE_BUILTINS)
4011 return NULL_TREE;
4012
4013 out_mode = TYPE_MODE (TREE_TYPE (type_out));
4014 out_n = TYPE_VECTOR_SUBPARTS (type_out);
4015 in_mode = TYPE_MODE (TREE_TYPE (type_in));
4016 in_n = TYPE_VECTOR_SUBPARTS (type_in);
4017
4018 if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
4019 {
4020 enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
4021 switch (fn)
4022 {
4023 case BUILT_IN_COPYSIGN:
4024 if (VECTOR_UNIT_VSX_P (V2DFmode)
4025 && out_mode == DFmode && out_n == 2
4026 && in_mode == DFmode && in_n == 2)
4027 return rs6000_builtin_decls[VSX_BUILTIN_CPSGNDP];
4028 break;
4029 case BUILT_IN_COPYSIGNF:
4030 if (out_mode != SFmode || out_n != 4
4031 || in_mode != SFmode || in_n != 4)
4032 break;
4033 if (VECTOR_UNIT_VSX_P (V4SFmode))
4034 return rs6000_builtin_decls[VSX_BUILTIN_CPSGNSP];
4035 if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
4036 return rs6000_builtin_decls[ALTIVEC_BUILTIN_COPYSIGN_V4SF];
4037 break;
4038 case BUILT_IN_SQRT:
4039 if (VECTOR_UNIT_VSX_P (V2DFmode)
4040 && out_mode == DFmode && out_n == 2
4041 && in_mode == DFmode && in_n == 2)
4042 return rs6000_builtin_decls[VSX_BUILTIN_XVSQRTDP];
4043 break;
4044 case BUILT_IN_SQRTF:
4045 if (VECTOR_UNIT_VSX_P (V4SFmode)
4046 && out_mode == SFmode && out_n == 4
4047 && in_mode == SFmode && in_n == 4)
4048 return rs6000_builtin_decls[VSX_BUILTIN_XVSQRTSP];
4049 break;
4050 case BUILT_IN_CEIL:
4051 if (VECTOR_UNIT_VSX_P (V2DFmode)
4052 && out_mode == DFmode && out_n == 2
4053 && in_mode == DFmode && in_n == 2)
4054 return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIP];
4055 break;
4056 case BUILT_IN_CEILF:
4057 if (out_mode != SFmode || out_n != 4
4058 || in_mode != SFmode || in_n != 4)
4059 break;
4060 if (VECTOR_UNIT_VSX_P (V4SFmode))
4061 return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIP];
4062 if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
4063 return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIP];
4064 break;
4065 case BUILT_IN_FLOOR:
4066 if (VECTOR_UNIT_VSX_P (V2DFmode)
4067 && out_mode == DFmode && out_n == 2
4068 && in_mode == DFmode && in_n == 2)
4069 return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIM];
4070 break;
4071 case BUILT_IN_FLOORF:
4072 if (out_mode != SFmode || out_n != 4
4073 || in_mode != SFmode || in_n != 4)
4074 break;
4075 if (VECTOR_UNIT_VSX_P (V4SFmode))
4076 return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIM];
4077 if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
4078 return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIM];
4079 break;
4080 case BUILT_IN_FMA:
4081 if (VECTOR_UNIT_VSX_P (V2DFmode)
4082 && out_mode == DFmode && out_n == 2
4083 && in_mode == DFmode && in_n == 2)
4084 return rs6000_builtin_decls[VSX_BUILTIN_XVMADDDP];
4085 break;
4086 case BUILT_IN_FMAF:
4087 if (VECTOR_UNIT_VSX_P (V4SFmode)
4088 && out_mode == SFmode && out_n == 4
4089 && in_mode == SFmode && in_n == 4)
4090 return rs6000_builtin_decls[VSX_BUILTIN_XVMADDSP];
4091 else if (VECTOR_UNIT_ALTIVEC_P (V4SFmode)
4092 && out_mode == SFmode && out_n == 4
4093 && in_mode == SFmode && in_n == 4)
4094 return rs6000_builtin_decls[ALTIVEC_BUILTIN_VMADDFP];
4095 break;
4096 case BUILT_IN_TRUNC:
4097 if (VECTOR_UNIT_VSX_P (V2DFmode)
4098 && out_mode == DFmode && out_n == 2
4099 && in_mode == DFmode && in_n == 2)
4100 return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIZ];
4101 break;
4102 case BUILT_IN_TRUNCF:
4103 if (out_mode != SFmode || out_n != 4
4104 || in_mode != SFmode || in_n != 4)
4105 break;
4106 if (VECTOR_UNIT_VSX_P (V4SFmode))
4107 return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIZ];
4108 if (VECTOR_UNIT_ALTIVEC_P (V4SFmode))
4109 return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRFIZ];
4110 break;
4111 case BUILT_IN_NEARBYINT:
4112 if (VECTOR_UNIT_VSX_P (V2DFmode)
4113 && flag_unsafe_math_optimizations
4114 && out_mode == DFmode && out_n == 2
4115 && in_mode == DFmode && in_n == 2)
4116 return rs6000_builtin_decls[VSX_BUILTIN_XVRDPI];
4117 break;
4118 case BUILT_IN_NEARBYINTF:
4119 if (VECTOR_UNIT_VSX_P (V4SFmode)
4120 && flag_unsafe_math_optimizations
4121 && out_mode == SFmode && out_n == 4
4122 && in_mode == SFmode && in_n == 4)
4123 return rs6000_builtin_decls[VSX_BUILTIN_XVRSPI];
4124 break;
4125 case BUILT_IN_RINT:
4126 if (VECTOR_UNIT_VSX_P (V2DFmode)
4127 && !flag_trapping_math
4128 && out_mode == DFmode && out_n == 2
4129 && in_mode == DFmode && in_n == 2)
4130 return rs6000_builtin_decls[VSX_BUILTIN_XVRDPIC];
4131 break;
4132 case BUILT_IN_RINTF:
4133 if (VECTOR_UNIT_VSX_P (V4SFmode)
4134 && !flag_trapping_math
4135 && out_mode == SFmode && out_n == 4
4136 && in_mode == SFmode && in_n == 4)
4137 return rs6000_builtin_decls[VSX_BUILTIN_XVRSPIC];
4138 break;
4139 default:
4140 break;
4141 }
4142 }
4143
4144 else if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
4145 {
4146 enum rs6000_builtins fn
4147 = (enum rs6000_builtins)DECL_FUNCTION_CODE (fndecl);
4148 switch (fn)
4149 {
4150 case RS6000_BUILTIN_RSQRTF:
4151 if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
4152 && out_mode == SFmode && out_n == 4
4153 && in_mode == SFmode && in_n == 4)
4154 return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRSQRTFP];
4155 break;
4156 case RS6000_BUILTIN_RSQRT:
4157 if (VECTOR_UNIT_VSX_P (V2DFmode)
4158 && out_mode == DFmode && out_n == 2
4159 && in_mode == DFmode && in_n == 2)
4160 return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V2DF];
4161 break;
4162 case RS6000_BUILTIN_RECIPF:
4163 if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)
4164 && out_mode == SFmode && out_n == 4
4165 && in_mode == SFmode && in_n == 4)
4166 return rs6000_builtin_decls[ALTIVEC_BUILTIN_VRECIPFP];
4167 break;
4168 case RS6000_BUILTIN_RECIP:
4169 if (VECTOR_UNIT_VSX_P (V2DFmode)
4170 && out_mode == DFmode && out_n == 2
4171 && in_mode == DFmode && in_n == 2)
4172 return rs6000_builtin_decls[VSX_BUILTIN_RECIP_V2DF];
4173 break;
4174 default:
4175 break;
4176 }
4177 }
4178
4179 /* Generate calls to libmass if appropriate. */
4180 if (rs6000_veclib_handler)
4181 return rs6000_veclib_handler (fndecl, type_out, type_in);
4182
4183 return NULL_TREE;
4184 }
4185
4186
4187 /* Implement TARGET_HANDLE_OPTION. */
4188
4189 static bool
4190 rs6000_handle_option (struct gcc_options *opts, struct gcc_options *opts_set,
4191 const struct cl_decoded_option *decoded,
4192 location_t loc ATTRIBUTE_UNUSED)
4193 {
4194 enum fpu_type_t fpu_type = FPU_NONE;
4195 char *p, *q;
4196 size_t code = decoded->opt_index;
4197 const char *arg = decoded->arg;
4198 int value = decoded->value;
4199
4200 gcc_assert (opts == &global_options);
4201 gcc_assert (opts_set == &global_options_set);
4202
4203 switch (code)
4204 {
4205 case OPT_mno_power:
4206 target_flags &= ~(MASK_POWER | MASK_POWER2
4207 | MASK_MULTIPLE | MASK_STRING);
4208 target_flags_explicit |= (MASK_POWER | MASK_POWER2
4209 | MASK_MULTIPLE | MASK_STRING);
4210 break;
4211 case OPT_mno_powerpc:
4212 target_flags &= ~(MASK_POWERPC | MASK_PPC_GPOPT
4213 | MASK_PPC_GFXOPT | MASK_POWERPC64);
4214 target_flags_explicit |= (MASK_POWERPC | MASK_PPC_GPOPT
4215 | MASK_PPC_GFXOPT | MASK_POWERPC64);
4216 break;
4217 case OPT_mfull_toc:
4218 target_flags &= ~MASK_MINIMAL_TOC;
4219 TARGET_NO_FP_IN_TOC = 0;
4220 TARGET_NO_SUM_IN_TOC = 0;
4221 target_flags_explicit |= MASK_MINIMAL_TOC;
4222 #ifdef TARGET_USES_SYSV4_OPT
4223 /* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be
4224 just the same as -mminimal-toc. */
4225 target_flags |= MASK_MINIMAL_TOC;
4226 target_flags_explicit |= MASK_MINIMAL_TOC;
4227 #endif
4228 break;
4229
4230 #ifdef TARGET_USES_SYSV4_OPT
4231 case OPT_mtoc:
4232 /* Make -mtoc behave like -mminimal-toc. */
4233 target_flags |= MASK_MINIMAL_TOC;
4234 target_flags_explicit |= MASK_MINIMAL_TOC;
4235 break;
4236 #endif
4237
4238 #if defined (HAVE_LD_LARGE_TOC) && defined (TARGET_USES_LINUX64_OPT)
4239 case OPT_mcmodel_:
4240 if (strcmp (arg, "small") == 0)
4241 rs6000_current_cmodel = CMODEL_SMALL;
4242 else if (strcmp (arg, "medium") == 0)
4243 rs6000_current_cmodel = CMODEL_MEDIUM;
4244 else if (strcmp (arg, "large") == 0)
4245 rs6000_current_cmodel = CMODEL_LARGE;
4246 else
4247 {
4248 error ("invalid option for -mcmodel: '%s'", arg);
4249 return false;
4250 }
4251 rs6000_explicit_options.cmodel = true;
4252 #endif
4253
4254 #ifdef TARGET_USES_AIX64_OPT
4255 case OPT_maix64:
4256 #else
4257 case OPT_m64:
4258 #endif
4259 target_flags |= MASK_POWERPC64 | MASK_POWERPC;
4260 target_flags |= ~target_flags_explicit & MASK_PPC_GFXOPT;
4261 target_flags_explicit |= MASK_POWERPC64 | MASK_POWERPC;
4262 break;
4263
4264 #ifdef TARGET_USES_AIX64_OPT
4265 case OPT_maix32:
4266 #else
4267 case OPT_m32:
4268 #endif
4269 target_flags &= ~MASK_POWERPC64;
4270 target_flags_explicit |= MASK_POWERPC64;
4271 break;
4272
4273 case OPT_minsert_sched_nops_:
4274 rs6000_sched_insert_nops_str = arg;
4275 break;
4276
4277 case OPT_mminimal_toc:
4278 if (value == 1)
4279 {
4280 TARGET_NO_FP_IN_TOC = 0;
4281 TARGET_NO_SUM_IN_TOC = 0;
4282 }
4283 break;
4284
4285 case OPT_mpower:
4286 if (value == 1)
4287 {
4288 target_flags |= (MASK_MULTIPLE | MASK_STRING);
4289 target_flags_explicit |= (MASK_MULTIPLE | MASK_STRING);
4290 }
4291 break;
4292
4293 case OPT_mpower2:
4294 if (value == 1)
4295 {
4296 target_flags |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
4297 target_flags_explicit |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
4298 }
4299 break;
4300
4301 case OPT_mpowerpc_gpopt:
4302 case OPT_mpowerpc_gfxopt:
4303 if (value == 1)
4304 {
4305 target_flags |= MASK_POWERPC;
4306 target_flags_explicit |= MASK_POWERPC;
4307 }
4308 break;
4309
4310 case OPT_maix_struct_return:
4311 case OPT_msvr4_struct_return:
4312 rs6000_explicit_options.aix_struct_ret = true;
4313 break;
4314
4315 case OPT_mvrsave:
4316 rs6000_explicit_options.vrsave = true;
4317 TARGET_ALTIVEC_VRSAVE = value;
4318 break;
4319
4320 case OPT_mspe:
4321 rs6000_explicit_options.spe = true;
4322 rs6000_spe = value;
4323 break;
4324
4325 case OPT_mdebug_:
4326 p = ASTRDUP (arg);
4327 rs6000_debug = 0;
4328
4329 while ((q = strtok (p, ",")) != NULL)
4330 {
4331 unsigned mask = 0;
4332 bool invert;
4333
4334 p = NULL;
4335 if (*q == '!')
4336 {
4337 invert = true;
4338 q++;
4339 }
4340 else
4341 invert = false;
4342
4343 if (! strcmp (q, "all"))
4344 mask = MASK_DEBUG_ALL;
4345 else if (! strcmp (q, "stack"))
4346 mask = MASK_DEBUG_STACK;
4347 else if (! strcmp (q, "arg"))
4348 mask = MASK_DEBUG_ARG;
4349 else if (! strcmp (q, "reg"))
4350 mask = MASK_DEBUG_REG;
4351 else if (! strcmp (q, "addr"))
4352 mask = MASK_DEBUG_ADDR;
4353 else if (! strcmp (q, "cost"))
4354 mask = MASK_DEBUG_COST;
4355 else if (! strcmp (q, "target"))
4356 mask = MASK_DEBUG_TARGET;
4357 else
4358 error ("unknown -mdebug-%s switch", q);
4359
4360 if (invert)
4361 rs6000_debug &= ~mask;
4362 else
4363 rs6000_debug |= mask;
4364 }
4365 break;
4366
4367 #ifdef TARGET_USES_SYSV4_OPT
4368 case OPT_mcall_:
4369 rs6000_abi_name = arg;
4370 break;
4371
4372 case OPT_msdata_:
4373 rs6000_sdata_name = arg;
4374 break;
4375
4376 case OPT_mtls_size_:
4377 if (strcmp (arg, "16") == 0)
4378 rs6000_tls_size = 16;
4379 else if (strcmp (arg, "32") == 0)
4380 rs6000_tls_size = 32;
4381 else if (strcmp (arg, "64") == 0)
4382 rs6000_tls_size = 64;
4383 else
4384 error ("bad value %qs for -mtls-size switch", arg);
4385 break;
4386
4387 case OPT_mrelocatable:
4388 if (value == 1)
4389 {
4390 target_flags |= MASK_MINIMAL_TOC;
4391 target_flags_explicit |= MASK_MINIMAL_TOC;
4392 TARGET_NO_FP_IN_TOC = 1;
4393 }
4394 break;
4395
4396 case OPT_mrelocatable_lib:
4397 if (value == 1)
4398 {
4399 target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
4400 target_flags_explicit |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;
4401 TARGET_NO_FP_IN_TOC = 1;
4402 }
4403 else
4404 {
4405 target_flags &= ~MASK_RELOCATABLE;
4406 target_flags_explicit |= MASK_RELOCATABLE;
4407 }
4408 break;
4409 #endif
4410
4411 case OPT_mabi_:
4412 if (!strcmp (arg, "altivec"))
4413 {
4414 rs6000_explicit_options.altivec_abi = true;
4415 rs6000_altivec_abi = 1;
4416
4417 /* Enabling the AltiVec ABI turns off the SPE ABI. */
4418 rs6000_spe_abi = 0;
4419 }
4420 else if (! strcmp (arg, "no-altivec"))
4421 {
4422 rs6000_explicit_options.altivec_abi = true;
4423 rs6000_altivec_abi = 0;
4424 }
4425 else if (! strcmp (arg, "spe"))
4426 {
4427 rs6000_explicit_options.spe_abi = true;
4428 rs6000_spe_abi = 1;
4429 rs6000_altivec_abi = 0;
4430 if (!TARGET_SPE_ABI)
4431 error ("not configured for ABI: '%s'", arg);
4432 }
4433 else if (! strcmp (arg, "no-spe"))
4434 {
4435 rs6000_explicit_options.spe_abi = true;
4436 rs6000_spe_abi = 0;
4437 }
4438
4439 /* These are here for testing during development only, do not
4440 document in the manual please. */
4441 else if (! strcmp (arg, "d64"))
4442 {
4443 rs6000_darwin64_abi = 1;
4444 warning (0, "using darwin64 ABI");
4445 }
4446 else if (! strcmp (arg, "d32"))
4447 {
4448 rs6000_darwin64_abi = 0;
4449 warning (0, "using old darwin ABI");
4450 }
4451
4452 else if (! strcmp (arg, "ibmlongdouble"))
4453 {
4454 rs6000_explicit_options.ieee = true;
4455 rs6000_ieeequad = 0;
4456 warning (0, "using IBM extended precision long double");
4457 }
4458 else if (! strcmp (arg, "ieeelongdouble"))
4459 {
4460 rs6000_explicit_options.ieee = true;
4461 rs6000_ieeequad = 1;
4462 warning (0, "using IEEE extended precision long double");
4463 }
4464
4465 else
4466 {
4467 error ("unknown ABI specified: '%s'", arg);
4468 return false;
4469 }
4470 break;
4471
4472 case OPT_mcpu_:
4473 rs6000_select[1].string = arg;
4474 rs6000_cpu_index = rs6000_cpu_name_lookup (arg);
4475 if (rs6000_cpu_index < 0)
4476 error ("bad value (%s) for -mcpu", arg);
4477 break;
4478
4479 case OPT_mtune_:
4480 rs6000_select[2].string = arg;
4481 rs6000_tune_index = rs6000_cpu_name_lookup (arg);
4482 if (rs6000_tune_index < 0)
4483 error ("bad value (%s) for -mtune", arg);
4484 break;
4485
4486 case OPT_mtraceback_:
4487 if (! strncmp (arg, "full", 4))
4488 rs6000_traceback = traceback_full;
4489 else if (! strncmp (arg, "part", 4))
4490 rs6000_traceback = traceback_part;
4491 else if (! strncmp (arg, "no", 2))
4492 rs6000_traceback = traceback_none;
4493 else
4494 error ("unknown -mtraceback arg %qs; expecting %<full%>, "
4495 "%<partial%> or %<none%>", arg);
4496 break;
4497
4498 case OPT_mfloat_gprs_:
4499 rs6000_explicit_options.float_gprs = true;
4500 if (! strcmp (arg, "yes") || ! strcmp (arg, "single"))
4501 rs6000_float_gprs = 1;
4502 else if (! strcmp (arg, "double"))
4503 rs6000_float_gprs = 2;
4504 else if (! strcmp (arg, "no"))
4505 rs6000_float_gprs = 0;
4506 else
4507 {
4508 error ("invalid option for -mfloat-gprs: '%s'", arg);
4509 return false;
4510 }
4511 break;
4512
4513 case OPT_mlong_double_:
4514 rs6000_explicit_options.long_double = true;
4515 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
4516 if (value != 64 && value != 128)
4517 {
4518 error ("unknown switch -mlong-double-%s", arg);
4519 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
4520 return false;
4521 }
4522 else
4523 rs6000_long_double_type_size = value;
4524 break;
4525
4526 case OPT_msched_costly_dep_:
4527 rs6000_sched_costly_dep_str = arg;
4528 break;
4529
4530 case OPT_malign_:
4531 rs6000_explicit_options.alignment = true;
4532 if (! strcmp (arg, "power"))
4533 {
4534 /* On 64-bit Darwin, power alignment is ABI-incompatible with
4535 some C library functions, so warn about it. The flag may be
4536 useful for performance studies from time to time though, so
4537 don't disable it entirely. */
4538 if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
4539 warning (0, "-malign-power is not supported for 64-bit Darwin;"
4540 " it is incompatible with the installed C and C++ libraries");
4541 rs6000_alignment_flags = MASK_ALIGN_POWER;
4542 }
4543 else if (! strcmp (arg, "natural"))
4544 rs6000_alignment_flags = MASK_ALIGN_NATURAL;
4545 else
4546 {
4547 error ("unknown -malign-XXXXX option specified: '%s'", arg);
4548 return false;
4549 }
4550 break;
4551
4552 case OPT_msingle_float:
4553 if (!TARGET_SINGLE_FPU)
4554 warning (0, "-msingle-float option equivalent to -mhard-float");
4555 /* -msingle-float implies -mno-double-float and TARGET_HARD_FLOAT. */
4556 rs6000_double_float = 0;
4557 target_flags &= ~MASK_SOFT_FLOAT;
4558 target_flags_explicit |= MASK_SOFT_FLOAT;
4559 break;
4560
4561 case OPT_mdouble_float:
4562 /* -mdouble-float implies -msingle-float and TARGET_HARD_FLOAT. */
4563 rs6000_single_float = 1;
4564 target_flags &= ~MASK_SOFT_FLOAT;
4565 target_flags_explicit |= MASK_SOFT_FLOAT;
4566 break;
4567
4568 case OPT_msimple_fpu:
4569 if (!TARGET_SINGLE_FPU)
4570 warning (0, "-msimple-fpu option ignored");
4571 break;
4572
4573 case OPT_mhard_float:
4574 /* -mhard_float implies -msingle-float and -mdouble-float. */
4575 rs6000_single_float = rs6000_double_float = 1;
4576 break;
4577
4578 case OPT_msoft_float:
4579 /* -msoft_float implies -mnosingle-float and -mnodouble-float. */
4580 rs6000_single_float = rs6000_double_float = 0;
4581 break;
4582
4583 case OPT_mfpu_:
4584 fpu_type = rs6000_parse_fpu_option(arg);
4585 if (fpu_type != FPU_NONE)
4586 /* If -mfpu is not none, then turn off SOFT_FLOAT, turn on HARD_FLOAT. */
4587 {
4588 target_flags &= ~MASK_SOFT_FLOAT;
4589 target_flags_explicit |= MASK_SOFT_FLOAT;
4590 rs6000_xilinx_fpu = 1;
4591 if (fpu_type == FPU_SF_LITE || fpu_type == FPU_SF_FULL)
4592 rs6000_single_float = 1;
4593 if (fpu_type == FPU_DF_LITE || fpu_type == FPU_DF_FULL)
4594 rs6000_single_float = rs6000_double_float = 1;
4595 if (fpu_type == FPU_SF_LITE || fpu_type == FPU_DF_LITE)
4596 rs6000_simple_fpu = 1;
4597 }
4598 else
4599 {
4600 /* -mfpu=none is equivalent to -msoft-float */
4601 target_flags |= MASK_SOFT_FLOAT;
4602 target_flags_explicit |= MASK_SOFT_FLOAT;
4603 rs6000_single_float = rs6000_double_float = 0;
4604 }
4605
4606 case OPT_mrecip:
4607 rs6000_recip_name = (value) ? "default" : "none";
4608 break;
4609
4610 case OPT_mrecip_:
4611 rs6000_recip_name = arg;
4612 break;
4613 }
4614 return true;
4615 }
4616 \f
4617 /* Do anything needed at the start of the asm file. */
4618
4619 static void
4620 rs6000_file_start (void)
4621 {
4622 size_t i;
4623 char buffer[80];
4624 const char *start = buffer;
4625 struct rs6000_cpu_select *ptr;
4626 const char *default_cpu = TARGET_CPU_DEFAULT;
4627 FILE *file = asm_out_file;
4628
4629 default_file_start ();
4630
4631 #ifdef TARGET_BI_ARCH
4632 if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
4633 default_cpu = 0;
4634 #endif
4635
4636 if (flag_verbose_asm)
4637 {
4638 sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
4639 rs6000_select[0].string = default_cpu;
4640
4641 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
4642 {
4643 ptr = &rs6000_select[i];
4644 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
4645 {
4646 fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
4647 start = "";
4648 }
4649 }
4650
4651 if (PPC405_ERRATUM77)
4652 {
4653 fprintf (file, "%s PPC405CR_ERRATUM77", start);
4654 start = "";
4655 }
4656
4657 #ifdef USING_ELFOS_H
4658 switch (rs6000_sdata)
4659 {
4660 case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
4661 case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
4662 case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
4663 case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
4664 }
4665
4666 if (rs6000_sdata && g_switch_value)
4667 {
4668 fprintf (file, "%s -G %d", start,
4669 g_switch_value);
4670 start = "";
4671 }
4672 #endif
4673
4674 if (*start == '\0')
4675 putc ('\n', file);
4676 }
4677
4678 if (DEFAULT_ABI == ABI_AIX || (TARGET_ELF && flag_pic == 2))
4679 {
4680 switch_to_section (toc_section);
4681 switch_to_section (text_section);
4682 }
4683 }
4684
4685 \f
4686 /* Return nonzero if this function is known to have a null epilogue. */
4687
4688 int
4689 direct_return (void)
4690 {
4691 if (reload_completed)
4692 {
4693 rs6000_stack_t *info = rs6000_stack_info ();
4694
4695 if (info->first_gp_reg_save == 32
4696 && info->first_fp_reg_save == 64
4697 && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
4698 && ! info->lr_save_p
4699 && ! info->cr_save_p
4700 && info->vrsave_mask == 0
4701 && ! info->push_p)
4702 return 1;
4703 }
4704
4705 return 0;
4706 }
4707
4708 /* Return the number of instructions it takes to form a constant in an
4709 integer register. */
4710
4711 int
4712 num_insns_constant_wide (HOST_WIDE_INT value)
4713 {
4714 /* signed constant loadable with {cal|addi} */
4715 if ((unsigned HOST_WIDE_INT) (value + 0x8000) < 0x10000)
4716 return 1;
4717
4718 /* constant loadable with {cau|addis} */
4719 else if ((value & 0xffff) == 0
4720 && (value >> 31 == -1 || value >> 31 == 0))
4721 return 1;
4722
4723 #if HOST_BITS_PER_WIDE_INT == 64
4724 else if (TARGET_POWERPC64)
4725 {
4726 HOST_WIDE_INT low = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
4727 HOST_WIDE_INT high = value >> 31;
4728
4729 if (high == 0 || high == -1)
4730 return 2;
4731
4732 high >>= 1;
4733
4734 if (low == 0)
4735 return num_insns_constant_wide (high) + 1;
4736 else if (high == 0)
4737 return num_insns_constant_wide (low) + 1;
4738 else
4739 return (num_insns_constant_wide (high)
4740 + num_insns_constant_wide (low) + 1);
4741 }
4742 #endif
4743
4744 else
4745 return 2;
4746 }
4747
4748 int
4749 num_insns_constant (rtx op, enum machine_mode mode)
4750 {
4751 HOST_WIDE_INT low, high;
4752
4753 switch (GET_CODE (op))
4754 {
4755 case CONST_INT:
4756 #if HOST_BITS_PER_WIDE_INT == 64
4757 if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
4758 && mask64_operand (op, mode))
4759 return 2;
4760 else
4761 #endif
4762 return num_insns_constant_wide (INTVAL (op));
4763
4764 case CONST_DOUBLE:
4765 if (mode == SFmode || mode == SDmode)
4766 {
4767 long l;
4768 REAL_VALUE_TYPE rv;
4769
4770 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4771 if (DECIMAL_FLOAT_MODE_P (mode))
4772 REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
4773 else
4774 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
4775 return num_insns_constant_wide ((HOST_WIDE_INT) l);
4776 }
4777
4778 if (mode == VOIDmode || mode == DImode)
4779 {
4780 high = CONST_DOUBLE_HIGH (op);
4781 low = CONST_DOUBLE_LOW (op);
4782 }
4783 else
4784 {
4785 long l[2];
4786 REAL_VALUE_TYPE rv;
4787
4788 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4789 if (DECIMAL_FLOAT_MODE_P (mode))
4790 REAL_VALUE_TO_TARGET_DECIMAL64 (rv, l);
4791 else
4792 REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
4793 high = l[WORDS_BIG_ENDIAN == 0];
4794 low = l[WORDS_BIG_ENDIAN != 0];
4795 }
4796
4797 if (TARGET_32BIT)
4798 return (num_insns_constant_wide (low)
4799 + num_insns_constant_wide (high));
4800 else
4801 {
4802 if ((high == 0 && low >= 0)
4803 || (high == -1 && low < 0))
4804 return num_insns_constant_wide (low);
4805
4806 else if (mask64_operand (op, mode))
4807 return 2;
4808
4809 else if (low == 0)
4810 return num_insns_constant_wide (high) + 1;
4811
4812 else
4813 return (num_insns_constant_wide (high)
4814 + num_insns_constant_wide (low) + 1);
4815 }
4816
4817 default:
4818 gcc_unreachable ();
4819 }
4820 }
4821
4822 /* Interpret element ELT of the CONST_VECTOR OP as an integer value.
4823 If the mode of OP is MODE_VECTOR_INT, this simply returns the
4824 corresponding element of the vector, but for V4SFmode and V2SFmode,
4825 the corresponding "float" is interpreted as an SImode integer. */
4826
4827 HOST_WIDE_INT
4828 const_vector_elt_as_int (rtx op, unsigned int elt)
4829 {
4830 rtx tmp;
4831
4832 /* We can't handle V2DImode and V2DFmode vector constants here yet. */
4833 gcc_assert (GET_MODE (op) != V2DImode
4834 && GET_MODE (op) != V2DFmode);
4835
4836 tmp = CONST_VECTOR_ELT (op, elt);
4837 if (GET_MODE (op) == V4SFmode
4838 || GET_MODE (op) == V2SFmode)
4839 tmp = gen_lowpart (SImode, tmp);
4840 return INTVAL (tmp);
4841 }
4842
4843 /* Return true if OP can be synthesized with a particular vspltisb, vspltish
4844 or vspltisw instruction. OP is a CONST_VECTOR. Which instruction is used
4845 depends on STEP and COPIES, one of which will be 1. If COPIES > 1,
4846 all items are set to the same value and contain COPIES replicas of the
4847 vsplt's operand; if STEP > 1, one in STEP elements is set to the vsplt's
4848 operand and the others are set to the value of the operand's msb. */
4849
4850 static bool
4851 vspltis_constant (rtx op, unsigned step, unsigned copies)
4852 {
4853 enum machine_mode mode = GET_MODE (op);
4854 enum machine_mode inner = GET_MODE_INNER (mode);
4855
4856 unsigned i;
4857 unsigned nunits;
4858 unsigned bitsize;
4859 unsigned mask;
4860
4861 HOST_WIDE_INT val;
4862 HOST_WIDE_INT splat_val;
4863 HOST_WIDE_INT msb_val;
4864
4865 if (mode == V2DImode || mode == V2DFmode)
4866 return false;
4867
4868 nunits = GET_MODE_NUNITS (mode);
4869 bitsize = GET_MODE_BITSIZE (inner);
4870 mask = GET_MODE_MASK (inner);
4871
4872 val = const_vector_elt_as_int (op, nunits - 1);
4873 splat_val = val;
4874 msb_val = val > 0 ? 0 : -1;
4875
4876 /* Construct the value to be splatted, if possible. If not, return 0. */
4877 for (i = 2; i <= copies; i *= 2)
4878 {
4879 HOST_WIDE_INT small_val;
4880 bitsize /= 2;
4881 small_val = splat_val >> bitsize;
4882 mask >>= bitsize;
4883 if (splat_val != ((small_val << bitsize) | (small_val & mask)))
4884 return false;
4885 splat_val = small_val;
4886 }
4887
4888 /* Check if SPLAT_VAL can really be the operand of a vspltis[bhw]. */
4889 if (EASY_VECTOR_15 (splat_val))
4890 ;
4891
4892 /* Also check if we can splat, and then add the result to itself. Do so if
4893 the value is positive, of if the splat instruction is using OP's mode;
4894 for splat_val < 0, the splat and the add should use the same mode. */
4895 else if (EASY_VECTOR_15_ADD_SELF (splat_val)
4896 && (splat_val >= 0 || (step == 1 && copies == 1)))
4897 ;
4898
4899 /* Also check if are loading up the most significant bit which can be done by
4900 loading up -1 and shifting the value left by -1. */
4901 else if (EASY_VECTOR_MSB (splat_val, inner))
4902 ;
4903
4904 else
4905 return false;
4906
4907 /* Check if VAL is present in every STEP-th element, and the
4908 other elements are filled with its most significant bit. */
4909 for (i = 0; i < nunits - 1; ++i)
4910 {
4911 HOST_WIDE_INT desired_val;
4912 if (((i + 1) & (step - 1)) == 0)
4913 desired_val = val;
4914 else
4915 desired_val = msb_val;
4916
4917 if (desired_val != const_vector_elt_as_int (op, i))
4918 return false;
4919 }
4920
4921 return true;
4922 }
4923
4924
4925 /* Return true if OP is of the given MODE and can be synthesized
4926 with a vspltisb, vspltish or vspltisw. */
4927
4928 bool
4929 easy_altivec_constant (rtx op, enum machine_mode mode)
4930 {
4931 unsigned step, copies;
4932
4933 if (mode == VOIDmode)
4934 mode = GET_MODE (op);
4935 else if (mode != GET_MODE (op))
4936 return false;
4937
4938 /* V2DI/V2DF was added with VSX. Only allow 0 and all 1's as easy
4939 constants. */
4940 if (mode == V2DFmode)
4941 return zero_constant (op, mode);
4942
4943 if (mode == V2DImode)
4944 {
4945 /* In case the compiler is built 32-bit, CONST_DOUBLE constants are not
4946 easy. */
4947 if (GET_CODE (CONST_VECTOR_ELT (op, 0)) != CONST_INT
4948 || GET_CODE (CONST_VECTOR_ELT (op, 1)) != CONST_INT)
4949 return false;
4950
4951 if (zero_constant (op, mode))
4952 return true;
4953
4954 if (INTVAL (CONST_VECTOR_ELT (op, 0)) == -1
4955 && INTVAL (CONST_VECTOR_ELT (op, 1)) == -1)
4956 return true;
4957
4958 return false;
4959 }
4960
4961 /* Start with a vspltisw. */
4962 step = GET_MODE_NUNITS (mode) / 4;
4963 copies = 1;
4964
4965 if (vspltis_constant (op, step, copies))
4966 return true;
4967
4968 /* Then try with a vspltish. */
4969 if (step == 1)
4970 copies <<= 1;
4971 else
4972 step >>= 1;
4973
4974 if (vspltis_constant (op, step, copies))
4975 return true;
4976
4977 /* And finally a vspltisb. */
4978 if (step == 1)
4979 copies <<= 1;
4980 else
4981 step >>= 1;
4982
4983 if (vspltis_constant (op, step, copies))
4984 return true;
4985
4986 return false;
4987 }
4988
4989 /* Generate a VEC_DUPLICATE representing a vspltis[bhw] instruction whose
4990 result is OP. Abort if it is not possible. */
4991
4992 rtx
4993 gen_easy_altivec_constant (rtx op)
4994 {
4995 enum machine_mode mode = GET_MODE (op);
4996 int nunits = GET_MODE_NUNITS (mode);
4997 rtx last = CONST_VECTOR_ELT (op, nunits - 1);
4998 unsigned step = nunits / 4;
4999 unsigned copies = 1;
5000
5001 /* Start with a vspltisw. */
5002 if (vspltis_constant (op, step, copies))
5003 return gen_rtx_VEC_DUPLICATE (V4SImode, gen_lowpart (SImode, last));
5004
5005 /* Then try with a vspltish. */
5006 if (step == 1)
5007 copies <<= 1;
5008 else
5009 step >>= 1;
5010
5011 if (vspltis_constant (op, step, copies))
5012 return gen_rtx_VEC_DUPLICATE (V8HImode, gen_lowpart (HImode, last));
5013
5014 /* And finally a vspltisb. */
5015 if (step == 1)
5016 copies <<= 1;
5017 else
5018 step >>= 1;
5019
5020 if (vspltis_constant (op, step, copies))
5021 return gen_rtx_VEC_DUPLICATE (V16QImode, gen_lowpart (QImode, last));
5022
5023 gcc_unreachable ();
5024 }
5025
5026 const char *
5027 output_vec_const_move (rtx *operands)
5028 {
5029 int cst, cst2;
5030 enum machine_mode mode;
5031 rtx dest, vec;
5032
5033 dest = operands[0];
5034 vec = operands[1];
5035 mode = GET_MODE (dest);
5036
5037 if (TARGET_VSX)
5038 {
5039 if (zero_constant (vec, mode))
5040 return "xxlxor %x0,%x0,%x0";
5041
5042 if (mode == V2DImode
5043 && INTVAL (CONST_VECTOR_ELT (vec, 0)) == -1
5044 && INTVAL (CONST_VECTOR_ELT (vec, 1)) == -1)
5045 return "vspltisw %0,-1";
5046 }
5047
5048 if (TARGET_ALTIVEC)
5049 {
5050 rtx splat_vec;
5051 if (zero_constant (vec, mode))
5052 return "vxor %0,%0,%0";
5053
5054 splat_vec = gen_easy_altivec_constant (vec);
5055 gcc_assert (GET_CODE (splat_vec) == VEC_DUPLICATE);
5056 operands[1] = XEXP (splat_vec, 0);
5057 if (!EASY_VECTOR_15 (INTVAL (operands[1])))
5058 return "#";
5059
5060 switch (GET_MODE (splat_vec))
5061 {
5062 case V4SImode:
5063 return "vspltisw %0,%1";
5064
5065 case V8HImode:
5066 return "vspltish %0,%1";
5067
5068 case V16QImode:
5069 return "vspltisb %0,%1";
5070
5071 default:
5072 gcc_unreachable ();
5073 }
5074 }
5075
5076 gcc_assert (TARGET_SPE);
5077
5078 /* Vector constant 0 is handled as a splitter of V2SI, and in the
5079 pattern of V1DI, V4HI, and V2SF.
5080
5081 FIXME: We should probably return # and add post reload
5082 splitters for these, but this way is so easy ;-). */
5083 cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
5084 cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
5085 operands[1] = CONST_VECTOR_ELT (vec, 0);
5086 operands[2] = CONST_VECTOR_ELT (vec, 1);
5087 if (cst == cst2)
5088 return "li %0,%1\n\tevmergelo %0,%0,%0";
5089 else
5090 return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
5091 }
5092
5093 /* Initialize TARGET of vector PAIRED to VALS. */
5094
5095 void
5096 paired_expand_vector_init (rtx target, rtx vals)
5097 {
5098 enum machine_mode mode = GET_MODE (target);
5099 int n_elts = GET_MODE_NUNITS (mode);
5100 int n_var = 0;
5101 rtx x, new_rtx, tmp, constant_op, op1, op2;
5102 int i;
5103
5104 for (i = 0; i < n_elts; ++i)
5105 {
5106 x = XVECEXP (vals, 0, i);
5107 if (!CONSTANT_P (x))
5108 ++n_var;
5109 }
5110 if (n_var == 0)
5111 {
5112 /* Load from constant pool. */
5113 emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
5114 return;
5115 }
5116
5117 if (n_var == 2)
5118 {
5119 /* The vector is initialized only with non-constants. */
5120 new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, XVECEXP (vals, 0, 0),
5121 XVECEXP (vals, 0, 1));
5122
5123 emit_move_insn (target, new_rtx);
5124 return;
5125 }
5126
5127 /* One field is non-constant and the other one is a constant. Load the
5128 constant from the constant pool and use ps_merge instruction to
5129 construct the whole vector. */
5130 op1 = XVECEXP (vals, 0, 0);
5131 op2 = XVECEXP (vals, 0, 1);
5132
5133 constant_op = (CONSTANT_P (op1)) ? op1 : op2;
5134
5135 tmp = gen_reg_rtx (GET_MODE (constant_op));
5136 emit_move_insn (tmp, constant_op);
5137
5138 if (CONSTANT_P (op1))
5139 new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, tmp, op2);
5140 else
5141 new_rtx = gen_rtx_VEC_CONCAT (V2SFmode, op1, tmp);
5142
5143 emit_move_insn (target, new_rtx);
5144 }
5145
5146 void
5147 paired_expand_vector_move (rtx operands[])
5148 {
5149 rtx op0 = operands[0], op1 = operands[1];
5150
5151 emit_move_insn (op0, op1);
5152 }
5153
5154 /* Emit vector compare for code RCODE. DEST is destination, OP1 and
5155 OP2 are two VEC_COND_EXPR operands, CC_OP0 and CC_OP1 are the two
5156 operands for the relation operation COND. This is a recursive
5157 function. */
5158
5159 static void
5160 paired_emit_vector_compare (enum rtx_code rcode,
5161 rtx dest, rtx op0, rtx op1,
5162 rtx cc_op0, rtx cc_op1)
5163 {
5164 rtx tmp = gen_reg_rtx (V2SFmode);
5165 rtx tmp1, max, min;
5166
5167 gcc_assert (TARGET_PAIRED_FLOAT);
5168 gcc_assert (GET_MODE (op0) == GET_MODE (op1));
5169
5170 switch (rcode)
5171 {
5172 case LT:
5173 case LTU:
5174 paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
5175 return;
5176 case GE:
5177 case GEU:
5178 emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
5179 emit_insn (gen_selv2sf4 (dest, tmp, op0, op1, CONST0_RTX (SFmode)));
5180 return;
5181 case LE:
5182 case LEU:
5183 paired_emit_vector_compare (GE, dest, op0, op1, cc_op1, cc_op0);
5184 return;
5185 case GT:
5186 paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
5187 return;
5188 case EQ:
5189 tmp1 = gen_reg_rtx (V2SFmode);
5190 max = gen_reg_rtx (V2SFmode);
5191 min = gen_reg_rtx (V2SFmode);
5192 gen_reg_rtx (V2SFmode);
5193
5194 emit_insn (gen_subv2sf3 (tmp, cc_op0, cc_op1));
5195 emit_insn (gen_selv2sf4
5196 (max, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
5197 emit_insn (gen_subv2sf3 (tmp, cc_op1, cc_op0));
5198 emit_insn (gen_selv2sf4
5199 (min, tmp, cc_op0, cc_op1, CONST0_RTX (SFmode)));
5200 emit_insn (gen_subv2sf3 (tmp1, min, max));
5201 emit_insn (gen_selv2sf4 (dest, tmp1, op0, op1, CONST0_RTX (SFmode)));
5202 return;
5203 case NE:
5204 paired_emit_vector_compare (EQ, dest, op1, op0, cc_op0, cc_op1);
5205 return;
5206 case UNLE:
5207 paired_emit_vector_compare (LE, dest, op1, op0, cc_op0, cc_op1);
5208 return;
5209 case UNLT:
5210 paired_emit_vector_compare (LT, dest, op1, op0, cc_op0, cc_op1);
5211 return;
5212 case UNGE:
5213 paired_emit_vector_compare (GE, dest, op1, op0, cc_op0, cc_op1);
5214 return;
5215 case UNGT:
5216 paired_emit_vector_compare (GT, dest, op1, op0, cc_op0, cc_op1);
5217 return;
5218 default:
5219 gcc_unreachable ();
5220 }
5221
5222 return;
5223 }
5224
5225 /* Emit vector conditional expression.
5226 DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
5227 CC_OP0 and CC_OP1 are the two operands for the relation operation COND. */
5228
5229 int
5230 paired_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
5231 rtx cond, rtx cc_op0, rtx cc_op1)
5232 {
5233 enum rtx_code rcode = GET_CODE (cond);
5234
5235 if (!TARGET_PAIRED_FLOAT)
5236 return 0;
5237
5238 paired_emit_vector_compare (rcode, dest, op1, op2, cc_op0, cc_op1);
5239
5240 return 1;
5241 }
5242
5243 /* Initialize vector TARGET to VALS. */
5244
5245 void
5246 rs6000_expand_vector_init (rtx target, rtx vals)
5247 {
5248 enum machine_mode mode = GET_MODE (target);
5249 enum machine_mode inner_mode = GET_MODE_INNER (mode);
5250 int n_elts = GET_MODE_NUNITS (mode);
5251 int n_var = 0, one_var = -1;
5252 bool all_same = true, all_const_zero = true;
5253 rtx x, mem;
5254 int i;
5255
5256 for (i = 0; i < n_elts; ++i)
5257 {
5258 x = XVECEXP (vals, 0, i);
5259 if (!CONSTANT_P (x))
5260 ++n_var, one_var = i;
5261 else if (x != CONST0_RTX (inner_mode))
5262 all_const_zero = false;
5263
5264 if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
5265 all_same = false;
5266 }
5267
5268 if (n_var == 0)
5269 {
5270 rtx const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0));
5271 bool int_vector_p = (GET_MODE_CLASS (mode) == MODE_VECTOR_INT);
5272 if ((int_vector_p || TARGET_VSX) && all_const_zero)
5273 {
5274 /* Zero register. */
5275 emit_insn (gen_rtx_SET (VOIDmode, target,
5276 gen_rtx_XOR (mode, target, target)));
5277 return;
5278 }
5279 else if (int_vector_p && easy_vector_constant (const_vec, mode))
5280 {
5281 /* Splat immediate. */
5282 emit_insn (gen_rtx_SET (VOIDmode, target, const_vec));
5283 return;
5284 }
5285 else
5286 {
5287 /* Load from constant pool. */
5288 emit_move_insn (target, const_vec);
5289 return;
5290 }
5291 }
5292
5293 /* Double word values on VSX can use xxpermdi or lxvdsx. */
5294 if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
5295 {
5296 if (all_same)
5297 {
5298 rtx element = XVECEXP (vals, 0, 0);
5299 if (mode == V2DFmode)
5300 emit_insn (gen_vsx_splat_v2df (target, element));
5301 else
5302 emit_insn (gen_vsx_splat_v2di (target, element));
5303 }
5304 else
5305 {
5306 if (mode == V2DFmode)
5307 {
5308 rtx op0 = copy_to_mode_reg (DFmode, XVECEXP (vals, 0, 0));
5309 rtx op1 = copy_to_mode_reg (DFmode, XVECEXP (vals, 0, 1));
5310 emit_insn (gen_vsx_concat_v2df (target, op0, op1));
5311 }
5312 else
5313 {
5314 rtx op0 = copy_to_mode_reg (DImode, XVECEXP (vals, 0, 0));
5315 rtx op1 = copy_to_mode_reg (DImode, XVECEXP (vals, 0, 1));
5316 emit_insn (gen_vsx_concat_v2di (target, op0, op1));
5317 }
5318 }
5319 return;
5320 }
5321
5322 /* With single precision floating point on VSX, know that internally single
5323 precision is actually represented as a double, and either make 2 V2DF
5324 vectors, and convert these vectors to single precision, or do one
5325 conversion, and splat the result to the other elements. */
5326 if (mode == V4SFmode && VECTOR_MEM_VSX_P (mode))
5327 {
5328 if (all_same)
5329 {
5330 rtx freg = gen_reg_rtx (V4SFmode);
5331 rtx sreg = copy_to_reg (XVECEXP (vals, 0, 0));
5332
5333 emit_insn (gen_vsx_xscvdpsp_scalar (freg, sreg));
5334 emit_insn (gen_vsx_xxspltw_v4sf (target, freg, const0_rtx));
5335 }
5336 else
5337 {
5338 rtx dbl_even = gen_reg_rtx (V2DFmode);
5339 rtx dbl_odd = gen_reg_rtx (V2DFmode);
5340 rtx flt_even = gen_reg_rtx (V4SFmode);
5341 rtx flt_odd = gen_reg_rtx (V4SFmode);
5342
5343 emit_insn (gen_vsx_concat_v2sf (dbl_even,
5344 copy_to_reg (XVECEXP (vals, 0, 0)),
5345 copy_to_reg (XVECEXP (vals, 0, 1))));
5346 emit_insn (gen_vsx_concat_v2sf (dbl_odd,
5347 copy_to_reg (XVECEXP (vals, 0, 2)),
5348 copy_to_reg (XVECEXP (vals, 0, 3))));
5349 emit_insn (gen_vsx_xvcvdpsp (flt_even, dbl_even));
5350 emit_insn (gen_vsx_xvcvdpsp (flt_odd, dbl_odd));
5351 emit_insn (gen_vec_extract_evenv4sf (target, flt_even, flt_odd));
5352 }
5353 return;
5354 }
5355
5356 /* Store value to stack temp. Load vector element. Splat. However, splat
5357 of 64-bit items is not supported on Altivec. */
5358 if (all_same && GET_MODE_SIZE (mode) <= 4)
5359 {
5360 mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
5361 emit_move_insn (adjust_address_nv (mem, inner_mode, 0),
5362 XVECEXP (vals, 0, 0));
5363 x = gen_rtx_UNSPEC (VOIDmode,
5364 gen_rtvec (1, const0_rtx), UNSPEC_LVE);
5365 emit_insn (gen_rtx_PARALLEL (VOIDmode,
5366 gen_rtvec (2,
5367 gen_rtx_SET (VOIDmode,
5368 target, mem),
5369 x)));
5370 x = gen_rtx_VEC_SELECT (inner_mode, target,
5371 gen_rtx_PARALLEL (VOIDmode,
5372 gen_rtvec (1, const0_rtx)));
5373 emit_insn (gen_rtx_SET (VOIDmode, target,
5374 gen_rtx_VEC_DUPLICATE (mode, x)));
5375 return;
5376 }
5377
5378 /* One field is non-constant. Load constant then overwrite
5379 varying field. */
5380 if (n_var == 1)
5381 {
5382 rtx copy = copy_rtx (vals);
5383
5384 /* Load constant part of vector, substitute neighboring value for
5385 varying element. */
5386 XVECEXP (copy, 0, one_var) = XVECEXP (vals, 0, (one_var + 1) % n_elts);
5387 rs6000_expand_vector_init (target, copy);
5388
5389 /* Insert variable. */
5390 rs6000_expand_vector_set (target, XVECEXP (vals, 0, one_var), one_var);
5391 return;
5392 }
5393
5394 /* Construct the vector in memory one field at a time
5395 and load the whole vector. */
5396 mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
5397 for (i = 0; i < n_elts; i++)
5398 emit_move_insn (adjust_address_nv (mem, inner_mode,
5399 i * GET_MODE_SIZE (inner_mode)),
5400 XVECEXP (vals, 0, i));
5401 emit_move_insn (target, mem);
5402 }
5403
5404 /* Set field ELT of TARGET to VAL. */
5405
5406 void
5407 rs6000_expand_vector_set (rtx target, rtx val, int elt)
5408 {
5409 enum machine_mode mode = GET_MODE (target);
5410 enum machine_mode inner_mode = GET_MODE_INNER (mode);
5411 rtx reg = gen_reg_rtx (mode);
5412 rtx mask, mem, x;
5413 int width = GET_MODE_SIZE (inner_mode);
5414 int i;
5415
5416 if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
5417 {
5418 rtx (*set_func) (rtx, rtx, rtx, rtx)
5419 = ((mode == V2DFmode) ? gen_vsx_set_v2df : gen_vsx_set_v2di);
5420 emit_insn (set_func (target, target, val, GEN_INT (elt)));
5421 return;
5422 }
5423
5424 /* Load single variable value. */
5425 mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode), 0);
5426 emit_move_insn (adjust_address_nv (mem, inner_mode, 0), val);
5427 x = gen_rtx_UNSPEC (VOIDmode,
5428 gen_rtvec (1, const0_rtx), UNSPEC_LVE);
5429 emit_insn (gen_rtx_PARALLEL (VOIDmode,
5430 gen_rtvec (2,
5431 gen_rtx_SET (VOIDmode,
5432 reg, mem),
5433 x)));
5434
5435 /* Linear sequence. */
5436 mask = gen_rtx_PARALLEL (V16QImode, rtvec_alloc (16));
5437 for (i = 0; i < 16; ++i)
5438 XVECEXP (mask, 0, i) = GEN_INT (i);
5439
5440 /* Set permute mask to insert element into target. */
5441 for (i = 0; i < width; ++i)
5442 XVECEXP (mask, 0, elt*width + i)
5443 = GEN_INT (i + 0x10);
5444 x = gen_rtx_CONST_VECTOR (V16QImode, XVEC (mask, 0));
5445 x = gen_rtx_UNSPEC (mode,
5446 gen_rtvec (3, target, reg,
5447 force_reg (V16QImode, x)),
5448 UNSPEC_VPERM);
5449 emit_insn (gen_rtx_SET (VOIDmode, target, x));
5450 }
5451
5452 /* Extract field ELT from VEC into TARGET. */
5453
5454 void
5455 rs6000_expand_vector_extract (rtx target, rtx vec, int elt)
5456 {
5457 enum machine_mode mode = GET_MODE (vec);
5458 enum machine_mode inner_mode = GET_MODE_INNER (mode);
5459 rtx mem;
5460
5461 if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
5462 {
5463 rtx (*extract_func) (rtx, rtx, rtx)
5464 = ((mode == V2DFmode) ? gen_vsx_extract_v2df : gen_vsx_extract_v2di);
5465 emit_insn (extract_func (target, vec, GEN_INT (elt)));
5466 return;
5467 }
5468
5469 /* Allocate mode-sized buffer. */
5470 mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
5471
5472 emit_move_insn (mem, vec);
5473
5474 /* Add offset to field within buffer matching vector element. */
5475 mem = adjust_address_nv (mem, inner_mode, elt * GET_MODE_SIZE (inner_mode));
5476
5477 emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0));
5478 }
5479
5480 /* Generates shifts and masks for a pair of rldicl or rldicr insns to
5481 implement ANDing by the mask IN. */
5482 void
5483 build_mask64_2_operands (rtx in, rtx *out)
5484 {
5485 #if HOST_BITS_PER_WIDE_INT >= 64
5486 unsigned HOST_WIDE_INT c, lsb, m1, m2;
5487 int shift;
5488
5489 gcc_assert (GET_CODE (in) == CONST_INT);
5490
5491 c = INTVAL (in);
5492 if (c & 1)
5493 {
5494 /* Assume c initially something like 0x00fff000000fffff. The idea
5495 is to rotate the word so that the middle ^^^^^^ group of zeros
5496 is at the MS end and can be cleared with an rldicl mask. We then
5497 rotate back and clear off the MS ^^ group of zeros with a
5498 second rldicl. */
5499 c = ~c; /* c == 0xff000ffffff00000 */
5500 lsb = c & -c; /* lsb == 0x0000000000100000 */
5501 m1 = -lsb; /* m1 == 0xfffffffffff00000 */
5502 c = ~c; /* c == 0x00fff000000fffff */
5503 c &= -lsb; /* c == 0x00fff00000000000 */
5504 lsb = c & -c; /* lsb == 0x0000100000000000 */
5505 c = ~c; /* c == 0xff000fffffffffff */
5506 c &= -lsb; /* c == 0xff00000000000000 */
5507 shift = 0;
5508 while ((lsb >>= 1) != 0)
5509 shift++; /* shift == 44 on exit from loop */
5510 m1 <<= 64 - shift; /* m1 == 0xffffff0000000000 */
5511 m1 = ~m1; /* m1 == 0x000000ffffffffff */
5512 m2 = ~c; /* m2 == 0x00ffffffffffffff */
5513 }
5514 else
5515 {
5516 /* Assume c initially something like 0xff000f0000000000. The idea
5517 is to rotate the word so that the ^^^ middle group of zeros
5518 is at the LS end and can be cleared with an rldicr mask. We then
5519 rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
5520 a second rldicr. */
5521 lsb = c & -c; /* lsb == 0x0000010000000000 */
5522 m2 = -lsb; /* m2 == 0xffffff0000000000 */
5523 c = ~c; /* c == 0x00fff0ffffffffff */
5524 c &= -lsb; /* c == 0x00fff00000000000 */
5525 lsb = c & -c; /* lsb == 0x0000100000000000 */
5526 c = ~c; /* c == 0xff000fffffffffff */
5527 c &= -lsb; /* c == 0xff00000000000000 */
5528 shift = 0;
5529 while ((lsb >>= 1) != 0)
5530 shift++; /* shift == 44 on exit from loop */
5531 m1 = ~c; /* m1 == 0x00ffffffffffffff */
5532 m1 >>= shift; /* m1 == 0x0000000000000fff */
5533 m1 = ~m1; /* m1 == 0xfffffffffffff000 */
5534 }
5535
5536 /* Note that when we only have two 0->1 and 1->0 transitions, one of the
5537 masks will be all 1's. We are guaranteed more than one transition. */
5538 out[0] = GEN_INT (64 - shift);
5539 out[1] = GEN_INT (m1);
5540 out[2] = GEN_INT (shift);
5541 out[3] = GEN_INT (m2);
5542 #else
5543 (void)in;
5544 (void)out;
5545 gcc_unreachable ();
5546 #endif
5547 }
5548
5549 /* Return TRUE if OP is an invalid SUBREG operation on the e500. */
5550
5551 bool
5552 invalid_e500_subreg (rtx op, enum machine_mode mode)
5553 {
5554 if (TARGET_E500_DOUBLE)
5555 {
5556 /* Reject (subreg:SI (reg:DF)); likewise with subreg:DI or
5557 subreg:TI and reg:TF. Decimal float modes are like integer
5558 modes (only low part of each register used) for this
5559 purpose. */
5560 if (GET_CODE (op) == SUBREG
5561 && (mode == SImode || mode == DImode || mode == TImode
5562 || mode == DDmode || mode == TDmode)
5563 && REG_P (SUBREG_REG (op))
5564 && (GET_MODE (SUBREG_REG (op)) == DFmode
5565 || GET_MODE (SUBREG_REG (op)) == TFmode))
5566 return true;
5567
5568 /* Reject (subreg:DF (reg:DI)); likewise with subreg:TF and
5569 reg:TI. */
5570 if (GET_CODE (op) == SUBREG
5571 && (mode == DFmode || mode == TFmode)
5572 && REG_P (SUBREG_REG (op))
5573 && (GET_MODE (SUBREG_REG (op)) == DImode
5574 || GET_MODE (SUBREG_REG (op)) == TImode
5575 || GET_MODE (SUBREG_REG (op)) == DDmode
5576 || GET_MODE (SUBREG_REG (op)) == TDmode))
5577 return true;
5578 }
5579
5580 if (TARGET_SPE
5581 && GET_CODE (op) == SUBREG
5582 && mode == SImode
5583 && REG_P (SUBREG_REG (op))
5584 && SPE_VECTOR_MODE (GET_MODE (SUBREG_REG (op))))
5585 return true;
5586
5587 return false;
5588 }
5589
5590 /* AIX increases natural record alignment to doubleword if the first
5591 field is an FP double while the FP fields remain word aligned. */
5592
5593 unsigned int
5594 rs6000_special_round_type_align (tree type, unsigned int computed,
5595 unsigned int specified)
5596 {
5597 unsigned int align = MAX (computed, specified);
5598 tree field = TYPE_FIELDS (type);
5599
5600 /* Skip all non field decls */
5601 while (field != NULL && TREE_CODE (field) != FIELD_DECL)
5602 field = DECL_CHAIN (field);
5603
5604 if (field != NULL && field != type)
5605 {
5606 type = TREE_TYPE (field);
5607 while (TREE_CODE (type) == ARRAY_TYPE)
5608 type = TREE_TYPE (type);
5609
5610 if (type != error_mark_node && TYPE_MODE (type) == DFmode)
5611 align = MAX (align, 64);
5612 }
5613
5614 return align;
5615 }
5616
5617 /* Darwin increases record alignment to the natural alignment of
5618 the first field. */
5619
5620 unsigned int
5621 darwin_rs6000_special_round_type_align (tree type, unsigned int computed,
5622 unsigned int specified)
5623 {
5624 unsigned int align = MAX (computed, specified);
5625
5626 if (TYPE_PACKED (type))
5627 return align;
5628
5629 /* Find the first field, looking down into aggregates. */
5630 do {
5631 tree field = TYPE_FIELDS (type);
5632 /* Skip all non field decls */
5633 while (field != NULL && TREE_CODE (field) != FIELD_DECL)
5634 field = DECL_CHAIN (field);
5635 if (! field)
5636 break;
5637 /* A packed field does not contribute any extra alignment. */
5638 if (DECL_PACKED (field))
5639 return align;
5640 type = TREE_TYPE (field);
5641 while (TREE_CODE (type) == ARRAY_TYPE)
5642 type = TREE_TYPE (type);
5643 } while (AGGREGATE_TYPE_P (type));
5644
5645 if (! AGGREGATE_TYPE_P (type) && type != error_mark_node)
5646 align = MAX (align, TYPE_ALIGN (type));
5647
5648 return align;
5649 }
5650
5651 /* Return 1 for an operand in small memory on V.4/eabi. */
5652
5653 int
5654 small_data_operand (rtx op ATTRIBUTE_UNUSED,
5655 enum machine_mode mode ATTRIBUTE_UNUSED)
5656 {
5657 #if TARGET_ELF
5658 rtx sym_ref;
5659
5660 if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
5661 return 0;
5662
5663 if (DEFAULT_ABI != ABI_V4)
5664 return 0;
5665
5666 /* Vector and float memory instructions have a limited offset on the
5667 SPE, so using a vector or float variable directly as an operand is
5668 not useful. */
5669 if (TARGET_SPE
5670 && (SPE_VECTOR_MODE (mode) || FLOAT_MODE_P (mode)))
5671 return 0;
5672
5673 if (GET_CODE (op) == SYMBOL_REF)
5674 sym_ref = op;
5675
5676 else if (GET_CODE (op) != CONST
5677 || GET_CODE (XEXP (op, 0)) != PLUS
5678 || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
5679 || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
5680 return 0;
5681
5682 else
5683 {
5684 rtx sum = XEXP (op, 0);
5685 HOST_WIDE_INT summand;
5686
5687 /* We have to be careful here, because it is the referenced address
5688 that must be 32k from _SDA_BASE_, not just the symbol. */
5689 summand = INTVAL (XEXP (sum, 1));
5690 if (summand < 0 || summand > g_switch_value)
5691 return 0;
5692
5693 sym_ref = XEXP (sum, 0);
5694 }
5695
5696 return SYMBOL_REF_SMALL_P (sym_ref);
5697 #else
5698 return 0;
5699 #endif
5700 }
5701
5702 /* Return true if either operand is a general purpose register. */
5703
5704 bool
5705 gpr_or_gpr_p (rtx op0, rtx op1)
5706 {
5707 return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
5708 || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
5709 }
5710
5711 \f
5712 /* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address_p. */
5713
5714 static bool
5715 reg_offset_addressing_ok_p (enum machine_mode mode)
5716 {
5717 switch (mode)
5718 {
5719 case V16QImode:
5720 case V8HImode:
5721 case V4SFmode:
5722 case V4SImode:
5723 case V2DFmode:
5724 case V2DImode:
5725 /* AltiVec/VSX vector modes. Only reg+reg addressing is valid. */
5726 if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
5727 return false;
5728 break;
5729
5730 case V4HImode:
5731 case V2SImode:
5732 case V1DImode:
5733 case V2SFmode:
5734 /* Paired vector modes. Only reg+reg addressing is valid. */
5735 if (TARGET_PAIRED_FLOAT)
5736 return false;
5737 break;
5738
5739 default:
5740 break;
5741 }
5742
5743 return true;
5744 }
5745
5746 static bool
5747 virtual_stack_registers_memory_p (rtx op)
5748 {
5749 int regnum;
5750
5751 if (GET_CODE (op) == REG)
5752 regnum = REGNO (op);
5753
5754 else if (GET_CODE (op) == PLUS
5755 && GET_CODE (XEXP (op, 0)) == REG
5756 && GET_CODE (XEXP (op, 1)) == CONST_INT)
5757 regnum = REGNO (XEXP (op, 0));
5758
5759 else
5760 return false;
5761
5762 return (regnum >= FIRST_VIRTUAL_REGISTER
5763 && regnum <= LAST_VIRTUAL_POINTER_REGISTER);
5764 }
5765
5766 /* Return true if memory accesses to OP are known to never straddle
5767 a 32k boundary. */
5768
5769 static bool
5770 offsettable_ok_by_alignment (rtx op, HOST_WIDE_INT offset,
5771 enum machine_mode mode)
5772 {
5773 tree decl, type;
5774 unsigned HOST_WIDE_INT dsize, dalign;
5775
5776 if (GET_CODE (op) != SYMBOL_REF)
5777 return false;
5778
5779 decl = SYMBOL_REF_DECL (op);
5780 if (!decl)
5781 {
5782 if (GET_MODE_SIZE (mode) == 0)
5783 return false;
5784
5785 /* -fsection-anchors loses the original SYMBOL_REF_DECL when
5786 replacing memory addresses with an anchor plus offset. We
5787 could find the decl by rummaging around in the block->objects
5788 VEC for the given offset but that seems like too much work. */
5789 dalign = 1;
5790 if (SYMBOL_REF_HAS_BLOCK_INFO_P (op)
5791 && SYMBOL_REF_ANCHOR_P (op)
5792 && SYMBOL_REF_BLOCK (op) != NULL)
5793 {
5794 struct object_block *block = SYMBOL_REF_BLOCK (op);
5795 HOST_WIDE_INT lsb, mask;
5796
5797 /* Given the alignment of the block.. */
5798 dalign = block->alignment;
5799 mask = dalign / BITS_PER_UNIT - 1;
5800
5801 /* ..and the combined offset of the anchor and any offset
5802 to this block object.. */
5803 offset += SYMBOL_REF_BLOCK_OFFSET (op);
5804 lsb = offset & -offset;
5805
5806 /* ..find how many bits of the alignment we know for the
5807 object. */
5808 mask &= lsb - 1;
5809 dalign = mask + 1;
5810 }
5811 return dalign >= GET_MODE_SIZE (mode);
5812 }
5813
5814 if (DECL_P (decl))
5815 {
5816 if (TREE_CODE (decl) == FUNCTION_DECL)
5817 return true;
5818
5819 if (!DECL_SIZE_UNIT (decl))
5820 return false;
5821
5822 if (!host_integerp (DECL_SIZE_UNIT (decl), 1))
5823 return false;
5824
5825 dsize = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
5826 if (dsize > 32768)
5827 return false;
5828
5829 dalign = DECL_ALIGN_UNIT (decl);
5830 return dalign >= dsize;
5831 }
5832
5833 type = TREE_TYPE (decl);
5834
5835 if (TREE_CODE (decl) == STRING_CST)
5836 dsize = TREE_STRING_LENGTH (decl);
5837 else if (TYPE_SIZE_UNIT (type)
5838 && host_integerp (TYPE_SIZE_UNIT (type), 1))
5839 dsize = tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5840 else
5841 return false;
5842 if (dsize > 32768)
5843 return false;
5844
5845 dalign = TYPE_ALIGN (type);
5846 if (CONSTANT_CLASS_P (decl))
5847 dalign = CONSTANT_ALIGNMENT (decl, dalign);
5848 else
5849 dalign = DATA_ALIGNMENT (decl, dalign);
5850 dalign /= BITS_PER_UNIT;
5851 return dalign >= dsize;
5852 }
5853
5854 static bool
5855 constant_pool_expr_p (rtx op)
5856 {
5857 rtx base, offset;
5858
5859 split_const (op, &base, &offset);
5860 return (GET_CODE (base) == SYMBOL_REF
5861 && CONSTANT_POOL_ADDRESS_P (base)
5862 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (base), Pmode));
5863 }
5864
5865 static rtx tocrel_base, tocrel_offset;
5866
5867 bool
5868 toc_relative_expr_p (rtx op)
5869 {
5870 if (GET_CODE (op) != CONST)
5871 return false;
5872
5873 split_const (op, &tocrel_base, &tocrel_offset);
5874 return (GET_CODE (tocrel_base) == UNSPEC
5875 && XINT (tocrel_base, 1) == UNSPEC_TOCREL);
5876 }
5877
5878 /* Return true if X is a constant pool address, and also for cmodel=medium
5879 if X is a toc-relative address known to be offsettable within MODE. */
5880
5881 bool
5882 legitimate_constant_pool_address_p (const_rtx x, enum machine_mode mode,
5883 bool strict)
5884 {
5885 return (TARGET_TOC
5886 && (GET_CODE (x) == PLUS || GET_CODE (x) == LO_SUM)
5887 && GET_CODE (XEXP (x, 0)) == REG
5888 && (REGNO (XEXP (x, 0)) == TOC_REGISTER
5889 || ((TARGET_MINIMAL_TOC
5890 || TARGET_CMODEL != CMODEL_SMALL)
5891 && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict)))
5892 && toc_relative_expr_p (XEXP (x, 1))
5893 && (TARGET_CMODEL != CMODEL_MEDIUM
5894 || constant_pool_expr_p (XVECEXP (tocrel_base, 0, 0))
5895 || mode == QImode
5896 || offsettable_ok_by_alignment (XVECEXP (tocrel_base, 0, 0),
5897 INTVAL (tocrel_offset), mode)));
5898 }
5899
5900 static bool
5901 legitimate_small_data_p (enum machine_mode mode, rtx x)
5902 {
5903 return (DEFAULT_ABI == ABI_V4
5904 && !flag_pic && !TARGET_TOC
5905 && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
5906 && small_data_operand (x, mode));
5907 }
5908
5909 /* SPE offset addressing is limited to 5-bits worth of double words. */
5910 #define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
5911
5912 bool
5913 rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
5914 {
5915 unsigned HOST_WIDE_INT offset, extra;
5916
5917 if (GET_CODE (x) != PLUS)
5918 return false;
5919 if (GET_CODE (XEXP (x, 0)) != REG)
5920 return false;
5921 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
5922 return false;
5923 if (!reg_offset_addressing_ok_p (mode))
5924 return virtual_stack_registers_memory_p (x);
5925 if (legitimate_constant_pool_address_p (x, mode, strict))
5926 return true;
5927 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
5928 return false;
5929
5930 offset = INTVAL (XEXP (x, 1));
5931 extra = 0;
5932 switch (mode)
5933 {
5934 case V4HImode:
5935 case V2SImode:
5936 case V1DImode:
5937 case V2SFmode:
5938 /* SPE vector modes. */
5939 return SPE_CONST_OFFSET_OK (offset);
5940
5941 case DFmode:
5942 if (TARGET_E500_DOUBLE)
5943 return SPE_CONST_OFFSET_OK (offset);
5944
5945 /* If we are using VSX scalar loads, restrict ourselves to reg+reg
5946 addressing. */
5947 if (VECTOR_MEM_VSX_P (DFmode))
5948 return false;
5949
5950 case DDmode:
5951 case DImode:
5952 /* On e500v2, we may have:
5953
5954 (subreg:DF (mem:DI (plus (reg) (const_int))) 0).
5955
5956 Which gets addressed with evldd instructions. */
5957 if (TARGET_E500_DOUBLE)
5958 return SPE_CONST_OFFSET_OK (offset);
5959
5960 if (mode == DFmode || mode == DDmode || !TARGET_POWERPC64)
5961 extra = 4;
5962 else if (offset & 3)
5963 return false;
5964 break;
5965
5966 case TFmode:
5967 if (TARGET_E500_DOUBLE)
5968 return (SPE_CONST_OFFSET_OK (offset)
5969 && SPE_CONST_OFFSET_OK (offset + 8));
5970
5971 case TDmode:
5972 case TImode:
5973 if (mode == TFmode || mode == TDmode || !TARGET_POWERPC64)
5974 extra = 12;
5975 else if (offset & 3)
5976 return false;
5977 else
5978 extra = 8;
5979 break;
5980
5981 default:
5982 break;
5983 }
5984
5985 offset += 0x8000;
5986 return (offset < 0x10000) && (offset + extra < 0x10000);
5987 }
5988
5989 bool
5990 legitimate_indexed_address_p (rtx x, int strict)
5991 {
5992 rtx op0, op1;
5993
5994 if (GET_CODE (x) != PLUS)
5995 return false;
5996
5997 op0 = XEXP (x, 0);
5998 op1 = XEXP (x, 1);
5999
6000 /* Recognize the rtl generated by reload which we know will later be
6001 replaced with proper base and index regs. */
6002 if (!strict
6003 && reload_in_progress
6004 && (REG_P (op0) || GET_CODE (op0) == PLUS)
6005 && REG_P (op1))
6006 return true;
6007
6008 return (REG_P (op0) && REG_P (op1)
6009 && ((INT_REG_OK_FOR_BASE_P (op0, strict)
6010 && INT_REG_OK_FOR_INDEX_P (op1, strict))
6011 || (INT_REG_OK_FOR_BASE_P (op1, strict)
6012 && INT_REG_OK_FOR_INDEX_P (op0, strict))));
6013 }
6014
6015 bool
6016 avoiding_indexed_address_p (enum machine_mode mode)
6017 {
6018 /* Avoid indexed addressing for modes that have non-indexed
6019 load/store instruction forms. */
6020 return (TARGET_AVOID_XFORM && VECTOR_MEM_NONE_P (mode));
6021 }
6022
6023 inline bool
6024 legitimate_indirect_address_p (rtx x, int strict)
6025 {
6026 return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
6027 }
6028
6029 bool
6030 macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
6031 {
6032 if (!TARGET_MACHO || !flag_pic
6033 || mode != SImode || GET_CODE (x) != MEM)
6034 return false;
6035 x = XEXP (x, 0);
6036
6037 if (GET_CODE (x) != LO_SUM)
6038 return false;
6039 if (GET_CODE (XEXP (x, 0)) != REG)
6040 return false;
6041 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
6042 return false;
6043 x = XEXP (x, 1);
6044
6045 return CONSTANT_P (x);
6046 }
6047
6048 static bool
6049 legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
6050 {
6051 if (GET_CODE (x) != LO_SUM)
6052 return false;
6053 if (GET_CODE (XEXP (x, 0)) != REG)
6054 return false;
6055 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
6056 return false;
6057 /* Restrict addressing for DI because of our SUBREG hackery. */
6058 if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
6059 || mode == DDmode || mode == TDmode
6060 || mode == DImode))
6061 return false;
6062 x = XEXP (x, 1);
6063
6064 if (TARGET_ELF || TARGET_MACHO)
6065 {
6066 if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
6067 return false;
6068 if (TARGET_TOC)
6069 return false;
6070 if (GET_MODE_NUNITS (mode) != 1)
6071 return false;
6072 if (GET_MODE_BITSIZE (mode) > 64
6073 || (GET_MODE_BITSIZE (mode) > 32 && !TARGET_POWERPC64
6074 && !(TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
6075 && (mode == DFmode || mode == DDmode))))
6076 return false;
6077
6078 return CONSTANT_P (x);
6079 }
6080
6081 return false;
6082 }
6083
6084
6085 /* Try machine-dependent ways of modifying an illegitimate address
6086 to be legitimate. If we find one, return the new, valid address.
6087 This is used from only one place: `memory_address' in explow.c.
6088
6089 OLDX is the address as it was before break_out_memory_refs was
6090 called. In some cases it is useful to look at this to decide what
6091 needs to be done.
6092
6093 It is always safe for this function to do nothing. It exists to
6094 recognize opportunities to optimize the output.
6095
6096 On RS/6000, first check for the sum of a register with a constant
6097 integer that is out of range. If so, generate code to add the
6098 constant with the low-order 16 bits masked to the register and force
6099 this result into another register (this can be done with `cau').
6100 Then generate an address of REG+(CONST&0xffff), allowing for the
6101 possibility of bit 16 being a one.
6102
6103 Then check for the sum of a register and something not constant, try to
6104 load the other things into a register and return the sum. */
6105
6106 static rtx
6107 rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
6108 enum machine_mode mode)
6109 {
6110 unsigned int extra = 0;
6111
6112 if (!reg_offset_addressing_ok_p (mode))
6113 {
6114 if (virtual_stack_registers_memory_p (x))
6115 return x;
6116
6117 /* In theory we should not be seeing addresses of the form reg+0,
6118 but just in case it is generated, optimize it away. */
6119 if (GET_CODE (x) == PLUS && XEXP (x, 1) == const0_rtx)
6120 return force_reg (Pmode, XEXP (x, 0));
6121
6122 /* Make sure both operands are registers. */
6123 else if (GET_CODE (x) == PLUS)
6124 return gen_rtx_PLUS (Pmode,
6125 force_reg (Pmode, XEXP (x, 0)),
6126 force_reg (Pmode, XEXP (x, 1)));
6127 else
6128 return force_reg (Pmode, x);
6129 }
6130 if (GET_CODE (x) == SYMBOL_REF)
6131 {
6132 enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
6133 if (model != 0)
6134 return rs6000_legitimize_tls_address (x, model);
6135 }
6136
6137 switch (mode)
6138 {
6139 case DFmode:
6140 case DDmode:
6141 extra = 4;
6142 break;
6143 case DImode:
6144 if (!TARGET_POWERPC64)
6145 extra = 4;
6146 break;
6147 case TFmode:
6148 case TDmode:
6149 extra = 12;
6150 break;
6151 case TImode:
6152 extra = TARGET_POWERPC64 ? 8 : 12;
6153 break;
6154 default:
6155 break;
6156 }
6157
6158 if (GET_CODE (x) == PLUS
6159 && GET_CODE (XEXP (x, 0)) == REG
6160 && GET_CODE (XEXP (x, 1)) == CONST_INT
6161 && ((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000)
6162 >= 0x10000 - extra)
6163 && !((TARGET_POWERPC64
6164 && (mode == DImode || mode == TImode)
6165 && (INTVAL (XEXP (x, 1)) & 3) != 0)
6166 || SPE_VECTOR_MODE (mode)
6167 || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
6168 || mode == DImode || mode == DDmode
6169 || mode == TDmode))))
6170 {
6171 HOST_WIDE_INT high_int, low_int;
6172 rtx sum;
6173 low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
6174 if (low_int >= 0x8000 - extra)
6175 low_int = 0;
6176 high_int = INTVAL (XEXP (x, 1)) - low_int;
6177 sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
6178 GEN_INT (high_int)), 0);
6179 return plus_constant (sum, low_int);
6180 }
6181 else if (GET_CODE (x) == PLUS
6182 && GET_CODE (XEXP (x, 0)) == REG
6183 && GET_CODE (XEXP (x, 1)) != CONST_INT
6184 && GET_MODE_NUNITS (mode) == 1
6185 && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6186 || TARGET_POWERPC64
6187 || ((mode != DImode && mode != DFmode && mode != DDmode)
6188 || (TARGET_E500_DOUBLE && mode != DDmode)))
6189 && (TARGET_POWERPC64 || mode != DImode)
6190 && !avoiding_indexed_address_p (mode)
6191 && mode != TImode
6192 && mode != TFmode
6193 && mode != TDmode)
6194 {
6195 return gen_rtx_PLUS (Pmode, XEXP (x, 0),
6196 force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
6197 }
6198 else if (SPE_VECTOR_MODE (mode)
6199 || (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
6200 || mode == DDmode || mode == TDmode
6201 || mode == DImode)))
6202 {
6203 if (mode == DImode)
6204 return x;
6205 /* We accept [reg + reg] and [reg + OFFSET]. */
6206
6207 if (GET_CODE (x) == PLUS)
6208 {
6209 rtx op1 = XEXP (x, 0);
6210 rtx op2 = XEXP (x, 1);
6211 rtx y;
6212
6213 op1 = force_reg (Pmode, op1);
6214
6215 if (GET_CODE (op2) != REG
6216 && (GET_CODE (op2) != CONST_INT
6217 || !SPE_CONST_OFFSET_OK (INTVAL (op2))
6218 || (GET_MODE_SIZE (mode) > 8
6219 && !SPE_CONST_OFFSET_OK (INTVAL (op2) + 8))))
6220 op2 = force_reg (Pmode, op2);
6221
6222 /* We can't always do [reg + reg] for these, because [reg +
6223 reg + offset] is not a legitimate addressing mode. */
6224 y = gen_rtx_PLUS (Pmode, op1, op2);
6225
6226 if ((GET_MODE_SIZE (mode) > 8 || mode == DDmode) && REG_P (op2))
6227 return force_reg (Pmode, y);
6228 else
6229 return y;
6230 }
6231
6232 return force_reg (Pmode, x);
6233 }
6234 else if (TARGET_ELF
6235 && TARGET_32BIT
6236 && TARGET_NO_TOC
6237 && ! flag_pic
6238 && GET_CODE (x) != CONST_INT
6239 && GET_CODE (x) != CONST_DOUBLE
6240 && CONSTANT_P (x)
6241 && GET_MODE_NUNITS (mode) == 1
6242 && (GET_MODE_BITSIZE (mode) <= 32
6243 || ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6244 && (mode == DFmode || mode == DDmode))))
6245 {
6246 rtx reg = gen_reg_rtx (Pmode);
6247 emit_insn (gen_elf_high (reg, x));
6248 return gen_rtx_LO_SUM (Pmode, reg, x);
6249 }
6250 else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
6251 && ! flag_pic
6252 #if TARGET_MACHO
6253 && ! MACHO_DYNAMIC_NO_PIC_P
6254 #endif
6255 && GET_CODE (x) != CONST_INT
6256 && GET_CODE (x) != CONST_DOUBLE
6257 && CONSTANT_P (x)
6258 && GET_MODE_NUNITS (mode) == 1
6259 && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6260 || (mode != DFmode && mode != DDmode))
6261 && mode != DImode
6262 && mode != TImode)
6263 {
6264 rtx reg = gen_reg_rtx (Pmode);
6265 emit_insn (gen_macho_high (reg, x));
6266 return gen_rtx_LO_SUM (Pmode, reg, x);
6267 }
6268 else if (TARGET_TOC
6269 && GET_CODE (x) == SYMBOL_REF
6270 && constant_pool_expr_p (x)
6271 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
6272 {
6273 rtx reg = TARGET_CMODEL != CMODEL_SMALL ? gen_reg_rtx (Pmode) : NULL_RTX;
6274 return create_TOC_reference (x, reg);
6275 }
6276 else
6277 return x;
6278 }
6279
6280 /* Debug version of rs6000_legitimize_address. */
6281 static rtx
6282 rs6000_debug_legitimize_address (rtx x, rtx oldx, enum machine_mode mode)
6283 {
6284 rtx ret;
6285 rtx insns;
6286
6287 start_sequence ();
6288 ret = rs6000_legitimize_address (x, oldx, mode);
6289 insns = get_insns ();
6290 end_sequence ();
6291
6292 if (ret != x)
6293 {
6294 fprintf (stderr,
6295 "\nrs6000_legitimize_address: mode %s, old code %s, "
6296 "new code %s, modified\n",
6297 GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)),
6298 GET_RTX_NAME (GET_CODE (ret)));
6299
6300 fprintf (stderr, "Original address:\n");
6301 debug_rtx (x);
6302
6303 fprintf (stderr, "oldx:\n");
6304 debug_rtx (oldx);
6305
6306 fprintf (stderr, "New address:\n");
6307 debug_rtx (ret);
6308
6309 if (insns)
6310 {
6311 fprintf (stderr, "Insns added:\n");
6312 debug_rtx_list (insns, 20);
6313 }
6314 }
6315 else
6316 {
6317 fprintf (stderr,
6318 "\nrs6000_legitimize_address: mode %s, code %s, no change:\n",
6319 GET_MODE_NAME (mode), GET_RTX_NAME (GET_CODE (x)));
6320
6321 debug_rtx (x);
6322 }
6323
6324 if (insns)
6325 emit_insn (insns);
6326
6327 return ret;
6328 }
6329
6330 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
6331 We need to emit DTP-relative relocations. */
6332
6333 static void
6334 rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
6335 {
6336 switch (size)
6337 {
6338 case 4:
6339 fputs ("\t.long\t", file);
6340 break;
6341 case 8:
6342 fputs (DOUBLE_INT_ASM_OP, file);
6343 break;
6344 default:
6345 gcc_unreachable ();
6346 }
6347 output_addr_const (file, x);
6348 fputs ("@dtprel+0x8000", file);
6349 }
6350
6351 /* In the name of slightly smaller debug output, and to cater to
6352 general assembler lossage, recognize various UNSPEC sequences
6353 and turn them back into a direct symbol reference. */
6354
6355 static rtx
6356 rs6000_delegitimize_address (rtx orig_x)
6357 {
6358 rtx x, y;
6359
6360 orig_x = delegitimize_mem_from_attrs (orig_x);
6361 x = orig_x;
6362 if (MEM_P (x))
6363 x = XEXP (x, 0);
6364
6365 if (GET_CODE (x) == (TARGET_CMODEL != CMODEL_SMALL ? LO_SUM : PLUS)
6366 && GET_CODE (XEXP (x, 1)) == CONST)
6367 {
6368 y = XEXP (XEXP (x, 1), 0);
6369 if (GET_CODE (y) == UNSPEC
6370 && XINT (y, 1) == UNSPEC_TOCREL
6371 && ((GET_CODE (XEXP (x, 0)) == REG
6372 && (REGNO (XEXP (x, 0)) == TOC_REGISTER
6373 || TARGET_MINIMAL_TOC
6374 || TARGET_CMODEL != CMODEL_SMALL))
6375 || (TARGET_CMODEL != CMODEL_SMALL
6376 && GET_CODE (XEXP (x, 0)) == PLUS
6377 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6378 && REGNO (XEXP (XEXP (x, 0), 0)) == TOC_REGISTER
6379 && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
6380 && rtx_equal_p (XEXP (x, 1),
6381 XEXP (XEXP (XEXP (x, 0), 1), 0)))))
6382 {
6383 y = XVECEXP (y, 0, 0);
6384 if (!MEM_P (orig_x))
6385 return y;
6386 else
6387 return replace_equiv_address_nv (orig_x, y);
6388 }
6389 }
6390
6391 if (TARGET_MACHO
6392 && GET_CODE (orig_x) == LO_SUM
6393 && GET_CODE (XEXP (x, 1)) == CONST)
6394 {
6395 y = XEXP (XEXP (x, 1), 0);
6396 if (GET_CODE (y) == UNSPEC
6397 && XINT (y, 1) == UNSPEC_MACHOPIC_OFFSET)
6398 return XVECEXP (y, 0, 0);
6399 }
6400
6401 return orig_x;
6402 }
6403
6404 /* Construct the SYMBOL_REF for the tls_get_addr function. */
6405
6406 static GTY(()) rtx rs6000_tls_symbol;
6407 static rtx
6408 rs6000_tls_get_addr (void)
6409 {
6410 if (!rs6000_tls_symbol)
6411 rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
6412
6413 return rs6000_tls_symbol;
6414 }
6415
6416 /* Construct the SYMBOL_REF for TLS GOT references. */
6417
6418 static GTY(()) rtx rs6000_got_symbol;
6419 static rtx
6420 rs6000_got_sym (void)
6421 {
6422 if (!rs6000_got_symbol)
6423 {
6424 rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
6425 SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
6426 SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
6427 }
6428
6429 return rs6000_got_symbol;
6430 }
6431
6432 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
6433 this (thread-local) address. */
6434
6435 static rtx
6436 rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
6437 {
6438 rtx dest, insn;
6439
6440 dest = gen_reg_rtx (Pmode);
6441 if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
6442 {
6443 rtx tlsreg;
6444
6445 if (TARGET_64BIT)
6446 {
6447 tlsreg = gen_rtx_REG (Pmode, 13);
6448 insn = gen_tls_tprel_64 (dest, tlsreg, addr);
6449 }
6450 else
6451 {
6452 tlsreg = gen_rtx_REG (Pmode, 2);
6453 insn = gen_tls_tprel_32 (dest, tlsreg, addr);
6454 }
6455 emit_insn (insn);
6456 }
6457 else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
6458 {
6459 rtx tlsreg, tmp;
6460
6461 tmp = gen_reg_rtx (Pmode);
6462 if (TARGET_64BIT)
6463 {
6464 tlsreg = gen_rtx_REG (Pmode, 13);
6465 insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
6466 }
6467 else
6468 {
6469 tlsreg = gen_rtx_REG (Pmode, 2);
6470 insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
6471 }
6472 emit_insn (insn);
6473 if (TARGET_64BIT)
6474 insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
6475 else
6476 insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
6477 emit_insn (insn);
6478 }
6479 else
6480 {
6481 rtx r3, got, tga, tmp1, tmp2, call_insn;
6482
6483 /* We currently use relocations like @got@tlsgd for tls, which
6484 means the linker will handle allocation of tls entries, placing
6485 them in the .got section. So use a pointer to the .got section,
6486 not one to secondary TOC sections used by 64-bit -mminimal-toc,
6487 or to secondary GOT sections used by 32-bit -fPIC. */
6488 if (TARGET_64BIT)
6489 got = gen_rtx_REG (Pmode, 2);
6490 else
6491 {
6492 if (flag_pic == 1)
6493 got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
6494 else
6495 {
6496 rtx gsym = rs6000_got_sym ();
6497 got = gen_reg_rtx (Pmode);
6498 if (flag_pic == 0)
6499 rs6000_emit_move (got, gsym, Pmode);
6500 else
6501 {
6502 rtx mem, lab, last;
6503
6504 tmp1 = gen_reg_rtx (Pmode);
6505 tmp2 = gen_reg_rtx (Pmode);
6506 mem = gen_const_mem (Pmode, tmp1);
6507 lab = gen_label_rtx ();
6508 emit_insn (gen_load_toc_v4_PIC_1b (gsym, lab));
6509 emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
6510 emit_move_insn (tmp2, mem);
6511 last = emit_insn (gen_addsi3 (got, tmp1, tmp2));
6512 set_unique_reg_note (last, REG_EQUAL, gsym);
6513 }
6514 }
6515 }
6516
6517 if (model == TLS_MODEL_GLOBAL_DYNAMIC)
6518 {
6519 r3 = gen_rtx_REG (Pmode, 3);
6520 tga = rs6000_tls_get_addr ();
6521 emit_library_call_value (tga, dest, LCT_CONST, Pmode, 1, r3, Pmode);
6522
6523 if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
6524 insn = gen_tls_gd_aix64 (r3, got, addr, tga, const0_rtx);
6525 else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
6526 insn = gen_tls_gd_aix32 (r3, got, addr, tga, const0_rtx);
6527 else if (DEFAULT_ABI == ABI_V4)
6528 insn = gen_tls_gd_sysvsi (r3, got, addr, tga, const0_rtx);
6529 else
6530 gcc_unreachable ();
6531 call_insn = last_call_insn ();
6532 PATTERN (call_insn) = insn;
6533 if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
6534 use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
6535 pic_offset_table_rtx);
6536 }
6537 else if (model == TLS_MODEL_LOCAL_DYNAMIC)
6538 {
6539 r3 = gen_rtx_REG (Pmode, 3);
6540 tga = rs6000_tls_get_addr ();
6541 tmp1 = gen_reg_rtx (Pmode);
6542 emit_library_call_value (tga, tmp1, LCT_CONST, Pmode, 1, r3, Pmode);
6543
6544 if (DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
6545 insn = gen_tls_ld_aix64 (r3, got, tga, const0_rtx);
6546 else if (DEFAULT_ABI == ABI_AIX && !TARGET_64BIT)
6547 insn = gen_tls_ld_aix32 (r3, got, tga, const0_rtx);
6548 else if (DEFAULT_ABI == ABI_V4)
6549 insn = gen_tls_ld_sysvsi (r3, got, tga, const0_rtx);
6550 else
6551 gcc_unreachable ();
6552 call_insn = last_call_insn ();
6553 PATTERN (call_insn) = insn;
6554 if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
6555 use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
6556 pic_offset_table_rtx);
6557
6558 if (rs6000_tls_size == 16)
6559 {
6560 if (TARGET_64BIT)
6561 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
6562 else
6563 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
6564 }
6565 else if (rs6000_tls_size == 32)
6566 {
6567 tmp2 = gen_reg_rtx (Pmode);
6568 if (TARGET_64BIT)
6569 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
6570 else
6571 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
6572 emit_insn (insn);
6573 if (TARGET_64BIT)
6574 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
6575 else
6576 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
6577 }
6578 else
6579 {
6580 tmp2 = gen_reg_rtx (Pmode);
6581 if (TARGET_64BIT)
6582 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
6583 else
6584 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
6585 emit_insn (insn);
6586 insn = gen_rtx_SET (Pmode, dest,
6587 gen_rtx_PLUS (Pmode, tmp2, tmp1));
6588 }
6589 emit_insn (insn);
6590 }
6591 else
6592 {
6593 /* IE, or 64-bit offset LE. */
6594 tmp2 = gen_reg_rtx (Pmode);
6595 if (TARGET_64BIT)
6596 insn = gen_tls_got_tprel_64 (tmp2, got, addr);
6597 else
6598 insn = gen_tls_got_tprel_32 (tmp2, got, addr);
6599 emit_insn (insn);
6600 if (TARGET_64BIT)
6601 insn = gen_tls_tls_64 (dest, tmp2, addr);
6602 else
6603 insn = gen_tls_tls_32 (dest, tmp2, addr);
6604 emit_insn (insn);
6605 }
6606 }
6607
6608 return dest;
6609 }
6610
6611 /* Return 1 if X contains a thread-local symbol. */
6612
6613 bool
6614 rs6000_tls_referenced_p (rtx x)
6615 {
6616 if (! TARGET_HAVE_TLS)
6617 return false;
6618
6619 return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
6620 }
6621
6622 /* Return 1 if *X is a thread-local symbol. This is the same as
6623 rs6000_tls_symbol_ref except for the type of the unused argument. */
6624
6625 static int
6626 rs6000_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
6627 {
6628 return RS6000_SYMBOL_REF_TLS_P (*x);
6629 }
6630
6631 /* Our implementation of LEGITIMIZE_RELOAD_ADDRESS. Returns a value to
6632 replace the input X, or the original X if no replacement is called for.
6633 The output parameter *WIN is 1 if the calling macro should goto WIN,
6634 0 if it should not.
6635
6636 For RS/6000, we wish to handle large displacements off a base
6637 register by splitting the addend across an addiu/addis and the mem insn.
6638 This cuts number of extra insns needed from 3 to 1.
6639
6640 On Darwin, we use this to generate code for floating point constants.
6641 A movsf_low is generated so we wind up with 2 instructions rather than 3.
6642 The Darwin code is inside #if TARGET_MACHO because only then are the
6643 machopic_* functions defined. */
6644 static rtx
6645 rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
6646 int opnum, int type,
6647 int ind_levels ATTRIBUTE_UNUSED, int *win)
6648 {
6649 bool reg_offset_p = reg_offset_addressing_ok_p (mode);
6650
6651 /* Nasty hack for vsx_splat_V2DF/V2DI load from mem, which takes a
6652 DFmode/DImode MEM. */
6653 if (reg_offset_p
6654 && opnum == 1
6655 && ((mode == DFmode && recog_data.operand_mode[0] == V2DFmode)
6656 || (mode == DImode && recog_data.operand_mode[0] == V2DImode)))
6657 reg_offset_p = false;
6658
6659 /* We must recognize output that we have already generated ourselves. */
6660 if (GET_CODE (x) == PLUS
6661 && GET_CODE (XEXP (x, 0)) == PLUS
6662 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6663 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6664 && GET_CODE (XEXP (x, 1)) == CONST_INT)
6665 {
6666 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6667 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6668 opnum, (enum reload_type)type);
6669 *win = 1;
6670 return x;
6671 }
6672
6673 /* Likewise for (lo_sum (high ...) ...) output we have generated. */
6674 if (GET_CODE (x) == LO_SUM
6675 && GET_CODE (XEXP (x, 0)) == HIGH)
6676 {
6677 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6678 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6679 opnum, (enum reload_type)type);
6680 *win = 1;
6681 return x;
6682 }
6683
6684 #if TARGET_MACHO
6685 if (DEFAULT_ABI == ABI_DARWIN && flag_pic
6686 && GET_CODE (x) == LO_SUM
6687 && GET_CODE (XEXP (x, 0)) == PLUS
6688 && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
6689 && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
6690 && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
6691 && machopic_operand_p (XEXP (x, 1)))
6692 {
6693 /* Result of previous invocation of this function on Darwin
6694 floating point constant. */
6695 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6696 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6697 opnum, (enum reload_type)type);
6698 *win = 1;
6699 return x;
6700 }
6701 #endif
6702
6703 if (TARGET_CMODEL != CMODEL_SMALL
6704 && GET_CODE (x) == LO_SUM
6705 && GET_CODE (XEXP (x, 0)) == PLUS
6706 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6707 && REGNO (XEXP (XEXP (x, 0), 0)) == TOC_REGISTER
6708 && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
6709 && GET_CODE (XEXP (x, 1)) == CONST
6710 && GET_CODE (XEXP (XEXP (x, 1), 0)) == UNSPEC
6711 && XINT (XEXP (XEXP (x, 1), 0), 1) == UNSPEC_TOCREL
6712 && rtx_equal_p (XEXP (XEXP (XEXP (x, 0), 1), 0), XEXP (x, 1)))
6713 {
6714 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6715 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6716 opnum, (enum reload_type) type);
6717 *win = 1;
6718 return x;
6719 }
6720
6721 /* Force ld/std non-word aligned offset into base register by wrapping
6722 in offset 0. */
6723 if (GET_CODE (x) == PLUS
6724 && GET_CODE (XEXP (x, 0)) == REG
6725 && REGNO (XEXP (x, 0)) < 32
6726 && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
6727 && GET_CODE (XEXP (x, 1)) == CONST_INT
6728 && reg_offset_p
6729 && (INTVAL (XEXP (x, 1)) & 3) != 0
6730 && VECTOR_MEM_NONE_P (mode)
6731 && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
6732 && TARGET_POWERPC64)
6733 {
6734 x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
6735 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6736 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6737 opnum, (enum reload_type) type);
6738 *win = 1;
6739 return x;
6740 }
6741
6742 if (GET_CODE (x) == PLUS
6743 && GET_CODE (XEXP (x, 0)) == REG
6744 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
6745 && INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 1)
6746 && GET_CODE (XEXP (x, 1)) == CONST_INT
6747 && reg_offset_p
6748 && !SPE_VECTOR_MODE (mode)
6749 && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
6750 || mode == DDmode || mode == TDmode
6751 || mode == DImode))
6752 && VECTOR_MEM_NONE_P (mode))
6753 {
6754 HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
6755 HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
6756 HOST_WIDE_INT high
6757 = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
6758
6759 /* Check for 32-bit overflow. */
6760 if (high + low != val)
6761 {
6762 *win = 0;
6763 return x;
6764 }
6765
6766 /* Reload the high part into a base reg; leave the low part
6767 in the mem directly. */
6768
6769 x = gen_rtx_PLUS (GET_MODE (x),
6770 gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
6771 GEN_INT (high)),
6772 GEN_INT (low));
6773
6774 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6775 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
6776 opnum, (enum reload_type)type);
6777 *win = 1;
6778 return x;
6779 }
6780
6781 if (GET_CODE (x) == SYMBOL_REF
6782 && reg_offset_p
6783 && VECTOR_MEM_NONE_P (mode)
6784 && !SPE_VECTOR_MODE (mode)
6785 #if TARGET_MACHO
6786 && DEFAULT_ABI == ABI_DARWIN
6787 && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
6788 #else
6789 && DEFAULT_ABI == ABI_V4
6790 && !flag_pic
6791 #endif
6792 /* Don't do this for TFmode or TDmode, since the result isn't offsettable.
6793 The same goes for DImode without 64-bit gprs and DFmode and DDmode
6794 without fprs. */
6795 && mode != TFmode
6796 && mode != TDmode
6797 && (mode != DImode || TARGET_POWERPC64)
6798 && ((mode != DFmode && mode != DDmode) || TARGET_POWERPC64
6799 || (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)))
6800 {
6801 #if TARGET_MACHO
6802 if (flag_pic)
6803 {
6804 rtx offset = machopic_gen_offset (x);
6805 x = gen_rtx_LO_SUM (GET_MODE (x),
6806 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
6807 gen_rtx_HIGH (Pmode, offset)), offset);
6808 }
6809 else
6810 #endif
6811 x = gen_rtx_LO_SUM (GET_MODE (x),
6812 gen_rtx_HIGH (Pmode, x), x);
6813
6814 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6815 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6816 opnum, (enum reload_type)type);
6817 *win = 1;
6818 return x;
6819 }
6820
6821 /* Reload an offset address wrapped by an AND that represents the
6822 masking of the lower bits. Strip the outer AND and let reload
6823 convert the offset address into an indirect address. For VSX,
6824 force reload to create the address with an AND in a separate
6825 register, because we can't guarantee an altivec register will
6826 be used. */
6827 if (VECTOR_MEM_ALTIVEC_P (mode)
6828 && GET_CODE (x) == AND
6829 && GET_CODE (XEXP (x, 0)) == PLUS
6830 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
6831 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6832 && GET_CODE (XEXP (x, 1)) == CONST_INT
6833 && INTVAL (XEXP (x, 1)) == -16)
6834 {
6835 x = XEXP (x, 0);
6836 *win = 1;
6837 return x;
6838 }
6839
6840 if (TARGET_TOC
6841 && reg_offset_p
6842 && GET_CODE (x) == SYMBOL_REF
6843 && constant_pool_expr_p (x)
6844 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
6845 {
6846 x = create_TOC_reference (x, NULL_RTX);
6847 if (TARGET_CMODEL != CMODEL_SMALL)
6848 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
6849 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
6850 opnum, (enum reload_type) type);
6851 *win = 1;
6852 return x;
6853 }
6854 *win = 0;
6855 return x;
6856 }
6857
6858 /* Debug version of rs6000_legitimize_reload_address. */
6859 static rtx
6860 rs6000_debug_legitimize_reload_address (rtx x, enum machine_mode mode,
6861 int opnum, int type,
6862 int ind_levels, int *win)
6863 {
6864 rtx ret = rs6000_legitimize_reload_address (x, mode, opnum, type,
6865 ind_levels, win);
6866 fprintf (stderr,
6867 "\nrs6000_legitimize_reload_address: mode = %s, opnum = %d, "
6868 "type = %d, ind_levels = %d, win = %d, original addr:\n",
6869 GET_MODE_NAME (mode), opnum, type, ind_levels, *win);
6870 debug_rtx (x);
6871
6872 if (x == ret)
6873 fprintf (stderr, "Same address returned\n");
6874 else if (!ret)
6875 fprintf (stderr, "NULL returned\n");
6876 else
6877 {
6878 fprintf (stderr, "New address:\n");
6879 debug_rtx (ret);
6880 }
6881
6882 return ret;
6883 }
6884
6885 /* TARGET_LEGITIMATE_ADDRESS_P recognizes an RTL expression
6886 that is a valid memory address for an instruction.
6887 The MODE argument is the machine mode for the MEM expression
6888 that wants to use this address.
6889
6890 On the RS/6000, there are four valid address: a SYMBOL_REF that
6891 refers to a constant pool entry of an address (or the sum of it
6892 plus a constant), a short (16-bit signed) constant plus a register,
6893 the sum of two registers, or a register indirect, possibly with an
6894 auto-increment. For DFmode, DDmode and DImode with a constant plus
6895 register, we must ensure that both words are addressable or PowerPC64
6896 with offset word aligned.
6897
6898 For modes spanning multiple registers (DFmode and DDmode in 32-bit GPRs,
6899 32-bit DImode, TImode, TFmode, TDmode), indexed addressing cannot be used
6900 because adjacent memory cells are accessed by adding word-sized offsets
6901 during assembly output. */
6902 bool
6903 rs6000_legitimate_address_p (enum machine_mode mode, rtx x, bool reg_ok_strict)
6904 {
6905 bool reg_offset_p = reg_offset_addressing_ok_p (mode);
6906
6907 /* If this is an unaligned stvx/ldvx type address, discard the outer AND. */
6908 if (VECTOR_MEM_ALTIVEC_P (mode)
6909 && GET_CODE (x) == AND
6910 && GET_CODE (XEXP (x, 1)) == CONST_INT
6911 && INTVAL (XEXP (x, 1)) == -16)
6912 x = XEXP (x, 0);
6913
6914 if (RS6000_SYMBOL_REF_TLS_P (x))
6915 return 0;
6916 if (legitimate_indirect_address_p (x, reg_ok_strict))
6917 return 1;
6918 if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
6919 && !VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
6920 && !SPE_VECTOR_MODE (mode)
6921 && mode != TFmode
6922 && mode != TDmode
6923 /* Restrict addressing for DI because of our SUBREG hackery. */
6924 && !(TARGET_E500_DOUBLE
6925 && (mode == DFmode || mode == DDmode || mode == DImode))
6926 && TARGET_UPDATE
6927 && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
6928 return 1;
6929 if (virtual_stack_registers_memory_p (x))
6930 return 1;
6931 if (reg_offset_p && legitimate_small_data_p (mode, x))
6932 return 1;
6933 if (reg_offset_p
6934 && legitimate_constant_pool_address_p (x, mode, reg_ok_strict))
6935 return 1;
6936 /* If not REG_OK_STRICT (before reload) let pass any stack offset. */
6937 if (! reg_ok_strict
6938 && reg_offset_p
6939 && GET_CODE (x) == PLUS
6940 && GET_CODE (XEXP (x, 0)) == REG
6941 && (XEXP (x, 0) == virtual_stack_vars_rtx
6942 || XEXP (x, 0) == arg_pointer_rtx)
6943 && GET_CODE (XEXP (x, 1)) == CONST_INT)
6944 return 1;
6945 if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
6946 return 1;
6947 if (mode != TImode
6948 && mode != TFmode
6949 && mode != TDmode
6950 && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6951 || TARGET_POWERPC64
6952 || (mode != DFmode && mode != DDmode)
6953 || (TARGET_E500_DOUBLE && mode != DDmode))
6954 && (TARGET_POWERPC64 || mode != DImode)
6955 && !avoiding_indexed_address_p (mode)
6956 && legitimate_indexed_address_p (x, reg_ok_strict))
6957 return 1;
6958 if (GET_CODE (x) == PRE_MODIFY
6959 && mode != TImode
6960 && mode != TFmode
6961 && mode != TDmode
6962 && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
6963 || TARGET_POWERPC64
6964 || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE))
6965 && (TARGET_POWERPC64 || mode != DImode)
6966 && !VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)
6967 && !SPE_VECTOR_MODE (mode)
6968 /* Restrict addressing for DI because of our SUBREG hackery. */
6969 && !(TARGET_E500_DOUBLE
6970 && (mode == DFmode || mode == DDmode || mode == DImode))
6971 && TARGET_UPDATE
6972 && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict)
6973 && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1), reg_ok_strict)
6974 || (!avoiding_indexed_address_p (mode)
6975 && legitimate_indexed_address_p (XEXP (x, 1), reg_ok_strict)))
6976 && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
6977 return 1;
6978 if (reg_offset_p && legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
6979 return 1;
6980 return 0;
6981 }
6982
6983 /* Debug version of rs6000_legitimate_address_p. */
6984 static bool
6985 rs6000_debug_legitimate_address_p (enum machine_mode mode, rtx x,
6986 bool reg_ok_strict)
6987 {
6988 bool ret = rs6000_legitimate_address_p (mode, x, reg_ok_strict);
6989 fprintf (stderr,
6990 "\nrs6000_legitimate_address_p: return = %s, mode = %s, "
6991 "strict = %d, code = %s\n",
6992 ret ? "true" : "false",
6993 GET_MODE_NAME (mode),
6994 reg_ok_strict,
6995 GET_RTX_NAME (GET_CODE (x)));
6996 debug_rtx (x);
6997
6998 return ret;
6999 }
7000
7001 /* Implement TARGET_MODE_DEPENDENT_ADDRESS_P. */
7002
7003 static bool
7004 rs6000_mode_dependent_address_p (const_rtx addr)
7005 {
7006 return rs6000_mode_dependent_address_ptr (addr);
7007 }
7008
7009 /* Go to LABEL if ADDR (a legitimate address expression)
7010 has an effect that depends on the machine mode it is used for.
7011
7012 On the RS/6000 this is true of all integral offsets (since AltiVec
7013 and VSX modes don't allow them) or is a pre-increment or decrement.
7014
7015 ??? Except that due to conceptual problems in offsettable_address_p
7016 we can't really report the problems of integral offsets. So leave
7017 this assuming that the adjustable offset must be valid for the
7018 sub-words of a TFmode operand, which is what we had before. */
7019
7020 static bool
7021 rs6000_mode_dependent_address (const_rtx addr)
7022 {
7023 switch (GET_CODE (addr))
7024 {
7025 case PLUS:
7026 /* Any offset from virtual_stack_vars_rtx and arg_pointer_rtx
7027 is considered a legitimate address before reload, so there
7028 are no offset restrictions in that case. Note that this
7029 condition is safe in strict mode because any address involving
7030 virtual_stack_vars_rtx or arg_pointer_rtx would already have
7031 been rejected as illegitimate. */
7032 if (XEXP (addr, 0) != virtual_stack_vars_rtx
7033 && XEXP (addr, 0) != arg_pointer_rtx
7034 && GET_CODE (XEXP (addr, 1)) == CONST_INT)
7035 {
7036 unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
7037 return val + 12 + 0x8000 >= 0x10000;
7038 }
7039 break;
7040
7041 case LO_SUM:
7042 /* Anything in the constant pool is sufficiently aligned that
7043 all bytes have the same high part address. */
7044 return !legitimate_constant_pool_address_p (addr, QImode, false);
7045
7046 /* Auto-increment cases are now treated generically in recog.c. */
7047 case PRE_MODIFY:
7048 return TARGET_UPDATE;
7049
7050 /* AND is only allowed in Altivec loads. */
7051 case AND:
7052 return true;
7053
7054 default:
7055 break;
7056 }
7057
7058 return false;
7059 }
7060
7061 /* Debug version of rs6000_mode_dependent_address. */
7062 static bool
7063 rs6000_debug_mode_dependent_address (const_rtx addr)
7064 {
7065 bool ret = rs6000_mode_dependent_address (addr);
7066
7067 fprintf (stderr, "\nrs6000_mode_dependent_address: ret = %s\n",
7068 ret ? "true" : "false");
7069 debug_rtx (addr);
7070
7071 return ret;
7072 }
7073
7074 /* Implement FIND_BASE_TERM. */
7075
7076 rtx
7077 rs6000_find_base_term (rtx op)
7078 {
7079 rtx base, offset;
7080
7081 split_const (op, &base, &offset);
7082 if (GET_CODE (base) == UNSPEC)
7083 switch (XINT (base, 1))
7084 {
7085 case UNSPEC_TOCREL:
7086 case UNSPEC_MACHOPIC_OFFSET:
7087 /* OP represents SYM [+ OFFSET] - ANCHOR. SYM is the base term
7088 for aliasing purposes. */
7089 return XVECEXP (base, 0, 0);
7090 }
7091
7092 return op;
7093 }
7094
7095 /* More elaborate version of recog's offsettable_memref_p predicate
7096 that works around the ??? note of rs6000_mode_dependent_address.
7097 In particular it accepts
7098
7099 (mem:DI (plus:SI (reg/f:SI 31 31) (const_int 32760 [0x7ff8])))
7100
7101 in 32-bit mode, that the recog predicate rejects. */
7102
7103 bool
7104 rs6000_offsettable_memref_p (rtx op)
7105 {
7106 if (!MEM_P (op))
7107 return false;
7108
7109 /* First mimic offsettable_memref_p. */
7110 if (offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)))
7111 return true;
7112
7113 /* offsettable_address_p invokes rs6000_mode_dependent_address, but
7114 the latter predicate knows nothing about the mode of the memory
7115 reference and, therefore, assumes that it is the largest supported
7116 mode (TFmode). As a consequence, legitimate offsettable memory
7117 references are rejected. rs6000_legitimate_offset_address_p contains
7118 the correct logic for the PLUS case of rs6000_mode_dependent_address. */
7119 return rs6000_legitimate_offset_address_p (GET_MODE (op), XEXP (op, 0), 1);
7120 }
7121
7122 /* Change register usage conditional on target flags. */
7123 static void
7124 rs6000_conditional_register_usage (void)
7125 {
7126 int i;
7127
7128 if (TARGET_DEBUG_TARGET)
7129 fprintf (stderr, "rs6000_conditional_register_usage called\n");
7130
7131 /* Set MQ register fixed (already call_used) if not POWER
7132 architecture (RIOS1, RIOS2, RSC, and PPC601) so that it will not
7133 be allocated. */
7134 if (! TARGET_POWER)
7135 fixed_regs[64] = 1;
7136
7137 /* 64-bit AIX and Linux reserve GPR13 for thread-private data. */
7138 if (TARGET_64BIT)
7139 fixed_regs[13] = call_used_regs[13]
7140 = call_really_used_regs[13] = 1;
7141
7142 /* Conditionally disable FPRs. */
7143 if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
7144 for (i = 32; i < 64; i++)
7145 fixed_regs[i] = call_used_regs[i]
7146 = call_really_used_regs[i] = 1;
7147
7148 /* The TOC register is not killed across calls in a way that is
7149 visible to the compiler. */
7150 if (DEFAULT_ABI == ABI_AIX)
7151 call_really_used_regs[2] = 0;
7152
7153 if (DEFAULT_ABI == ABI_V4
7154 && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
7155 && flag_pic == 2)
7156 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
7157
7158 if (DEFAULT_ABI == ABI_V4
7159 && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
7160 && flag_pic == 1)
7161 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
7162 = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
7163 = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
7164
7165 if (DEFAULT_ABI == ABI_DARWIN
7166 && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
7167 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
7168 = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
7169 = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
7170
7171 if (TARGET_TOC && TARGET_MINIMAL_TOC)
7172 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
7173 = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
7174
7175 if (TARGET_SPE)
7176 {
7177 global_regs[SPEFSCR_REGNO] = 1;
7178 /* We used to use r14 as FIXED_SCRATCH to address SPE 64-bit
7179 registers in prologues and epilogues. We no longer use r14
7180 for FIXED_SCRATCH, but we're keeping r14 out of the allocation
7181 pool for link-compatibility with older versions of GCC. Once
7182 "old" code has died out, we can return r14 to the allocation
7183 pool. */
7184 fixed_regs[14]
7185 = call_used_regs[14]
7186 = call_really_used_regs[14] = 1;
7187 }
7188
7189 if (!TARGET_ALTIVEC && !TARGET_VSX)
7190 {
7191 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
7192 fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
7193 call_really_used_regs[VRSAVE_REGNO] = 1;
7194 }
7195
7196 if (TARGET_ALTIVEC || TARGET_VSX)
7197 global_regs[VSCR_REGNO] = 1;
7198
7199 if (TARGET_ALTIVEC_ABI)
7200 {
7201 for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
7202 call_used_regs[i] = call_really_used_regs[i] = 1;
7203
7204 /* AIX reserves VR20:31 in non-extended ABI mode. */
7205 if (TARGET_XCOFF)
7206 for (i = FIRST_ALTIVEC_REGNO + 20; i < FIRST_ALTIVEC_REGNO + 32; ++i)
7207 fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
7208 }
7209 }
7210 \f
7211 /* Try to output insns to set TARGET equal to the constant C if it can
7212 be done in less than N insns. Do all computations in MODE.
7213 Returns the place where the output has been placed if it can be
7214 done and the insns have been emitted. If it would take more than N
7215 insns, zero is returned and no insns and emitted. */
7216
7217 rtx
7218 rs6000_emit_set_const (rtx dest, enum machine_mode mode,
7219 rtx source, int n ATTRIBUTE_UNUSED)
7220 {
7221 rtx result, insn, set;
7222 HOST_WIDE_INT c0, c1;
7223
7224 switch (mode)
7225 {
7226 case QImode:
7227 case HImode:
7228 if (dest == NULL)
7229 dest = gen_reg_rtx (mode);
7230 emit_insn (gen_rtx_SET (VOIDmode, dest, source));
7231 return dest;
7232
7233 case SImode:
7234 result = !can_create_pseudo_p () ? dest : gen_reg_rtx (SImode);
7235
7236 emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (result),
7237 GEN_INT (INTVAL (source)
7238 & (~ (HOST_WIDE_INT) 0xffff))));
7239 emit_insn (gen_rtx_SET (VOIDmode, dest,
7240 gen_rtx_IOR (SImode, copy_rtx (result),
7241 GEN_INT (INTVAL (source) & 0xffff))));
7242 result = dest;
7243 break;
7244
7245 case DImode:
7246 switch (GET_CODE (source))
7247 {
7248 case CONST_INT:
7249 c0 = INTVAL (source);
7250 c1 = -(c0 < 0);
7251 break;
7252
7253 case CONST_DOUBLE:
7254 #if HOST_BITS_PER_WIDE_INT >= 64
7255 c0 = CONST_DOUBLE_LOW (source);
7256 c1 = -(c0 < 0);
7257 #else
7258 c0 = CONST_DOUBLE_LOW (source);
7259 c1 = CONST_DOUBLE_HIGH (source);
7260 #endif
7261 break;
7262
7263 default:
7264 gcc_unreachable ();
7265 }
7266
7267 result = rs6000_emit_set_long_const (dest, c0, c1);
7268 break;
7269
7270 default:
7271 gcc_unreachable ();
7272 }
7273
7274 insn = get_last_insn ();
7275 set = single_set (insn);
7276 if (! CONSTANT_P (SET_SRC (set)))
7277 set_unique_reg_note (insn, REG_EQUAL, source);
7278
7279 return result;
7280 }
7281
7282 /* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
7283 fall back to a straight forward decomposition. We do this to avoid
7284 exponential run times encountered when looking for longer sequences
7285 with rs6000_emit_set_const. */
7286 static rtx
7287 rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
7288 {
7289 if (!TARGET_POWERPC64)
7290 {
7291 rtx operand1, operand2;
7292
7293 operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
7294 DImode);
7295 operand2 = operand_subword_force (copy_rtx (dest), WORDS_BIG_ENDIAN != 0,
7296 DImode);
7297 emit_move_insn (operand1, GEN_INT (c1));
7298 emit_move_insn (operand2, GEN_INT (c2));
7299 }
7300 else
7301 {
7302 HOST_WIDE_INT ud1, ud2, ud3, ud4;
7303
7304 ud1 = c1 & 0xffff;
7305 ud2 = (c1 & 0xffff0000) >> 16;
7306 #if HOST_BITS_PER_WIDE_INT >= 64
7307 c2 = c1 >> 32;
7308 #endif
7309 ud3 = c2 & 0xffff;
7310 ud4 = (c2 & 0xffff0000) >> 16;
7311
7312 if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
7313 || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
7314 {
7315 if (ud1 & 0x8000)
7316 emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) - 0x8000)));
7317 else
7318 emit_move_insn (dest, GEN_INT (ud1));
7319 }
7320
7321 else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
7322 || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
7323 {
7324 if (ud2 & 0x8000)
7325 emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
7326 - 0x80000000));
7327 else
7328 emit_move_insn (dest, GEN_INT (ud2 << 16));
7329 if (ud1 != 0)
7330 emit_move_insn (copy_rtx (dest),
7331 gen_rtx_IOR (DImode, copy_rtx (dest),
7332 GEN_INT (ud1)));
7333 }
7334 else if (ud3 == 0 && ud4 == 0)
7335 {
7336 gcc_assert (ud2 & 0x8000);
7337 emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
7338 - 0x80000000));
7339 if (ud1 != 0)
7340 emit_move_insn (copy_rtx (dest),
7341 gen_rtx_IOR (DImode, copy_rtx (dest),
7342 GEN_INT (ud1)));
7343 emit_move_insn (copy_rtx (dest),
7344 gen_rtx_ZERO_EXTEND (DImode,
7345 gen_lowpart (SImode,
7346 copy_rtx (dest))));
7347 }
7348 else if ((ud4 == 0xffff && (ud3 & 0x8000))
7349 || (ud4 == 0 && ! (ud3 & 0x8000)))
7350 {
7351 if (ud3 & 0x8000)
7352 emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
7353 - 0x80000000));
7354 else
7355 emit_move_insn (dest, GEN_INT (ud3 << 16));
7356
7357 if (ud2 != 0)
7358 emit_move_insn (copy_rtx (dest),
7359 gen_rtx_IOR (DImode, copy_rtx (dest),
7360 GEN_INT (ud2)));
7361 emit_move_insn (copy_rtx (dest),
7362 gen_rtx_ASHIFT (DImode, copy_rtx (dest),
7363 GEN_INT (16)));
7364 if (ud1 != 0)
7365 emit_move_insn (copy_rtx (dest),
7366 gen_rtx_IOR (DImode, copy_rtx (dest),
7367 GEN_INT (ud1)));
7368 }
7369 else
7370 {
7371 if (ud4 & 0x8000)
7372 emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
7373 - 0x80000000));
7374 else
7375 emit_move_insn (dest, GEN_INT (ud4 << 16));
7376
7377 if (ud3 != 0)
7378 emit_move_insn (copy_rtx (dest),
7379 gen_rtx_IOR (DImode, copy_rtx (dest),
7380 GEN_INT (ud3)));
7381
7382 emit_move_insn (copy_rtx (dest),
7383 gen_rtx_ASHIFT (DImode, copy_rtx (dest),
7384 GEN_INT (32)));
7385 if (ud2 != 0)
7386 emit_move_insn (copy_rtx (dest),
7387 gen_rtx_IOR (DImode, copy_rtx (dest),
7388 GEN_INT (ud2 << 16)));
7389 if (ud1 != 0)
7390 emit_move_insn (copy_rtx (dest),
7391 gen_rtx_IOR (DImode, copy_rtx (dest), GEN_INT (ud1)));
7392 }
7393 }
7394 return dest;
7395 }
7396
7397 /* Helper for the following. Get rid of [r+r] memory refs
7398 in cases where it won't work (TImode, TFmode, TDmode). */
7399
7400 static void
7401 rs6000_eliminate_indexed_memrefs (rtx operands[2])
7402 {
7403 if (reload_in_progress)
7404 return;
7405
7406 if (GET_CODE (operands[0]) == MEM
7407 && GET_CODE (XEXP (operands[0], 0)) != REG
7408 && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0),
7409 GET_MODE (operands[0]), false))
7410 operands[0]
7411 = replace_equiv_address (operands[0],
7412 copy_addr_to_reg (XEXP (operands[0], 0)));
7413
7414 if (GET_CODE (operands[1]) == MEM
7415 && GET_CODE (XEXP (operands[1], 0)) != REG
7416 && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0),
7417 GET_MODE (operands[1]), false))
7418 operands[1]
7419 = replace_equiv_address (operands[1],
7420 copy_addr_to_reg (XEXP (operands[1], 0)));
7421 }
7422
7423 /* Emit a move from SOURCE to DEST in mode MODE. */
7424 void
7425 rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
7426 {
7427 rtx operands[2];
7428 operands[0] = dest;
7429 operands[1] = source;
7430
7431 if (TARGET_DEBUG_ADDR)
7432 {
7433 fprintf (stderr,
7434 "\nrs6000_emit_move: mode = %s, reload_in_progress = %d, "
7435 "reload_completed = %d, can_create_pseudos = %d.\ndest:\n",
7436 GET_MODE_NAME (mode),
7437 reload_in_progress,
7438 reload_completed,
7439 can_create_pseudo_p ());
7440 debug_rtx (dest);
7441 fprintf (stderr, "source:\n");
7442 debug_rtx (source);
7443 }
7444
7445 /* Sanity checks. Check that we get CONST_DOUBLE only when we should. */
7446 if (GET_CODE (operands[1]) == CONST_DOUBLE
7447 && ! FLOAT_MODE_P (mode)
7448 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
7449 {
7450 /* FIXME. This should never happen. */
7451 /* Since it seems that it does, do the safe thing and convert
7452 to a CONST_INT. */
7453 operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
7454 }
7455 gcc_assert (GET_CODE (operands[1]) != CONST_DOUBLE
7456 || FLOAT_MODE_P (mode)
7457 || ((CONST_DOUBLE_HIGH (operands[1]) != 0
7458 || CONST_DOUBLE_LOW (operands[1]) < 0)
7459 && (CONST_DOUBLE_HIGH (operands[1]) != -1
7460 || CONST_DOUBLE_LOW (operands[1]) >= 0)));
7461
7462 /* Check if GCC is setting up a block move that will end up using FP
7463 registers as temporaries. We must make sure this is acceptable. */
7464 if (GET_CODE (operands[0]) == MEM
7465 && GET_CODE (operands[1]) == MEM
7466 && mode == DImode
7467 && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
7468 || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
7469 && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
7470 ? 32 : MEM_ALIGN (operands[0])))
7471 || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
7472 ? 32
7473 : MEM_ALIGN (operands[1]))))
7474 && ! MEM_VOLATILE_P (operands [0])
7475 && ! MEM_VOLATILE_P (operands [1]))
7476 {
7477 emit_move_insn (adjust_address (operands[0], SImode, 0),
7478 adjust_address (operands[1], SImode, 0));
7479 emit_move_insn (adjust_address (copy_rtx (operands[0]), SImode, 4),
7480 adjust_address (copy_rtx (operands[1]), SImode, 4));
7481 return;
7482 }
7483
7484 if (can_create_pseudo_p () && GET_CODE (operands[0]) == MEM
7485 && !gpc_reg_operand (operands[1], mode))
7486 operands[1] = force_reg (mode, operands[1]);
7487
7488 if (mode == SFmode && ! TARGET_POWERPC
7489 && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
7490 && GET_CODE (operands[0]) == MEM)
7491 {
7492 int regnum;
7493
7494 if (reload_in_progress || reload_completed)
7495 regnum = true_regnum (operands[1]);
7496 else if (GET_CODE (operands[1]) == REG)
7497 regnum = REGNO (operands[1]);
7498 else
7499 regnum = -1;
7500
7501 /* If operands[1] is a register, on POWER it may have
7502 double-precision data in it, so truncate it to single
7503 precision. */
7504 if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
7505 {
7506 rtx newreg;
7507 newreg = (!can_create_pseudo_p () ? copy_rtx (operands[1])
7508 : gen_reg_rtx (mode));
7509 emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
7510 operands[1] = newreg;
7511 }
7512 }
7513
7514 /* Recognize the case where operand[1] is a reference to thread-local
7515 data and load its address to a register. */
7516 if (rs6000_tls_referenced_p (operands[1]))
7517 {
7518 enum tls_model model;
7519 rtx tmp = operands[1];
7520 rtx addend = NULL;
7521
7522 if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
7523 {
7524 addend = XEXP (XEXP (tmp, 0), 1);
7525 tmp = XEXP (XEXP (tmp, 0), 0);
7526 }
7527
7528 gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
7529 model = SYMBOL_REF_TLS_MODEL (tmp);
7530 gcc_assert (model != 0);
7531
7532 tmp = rs6000_legitimize_tls_address (tmp, model);
7533 if (addend)
7534 {
7535 tmp = gen_rtx_PLUS (mode, tmp, addend);
7536 tmp = force_operand (tmp, operands[0]);
7537 }
7538 operands[1] = tmp;
7539 }
7540
7541 /* Handle the case where reload calls us with an invalid address. */
7542 if (reload_in_progress && mode == Pmode
7543 && (! general_operand (operands[1], mode)
7544 || ! nonimmediate_operand (operands[0], mode)))
7545 goto emit_set;
7546
7547 /* 128-bit constant floating-point values on Darwin should really be
7548 loaded as two parts. */
7549 if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
7550 && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
7551 {
7552 /* DImode is used, not DFmode, because simplify_gen_subreg doesn't
7553 know how to get a DFmode SUBREG of a TFmode. */
7554 enum machine_mode imode = (TARGET_E500_DOUBLE ? DFmode : DImode);
7555 rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode, 0),
7556 simplify_gen_subreg (imode, operands[1], mode, 0),
7557 imode);
7558 rs6000_emit_move (simplify_gen_subreg (imode, operands[0], mode,
7559 GET_MODE_SIZE (imode)),
7560 simplify_gen_subreg (imode, operands[1], mode,
7561 GET_MODE_SIZE (imode)),
7562 imode);
7563 return;
7564 }
7565
7566 if (reload_in_progress && cfun->machine->sdmode_stack_slot != NULL_RTX)
7567 cfun->machine->sdmode_stack_slot =
7568 eliminate_regs (cfun->machine->sdmode_stack_slot, VOIDmode, NULL_RTX);
7569
7570 if (reload_in_progress
7571 && mode == SDmode
7572 && MEM_P (operands[0])
7573 && rtx_equal_p (operands[0], cfun->machine->sdmode_stack_slot)
7574 && REG_P (operands[1]))
7575 {
7576 if (FP_REGNO_P (REGNO (operands[1])))
7577 {
7578 rtx mem = adjust_address_nv (operands[0], DDmode, 0);
7579 mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7580 emit_insn (gen_movsd_store (mem, operands[1]));
7581 }
7582 else if (INT_REGNO_P (REGNO (operands[1])))
7583 {
7584 rtx mem = adjust_address_nv (operands[0], mode, 4);
7585 mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7586 emit_insn (gen_movsd_hardfloat (mem, operands[1]));
7587 }
7588 else
7589 gcc_unreachable();
7590 return;
7591 }
7592 if (reload_in_progress
7593 && mode == SDmode
7594 && REG_P (operands[0])
7595 && MEM_P (operands[1])
7596 && rtx_equal_p (operands[1], cfun->machine->sdmode_stack_slot))
7597 {
7598 if (FP_REGNO_P (REGNO (operands[0])))
7599 {
7600 rtx mem = adjust_address_nv (operands[1], DDmode, 0);
7601 mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7602 emit_insn (gen_movsd_load (operands[0], mem));
7603 }
7604 else if (INT_REGNO_P (REGNO (operands[0])))
7605 {
7606 rtx mem = adjust_address_nv (operands[1], mode, 4);
7607 mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
7608 emit_insn (gen_movsd_hardfloat (operands[0], mem));
7609 }
7610 else
7611 gcc_unreachable();
7612 return;
7613 }
7614
7615 /* FIXME: In the long term, this switch statement should go away
7616 and be replaced by a sequence of tests based on things like
7617 mode == Pmode. */
7618 switch (mode)
7619 {
7620 case HImode:
7621 case QImode:
7622 if (CONSTANT_P (operands[1])
7623 && GET_CODE (operands[1]) != CONST_INT)
7624 operands[1] = force_const_mem (mode, operands[1]);
7625 break;
7626
7627 case TFmode:
7628 case TDmode:
7629 rs6000_eliminate_indexed_memrefs (operands);
7630 /* fall through */
7631
7632 case DFmode:
7633 case DDmode:
7634 case SFmode:
7635 case SDmode:
7636 if (CONSTANT_P (operands[1])
7637 && ! easy_fp_constant (operands[1], mode))
7638 operands[1] = force_const_mem (mode, operands[1]);
7639 break;
7640
7641 case V16QImode:
7642 case V8HImode:
7643 case V4SFmode:
7644 case V4SImode:
7645 case V4HImode:
7646 case V2SFmode:
7647 case V2SImode:
7648 case V1DImode:
7649 case V2DFmode:
7650 case V2DImode:
7651 if (CONSTANT_P (operands[1])
7652 && !easy_vector_constant (operands[1], mode))
7653 operands[1] = force_const_mem (mode, operands[1]);
7654 break;
7655
7656 case SImode:
7657 case DImode:
7658 /* Use default pattern for address of ELF small data */
7659 if (TARGET_ELF
7660 && mode == Pmode
7661 && DEFAULT_ABI == ABI_V4
7662 && (GET_CODE (operands[1]) == SYMBOL_REF
7663 || GET_CODE (operands[1]) == CONST)
7664 && small_data_operand (operands[1], mode))
7665 {
7666 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7667 return;
7668 }
7669
7670 if (DEFAULT_ABI == ABI_V4
7671 && mode == Pmode && mode == SImode
7672 && flag_pic == 1 && got_operand (operands[1], mode))
7673 {
7674 emit_insn (gen_movsi_got (operands[0], operands[1]));
7675 return;
7676 }
7677
7678 if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
7679 && TARGET_NO_TOC
7680 && ! flag_pic
7681 && mode == Pmode
7682 && CONSTANT_P (operands[1])
7683 && GET_CODE (operands[1]) != HIGH
7684 && GET_CODE (operands[1]) != CONST_INT)
7685 {
7686 rtx target = (!can_create_pseudo_p ()
7687 ? operands[0]
7688 : gen_reg_rtx (mode));
7689
7690 /* If this is a function address on -mcall-aixdesc,
7691 convert it to the address of the descriptor. */
7692 if (DEFAULT_ABI == ABI_AIX
7693 && GET_CODE (operands[1]) == SYMBOL_REF
7694 && XSTR (operands[1], 0)[0] == '.')
7695 {
7696 const char *name = XSTR (operands[1], 0);
7697 rtx new_ref;
7698 while (*name == '.')
7699 name++;
7700 new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
7701 CONSTANT_POOL_ADDRESS_P (new_ref)
7702 = CONSTANT_POOL_ADDRESS_P (operands[1]);
7703 SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
7704 SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
7705 SYMBOL_REF_DATA (new_ref) = SYMBOL_REF_DATA (operands[1]);
7706 operands[1] = new_ref;
7707 }
7708
7709 if (DEFAULT_ABI == ABI_DARWIN)
7710 {
7711 #if TARGET_MACHO
7712 if (MACHO_DYNAMIC_NO_PIC_P)
7713 {
7714 /* Take care of any required data indirection. */
7715 operands[1] = rs6000_machopic_legitimize_pic_address (
7716 operands[1], mode, operands[0]);
7717 if (operands[0] != operands[1])
7718 emit_insn (gen_rtx_SET (VOIDmode,
7719 operands[0], operands[1]));
7720 return;
7721 }
7722 #endif
7723 emit_insn (gen_macho_high (target, operands[1]));
7724 emit_insn (gen_macho_low (operands[0], target, operands[1]));
7725 return;
7726 }
7727
7728 emit_insn (gen_elf_high (target, operands[1]));
7729 emit_insn (gen_elf_low (operands[0], target, operands[1]));
7730 return;
7731 }
7732
7733 /* If this is a SYMBOL_REF that refers to a constant pool entry,
7734 and we have put it in the TOC, we just need to make a TOC-relative
7735 reference to it. */
7736 if ((TARGET_TOC
7737 && GET_CODE (operands[1]) == SYMBOL_REF
7738 && constant_pool_expr_p (operands[1])
7739 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
7740 get_pool_mode (operands[1])))
7741 || (TARGET_CMODEL == CMODEL_MEDIUM
7742 && GET_CODE (operands[1]) == SYMBOL_REF
7743 && !CONSTANT_POOL_ADDRESS_P (operands[1])
7744 && SYMBOL_REF_LOCAL_P (operands[1])))
7745 {
7746 rtx reg = NULL_RTX;
7747 if (TARGET_CMODEL != CMODEL_SMALL)
7748 {
7749 if (can_create_pseudo_p ())
7750 reg = gen_reg_rtx (Pmode);
7751 else
7752 reg = operands[0];
7753 }
7754 operands[1] = create_TOC_reference (operands[1], reg);
7755 }
7756 else if (mode == Pmode
7757 && CONSTANT_P (operands[1])
7758 && ((GET_CODE (operands[1]) != CONST_INT
7759 && ! easy_fp_constant (operands[1], mode))
7760 || (GET_CODE (operands[1]) == CONST_INT
7761 && (num_insns_constant (operands[1], mode)
7762 > (TARGET_CMODEL != CMODEL_SMALL ? 3 : 2)))
7763 || (GET_CODE (operands[0]) == REG
7764 && FP_REGNO_P (REGNO (operands[0]))))
7765 && GET_CODE (operands[1]) != HIGH
7766 && ! legitimate_constant_pool_address_p (operands[1], mode,
7767 false)
7768 && ! toc_relative_expr_p (operands[1])
7769 && (TARGET_CMODEL == CMODEL_SMALL
7770 || can_create_pseudo_p ()
7771 || (REG_P (operands[0])
7772 && INT_REG_OK_FOR_BASE_P (operands[0], true))))
7773 {
7774
7775 #if TARGET_MACHO
7776 /* Darwin uses a special PIC legitimizer. */
7777 if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
7778 {
7779 operands[1] =
7780 rs6000_machopic_legitimize_pic_address (operands[1], mode,
7781 operands[0]);
7782 if (operands[0] != operands[1])
7783 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7784 return;
7785 }
7786 #endif
7787
7788 /* If we are to limit the number of things we put in the TOC and
7789 this is a symbol plus a constant we can add in one insn,
7790 just put the symbol in the TOC and add the constant. Don't do
7791 this if reload is in progress. */
7792 if (GET_CODE (operands[1]) == CONST
7793 && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
7794 && GET_CODE (XEXP (operands[1], 0)) == PLUS
7795 && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
7796 && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
7797 || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
7798 && ! side_effects_p (operands[0]))
7799 {
7800 rtx sym =
7801 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
7802 rtx other = XEXP (XEXP (operands[1], 0), 1);
7803
7804 sym = force_reg (mode, sym);
7805 emit_insn (gen_add3_insn (operands[0], sym, other));
7806 return;
7807 }
7808
7809 operands[1] = force_const_mem (mode, operands[1]);
7810
7811 if (TARGET_TOC
7812 && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
7813 && constant_pool_expr_p (XEXP (operands[1], 0))
7814 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
7815 get_pool_constant (XEXP (operands[1], 0)),
7816 get_pool_mode (XEXP (operands[1], 0))))
7817 {
7818 rtx tocref;
7819 rtx reg = NULL_RTX;
7820 if (TARGET_CMODEL != CMODEL_SMALL)
7821 {
7822 if (can_create_pseudo_p ())
7823 reg = gen_reg_rtx (Pmode);
7824 else
7825 reg = operands[0];
7826 }
7827 tocref = create_TOC_reference (XEXP (operands[1], 0), reg);
7828 operands[1] = gen_const_mem (mode, tocref);
7829 set_mem_alias_set (operands[1], get_TOC_alias_set ());
7830 }
7831 }
7832 break;
7833
7834 case TImode:
7835 rs6000_eliminate_indexed_memrefs (operands);
7836
7837 if (TARGET_POWER)
7838 {
7839 emit_insn (gen_rtx_PARALLEL (VOIDmode,
7840 gen_rtvec (2,
7841 gen_rtx_SET (VOIDmode,
7842 operands[0], operands[1]),
7843 gen_rtx_CLOBBER (VOIDmode,
7844 gen_rtx_SCRATCH (SImode)))));
7845 return;
7846 }
7847 break;
7848
7849 default:
7850 fatal_insn ("bad move", gen_rtx_SET (VOIDmode, dest, source));
7851 }
7852
7853 /* Above, we may have called force_const_mem which may have returned
7854 an invalid address. If we can, fix this up; otherwise, reload will
7855 have to deal with it. */
7856 if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
7857 operands[1] = validize_mem (operands[1]);
7858
7859 emit_set:
7860 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
7861 }
7862 \f
7863 /* Nonzero if we can use a floating-point register to pass this arg. */
7864 #define USE_FP_FOR_ARG_P(CUM,MODE,TYPE) \
7865 (SCALAR_FLOAT_MODE_P (MODE) \
7866 && (CUM)->fregno <= FP_ARG_MAX_REG \
7867 && TARGET_HARD_FLOAT && TARGET_FPRS)
7868
7869 /* Nonzero if we can use an AltiVec register to pass this arg. */
7870 #define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE,NAMED) \
7871 ((ALTIVEC_VECTOR_MODE (MODE) || VSX_VECTOR_MODE (MODE)) \
7872 && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG \
7873 && TARGET_ALTIVEC_ABI \
7874 && (NAMED))
7875
7876 /* Return a nonzero value to say to return the function value in
7877 memory, just as large structures are always returned. TYPE will be
7878 the data type of the value, and FNTYPE will be the type of the
7879 function doing the returning, or @code{NULL} for libcalls.
7880
7881 The AIX ABI for the RS/6000 specifies that all structures are
7882 returned in memory. The Darwin ABI does the same.
7883
7884 For the Darwin 64 Bit ABI, a function result can be returned in
7885 registers or in memory, depending on the size of the return data
7886 type. If it is returned in registers, the value occupies the same
7887 registers as it would if it were the first and only function
7888 argument. Otherwise, the function places its result in memory at
7889 the location pointed to by GPR3.
7890
7891 The SVR4 ABI specifies that structures <= 8 bytes are returned in r3/r4,
7892 but a draft put them in memory, and GCC used to implement the draft
7893 instead of the final standard. Therefore, aix_struct_return
7894 controls this instead of DEFAULT_ABI; V.4 targets needing backward
7895 compatibility can change DRAFT_V4_STRUCT_RET to override the
7896 default, and -m switches get the final word. See
7897 rs6000_option_override_internal for more details.
7898
7899 The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
7900 long double support is enabled. These values are returned in memory.
7901
7902 int_size_in_bytes returns -1 for variable size objects, which go in
7903 memory always. The cast to unsigned makes -1 > 8. */
7904
7905 static bool
7906 rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
7907 {
7908 /* For the Darwin64 ABI, test if we can fit the return value in regs. */
7909 if (TARGET_MACHO
7910 && rs6000_darwin64_abi
7911 && TREE_CODE (type) == RECORD_TYPE
7912 && int_size_in_bytes (type) > 0)
7913 {
7914 CUMULATIVE_ARGS valcum;
7915 rtx valret;
7916
7917 valcum.words = 0;
7918 valcum.fregno = FP_ARG_MIN_REG;
7919 valcum.vregno = ALTIVEC_ARG_MIN_REG;
7920 /* Do a trial code generation as if this were going to be passed
7921 as an argument; if any part goes in memory, we return NULL. */
7922 valret = rs6000_darwin64_record_arg (&valcum, type, true, true);
7923 if (valret)
7924 return false;
7925 /* Otherwise fall through to more conventional ABI rules. */
7926 }
7927
7928 if (AGGREGATE_TYPE_P (type)
7929 && (aix_struct_return
7930 || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
7931 return true;
7932
7933 /* Allow -maltivec -mabi=no-altivec without warning. Altivec vector
7934 modes only exist for GCC vector types if -maltivec. */
7935 if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
7936 && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
7937 return false;
7938
7939 /* Return synthetic vectors in memory. */
7940 if (TREE_CODE (type) == VECTOR_TYPE
7941 && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
7942 {
7943 static bool warned_for_return_big_vectors = false;
7944 if (!warned_for_return_big_vectors)
7945 {
7946 warning (0, "GCC vector returned by reference: "
7947 "non-standard ABI extension with no compatibility guarantee");
7948 warned_for_return_big_vectors = true;
7949 }
7950 return true;
7951 }
7952
7953 if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && TYPE_MODE (type) == TFmode)
7954 return true;
7955
7956 return false;
7957 }
7958
7959 #ifdef HAVE_AS_GNU_ATTRIBUTE
7960 /* Return TRUE if a call to function FNDECL may be one that
7961 potentially affects the function calling ABI of the object file. */
7962
7963 static bool
7964 call_ABI_of_interest (tree fndecl)
7965 {
7966 if (cgraph_state == CGRAPH_STATE_EXPANSION)
7967 {
7968 struct cgraph_node *c_node;
7969
7970 /* Libcalls are always interesting. */
7971 if (fndecl == NULL_TREE)
7972 return true;
7973
7974 /* Any call to an external function is interesting. */
7975 if (DECL_EXTERNAL (fndecl))
7976 return true;
7977
7978 /* Interesting functions that we are emitting in this object file. */
7979 c_node = cgraph_get_node (fndecl);
7980 return !cgraph_only_called_directly_p (c_node);
7981 }
7982 return false;
7983 }
7984 #endif
7985
7986 /* Initialize a variable CUM of type CUMULATIVE_ARGS
7987 for a call to a function whose data type is FNTYPE.
7988 For a library call, FNTYPE is 0 and RETURN_MODE the return value mode.
7989
7990 For incoming args we set the number of arguments in the prototype large
7991 so we never return a PARALLEL. */
7992
7993 void
7994 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
7995 rtx libname ATTRIBUTE_UNUSED, int incoming,
7996 int libcall, int n_named_args,
7997 tree fndecl ATTRIBUTE_UNUSED,
7998 enum machine_mode return_mode ATTRIBUTE_UNUSED)
7999 {
8000 static CUMULATIVE_ARGS zero_cumulative;
8001
8002 *cum = zero_cumulative;
8003 cum->words = 0;
8004 cum->fregno = FP_ARG_MIN_REG;
8005 cum->vregno = ALTIVEC_ARG_MIN_REG;
8006 cum->prototype = (fntype && prototype_p (fntype));
8007 cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
8008 ? CALL_LIBCALL : CALL_NORMAL);
8009 cum->sysv_gregno = GP_ARG_MIN_REG;
8010 cum->stdarg = stdarg_p (fntype);
8011
8012 cum->nargs_prototype = 0;
8013 if (incoming || cum->prototype)
8014 cum->nargs_prototype = n_named_args;
8015
8016 /* Check for a longcall attribute. */
8017 if ((!fntype && rs6000_default_long_calls)
8018 || (fntype
8019 && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
8020 && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
8021 cum->call_cookie |= CALL_LONG;
8022
8023 if (TARGET_DEBUG_ARG)
8024 {
8025 fprintf (stderr, "\ninit_cumulative_args:");
8026 if (fntype)
8027 {
8028 tree ret_type = TREE_TYPE (fntype);
8029 fprintf (stderr, " ret code = %s,",
8030 tree_code_name[ (int)TREE_CODE (ret_type) ]);
8031 }
8032
8033 if (cum->call_cookie & CALL_LONG)
8034 fprintf (stderr, " longcall,");
8035
8036 fprintf (stderr, " proto = %d, nargs = %d\n",
8037 cum->prototype, cum->nargs_prototype);
8038 }
8039
8040 #ifdef HAVE_AS_GNU_ATTRIBUTE
8041 if (DEFAULT_ABI == ABI_V4)
8042 {
8043 cum->escapes = call_ABI_of_interest (fndecl);
8044 if (cum->escapes)
8045 {
8046 tree return_type;
8047
8048 if (fntype)
8049 {
8050 return_type = TREE_TYPE (fntype);
8051 return_mode = TYPE_MODE (return_type);
8052 }
8053 else
8054 return_type = lang_hooks.types.type_for_mode (return_mode, 0);
8055
8056 if (return_type != NULL)
8057 {
8058 if (TREE_CODE (return_type) == RECORD_TYPE
8059 && TYPE_TRANSPARENT_AGGR (return_type))
8060 {
8061 return_type = TREE_TYPE (first_field (return_type));
8062 return_mode = TYPE_MODE (return_type);
8063 }
8064 if (AGGREGATE_TYPE_P (return_type)
8065 && ((unsigned HOST_WIDE_INT) int_size_in_bytes (return_type)
8066 <= 8))
8067 rs6000_returns_struct = true;
8068 }
8069 if (SCALAR_FLOAT_MODE_P (return_mode))
8070 rs6000_passes_float = true;
8071 else if (ALTIVEC_VECTOR_MODE (return_mode)
8072 || VSX_VECTOR_MODE (return_mode)
8073 || SPE_VECTOR_MODE (return_mode))
8074 rs6000_passes_vector = true;
8075 }
8076 }
8077 #endif
8078
8079 if (fntype
8080 && !TARGET_ALTIVEC
8081 && TARGET_ALTIVEC_ABI
8082 && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
8083 {
8084 error ("cannot return value in vector register because"
8085 " altivec instructions are disabled, use -maltivec"
8086 " to enable them");
8087 }
8088 }
8089 \f
8090 /* Return true if TYPE must be passed on the stack and not in registers. */
8091
8092 static bool
8093 rs6000_must_pass_in_stack (enum machine_mode mode, const_tree type)
8094 {
8095 if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT)
8096 return must_pass_in_stack_var_size (mode, type);
8097 else
8098 return must_pass_in_stack_var_size_or_pad (mode, type);
8099 }
8100
8101 /* If defined, a C expression which determines whether, and in which
8102 direction, to pad out an argument with extra space. The value
8103 should be of type `enum direction': either `upward' to pad above
8104 the argument, `downward' to pad below, or `none' to inhibit
8105 padding.
8106
8107 For the AIX ABI structs are always stored left shifted in their
8108 argument slot. */
8109
8110 enum direction
8111 function_arg_padding (enum machine_mode mode, const_tree type)
8112 {
8113 #ifndef AGGREGATE_PADDING_FIXED
8114 #define AGGREGATE_PADDING_FIXED 0
8115 #endif
8116 #ifndef AGGREGATES_PAD_UPWARD_ALWAYS
8117 #define AGGREGATES_PAD_UPWARD_ALWAYS 0
8118 #endif
8119
8120 if (!AGGREGATE_PADDING_FIXED)
8121 {
8122 /* GCC used to pass structures of the same size as integer types as
8123 if they were in fact integers, ignoring FUNCTION_ARG_PADDING.
8124 i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
8125 passed padded downward, except that -mstrict-align further
8126 muddied the water in that multi-component structures of 2 and 4
8127 bytes in size were passed padded upward.
8128
8129 The following arranges for best compatibility with previous
8130 versions of gcc, but removes the -mstrict-align dependency. */
8131 if (BYTES_BIG_ENDIAN)
8132 {
8133 HOST_WIDE_INT size = 0;
8134
8135 if (mode == BLKmode)
8136 {
8137 if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
8138 size = int_size_in_bytes (type);
8139 }
8140 else
8141 size = GET_MODE_SIZE (mode);
8142
8143 if (size == 1 || size == 2 || size == 4)
8144 return downward;
8145 }
8146 return upward;
8147 }
8148
8149 if (AGGREGATES_PAD_UPWARD_ALWAYS)
8150 {
8151 if (type != 0 && AGGREGATE_TYPE_P (type))
8152 return upward;
8153 }
8154
8155 /* Fall back to the default. */
8156 return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
8157 }
8158
8159 /* If defined, a C expression that gives the alignment boundary, in bits,
8160 of an argument with the specified mode and type. If it is not defined,
8161 PARM_BOUNDARY is used for all arguments.
8162
8163 V.4 wants long longs and doubles to be double word aligned. Just
8164 testing the mode size is a boneheaded way to do this as it means
8165 that other types such as complex int are also double word aligned.
8166 However, we're stuck with this because changing the ABI might break
8167 existing library interfaces.
8168
8169 Doubleword align SPE vectors.
8170 Quadword align Altivec vectors.
8171 Quadword align large synthetic vector types. */
8172
8173 static unsigned int
8174 rs6000_function_arg_boundary (enum machine_mode mode, const_tree type)
8175 {
8176 if (DEFAULT_ABI == ABI_V4
8177 && (GET_MODE_SIZE (mode) == 8
8178 || (TARGET_HARD_FLOAT
8179 && TARGET_FPRS
8180 && (mode == TFmode || mode == TDmode))))
8181 return 64;
8182 else if (SPE_VECTOR_MODE (mode)
8183 || (type && TREE_CODE (type) == VECTOR_TYPE
8184 && int_size_in_bytes (type) >= 8
8185 && int_size_in_bytes (type) < 16))
8186 return 64;
8187 else if ((ALTIVEC_VECTOR_MODE (mode) || VSX_VECTOR_MODE (mode))
8188 || (type && TREE_CODE (type) == VECTOR_TYPE
8189 && int_size_in_bytes (type) >= 16))
8190 return 128;
8191 else if (TARGET_MACHO
8192 && rs6000_darwin64_abi
8193 && mode == BLKmode
8194 && type && TYPE_ALIGN (type) > 64)
8195 return 128;
8196 else
8197 return PARM_BOUNDARY;
8198 }
8199
8200 /* For a function parm of MODE and TYPE, return the starting word in
8201 the parameter area. NWORDS of the parameter area are already used. */
8202
8203 static unsigned int
8204 rs6000_parm_start (enum machine_mode mode, const_tree type,
8205 unsigned int nwords)
8206 {
8207 unsigned int align;
8208 unsigned int parm_offset;
8209
8210 align = rs6000_function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
8211 parm_offset = DEFAULT_ABI == ABI_V4 ? 2 : 6;
8212 return nwords + (-(parm_offset + nwords) & align);
8213 }
8214
8215 /* Compute the size (in words) of a function argument. */
8216
8217 static unsigned long
8218 rs6000_arg_size (enum machine_mode mode, const_tree type)
8219 {
8220 unsigned long size;
8221
8222 if (mode != BLKmode)
8223 size = GET_MODE_SIZE (mode);
8224 else
8225 size = int_size_in_bytes (type);
8226
8227 if (TARGET_32BIT)
8228 return (size + 3) >> 2;
8229 else
8230 return (size + 7) >> 3;
8231 }
8232 \f
8233 /* Use this to flush pending int fields. */
8234
8235 static void
8236 rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
8237 HOST_WIDE_INT bitpos, int final)
8238 {
8239 unsigned int startbit, endbit;
8240 int intregs, intoffset;
8241 enum machine_mode mode;
8242
8243 /* Handle the situations where a float is taking up the first half
8244 of the GPR, and the other half is empty (typically due to
8245 alignment restrictions). We can detect this by a 8-byte-aligned
8246 int field, or by seeing that this is the final flush for this
8247 argument. Count the word and continue on. */
8248 if (cum->floats_in_gpr == 1
8249 && (cum->intoffset % 64 == 0
8250 || (cum->intoffset == -1 && final)))
8251 {
8252 cum->words++;
8253 cum->floats_in_gpr = 0;
8254 }
8255
8256 if (cum->intoffset == -1)
8257 return;
8258
8259 intoffset = cum->intoffset;
8260 cum->intoffset = -1;
8261 cum->floats_in_gpr = 0;
8262
8263 if (intoffset % BITS_PER_WORD != 0)
8264 {
8265 mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
8266 MODE_INT, 0);
8267 if (mode == BLKmode)
8268 {
8269 /* We couldn't find an appropriate mode, which happens,
8270 e.g., in packed structs when there are 3 bytes to load.
8271 Back intoffset back to the beginning of the word in this
8272 case. */
8273 intoffset = intoffset & -BITS_PER_WORD;
8274 }
8275 }
8276
8277 startbit = intoffset & -BITS_PER_WORD;
8278 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
8279 intregs = (endbit - startbit) / BITS_PER_WORD;
8280 cum->words += intregs;
8281 /* words should be unsigned. */
8282 if ((unsigned)cum->words < (endbit/BITS_PER_WORD))
8283 {
8284 int pad = (endbit/BITS_PER_WORD) - cum->words;
8285 cum->words += pad;
8286 }
8287 }
8288
8289 /* The darwin64 ABI calls for us to recurse down through structs,
8290 looking for elements passed in registers. Unfortunately, we have
8291 to track int register count here also because of misalignments
8292 in powerpc alignment mode. */
8293
8294 static void
8295 rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
8296 const_tree type,
8297 HOST_WIDE_INT startbitpos)
8298 {
8299 tree f;
8300
8301 for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
8302 if (TREE_CODE (f) == FIELD_DECL)
8303 {
8304 HOST_WIDE_INT bitpos = startbitpos;
8305 tree ftype = TREE_TYPE (f);
8306 enum machine_mode mode;
8307 if (ftype == error_mark_node)
8308 continue;
8309 mode = TYPE_MODE (ftype);
8310
8311 if (DECL_SIZE (f) != 0
8312 && host_integerp (bit_position (f), 1))
8313 bitpos += int_bit_position (f);
8314
8315 /* ??? FIXME: else assume zero offset. */
8316
8317 if (TREE_CODE (ftype) == RECORD_TYPE)
8318 rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
8319 else if (USE_FP_FOR_ARG_P (cum, mode, ftype))
8320 {
8321 unsigned n_fpregs = (GET_MODE_SIZE (mode) + 7) >> 3;
8322 rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
8323 cum->fregno += n_fpregs;
8324 /* Single-precision floats present a special problem for
8325 us, because they are smaller than an 8-byte GPR, and so
8326 the structure-packing rules combined with the standard
8327 varargs behavior mean that we want to pack float/float
8328 and float/int combinations into a single register's
8329 space. This is complicated by the arg advance flushing,
8330 which works on arbitrarily large groups of int-type
8331 fields. */
8332 if (mode == SFmode)
8333 {
8334 if (cum->floats_in_gpr == 1)
8335 {
8336 /* Two floats in a word; count the word and reset
8337 the float count. */
8338 cum->words++;
8339 cum->floats_in_gpr = 0;
8340 }
8341 else if (bitpos % 64 == 0)
8342 {
8343 /* A float at the beginning of an 8-byte word;
8344 count it and put off adjusting cum->words until
8345 we see if a arg advance flush is going to do it
8346 for us. */
8347 cum->floats_in_gpr++;
8348 }
8349 else
8350 {
8351 /* The float is at the end of a word, preceded
8352 by integer fields, so the arg advance flush
8353 just above has already set cum->words and
8354 everything is taken care of. */
8355 }
8356 }
8357 else
8358 cum->words += n_fpregs;
8359 }
8360 else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, 1))
8361 {
8362 rs6000_darwin64_record_arg_advance_flush (cum, bitpos, 0);
8363 cum->vregno++;
8364 cum->words += 2;
8365 }
8366 else if (cum->intoffset == -1)
8367 cum->intoffset = bitpos;
8368 }
8369 }
8370
8371 /* Check for an item that needs to be considered specially under the darwin 64
8372 bit ABI. These are record types where the mode is BLK or the structure is
8373 8 bytes in size. */
8374 static int
8375 rs6000_darwin64_struct_check_p (enum machine_mode mode, const_tree type)
8376 {
8377 return rs6000_darwin64_abi
8378 && ((mode == BLKmode
8379 && TREE_CODE (type) == RECORD_TYPE
8380 && int_size_in_bytes (type) > 0)
8381 || (type && TREE_CODE (type) == RECORD_TYPE
8382 && int_size_in_bytes (type) == 8)) ? 1 : 0;
8383 }
8384
8385 /* Update the data in CUM to advance over an argument
8386 of mode MODE and data type TYPE.
8387 (TYPE is null for libcalls where that information may not be available.)
8388
8389 Note that for args passed by reference, function_arg will be called
8390 with MODE and TYPE set to that of the pointer to the arg, not the arg
8391 itself. */
8392
8393 static void
8394 rs6000_function_arg_advance_1 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8395 const_tree type, bool named, int depth)
8396 {
8397 /* Only tick off an argument if we're not recursing. */
8398 if (depth == 0)
8399 cum->nargs_prototype--;
8400
8401 #ifdef HAVE_AS_GNU_ATTRIBUTE
8402 if (DEFAULT_ABI == ABI_V4
8403 && cum->escapes)
8404 {
8405 if (SCALAR_FLOAT_MODE_P (mode))
8406 rs6000_passes_float = true;
8407 else if (named && (ALTIVEC_VECTOR_MODE (mode) || VSX_VECTOR_MODE (mode)))
8408 rs6000_passes_vector = true;
8409 else if (SPE_VECTOR_MODE (mode)
8410 && !cum->stdarg
8411 && cum->sysv_gregno <= GP_ARG_MAX_REG)
8412 rs6000_passes_vector = true;
8413 }
8414 #endif
8415
8416 if (TARGET_ALTIVEC_ABI
8417 && (ALTIVEC_VECTOR_MODE (mode)
8418 || VSX_VECTOR_MODE (mode)
8419 || (type && TREE_CODE (type) == VECTOR_TYPE
8420 && int_size_in_bytes (type) == 16)))
8421 {
8422 bool stack = false;
8423
8424 if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
8425 {
8426 cum->vregno++;
8427 if (!TARGET_ALTIVEC)
8428 error ("cannot pass argument in vector register because"
8429 " altivec instructions are disabled, use -maltivec"
8430 " to enable them");
8431
8432 /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
8433 even if it is going to be passed in a vector register.
8434 Darwin does the same for variable-argument functions. */
8435 if ((DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
8436 || (cum->stdarg && DEFAULT_ABI != ABI_V4))
8437 stack = true;
8438 }
8439 else
8440 stack = true;
8441
8442 if (stack)
8443 {
8444 int align;
8445
8446 /* Vector parameters must be 16-byte aligned. This places
8447 them at 2 mod 4 in terms of words in 32-bit mode, since
8448 the parameter save area starts at offset 24 from the
8449 stack. In 64-bit mode, they just have to start on an
8450 even word, since the parameter save area is 16-byte
8451 aligned. Space for GPRs is reserved even if the argument
8452 will be passed in memory. */
8453 if (TARGET_32BIT)
8454 align = (2 - cum->words) & 3;
8455 else
8456 align = cum->words & 1;
8457 cum->words += align + rs6000_arg_size (mode, type);
8458
8459 if (TARGET_DEBUG_ARG)
8460 {
8461 fprintf (stderr, "function_adv: words = %2d, align=%d, ",
8462 cum->words, align);
8463 fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
8464 cum->nargs_prototype, cum->prototype,
8465 GET_MODE_NAME (mode));
8466 }
8467 }
8468 }
8469 else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
8470 && !cum->stdarg
8471 && cum->sysv_gregno <= GP_ARG_MAX_REG)
8472 cum->sysv_gregno++;
8473
8474 else if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
8475 {
8476 int size = int_size_in_bytes (type);
8477 /* Variable sized types have size == -1 and are
8478 treated as if consisting entirely of ints.
8479 Pad to 16 byte boundary if needed. */
8480 if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
8481 && (cum->words % 2) != 0)
8482 cum->words++;
8483 /* For varargs, we can just go up by the size of the struct. */
8484 if (!named)
8485 cum->words += (size + 7) / 8;
8486 else
8487 {
8488 /* It is tempting to say int register count just goes up by
8489 sizeof(type)/8, but this is wrong in a case such as
8490 { int; double; int; } [powerpc alignment]. We have to
8491 grovel through the fields for these too. */
8492 cum->intoffset = 0;
8493 cum->floats_in_gpr = 0;
8494 rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
8495 rs6000_darwin64_record_arg_advance_flush (cum,
8496 size * BITS_PER_UNIT, 1);
8497 }
8498 if (TARGET_DEBUG_ARG)
8499 {
8500 fprintf (stderr, "function_adv: words = %2d, align=%d, size=%d",
8501 cum->words, TYPE_ALIGN (type), size);
8502 fprintf (stderr,
8503 "nargs = %4d, proto = %d, mode = %4s (darwin64 abi)\n",
8504 cum->nargs_prototype, cum->prototype,
8505 GET_MODE_NAME (mode));
8506 }
8507 }
8508 else if (DEFAULT_ABI == ABI_V4)
8509 {
8510 if (TARGET_HARD_FLOAT && TARGET_FPRS
8511 && ((TARGET_SINGLE_FLOAT && mode == SFmode)
8512 || (TARGET_DOUBLE_FLOAT && mode == DFmode)
8513 || (mode == TFmode && !TARGET_IEEEQUAD)
8514 || mode == SDmode || mode == DDmode || mode == TDmode))
8515 {
8516 /* _Decimal128 must use an even/odd register pair. This assumes
8517 that the register number is odd when fregno is odd. */
8518 if (mode == TDmode && (cum->fregno % 2) == 1)
8519 cum->fregno++;
8520
8521 if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
8522 <= FP_ARG_V4_MAX_REG)
8523 cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
8524 else
8525 {
8526 cum->fregno = FP_ARG_V4_MAX_REG + 1;
8527 if (mode == DFmode || mode == TFmode
8528 || mode == DDmode || mode == TDmode)
8529 cum->words += cum->words & 1;
8530 cum->words += rs6000_arg_size (mode, type);
8531 }
8532 }
8533 else
8534 {
8535 int n_words = rs6000_arg_size (mode, type);
8536 int gregno = cum->sysv_gregno;
8537
8538 /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
8539 (r7,r8) or (r9,r10). As does any other 2 word item such
8540 as complex int due to a historical mistake. */
8541 if (n_words == 2)
8542 gregno += (1 - gregno) & 1;
8543
8544 /* Multi-reg args are not split between registers and stack. */
8545 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
8546 {
8547 /* Long long and SPE vectors are aligned on the stack.
8548 So are other 2 word items such as complex int due to
8549 a historical mistake. */
8550 if (n_words == 2)
8551 cum->words += cum->words & 1;
8552 cum->words += n_words;
8553 }
8554
8555 /* Note: continuing to accumulate gregno past when we've started
8556 spilling to the stack indicates the fact that we've started
8557 spilling to the stack to expand_builtin_saveregs. */
8558 cum->sysv_gregno = gregno + n_words;
8559 }
8560
8561 if (TARGET_DEBUG_ARG)
8562 {
8563 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
8564 cum->words, cum->fregno);
8565 fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
8566 cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
8567 fprintf (stderr, "mode = %4s, named = %d\n",
8568 GET_MODE_NAME (mode), named);
8569 }
8570 }
8571 else
8572 {
8573 int n_words = rs6000_arg_size (mode, type);
8574 int start_words = cum->words;
8575 int align_words = rs6000_parm_start (mode, type, start_words);
8576
8577 cum->words = align_words + n_words;
8578
8579 if (SCALAR_FLOAT_MODE_P (mode)
8580 && TARGET_HARD_FLOAT && TARGET_FPRS)
8581 {
8582 /* _Decimal128 must be passed in an even/odd float register pair.
8583 This assumes that the register number is odd when fregno is
8584 odd. */
8585 if (mode == TDmode && (cum->fregno % 2) == 1)
8586 cum->fregno++;
8587 cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
8588 }
8589
8590 if (TARGET_DEBUG_ARG)
8591 {
8592 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
8593 cum->words, cum->fregno);
8594 fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
8595 cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
8596 fprintf (stderr, "named = %d, align = %d, depth = %d\n",
8597 named, align_words - start_words, depth);
8598 }
8599 }
8600 }
8601
8602 static void
8603 rs6000_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8604 const_tree type, bool named)
8605 {
8606 rs6000_function_arg_advance_1 (cum, mode, type, named, 0);
8607 }
8608
8609 static rtx
8610 spe_build_register_parallel (enum machine_mode mode, int gregno)
8611 {
8612 rtx r1, r3, r5, r7;
8613
8614 switch (mode)
8615 {
8616 case DFmode:
8617 r1 = gen_rtx_REG (DImode, gregno);
8618 r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8619 return gen_rtx_PARALLEL (mode, gen_rtvec (1, r1));
8620
8621 case DCmode:
8622 case TFmode:
8623 r1 = gen_rtx_REG (DImode, gregno);
8624 r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8625 r3 = gen_rtx_REG (DImode, gregno + 2);
8626 r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
8627 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r3));
8628
8629 case TCmode:
8630 r1 = gen_rtx_REG (DImode, gregno);
8631 r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
8632 r3 = gen_rtx_REG (DImode, gregno + 2);
8633 r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
8634 r5 = gen_rtx_REG (DImode, gregno + 4);
8635 r5 = gen_rtx_EXPR_LIST (VOIDmode, r5, GEN_INT (16));
8636 r7 = gen_rtx_REG (DImode, gregno + 6);
8637 r7 = gen_rtx_EXPR_LIST (VOIDmode, r7, GEN_INT (24));
8638 return gen_rtx_PARALLEL (mode, gen_rtvec (4, r1, r3, r5, r7));
8639
8640 default:
8641 gcc_unreachable ();
8642 }
8643 }
8644
8645 /* Determine where to put a SIMD argument on the SPE. */
8646 static rtx
8647 rs6000_spe_function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
8648 const_tree type)
8649 {
8650 int gregno = cum->sysv_gregno;
8651
8652 /* On E500 v2, double arithmetic is done on the full 64-bit GPR, but
8653 are passed and returned in a pair of GPRs for ABI compatibility. */
8654 if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode
8655 || mode == DCmode || mode == TCmode))
8656 {
8657 int n_words = rs6000_arg_size (mode, type);
8658
8659 /* Doubles go in an odd/even register pair (r5/r6, etc). */
8660 if (mode == DFmode)
8661 gregno += (1 - gregno) & 1;
8662
8663 /* Multi-reg args are not split between registers and stack. */
8664 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
8665 return NULL_RTX;
8666
8667 return spe_build_register_parallel (mode, gregno);
8668 }
8669 if (cum->stdarg)
8670 {
8671 int n_words = rs6000_arg_size (mode, type);
8672
8673 /* SPE vectors are put in odd registers. */
8674 if (n_words == 2 && (gregno & 1) == 0)
8675 gregno += 1;
8676
8677 if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
8678 {
8679 rtx r1, r2;
8680 enum machine_mode m = SImode;
8681
8682 r1 = gen_rtx_REG (m, gregno);
8683 r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
8684 r2 = gen_rtx_REG (m, gregno + 1);
8685 r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
8686 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
8687 }
8688 else
8689 return NULL_RTX;
8690 }
8691 else
8692 {
8693 if (gregno <= GP_ARG_MAX_REG)
8694 return gen_rtx_REG (mode, gregno);
8695 else
8696 return NULL_RTX;
8697 }
8698 }
8699
8700 /* A subroutine of rs6000_darwin64_record_arg. Assign the bits of the
8701 structure between cum->intoffset and bitpos to integer registers. */
8702
8703 static void
8704 rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
8705 HOST_WIDE_INT bitpos, rtx rvec[], int *k)
8706 {
8707 enum machine_mode mode;
8708 unsigned int regno;
8709 unsigned int startbit, endbit;
8710 int this_regno, intregs, intoffset;
8711 rtx reg;
8712
8713 if (cum->intoffset == -1)
8714 return;
8715
8716 intoffset = cum->intoffset;
8717 cum->intoffset = -1;
8718
8719 /* If this is the trailing part of a word, try to only load that
8720 much into the register. Otherwise load the whole register. Note
8721 that in the latter case we may pick up unwanted bits. It's not a
8722 problem at the moment but may wish to revisit. */
8723
8724 if (intoffset % BITS_PER_WORD != 0)
8725 {
8726 mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
8727 MODE_INT, 0);
8728 if (mode == BLKmode)
8729 {
8730 /* We couldn't find an appropriate mode, which happens,
8731 e.g., in packed structs when there are 3 bytes to load.
8732 Back intoffset back to the beginning of the word in this
8733 case. */
8734 intoffset = intoffset & -BITS_PER_WORD;
8735 mode = word_mode;
8736 }
8737 }
8738 else
8739 mode = word_mode;
8740
8741 startbit = intoffset & -BITS_PER_WORD;
8742 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
8743 intregs = (endbit - startbit) / BITS_PER_WORD;
8744 this_regno = cum->words + intoffset / BITS_PER_WORD;
8745
8746 if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
8747 cum->use_stack = 1;
8748
8749 intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
8750 if (intregs <= 0)
8751 return;
8752
8753 intoffset /= BITS_PER_UNIT;
8754 do
8755 {
8756 regno = GP_ARG_MIN_REG + this_regno;
8757 reg = gen_rtx_REG (mode, regno);
8758 rvec[(*k)++] =
8759 gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
8760
8761 this_regno += 1;
8762 intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
8763 mode = word_mode;
8764 intregs -= 1;
8765 }
8766 while (intregs > 0);
8767 }
8768
8769 /* Recursive workhorse for the following. */
8770
8771 static void
8772 rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, const_tree type,
8773 HOST_WIDE_INT startbitpos, rtx rvec[],
8774 int *k)
8775 {
8776 tree f;
8777
8778 for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
8779 if (TREE_CODE (f) == FIELD_DECL)
8780 {
8781 HOST_WIDE_INT bitpos = startbitpos;
8782 tree ftype = TREE_TYPE (f);
8783 enum machine_mode mode;
8784 if (ftype == error_mark_node)
8785 continue;
8786 mode = TYPE_MODE (ftype);
8787
8788 if (DECL_SIZE (f) != 0
8789 && host_integerp (bit_position (f), 1))
8790 bitpos += int_bit_position (f);
8791
8792 /* ??? FIXME: else assume zero offset. */
8793
8794 if (TREE_CODE (ftype) == RECORD_TYPE)
8795 rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
8796 else if (cum->named && USE_FP_FOR_ARG_P (cum, mode, ftype))
8797 {
8798 unsigned n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
8799 #if 0
8800 switch (mode)
8801 {
8802 case SCmode: mode = SFmode; break;
8803 case DCmode: mode = DFmode; break;
8804 case TCmode: mode = TFmode; break;
8805 default: break;
8806 }
8807 #endif
8808 rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
8809 if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
8810 {
8811 gcc_assert (cum->fregno == FP_ARG_MAX_REG
8812 && (mode == TFmode || mode == TDmode));
8813 /* Long double or _Decimal128 split over regs and memory. */
8814 mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode : DFmode;
8815 cum->use_stack=1;
8816 }
8817 rvec[(*k)++]
8818 = gen_rtx_EXPR_LIST (VOIDmode,
8819 gen_rtx_REG (mode, cum->fregno++),
8820 GEN_INT (bitpos / BITS_PER_UNIT));
8821 if (mode == TFmode || mode == TDmode)
8822 cum->fregno++;
8823 }
8824 else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, ftype, 1))
8825 {
8826 rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
8827 rvec[(*k)++]
8828 = gen_rtx_EXPR_LIST (VOIDmode,
8829 gen_rtx_REG (mode, cum->vregno++),
8830 GEN_INT (bitpos / BITS_PER_UNIT));
8831 }
8832 else if (cum->intoffset == -1)
8833 cum->intoffset = bitpos;
8834 }
8835 }
8836
8837 /* For the darwin64 ABI, we want to construct a PARALLEL consisting of
8838 the register(s) to be used for each field and subfield of a struct
8839 being passed by value, along with the offset of where the
8840 register's value may be found in the block. FP fields go in FP
8841 register, vector fields go in vector registers, and everything
8842 else goes in int registers, packed as in memory.
8843
8844 This code is also used for function return values. RETVAL indicates
8845 whether this is the case.
8846
8847 Much of this is taken from the SPARC V9 port, which has a similar
8848 calling convention. */
8849
8850 static rtx
8851 rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, const_tree type,
8852 bool named, bool retval)
8853 {
8854 rtx rvec[FIRST_PSEUDO_REGISTER];
8855 int k = 1, kbase = 1;
8856 HOST_WIDE_INT typesize = int_size_in_bytes (type);
8857 /* This is a copy; modifications are not visible to our caller. */
8858 CUMULATIVE_ARGS copy_cum = *orig_cum;
8859 CUMULATIVE_ARGS *cum = &copy_cum;
8860
8861 /* Pad to 16 byte boundary if needed. */
8862 if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
8863 && (cum->words % 2) != 0)
8864 cum->words++;
8865
8866 cum->intoffset = 0;
8867 cum->use_stack = 0;
8868 cum->named = named;
8869
8870 /* Put entries into rvec[] for individual FP and vector fields, and
8871 for the chunks of memory that go in int regs. Note we start at
8872 element 1; 0 is reserved for an indication of using memory, and
8873 may or may not be filled in below. */
8874 rs6000_darwin64_record_arg_recurse (cum, type, /* startbit pos= */ 0, rvec, &k);
8875 rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
8876
8877 /* If any part of the struct went on the stack put all of it there.
8878 This hack is because the generic code for
8879 FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
8880 parts of the struct are not at the beginning. */
8881 if (cum->use_stack)
8882 {
8883 if (retval)
8884 return NULL_RTX; /* doesn't go in registers at all */
8885 kbase = 0;
8886 rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8887 }
8888 if (k > 1 || cum->use_stack)
8889 return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
8890 else
8891 return NULL_RTX;
8892 }
8893
8894 /* Determine where to place an argument in 64-bit mode with 32-bit ABI. */
8895
8896 static rtx
8897 rs6000_mixed_function_arg (enum machine_mode mode, const_tree type,
8898 int align_words)
8899 {
8900 int n_units;
8901 int i, k;
8902 rtx rvec[GP_ARG_NUM_REG + 1];
8903
8904 if (align_words >= GP_ARG_NUM_REG)
8905 return NULL_RTX;
8906
8907 n_units = rs6000_arg_size (mode, type);
8908
8909 /* Optimize the simple case where the arg fits in one gpr, except in
8910 the case of BLKmode due to assign_parms assuming that registers are
8911 BITS_PER_WORD wide. */
8912 if (n_units == 0
8913 || (n_units == 1 && mode != BLKmode))
8914 return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
8915
8916 k = 0;
8917 if (align_words + n_units > GP_ARG_NUM_REG)
8918 /* Not all of the arg fits in gprs. Say that it goes in memory too,
8919 using a magic NULL_RTX component.
8920 This is not strictly correct. Only some of the arg belongs in
8921 memory, not all of it. However, the normal scheme using
8922 function_arg_partial_nregs can result in unusual subregs, eg.
8923 (subreg:SI (reg:DF) 4), which are not handled well. The code to
8924 store the whole arg to memory is often more efficient than code
8925 to store pieces, and we know that space is available in the right
8926 place for the whole arg. */
8927 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
8928
8929 i = 0;
8930 do
8931 {
8932 rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
8933 rtx off = GEN_INT (i++ * 4);
8934 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
8935 }
8936 while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
8937
8938 return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
8939 }
8940
8941 /* Determine where to put an argument to a function.
8942 Value is zero to push the argument on the stack,
8943 or a hard register in which to store the argument.
8944
8945 MODE is the argument's machine mode.
8946 TYPE is the data type of the argument (as a tree).
8947 This is null for libcalls where that information may
8948 not be available.
8949 CUM is a variable of type CUMULATIVE_ARGS which gives info about
8950 the preceding args and about the function being called. It is
8951 not modified in this routine.
8952 NAMED is nonzero if this argument is a named parameter
8953 (otherwise it is an extra parameter matching an ellipsis).
8954
8955 On RS/6000 the first eight words of non-FP are normally in registers
8956 and the rest are pushed. Under AIX, the first 13 FP args are in registers.
8957 Under V.4, the first 8 FP args are in registers.
8958
8959 If this is floating-point and no prototype is specified, we use
8960 both an FP and integer register (or possibly FP reg and stack). Library
8961 functions (when CALL_LIBCALL is set) always have the proper types for args,
8962 so we can pass the FP value just in one register. emit_library_function
8963 doesn't support PARALLEL anyway.
8964
8965 Note that for args passed by reference, function_arg will be called
8966 with MODE and TYPE set to that of the pointer to the arg, not the arg
8967 itself. */
8968
8969 static rtx
8970 rs6000_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8971 const_tree type, bool named)
8972 {
8973 enum rs6000_abi abi = DEFAULT_ABI;
8974
8975 /* Return a marker to indicate whether CR1 needs to set or clear the
8976 bit that V.4 uses to say fp args were passed in registers.
8977 Assume that we don't need the marker for software floating point,
8978 or compiler generated library calls. */
8979 if (mode == VOIDmode)
8980 {
8981 if (abi == ABI_V4
8982 && (cum->call_cookie & CALL_LIBCALL) == 0
8983 && (cum->stdarg
8984 || (cum->nargs_prototype < 0
8985 && (cum->prototype || TARGET_NO_PROTOTYPE))))
8986 {
8987 /* For the SPE, we need to crxor CR6 always. */
8988 if (TARGET_SPE_ABI)
8989 return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
8990 else if (TARGET_HARD_FLOAT && TARGET_FPRS)
8991 return GEN_INT (cum->call_cookie
8992 | ((cum->fregno == FP_ARG_MIN_REG)
8993 ? CALL_V4_SET_FP_ARGS
8994 : CALL_V4_CLEAR_FP_ARGS));
8995 }
8996
8997 return GEN_INT (cum->call_cookie);
8998 }
8999
9000 if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
9001 {
9002 rtx rslt = rs6000_darwin64_record_arg (cum, type, named, /*retval= */false);
9003 if (rslt != NULL_RTX)
9004 return rslt;
9005 /* Else fall through to usual handling. */
9006 }
9007
9008 if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
9009 if (TARGET_64BIT && ! cum->prototype)
9010 {
9011 /* Vector parameters get passed in vector register
9012 and also in GPRs or memory, in absence of prototype. */
9013 int align_words;
9014 rtx slot;
9015 align_words = (cum->words + 1) & ~1;
9016
9017 if (align_words >= GP_ARG_NUM_REG)
9018 {
9019 slot = NULL_RTX;
9020 }
9021 else
9022 {
9023 slot = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
9024 }
9025 return gen_rtx_PARALLEL (mode,
9026 gen_rtvec (2,
9027 gen_rtx_EXPR_LIST (VOIDmode,
9028 slot, const0_rtx),
9029 gen_rtx_EXPR_LIST (VOIDmode,
9030 gen_rtx_REG (mode, cum->vregno),
9031 const0_rtx)));
9032 }
9033 else
9034 return gen_rtx_REG (mode, cum->vregno);
9035 else if (TARGET_ALTIVEC_ABI
9036 && (ALTIVEC_VECTOR_MODE (mode)
9037 || VSX_VECTOR_MODE (mode)
9038 || (type && TREE_CODE (type) == VECTOR_TYPE
9039 && int_size_in_bytes (type) == 16)))
9040 {
9041 if (named || abi == ABI_V4)
9042 return NULL_RTX;
9043 else
9044 {
9045 /* Vector parameters to varargs functions under AIX or Darwin
9046 get passed in memory and possibly also in GPRs. */
9047 int align, align_words, n_words;
9048 enum machine_mode part_mode;
9049
9050 /* Vector parameters must be 16-byte aligned. This places them at
9051 2 mod 4 in terms of words in 32-bit mode, since the parameter
9052 save area starts at offset 24 from the stack. In 64-bit mode,
9053 they just have to start on an even word, since the parameter
9054 save area is 16-byte aligned. */
9055 if (TARGET_32BIT)
9056 align = (2 - cum->words) & 3;
9057 else
9058 align = cum->words & 1;
9059 align_words = cum->words + align;
9060
9061 /* Out of registers? Memory, then. */
9062 if (align_words >= GP_ARG_NUM_REG)
9063 return NULL_RTX;
9064
9065 if (TARGET_32BIT && TARGET_POWERPC64)
9066 return rs6000_mixed_function_arg (mode, type, align_words);
9067
9068 /* The vector value goes in GPRs. Only the part of the
9069 value in GPRs is reported here. */
9070 part_mode = mode;
9071 n_words = rs6000_arg_size (mode, type);
9072 if (align_words + n_words > GP_ARG_NUM_REG)
9073 /* Fortunately, there are only two possibilities, the value
9074 is either wholly in GPRs or half in GPRs and half not. */
9075 part_mode = DImode;
9076
9077 return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
9078 }
9079 }
9080 else if (TARGET_SPE_ABI && TARGET_SPE
9081 && (SPE_VECTOR_MODE (mode)
9082 || (TARGET_E500_DOUBLE && (mode == DFmode
9083 || mode == DCmode
9084 || mode == TFmode
9085 || mode == TCmode))))
9086 return rs6000_spe_function_arg (cum, mode, type);
9087
9088 else if (abi == ABI_V4)
9089 {
9090 if (TARGET_HARD_FLOAT && TARGET_FPRS
9091 && ((TARGET_SINGLE_FLOAT && mode == SFmode)
9092 || (TARGET_DOUBLE_FLOAT && mode == DFmode)
9093 || (mode == TFmode && !TARGET_IEEEQUAD)
9094 || mode == SDmode || mode == DDmode || mode == TDmode))
9095 {
9096 /* _Decimal128 must use an even/odd register pair. This assumes
9097 that the register number is odd when fregno is odd. */
9098 if (mode == TDmode && (cum->fregno % 2) == 1)
9099 cum->fregno++;
9100
9101 if (cum->fregno + (mode == TFmode || mode == TDmode ? 1 : 0)
9102 <= FP_ARG_V4_MAX_REG)
9103 return gen_rtx_REG (mode, cum->fregno);
9104 else
9105 return NULL_RTX;
9106 }
9107 else
9108 {
9109 int n_words = rs6000_arg_size (mode, type);
9110 int gregno = cum->sysv_gregno;
9111
9112 /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
9113 (r7,r8) or (r9,r10). As does any other 2 word item such
9114 as complex int due to a historical mistake. */
9115 if (n_words == 2)
9116 gregno += (1 - gregno) & 1;
9117
9118 /* Multi-reg args are not split between registers and stack. */
9119 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
9120 return NULL_RTX;
9121
9122 if (TARGET_32BIT && TARGET_POWERPC64)
9123 return rs6000_mixed_function_arg (mode, type,
9124 gregno - GP_ARG_MIN_REG);
9125 return gen_rtx_REG (mode, gregno);
9126 }
9127 }
9128 else
9129 {
9130 int align_words = rs6000_parm_start (mode, type, cum->words);
9131
9132 /* _Decimal128 must be passed in an even/odd float register pair.
9133 This assumes that the register number is odd when fregno is odd. */
9134 if (mode == TDmode && (cum->fregno % 2) == 1)
9135 cum->fregno++;
9136
9137 if (USE_FP_FOR_ARG_P (cum, mode, type))
9138 {
9139 rtx rvec[GP_ARG_NUM_REG + 1];
9140 rtx r;
9141 int k;
9142 bool needs_psave;
9143 enum machine_mode fmode = mode;
9144 unsigned long n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
9145
9146 if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
9147 {
9148 /* Currently, we only ever need one reg here because complex
9149 doubles are split. */
9150 gcc_assert (cum->fregno == FP_ARG_MAX_REG
9151 && (fmode == TFmode || fmode == TDmode));
9152
9153 /* Long double or _Decimal128 split over regs and memory. */
9154 fmode = DECIMAL_FLOAT_MODE_P (fmode) ? DDmode : DFmode;
9155 }
9156
9157 /* Do we also need to pass this arg in the parameter save
9158 area? */
9159 needs_psave = (type
9160 && (cum->nargs_prototype <= 0
9161 || (DEFAULT_ABI == ABI_AIX
9162 && TARGET_XL_COMPAT
9163 && align_words >= GP_ARG_NUM_REG)));
9164
9165 if (!needs_psave && mode == fmode)
9166 return gen_rtx_REG (fmode, cum->fregno);
9167
9168 k = 0;
9169 if (needs_psave)
9170 {
9171 /* Describe the part that goes in gprs or the stack.
9172 This piece must come first, before the fprs. */
9173 if (align_words < GP_ARG_NUM_REG)
9174 {
9175 unsigned long n_words = rs6000_arg_size (mode, type);
9176
9177 if (align_words + n_words > GP_ARG_NUM_REG
9178 || (TARGET_32BIT && TARGET_POWERPC64))
9179 {
9180 /* If this is partially on the stack, then we only
9181 include the portion actually in registers here. */
9182 enum machine_mode rmode = TARGET_32BIT ? SImode : DImode;
9183 rtx off;
9184 int i = 0;
9185 if (align_words + n_words > GP_ARG_NUM_REG)
9186 /* Not all of the arg fits in gprs. Say that it
9187 goes in memory too, using a magic NULL_RTX
9188 component. Also see comment in
9189 rs6000_mixed_function_arg for why the normal
9190 function_arg_partial_nregs scheme doesn't work
9191 in this case. */
9192 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX,
9193 const0_rtx);
9194 do
9195 {
9196 r = gen_rtx_REG (rmode,
9197 GP_ARG_MIN_REG + align_words);
9198 off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
9199 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
9200 }
9201 while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
9202 }
9203 else
9204 {
9205 /* The whole arg fits in gprs. */
9206 r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
9207 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
9208 }
9209 }
9210 else
9211 /* It's entirely in memory. */
9212 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
9213 }
9214
9215 /* Describe where this piece goes in the fprs. */
9216 r = gen_rtx_REG (fmode, cum->fregno);
9217 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
9218
9219 return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
9220 }
9221 else if (align_words < GP_ARG_NUM_REG)
9222 {
9223 if (TARGET_32BIT && TARGET_POWERPC64)
9224 return rs6000_mixed_function_arg (mode, type, align_words);
9225
9226 if (mode == BLKmode)
9227 mode = Pmode;
9228
9229 return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
9230 }
9231 else
9232 return NULL_RTX;
9233 }
9234 }
9235 \f
9236 /* For an arg passed partly in registers and partly in memory, this is
9237 the number of bytes passed in registers. For args passed entirely in
9238 registers or entirely in memory, zero. When an arg is described by a
9239 PARALLEL, perhaps using more than one register type, this function
9240 returns the number of bytes used by the first element of the PARALLEL. */
9241
9242 static int
9243 rs6000_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
9244 tree type, bool named)
9245 {
9246 int ret = 0;
9247 int align_words;
9248
9249 if (DEFAULT_ABI == ABI_V4)
9250 return 0;
9251
9252 if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)
9253 && cum->nargs_prototype >= 0)
9254 return 0;
9255
9256 /* In this complicated case we just disable the partial_nregs code. */
9257 if (TARGET_MACHO && rs6000_darwin64_struct_check_p (mode, type))
9258 return 0;
9259
9260 align_words = rs6000_parm_start (mode, type, cum->words);
9261
9262 if (USE_FP_FOR_ARG_P (cum, mode, type))
9263 {
9264 /* If we are passing this arg in the fixed parameter save area
9265 (gprs or memory) as well as fprs, then this function should
9266 return the number of partial bytes passed in the parameter
9267 save area rather than partial bytes passed in fprs. */
9268 if (type
9269 && (cum->nargs_prototype <= 0
9270 || (DEFAULT_ABI == ABI_AIX
9271 && TARGET_XL_COMPAT
9272 && align_words >= GP_ARG_NUM_REG)))
9273 return 0;
9274 else if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3)
9275 > FP_ARG_MAX_REG + 1)
9276 ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8;
9277 else if (cum->nargs_prototype >= 0)
9278 return 0;
9279 }
9280
9281 if (align_words < GP_ARG_NUM_REG
9282 && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
9283 ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
9284
9285 if (ret != 0 && TARGET_DEBUG_ARG)
9286 fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
9287
9288 return ret;
9289 }
9290 \f
9291 /* A C expression that indicates when an argument must be passed by
9292 reference. If nonzero for an argument, a copy of that argument is
9293 made in memory and a pointer to the argument is passed instead of
9294 the argument itself. The pointer is passed in whatever way is
9295 appropriate for passing a pointer to that type.
9296
9297 Under V.4, aggregates and long double are passed by reference.
9298
9299 As an extension to all 32-bit ABIs, AltiVec vectors are passed by
9300 reference unless the AltiVec vector extension ABI is in force.
9301
9302 As an extension to all ABIs, variable sized types are passed by
9303 reference. */
9304
9305 static bool
9306 rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
9307 enum machine_mode mode, const_tree type,
9308 bool named ATTRIBUTE_UNUSED)
9309 {
9310 if (DEFAULT_ABI == ABI_V4 && TARGET_IEEEQUAD && mode == TFmode)
9311 {
9312 if (TARGET_DEBUG_ARG)
9313 fprintf (stderr, "function_arg_pass_by_reference: V4 long double\n");
9314 return 1;
9315 }
9316
9317 if (!type)
9318 return 0;
9319
9320 if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
9321 {
9322 if (TARGET_DEBUG_ARG)
9323 fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
9324 return 1;
9325 }
9326
9327 if (int_size_in_bytes (type) < 0)
9328 {
9329 if (TARGET_DEBUG_ARG)
9330 fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
9331 return 1;
9332 }
9333
9334 /* Allow -maltivec -mabi=no-altivec without warning. Altivec vector
9335 modes only exist for GCC vector types if -maltivec. */
9336 if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
9337 {
9338 if (TARGET_DEBUG_ARG)
9339 fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
9340 return 1;
9341 }
9342
9343 /* Pass synthetic vectors in memory. */
9344 if (TREE_CODE (type) == VECTOR_TYPE
9345 && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
9346 {
9347 static bool warned_for_pass_big_vectors = false;
9348 if (TARGET_DEBUG_ARG)
9349 fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
9350 if (!warned_for_pass_big_vectors)
9351 {
9352 warning (0, "GCC vector passed by reference: "
9353 "non-standard ABI extension with no compatibility guarantee");
9354 warned_for_pass_big_vectors = true;
9355 }
9356 return 1;
9357 }
9358
9359 return 0;
9360 }
9361
9362 static void
9363 rs6000_move_block_from_reg (int regno, rtx x, int nregs)
9364 {
9365 int i;
9366 enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
9367
9368 if (nregs == 0)
9369 return;
9370
9371 for (i = 0; i < nregs; i++)
9372 {
9373 rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
9374 if (reload_completed)
9375 {
9376 if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
9377 tem = NULL_RTX;
9378 else
9379 tem = simplify_gen_subreg (reg_mode, x, BLKmode,
9380 i * GET_MODE_SIZE (reg_mode));
9381 }
9382 else
9383 tem = replace_equiv_address (tem, XEXP (tem, 0));
9384
9385 gcc_assert (tem);
9386
9387 emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
9388 }
9389 }
9390 \f
9391 /* Perform any needed actions needed for a function that is receiving a
9392 variable number of arguments.
9393
9394 CUM is as above.
9395
9396 MODE and TYPE are the mode and type of the current parameter.
9397
9398 PRETEND_SIZE is a variable that should be set to the amount of stack
9399 that must be pushed by the prolog to pretend that our caller pushed
9400 it.
9401
9402 Normally, this macro will push all remaining incoming registers on the
9403 stack and set PRETEND_SIZE to the length of the registers pushed. */
9404
9405 static void
9406 setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
9407 tree type, int *pretend_size ATTRIBUTE_UNUSED,
9408 int no_rtl)
9409 {
9410 CUMULATIVE_ARGS next_cum;
9411 int reg_size = TARGET_32BIT ? 4 : 8;
9412 rtx save_area = NULL_RTX, mem;
9413 int first_reg_offset;
9414 alias_set_type set;
9415
9416 /* Skip the last named argument. */
9417 next_cum = *cum;
9418 rs6000_function_arg_advance_1 (&next_cum, mode, type, true, 0);
9419
9420 if (DEFAULT_ABI == ABI_V4)
9421 {
9422 first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
9423
9424 if (! no_rtl)
9425 {
9426 int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
9427 HOST_WIDE_INT offset = 0;
9428
9429 /* Try to optimize the size of the varargs save area.
9430 The ABI requires that ap.reg_save_area is doubleword
9431 aligned, but we don't need to allocate space for all
9432 the bytes, only those to which we actually will save
9433 anything. */
9434 if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
9435 gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
9436 if (TARGET_HARD_FLOAT && TARGET_FPRS
9437 && next_cum.fregno <= FP_ARG_V4_MAX_REG
9438 && cfun->va_list_fpr_size)
9439 {
9440 if (gpr_reg_num)
9441 fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
9442 * UNITS_PER_FP_WORD;
9443 if (cfun->va_list_fpr_size
9444 < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
9445 fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
9446 else
9447 fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
9448 * UNITS_PER_FP_WORD;
9449 }
9450 if (gpr_reg_num)
9451 {
9452 offset = -((first_reg_offset * reg_size) & ~7);
9453 if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
9454 {
9455 gpr_reg_num = cfun->va_list_gpr_size;
9456 if (reg_size == 4 && (first_reg_offset & 1))
9457 gpr_reg_num++;
9458 }
9459 gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
9460 }
9461 else if (fpr_size)
9462 offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
9463 * UNITS_PER_FP_WORD
9464 - (int) (GP_ARG_NUM_REG * reg_size);
9465
9466 if (gpr_size + fpr_size)
9467 {
9468 rtx reg_save_area
9469 = assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
9470 gcc_assert (GET_CODE (reg_save_area) == MEM);
9471 reg_save_area = XEXP (reg_save_area, 0);
9472 if (GET_CODE (reg_save_area) == PLUS)
9473 {
9474 gcc_assert (XEXP (reg_save_area, 0)
9475 == virtual_stack_vars_rtx);
9476 gcc_assert (GET_CODE (XEXP (reg_save_area, 1)) == CONST_INT);
9477 offset += INTVAL (XEXP (reg_save_area, 1));
9478 }
9479 else
9480 gcc_assert (reg_save_area == virtual_stack_vars_rtx);
9481 }
9482
9483 cfun->machine->varargs_save_offset = offset;
9484 save_area = plus_constant (virtual_stack_vars_rtx, offset);
9485 }
9486 }
9487 else
9488 {
9489 first_reg_offset = next_cum.words;
9490 save_area = virtual_incoming_args_rtx;
9491
9492 if (targetm.calls.must_pass_in_stack (mode, type))
9493 first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
9494 }
9495
9496 set = get_varargs_alias_set ();
9497 if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
9498 && cfun->va_list_gpr_size)
9499 {
9500 int nregs = GP_ARG_NUM_REG - first_reg_offset;
9501
9502 if (va_list_gpr_counter_field)
9503 {
9504 /* V4 va_list_gpr_size counts number of registers needed. */
9505 if (nregs > cfun->va_list_gpr_size)
9506 nregs = cfun->va_list_gpr_size;
9507 }
9508 else
9509 {
9510 /* char * va_list instead counts number of bytes needed. */
9511 if (nregs > cfun->va_list_gpr_size / reg_size)
9512 nregs = cfun->va_list_gpr_size / reg_size;
9513 }
9514
9515 mem = gen_rtx_MEM (BLKmode,
9516 plus_constant (save_area,
9517 first_reg_offset * reg_size));
9518 MEM_NOTRAP_P (mem) = 1;
9519 set_mem_alias_set (mem, set);
9520 set_mem_align (mem, BITS_PER_WORD);
9521
9522 rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
9523 nregs);
9524 }
9525
9526 /* Save FP registers if needed. */
9527 if (DEFAULT_ABI == ABI_V4
9528 && TARGET_HARD_FLOAT && TARGET_FPRS
9529 && ! no_rtl
9530 && next_cum.fregno <= FP_ARG_V4_MAX_REG
9531 && cfun->va_list_fpr_size)
9532 {
9533 int fregno = next_cum.fregno, nregs;
9534 rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
9535 rtx lab = gen_label_rtx ();
9536 int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
9537 * UNITS_PER_FP_WORD);
9538
9539 emit_jump_insn
9540 (gen_rtx_SET (VOIDmode,
9541 pc_rtx,
9542 gen_rtx_IF_THEN_ELSE (VOIDmode,
9543 gen_rtx_NE (VOIDmode, cr1,
9544 const0_rtx),
9545 gen_rtx_LABEL_REF (VOIDmode, lab),
9546 pc_rtx)));
9547
9548 for (nregs = 0;
9549 fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
9550 fregno++, off += UNITS_PER_FP_WORD, nregs++)
9551 {
9552 mem = gen_rtx_MEM ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9553 ? DFmode : SFmode,
9554 plus_constant (save_area, off));
9555 MEM_NOTRAP_P (mem) = 1;
9556 set_mem_alias_set (mem, set);
9557 set_mem_align (mem, GET_MODE_ALIGNMENT (
9558 (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9559 ? DFmode : SFmode));
9560 emit_move_insn (mem, gen_rtx_REG (
9561 (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
9562 ? DFmode : SFmode, fregno));
9563 }
9564
9565 emit_label (lab);
9566 }
9567 }
9568
9569 /* Create the va_list data type. */
9570
9571 static tree
9572 rs6000_build_builtin_va_list (void)
9573 {
9574 tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
9575
9576 /* For AIX, prefer 'char *' because that's what the system
9577 header files like. */
9578 if (DEFAULT_ABI != ABI_V4)
9579 return build_pointer_type (char_type_node);
9580
9581 record = (*lang_hooks.types.make_type) (RECORD_TYPE);
9582 type_decl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
9583 get_identifier ("__va_list_tag"), record);
9584
9585 f_gpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("gpr"),
9586 unsigned_char_type_node);
9587 f_fpr = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("fpr"),
9588 unsigned_char_type_node);
9589 /* Give the two bytes of padding a name, so that -Wpadded won't warn on
9590 every user file. */
9591 f_res = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9592 get_identifier ("reserved"), short_unsigned_type_node);
9593 f_ovf = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9594 get_identifier ("overflow_arg_area"),
9595 ptr_type_node);
9596 f_sav = build_decl (BUILTINS_LOCATION, FIELD_DECL,
9597 get_identifier ("reg_save_area"),
9598 ptr_type_node);
9599
9600 va_list_gpr_counter_field = f_gpr;
9601 va_list_fpr_counter_field = f_fpr;
9602
9603 DECL_FIELD_CONTEXT (f_gpr) = record;
9604 DECL_FIELD_CONTEXT (f_fpr) = record;
9605 DECL_FIELD_CONTEXT (f_res) = record;
9606 DECL_FIELD_CONTEXT (f_ovf) = record;
9607 DECL_FIELD_CONTEXT (f_sav) = record;
9608
9609 TYPE_STUB_DECL (record) = type_decl;
9610 TYPE_NAME (record) = type_decl;
9611 TYPE_FIELDS (record) = f_gpr;
9612 DECL_CHAIN (f_gpr) = f_fpr;
9613 DECL_CHAIN (f_fpr) = f_res;
9614 DECL_CHAIN (f_res) = f_ovf;
9615 DECL_CHAIN (f_ovf) = f_sav;
9616
9617 layout_type (record);
9618
9619 /* The correct type is an array type of one element. */
9620 return build_array_type (record, build_index_type (size_zero_node));
9621 }
9622
9623 /* Implement va_start. */
9624
9625 static void
9626 rs6000_va_start (tree valist, rtx nextarg)
9627 {
9628 HOST_WIDE_INT words, n_gpr, n_fpr;
9629 tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
9630 tree gpr, fpr, ovf, sav, t;
9631
9632 /* Only SVR4 needs something special. */
9633 if (DEFAULT_ABI != ABI_V4)
9634 {
9635 std_expand_builtin_va_start (valist, nextarg);
9636 return;
9637 }
9638
9639 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
9640 f_fpr = DECL_CHAIN (f_gpr);
9641 f_res = DECL_CHAIN (f_fpr);
9642 f_ovf = DECL_CHAIN (f_res);
9643 f_sav = DECL_CHAIN (f_ovf);
9644
9645 valist = build_simple_mem_ref (valist);
9646 gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
9647 fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
9648 f_fpr, NULL_TREE);
9649 ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
9650 f_ovf, NULL_TREE);
9651 sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
9652 f_sav, NULL_TREE);
9653
9654 /* Count number of gp and fp argument registers used. */
9655 words = crtl->args.info.words;
9656 n_gpr = MIN (crtl->args.info.sysv_gregno - GP_ARG_MIN_REG,
9657 GP_ARG_NUM_REG);
9658 n_fpr = MIN (crtl->args.info.fregno - FP_ARG_MIN_REG,
9659 FP_ARG_NUM_REG);
9660
9661 if (TARGET_DEBUG_ARG)
9662 fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
9663 HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
9664 words, n_gpr, n_fpr);
9665
9666 if (cfun->va_list_gpr_size)
9667 {
9668 t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
9669 build_int_cst (NULL_TREE, n_gpr));
9670 TREE_SIDE_EFFECTS (t) = 1;
9671 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9672 }
9673
9674 if (cfun->va_list_fpr_size)
9675 {
9676 t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
9677 build_int_cst (NULL_TREE, n_fpr));
9678 TREE_SIDE_EFFECTS (t) = 1;
9679 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9680
9681 #ifdef HAVE_AS_GNU_ATTRIBUTE
9682 if (call_ABI_of_interest (cfun->decl))
9683 rs6000_passes_float = true;
9684 #endif
9685 }
9686
9687 /* Find the overflow area. */
9688 t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
9689 if (words != 0)
9690 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), t,
9691 size_int (words * UNITS_PER_WORD));
9692 t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
9693 TREE_SIDE_EFFECTS (t) = 1;
9694 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9695
9696 /* If there were no va_arg invocations, don't set up the register
9697 save area. */
9698 if (!cfun->va_list_gpr_size
9699 && !cfun->va_list_fpr_size
9700 && n_gpr < GP_ARG_NUM_REG
9701 && n_fpr < FP_ARG_V4_MAX_REG)
9702 return;
9703
9704 /* Find the register save area. */
9705 t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
9706 if (cfun->machine->varargs_save_offset)
9707 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (sav), t,
9708 size_int (cfun->machine->varargs_save_offset));
9709 t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
9710 TREE_SIDE_EFFECTS (t) = 1;
9711 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
9712 }
9713
9714 /* Implement va_arg. */
9715
9716 tree
9717 rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
9718 gimple_seq *post_p)
9719 {
9720 tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
9721 tree gpr, fpr, ovf, sav, reg, t, u;
9722 int size, rsize, n_reg, sav_ofs, sav_scale;
9723 tree lab_false, lab_over, addr;
9724 int align;
9725 tree ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
9726 int regalign = 0;
9727 gimple stmt;
9728
9729 if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
9730 {
9731 t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
9732 return build_va_arg_indirect_ref (t);
9733 }
9734
9735 /* We need to deal with the fact that the darwin ppc64 ABI is defined by an
9736 earlier version of gcc, with the property that it always applied alignment
9737 adjustments to the va-args (even for zero-sized types). The cheapest way
9738 to deal with this is to replicate the effect of the part of
9739 std_gimplify_va_arg_expr that carries out the align adjust, for the case
9740 of relevance.
9741 We don't need to check for pass-by-reference because of the test above.
9742 We can return a simplifed answer, since we know there's no offset to add. */
9743
9744 if (TARGET_MACHO
9745 && rs6000_darwin64_abi
9746 && integer_zerop (TYPE_SIZE (type)))
9747 {
9748 unsigned HOST_WIDE_INT align, boundary;
9749 tree valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
9750 align = PARM_BOUNDARY / BITS_PER_UNIT;
9751 boundary = rs6000_function_arg_boundary (TYPE_MODE (type), type);
9752 if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
9753 boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
9754 boundary /= BITS_PER_UNIT;
9755 if (boundary > align)
9756 {
9757 tree t ;
9758 /* This updates arg ptr by the amount that would be necessary
9759 to align the zero-sized (but not zero-alignment) item. */
9760 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
9761 fold_build2 (POINTER_PLUS_EXPR,
9762 TREE_TYPE (valist),
9763 valist_tmp, size_int (boundary - 1)));
9764 gimplify_and_add (t, pre_p);
9765
9766 t = fold_convert (sizetype, valist_tmp);
9767 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
9768 fold_convert (TREE_TYPE (valist),
9769 fold_build2 (BIT_AND_EXPR, sizetype, t,
9770 size_int (-boundary))));
9771 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
9772 gimplify_and_add (t, pre_p);
9773 }
9774 /* Since it is zero-sized there's no increment for the item itself. */
9775 valist_tmp = fold_convert (build_pointer_type (type), valist_tmp);
9776 return build_va_arg_indirect_ref (valist_tmp);
9777 }
9778
9779 if (DEFAULT_ABI != ABI_V4)
9780 {
9781 if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
9782 {
9783 tree elem_type = TREE_TYPE (type);
9784 enum machine_mode elem_mode = TYPE_MODE (elem_type);
9785 int elem_size = GET_MODE_SIZE (elem_mode);
9786
9787 if (elem_size < UNITS_PER_WORD)
9788 {
9789 tree real_part, imag_part;
9790 gimple_seq post = NULL;
9791
9792 real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
9793 &post);
9794 /* Copy the value into a temporary, lest the formal temporary
9795 be reused out from under us. */
9796 real_part = get_initialized_tmp_var (real_part, pre_p, &post);
9797 gimple_seq_add_seq (pre_p, post);
9798
9799 imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
9800 post_p);
9801
9802 return build2 (COMPLEX_EXPR, type, real_part, imag_part);
9803 }
9804 }
9805
9806 return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
9807 }
9808
9809 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
9810 f_fpr = DECL_CHAIN (f_gpr);
9811 f_res = DECL_CHAIN (f_fpr);
9812 f_ovf = DECL_CHAIN (f_res);
9813 f_sav = DECL_CHAIN (f_ovf);
9814
9815 valist = build_va_arg_indirect_ref (valist);
9816 gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
9817 fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), unshare_expr (valist),
9818 f_fpr, NULL_TREE);
9819 ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), unshare_expr (valist),
9820 f_ovf, NULL_TREE);
9821 sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), unshare_expr (valist),
9822 f_sav, NULL_TREE);
9823
9824 size = int_size_in_bytes (type);
9825 rsize = (size + 3) / 4;
9826 align = 1;
9827
9828 if (TARGET_HARD_FLOAT && TARGET_FPRS
9829 && ((TARGET_SINGLE_FLOAT && TYPE_MODE (type) == SFmode)
9830 || (TARGET_DOUBLE_FLOAT
9831 && (TYPE_MODE (type) == DFmode
9832 || TYPE_MODE (type) == TFmode
9833 || TYPE_MODE (type) == SDmode
9834 || TYPE_MODE (type) == DDmode
9835 || TYPE_MODE (type) == TDmode))))
9836 {
9837 /* FP args go in FP registers, if present. */
9838 reg = fpr;
9839 n_reg = (size + 7) / 8;
9840 sav_ofs = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4) * 4;
9841 sav_scale = ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? 8 : 4);
9842 if (TYPE_MODE (type) != SFmode && TYPE_MODE (type) != SDmode)
9843 align = 8;
9844 }
9845 else
9846 {
9847 /* Otherwise into GP registers. */
9848 reg = gpr;
9849 n_reg = rsize;
9850 sav_ofs = 0;
9851 sav_scale = 4;
9852 if (n_reg == 2)
9853 align = 8;
9854 }
9855
9856 /* Pull the value out of the saved registers.... */
9857
9858 lab_over = NULL;
9859 addr = create_tmp_var (ptr_type_node, "addr");
9860
9861 /* AltiVec vectors never go in registers when -mabi=altivec. */
9862 if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
9863 align = 16;
9864 else
9865 {
9866 lab_false = create_artificial_label (input_location);
9867 lab_over = create_artificial_label (input_location);
9868
9869 /* Long long and SPE vectors are aligned in the registers.
9870 As are any other 2 gpr item such as complex int due to a
9871 historical mistake. */
9872 u = reg;
9873 if (n_reg == 2 && reg == gpr)
9874 {
9875 regalign = 1;
9876 u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9877 build_int_cst (TREE_TYPE (reg), n_reg - 1));
9878 u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg),
9879 unshare_expr (reg), u);
9880 }
9881 /* _Decimal128 is passed in even/odd fpr pairs; the stored
9882 reg number is 0 for f1, so we want to make it odd. */
9883 else if (reg == fpr && TYPE_MODE (type) == TDmode)
9884 {
9885 t = build2 (BIT_IOR_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9886 build_int_cst (TREE_TYPE (reg), 1));
9887 u = build2 (MODIFY_EXPR, void_type_node, unshare_expr (reg), t);
9888 }
9889
9890 t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
9891 t = build2 (GE_EXPR, boolean_type_node, u, t);
9892 u = build1 (GOTO_EXPR, void_type_node, lab_false);
9893 t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
9894 gimplify_and_add (t, pre_p);
9895
9896 t = sav;
9897 if (sav_ofs)
9898 t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, size_int (sav_ofs));
9899
9900 u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
9901 build_int_cst (TREE_TYPE (reg), n_reg));
9902 u = fold_convert (sizetype, u);
9903 u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
9904 t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t, u);
9905
9906 /* _Decimal32 varargs are located in the second word of the 64-bit
9907 FP register for 32-bit binaries. */
9908 if (!TARGET_POWERPC64
9909 && TARGET_HARD_FLOAT && TARGET_FPRS
9910 && TYPE_MODE (type) == SDmode)
9911 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
9912
9913 gimplify_assign (addr, t, pre_p);
9914
9915 gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
9916
9917 stmt = gimple_build_label (lab_false);
9918 gimple_seq_add_stmt (pre_p, stmt);
9919
9920 if ((n_reg == 2 && !regalign) || n_reg > 2)
9921 {
9922 /* Ensure that we don't find any more args in regs.
9923 Alignment has taken care of for special cases. */
9924 gimplify_assign (reg, build_int_cst (TREE_TYPE (reg), 8), pre_p);
9925 }
9926 }
9927
9928 /* ... otherwise out of the overflow area. */
9929
9930 /* Care for on-stack alignment if needed. */
9931 t = ovf;
9932 if (align != 1)
9933 {
9934 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (align - 1));
9935 t = fold_convert (sizetype, t);
9936 t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
9937 size_int (-align));
9938 t = fold_convert (TREE_TYPE (ovf), t);
9939 }
9940 gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
9941
9942 gimplify_assign (unshare_expr (addr), t, pre_p);
9943
9944 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
9945 gimplify_assign (unshare_expr (ovf), t, pre_p);
9946
9947 if (lab_over)
9948 {
9949 stmt = gimple_build_label (lab_over);
9950 gimple_seq_add_stmt (pre_p, stmt);
9951 }
9952
9953 if (STRICT_ALIGNMENT
9954 && (TYPE_ALIGN (type)
9955 > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align)))
9956 {
9957 /* The value (of type complex double, for example) may not be
9958 aligned in memory in the saved registers, so copy via a
9959 temporary. (This is the same code as used for SPARC.) */
9960 tree tmp = create_tmp_var (type, "va_arg_tmp");
9961 tree dest_addr = build_fold_addr_expr (tmp);
9962
9963 tree copy = build_call_expr (implicit_built_in_decls[BUILT_IN_MEMCPY],
9964 3, dest_addr, addr, size_int (rsize * 4));
9965
9966 gimplify_and_add (copy, pre_p);
9967 addr = dest_addr;
9968 }
9969
9970 addr = fold_convert (ptrtype, addr);
9971 return build_va_arg_indirect_ref (addr);
9972 }
9973
9974 /* Builtins. */
9975
9976 static void
9977 def_builtin (int mask, const char *name, tree type, int code)
9978 {
9979 if ((mask & target_flags) || TARGET_PAIRED_FLOAT)
9980 {
9981 tree t;
9982 if (rs6000_builtin_decls[code])
9983 fatal_error ("internal error: builtin function to %s already processed",
9984 name);
9985
9986 rs6000_builtin_decls[code] = t =
9987 add_builtin_function (name, type, code, BUILT_IN_MD,
9988 NULL, NULL_TREE);
9989
9990 gcc_assert (code >= 0 && code < (int)RS6000_BUILTIN_COUNT);
9991 switch (builtin_classify[code])
9992 {
9993 default:
9994 gcc_unreachable ();
9995
9996 /* assume builtin can do anything. */
9997 case RS6000_BTC_MISC:
9998 break;
9999
10000 /* const function, function only depends on the inputs. */
10001 case RS6000_BTC_CONST:
10002 TREE_READONLY (t) = 1;
10003 TREE_NOTHROW (t) = 1;
10004 break;
10005
10006 /* pure function, function can read global memory. */
10007 case RS6000_BTC_PURE:
10008 DECL_PURE_P (t) = 1;
10009 TREE_NOTHROW (t) = 1;
10010 break;
10011
10012 /* Function is a math function. If rounding mode is on, then treat
10013 the function as not reading global memory, but it can have
10014 arbitrary side effects. If it is off, then assume the function is
10015 a const function. This mimics the ATTR_MATHFN_FPROUNDING
10016 attribute in builtin-attribute.def that is used for the math
10017 functions. */
10018 case RS6000_BTC_FP_PURE:
10019 TREE_NOTHROW (t) = 1;
10020 if (flag_rounding_math)
10021 {
10022 DECL_PURE_P (t) = 1;
10023 DECL_IS_NOVOPS (t) = 1;
10024 }
10025 else
10026 TREE_READONLY (t) = 1;
10027 break;
10028 }
10029 }
10030 }
10031
10032 /* Simple ternary operations: VECd = foo (VECa, VECb, VECc). */
10033
10034 static const struct builtin_description bdesc_3arg[] =
10035 {
10036 { MASK_ALTIVEC, CODE_FOR_fmav4sf4, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
10037 { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
10038 { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
10039 { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
10040 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
10041 { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
10042 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
10043 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
10044 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
10045 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
10046 { MASK_ALTIVEC, CODE_FOR_nfmsv4sf4, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
10047 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2df, "__builtin_altivec_vperm_2df", ALTIVEC_BUILTIN_VPERM_2DF },
10048 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2di, "__builtin_altivec_vperm_2di", ALTIVEC_BUILTIN_VPERM_2DI },
10049 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
10050 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
10051 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
10052 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
10053 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v2di_uns, "__builtin_altivec_vperm_2di_uns", ALTIVEC_BUILTIN_VPERM_2DI_UNS },
10054 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si_uns, "__builtin_altivec_vperm_4si_uns", ALTIVEC_BUILTIN_VPERM_4SI_UNS },
10055 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi_uns, "__builtin_altivec_vperm_8hi_uns", ALTIVEC_BUILTIN_VPERM_8HI_UNS },
10056 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_altivec_vperm_16qi_uns", ALTIVEC_BUILTIN_VPERM_16QI_UNS },
10057 { MASK_ALTIVEC, CODE_FOR_vector_select_v4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
10058 { MASK_ALTIVEC, CODE_FOR_vector_select_v4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
10059 { MASK_ALTIVEC, CODE_FOR_vector_select_v8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
10060 { MASK_ALTIVEC, CODE_FOR_vector_select_v16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
10061 { MASK_ALTIVEC, CODE_FOR_vector_select_v2df, "__builtin_altivec_vsel_2df", ALTIVEC_BUILTIN_VSEL_2DF },
10062 { MASK_ALTIVEC, CODE_FOR_vector_select_v2di, "__builtin_altivec_vsel_2di", ALTIVEC_BUILTIN_VSEL_2DI },
10063 { MASK_ALTIVEC, CODE_FOR_vector_select_v4si_uns, "__builtin_altivec_vsel_4si_uns", ALTIVEC_BUILTIN_VSEL_4SI_UNS },
10064 { MASK_ALTIVEC, CODE_FOR_vector_select_v8hi_uns, "__builtin_altivec_vsel_8hi_uns", ALTIVEC_BUILTIN_VSEL_8HI_UNS },
10065 { MASK_ALTIVEC, CODE_FOR_vector_select_v16qi_uns, "__builtin_altivec_vsel_16qi_uns", ALTIVEC_BUILTIN_VSEL_16QI_UNS },
10066 { MASK_ALTIVEC, CODE_FOR_vector_select_v2di_uns, "__builtin_altivec_vsel_2di_uns", ALTIVEC_BUILTIN_VSEL_2DI_UNS },
10067 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
10068 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
10069 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
10070 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
10071
10072 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madd", ALTIVEC_BUILTIN_VEC_MADD },
10073 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madds", ALTIVEC_BUILTIN_VEC_MADDS },
10074 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mladd", ALTIVEC_BUILTIN_VEC_MLADD },
10075 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mradds", ALTIVEC_BUILTIN_VEC_MRADDS },
10076 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msum", ALTIVEC_BUILTIN_VEC_MSUM },
10077 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshm", ALTIVEC_BUILTIN_VEC_VMSUMSHM },
10078 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhm", ALTIVEC_BUILTIN_VEC_VMSUMUHM },
10079 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsummbm", ALTIVEC_BUILTIN_VEC_VMSUMMBM },
10080 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumubm", ALTIVEC_BUILTIN_VEC_VMSUMUBM },
10081 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msums", ALTIVEC_BUILTIN_VEC_MSUMS },
10082 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshs", ALTIVEC_BUILTIN_VEC_VMSUMSHS },
10083 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhs", ALTIVEC_BUILTIN_VEC_VMSUMUHS },
10084 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmsub", ALTIVEC_BUILTIN_VEC_NMSUB },
10085 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_perm", ALTIVEC_BUILTIN_VEC_PERM },
10086 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sel", ALTIVEC_BUILTIN_VEC_SEL },
10087
10088 { MASK_VSX, CODE_FOR_fmav2df4, "__builtin_vsx_xvmadddp", VSX_BUILTIN_XVMADDDP },
10089 { MASK_VSX, CODE_FOR_fmsv2df4, "__builtin_vsx_xvmsubdp", VSX_BUILTIN_XVMSUBDP },
10090 { MASK_VSX, CODE_FOR_nfmav2df4, "__builtin_vsx_xvnmadddp", VSX_BUILTIN_XVNMADDDP },
10091 { MASK_VSX, CODE_FOR_nfmsv2df4, "__builtin_vsx_xvnmsubdp", VSX_BUILTIN_XVNMSUBDP },
10092
10093 { MASK_VSX, CODE_FOR_fmav4sf4, "__builtin_vsx_xvmaddsp", VSX_BUILTIN_XVMADDSP },
10094 { MASK_VSX, CODE_FOR_fmsv4sf4, "__builtin_vsx_xvmsubsp", VSX_BUILTIN_XVMSUBSP },
10095 { MASK_VSX, CODE_FOR_nfmav4sf4, "__builtin_vsx_xvnmaddsp", VSX_BUILTIN_XVNMADDSP },
10096 { MASK_VSX, CODE_FOR_nfmsv4sf4, "__builtin_vsx_xvnmsubsp", VSX_BUILTIN_XVNMSUBSP },
10097
10098 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msub", VSX_BUILTIN_VEC_MSUB },
10099 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmadd", VSX_BUILTIN_VEC_NMADD },
10100
10101 { MASK_VSX, CODE_FOR_vector_select_v2di, "__builtin_vsx_xxsel_2di", VSX_BUILTIN_XXSEL_2DI },
10102 { MASK_VSX, CODE_FOR_vector_select_v2df, "__builtin_vsx_xxsel_2df", VSX_BUILTIN_XXSEL_2DF },
10103 { MASK_VSX, CODE_FOR_vector_select_v4sf, "__builtin_vsx_xxsel_4sf", VSX_BUILTIN_XXSEL_4SF },
10104 { MASK_VSX, CODE_FOR_vector_select_v4si, "__builtin_vsx_xxsel_4si", VSX_BUILTIN_XXSEL_4SI },
10105 { MASK_VSX, CODE_FOR_vector_select_v8hi, "__builtin_vsx_xxsel_8hi", VSX_BUILTIN_XXSEL_8HI },
10106 { MASK_VSX, CODE_FOR_vector_select_v16qi, "__builtin_vsx_xxsel_16qi", VSX_BUILTIN_XXSEL_16QI },
10107 { MASK_VSX, CODE_FOR_vector_select_v2di_uns, "__builtin_vsx_xxsel_2di_uns", VSX_BUILTIN_XXSEL_2DI_UNS },
10108 { MASK_VSX, CODE_FOR_vector_select_v4si_uns, "__builtin_vsx_xxsel_4si_uns", VSX_BUILTIN_XXSEL_4SI_UNS },
10109 { MASK_VSX, CODE_FOR_vector_select_v8hi_uns, "__builtin_vsx_xxsel_8hi_uns", VSX_BUILTIN_XXSEL_8HI_UNS },
10110 { MASK_VSX, CODE_FOR_vector_select_v16qi_uns, "__builtin_vsx_xxsel_16qi_uns", VSX_BUILTIN_XXSEL_16QI_UNS },
10111
10112 { MASK_VSX, CODE_FOR_altivec_vperm_v2di, "__builtin_vsx_vperm_2di", VSX_BUILTIN_VPERM_2DI },
10113 { MASK_VSX, CODE_FOR_altivec_vperm_v2df, "__builtin_vsx_vperm_2df", VSX_BUILTIN_VPERM_2DF },
10114 { MASK_VSX, CODE_FOR_altivec_vperm_v4sf, "__builtin_vsx_vperm_4sf", VSX_BUILTIN_VPERM_4SF },
10115 { MASK_VSX, CODE_FOR_altivec_vperm_v4si, "__builtin_vsx_vperm_4si", VSX_BUILTIN_VPERM_4SI },
10116 { MASK_VSX, CODE_FOR_altivec_vperm_v8hi, "__builtin_vsx_vperm_8hi", VSX_BUILTIN_VPERM_8HI },
10117 { MASK_VSX, CODE_FOR_altivec_vperm_v16qi, "__builtin_vsx_vperm_16qi", VSX_BUILTIN_VPERM_16QI },
10118 { MASK_VSX, CODE_FOR_altivec_vperm_v2di_uns, "__builtin_vsx_vperm_2di_uns", VSX_BUILTIN_VPERM_2DI_UNS },
10119 { MASK_VSX, CODE_FOR_altivec_vperm_v4si_uns, "__builtin_vsx_vperm_4si_uns", VSX_BUILTIN_VPERM_4SI_UNS },
10120 { MASK_VSX, CODE_FOR_altivec_vperm_v8hi_uns, "__builtin_vsx_vperm_8hi_uns", VSX_BUILTIN_VPERM_8HI_UNS },
10121 { MASK_VSX, CODE_FOR_altivec_vperm_v16qi_uns, "__builtin_vsx_vperm_16qi_uns", VSX_BUILTIN_VPERM_16QI_UNS },
10122
10123 { MASK_VSX, CODE_FOR_vsx_xxpermdi_v2df, "__builtin_vsx_xxpermdi_2df", VSX_BUILTIN_XXPERMDI_2DF },
10124 { MASK_VSX, CODE_FOR_vsx_xxpermdi_v2di, "__builtin_vsx_xxpermdi_2di", VSX_BUILTIN_XXPERMDI_2DI },
10125 { MASK_VSX, CODE_FOR_vsx_xxpermdi_v4sf, "__builtin_vsx_xxpermdi_4sf", VSX_BUILTIN_XXPERMDI_4SF },
10126 { MASK_VSX, CODE_FOR_vsx_xxpermdi_v4si, "__builtin_vsx_xxpermdi_4si", VSX_BUILTIN_XXPERMDI_4SI },
10127 { MASK_VSX, CODE_FOR_vsx_xxpermdi_v8hi, "__builtin_vsx_xxpermdi_8hi", VSX_BUILTIN_XXPERMDI_8HI },
10128 { MASK_VSX, CODE_FOR_vsx_xxpermdi_v16qi, "__builtin_vsx_xxpermdi_16qi", VSX_BUILTIN_XXPERMDI_16QI },
10129 { MASK_VSX, CODE_FOR_nothing, "__builtin_vsx_xxpermdi", VSX_BUILTIN_VEC_XXPERMDI },
10130 { MASK_VSX, CODE_FOR_vsx_set_v2df, "__builtin_vsx_set_2df", VSX_BUILTIN_SET_2DF },
10131 { MASK_VSX, CODE_FOR_vsx_set_v2di, "__builtin_vsx_set_2di", VSX_BUILTIN_SET_2DI },
10132
10133 { MASK_VSX, CODE_FOR_vsx_xxsldwi_v2di, "__builtin_vsx_xxsldwi_2di", VSX_BUILTIN_XXSLDWI_2DI },
10134 { MASK_VSX, CODE_FOR_vsx_xxsldwi_v2df, "__builtin_vsx_xxsldwi_2df", VSX_BUILTIN_XXSLDWI_2DF },
10135 { MASK_VSX, CODE_FOR_vsx_xxsldwi_v4sf, "__builtin_vsx_xxsldwi_4sf", VSX_BUILTIN_XXSLDWI_4SF },
10136 { MASK_VSX, CODE_FOR_vsx_xxsldwi_v4si, "__builtin_vsx_xxsldwi_4si", VSX_BUILTIN_XXSLDWI_4SI },
10137 { MASK_VSX, CODE_FOR_vsx_xxsldwi_v8hi, "__builtin_vsx_xxsldwi_8hi", VSX_BUILTIN_XXSLDWI_8HI },
10138 { MASK_VSX, CODE_FOR_vsx_xxsldwi_v16qi, "__builtin_vsx_xxsldwi_16qi", VSX_BUILTIN_XXSLDWI_16QI },
10139 { MASK_VSX, CODE_FOR_nothing, "__builtin_vsx_xxsldwi", VSX_BUILTIN_VEC_XXSLDWI },
10140
10141 { 0, CODE_FOR_fmsv2sf4, "__builtin_paired_msub", PAIRED_BUILTIN_MSUB },
10142 { 0, CODE_FOR_fmav2sf4, "__builtin_paired_madd", PAIRED_BUILTIN_MADD },
10143 { 0, CODE_FOR_paired_madds0, "__builtin_paired_madds0", PAIRED_BUILTIN_MADDS0 },
10144 { 0, CODE_FOR_paired_madds1, "__builtin_paired_madds1", PAIRED_BUILTIN_MADDS1 },
10145 { 0, CODE_FOR_nfmsv2sf4, "__builtin_paired_nmsub", PAIRED_BUILTIN_NMSUB },
10146 { 0, CODE_FOR_nfmav2sf4, "__builtin_paired_nmadd", PAIRED_BUILTIN_NMADD },
10147 { 0, CODE_FOR_paired_sum0, "__builtin_paired_sum0", PAIRED_BUILTIN_SUM0 },
10148 { 0, CODE_FOR_paired_sum1, "__builtin_paired_sum1", PAIRED_BUILTIN_SUM1 },
10149 { 0, CODE_FOR_selv2sf4, "__builtin_paired_selv2sf4", PAIRED_BUILTIN_SELV2SF4 },
10150 };
10151
10152 /* DST operations: void foo (void *, const int, const char). */
10153
10154 static const struct builtin_description bdesc_dst[] =
10155 {
10156 { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
10157 { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
10158 { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
10159 { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT },
10160
10161 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dst", ALTIVEC_BUILTIN_VEC_DST },
10162 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstt", ALTIVEC_BUILTIN_VEC_DSTT },
10163 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstst", ALTIVEC_BUILTIN_VEC_DSTST },
10164 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dststt", ALTIVEC_BUILTIN_VEC_DSTSTT }
10165 };
10166
10167 /* Simple binary operations: VECc = foo (VECa, VECb). */
10168
10169 static struct builtin_description bdesc_2arg[] =
10170 {
10171 { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
10172 { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
10173 { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
10174 { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
10175 { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
10176 { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
10177 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
10178 { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
10179 { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
10180 { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
10181 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
10182 { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
10183 { MASK_ALTIVEC, CODE_FOR_andcv4si3, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
10184 { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
10185 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
10186 { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
10187 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
10188 { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
10189 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
10190 { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
10191 { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
10192 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
10193 { MASK_ALTIVEC, CODE_FOR_vector_eqv16qi, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
10194 { MASK_ALTIVEC, CODE_FOR_vector_eqv8hi, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
10195 { MASK_ALTIVEC, CODE_FOR_vector_eqv4si, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
10196 { MASK_ALTIVEC, CODE_FOR_vector_eqv4sf, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
10197 { MASK_ALTIVEC, CODE_FOR_vector_gev4sf, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
10198 { MASK_ALTIVEC, CODE_FOR_vector_gtuv16qi, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
10199 { MASK_ALTIVEC, CODE_FOR_vector_gtv16qi, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
10200 { MASK_ALTIVEC, CODE_FOR_vector_gtuv8hi, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
10201 { MASK_ALTIVEC, CODE_FOR_vector_gtv8hi, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
10202 { MASK_ALTIVEC, CODE_FOR_vector_gtuv4si, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
10203 { MASK_ALTIVEC, CODE_FOR_vector_gtv4si, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
10204 { MASK_ALTIVEC, CODE_FOR_vector_gtv4sf, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
10205 { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
10206 { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
10207 { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
10208 { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
10209 { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
10210 { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
10211 { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
10212 { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
10213 { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
10214 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
10215 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
10216 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
10217 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
10218 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
10219 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
10220 { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
10221 { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
10222 { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
10223 { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
10224 { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
10225 { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
10226 { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
10227 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
10228 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub_uns", ALTIVEC_BUILTIN_VMULEUB_UNS },
10229 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
10230 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
10231 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh_uns", ALTIVEC_BUILTIN_VMULEUH_UNS },
10232 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
10233 { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
10234 { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub_uns", ALTIVEC_BUILTIN_VMULOUB_UNS },
10235 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
10236 { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
10237 { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh_uns", ALTIVEC_BUILTIN_VMULOUH_UNS },
10238 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
10239 { MASK_ALTIVEC, CODE_FOR_norv4si3, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
10240 { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
10241 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
10242 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
10243 { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
10244 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
10245 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
10246 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
10247 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
10248 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
10249 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
10250 { MASK_ALTIVEC, CODE_FOR_recipv4sf3, "__builtin_altivec_vrecipdivfp", ALTIVEC_BUILTIN_VRECIPFP },
10251 { MASK_ALTIVEC, CODE_FOR_vrotlv16qi3, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
10252 { MASK_ALTIVEC, CODE_FOR_vrotlv8hi3, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
10253 { MASK_ALTIVEC, CODE_FOR_vrotlv4si3, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
10254 { MASK_ALTIVEC, CODE_FOR_vashlv16qi3, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
10255 { MASK_ALTIVEC, CODE_FOR_vashlv8hi3, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
10256 { MASK_ALTIVEC, CODE_FOR_vashlv4si3, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
10257 { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
10258 { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
10259 { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
10260 { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
10261 { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
10262 { MASK_ALTIVEC, CODE_FOR_vlshrv16qi3, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
10263 { MASK_ALTIVEC, CODE_FOR_vlshrv8hi3, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
10264 { MASK_ALTIVEC, CODE_FOR_vlshrv4si3, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
10265 { MASK_ALTIVEC, CODE_FOR_vashrv16qi3, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
10266 { MASK_ALTIVEC, CODE_FOR_vashrv8hi3, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
10267 { MASK_ALTIVEC, CODE_FOR_vashrv4si3, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
10268 { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
10269 { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
10270 { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
10271 { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
10272 { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
10273 { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
10274 { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
10275 { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
10276 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
10277 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
10278 { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
10279 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
10280 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
10281 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
10282 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
10283 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
10284 { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
10285 { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
10286 { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
10287 { MASK_ALTIVEC, CODE_FOR_vector_copysignv4sf3, "__builtin_altivec_copysignfp", ALTIVEC_BUILTIN_COPYSIGN_V4SF },
10288
10289 { MASK_VSX, CODE_FOR_addv2df3, "__builtin_vsx_xvadddp", VSX_BUILTIN_XVADDDP },
10290 { MASK_VSX, CODE_FOR_subv2df3, "__builtin_vsx_xvsubdp", VSX_BUILTIN_XVSUBDP },
10291 { MASK_VSX, CODE_FOR_mulv2df3, "__builtin_vsx_xvmuldp", VSX_BUILTIN_XVMULDP },
10292 { MASK_VSX, CODE_FOR_divv2df3, "__builtin_vsx_xvdivdp", VSX_BUILTIN_XVDIVDP },
10293 { MASK_VSX, CODE_FOR_recipv2df3, "__builtin_vsx_xvrecipdivdp", VSX_BUILTIN_RECIP_V2DF },
10294 { MASK_VSX, CODE_FOR_sminv2df3, "__builtin_vsx_xvmindp", VSX_BUILTIN_XVMINDP },
10295 { MASK_VSX, CODE_FOR_smaxv2df3, "__builtin_vsx_xvmaxdp", VSX_BUILTIN_XVMAXDP },
10296 { MASK_VSX, CODE_FOR_vsx_tdivv2df3_fe, "__builtin_vsx_xvtdivdp_fe", VSX_BUILTIN_XVTDIVDP_FE },
10297 { MASK_VSX, CODE_FOR_vsx_tdivv2df3_fg, "__builtin_vsx_xvtdivdp_fg", VSX_BUILTIN_XVTDIVDP_FG },
10298 { MASK_VSX, CODE_FOR_vector_eqv2df, "__builtin_vsx_xvcmpeqdp", VSX_BUILTIN_XVCMPEQDP },
10299 { MASK_VSX, CODE_FOR_vector_gtv2df, "__builtin_vsx_xvcmpgtdp", VSX_BUILTIN_XVCMPGTDP },
10300 { MASK_VSX, CODE_FOR_vector_gev2df, "__builtin_vsx_xvcmpgedp", VSX_BUILTIN_XVCMPGEDP },
10301
10302 { MASK_VSX, CODE_FOR_addv4sf3, "__builtin_vsx_xvaddsp", VSX_BUILTIN_XVADDSP },
10303 { MASK_VSX, CODE_FOR_subv4sf3, "__builtin_vsx_xvsubsp", VSX_BUILTIN_XVSUBSP },
10304 { MASK_VSX, CODE_FOR_mulv4sf3, "__builtin_vsx_xvmulsp", VSX_BUILTIN_XVMULSP },
10305 { MASK_VSX, CODE_FOR_divv4sf3, "__builtin_vsx_xvdivsp", VSX_BUILTIN_XVDIVSP },
10306 { MASK_VSX, CODE_FOR_recipv4sf3, "__builtin_vsx_xvrecipdivsp", VSX_BUILTIN_RECIP_V4SF },
10307 { MASK_VSX, CODE_FOR_sminv4sf3, "__builtin_vsx_xvminsp", VSX_BUILTIN_XVMINSP },
10308 { MASK_VSX, CODE_FOR_smaxv4sf3, "__builtin_vsx_xvmaxsp", VSX_BUILTIN_XVMAXSP },
10309 { MASK_VSX, CODE_FOR_vsx_tdivv4sf3_fe, "__builtin_vsx_xvtdivsp_fe", VSX_BUILTIN_XVTDIVSP_FE },
10310 { MASK_VSX, CODE_FOR_vsx_tdivv4sf3_fg, "__builtin_vsx_xvtdivsp_fg", VSX_BUILTIN_XVTDIVSP_FG },
10311 { MASK_VSX, CODE_FOR_vector_eqv4sf, "__builtin_vsx_xvcmpeqsp", VSX_BUILTIN_XVCMPEQSP },
10312 { MASK_VSX, CODE_FOR_vector_gtv4sf, "__builtin_vsx_xvcmpgtsp", VSX_BUILTIN_XVCMPGTSP },
10313 { MASK_VSX, CODE_FOR_vector_gev4sf, "__builtin_vsx_xvcmpgesp", VSX_BUILTIN_XVCMPGESP },
10314
10315 { MASK_VSX, CODE_FOR_smindf3, "__builtin_vsx_xsmindp", VSX_BUILTIN_XSMINDP },
10316 { MASK_VSX, CODE_FOR_smaxdf3, "__builtin_vsx_xsmaxdp", VSX_BUILTIN_XSMAXDP },
10317 { MASK_VSX, CODE_FOR_vsx_tdivdf3_fe, "__builtin_vsx_xstdivdp_fe", VSX_BUILTIN_XSTDIVDP_FE },
10318 { MASK_VSX, CODE_FOR_vsx_tdivdf3_fg, "__builtin_vsx_xstdivdp_fg", VSX_BUILTIN_XSTDIVDP_FG },
10319 { MASK_VSX, CODE_FOR_vector_copysignv2df3, "__builtin_vsx_cpsgndp", VSX_BUILTIN_CPSGNDP },
10320 { MASK_VSX, CODE_FOR_vector_copysignv4sf3, "__builtin_vsx_cpsgnsp", VSX_BUILTIN_CPSGNSP },
10321
10322 { MASK_VSX, CODE_FOR_vsx_concat_v2df, "__builtin_vsx_concat_2df", VSX_BUILTIN_CONCAT_2DF },
10323 { MASK_VSX, CODE_FOR_vsx_concat_v2di, "__builtin_vsx_concat_2di", VSX_BUILTIN_CONCAT_2DI },
10324 { MASK_VSX, CODE_FOR_vsx_splat_v2df, "__builtin_vsx_splat_2df", VSX_BUILTIN_SPLAT_2DF },
10325 { MASK_VSX, CODE_FOR_vsx_splat_v2di, "__builtin_vsx_splat_2di", VSX_BUILTIN_SPLAT_2DI },
10326 { MASK_VSX, CODE_FOR_vsx_xxmrghw_v4sf, "__builtin_vsx_xxmrghw", VSX_BUILTIN_XXMRGHW_4SF },
10327 { MASK_VSX, CODE_FOR_vsx_xxmrghw_v4si, "__builtin_vsx_xxmrghw_4si", VSX_BUILTIN_XXMRGHW_4SI },
10328 { MASK_VSX, CODE_FOR_vsx_xxmrglw_v4sf, "__builtin_vsx_xxmrglw", VSX_BUILTIN_XXMRGLW_4SF },
10329 { MASK_VSX, CODE_FOR_vsx_xxmrglw_v4si, "__builtin_vsx_xxmrglw_4si", VSX_BUILTIN_XXMRGLW_4SI },
10330 { MASK_VSX, CODE_FOR_vec_interleave_lowv2df, "__builtin_vsx_mergel_2df", VSX_BUILTIN_VEC_MERGEL_V2DF },
10331 { MASK_VSX, CODE_FOR_vec_interleave_lowv2di, "__builtin_vsx_mergel_2di", VSX_BUILTIN_VEC_MERGEL_V2DI },
10332 { MASK_VSX, CODE_FOR_vec_interleave_highv2df, "__builtin_vsx_mergeh_2df", VSX_BUILTIN_VEC_MERGEH_V2DF },
10333 { MASK_VSX, CODE_FOR_vec_interleave_highv2di, "__builtin_vsx_mergeh_2di", VSX_BUILTIN_VEC_MERGEH_V2DI },
10334
10335 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_add", ALTIVEC_BUILTIN_VEC_ADD },
10336 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vaddfp", ALTIVEC_BUILTIN_VEC_VADDFP },
10337 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduwm", ALTIVEC_BUILTIN_VEC_VADDUWM },
10338 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhm", ALTIVEC_BUILTIN_VEC_VADDUHM },
10339 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubm", ALTIVEC_BUILTIN_VEC_VADDUBM },
10340 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_addc", ALTIVEC_BUILTIN_VEC_ADDC },
10341 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_adds", ALTIVEC_BUILTIN_VEC_ADDS },
10342 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsws", ALTIVEC_BUILTIN_VEC_VADDSWS },
10343 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduws", ALTIVEC_BUILTIN_VEC_VADDUWS },
10344 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddshs", ALTIVEC_BUILTIN_VEC_VADDSHS },
10345 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhs", ALTIVEC_BUILTIN_VEC_VADDUHS },
10346 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsbs", ALTIVEC_BUILTIN_VEC_VADDSBS },
10347 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubs", ALTIVEC_BUILTIN_VEC_VADDUBS },
10348 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_and", ALTIVEC_BUILTIN_VEC_AND },
10349 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_andc", ALTIVEC_BUILTIN_VEC_ANDC },
10350 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_avg", ALTIVEC_BUILTIN_VEC_AVG },
10351 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsw", ALTIVEC_BUILTIN_VEC_VAVGSW },
10352 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguw", ALTIVEC_BUILTIN_VEC_VAVGUW },
10353 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsh", ALTIVEC_BUILTIN_VEC_VAVGSH },
10354 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguh", ALTIVEC_BUILTIN_VEC_VAVGUH },
10355 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsb", ALTIVEC_BUILTIN_VEC_VAVGSB },
10356 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgub", ALTIVEC_BUILTIN_VEC_VAVGUB },
10357 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpb", ALTIVEC_BUILTIN_VEC_CMPB },
10358 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpeq", ALTIVEC_BUILTIN_VEC_CMPEQ },
10359 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpeqfp", ALTIVEC_BUILTIN_VEC_VCMPEQFP },
10360 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequw", ALTIVEC_BUILTIN_VEC_VCMPEQUW },
10361 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequh", ALTIVEC_BUILTIN_VEC_VCMPEQUH },
10362 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequb", ALTIVEC_BUILTIN_VEC_VCMPEQUB },
10363 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpge", ALTIVEC_BUILTIN_VEC_CMPGE },
10364 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpgt", ALTIVEC_BUILTIN_VEC_CMPGT },
10365 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtfp", ALTIVEC_BUILTIN_VEC_VCMPGTFP },
10366 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsw", ALTIVEC_BUILTIN_VEC_VCMPGTSW },
10367 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuw", ALTIVEC_BUILTIN_VEC_VCMPGTUW },
10368 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsh", ALTIVEC_BUILTIN_VEC_VCMPGTSH },
10369 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuh", ALTIVEC_BUILTIN_VEC_VCMPGTUH },
10370 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsb", ALTIVEC_BUILTIN_VEC_VCMPGTSB },
10371 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtub", ALTIVEC_BUILTIN_VEC_VCMPGTUB },
10372 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmple", ALTIVEC_BUILTIN_VEC_CMPLE },
10373 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmplt", ALTIVEC_BUILTIN_VEC_CMPLT },
10374 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_copysign", ALTIVEC_BUILTIN_VEC_COPYSIGN },
10375 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_max", ALTIVEC_BUILTIN_VEC_MAX },
10376 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vmaxfp", ALTIVEC_BUILTIN_VEC_VMAXFP },
10377 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsw", ALTIVEC_BUILTIN_VEC_VMAXSW },
10378 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuw", ALTIVEC_BUILTIN_VEC_VMAXUW },
10379 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsh", ALTIVEC_BUILTIN_VEC_VMAXSH },
10380 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuh", ALTIVEC_BUILTIN_VEC_VMAXUH },
10381 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsb", ALTIVEC_BUILTIN_VEC_VMAXSB },
10382 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxub", ALTIVEC_BUILTIN_VEC_VMAXUB },
10383 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergeh", ALTIVEC_BUILTIN_VEC_MERGEH },
10384 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghw", ALTIVEC_BUILTIN_VEC_VMRGHW },
10385 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghh", ALTIVEC_BUILTIN_VEC_VMRGHH },
10386 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghb", ALTIVEC_BUILTIN_VEC_VMRGHB },
10387 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergel", ALTIVEC_BUILTIN_VEC_MERGEL },
10388 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglw", ALTIVEC_BUILTIN_VEC_VMRGLW },
10389 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglh", ALTIVEC_BUILTIN_VEC_VMRGLH },
10390 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglb", ALTIVEC_BUILTIN_VEC_VMRGLB },
10391 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_min", ALTIVEC_BUILTIN_VEC_MIN },
10392 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vminfp", ALTIVEC_BUILTIN_VEC_VMINFP },
10393 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsw", ALTIVEC_BUILTIN_VEC_VMINSW },
10394 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuw", ALTIVEC_BUILTIN_VEC_VMINUW },
10395 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsh", ALTIVEC_BUILTIN_VEC_VMINSH },
10396 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuh", ALTIVEC_BUILTIN_VEC_VMINUH },
10397 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsb", ALTIVEC_BUILTIN_VEC_VMINSB },
10398 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminub", ALTIVEC_BUILTIN_VEC_VMINUB },
10399 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mule", ALTIVEC_BUILTIN_VEC_MULE },
10400 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleub", ALTIVEC_BUILTIN_VEC_VMULEUB },
10401 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesb", ALTIVEC_BUILTIN_VEC_VMULESB },
10402 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleuh", ALTIVEC_BUILTIN_VEC_VMULEUH },
10403 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesh", ALTIVEC_BUILTIN_VEC_VMULESH },
10404 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mulo", ALTIVEC_BUILTIN_VEC_MULO },
10405 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosh", ALTIVEC_BUILTIN_VEC_VMULOSH },
10406 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulouh", ALTIVEC_BUILTIN_VEC_VMULOUH },
10407 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosb", ALTIVEC_BUILTIN_VEC_VMULOSB },
10408 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuloub", ALTIVEC_BUILTIN_VEC_VMULOUB },
10409 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_nor", ALTIVEC_BUILTIN_VEC_NOR },
10410 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_or", ALTIVEC_BUILTIN_VEC_OR },
10411 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_pack", ALTIVEC_BUILTIN_VEC_PACK },
10412 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwum", ALTIVEC_BUILTIN_VEC_VPKUWUM },
10413 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhum", ALTIVEC_BUILTIN_VEC_VPKUHUM },
10414 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packpx", ALTIVEC_BUILTIN_VEC_PACKPX },
10415 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packs", ALTIVEC_BUILTIN_VEC_PACKS },
10416 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswss", ALTIVEC_BUILTIN_VEC_VPKSWSS },
10417 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwus", ALTIVEC_BUILTIN_VEC_VPKUWUS },
10418 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshss", ALTIVEC_BUILTIN_VEC_VPKSHSS },
10419 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhus", ALTIVEC_BUILTIN_VEC_VPKUHUS },
10420 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packsu", ALTIVEC_BUILTIN_VEC_PACKSU },
10421 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswus", ALTIVEC_BUILTIN_VEC_VPKSWUS },
10422 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshus", ALTIVEC_BUILTIN_VEC_VPKSHUS },
10423 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_recipdiv", ALTIVEC_BUILTIN_VEC_RECIP },
10424 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rl", ALTIVEC_BUILTIN_VEC_RL },
10425 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlw", ALTIVEC_BUILTIN_VEC_VRLW },
10426 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlh", ALTIVEC_BUILTIN_VEC_VRLH },
10427 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlb", ALTIVEC_BUILTIN_VEC_VRLB },
10428 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sl", ALTIVEC_BUILTIN_VEC_SL },
10429 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslw", ALTIVEC_BUILTIN_VEC_VSLW },
10430 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslh", ALTIVEC_BUILTIN_VEC_VSLH },
10431 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslb", ALTIVEC_BUILTIN_VEC_VSLB },
10432 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sll", ALTIVEC_BUILTIN_VEC_SLL },
10433 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_slo", ALTIVEC_BUILTIN_VEC_SLO },
10434 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sr", ALTIVEC_BUILTIN_VEC_SR },
10435 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrw", ALTIVEC_BUILTIN_VEC_VSRW },
10436 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrh", ALTIVEC_BUILTIN_VEC_VSRH },
10437 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrb", ALTIVEC_BUILTIN_VEC_VSRB },
10438 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sra", ALTIVEC_BUILTIN_VEC_SRA },
10439 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsraw", ALTIVEC_BUILTIN_VEC_VSRAW },
10440 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrah", ALTIVEC_BUILTIN_VEC_VSRAH },
10441 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrab", ALTIVEC_BUILTIN_VEC_VSRAB },
10442 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_srl", ALTIVEC_BUILTIN_VEC_SRL },
10443 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sro", ALTIVEC_BUILTIN_VEC_SRO },
10444 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_sub", ALTIVEC_BUILTIN_VEC_SUB },
10445 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vsubfp", ALTIVEC_BUILTIN_VEC_VSUBFP },
10446 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuwm", ALTIVEC_BUILTIN_VEC_VSUBUWM },
10447 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhm", ALTIVEC_BUILTIN_VEC_VSUBUHM },
10448 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububm", ALTIVEC_BUILTIN_VEC_VSUBUBM },
10449 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subc", ALTIVEC_BUILTIN_VEC_SUBC },
10450 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subs", ALTIVEC_BUILTIN_VEC_SUBS },
10451 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsws", ALTIVEC_BUILTIN_VEC_VSUBSWS },
10452 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuws", ALTIVEC_BUILTIN_VEC_VSUBUWS },
10453 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubshs", ALTIVEC_BUILTIN_VEC_VSUBSHS },
10454 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhs", ALTIVEC_BUILTIN_VEC_VSUBUHS },
10455 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsbs", ALTIVEC_BUILTIN_VEC_VSUBSBS },
10456 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububs", ALTIVEC_BUILTIN_VEC_VSUBUBS },
10457 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum4s", ALTIVEC_BUILTIN_VEC_SUM4S },
10458 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4shs", ALTIVEC_BUILTIN_VEC_VSUM4SHS },
10459 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4sbs", ALTIVEC_BUILTIN_VEC_VSUM4SBS },
10460 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4ubs", ALTIVEC_BUILTIN_VEC_VSUM4UBS },
10461 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum2s", ALTIVEC_BUILTIN_VEC_SUM2S },
10462 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sums", ALTIVEC_BUILTIN_VEC_SUMS },
10463 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_xor", ALTIVEC_BUILTIN_VEC_XOR },
10464
10465 { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_mul", VSX_BUILTIN_VEC_MUL },
10466 { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_div", VSX_BUILTIN_VEC_DIV },
10467
10468 { 0, CODE_FOR_paired_divv2sf3, "__builtin_paired_divv2sf3", PAIRED_BUILTIN_DIVV2SF3 },
10469 { 0, CODE_FOR_paired_addv2sf3, "__builtin_paired_addv2sf3", PAIRED_BUILTIN_ADDV2SF3 },
10470 { 0, CODE_FOR_paired_subv2sf3, "__builtin_paired_subv2sf3", PAIRED_BUILTIN_SUBV2SF3 },
10471 { 0, CODE_FOR_paired_mulv2sf3, "__builtin_paired_mulv2sf3", PAIRED_BUILTIN_MULV2SF3 },
10472 { 0, CODE_FOR_paired_muls0, "__builtin_paired_muls0", PAIRED_BUILTIN_MULS0 },
10473 { 0, CODE_FOR_paired_muls1, "__builtin_paired_muls1", PAIRED_BUILTIN_MULS1 },
10474 { 0, CODE_FOR_paired_merge00, "__builtin_paired_merge00", PAIRED_BUILTIN_MERGE00 },
10475 { 0, CODE_FOR_paired_merge01, "__builtin_paired_merge01", PAIRED_BUILTIN_MERGE01 },
10476 { 0, CODE_FOR_paired_merge10, "__builtin_paired_merge10", PAIRED_BUILTIN_MERGE10 },
10477 { 0, CODE_FOR_paired_merge11, "__builtin_paired_merge11", PAIRED_BUILTIN_MERGE11 },
10478
10479 /* Place holder, leave as first spe builtin. */
10480 { 0, CODE_FOR_addv2si3, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
10481 { 0, CODE_FOR_andv2si3, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
10482 { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
10483 { 0, CODE_FOR_divv2si3, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
10484 { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
10485 { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
10486 { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
10487 { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
10488 { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
10489 { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
10490 { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
10491 { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
10492 { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
10493 { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
10494 { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
10495 { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
10496 { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
10497 { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
10498 { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
10499 { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
10500 { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
10501 { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
10502 { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
10503 { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
10504 { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
10505 { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
10506 { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
10507 { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
10508 { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
10509 { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
10510 { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
10511 { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
10512 { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
10513 { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
10514 { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
10515 { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
10516 { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
10517 { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
10518 { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
10519 { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
10520 { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
10521 { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
10522 { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
10523 { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
10524 { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
10525 { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
10526 { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
10527 { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
10528 { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
10529 { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
10530 { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
10531 { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
10532 { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
10533 { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
10534 { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
10535 { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
10536 { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
10537 { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
10538 { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
10539 { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
10540 { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
10541 { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
10542 { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
10543 { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
10544 { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
10545 { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
10546 { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
10547 { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
10548 { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
10549 { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
10550 { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
10551 { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
10552 { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
10553 { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
10554 { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
10555 { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
10556 { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
10557 { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
10558 { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
10559 { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
10560 { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
10561 { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
10562 { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
10563 { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
10564 { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
10565 { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
10566 { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
10567 { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
10568 { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
10569 { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
10570 { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
10571 { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
10572 { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
10573 { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
10574 { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
10575 { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
10576 { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
10577 { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
10578 { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
10579 { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
10580 { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
10581 { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
10582 { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
10583 { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
10584 { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
10585 { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
10586 { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
10587 { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
10588 { 0, CODE_FOR_subv2si3, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
10589
10590 /* SPE binary operations expecting a 5-bit unsigned literal. */
10591 { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
10592
10593 { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
10594 { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
10595 { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
10596 { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
10597 { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
10598 { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
10599 { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
10600 { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
10601 { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
10602 { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
10603 { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
10604 { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
10605 { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
10606 { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
10607 { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
10608 { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
10609 { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
10610 { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
10611 { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
10612 { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
10613 { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
10614 { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
10615 { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
10616 { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
10617 { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
10618 { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
10619
10620 /* Place-holder. Leave as last binary SPE builtin. */
10621 { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR }
10622 };
10623
10624 /* AltiVec predicates. */
10625
10626 struct builtin_description_predicates
10627 {
10628 const unsigned int mask;
10629 const enum insn_code icode;
10630 const char *const name;
10631 const enum rs6000_builtins code;
10632 };
10633
10634 static const struct builtin_description_predicates bdesc_altivec_preds[] =
10635 {
10636 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp_p, "__builtin_altivec_vcmpbfp_p",
10637 ALTIVEC_BUILTIN_VCMPBFP_P },
10638 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_eq_v4sf_p,
10639 "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
10640 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_ge_v4sf_p,
10641 "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
10642 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_vector_gt_v4sf_p,
10643 "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
10644 { MASK_ALTIVEC, CODE_FOR_vector_eq_v4si_p, "__builtin_altivec_vcmpequw_p",
10645 ALTIVEC_BUILTIN_VCMPEQUW_P },
10646 { MASK_ALTIVEC, CODE_FOR_vector_gt_v4si_p, "__builtin_altivec_vcmpgtsw_p",
10647 ALTIVEC_BUILTIN_VCMPGTSW_P },
10648 { MASK_ALTIVEC, CODE_FOR_vector_gtu_v4si_p, "__builtin_altivec_vcmpgtuw_p",
10649 ALTIVEC_BUILTIN_VCMPGTUW_P },
10650 { MASK_ALTIVEC, CODE_FOR_vector_eq_v8hi_p, "__builtin_altivec_vcmpequh_p",
10651 ALTIVEC_BUILTIN_VCMPEQUH_P },
10652 { MASK_ALTIVEC, CODE_FOR_vector_gt_v8hi_p, "__builtin_altivec_vcmpgtsh_p",
10653 ALTIVEC_BUILTIN_VCMPGTSH_P },
10654 { MASK_ALTIVEC, CODE_FOR_vector_gtu_v8hi_p, "__builtin_altivec_vcmpgtuh_p",
10655 ALTIVEC_BUILTIN_VCMPGTUH_P },
10656 { MASK_ALTIVEC, CODE_FOR_vector_eq_v16qi_p, "__builtin_altivec_vcmpequb_p",
10657 ALTIVEC_BUILTIN_VCMPEQUB_P },
10658 { MASK_ALTIVEC, CODE_FOR_vector_gt_v16qi_p, "__builtin_altivec_vcmpgtsb_p",
10659 ALTIVEC_BUILTIN_VCMPGTSB_P },
10660 { MASK_ALTIVEC, CODE_FOR_vector_gtu_v16qi_p, "__builtin_altivec_vcmpgtub_p",
10661 ALTIVEC_BUILTIN_VCMPGTUB_P },
10662
10663 { MASK_VSX, CODE_FOR_vector_eq_v4sf_p, "__builtin_vsx_xvcmpeqsp_p",
10664 VSX_BUILTIN_XVCMPEQSP_P },
10665 { MASK_VSX, CODE_FOR_vector_ge_v4sf_p, "__builtin_vsx_xvcmpgesp_p",
10666 VSX_BUILTIN_XVCMPGESP_P },
10667 { MASK_VSX, CODE_FOR_vector_gt_v4sf_p, "__builtin_vsx_xvcmpgtsp_p",
10668 VSX_BUILTIN_XVCMPGTSP_P },
10669 { MASK_VSX, CODE_FOR_vector_eq_v2df_p, "__builtin_vsx_xvcmpeqdp_p",
10670 VSX_BUILTIN_XVCMPEQDP_P },
10671 { MASK_VSX, CODE_FOR_vector_ge_v2df_p, "__builtin_vsx_xvcmpgedp_p",
10672 VSX_BUILTIN_XVCMPGEDP_P },
10673 { MASK_VSX, CODE_FOR_vector_gt_v2df_p, "__builtin_vsx_xvcmpgtdp_p",
10674 VSX_BUILTIN_XVCMPGTDP_P },
10675
10676 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpeq_p",
10677 ALTIVEC_BUILTIN_VCMPEQ_P },
10678 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpgt_p",
10679 ALTIVEC_BUILTIN_VCMPGT_P },
10680 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vcmpge_p",
10681 ALTIVEC_BUILTIN_VCMPGE_P }
10682 };
10683
10684 /* SPE predicates. */
10685 static struct builtin_description bdesc_spe_predicates[] =
10686 {
10687 /* Place-holder. Leave as first. */
10688 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
10689 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
10690 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
10691 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
10692 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
10693 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
10694 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
10695 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
10696 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
10697 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
10698 /* Place-holder. Leave as last. */
10699 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
10700 };
10701
10702 /* SPE evsel predicates. */
10703 static struct builtin_description bdesc_spe_evsel[] =
10704 {
10705 /* Place-holder. Leave as first. */
10706 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
10707 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
10708 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
10709 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
10710 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
10711 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
10712 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
10713 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
10714 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
10715 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
10716 /* Place-holder. Leave as last. */
10717 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
10718 };
10719
10720 /* PAIRED predicates. */
10721 static const struct builtin_description bdesc_paired_preds[] =
10722 {
10723 /* Place-holder. Leave as first. */
10724 { 0, CODE_FOR_paired_cmpu0, "__builtin_paired_cmpu0", PAIRED_BUILTIN_CMPU0 },
10725 /* Place-holder. Leave as last. */
10726 { 0, CODE_FOR_paired_cmpu1, "__builtin_paired_cmpu1", PAIRED_BUILTIN_CMPU1 },
10727 };
10728
10729 /* ABS* operations. */
10730
10731 static const struct builtin_description bdesc_abs[] =
10732 {
10733 { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
10734 { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
10735 { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
10736 { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
10737 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
10738 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
10739 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI },
10740 { MASK_VSX, CODE_FOR_absv2df2, "__builtin_vsx_xvabsdp", VSX_BUILTIN_XVABSDP },
10741 { MASK_VSX, CODE_FOR_vsx_nabsv2df2, "__builtin_vsx_xvnabsdp", VSX_BUILTIN_XVNABSDP },
10742 { MASK_VSX, CODE_FOR_absv4sf2, "__builtin_vsx_xvabssp", VSX_BUILTIN_XVABSSP },
10743 { MASK_VSX, CODE_FOR_vsx_nabsv4sf2, "__builtin_vsx_xvnabssp", VSX_BUILTIN_XVNABSSP },
10744 };
10745
10746 /* Simple unary operations: VECb = foo (unsigned literal) or VECb =
10747 foo (VECa). */
10748
10749 static struct builtin_description bdesc_1arg[] =
10750 {
10751 { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
10752 { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
10753 { MASK_ALTIVEC, CODE_FOR_rev4sf2, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
10754 { MASK_ALTIVEC, CODE_FOR_vector_floorv4sf2, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
10755 { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
10756 { MASK_ALTIVEC, CODE_FOR_vector_ceilv4sf2, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
10757 { MASK_ALTIVEC, CODE_FOR_vector_btruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
10758 { MASK_ALTIVEC, CODE_FOR_rsqrtv4sf2, "__builtin_altivec_vrsqrtfp", ALTIVEC_BUILTIN_VRSQRTFP },
10759 { MASK_ALTIVEC, CODE_FOR_rsqrtev4sf2, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
10760 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
10761 { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
10762 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
10763 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
10764 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
10765 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
10766 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
10767 { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
10768 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
10769
10770 { MASK_VSX, CODE_FOR_negv2df2, "__builtin_vsx_xvnegdp", VSX_BUILTIN_XVNEGDP },
10771 { MASK_VSX, CODE_FOR_sqrtv2df2, "__builtin_vsx_xvsqrtdp", VSX_BUILTIN_XVSQRTDP },
10772 { MASK_VSX, CODE_FOR_rsqrtv2df2, "__builtin_vsx_xvrsqrtdp", VSX_BUILTIN_VEC_RSQRT_V2DF },
10773 { MASK_VSX, CODE_FOR_rsqrtev2df2, "__builtin_vsx_xvrsqrtedp", VSX_BUILTIN_XVRSQRTEDP },
10774 { MASK_VSX, CODE_FOR_vsx_tsqrtv2df2_fe, "__builtin_vsx_xvtsqrtdp_fe", VSX_BUILTIN_XVTSQRTDP_FE },
10775 { MASK_VSX, CODE_FOR_vsx_tsqrtv2df2_fg, "__builtin_vsx_xvtsqrtdp_fg", VSX_BUILTIN_XVTSQRTDP_FG },
10776 { MASK_VSX, CODE_FOR_vsx_frev2df2, "__builtin_vsx_xvredp", VSX_BUILTIN_XVREDP },
10777
10778 { MASK_VSX, CODE_FOR_negv4sf2, "__builtin_vsx_xvnegsp", VSX_BUILTIN_XVNEGSP },
10779 { MASK_VSX, CODE_FOR_sqrtv4sf2, "__builtin_vsx_xvsqrtsp", VSX_BUILTIN_XVSQRTSP },
10780 { MASK_VSX, CODE_FOR_rsqrtv4sf2, "__builtin_vsx_xvrsqrtsp", VSX_BUILTIN_VEC_RSQRT_V4SF },
10781 { MASK_VSX, CODE_FOR_rsqrtev4sf2, "__builtin_vsx_xvrsqrtesp", VSX_BUILTIN_XVRSQRTESP },
10782 { MASK_VSX, CODE_FOR_vsx_tsqrtv4sf2_fe, "__builtin_vsx_xvtsqrtsp_fe", VSX_BUILTIN_XVTSQRTSP_FE },
10783 { MASK_VSX, CODE_FOR_vsx_tsqrtv4sf2_fg, "__builtin_vsx_xvtsqrtsp_fg", VSX_BUILTIN_XVTSQRTSP_FG },
10784 { MASK_VSX, CODE_FOR_vsx_frev4sf2, "__builtin_vsx_xvresp", VSX_BUILTIN_XVRESP },
10785
10786 { MASK_VSX, CODE_FOR_vsx_xscvdpsp, "__builtin_vsx_xscvdpsp", VSX_BUILTIN_XSCVDPSP },
10787 { MASK_VSX, CODE_FOR_vsx_xscvdpsp, "__builtin_vsx_xscvspdp", VSX_BUILTIN_XSCVSPDP },
10788 { MASK_VSX, CODE_FOR_vsx_xvcvdpsp, "__builtin_vsx_xvcvdpsp", VSX_BUILTIN_XVCVDPSP },
10789 { MASK_VSX, CODE_FOR_vsx_xvcvspdp, "__builtin_vsx_xvcvspdp", VSX_BUILTIN_XVCVSPDP },
10790 { MASK_VSX, CODE_FOR_vsx_tsqrtdf2_fe, "__builtin_vsx_xstsqrtdp_fe", VSX_BUILTIN_XSTSQRTDP_FE },
10791 { MASK_VSX, CODE_FOR_vsx_tsqrtdf2_fg, "__builtin_vsx_xstsqrtdp_fg", VSX_BUILTIN_XSTSQRTDP_FG },
10792
10793 { MASK_VSX, CODE_FOR_vsx_fix_truncv2dfv2di2, "__builtin_vsx_xvcvdpsxds", VSX_BUILTIN_XVCVDPSXDS },
10794 { MASK_VSX, CODE_FOR_vsx_fixuns_truncv2dfv2di2, "__builtin_vsx_xvcvdpuxds", VSX_BUILTIN_XVCVDPUXDS },
10795 { MASK_VSX, CODE_FOR_vsx_fixuns_truncv2dfv2di2, "__builtin_vsx_xvcvdpuxds_uns", VSX_BUILTIN_XVCVDPUXDS_UNS },
10796 { MASK_VSX, CODE_FOR_vsx_floatv2div2df2, "__builtin_vsx_xvcvsxddp", VSX_BUILTIN_XVCVSXDDP },
10797 { MASK_VSX, CODE_FOR_vsx_floatunsv2div2df2, "__builtin_vsx_xvcvuxddp", VSX_BUILTIN_XVCVUXDDP },
10798 { MASK_VSX, CODE_FOR_vsx_floatunsv2div2df2, "__builtin_vsx_xvcvuxddp_uns", VSX_BUILTIN_XVCVUXDDP_UNS },
10799
10800 { MASK_VSX, CODE_FOR_vsx_fix_truncv4sfv4si2, "__builtin_vsx_xvcvspsxws", VSX_BUILTIN_XVCVSPSXWS },
10801 { MASK_VSX, CODE_FOR_vsx_fixuns_truncv4sfv4si2, "__builtin_vsx_xvcvspuxws", VSX_BUILTIN_XVCVSPUXWS },
10802 { MASK_VSX, CODE_FOR_vsx_floatv4siv4sf2, "__builtin_vsx_xvcvsxwsp", VSX_BUILTIN_XVCVSXWSP },
10803 { MASK_VSX, CODE_FOR_vsx_floatunsv4siv4sf2, "__builtin_vsx_xvcvuxwsp", VSX_BUILTIN_XVCVUXWSP },
10804
10805 { MASK_VSX, CODE_FOR_vsx_xvcvdpsxws, "__builtin_vsx_xvcvdpsxws", VSX_BUILTIN_XVCVDPSXWS },
10806 { MASK_VSX, CODE_FOR_vsx_xvcvdpuxws, "__builtin_vsx_xvcvdpuxws", VSX_BUILTIN_XVCVDPUXWS },
10807 { MASK_VSX, CODE_FOR_vsx_xvcvsxwdp, "__builtin_vsx_xvcvsxwdp", VSX_BUILTIN_XVCVSXWDP },
10808 { MASK_VSX, CODE_FOR_vsx_xvcvuxwdp, "__builtin_vsx_xvcvuxwdp", VSX_BUILTIN_XVCVUXWDP },
10809 { MASK_VSX, CODE_FOR_vsx_xvrdpi, "__builtin_vsx_xvrdpi", VSX_BUILTIN_XVRDPI },
10810 { MASK_VSX, CODE_FOR_vsx_xvrdpic, "__builtin_vsx_xvrdpic", VSX_BUILTIN_XVRDPIC },
10811 { MASK_VSX, CODE_FOR_vsx_floorv2df2, "__builtin_vsx_xvrdpim", VSX_BUILTIN_XVRDPIM },
10812 { MASK_VSX, CODE_FOR_vsx_ceilv2df2, "__builtin_vsx_xvrdpip", VSX_BUILTIN_XVRDPIP },
10813 { MASK_VSX, CODE_FOR_vsx_btruncv2df2, "__builtin_vsx_xvrdpiz", VSX_BUILTIN_XVRDPIZ },
10814
10815 { MASK_VSX, CODE_FOR_vsx_xvcvspsxds, "__builtin_vsx_xvcvspsxds", VSX_BUILTIN_XVCVSPSXDS },
10816 { MASK_VSX, CODE_FOR_vsx_xvcvspuxds, "__builtin_vsx_xvcvspuxds", VSX_BUILTIN_XVCVSPUXDS },
10817 { MASK_VSX, CODE_FOR_vsx_xvcvsxdsp, "__builtin_vsx_xvcvsxdsp", VSX_BUILTIN_XVCVSXDSP },
10818 { MASK_VSX, CODE_FOR_vsx_xvcvuxdsp, "__builtin_vsx_xvcvuxdsp", VSX_BUILTIN_XVCVUXDSP },
10819 { MASK_VSX, CODE_FOR_vsx_xvrspi, "__builtin_vsx_xvrspi", VSX_BUILTIN_XVRSPI },
10820 { MASK_VSX, CODE_FOR_vsx_xvrspic, "__builtin_vsx_xvrspic", VSX_BUILTIN_XVRSPIC },
10821 { MASK_VSX, CODE_FOR_vsx_floorv4sf2, "__builtin_vsx_xvrspim", VSX_BUILTIN_XVRSPIM },
10822 { MASK_VSX, CODE_FOR_vsx_ceilv4sf2, "__builtin_vsx_xvrspip", VSX_BUILTIN_XVRSPIP },
10823 { MASK_VSX, CODE_FOR_vsx_btruncv4sf2, "__builtin_vsx_xvrspiz", VSX_BUILTIN_XVRSPIZ },
10824
10825 { MASK_VSX, CODE_FOR_vsx_xsrdpi, "__builtin_vsx_xsrdpi", VSX_BUILTIN_XSRDPI },
10826 { MASK_VSX, CODE_FOR_vsx_xsrdpic, "__builtin_vsx_xsrdpic", VSX_BUILTIN_XSRDPIC },
10827 { MASK_VSX, CODE_FOR_vsx_floordf2, "__builtin_vsx_xsrdpim", VSX_BUILTIN_XSRDPIM },
10828 { MASK_VSX, CODE_FOR_vsx_ceildf2, "__builtin_vsx_xsrdpip", VSX_BUILTIN_XSRDPIP },
10829 { MASK_VSX, CODE_FOR_vsx_btruncdf2, "__builtin_vsx_xsrdpiz", VSX_BUILTIN_XSRDPIZ },
10830
10831 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abs", ALTIVEC_BUILTIN_VEC_ABS },
10832 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abss", ALTIVEC_BUILTIN_VEC_ABSS },
10833 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_ceil", ALTIVEC_BUILTIN_VEC_CEIL },
10834 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_expte", ALTIVEC_BUILTIN_VEC_EXPTE },
10835 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_floor", ALTIVEC_BUILTIN_VEC_FLOOR },
10836 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_loge", ALTIVEC_BUILTIN_VEC_LOGE },
10837 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mtvscr", ALTIVEC_BUILTIN_VEC_MTVSCR },
10838 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_re", ALTIVEC_BUILTIN_VEC_RE },
10839 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_round", ALTIVEC_BUILTIN_VEC_ROUND },
10840 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrt", ALTIVEC_BUILTIN_VEC_RSQRT },
10841 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrte", ALTIVEC_BUILTIN_VEC_RSQRTE },
10842 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_trunc", ALTIVEC_BUILTIN_VEC_TRUNC },
10843 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackh", ALTIVEC_BUILTIN_VEC_UNPACKH },
10844 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsh", ALTIVEC_BUILTIN_VEC_VUPKHSH },
10845 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhpx", ALTIVEC_BUILTIN_VEC_VUPKHPX },
10846 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsb", ALTIVEC_BUILTIN_VEC_VUPKHSB },
10847 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackl", ALTIVEC_BUILTIN_VEC_UNPACKL },
10848 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklpx", ALTIVEC_BUILTIN_VEC_VUPKLPX },
10849 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsh", ALTIVEC_BUILTIN_VEC_VUPKLSH },
10850 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsb", ALTIVEC_BUILTIN_VEC_VUPKLSB },
10851
10852 { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_nearbyint", ALTIVEC_BUILTIN_VEC_NEARBYINT },
10853 { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_rint", ALTIVEC_BUILTIN_VEC_RINT },
10854 { MASK_VSX, CODE_FOR_nothing, "__builtin_vec_sqrt", ALTIVEC_BUILTIN_VEC_SQRT },
10855
10856 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_floatv4siv4sf2, "__builtin_vec_float_sisf", VECTOR_BUILTIN_FLOAT_V4SI_V4SF },
10857 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_unsigned_floatv4siv4sf2, "__builtin_vec_uns_float_sisf", VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF },
10858 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_fix_truncv4sfv4si2, "__builtin_vec_fix_sfsi", VECTOR_BUILTIN_FIX_V4SF_V4SI },
10859 { MASK_ALTIVEC|MASK_VSX, CODE_FOR_fixuns_truncv4sfv4si2, "__builtin_vec_fixuns_sfsi", VECTOR_BUILTIN_FIXUNS_V4SF_V4SI },
10860
10861 /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
10862 end with SPE_BUILTIN_EVSUBFUSIAAW. */
10863 { 0, CODE_FOR_absv2si2, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
10864 { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
10865 { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
10866 { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
10867 { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
10868 { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
10869 { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
10870 { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
10871 { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
10872 { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
10873 { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
10874 { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
10875 { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
10876 { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
10877 { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
10878 { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
10879 { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
10880 { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
10881 { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
10882 { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
10883 { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
10884 { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
10885 { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
10886 { 0, CODE_FOR_negv2si2, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
10887 { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
10888 { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
10889 { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
10890 { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
10891
10892 /* Place-holder. Leave as last unary SPE builtin. */
10893 { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
10894
10895 { 0, CODE_FOR_paired_absv2sf2, "__builtin_paired_absv2sf2", PAIRED_BUILTIN_ABSV2SF2 },
10896 { 0, CODE_FOR_nabsv2sf2, "__builtin_paired_nabsv2sf2", PAIRED_BUILTIN_NABSV2SF2 },
10897 { 0, CODE_FOR_paired_negv2sf2, "__builtin_paired_negv2sf2", PAIRED_BUILTIN_NEGV2SF2 },
10898 { 0, CODE_FOR_sqrtv2sf2, "__builtin_paired_sqrtv2sf2", PAIRED_BUILTIN_SQRTV2SF2 },
10899 { 0, CODE_FOR_resv2sf2, "__builtin_paired_resv2sf2", PAIRED_BUILTIN_RESV2SF2 }
10900 };
10901
10902 static rtx
10903 rs6000_expand_unop_builtin (enum insn_code icode, tree exp, rtx target)
10904 {
10905 rtx pat;
10906 tree arg0 = CALL_EXPR_ARG (exp, 0);
10907 rtx op0 = expand_normal (arg0);
10908 enum machine_mode tmode = insn_data[icode].operand[0].mode;
10909 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10910
10911 if (icode == CODE_FOR_nothing)
10912 /* Builtin not supported on this processor. */
10913 return 0;
10914
10915 /* If we got invalid arguments bail out before generating bad rtl. */
10916 if (arg0 == error_mark_node)
10917 return const0_rtx;
10918
10919 if (icode == CODE_FOR_altivec_vspltisb
10920 || icode == CODE_FOR_altivec_vspltish
10921 || icode == CODE_FOR_altivec_vspltisw
10922 || icode == CODE_FOR_spe_evsplatfi
10923 || icode == CODE_FOR_spe_evsplati)
10924 {
10925 /* Only allow 5-bit *signed* literals. */
10926 if (GET_CODE (op0) != CONST_INT
10927 || INTVAL (op0) > 15
10928 || INTVAL (op0) < -16)
10929 {
10930 error ("argument 1 must be a 5-bit signed literal");
10931 return const0_rtx;
10932 }
10933 }
10934
10935 if (target == 0
10936 || GET_MODE (target) != tmode
10937 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10938 target = gen_reg_rtx (tmode);
10939
10940 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10941 op0 = copy_to_mode_reg (mode0, op0);
10942
10943 pat = GEN_FCN (icode) (target, op0);
10944 if (! pat)
10945 return 0;
10946 emit_insn (pat);
10947
10948 return target;
10949 }
10950
10951 static rtx
10952 altivec_expand_abs_builtin (enum insn_code icode, tree exp, rtx target)
10953 {
10954 rtx pat, scratch1, scratch2;
10955 tree arg0 = CALL_EXPR_ARG (exp, 0);
10956 rtx op0 = expand_normal (arg0);
10957 enum machine_mode tmode = insn_data[icode].operand[0].mode;
10958 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10959
10960 /* If we have invalid arguments, bail out before generating bad rtl. */
10961 if (arg0 == error_mark_node)
10962 return const0_rtx;
10963
10964 if (target == 0
10965 || GET_MODE (target) != tmode
10966 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10967 target = gen_reg_rtx (tmode);
10968
10969 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
10970 op0 = copy_to_mode_reg (mode0, op0);
10971
10972 scratch1 = gen_reg_rtx (mode0);
10973 scratch2 = gen_reg_rtx (mode0);
10974
10975 pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
10976 if (! pat)
10977 return 0;
10978 emit_insn (pat);
10979
10980 return target;
10981 }
10982
10983 static rtx
10984 rs6000_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
10985 {
10986 rtx pat;
10987 tree arg0 = CALL_EXPR_ARG (exp, 0);
10988 tree arg1 = CALL_EXPR_ARG (exp, 1);
10989 rtx op0 = expand_normal (arg0);
10990 rtx op1 = expand_normal (arg1);
10991 enum machine_mode tmode = insn_data[icode].operand[0].mode;
10992 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
10993 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
10994
10995 if (icode == CODE_FOR_nothing)
10996 /* Builtin not supported on this processor. */
10997 return 0;
10998
10999 /* If we got invalid arguments bail out before generating bad rtl. */
11000 if (arg0 == error_mark_node || arg1 == error_mark_node)
11001 return const0_rtx;
11002
11003 if (icode == CODE_FOR_altivec_vcfux
11004 || icode == CODE_FOR_altivec_vcfsx
11005 || icode == CODE_FOR_altivec_vctsxs
11006 || icode == CODE_FOR_altivec_vctuxs
11007 || icode == CODE_FOR_altivec_vspltb
11008 || icode == CODE_FOR_altivec_vsplth
11009 || icode == CODE_FOR_altivec_vspltw
11010 || icode == CODE_FOR_spe_evaddiw
11011 || icode == CODE_FOR_spe_evldd
11012 || icode == CODE_FOR_spe_evldh
11013 || icode == CODE_FOR_spe_evldw
11014 || icode == CODE_FOR_spe_evlhhesplat
11015 || icode == CODE_FOR_spe_evlhhossplat
11016 || icode == CODE_FOR_spe_evlhhousplat
11017 || icode == CODE_FOR_spe_evlwhe
11018 || icode == CODE_FOR_spe_evlwhos
11019 || icode == CODE_FOR_spe_evlwhou
11020 || icode == CODE_FOR_spe_evlwhsplat
11021 || icode == CODE_FOR_spe_evlwwsplat
11022 || icode == CODE_FOR_spe_evrlwi
11023 || icode == CODE_FOR_spe_evslwi
11024 || icode == CODE_FOR_spe_evsrwis
11025 || icode == CODE_FOR_spe_evsubifw
11026 || icode == CODE_FOR_spe_evsrwiu)
11027 {
11028 /* Only allow 5-bit unsigned literals. */
11029 STRIP_NOPS (arg1);
11030 if (TREE_CODE (arg1) != INTEGER_CST
11031 || TREE_INT_CST_LOW (arg1) & ~0x1f)
11032 {
11033 error ("argument 2 must be a 5-bit unsigned literal");
11034 return const0_rtx;
11035 }
11036 }
11037
11038 if (target == 0
11039 || GET_MODE (target) != tmode
11040 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11041 target = gen_reg_rtx (tmode);
11042
11043 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11044 op0 = copy_to_mode_reg (mode0, op0);
11045 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
11046 op1 = copy_to_mode_reg (mode1, op1);
11047
11048 pat = GEN_FCN (icode) (target, op0, op1);
11049 if (! pat)
11050 return 0;
11051 emit_insn (pat);
11052
11053 return target;
11054 }
11055
11056 static rtx
11057 altivec_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
11058 {
11059 rtx pat, scratch;
11060 tree cr6_form = CALL_EXPR_ARG (exp, 0);
11061 tree arg0 = CALL_EXPR_ARG (exp, 1);
11062 tree arg1 = CALL_EXPR_ARG (exp, 2);
11063 rtx op0 = expand_normal (arg0);
11064 rtx op1 = expand_normal (arg1);
11065 enum machine_mode tmode = SImode;
11066 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11067 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11068 int cr6_form_int;
11069
11070 if (TREE_CODE (cr6_form) != INTEGER_CST)
11071 {
11072 error ("argument 1 of __builtin_altivec_predicate must be a constant");
11073 return const0_rtx;
11074 }
11075 else
11076 cr6_form_int = TREE_INT_CST_LOW (cr6_form);
11077
11078 gcc_assert (mode0 == mode1);
11079
11080 /* If we have invalid arguments, bail out before generating bad rtl. */
11081 if (arg0 == error_mark_node || arg1 == error_mark_node)
11082 return const0_rtx;
11083
11084 if (target == 0
11085 || GET_MODE (target) != tmode
11086 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11087 target = gen_reg_rtx (tmode);
11088
11089 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11090 op0 = copy_to_mode_reg (mode0, op0);
11091 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
11092 op1 = copy_to_mode_reg (mode1, op1);
11093
11094 scratch = gen_reg_rtx (mode0);
11095
11096 pat = GEN_FCN (icode) (scratch, op0, op1);
11097 if (! pat)
11098 return 0;
11099 emit_insn (pat);
11100
11101 /* The vec_any* and vec_all* predicates use the same opcodes for two
11102 different operations, but the bits in CR6 will be different
11103 depending on what information we want. So we have to play tricks
11104 with CR6 to get the right bits out.
11105
11106 If you think this is disgusting, look at the specs for the
11107 AltiVec predicates. */
11108
11109 switch (cr6_form_int)
11110 {
11111 case 0:
11112 emit_insn (gen_cr6_test_for_zero (target));
11113 break;
11114 case 1:
11115 emit_insn (gen_cr6_test_for_zero_reverse (target));
11116 break;
11117 case 2:
11118 emit_insn (gen_cr6_test_for_lt (target));
11119 break;
11120 case 3:
11121 emit_insn (gen_cr6_test_for_lt_reverse (target));
11122 break;
11123 default:
11124 error ("argument 1 of __builtin_altivec_predicate is out of range");
11125 break;
11126 }
11127
11128 return target;
11129 }
11130
11131 static rtx
11132 paired_expand_lv_builtin (enum insn_code icode, tree exp, rtx target)
11133 {
11134 rtx pat, addr;
11135 tree arg0 = CALL_EXPR_ARG (exp, 0);
11136 tree arg1 = CALL_EXPR_ARG (exp, 1);
11137 enum machine_mode tmode = insn_data[icode].operand[0].mode;
11138 enum machine_mode mode0 = Pmode;
11139 enum machine_mode mode1 = Pmode;
11140 rtx op0 = expand_normal (arg0);
11141 rtx op1 = expand_normal (arg1);
11142
11143 if (icode == CODE_FOR_nothing)
11144 /* Builtin not supported on this processor. */
11145 return 0;
11146
11147 /* If we got invalid arguments bail out before generating bad rtl. */
11148 if (arg0 == error_mark_node || arg1 == error_mark_node)
11149 return const0_rtx;
11150
11151 if (target == 0
11152 || GET_MODE (target) != tmode
11153 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11154 target = gen_reg_rtx (tmode);
11155
11156 op1 = copy_to_mode_reg (mode1, op1);
11157
11158 if (op0 == const0_rtx)
11159 {
11160 addr = gen_rtx_MEM (tmode, op1);
11161 }
11162 else
11163 {
11164 op0 = copy_to_mode_reg (mode0, op0);
11165 addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
11166 }
11167
11168 pat = GEN_FCN (icode) (target, addr);
11169
11170 if (! pat)
11171 return 0;
11172 emit_insn (pat);
11173
11174 return target;
11175 }
11176
11177 static rtx
11178 altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target, bool blk)
11179 {
11180 rtx pat, addr;
11181 tree arg0 = CALL_EXPR_ARG (exp, 0);
11182 tree arg1 = CALL_EXPR_ARG (exp, 1);
11183 enum machine_mode tmode = insn_data[icode].operand[0].mode;
11184 enum machine_mode mode0 = Pmode;
11185 enum machine_mode mode1 = Pmode;
11186 rtx op0 = expand_normal (arg0);
11187 rtx op1 = expand_normal (arg1);
11188
11189 if (icode == CODE_FOR_nothing)
11190 /* Builtin not supported on this processor. */
11191 return 0;
11192
11193 /* If we got invalid arguments bail out before generating bad rtl. */
11194 if (arg0 == error_mark_node || arg1 == error_mark_node)
11195 return const0_rtx;
11196
11197 if (target == 0
11198 || GET_MODE (target) != tmode
11199 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11200 target = gen_reg_rtx (tmode);
11201
11202 op1 = copy_to_mode_reg (mode1, op1);
11203
11204 if (op0 == const0_rtx)
11205 {
11206 addr = gen_rtx_MEM (blk ? BLKmode : tmode, op1);
11207 }
11208 else
11209 {
11210 op0 = copy_to_mode_reg (mode0, op0);
11211 addr = gen_rtx_MEM (blk ? BLKmode : tmode, gen_rtx_PLUS (Pmode, op0, op1));
11212 }
11213
11214 pat = GEN_FCN (icode) (target, addr);
11215
11216 if (! pat)
11217 return 0;
11218 emit_insn (pat);
11219
11220 return target;
11221 }
11222
11223 static rtx
11224 spe_expand_stv_builtin (enum insn_code icode, tree exp)
11225 {
11226 tree arg0 = CALL_EXPR_ARG (exp, 0);
11227 tree arg1 = CALL_EXPR_ARG (exp, 1);
11228 tree arg2 = CALL_EXPR_ARG (exp, 2);
11229 rtx op0 = expand_normal (arg0);
11230 rtx op1 = expand_normal (arg1);
11231 rtx op2 = expand_normal (arg2);
11232 rtx pat;
11233 enum machine_mode mode0 = insn_data[icode].operand[0].mode;
11234 enum machine_mode mode1 = insn_data[icode].operand[1].mode;
11235 enum machine_mode mode2 = insn_data[icode].operand[2].mode;
11236
11237 /* Invalid arguments. Bail before doing anything stoopid! */
11238 if (arg0 == error_mark_node
11239 || arg1 == error_mark_node
11240 || arg2 == error_mark_node)
11241 return const0_rtx;
11242
11243 if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
11244 op0 = copy_to_mode_reg (mode2, op0);
11245 if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
11246 op1 = copy_to_mode_reg (mode0, op1);
11247 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
11248 op2 = copy_to_mode_reg (mode1, op2);
11249
11250 pat = GEN_FCN (icode) (op1, op2, op0);
11251 if (pat)
11252 emit_insn (pat);
11253 return NULL_RTX;
11254 }
11255
11256 static rtx
11257 paired_expand_stv_builtin (enum insn_code icode, tree exp)
11258 {
11259 tree arg0 = CALL_EXPR_ARG (exp, 0);
11260 tree arg1 = CALL_EXPR_ARG (exp, 1);
11261 tree arg2 = CALL_EXPR_ARG (exp, 2);
11262 rtx op0 = expand_normal (arg0);
11263 rtx op1 = expand_normal (arg1);
11264 rtx op2 = expand_normal (arg2);
11265 rtx pat, addr;
11266 enum machine_mode tmode = insn_data[icode].operand[0].mode;
11267 enum machine_mode mode1 = Pmode;
11268 enum machine_mode mode2 = Pmode;
11269
11270 /* Invalid arguments. Bail before doing anything stoopid! */
11271 if (arg0 == error_mark_node
11272 || arg1 == error_mark_node
11273 || arg2 == error_mark_node)
11274 return const0_rtx;
11275
11276 if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
11277 op0 = copy_to_mode_reg (tmode, op0);
11278
11279 op2 = copy_to_mode_reg (mode2, op2);
11280
11281 if (op1 == const0_rtx)
11282 {
11283 addr = gen_rtx_MEM (tmode, op2);
11284 }
11285 else
11286 {
11287 op1 = copy_to_mode_reg (mode1, op1);
11288 addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
11289 }
11290
11291 pat = GEN_FCN (icode) (addr, op0);
11292 if (pat)
11293 emit_insn (pat);
11294 return NULL_RTX;
11295 }
11296
11297 static rtx
11298 altivec_expand_stv_builtin (enum insn_code icode, tree exp)
11299 {
11300 tree arg0 = CALL_EXPR_ARG (exp, 0);
11301 tree arg1 = CALL_EXPR_ARG (exp, 1);
11302 tree arg2 = CALL_EXPR_ARG (exp, 2);
11303 rtx op0 = expand_normal (arg0);
11304 rtx op1 = expand_normal (arg1);
11305 rtx op2 = expand_normal (arg2);
11306 rtx pat, addr;
11307 enum machine_mode tmode = insn_data[icode].operand[0].mode;
11308 enum machine_mode smode = insn_data[icode].operand[1].mode;
11309 enum machine_mode mode1 = Pmode;
11310 enum machine_mode mode2 = Pmode;
11311
11312 /* Invalid arguments. Bail before doing anything stoopid! */
11313 if (arg0 == error_mark_node
11314 || arg1 == error_mark_node
11315 || arg2 == error_mark_node)
11316 return const0_rtx;
11317
11318 if (! (*insn_data[icode].operand[1].predicate) (op0, smode))
11319 op0 = copy_to_mode_reg (smode, op0);
11320
11321 op2 = copy_to_mode_reg (mode2, op2);
11322
11323 if (op1 == const0_rtx)
11324 {
11325 addr = gen_rtx_MEM (tmode, op2);
11326 }
11327 else
11328 {
11329 op1 = copy_to_mode_reg (mode1, op1);
11330 addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
11331 }
11332
11333 pat = GEN_FCN (icode) (addr, op0);
11334 if (pat)
11335 emit_insn (pat);
11336 return NULL_RTX;
11337 }
11338
11339 static rtx
11340 rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
11341 {
11342 rtx pat;
11343 tree arg0 = CALL_EXPR_ARG (exp, 0);
11344 tree arg1 = CALL_EXPR_ARG (exp, 1);
11345 tree arg2 = CALL_EXPR_ARG (exp, 2);
11346 rtx op0 = expand_normal (arg0);
11347 rtx op1 = expand_normal (arg1);
11348 rtx op2 = expand_normal (arg2);
11349 enum machine_mode tmode = insn_data[icode].operand[0].mode;
11350 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
11351 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
11352 enum machine_mode mode2 = insn_data[icode].operand[3].mode;
11353
11354 if (icode == CODE_FOR_nothing)
11355 /* Builtin not supported on this processor. */
11356 return 0;
11357
11358 /* If we got invalid arguments bail out before generating bad rtl. */
11359 if (arg0 == error_mark_node
11360 || arg1 == error_mark_node
11361 || arg2 == error_mark_node)
11362 return const0_rtx;
11363
11364 /* Check and prepare argument depending on the instruction code.
11365
11366 Note that a switch statement instead of the sequence of tests
11367 would be incorrect as many of the CODE_FOR values could be
11368 CODE_FOR_nothing and that would yield multiple alternatives
11369 with identical values. We'd never reach here at runtime in
11370 this case. */
11371 if (icode == CODE_FOR_altivec_vsldoi_v4sf
11372 || icode == CODE_FOR_altivec_vsldoi_v4si
11373 || icode == CODE_FOR_altivec_vsldoi_v8hi
11374 || icode == CODE_FOR_altivec_vsldoi_v16qi)
11375 {
11376 /* Only allow 4-bit unsigned literals. */
11377 STRIP_NOPS (arg2);
11378 if (TREE_CODE (arg2) != INTEGER_CST
11379 || TREE_INT_CST_LOW (arg2) & ~0xf)
11380 {
11381 error ("argument 3 must be a 4-bit unsigned literal");
11382 return const0_rtx;
11383 }
11384 }
11385 else if (icode == CODE_FOR_vsx_xxpermdi_v2df
11386 || icode == CODE_FOR_vsx_xxpermdi_v2di
11387 || icode == CODE_FOR_vsx_xxsldwi_v16qi
11388 || icode == CODE_FOR_vsx_xxsldwi_v8hi
11389 || icode == CODE_FOR_vsx_xxsldwi_v4si
11390 || icode == CODE_FOR_vsx_xxsldwi_v4sf
11391 || icode == CODE_FOR_vsx_xxsldwi_v2di
11392 || icode == CODE_FOR_vsx_xxsldwi_v2df)
11393 {
11394 /* Only allow 2-bit unsigned literals. */
11395 STRIP_NOPS (arg2);
11396 if (TREE_CODE (arg2) != INTEGER_CST
11397 || TREE_INT_CST_LOW (arg2) & ~0x3)
11398 {
11399 error ("argument 3 must be a 2-bit unsigned literal");
11400 return const0_rtx;
11401 }
11402 }
11403 else if (icode == CODE_FOR_vsx_set_v2df
11404 || icode == CODE_FOR_vsx_set_v2di)
11405 {
11406 /* Only allow 1-bit unsigned literals. */
11407 STRIP_NOPS (arg2);
11408 if (TREE_CODE (arg2) != INTEGER_CST
11409 || TREE_INT_CST_LOW (arg2) & ~0x1)
11410 {
11411 error ("argument 3 must be a 1-bit unsigned literal");
11412 return const0_rtx;
11413 }
11414 }
11415
11416 if (target == 0
11417 || GET_MODE (target) != tmode
11418 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11419 target = gen_reg_rtx (tmode);
11420
11421 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11422 op0 = copy_to_mode_reg (mode0, op0);
11423 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
11424 op1 = copy_to_mode_reg (mode1, op1);
11425 if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
11426 op2 = copy_to_mode_reg (mode2, op2);
11427
11428 if (TARGET_PAIRED_FLOAT && icode == CODE_FOR_selv2sf4)
11429 pat = GEN_FCN (icode) (target, op0, op1, op2, CONST0_RTX (SFmode));
11430 else
11431 pat = GEN_FCN (icode) (target, op0, op1, op2);
11432 if (! pat)
11433 return 0;
11434 emit_insn (pat);
11435
11436 return target;
11437 }
11438
11439 /* Expand the lvx builtins. */
11440 static rtx
11441 altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp)
11442 {
11443 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11444 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11445 tree arg0;
11446 enum machine_mode tmode, mode0;
11447 rtx pat, op0;
11448 enum insn_code icode;
11449
11450 switch (fcode)
11451 {
11452 case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
11453 icode = CODE_FOR_vector_altivec_load_v16qi;
11454 break;
11455 case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
11456 icode = CODE_FOR_vector_altivec_load_v8hi;
11457 break;
11458 case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
11459 icode = CODE_FOR_vector_altivec_load_v4si;
11460 break;
11461 case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
11462 icode = CODE_FOR_vector_altivec_load_v4sf;
11463 break;
11464 case ALTIVEC_BUILTIN_LD_INTERNAL_2df:
11465 icode = CODE_FOR_vector_altivec_load_v2df;
11466 break;
11467 case ALTIVEC_BUILTIN_LD_INTERNAL_2di:
11468 icode = CODE_FOR_vector_altivec_load_v2di;
11469 break;
11470 default:
11471 *expandedp = false;
11472 return NULL_RTX;
11473 }
11474
11475 *expandedp = true;
11476
11477 arg0 = CALL_EXPR_ARG (exp, 0);
11478 op0 = expand_normal (arg0);
11479 tmode = insn_data[icode].operand[0].mode;
11480 mode0 = insn_data[icode].operand[1].mode;
11481
11482 if (target == 0
11483 || GET_MODE (target) != tmode
11484 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11485 target = gen_reg_rtx (tmode);
11486
11487 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
11488 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
11489
11490 pat = GEN_FCN (icode) (target, op0);
11491 if (! pat)
11492 return 0;
11493 emit_insn (pat);
11494 return target;
11495 }
11496
11497 /* Expand the stvx builtins. */
11498 static rtx
11499 altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
11500 bool *expandedp)
11501 {
11502 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11503 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11504 tree arg0, arg1;
11505 enum machine_mode mode0, mode1;
11506 rtx pat, op0, op1;
11507 enum insn_code icode;
11508
11509 switch (fcode)
11510 {
11511 case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
11512 icode = CODE_FOR_vector_altivec_store_v16qi;
11513 break;
11514 case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
11515 icode = CODE_FOR_vector_altivec_store_v8hi;
11516 break;
11517 case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
11518 icode = CODE_FOR_vector_altivec_store_v4si;
11519 break;
11520 case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
11521 icode = CODE_FOR_vector_altivec_store_v4sf;
11522 break;
11523 case ALTIVEC_BUILTIN_ST_INTERNAL_2df:
11524 icode = CODE_FOR_vector_altivec_store_v2df;
11525 break;
11526 case ALTIVEC_BUILTIN_ST_INTERNAL_2di:
11527 icode = CODE_FOR_vector_altivec_store_v2di;
11528 break;
11529 default:
11530 *expandedp = false;
11531 return NULL_RTX;
11532 }
11533
11534 arg0 = CALL_EXPR_ARG (exp, 0);
11535 arg1 = CALL_EXPR_ARG (exp, 1);
11536 op0 = expand_normal (arg0);
11537 op1 = expand_normal (arg1);
11538 mode0 = insn_data[icode].operand[0].mode;
11539 mode1 = insn_data[icode].operand[1].mode;
11540
11541 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11542 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
11543 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
11544 op1 = copy_to_mode_reg (mode1, op1);
11545
11546 pat = GEN_FCN (icode) (op0, op1);
11547 if (pat)
11548 emit_insn (pat);
11549
11550 *expandedp = true;
11551 return NULL_RTX;
11552 }
11553
11554 /* Expand the dst builtins. */
11555 static rtx
11556 altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
11557 bool *expandedp)
11558 {
11559 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11560 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11561 tree arg0, arg1, arg2;
11562 enum machine_mode mode0, mode1;
11563 rtx pat, op0, op1, op2;
11564 const struct builtin_description *d;
11565 size_t i;
11566
11567 *expandedp = false;
11568
11569 /* Handle DST variants. */
11570 d = bdesc_dst;
11571 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
11572 if (d->code == fcode)
11573 {
11574 arg0 = CALL_EXPR_ARG (exp, 0);
11575 arg1 = CALL_EXPR_ARG (exp, 1);
11576 arg2 = CALL_EXPR_ARG (exp, 2);
11577 op0 = expand_normal (arg0);
11578 op1 = expand_normal (arg1);
11579 op2 = expand_normal (arg2);
11580 mode0 = insn_data[d->icode].operand[0].mode;
11581 mode1 = insn_data[d->icode].operand[1].mode;
11582
11583 /* Invalid arguments, bail out before generating bad rtl. */
11584 if (arg0 == error_mark_node
11585 || arg1 == error_mark_node
11586 || arg2 == error_mark_node)
11587 return const0_rtx;
11588
11589 *expandedp = true;
11590 STRIP_NOPS (arg2);
11591 if (TREE_CODE (arg2) != INTEGER_CST
11592 || TREE_INT_CST_LOW (arg2) & ~0x3)
11593 {
11594 error ("argument to %qs must be a 2-bit unsigned literal", d->name);
11595 return const0_rtx;
11596 }
11597
11598 if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
11599 op0 = copy_to_mode_reg (Pmode, op0);
11600 if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
11601 op1 = copy_to_mode_reg (mode1, op1);
11602
11603 pat = GEN_FCN (d->icode) (op0, op1, op2);
11604 if (pat != 0)
11605 emit_insn (pat);
11606
11607 return NULL_RTX;
11608 }
11609
11610 return NULL_RTX;
11611 }
11612
11613 /* Expand vec_init builtin. */
11614 static rtx
11615 altivec_expand_vec_init_builtin (tree type, tree exp, rtx target)
11616 {
11617 enum machine_mode tmode = TYPE_MODE (type);
11618 enum machine_mode inner_mode = GET_MODE_INNER (tmode);
11619 int i, n_elt = GET_MODE_NUNITS (tmode);
11620 rtvec v = rtvec_alloc (n_elt);
11621
11622 gcc_assert (VECTOR_MODE_P (tmode));
11623 gcc_assert (n_elt == call_expr_nargs (exp));
11624
11625 for (i = 0; i < n_elt; ++i)
11626 {
11627 rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
11628 RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
11629 }
11630
11631 if (!target || !register_operand (target, tmode))
11632 target = gen_reg_rtx (tmode);
11633
11634 rs6000_expand_vector_init (target, gen_rtx_PARALLEL (tmode, v));
11635 return target;
11636 }
11637
11638 /* Return the integer constant in ARG. Constrain it to be in the range
11639 of the subparts of VEC_TYPE; issue an error if not. */
11640
11641 static int
11642 get_element_number (tree vec_type, tree arg)
11643 {
11644 unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
11645
11646 if (!host_integerp (arg, 1)
11647 || (elt = tree_low_cst (arg, 1), elt > max))
11648 {
11649 error ("selector must be an integer constant in the range 0..%wi", max);
11650 return 0;
11651 }
11652
11653 return elt;
11654 }
11655
11656 /* Expand vec_set builtin. */
11657 static rtx
11658 altivec_expand_vec_set_builtin (tree exp)
11659 {
11660 enum machine_mode tmode, mode1;
11661 tree arg0, arg1, arg2;
11662 int elt;
11663 rtx op0, op1;
11664
11665 arg0 = CALL_EXPR_ARG (exp, 0);
11666 arg1 = CALL_EXPR_ARG (exp, 1);
11667 arg2 = CALL_EXPR_ARG (exp, 2);
11668
11669 tmode = TYPE_MODE (TREE_TYPE (arg0));
11670 mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
11671 gcc_assert (VECTOR_MODE_P (tmode));
11672
11673 op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
11674 op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
11675 elt = get_element_number (TREE_TYPE (arg0), arg2);
11676
11677 if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
11678 op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
11679
11680 op0 = force_reg (tmode, op0);
11681 op1 = force_reg (mode1, op1);
11682
11683 rs6000_expand_vector_set (op0, op1, elt);
11684
11685 return op0;
11686 }
11687
11688 /* Expand vec_ext builtin. */
11689 static rtx
11690 altivec_expand_vec_ext_builtin (tree exp, rtx target)
11691 {
11692 enum machine_mode tmode, mode0;
11693 tree arg0, arg1;
11694 int elt;
11695 rtx op0;
11696
11697 arg0 = CALL_EXPR_ARG (exp, 0);
11698 arg1 = CALL_EXPR_ARG (exp, 1);
11699
11700 op0 = expand_normal (arg0);
11701 elt = get_element_number (TREE_TYPE (arg0), arg1);
11702
11703 tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
11704 mode0 = TYPE_MODE (TREE_TYPE (arg0));
11705 gcc_assert (VECTOR_MODE_P (mode0));
11706
11707 op0 = force_reg (mode0, op0);
11708
11709 if (optimize || !target || !register_operand (target, tmode))
11710 target = gen_reg_rtx (tmode);
11711
11712 rs6000_expand_vector_extract (target, op0, elt);
11713
11714 return target;
11715 }
11716
11717 /* Expand the builtin in EXP and store the result in TARGET. Store
11718 true in *EXPANDEDP if we found a builtin to expand. */
11719 static rtx
11720 altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
11721 {
11722 const struct builtin_description *d;
11723 const struct builtin_description_predicates *dp;
11724 size_t i;
11725 enum insn_code icode;
11726 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11727 tree arg0;
11728 rtx op0, pat;
11729 enum machine_mode tmode, mode0;
11730 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11731
11732 if ((fcode >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
11733 && fcode <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
11734 || (fcode >= VSX_BUILTIN_OVERLOADED_FIRST
11735 && fcode <= VSX_BUILTIN_OVERLOADED_LAST))
11736 {
11737 *expandedp = true;
11738 error ("unresolved overload for Altivec builtin %qF", fndecl);
11739 return const0_rtx;
11740 }
11741
11742 target = altivec_expand_ld_builtin (exp, target, expandedp);
11743 if (*expandedp)
11744 return target;
11745
11746 target = altivec_expand_st_builtin (exp, target, expandedp);
11747 if (*expandedp)
11748 return target;
11749
11750 target = altivec_expand_dst_builtin (exp, target, expandedp);
11751 if (*expandedp)
11752 return target;
11753
11754 *expandedp = true;
11755
11756 switch (fcode)
11757 {
11758 case ALTIVEC_BUILTIN_STVX:
11759 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx_v4si, exp);
11760 case ALTIVEC_BUILTIN_STVEBX:
11761 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, exp);
11762 case ALTIVEC_BUILTIN_STVEHX:
11763 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, exp);
11764 case ALTIVEC_BUILTIN_STVEWX:
11765 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, exp);
11766 case ALTIVEC_BUILTIN_STVXL:
11767 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, exp);
11768
11769 case ALTIVEC_BUILTIN_STVLX:
11770 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlx, exp);
11771 case ALTIVEC_BUILTIN_STVLXL:
11772 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlxl, exp);
11773 case ALTIVEC_BUILTIN_STVRX:
11774 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrx, exp);
11775 case ALTIVEC_BUILTIN_STVRXL:
11776 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrxl, exp);
11777
11778 case VSX_BUILTIN_STXVD2X_V2DF:
11779 return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v2df, exp);
11780 case VSX_BUILTIN_STXVD2X_V2DI:
11781 return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v2di, exp);
11782 case VSX_BUILTIN_STXVW4X_V4SF:
11783 return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v4sf, exp);
11784 case VSX_BUILTIN_STXVW4X_V4SI:
11785 return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v4si, exp);
11786 case VSX_BUILTIN_STXVW4X_V8HI:
11787 return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v8hi, exp);
11788 case VSX_BUILTIN_STXVW4X_V16QI:
11789 return altivec_expand_stv_builtin (CODE_FOR_vsx_store_v16qi, exp);
11790
11791 case ALTIVEC_BUILTIN_MFVSCR:
11792 icode = CODE_FOR_altivec_mfvscr;
11793 tmode = insn_data[icode].operand[0].mode;
11794
11795 if (target == 0
11796 || GET_MODE (target) != tmode
11797 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
11798 target = gen_reg_rtx (tmode);
11799
11800 pat = GEN_FCN (icode) (target);
11801 if (! pat)
11802 return 0;
11803 emit_insn (pat);
11804 return target;
11805
11806 case ALTIVEC_BUILTIN_MTVSCR:
11807 icode = CODE_FOR_altivec_mtvscr;
11808 arg0 = CALL_EXPR_ARG (exp, 0);
11809 op0 = expand_normal (arg0);
11810 mode0 = insn_data[icode].operand[0].mode;
11811
11812 /* If we got invalid arguments bail out before generating bad rtl. */
11813 if (arg0 == error_mark_node)
11814 return const0_rtx;
11815
11816 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11817 op0 = copy_to_mode_reg (mode0, op0);
11818
11819 pat = GEN_FCN (icode) (op0);
11820 if (pat)
11821 emit_insn (pat);
11822 return NULL_RTX;
11823
11824 case ALTIVEC_BUILTIN_DSSALL:
11825 emit_insn (gen_altivec_dssall ());
11826 return NULL_RTX;
11827
11828 case ALTIVEC_BUILTIN_DSS:
11829 icode = CODE_FOR_altivec_dss;
11830 arg0 = CALL_EXPR_ARG (exp, 0);
11831 STRIP_NOPS (arg0);
11832 op0 = expand_normal (arg0);
11833 mode0 = insn_data[icode].operand[0].mode;
11834
11835 /* If we got invalid arguments bail out before generating bad rtl. */
11836 if (arg0 == error_mark_node)
11837 return const0_rtx;
11838
11839 if (TREE_CODE (arg0) != INTEGER_CST
11840 || TREE_INT_CST_LOW (arg0) & ~0x3)
11841 {
11842 error ("argument to dss must be a 2-bit unsigned literal");
11843 return const0_rtx;
11844 }
11845
11846 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
11847 op0 = copy_to_mode_reg (mode0, op0);
11848
11849 emit_insn (gen_altivec_dss (op0));
11850 return NULL_RTX;
11851
11852 case ALTIVEC_BUILTIN_VEC_INIT_V4SI:
11853 case ALTIVEC_BUILTIN_VEC_INIT_V8HI:
11854 case ALTIVEC_BUILTIN_VEC_INIT_V16QI:
11855 case ALTIVEC_BUILTIN_VEC_INIT_V4SF:
11856 case VSX_BUILTIN_VEC_INIT_V2DF:
11857 case VSX_BUILTIN_VEC_INIT_V2DI:
11858 return altivec_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
11859
11860 case ALTIVEC_BUILTIN_VEC_SET_V4SI:
11861 case ALTIVEC_BUILTIN_VEC_SET_V8HI:
11862 case ALTIVEC_BUILTIN_VEC_SET_V16QI:
11863 case ALTIVEC_BUILTIN_VEC_SET_V4SF:
11864 case VSX_BUILTIN_VEC_SET_V2DF:
11865 case VSX_BUILTIN_VEC_SET_V2DI:
11866 return altivec_expand_vec_set_builtin (exp);
11867
11868 case ALTIVEC_BUILTIN_VEC_EXT_V4SI:
11869 case ALTIVEC_BUILTIN_VEC_EXT_V8HI:
11870 case ALTIVEC_BUILTIN_VEC_EXT_V16QI:
11871 case ALTIVEC_BUILTIN_VEC_EXT_V4SF:
11872 case VSX_BUILTIN_VEC_EXT_V2DF:
11873 case VSX_BUILTIN_VEC_EXT_V2DI:
11874 return altivec_expand_vec_ext_builtin (exp, target);
11875
11876 default:
11877 break;
11878 /* Fall through. */
11879 }
11880
11881 /* Expand abs* operations. */
11882 d = bdesc_abs;
11883 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
11884 if (d->code == fcode)
11885 return altivec_expand_abs_builtin (d->icode, exp, target);
11886
11887 /* Expand the AltiVec predicates. */
11888 dp = bdesc_altivec_preds;
11889 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
11890 if (dp->code == fcode)
11891 return altivec_expand_predicate_builtin (dp->icode, exp, target);
11892
11893 /* LV* are funky. We initialized them differently. */
11894 switch (fcode)
11895 {
11896 case ALTIVEC_BUILTIN_LVSL:
11897 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
11898 exp, target, false);
11899 case ALTIVEC_BUILTIN_LVSR:
11900 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
11901 exp, target, false);
11902 case ALTIVEC_BUILTIN_LVEBX:
11903 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
11904 exp, target, false);
11905 case ALTIVEC_BUILTIN_LVEHX:
11906 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
11907 exp, target, false);
11908 case ALTIVEC_BUILTIN_LVEWX:
11909 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
11910 exp, target, false);
11911 case ALTIVEC_BUILTIN_LVXL:
11912 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
11913 exp, target, false);
11914 case ALTIVEC_BUILTIN_LVX:
11915 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx_v4si,
11916 exp, target, false);
11917 case ALTIVEC_BUILTIN_LVLX:
11918 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlx,
11919 exp, target, true);
11920 case ALTIVEC_BUILTIN_LVLXL:
11921 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlxl,
11922 exp, target, true);
11923 case ALTIVEC_BUILTIN_LVRX:
11924 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrx,
11925 exp, target, true);
11926 case ALTIVEC_BUILTIN_LVRXL:
11927 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrxl,
11928 exp, target, true);
11929 case VSX_BUILTIN_LXVD2X_V2DF:
11930 return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v2df,
11931 exp, target, false);
11932 case VSX_BUILTIN_LXVD2X_V2DI:
11933 return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v2di,
11934 exp, target, false);
11935 case VSX_BUILTIN_LXVW4X_V4SF:
11936 return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v4sf,
11937 exp, target, false);
11938 case VSX_BUILTIN_LXVW4X_V4SI:
11939 return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v4si,
11940 exp, target, false);
11941 case VSX_BUILTIN_LXVW4X_V8HI:
11942 return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v8hi,
11943 exp, target, false);
11944 case VSX_BUILTIN_LXVW4X_V16QI:
11945 return altivec_expand_lv_builtin (CODE_FOR_vsx_load_v16qi,
11946 exp, target, false);
11947 break;
11948 default:
11949 break;
11950 /* Fall through. */
11951 }
11952
11953 *expandedp = false;
11954 return NULL_RTX;
11955 }
11956
11957 /* Expand the builtin in EXP and store the result in TARGET. Store
11958 true in *EXPANDEDP if we found a builtin to expand. */
11959 static rtx
11960 paired_expand_builtin (tree exp, rtx target, bool * expandedp)
11961 {
11962 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11963 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
11964 const struct builtin_description *d;
11965 size_t i;
11966
11967 *expandedp = true;
11968
11969 switch (fcode)
11970 {
11971 case PAIRED_BUILTIN_STX:
11972 return paired_expand_stv_builtin (CODE_FOR_paired_stx, exp);
11973 case PAIRED_BUILTIN_LX:
11974 return paired_expand_lv_builtin (CODE_FOR_paired_lx, exp, target);
11975 default:
11976 break;
11977 /* Fall through. */
11978 }
11979
11980 /* Expand the paired predicates. */
11981 d = bdesc_paired_preds;
11982 for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); i++, d++)
11983 if (d->code == fcode)
11984 return paired_expand_predicate_builtin (d->icode, exp, target);
11985
11986 *expandedp = false;
11987 return NULL_RTX;
11988 }
11989
11990 /* Binops that need to be initialized manually, but can be expanded
11991 automagically by rs6000_expand_binop_builtin. */
11992 static struct builtin_description bdesc_2arg_spe[] =
11993 {
11994 { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
11995 { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
11996 { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
11997 { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
11998 { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
11999 { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
12000 { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
12001 { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
12002 { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
12003 { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
12004 { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
12005 { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
12006 { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
12007 { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
12008 { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
12009 { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
12010 { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
12011 { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
12012 { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
12013 { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
12014 { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
12015 { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
12016 };
12017
12018 /* Expand the builtin in EXP and store the result in TARGET. Store
12019 true in *EXPANDEDP if we found a builtin to expand.
12020
12021 This expands the SPE builtins that are not simple unary and binary
12022 operations. */
12023 static rtx
12024 spe_expand_builtin (tree exp, rtx target, bool *expandedp)
12025 {
12026 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
12027 tree arg1, arg0;
12028 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
12029 enum insn_code icode;
12030 enum machine_mode tmode, mode0;
12031 rtx pat, op0;
12032 struct builtin_description *d;
12033 size_t i;
12034
12035 *expandedp = true;
12036
12037 /* Syntax check for a 5-bit unsigned immediate. */
12038 switch (fcode)
12039 {
12040 case SPE_BUILTIN_EVSTDD:
12041 case SPE_BUILTIN_EVSTDH:
12042 case SPE_BUILTIN_EVSTDW:
12043 case SPE_BUILTIN_EVSTWHE:
12044 case SPE_BUILTIN_EVSTWHO:
12045 case SPE_BUILTIN_EVSTWWE:
12046 case SPE_BUILTIN_EVSTWWO:
12047 arg1 = CALL_EXPR_ARG (exp, 2);
12048 if (TREE_CODE (arg1) != INTEGER_CST
12049 || TREE_INT_CST_LOW (arg1) & ~0x1f)
12050 {
12051 error ("argument 2 must be a 5-bit unsigned literal");
12052 return const0_rtx;
12053 }
12054 break;
12055 default:
12056 break;
12057 }
12058
12059 /* The evsplat*i instructions are not quite generic. */
12060 switch (fcode)
12061 {
12062 case SPE_BUILTIN_EVSPLATFI:
12063 return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
12064 exp, target);
12065 case SPE_BUILTIN_EVSPLATI:
12066 return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
12067 exp, target);
12068 default:
12069 break;
12070 }
12071
12072 d = (struct builtin_description *) bdesc_2arg_spe;
12073 for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
12074 if (d->code == fcode)
12075 return rs6000_expand_binop_builtin (d->icode, exp, target);
12076
12077 d = (struct builtin_description *) bdesc_spe_predicates;
12078 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
12079 if (d->code == fcode)
12080 return spe_expand_predicate_builtin (d->icode, exp, target);
12081
12082 d = (struct builtin_description *) bdesc_spe_evsel;
12083 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
12084 if (d->code == fcode)
12085 return spe_expand_evsel_builtin (d->icode, exp, target);
12086
12087 switch (fcode)
12088 {
12089 case SPE_BUILTIN_EVSTDDX:
12090 return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, exp);
12091 case SPE_BUILTIN_EVSTDHX:
12092 return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, exp);
12093 case SPE_BUILTIN_EVSTDWX:
12094 return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, exp);
12095 case SPE_BUILTIN_EVSTWHEX:
12096 return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, exp);
12097 case SPE_BUILTIN_EVSTWHOX:
12098 return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, exp);
12099 case SPE_BUILTIN_EVSTWWEX:
12100 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, exp);
12101 case SPE_BUILTIN_EVSTWWOX:
12102 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, exp);
12103 case SPE_BUILTIN_EVSTDD:
12104 return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, exp);
12105 case SPE_BUILTIN_EVSTDH:
12106 return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, exp);
12107 case SPE_BUILTIN_EVSTDW:
12108 return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, exp);
12109 case SPE_BUILTIN_EVSTWHE:
12110 return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, exp);
12111 case SPE_BUILTIN_EVSTWHO:
12112 return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, exp);
12113 case SPE_BUILTIN_EVSTWWE:
12114 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, exp);
12115 case SPE_BUILTIN_EVSTWWO:
12116 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, exp);
12117 case SPE_BUILTIN_MFSPEFSCR:
12118 icode = CODE_FOR_spe_mfspefscr;
12119 tmode = insn_data[icode].operand[0].mode;
12120
12121 if (target == 0
12122 || GET_MODE (target) != tmode
12123 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
12124 target = gen_reg_rtx (tmode);
12125
12126 pat = GEN_FCN (icode) (target);
12127 if (! pat)
12128 return 0;
12129 emit_insn (pat);
12130 return target;
12131 case SPE_BUILTIN_MTSPEFSCR:
12132 icode = CODE_FOR_spe_mtspefscr;
12133 arg0 = CALL_EXPR_ARG (exp, 0);
12134 op0 = expand_normal (arg0);
12135 mode0 = insn_data[icode].operand[0].mode;
12136
12137 if (arg0 == error_mark_node)
12138 return const0_rtx;
12139
12140 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
12141 op0 = copy_to_mode_reg (mode0, op0);
12142
12143 pat = GEN_FCN (icode) (op0);
12144 if (pat)
12145 emit_insn (pat);
12146 return NULL_RTX;
12147 default:
12148 break;
12149 }
12150
12151 *expandedp = false;
12152 return NULL_RTX;
12153 }
12154
12155 static rtx
12156 paired_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
12157 {
12158 rtx pat, scratch, tmp;
12159 tree form = CALL_EXPR_ARG (exp, 0);
12160 tree arg0 = CALL_EXPR_ARG (exp, 1);
12161 tree arg1 = CALL_EXPR_ARG (exp, 2);
12162 rtx op0 = expand_normal (arg0);
12163 rtx op1 = expand_normal (arg1);
12164 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
12165 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
12166 int form_int;
12167 enum rtx_code code;
12168
12169 if (TREE_CODE (form) != INTEGER_CST)
12170 {
12171 error ("argument 1 of __builtin_paired_predicate must be a constant");
12172 return const0_rtx;
12173 }
12174 else
12175 form_int = TREE_INT_CST_LOW (form);
12176
12177 gcc_assert (mode0 == mode1);
12178
12179 if (arg0 == error_mark_node || arg1 == error_mark_node)
12180 return const0_rtx;
12181
12182 if (target == 0
12183 || GET_MODE (target) != SImode
12184 || !(*insn_data[icode].operand[0].predicate) (target, SImode))
12185 target = gen_reg_rtx (SImode);
12186 if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
12187 op0 = copy_to_mode_reg (mode0, op0);
12188 if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
12189 op1 = copy_to_mode_reg (mode1, op1);
12190
12191 scratch = gen_reg_rtx (CCFPmode);
12192
12193 pat = GEN_FCN (icode) (scratch, op0, op1);
12194 if (!pat)
12195 return const0_rtx;
12196
12197 emit_insn (pat);
12198
12199 switch (form_int)
12200 {
12201 /* LT bit. */
12202 case 0:
12203 code = LT;
12204 break;
12205 /* GT bit. */
12206 case 1:
12207 code = GT;
12208 break;
12209 /* EQ bit. */
12210 case 2:
12211 code = EQ;
12212 break;
12213 /* UN bit. */
12214 case 3:
12215 emit_insn (gen_move_from_CR_ov_bit (target, scratch));
12216 return target;
12217 default:
12218 error ("argument 1 of __builtin_paired_predicate is out of range");
12219 return const0_rtx;
12220 }
12221
12222 tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
12223 emit_move_insn (target, tmp);
12224 return target;
12225 }
12226
12227 static rtx
12228 spe_expand_predicate_builtin (enum insn_code icode, tree exp, rtx target)
12229 {
12230 rtx pat, scratch, tmp;
12231 tree form = CALL_EXPR_ARG (exp, 0);
12232 tree arg0 = CALL_EXPR_ARG (exp, 1);
12233 tree arg1 = CALL_EXPR_ARG (exp, 2);
12234 rtx op0 = expand_normal (arg0);
12235 rtx op1 = expand_normal (arg1);
12236 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
12237 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
12238 int form_int;
12239 enum rtx_code code;
12240
12241 if (TREE_CODE (form) != INTEGER_CST)
12242 {
12243 error ("argument 1 of __builtin_spe_predicate must be a constant");
12244 return const0_rtx;
12245 }
12246 else
12247 form_int = TREE_INT_CST_LOW (form);
12248
12249 gcc_assert (mode0 == mode1);
12250
12251 if (arg0 == error_mark_node || arg1 == error_mark_node)
12252 return const0_rtx;
12253
12254 if (target == 0
12255 || GET_MODE (target) != SImode
12256 || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
12257 target = gen_reg_rtx (SImode);
12258
12259 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
12260 op0 = copy_to_mode_reg (mode0, op0);
12261 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
12262 op1 = copy_to_mode_reg (mode1, op1);
12263
12264 scratch = gen_reg_rtx (CCmode);
12265
12266 pat = GEN_FCN (icode) (scratch, op0, op1);
12267 if (! pat)
12268 return const0_rtx;
12269 emit_insn (pat);
12270
12271 /* There are 4 variants for each predicate: _any_, _all_, _upper_,
12272 _lower_. We use one compare, but look in different bits of the
12273 CR for each variant.
12274
12275 There are 2 elements in each SPE simd type (upper/lower). The CR
12276 bits are set as follows:
12277
12278 BIT0 | BIT 1 | BIT 2 | BIT 3
12279 U | L | (U | L) | (U & L)
12280
12281 So, for an "all" relationship, BIT 3 would be set.
12282 For an "any" relationship, BIT 2 would be set. Etc.
12283
12284 Following traditional nomenclature, these bits map to:
12285
12286 BIT0 | BIT 1 | BIT 2 | BIT 3
12287 LT | GT | EQ | OV
12288
12289 Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
12290 */
12291
12292 switch (form_int)
12293 {
12294 /* All variant. OV bit. */
12295 case 0:
12296 /* We need to get to the OV bit, which is the ORDERED bit. We
12297 could generate (ordered:SI (reg:CC xx) (const_int 0)), but
12298 that's ugly and will make validate_condition_mode die.
12299 So let's just use another pattern. */
12300 emit_insn (gen_move_from_CR_ov_bit (target, scratch));
12301 return target;
12302 /* Any variant. EQ bit. */
12303 case 1:
12304 code = EQ;
12305 break;
12306 /* Upper variant. LT bit. */
12307 case 2:
12308 code = LT;
12309 break;
12310 /* Lower variant. GT bit. */
12311 case 3:
12312 code = GT;
12313 break;
12314 default:
12315 error ("argument 1 of __builtin_spe_predicate is out of range");
12316 return const0_rtx;
12317 }
12318
12319 tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
12320 emit_move_insn (target, tmp);
12321
12322 return target;
12323 }
12324
12325 /* The evsel builtins look like this:
12326
12327 e = __builtin_spe_evsel_OP (a, b, c, d);
12328
12329 and work like this:
12330
12331 e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
12332 e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
12333 */
12334
12335 static rtx
12336 spe_expand_evsel_builtin (enum insn_code icode, tree exp, rtx target)
12337 {
12338 rtx pat, scratch;
12339 tree arg0 = CALL_EXPR_ARG (exp, 0);
12340 tree arg1 = CALL_EXPR_ARG (exp, 1);
12341 tree arg2 = CALL_EXPR_ARG (exp, 2);
12342 tree arg3 = CALL_EXPR_ARG (exp, 3);
12343 rtx op0 = expand_normal (arg0);
12344 rtx op1 = expand_normal (arg1);
12345 rtx op2 = expand_normal (arg2);
12346 rtx op3 = expand_normal (arg3);
12347 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
12348 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
12349
12350 gcc_assert (mode0 == mode1);
12351
12352 if (arg0 == error_mark_node || arg1 == error_mark_node
12353 || arg2 == error_mark_node || arg3 == error_mark_node)
12354 return const0_rtx;
12355
12356 if (target == 0
12357 || GET_MODE (target) != mode0
12358 || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
12359 target = gen_reg_rtx (mode0);
12360
12361 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
12362 op0 = copy_to_mode_reg (mode0, op0);
12363 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
12364 op1 = copy_to_mode_reg (mode0, op1);
12365 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
12366 op2 = copy_to_mode_reg (mode0, op2);
12367 if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
12368 op3 = copy_to_mode_reg (mode0, op3);
12369
12370 /* Generate the compare. */
12371 scratch = gen_reg_rtx (CCmode);
12372 pat = GEN_FCN (icode) (scratch, op0, op1);
12373 if (! pat)
12374 return const0_rtx;
12375 emit_insn (pat);
12376
12377 if (mode0 == V2SImode)
12378 emit_insn (gen_spe_evsel (target, op2, op3, scratch));
12379 else
12380 emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
12381
12382 return target;
12383 }
12384
12385 /* Expand an expression EXP that calls a built-in function,
12386 with result going to TARGET if that's convenient
12387 (and in mode MODE if that's convenient).
12388 SUBTARGET may be used as the target for computing one of EXP's operands.
12389 IGNORE is nonzero if the value is to be ignored. */
12390
12391 static rtx
12392 rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
12393 enum machine_mode mode ATTRIBUTE_UNUSED,
12394 int ignore ATTRIBUTE_UNUSED)
12395 {
12396 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
12397 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
12398 const struct builtin_description *d;
12399 size_t i;
12400 rtx ret;
12401 bool success;
12402
12403 switch (fcode)
12404 {
12405 case RS6000_BUILTIN_RECIP:
12406 return rs6000_expand_binop_builtin (CODE_FOR_recipdf3, exp, target);
12407
12408 case RS6000_BUILTIN_RECIPF:
12409 return rs6000_expand_binop_builtin (CODE_FOR_recipsf3, exp, target);
12410
12411 case RS6000_BUILTIN_RSQRTF:
12412 return rs6000_expand_unop_builtin (CODE_FOR_rsqrtsf2, exp, target);
12413
12414 case RS6000_BUILTIN_RSQRT:
12415 return rs6000_expand_unop_builtin (CODE_FOR_rsqrtdf2, exp, target);
12416
12417 case RS6000_BUILTIN_BSWAP_HI:
12418 return rs6000_expand_unop_builtin (CODE_FOR_bswaphi2, exp, target);
12419
12420 case POWER7_BUILTIN_BPERMD:
12421 return rs6000_expand_binop_builtin (((TARGET_64BIT)
12422 ? CODE_FOR_bpermd_di
12423 : CODE_FOR_bpermd_si), exp, target);
12424
12425 case ALTIVEC_BUILTIN_MASK_FOR_LOAD:
12426 case ALTIVEC_BUILTIN_MASK_FOR_STORE:
12427 {
12428 int icode = (int) CODE_FOR_altivec_lvsr;
12429 enum machine_mode tmode = insn_data[icode].operand[0].mode;
12430 enum machine_mode mode = insn_data[icode].operand[1].mode;
12431 tree arg;
12432 rtx op, addr, pat;
12433
12434 gcc_assert (TARGET_ALTIVEC);
12435
12436 arg = CALL_EXPR_ARG (exp, 0);
12437 gcc_assert (POINTER_TYPE_P (TREE_TYPE (arg)));
12438 op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
12439 addr = memory_address (mode, op);
12440 if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
12441 op = addr;
12442 else
12443 {
12444 /* For the load case need to negate the address. */
12445 op = gen_reg_rtx (GET_MODE (addr));
12446 emit_insn (gen_rtx_SET (VOIDmode, op,
12447 gen_rtx_NEG (GET_MODE (addr), addr)));
12448 }
12449 op = gen_rtx_MEM (mode, op);
12450
12451 if (target == 0
12452 || GET_MODE (target) != tmode
12453 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
12454 target = gen_reg_rtx (tmode);
12455
12456 /*pat = gen_altivec_lvsr (target, op);*/
12457 pat = GEN_FCN (icode) (target, op);
12458 if (!pat)
12459 return 0;
12460 emit_insn (pat);
12461
12462 return target;
12463 }
12464
12465 case ALTIVEC_BUILTIN_VCFUX:
12466 case ALTIVEC_BUILTIN_VCFSX:
12467 case ALTIVEC_BUILTIN_VCTUXS:
12468 case ALTIVEC_BUILTIN_VCTSXS:
12469 /* FIXME: There's got to be a nicer way to handle this case than
12470 constructing a new CALL_EXPR. */
12471 if (call_expr_nargs (exp) == 1)
12472 {
12473 exp = build_call_nary (TREE_TYPE (exp), CALL_EXPR_FN (exp),
12474 2, CALL_EXPR_ARG (exp, 0), integer_zero_node);
12475 }
12476 break;
12477
12478 default:
12479 break;
12480 }
12481
12482 if (TARGET_ALTIVEC)
12483 {
12484 ret = altivec_expand_builtin (exp, target, &success);
12485
12486 if (success)
12487 return ret;
12488 }
12489 if (TARGET_SPE)
12490 {
12491 ret = spe_expand_builtin (exp, target, &success);
12492
12493 if (success)
12494 return ret;
12495 }
12496 if (TARGET_PAIRED_FLOAT)
12497 {
12498 ret = paired_expand_builtin (exp, target, &success);
12499
12500 if (success)
12501 return ret;
12502 }
12503
12504 gcc_assert (TARGET_ALTIVEC || TARGET_VSX || TARGET_SPE || TARGET_PAIRED_FLOAT);
12505
12506 /* Handle simple unary operations. */
12507 d = (struct builtin_description *) bdesc_1arg;
12508 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
12509 if (d->code == fcode)
12510 return rs6000_expand_unop_builtin (d->icode, exp, target);
12511
12512 /* Handle simple binary operations. */
12513 d = (struct builtin_description *) bdesc_2arg;
12514 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
12515 if (d->code == fcode)
12516 return rs6000_expand_binop_builtin (d->icode, exp, target);
12517
12518 /* Handle simple ternary operations. */
12519 d = bdesc_3arg;
12520 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
12521 if (d->code == fcode)
12522 return rs6000_expand_ternop_builtin (d->icode, exp, target);
12523
12524 gcc_unreachable ();
12525 }
12526
12527 static void
12528 rs6000_init_builtins (void)
12529 {
12530 tree tdecl;
12531 tree ftype;
12532
12533 V2SI_type_node = build_vector_type (intSI_type_node, 2);
12534 V2SF_type_node = build_vector_type (float_type_node, 2);
12535 V2DI_type_node = build_vector_type (intDI_type_node, 2);
12536 V2DF_type_node = build_vector_type (double_type_node, 2);
12537 V4HI_type_node = build_vector_type (intHI_type_node, 4);
12538 V4SI_type_node = build_vector_type (intSI_type_node, 4);
12539 V4SF_type_node = build_vector_type (float_type_node, 4);
12540 V8HI_type_node = build_vector_type (intHI_type_node, 8);
12541 V16QI_type_node = build_vector_type (intQI_type_node, 16);
12542
12543 unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16);
12544 unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8);
12545 unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4);
12546 unsigned_V2DI_type_node = build_vector_type (unsigned_intDI_type_node, 2);
12547
12548 opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2);
12549 opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2);
12550 opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
12551 opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4);
12552
12553 /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
12554 types, especially in C++ land. Similarly, 'vector pixel' is distinct from
12555 'vector unsigned short'. */
12556
12557 bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
12558 bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
12559 bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
12560 bool_long_type_node = build_distinct_type_copy (unsigned_intDI_type_node);
12561 pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
12562
12563 long_integer_type_internal_node = long_integer_type_node;
12564 long_unsigned_type_internal_node = long_unsigned_type_node;
12565 long_long_integer_type_internal_node = long_long_integer_type_node;
12566 long_long_unsigned_type_internal_node = long_long_unsigned_type_node;
12567 intQI_type_internal_node = intQI_type_node;
12568 uintQI_type_internal_node = unsigned_intQI_type_node;
12569 intHI_type_internal_node = intHI_type_node;
12570 uintHI_type_internal_node = unsigned_intHI_type_node;
12571 intSI_type_internal_node = intSI_type_node;
12572 uintSI_type_internal_node = unsigned_intSI_type_node;
12573 intDI_type_internal_node = intDI_type_node;
12574 uintDI_type_internal_node = unsigned_intDI_type_node;
12575 float_type_internal_node = float_type_node;
12576 double_type_internal_node = double_type_node;
12577 void_type_internal_node = void_type_node;
12578
12579 /* Initialize the modes for builtin_function_type, mapping a machine mode to
12580 tree type node. */
12581 builtin_mode_to_type[QImode][0] = integer_type_node;
12582 builtin_mode_to_type[HImode][0] = integer_type_node;
12583 builtin_mode_to_type[SImode][0] = intSI_type_node;
12584 builtin_mode_to_type[SImode][1] = unsigned_intSI_type_node;
12585 builtin_mode_to_type[DImode][0] = intDI_type_node;
12586 builtin_mode_to_type[DImode][1] = unsigned_intDI_type_node;
12587 builtin_mode_to_type[SFmode][0] = float_type_node;
12588 builtin_mode_to_type[DFmode][0] = double_type_node;
12589 builtin_mode_to_type[V2SImode][0] = V2SI_type_node;
12590 builtin_mode_to_type[V2SFmode][0] = V2SF_type_node;
12591 builtin_mode_to_type[V2DImode][0] = V2DI_type_node;
12592 builtin_mode_to_type[V2DImode][1] = unsigned_V2DI_type_node;
12593 builtin_mode_to_type[V2DFmode][0] = V2DF_type_node;
12594 builtin_mode_to_type[V4HImode][0] = V4HI_type_node;
12595 builtin_mode_to_type[V4SImode][0] = V4SI_type_node;
12596 builtin_mode_to_type[V4SImode][1] = unsigned_V4SI_type_node;
12597 builtin_mode_to_type[V4SFmode][0] = V4SF_type_node;
12598 builtin_mode_to_type[V8HImode][0] = V8HI_type_node;
12599 builtin_mode_to_type[V8HImode][1] = unsigned_V8HI_type_node;
12600 builtin_mode_to_type[V16QImode][0] = V16QI_type_node;
12601 builtin_mode_to_type[V16QImode][1] = unsigned_V16QI_type_node;
12602
12603 tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12604 get_identifier ("__bool char"),
12605 bool_char_type_node);
12606 TYPE_NAME (bool_char_type_node) = tdecl;
12607 (*lang_hooks.decls.pushdecl) (tdecl);
12608 tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12609 get_identifier ("__bool short"),
12610 bool_short_type_node);
12611 TYPE_NAME (bool_short_type_node) = tdecl;
12612 (*lang_hooks.decls.pushdecl) (tdecl);
12613 tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12614 get_identifier ("__bool int"),
12615 bool_int_type_node);
12616 TYPE_NAME (bool_int_type_node) = tdecl;
12617 (*lang_hooks.decls.pushdecl) (tdecl);
12618 tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("__pixel"),
12619 pixel_type_node);
12620 TYPE_NAME (pixel_type_node) = tdecl;
12621 (*lang_hooks.decls.pushdecl) (tdecl);
12622
12623 bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
12624 bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
12625 bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
12626 bool_V2DI_type_node = build_vector_type (bool_long_type_node, 2);
12627 pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
12628
12629 tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12630 get_identifier ("__vector unsigned char"),
12631 unsigned_V16QI_type_node);
12632 TYPE_NAME (unsigned_V16QI_type_node) = tdecl;
12633 (*lang_hooks.decls.pushdecl) (tdecl);
12634 tdecl = build_decl (BUILTINS_LOCATION,
12635 TYPE_DECL, get_identifier ("__vector signed char"),
12636 V16QI_type_node);
12637 TYPE_NAME (V16QI_type_node) = tdecl;
12638 (*lang_hooks.decls.pushdecl) (tdecl);
12639 tdecl = build_decl (BUILTINS_LOCATION,
12640 TYPE_DECL, get_identifier ("__vector __bool char"),
12641 bool_V16QI_type_node);
12642 TYPE_NAME ( bool_V16QI_type_node) = tdecl;
12643 (*lang_hooks.decls.pushdecl) (tdecl);
12644
12645 tdecl = build_decl (BUILTINS_LOCATION,
12646 TYPE_DECL, get_identifier ("__vector unsigned short"),
12647 unsigned_V8HI_type_node);
12648 TYPE_NAME (unsigned_V8HI_type_node) = tdecl;
12649 (*lang_hooks.decls.pushdecl) (tdecl);
12650 tdecl = build_decl (BUILTINS_LOCATION,
12651 TYPE_DECL, get_identifier ("__vector signed short"),
12652 V8HI_type_node);
12653 TYPE_NAME (V8HI_type_node) = tdecl;
12654 (*lang_hooks.decls.pushdecl) (tdecl);
12655 tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12656 get_identifier ("__vector __bool short"),
12657 bool_V8HI_type_node);
12658 TYPE_NAME (bool_V8HI_type_node) = tdecl;
12659 (*lang_hooks.decls.pushdecl) (tdecl);
12660
12661 tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL,
12662 get_identifier ("__vector unsigned int"),
12663 unsigned_V4SI_type_node);
12664 TYPE_NAME (unsigned_V4SI_type_node) = tdecl;
12665 (*lang_hooks.decls.pushdecl) (tdecl);
12666 tdecl = build_decl (BUILTINS_LOCATION,
12667 TYPE_DECL, get_identifier ("__vector signed int"),
12668 V4SI_type_node);
12669 TYPE_NAME (V4SI_type_node) = tdecl;
12670 (*lang_hooks.decls.pushdecl) (tdecl);
12671 tdecl = build_decl (BUILTINS_LOCATION,
12672 TYPE_DECL, get_identifier ("__vector __bool int"),
12673 bool_V4SI_type_node);
12674 TYPE_NAME (bool_V4SI_type_node) = tdecl;
12675 (*lang_hooks.decls.pushdecl) (tdecl);
12676
12677 tdecl = build_decl (BUILTINS_LOCATION,
12678 TYPE_DECL, get_identifier ("__vector float"),
12679 V4SF_type_node);
12680 TYPE_NAME (V4SF_type_node) = tdecl;
12681 (*lang_hooks.decls.pushdecl) (tdecl);
12682 tdecl = build_decl (BUILTINS_LOCATION,
12683 TYPE_DECL, get_identifier ("__vector __pixel"),
12684 pixel_V8HI_type_node);
12685 TYPE_NAME (pixel_V8HI_type_node) = tdecl;
12686 (*lang_hooks.decls.pushdecl) (tdecl);
12687
12688 if (TARGET_VSX)
12689 {
12690 tdecl = build_decl (BUILTINS_LOCATION,
12691 TYPE_DECL, get_identifier ("__vector double"),
12692 V2DF_type_node);
12693 TYPE_NAME (V2DF_type_node) = tdecl;
12694 (*lang_hooks.decls.pushdecl) (tdecl);
12695
12696 tdecl = build_decl (BUILTINS_LOCATION,
12697 TYPE_DECL, get_identifier ("__vector long"),
12698 V2DI_type_node);
12699 TYPE_NAME (V2DI_type_node) = tdecl;
12700 (*lang_hooks.decls.pushdecl) (tdecl);
12701
12702 tdecl = build_decl (BUILTINS_LOCATION,
12703 TYPE_DECL, get_identifier ("__vector unsigned long"),
12704 unsigned_V2DI_type_node);
12705 TYPE_NAME (unsigned_V2DI_type_node) = tdecl;
12706 (*lang_hooks.decls.pushdecl) (tdecl);
12707
12708 tdecl = build_decl (BUILTINS_LOCATION,
12709 TYPE_DECL, get_identifier ("__vector __bool long"),
12710 bool_V2DI_type_node);
12711 TYPE_NAME (bool_V2DI_type_node) = tdecl;
12712 (*lang_hooks.decls.pushdecl) (tdecl);
12713 }
12714
12715 if (TARGET_PAIRED_FLOAT)
12716 paired_init_builtins ();
12717 if (TARGET_SPE)
12718 spe_init_builtins ();
12719 if (TARGET_ALTIVEC)
12720 altivec_init_builtins ();
12721 if (TARGET_ALTIVEC || TARGET_SPE || TARGET_PAIRED_FLOAT || TARGET_VSX)
12722 rs6000_common_init_builtins ();
12723 if (TARGET_FRE)
12724 {
12725 ftype = builtin_function_type (DFmode, DFmode, DFmode, VOIDmode,
12726 RS6000_BUILTIN_RECIP,
12727 "__builtin_recipdiv");
12728 def_builtin (MASK_POPCNTB, "__builtin_recipdiv", ftype,
12729 RS6000_BUILTIN_RECIP);
12730 }
12731 if (TARGET_FRES)
12732 {
12733 ftype = builtin_function_type (SFmode, SFmode, SFmode, VOIDmode,
12734 RS6000_BUILTIN_RECIPF,
12735 "__builtin_recipdivf");
12736 def_builtin (MASK_PPC_GFXOPT, "__builtin_recipdivf", ftype,
12737 RS6000_BUILTIN_RECIPF);
12738 }
12739 if (TARGET_FRSQRTE)
12740 {
12741 ftype = builtin_function_type (DFmode, DFmode, VOIDmode, VOIDmode,
12742 RS6000_BUILTIN_RSQRT,
12743 "__builtin_rsqrt");
12744 def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrt", ftype,
12745 RS6000_BUILTIN_RSQRT);
12746 }
12747 if (TARGET_FRSQRTES)
12748 {
12749 ftype = builtin_function_type (SFmode, SFmode, VOIDmode, VOIDmode,
12750 RS6000_BUILTIN_RSQRTF,
12751 "__builtin_rsqrtf");
12752 def_builtin (MASK_PPC_GFXOPT, "__builtin_rsqrtf", ftype,
12753 RS6000_BUILTIN_RSQRTF);
12754 }
12755 if (TARGET_POPCNTD)
12756 {
12757 enum machine_mode mode = (TARGET_64BIT) ? DImode : SImode;
12758 tree ftype = builtin_function_type (mode, mode, mode, VOIDmode,
12759 POWER7_BUILTIN_BPERMD,
12760 "__builtin_bpermd");
12761 def_builtin (MASK_POPCNTD, "__builtin_bpermd", ftype,
12762 POWER7_BUILTIN_BPERMD);
12763 }
12764 if (TARGET_POWERPC)
12765 {
12766 /* Don't use builtin_function_type here, as it maps HI/QI to SI. */
12767 tree ftype = build_function_type_list (unsigned_intHI_type_node,
12768 unsigned_intHI_type_node,
12769 NULL_TREE);
12770 def_builtin (MASK_POWERPC, "__builtin_bswap16", ftype,
12771 RS6000_BUILTIN_BSWAP_HI);
12772 }
12773
12774 #if TARGET_XCOFF
12775 /* AIX libm provides clog as __clog. */
12776 if (built_in_decls [BUILT_IN_CLOG])
12777 set_user_assembler_name (built_in_decls [BUILT_IN_CLOG], "__clog");
12778 #endif
12779
12780 #ifdef SUBTARGET_INIT_BUILTINS
12781 SUBTARGET_INIT_BUILTINS;
12782 #endif
12783 }
12784
12785 /* Returns the rs6000 builtin decl for CODE. */
12786
12787 static tree
12788 rs6000_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
12789 {
12790 if (code >= RS6000_BUILTIN_COUNT)
12791 return error_mark_node;
12792
12793 return rs6000_builtin_decls[code];
12794 }
12795
12796 /* Search through a set of builtins and enable the mask bits.
12797 DESC is an array of builtins.
12798 SIZE is the total number of builtins.
12799 START is the builtin enum at which to start.
12800 END is the builtin enum at which to end. */
12801 static void
12802 enable_mask_for_builtins (struct builtin_description *desc, int size,
12803 enum rs6000_builtins start,
12804 enum rs6000_builtins end)
12805 {
12806 int i;
12807
12808 for (i = 0; i < size; ++i)
12809 if (desc[i].code == start)
12810 break;
12811
12812 if (i == size)
12813 return;
12814
12815 for (; i < size; ++i)
12816 {
12817 /* Flip all the bits on. */
12818 desc[i].mask = target_flags;
12819 if (desc[i].code == end)
12820 break;
12821 }
12822 }
12823
12824 static void
12825 spe_init_builtins (void)
12826 {
12827 tree endlink = void_list_node;
12828 tree puint_type_node = build_pointer_type (unsigned_type_node);
12829 tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
12830 struct builtin_description *d;
12831 size_t i;
12832
12833 tree v2si_ftype_4_v2si
12834 = build_function_type
12835 (opaque_V2SI_type_node,
12836 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12837 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12838 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12839 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12840 endlink)))));
12841
12842 tree v2sf_ftype_4_v2sf
12843 = build_function_type
12844 (opaque_V2SF_type_node,
12845 tree_cons (NULL_TREE, opaque_V2SF_type_node,
12846 tree_cons (NULL_TREE, opaque_V2SF_type_node,
12847 tree_cons (NULL_TREE, opaque_V2SF_type_node,
12848 tree_cons (NULL_TREE, opaque_V2SF_type_node,
12849 endlink)))));
12850
12851 tree int_ftype_int_v2si_v2si
12852 = build_function_type
12853 (integer_type_node,
12854 tree_cons (NULL_TREE, integer_type_node,
12855 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12856 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12857 endlink))));
12858
12859 tree int_ftype_int_v2sf_v2sf
12860 = build_function_type
12861 (integer_type_node,
12862 tree_cons (NULL_TREE, integer_type_node,
12863 tree_cons (NULL_TREE, opaque_V2SF_type_node,
12864 tree_cons (NULL_TREE, opaque_V2SF_type_node,
12865 endlink))));
12866
12867 tree void_ftype_v2si_puint_int
12868 = build_function_type (void_type_node,
12869 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12870 tree_cons (NULL_TREE, puint_type_node,
12871 tree_cons (NULL_TREE,
12872 integer_type_node,
12873 endlink))));
12874
12875 tree void_ftype_v2si_puint_char
12876 = build_function_type (void_type_node,
12877 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12878 tree_cons (NULL_TREE, puint_type_node,
12879 tree_cons (NULL_TREE,
12880 char_type_node,
12881 endlink))));
12882
12883 tree void_ftype_v2si_pv2si_int
12884 = build_function_type (void_type_node,
12885 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12886 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
12887 tree_cons (NULL_TREE,
12888 integer_type_node,
12889 endlink))));
12890
12891 tree void_ftype_v2si_pv2si_char
12892 = build_function_type (void_type_node,
12893 tree_cons (NULL_TREE, opaque_V2SI_type_node,
12894 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
12895 tree_cons (NULL_TREE,
12896 char_type_node,
12897 endlink))));
12898
12899 tree void_ftype_int
12900 = build_function_type (void_type_node,
12901 tree_cons (NULL_TREE, integer_type_node, endlink));
12902
12903 tree int_ftype_void
12904 = build_function_type (integer_type_node, endlink);
12905
12906 tree v2si_ftype_pv2si_int
12907 = build_function_type (opaque_V2SI_type_node,
12908 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
12909 tree_cons (NULL_TREE, integer_type_node,
12910 endlink)));
12911
12912 tree v2si_ftype_puint_int
12913 = build_function_type (opaque_V2SI_type_node,
12914 tree_cons (NULL_TREE, puint_type_node,
12915 tree_cons (NULL_TREE, integer_type_node,
12916 endlink)));
12917
12918 tree v2si_ftype_pushort_int
12919 = build_function_type (opaque_V2SI_type_node,
12920 tree_cons (NULL_TREE, pushort_type_node,
12921 tree_cons (NULL_TREE, integer_type_node,
12922 endlink)));
12923
12924 tree v2si_ftype_signed_char
12925 = build_function_type (opaque_V2SI_type_node,
12926 tree_cons (NULL_TREE, signed_char_type_node,
12927 endlink));
12928
12929 /* The initialization of the simple binary and unary builtins is
12930 done in rs6000_common_init_builtins, but we have to enable the
12931 mask bits here manually because we have run out of `target_flags'
12932 bits. We really need to redesign this mask business. */
12933
12934 enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
12935 ARRAY_SIZE (bdesc_2arg),
12936 SPE_BUILTIN_EVADDW,
12937 SPE_BUILTIN_EVXOR);
12938 enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
12939 ARRAY_SIZE (bdesc_1arg),
12940 SPE_BUILTIN_EVABS,
12941 SPE_BUILTIN_EVSUBFUSIAAW);
12942 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
12943 ARRAY_SIZE (bdesc_spe_predicates),
12944 SPE_BUILTIN_EVCMPEQ,
12945 SPE_BUILTIN_EVFSTSTLT);
12946 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
12947 ARRAY_SIZE (bdesc_spe_evsel),
12948 SPE_BUILTIN_EVSEL_CMPGTS,
12949 SPE_BUILTIN_EVSEL_FSTSTEQ);
12950
12951 (*lang_hooks.decls.pushdecl)
12952 (build_decl (BUILTINS_LOCATION, TYPE_DECL,
12953 get_identifier ("__ev64_opaque__"),
12954 opaque_V2SI_type_node));
12955
12956 /* Initialize irregular SPE builtins. */
12957
12958 def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
12959 def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
12960 def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
12961 def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
12962 def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
12963 def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
12964 def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
12965 def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
12966 def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
12967 def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
12968 def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
12969 def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
12970 def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
12971 def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
12972 def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
12973 def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
12974 def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
12975 def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
12976
12977 /* Loads. */
12978 def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
12979 def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
12980 def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
12981 def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
12982 def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
12983 def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
12984 def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
12985 def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
12986 def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
12987 def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
12988 def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
12989 def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
12990 def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
12991 def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
12992 def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
12993 def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
12994 def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
12995 def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
12996 def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
12997 def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
12998 def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
12999 def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
13000
13001 /* Predicates. */
13002 d = (struct builtin_description *) bdesc_spe_predicates;
13003 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
13004 {
13005 tree type;
13006
13007 switch (insn_data[d->icode].operand[1].mode)
13008 {
13009 case V2SImode:
13010 type = int_ftype_int_v2si_v2si;
13011 break;
13012 case V2SFmode:
13013 type = int_ftype_int_v2sf_v2sf;
13014 break;
13015 default:
13016 gcc_unreachable ();
13017 }
13018
13019 def_builtin (d->mask, d->name, type, d->code);
13020 }
13021
13022 /* Evsel predicates. */
13023 d = (struct builtin_description *) bdesc_spe_evsel;
13024 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
13025 {
13026 tree type;
13027
13028 switch (insn_data[d->icode].operand[1].mode)
13029 {
13030 case V2SImode:
13031 type = v2si_ftype_4_v2si;
13032 break;
13033 case V2SFmode:
13034 type = v2sf_ftype_4_v2sf;
13035 break;
13036 default:
13037 gcc_unreachable ();
13038 }
13039
13040 def_builtin (d->mask, d->name, type, d->code);
13041 }
13042 }
13043
13044 static void
13045 paired_init_builtins (void)
13046 {
13047 const struct builtin_description *d;
13048 size_t i;
13049 tree endlink = void_list_node;
13050
13051 tree int_ftype_int_v2sf_v2sf
13052 = build_function_type
13053 (integer_type_node,
13054 tree_cons (NULL_TREE, integer_type_node,
13055 tree_cons (NULL_TREE, V2SF_type_node,
13056 tree_cons (NULL_TREE, V2SF_type_node,
13057 endlink))));
13058 tree pcfloat_type_node =
13059 build_pointer_type (build_qualified_type
13060 (float_type_node, TYPE_QUAL_CONST));
13061
13062 tree v2sf_ftype_long_pcfloat = build_function_type_list (V2SF_type_node,
13063 long_integer_type_node,
13064 pcfloat_type_node,
13065 NULL_TREE);
13066 tree void_ftype_v2sf_long_pcfloat =
13067 build_function_type_list (void_type_node,
13068 V2SF_type_node,
13069 long_integer_type_node,
13070 pcfloat_type_node,
13071 NULL_TREE);
13072
13073
13074 def_builtin (0, "__builtin_paired_lx", v2sf_ftype_long_pcfloat,
13075 PAIRED_BUILTIN_LX);
13076
13077
13078 def_builtin (0, "__builtin_paired_stx", void_ftype_v2sf_long_pcfloat,
13079 PAIRED_BUILTIN_STX);
13080
13081 /* Predicates. */
13082 d = bdesc_paired_preds;
13083 for (i = 0; i < ARRAY_SIZE (bdesc_paired_preds); ++i, d++)
13084 {
13085 tree type;
13086
13087 switch (insn_data[d->icode].operand[1].mode)
13088 {
13089 case V2SFmode:
13090 type = int_ftype_int_v2sf_v2sf;
13091 break;
13092 default:
13093 gcc_unreachable ();
13094 }
13095
13096 def_builtin (d->mask, d->name, type, d->code);
13097 }
13098 }
13099
13100 static void
13101 altivec_init_builtins (void)
13102 {
13103 const struct builtin_description *d;
13104 const struct builtin_description_predicates *dp;
13105 size_t i;
13106 tree ftype;
13107
13108 tree pvoid_type_node = build_pointer_type (void_type_node);
13109
13110 tree pcvoid_type_node
13111 = build_pointer_type (build_qualified_type (void_type_node,
13112 TYPE_QUAL_CONST));
13113
13114 tree int_ftype_opaque
13115 = build_function_type_list (integer_type_node,
13116 opaque_V4SI_type_node, NULL_TREE);
13117 tree opaque_ftype_opaque
13118 = build_function_type (integer_type_node,
13119 NULL_TREE);
13120 tree opaque_ftype_opaque_int
13121 = build_function_type_list (opaque_V4SI_type_node,
13122 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
13123 tree opaque_ftype_opaque_opaque_int
13124 = build_function_type_list (opaque_V4SI_type_node,
13125 opaque_V4SI_type_node, opaque_V4SI_type_node,
13126 integer_type_node, NULL_TREE);
13127 tree int_ftype_int_opaque_opaque
13128 = build_function_type_list (integer_type_node,
13129 integer_type_node, opaque_V4SI_type_node,
13130 opaque_V4SI_type_node, NULL_TREE);
13131 tree int_ftype_int_v4si_v4si
13132 = build_function_type_list (integer_type_node,
13133 integer_type_node, V4SI_type_node,
13134 V4SI_type_node, NULL_TREE);
13135 tree void_ftype_v4si
13136 = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
13137 tree v8hi_ftype_void
13138 = build_function_type (V8HI_type_node, void_list_node);
13139 tree void_ftype_void
13140 = build_function_type (void_type_node, void_list_node);
13141 tree void_ftype_int
13142 = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
13143
13144 tree opaque_ftype_long_pcvoid
13145 = build_function_type_list (opaque_V4SI_type_node,
13146 long_integer_type_node, pcvoid_type_node,
13147 NULL_TREE);
13148 tree v16qi_ftype_long_pcvoid
13149 = build_function_type_list (V16QI_type_node,
13150 long_integer_type_node, pcvoid_type_node,
13151 NULL_TREE);
13152 tree v8hi_ftype_long_pcvoid
13153 = build_function_type_list (V8HI_type_node,
13154 long_integer_type_node, pcvoid_type_node,
13155 NULL_TREE);
13156 tree v4si_ftype_long_pcvoid
13157 = build_function_type_list (V4SI_type_node,
13158 long_integer_type_node, pcvoid_type_node,
13159 NULL_TREE);
13160 tree v4sf_ftype_long_pcvoid
13161 = build_function_type_list (V4SF_type_node,
13162 long_integer_type_node, pcvoid_type_node,
13163 NULL_TREE);
13164 tree v2df_ftype_long_pcvoid
13165 = build_function_type_list (V2DF_type_node,
13166 long_integer_type_node, pcvoid_type_node,
13167 NULL_TREE);
13168 tree v2di_ftype_long_pcvoid
13169 = build_function_type_list (V2DI_type_node,
13170 long_integer_type_node, pcvoid_type_node,
13171 NULL_TREE);
13172
13173 tree void_ftype_opaque_long_pvoid
13174 = build_function_type_list (void_type_node,
13175 opaque_V4SI_type_node, long_integer_type_node,
13176 pvoid_type_node, NULL_TREE);
13177 tree void_ftype_v4si_long_pvoid
13178 = build_function_type_list (void_type_node,
13179 V4SI_type_node, long_integer_type_node,
13180 pvoid_type_node, NULL_TREE);
13181 tree void_ftype_v16qi_long_pvoid
13182 = build_function_type_list (void_type_node,
13183 V16QI_type_node, long_integer_type_node,
13184 pvoid_type_node, NULL_TREE);
13185 tree void_ftype_v8hi_long_pvoid
13186 = build_function_type_list (void_type_node,
13187 V8HI_type_node, long_integer_type_node,
13188 pvoid_type_node, NULL_TREE);
13189 tree void_ftype_v4sf_long_pvoid
13190 = build_function_type_list (void_type_node,
13191 V4SF_type_node, long_integer_type_node,
13192 pvoid_type_node, NULL_TREE);
13193 tree void_ftype_v2df_long_pvoid
13194 = build_function_type_list (void_type_node,
13195 V2DF_type_node, long_integer_type_node,
13196 pvoid_type_node, NULL_TREE);
13197 tree void_ftype_v2di_long_pvoid
13198 = build_function_type_list (void_type_node,
13199 V2DI_type_node, long_integer_type_node,
13200 pvoid_type_node, NULL_TREE);
13201 tree int_ftype_int_v8hi_v8hi
13202 = build_function_type_list (integer_type_node,
13203 integer_type_node, V8HI_type_node,
13204 V8HI_type_node, NULL_TREE);
13205 tree int_ftype_int_v16qi_v16qi
13206 = build_function_type_list (integer_type_node,
13207 integer_type_node, V16QI_type_node,
13208 V16QI_type_node, NULL_TREE);
13209 tree int_ftype_int_v4sf_v4sf
13210 = build_function_type_list (integer_type_node,
13211 integer_type_node, V4SF_type_node,
13212 V4SF_type_node, NULL_TREE);
13213 tree int_ftype_int_v2df_v2df
13214 = build_function_type_list (integer_type_node,
13215 integer_type_node, V2DF_type_node,
13216 V2DF_type_node, NULL_TREE);
13217 tree v4si_ftype_v4si
13218 = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
13219 tree v8hi_ftype_v8hi
13220 = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
13221 tree v16qi_ftype_v16qi
13222 = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
13223 tree v4sf_ftype_v4sf
13224 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
13225 tree v2df_ftype_v2df
13226 = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
13227 tree void_ftype_pcvoid_int_int
13228 = build_function_type_list (void_type_node,
13229 pcvoid_type_node, integer_type_node,
13230 integer_type_node, NULL_TREE);
13231
13232 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
13233 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
13234 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
13235 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
13236 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
13237 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
13238 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
13239 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
13240 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
13241 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
13242 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
13243 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
13244 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
13245 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
13246 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
13247 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
13248 def_builtin (MASK_ALTIVEC, "__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
13249 def_builtin (MASK_ALTIVEC, "__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
13250 def_builtin (MASK_ALTIVEC, "__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
13251 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
13252 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
13253 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
13254 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
13255 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
13256 def_builtin (MASK_ALTIVEC, "__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
13257 def_builtin (MASK_ALTIVEC, "__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
13258 def_builtin (MASK_ALTIVEC, "__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
13259 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
13260 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
13261 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
13262
13263 def_builtin (MASK_VSX, "__builtin_vsx_lxvd2x_v2df", v2df_ftype_long_pcvoid,
13264 VSX_BUILTIN_LXVD2X_V2DF);
13265 def_builtin (MASK_VSX, "__builtin_vsx_lxvd2x_v2di", v2di_ftype_long_pcvoid,
13266 VSX_BUILTIN_LXVD2X_V2DI);
13267 def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v4sf", v4sf_ftype_long_pcvoid,
13268 VSX_BUILTIN_LXVW4X_V4SF);
13269 def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v4si", v4si_ftype_long_pcvoid,
13270 VSX_BUILTIN_LXVW4X_V4SI);
13271 def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v8hi",
13272 v8hi_ftype_long_pcvoid, VSX_BUILTIN_LXVW4X_V8HI);
13273 def_builtin (MASK_VSX, "__builtin_vsx_lxvw4x_v16qi",
13274 v16qi_ftype_long_pcvoid, VSX_BUILTIN_LXVW4X_V16QI);
13275 def_builtin (MASK_VSX, "__builtin_vsx_stxvd2x_v2df",
13276 void_ftype_v2df_long_pvoid, VSX_BUILTIN_STXVD2X_V2DF);
13277 def_builtin (MASK_VSX, "__builtin_vsx_stxvd2x_v2di",
13278 void_ftype_v2di_long_pvoid, VSX_BUILTIN_STXVD2X_V2DI);
13279 def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v4sf",
13280 void_ftype_v4sf_long_pvoid, VSX_BUILTIN_STXVW4X_V4SF);
13281 def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v4si",
13282 void_ftype_v4si_long_pvoid, VSX_BUILTIN_STXVW4X_V4SI);
13283 def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v8hi",
13284 void_ftype_v8hi_long_pvoid, VSX_BUILTIN_STXVW4X_V8HI);
13285 def_builtin (MASK_VSX, "__builtin_vsx_stxvw4x_v16qi",
13286 void_ftype_v16qi_long_pvoid, VSX_BUILTIN_STXVW4X_V16QI);
13287 def_builtin (MASK_VSX, "__builtin_vec_vsx_ld", opaque_ftype_long_pcvoid,
13288 VSX_BUILTIN_VEC_LD);
13289 def_builtin (MASK_VSX, "__builtin_vec_vsx_st", void_ftype_opaque_long_pvoid,
13290 VSX_BUILTIN_VEC_ST);
13291
13292 if (rs6000_cpu == PROCESSOR_CELL)
13293 {
13294 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLX);
13295 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLXL);
13296 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRX);
13297 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRXL);
13298
13299 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLX);
13300 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLXL);
13301 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRX);
13302 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRXL);
13303
13304 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLX);
13305 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLXL);
13306 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRX);
13307 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRXL);
13308
13309 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLX);
13310 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLXL);
13311 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRX);
13312 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRXL);
13313 }
13314 def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
13315 def_builtin (MASK_ALTIVEC, "__builtin_vec_splats", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_SPLATS);
13316 def_builtin (MASK_ALTIVEC, "__builtin_vec_promote", opaque_ftype_opaque, ALTIVEC_BUILTIN_VEC_PROMOTE);
13317
13318 def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
13319 def_builtin (MASK_ALTIVEC, "__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
13320 def_builtin (MASK_ALTIVEC, "__builtin_vec_extract", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_EXTRACT);
13321 def_builtin (MASK_ALTIVEC, "__builtin_vec_insert", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_INSERT);
13322 def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
13323 def_builtin (MASK_ALTIVEC, "__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
13324 def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
13325 def_builtin (MASK_ALTIVEC, "__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
13326 def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
13327 def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
13328 def_builtin (MASK_ALTIVEC, "__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
13329 def_builtin (MASK_ALTIVEC, "__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
13330
13331 /* Add the DST variants. */
13332 d = bdesc_dst;
13333 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
13334 def_builtin (d->mask, d->name, void_ftype_pcvoid_int_int, d->code);
13335
13336 /* Initialize the predicates. */
13337 dp = bdesc_altivec_preds;
13338 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
13339 {
13340 enum machine_mode mode1;
13341 tree type;
13342 bool is_overloaded = ((dp->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13343 && dp->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13344 || (dp->code >= VSX_BUILTIN_OVERLOADED_FIRST
13345 && dp->code <= VSX_BUILTIN_OVERLOADED_LAST));
13346
13347 if (is_overloaded)
13348 mode1 = VOIDmode;
13349 else
13350 mode1 = insn_data[dp->icode].operand[1].mode;
13351
13352 switch (mode1)
13353 {
13354 case VOIDmode:
13355 type = int_ftype_int_opaque_opaque;
13356 break;
13357 case V4SImode:
13358 type = int_ftype_int_v4si_v4si;
13359 break;
13360 case V8HImode:
13361 type = int_ftype_int_v8hi_v8hi;
13362 break;
13363 case V16QImode:
13364 type = int_ftype_int_v16qi_v16qi;
13365 break;
13366 case V4SFmode:
13367 type = int_ftype_int_v4sf_v4sf;
13368 break;
13369 case V2DFmode:
13370 type = int_ftype_int_v2df_v2df;
13371 break;
13372 default:
13373 gcc_unreachable ();
13374 }
13375
13376 def_builtin (dp->mask, dp->name, type, dp->code);
13377 }
13378
13379 /* Initialize the abs* operators. */
13380 d = bdesc_abs;
13381 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
13382 {
13383 enum machine_mode mode0;
13384 tree type;
13385
13386 mode0 = insn_data[d->icode].operand[0].mode;
13387
13388 switch (mode0)
13389 {
13390 case V4SImode:
13391 type = v4si_ftype_v4si;
13392 break;
13393 case V8HImode:
13394 type = v8hi_ftype_v8hi;
13395 break;
13396 case V16QImode:
13397 type = v16qi_ftype_v16qi;
13398 break;
13399 case V4SFmode:
13400 type = v4sf_ftype_v4sf;
13401 break;
13402 case V2DFmode:
13403 type = v2df_ftype_v2df;
13404 break;
13405 default:
13406 gcc_unreachable ();
13407 }
13408
13409 def_builtin (d->mask, d->name, type, d->code);
13410 }
13411
13412 if (TARGET_ALTIVEC)
13413 {
13414 tree decl;
13415
13416 /* Initialize target builtin that implements
13417 targetm.vectorize.builtin_mask_for_load. */
13418
13419 decl = add_builtin_function ("__builtin_altivec_mask_for_load",
13420 v16qi_ftype_long_pcvoid,
13421 ALTIVEC_BUILTIN_MASK_FOR_LOAD,
13422 BUILT_IN_MD, NULL, NULL_TREE);
13423 TREE_READONLY (decl) = 1;
13424 /* Record the decl. Will be used by rs6000_builtin_mask_for_load. */
13425 altivec_builtin_mask_for_load = decl;
13426 }
13427
13428 /* Access to the vec_init patterns. */
13429 ftype = build_function_type_list (V4SI_type_node, integer_type_node,
13430 integer_type_node, integer_type_node,
13431 integer_type_node, NULL_TREE);
13432 def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4si", ftype,
13433 ALTIVEC_BUILTIN_VEC_INIT_V4SI);
13434
13435 ftype = build_function_type_list (V8HI_type_node, short_integer_type_node,
13436 short_integer_type_node,
13437 short_integer_type_node,
13438 short_integer_type_node,
13439 short_integer_type_node,
13440 short_integer_type_node,
13441 short_integer_type_node,
13442 short_integer_type_node, NULL_TREE);
13443 def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v8hi", ftype,
13444 ALTIVEC_BUILTIN_VEC_INIT_V8HI);
13445
13446 ftype = build_function_type_list (V16QI_type_node, char_type_node,
13447 char_type_node, char_type_node,
13448 char_type_node, char_type_node,
13449 char_type_node, char_type_node,
13450 char_type_node, char_type_node,
13451 char_type_node, char_type_node,
13452 char_type_node, char_type_node,
13453 char_type_node, char_type_node,
13454 char_type_node, NULL_TREE);
13455 def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v16qi", ftype,
13456 ALTIVEC_BUILTIN_VEC_INIT_V16QI);
13457
13458 ftype = build_function_type_list (V4SF_type_node, float_type_node,
13459 float_type_node, float_type_node,
13460 float_type_node, NULL_TREE);
13461 def_builtin (MASK_ALTIVEC, "__builtin_vec_init_v4sf", ftype,
13462 ALTIVEC_BUILTIN_VEC_INIT_V4SF);
13463
13464 if (TARGET_VSX)
13465 {
13466 ftype = build_function_type_list (V2DF_type_node, double_type_node,
13467 double_type_node, NULL_TREE);
13468 def_builtin (MASK_VSX, "__builtin_vec_init_v2df", ftype,
13469 VSX_BUILTIN_VEC_INIT_V2DF);
13470
13471 ftype = build_function_type_list (V2DI_type_node, intDI_type_node,
13472 intDI_type_node, NULL_TREE);
13473 def_builtin (MASK_VSX, "__builtin_vec_init_v2di", ftype,
13474 VSX_BUILTIN_VEC_INIT_V2DI);
13475 }
13476
13477 /* Access to the vec_set patterns. */
13478 ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
13479 intSI_type_node,
13480 integer_type_node, NULL_TREE);
13481 def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v4si", ftype,
13482 ALTIVEC_BUILTIN_VEC_SET_V4SI);
13483
13484 ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
13485 intHI_type_node,
13486 integer_type_node, NULL_TREE);
13487 def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v8hi", ftype,
13488 ALTIVEC_BUILTIN_VEC_SET_V8HI);
13489
13490 ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
13491 intQI_type_node,
13492 integer_type_node, NULL_TREE);
13493 def_builtin (MASK_ALTIVEC, "__builtin_vec_set_v16qi", ftype,
13494 ALTIVEC_BUILTIN_VEC_SET_V16QI);
13495
13496 ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
13497 float_type_node,
13498 integer_type_node, NULL_TREE);
13499 def_builtin (MASK_ALTIVEC|MASK_VSX, "__builtin_vec_set_v4sf", ftype,
13500 ALTIVEC_BUILTIN_VEC_SET_V4SF);
13501
13502 if (TARGET_VSX)
13503 {
13504 ftype = build_function_type_list (V2DF_type_node, V2DF_type_node,
13505 double_type_node,
13506 integer_type_node, NULL_TREE);
13507 def_builtin (MASK_VSX, "__builtin_vec_set_v2df", ftype,
13508 VSX_BUILTIN_VEC_SET_V2DF);
13509
13510 ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
13511 intDI_type_node,
13512 integer_type_node, NULL_TREE);
13513 def_builtin (MASK_VSX, "__builtin_vec_set_v2di", ftype,
13514 VSX_BUILTIN_VEC_SET_V2DI);
13515 }
13516
13517 /* Access to the vec_extract patterns. */
13518 ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
13519 integer_type_node, NULL_TREE);
13520 def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v4si", ftype,
13521 ALTIVEC_BUILTIN_VEC_EXT_V4SI);
13522
13523 ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
13524 integer_type_node, NULL_TREE);
13525 def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v8hi", ftype,
13526 ALTIVEC_BUILTIN_VEC_EXT_V8HI);
13527
13528 ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
13529 integer_type_node, NULL_TREE);
13530 def_builtin (MASK_ALTIVEC, "__builtin_vec_ext_v16qi", ftype,
13531 ALTIVEC_BUILTIN_VEC_EXT_V16QI);
13532
13533 ftype = build_function_type_list (float_type_node, V4SF_type_node,
13534 integer_type_node, NULL_TREE);
13535 def_builtin (MASK_ALTIVEC|MASK_VSX, "__builtin_vec_ext_v4sf", ftype,
13536 ALTIVEC_BUILTIN_VEC_EXT_V4SF);
13537
13538 if (TARGET_VSX)
13539 {
13540 ftype = build_function_type_list (double_type_node, V2DF_type_node,
13541 integer_type_node, NULL_TREE);
13542 def_builtin (MASK_VSX, "__builtin_vec_ext_v2df", ftype,
13543 VSX_BUILTIN_VEC_EXT_V2DF);
13544
13545 ftype = build_function_type_list (intDI_type_node, V2DI_type_node,
13546 integer_type_node, NULL_TREE);
13547 def_builtin (MASK_VSX, "__builtin_vec_ext_v2di", ftype,
13548 VSX_BUILTIN_VEC_EXT_V2DI);
13549 }
13550 }
13551
13552 /* Hash function for builtin functions with up to 3 arguments and a return
13553 type. */
13554 static unsigned
13555 builtin_hash_function (const void *hash_entry)
13556 {
13557 unsigned ret = 0;
13558 int i;
13559 const struct builtin_hash_struct *bh =
13560 (const struct builtin_hash_struct *) hash_entry;
13561
13562 for (i = 0; i < 4; i++)
13563 {
13564 ret = (ret * (unsigned)MAX_MACHINE_MODE) + ((unsigned)bh->mode[i]);
13565 ret = (ret * 2) + bh->uns_p[i];
13566 }
13567
13568 return ret;
13569 }
13570
13571 /* Compare builtin hash entries H1 and H2 for equivalence. */
13572 static int
13573 builtin_hash_eq (const void *h1, const void *h2)
13574 {
13575 const struct builtin_hash_struct *p1 = (const struct builtin_hash_struct *) h1;
13576 const struct builtin_hash_struct *p2 = (const struct builtin_hash_struct *) h2;
13577
13578 return ((p1->mode[0] == p2->mode[0])
13579 && (p1->mode[1] == p2->mode[1])
13580 && (p1->mode[2] == p2->mode[2])
13581 && (p1->mode[3] == p2->mode[3])
13582 && (p1->uns_p[0] == p2->uns_p[0])
13583 && (p1->uns_p[1] == p2->uns_p[1])
13584 && (p1->uns_p[2] == p2->uns_p[2])
13585 && (p1->uns_p[3] == p2->uns_p[3]));
13586 }
13587
13588 /* Map types for builtin functions with an explicit return type and up to 3
13589 arguments. Functions with fewer than 3 arguments use VOIDmode as the type
13590 of the argument. */
13591 static tree
13592 builtin_function_type (enum machine_mode mode_ret, enum machine_mode mode_arg0,
13593 enum machine_mode mode_arg1, enum machine_mode mode_arg2,
13594 enum rs6000_builtins builtin, const char *name)
13595 {
13596 struct builtin_hash_struct h;
13597 struct builtin_hash_struct *h2;
13598 void **found;
13599 int num_args = 3;
13600 int i;
13601 tree ret_type = NULL_TREE;
13602 tree arg_type[3] = { NULL_TREE, NULL_TREE, NULL_TREE };
13603 tree args;
13604
13605 /* Create builtin_hash_table. */
13606 if (builtin_hash_table == NULL)
13607 builtin_hash_table = htab_create_ggc (1500, builtin_hash_function,
13608 builtin_hash_eq, NULL);
13609
13610 h.type = NULL_TREE;
13611 h.mode[0] = mode_ret;
13612 h.mode[1] = mode_arg0;
13613 h.mode[2] = mode_arg1;
13614 h.mode[3] = mode_arg2;
13615 h.uns_p[0] = 0;
13616 h.uns_p[1] = 0;
13617 h.uns_p[2] = 0;
13618 h.uns_p[3] = 0;
13619
13620 /* If the builtin is a type that produces unsigned results or takes unsigned
13621 arguments, and it is returned as a decl for the vectorizer (such as
13622 widening multiplies, permute), make sure the arguments and return value
13623 are type correct. */
13624 switch (builtin)
13625 {
13626 /* unsigned 2 argument functions. */
13627 case ALTIVEC_BUILTIN_VMULEUB_UNS:
13628 case ALTIVEC_BUILTIN_VMULEUH_UNS:
13629 case ALTIVEC_BUILTIN_VMULOUB_UNS:
13630 case ALTIVEC_BUILTIN_VMULOUH_UNS:
13631 h.uns_p[0] = 1;
13632 h.uns_p[1] = 1;
13633 h.uns_p[2] = 1;
13634 break;
13635
13636 /* unsigned 3 argument functions. */
13637 case ALTIVEC_BUILTIN_VPERM_16QI_UNS:
13638 case ALTIVEC_BUILTIN_VPERM_8HI_UNS:
13639 case ALTIVEC_BUILTIN_VPERM_4SI_UNS:
13640 case ALTIVEC_BUILTIN_VPERM_2DI_UNS:
13641 case ALTIVEC_BUILTIN_VSEL_16QI_UNS:
13642 case ALTIVEC_BUILTIN_VSEL_8HI_UNS:
13643 case ALTIVEC_BUILTIN_VSEL_4SI_UNS:
13644 case ALTIVEC_BUILTIN_VSEL_2DI_UNS:
13645 case VSX_BUILTIN_VPERM_16QI_UNS:
13646 case VSX_BUILTIN_VPERM_8HI_UNS:
13647 case VSX_BUILTIN_VPERM_4SI_UNS:
13648 case VSX_BUILTIN_VPERM_2DI_UNS:
13649 case VSX_BUILTIN_XXSEL_16QI_UNS:
13650 case VSX_BUILTIN_XXSEL_8HI_UNS:
13651 case VSX_BUILTIN_XXSEL_4SI_UNS:
13652 case VSX_BUILTIN_XXSEL_2DI_UNS:
13653 h.uns_p[0] = 1;
13654 h.uns_p[1] = 1;
13655 h.uns_p[2] = 1;
13656 h.uns_p[3] = 1;
13657 break;
13658
13659 /* signed permute functions with unsigned char mask. */
13660 case ALTIVEC_BUILTIN_VPERM_16QI:
13661 case ALTIVEC_BUILTIN_VPERM_8HI:
13662 case ALTIVEC_BUILTIN_VPERM_4SI:
13663 case ALTIVEC_BUILTIN_VPERM_4SF:
13664 case ALTIVEC_BUILTIN_VPERM_2DI:
13665 case ALTIVEC_BUILTIN_VPERM_2DF:
13666 case VSX_BUILTIN_VPERM_16QI:
13667 case VSX_BUILTIN_VPERM_8HI:
13668 case VSX_BUILTIN_VPERM_4SI:
13669 case VSX_BUILTIN_VPERM_4SF:
13670 case VSX_BUILTIN_VPERM_2DI:
13671 case VSX_BUILTIN_VPERM_2DF:
13672 h.uns_p[3] = 1;
13673 break;
13674
13675 /* unsigned args, signed return. */
13676 case VSX_BUILTIN_XVCVUXDDP_UNS:
13677 case VECTOR_BUILTIN_UNSFLOAT_V4SI_V4SF:
13678 h.uns_p[1] = 1;
13679 break;
13680
13681 /* signed args, unsigned return. */
13682 case VSX_BUILTIN_XVCVDPUXDS_UNS:
13683 case VECTOR_BUILTIN_FIXUNS_V4SF_V4SI:
13684 h.uns_p[0] = 1;
13685 break;
13686
13687 default:
13688 break;
13689 }
13690
13691 /* Figure out how many args are present. */
13692 while (num_args > 0 && h.mode[num_args] == VOIDmode)
13693 num_args--;
13694
13695 if (num_args == 0)
13696 fatal_error ("internal error: builtin function %s had no type", name);
13697
13698 ret_type = builtin_mode_to_type[h.mode[0]][h.uns_p[0]];
13699 if (!ret_type && h.uns_p[0])
13700 ret_type = builtin_mode_to_type[h.mode[0]][0];
13701
13702 if (!ret_type)
13703 fatal_error ("internal error: builtin function %s had an unexpected "
13704 "return type %s", name, GET_MODE_NAME (h.mode[0]));
13705
13706 for (i = 0; i < num_args; i++)
13707 {
13708 int m = (int) h.mode[i+1];
13709 int uns_p = h.uns_p[i+1];
13710
13711 arg_type[i] = builtin_mode_to_type[m][uns_p];
13712 if (!arg_type[i] && uns_p)
13713 arg_type[i] = builtin_mode_to_type[m][0];
13714
13715 if (!arg_type[i])
13716 fatal_error ("internal error: builtin function %s, argument %d "
13717 "had unexpected argument type %s", name, i,
13718 GET_MODE_NAME (m));
13719 }
13720
13721 found = htab_find_slot (builtin_hash_table, &h, INSERT);
13722 if (*found == NULL)
13723 {
13724 h2 = ggc_alloc_builtin_hash_struct ();
13725 *h2 = h;
13726 *found = (void *)h2;
13727 args = void_list_node;
13728
13729 for (i = num_args - 1; i >= 0; i--)
13730 args = tree_cons (NULL_TREE, arg_type[i], args);
13731
13732 h2->type = build_function_type (ret_type, args);
13733 }
13734
13735 return ((struct builtin_hash_struct *)(*found))->type;
13736 }
13737
13738 static void
13739 rs6000_common_init_builtins (void)
13740 {
13741 const struct builtin_description *d;
13742 size_t i;
13743
13744 tree opaque_ftype_opaque = NULL_TREE;
13745 tree opaque_ftype_opaque_opaque = NULL_TREE;
13746 tree opaque_ftype_opaque_opaque_opaque = NULL_TREE;
13747 tree v2si_ftype_qi = NULL_TREE;
13748 tree v2si_ftype_v2si_qi = NULL_TREE;
13749 tree v2si_ftype_int_qi = NULL_TREE;
13750
13751 if (!TARGET_PAIRED_FLOAT)
13752 {
13753 builtin_mode_to_type[V2SImode][0] = opaque_V2SI_type_node;
13754 builtin_mode_to_type[V2SFmode][0] = opaque_V2SF_type_node;
13755 }
13756
13757 /* Add the ternary operators. */
13758 d = bdesc_3arg;
13759 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
13760 {
13761 tree type;
13762 int mask = d->mask;
13763
13764 if ((mask != 0 && (mask & target_flags) == 0)
13765 || (mask == 0 && !TARGET_PAIRED_FLOAT))
13766 continue;
13767
13768 if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13769 && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13770 || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13771 && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13772 {
13773 if (! (type = opaque_ftype_opaque_opaque_opaque))
13774 type = opaque_ftype_opaque_opaque_opaque
13775 = build_function_type_list (opaque_V4SI_type_node,
13776 opaque_V4SI_type_node,
13777 opaque_V4SI_type_node,
13778 opaque_V4SI_type_node,
13779 NULL_TREE);
13780 }
13781 else
13782 {
13783 enum insn_code icode = d->icode;
13784 if (d->name == 0 || icode == CODE_FOR_nothing)
13785 continue;
13786
13787 type = builtin_function_type (insn_data[icode].operand[0].mode,
13788 insn_data[icode].operand[1].mode,
13789 insn_data[icode].operand[2].mode,
13790 insn_data[icode].operand[3].mode,
13791 d->code, d->name);
13792 }
13793
13794 def_builtin (d->mask, d->name, type, d->code);
13795 }
13796
13797 /* Add the binary operators. */
13798 d = bdesc_2arg;
13799 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
13800 {
13801 enum machine_mode mode0, mode1, mode2;
13802 tree type;
13803 int mask = d->mask;
13804
13805 if ((mask != 0 && (mask & target_flags) == 0)
13806 || (mask == 0 && !TARGET_PAIRED_FLOAT))
13807 continue;
13808
13809 if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13810 && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13811 || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13812 && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13813 {
13814 if (! (type = opaque_ftype_opaque_opaque))
13815 type = opaque_ftype_opaque_opaque
13816 = build_function_type_list (opaque_V4SI_type_node,
13817 opaque_V4SI_type_node,
13818 opaque_V4SI_type_node,
13819 NULL_TREE);
13820 }
13821 else
13822 {
13823 enum insn_code icode = d->icode;
13824 if (d->name == 0 || icode == CODE_FOR_nothing)
13825 continue;
13826
13827 mode0 = insn_data[icode].operand[0].mode;
13828 mode1 = insn_data[icode].operand[1].mode;
13829 mode2 = insn_data[icode].operand[2].mode;
13830
13831 if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
13832 {
13833 if (! (type = v2si_ftype_v2si_qi))
13834 type = v2si_ftype_v2si_qi
13835 = build_function_type_list (opaque_V2SI_type_node,
13836 opaque_V2SI_type_node,
13837 char_type_node,
13838 NULL_TREE);
13839 }
13840
13841 else if (mode0 == V2SImode && GET_MODE_CLASS (mode1) == MODE_INT
13842 && mode2 == QImode)
13843 {
13844 if (! (type = v2si_ftype_int_qi))
13845 type = v2si_ftype_int_qi
13846 = build_function_type_list (opaque_V2SI_type_node,
13847 integer_type_node,
13848 char_type_node,
13849 NULL_TREE);
13850 }
13851
13852 else
13853 type = builtin_function_type (mode0, mode1, mode2, VOIDmode,
13854 d->code, d->name);
13855 }
13856
13857 def_builtin (d->mask, d->name, type, d->code);
13858 }
13859
13860 /* Add the simple unary operators. */
13861 d = (struct builtin_description *) bdesc_1arg;
13862 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
13863 {
13864 enum machine_mode mode0, mode1;
13865 tree type;
13866 int mask = d->mask;
13867
13868 if ((mask != 0 && (mask & target_flags) == 0)
13869 || (mask == 0 && !TARGET_PAIRED_FLOAT))
13870 continue;
13871
13872 if ((d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
13873 && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
13874 || (d->code >= VSX_BUILTIN_OVERLOADED_FIRST
13875 && d->code <= VSX_BUILTIN_OVERLOADED_LAST))
13876 {
13877 if (! (type = opaque_ftype_opaque))
13878 type = opaque_ftype_opaque
13879 = build_function_type_list (opaque_V4SI_type_node,
13880 opaque_V4SI_type_node,
13881 NULL_TREE);
13882 }
13883 else
13884 {
13885 enum insn_code icode = d->icode;
13886 if (d->name == 0 || icode == CODE_FOR_nothing)
13887 continue;
13888
13889 mode0 = insn_data[icode].operand[0].mode;
13890 mode1 = insn_data[icode].operand[1].mode;
13891
13892 if (mode0 == V2SImode && mode1 == QImode)
13893 {
13894 if (! (type = v2si_ftype_qi))
13895 type = v2si_ftype_qi
13896 = build_function_type_list (opaque_V2SI_type_node,
13897 char_type_node,
13898 NULL_TREE);
13899 }
13900
13901 else
13902 type = builtin_function_type (mode0, mode1, VOIDmode, VOIDmode,
13903 d->code, d->name);
13904 }
13905
13906 def_builtin (d->mask, d->name, type, d->code);
13907 }
13908 }
13909
13910 static void
13911 rs6000_init_libfuncs (void)
13912 {
13913 if (DEFAULT_ABI != ABI_V4 && TARGET_XCOFF
13914 && !TARGET_POWER2 && !TARGET_POWERPC)
13915 {
13916 /* AIX library routines for float->int conversion. */
13917 set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc");
13918 set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc");
13919 set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc");
13920 set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc");
13921 }
13922
13923 if (!TARGET_IEEEQUAD)
13924 /* AIX/Darwin/64-bit Linux quad floating point routines. */
13925 if (!TARGET_XL_COMPAT)
13926 {
13927 set_optab_libfunc (add_optab, TFmode, "__gcc_qadd");
13928 set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
13929 set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
13930 set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
13931
13932 if (!(TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)))
13933 {
13934 set_optab_libfunc (neg_optab, TFmode, "__gcc_qneg");
13935 set_optab_libfunc (eq_optab, TFmode, "__gcc_qeq");
13936 set_optab_libfunc (ne_optab, TFmode, "__gcc_qne");
13937 set_optab_libfunc (gt_optab, TFmode, "__gcc_qgt");
13938 set_optab_libfunc (ge_optab, TFmode, "__gcc_qge");
13939 set_optab_libfunc (lt_optab, TFmode, "__gcc_qlt");
13940 set_optab_libfunc (le_optab, TFmode, "__gcc_qle");
13941
13942 set_conv_libfunc (sext_optab, TFmode, SFmode, "__gcc_stoq");
13943 set_conv_libfunc (sext_optab, TFmode, DFmode, "__gcc_dtoq");
13944 set_conv_libfunc (trunc_optab, SFmode, TFmode, "__gcc_qtos");
13945 set_conv_libfunc (trunc_optab, DFmode, TFmode, "__gcc_qtod");
13946 set_conv_libfunc (sfix_optab, SImode, TFmode, "__gcc_qtoi");
13947 set_conv_libfunc (ufix_optab, SImode, TFmode, "__gcc_qtou");
13948 set_conv_libfunc (sfloat_optab, TFmode, SImode, "__gcc_itoq");
13949 set_conv_libfunc (ufloat_optab, TFmode, SImode, "__gcc_utoq");
13950 }
13951
13952 if (!(TARGET_HARD_FLOAT && TARGET_FPRS))
13953 set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord");
13954 }
13955 else
13956 {
13957 set_optab_libfunc (add_optab, TFmode, "_xlqadd");
13958 set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
13959 set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
13960 set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
13961 }
13962 else
13963 {
13964 /* 32-bit SVR4 quad floating point routines. */
13965
13966 set_optab_libfunc (add_optab, TFmode, "_q_add");
13967 set_optab_libfunc (sub_optab, TFmode, "_q_sub");
13968 set_optab_libfunc (neg_optab, TFmode, "_q_neg");
13969 set_optab_libfunc (smul_optab, TFmode, "_q_mul");
13970 set_optab_libfunc (sdiv_optab, TFmode, "_q_div");
13971 if (TARGET_PPC_GPOPT || TARGET_POWER2)
13972 set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
13973
13974 set_optab_libfunc (eq_optab, TFmode, "_q_feq");
13975 set_optab_libfunc (ne_optab, TFmode, "_q_fne");
13976 set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
13977 set_optab_libfunc (ge_optab, TFmode, "_q_fge");
13978 set_optab_libfunc (lt_optab, TFmode, "_q_flt");
13979 set_optab_libfunc (le_optab, TFmode, "_q_fle");
13980
13981 set_conv_libfunc (sext_optab, TFmode, SFmode, "_q_stoq");
13982 set_conv_libfunc (sext_optab, TFmode, DFmode, "_q_dtoq");
13983 set_conv_libfunc (trunc_optab, SFmode, TFmode, "_q_qtos");
13984 set_conv_libfunc (trunc_optab, DFmode, TFmode, "_q_qtod");
13985 set_conv_libfunc (sfix_optab, SImode, TFmode, "_q_qtoi");
13986 set_conv_libfunc (ufix_optab, SImode, TFmode, "_q_qtou");
13987 set_conv_libfunc (sfloat_optab, TFmode, SImode, "_q_itoq");
13988 set_conv_libfunc (ufloat_optab, TFmode, SImode, "_q_utoq");
13989 }
13990 }
13991
13992 \f
13993 /* Expand a block clear operation, and return 1 if successful. Return 0
13994 if we should let the compiler generate normal code.
13995
13996 operands[0] is the destination
13997 operands[1] is the length
13998 operands[3] is the alignment */
13999
14000 int
14001 expand_block_clear (rtx operands[])
14002 {
14003 rtx orig_dest = operands[0];
14004 rtx bytes_rtx = operands[1];
14005 rtx align_rtx = operands[3];
14006 bool constp = (GET_CODE (bytes_rtx) == CONST_INT);
14007 HOST_WIDE_INT align;
14008 HOST_WIDE_INT bytes;
14009 int offset;
14010 int clear_bytes;
14011 int clear_step;
14012
14013 /* If this is not a fixed size move, just call memcpy */
14014 if (! constp)
14015 return 0;
14016
14017 /* This must be a fixed size alignment */
14018 gcc_assert (GET_CODE (align_rtx) == CONST_INT);
14019 align = INTVAL (align_rtx) * BITS_PER_UNIT;
14020
14021 /* Anything to clear? */
14022 bytes = INTVAL (bytes_rtx);
14023 if (bytes <= 0)
14024 return 1;
14025
14026 /* Use the builtin memset after a point, to avoid huge code bloat.
14027 When optimize_size, avoid any significant code bloat; calling
14028 memset is about 4 instructions, so allow for one instruction to
14029 load zero and three to do clearing. */
14030 if (TARGET_ALTIVEC && align >= 128)
14031 clear_step = 16;
14032 else if (TARGET_POWERPC64 && align >= 32)
14033 clear_step = 8;
14034 else if (TARGET_SPE && align >= 64)
14035 clear_step = 8;
14036 else
14037 clear_step = 4;
14038
14039 if (optimize_size && bytes > 3 * clear_step)
14040 return 0;
14041 if (! optimize_size && bytes > 8 * clear_step)
14042 return 0;
14043
14044 for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes)
14045 {
14046 enum machine_mode mode = BLKmode;
14047 rtx dest;
14048
14049 if (bytes >= 16 && TARGET_ALTIVEC && align >= 128)
14050 {
14051 clear_bytes = 16;
14052 mode = V4SImode;
14053 }
14054 else if (bytes >= 8 && TARGET_SPE && align >= 64)
14055 {
14056 clear_bytes = 8;
14057 mode = V2SImode;
14058 }
14059 else if (bytes >= 8 && TARGET_POWERPC64
14060 /* 64-bit loads and stores require word-aligned
14061 displacements. */
14062 && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
14063 {
14064 clear_bytes = 8;
14065 mode = DImode;
14066 }
14067 else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
14068 { /* move 4 bytes */
14069 clear_bytes = 4;
14070 mode = SImode;
14071 }
14072 else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
14073 { /* move 2 bytes */
14074 clear_bytes = 2;
14075 mode = HImode;
14076 }
14077 else /* move 1 byte at a time */
14078 {
14079 clear_bytes = 1;
14080 mode = QImode;
14081 }
14082
14083 dest = adjust_address (orig_dest, mode, offset);
14084
14085 emit_move_insn (dest, CONST0_RTX (mode));
14086 }
14087
14088 return 1;
14089 }
14090
14091 \f
14092 /* Expand a block move operation, and return 1 if successful. Return 0
14093 if we should let the compiler generate normal code.
14094
14095 operands[0] is the destination
14096 operands[1] is the source
14097 operands[2] is the length
14098 operands[3] is the alignment */
14099
14100 #define MAX_MOVE_REG 4
14101
14102 int
14103 expand_block_move (rtx operands[])
14104 {
14105 rtx orig_dest = operands[0];
14106 rtx orig_src = operands[1];
14107 rtx bytes_rtx = operands[2];
14108 rtx align_rtx = operands[3];
14109 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
14110 int align;
14111 int bytes;
14112 int offset;
14113 int move_bytes;
14114 rtx stores[MAX_MOVE_REG];
14115 int num_reg = 0;
14116
14117 /* If this is not a fixed size move, just call memcpy */
14118 if (! constp)
14119 return 0;
14120
14121 /* This must be a fixed size alignment */
14122 gcc_assert (GET_CODE (align_rtx) == CONST_INT);
14123 align = INTVAL (align_rtx) * BITS_PER_UNIT;
14124
14125 /* Anything to move? */
14126 bytes = INTVAL (bytes_rtx);
14127 if (bytes <= 0)
14128 return 1;
14129
14130 if (bytes > rs6000_block_move_inline_limit)
14131 return 0;
14132
14133 for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
14134 {
14135 union {
14136 rtx (*movmemsi) (rtx, rtx, rtx, rtx);
14137 rtx (*mov) (rtx, rtx);
14138 } gen_func;
14139 enum machine_mode mode = BLKmode;
14140 rtx src, dest;
14141
14142 /* Altivec first, since it will be faster than a string move
14143 when it applies, and usually not significantly larger. */
14144 if (TARGET_ALTIVEC && bytes >= 16 && align >= 128)
14145 {
14146 move_bytes = 16;
14147 mode = V4SImode;
14148 gen_func.mov = gen_movv4si;
14149 }
14150 else if (TARGET_SPE && bytes >= 8 && align >= 64)
14151 {
14152 move_bytes = 8;
14153 mode = V2SImode;
14154 gen_func.mov = gen_movv2si;
14155 }
14156 else if (TARGET_STRING
14157 && bytes > 24 /* move up to 32 bytes at a time */
14158 && ! fixed_regs[5]
14159 && ! fixed_regs[6]
14160 && ! fixed_regs[7]
14161 && ! fixed_regs[8]
14162 && ! fixed_regs[9]
14163 && ! fixed_regs[10]
14164 && ! fixed_regs[11]
14165 && ! fixed_regs[12])
14166 {
14167 move_bytes = (bytes > 32) ? 32 : bytes;
14168 gen_func.movmemsi = gen_movmemsi_8reg;
14169 }
14170 else if (TARGET_STRING
14171 && bytes > 16 /* move up to 24 bytes at a time */
14172 && ! fixed_regs[5]
14173 && ! fixed_regs[6]
14174 && ! fixed_regs[7]
14175 && ! fixed_regs[8]
14176 && ! fixed_regs[9]
14177 && ! fixed_regs[10])
14178 {
14179 move_bytes = (bytes > 24) ? 24 : bytes;
14180 gen_func.movmemsi = gen_movmemsi_6reg;
14181 }
14182 else if (TARGET_STRING
14183 && bytes > 8 /* move up to 16 bytes at a time */
14184 && ! fixed_regs[5]
14185 && ! fixed_regs[6]
14186 && ! fixed_regs[7]
14187 && ! fixed_regs[8])
14188 {
14189 move_bytes = (bytes > 16) ? 16 : bytes;
14190 gen_func.movmemsi = gen_movmemsi_4reg;
14191 }
14192 else if (bytes >= 8 && TARGET_POWERPC64
14193 /* 64-bit loads and stores require word-aligned
14194 displacements. */
14195 && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
14196 {
14197 move_bytes = 8;
14198 mode = DImode;
14199 gen_func.mov = gen_movdi;
14200 }
14201 else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
14202 { /* move up to 8 bytes at a time */
14203 move_bytes = (bytes > 8) ? 8 : bytes;
14204 gen_func.movmemsi = gen_movmemsi_2reg;
14205 }
14206 else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
14207 { /* move 4 bytes */
14208 move_bytes = 4;
14209 mode = SImode;
14210 gen_func.mov = gen_movsi;
14211 }
14212 else if (bytes >= 2 && (align >= 16 || !STRICT_ALIGNMENT))
14213 { /* move 2 bytes */
14214 move_bytes = 2;
14215 mode = HImode;
14216 gen_func.mov = gen_movhi;
14217 }
14218 else if (TARGET_STRING && bytes > 1)
14219 { /* move up to 4 bytes at a time */
14220 move_bytes = (bytes > 4) ? 4 : bytes;
14221 gen_func.movmemsi = gen_movmemsi_1reg;
14222 }
14223 else /* move 1 byte at a time */
14224 {
14225 move_bytes = 1;
14226 mode = QImode;
14227 gen_func.mov = gen_movqi;
14228 }
14229
14230 src = adjust_address (orig_src, mode, offset);
14231 dest = adjust_address (orig_dest, mode, offset);
14232
14233 if (mode != BLKmode)
14234 {
14235 rtx tmp_reg = gen_reg_rtx (mode);
14236
14237 emit_insn ((*gen_func.mov) (tmp_reg, src));
14238 stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
14239 }
14240
14241 if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
14242 {
14243 int i;
14244 for (i = 0; i < num_reg; i++)
14245 emit_insn (stores[i]);
14246 num_reg = 0;
14247 }
14248
14249 if (mode == BLKmode)
14250 {
14251 /* Move the address into scratch registers. The movmemsi
14252 patterns require zero offset. */
14253 if (!REG_P (XEXP (src, 0)))
14254 {
14255 rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
14256 src = replace_equiv_address (src, src_reg);
14257 }
14258 set_mem_size (src, GEN_INT (move_bytes));
14259
14260 if (!REG_P (XEXP (dest, 0)))
14261 {
14262 rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
14263 dest = replace_equiv_address (dest, dest_reg);
14264 }
14265 set_mem_size (dest, GEN_INT (move_bytes));
14266
14267 emit_insn ((*gen_func.movmemsi) (dest, src,
14268 GEN_INT (move_bytes & 31),
14269 align_rtx));
14270 }
14271 }
14272
14273 return 1;
14274 }
14275
14276 \f
14277 /* Return a string to perform a load_multiple operation.
14278 operands[0] is the vector.
14279 operands[1] is the source address.
14280 operands[2] is the first destination register. */
14281
14282 const char *
14283 rs6000_output_load_multiple (rtx operands[3])
14284 {
14285 /* We have to handle the case where the pseudo used to contain the address
14286 is assigned to one of the output registers. */
14287 int i, j;
14288 int words = XVECLEN (operands[0], 0);
14289 rtx xop[10];
14290
14291 if (XVECLEN (operands[0], 0) == 1)
14292 return "{l|lwz} %2,0(%1)";
14293
14294 for (i = 0; i < words; i++)
14295 if (refers_to_regno_p (REGNO (operands[2]) + i,
14296 REGNO (operands[2]) + i + 1, operands[1], 0))
14297 {
14298 if (i == words-1)
14299 {
14300 xop[0] = GEN_INT (4 * (words-1));
14301 xop[1] = operands[1];
14302 xop[2] = operands[2];
14303 output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
14304 return "";
14305 }
14306 else if (i == 0)
14307 {
14308 xop[0] = GEN_INT (4 * (words-1));
14309 xop[1] = operands[1];
14310 xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
14311 output_asm_insn ("{cal %1,4(%1)|addi %1,%1,4}\n\t{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,-4(%1)", xop);
14312 return "";
14313 }
14314 else
14315 {
14316 for (j = 0; j < words; j++)
14317 if (j != i)
14318 {
14319 xop[0] = GEN_INT (j * 4);
14320 xop[1] = operands[1];
14321 xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
14322 output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
14323 }
14324 xop[0] = GEN_INT (i * 4);
14325 xop[1] = operands[1];
14326 output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
14327 return "";
14328 }
14329 }
14330
14331 return "{lsi|lswi} %2,%1,%N0";
14332 }
14333
14334 \f
14335 /* A validation routine: say whether CODE, a condition code, and MODE
14336 match. The other alternatives either don't make sense or should
14337 never be generated. */
14338
14339 void
14340 validate_condition_mode (enum rtx_code code, enum machine_mode mode)
14341 {
14342 gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
14343 || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
14344 && GET_MODE_CLASS (mode) == MODE_CC);
14345
14346 /* These don't make sense. */
14347 gcc_assert ((code != GT && code != LT && code != GE && code != LE)
14348 || mode != CCUNSmode);
14349
14350 gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
14351 || mode == CCUNSmode);
14352
14353 gcc_assert (mode == CCFPmode
14354 || (code != ORDERED && code != UNORDERED
14355 && code != UNEQ && code != LTGT
14356 && code != UNGT && code != UNLT
14357 && code != UNGE && code != UNLE));
14358
14359 /* These should never be generated except for
14360 flag_finite_math_only. */
14361 gcc_assert (mode != CCFPmode
14362 || flag_finite_math_only
14363 || (code != LE && code != GE
14364 && code != UNEQ && code != LTGT
14365 && code != UNGT && code != UNLT));
14366
14367 /* These are invalid; the information is not there. */
14368 gcc_assert (mode != CCEQmode || code == EQ || code == NE);
14369 }
14370
14371 \f
14372 /* Return 1 if ANDOP is a mask that has no bits on that are not in the
14373 mask required to convert the result of a rotate insn into a shift
14374 left insn of SHIFTOP bits. Both are known to be SImode CONST_INT. */
14375
14376 int
14377 includes_lshift_p (rtx shiftop, rtx andop)
14378 {
14379 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
14380
14381 shift_mask <<= INTVAL (shiftop);
14382
14383 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
14384 }
14385
14386 /* Similar, but for right shift. */
14387
14388 int
14389 includes_rshift_p (rtx shiftop, rtx andop)
14390 {
14391 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
14392
14393 shift_mask >>= INTVAL (shiftop);
14394
14395 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
14396 }
14397
14398 /* Return 1 if ANDOP is a mask suitable for use with an rldic insn
14399 to perform a left shift. It must have exactly SHIFTOP least
14400 significant 0's, then one or more 1's, then zero or more 0's. */
14401
14402 int
14403 includes_rldic_lshift_p (rtx shiftop, rtx andop)
14404 {
14405 if (GET_CODE (andop) == CONST_INT)
14406 {
14407 HOST_WIDE_INT c, lsb, shift_mask;
14408
14409 c = INTVAL (andop);
14410 if (c == 0 || c == ~0)
14411 return 0;
14412
14413 shift_mask = ~0;
14414 shift_mask <<= INTVAL (shiftop);
14415
14416 /* Find the least significant one bit. */
14417 lsb = c & -c;
14418
14419 /* It must coincide with the LSB of the shift mask. */
14420 if (-lsb != shift_mask)
14421 return 0;
14422
14423 /* Invert to look for the next transition (if any). */
14424 c = ~c;
14425
14426 /* Remove the low group of ones (originally low group of zeros). */
14427 c &= -lsb;
14428
14429 /* Again find the lsb, and check we have all 1's above. */
14430 lsb = c & -c;
14431 return c == -lsb;
14432 }
14433 else if (GET_CODE (andop) == CONST_DOUBLE
14434 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
14435 {
14436 HOST_WIDE_INT low, high, lsb;
14437 HOST_WIDE_INT shift_mask_low, shift_mask_high;
14438
14439 low = CONST_DOUBLE_LOW (andop);
14440 if (HOST_BITS_PER_WIDE_INT < 64)
14441 high = CONST_DOUBLE_HIGH (andop);
14442
14443 if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
14444 || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
14445 return 0;
14446
14447 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
14448 {
14449 shift_mask_high = ~0;
14450 if (INTVAL (shiftop) > 32)
14451 shift_mask_high <<= INTVAL (shiftop) - 32;
14452
14453 lsb = high & -high;
14454
14455 if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
14456 return 0;
14457
14458 high = ~high;
14459 high &= -lsb;
14460
14461 lsb = high & -high;
14462 return high == -lsb;
14463 }
14464
14465 shift_mask_low = ~0;
14466 shift_mask_low <<= INTVAL (shiftop);
14467
14468 lsb = low & -low;
14469
14470 if (-lsb != shift_mask_low)
14471 return 0;
14472
14473 if (HOST_BITS_PER_WIDE_INT < 64)
14474 high = ~high;
14475 low = ~low;
14476 low &= -lsb;
14477
14478 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
14479 {
14480 lsb = high & -high;
14481 return high == -lsb;
14482 }
14483
14484 lsb = low & -low;
14485 return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
14486 }
14487 else
14488 return 0;
14489 }
14490
14491 /* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
14492 to perform a left shift. It must have SHIFTOP or more least
14493 significant 0's, with the remainder of the word 1's. */
14494
14495 int
14496 includes_rldicr_lshift_p (rtx shiftop, rtx andop)
14497 {
14498 if (GET_CODE (andop) == CONST_INT)
14499 {
14500 HOST_WIDE_INT c, lsb, shift_mask;
14501
14502 shift_mask = ~0;
14503 shift_mask <<= INTVAL (shiftop);
14504 c = INTVAL (andop);
14505
14506 /* Find the least significant one bit. */
14507 lsb = c & -c;
14508
14509 /* It must be covered by the shift mask.
14510 This test also rejects c == 0. */
14511 if ((lsb & shift_mask) == 0)
14512 return 0;
14513
14514 /* Check we have all 1's above the transition, and reject all 1's. */
14515 return c == -lsb && lsb != 1;
14516 }
14517 else if (GET_CODE (andop) == CONST_DOUBLE
14518 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
14519 {
14520 HOST_WIDE_INT low, lsb, shift_mask_low;
14521
14522 low = CONST_DOUBLE_LOW (andop);
14523
14524 if (HOST_BITS_PER_WIDE_INT < 64)
14525 {
14526 HOST_WIDE_INT high, shift_mask_high;
14527
14528 high = CONST_DOUBLE_HIGH (andop);
14529
14530 if (low == 0)
14531 {
14532 shift_mask_high = ~0;
14533 if (INTVAL (shiftop) > 32)
14534 shift_mask_high <<= INTVAL (shiftop) - 32;
14535
14536 lsb = high & -high;
14537
14538 if ((lsb & shift_mask_high) == 0)
14539 return 0;
14540
14541 return high == -lsb;
14542 }
14543 if (high != ~0)
14544 return 0;
14545 }
14546
14547 shift_mask_low = ~0;
14548 shift_mask_low <<= INTVAL (shiftop);
14549
14550 lsb = low & -low;
14551
14552 if ((lsb & shift_mask_low) == 0)
14553 return 0;
14554
14555 return low == -lsb && lsb != 1;
14556 }
14557 else
14558 return 0;
14559 }
14560
14561 /* Return 1 if operands will generate a valid arguments to rlwimi
14562 instruction for insert with right shift in 64-bit mode. The mask may
14563 not start on the first bit or stop on the last bit because wrap-around
14564 effects of instruction do not correspond to semantics of RTL insn. */
14565
14566 int
14567 insvdi_rshift_rlwimi_p (rtx sizeop, rtx startop, rtx shiftop)
14568 {
14569 if (INTVAL (startop) > 32
14570 && INTVAL (startop) < 64
14571 && INTVAL (sizeop) > 1
14572 && INTVAL (sizeop) + INTVAL (startop) < 64
14573 && INTVAL (shiftop) > 0
14574 && INTVAL (sizeop) + INTVAL (shiftop) < 32
14575 && (64 - (INTVAL (shiftop) & 63)) >= INTVAL (sizeop))
14576 return 1;
14577
14578 return 0;
14579 }
14580
14581 /* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
14582 for lfq and stfq insns iff the registers are hard registers. */
14583
14584 int
14585 registers_ok_for_quad_peep (rtx reg1, rtx reg2)
14586 {
14587 /* We might have been passed a SUBREG. */
14588 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
14589 return 0;
14590
14591 /* We might have been passed non floating point registers. */
14592 if (!FP_REGNO_P (REGNO (reg1))
14593 || !FP_REGNO_P (REGNO (reg2)))
14594 return 0;
14595
14596 return (REGNO (reg1) == REGNO (reg2) - 1);
14597 }
14598
14599 /* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
14600 addr1 and addr2 must be in consecutive memory locations
14601 (addr2 == addr1 + 8). */
14602
14603 int
14604 mems_ok_for_quad_peep (rtx mem1, rtx mem2)
14605 {
14606 rtx addr1, addr2;
14607 unsigned int reg1, reg2;
14608 int offset1, offset2;
14609
14610 /* The mems cannot be volatile. */
14611 if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
14612 return 0;
14613
14614 addr1 = XEXP (mem1, 0);
14615 addr2 = XEXP (mem2, 0);
14616
14617 /* Extract an offset (if used) from the first addr. */
14618 if (GET_CODE (addr1) == PLUS)
14619 {
14620 /* If not a REG, return zero. */
14621 if (GET_CODE (XEXP (addr1, 0)) != REG)
14622 return 0;
14623 else
14624 {
14625 reg1 = REGNO (XEXP (addr1, 0));
14626 /* The offset must be constant! */
14627 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
14628 return 0;
14629 offset1 = INTVAL (XEXP (addr1, 1));
14630 }
14631 }
14632 else if (GET_CODE (addr1) != REG)
14633 return 0;
14634 else
14635 {
14636 reg1 = REGNO (addr1);
14637 /* This was a simple (mem (reg)) expression. Offset is 0. */
14638 offset1 = 0;
14639 }
14640
14641 /* And now for the second addr. */
14642 if (GET_CODE (addr2) == PLUS)
14643 {
14644 /* If not a REG, return zero. */
14645 if (GET_CODE (XEXP (addr2, 0)) != REG)
14646 return 0;
14647 else
14648 {
14649 reg2 = REGNO (XEXP (addr2, 0));
14650 /* The offset must be constant. */
14651 if (GET_CODE (XEXP (addr2, 1)) != CONST_INT)
14652 return 0;
14653 offset2 = INTVAL (XEXP (addr2, 1));
14654 }
14655 }
14656 else if (GET_CODE (addr2) != REG)
14657 return 0;
14658 else
14659 {
14660 reg2 = REGNO (addr2);
14661 /* This was a simple (mem (reg)) expression. Offset is 0. */
14662 offset2 = 0;
14663 }
14664
14665 /* Both of these must have the same base register. */
14666 if (reg1 != reg2)
14667 return 0;
14668
14669 /* The offset for the second addr must be 8 more than the first addr. */
14670 if (offset2 != offset1 + 8)
14671 return 0;
14672
14673 /* All the tests passed. addr1 and addr2 are valid for lfq or stfq
14674 instructions. */
14675 return 1;
14676 }
14677 \f
14678
14679 rtx
14680 rs6000_secondary_memory_needed_rtx (enum machine_mode mode)
14681 {
14682 static bool eliminated = false;
14683 rtx ret;
14684
14685 if (mode != SDmode)
14686 ret = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
14687 else
14688 {
14689 rtx mem = cfun->machine->sdmode_stack_slot;
14690 gcc_assert (mem != NULL_RTX);
14691
14692 if (!eliminated)
14693 {
14694 mem = eliminate_regs (mem, VOIDmode, NULL_RTX);
14695 cfun->machine->sdmode_stack_slot = mem;
14696 eliminated = true;
14697 }
14698 ret = mem;
14699 }
14700
14701 if (TARGET_DEBUG_ADDR)
14702 {
14703 fprintf (stderr, "\nrs6000_secondary_memory_needed_rtx, mode %s, rtx:\n",
14704 GET_MODE_NAME (mode));
14705 if (!ret)
14706 fprintf (stderr, "\tNULL_RTX\n");
14707 else
14708 debug_rtx (ret);
14709 }
14710
14711 return ret;
14712 }
14713
14714 static tree
14715 rs6000_check_sdmode (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
14716 {
14717 /* Don't walk into types. */
14718 if (*tp == NULL_TREE || *tp == error_mark_node || TYPE_P (*tp))
14719 {
14720 *walk_subtrees = 0;
14721 return NULL_TREE;
14722 }
14723
14724 switch (TREE_CODE (*tp))
14725 {
14726 case VAR_DECL:
14727 case PARM_DECL:
14728 case FIELD_DECL:
14729 case RESULT_DECL:
14730 case SSA_NAME:
14731 case REAL_CST:
14732 case MEM_REF:
14733 case VIEW_CONVERT_EXPR:
14734 if (TYPE_MODE (TREE_TYPE (*tp)) == SDmode)
14735 return *tp;
14736 break;
14737 default:
14738 break;
14739 }
14740
14741 return NULL_TREE;
14742 }
14743
14744 enum reload_reg_type {
14745 GPR_REGISTER_TYPE,
14746 VECTOR_REGISTER_TYPE,
14747 OTHER_REGISTER_TYPE
14748 };
14749
14750 static enum reload_reg_type
14751 rs6000_reload_register_type (enum reg_class rclass)
14752 {
14753 switch (rclass)
14754 {
14755 case GENERAL_REGS:
14756 case BASE_REGS:
14757 return GPR_REGISTER_TYPE;
14758
14759 case FLOAT_REGS:
14760 case ALTIVEC_REGS:
14761 case VSX_REGS:
14762 return VECTOR_REGISTER_TYPE;
14763
14764 default:
14765 return OTHER_REGISTER_TYPE;
14766 }
14767 }
14768
14769 /* Inform reload about cases where moving X with a mode MODE to a register in
14770 RCLASS requires an extra scratch or immediate register. Return the class
14771 needed for the immediate register.
14772
14773 For VSX and Altivec, we may need a register to convert sp+offset into
14774 reg+sp.
14775
14776 For misaligned 64-bit gpr loads and stores we need a register to
14777 convert an offset address to indirect. */
14778
14779 static reg_class_t
14780 rs6000_secondary_reload (bool in_p,
14781 rtx x,
14782 reg_class_t rclass_i,
14783 enum machine_mode mode,
14784 secondary_reload_info *sri)
14785 {
14786 enum reg_class rclass = (enum reg_class) rclass_i;
14787 reg_class_t ret = ALL_REGS;
14788 enum insn_code icode;
14789 bool default_p = false;
14790
14791 sri->icode = CODE_FOR_nothing;
14792
14793 /* Convert vector loads and stores into gprs to use an additional base
14794 register. */
14795 icode = rs6000_vector_reload[mode][in_p != false];
14796 if (icode != CODE_FOR_nothing)
14797 {
14798 ret = NO_REGS;
14799 sri->icode = CODE_FOR_nothing;
14800 sri->extra_cost = 0;
14801
14802 if (GET_CODE (x) == MEM)
14803 {
14804 rtx addr = XEXP (x, 0);
14805
14806 /* Loads to and stores from gprs can do reg+offset, and wouldn't need
14807 an extra register in that case, but it would need an extra
14808 register if the addressing is reg+reg or (reg+reg)&(-16). */
14809 if (rclass == GENERAL_REGS || rclass == BASE_REGS)
14810 {
14811 if (!legitimate_indirect_address_p (addr, false)
14812 && !rs6000_legitimate_offset_address_p (TImode, addr, false))
14813 {
14814 sri->icode = icode;
14815 /* account for splitting the loads, and converting the
14816 address from reg+reg to reg. */
14817 sri->extra_cost = (((TARGET_64BIT) ? 3 : 5)
14818 + ((GET_CODE (addr) == AND) ? 1 : 0));
14819 }
14820 }
14821 /* Loads to and stores from vector registers can only do reg+reg
14822 addressing. Altivec registers can also do (reg+reg)&(-16). */
14823 else if (rclass == VSX_REGS || rclass == ALTIVEC_REGS
14824 || rclass == FLOAT_REGS || rclass == NO_REGS)
14825 {
14826 if (!VECTOR_MEM_ALTIVEC_P (mode)
14827 && GET_CODE (addr) == AND
14828 && GET_CODE (XEXP (addr, 1)) == CONST_INT
14829 && INTVAL (XEXP (addr, 1)) == -16
14830 && (legitimate_indirect_address_p (XEXP (addr, 0), false)
14831 || legitimate_indexed_address_p (XEXP (addr, 0), false)))
14832 {
14833 sri->icode = icode;
14834 sri->extra_cost = ((GET_CODE (XEXP (addr, 0)) == PLUS)
14835 ? 2 : 1);
14836 }
14837 else if (!legitimate_indirect_address_p (addr, false)
14838 && (rclass == NO_REGS
14839 || !legitimate_indexed_address_p (addr, false)))
14840 {
14841 sri->icode = icode;
14842 sri->extra_cost = 1;
14843 }
14844 else
14845 icode = CODE_FOR_nothing;
14846 }
14847 /* Any other loads, including to pseudo registers which haven't been
14848 assigned to a register yet, default to require a scratch
14849 register. */
14850 else
14851 {
14852 sri->icode = icode;
14853 sri->extra_cost = 2;
14854 }
14855 }
14856 else if (REG_P (x))
14857 {
14858 int regno = true_regnum (x);
14859
14860 icode = CODE_FOR_nothing;
14861 if (regno < 0 || regno >= FIRST_PSEUDO_REGISTER)
14862 default_p = true;
14863 else
14864 {
14865 enum reg_class xclass = REGNO_REG_CLASS (regno);
14866 enum reload_reg_type rtype1 = rs6000_reload_register_type (rclass);
14867 enum reload_reg_type rtype2 = rs6000_reload_register_type (xclass);
14868
14869 /* If memory is needed, use default_secondary_reload to create the
14870 stack slot. */
14871 if (rtype1 != rtype2 || rtype1 == OTHER_REGISTER_TYPE)
14872 default_p = true;
14873 else
14874 ret = NO_REGS;
14875 }
14876 }
14877 else
14878 default_p = true;
14879 }
14880 else if (TARGET_POWERPC64
14881 && rs6000_reload_register_type (rclass) == GPR_REGISTER_TYPE
14882 && MEM_P (x)
14883 && GET_MODE_SIZE (GET_MODE (x)) >= UNITS_PER_WORD)
14884 {
14885 rtx addr = XEXP (x, 0);
14886
14887 if (GET_CODE (addr) == PRE_MODIFY)
14888 addr = XEXP (addr, 1);
14889 else if (GET_CODE (addr) == LO_SUM
14890 && GET_CODE (XEXP (addr, 0)) == REG
14891 && GET_CODE (XEXP (addr, 1)) == CONST)
14892 addr = XEXP (XEXP (addr, 1), 0);
14893
14894 if (GET_CODE (addr) == PLUS
14895 && GET_CODE (XEXP (addr, 1)) == CONST_INT
14896 && (INTVAL (XEXP (addr, 1)) & 3) != 0)
14897 {
14898 if (in_p)
14899 sri->icode = CODE_FOR_reload_di_load;
14900 else
14901 sri->icode = CODE_FOR_reload_di_store;
14902 sri->extra_cost = 2;
14903 ret = NO_REGS;
14904 }
14905 else
14906 default_p = true;
14907 }
14908 else
14909 default_p = true;
14910
14911 if (default_p)
14912 ret = default_secondary_reload (in_p, x, rclass, mode, sri);
14913
14914 gcc_assert (ret != ALL_REGS);
14915
14916 if (TARGET_DEBUG_ADDR)
14917 {
14918 fprintf (stderr,
14919 "\nrs6000_secondary_reload, return %s, in_p = %s, rclass = %s, "
14920 "mode = %s",
14921 reg_class_names[ret],
14922 in_p ? "true" : "false",
14923 reg_class_names[rclass],
14924 GET_MODE_NAME (mode));
14925
14926 if (default_p)
14927 fprintf (stderr, ", default secondary reload");
14928
14929 if (sri->icode != CODE_FOR_nothing)
14930 fprintf (stderr, ", reload func = %s, extra cost = %d\n",
14931 insn_data[sri->icode].name, sri->extra_cost);
14932 else
14933 fprintf (stderr, "\n");
14934
14935 debug_rtx (x);
14936 }
14937
14938 return ret;
14939 }
14940
14941 /* Fixup reload addresses for Altivec or VSX loads/stores to change SP+offset
14942 to SP+reg addressing. */
14943
14944 void
14945 rs6000_secondary_reload_inner (rtx reg, rtx mem, rtx scratch, bool store_p)
14946 {
14947 int regno = true_regnum (reg);
14948 enum machine_mode mode = GET_MODE (reg);
14949 enum reg_class rclass;
14950 rtx addr;
14951 rtx and_op2 = NULL_RTX;
14952 rtx addr_op1;
14953 rtx addr_op2;
14954 rtx scratch_or_premodify = scratch;
14955 rtx and_rtx;
14956 rtx cc_clobber;
14957
14958 if (TARGET_DEBUG_ADDR)
14959 {
14960 fprintf (stderr, "\nrs6000_secondary_reload_inner, type = %s\n",
14961 store_p ? "store" : "load");
14962 fprintf (stderr, "reg:\n");
14963 debug_rtx (reg);
14964 fprintf (stderr, "mem:\n");
14965 debug_rtx (mem);
14966 fprintf (stderr, "scratch:\n");
14967 debug_rtx (scratch);
14968 }
14969
14970 gcc_assert (regno >= 0 && regno < FIRST_PSEUDO_REGISTER);
14971 gcc_assert (GET_CODE (mem) == MEM);
14972 rclass = REGNO_REG_CLASS (regno);
14973 addr = XEXP (mem, 0);
14974
14975 switch (rclass)
14976 {
14977 /* GPRs can handle reg + small constant, all other addresses need to use
14978 the scratch register. */
14979 case GENERAL_REGS:
14980 case BASE_REGS:
14981 if (GET_CODE (addr) == AND)
14982 {
14983 and_op2 = XEXP (addr, 1);
14984 addr = XEXP (addr, 0);
14985 }
14986
14987 if (GET_CODE (addr) == PRE_MODIFY)
14988 {
14989 scratch_or_premodify = XEXP (addr, 0);
14990 gcc_assert (REG_P (scratch_or_premodify));
14991 gcc_assert (GET_CODE (XEXP (addr, 1)) == PLUS);
14992 addr = XEXP (addr, 1);
14993 }
14994
14995 if (GET_CODE (addr) == PLUS
14996 && (!rs6000_legitimate_offset_address_p (TImode, addr, false)
14997 || and_op2 != NULL_RTX))
14998 {
14999 addr_op1 = XEXP (addr, 0);
15000 addr_op2 = XEXP (addr, 1);
15001 gcc_assert (legitimate_indirect_address_p (addr_op1, false));
15002
15003 if (!REG_P (addr_op2)
15004 && (GET_CODE (addr_op2) != CONST_INT
15005 || !satisfies_constraint_I (addr_op2)))
15006 {
15007 if (TARGET_DEBUG_ADDR)
15008 {
15009 fprintf (stderr,
15010 "\nMove plus addr to register %s, mode = %s: ",
15011 rs6000_reg_names[REGNO (scratch)],
15012 GET_MODE_NAME (mode));
15013 debug_rtx (addr_op2);
15014 }
15015 rs6000_emit_move (scratch, addr_op2, Pmode);
15016 addr_op2 = scratch;
15017 }
15018
15019 emit_insn (gen_rtx_SET (VOIDmode,
15020 scratch_or_premodify,
15021 gen_rtx_PLUS (Pmode,
15022 addr_op1,
15023 addr_op2)));
15024
15025 addr = scratch_or_premodify;
15026 scratch_or_premodify = scratch;
15027 }
15028 else if (!legitimate_indirect_address_p (addr, false)
15029 && !rs6000_legitimate_offset_address_p (TImode, addr, false))
15030 {
15031 if (TARGET_DEBUG_ADDR)
15032 {
15033 fprintf (stderr, "\nMove addr to register %s, mode = %s: ",
15034 rs6000_reg_names[REGNO (scratch_or_premodify)],
15035 GET_MODE_NAME (mode));
15036 debug_rtx (addr);
15037 }
15038 rs6000_emit_move (scratch_or_premodify, addr, Pmode);
15039 addr = scratch_or_premodify;
15040 scratch_or_premodify = scratch;
15041 }
15042 break;
15043
15044 /* Float/Altivec registers can only handle reg+reg addressing. Move
15045 other addresses into a scratch register. */
15046 case FLOAT_REGS:
15047 case VSX_REGS:
15048 case ALTIVEC_REGS:
15049
15050 /* With float regs, we need to handle the AND ourselves, since we can't
15051 use the Altivec instruction with an implicit AND -16. Allow scalar
15052 loads to float registers to use reg+offset even if VSX. */
15053 if (GET_CODE (addr) == AND
15054 && (rclass != ALTIVEC_REGS || GET_MODE_SIZE (mode) != 16
15055 || GET_CODE (XEXP (addr, 1)) != CONST_INT
15056 || INTVAL (XEXP (addr, 1)) != -16
15057 || !VECTOR_MEM_ALTIVEC_P (mode)))
15058 {
15059 and_op2 = XEXP (addr, 1);
15060 addr = XEXP (addr, 0);
15061 }
15062
15063 /* If we aren't using a VSX load, save the PRE_MODIFY register and use it
15064 as the address later. */
15065 if (GET_CODE (addr) == PRE_MODIFY
15066 && (!VECTOR_MEM_VSX_P (mode)
15067 || and_op2 != NULL_RTX
15068 || !legitimate_indexed_address_p (XEXP (addr, 1), false)))
15069 {
15070 scratch_or_premodify = XEXP (addr, 0);
15071 gcc_assert (legitimate_indirect_address_p (scratch_or_premodify,
15072 false));
15073 gcc_assert (GET_CODE (XEXP (addr, 1)) == PLUS);
15074 addr = XEXP (addr, 1);
15075 }
15076
15077 if (legitimate_indirect_address_p (addr, false) /* reg */
15078 || legitimate_indexed_address_p (addr, false) /* reg+reg */
15079 || GET_CODE (addr) == PRE_MODIFY /* VSX pre-modify */
15080 || (GET_CODE (addr) == AND /* Altivec memory */
15081 && GET_CODE (XEXP (addr, 1)) == CONST_INT
15082 && INTVAL (XEXP (addr, 1)) == -16
15083 && VECTOR_MEM_ALTIVEC_P (mode))
15084 || (rclass == FLOAT_REGS /* legacy float mem */
15085 && GET_MODE_SIZE (mode) == 8
15086 && and_op2 == NULL_RTX
15087 && scratch_or_premodify == scratch
15088 && rs6000_legitimate_offset_address_p (mode, addr, false)))
15089 ;
15090
15091 else if (GET_CODE (addr) == PLUS)
15092 {
15093 addr_op1 = XEXP (addr, 0);
15094 addr_op2 = XEXP (addr, 1);
15095 gcc_assert (REG_P (addr_op1));
15096
15097 if (TARGET_DEBUG_ADDR)
15098 {
15099 fprintf (stderr, "\nMove plus addr to register %s, mode = %s: ",
15100 rs6000_reg_names[REGNO (scratch)], GET_MODE_NAME (mode));
15101 debug_rtx (addr_op2);
15102 }
15103 rs6000_emit_move (scratch, addr_op2, Pmode);
15104 emit_insn (gen_rtx_SET (VOIDmode,
15105 scratch_or_premodify,
15106 gen_rtx_PLUS (Pmode,
15107 addr_op1,
15108 scratch)));
15109 addr = scratch_or_premodify;
15110 scratch_or_premodify = scratch;
15111 }
15112
15113 else if (GET_CODE (addr) == SYMBOL_REF || GET_CODE (addr) == CONST
15114 || GET_CODE (addr) == CONST_INT || REG_P (addr))
15115 {
15116 if (TARGET_DEBUG_ADDR)
15117 {
15118 fprintf (stderr, "\nMove addr to register %s, mode = %s: ",
15119 rs6000_reg_names[REGNO (scratch_or_premodify)],
15120 GET_MODE_NAME (mode));
15121 debug_rtx (addr);
15122 }
15123
15124 rs6000_emit_move (scratch_or_premodify, addr, Pmode);
15125 addr = scratch_or_premodify;
15126 scratch_or_premodify = scratch;
15127 }
15128
15129 else
15130 gcc_unreachable ();
15131
15132 break;
15133
15134 default:
15135 gcc_unreachable ();
15136 }
15137
15138 /* If the original address involved a pre-modify that we couldn't use the VSX
15139 memory instruction with update, and we haven't taken care of already,
15140 store the address in the pre-modify register and use that as the
15141 address. */
15142 if (scratch_or_premodify != scratch && scratch_or_premodify != addr)
15143 {
15144 emit_insn (gen_rtx_SET (VOIDmode, scratch_or_premodify, addr));
15145 addr = scratch_or_premodify;
15146 }
15147
15148 /* If the original address involved an AND -16 and we couldn't use an ALTIVEC
15149 memory instruction, recreate the AND now, including the clobber which is
15150 generated by the general ANDSI3/ANDDI3 patterns for the
15151 andi. instruction. */
15152 if (and_op2 != NULL_RTX)
15153 {
15154 if (! legitimate_indirect_address_p (addr, false))
15155 {
15156 emit_insn (gen_rtx_SET (VOIDmode, scratch, addr));
15157 addr = scratch;
15158 }
15159
15160 if (TARGET_DEBUG_ADDR)
15161 {
15162 fprintf (stderr, "\nAnd addr to register %s, mode = %s: ",
15163 rs6000_reg_names[REGNO (scratch)], GET_MODE_NAME (mode));
15164 debug_rtx (and_op2);
15165 }
15166
15167 and_rtx = gen_rtx_SET (VOIDmode,
15168 scratch,
15169 gen_rtx_AND (Pmode,
15170 addr,
15171 and_op2));
15172
15173 cc_clobber = gen_rtx_CLOBBER (CCmode, gen_rtx_SCRATCH (CCmode));
15174 emit_insn (gen_rtx_PARALLEL (VOIDmode,
15175 gen_rtvec (2, and_rtx, cc_clobber)));
15176 addr = scratch;
15177 }
15178
15179 /* Adjust the address if it changed. */
15180 if (addr != XEXP (mem, 0))
15181 {
15182 mem = change_address (mem, mode, addr);
15183 if (TARGET_DEBUG_ADDR)
15184 fprintf (stderr, "\nrs6000_secondary_reload_inner, mem adjusted.\n");
15185 }
15186
15187 /* Now create the move. */
15188 if (store_p)
15189 emit_insn (gen_rtx_SET (VOIDmode, mem, reg));
15190 else
15191 emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
15192
15193 return;
15194 }
15195
15196 /* Convert reloads involving 64-bit gprs and misaligned offset
15197 addressing to use indirect addressing. */
15198
15199 void
15200 rs6000_secondary_reload_ppc64 (rtx reg, rtx mem, rtx scratch, bool store_p)
15201 {
15202 int regno = true_regnum (reg);
15203 enum reg_class rclass;
15204 rtx addr;
15205 rtx scratch_or_premodify = scratch;
15206
15207 if (TARGET_DEBUG_ADDR)
15208 {
15209 fprintf (stderr, "\nrs6000_secondary_reload_ppc64, type = %s\n",
15210 store_p ? "store" : "load");
15211 fprintf (stderr, "reg:\n");
15212 debug_rtx (reg);
15213 fprintf (stderr, "mem:\n");
15214 debug_rtx (mem);
15215 fprintf (stderr, "scratch:\n");
15216 debug_rtx (scratch);
15217 }
15218
15219 gcc_assert (regno >= 0 && regno < FIRST_PSEUDO_REGISTER);
15220 gcc_assert (GET_CODE (mem) == MEM);
15221 rclass = REGNO_REG_CLASS (regno);
15222 gcc_assert (rclass == GENERAL_REGS || rclass == BASE_REGS);
15223 addr = XEXP (mem, 0);
15224
15225 if (GET_CODE (addr) == PRE_MODIFY)
15226 {
15227 scratch_or_premodify = XEXP (addr, 0);
15228 gcc_assert (REG_P (scratch_or_premodify));
15229 addr = XEXP (addr, 1);
15230 }
15231 gcc_assert (GET_CODE (addr) == PLUS || GET_CODE (addr) == LO_SUM);
15232
15233 rs6000_emit_move (scratch_or_premodify, addr, Pmode);
15234
15235 mem = replace_equiv_address_nv (mem, scratch_or_premodify);
15236
15237 /* Now create the move. */
15238 if (store_p)
15239 emit_insn (gen_rtx_SET (VOIDmode, mem, reg));
15240 else
15241 emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
15242
15243 return;
15244 }
15245
15246 /* Allocate a 64-bit stack slot to be used for copying SDmode
15247 values through if this function has any SDmode references. */
15248
15249 static void
15250 rs6000_alloc_sdmode_stack_slot (void)
15251 {
15252 tree t;
15253 basic_block bb;
15254 gimple_stmt_iterator gsi;
15255
15256 gcc_assert (cfun->machine->sdmode_stack_slot == NULL_RTX);
15257
15258 FOR_EACH_BB (bb)
15259 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
15260 {
15261 tree ret = walk_gimple_op (gsi_stmt (gsi), rs6000_check_sdmode, NULL);
15262 if (ret)
15263 {
15264 rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
15265 cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
15266 SDmode, 0);
15267 return;
15268 }
15269 }
15270
15271 /* Check for any SDmode parameters of the function. */
15272 for (t = DECL_ARGUMENTS (cfun->decl); t; t = DECL_CHAIN (t))
15273 {
15274 if (TREE_TYPE (t) == error_mark_node)
15275 continue;
15276
15277 if (TYPE_MODE (TREE_TYPE (t)) == SDmode
15278 || TYPE_MODE (DECL_ARG_TYPE (t)) == SDmode)
15279 {
15280 rtx stack = assign_stack_local (DDmode, GET_MODE_SIZE (DDmode), 0);
15281 cfun->machine->sdmode_stack_slot = adjust_address_nv (stack,
15282 SDmode, 0);
15283 return;
15284 }
15285 }
15286 }
15287
15288 static void
15289 rs6000_instantiate_decls (void)
15290 {
15291 if (cfun->machine->sdmode_stack_slot != NULL_RTX)
15292 instantiate_decl_rtl (cfun->machine->sdmode_stack_slot);
15293 }
15294
15295 /* Given an rtx X being reloaded into a reg required to be
15296 in class CLASS, return the class of reg to actually use.
15297 In general this is just CLASS; but on some machines
15298 in some cases it is preferable to use a more restrictive class.
15299
15300 On the RS/6000, we have to return NO_REGS when we want to reload a
15301 floating-point CONST_DOUBLE to force it to be copied to memory.
15302
15303 We also don't want to reload integer values into floating-point
15304 registers if we can at all help it. In fact, this can
15305 cause reload to die, if it tries to generate a reload of CTR
15306 into a FP register and discovers it doesn't have the memory location
15307 required.
15308
15309 ??? Would it be a good idea to have reload do the converse, that is
15310 try to reload floating modes into FP registers if possible?
15311 */
15312
15313 static enum reg_class
15314 rs6000_preferred_reload_class (rtx x, enum reg_class rclass)
15315 {
15316 enum machine_mode mode = GET_MODE (x);
15317
15318 if (VECTOR_UNIT_VSX_P (mode)
15319 && x == CONST0_RTX (mode) && VSX_REG_CLASS_P (rclass))
15320 return rclass;
15321
15322 if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode)
15323 && (rclass == ALTIVEC_REGS || rclass == VSX_REGS)
15324 && easy_vector_constant (x, mode))
15325 return ALTIVEC_REGS;
15326
15327 if (CONSTANT_P (x) && reg_classes_intersect_p (rclass, FLOAT_REGS))
15328 return NO_REGS;
15329
15330 if (GET_MODE_CLASS (mode) == MODE_INT && rclass == NON_SPECIAL_REGS)
15331 return GENERAL_REGS;
15332
15333 /* For VSX, prefer the traditional registers for 64-bit values because we can
15334 use the non-VSX loads. Prefer the Altivec registers if Altivec is
15335 handling the vector operations (i.e. V16QI, V8HI, and V4SI), or if we
15336 prefer Altivec loads.. */
15337 if (rclass == VSX_REGS)
15338 {
15339 if (GET_MODE_SIZE (mode) <= 8)
15340 return FLOAT_REGS;
15341
15342 if (VECTOR_UNIT_ALTIVEC_P (mode) || VECTOR_MEM_ALTIVEC_P (mode))
15343 return ALTIVEC_REGS;
15344
15345 return rclass;
15346 }
15347
15348 return rclass;
15349 }
15350
15351 /* Debug version of rs6000_preferred_reload_class. */
15352 static enum reg_class
15353 rs6000_debug_preferred_reload_class (rtx x, enum reg_class rclass)
15354 {
15355 enum reg_class ret = rs6000_preferred_reload_class (x, rclass);
15356
15357 fprintf (stderr,
15358 "\nrs6000_preferred_reload_class, return %s, rclass = %s, "
15359 "mode = %s, x:\n",
15360 reg_class_names[ret], reg_class_names[rclass],
15361 GET_MODE_NAME (GET_MODE (x)));
15362 debug_rtx (x);
15363
15364 return ret;
15365 }
15366
15367 /* If we are copying between FP or AltiVec registers and anything else, we need
15368 a memory location. The exception is when we are targeting ppc64 and the
15369 move to/from fpr to gpr instructions are available. Also, under VSX, you
15370 can copy vector registers from the FP register set to the Altivec register
15371 set and vice versa. */
15372
15373 static bool
15374 rs6000_secondary_memory_needed (enum reg_class class1,
15375 enum reg_class class2,
15376 enum machine_mode mode)
15377 {
15378 if (class1 == class2)
15379 return false;
15380
15381 /* Under VSX, there are 3 register classes that values could be in (VSX_REGS,
15382 ALTIVEC_REGS, and FLOAT_REGS). We don't need to use memory to copy
15383 between these classes. But we need memory for other things that can go in
15384 FLOAT_REGS like SFmode. */
15385 if (TARGET_VSX
15386 && (VECTOR_MEM_VSX_P (mode) || VECTOR_UNIT_VSX_P (mode))
15387 && (class1 == VSX_REGS || class1 == ALTIVEC_REGS
15388 || class1 == FLOAT_REGS))
15389 return (class2 != VSX_REGS && class2 != ALTIVEC_REGS
15390 && class2 != FLOAT_REGS);
15391
15392 if (class1 == VSX_REGS || class2 == VSX_REGS)
15393 return true;
15394
15395 if (class1 == FLOAT_REGS
15396 && (!TARGET_MFPGPR || !TARGET_POWERPC64
15397 || ((mode != DFmode)
15398 && (mode != DDmode)
15399 && (mode != DImode))))
15400 return true;
15401
15402 if (class2 == FLOAT_REGS
15403 && (!TARGET_MFPGPR || !TARGET_POWERPC64
15404 || ((mode != DFmode)
15405 && (mode != DDmode)
15406 && (mode != DImode))))
15407 return true;
15408
15409 if (class1 == ALTIVEC_REGS || class2 == ALTIVEC_REGS)
15410 return true;
15411
15412 return false;
15413 }
15414
15415 /* Debug version of rs6000_secondary_memory_needed. */
15416 static bool
15417 rs6000_debug_secondary_memory_needed (enum reg_class class1,
15418 enum reg_class class2,
15419 enum machine_mode mode)
15420 {
15421 bool ret = rs6000_secondary_memory_needed (class1, class2, mode);
15422
15423 fprintf (stderr,
15424 "rs6000_secondary_memory_needed, return: %s, class1 = %s, "
15425 "class2 = %s, mode = %s\n",
15426 ret ? "true" : "false", reg_class_names[class1],
15427 reg_class_names[class2], GET_MODE_NAME (mode));
15428
15429 return ret;
15430 }
15431
15432 /* Return the register class of a scratch register needed to copy IN into
15433 or out of a register in RCLASS in MODE. If it can be done directly,
15434 NO_REGS is returned. */
15435
15436 static enum reg_class
15437 rs6000_secondary_reload_class (enum reg_class rclass, enum machine_mode mode,
15438 rtx in)
15439 {
15440 int regno;
15441
15442 if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
15443 #if TARGET_MACHO
15444 && MACHOPIC_INDIRECT
15445 #endif
15446 ))
15447 {
15448 /* We cannot copy a symbolic operand directly into anything
15449 other than BASE_REGS for TARGET_ELF. So indicate that a
15450 register from BASE_REGS is needed as an intermediate
15451 register.
15452
15453 On Darwin, pic addresses require a load from memory, which
15454 needs a base register. */
15455 if (rclass != BASE_REGS
15456 && (GET_CODE (in) == SYMBOL_REF
15457 || GET_CODE (in) == HIGH
15458 || GET_CODE (in) == LABEL_REF
15459 || GET_CODE (in) == CONST))
15460 return BASE_REGS;
15461 }
15462
15463 if (GET_CODE (in) == REG)
15464 {
15465 regno = REGNO (in);
15466 if (regno >= FIRST_PSEUDO_REGISTER)
15467 {
15468 regno = true_regnum (in);
15469 if (regno >= FIRST_PSEUDO_REGISTER)
15470 regno = -1;
15471 }
15472 }
15473 else if (GET_CODE (in) == SUBREG)
15474 {
15475 regno = true_regnum (in);
15476 if (regno >= FIRST_PSEUDO_REGISTER)
15477 regno = -1;
15478 }
15479 else
15480 regno = -1;
15481
15482 /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
15483 into anything. */
15484 if (rclass == GENERAL_REGS || rclass == BASE_REGS
15485 || (regno >= 0 && INT_REGNO_P (regno)))
15486 return NO_REGS;
15487
15488 /* Constants, memory, and FP registers can go into FP registers. */
15489 if ((regno == -1 || FP_REGNO_P (regno))
15490 && (rclass == FLOAT_REGS || rclass == NON_SPECIAL_REGS))
15491 return (mode != SDmode) ? NO_REGS : GENERAL_REGS;
15492
15493 /* Memory, and FP/altivec registers can go into fp/altivec registers under
15494 VSX. */
15495 if (TARGET_VSX
15496 && (regno == -1 || VSX_REGNO_P (regno))
15497 && VSX_REG_CLASS_P (rclass))
15498 return NO_REGS;
15499
15500 /* Memory, and AltiVec registers can go into AltiVec registers. */
15501 if ((regno == -1 || ALTIVEC_REGNO_P (regno))
15502 && rclass == ALTIVEC_REGS)
15503 return NO_REGS;
15504
15505 /* We can copy among the CR registers. */
15506 if ((rclass == CR_REGS || rclass == CR0_REGS)
15507 && regno >= 0 && CR_REGNO_P (regno))
15508 return NO_REGS;
15509
15510 /* Otherwise, we need GENERAL_REGS. */
15511 return GENERAL_REGS;
15512 }
15513
15514 /* Debug version of rs6000_secondary_reload_class. */
15515 static enum reg_class
15516 rs6000_debug_secondary_reload_class (enum reg_class rclass,
15517 enum machine_mode mode, rtx in)
15518 {
15519 enum reg_class ret = rs6000_secondary_reload_class (rclass, mode, in);
15520 fprintf (stderr,
15521 "\nrs6000_secondary_reload_class, return %s, rclass = %s, "
15522 "mode = %s, input rtx:\n",
15523 reg_class_names[ret], reg_class_names[rclass],
15524 GET_MODE_NAME (mode));
15525 debug_rtx (in);
15526
15527 return ret;
15528 }
15529
15530 /* Return nonzero if for CLASS a mode change from FROM to TO is invalid. */
15531
15532 static bool
15533 rs6000_cannot_change_mode_class (enum machine_mode from,
15534 enum machine_mode to,
15535 enum reg_class rclass)
15536 {
15537 unsigned from_size = GET_MODE_SIZE (from);
15538 unsigned to_size = GET_MODE_SIZE (to);
15539
15540 if (from_size != to_size)
15541 {
15542 enum reg_class xclass = (TARGET_VSX) ? VSX_REGS : FLOAT_REGS;
15543 return ((from_size < 8 || to_size < 8 || TARGET_IEEEQUAD)
15544 && reg_classes_intersect_p (xclass, rclass));
15545 }
15546
15547 if (TARGET_E500_DOUBLE
15548 && ((((to) == DFmode) + ((from) == DFmode)) == 1
15549 || (((to) == TFmode) + ((from) == TFmode)) == 1
15550 || (((to) == DDmode) + ((from) == DDmode)) == 1
15551 || (((to) == TDmode) + ((from) == TDmode)) == 1
15552 || (((to) == DImode) + ((from) == DImode)) == 1))
15553 return true;
15554
15555 /* Since the VSX register set includes traditional floating point registers
15556 and altivec registers, just check for the size being different instead of
15557 trying to check whether the modes are vector modes. Otherwise it won't
15558 allow say DF and DI to change classes. */
15559 if (TARGET_VSX && VSX_REG_CLASS_P (rclass))
15560 return (from_size != 8 && from_size != 16);
15561
15562 if (TARGET_ALTIVEC && rclass == ALTIVEC_REGS
15563 && (ALTIVEC_VECTOR_MODE (from) + ALTIVEC_VECTOR_MODE (to)) == 1)
15564 return true;
15565
15566 if (TARGET_SPE && (SPE_VECTOR_MODE (from) + SPE_VECTOR_MODE (to)) == 1
15567 && reg_classes_intersect_p (GENERAL_REGS, rclass))
15568 return true;
15569
15570 return false;
15571 }
15572
15573 /* Debug version of rs6000_cannot_change_mode_class. */
15574 static bool
15575 rs6000_debug_cannot_change_mode_class (enum machine_mode from,
15576 enum machine_mode to,
15577 enum reg_class rclass)
15578 {
15579 bool ret = rs6000_cannot_change_mode_class (from, to, rclass);
15580
15581 fprintf (stderr,
15582 "rs6000_cannot_change_mode_class, return %s, from = %s, "
15583 "to = %s, rclass = %s\n",
15584 ret ? "true" : "false",
15585 GET_MODE_NAME (from), GET_MODE_NAME (to),
15586 reg_class_names[rclass]);
15587
15588 return ret;
15589 }
15590 \f
15591 /* Given a comparison operation, return the bit number in CCR to test. We
15592 know this is a valid comparison.
15593
15594 SCC_P is 1 if this is for an scc. That means that %D will have been
15595 used instead of %C, so the bits will be in different places.
15596
15597 Return -1 if OP isn't a valid comparison for some reason. */
15598
15599 int
15600 ccr_bit (rtx op, int scc_p)
15601 {
15602 enum rtx_code code = GET_CODE (op);
15603 enum machine_mode cc_mode;
15604 int cc_regnum;
15605 int base_bit;
15606 rtx reg;
15607
15608 if (!COMPARISON_P (op))
15609 return -1;
15610
15611 reg = XEXP (op, 0);
15612
15613 gcc_assert (GET_CODE (reg) == REG && CR_REGNO_P (REGNO (reg)));
15614
15615 cc_mode = GET_MODE (reg);
15616 cc_regnum = REGNO (reg);
15617 base_bit = 4 * (cc_regnum - CR0_REGNO);
15618
15619 validate_condition_mode (code, cc_mode);
15620
15621 /* When generating a sCOND operation, only positive conditions are
15622 allowed. */
15623 gcc_assert (!scc_p
15624 || code == EQ || code == GT || code == LT || code == UNORDERED
15625 || code == GTU || code == LTU);
15626
15627 switch (code)
15628 {
15629 case NE:
15630 return scc_p ? base_bit + 3 : base_bit + 2;
15631 case EQ:
15632 return base_bit + 2;
15633 case GT: case GTU: case UNLE:
15634 return base_bit + 1;
15635 case LT: case LTU: case UNGE:
15636 return base_bit;
15637 case ORDERED: case UNORDERED:
15638 return base_bit + 3;
15639
15640 case GE: case GEU:
15641 /* If scc, we will have done a cror to put the bit in the
15642 unordered position. So test that bit. For integer, this is ! LT
15643 unless this is an scc insn. */
15644 return scc_p ? base_bit + 3 : base_bit;
15645
15646 case LE: case LEU:
15647 return scc_p ? base_bit + 3 : base_bit + 1;
15648
15649 default:
15650 gcc_unreachable ();
15651 }
15652 }
15653 \f
15654 /* Return the GOT register. */
15655
15656 rtx
15657 rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
15658 {
15659 /* The second flow pass currently (June 1999) can't update
15660 regs_ever_live without disturbing other parts of the compiler, so
15661 update it here to make the prolog/epilogue code happy. */
15662 if (!can_create_pseudo_p ()
15663 && !df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
15664 df_set_regs_ever_live (RS6000_PIC_OFFSET_TABLE_REGNUM, true);
15665
15666 crtl->uses_pic_offset_table = 1;
15667
15668 return pic_offset_table_rtx;
15669 }
15670 \f
15671 static rs6000_stack_t stack_info;
15672
15673 /* Function to init struct machine_function.
15674 This will be called, via a pointer variable,
15675 from push_function_context. */
15676
15677 static struct machine_function *
15678 rs6000_init_machine_status (void)
15679 {
15680 stack_info.reload_completed = 0;
15681 return ggc_alloc_cleared_machine_function ();
15682 }
15683 \f
15684 /* These macros test for integers and extract the low-order bits. */
15685 #define INT_P(X) \
15686 ((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE) \
15687 && GET_MODE (X) == VOIDmode)
15688
15689 #define INT_LOWPART(X) \
15690 (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
15691
15692 int
15693 extract_MB (rtx op)
15694 {
15695 int i;
15696 unsigned long val = INT_LOWPART (op);
15697
15698 /* If the high bit is zero, the value is the first 1 bit we find
15699 from the left. */
15700 if ((val & 0x80000000) == 0)
15701 {
15702 gcc_assert (val & 0xffffffff);
15703
15704 i = 1;
15705 while (((val <<= 1) & 0x80000000) == 0)
15706 ++i;
15707 return i;
15708 }
15709
15710 /* If the high bit is set and the low bit is not, or the mask is all
15711 1's, the value is zero. */
15712 if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
15713 return 0;
15714
15715 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
15716 from the right. */
15717 i = 31;
15718 while (((val >>= 1) & 1) != 0)
15719 --i;
15720
15721 return i;
15722 }
15723
15724 int
15725 extract_ME (rtx op)
15726 {
15727 int i;
15728 unsigned long val = INT_LOWPART (op);
15729
15730 /* If the low bit is zero, the value is the first 1 bit we find from
15731 the right. */
15732 if ((val & 1) == 0)
15733 {
15734 gcc_assert (val & 0xffffffff);
15735
15736 i = 30;
15737 while (((val >>= 1) & 1) == 0)
15738 --i;
15739
15740 return i;
15741 }
15742
15743 /* If the low bit is set and the high bit is not, or the mask is all
15744 1's, the value is 31. */
15745 if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
15746 return 31;
15747
15748 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
15749 from the left. */
15750 i = 0;
15751 while (((val <<= 1) & 0x80000000) != 0)
15752 ++i;
15753
15754 return i;
15755 }
15756
15757 /* Locate some local-dynamic symbol still in use by this function
15758 so that we can print its name in some tls_ld pattern. */
15759
15760 static const char *
15761 rs6000_get_some_local_dynamic_name (void)
15762 {
15763 rtx insn;
15764
15765 if (cfun->machine->some_ld_name)
15766 return cfun->machine->some_ld_name;
15767
15768 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
15769 if (INSN_P (insn)
15770 && for_each_rtx (&PATTERN (insn),
15771 rs6000_get_some_local_dynamic_name_1, 0))
15772 return cfun->machine->some_ld_name;
15773
15774 gcc_unreachable ();
15775 }
15776
15777 /* Helper function for rs6000_get_some_local_dynamic_name. */
15778
15779 static int
15780 rs6000_get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
15781 {
15782 rtx x = *px;
15783
15784 if (GET_CODE (x) == SYMBOL_REF)
15785 {
15786 const char *str = XSTR (x, 0);
15787 if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
15788 {
15789 cfun->machine->some_ld_name = str;
15790 return 1;
15791 }
15792 }
15793
15794 return 0;
15795 }
15796
15797 /* Write out a function code label. */
15798
15799 void
15800 rs6000_output_function_entry (FILE *file, const char *fname)
15801 {
15802 if (fname[0] != '.')
15803 {
15804 switch (DEFAULT_ABI)
15805 {
15806 default:
15807 gcc_unreachable ();
15808
15809 case ABI_AIX:
15810 if (DOT_SYMBOLS)
15811 putc ('.', file);
15812 else
15813 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
15814 break;
15815
15816 case ABI_V4:
15817 case ABI_DARWIN:
15818 break;
15819 }
15820 }
15821
15822 RS6000_OUTPUT_BASENAME (file, fname);
15823 }
15824
15825 /* Print an operand. Recognize special options, documented below. */
15826
15827 #if TARGET_ELF
15828 #define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
15829 #define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
15830 #else
15831 #define SMALL_DATA_RELOC "sda21"
15832 #define SMALL_DATA_REG 0
15833 #endif
15834
15835 void
15836 print_operand (FILE *file, rtx x, int code)
15837 {
15838 int i;
15839 HOST_WIDE_INT val;
15840 unsigned HOST_WIDE_INT uval;
15841
15842 switch (code)
15843 {
15844 case '.':
15845 /* Write out an instruction after the call which may be replaced
15846 with glue code by the loader. This depends on the AIX version. */
15847 asm_fprintf (file, RS6000_CALL_GLUE);
15848 return;
15849
15850 /* %a is output_address. */
15851
15852 case 'A':
15853 /* If X is a constant integer whose low-order 5 bits are zero,
15854 write 'l'. Otherwise, write 'r'. This is a kludge to fix a bug
15855 in the AIX assembler where "sri" with a zero shift count
15856 writes a trash instruction. */
15857 if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
15858 putc ('l', file);
15859 else
15860 putc ('r', file);
15861 return;
15862
15863 case 'b':
15864 /* If constant, low-order 16 bits of constant, unsigned.
15865 Otherwise, write normally. */
15866 if (INT_P (x))
15867 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
15868 else
15869 print_operand (file, x, 0);
15870 return;
15871
15872 case 'B':
15873 /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
15874 for 64-bit mask direction. */
15875 putc (((INT_LOWPART (x) & 1) == 0 ? 'r' : 'l'), file);
15876 return;
15877
15878 /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
15879 output_operand. */
15880
15881 case 'c':
15882 /* X is a CR register. Print the number of the GT bit of the CR. */
15883 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15884 output_operand_lossage ("invalid %%c value");
15885 else
15886 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 1);
15887 return;
15888
15889 case 'D':
15890 /* Like 'J' but get to the GT bit only. */
15891 gcc_assert (GET_CODE (x) == REG);
15892
15893 /* Bit 1 is GT bit. */
15894 i = 4 * (REGNO (x) - CR0_REGNO) + 1;
15895
15896 /* Add one for shift count in rlinm for scc. */
15897 fprintf (file, "%d", i + 1);
15898 return;
15899
15900 case 'E':
15901 /* X is a CR register. Print the number of the EQ bit of the CR */
15902 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15903 output_operand_lossage ("invalid %%E value");
15904 else
15905 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
15906 return;
15907
15908 case 'f':
15909 /* X is a CR register. Print the shift count needed to move it
15910 to the high-order four bits. */
15911 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15912 output_operand_lossage ("invalid %%f value");
15913 else
15914 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
15915 return;
15916
15917 case 'F':
15918 /* Similar, but print the count for the rotate in the opposite
15919 direction. */
15920 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
15921 output_operand_lossage ("invalid %%F value");
15922 else
15923 fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
15924 return;
15925
15926 case 'G':
15927 /* X is a constant integer. If it is negative, print "m",
15928 otherwise print "z". This is to make an aze or ame insn. */
15929 if (GET_CODE (x) != CONST_INT)
15930 output_operand_lossage ("invalid %%G value");
15931 else if (INTVAL (x) >= 0)
15932 putc ('z', file);
15933 else
15934 putc ('m', file);
15935 return;
15936
15937 case 'h':
15938 /* If constant, output low-order five bits. Otherwise, write
15939 normally. */
15940 if (INT_P (x))
15941 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
15942 else
15943 print_operand (file, x, 0);
15944 return;
15945
15946 case 'H':
15947 /* If constant, output low-order six bits. Otherwise, write
15948 normally. */
15949 if (INT_P (x))
15950 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
15951 else
15952 print_operand (file, x, 0);
15953 return;
15954
15955 case 'I':
15956 /* Print `i' if this is a constant, else nothing. */
15957 if (INT_P (x))
15958 putc ('i', file);
15959 return;
15960
15961 case 'j':
15962 /* Write the bit number in CCR for jump. */
15963 i = ccr_bit (x, 0);
15964 if (i == -1)
15965 output_operand_lossage ("invalid %%j code");
15966 else
15967 fprintf (file, "%d", i);
15968 return;
15969
15970 case 'J':
15971 /* Similar, but add one for shift count in rlinm for scc and pass
15972 scc flag to `ccr_bit'. */
15973 i = ccr_bit (x, 1);
15974 if (i == -1)
15975 output_operand_lossage ("invalid %%J code");
15976 else
15977 /* If we want bit 31, write a shift count of zero, not 32. */
15978 fprintf (file, "%d", i == 31 ? 0 : i + 1);
15979 return;
15980
15981 case 'k':
15982 /* X must be a constant. Write the 1's complement of the
15983 constant. */
15984 if (! INT_P (x))
15985 output_operand_lossage ("invalid %%k value");
15986 else
15987 fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
15988 return;
15989
15990 case 'K':
15991 /* X must be a symbolic constant on ELF. Write an
15992 expression suitable for an 'addi' that adds in the low 16
15993 bits of the MEM. */
15994 if (GET_CODE (x) == CONST)
15995 {
15996 if (GET_CODE (XEXP (x, 0)) != PLUS
15997 || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
15998 && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
15999 || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
16000 output_operand_lossage ("invalid %%K value");
16001 }
16002 print_operand_address (file, x);
16003 fputs ("@l", file);
16004 return;
16005
16006 /* %l is output_asm_label. */
16007
16008 case 'L':
16009 /* Write second word of DImode or DFmode reference. Works on register
16010 or non-indexed memory only. */
16011 if (GET_CODE (x) == REG)
16012 fputs (reg_names[REGNO (x) + 1], file);
16013 else if (GET_CODE (x) == MEM)
16014 {
16015 /* Handle possible auto-increment. Since it is pre-increment and
16016 we have already done it, we can just use an offset of word. */
16017 if (GET_CODE (XEXP (x, 0)) == PRE_INC
16018 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
16019 output_address (plus_constant (XEXP (XEXP (x, 0), 0),
16020 UNITS_PER_WORD));
16021 else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
16022 output_address (plus_constant (XEXP (XEXP (x, 0), 0),
16023 UNITS_PER_WORD));
16024 else
16025 output_address (XEXP (adjust_address_nv (x, SImode,
16026 UNITS_PER_WORD),
16027 0));
16028
16029 if (small_data_operand (x, GET_MODE (x)))
16030 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
16031 reg_names[SMALL_DATA_REG]);
16032 }
16033 return;
16034
16035 case 'm':
16036 /* MB value for a mask operand. */
16037 if (! mask_operand (x, SImode))
16038 output_operand_lossage ("invalid %%m value");
16039
16040 fprintf (file, "%d", extract_MB (x));
16041 return;
16042
16043 case 'M':
16044 /* ME value for a mask operand. */
16045 if (! mask_operand (x, SImode))
16046 output_operand_lossage ("invalid %%M value");
16047
16048 fprintf (file, "%d", extract_ME (x));
16049 return;
16050
16051 /* %n outputs the negative of its operand. */
16052
16053 case 'N':
16054 /* Write the number of elements in the vector times 4. */
16055 if (GET_CODE (x) != PARALLEL)
16056 output_operand_lossage ("invalid %%N value");
16057 else
16058 fprintf (file, "%d", XVECLEN (x, 0) * 4);
16059 return;
16060
16061 case 'O':
16062 /* Similar, but subtract 1 first. */
16063 if (GET_CODE (x) != PARALLEL)
16064 output_operand_lossage ("invalid %%O value");
16065 else
16066 fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
16067 return;
16068
16069 case 'p':
16070 /* X is a CONST_INT that is a power of two. Output the logarithm. */
16071 if (! INT_P (x)
16072 || INT_LOWPART (x) < 0
16073 || (i = exact_log2 (INT_LOWPART (x))) < 0)
16074 output_operand_lossage ("invalid %%p value");
16075 else
16076 fprintf (file, "%d", i);
16077 return;
16078
16079 case 'P':
16080 /* The operand must be an indirect memory reference. The result
16081 is the register name. */
16082 if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
16083 || REGNO (XEXP (x, 0)) >= 32)
16084 output_operand_lossage ("invalid %%P value");
16085 else
16086 fputs (reg_names[REGNO (XEXP (x, 0))], file);
16087 return;
16088
16089 case 'q':
16090 /* This outputs the logical code corresponding to a boolean
16091 expression. The expression may have one or both operands
16092 negated (if one, only the first one). For condition register
16093 logical operations, it will also treat the negated
16094 CR codes as NOTs, but not handle NOTs of them. */
16095 {
16096 const char *const *t = 0;
16097 const char *s;
16098 enum rtx_code code = GET_CODE (x);
16099 static const char * const tbl[3][3] = {
16100 { "and", "andc", "nor" },
16101 { "or", "orc", "nand" },
16102 { "xor", "eqv", "xor" } };
16103
16104 if (code == AND)
16105 t = tbl[0];
16106 else if (code == IOR)
16107 t = tbl[1];
16108 else if (code == XOR)
16109 t = tbl[2];
16110 else
16111 output_operand_lossage ("invalid %%q value");
16112
16113 if (GET_CODE (XEXP (x, 0)) != NOT)
16114 s = t[0];
16115 else
16116 {
16117 if (GET_CODE (XEXP (x, 1)) == NOT)
16118 s = t[2];
16119 else
16120 s = t[1];
16121 }
16122
16123 fputs (s, file);
16124 }
16125 return;
16126
16127 case 'Q':
16128 if (TARGET_MFCRF)
16129 fputc (',', file);
16130 /* FALLTHRU */
16131 else
16132 return;
16133
16134 case 'R':
16135 /* X is a CR register. Print the mask for `mtcrf'. */
16136 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
16137 output_operand_lossage ("invalid %%R value");
16138 else
16139 fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
16140 return;
16141
16142 case 's':
16143 /* Low 5 bits of 32 - value */
16144 if (! INT_P (x))
16145 output_operand_lossage ("invalid %%s value");
16146 else
16147 fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
16148 return;
16149
16150 case 'S':
16151 /* PowerPC64 mask position. All 0's is excluded.
16152 CONST_INT 32-bit mask is considered sign-extended so any
16153 transition must occur within the CONST_INT, not on the boundary. */
16154 if (! mask64_operand (x, DImode))
16155 output_operand_lossage ("invalid %%S value");
16156
16157 uval = INT_LOWPART (x);
16158
16159 if (uval & 1) /* Clear Left */
16160 {
16161 #if HOST_BITS_PER_WIDE_INT > 64
16162 uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
16163 #endif
16164 i = 64;
16165 }
16166 else /* Clear Right */
16167 {
16168 uval = ~uval;
16169 #if HOST_BITS_PER_WIDE_INT > 64
16170 uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
16171 #endif
16172 i = 63;
16173 }
16174 while (uval != 0)
16175 --i, uval >>= 1;
16176 gcc_assert (i >= 0);
16177 fprintf (file, "%d", i);
16178 return;
16179
16180 case 't':
16181 /* Like 'J' but get to the OVERFLOW/UNORDERED bit. */
16182 gcc_assert (GET_CODE (x) == REG && GET_MODE (x) == CCmode);
16183
16184 /* Bit 3 is OV bit. */
16185 i = 4 * (REGNO (x) - CR0_REGNO) + 3;
16186
16187 /* If we want bit 31, write a shift count of zero, not 32. */
16188 fprintf (file, "%d", i == 31 ? 0 : i + 1);
16189 return;
16190
16191 case 'T':
16192 /* Print the symbolic name of a branch target register. */
16193 if (GET_CODE (x) != REG || (REGNO (x) != LR_REGNO
16194 && REGNO (x) != CTR_REGNO))
16195 output_operand_lossage ("invalid %%T value");
16196 else if (REGNO (x) == LR_REGNO)
16197 fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
16198 else
16199 fputs ("ctr", file);
16200 return;
16201
16202 case 'u':
16203 /* High-order 16 bits of constant for use in unsigned operand. */
16204 if (! INT_P (x))
16205 output_operand_lossage ("invalid %%u value");
16206 else
16207 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
16208 (INT_LOWPART (x) >> 16) & 0xffff);
16209 return;
16210
16211 case 'v':
16212 /* High-order 16 bits of constant for use in signed operand. */
16213 if (! INT_P (x))
16214 output_operand_lossage ("invalid %%v value");
16215 else
16216 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
16217 (INT_LOWPART (x) >> 16) & 0xffff);
16218 return;
16219
16220 case 'U':
16221 /* Print `u' if this has an auto-increment or auto-decrement. */
16222 if (GET_CODE (x) == MEM
16223 && (GET_CODE (XEXP (x, 0)) == PRE_INC
16224 || GET_CODE (XEXP (x, 0)) == PRE_DEC
16225 || GET_CODE (XEXP (x, 0)) == PRE_MODIFY))
16226 putc ('u', file);
16227 return;
16228
16229 case 'V':
16230 /* Print the trap code for this operand. */
16231 switch (GET_CODE (x))
16232 {
16233 case EQ:
16234 fputs ("eq", file); /* 4 */
16235 break;
16236 case NE:
16237 fputs ("ne", file); /* 24 */
16238 break;
16239 case LT:
16240 fputs ("lt", file); /* 16 */
16241 break;
16242 case LE:
16243 fputs ("le", file); /* 20 */
16244 break;
16245 case GT:
16246 fputs ("gt", file); /* 8 */
16247 break;
16248 case GE:
16249 fputs ("ge", file); /* 12 */
16250 break;
16251 case LTU:
16252 fputs ("llt", file); /* 2 */
16253 break;
16254 case LEU:
16255 fputs ("lle", file); /* 6 */
16256 break;
16257 case GTU:
16258 fputs ("lgt", file); /* 1 */
16259 break;
16260 case GEU:
16261 fputs ("lge", file); /* 5 */
16262 break;
16263 default:
16264 gcc_unreachable ();
16265 }
16266 break;
16267
16268 case 'w':
16269 /* If constant, low-order 16 bits of constant, signed. Otherwise, write
16270 normally. */
16271 if (INT_P (x))
16272 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
16273 ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
16274 else
16275 print_operand (file, x, 0);
16276 return;
16277
16278 case 'W':
16279 /* MB value for a PowerPC64 rldic operand. */
16280 val = (GET_CODE (x) == CONST_INT
16281 ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
16282
16283 if (val < 0)
16284 i = -1;
16285 else
16286 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
16287 if ((val <<= 1) < 0)
16288 break;
16289
16290 #if HOST_BITS_PER_WIDE_INT == 32
16291 if (GET_CODE (x) == CONST_INT && i >= 0)
16292 i += 32; /* zero-extend high-part was all 0's */
16293 else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
16294 {
16295 val = CONST_DOUBLE_LOW (x);
16296
16297 gcc_assert (val);
16298 if (val < 0)
16299 --i;
16300 else
16301 for ( ; i < 64; i++)
16302 if ((val <<= 1) < 0)
16303 break;
16304 }
16305 #endif
16306
16307 fprintf (file, "%d", i + 1);
16308 return;
16309
16310 case 'x':
16311 /* X is a FPR or Altivec register used in a VSX context. */
16312 if (GET_CODE (x) != REG || !VSX_REGNO_P (REGNO (x)))
16313 output_operand_lossage ("invalid %%x value");
16314 else
16315 {
16316 int reg = REGNO (x);
16317 int vsx_reg = (FP_REGNO_P (reg)
16318 ? reg - 32
16319 : reg - FIRST_ALTIVEC_REGNO + 32);
16320
16321 #ifdef TARGET_REGNAMES
16322 if (TARGET_REGNAMES)
16323 fprintf (file, "%%vs%d", vsx_reg);
16324 else
16325 #endif
16326 fprintf (file, "%d", vsx_reg);
16327 }
16328 return;
16329
16330 case 'X':
16331 if (GET_CODE (x) == MEM
16332 && (legitimate_indexed_address_p (XEXP (x, 0), 0)
16333 || (GET_CODE (XEXP (x, 0)) == PRE_MODIFY
16334 && legitimate_indexed_address_p (XEXP (XEXP (x, 0), 1), 0))))
16335 putc ('x', file);
16336 return;
16337
16338 case 'Y':
16339 /* Like 'L', for third word of TImode */
16340 if (GET_CODE (x) == REG)
16341 fputs (reg_names[REGNO (x) + 2], file);
16342 else if (GET_CODE (x) == MEM)
16343 {
16344 if (GET_CODE (XEXP (x, 0)) == PRE_INC
16345 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
16346 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
16347 else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
16348 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
16349 else
16350 output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
16351 if (small_data_operand (x, GET_MODE (x)))
16352 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
16353 reg_names[SMALL_DATA_REG]);
16354 }
16355 return;
16356
16357 case 'z':
16358 /* X is a SYMBOL_REF. Write out the name preceded by a
16359 period and without any trailing data in brackets. Used for function
16360 names. If we are configured for System V (or the embedded ABI) on
16361 the PowerPC, do not emit the period, since those systems do not use
16362 TOCs and the like. */
16363 gcc_assert (GET_CODE (x) == SYMBOL_REF);
16364
16365 /* Mark the decl as referenced so that cgraph will output the
16366 function. */
16367 if (SYMBOL_REF_DECL (x))
16368 mark_decl_referenced (SYMBOL_REF_DECL (x));
16369
16370 /* For macho, check to see if we need a stub. */
16371 if (TARGET_MACHO)
16372 {
16373 const char *name = XSTR (x, 0);
16374 #if TARGET_MACHO
16375 if (darwin_emit_branch_islands
16376 && MACHOPIC_INDIRECT
16377 && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
16378 name = machopic_indirection_name (x, /*stub_p=*/true);
16379 #endif
16380 assemble_name (file, name);
16381 }
16382 else if (!DOT_SYMBOLS)
16383 assemble_name (file, XSTR (x, 0));
16384 else
16385 rs6000_output_function_entry (file, XSTR (x, 0));
16386 return;
16387
16388 case 'Z':
16389 /* Like 'L', for last word of TImode. */
16390 if (GET_CODE (x) == REG)
16391 fputs (reg_names[REGNO (x) + 3], file);
16392 else if (GET_CODE (x) == MEM)
16393 {
16394 if (GET_CODE (XEXP (x, 0)) == PRE_INC
16395 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
16396 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
16397 else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
16398 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
16399 else
16400 output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
16401 if (small_data_operand (x, GET_MODE (x)))
16402 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
16403 reg_names[SMALL_DATA_REG]);
16404 }
16405 return;
16406
16407 /* Print AltiVec or SPE memory operand. */
16408 case 'y':
16409 {
16410 rtx tmp;
16411
16412 gcc_assert (GET_CODE (x) == MEM);
16413
16414 tmp = XEXP (x, 0);
16415
16416 /* Ugly hack because %y is overloaded. */
16417 if ((TARGET_SPE || TARGET_E500_DOUBLE)
16418 && (GET_MODE_SIZE (GET_MODE (x)) == 8
16419 || GET_MODE (x) == TFmode
16420 || GET_MODE (x) == TImode))
16421 {
16422 /* Handle [reg]. */
16423 if (GET_CODE (tmp) == REG)
16424 {
16425 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
16426 break;
16427 }
16428 /* Handle [reg+UIMM]. */
16429 else if (GET_CODE (tmp) == PLUS &&
16430 GET_CODE (XEXP (tmp, 1)) == CONST_INT)
16431 {
16432 int x;
16433
16434 gcc_assert (GET_CODE (XEXP (tmp, 0)) == REG);
16435
16436 x = INTVAL (XEXP (tmp, 1));
16437 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
16438 break;
16439 }
16440
16441 /* Fall through. Must be [reg+reg]. */
16442 }
16443 if (VECTOR_MEM_ALTIVEC_P (GET_MODE (x))
16444 && GET_CODE (tmp) == AND
16445 && GET_CODE (XEXP (tmp, 1)) == CONST_INT
16446 && INTVAL (XEXP (tmp, 1)) == -16)
16447 tmp = XEXP (tmp, 0);
16448 else if (VECTOR_MEM_VSX_P (GET_MODE (x))
16449 && GET_CODE (tmp) == PRE_MODIFY)
16450 tmp = XEXP (tmp, 1);
16451 if (GET_CODE (tmp) == REG)
16452 fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
16453 else
16454 {
16455 if (!GET_CODE (tmp) == PLUS
16456 || !REG_P (XEXP (tmp, 0))
16457 || !REG_P (XEXP (tmp, 1)))
16458 {
16459 output_operand_lossage ("invalid %%y value, try using the 'Z' constraint");
16460 break;
16461 }
16462
16463 if (REGNO (XEXP (tmp, 0)) == 0)
16464 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
16465 reg_names[ REGNO (XEXP (tmp, 0)) ]);
16466 else
16467 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
16468 reg_names[ REGNO (XEXP (tmp, 1)) ]);
16469 }
16470 break;
16471 }
16472
16473 case 0:
16474 if (GET_CODE (x) == REG)
16475 fprintf (file, "%s", reg_names[REGNO (x)]);
16476 else if (GET_CODE (x) == MEM)
16477 {
16478 /* We need to handle PRE_INC and PRE_DEC here, since we need to
16479 know the width from the mode. */
16480 if (GET_CODE (XEXP (x, 0)) == PRE_INC)
16481 fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
16482 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
16483 else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
16484 fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
16485 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
16486 else if (GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
16487 output_address (XEXP (XEXP (x, 0), 1));
16488 else
16489 output_address (XEXP (x, 0));
16490 }
16491 else
16492 {
16493 if (toc_relative_expr_p (x))
16494 /* This hack along with a corresponding hack in
16495 rs6000_output_addr_const_extra arranges to output addends
16496 where the assembler expects to find them. eg.
16497 (const (plus (unspec [symbol_ref ("x") tocrel]) 4))
16498 without this hack would be output as "x@toc+4". We
16499 want "x+4@toc". */
16500 output_addr_const (file, tocrel_base);
16501 else
16502 output_addr_const (file, x);
16503 }
16504 return;
16505
16506 case '&':
16507 assemble_name (file, rs6000_get_some_local_dynamic_name ());
16508 return;
16509
16510 default:
16511 output_operand_lossage ("invalid %%xn code");
16512 }
16513 }
16514 \f
16515 /* Print the address of an operand. */
16516
16517 void
16518 print_operand_address (FILE *file, rtx x)
16519 {
16520 if (GET_CODE (x) == REG)
16521 fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
16522 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
16523 || GET_CODE (x) == LABEL_REF)
16524 {
16525 output_addr_const (file, x);
16526 if (small_data_operand (x, GET_MODE (x)))
16527 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
16528 reg_names[SMALL_DATA_REG]);
16529 else
16530 gcc_assert (!TARGET_TOC);
16531 }
16532 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
16533 {
16534 gcc_assert (REG_P (XEXP (x, 0)));
16535 if (REGNO (XEXP (x, 0)) == 0)
16536 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
16537 reg_names[ REGNO (XEXP (x, 0)) ]);
16538 else
16539 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
16540 reg_names[ REGNO (XEXP (x, 1)) ]);
16541 }
16542 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
16543 fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
16544 INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
16545 #if TARGET_MACHO
16546 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
16547 && CONSTANT_P (XEXP (x, 1)))
16548 {
16549 fprintf (file, "lo16(");
16550 output_addr_const (file, XEXP (x, 1));
16551 fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
16552 }
16553 #endif
16554 else if (legitimate_constant_pool_address_p (x, QImode, true))
16555 {
16556 /* This hack along with a corresponding hack in
16557 rs6000_output_addr_const_extra arranges to output addends
16558 where the assembler expects to find them. eg.
16559 (lo_sum (reg 9)
16560 . (const (plus (unspec [symbol_ref ("x") tocrel]) 8)))
16561 without this hack would be output as "x@toc+8@l(9)". We
16562 want "x+8@toc@l(9)". */
16563 output_addr_const (file, tocrel_base);
16564 if (GET_CODE (x) == LO_SUM)
16565 fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
16566 else
16567 fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
16568 }
16569 #if TARGET_ELF
16570 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
16571 && CONSTANT_P (XEXP (x, 1)))
16572 {
16573 output_addr_const (file, XEXP (x, 1));
16574 fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
16575 }
16576 #endif
16577 else
16578 gcc_unreachable ();
16579 }
16580 \f
16581 /* Implement TARGET_OUTPUT_ADDR_CONST_EXTRA. */
16582
16583 static bool
16584 rs6000_output_addr_const_extra (FILE *file, rtx x)
16585 {
16586 if (GET_CODE (x) == UNSPEC)
16587 switch (XINT (x, 1))
16588 {
16589 case UNSPEC_TOCREL:
16590 gcc_assert (GET_CODE (XVECEXP (x, 0, 0)) == SYMBOL_REF);
16591 output_addr_const (file, XVECEXP (x, 0, 0));
16592 if (x == tocrel_base && tocrel_offset != const0_rtx)
16593 {
16594 if (INTVAL (tocrel_offset) >= 0)
16595 fprintf (file, "+");
16596 output_addr_const (file, tocrel_offset);
16597 }
16598 if (!TARGET_AIX || (TARGET_ELF && TARGET_MINIMAL_TOC))
16599 {
16600 putc ('-', file);
16601 assemble_name (file, toc_label_name);
16602 }
16603 else if (TARGET_ELF)
16604 fputs ("@toc", file);
16605 return true;
16606
16607 #if TARGET_MACHO
16608 case UNSPEC_MACHOPIC_OFFSET:
16609 output_addr_const (file, XVECEXP (x, 0, 0));
16610 putc ('-', file);
16611 machopic_output_function_base_name (file);
16612 return true;
16613 #endif
16614 }
16615 return false;
16616 }
16617 \f
16618 /* Target hook for assembling integer objects. The PowerPC version has
16619 to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
16620 is defined. It also needs to handle DI-mode objects on 64-bit
16621 targets. */
16622
16623 static bool
16624 rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
16625 {
16626 #ifdef RELOCATABLE_NEEDS_FIXUP
16627 /* Special handling for SI values. */
16628 if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
16629 {
16630 static int recurse = 0;
16631
16632 /* For -mrelocatable, we mark all addresses that need to be fixed up
16633 in the .fixup section. */
16634 if (TARGET_RELOCATABLE
16635 && in_section != toc_section
16636 && in_section != text_section
16637 && !unlikely_text_section_p (in_section)
16638 && !recurse
16639 && GET_CODE (x) != CONST_INT
16640 && GET_CODE (x) != CONST_DOUBLE
16641 && CONSTANT_P (x))
16642 {
16643 char buf[256];
16644
16645 recurse = 1;
16646 ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
16647 fixuplabelno++;
16648 ASM_OUTPUT_LABEL (asm_out_file, buf);
16649 fprintf (asm_out_file, "\t.long\t(");
16650 output_addr_const (asm_out_file, x);
16651 fprintf (asm_out_file, ")@fixup\n");
16652 fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
16653 ASM_OUTPUT_ALIGN (asm_out_file, 2);
16654 fprintf (asm_out_file, "\t.long\t");
16655 assemble_name (asm_out_file, buf);
16656 fprintf (asm_out_file, "\n\t.previous\n");
16657 recurse = 0;
16658 return true;
16659 }
16660 /* Remove initial .'s to turn a -mcall-aixdesc function
16661 address into the address of the descriptor, not the function
16662 itself. */
16663 else if (GET_CODE (x) == SYMBOL_REF
16664 && XSTR (x, 0)[0] == '.'
16665 && DEFAULT_ABI == ABI_AIX)
16666 {
16667 const char *name = XSTR (x, 0);
16668 while (*name == '.')
16669 name++;
16670
16671 fprintf (asm_out_file, "\t.long\t%s\n", name);
16672 return true;
16673 }
16674 }
16675 #endif /* RELOCATABLE_NEEDS_FIXUP */
16676 return default_assemble_integer (x, size, aligned_p);
16677 }
16678
16679 #ifdef HAVE_GAS_HIDDEN
16680 /* Emit an assembler directive to set symbol visibility for DECL to
16681 VISIBILITY_TYPE. */
16682
16683 static void
16684 rs6000_assemble_visibility (tree decl, int vis)
16685 {
16686 /* Functions need to have their entry point symbol visibility set as
16687 well as their descriptor symbol visibility. */
16688 if (DEFAULT_ABI == ABI_AIX
16689 && DOT_SYMBOLS
16690 && TREE_CODE (decl) == FUNCTION_DECL)
16691 {
16692 static const char * const visibility_types[] = {
16693 NULL, "internal", "hidden", "protected"
16694 };
16695
16696 const char *name, *type;
16697
16698 name = ((* targetm.strip_name_encoding)
16699 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
16700 type = visibility_types[vis];
16701
16702 fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
16703 fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
16704 }
16705 else
16706 default_assemble_visibility (decl, vis);
16707 }
16708 #endif
16709 \f
16710 enum rtx_code
16711 rs6000_reverse_condition (enum machine_mode mode, enum rtx_code code)
16712 {
16713 /* Reversal of FP compares takes care -- an ordered compare
16714 becomes an unordered compare and vice versa. */
16715 if (mode == CCFPmode
16716 && (!flag_finite_math_only
16717 || code == UNLT || code == UNLE || code == UNGT || code == UNGE
16718 || code == UNEQ || code == LTGT))
16719 return reverse_condition_maybe_unordered (code);
16720 else
16721 return reverse_condition (code);
16722 }
16723
16724 /* Generate a compare for CODE. Return a brand-new rtx that
16725 represents the result of the compare. */
16726
16727 static rtx
16728 rs6000_generate_compare (rtx cmp, enum machine_mode mode)
16729 {
16730 enum machine_mode comp_mode;
16731 rtx compare_result;
16732 enum rtx_code code = GET_CODE (cmp);
16733 rtx op0 = XEXP (cmp, 0);
16734 rtx op1 = XEXP (cmp, 1);
16735
16736 if (FLOAT_MODE_P (mode))
16737 comp_mode = CCFPmode;
16738 else if (code == GTU || code == LTU
16739 || code == GEU || code == LEU)
16740 comp_mode = CCUNSmode;
16741 else if ((code == EQ || code == NE)
16742 && GET_CODE (op0) == SUBREG
16743 && GET_CODE (op1) == SUBREG
16744 && SUBREG_PROMOTED_UNSIGNED_P (op0)
16745 && SUBREG_PROMOTED_UNSIGNED_P (op1))
16746 /* These are unsigned values, perhaps there will be a later
16747 ordering compare that can be shared with this one.
16748 Unfortunately we cannot detect the signedness of the operands
16749 for non-subregs. */
16750 comp_mode = CCUNSmode;
16751 else
16752 comp_mode = CCmode;
16753
16754 /* First, the compare. */
16755 compare_result = gen_reg_rtx (comp_mode);
16756
16757 /* E500 FP compare instructions on the GPRs. Yuck! */
16758 if ((!TARGET_FPRS && TARGET_HARD_FLOAT)
16759 && FLOAT_MODE_P (mode))
16760 {
16761 rtx cmp, or_result, compare_result2;
16762 enum machine_mode op_mode = GET_MODE (op0);
16763
16764 if (op_mode == VOIDmode)
16765 op_mode = GET_MODE (op1);
16766
16767 /* The E500 FP compare instructions toggle the GT bit (CR bit 1) only.
16768 This explains the following mess. */
16769
16770 switch (code)
16771 {
16772 case EQ: case UNEQ: case NE: case LTGT:
16773 switch (op_mode)
16774 {
16775 case SFmode:
16776 cmp = (flag_finite_math_only && !flag_trapping_math)
16777 ? gen_tstsfeq_gpr (compare_result, op0, op1)
16778 : gen_cmpsfeq_gpr (compare_result, op0, op1);
16779 break;
16780
16781 case DFmode:
16782 cmp = (flag_finite_math_only && !flag_trapping_math)
16783 ? gen_tstdfeq_gpr (compare_result, op0, op1)
16784 : gen_cmpdfeq_gpr (compare_result, op0, op1);
16785 break;
16786
16787 case TFmode:
16788 cmp = (flag_finite_math_only && !flag_trapping_math)
16789 ? gen_tsttfeq_gpr (compare_result, op0, op1)
16790 : gen_cmptfeq_gpr (compare_result, op0, op1);
16791 break;
16792
16793 default:
16794 gcc_unreachable ();
16795 }
16796 break;
16797
16798 case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
16799 switch (op_mode)
16800 {
16801 case SFmode:
16802 cmp = (flag_finite_math_only && !flag_trapping_math)
16803 ? gen_tstsfgt_gpr (compare_result, op0, op1)
16804 : gen_cmpsfgt_gpr (compare_result, op0, op1);
16805 break;
16806
16807 case DFmode:
16808 cmp = (flag_finite_math_only && !flag_trapping_math)
16809 ? gen_tstdfgt_gpr (compare_result, op0, op1)
16810 : gen_cmpdfgt_gpr (compare_result, op0, op1);
16811 break;
16812
16813 case TFmode:
16814 cmp = (flag_finite_math_only && !flag_trapping_math)
16815 ? gen_tsttfgt_gpr (compare_result, op0, op1)
16816 : gen_cmptfgt_gpr (compare_result, op0, op1);
16817 break;
16818
16819 default:
16820 gcc_unreachable ();
16821 }
16822 break;
16823
16824 case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
16825 switch (op_mode)
16826 {
16827 case SFmode:
16828 cmp = (flag_finite_math_only && !flag_trapping_math)
16829 ? gen_tstsflt_gpr (compare_result, op0, op1)
16830 : gen_cmpsflt_gpr (compare_result, op0, op1);
16831 break;
16832
16833 case DFmode:
16834 cmp = (flag_finite_math_only && !flag_trapping_math)
16835 ? gen_tstdflt_gpr (compare_result, op0, op1)
16836 : gen_cmpdflt_gpr (compare_result, op0, op1);
16837 break;
16838
16839 case TFmode:
16840 cmp = (flag_finite_math_only && !flag_trapping_math)
16841 ? gen_tsttflt_gpr (compare_result, op0, op1)
16842 : gen_cmptflt_gpr (compare_result, op0, op1);
16843 break;
16844
16845 default:
16846 gcc_unreachable ();
16847 }
16848 break;
16849 default:
16850 gcc_unreachable ();
16851 }
16852
16853 /* Synthesize LE and GE from LT/GT || EQ. */
16854 if (code == LE || code == GE || code == LEU || code == GEU)
16855 {
16856 emit_insn (cmp);
16857
16858 switch (code)
16859 {
16860 case LE: code = LT; break;
16861 case GE: code = GT; break;
16862 case LEU: code = LT; break;
16863 case GEU: code = GT; break;
16864 default: gcc_unreachable ();
16865 }
16866
16867 compare_result2 = gen_reg_rtx (CCFPmode);
16868
16869 /* Do the EQ. */
16870 switch (op_mode)
16871 {
16872 case SFmode:
16873 cmp = (flag_finite_math_only && !flag_trapping_math)
16874 ? gen_tstsfeq_gpr (compare_result2, op0, op1)
16875 : gen_cmpsfeq_gpr (compare_result2, op0, op1);
16876 break;
16877
16878 case DFmode:
16879 cmp = (flag_finite_math_only && !flag_trapping_math)
16880 ? gen_tstdfeq_gpr (compare_result2, op0, op1)
16881 : gen_cmpdfeq_gpr (compare_result2, op0, op1);
16882 break;
16883
16884 case TFmode:
16885 cmp = (flag_finite_math_only && !flag_trapping_math)
16886 ? gen_tsttfeq_gpr (compare_result2, op0, op1)
16887 : gen_cmptfeq_gpr (compare_result2, op0, op1);
16888 break;
16889
16890 default:
16891 gcc_unreachable ();
16892 }
16893 emit_insn (cmp);
16894
16895 /* OR them together. */
16896 or_result = gen_reg_rtx (CCFPmode);
16897 cmp = gen_e500_cr_ior_compare (or_result, compare_result,
16898 compare_result2);
16899 compare_result = or_result;
16900 code = EQ;
16901 }
16902 else
16903 {
16904 if (code == NE || code == LTGT)
16905 code = NE;
16906 else
16907 code = EQ;
16908 }
16909
16910 emit_insn (cmp);
16911 }
16912 else
16913 {
16914 /* Generate XLC-compatible TFmode compare as PARALLEL with extra
16915 CLOBBERs to match cmptf_internal2 pattern. */
16916 if (comp_mode == CCFPmode && TARGET_XL_COMPAT
16917 && GET_MODE (op0) == TFmode
16918 && !TARGET_IEEEQUAD
16919 && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128)
16920 emit_insn (gen_rtx_PARALLEL (VOIDmode,
16921 gen_rtvec (10,
16922 gen_rtx_SET (VOIDmode,
16923 compare_result,
16924 gen_rtx_COMPARE (comp_mode, op0, op1)),
16925 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16926 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16927 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16928 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16929 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16930 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16931 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16932 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
16933 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (Pmode)))));
16934 else if (GET_CODE (op1) == UNSPEC
16935 && XINT (op1, 1) == UNSPEC_SP_TEST)
16936 {
16937 rtx op1b = XVECEXP (op1, 0, 0);
16938 comp_mode = CCEQmode;
16939 compare_result = gen_reg_rtx (CCEQmode);
16940 if (TARGET_64BIT)
16941 emit_insn (gen_stack_protect_testdi (compare_result, op0, op1b));
16942 else
16943 emit_insn (gen_stack_protect_testsi (compare_result, op0, op1b));
16944 }
16945 else
16946 emit_insn (gen_rtx_SET (VOIDmode, compare_result,
16947 gen_rtx_COMPARE (comp_mode, op0, op1)));
16948 }
16949
16950 /* Some kinds of FP comparisons need an OR operation;
16951 under flag_finite_math_only we don't bother. */
16952 if (FLOAT_MODE_P (mode)
16953 && !flag_finite_math_only
16954 && !(TARGET_HARD_FLOAT && !TARGET_FPRS)
16955 && (code == LE || code == GE
16956 || code == UNEQ || code == LTGT
16957 || code == UNGT || code == UNLT))
16958 {
16959 enum rtx_code or1, or2;
16960 rtx or1_rtx, or2_rtx, compare2_rtx;
16961 rtx or_result = gen_reg_rtx (CCEQmode);
16962
16963 switch (code)
16964 {
16965 case LE: or1 = LT; or2 = EQ; break;
16966 case GE: or1 = GT; or2 = EQ; break;
16967 case UNEQ: or1 = UNORDERED; or2 = EQ; break;
16968 case LTGT: or1 = LT; or2 = GT; break;
16969 case UNGT: or1 = UNORDERED; or2 = GT; break;
16970 case UNLT: or1 = UNORDERED; or2 = LT; break;
16971 default: gcc_unreachable ();
16972 }
16973 validate_condition_mode (or1, comp_mode);
16974 validate_condition_mode (or2, comp_mode);
16975 or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
16976 or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
16977 compare2_rtx = gen_rtx_COMPARE (CCEQmode,
16978 gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
16979 const_true_rtx);
16980 emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
16981
16982 compare_result = or_result;
16983 code = EQ;
16984 }
16985
16986 validate_condition_mode (code, GET_MODE (compare_result));
16987
16988 return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
16989 }
16990
16991
16992 /* Emit the RTL for an sISEL pattern. */
16993
16994 void
16995 rs6000_emit_sISEL (enum machine_mode mode ATTRIBUTE_UNUSED, rtx operands[])
16996 {
16997 rs6000_emit_int_cmove (operands[0], operands[1], const1_rtx, const0_rtx);
16998 }
16999
17000 void
17001 rs6000_emit_sCOND (enum machine_mode mode, rtx operands[])
17002 {
17003 rtx condition_rtx;
17004 enum machine_mode op_mode;
17005 enum rtx_code cond_code;
17006 rtx result = operands[0];
17007
17008 if (TARGET_ISEL && (mode == SImode || mode == DImode))
17009 {
17010 rs6000_emit_sISEL (mode, operands);
17011 return;
17012 }
17013
17014 condition_rtx = rs6000_generate_compare (operands[1], mode);
17015 cond_code = GET_CODE (condition_rtx);
17016
17017 if (FLOAT_MODE_P (mode)
17018 && !TARGET_FPRS && TARGET_HARD_FLOAT)
17019 {
17020 rtx t;
17021
17022 PUT_MODE (condition_rtx, SImode);
17023 t = XEXP (condition_rtx, 0);
17024
17025 gcc_assert (cond_code == NE || cond_code == EQ);
17026
17027 if (cond_code == NE)
17028 emit_insn (gen_e500_flip_gt_bit (t, t));
17029
17030 emit_insn (gen_move_from_CR_gt_bit (result, t));
17031 return;
17032 }
17033
17034 if (cond_code == NE
17035 || cond_code == GE || cond_code == LE
17036 || cond_code == GEU || cond_code == LEU
17037 || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
17038 {
17039 rtx not_result = gen_reg_rtx (CCEQmode);
17040 rtx not_op, rev_cond_rtx;
17041 enum machine_mode cc_mode;
17042
17043 cc_mode = GET_MODE (XEXP (condition_rtx, 0));
17044
17045 rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
17046 SImode, XEXP (condition_rtx, 0), const0_rtx);
17047 not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
17048 emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
17049 condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
17050 }
17051
17052 op_mode = GET_MODE (XEXP (operands[1], 0));
17053 if (op_mode == VOIDmode)
17054 op_mode = GET_MODE (XEXP (operands[1], 1));
17055
17056 if (TARGET_POWERPC64 && (op_mode == DImode || FLOAT_MODE_P (mode)))
17057 {
17058 PUT_MODE (condition_rtx, DImode);
17059 convert_move (result, condition_rtx, 0);
17060 }
17061 else
17062 {
17063 PUT_MODE (condition_rtx, SImode);
17064 emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
17065 }
17066 }
17067
17068 /* Emit a branch of kind CODE to location LOC. */
17069
17070 void
17071 rs6000_emit_cbranch (enum machine_mode mode, rtx operands[])
17072 {
17073 rtx condition_rtx, loc_ref;
17074
17075 condition_rtx = rs6000_generate_compare (operands[0], mode);
17076 loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
17077 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
17078 gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
17079 loc_ref, pc_rtx)));
17080 }
17081
17082 /* Return the string to output a conditional branch to LABEL, which is
17083 the operand number of the label, or -1 if the branch is really a
17084 conditional return.
17085
17086 OP is the conditional expression. XEXP (OP, 0) is assumed to be a
17087 condition code register and its mode specifies what kind of
17088 comparison we made.
17089
17090 REVERSED is nonzero if we should reverse the sense of the comparison.
17091
17092 INSN is the insn. */
17093
17094 char *
17095 output_cbranch (rtx op, const char *label, int reversed, rtx insn)
17096 {
17097 static char string[64];
17098 enum rtx_code code = GET_CODE (op);
17099 rtx cc_reg = XEXP (op, 0);
17100 enum machine_mode mode = GET_MODE (cc_reg);
17101 int cc_regno = REGNO (cc_reg) - CR0_REGNO;
17102 int need_longbranch = label != NULL && get_attr_length (insn) == 8;
17103 int really_reversed = reversed ^ need_longbranch;
17104 char *s = string;
17105 const char *ccode;
17106 const char *pred;
17107 rtx note;
17108
17109 validate_condition_mode (code, mode);
17110
17111 /* Work out which way this really branches. We could use
17112 reverse_condition_maybe_unordered here always but this
17113 makes the resulting assembler clearer. */
17114 if (really_reversed)
17115 {
17116 /* Reversal of FP compares takes care -- an ordered compare
17117 becomes an unordered compare and vice versa. */
17118 if (mode == CCFPmode)
17119 code = reverse_condition_maybe_unordered (code);
17120 else
17121 code = reverse_condition (code);
17122 }
17123
17124 if ((!TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
17125 {
17126 /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
17127 to the GT bit. */
17128 switch (code)
17129 {
17130 case EQ:
17131 /* Opposite of GT. */
17132 code = GT;
17133 break;
17134
17135 case NE:
17136 code = UNLE;
17137 break;
17138
17139 default:
17140 gcc_unreachable ();
17141 }
17142 }
17143
17144 switch (code)
17145 {
17146 /* Not all of these are actually distinct opcodes, but
17147 we distinguish them for clarity of the resulting assembler. */
17148 case NE: case LTGT:
17149 ccode = "ne"; break;
17150 case EQ: case UNEQ:
17151 ccode = "eq"; break;
17152 case GE: case GEU:
17153 ccode = "ge"; break;
17154 case GT: case GTU: case UNGT:
17155 ccode = "gt"; break;
17156 case LE: case LEU:
17157 ccode = "le"; break;
17158 case LT: case LTU: case UNLT:
17159 ccode = "lt"; break;
17160 case UNORDERED: ccode = "un"; break;
17161 case ORDERED: ccode = "nu"; break;
17162 case UNGE: ccode = "nl"; break;
17163 case UNLE: ccode = "ng"; break;
17164 default:
17165 gcc_unreachable ();
17166 }
17167
17168 /* Maybe we have a guess as to how likely the branch is.
17169 The old mnemonics don't have a way to specify this information. */
17170 pred = "";
17171 note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
17172 if (note != NULL_RTX)
17173 {
17174 /* PROB is the difference from 50%. */
17175 int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
17176
17177 /* Only hint for highly probable/improbable branches on newer
17178 cpus as static prediction overrides processor dynamic
17179 prediction. For older cpus we may as well always hint, but
17180 assume not taken for branches that are very close to 50% as a
17181 mispredicted taken branch is more expensive than a
17182 mispredicted not-taken branch. */
17183 if (rs6000_always_hint
17184 || (abs (prob) > REG_BR_PROB_BASE / 100 * 48
17185 && br_prob_note_reliable_p (note)))
17186 {
17187 if (abs (prob) > REG_BR_PROB_BASE / 20
17188 && ((prob > 0) ^ need_longbranch))
17189 pred = "+";
17190 else
17191 pred = "-";
17192 }
17193 }
17194
17195 if (label == NULL)
17196 s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
17197 else
17198 s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
17199
17200 /* We need to escape any '%' characters in the reg_names string.
17201 Assume they'd only be the first character.... */
17202 if (reg_names[cc_regno + CR0_REGNO][0] == '%')
17203 *s++ = '%';
17204 s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
17205
17206 if (label != NULL)
17207 {
17208 /* If the branch distance was too far, we may have to use an
17209 unconditional branch to go the distance. */
17210 if (need_longbranch)
17211 s += sprintf (s, ",$+8\n\tb %s", label);
17212 else
17213 s += sprintf (s, ",%s", label);
17214 }
17215
17216 return string;
17217 }
17218
17219 /* Return the string to flip the GT bit on a CR. */
17220 char *
17221 output_e500_flip_gt_bit (rtx dst, rtx src)
17222 {
17223 static char string[64];
17224 int a, b;
17225
17226 gcc_assert (GET_CODE (dst) == REG && CR_REGNO_P (REGNO (dst))
17227 && GET_CODE (src) == REG && CR_REGNO_P (REGNO (src)));
17228
17229 /* GT bit. */
17230 a = 4 * (REGNO (dst) - CR0_REGNO) + 1;
17231 b = 4 * (REGNO (src) - CR0_REGNO) + 1;
17232
17233 sprintf (string, "crnot %d,%d", a, b);
17234 return string;
17235 }
17236
17237 /* Return insn for VSX or Altivec comparisons. */
17238
17239 static rtx
17240 rs6000_emit_vector_compare_inner (enum rtx_code code, rtx op0, rtx op1)
17241 {
17242 rtx mask;
17243 enum machine_mode mode = GET_MODE (op0);
17244
17245 switch (code)
17246 {
17247 default:
17248 break;
17249
17250 case GE:
17251 if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
17252 return NULL_RTX;
17253
17254 case EQ:
17255 case GT:
17256 case GTU:
17257 mask = gen_reg_rtx (mode);
17258 emit_insn (gen_rtx_SET (VOIDmode,
17259 mask,
17260 gen_rtx_fmt_ee (code, mode, op0, op1)));
17261 return mask;
17262 }
17263
17264 return NULL_RTX;
17265 }
17266
17267 /* Emit vector compare for operands OP0 and OP1 using code RCODE.
17268 DMODE is expected destination mode. This is a recursive function. */
17269
17270 static rtx
17271 rs6000_emit_vector_compare (enum rtx_code rcode,
17272 rtx op0, rtx op1,
17273 enum machine_mode dmode)
17274 {
17275 rtx mask;
17276 bool swap_operands = false;
17277 bool try_again = false;
17278
17279 gcc_assert (VECTOR_UNIT_ALTIVEC_OR_VSX_P (dmode));
17280 gcc_assert (GET_MODE (op0) == GET_MODE (op1));
17281
17282 /* See if the comparison works as is. */
17283 mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
17284 if (mask)
17285 return mask;
17286
17287 switch (rcode)
17288 {
17289 case LT:
17290 rcode = GT;
17291 swap_operands = true;
17292 try_again = true;
17293 break;
17294 case LTU:
17295 rcode = GTU;
17296 swap_operands = true;
17297 try_again = true;
17298 break;
17299 case NE:
17300 case UNLE:
17301 case UNLT:
17302 case UNGE:
17303 case UNGT:
17304 /* Invert condition and try again.
17305 e.g., A != B becomes ~(A==B). */
17306 {
17307 enum rtx_code rev_code;
17308 enum insn_code nor_code;
17309 rtx mask2;
17310
17311 rev_code = reverse_condition_maybe_unordered (rcode);
17312 if (rev_code == UNKNOWN)
17313 return NULL_RTX;
17314
17315 nor_code = optab_handler (one_cmpl_optab, dmode);
17316 if (nor_code == CODE_FOR_nothing)
17317 return NULL_RTX;
17318
17319 mask2 = rs6000_emit_vector_compare (rev_code, op0, op1, dmode);
17320 if (!mask2)
17321 return NULL_RTX;
17322
17323 mask = gen_reg_rtx (dmode);
17324 emit_insn (GEN_FCN (nor_code) (mask, mask2));
17325 return mask;
17326 }
17327 break;
17328 case GE:
17329 case GEU:
17330 case LE:
17331 case LEU:
17332 /* Try GT/GTU/LT/LTU OR EQ */
17333 {
17334 rtx c_rtx, eq_rtx;
17335 enum insn_code ior_code;
17336 enum rtx_code new_code;
17337
17338 switch (rcode)
17339 {
17340 case GE:
17341 new_code = GT;
17342 break;
17343
17344 case GEU:
17345 new_code = GTU;
17346 break;
17347
17348 case LE:
17349 new_code = LT;
17350 break;
17351
17352 case LEU:
17353 new_code = LTU;
17354 break;
17355
17356 default:
17357 gcc_unreachable ();
17358 }
17359
17360 ior_code = optab_handler (ior_optab, dmode);
17361 if (ior_code == CODE_FOR_nothing)
17362 return NULL_RTX;
17363
17364 c_rtx = rs6000_emit_vector_compare (new_code, op0, op1, dmode);
17365 if (!c_rtx)
17366 return NULL_RTX;
17367
17368 eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1, dmode);
17369 if (!eq_rtx)
17370 return NULL_RTX;
17371
17372 mask = gen_reg_rtx (dmode);
17373 emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
17374 return mask;
17375 }
17376 break;
17377 default:
17378 return NULL_RTX;
17379 }
17380
17381 if (try_again)
17382 {
17383 if (swap_operands)
17384 {
17385 rtx tmp;
17386 tmp = op0;
17387 op0 = op1;
17388 op1 = tmp;
17389 }
17390
17391 mask = rs6000_emit_vector_compare_inner (rcode, op0, op1);
17392 if (mask)
17393 return mask;
17394 }
17395
17396 /* You only get two chances. */
17397 return NULL_RTX;
17398 }
17399
17400 /* Emit vector conditional expression. DEST is destination. OP_TRUE and
17401 OP_FALSE are two VEC_COND_EXPR operands. CC_OP0 and CC_OP1 are the two
17402 operands for the relation operation COND. */
17403
17404 int
17405 rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, rtx op_false,
17406 rtx cond, rtx cc_op0, rtx cc_op1)
17407 {
17408 enum machine_mode dest_mode = GET_MODE (dest);
17409 enum rtx_code rcode = GET_CODE (cond);
17410 enum machine_mode cc_mode = CCmode;
17411 rtx mask;
17412 rtx cond2;
17413 rtx tmp;
17414 bool invert_move = false;
17415
17416 if (VECTOR_UNIT_NONE_P (dest_mode))
17417 return 0;
17418
17419 switch (rcode)
17420 {
17421 /* Swap operands if we can, and fall back to doing the operation as
17422 specified, and doing a NOR to invert the test. */
17423 case NE:
17424 case UNLE:
17425 case UNLT:
17426 case UNGE:
17427 case UNGT:
17428 /* Invert condition and try again.
17429 e.g., A = (B != C) ? D : E becomes A = (B == C) ? E : D. */
17430 invert_move = true;
17431 rcode = reverse_condition_maybe_unordered (rcode);
17432 if (rcode == UNKNOWN)
17433 return 0;
17434 break;
17435
17436 /* Mark unsigned tests with CCUNSmode. */
17437 case GTU:
17438 case GEU:
17439 case LTU:
17440 case LEU:
17441 cc_mode = CCUNSmode;
17442 break;
17443
17444 default:
17445 break;
17446 }
17447
17448 /* Get the vector mask for the given relational operations. */
17449 mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode);
17450
17451 if (!mask)
17452 return 0;
17453
17454 if (invert_move)
17455 {
17456 tmp = op_true;
17457 op_true = op_false;
17458 op_false = tmp;
17459 }
17460
17461 cond2 = gen_rtx_fmt_ee (NE, cc_mode, mask, const0_rtx);
17462 emit_insn (gen_rtx_SET (VOIDmode,
17463 dest,
17464 gen_rtx_IF_THEN_ELSE (dest_mode,
17465 cond2,
17466 op_true,
17467 op_false)));
17468 return 1;
17469 }
17470
17471 /* Emit a conditional move: move TRUE_COND to DEST if OP of the
17472 operands of the last comparison is nonzero/true, FALSE_COND if it
17473 is zero/false. Return 0 if the hardware has no such operation. */
17474
17475 int
17476 rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
17477 {
17478 enum rtx_code code = GET_CODE (op);
17479 rtx op0 = XEXP (op, 0);
17480 rtx op1 = XEXP (op, 1);
17481 REAL_VALUE_TYPE c1;
17482 enum machine_mode compare_mode = GET_MODE (op0);
17483 enum machine_mode result_mode = GET_MODE (dest);
17484 rtx temp;
17485 bool is_against_zero;
17486
17487 /* These modes should always match. */
17488 if (GET_MODE (op1) != compare_mode
17489 /* In the isel case however, we can use a compare immediate, so
17490 op1 may be a small constant. */
17491 && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
17492 return 0;
17493 if (GET_MODE (true_cond) != result_mode)
17494 return 0;
17495 if (GET_MODE (false_cond) != result_mode)
17496 return 0;
17497
17498 /* First, work out if the hardware can do this at all, or
17499 if it's too slow.... */
17500 if (!FLOAT_MODE_P (compare_mode))
17501 {
17502 if (TARGET_ISEL)
17503 return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
17504 return 0;
17505 }
17506 else if (TARGET_HARD_FLOAT && !TARGET_FPRS
17507 && SCALAR_FLOAT_MODE_P (compare_mode))
17508 return 0;
17509
17510 is_against_zero = op1 == CONST0_RTX (compare_mode);
17511
17512 /* A floating-point subtract might overflow, underflow, or produce
17513 an inexact result, thus changing the floating-point flags, so it
17514 can't be generated if we care about that. It's safe if one side
17515 of the construct is zero, since then no subtract will be
17516 generated. */
17517 if (SCALAR_FLOAT_MODE_P (compare_mode)
17518 && flag_trapping_math && ! is_against_zero)
17519 return 0;
17520
17521 /* Eliminate half of the comparisons by switching operands, this
17522 makes the remaining code simpler. */
17523 if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
17524 || code == LTGT || code == LT || code == UNLE)
17525 {
17526 code = reverse_condition_maybe_unordered (code);
17527 temp = true_cond;
17528 true_cond = false_cond;
17529 false_cond = temp;
17530 }
17531
17532 /* UNEQ and LTGT take four instructions for a comparison with zero,
17533 it'll probably be faster to use a branch here too. */
17534 if (code == UNEQ && HONOR_NANS (compare_mode))
17535 return 0;
17536
17537 if (GET_CODE (op1) == CONST_DOUBLE)
17538 REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
17539
17540 /* We're going to try to implement comparisons by performing
17541 a subtract, then comparing against zero. Unfortunately,
17542 Inf - Inf is NaN which is not zero, and so if we don't
17543 know that the operand is finite and the comparison
17544 would treat EQ different to UNORDERED, we can't do it. */
17545 if (HONOR_INFINITIES (compare_mode)
17546 && code != GT && code != UNGE
17547 && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
17548 /* Constructs of the form (a OP b ? a : b) are safe. */
17549 && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
17550 || (! rtx_equal_p (op0, true_cond)
17551 && ! rtx_equal_p (op1, true_cond))))
17552 return 0;
17553
17554 /* At this point we know we can use fsel. */
17555
17556 /* Reduce the comparison to a comparison against zero. */
17557 if (! is_against_zero)
17558 {
17559 temp = gen_reg_rtx (compare_mode);
17560 emit_insn (gen_rtx_SET (VOIDmode, temp,
17561 gen_rtx_MINUS (compare_mode, op0, op1)));
17562 op0 = temp;
17563 op1 = CONST0_RTX (compare_mode);
17564 }
17565
17566 /* If we don't care about NaNs we can reduce some of the comparisons
17567 down to faster ones. */
17568 if (! HONOR_NANS (compare_mode))
17569 switch (code)
17570 {
17571 case GT:
17572 code = LE;
17573 temp = true_cond;
17574 true_cond = false_cond;
17575 false_cond = temp;
17576 break;
17577 case UNGE:
17578 code = GE;
17579 break;
17580 case UNEQ:
17581 code = EQ;
17582 break;
17583 default:
17584 break;
17585 }
17586
17587 /* Now, reduce everything down to a GE. */
17588 switch (code)
17589 {
17590 case GE:
17591 break;
17592
17593 case LE:
17594 temp = gen_reg_rtx (compare_mode);
17595 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17596 op0 = temp;
17597 break;
17598
17599 case ORDERED:
17600 temp = gen_reg_rtx (compare_mode);
17601 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
17602 op0 = temp;
17603 break;
17604
17605 case EQ:
17606 temp = gen_reg_rtx (compare_mode);
17607 emit_insn (gen_rtx_SET (VOIDmode, temp,
17608 gen_rtx_NEG (compare_mode,
17609 gen_rtx_ABS (compare_mode, op0))));
17610 op0 = temp;
17611 break;
17612
17613 case UNGE:
17614 /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
17615 temp = gen_reg_rtx (result_mode);
17616 emit_insn (gen_rtx_SET (VOIDmode, temp,
17617 gen_rtx_IF_THEN_ELSE (result_mode,
17618 gen_rtx_GE (VOIDmode,
17619 op0, op1),
17620 true_cond, false_cond)));
17621 false_cond = true_cond;
17622 true_cond = temp;
17623
17624 temp = gen_reg_rtx (compare_mode);
17625 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17626 op0 = temp;
17627 break;
17628
17629 case GT:
17630 /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
17631 temp = gen_reg_rtx (result_mode);
17632 emit_insn (gen_rtx_SET (VOIDmode, temp,
17633 gen_rtx_IF_THEN_ELSE (result_mode,
17634 gen_rtx_GE (VOIDmode,
17635 op0, op1),
17636 true_cond, false_cond)));
17637 true_cond = false_cond;
17638 false_cond = temp;
17639
17640 temp = gen_reg_rtx (compare_mode);
17641 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
17642 op0 = temp;
17643 break;
17644
17645 default:
17646 gcc_unreachable ();
17647 }
17648
17649 emit_insn (gen_rtx_SET (VOIDmode, dest,
17650 gen_rtx_IF_THEN_ELSE (result_mode,
17651 gen_rtx_GE (VOIDmode,
17652 op0, op1),
17653 true_cond, false_cond)));
17654 return 1;
17655 }
17656
17657 /* Same as above, but for ints (isel). */
17658
17659 static int
17660 rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
17661 {
17662 rtx condition_rtx, cr;
17663 enum machine_mode mode = GET_MODE (dest);
17664 enum rtx_code cond_code;
17665 rtx (*isel_func) (rtx, rtx, rtx, rtx, rtx);
17666 bool signedp;
17667
17668 if (mode != SImode && (!TARGET_POWERPC64 || mode != DImode))
17669 return 0;
17670
17671 /* We still have to do the compare, because isel doesn't do a
17672 compare, it just looks at the CRx bits set by a previous compare
17673 instruction. */
17674 condition_rtx = rs6000_generate_compare (op, mode);
17675 cond_code = GET_CODE (condition_rtx);
17676 cr = XEXP (condition_rtx, 0);
17677 signedp = GET_MODE (cr) == CCmode;
17678
17679 isel_func = (mode == SImode
17680 ? (signedp ? gen_isel_signed_si : gen_isel_unsigned_si)
17681 : (signedp ? gen_isel_signed_di : gen_isel_unsigned_di));
17682
17683 switch (cond_code)
17684 {
17685 case LT: case GT: case LTU: case GTU: case EQ:
17686 /* isel handles these directly. */
17687 break;
17688
17689 default:
17690 /* We need to swap the sense of the comparison. */
17691 {
17692 rtx t = true_cond;
17693 true_cond = false_cond;
17694 false_cond = t;
17695 PUT_CODE (condition_rtx, reverse_condition (cond_code));
17696 }
17697 break;
17698 }
17699
17700 false_cond = force_reg (mode, false_cond);
17701 if (true_cond != const0_rtx)
17702 true_cond = force_reg (mode, true_cond);
17703
17704 emit_insn (isel_func (dest, condition_rtx, true_cond, false_cond, cr));
17705
17706 return 1;
17707 }
17708
17709 const char *
17710 output_isel (rtx *operands)
17711 {
17712 enum rtx_code code;
17713
17714 code = GET_CODE (operands[1]);
17715
17716 if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
17717 {
17718 gcc_assert (GET_CODE (operands[2]) == REG
17719 && GET_CODE (operands[3]) == REG);
17720 PUT_CODE (operands[1], reverse_condition (code));
17721 return "isel %0,%3,%2,%j1";
17722 }
17723
17724 return "isel %0,%2,%3,%j1";
17725 }
17726
17727 void
17728 rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
17729 {
17730 enum machine_mode mode = GET_MODE (op0);
17731 enum rtx_code c;
17732 rtx target;
17733
17734 /* VSX/altivec have direct min/max insns. */
17735 if ((code == SMAX || code == SMIN)
17736 && (VECTOR_UNIT_ALTIVEC_OR_VSX_P (mode)
17737 || (mode == SFmode && VECTOR_UNIT_VSX_P (DFmode))))
17738 {
17739 emit_insn (gen_rtx_SET (VOIDmode,
17740 dest,
17741 gen_rtx_fmt_ee (code, mode, op0, op1)));
17742 return;
17743 }
17744
17745 if (code == SMAX || code == SMIN)
17746 c = GE;
17747 else
17748 c = GEU;
17749
17750 if (code == SMAX || code == UMAX)
17751 target = emit_conditional_move (dest, c, op0, op1, mode,
17752 op0, op1, mode, 0);
17753 else
17754 target = emit_conditional_move (dest, c, op0, op1, mode,
17755 op1, op0, mode, 0);
17756 gcc_assert (target);
17757 if (target != dest)
17758 emit_move_insn (dest, target);
17759 }
17760
17761 /* Emit instructions to perform a load-reserved/store-conditional operation.
17762 The operation performed is an atomic
17763 (set M (CODE:MODE M OP))
17764 If not NULL, BEFORE is atomically set to M before the operation, and
17765 AFTER is set to M after the operation (that is, (CODE:MODE M OP)).
17766 If SYNC_P then a memory barrier is emitted before the operation.
17767 Either OP or M may be wrapped in a NOT operation. */
17768
17769 void
17770 rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
17771 rtx m, rtx op, rtx before_param, rtx after_param,
17772 bool sync_p)
17773 {
17774 enum machine_mode used_mode;
17775 rtx the_op, set_before, set_after, set_atomic, cc_scratch, before, after;
17776 rtx used_m;
17777 rtvec vec;
17778 HOST_WIDE_INT imask = GET_MODE_MASK (mode);
17779 rtx shift = NULL_RTX;
17780
17781 if (sync_p)
17782 emit_insn (gen_lwsync ());
17783
17784 used_m = m;
17785
17786 /* If this is smaller than SImode, we'll have to use SImode with
17787 adjustments. */
17788 if (mode == QImode || mode == HImode)
17789 {
17790 rtx newop, oldop;
17791
17792 if (MEM_ALIGN (used_m) >= 32)
17793 {
17794 int ishift = 0;
17795 if (BYTES_BIG_ENDIAN)
17796 ishift = GET_MODE_BITSIZE (SImode) - GET_MODE_BITSIZE (mode);
17797
17798 shift = GEN_INT (ishift);
17799 used_m = change_address (used_m, SImode, 0);
17800 }
17801 else
17802 {
17803 rtx addrSI, aligned_addr;
17804 int shift_mask = mode == QImode ? 0x18 : 0x10;
17805
17806 addrSI = gen_lowpart_common (SImode,
17807 force_reg (Pmode, XEXP (used_m, 0)));
17808 addrSI = force_reg (SImode, addrSI);
17809 shift = gen_reg_rtx (SImode);
17810
17811 emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
17812 GEN_INT (shift_mask)));
17813 emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
17814
17815 aligned_addr = expand_binop (Pmode, and_optab,
17816 XEXP (used_m, 0),
17817 GEN_INT (-4), NULL_RTX,
17818 1, OPTAB_LIB_WIDEN);
17819 used_m = change_address (used_m, SImode, aligned_addr);
17820 set_mem_align (used_m, 32);
17821 }
17822 /* It's safe to keep the old alias set of USED_M, because
17823 the operation is atomic and only affects the original
17824 USED_M. */
17825 m = used_m;
17826
17827 if (GET_CODE (op) == NOT)
17828 {
17829 oldop = lowpart_subreg (SImode, XEXP (op, 0), mode);
17830 oldop = gen_rtx_NOT (SImode, oldop);
17831 }
17832 else
17833 oldop = lowpart_subreg (SImode, op, mode);
17834
17835 switch (code)
17836 {
17837 case IOR:
17838 case XOR:
17839 newop = expand_binop (SImode, and_optab,
17840 oldop, GEN_INT (imask), NULL_RTX,
17841 1, OPTAB_LIB_WIDEN);
17842 emit_insn (gen_ashlsi3 (newop, newop, shift));
17843 break;
17844
17845 case NOT: /* NAND */
17846 newop = expand_binop (SImode, ior_optab,
17847 oldop, GEN_INT (~imask), NULL_RTX,
17848 1, OPTAB_LIB_WIDEN);
17849 emit_insn (gen_rotlsi3 (newop, newop, shift));
17850 break;
17851
17852 case AND:
17853 newop = expand_binop (SImode, ior_optab,
17854 oldop, GEN_INT (~imask), NULL_RTX,
17855 1, OPTAB_LIB_WIDEN);
17856 emit_insn (gen_rotlsi3 (newop, newop, shift));
17857 break;
17858
17859 case PLUS:
17860 case MINUS:
17861 {
17862 rtx mask;
17863
17864 newop = expand_binop (SImode, and_optab,
17865 oldop, GEN_INT (imask), NULL_RTX,
17866 1, OPTAB_LIB_WIDEN);
17867 emit_insn (gen_ashlsi3 (newop, newop, shift));
17868
17869 mask = gen_reg_rtx (SImode);
17870 emit_move_insn (mask, GEN_INT (imask));
17871 emit_insn (gen_ashlsi3 (mask, mask, shift));
17872
17873 if (code == PLUS)
17874 newop = gen_rtx_PLUS (SImode, m, newop);
17875 else
17876 newop = gen_rtx_MINUS (SImode, m, newop);
17877 newop = gen_rtx_AND (SImode, newop, mask);
17878 newop = gen_rtx_IOR (SImode, newop,
17879 gen_rtx_AND (SImode,
17880 gen_rtx_NOT (SImode, mask),
17881 m));
17882 break;
17883 }
17884
17885 default:
17886 gcc_unreachable ();
17887 }
17888
17889 op = newop;
17890 used_mode = SImode;
17891 before = gen_reg_rtx (used_mode);
17892 after = gen_reg_rtx (used_mode);
17893 }
17894 else
17895 {
17896 used_mode = mode;
17897 before = before_param;
17898 after = after_param;
17899
17900 if (before == NULL_RTX)
17901 before = gen_reg_rtx (used_mode);
17902 if (after == NULL_RTX)
17903 after = gen_reg_rtx (used_mode);
17904 }
17905
17906 if ((code == PLUS || code == MINUS)
17907 && used_mode != mode)
17908 the_op = op; /* Computed above. */
17909 else if (GET_CODE (op) == NOT && GET_CODE (m) != NOT)
17910 the_op = gen_rtx_fmt_ee (code, used_mode, op, m);
17911 else if (code == NOT)
17912 the_op = gen_rtx_fmt_ee (IOR, used_mode,
17913 gen_rtx_NOT (used_mode, m),
17914 gen_rtx_NOT (used_mode, op));
17915 else
17916 the_op = gen_rtx_fmt_ee (code, used_mode, m, op);
17917
17918 set_after = gen_rtx_SET (VOIDmode, after, the_op);
17919 set_before = gen_rtx_SET (VOIDmode, before, used_m);
17920 set_atomic = gen_rtx_SET (VOIDmode, used_m,
17921 gen_rtx_UNSPEC (used_mode,
17922 gen_rtvec (1, the_op),
17923 UNSPEC_SYNC_OP));
17924 cc_scratch = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
17925
17926 if ((code == PLUS || code == MINUS) && used_mode != mode)
17927 vec = gen_rtvec (5, set_after, set_before, set_atomic, cc_scratch,
17928 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
17929 else
17930 vec = gen_rtvec (4, set_after, set_before, set_atomic, cc_scratch);
17931 emit_insn (gen_rtx_PARALLEL (VOIDmode, vec));
17932
17933 /* Shift and mask the return values properly. */
17934 if (used_mode != mode && before_param)
17935 {
17936 emit_insn (gen_lshrsi3 (before, before, shift));
17937 convert_move (before_param, before, 1);
17938 }
17939
17940 if (used_mode != mode && after_param)
17941 {
17942 emit_insn (gen_lshrsi3 (after, after, shift));
17943 convert_move (after_param, after, 1);
17944 }
17945
17946 /* The previous sequence will end with a branch that's dependent on
17947 the conditional store, so placing an isync will ensure that no
17948 other instructions (especially, no load or store instructions)
17949 can start before the atomic operation completes. */
17950 if (sync_p)
17951 emit_insn (gen_isync ());
17952 }
17953
17954 /* A subroutine of the atomic operation splitters. Jump to LABEL if
17955 COND is true. Mark the jump as unlikely to be taken. */
17956
17957 static void
17958 emit_unlikely_jump (rtx cond, rtx label)
17959 {
17960 rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
17961 rtx x;
17962
17963 x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
17964 x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
17965 add_reg_note (x, REG_BR_PROB, very_unlikely);
17966 }
17967
17968 /* A subroutine of the atomic operation splitters. Emit a load-locked
17969 instruction in MODE. */
17970
17971 static void
17972 emit_load_locked (enum machine_mode mode, rtx reg, rtx mem)
17973 {
17974 rtx (*fn) (rtx, rtx) = NULL;
17975 if (mode == SImode)
17976 fn = gen_load_locked_si;
17977 else if (mode == DImode)
17978 fn = gen_load_locked_di;
17979 emit_insn (fn (reg, mem));
17980 }
17981
17982 /* A subroutine of the atomic operation splitters. Emit a store-conditional
17983 instruction in MODE. */
17984
17985 static void
17986 emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
17987 {
17988 rtx (*fn) (rtx, rtx, rtx) = NULL;
17989 if (mode == SImode)
17990 fn = gen_store_conditional_si;
17991 else if (mode == DImode)
17992 fn = gen_store_conditional_di;
17993
17994 /* Emit sync before stwcx. to address PPC405 Erratum. */
17995 if (PPC405_ERRATUM77)
17996 emit_insn (gen_memory_barrier ());
17997
17998 emit_insn (fn (res, mem, val));
17999 }
18000
18001 /* Expand an atomic fetch-and-operate pattern. CODE is the binary operation
18002 to perform. MEM is the memory on which to operate. VAL is the second
18003 operand of the binary operator. BEFORE and AFTER are optional locations to
18004 return the value of MEM either before of after the operation. SCRATCH is
18005 a scratch register. */
18006
18007 void
18008 rs6000_split_atomic_op (enum rtx_code code, rtx mem, rtx val,
18009 rtx before, rtx after, rtx scratch)
18010 {
18011 enum machine_mode mode = GET_MODE (mem);
18012 rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
18013
18014 emit_insn (gen_lwsync ());
18015
18016 label = gen_label_rtx ();
18017 emit_label (label);
18018 label = gen_rtx_LABEL_REF (VOIDmode, label);
18019
18020 if (before == NULL_RTX)
18021 before = scratch;
18022 emit_load_locked (mode, before, mem);
18023
18024 if (code == NOT)
18025 x = gen_rtx_IOR (mode,
18026 gen_rtx_NOT (mode, before),
18027 gen_rtx_NOT (mode, val));
18028 else if (code == AND)
18029 x = gen_rtx_UNSPEC (mode, gen_rtvec (2, before, val), UNSPEC_AND);
18030 else
18031 x = gen_rtx_fmt_ee (code, mode, before, val);
18032
18033 if (after != NULL_RTX)
18034 emit_insn (gen_rtx_SET (VOIDmode, after, copy_rtx (x)));
18035 emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
18036
18037 emit_store_conditional (mode, cond, mem, scratch);
18038
18039 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
18040 emit_unlikely_jump (x, label);
18041
18042 emit_insn (gen_isync ());
18043 }
18044
18045 /* Expand an atomic compare and swap operation. MEM is the memory on which
18046 to operate. OLDVAL is the old value to be compared. NEWVAL is the new
18047 value to be stored. SCRATCH is a scratch GPR. */
18048
18049 void
18050 rs6000_split_compare_and_swap (rtx retval, rtx mem, rtx oldval, rtx newval,
18051 rtx scratch)
18052 {
18053 enum machine_mode mode = GET_MODE (mem);
18054 rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
18055
18056 emit_insn (gen_lwsync ());
18057
18058 label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
18059 label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
18060 emit_label (XEXP (label1, 0));
18061
18062 emit_load_locked (mode, retval, mem);
18063
18064 x = gen_rtx_COMPARE (CCmode, retval, oldval);
18065 emit_insn (gen_rtx_SET (VOIDmode, cond, x));
18066
18067 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
18068 emit_unlikely_jump (x, label2);
18069
18070 emit_move_insn (scratch, newval);
18071 emit_store_conditional (mode, cond, mem, scratch);
18072
18073 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
18074 emit_unlikely_jump (x, label1);
18075
18076 emit_insn (gen_isync ());
18077 emit_label (XEXP (label2, 0));
18078 }
18079
18080 /* Expand an atomic test and set operation. MEM is the memory on which
18081 to operate. VAL is the value set. SCRATCH is a scratch GPR. */
18082
18083 void
18084 rs6000_split_lock_test_and_set (rtx retval, rtx mem, rtx val, rtx scratch)
18085 {
18086 enum machine_mode mode = GET_MODE (mem);
18087 rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
18088
18089 label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
18090 emit_label (XEXP (label, 0));
18091
18092 emit_load_locked (mode, retval, mem);
18093 emit_move_insn (scratch, val);
18094 emit_store_conditional (mode, cond, mem, scratch);
18095
18096 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
18097 emit_unlikely_jump (x, label);
18098
18099 emit_insn (gen_isync ());
18100 }
18101
18102 void
18103 rs6000_expand_compare_and_swapqhi (rtx dst, rtx mem, rtx oldval, rtx newval)
18104 {
18105 enum machine_mode mode = GET_MODE (mem);
18106 rtx addrSI, align, wdst, shift, mask;
18107 HOST_WIDE_INT shift_mask = mode == QImode ? 0x18 : 0x10;
18108 HOST_WIDE_INT imask = GET_MODE_MASK (mode);
18109
18110 /* Shift amount for subword relative to aligned word. */
18111 addrSI = force_reg (GET_MODE (XEXP (mem, 0)), XEXP (mem, 0));
18112 addrSI = force_reg (SImode, gen_lowpart_common (SImode, addrSI));
18113 shift = gen_reg_rtx (SImode);
18114 emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
18115 GEN_INT (shift_mask)));
18116 emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
18117
18118 /* Shift and mask old value into position within word. */
18119 oldval = convert_modes (SImode, mode, oldval, 1);
18120 oldval = expand_binop (SImode, and_optab,
18121 oldval, GEN_INT (imask), NULL_RTX,
18122 1, OPTAB_LIB_WIDEN);
18123 emit_insn (gen_ashlsi3 (oldval, oldval, shift));
18124
18125 /* Shift and mask new value into position within word. */
18126 newval = convert_modes (SImode, mode, newval, 1);
18127 newval = expand_binop (SImode, and_optab,
18128 newval, GEN_INT (imask), NULL_RTX,
18129 1, OPTAB_LIB_WIDEN);
18130 emit_insn (gen_ashlsi3 (newval, newval, shift));
18131
18132 /* Mask for insertion. */
18133 mask = gen_reg_rtx (SImode);
18134 emit_move_insn (mask, GEN_INT (imask));
18135 emit_insn (gen_ashlsi3 (mask, mask, shift));
18136
18137 /* Address of aligned word containing subword. */
18138 align = expand_binop (Pmode, and_optab, XEXP (mem, 0), GEN_INT (-4),
18139 NULL_RTX, 1, OPTAB_LIB_WIDEN);
18140 mem = change_address (mem, SImode, align);
18141 set_mem_align (mem, 32);
18142 MEM_VOLATILE_P (mem) = 1;
18143
18144 wdst = gen_reg_rtx (SImode);
18145 emit_insn (gen_sync_compare_and_swapqhi_internal (wdst, mask,
18146 oldval, newval, mem));
18147
18148 /* Shift the result back. */
18149 emit_insn (gen_lshrsi3 (wdst, wdst, shift));
18150
18151 emit_move_insn (dst, gen_lowpart (mode, wdst));
18152 }
18153
18154 void
18155 rs6000_split_compare_and_swapqhi (rtx dest, rtx mask,
18156 rtx oldval, rtx newval, rtx mem,
18157 rtx scratch)
18158 {
18159 rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
18160
18161 emit_insn (gen_lwsync ());
18162 label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
18163 label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
18164 emit_label (XEXP (label1, 0));
18165
18166 emit_load_locked (SImode, scratch, mem);
18167
18168 /* Mask subword within loaded value for comparison with oldval.
18169 Use UNSPEC_AND to avoid clobber.*/
18170 emit_insn (gen_rtx_SET (SImode, dest,
18171 gen_rtx_UNSPEC (SImode,
18172 gen_rtvec (2, scratch, mask),
18173 UNSPEC_AND)));
18174
18175 x = gen_rtx_COMPARE (CCmode, dest, oldval);
18176 emit_insn (gen_rtx_SET (VOIDmode, cond, x));
18177
18178 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
18179 emit_unlikely_jump (x, label2);
18180
18181 /* Clear subword within loaded value for insertion of new value. */
18182 emit_insn (gen_rtx_SET (SImode, scratch,
18183 gen_rtx_AND (SImode,
18184 gen_rtx_NOT (SImode, mask), scratch)));
18185 emit_insn (gen_iorsi3 (scratch, scratch, newval));
18186 emit_store_conditional (SImode, cond, mem, scratch);
18187
18188 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
18189 emit_unlikely_jump (x, label1);
18190
18191 emit_insn (gen_isync ());
18192 emit_label (XEXP (label2, 0));
18193 }
18194
18195
18196 /* Emit instructions to move SRC to DST. Called by splitters for
18197 multi-register moves. It will emit at most one instruction for
18198 each register that is accessed; that is, it won't emit li/lis pairs
18199 (or equivalent for 64-bit code). One of SRC or DST must be a hard
18200 register. */
18201
18202 void
18203 rs6000_split_multireg_move (rtx dst, rtx src)
18204 {
18205 /* The register number of the first register being moved. */
18206 int reg;
18207 /* The mode that is to be moved. */
18208 enum machine_mode mode;
18209 /* The mode that the move is being done in, and its size. */
18210 enum machine_mode reg_mode;
18211 int reg_mode_size;
18212 /* The number of registers that will be moved. */
18213 int nregs;
18214
18215 reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
18216 mode = GET_MODE (dst);
18217 nregs = hard_regno_nregs[reg][mode];
18218 if (FP_REGNO_P (reg))
18219 reg_mode = DECIMAL_FLOAT_MODE_P (mode) ? DDmode :
18220 ((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT) ? DFmode : SFmode);
18221 else if (ALTIVEC_REGNO_P (reg))
18222 reg_mode = V16QImode;
18223 else if (TARGET_E500_DOUBLE && mode == TFmode)
18224 reg_mode = DFmode;
18225 else
18226 reg_mode = word_mode;
18227 reg_mode_size = GET_MODE_SIZE (reg_mode);
18228
18229 gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
18230
18231 if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
18232 {
18233 /* Move register range backwards, if we might have destructive
18234 overlap. */
18235 int i;
18236 for (i = nregs - 1; i >= 0; i--)
18237 emit_insn (gen_rtx_SET (VOIDmode,
18238 simplify_gen_subreg (reg_mode, dst, mode,
18239 i * reg_mode_size),
18240 simplify_gen_subreg (reg_mode, src, mode,
18241 i * reg_mode_size)));
18242 }
18243 else
18244 {
18245 int i;
18246 int j = -1;
18247 bool used_update = false;
18248 rtx restore_basereg = NULL_RTX;
18249
18250 if (MEM_P (src) && INT_REGNO_P (reg))
18251 {
18252 rtx breg;
18253
18254 if (GET_CODE (XEXP (src, 0)) == PRE_INC
18255 || GET_CODE (XEXP (src, 0)) == PRE_DEC)
18256 {
18257 rtx delta_rtx;
18258 breg = XEXP (XEXP (src, 0), 0);
18259 delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
18260 ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
18261 : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
18262 emit_insn (gen_add3_insn (breg, breg, delta_rtx));
18263 src = replace_equiv_address (src, breg);
18264 }
18265 else if (! rs6000_offsettable_memref_p (src))
18266 {
18267 if (GET_CODE (XEXP (src, 0)) == PRE_MODIFY)
18268 {
18269 rtx basereg = XEXP (XEXP (src, 0), 0);
18270 if (TARGET_UPDATE)
18271 {
18272 rtx ndst = simplify_gen_subreg (reg_mode, dst, mode, 0);
18273 emit_insn (gen_rtx_SET (VOIDmode, ndst,
18274 gen_rtx_MEM (reg_mode, XEXP (src, 0))));
18275 used_update = true;
18276 }
18277 else
18278 emit_insn (gen_rtx_SET (VOIDmode, basereg,
18279 XEXP (XEXP (src, 0), 1)));
18280 src = replace_equiv_address (src, basereg);
18281 }
18282 else
18283 {
18284 rtx basereg = gen_rtx_REG (Pmode, reg);
18285 emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0)));
18286 src = replace_equiv_address (src, basereg);
18287 }
18288 }
18289
18290 breg = XEXP (src, 0);
18291 if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
18292 breg = XEXP (breg, 0);
18293
18294 /* If the base register we are using to address memory is
18295 also a destination reg, then change that register last. */
18296 if (REG_P (breg)
18297 && REGNO (breg) >= REGNO (dst)
18298 && REGNO (breg) < REGNO (dst) + nregs)
18299 j = REGNO (breg) - REGNO (dst);
18300 }
18301 else if (MEM_P (dst) && INT_REGNO_P (reg))
18302 {
18303 rtx breg;
18304
18305 if (GET_CODE (XEXP (dst, 0)) == PRE_INC
18306 || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
18307 {
18308 rtx delta_rtx;
18309 breg = XEXP (XEXP (dst, 0), 0);
18310 delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
18311 ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
18312 : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
18313
18314 /* We have to update the breg before doing the store.
18315 Use store with update, if available. */
18316
18317 if (TARGET_UPDATE)
18318 {
18319 rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
18320 emit_insn (TARGET_32BIT
18321 ? (TARGET_POWERPC64
18322 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
18323 : gen_movsi_update (breg, breg, delta_rtx, nsrc))
18324 : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
18325 used_update = true;
18326 }
18327 else
18328 emit_insn (gen_add3_insn (breg, breg, delta_rtx));
18329 dst = replace_equiv_address (dst, breg);
18330 }
18331 else if (!rs6000_offsettable_memref_p (dst)
18332 && GET_CODE (XEXP (dst, 0)) != LO_SUM)
18333 {
18334 if (GET_CODE (XEXP (dst, 0)) == PRE_MODIFY)
18335 {
18336 rtx basereg = XEXP (XEXP (dst, 0), 0);
18337 if (TARGET_UPDATE)
18338 {
18339 rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
18340 emit_insn (gen_rtx_SET (VOIDmode,
18341 gen_rtx_MEM (reg_mode, XEXP (dst, 0)), nsrc));
18342 used_update = true;
18343 }
18344 else
18345 emit_insn (gen_rtx_SET (VOIDmode, basereg,
18346 XEXP (XEXP (dst, 0), 1)));
18347 dst = replace_equiv_address (dst, basereg);
18348 }
18349 else
18350 {
18351 rtx basereg = XEXP (XEXP (dst, 0), 0);
18352 rtx offsetreg = XEXP (XEXP (dst, 0), 1);
18353 gcc_assert (GET_CODE (XEXP (dst, 0)) == PLUS
18354 && REG_P (basereg)
18355 && REG_P (offsetreg)
18356 && REGNO (basereg) != REGNO (offsetreg));
18357 if (REGNO (basereg) == 0)
18358 {
18359 rtx tmp = offsetreg;
18360 offsetreg = basereg;
18361 basereg = tmp;
18362 }
18363 emit_insn (gen_add3_insn (basereg, basereg, offsetreg));
18364 restore_basereg = gen_sub3_insn (basereg, basereg, offsetreg);
18365 dst = replace_equiv_address (dst, basereg);
18366 }
18367 }
18368 else if (GET_CODE (XEXP (dst, 0)) != LO_SUM)
18369 gcc_assert (rs6000_offsettable_memref_p (dst));
18370 }
18371
18372 for (i = 0; i < nregs; i++)
18373 {
18374 /* Calculate index to next subword. */
18375 ++j;
18376 if (j == nregs)
18377 j = 0;
18378
18379 /* If compiler already emitted move of first word by
18380 store with update, no need to do anything. */
18381 if (j == 0 && used_update)
18382 continue;
18383
18384 emit_insn (gen_rtx_SET (VOIDmode,
18385 simplify_gen_subreg (reg_mode, dst, mode,
18386 j * reg_mode_size),
18387 simplify_gen_subreg (reg_mode, src, mode,
18388 j * reg_mode_size)));
18389 }
18390 if (restore_basereg != NULL_RTX)
18391 emit_insn (restore_basereg);
18392 }
18393 }
18394
18395 \f
18396 /* This page contains routines that are used to determine what the
18397 function prologue and epilogue code will do and write them out. */
18398
18399 /* Return the first fixed-point register that is required to be
18400 saved. 32 if none. */
18401
18402 int
18403 first_reg_to_save (void)
18404 {
18405 int first_reg;
18406
18407 /* Find lowest numbered live register. */
18408 for (first_reg = 13; first_reg <= 31; first_reg++)
18409 if (df_regs_ever_live_p (first_reg)
18410 && (! call_used_regs[first_reg]
18411 || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
18412 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
18413 || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
18414 || (TARGET_TOC && TARGET_MINIMAL_TOC)))))
18415 break;
18416
18417 #if TARGET_MACHO
18418 if (flag_pic
18419 && crtl->uses_pic_offset_table
18420 && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
18421 return RS6000_PIC_OFFSET_TABLE_REGNUM;
18422 #endif
18423
18424 return first_reg;
18425 }
18426
18427 /* Similar, for FP regs. */
18428
18429 int
18430 first_fp_reg_to_save (void)
18431 {
18432 int first_reg;
18433
18434 /* Find lowest numbered live register. */
18435 for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
18436 if (df_regs_ever_live_p (first_reg))
18437 break;
18438
18439 return first_reg;
18440 }
18441
18442 /* Similar, for AltiVec regs. */
18443
18444 static int
18445 first_altivec_reg_to_save (void)
18446 {
18447 int i;
18448
18449 /* Stack frame remains as is unless we are in AltiVec ABI. */
18450 if (! TARGET_ALTIVEC_ABI)
18451 return LAST_ALTIVEC_REGNO + 1;
18452
18453 /* On Darwin, the unwind routines are compiled without
18454 TARGET_ALTIVEC, and use save_world to save/restore the
18455 altivec registers when necessary. */
18456 if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
18457 && ! TARGET_ALTIVEC)
18458 return FIRST_ALTIVEC_REGNO + 20;
18459
18460 /* Find lowest numbered live register. */
18461 for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
18462 if (df_regs_ever_live_p (i))
18463 break;
18464
18465 return i;
18466 }
18467
18468 /* Return a 32-bit mask of the AltiVec registers we need to set in
18469 VRSAVE. Bit n of the return value is 1 if Vn is live. The MSB in
18470 the 32-bit word is 0. */
18471
18472 static unsigned int
18473 compute_vrsave_mask (void)
18474 {
18475 unsigned int i, mask = 0;
18476
18477 /* On Darwin, the unwind routines are compiled without
18478 TARGET_ALTIVEC, and use save_world to save/restore the
18479 call-saved altivec registers when necessary. */
18480 if (DEFAULT_ABI == ABI_DARWIN && crtl->calls_eh_return
18481 && ! TARGET_ALTIVEC)
18482 mask |= 0xFFF;
18483
18484 /* First, find out if we use _any_ altivec registers. */
18485 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
18486 if (df_regs_ever_live_p (i))
18487 mask |= ALTIVEC_REG_BIT (i);
18488
18489 if (mask == 0)
18490 return mask;
18491
18492 /* Next, remove the argument registers from the set. These must
18493 be in the VRSAVE mask set by the caller, so we don't need to add
18494 them in again. More importantly, the mask we compute here is
18495 used to generate CLOBBERs in the set_vrsave insn, and we do not
18496 wish the argument registers to die. */
18497 for (i = crtl->args.info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
18498 mask &= ~ALTIVEC_REG_BIT (i);
18499
18500 /* Similarly, remove the return value from the set. */
18501 {
18502 bool yes = false;
18503 diddle_return_value (is_altivec_return_reg, &yes);
18504 if (yes)
18505 mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
18506 }
18507
18508 return mask;
18509 }
18510
18511 /* For a very restricted set of circumstances, we can cut down the
18512 size of prologues/epilogues by calling our own save/restore-the-world
18513 routines. */
18514
18515 static void
18516 compute_save_world_info (rs6000_stack_t *info_ptr)
18517 {
18518 info_ptr->world_save_p = 1;
18519 info_ptr->world_save_p
18520 = (WORLD_SAVE_P (info_ptr)
18521 && DEFAULT_ABI == ABI_DARWIN
18522 && ! (cfun->calls_setjmp && flag_exceptions)
18523 && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
18524 && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
18525 && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
18526 && info_ptr->cr_save_p);
18527
18528 /* This will not work in conjunction with sibcalls. Make sure there
18529 are none. (This check is expensive, but seldom executed.) */
18530 if (WORLD_SAVE_P (info_ptr))
18531 {
18532 rtx insn;
18533 for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
18534 if ( GET_CODE (insn) == CALL_INSN
18535 && SIBLING_CALL_P (insn))
18536 {
18537 info_ptr->world_save_p = 0;
18538 break;
18539 }
18540 }
18541
18542 if (WORLD_SAVE_P (info_ptr))
18543 {
18544 /* Even if we're not touching VRsave, make sure there's room on the
18545 stack for it, if it looks like we're calling SAVE_WORLD, which
18546 will attempt to save it. */
18547 info_ptr->vrsave_size = 4;
18548
18549 /* If we are going to save the world, we need to save the link register too. */
18550 info_ptr->lr_save_p = 1;
18551
18552 /* "Save" the VRsave register too if we're saving the world. */
18553 if (info_ptr->vrsave_mask == 0)
18554 info_ptr->vrsave_mask = compute_vrsave_mask ();
18555
18556 /* Because the Darwin register save/restore routines only handle
18557 F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
18558 check. */
18559 gcc_assert (info_ptr->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
18560 && (info_ptr->first_altivec_reg_save
18561 >= FIRST_SAVED_ALTIVEC_REGNO));
18562 }
18563 return;
18564 }
18565
18566
18567 static void
18568 is_altivec_return_reg (rtx reg, void *xyes)
18569 {
18570 bool *yes = (bool *) xyes;
18571 if (REGNO (reg) == ALTIVEC_ARG_RETURN)
18572 *yes = true;
18573 }
18574
18575 \f
18576 /* Determine the strategy for savings/restoring registers. */
18577
18578 enum {
18579 SAVRES_MULTIPLE = 0x1,
18580 SAVE_INLINE_FPRS = 0x2,
18581 SAVE_INLINE_GPRS = 0x4,
18582 REST_INLINE_FPRS = 0x8,
18583 REST_INLINE_GPRS = 0x10,
18584 SAVE_NOINLINE_GPRS_SAVES_LR = 0x20,
18585 SAVE_NOINLINE_FPRS_SAVES_LR = 0x40,
18586 REST_NOINLINE_FPRS_DOESNT_RESTORE_LR = 0x80
18587 };
18588
18589 static int
18590 rs6000_savres_strategy (rs6000_stack_t *info,
18591 bool using_static_chain_p)
18592 {
18593 int strategy = 0;
18594
18595 if (TARGET_MULTIPLE
18596 && !TARGET_POWERPC64
18597 && !(TARGET_SPE_ABI && info->spe_64bit_regs_used)
18598 && info->first_gp_reg_save < 31
18599 && no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true))
18600 strategy |= SAVRES_MULTIPLE;
18601
18602 if (crtl->calls_eh_return
18603 || cfun->machine->ra_need_lr
18604 || info->total_size > 32767)
18605 strategy |= (SAVE_INLINE_FPRS | REST_INLINE_FPRS
18606 | SAVE_INLINE_GPRS | REST_INLINE_GPRS);
18607
18608 if (info->first_fp_reg_save == 64
18609 || FP_SAVE_INLINE (info->first_fp_reg_save)
18610 /* The out-of-line FP routines use double-precision stores;
18611 we can't use those routines if we don't have such stores. */
18612 || (TARGET_HARD_FLOAT && !TARGET_DOUBLE_FLOAT)
18613 || !no_global_regs_above (info->first_fp_reg_save, /*gpr=*/false))
18614 strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
18615
18616 if (info->first_gp_reg_save == 32
18617 || GP_SAVE_INLINE (info->first_gp_reg_save)
18618 || !((strategy & SAVRES_MULTIPLE)
18619 || no_global_regs_above (info->first_gp_reg_save, /*gpr=*/true)))
18620 strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
18621
18622 /* Don't bother to try to save things out-of-line if r11 is occupied
18623 by the static chain. It would require too much fiddling and the
18624 static chain is rarely used anyway. */
18625 if (using_static_chain_p)
18626 strategy |= SAVE_INLINE_FPRS | SAVE_INLINE_GPRS;
18627
18628 /* If we are going to use store multiple, then don't even bother
18629 with the out-of-line routines, since the store-multiple
18630 instruction will always be smaller. */
18631 if ((strategy & SAVRES_MULTIPLE))
18632 strategy |= SAVE_INLINE_GPRS;
18633
18634 /* The situation is more complicated with load multiple. We'd
18635 prefer to use the out-of-line routines for restores, since the
18636 "exit" out-of-line routines can handle the restore of LR and the
18637 frame teardown. However if doesn't make sense to use the
18638 out-of-line routine if that is the only reason we'd need to save
18639 LR, and we can't use the "exit" out-of-line gpr restore if we
18640 have saved some fprs; In those cases it is advantageous to use
18641 load multiple when available. */
18642 if ((strategy & SAVRES_MULTIPLE)
18643 && (!info->lr_save_p
18644 || info->first_fp_reg_save != 64))
18645 strategy |= REST_INLINE_GPRS;
18646
18647 /* We can only use load multiple or the out-of-line routines to
18648 restore if we've used store multiple or out-of-line routines
18649 in the prologue, i.e. if we've saved all the registers from
18650 first_gp_reg_save. Otherwise, we risk loading garbage. */
18651 if ((strategy & (SAVE_INLINE_GPRS | SAVRES_MULTIPLE)) == SAVE_INLINE_GPRS)
18652 strategy |= REST_INLINE_GPRS;
18653
18654 /* Saving CR interferes with the exit routines used on the SPE, so
18655 just punt here. */
18656 if (TARGET_SPE_ABI
18657 && info->spe_64bit_regs_used
18658 && info->cr_save_p)
18659 strategy |= REST_INLINE_GPRS;
18660
18661 #ifdef POWERPC_LINUX
18662 if (TARGET_64BIT)
18663 {
18664 if (!(strategy & SAVE_INLINE_FPRS))
18665 strategy |= SAVE_NOINLINE_FPRS_SAVES_LR;
18666 else if (!(strategy & SAVE_INLINE_GPRS)
18667 && info->first_fp_reg_save == 64)
18668 strategy |= SAVE_NOINLINE_GPRS_SAVES_LR;
18669 }
18670 #else
18671 if (TARGET_AIX && !(strategy & REST_INLINE_FPRS))
18672 strategy |= REST_NOINLINE_FPRS_DOESNT_RESTORE_LR;
18673 #endif
18674 return strategy;
18675 }
18676
18677 /* Calculate the stack information for the current function. This is
18678 complicated by having two separate calling sequences, the AIX calling
18679 sequence and the V.4 calling sequence.
18680
18681 AIX (and Darwin/Mac OS X) stack frames look like:
18682 32-bit 64-bit
18683 SP----> +---------------------------------------+
18684 | back chain to caller | 0 0
18685 +---------------------------------------+
18686 | saved CR | 4 8 (8-11)
18687 +---------------------------------------+
18688 | saved LR | 8 16
18689 +---------------------------------------+
18690 | reserved for compilers | 12 24
18691 +---------------------------------------+
18692 | reserved for binders | 16 32
18693 +---------------------------------------+
18694 | saved TOC pointer | 20 40
18695 +---------------------------------------+
18696 | Parameter save area (P) | 24 48
18697 +---------------------------------------+
18698 | Alloca space (A) | 24+P etc.
18699 +---------------------------------------+
18700 | Local variable space (L) | 24+P+A
18701 +---------------------------------------+
18702 | Float/int conversion temporary (X) | 24+P+A+L
18703 +---------------------------------------+
18704 | Save area for AltiVec registers (W) | 24+P+A+L+X
18705 +---------------------------------------+
18706 | AltiVec alignment padding (Y) | 24+P+A+L+X+W
18707 +---------------------------------------+
18708 | Save area for VRSAVE register (Z) | 24+P+A+L+X+W+Y
18709 +---------------------------------------+
18710 | Save area for GP registers (G) | 24+P+A+X+L+X+W+Y+Z
18711 +---------------------------------------+
18712 | Save area for FP registers (F) | 24+P+A+X+L+X+W+Y+Z+G
18713 +---------------------------------------+
18714 old SP->| back chain to caller's caller |
18715 +---------------------------------------+
18716
18717 The required alignment for AIX configurations is two words (i.e., 8
18718 or 16 bytes).
18719
18720
18721 V.4 stack frames look like:
18722
18723 SP----> +---------------------------------------+
18724 | back chain to caller | 0
18725 +---------------------------------------+
18726 | caller's saved LR | 4
18727 +---------------------------------------+
18728 | Parameter save area (P) | 8
18729 +---------------------------------------+
18730 | Alloca space (A) | 8+P
18731 +---------------------------------------+
18732 | Varargs save area (V) | 8+P+A
18733 +---------------------------------------+
18734 | Local variable space (L) | 8+P+A+V
18735 +---------------------------------------+
18736 | Float/int conversion temporary (X) | 8+P+A+V+L
18737 +---------------------------------------+
18738 | Save area for AltiVec registers (W) | 8+P+A+V+L+X
18739 +---------------------------------------+
18740 | AltiVec alignment padding (Y) | 8+P+A+V+L+X+W
18741 +---------------------------------------+
18742 | Save area for VRSAVE register (Z) | 8+P+A+V+L+X+W+Y
18743 +---------------------------------------+
18744 | SPE: area for 64-bit GP registers |
18745 +---------------------------------------+
18746 | SPE alignment padding |
18747 +---------------------------------------+
18748 | saved CR (C) | 8+P+A+V+L+X+W+Y+Z
18749 +---------------------------------------+
18750 | Save area for GP registers (G) | 8+P+A+V+L+X+W+Y+Z+C
18751 +---------------------------------------+
18752 | Save area for FP registers (F) | 8+P+A+V+L+X+W+Y+Z+C+G
18753 +---------------------------------------+
18754 old SP->| back chain to caller's caller |
18755 +---------------------------------------+
18756
18757 The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
18758 given. (But note below and in sysv4.h that we require only 8 and
18759 may round up the size of our stack frame anyways. The historical
18760 reason is early versions of powerpc-linux which didn't properly
18761 align the stack at program startup. A happy side-effect is that
18762 -mno-eabi libraries can be used with -meabi programs.)
18763
18764 The EABI configuration defaults to the V.4 layout. However,
18765 the stack alignment requirements may differ. If -mno-eabi is not
18766 given, the required stack alignment is 8 bytes; if -mno-eabi is
18767 given, the required alignment is 16 bytes. (But see V.4 comment
18768 above.) */
18769
18770 #ifndef ABI_STACK_BOUNDARY
18771 #define ABI_STACK_BOUNDARY STACK_BOUNDARY
18772 #endif
18773
18774 static rs6000_stack_t *
18775 rs6000_stack_info (void)
18776 {
18777 rs6000_stack_t *info_ptr = &stack_info;
18778 int reg_size = TARGET_32BIT ? 4 : 8;
18779 int ehrd_size;
18780 int save_align;
18781 int first_gp;
18782 HOST_WIDE_INT non_fixed_size;
18783 bool using_static_chain_p;
18784
18785 if (reload_completed && info_ptr->reload_completed)
18786 return info_ptr;
18787
18788 memset (info_ptr, 0, sizeof (*info_ptr));
18789 info_ptr->reload_completed = reload_completed;
18790
18791 if (TARGET_SPE)
18792 {
18793 /* Cache value so we don't rescan instruction chain over and over. */
18794 if (cfun->machine->insn_chain_scanned_p == 0)
18795 cfun->machine->insn_chain_scanned_p
18796 = spe_func_has_64bit_regs_p () + 1;
18797 info_ptr->spe_64bit_regs_used = cfun->machine->insn_chain_scanned_p - 1;
18798 }
18799
18800 /* Select which calling sequence. */
18801 info_ptr->abi = DEFAULT_ABI;
18802
18803 /* Calculate which registers need to be saved & save area size. */
18804 info_ptr->first_gp_reg_save = first_reg_to_save ();
18805 /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
18806 even if it currently looks like we won't. Reload may need it to
18807 get at a constant; if so, it will have already created a constant
18808 pool entry for it. */
18809 if (((TARGET_TOC && TARGET_MINIMAL_TOC)
18810 || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
18811 || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
18812 && crtl->uses_const_pool
18813 && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
18814 first_gp = RS6000_PIC_OFFSET_TABLE_REGNUM;
18815 else
18816 first_gp = info_ptr->first_gp_reg_save;
18817
18818 info_ptr->gp_size = reg_size * (32 - first_gp);
18819
18820 /* For the SPE, we have an additional upper 32-bits on each GPR.
18821 Ideally we should save the entire 64-bits only when the upper
18822 half is used in SIMD instructions. Since we only record
18823 registers live (not the size they are used in), this proves
18824 difficult because we'd have to traverse the instruction chain at
18825 the right time, taking reload into account. This is a real pain,
18826 so we opt to save the GPRs in 64-bits always if but one register
18827 gets used in 64-bits. Otherwise, all the registers in the frame
18828 get saved in 32-bits.
18829
18830 So... since when we save all GPRs (except the SP) in 64-bits, the
18831 traditional GP save area will be empty. */
18832 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18833 info_ptr->gp_size = 0;
18834
18835 info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
18836 info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
18837
18838 info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
18839 info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
18840 - info_ptr->first_altivec_reg_save);
18841
18842 /* Does this function call anything? */
18843 info_ptr->calls_p = (! current_function_is_leaf
18844 || cfun->machine->ra_needs_full_frame);
18845
18846 /* Determine if we need to save the condition code registers. */
18847 if (df_regs_ever_live_p (CR2_REGNO)
18848 || df_regs_ever_live_p (CR3_REGNO)
18849 || df_regs_ever_live_p (CR4_REGNO))
18850 {
18851 info_ptr->cr_save_p = 1;
18852 if (DEFAULT_ABI == ABI_V4)
18853 info_ptr->cr_size = reg_size;
18854 }
18855
18856 /* If the current function calls __builtin_eh_return, then we need
18857 to allocate stack space for registers that will hold data for
18858 the exception handler. */
18859 if (crtl->calls_eh_return)
18860 {
18861 unsigned int i;
18862 for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
18863 continue;
18864
18865 /* SPE saves EH registers in 64-bits. */
18866 ehrd_size = i * (TARGET_SPE_ABI
18867 && info_ptr->spe_64bit_regs_used != 0
18868 ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
18869 }
18870 else
18871 ehrd_size = 0;
18872
18873 /* Determine various sizes. */
18874 info_ptr->reg_size = reg_size;
18875 info_ptr->fixed_size = RS6000_SAVE_AREA;
18876 info_ptr->vars_size = RS6000_ALIGN (get_frame_size (), 8);
18877 info_ptr->parm_size = RS6000_ALIGN (crtl->outgoing_args_size,
18878 TARGET_ALTIVEC ? 16 : 8);
18879 if (FRAME_GROWS_DOWNWARD)
18880 info_ptr->vars_size
18881 += RS6000_ALIGN (info_ptr->fixed_size + info_ptr->vars_size
18882 + info_ptr->parm_size,
18883 ABI_STACK_BOUNDARY / BITS_PER_UNIT)
18884 - (info_ptr->fixed_size + info_ptr->vars_size
18885 + info_ptr->parm_size);
18886
18887 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18888 info_ptr->spe_gp_size = 8 * (32 - first_gp);
18889 else
18890 info_ptr->spe_gp_size = 0;
18891
18892 if (TARGET_ALTIVEC_ABI)
18893 info_ptr->vrsave_mask = compute_vrsave_mask ();
18894 else
18895 info_ptr->vrsave_mask = 0;
18896
18897 if (TARGET_ALTIVEC_VRSAVE && info_ptr->vrsave_mask)
18898 info_ptr->vrsave_size = 4;
18899 else
18900 info_ptr->vrsave_size = 0;
18901
18902 compute_save_world_info (info_ptr);
18903
18904 /* Calculate the offsets. */
18905 switch (DEFAULT_ABI)
18906 {
18907 case ABI_NONE:
18908 default:
18909 gcc_unreachable ();
18910
18911 case ABI_AIX:
18912 case ABI_DARWIN:
18913 info_ptr->fp_save_offset = - info_ptr->fp_size;
18914 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
18915
18916 if (TARGET_ALTIVEC_ABI)
18917 {
18918 info_ptr->vrsave_save_offset
18919 = info_ptr->gp_save_offset - info_ptr->vrsave_size;
18920
18921 /* Align stack so vector save area is on a quadword boundary.
18922 The padding goes above the vectors. */
18923 if (info_ptr->altivec_size != 0)
18924 info_ptr->altivec_padding_size
18925 = info_ptr->vrsave_save_offset & 0xF;
18926 else
18927 info_ptr->altivec_padding_size = 0;
18928
18929 info_ptr->altivec_save_offset
18930 = info_ptr->vrsave_save_offset
18931 - info_ptr->altivec_padding_size
18932 - info_ptr->altivec_size;
18933 gcc_assert (info_ptr->altivec_size == 0
18934 || info_ptr->altivec_save_offset % 16 == 0);
18935
18936 /* Adjust for AltiVec case. */
18937 info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
18938 }
18939 else
18940 info_ptr->ehrd_offset = info_ptr->gp_save_offset - ehrd_size;
18941 info_ptr->cr_save_offset = reg_size; /* first word when 64-bit. */
18942 info_ptr->lr_save_offset = 2*reg_size;
18943 break;
18944
18945 case ABI_V4:
18946 info_ptr->fp_save_offset = - info_ptr->fp_size;
18947 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
18948 info_ptr->cr_save_offset = info_ptr->gp_save_offset - info_ptr->cr_size;
18949
18950 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
18951 {
18952 /* Align stack so SPE GPR save area is aligned on a
18953 double-word boundary. */
18954 if (info_ptr->spe_gp_size != 0 && info_ptr->cr_save_offset != 0)
18955 info_ptr->spe_padding_size
18956 = 8 - (-info_ptr->cr_save_offset % 8);
18957 else
18958 info_ptr->spe_padding_size = 0;
18959
18960 info_ptr->spe_gp_save_offset
18961 = info_ptr->cr_save_offset
18962 - info_ptr->spe_padding_size
18963 - info_ptr->spe_gp_size;
18964
18965 /* Adjust for SPE case. */
18966 info_ptr->ehrd_offset = info_ptr->spe_gp_save_offset;
18967 }
18968 else if (TARGET_ALTIVEC_ABI)
18969 {
18970 info_ptr->vrsave_save_offset
18971 = info_ptr->cr_save_offset - info_ptr->vrsave_size;
18972
18973 /* Align stack so vector save area is on a quadword boundary. */
18974 if (info_ptr->altivec_size != 0)
18975 info_ptr->altivec_padding_size
18976 = 16 - (-info_ptr->vrsave_save_offset % 16);
18977 else
18978 info_ptr->altivec_padding_size = 0;
18979
18980 info_ptr->altivec_save_offset
18981 = info_ptr->vrsave_save_offset
18982 - info_ptr->altivec_padding_size
18983 - info_ptr->altivec_size;
18984
18985 /* Adjust for AltiVec case. */
18986 info_ptr->ehrd_offset = info_ptr->altivec_save_offset;
18987 }
18988 else
18989 info_ptr->ehrd_offset = info_ptr->cr_save_offset;
18990 info_ptr->ehrd_offset -= ehrd_size;
18991 info_ptr->lr_save_offset = reg_size;
18992 break;
18993 }
18994
18995 save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
18996 info_ptr->save_size = RS6000_ALIGN (info_ptr->fp_size
18997 + info_ptr->gp_size
18998 + info_ptr->altivec_size
18999 + info_ptr->altivec_padding_size
19000 + info_ptr->spe_gp_size
19001 + info_ptr->spe_padding_size
19002 + ehrd_size
19003 + info_ptr->cr_size
19004 + info_ptr->vrsave_size,
19005 save_align);
19006
19007 non_fixed_size = (info_ptr->vars_size
19008 + info_ptr->parm_size
19009 + info_ptr->save_size);
19010
19011 info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size,
19012 ABI_STACK_BOUNDARY / BITS_PER_UNIT);
19013
19014 /* Determine if we need to save the link register. */
19015 if (info_ptr->calls_p
19016 || (DEFAULT_ABI == ABI_AIX
19017 && crtl->profile
19018 && !TARGET_PROFILE_KERNEL)
19019 || (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca)
19020 #ifdef TARGET_RELOCATABLE
19021 || (TARGET_RELOCATABLE && (get_pool_size () != 0))
19022 #endif
19023 || rs6000_ra_ever_killed ())
19024 info_ptr->lr_save_p = 1;
19025
19026 using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
19027 && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
19028 && call_used_regs[STATIC_CHAIN_REGNUM]);
19029 info_ptr->savres_strategy = rs6000_savres_strategy (info_ptr,
19030 using_static_chain_p);
19031
19032 if (!(info_ptr->savres_strategy & SAVE_INLINE_GPRS)
19033 || !(info_ptr->savres_strategy & SAVE_INLINE_FPRS)
19034 || !(info_ptr->savres_strategy & REST_INLINE_GPRS)
19035 || !(info_ptr->savres_strategy & REST_INLINE_FPRS))
19036 info_ptr->lr_save_p = 1;
19037
19038 if (info_ptr->lr_save_p)
19039 df_set_regs_ever_live (LR_REGNO, true);
19040
19041 /* Determine if we need to allocate any stack frame:
19042
19043 For AIX we need to push the stack if a frame pointer is needed
19044 (because the stack might be dynamically adjusted), if we are
19045 debugging, if we make calls, or if the sum of fp_save, gp_save,
19046 and local variables are more than the space needed to save all
19047 non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
19048 + 18*8 = 288 (GPR13 reserved).
19049
19050 For V.4 we don't have the stack cushion that AIX uses, but assume
19051 that the debugger can handle stackless frames. */
19052
19053 if (info_ptr->calls_p)
19054 info_ptr->push_p = 1;
19055
19056 else if (DEFAULT_ABI == ABI_V4)
19057 info_ptr->push_p = non_fixed_size != 0;
19058
19059 else if (frame_pointer_needed)
19060 info_ptr->push_p = 1;
19061
19062 else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
19063 info_ptr->push_p = 1;
19064
19065 else
19066 info_ptr->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
19067
19068 /* Zero offsets if we're not saving those registers. */
19069 if (info_ptr->fp_size == 0)
19070 info_ptr->fp_save_offset = 0;
19071
19072 if (info_ptr->gp_size == 0)
19073 info_ptr->gp_save_offset = 0;
19074
19075 if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
19076 info_ptr->altivec_save_offset = 0;
19077
19078 if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
19079 info_ptr->vrsave_save_offset = 0;
19080
19081 if (! TARGET_SPE_ABI
19082 || info_ptr->spe_64bit_regs_used == 0
19083 || info_ptr->spe_gp_size == 0)
19084 info_ptr->spe_gp_save_offset = 0;
19085
19086 if (! info_ptr->lr_save_p)
19087 info_ptr->lr_save_offset = 0;
19088
19089 if (! info_ptr->cr_save_p)
19090 info_ptr->cr_save_offset = 0;
19091
19092 return info_ptr;
19093 }
19094
19095 /* Return true if the current function uses any GPRs in 64-bit SIMD
19096 mode. */
19097
19098 static bool
19099 spe_func_has_64bit_regs_p (void)
19100 {
19101 rtx insns, insn;
19102
19103 /* Functions that save and restore all the call-saved registers will
19104 need to save/restore the registers in 64-bits. */
19105 if (crtl->calls_eh_return
19106 || cfun->calls_setjmp
19107 || crtl->has_nonlocal_goto)
19108 return true;
19109
19110 insns = get_insns ();
19111
19112 for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
19113 {
19114 if (INSN_P (insn))
19115 {
19116 rtx i;
19117
19118 /* FIXME: This should be implemented with attributes...
19119
19120 (set_attr "spe64" "true")....then,
19121 if (get_spe64(insn)) return true;
19122
19123 It's the only reliable way to do the stuff below. */
19124
19125 i = PATTERN (insn);
19126 if (GET_CODE (i) == SET)
19127 {
19128 enum machine_mode mode = GET_MODE (SET_SRC (i));
19129
19130 if (SPE_VECTOR_MODE (mode))
19131 return true;
19132 if (TARGET_E500_DOUBLE && (mode == DFmode || mode == TFmode))
19133 return true;
19134 }
19135 }
19136 }
19137
19138 return false;
19139 }
19140
19141 static void
19142 debug_stack_info (rs6000_stack_t *info)
19143 {
19144 const char *abi_string;
19145
19146 if (! info)
19147 info = rs6000_stack_info ();
19148
19149 fprintf (stderr, "\nStack information for function %s:\n",
19150 ((current_function_decl && DECL_NAME (current_function_decl))
19151 ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
19152 : "<unknown>"));
19153
19154 switch (info->abi)
19155 {
19156 default: abi_string = "Unknown"; break;
19157 case ABI_NONE: abi_string = "NONE"; break;
19158 case ABI_AIX: abi_string = "AIX"; break;
19159 case ABI_DARWIN: abi_string = "Darwin"; break;
19160 case ABI_V4: abi_string = "V.4"; break;
19161 }
19162
19163 fprintf (stderr, "\tABI = %5s\n", abi_string);
19164
19165 if (TARGET_ALTIVEC_ABI)
19166 fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
19167
19168 if (TARGET_SPE_ABI)
19169 fprintf (stderr, "\tSPE ABI extensions enabled.\n");
19170
19171 if (info->first_gp_reg_save != 32)
19172 fprintf (stderr, "\tfirst_gp_reg_save = %5d\n", info->first_gp_reg_save);
19173
19174 if (info->first_fp_reg_save != 64)
19175 fprintf (stderr, "\tfirst_fp_reg_save = %5d\n", info->first_fp_reg_save);
19176
19177 if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
19178 fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
19179 info->first_altivec_reg_save);
19180
19181 if (info->lr_save_p)
19182 fprintf (stderr, "\tlr_save_p = %5d\n", info->lr_save_p);
19183
19184 if (info->cr_save_p)
19185 fprintf (stderr, "\tcr_save_p = %5d\n", info->cr_save_p);
19186
19187 if (info->vrsave_mask)
19188 fprintf (stderr, "\tvrsave_mask = 0x%x\n", info->vrsave_mask);
19189
19190 if (info->push_p)
19191 fprintf (stderr, "\tpush_p = %5d\n", info->push_p);
19192
19193 if (info->calls_p)
19194 fprintf (stderr, "\tcalls_p = %5d\n", info->calls_p);
19195
19196 if (info->gp_save_offset)
19197 fprintf (stderr, "\tgp_save_offset = %5d\n", info->gp_save_offset);
19198
19199 if (info->fp_save_offset)
19200 fprintf (stderr, "\tfp_save_offset = %5d\n", info->fp_save_offset);
19201
19202 if (info->altivec_save_offset)
19203 fprintf (stderr, "\taltivec_save_offset = %5d\n",
19204 info->altivec_save_offset);
19205
19206 if (info->spe_gp_save_offset)
19207 fprintf (stderr, "\tspe_gp_save_offset = %5d\n",
19208 info->spe_gp_save_offset);
19209
19210 if (info->vrsave_save_offset)
19211 fprintf (stderr, "\tvrsave_save_offset = %5d\n",
19212 info->vrsave_save_offset);
19213
19214 if (info->lr_save_offset)
19215 fprintf (stderr, "\tlr_save_offset = %5d\n", info->lr_save_offset);
19216
19217 if (info->cr_save_offset)
19218 fprintf (stderr, "\tcr_save_offset = %5d\n", info->cr_save_offset);
19219
19220 if (info->varargs_save_offset)
19221 fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
19222
19223 if (info->total_size)
19224 fprintf (stderr, "\ttotal_size = "HOST_WIDE_INT_PRINT_DEC"\n",
19225 info->total_size);
19226
19227 if (info->vars_size)
19228 fprintf (stderr, "\tvars_size = "HOST_WIDE_INT_PRINT_DEC"\n",
19229 info->vars_size);
19230
19231 if (info->parm_size)
19232 fprintf (stderr, "\tparm_size = %5d\n", info->parm_size);
19233
19234 if (info->fixed_size)
19235 fprintf (stderr, "\tfixed_size = %5d\n", info->fixed_size);
19236
19237 if (info->gp_size)
19238 fprintf (stderr, "\tgp_size = %5d\n", info->gp_size);
19239
19240 if (info->spe_gp_size)
19241 fprintf (stderr, "\tspe_gp_size = %5d\n", info->spe_gp_size);
19242
19243 if (info->fp_size)
19244 fprintf (stderr, "\tfp_size = %5d\n", info->fp_size);
19245
19246 if (info->altivec_size)
19247 fprintf (stderr, "\taltivec_size = %5d\n", info->altivec_size);
19248
19249 if (info->vrsave_size)
19250 fprintf (stderr, "\tvrsave_size = %5d\n", info->vrsave_size);
19251
19252 if (info->altivec_padding_size)
19253 fprintf (stderr, "\taltivec_padding_size= %5d\n",
19254 info->altivec_padding_size);
19255
19256 if (info->spe_padding_size)
19257 fprintf (stderr, "\tspe_padding_size = %5d\n",
19258 info->spe_padding_size);
19259
19260 if (info->cr_size)
19261 fprintf (stderr, "\tcr_size = %5d\n", info->cr_size);
19262
19263 if (info->save_size)
19264 fprintf (stderr, "\tsave_size = %5d\n", info->save_size);
19265
19266 if (info->reg_size != 4)
19267 fprintf (stderr, "\treg_size = %5d\n", info->reg_size);
19268
19269 fprintf (stderr, "\n");
19270 }
19271
19272 rtx
19273 rs6000_return_addr (int count, rtx frame)
19274 {
19275 /* Currently we don't optimize very well between prolog and body
19276 code and for PIC code the code can be actually quite bad, so
19277 don't try to be too clever here. */
19278 if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
19279 {
19280 cfun->machine->ra_needs_full_frame = 1;
19281
19282 return
19283 gen_rtx_MEM
19284 (Pmode,
19285 memory_address
19286 (Pmode,
19287 plus_constant (copy_to_reg
19288 (gen_rtx_MEM (Pmode,
19289 memory_address (Pmode, frame))),
19290 RETURN_ADDRESS_OFFSET)));
19291 }
19292
19293 cfun->machine->ra_need_lr = 1;
19294 return get_hard_reg_initial_val (Pmode, LR_REGNO);
19295 }
19296
19297 /* Say whether a function is a candidate for sibcall handling or not.
19298 We do not allow indirect calls to be optimized into sibling calls.
19299 Also, we can't do it if there are any vector parameters; there's
19300 nowhere to put the VRsave code so it works; note that functions with
19301 vector parameters are required to have a prototype, so the argument
19302 type info must be available here. (The tail recursion case can work
19303 with vector parameters, but there's no way to distinguish here.) */
19304 static bool
19305 rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
19306 {
19307 tree type;
19308 if (decl)
19309 {
19310 if (TARGET_ALTIVEC_VRSAVE)
19311 {
19312 for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
19313 type; type = TREE_CHAIN (type))
19314 {
19315 if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
19316 return false;
19317 }
19318 }
19319 if (DEFAULT_ABI == ABI_DARWIN
19320 || ((*targetm.binds_local_p) (decl)
19321 && (DEFAULT_ABI != ABI_AIX || !DECL_EXTERNAL (decl))))
19322 {
19323 tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
19324
19325 if (!lookup_attribute ("longcall", attr_list)
19326 || lookup_attribute ("shortcall", attr_list))
19327 return true;
19328 }
19329 }
19330 return false;
19331 }
19332
19333 /* NULL if INSN insn is valid within a low-overhead loop.
19334 Otherwise return why doloop cannot be applied.
19335 PowerPC uses the COUNT register for branch on table instructions. */
19336
19337 static const char *
19338 rs6000_invalid_within_doloop (const_rtx insn)
19339 {
19340 if (CALL_P (insn))
19341 return "Function call in the loop.";
19342
19343 if (JUMP_P (insn)
19344 && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
19345 || GET_CODE (PATTERN (insn)) == ADDR_VEC))
19346 return "Computed branch in the loop.";
19347
19348 return NULL;
19349 }
19350
19351 static int
19352 rs6000_ra_ever_killed (void)
19353 {
19354 rtx top;
19355 rtx reg;
19356 rtx insn;
19357
19358 if (cfun->is_thunk)
19359 return 0;
19360
19361 if (cfun->machine->lr_save_state)
19362 return cfun->machine->lr_save_state - 1;
19363
19364 /* regs_ever_live has LR marked as used if any sibcalls are present,
19365 but this should not force saving and restoring in the
19366 pro/epilogue. Likewise, reg_set_between_p thinks a sibcall
19367 clobbers LR, so that is inappropriate. */
19368
19369 /* Also, the prologue can generate a store into LR that
19370 doesn't really count, like this:
19371
19372 move LR->R0
19373 bcl to set PIC register
19374 move LR->R31
19375 move R0->LR
19376
19377 When we're called from the epilogue, we need to avoid counting
19378 this as a store. */
19379
19380 push_topmost_sequence ();
19381 top = get_insns ();
19382 pop_topmost_sequence ();
19383 reg = gen_rtx_REG (Pmode, LR_REGNO);
19384
19385 for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
19386 {
19387 if (INSN_P (insn))
19388 {
19389 if (CALL_P (insn))
19390 {
19391 if (!SIBLING_CALL_P (insn))
19392 return 1;
19393 }
19394 else if (find_regno_note (insn, REG_INC, LR_REGNO))
19395 return 1;
19396 else if (set_of (reg, insn) != NULL_RTX
19397 && !prologue_epilogue_contains (insn))
19398 return 1;
19399 }
19400 }
19401 return 0;
19402 }
19403 \f
19404 /* Emit instructions needed to load the TOC register.
19405 This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
19406 a constant pool; or for SVR4 -fpic. */
19407
19408 void
19409 rs6000_emit_load_toc_table (int fromprolog)
19410 {
19411 rtx dest;
19412 dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
19413
19414 if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
19415 {
19416 char buf[30];
19417 rtx lab, tmp1, tmp2, got;
19418
19419 lab = gen_label_rtx ();
19420 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (lab));
19421 lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
19422 if (flag_pic == 2)
19423 got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
19424 else
19425 got = rs6000_got_sym ();
19426 tmp1 = tmp2 = dest;
19427 if (!fromprolog)
19428 {
19429 tmp1 = gen_reg_rtx (Pmode);
19430 tmp2 = gen_reg_rtx (Pmode);
19431 }
19432 emit_insn (gen_load_toc_v4_PIC_1 (lab));
19433 emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
19434 emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
19435 emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
19436 }
19437 else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
19438 {
19439 emit_insn (gen_load_toc_v4_pic_si ());
19440 emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
19441 }
19442 else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
19443 {
19444 char buf[30];
19445 rtx temp0 = (fromprolog
19446 ? gen_rtx_REG (Pmode, 0)
19447 : gen_reg_rtx (Pmode));
19448
19449 if (fromprolog)
19450 {
19451 rtx symF, symL;
19452
19453 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
19454 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
19455
19456 ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
19457 symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
19458
19459 emit_insn (gen_load_toc_v4_PIC_1 (symF));
19460 emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
19461 emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest, symL, symF));
19462 }
19463 else
19464 {
19465 rtx tocsym, lab;
19466
19467 tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
19468 lab = gen_label_rtx ();
19469 emit_insn (gen_load_toc_v4_PIC_1b (tocsym, lab));
19470 emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
19471 emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
19472 }
19473 emit_insn (gen_addsi3 (dest, temp0, dest));
19474 }
19475 else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
19476 {
19477 /* This is for AIX code running in non-PIC ELF32. */
19478 char buf[30];
19479 rtx realsym;
19480 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
19481 realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
19482
19483 emit_insn (gen_elf_high (dest, realsym));
19484 emit_insn (gen_elf_low (dest, dest, realsym));
19485 }
19486 else
19487 {
19488 gcc_assert (DEFAULT_ABI == ABI_AIX);
19489
19490 if (TARGET_32BIT)
19491 emit_insn (gen_load_toc_aix_si (dest));
19492 else
19493 emit_insn (gen_load_toc_aix_di (dest));
19494 }
19495 }
19496
19497 /* Emit instructions to restore the link register after determining where
19498 its value has been stored. */
19499
19500 void
19501 rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
19502 {
19503 rs6000_stack_t *info = rs6000_stack_info ();
19504 rtx operands[2];
19505
19506 operands[0] = source;
19507 operands[1] = scratch;
19508
19509 if (info->lr_save_p)
19510 {
19511 rtx frame_rtx = stack_pointer_rtx;
19512 HOST_WIDE_INT sp_offset = 0;
19513 rtx tmp;
19514
19515 if (frame_pointer_needed
19516 || cfun->calls_alloca
19517 || info->total_size > 32767)
19518 {
19519 tmp = gen_frame_mem (Pmode, frame_rtx);
19520 emit_move_insn (operands[1], tmp);
19521 frame_rtx = operands[1];
19522 }
19523 else if (info->push_p)
19524 sp_offset = info->total_size;
19525
19526 tmp = plus_constant (frame_rtx, info->lr_save_offset + sp_offset);
19527 tmp = gen_frame_mem (Pmode, tmp);
19528 emit_move_insn (tmp, operands[0]);
19529 }
19530 else
19531 emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO), operands[0]);
19532
19533 /* Freeze lr_save_p. We've just emitted rtl that depends on the
19534 state of lr_save_p so any change from here on would be a bug. In
19535 particular, stop rs6000_ra_ever_killed from considering the SET
19536 of lr we may have added just above. */
19537 cfun->machine->lr_save_state = info->lr_save_p + 1;
19538 }
19539
19540 static GTY(()) alias_set_type set = -1;
19541
19542 alias_set_type
19543 get_TOC_alias_set (void)
19544 {
19545 if (set == -1)
19546 set = new_alias_set ();
19547 return set;
19548 }
19549
19550 /* This returns nonzero if the current function uses the TOC. This is
19551 determined by the presence of (use (unspec ... UNSPEC_TOC)), which
19552 is generated by the ABI_V4 load_toc_* patterns. */
19553 #if TARGET_ELF
19554 static int
19555 uses_TOC (void)
19556 {
19557 rtx insn;
19558
19559 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
19560 if (INSN_P (insn))
19561 {
19562 rtx pat = PATTERN (insn);
19563 int i;
19564
19565 if (GET_CODE (pat) == PARALLEL)
19566 for (i = 0; i < XVECLEN (pat, 0); i++)
19567 {
19568 rtx sub = XVECEXP (pat, 0, i);
19569 if (GET_CODE (sub) == USE)
19570 {
19571 sub = XEXP (sub, 0);
19572 if (GET_CODE (sub) == UNSPEC
19573 && XINT (sub, 1) == UNSPEC_TOC)
19574 return 1;
19575 }
19576 }
19577 }
19578 return 0;
19579 }
19580 #endif
19581
19582 rtx
19583 create_TOC_reference (rtx symbol, rtx largetoc_reg)
19584 {
19585 rtx tocrel, tocreg;
19586
19587 if (TARGET_DEBUG_ADDR)
19588 {
19589 if (GET_CODE (symbol) == SYMBOL_REF)
19590 fprintf (stderr, "\ncreate_TOC_reference, (symbol_ref %s)\n",
19591 XSTR (symbol, 0));
19592 else
19593 {
19594 fprintf (stderr, "\ncreate_TOC_reference, code %s:\n",
19595 GET_RTX_NAME (GET_CODE (symbol)));
19596 debug_rtx (symbol);
19597 }
19598 }
19599
19600 if (!can_create_pseudo_p ())
19601 df_set_regs_ever_live (TOC_REGISTER, true);
19602
19603 tocrel = gen_rtx_CONST (Pmode,
19604 gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol),
19605 UNSPEC_TOCREL));
19606 tocreg = gen_rtx_REG (Pmode, TOC_REGISTER);
19607 if (TARGET_CMODEL != CMODEL_SMALL)
19608 {
19609 rtx hi = gen_rtx_PLUS (Pmode, tocreg, gen_rtx_HIGH (Pmode, tocrel));
19610 if (largetoc_reg != NULL)
19611 {
19612 emit_move_insn (largetoc_reg, hi);
19613 hi = largetoc_reg;
19614 }
19615 return gen_rtx_LO_SUM (Pmode, hi, copy_rtx (tocrel));
19616 }
19617 else
19618 return gen_rtx_PLUS (Pmode, tocreg, tocrel);
19619 }
19620
19621 /* Issue assembly directives that create a reference to the given DWARF
19622 FRAME_TABLE_LABEL from the current function section. */
19623 void
19624 rs6000_aix_asm_output_dwarf_table_ref (char * frame_table_label)
19625 {
19626 fprintf (asm_out_file, "\t.ref %s\n",
19627 TARGET_STRIP_NAME_ENCODING (frame_table_label));
19628 }
19629 \f
19630 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
19631 and the change to the stack pointer. */
19632
19633 static void
19634 rs6000_emit_stack_tie (void)
19635 {
19636 rtx mem = gen_frame_mem (BLKmode,
19637 gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
19638
19639 emit_insn (gen_stack_tie (mem));
19640 }
19641
19642 /* Emit the correct code for allocating stack space, as insns.
19643 If COPY_REG, make sure a copy of the old frame is left there.
19644 The generated code may use hard register 0 as a temporary. */
19645
19646 static void
19647 rs6000_emit_allocate_stack (HOST_WIDE_INT size, rtx copy_reg)
19648 {
19649 rtx insn;
19650 rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
19651 rtx tmp_reg = gen_rtx_REG (Pmode, 0);
19652 rtx todec = gen_int_mode (-size, Pmode);
19653 rtx par, set, mem;
19654
19655 if (INTVAL (todec) != -size)
19656 {
19657 warning (0, "stack frame too large");
19658 emit_insn (gen_trap ());
19659 return;
19660 }
19661
19662 if (crtl->limit_stack)
19663 {
19664 if (REG_P (stack_limit_rtx)
19665 && REGNO (stack_limit_rtx) > 1
19666 && REGNO (stack_limit_rtx) <= 31)
19667 {
19668 emit_insn (gen_add3_insn (tmp_reg, stack_limit_rtx, GEN_INT (size)));
19669 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
19670 const0_rtx));
19671 }
19672 else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
19673 && TARGET_32BIT
19674 && DEFAULT_ABI == ABI_V4)
19675 {
19676 rtx toload = gen_rtx_CONST (VOIDmode,
19677 gen_rtx_PLUS (Pmode,
19678 stack_limit_rtx,
19679 GEN_INT (size)));
19680
19681 emit_insn (gen_elf_high (tmp_reg, toload));
19682 emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
19683 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
19684 const0_rtx));
19685 }
19686 else
19687 warning (0, "stack limit expression is not supported");
19688 }
19689
19690 if (copy_reg)
19691 emit_move_insn (copy_reg, stack_reg);
19692
19693 if (size > 32767)
19694 {
19695 /* Need a note here so that try_split doesn't get confused. */
19696 if (get_last_insn () == NULL_RTX)
19697 emit_note (NOTE_INSN_DELETED);
19698 insn = emit_move_insn (tmp_reg, todec);
19699 try_split (PATTERN (insn), insn, 0);
19700 todec = tmp_reg;
19701 }
19702
19703 insn = emit_insn (TARGET_32BIT
19704 ? gen_movsi_update_stack (stack_reg, stack_reg,
19705 todec, stack_reg)
19706 : gen_movdi_di_update_stack (stack_reg, stack_reg,
19707 todec, stack_reg));
19708 /* Since we didn't use gen_frame_mem to generate the MEM, grab
19709 it now and set the alias set/attributes. The above gen_*_update
19710 calls will generate a PARALLEL with the MEM set being the first
19711 operation. */
19712 par = PATTERN (insn);
19713 gcc_assert (GET_CODE (par) == PARALLEL);
19714 set = XVECEXP (par, 0, 0);
19715 gcc_assert (GET_CODE (set) == SET);
19716 mem = SET_DEST (set);
19717 gcc_assert (MEM_P (mem));
19718 MEM_NOTRAP_P (mem) = 1;
19719 set_mem_alias_set (mem, get_frame_alias_set ());
19720
19721 RTX_FRAME_RELATED_P (insn) = 1;
19722 add_reg_note (insn, REG_FRAME_RELATED_EXPR,
19723 gen_rtx_SET (VOIDmode, stack_reg,
19724 gen_rtx_PLUS (Pmode, stack_reg,
19725 GEN_INT (-size))));
19726 }
19727
19728 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
19729
19730 #if PROBE_INTERVAL > 32768
19731 #error Cannot use indexed addressing mode for stack probing
19732 #endif
19733
19734 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
19735 inclusive. These are offsets from the current stack pointer. */
19736
19737 static void
19738 rs6000_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
19739 {
19740 /* See if we have a constant small number of probes to generate. If so,
19741 that's the easy case. */
19742 if (first + size <= 32768)
19743 {
19744 HOST_WIDE_INT i;
19745
19746 /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
19747 it exceeds SIZE. If only one probe is needed, this will not
19748 generate any code. Then probe at FIRST + SIZE. */
19749 for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
19750 emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + i)));
19751
19752 emit_stack_probe (plus_constant (stack_pointer_rtx, -(first + size)));
19753 }
19754
19755 /* Otherwise, do the same as above, but in a loop. Note that we must be
19756 extra careful with variables wrapping around because we might be at
19757 the very top (or the very bottom) of the address space and we have
19758 to be able to handle this case properly; in particular, we use an
19759 equality test for the loop condition. */
19760 else
19761 {
19762 HOST_WIDE_INT rounded_size;
19763 rtx r12 = gen_rtx_REG (Pmode, 12);
19764 rtx r0 = gen_rtx_REG (Pmode, 0);
19765
19766 /* Sanity check for the addressing mode we're going to use. */
19767 gcc_assert (first <= 32768);
19768
19769 /* Step 1: round SIZE to the previous multiple of the interval. */
19770
19771 rounded_size = size & -PROBE_INTERVAL;
19772
19773
19774 /* Step 2: compute initial and final value of the loop counter. */
19775
19776 /* TEST_ADDR = SP + FIRST. */
19777 emit_insn (gen_rtx_SET (VOIDmode, r12,
19778 plus_constant (stack_pointer_rtx, -first)));
19779
19780 /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE. */
19781 if (rounded_size > 32768)
19782 {
19783 emit_move_insn (r0, GEN_INT (-rounded_size));
19784 emit_insn (gen_rtx_SET (VOIDmode, r0,
19785 gen_rtx_PLUS (Pmode, r12, r0)));
19786 }
19787 else
19788 emit_insn (gen_rtx_SET (VOIDmode, r0,
19789 plus_constant (r12, -rounded_size)));
19790
19791
19792 /* Step 3: the loop
19793
19794 while (TEST_ADDR != LAST_ADDR)
19795 {
19796 TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
19797 probe at TEST_ADDR
19798 }
19799
19800 probes at FIRST + N * PROBE_INTERVAL for values of N from 1
19801 until it is equal to ROUNDED_SIZE. */
19802
19803 if (TARGET_64BIT)
19804 emit_insn (gen_probe_stack_rangedi (r12, r12, r0));
19805 else
19806 emit_insn (gen_probe_stack_rangesi (r12, r12, r0));
19807
19808
19809 /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
19810 that SIZE is equal to ROUNDED_SIZE. */
19811
19812 if (size != rounded_size)
19813 emit_stack_probe (plus_constant (r12, rounded_size - size));
19814 }
19815 }
19816
19817 /* Probe a range of stack addresses from REG1 to REG2 inclusive. These are
19818 absolute addresses. */
19819
19820 const char *
19821 output_probe_stack_range (rtx reg1, rtx reg2)
19822 {
19823 static int labelno = 0;
19824 char loop_lab[32], end_lab[32];
19825 rtx xops[2];
19826
19827 ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
19828 ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
19829
19830 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
19831
19832 /* Jump to END_LAB if TEST_ADDR == LAST_ADDR. */
19833 xops[0] = reg1;
19834 xops[1] = reg2;
19835 if (TARGET_64BIT)
19836 output_asm_insn ("{cmp|cmpd} 0,%0,%1", xops);
19837 else
19838 output_asm_insn ("{cmp|cmpw} 0,%0,%1", xops);
19839
19840 fputs ("\tbeq 0,", asm_out_file);
19841 assemble_name_raw (asm_out_file, end_lab);
19842 fputc ('\n', asm_out_file);
19843
19844 /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL. */
19845 xops[1] = GEN_INT (-PROBE_INTERVAL);
19846 output_asm_insn ("{cal %0,%1(%0)|addi %0,%0,%1}", xops);
19847
19848 /* Probe at TEST_ADDR and branch. */
19849 output_asm_insn ("{st|stw} 0,0(%0)", xops);
19850 fprintf (asm_out_file, "\tb ");
19851 assemble_name_raw (asm_out_file, loop_lab);
19852 fputc ('\n', asm_out_file);
19853
19854 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
19855
19856 return "";
19857 }
19858
19859 /* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
19860 with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
19861 is not NULL. It would be nice if dwarf2out_frame_debug_expr could
19862 deduce these equivalences by itself so it wasn't necessary to hold
19863 its hand so much. */
19864
19865 static void
19866 rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
19867 rtx reg2, rtx rreg)
19868 {
19869 rtx real, temp;
19870
19871 /* copy_rtx will not make unique copies of registers, so we need to
19872 ensure we don't have unwanted sharing here. */
19873 if (reg == reg2)
19874 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
19875
19876 if (reg == rreg)
19877 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
19878
19879 real = copy_rtx (PATTERN (insn));
19880
19881 if (reg2 != NULL_RTX)
19882 real = replace_rtx (real, reg2, rreg);
19883
19884 real = replace_rtx (real, reg,
19885 gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
19886 STACK_POINTER_REGNUM),
19887 GEN_INT (val)));
19888
19889 /* We expect that 'real' is either a SET or a PARALLEL containing
19890 SETs (and possibly other stuff). In a PARALLEL, all the SETs
19891 are important so they all have to be marked RTX_FRAME_RELATED_P. */
19892
19893 if (GET_CODE (real) == SET)
19894 {
19895 rtx set = real;
19896
19897 temp = simplify_rtx (SET_SRC (set));
19898 if (temp)
19899 SET_SRC (set) = temp;
19900 temp = simplify_rtx (SET_DEST (set));
19901 if (temp)
19902 SET_DEST (set) = temp;
19903 if (GET_CODE (SET_DEST (set)) == MEM)
19904 {
19905 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
19906 if (temp)
19907 XEXP (SET_DEST (set), 0) = temp;
19908 }
19909 }
19910 else
19911 {
19912 int i;
19913
19914 gcc_assert (GET_CODE (real) == PARALLEL);
19915 for (i = 0; i < XVECLEN (real, 0); i++)
19916 if (GET_CODE (XVECEXP (real, 0, i)) == SET)
19917 {
19918 rtx set = XVECEXP (real, 0, i);
19919
19920 temp = simplify_rtx (SET_SRC (set));
19921 if (temp)
19922 SET_SRC (set) = temp;
19923 temp = simplify_rtx (SET_DEST (set));
19924 if (temp)
19925 SET_DEST (set) = temp;
19926 if (GET_CODE (SET_DEST (set)) == MEM)
19927 {
19928 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
19929 if (temp)
19930 XEXP (SET_DEST (set), 0) = temp;
19931 }
19932 RTX_FRAME_RELATED_P (set) = 1;
19933 }
19934 }
19935
19936 RTX_FRAME_RELATED_P (insn) = 1;
19937 add_reg_note (insn, REG_FRAME_RELATED_EXPR, real);
19938 }
19939
19940 /* Returns an insn that has a vrsave set operation with the
19941 appropriate CLOBBERs. */
19942
19943 static rtx
19944 generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
19945 {
19946 int nclobs, i;
19947 rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
19948 rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
19949
19950 clobs[0]
19951 = gen_rtx_SET (VOIDmode,
19952 vrsave,
19953 gen_rtx_UNSPEC_VOLATILE (SImode,
19954 gen_rtvec (2, reg, vrsave),
19955 UNSPECV_SET_VRSAVE));
19956
19957 nclobs = 1;
19958
19959 /* We need to clobber the registers in the mask so the scheduler
19960 does not move sets to VRSAVE before sets of AltiVec registers.
19961
19962 However, if the function receives nonlocal gotos, reload will set
19963 all call saved registers live. We will end up with:
19964
19965 (set (reg 999) (mem))
19966 (parallel [ (set (reg vrsave) (unspec blah))
19967 (clobber (reg 999))])
19968
19969 The clobber will cause the store into reg 999 to be dead, and
19970 flow will attempt to delete an epilogue insn. In this case, we
19971 need an unspec use/set of the register. */
19972
19973 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
19974 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
19975 {
19976 if (!epiloguep || call_used_regs [i])
19977 clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
19978 gen_rtx_REG (V4SImode, i));
19979 else
19980 {
19981 rtx reg = gen_rtx_REG (V4SImode, i);
19982
19983 clobs[nclobs++]
19984 = gen_rtx_SET (VOIDmode,
19985 reg,
19986 gen_rtx_UNSPEC (V4SImode,
19987 gen_rtvec (1, reg), 27));
19988 }
19989 }
19990
19991 insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
19992
19993 for (i = 0; i < nclobs; ++i)
19994 XVECEXP (insn, 0, i) = clobs[i];
19995
19996 return insn;
19997 }
19998
19999 /* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
20000 Save REGNO into [FRAME_REG + OFFSET] in mode MODE. */
20001
20002 static void
20003 emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
20004 unsigned int regno, int offset, HOST_WIDE_INT total_size)
20005 {
20006 rtx reg, offset_rtx, insn, mem, addr, int_rtx;
20007 rtx replacea, replaceb;
20008
20009 int_rtx = GEN_INT (offset);
20010
20011 /* Some cases that need register indexed addressing. */
20012 if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
20013 || (TARGET_VSX && VSX_VECTOR_MODE (mode))
20014 || (TARGET_E500_DOUBLE && mode == DFmode)
20015 || (TARGET_SPE_ABI
20016 && SPE_VECTOR_MODE (mode)
20017 && !SPE_CONST_OFFSET_OK (offset)))
20018 {
20019 /* Whomever calls us must make sure r11 is available in the
20020 flow path of instructions in the prologue. */
20021 offset_rtx = gen_rtx_REG (Pmode, 11);
20022 emit_move_insn (offset_rtx, int_rtx);
20023
20024 replacea = offset_rtx;
20025 replaceb = int_rtx;
20026 }
20027 else
20028 {
20029 offset_rtx = int_rtx;
20030 replacea = NULL_RTX;
20031 replaceb = NULL_RTX;
20032 }
20033
20034 reg = gen_rtx_REG (mode, regno);
20035 addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
20036 mem = gen_frame_mem (mode, addr);
20037
20038 insn = emit_move_insn (mem, reg);
20039
20040 rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
20041 }
20042
20043 /* Emit an offset memory reference suitable for a frame store, while
20044 converting to a valid addressing mode. */
20045
20046 static rtx
20047 gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
20048 {
20049 rtx int_rtx, offset_rtx;
20050
20051 int_rtx = GEN_INT (offset);
20052
20053 if ((TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
20054 || (TARGET_E500_DOUBLE && mode == DFmode))
20055 {
20056 offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
20057 emit_move_insn (offset_rtx, int_rtx);
20058 }
20059 else
20060 offset_rtx = int_rtx;
20061
20062 return gen_frame_mem (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
20063 }
20064
20065 /* Look for user-defined global regs. We should not save and restore these,
20066 and cannot use stmw/lmw if there are any in its range. */
20067
20068 static bool
20069 no_global_regs_above (int first, bool gpr)
20070 {
20071 int i;
20072 int last = gpr ? 32 : 64;
20073 for (i = first; i < last; i++)
20074 if (global_regs[i])
20075 return false;
20076 return true;
20077 }
20078
20079 #ifndef TARGET_FIX_AND_CONTINUE
20080 #define TARGET_FIX_AND_CONTINUE 0
20081 #endif
20082
20083 /* It's really GPR 13 and FPR 14, but we need the smaller of the two. */
20084 #define FIRST_SAVRES_REGISTER FIRST_SAVED_GP_REGNO
20085 #define LAST_SAVRES_REGISTER 31
20086 #define N_SAVRES_REGISTERS (LAST_SAVRES_REGISTER - FIRST_SAVRES_REGISTER + 1)
20087
20088 static GTY(()) rtx savres_routine_syms[N_SAVRES_REGISTERS][8];
20089
20090 /* Temporary holding space for an out-of-line register save/restore
20091 routine name. */
20092 static char savres_routine_name[30];
20093
20094 /* Return the name for an out-of-line register save/restore routine.
20095 We are saving/restoring GPRs if GPR is true. */
20096
20097 static char *
20098 rs6000_savres_routine_name (rs6000_stack_t *info, int regno,
20099 bool savep, bool gpr, bool lr)
20100 {
20101 const char *prefix = "";
20102 const char *suffix = "";
20103
20104 /* Different targets are supposed to define
20105 {SAVE,RESTORE}_FP_{PREFIX,SUFFIX} with the idea that the needed
20106 routine name could be defined with:
20107
20108 sprintf (name, "%s%d%s", SAVE_FP_PREFIX, regno, SAVE_FP_SUFFIX)
20109
20110 This is a nice idea in practice, but in reality, things are
20111 complicated in several ways:
20112
20113 - ELF targets have save/restore routines for GPRs.
20114
20115 - SPE targets use different prefixes for 32/64-bit registers, and
20116 neither of them fit neatly in the FOO_{PREFIX,SUFFIX} regimen.
20117
20118 - PPC64 ELF targets have routines for save/restore of GPRs that
20119 differ in what they do with the link register, so having a set
20120 prefix doesn't work. (We only use one of the save routines at
20121 the moment, though.)
20122
20123 - PPC32 elf targets have "exit" versions of the restore routines
20124 that restore the link register and can save some extra space.
20125 These require an extra suffix. (There are also "tail" versions
20126 of the restore routines and "GOT" versions of the save routines,
20127 but we don't generate those at present. Same problems apply,
20128 though.)
20129
20130 We deal with all this by synthesizing our own prefix/suffix and
20131 using that for the simple sprintf call shown above. */
20132 if (TARGET_SPE)
20133 {
20134 /* No floating point saves on the SPE. */
20135 gcc_assert (gpr);
20136
20137 if (savep)
20138 prefix = info->spe_64bit_regs_used ? "_save64gpr_" : "_save32gpr_";
20139 else
20140 prefix = info->spe_64bit_regs_used ? "_rest64gpr_" : "_rest32gpr_";
20141
20142 if (lr)
20143 suffix = "_x";
20144 }
20145 else if (DEFAULT_ABI == ABI_V4)
20146 {
20147 if (TARGET_64BIT)
20148 goto aix_names;
20149
20150 if (gpr)
20151 prefix = savep ? "_savegpr_" : "_restgpr_";
20152 else
20153 prefix = savep ? "_savefpr_" : "_restfpr_";
20154
20155 if (lr)
20156 suffix = "_x";
20157 }
20158 else if (DEFAULT_ABI == ABI_AIX)
20159 {
20160 #ifndef POWERPC_LINUX
20161 /* No out-of-line save/restore routines for GPRs on AIX. */
20162 gcc_assert (!TARGET_AIX || !gpr);
20163 #endif
20164
20165 aix_names:
20166 if (gpr)
20167 prefix = (savep
20168 ? (lr ? "_savegpr0_" : "_savegpr1_")
20169 : (lr ? "_restgpr0_" : "_restgpr1_"));
20170 #ifdef POWERPC_LINUX
20171 else if (lr)
20172 prefix = (savep ? "_savefpr_" : "_restfpr_");
20173 #endif
20174 else
20175 {
20176 prefix = savep ? SAVE_FP_PREFIX : RESTORE_FP_PREFIX;
20177 suffix = savep ? SAVE_FP_SUFFIX : RESTORE_FP_SUFFIX;
20178 }
20179 }
20180 else if (DEFAULT_ABI == ABI_DARWIN)
20181 sorry ("out-of-line save/restore routines not supported on Darwin");
20182
20183 sprintf (savres_routine_name, "%s%d%s", prefix, regno, suffix);
20184
20185 return savres_routine_name;
20186 }
20187
20188 /* Return an RTL SYMBOL_REF for an out-of-line register save/restore routine.
20189 We are saving/restoring GPRs if GPR is true. */
20190
20191 static rtx
20192 rs6000_savres_routine_sym (rs6000_stack_t *info, bool savep,
20193 bool gpr, bool lr)
20194 {
20195 int regno = gpr ? info->first_gp_reg_save : (info->first_fp_reg_save - 32);
20196 rtx sym;
20197 int select = ((savep ? 1 : 0) << 2
20198 | ((TARGET_SPE_ABI
20199 /* On the SPE, we never have any FPRs, but we do have
20200 32/64-bit versions of the routines. */
20201 ? (info->spe_64bit_regs_used ? 1 : 0)
20202 : (gpr ? 1 : 0)) << 1)
20203 | (lr ? 1: 0));
20204
20205 /* Don't generate bogus routine names. */
20206 gcc_assert (FIRST_SAVRES_REGISTER <= regno
20207 && regno <= LAST_SAVRES_REGISTER);
20208
20209 sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select];
20210
20211 if (sym == NULL)
20212 {
20213 char *name;
20214
20215 name = rs6000_savres_routine_name (info, regno, savep, gpr, lr);
20216
20217 sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select]
20218 = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
20219 SYMBOL_REF_FLAGS (sym) |= SYMBOL_FLAG_FUNCTION;
20220 }
20221
20222 return sym;
20223 }
20224
20225 /* Emit a sequence of insns, including a stack tie if needed, for
20226 resetting the stack pointer. If SAVRES is true, then don't reset the
20227 stack pointer, but move the base of the frame into r11 for use by
20228 out-of-line register restore routines. */
20229
20230 static rtx
20231 rs6000_emit_stack_reset (rs6000_stack_t *info,
20232 rtx sp_reg_rtx, rtx frame_reg_rtx,
20233 int sp_offset, bool savres)
20234 {
20235 /* This blockage is needed so that sched doesn't decide to move
20236 the sp change before the register restores. */
20237 if (frame_reg_rtx != sp_reg_rtx
20238 || (TARGET_SPE_ABI
20239 && info->spe_64bit_regs_used != 0
20240 && info->first_gp_reg_save != 32))
20241 rs6000_emit_stack_tie ();
20242
20243 if (frame_reg_rtx != sp_reg_rtx)
20244 {
20245 if (sp_offset != 0)
20246 {
20247 rtx dest_reg = savres ? gen_rtx_REG (Pmode, 11) : sp_reg_rtx;
20248 return emit_insn (gen_add3_insn (dest_reg, frame_reg_rtx,
20249 GEN_INT (sp_offset)));
20250 }
20251 else if (!savres)
20252 return emit_move_insn (sp_reg_rtx, frame_reg_rtx);
20253 }
20254 else if (sp_offset != 0)
20255 {
20256 /* If we are restoring registers out-of-line, we will be using the
20257 "exit" variants of the restore routines, which will reset the
20258 stack for us. But we do need to point r11 into the right place
20259 for those routines. */
20260 rtx dest_reg = (savres
20261 ? gen_rtx_REG (Pmode, 11)
20262 : sp_reg_rtx);
20263
20264 rtx insn = emit_insn (gen_add3_insn (dest_reg, sp_reg_rtx,
20265 GEN_INT (sp_offset)));
20266 if (!savres)
20267 return insn;
20268 }
20269 return NULL_RTX;
20270 }
20271
20272 /* Construct a parallel rtx describing the effect of a call to an
20273 out-of-line register save/restore routine. */
20274
20275 static rtx
20276 rs6000_make_savres_rtx (rs6000_stack_t *info,
20277 rtx frame_reg_rtx, int save_area_offset,
20278 enum machine_mode reg_mode,
20279 bool savep, bool gpr, bool lr)
20280 {
20281 int i;
20282 int offset, start_reg, end_reg, n_regs;
20283 int reg_size = GET_MODE_SIZE (reg_mode);
20284 rtx sym;
20285 rtvec p;
20286
20287 offset = 0;
20288 start_reg = (gpr
20289 ? info->first_gp_reg_save
20290 : info->first_fp_reg_save);
20291 end_reg = gpr ? 32 : 64;
20292 n_regs = end_reg - start_reg;
20293 p = rtvec_alloc ((lr ? 4 : 3) + n_regs);
20294
20295 if (!savep && lr)
20296 RTVEC_ELT (p, offset++) = gen_rtx_RETURN (VOIDmode);
20297
20298 RTVEC_ELT (p, offset++)
20299 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 65));
20300
20301 sym = rs6000_savres_routine_sym (info, savep, gpr, lr);
20302 RTVEC_ELT (p, offset++) = gen_rtx_USE (VOIDmode, sym);
20303 RTVEC_ELT (p, offset++)
20304 = gen_rtx_USE (VOIDmode,
20305 gen_rtx_REG (Pmode, DEFAULT_ABI != ABI_AIX ? 11
20306 : gpr && !lr ? 12
20307 : 1));
20308
20309 for (i = 0; i < end_reg - start_reg; i++)
20310 {
20311 rtx addr, reg, mem;
20312 reg = gen_rtx_REG (reg_mode, start_reg + i);
20313 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20314 GEN_INT (save_area_offset + reg_size*i));
20315 mem = gen_frame_mem (reg_mode, addr);
20316
20317 RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode,
20318 savep ? mem : reg,
20319 savep ? reg : mem);
20320 }
20321
20322 if (savep && lr)
20323 {
20324 rtx addr, reg, mem;
20325 reg = gen_rtx_REG (Pmode, 0);
20326 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20327 GEN_INT (info->lr_save_offset));
20328 mem = gen_frame_mem (Pmode, addr);
20329 RTVEC_ELT (p, i + offset) = gen_rtx_SET (VOIDmode, mem, reg);
20330 }
20331
20332 return gen_rtx_PARALLEL (VOIDmode, p);
20333 }
20334
20335 /* Determine whether the gp REG is really used. */
20336
20337 static bool
20338 rs6000_reg_live_or_pic_offset_p (int reg)
20339 {
20340 /* If the function calls eh_return, claim used all the registers that would
20341 be checked for liveness otherwise. This is required for the PIC offset
20342 register with -mminimal-toc on AIX, as it is advertised as "fixed" for
20343 register allocation purposes in this case. */
20344
20345 return (((crtl->calls_eh_return || df_regs_ever_live_p (reg))
20346 && (!call_used_regs[reg]
20347 || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
20348 && !TARGET_SINGLE_PIC_BASE
20349 && TARGET_TOC && TARGET_MINIMAL_TOC)))
20350 || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
20351 && !TARGET_SINGLE_PIC_BASE
20352 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
20353 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))));
20354 }
20355
20356 /* Emit function prologue as insns. */
20357
20358 void
20359 rs6000_emit_prologue (void)
20360 {
20361 rs6000_stack_t *info = rs6000_stack_info ();
20362 enum machine_mode reg_mode = Pmode;
20363 int reg_size = TARGET_32BIT ? 4 : 8;
20364 rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
20365 rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
20366 rtx frame_reg_rtx = sp_reg_rtx;
20367 rtx cr_save_rtx = NULL_RTX;
20368 rtx insn;
20369 int strategy;
20370 int saving_FPRs_inline;
20371 int saving_GPRs_inline;
20372 int using_store_multiple;
20373 int using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
20374 && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
20375 && call_used_regs[STATIC_CHAIN_REGNUM]);
20376 HOST_WIDE_INT sp_offset = 0;
20377
20378 if (flag_stack_usage)
20379 current_function_static_stack_size = info->total_size;
20380
20381 if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK && info->total_size)
20382 rs6000_emit_probe_stack_range (STACK_CHECK_PROTECT, info->total_size);
20383
20384 if (TARGET_FIX_AND_CONTINUE)
20385 {
20386 /* gdb on darwin arranges to forward a function from the old
20387 address by modifying the first 5 instructions of the function
20388 to branch to the overriding function. This is necessary to
20389 permit function pointers that point to the old function to
20390 actually forward to the new function. */
20391 emit_insn (gen_nop ());
20392 emit_insn (gen_nop ());
20393 emit_insn (gen_nop ());
20394 emit_insn (gen_nop ());
20395 emit_insn (gen_nop ());
20396 }
20397
20398 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
20399 {
20400 reg_mode = V2SImode;
20401 reg_size = 8;
20402 }
20403
20404 strategy = info->savres_strategy;
20405 using_store_multiple = strategy & SAVRES_MULTIPLE;
20406 saving_FPRs_inline = strategy & SAVE_INLINE_FPRS;
20407 saving_GPRs_inline = strategy & SAVE_INLINE_GPRS;
20408
20409 /* For V.4, update stack before we do any saving and set back pointer. */
20410 if (! WORLD_SAVE_P (info)
20411 && info->push_p
20412 && (DEFAULT_ABI == ABI_V4
20413 || crtl->calls_eh_return))
20414 {
20415 bool need_r11 = (TARGET_SPE
20416 ? (!saving_GPRs_inline
20417 && info->spe_64bit_regs_used == 0)
20418 : (!saving_FPRs_inline || !saving_GPRs_inline));
20419 rtx copy_reg = need_r11 ? gen_rtx_REG (Pmode, 11) : NULL;
20420
20421 if (info->total_size < 32767)
20422 sp_offset = info->total_size;
20423 else if (need_r11)
20424 frame_reg_rtx = copy_reg;
20425 else if (info->cr_save_p
20426 || info->lr_save_p
20427 || info->first_fp_reg_save < 64
20428 || info->first_gp_reg_save < 32
20429 || info->altivec_size != 0
20430 || info->vrsave_mask != 0
20431 || crtl->calls_eh_return)
20432 {
20433 copy_reg = frame_ptr_rtx;
20434 frame_reg_rtx = copy_reg;
20435 }
20436 else
20437 {
20438 /* The prologue won't be saving any regs so there is no need
20439 to set up a frame register to access any frame save area.
20440 We also won't be using sp_offset anywhere below, but set
20441 the correct value anyway to protect against future
20442 changes to this function. */
20443 sp_offset = info->total_size;
20444 }
20445 rs6000_emit_allocate_stack (info->total_size, copy_reg);
20446 if (frame_reg_rtx != sp_reg_rtx)
20447 rs6000_emit_stack_tie ();
20448 }
20449
20450 /* Handle world saves specially here. */
20451 if (WORLD_SAVE_P (info))
20452 {
20453 int i, j, sz;
20454 rtx treg;
20455 rtvec p;
20456 rtx reg0;
20457
20458 /* save_world expects lr in r0. */
20459 reg0 = gen_rtx_REG (Pmode, 0);
20460 if (info->lr_save_p)
20461 {
20462 insn = emit_move_insn (reg0,
20463 gen_rtx_REG (Pmode, LR_REGNO));
20464 RTX_FRAME_RELATED_P (insn) = 1;
20465 }
20466
20467 /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
20468 assumptions about the offsets of various bits of the stack
20469 frame. */
20470 gcc_assert (info->gp_save_offset == -220
20471 && info->fp_save_offset == -144
20472 && info->lr_save_offset == 8
20473 && info->cr_save_offset == 4
20474 && info->push_p
20475 && info->lr_save_p
20476 && (!crtl->calls_eh_return
20477 || info->ehrd_offset == -432)
20478 && info->vrsave_save_offset == -224
20479 && info->altivec_save_offset == -416);
20480
20481 treg = gen_rtx_REG (SImode, 11);
20482 emit_move_insn (treg, GEN_INT (-info->total_size));
20483
20484 /* SAVE_WORLD takes the caller's LR in R0 and the frame size
20485 in R11. It also clobbers R12, so beware! */
20486
20487 /* Preserve CR2 for save_world prologues */
20488 sz = 5;
20489 sz += 32 - info->first_gp_reg_save;
20490 sz += 64 - info->first_fp_reg_save;
20491 sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
20492 p = rtvec_alloc (sz);
20493 j = 0;
20494 RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode,
20495 gen_rtx_REG (SImode,
20496 LR_REGNO));
20497 RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
20498 gen_rtx_SYMBOL_REF (Pmode,
20499 "*save_world"));
20500 /* We do floats first so that the instruction pattern matches
20501 properly. */
20502 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
20503 {
20504 rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20505 ? DFmode : SFmode),
20506 info->first_fp_reg_save + i);
20507 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20508 GEN_INT (info->fp_save_offset
20509 + sp_offset + 8 * i));
20510 rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20511 ? DFmode : SFmode), addr);
20512
20513 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20514 }
20515 for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
20516 {
20517 rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
20518 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20519 GEN_INT (info->altivec_save_offset
20520 + sp_offset + 16 * i));
20521 rtx mem = gen_frame_mem (V4SImode, addr);
20522
20523 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20524 }
20525 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20526 {
20527 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20528 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20529 GEN_INT (info->gp_save_offset
20530 + sp_offset + reg_size * i));
20531 rtx mem = gen_frame_mem (reg_mode, addr);
20532
20533 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20534 }
20535
20536 {
20537 /* CR register traditionally saved as CR2. */
20538 rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
20539 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20540 GEN_INT (info->cr_save_offset
20541 + sp_offset));
20542 rtx mem = gen_frame_mem (reg_mode, addr);
20543
20544 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
20545 }
20546 /* Explain about use of R0. */
20547 if (info->lr_save_p)
20548 {
20549 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20550 GEN_INT (info->lr_save_offset
20551 + sp_offset));
20552 rtx mem = gen_frame_mem (reg_mode, addr);
20553
20554 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg0);
20555 }
20556 /* Explain what happens to the stack pointer. */
20557 {
20558 rtx newval = gen_rtx_PLUS (Pmode, sp_reg_rtx, treg);
20559 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, sp_reg_rtx, newval);
20560 }
20561
20562 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20563 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20564 treg, GEN_INT (-info->total_size));
20565 sp_offset = info->total_size;
20566 }
20567
20568 /* If we use the link register, get it into r0. */
20569 if (!WORLD_SAVE_P (info) && info->lr_save_p)
20570 {
20571 rtx addr, reg, mem;
20572
20573 insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
20574 gen_rtx_REG (Pmode, LR_REGNO));
20575 RTX_FRAME_RELATED_P (insn) = 1;
20576
20577 if (!(strategy & (SAVE_NOINLINE_GPRS_SAVES_LR
20578 | SAVE_NOINLINE_FPRS_SAVES_LR)))
20579 {
20580 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20581 GEN_INT (info->lr_save_offset + sp_offset));
20582 reg = gen_rtx_REG (Pmode, 0);
20583 mem = gen_rtx_MEM (Pmode, addr);
20584 /* This should not be of rs6000_sr_alias_set, because of
20585 __builtin_return_address. */
20586
20587 insn = emit_move_insn (mem, reg);
20588 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20589 NULL_RTX, NULL_RTX);
20590 }
20591 }
20592
20593 /* If we need to save CR, put it into r12 or r11. */
20594 if (!WORLD_SAVE_P (info) && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
20595 {
20596 rtx set;
20597
20598 cr_save_rtx
20599 = gen_rtx_REG (SImode, DEFAULT_ABI == ABI_AIX && !saving_GPRs_inline
20600 ? 11 : 12);
20601 insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
20602 RTX_FRAME_RELATED_P (insn) = 1;
20603 /* Now, there's no way that dwarf2out_frame_debug_expr is going
20604 to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
20605 But that's OK. All we have to do is specify that _one_ condition
20606 code register is saved in this stack slot. The thrower's epilogue
20607 will then restore all the call-saved registers.
20608 We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux. */
20609 set = gen_rtx_SET (VOIDmode, cr_save_rtx,
20610 gen_rtx_REG (SImode, CR2_REGNO));
20611 add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
20612 }
20613
20614 /* Do any required saving of fpr's. If only one or two to save, do
20615 it ourselves. Otherwise, call function. */
20616 if (!WORLD_SAVE_P (info) && saving_FPRs_inline)
20617 {
20618 int i;
20619 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
20620 if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
20621 && ! call_used_regs[info->first_fp_reg_save+i]))
20622 emit_frame_save (frame_reg_rtx, frame_ptr_rtx,
20623 (TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
20624 ? DFmode : SFmode,
20625 info->first_fp_reg_save + i,
20626 info->fp_save_offset + sp_offset + 8 * i,
20627 info->total_size);
20628 }
20629 else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
20630 {
20631 rtx par;
20632
20633 par = rs6000_make_savres_rtx (info, frame_reg_rtx,
20634 info->fp_save_offset + sp_offset,
20635 DFmode,
20636 /*savep=*/true, /*gpr=*/false,
20637 /*lr=*/(strategy
20638 & SAVE_NOINLINE_FPRS_SAVES_LR)
20639 != 0);
20640 insn = emit_insn (par);
20641 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20642 NULL_RTX, NULL_RTX);
20643 }
20644
20645 /* Save GPRs. This is done as a PARALLEL if we are using
20646 the store-multiple instructions. */
20647 if (!WORLD_SAVE_P (info)
20648 && TARGET_SPE_ABI
20649 && info->spe_64bit_regs_used != 0
20650 && info->first_gp_reg_save != 32)
20651 {
20652 int i;
20653 rtx spe_save_area_ptr;
20654
20655 /* Determine whether we can address all of the registers that need
20656 to be saved with an offset from the stack pointer that fits in
20657 the small const field for SPE memory instructions. */
20658 int spe_regs_addressable_via_sp
20659 = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
20660 + (32 - info->first_gp_reg_save - 1) * reg_size)
20661 && saving_GPRs_inline);
20662 int spe_offset;
20663
20664 if (spe_regs_addressable_via_sp)
20665 {
20666 spe_save_area_ptr = frame_reg_rtx;
20667 spe_offset = info->spe_gp_save_offset + sp_offset;
20668 }
20669 else
20670 {
20671 /* Make r11 point to the start of the SPE save area. We need
20672 to be careful here if r11 is holding the static chain. If
20673 it is, then temporarily save it in r0. We would use r0 as
20674 our base register here, but using r0 as a base register in
20675 loads and stores means something different from what we
20676 would like. */
20677 int ool_adjust = (saving_GPRs_inline
20678 ? 0
20679 : (info->first_gp_reg_save
20680 - (FIRST_SAVRES_REGISTER+1))*8);
20681 HOST_WIDE_INT offset = (info->spe_gp_save_offset
20682 + sp_offset - ool_adjust);
20683
20684 if (using_static_chain_p)
20685 {
20686 rtx r0 = gen_rtx_REG (Pmode, 0);
20687 gcc_assert (info->first_gp_reg_save > 11);
20688
20689 emit_move_insn (r0, gen_rtx_REG (Pmode, 11));
20690 }
20691
20692 spe_save_area_ptr = gen_rtx_REG (Pmode, 11);
20693 insn = emit_insn (gen_addsi3 (spe_save_area_ptr,
20694 frame_reg_rtx,
20695 GEN_INT (offset)));
20696 /* We need to make sure the move to r11 gets noted for
20697 properly outputting unwind information. */
20698 if (!saving_GPRs_inline)
20699 rs6000_frame_related (insn, frame_reg_rtx, offset,
20700 NULL_RTX, NULL_RTX);
20701 spe_offset = 0;
20702 }
20703
20704 if (saving_GPRs_inline)
20705 {
20706 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20707 if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
20708 {
20709 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20710 rtx offset, addr, mem;
20711
20712 /* We're doing all this to ensure that the offset fits into
20713 the immediate offset of 'evstdd'. */
20714 gcc_assert (SPE_CONST_OFFSET_OK (reg_size * i + spe_offset));
20715
20716 offset = GEN_INT (reg_size * i + spe_offset);
20717 addr = gen_rtx_PLUS (Pmode, spe_save_area_ptr, offset);
20718 mem = gen_rtx_MEM (V2SImode, addr);
20719
20720 insn = emit_move_insn (mem, reg);
20721
20722 rs6000_frame_related (insn, spe_save_area_ptr,
20723 info->spe_gp_save_offset
20724 + sp_offset + reg_size * i,
20725 offset, const0_rtx);
20726 }
20727 }
20728 else
20729 {
20730 rtx par;
20731
20732 par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
20733 0, reg_mode,
20734 /*savep=*/true, /*gpr=*/true,
20735 /*lr=*/false);
20736 insn = emit_insn (par);
20737 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20738 NULL_RTX, NULL_RTX);
20739 }
20740
20741
20742 /* Move the static chain pointer back. */
20743 if (using_static_chain_p && !spe_regs_addressable_via_sp)
20744 emit_move_insn (gen_rtx_REG (Pmode, 11), gen_rtx_REG (Pmode, 0));
20745 }
20746 else if (!WORLD_SAVE_P (info) && !saving_GPRs_inline)
20747 {
20748 rtx par;
20749
20750 /* Need to adjust r11 (r12) if we saved any FPRs. */
20751 if (info->first_fp_reg_save != 64)
20752 {
20753 rtx dest_reg = gen_rtx_REG (reg_mode, DEFAULT_ABI == ABI_AIX
20754 ? 12 : 11);
20755 rtx offset = GEN_INT (sp_offset
20756 + (-8 * (64-info->first_fp_reg_save)));
20757 emit_insn (gen_add3_insn (dest_reg, frame_reg_rtx, offset));
20758 }
20759
20760 par = rs6000_make_savres_rtx (info, frame_reg_rtx,
20761 info->gp_save_offset + sp_offset,
20762 reg_mode,
20763 /*savep=*/true, /*gpr=*/true,
20764 /*lr=*/(strategy
20765 & SAVE_NOINLINE_GPRS_SAVES_LR)
20766 != 0);
20767 insn = emit_insn (par);
20768 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20769 NULL_RTX, NULL_RTX);
20770 }
20771 else if (!WORLD_SAVE_P (info) && using_store_multiple)
20772 {
20773 rtvec p;
20774 int i;
20775 p = rtvec_alloc (32 - info->first_gp_reg_save);
20776 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20777 {
20778 rtx addr, reg, mem;
20779 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20780 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20781 GEN_INT (info->gp_save_offset
20782 + sp_offset
20783 + reg_size * i));
20784 mem = gen_frame_mem (reg_mode, addr);
20785
20786 RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
20787 }
20788 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
20789 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20790 NULL_RTX, NULL_RTX);
20791 }
20792 else if (!WORLD_SAVE_P (info))
20793 {
20794 int i;
20795 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
20796 if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
20797 {
20798 rtx addr, reg, mem;
20799 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
20800
20801 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20802 GEN_INT (info->gp_save_offset
20803 + sp_offset
20804 + reg_size * i));
20805 mem = gen_frame_mem (reg_mode, addr);
20806
20807 insn = emit_move_insn (mem, reg);
20808 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20809 NULL_RTX, NULL_RTX);
20810 }
20811 }
20812
20813 /* ??? There's no need to emit actual instructions here, but it's the
20814 easiest way to get the frame unwind information emitted. */
20815 if (crtl->calls_eh_return)
20816 {
20817 unsigned int i, regno;
20818
20819 for (i = 0; ; ++i)
20820 {
20821 regno = EH_RETURN_DATA_REGNO (i);
20822 if (regno == INVALID_REGNUM)
20823 break;
20824
20825 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
20826 info->ehrd_offset + sp_offset
20827 + reg_size * (int) i,
20828 info->total_size);
20829 }
20830 }
20831
20832 /* In AIX ABI we need to make sure r2 is really saved. */
20833 if (TARGET_AIX && crtl->calls_eh_return)
20834 {
20835 rtx tmp_reg, tmp_reg_si, hi, lo, compare_result, toc_save_done, jump;
20836 long toc_restore_insn;
20837
20838 gcc_assert (frame_reg_rtx == frame_ptr_rtx
20839 || frame_reg_rtx == sp_reg_rtx);
20840 tmp_reg = gen_rtx_REG (Pmode, 11);
20841 tmp_reg_si = gen_rtx_REG (SImode, 11);
20842 if (using_static_chain_p)
20843 emit_move_insn (gen_rtx_REG (Pmode, 0), tmp_reg);
20844 gcc_assert (saving_GPRs_inline && saving_FPRs_inline);
20845 emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, LR_REGNO));
20846 /* Peek at instruction to which this function returns. If it's
20847 restoring r2, then we know we've already saved r2. We can't
20848 unconditionally save r2 because the value we have will already
20849 be updated if we arrived at this function via a plt call or
20850 toc adjusting stub. */
20851 emit_move_insn (tmp_reg_si, gen_rtx_MEM (SImode, tmp_reg));
20852 toc_restore_insn = TARGET_32BIT ? 0x80410014 : 0xE8410028;
20853 hi = gen_int_mode (toc_restore_insn & ~0xffff, SImode);
20854 emit_insn (gen_xorsi3 (tmp_reg_si, tmp_reg_si, hi));
20855 compare_result = gen_rtx_REG (CCUNSmode, CR0_REGNO);
20856 validate_condition_mode (EQ, CCUNSmode);
20857 lo = gen_int_mode (toc_restore_insn & 0xffff, SImode);
20858 emit_insn (gen_rtx_SET (VOIDmode, compare_result,
20859 gen_rtx_COMPARE (CCUNSmode, tmp_reg_si, lo)));
20860 toc_save_done = gen_label_rtx ();
20861 jump = gen_rtx_IF_THEN_ELSE (VOIDmode,
20862 gen_rtx_EQ (VOIDmode, compare_result,
20863 const0_rtx),
20864 gen_rtx_LABEL_REF (VOIDmode, toc_save_done),
20865 pc_rtx);
20866 jump = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, jump));
20867 JUMP_LABEL (jump) = toc_save_done;
20868 LABEL_NUSES (toc_save_done) += 1;
20869
20870 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, 2,
20871 sp_offset + 5 * reg_size, info->total_size);
20872 emit_label (toc_save_done);
20873 if (using_static_chain_p)
20874 emit_move_insn (tmp_reg, gen_rtx_REG (Pmode, 0));
20875 }
20876
20877 /* Save CR if we use any that must be preserved. */
20878 if (!WORLD_SAVE_P (info) && info->cr_save_p)
20879 {
20880 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
20881 GEN_INT (info->cr_save_offset + sp_offset));
20882 rtx mem = gen_frame_mem (SImode, addr);
20883 /* See the large comment above about why CR2_REGNO is used. */
20884 rtx magic_eh_cr_reg = gen_rtx_REG (SImode, CR2_REGNO);
20885
20886 /* If r12 was used to hold the original sp, copy cr into r0 now
20887 that it's free. */
20888 if (REGNO (frame_reg_rtx) == 12)
20889 {
20890 rtx set;
20891
20892 cr_save_rtx = gen_rtx_REG (SImode, 0);
20893 insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
20894 RTX_FRAME_RELATED_P (insn) = 1;
20895 set = gen_rtx_SET (VOIDmode, cr_save_rtx, magic_eh_cr_reg);
20896 add_reg_note (insn, REG_FRAME_RELATED_EXPR, set);
20897 }
20898 insn = emit_move_insn (mem, cr_save_rtx);
20899
20900 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20901 NULL_RTX, NULL_RTX);
20902 }
20903
20904 /* Update stack and set back pointer unless this is V.4,
20905 for which it was done previously. */
20906 if (!WORLD_SAVE_P (info) && info->push_p
20907 && !(DEFAULT_ABI == ABI_V4 || crtl->calls_eh_return))
20908 {
20909 rtx copy_reg = NULL;
20910
20911 if (info->total_size < 32767)
20912 sp_offset = info->total_size;
20913 else if (info->altivec_size != 0
20914 || info->vrsave_mask != 0)
20915 {
20916 copy_reg = frame_ptr_rtx;
20917 frame_reg_rtx = copy_reg;
20918 }
20919 else
20920 sp_offset = info->total_size;
20921 rs6000_emit_allocate_stack (info->total_size, copy_reg);
20922 if (frame_reg_rtx != sp_reg_rtx)
20923 rs6000_emit_stack_tie ();
20924 }
20925
20926 /* Set frame pointer, if needed. */
20927 if (frame_pointer_needed)
20928 {
20929 insn = emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
20930 sp_reg_rtx);
20931 RTX_FRAME_RELATED_P (insn) = 1;
20932 }
20933
20934 /* Save AltiVec registers if needed. Save here because the red zone does
20935 not include AltiVec registers. */
20936 if (!WORLD_SAVE_P (info) && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
20937 {
20938 int i;
20939
20940 /* There should be a non inline version of this, for when we
20941 are saving lots of vector registers. */
20942 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
20943 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
20944 {
20945 rtx areg, savereg, mem;
20946 int offset;
20947
20948 offset = info->altivec_save_offset + sp_offset
20949 + 16 * (i - info->first_altivec_reg_save);
20950
20951 savereg = gen_rtx_REG (V4SImode, i);
20952
20953 areg = gen_rtx_REG (Pmode, 0);
20954 emit_move_insn (areg, GEN_INT (offset));
20955
20956 /* AltiVec addressing mode is [reg+reg]. */
20957 mem = gen_frame_mem (V4SImode,
20958 gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
20959
20960 insn = emit_move_insn (mem, savereg);
20961
20962 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
20963 areg, GEN_INT (offset));
20964 }
20965 }
20966
20967 /* VRSAVE is a bit vector representing which AltiVec registers
20968 are used. The OS uses this to determine which vector
20969 registers to save on a context switch. We need to save
20970 VRSAVE on the stack frame, add whatever AltiVec registers we
20971 used in this function, and do the corresponding magic in the
20972 epilogue. */
20973
20974 if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
20975 && info->vrsave_mask != 0)
20976 {
20977 rtx reg, mem, vrsave;
20978 int offset;
20979
20980 /* Get VRSAVE onto a GPR. Note that ABI_V4 might be using r12
20981 as frame_reg_rtx and r11 as the static chain pointer for
20982 nested functions. */
20983 reg = gen_rtx_REG (SImode, 0);
20984 vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
20985 if (TARGET_MACHO)
20986 emit_insn (gen_get_vrsave_internal (reg));
20987 else
20988 emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
20989
20990 if (!WORLD_SAVE_P (info))
20991 {
20992 /* Save VRSAVE. */
20993 offset = info->vrsave_save_offset + sp_offset;
20994 mem = gen_frame_mem (SImode,
20995 gen_rtx_PLUS (Pmode, frame_reg_rtx,
20996 GEN_INT (offset)));
20997 insn = emit_move_insn (mem, reg);
20998 }
20999
21000 /* Include the registers in the mask. */
21001 emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
21002
21003 insn = emit_insn (generate_set_vrsave (reg, info, 0));
21004 }
21005
21006 if (TARGET_SINGLE_PIC_BASE)
21007 return; /* Do not set PIC register */
21008
21009 /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up. */
21010 if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
21011 || (DEFAULT_ABI == ABI_V4
21012 && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
21013 && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM)))
21014 {
21015 /* If emit_load_toc_table will use the link register, we need to save
21016 it. We use R12 for this purpose because emit_load_toc_table
21017 can use register 0. This allows us to use a plain 'blr' to return
21018 from the procedure more often. */
21019 int save_LR_around_toc_setup = (TARGET_ELF
21020 && DEFAULT_ABI != ABI_AIX
21021 && flag_pic
21022 && ! info->lr_save_p
21023 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0);
21024 if (save_LR_around_toc_setup)
21025 {
21026 rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
21027
21028 insn = emit_move_insn (frame_ptr_rtx, lr);
21029 RTX_FRAME_RELATED_P (insn) = 1;
21030
21031 rs6000_emit_load_toc_table (TRUE);
21032
21033 insn = emit_move_insn (lr, frame_ptr_rtx);
21034 RTX_FRAME_RELATED_P (insn) = 1;
21035 }
21036 else
21037 rs6000_emit_load_toc_table (TRUE);
21038 }
21039
21040 #if TARGET_MACHO
21041 if (DEFAULT_ABI == ABI_DARWIN
21042 && flag_pic && crtl->uses_pic_offset_table)
21043 {
21044 rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
21045 rtx src = gen_rtx_SYMBOL_REF (Pmode, MACHOPIC_FUNCTION_BASE_NAME);
21046
21047 /* Save and restore LR locally around this call (in R0). */
21048 if (!info->lr_save_p)
21049 emit_move_insn (gen_rtx_REG (Pmode, 0), lr);
21050
21051 emit_insn (gen_load_macho_picbase (src));
21052
21053 emit_move_insn (gen_rtx_REG (Pmode,
21054 RS6000_PIC_OFFSET_TABLE_REGNUM),
21055 lr);
21056
21057 if (!info->lr_save_p)
21058 emit_move_insn (lr, gen_rtx_REG (Pmode, 0));
21059 }
21060 #endif
21061 }
21062
21063 /* Write function prologue. */
21064
21065 static void
21066 rs6000_output_function_prologue (FILE *file,
21067 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
21068 {
21069 rs6000_stack_t *info = rs6000_stack_info ();
21070
21071 if (TARGET_DEBUG_STACK)
21072 debug_stack_info (info);
21073
21074 /* Write .extern for any function we will call to save and restore
21075 fp values. */
21076 if (info->first_fp_reg_save < 64)
21077 {
21078 char *name;
21079 int regno = info->first_fp_reg_save - 32;
21080
21081 if ((info->savres_strategy & SAVE_INLINE_FPRS) == 0)
21082 {
21083 name = rs6000_savres_routine_name (info, regno, /*savep=*/true,
21084 /*gpr=*/false, /*lr=*/false);
21085 fprintf (file, "\t.extern %s\n", name);
21086 }
21087 if ((info->savres_strategy & REST_INLINE_FPRS) == 0)
21088 {
21089 name = rs6000_savres_routine_name (info, regno, /*savep=*/false,
21090 /*gpr=*/false, /*lr=*/true);
21091 fprintf (file, "\t.extern %s\n", name);
21092 }
21093 }
21094
21095 /* Write .extern for AIX common mode routines, if needed. */
21096 if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
21097 {
21098 fputs ("\t.extern __mulh\n", file);
21099 fputs ("\t.extern __mull\n", file);
21100 fputs ("\t.extern __divss\n", file);
21101 fputs ("\t.extern __divus\n", file);
21102 fputs ("\t.extern __quoss\n", file);
21103 fputs ("\t.extern __quous\n", file);
21104 common_mode_defined = 1;
21105 }
21106
21107 if (! HAVE_prologue)
21108 {
21109 rtx prologue;
21110
21111 start_sequence ();
21112
21113 /* A NOTE_INSN_DELETED is supposed to be at the start and end of
21114 the "toplevel" insn chain. */
21115 emit_note (NOTE_INSN_DELETED);
21116 rs6000_emit_prologue ();
21117 emit_note (NOTE_INSN_DELETED);
21118
21119 /* Expand INSN_ADDRESSES so final() doesn't crash. */
21120 {
21121 rtx insn;
21122 unsigned addr = 0;
21123 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
21124 {
21125 INSN_ADDRESSES_NEW (insn, addr);
21126 addr += 4;
21127 }
21128 }
21129
21130 prologue = get_insns ();
21131 end_sequence ();
21132
21133 if (TARGET_DEBUG_STACK)
21134 debug_rtx_list (prologue, 100);
21135
21136 emit_insn_before_noloc (prologue, BB_HEAD (ENTRY_BLOCK_PTR->next_bb),
21137 ENTRY_BLOCK_PTR);
21138 }
21139
21140 rs6000_pic_labelno++;
21141 }
21142
21143 /* Non-zero if vmx regs are restored before the frame pop, zero if
21144 we restore after the pop when possible. */
21145 #define ALWAYS_RESTORE_ALTIVEC_BEFORE_POP 0
21146
21147 /* Reload CR from REG. */
21148
21149 static void
21150 rs6000_restore_saved_cr (rtx reg, int using_mfcr_multiple)
21151 {
21152 int count = 0;
21153 int i;
21154
21155 if (using_mfcr_multiple)
21156 {
21157 for (i = 0; i < 8; i++)
21158 if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
21159 count++;
21160 gcc_assert (count);
21161 }
21162
21163 if (using_mfcr_multiple && count > 1)
21164 {
21165 rtvec p;
21166 int ndx;
21167
21168 p = rtvec_alloc (count);
21169
21170 ndx = 0;
21171 for (i = 0; i < 8; i++)
21172 if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
21173 {
21174 rtvec r = rtvec_alloc (2);
21175 RTVEC_ELT (r, 0) = reg;
21176 RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
21177 RTVEC_ELT (p, ndx) =
21178 gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
21179 gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
21180 ndx++;
21181 }
21182 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
21183 gcc_assert (ndx == count);
21184 }
21185 else
21186 for (i = 0; i < 8; i++)
21187 if (df_regs_ever_live_p (CR0_REGNO+i) && ! call_used_regs[CR0_REGNO+i])
21188 {
21189 emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
21190 CR0_REGNO+i),
21191 reg));
21192 }
21193 }
21194
21195 /* Return true if OFFSET from stack pointer can be clobbered by signals.
21196 V.4 doesn't have any stack cushion, AIX ABIs have 220 or 288 bytes
21197 below stack pointer not cloberred by signals. */
21198
21199 static inline bool
21200 offset_below_red_zone_p (HOST_WIDE_INT offset)
21201 {
21202 return offset < (DEFAULT_ABI == ABI_V4
21203 ? 0
21204 : TARGET_32BIT ? -220 : -288);
21205 }
21206
21207 /* Emit function epilogue as insns. */
21208
21209 void
21210 rs6000_emit_epilogue (int sibcall)
21211 {
21212 rs6000_stack_t *info;
21213 int restoring_GPRs_inline;
21214 int restoring_FPRs_inline;
21215 int using_load_multiple;
21216 int using_mtcr_multiple;
21217 int use_backchain_to_restore_sp;
21218 int restore_lr;
21219 int strategy;
21220 int sp_offset = 0;
21221 rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
21222 rtx frame_reg_rtx = sp_reg_rtx;
21223 rtx cfa_restores = NULL_RTX;
21224 rtx insn;
21225 rtx cr_save_reg = NULL_RTX;
21226 enum machine_mode reg_mode = Pmode;
21227 int reg_size = TARGET_32BIT ? 4 : 8;
21228 int i;
21229
21230 info = rs6000_stack_info ();
21231
21232 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
21233 {
21234 reg_mode = V2SImode;
21235 reg_size = 8;
21236 }
21237
21238 strategy = info->savres_strategy;
21239 using_load_multiple = strategy & SAVRES_MULTIPLE;
21240 restoring_FPRs_inline = sibcall || (strategy & REST_INLINE_FPRS);
21241 restoring_GPRs_inline = sibcall || (strategy & REST_INLINE_GPRS);
21242 using_mtcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
21243 || rs6000_cpu == PROCESSOR_PPC603
21244 || rs6000_cpu == PROCESSOR_PPC750
21245 || optimize_size);
21246 /* Restore via the backchain when we have a large frame, since this
21247 is more efficient than an addis, addi pair. The second condition
21248 here will not trigger at the moment; We don't actually need a
21249 frame pointer for alloca, but the generic parts of the compiler
21250 give us one anyway. */
21251 use_backchain_to_restore_sp = (info->total_size > 32767
21252 || info->total_size
21253 + (info->lr_save_p ? info->lr_save_offset : 0)
21254 > 32767
21255 || (cfun->calls_alloca
21256 && !frame_pointer_needed));
21257 restore_lr = (info->lr_save_p
21258 && (restoring_FPRs_inline
21259 || (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR))
21260 && (restoring_GPRs_inline
21261 || info->first_fp_reg_save < 64));
21262
21263 if (WORLD_SAVE_P (info))
21264 {
21265 int i, j;
21266 char rname[30];
21267 const char *alloc_rname;
21268 rtvec p;
21269
21270 /* eh_rest_world_r10 will return to the location saved in the LR
21271 stack slot (which is not likely to be our caller.)
21272 Input: R10 -- stack adjustment. Clobbers R0, R11, R12, R7, R8.
21273 rest_world is similar, except any R10 parameter is ignored.
21274 The exception-handling stuff that was here in 2.95 is no
21275 longer necessary. */
21276
21277 p = rtvec_alloc (9
21278 + 1
21279 + 32 - info->first_gp_reg_save
21280 + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
21281 + 63 + 1 - info->first_fp_reg_save);
21282
21283 strcpy (rname, ((crtl->calls_eh_return) ?
21284 "*eh_rest_world_r10" : "*rest_world"));
21285 alloc_rname = ggc_strdup (rname);
21286
21287 j = 0;
21288 RTVEC_ELT (p, j++) = gen_rtx_RETURN (VOIDmode);
21289 RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
21290 gen_rtx_REG (Pmode,
21291 LR_REGNO));
21292 RTVEC_ELT (p, j++)
21293 = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, alloc_rname));
21294 /* The instruction pattern requires a clobber here;
21295 it is shared with the restVEC helper. */
21296 RTVEC_ELT (p, j++)
21297 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
21298
21299 {
21300 /* CR register traditionally saved as CR2. */
21301 rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
21302 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21303 GEN_INT (info->cr_save_offset));
21304 rtx mem = gen_frame_mem (reg_mode, addr);
21305
21306 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
21307 }
21308
21309 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21310 {
21311 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21312 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21313 GEN_INT (info->gp_save_offset
21314 + reg_size * i));
21315 rtx mem = gen_frame_mem (reg_mode, addr);
21316
21317 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
21318 }
21319 for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
21320 {
21321 rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
21322 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21323 GEN_INT (info->altivec_save_offset
21324 + 16 * i));
21325 rtx mem = gen_frame_mem (V4SImode, addr);
21326
21327 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
21328 }
21329 for (i = 0; info->first_fp_reg_save + i <= 63; i++)
21330 {
21331 rtx reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21332 ? DFmode : SFmode),
21333 info->first_fp_reg_save + i);
21334 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21335 GEN_INT (info->fp_save_offset
21336 + 8 * i));
21337 rtx mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21338 ? DFmode : SFmode), addr);
21339
21340 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
21341 }
21342 RTVEC_ELT (p, j++)
21343 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 0));
21344 RTVEC_ELT (p, j++)
21345 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 12));
21346 RTVEC_ELT (p, j++)
21347 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 7));
21348 RTVEC_ELT (p, j++)
21349 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 8));
21350 RTVEC_ELT (p, j++)
21351 = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
21352 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
21353
21354 return;
21355 }
21356
21357 /* frame_reg_rtx + sp_offset points to the top of this stack frame. */
21358 if (info->push_p)
21359 sp_offset = info->total_size;
21360
21361 /* Restore AltiVec registers if we must do so before adjusting the
21362 stack. */
21363 if (TARGET_ALTIVEC_ABI
21364 && info->altivec_size != 0
21365 && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
21366 || (DEFAULT_ABI != ABI_V4
21367 && offset_below_red_zone_p (info->altivec_save_offset))))
21368 {
21369 int i;
21370
21371 if (use_backchain_to_restore_sp)
21372 {
21373 frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21374 emit_move_insn (frame_reg_rtx,
21375 gen_rtx_MEM (Pmode, sp_reg_rtx));
21376 sp_offset = 0;
21377 }
21378 else if (frame_pointer_needed)
21379 frame_reg_rtx = hard_frame_pointer_rtx;
21380
21381 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
21382 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
21383 {
21384 rtx addr, areg, mem, reg;
21385
21386 areg = gen_rtx_REG (Pmode, 0);
21387 emit_move_insn
21388 (areg, GEN_INT (info->altivec_save_offset
21389 + sp_offset
21390 + 16 * (i - info->first_altivec_reg_save)));
21391
21392 /* AltiVec addressing mode is [reg+reg]. */
21393 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
21394 mem = gen_frame_mem (V4SImode, addr);
21395
21396 reg = gen_rtx_REG (V4SImode, i);
21397 emit_move_insn (reg, mem);
21398 if (offset_below_red_zone_p (info->altivec_save_offset
21399 + (i - info->first_altivec_reg_save)
21400 * 16))
21401 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21402 cfa_restores);
21403 }
21404 }
21405
21406 /* Restore VRSAVE if we must do so before adjusting the stack. */
21407 if (TARGET_ALTIVEC
21408 && TARGET_ALTIVEC_VRSAVE
21409 && info->vrsave_mask != 0
21410 && (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
21411 || (DEFAULT_ABI != ABI_V4
21412 && offset_below_red_zone_p (info->vrsave_save_offset))))
21413 {
21414 rtx addr, mem, reg;
21415
21416 if (frame_reg_rtx == sp_reg_rtx)
21417 {
21418 if (use_backchain_to_restore_sp)
21419 {
21420 frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21421 emit_move_insn (frame_reg_rtx,
21422 gen_rtx_MEM (Pmode, sp_reg_rtx));
21423 sp_offset = 0;
21424 }
21425 else if (frame_pointer_needed)
21426 frame_reg_rtx = hard_frame_pointer_rtx;
21427 }
21428
21429 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21430 GEN_INT (info->vrsave_save_offset + sp_offset));
21431 mem = gen_frame_mem (SImode, addr);
21432 reg = gen_rtx_REG (SImode, 12);
21433 emit_move_insn (reg, mem);
21434
21435 emit_insn (generate_set_vrsave (reg, info, 1));
21436 }
21437
21438 insn = NULL_RTX;
21439 /* If we have a large stack frame, restore the old stack pointer
21440 using the backchain. */
21441 if (use_backchain_to_restore_sp)
21442 {
21443 if (frame_reg_rtx == sp_reg_rtx)
21444 {
21445 /* Under V.4, don't reset the stack pointer until after we're done
21446 loading the saved registers. */
21447 if (DEFAULT_ABI == ABI_V4)
21448 frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21449
21450 insn = emit_move_insn (frame_reg_rtx,
21451 gen_rtx_MEM (Pmode, sp_reg_rtx));
21452 sp_offset = 0;
21453 }
21454 else if (ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
21455 && DEFAULT_ABI == ABI_V4)
21456 /* frame_reg_rtx has been set up by the altivec restore. */
21457 ;
21458 else
21459 {
21460 insn = emit_move_insn (sp_reg_rtx, frame_reg_rtx);
21461 frame_reg_rtx = sp_reg_rtx;
21462 }
21463 }
21464 /* If we have a frame pointer, we can restore the old stack pointer
21465 from it. */
21466 else if (frame_pointer_needed)
21467 {
21468 frame_reg_rtx = sp_reg_rtx;
21469 if (DEFAULT_ABI == ABI_V4)
21470 frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21471 /* Prevent reordering memory accesses against stack pointer restore. */
21472 else if (cfun->calls_alloca
21473 || offset_below_red_zone_p (-info->total_size))
21474 {
21475 rtx mem1 = gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx);
21476 rtx mem2 = gen_rtx_MEM (BLKmode, sp_reg_rtx);
21477 MEM_NOTRAP_P (mem1) = 1;
21478 MEM_NOTRAP_P (mem2) = 1;
21479 emit_insn (gen_frame_tie (mem1, mem2));
21480 }
21481
21482 insn = emit_insn (gen_add3_insn (frame_reg_rtx, hard_frame_pointer_rtx,
21483 GEN_INT (info->total_size)));
21484 sp_offset = 0;
21485 }
21486 else if (info->push_p
21487 && DEFAULT_ABI != ABI_V4
21488 && !crtl->calls_eh_return)
21489 {
21490 /* Prevent reordering memory accesses against stack pointer restore. */
21491 if (cfun->calls_alloca
21492 || offset_below_red_zone_p (-info->total_size))
21493 {
21494 rtx mem = gen_rtx_MEM (BLKmode, sp_reg_rtx);
21495 MEM_NOTRAP_P (mem) = 1;
21496 emit_insn (gen_stack_tie (mem));
21497 }
21498 insn = emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx,
21499 GEN_INT (info->total_size)));
21500 sp_offset = 0;
21501 }
21502 if (insn && frame_reg_rtx == sp_reg_rtx)
21503 {
21504 if (cfa_restores)
21505 {
21506 REG_NOTES (insn) = cfa_restores;
21507 cfa_restores = NULL_RTX;
21508 }
21509 add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
21510 RTX_FRAME_RELATED_P (insn) = 1;
21511 }
21512
21513 /* Restore AltiVec registers if we have not done so already. */
21514 if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
21515 && TARGET_ALTIVEC_ABI
21516 && info->altivec_size != 0
21517 && (DEFAULT_ABI == ABI_V4
21518 || !offset_below_red_zone_p (info->altivec_save_offset)))
21519 {
21520 int i;
21521
21522 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
21523 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
21524 {
21525 rtx addr, areg, mem, reg;
21526
21527 areg = gen_rtx_REG (Pmode, 0);
21528 emit_move_insn
21529 (areg, GEN_INT (info->altivec_save_offset
21530 + sp_offset
21531 + 16 * (i - info->first_altivec_reg_save)));
21532
21533 /* AltiVec addressing mode is [reg+reg]. */
21534 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
21535 mem = gen_frame_mem (V4SImode, addr);
21536
21537 reg = gen_rtx_REG (V4SImode, i);
21538 emit_move_insn (reg, mem);
21539 if (DEFAULT_ABI == ABI_V4)
21540 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21541 cfa_restores);
21542 }
21543 }
21544
21545 /* Restore VRSAVE if we have not done so already. */
21546 if (!ALWAYS_RESTORE_ALTIVEC_BEFORE_POP
21547 && TARGET_ALTIVEC
21548 && TARGET_ALTIVEC_VRSAVE
21549 && info->vrsave_mask != 0
21550 && (DEFAULT_ABI == ABI_V4
21551 || !offset_below_red_zone_p (info->vrsave_save_offset)))
21552 {
21553 rtx addr, mem, reg;
21554
21555 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21556 GEN_INT (info->vrsave_save_offset + sp_offset));
21557 mem = gen_frame_mem (SImode, addr);
21558 reg = gen_rtx_REG (SImode, 12);
21559 emit_move_insn (reg, mem);
21560
21561 emit_insn (generate_set_vrsave (reg, info, 1));
21562 }
21563
21564 /* Get the old lr if we saved it. If we are restoring registers
21565 out-of-line, then the out-of-line routines can do this for us. */
21566 if (restore_lr && restoring_GPRs_inline)
21567 {
21568 rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
21569 info->lr_save_offset + sp_offset);
21570
21571 emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
21572 }
21573
21574 /* Get the old cr if we saved it. */
21575 if (info->cr_save_p)
21576 {
21577 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21578 GEN_INT (info->cr_save_offset + sp_offset));
21579 rtx mem = gen_frame_mem (SImode, addr);
21580
21581 cr_save_reg = gen_rtx_REG (SImode,
21582 DEFAULT_ABI == ABI_AIX
21583 && !restoring_GPRs_inline
21584 && info->first_fp_reg_save < 64
21585 ? 11 : 12);
21586 emit_move_insn (cr_save_reg, mem);
21587 }
21588
21589 /* Set LR here to try to overlap restores below. LR is always saved
21590 above incoming stack, so it never needs REG_CFA_RESTORE. */
21591 if (restore_lr && restoring_GPRs_inline)
21592 emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
21593 gen_rtx_REG (Pmode, 0));
21594
21595 /* Load exception handler data registers, if needed. */
21596 if (crtl->calls_eh_return)
21597 {
21598 unsigned int i, regno;
21599
21600 if (TARGET_AIX)
21601 {
21602 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21603 GEN_INT (sp_offset + 5 * reg_size));
21604 rtx mem = gen_frame_mem (reg_mode, addr);
21605
21606 emit_move_insn (gen_rtx_REG (reg_mode, 2), mem);
21607 }
21608
21609 for (i = 0; ; ++i)
21610 {
21611 rtx mem;
21612
21613 regno = EH_RETURN_DATA_REGNO (i);
21614 if (regno == INVALID_REGNUM)
21615 break;
21616
21617 mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
21618 info->ehrd_offset + sp_offset
21619 + reg_size * (int) i);
21620
21621 emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
21622 }
21623 }
21624
21625 /* Restore GPRs. This is done as a PARALLEL if we are using
21626 the load-multiple instructions. */
21627 if (TARGET_SPE_ABI
21628 && info->spe_64bit_regs_used != 0
21629 && info->first_gp_reg_save != 32)
21630 {
21631 /* Determine whether we can address all of the registers that need
21632 to be saved with an offset from the stack pointer that fits in
21633 the small const field for SPE memory instructions. */
21634 int spe_regs_addressable_via_sp
21635 = (SPE_CONST_OFFSET_OK(info->spe_gp_save_offset + sp_offset
21636 + (32 - info->first_gp_reg_save - 1) * reg_size)
21637 && restoring_GPRs_inline);
21638 int spe_offset;
21639
21640 if (spe_regs_addressable_via_sp)
21641 spe_offset = info->spe_gp_save_offset + sp_offset;
21642 else
21643 {
21644 rtx old_frame_reg_rtx = frame_reg_rtx;
21645 /* Make r11 point to the start of the SPE save area. We worried about
21646 not clobbering it when we were saving registers in the prologue.
21647 There's no need to worry here because the static chain is passed
21648 anew to every function. */
21649 int ool_adjust = (restoring_GPRs_inline
21650 ? 0
21651 : (info->first_gp_reg_save
21652 - (FIRST_SAVRES_REGISTER+1))*8);
21653
21654 if (frame_reg_rtx == sp_reg_rtx)
21655 frame_reg_rtx = gen_rtx_REG (Pmode, 11);
21656 emit_insn (gen_addsi3 (frame_reg_rtx, old_frame_reg_rtx,
21657 GEN_INT (info->spe_gp_save_offset
21658 + sp_offset
21659 - ool_adjust)));
21660 /* Keep the invariant that frame_reg_rtx + sp_offset points
21661 at the top of the stack frame. */
21662 sp_offset = -info->spe_gp_save_offset;
21663
21664 spe_offset = 0;
21665 }
21666
21667 if (restoring_GPRs_inline)
21668 {
21669 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21670 if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
21671 {
21672 rtx offset, addr, mem, reg;
21673
21674 /* We're doing all this to ensure that the immediate offset
21675 fits into the immediate field of 'evldd'. */
21676 gcc_assert (SPE_CONST_OFFSET_OK (spe_offset + reg_size * i));
21677
21678 offset = GEN_INT (spe_offset + reg_size * i);
21679 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, offset);
21680 mem = gen_rtx_MEM (V2SImode, addr);
21681 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21682
21683 insn = emit_move_insn (reg, mem);
21684 if (DEFAULT_ABI == ABI_V4)
21685 {
21686 if (frame_pointer_needed
21687 && info->first_gp_reg_save + i
21688 == HARD_FRAME_POINTER_REGNUM)
21689 {
21690 add_reg_note (insn, REG_CFA_DEF_CFA,
21691 plus_constant (frame_reg_rtx,
21692 sp_offset));
21693 RTX_FRAME_RELATED_P (insn) = 1;
21694 }
21695
21696 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21697 cfa_restores);
21698 }
21699 }
21700 }
21701 else
21702 {
21703 rtx par;
21704
21705 par = rs6000_make_savres_rtx (info, gen_rtx_REG (Pmode, 11),
21706 0, reg_mode,
21707 /*savep=*/false, /*gpr=*/true,
21708 /*lr=*/true);
21709 emit_jump_insn (par);
21710 /* We don't want anybody else emitting things after we jumped
21711 back. */
21712 return;
21713 }
21714 }
21715 else if (!restoring_GPRs_inline)
21716 {
21717 /* We are jumping to an out-of-line function. */
21718 bool can_use_exit = info->first_fp_reg_save == 64;
21719 rtx par;
21720
21721 /* Emit stack reset code if we need it. */
21722 if (can_use_exit)
21723 rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
21724 sp_offset, can_use_exit);
21725 else
21726 {
21727 emit_insn (gen_add3_insn (gen_rtx_REG (Pmode, DEFAULT_ABI == ABI_AIX
21728 ? 12 : 11),
21729 frame_reg_rtx,
21730 GEN_INT (sp_offset - info->fp_size)));
21731 if (REGNO (frame_reg_rtx) == 11)
21732 sp_offset += info->fp_size;
21733 }
21734
21735 par = rs6000_make_savres_rtx (info, frame_reg_rtx,
21736 info->gp_save_offset, reg_mode,
21737 /*savep=*/false, /*gpr=*/true,
21738 /*lr=*/can_use_exit);
21739
21740 if (can_use_exit)
21741 {
21742 if (info->cr_save_p)
21743 {
21744 rs6000_restore_saved_cr (cr_save_reg, using_mtcr_multiple);
21745 if (DEFAULT_ABI == ABI_V4)
21746 cfa_restores
21747 = alloc_reg_note (REG_CFA_RESTORE,
21748 gen_rtx_REG (SImode, CR2_REGNO),
21749 cfa_restores);
21750 }
21751
21752 emit_jump_insn (par);
21753
21754 /* We don't want anybody else emitting things after we jumped
21755 back. */
21756 return;
21757 }
21758
21759 insn = emit_insn (par);
21760 if (DEFAULT_ABI == ABI_V4)
21761 {
21762 if (frame_pointer_needed)
21763 {
21764 add_reg_note (insn, REG_CFA_DEF_CFA,
21765 plus_constant (frame_reg_rtx, sp_offset));
21766 RTX_FRAME_RELATED_P (insn) = 1;
21767 }
21768
21769 for (i = info->first_gp_reg_save; i < 32; i++)
21770 cfa_restores
21771 = alloc_reg_note (REG_CFA_RESTORE,
21772 gen_rtx_REG (reg_mode, i), cfa_restores);
21773 }
21774 }
21775 else if (using_load_multiple)
21776 {
21777 rtvec p;
21778 p = rtvec_alloc (32 - info->first_gp_reg_save);
21779 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21780 {
21781 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21782 GEN_INT (info->gp_save_offset
21783 + sp_offset
21784 + reg_size * i));
21785 rtx mem = gen_frame_mem (reg_mode, addr);
21786 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21787
21788 RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, reg, mem);
21789 if (DEFAULT_ABI == ABI_V4)
21790 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21791 cfa_restores);
21792 }
21793 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
21794 if (DEFAULT_ABI == ABI_V4 && frame_pointer_needed)
21795 {
21796 add_reg_note (insn, REG_CFA_DEF_CFA,
21797 plus_constant (frame_reg_rtx, sp_offset));
21798 RTX_FRAME_RELATED_P (insn) = 1;
21799 }
21800 }
21801 else
21802 {
21803 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
21804 if (rs6000_reg_live_or_pic_offset_p (info->first_gp_reg_save + i))
21805 {
21806 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21807 GEN_INT (info->gp_save_offset
21808 + sp_offset
21809 + reg_size * i));
21810 rtx mem = gen_frame_mem (reg_mode, addr);
21811 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
21812
21813 insn = emit_move_insn (reg, mem);
21814 if (DEFAULT_ABI == ABI_V4)
21815 {
21816 if (frame_pointer_needed
21817 && info->first_gp_reg_save + i
21818 == HARD_FRAME_POINTER_REGNUM)
21819 {
21820 add_reg_note (insn, REG_CFA_DEF_CFA,
21821 plus_constant (frame_reg_rtx, sp_offset));
21822 RTX_FRAME_RELATED_P (insn) = 1;
21823 }
21824
21825 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21826 cfa_restores);
21827 }
21828 }
21829 }
21830
21831 if (restore_lr && !restoring_GPRs_inline)
21832 {
21833 rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
21834 info->lr_save_offset + sp_offset);
21835
21836 emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
21837 emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
21838 gen_rtx_REG (Pmode, 0));
21839 }
21840
21841 /* Restore fpr's if we need to do it without calling a function. */
21842 if (restoring_FPRs_inline)
21843 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
21844 if ((df_regs_ever_live_p (info->first_fp_reg_save+i)
21845 && ! call_used_regs[info->first_fp_reg_save+i]))
21846 {
21847 rtx addr, mem, reg;
21848 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
21849 GEN_INT (info->fp_save_offset
21850 + sp_offset
21851 + 8 * i));
21852 mem = gen_frame_mem (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21853 ? DFmode : SFmode), addr);
21854 reg = gen_rtx_REG (((TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT)
21855 ? DFmode : SFmode),
21856 info->first_fp_reg_save + i);
21857
21858 emit_move_insn (reg, mem);
21859 if (DEFAULT_ABI == ABI_V4)
21860 cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
21861 cfa_restores);
21862 }
21863
21864 /* If we saved cr, restore it here. Just those that were used. */
21865 if (info->cr_save_p)
21866 {
21867 rs6000_restore_saved_cr (cr_save_reg, using_mtcr_multiple);
21868 if (DEFAULT_ABI == ABI_V4)
21869 cfa_restores
21870 = alloc_reg_note (REG_CFA_RESTORE, gen_rtx_REG (SImode, CR2_REGNO),
21871 cfa_restores);
21872 }
21873
21874 /* If this is V.4, unwind the stack pointer after all of the loads
21875 have been done. */
21876 insn = rs6000_emit_stack_reset (info, sp_reg_rtx, frame_reg_rtx,
21877 sp_offset, !restoring_FPRs_inline);
21878 if (insn)
21879 {
21880 if (cfa_restores)
21881 {
21882 REG_NOTES (insn) = cfa_restores;
21883 cfa_restores = NULL_RTX;
21884 }
21885 add_reg_note (insn, REG_CFA_DEF_CFA, sp_reg_rtx);
21886 RTX_FRAME_RELATED_P (insn) = 1;
21887 }
21888
21889 if (crtl->calls_eh_return)
21890 {
21891 rtx sa = EH_RETURN_STACKADJ_RTX;
21892 emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx, sa));
21893 }
21894
21895 if (!sibcall)
21896 {
21897 rtvec p;
21898 bool lr = (strategy & REST_NOINLINE_FPRS_DOESNT_RESTORE_LR) == 0;
21899 if (! restoring_FPRs_inline)
21900 p = rtvec_alloc (4 + 64 - info->first_fp_reg_save);
21901 else
21902 p = rtvec_alloc (2);
21903
21904 RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
21905 RTVEC_ELT (p, 1) = ((restoring_FPRs_inline || !lr)
21906 ? gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 65))
21907 : gen_rtx_CLOBBER (VOIDmode,
21908 gen_rtx_REG (Pmode, 65)));
21909
21910 /* If we have to restore more than two FP registers, branch to the
21911 restore function. It will return to our caller. */
21912 if (! restoring_FPRs_inline)
21913 {
21914 int i;
21915 rtx sym;
21916
21917 sym = rs6000_savres_routine_sym (info,
21918 /*savep=*/false,
21919 /*gpr=*/false,
21920 /*lr=*/lr);
21921 RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode, sym);
21922 RTVEC_ELT (p, 3) = gen_rtx_USE (VOIDmode,
21923 gen_rtx_REG (Pmode,
21924 DEFAULT_ABI == ABI_AIX
21925 ? 1 : 11));
21926 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
21927 {
21928 rtx addr, mem;
21929 addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
21930 GEN_INT (info->fp_save_offset + 8*i));
21931 mem = gen_frame_mem (DFmode, addr);
21932
21933 RTVEC_ELT (p, i+4) =
21934 gen_rtx_SET (VOIDmode,
21935 gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
21936 mem);
21937 }
21938 }
21939
21940 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
21941 }
21942 }
21943
21944 /* Write function epilogue. */
21945
21946 static void
21947 rs6000_output_function_epilogue (FILE *file,
21948 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
21949 {
21950 if (! HAVE_epilogue)
21951 {
21952 rtx insn = get_last_insn ();
21953 /* If the last insn was a BARRIER, we don't have to write anything except
21954 the trace table. */
21955 if (GET_CODE (insn) == NOTE)
21956 insn = prev_nonnote_insn (insn);
21957 if (insn == 0 || GET_CODE (insn) != BARRIER)
21958 {
21959 /* This is slightly ugly, but at least we don't have two
21960 copies of the epilogue-emitting code. */
21961 start_sequence ();
21962
21963 /* A NOTE_INSN_DELETED is supposed to be at the start
21964 and end of the "toplevel" insn chain. */
21965 emit_note (NOTE_INSN_DELETED);
21966 rs6000_emit_epilogue (FALSE);
21967 emit_note (NOTE_INSN_DELETED);
21968
21969 /* Expand INSN_ADDRESSES so final() doesn't crash. */
21970 {
21971 rtx insn;
21972 unsigned addr = 0;
21973 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
21974 {
21975 INSN_ADDRESSES_NEW (insn, addr);
21976 addr += 4;
21977 }
21978 }
21979
21980 if (TARGET_DEBUG_STACK)
21981 debug_rtx_list (get_insns (), 100);
21982 final (get_insns (), file, FALSE);
21983 end_sequence ();
21984 }
21985 }
21986
21987 #if TARGET_MACHO
21988 macho_branch_islands ();
21989 /* Mach-O doesn't support labels at the end of objects, so if
21990 it looks like we might want one, insert a NOP. */
21991 {
21992 rtx insn = get_last_insn ();
21993 while (insn
21994 && NOTE_P (insn)
21995 && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
21996 insn = PREV_INSN (insn);
21997 if (insn
21998 && (LABEL_P (insn)
21999 || (NOTE_P (insn)
22000 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
22001 fputs ("\tnop\n", file);
22002 }
22003 #endif
22004
22005 /* Output a traceback table here. See /usr/include/sys/debug.h for info
22006 on its format.
22007
22008 We don't output a traceback table if -finhibit-size-directive was
22009 used. The documentation for -finhibit-size-directive reads
22010 ``don't output a @code{.size} assembler directive, or anything
22011 else that would cause trouble if the function is split in the
22012 middle, and the two halves are placed at locations far apart in
22013 memory.'' The traceback table has this property, since it
22014 includes the offset from the start of the function to the
22015 traceback table itself.
22016
22017 System V.4 Powerpc's (and the embedded ABI derived from it) use a
22018 different traceback table. */
22019 if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
22020 && rs6000_traceback != traceback_none && !cfun->is_thunk)
22021 {
22022 const char *fname = NULL;
22023 const char *language_string = lang_hooks.name;
22024 int fixed_parms = 0, float_parms = 0, parm_info = 0;
22025 int i;
22026 int optional_tbtab;
22027 rs6000_stack_t *info = rs6000_stack_info ();
22028
22029 if (rs6000_traceback == traceback_full)
22030 optional_tbtab = 1;
22031 else if (rs6000_traceback == traceback_part)
22032 optional_tbtab = 0;
22033 else
22034 optional_tbtab = !optimize_size && !TARGET_ELF;
22035
22036 if (optional_tbtab)
22037 {
22038 fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
22039 while (*fname == '.') /* V.4 encodes . in the name */
22040 fname++;
22041
22042 /* Need label immediately before tbtab, so we can compute
22043 its offset from the function start. */
22044 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
22045 ASM_OUTPUT_LABEL (file, fname);
22046 }
22047
22048 /* The .tbtab pseudo-op can only be used for the first eight
22049 expressions, since it can't handle the possibly variable
22050 length fields that follow. However, if you omit the optional
22051 fields, the assembler outputs zeros for all optional fields
22052 anyways, giving each variable length field is minimum length
22053 (as defined in sys/debug.h). Thus we can not use the .tbtab
22054 pseudo-op at all. */
22055
22056 /* An all-zero word flags the start of the tbtab, for debuggers
22057 that have to find it by searching forward from the entry
22058 point or from the current pc. */
22059 fputs ("\t.long 0\n", file);
22060
22061 /* Tbtab format type. Use format type 0. */
22062 fputs ("\t.byte 0,", file);
22063
22064 /* Language type. Unfortunately, there does not seem to be any
22065 official way to discover the language being compiled, so we
22066 use language_string.
22067 C is 0. Fortran is 1. Pascal is 2. Ada is 3. C++ is 9.
22068 Java is 13. Objective-C is 14. Objective-C++ isn't assigned
22069 a number, so for now use 9. LTO and Go aren't assigned numbers
22070 either, so for now use 0. */
22071 if (! strcmp (language_string, "GNU C")
22072 || ! strcmp (language_string, "GNU GIMPLE")
22073 || ! strcmp (language_string, "GNU Go"))
22074 i = 0;
22075 else if (! strcmp (language_string, "GNU F77")
22076 || ! strcmp (language_string, "GNU Fortran"))
22077 i = 1;
22078 else if (! strcmp (language_string, "GNU Pascal"))
22079 i = 2;
22080 else if (! strcmp (language_string, "GNU Ada"))
22081 i = 3;
22082 else if (! strcmp (language_string, "GNU C++")
22083 || ! strcmp (language_string, "GNU Objective-C++"))
22084 i = 9;
22085 else if (! strcmp (language_string, "GNU Java"))
22086 i = 13;
22087 else if (! strcmp (language_string, "GNU Objective-C"))
22088 i = 14;
22089 else
22090 gcc_unreachable ();
22091 fprintf (file, "%d,", i);
22092
22093 /* 8 single bit fields: global linkage (not set for C extern linkage,
22094 apparently a PL/I convention?), out-of-line epilogue/prologue, offset
22095 from start of procedure stored in tbtab, internal function, function
22096 has controlled storage, function has no toc, function uses fp,
22097 function logs/aborts fp operations. */
22098 /* Assume that fp operations are used if any fp reg must be saved. */
22099 fprintf (file, "%d,",
22100 (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
22101
22102 /* 6 bitfields: function is interrupt handler, name present in
22103 proc table, function calls alloca, on condition directives
22104 (controls stack walks, 3 bits), saves condition reg, saves
22105 link reg. */
22106 /* The `function calls alloca' bit seems to be set whenever reg 31 is
22107 set up as a frame pointer, even when there is no alloca call. */
22108 fprintf (file, "%d,",
22109 ((optional_tbtab << 6)
22110 | ((optional_tbtab & frame_pointer_needed) << 5)
22111 | (info->cr_save_p << 1)
22112 | (info->lr_save_p)));
22113
22114 /* 3 bitfields: saves backchain, fixup code, number of fpr saved
22115 (6 bits). */
22116 fprintf (file, "%d,",
22117 (info->push_p << 7) | (64 - info->first_fp_reg_save));
22118
22119 /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits). */
22120 fprintf (file, "%d,", (32 - first_reg_to_save ()));
22121
22122 if (optional_tbtab)
22123 {
22124 /* Compute the parameter info from the function decl argument
22125 list. */
22126 tree decl;
22127 int next_parm_info_bit = 31;
22128
22129 for (decl = DECL_ARGUMENTS (current_function_decl);
22130 decl; decl = DECL_CHAIN (decl))
22131 {
22132 rtx parameter = DECL_INCOMING_RTL (decl);
22133 enum machine_mode mode = GET_MODE (parameter);
22134
22135 if (GET_CODE (parameter) == REG)
22136 {
22137 if (SCALAR_FLOAT_MODE_P (mode))
22138 {
22139 int bits;
22140
22141 float_parms++;
22142
22143 switch (mode)
22144 {
22145 case SFmode:
22146 case SDmode:
22147 bits = 0x2;
22148 break;
22149
22150 case DFmode:
22151 case DDmode:
22152 case TFmode:
22153 case TDmode:
22154 bits = 0x3;
22155 break;
22156
22157 default:
22158 gcc_unreachable ();
22159 }
22160
22161 /* If only one bit will fit, don't or in this entry. */
22162 if (next_parm_info_bit > 0)
22163 parm_info |= (bits << (next_parm_info_bit - 1));
22164 next_parm_info_bit -= 2;
22165 }
22166 else
22167 {
22168 fixed_parms += ((GET_MODE_SIZE (mode)
22169 + (UNITS_PER_WORD - 1))
22170 / UNITS_PER_WORD);
22171 next_parm_info_bit -= 1;
22172 }
22173 }
22174 }
22175 }
22176
22177 /* Number of fixed point parameters. */
22178 /* This is actually the number of words of fixed point parameters; thus
22179 an 8 byte struct counts as 2; and thus the maximum value is 8. */
22180 fprintf (file, "%d,", fixed_parms);
22181
22182 /* 2 bitfields: number of floating point parameters (7 bits), parameters
22183 all on stack. */
22184 /* This is actually the number of fp registers that hold parameters;
22185 and thus the maximum value is 13. */
22186 /* Set parameters on stack bit if parameters are not in their original
22187 registers, regardless of whether they are on the stack? Xlc
22188 seems to set the bit when not optimizing. */
22189 fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
22190
22191 if (! optional_tbtab)
22192 return;
22193
22194 /* Optional fields follow. Some are variable length. */
22195
22196 /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
22197 11 double float. */
22198 /* There is an entry for each parameter in a register, in the order that
22199 they occur in the parameter list. Any intervening arguments on the
22200 stack are ignored. If the list overflows a long (max possible length
22201 34 bits) then completely leave off all elements that don't fit. */
22202 /* Only emit this long if there was at least one parameter. */
22203 if (fixed_parms || float_parms)
22204 fprintf (file, "\t.long %d\n", parm_info);
22205
22206 /* Offset from start of code to tb table. */
22207 fputs ("\t.long ", file);
22208 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
22209 RS6000_OUTPUT_BASENAME (file, fname);
22210 putc ('-', file);
22211 rs6000_output_function_entry (file, fname);
22212 putc ('\n', file);
22213
22214 /* Interrupt handler mask. */
22215 /* Omit this long, since we never set the interrupt handler bit
22216 above. */
22217
22218 /* Number of CTL (controlled storage) anchors. */
22219 /* Omit this long, since the has_ctl bit is never set above. */
22220
22221 /* Displacement into stack of each CTL anchor. */
22222 /* Omit this list of longs, because there are no CTL anchors. */
22223
22224 /* Length of function name. */
22225 if (*fname == '*')
22226 ++fname;
22227 fprintf (file, "\t.short %d\n", (int) strlen (fname));
22228
22229 /* Function name. */
22230 assemble_string (fname, strlen (fname));
22231
22232 /* Register for alloca automatic storage; this is always reg 31.
22233 Only emit this if the alloca bit was set above. */
22234 if (frame_pointer_needed)
22235 fputs ("\t.byte 31\n", file);
22236
22237 fputs ("\t.align 2\n", file);
22238 }
22239 }
22240 \f
22241 /* A C compound statement that outputs the assembler code for a thunk
22242 function, used to implement C++ virtual function calls with
22243 multiple inheritance. The thunk acts as a wrapper around a virtual
22244 function, adjusting the implicit object parameter before handing
22245 control off to the real function.
22246
22247 First, emit code to add the integer DELTA to the location that
22248 contains the incoming first argument. Assume that this argument
22249 contains a pointer, and is the one used to pass the `this' pointer
22250 in C++. This is the incoming argument *before* the function
22251 prologue, e.g. `%o0' on a sparc. The addition must preserve the
22252 values of all other incoming arguments.
22253
22254 After the addition, emit code to jump to FUNCTION, which is a
22255 `FUNCTION_DECL'. This is a direct pure jump, not a call, and does
22256 not touch the return address. Hence returning from FUNCTION will
22257 return to whoever called the current `thunk'.
22258
22259 The effect must be as if FUNCTION had been called directly with the
22260 adjusted first argument. This macro is responsible for emitting
22261 all of the code for a thunk function; output_function_prologue()
22262 and output_function_epilogue() are not invoked.
22263
22264 The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already
22265 been extracted from it.) It might possibly be useful on some
22266 targets, but probably not.
22267
22268 If you do not define this macro, the target-independent code in the
22269 C++ frontend will generate a less efficient heavyweight thunk that
22270 calls FUNCTION instead of jumping to it. The generic approach does
22271 not support varargs. */
22272
22273 static void
22274 rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
22275 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
22276 tree function)
22277 {
22278 rtx this_rtx, insn, funexp;
22279
22280 reload_completed = 1;
22281 epilogue_completed = 1;
22282
22283 /* Mark the end of the (empty) prologue. */
22284 emit_note (NOTE_INSN_PROLOGUE_END);
22285
22286 /* Find the "this" pointer. If the function returns a structure,
22287 the structure return pointer is in r3. */
22288 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
22289 this_rtx = gen_rtx_REG (Pmode, 4);
22290 else
22291 this_rtx = gen_rtx_REG (Pmode, 3);
22292
22293 /* Apply the constant offset, if required. */
22294 if (delta)
22295 emit_insn (gen_add3_insn (this_rtx, this_rtx, GEN_INT (delta)));
22296
22297 /* Apply the offset from the vtable, if required. */
22298 if (vcall_offset)
22299 {
22300 rtx vcall_offset_rtx = GEN_INT (vcall_offset);
22301 rtx tmp = gen_rtx_REG (Pmode, 12);
22302
22303 emit_move_insn (tmp, gen_rtx_MEM (Pmode, this_rtx));
22304 if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
22305 {
22306 emit_insn (gen_add3_insn (tmp, tmp, vcall_offset_rtx));
22307 emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
22308 }
22309 else
22310 {
22311 rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
22312
22313 emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
22314 }
22315 emit_insn (gen_add3_insn (this_rtx, this_rtx, tmp));
22316 }
22317
22318 /* Generate a tail call to the target function. */
22319 if (!TREE_USED (function))
22320 {
22321 assemble_external (function);
22322 TREE_USED (function) = 1;
22323 }
22324 funexp = XEXP (DECL_RTL (function), 0);
22325 funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
22326
22327 #if TARGET_MACHO
22328 if (MACHOPIC_INDIRECT)
22329 funexp = machopic_indirect_call_target (funexp);
22330 #endif
22331
22332 /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
22333 generate sibcall RTL explicitly. */
22334 insn = emit_call_insn (
22335 gen_rtx_PARALLEL (VOIDmode,
22336 gen_rtvec (4,
22337 gen_rtx_CALL (VOIDmode,
22338 funexp, const0_rtx),
22339 gen_rtx_USE (VOIDmode, const0_rtx),
22340 gen_rtx_USE (VOIDmode,
22341 gen_rtx_REG (SImode,
22342 LR_REGNO)),
22343 gen_rtx_RETURN (VOIDmode))));
22344 SIBLING_CALL_P (insn) = 1;
22345 emit_barrier ();
22346
22347 /* Run just enough of rest_of_compilation to get the insns emitted.
22348 There's not really enough bulk here to make other passes such as
22349 instruction scheduling worth while. Note that use_thunk calls
22350 assemble_start_function and assemble_end_function. */
22351 insn = get_insns ();
22352 insn_locators_alloc ();
22353 shorten_branches (insn);
22354 final_start_function (insn, file, 1);
22355 final (insn, file, 1);
22356 final_end_function ();
22357
22358 reload_completed = 0;
22359 epilogue_completed = 0;
22360 }
22361 \f
22362 /* A quick summary of the various types of 'constant-pool tables'
22363 under PowerPC:
22364
22365 Target Flags Name One table per
22366 AIX (none) AIX TOC object file
22367 AIX -mfull-toc AIX TOC object file
22368 AIX -mminimal-toc AIX minimal TOC translation unit
22369 SVR4/EABI (none) SVR4 SDATA object file
22370 SVR4/EABI -fpic SVR4 pic object file
22371 SVR4/EABI -fPIC SVR4 PIC translation unit
22372 SVR4/EABI -mrelocatable EABI TOC function
22373 SVR4/EABI -maix AIX TOC object file
22374 SVR4/EABI -maix -mminimal-toc
22375 AIX minimal TOC translation unit
22376
22377 Name Reg. Set by entries contains:
22378 made by addrs? fp? sum?
22379
22380 AIX TOC 2 crt0 as Y option option
22381 AIX minimal TOC 30 prolog gcc Y Y option
22382 SVR4 SDATA 13 crt0 gcc N Y N
22383 SVR4 pic 30 prolog ld Y not yet N
22384 SVR4 PIC 30 prolog gcc Y option option
22385 EABI TOC 30 prolog gcc Y option option
22386
22387 */
22388
22389 /* Hash functions for the hash table. */
22390
22391 static unsigned
22392 rs6000_hash_constant (rtx k)
22393 {
22394 enum rtx_code code = GET_CODE (k);
22395 enum machine_mode mode = GET_MODE (k);
22396 unsigned result = (code << 3) ^ mode;
22397 const char *format;
22398 int flen, fidx;
22399
22400 format = GET_RTX_FORMAT (code);
22401 flen = strlen (format);
22402 fidx = 0;
22403
22404 switch (code)
22405 {
22406 case LABEL_REF:
22407 return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
22408
22409 case CONST_DOUBLE:
22410 if (mode != VOIDmode)
22411 return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
22412 flen = 2;
22413 break;
22414
22415 case CODE_LABEL:
22416 fidx = 3;
22417 break;
22418
22419 default:
22420 break;
22421 }
22422
22423 for (; fidx < flen; fidx++)
22424 switch (format[fidx])
22425 {
22426 case 's':
22427 {
22428 unsigned i, len;
22429 const char *str = XSTR (k, fidx);
22430 len = strlen (str);
22431 result = result * 613 + len;
22432 for (i = 0; i < len; i++)
22433 result = result * 613 + (unsigned) str[i];
22434 break;
22435 }
22436 case 'u':
22437 case 'e':
22438 result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
22439 break;
22440 case 'i':
22441 case 'n':
22442 result = result * 613 + (unsigned) XINT (k, fidx);
22443 break;
22444 case 'w':
22445 if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
22446 result = result * 613 + (unsigned) XWINT (k, fidx);
22447 else
22448 {
22449 size_t i;
22450 for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
22451 result = result * 613 + (unsigned) (XWINT (k, fidx)
22452 >> CHAR_BIT * i);
22453 }
22454 break;
22455 case '0':
22456 break;
22457 default:
22458 gcc_unreachable ();
22459 }
22460
22461 return result;
22462 }
22463
22464 static unsigned
22465 toc_hash_function (const void *hash_entry)
22466 {
22467 const struct toc_hash_struct *thc =
22468 (const struct toc_hash_struct *) hash_entry;
22469 return rs6000_hash_constant (thc->key) ^ thc->key_mode;
22470 }
22471
22472 /* Compare H1 and H2 for equivalence. */
22473
22474 static int
22475 toc_hash_eq (const void *h1, const void *h2)
22476 {
22477 rtx r1 = ((const struct toc_hash_struct *) h1)->key;
22478 rtx r2 = ((const struct toc_hash_struct *) h2)->key;
22479
22480 if (((const struct toc_hash_struct *) h1)->key_mode
22481 != ((const struct toc_hash_struct *) h2)->key_mode)
22482 return 0;
22483
22484 return rtx_equal_p (r1, r2);
22485 }
22486
22487 /* These are the names given by the C++ front-end to vtables, and
22488 vtable-like objects. Ideally, this logic should not be here;
22489 instead, there should be some programmatic way of inquiring as
22490 to whether or not an object is a vtable. */
22491
22492 #define VTABLE_NAME_P(NAME) \
22493 (strncmp ("_vt.", name, strlen ("_vt.")) == 0 \
22494 || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0 \
22495 || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0 \
22496 || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0 \
22497 || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
22498
22499 #ifdef NO_DOLLAR_IN_LABEL
22500 /* Return a GGC-allocated character string translating dollar signs in
22501 input NAME to underscores. Used by XCOFF ASM_OUTPUT_LABELREF. */
22502
22503 const char *
22504 rs6000_xcoff_strip_dollar (const char *name)
22505 {
22506 char *strip, *p;
22507 int len;
22508
22509 p = strchr (name, '$');
22510
22511 if (p == 0 || p == name)
22512 return name;
22513
22514 len = strlen (name);
22515 strip = (char *) alloca (len + 1);
22516 strcpy (strip, name);
22517 p = strchr (strip, '$');
22518 while (p)
22519 {
22520 *p = '_';
22521 p = strchr (p + 1, '$');
22522 }
22523
22524 return ggc_alloc_string (strip, len);
22525 }
22526 #endif
22527
22528 void
22529 rs6000_output_symbol_ref (FILE *file, rtx x)
22530 {
22531 /* Currently C++ toc references to vtables can be emitted before it
22532 is decided whether the vtable is public or private. If this is
22533 the case, then the linker will eventually complain that there is
22534 a reference to an unknown section. Thus, for vtables only,
22535 we emit the TOC reference to reference the symbol and not the
22536 section. */
22537 const char *name = XSTR (x, 0);
22538
22539 if (VTABLE_NAME_P (name))
22540 {
22541 RS6000_OUTPUT_BASENAME (file, name);
22542 }
22543 else
22544 assemble_name (file, name);
22545 }
22546
22547 /* Output a TOC entry. We derive the entry name from what is being
22548 written. */
22549
22550 void
22551 output_toc (FILE *file, rtx x, int labelno, enum machine_mode mode)
22552 {
22553 char buf[256];
22554 const char *name = buf;
22555 rtx base = x;
22556 HOST_WIDE_INT offset = 0;
22557
22558 gcc_assert (!TARGET_NO_TOC);
22559
22560 /* When the linker won't eliminate them, don't output duplicate
22561 TOC entries (this happens on AIX if there is any kind of TOC,
22562 and on SVR4 under -fPIC or -mrelocatable). Don't do this for
22563 CODE_LABELs. */
22564 if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
22565 {
22566 struct toc_hash_struct *h;
22567 void * * found;
22568
22569 /* Create toc_hash_table. This can't be done at TARGET_OPTION_OVERRIDE
22570 time because GGC is not initialized at that point. */
22571 if (toc_hash_table == NULL)
22572 toc_hash_table = htab_create_ggc (1021, toc_hash_function,
22573 toc_hash_eq, NULL);
22574
22575 h = ggc_alloc_toc_hash_struct ();
22576 h->key = x;
22577 h->key_mode = mode;
22578 h->labelno = labelno;
22579
22580 found = htab_find_slot (toc_hash_table, h, INSERT);
22581 if (*found == NULL)
22582 *found = h;
22583 else /* This is indeed a duplicate.
22584 Set this label equal to that label. */
22585 {
22586 fputs ("\t.set ", file);
22587 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
22588 fprintf (file, "%d,", labelno);
22589 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
22590 fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
22591 found)->labelno));
22592 return;
22593 }
22594 }
22595
22596 /* If we're going to put a double constant in the TOC, make sure it's
22597 aligned properly when strict alignment is on. */
22598 if (GET_CODE (x) == CONST_DOUBLE
22599 && STRICT_ALIGNMENT
22600 && GET_MODE_BITSIZE (mode) >= 64
22601 && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
22602 ASM_OUTPUT_ALIGN (file, 3);
22603 }
22604
22605 (*targetm.asm_out.internal_label) (file, "LC", labelno);
22606
22607 /* Handle FP constants specially. Note that if we have a minimal
22608 TOC, things we put here aren't actually in the TOC, so we can allow
22609 FP constants. */
22610 if (GET_CODE (x) == CONST_DOUBLE &&
22611 (GET_MODE (x) == TFmode || GET_MODE (x) == TDmode))
22612 {
22613 REAL_VALUE_TYPE rv;
22614 long k[4];
22615
22616 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22617 if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22618 REAL_VALUE_TO_TARGET_DECIMAL128 (rv, k);
22619 else
22620 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
22621
22622 if (TARGET_64BIT)
22623 {
22624 if (TARGET_MINIMAL_TOC)
22625 fputs (DOUBLE_INT_ASM_OP, file);
22626 else
22627 fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
22628 k[0] & 0xffffffff, k[1] & 0xffffffff,
22629 k[2] & 0xffffffff, k[3] & 0xffffffff);
22630 fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
22631 k[0] & 0xffffffff, k[1] & 0xffffffff,
22632 k[2] & 0xffffffff, k[3] & 0xffffffff);
22633 return;
22634 }
22635 else
22636 {
22637 if (TARGET_MINIMAL_TOC)
22638 fputs ("\t.long ", file);
22639 else
22640 fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
22641 k[0] & 0xffffffff, k[1] & 0xffffffff,
22642 k[2] & 0xffffffff, k[3] & 0xffffffff);
22643 fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
22644 k[0] & 0xffffffff, k[1] & 0xffffffff,
22645 k[2] & 0xffffffff, k[3] & 0xffffffff);
22646 return;
22647 }
22648 }
22649 else if (GET_CODE (x) == CONST_DOUBLE &&
22650 (GET_MODE (x) == DFmode || GET_MODE (x) == DDmode))
22651 {
22652 REAL_VALUE_TYPE rv;
22653 long k[2];
22654
22655 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22656
22657 if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22658 REAL_VALUE_TO_TARGET_DECIMAL64 (rv, k);
22659 else
22660 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
22661
22662 if (TARGET_64BIT)
22663 {
22664 if (TARGET_MINIMAL_TOC)
22665 fputs (DOUBLE_INT_ASM_OP, file);
22666 else
22667 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
22668 k[0] & 0xffffffff, k[1] & 0xffffffff);
22669 fprintf (file, "0x%lx%08lx\n",
22670 k[0] & 0xffffffff, k[1] & 0xffffffff);
22671 return;
22672 }
22673 else
22674 {
22675 if (TARGET_MINIMAL_TOC)
22676 fputs ("\t.long ", file);
22677 else
22678 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
22679 k[0] & 0xffffffff, k[1] & 0xffffffff);
22680 fprintf (file, "0x%lx,0x%lx\n",
22681 k[0] & 0xffffffff, k[1] & 0xffffffff);
22682 return;
22683 }
22684 }
22685 else if (GET_CODE (x) == CONST_DOUBLE &&
22686 (GET_MODE (x) == SFmode || GET_MODE (x) == SDmode))
22687 {
22688 REAL_VALUE_TYPE rv;
22689 long l;
22690
22691 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
22692 if (DECIMAL_FLOAT_MODE_P (GET_MODE (x)))
22693 REAL_VALUE_TO_TARGET_DECIMAL32 (rv, l);
22694 else
22695 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
22696
22697 if (TARGET_64BIT)
22698 {
22699 if (TARGET_MINIMAL_TOC)
22700 fputs (DOUBLE_INT_ASM_OP, file);
22701 else
22702 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
22703 fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
22704 return;
22705 }
22706 else
22707 {
22708 if (TARGET_MINIMAL_TOC)
22709 fputs ("\t.long ", file);
22710 else
22711 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
22712 fprintf (file, "0x%lx\n", l & 0xffffffff);
22713 return;
22714 }
22715 }
22716 else if (GET_MODE (x) == VOIDmode
22717 && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
22718 {
22719 unsigned HOST_WIDE_INT low;
22720 HOST_WIDE_INT high;
22721
22722 if (GET_CODE (x) == CONST_DOUBLE)
22723 {
22724 low = CONST_DOUBLE_LOW (x);
22725 high = CONST_DOUBLE_HIGH (x);
22726 }
22727 else
22728 #if HOST_BITS_PER_WIDE_INT == 32
22729 {
22730 low = INTVAL (x);
22731 high = (low & 0x80000000) ? ~0 : 0;
22732 }
22733 #else
22734 {
22735 low = INTVAL (x) & 0xffffffff;
22736 high = (HOST_WIDE_INT) INTVAL (x) >> 32;
22737 }
22738 #endif
22739
22740 /* TOC entries are always Pmode-sized, but since this
22741 is a bigendian machine then if we're putting smaller
22742 integer constants in the TOC we have to pad them.
22743 (This is still a win over putting the constants in
22744 a separate constant pool, because then we'd have
22745 to have both a TOC entry _and_ the actual constant.)
22746
22747 For a 32-bit target, CONST_INT values are loaded and shifted
22748 entirely within `low' and can be stored in one TOC entry. */
22749
22750 /* It would be easy to make this work, but it doesn't now. */
22751 gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
22752
22753 if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
22754 {
22755 #if HOST_BITS_PER_WIDE_INT == 32
22756 lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
22757 POINTER_SIZE, &low, &high, 0);
22758 #else
22759 low |= high << 32;
22760 low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
22761 high = (HOST_WIDE_INT) low >> 32;
22762 low &= 0xffffffff;
22763 #endif
22764 }
22765
22766 if (TARGET_64BIT)
22767 {
22768 if (TARGET_MINIMAL_TOC)
22769 fputs (DOUBLE_INT_ASM_OP, file);
22770 else
22771 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
22772 (long) high & 0xffffffff, (long) low & 0xffffffff);
22773 fprintf (file, "0x%lx%08lx\n",
22774 (long) high & 0xffffffff, (long) low & 0xffffffff);
22775 return;
22776 }
22777 else
22778 {
22779 if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
22780 {
22781 if (TARGET_MINIMAL_TOC)
22782 fputs ("\t.long ", file);
22783 else
22784 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
22785 (long) high & 0xffffffff, (long) low & 0xffffffff);
22786 fprintf (file, "0x%lx,0x%lx\n",
22787 (long) high & 0xffffffff, (long) low & 0xffffffff);
22788 }
22789 else
22790 {
22791 if (TARGET_MINIMAL_TOC)
22792 fputs ("\t.long ", file);
22793 else
22794 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
22795 fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
22796 }
22797 return;
22798 }
22799 }
22800
22801 if (GET_CODE (x) == CONST)
22802 {
22803 gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS
22804 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT);
22805
22806 base = XEXP (XEXP (x, 0), 0);
22807 offset = INTVAL (XEXP (XEXP (x, 0), 1));
22808 }
22809
22810 switch (GET_CODE (base))
22811 {
22812 case SYMBOL_REF:
22813 name = XSTR (base, 0);
22814 break;
22815
22816 case LABEL_REF:
22817 ASM_GENERATE_INTERNAL_LABEL (buf, "L",
22818 CODE_LABEL_NUMBER (XEXP (base, 0)));
22819 break;
22820
22821 case CODE_LABEL:
22822 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
22823 break;
22824
22825 default:
22826 gcc_unreachable ();
22827 }
22828
22829 if (TARGET_MINIMAL_TOC)
22830 fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
22831 else
22832 {
22833 fputs ("\t.tc ", file);
22834 RS6000_OUTPUT_BASENAME (file, name);
22835
22836 if (offset < 0)
22837 fprintf (file, ".N" HOST_WIDE_INT_PRINT_UNSIGNED, - offset);
22838 else if (offset)
22839 fprintf (file, ".P" HOST_WIDE_INT_PRINT_UNSIGNED, offset);
22840
22841 fputs ("[TC],", file);
22842 }
22843
22844 /* Currently C++ toc references to vtables can be emitted before it
22845 is decided whether the vtable is public or private. If this is
22846 the case, then the linker will eventually complain that there is
22847 a TOC reference to an unknown section. Thus, for vtables only,
22848 we emit the TOC reference to reference the symbol and not the
22849 section. */
22850 if (VTABLE_NAME_P (name))
22851 {
22852 RS6000_OUTPUT_BASENAME (file, name);
22853 if (offset < 0)
22854 fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset);
22855 else if (offset > 0)
22856 fprintf (file, "+" HOST_WIDE_INT_PRINT_DEC, offset);
22857 }
22858 else
22859 output_addr_const (file, x);
22860 putc ('\n', file);
22861 }
22862 \f
22863 /* Output an assembler pseudo-op to write an ASCII string of N characters
22864 starting at P to FILE.
22865
22866 On the RS/6000, we have to do this using the .byte operation and
22867 write out special characters outside the quoted string.
22868 Also, the assembler is broken; very long strings are truncated,
22869 so we must artificially break them up early. */
22870
22871 void
22872 output_ascii (FILE *file, const char *p, int n)
22873 {
22874 char c;
22875 int i, count_string;
22876 const char *for_string = "\t.byte \"";
22877 const char *for_decimal = "\t.byte ";
22878 const char *to_close = NULL;
22879
22880 count_string = 0;
22881 for (i = 0; i < n; i++)
22882 {
22883 c = *p++;
22884 if (c >= ' ' && c < 0177)
22885 {
22886 if (for_string)
22887 fputs (for_string, file);
22888 putc (c, file);
22889
22890 /* Write two quotes to get one. */
22891 if (c == '"')
22892 {
22893 putc (c, file);
22894 ++count_string;
22895 }
22896
22897 for_string = NULL;
22898 for_decimal = "\"\n\t.byte ";
22899 to_close = "\"\n";
22900 ++count_string;
22901
22902 if (count_string >= 512)
22903 {
22904 fputs (to_close, file);
22905
22906 for_string = "\t.byte \"";
22907 for_decimal = "\t.byte ";
22908 to_close = NULL;
22909 count_string = 0;
22910 }
22911 }
22912 else
22913 {
22914 if (for_decimal)
22915 fputs (for_decimal, file);
22916 fprintf (file, "%d", c);
22917
22918 for_string = "\n\t.byte \"";
22919 for_decimal = ", ";
22920 to_close = "\n";
22921 count_string = 0;
22922 }
22923 }
22924
22925 /* Now close the string if we have written one. Then end the line. */
22926 if (to_close)
22927 fputs (to_close, file);
22928 }
22929 \f
22930 /* Generate a unique section name for FILENAME for a section type
22931 represented by SECTION_DESC. Output goes into BUF.
22932
22933 SECTION_DESC can be any string, as long as it is different for each
22934 possible section type.
22935
22936 We name the section in the same manner as xlc. The name begins with an
22937 underscore followed by the filename (after stripping any leading directory
22938 names) with the last period replaced by the string SECTION_DESC. If
22939 FILENAME does not contain a period, SECTION_DESC is appended to the end of
22940 the name. */
22941
22942 void
22943 rs6000_gen_section_name (char **buf, const char *filename,
22944 const char *section_desc)
22945 {
22946 const char *q, *after_last_slash, *last_period = 0;
22947 char *p;
22948 int len;
22949
22950 after_last_slash = filename;
22951 for (q = filename; *q; q++)
22952 {
22953 if (*q == '/')
22954 after_last_slash = q + 1;
22955 else if (*q == '.')
22956 last_period = q;
22957 }
22958
22959 len = strlen (after_last_slash) + strlen (section_desc) + 2;
22960 *buf = (char *) xmalloc (len);
22961
22962 p = *buf;
22963 *p++ = '_';
22964
22965 for (q = after_last_slash; *q; q++)
22966 {
22967 if (q == last_period)
22968 {
22969 strcpy (p, section_desc);
22970 p += strlen (section_desc);
22971 break;
22972 }
22973
22974 else if (ISALNUM (*q))
22975 *p++ = *q;
22976 }
22977
22978 if (last_period == 0)
22979 strcpy (p, section_desc);
22980 else
22981 *p = '\0';
22982 }
22983 \f
22984 /* Emit profile function. */
22985
22986 void
22987 output_profile_hook (int labelno ATTRIBUTE_UNUSED)
22988 {
22989 /* Non-standard profiling for kernels, which just saves LR then calls
22990 _mcount without worrying about arg saves. The idea is to change
22991 the function prologue as little as possible as it isn't easy to
22992 account for arg save/restore code added just for _mcount. */
22993 if (TARGET_PROFILE_KERNEL)
22994 return;
22995
22996 if (DEFAULT_ABI == ABI_AIX)
22997 {
22998 #ifndef NO_PROFILE_COUNTERS
22999 # define NO_PROFILE_COUNTERS 0
23000 #endif
23001 if (NO_PROFILE_COUNTERS)
23002 emit_library_call (init_one_libfunc (RS6000_MCOUNT),
23003 LCT_NORMAL, VOIDmode, 0);
23004 else
23005 {
23006 char buf[30];
23007 const char *label_name;
23008 rtx fun;
23009
23010 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
23011 label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
23012 fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
23013
23014 emit_library_call (init_one_libfunc (RS6000_MCOUNT),
23015 LCT_NORMAL, VOIDmode, 1, fun, Pmode);
23016 }
23017 }
23018 else if (DEFAULT_ABI == ABI_DARWIN)
23019 {
23020 const char *mcount_name = RS6000_MCOUNT;
23021 int caller_addr_regno = LR_REGNO;
23022
23023 /* Be conservative and always set this, at least for now. */
23024 crtl->uses_pic_offset_table = 1;
23025
23026 #if TARGET_MACHO
23027 /* For PIC code, set up a stub and collect the caller's address
23028 from r0, which is where the prologue puts it. */
23029 if (MACHOPIC_INDIRECT
23030 && crtl->uses_pic_offset_table)
23031 caller_addr_regno = 0;
23032 #endif
23033 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
23034 LCT_NORMAL, VOIDmode, 1,
23035 gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
23036 }
23037 }
23038
23039 /* Write function profiler code. */
23040
23041 void
23042 output_function_profiler (FILE *file, int labelno)
23043 {
23044 char buf[100];
23045
23046 switch (DEFAULT_ABI)
23047 {
23048 default:
23049 gcc_unreachable ();
23050
23051 case ABI_V4:
23052 if (!TARGET_32BIT)
23053 {
23054 warning (0, "no profiling of 64-bit code for this ABI");
23055 return;
23056 }
23057 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
23058 fprintf (file, "\tmflr %s\n", reg_names[0]);
23059 if (NO_PROFILE_COUNTERS)
23060 {
23061 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
23062 reg_names[0], reg_names[1]);
23063 }
23064 else if (TARGET_SECURE_PLT && flag_pic)
23065 {
23066 asm_fprintf (file, "\tbcl 20,31,1f\n1:\n\t{st|stw} %s,4(%s)\n",
23067 reg_names[0], reg_names[1]);
23068 asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
23069 asm_fprintf (file, "\t{cau|addis} %s,%s,",
23070 reg_names[12], reg_names[12]);
23071 assemble_name (file, buf);
23072 asm_fprintf (file, "-1b@ha\n\t{cal|la} %s,", reg_names[0]);
23073 assemble_name (file, buf);
23074 asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
23075 }
23076 else if (flag_pic == 1)
23077 {
23078 fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
23079 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
23080 reg_names[0], reg_names[1]);
23081 asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
23082 asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
23083 assemble_name (file, buf);
23084 asm_fprintf (file, "@got(%s)\n", reg_names[12]);
23085 }
23086 else if (flag_pic > 1)
23087 {
23088 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
23089 reg_names[0], reg_names[1]);
23090 /* Now, we need to get the address of the label. */
23091 fputs ("\tbcl 20,31,1f\n\t.long ", file);
23092 assemble_name (file, buf);
23093 fputs ("-.\n1:", file);
23094 asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
23095 asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
23096 reg_names[0], reg_names[11]);
23097 asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
23098 reg_names[0], reg_names[0], reg_names[11]);
23099 }
23100 else
23101 {
23102 asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
23103 assemble_name (file, buf);
23104 fputs ("@ha\n", file);
23105 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
23106 reg_names[0], reg_names[1]);
23107 asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
23108 assemble_name (file, buf);
23109 asm_fprintf (file, "@l(%s)\n", reg_names[12]);
23110 }
23111
23112 /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH. */
23113 fprintf (file, "\tbl %s%s\n",
23114 RS6000_MCOUNT, flag_pic ? "@plt" : "");
23115 break;
23116
23117 case ABI_AIX:
23118 case ABI_DARWIN:
23119 if (!TARGET_PROFILE_KERNEL)
23120 {
23121 /* Don't do anything, done in output_profile_hook (). */
23122 }
23123 else
23124 {
23125 gcc_assert (!TARGET_32BIT);
23126
23127 asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
23128 asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
23129
23130 if (cfun->static_chain_decl != NULL)
23131 {
23132 asm_fprintf (file, "\tstd %s,24(%s)\n",
23133 reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
23134 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
23135 asm_fprintf (file, "\tld %s,24(%s)\n",
23136 reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
23137 }
23138 else
23139 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
23140 }
23141 break;
23142 }
23143 }
23144
23145 \f
23146
23147 /* The following variable value is the last issued insn. */
23148
23149 static rtx last_scheduled_insn;
23150
23151 /* The following variable helps to balance issuing of load and
23152 store instructions */
23153
23154 static int load_store_pendulum;
23155
23156 /* Power4 load update and store update instructions are cracked into a
23157 load or store and an integer insn which are executed in the same cycle.
23158 Branches have their own dispatch slot which does not count against the
23159 GCC issue rate, but it changes the program flow so there are no other
23160 instructions to issue in this cycle. */
23161
23162 static int
23163 rs6000_variable_issue_1 (rtx insn, int more)
23164 {
23165 last_scheduled_insn = insn;
23166 if (GET_CODE (PATTERN (insn)) == USE
23167 || GET_CODE (PATTERN (insn)) == CLOBBER)
23168 {
23169 cached_can_issue_more = more;
23170 return cached_can_issue_more;
23171 }
23172
23173 if (insn_terminates_group_p (insn, current_group))
23174 {
23175 cached_can_issue_more = 0;
23176 return cached_can_issue_more;
23177 }
23178
23179 /* If no reservation, but reach here */
23180 if (recog_memoized (insn) < 0)
23181 return more;
23182
23183 if (rs6000_sched_groups)
23184 {
23185 if (is_microcoded_insn (insn))
23186 cached_can_issue_more = 0;
23187 else if (is_cracked_insn (insn))
23188 cached_can_issue_more = more > 2 ? more - 2 : 0;
23189 else
23190 cached_can_issue_more = more - 1;
23191
23192 return cached_can_issue_more;
23193 }
23194
23195 if (rs6000_cpu_attr == CPU_CELL && is_nonpipeline_insn (insn))
23196 return 0;
23197
23198 cached_can_issue_more = more - 1;
23199 return cached_can_issue_more;
23200 }
23201
23202 static int
23203 rs6000_variable_issue (FILE *stream, int verbose, rtx insn, int more)
23204 {
23205 int r = rs6000_variable_issue_1 (insn, more);
23206 if (verbose)
23207 fprintf (stream, "// rs6000_variable_issue (more = %d) = %d\n", more, r);
23208 return r;
23209 }
23210
23211 /* Adjust the cost of a scheduling dependency. Return the new cost of
23212 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
23213
23214 static int
23215 rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
23216 {
23217 enum attr_type attr_type;
23218
23219 if (! recog_memoized (insn))
23220 return 0;
23221
23222 switch (REG_NOTE_KIND (link))
23223 {
23224 case REG_DEP_TRUE:
23225 {
23226 /* Data dependency; DEP_INSN writes a register that INSN reads
23227 some cycles later. */
23228
23229 /* Separate a load from a narrower, dependent store. */
23230 if (rs6000_sched_groups
23231 && GET_CODE (PATTERN (insn)) == SET
23232 && GET_CODE (PATTERN (dep_insn)) == SET
23233 && GET_CODE (XEXP (PATTERN (insn), 1)) == MEM
23234 && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == MEM
23235 && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
23236 > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
23237 return cost + 14;
23238
23239 attr_type = get_attr_type (insn);
23240
23241 switch (attr_type)
23242 {
23243 case TYPE_JMPREG:
23244 /* Tell the first scheduling pass about the latency between
23245 a mtctr and bctr (and mtlr and br/blr). The first
23246 scheduling pass will not know about this latency since
23247 the mtctr instruction, which has the latency associated
23248 to it, will be generated by reload. */
23249 return TARGET_POWER ? 5 : 4;
23250 case TYPE_BRANCH:
23251 /* Leave some extra cycles between a compare and its
23252 dependent branch, to inhibit expensive mispredicts. */
23253 if ((rs6000_cpu_attr == CPU_PPC603
23254 || rs6000_cpu_attr == CPU_PPC604
23255 || rs6000_cpu_attr == CPU_PPC604E
23256 || rs6000_cpu_attr == CPU_PPC620
23257 || rs6000_cpu_attr == CPU_PPC630
23258 || rs6000_cpu_attr == CPU_PPC750
23259 || rs6000_cpu_attr == CPU_PPC7400
23260 || rs6000_cpu_attr == CPU_PPC7450
23261 || rs6000_cpu_attr == CPU_POWER4
23262 || rs6000_cpu_attr == CPU_POWER5
23263 || rs6000_cpu_attr == CPU_POWER7
23264 || rs6000_cpu_attr == CPU_CELL)
23265 && recog_memoized (dep_insn)
23266 && (INSN_CODE (dep_insn) >= 0))
23267
23268 switch (get_attr_type (dep_insn))
23269 {
23270 case TYPE_CMP:
23271 case TYPE_COMPARE:
23272 case TYPE_DELAYED_COMPARE:
23273 case TYPE_IMUL_COMPARE:
23274 case TYPE_LMUL_COMPARE:
23275 case TYPE_FPCOMPARE:
23276 case TYPE_CR_LOGICAL:
23277 case TYPE_DELAYED_CR:
23278 return cost + 2;
23279 default:
23280 break;
23281 }
23282 break;
23283
23284 case TYPE_STORE:
23285 case TYPE_STORE_U:
23286 case TYPE_STORE_UX:
23287 case TYPE_FPSTORE:
23288 case TYPE_FPSTORE_U:
23289 case TYPE_FPSTORE_UX:
23290 if ((rs6000_cpu == PROCESSOR_POWER6)
23291 && recog_memoized (dep_insn)
23292 && (INSN_CODE (dep_insn) >= 0))
23293 {
23294
23295 if (GET_CODE (PATTERN (insn)) != SET)
23296 /* If this happens, we have to extend this to schedule
23297 optimally. Return default for now. */
23298 return cost;
23299
23300 /* Adjust the cost for the case where the value written
23301 by a fixed point operation is used as the address
23302 gen value on a store. */
23303 switch (get_attr_type (dep_insn))
23304 {
23305 case TYPE_LOAD:
23306 case TYPE_LOAD_U:
23307 case TYPE_LOAD_UX:
23308 case TYPE_CNTLZ:
23309 {
23310 if (! store_data_bypass_p (dep_insn, insn))
23311 return 4;
23312 break;
23313 }
23314 case TYPE_LOAD_EXT:
23315 case TYPE_LOAD_EXT_U:
23316 case TYPE_LOAD_EXT_UX:
23317 case TYPE_VAR_SHIFT_ROTATE:
23318 case TYPE_VAR_DELAYED_COMPARE:
23319 {
23320 if (! store_data_bypass_p (dep_insn, insn))
23321 return 6;
23322 break;
23323 }
23324 case TYPE_INTEGER:
23325 case TYPE_COMPARE:
23326 case TYPE_FAST_COMPARE:
23327 case TYPE_EXTS:
23328 case TYPE_SHIFT:
23329 case TYPE_INSERT_WORD:
23330 case TYPE_INSERT_DWORD:
23331 case TYPE_FPLOAD_U:
23332 case TYPE_FPLOAD_UX:
23333 case TYPE_STORE_U:
23334 case TYPE_STORE_UX:
23335 case TYPE_FPSTORE_U:
23336 case TYPE_FPSTORE_UX:
23337 {
23338 if (! store_data_bypass_p (dep_insn, insn))
23339 return 3;
23340 break;
23341 }
23342 case TYPE_IMUL:
23343 case TYPE_IMUL2:
23344 case TYPE_IMUL3:
23345 case TYPE_LMUL:
23346 case TYPE_IMUL_COMPARE:
23347 case TYPE_LMUL_COMPARE:
23348 {
23349 if (! store_data_bypass_p (dep_insn, insn))
23350 return 17;
23351 break;
23352 }
23353 case TYPE_IDIV:
23354 {
23355 if (! store_data_bypass_p (dep_insn, insn))
23356 return 45;
23357 break;
23358 }
23359 case TYPE_LDIV:
23360 {
23361 if (! store_data_bypass_p (dep_insn, insn))
23362 return 57;
23363 break;
23364 }
23365 default:
23366 break;
23367 }
23368 }
23369 break;
23370
23371 case TYPE_LOAD:
23372 case TYPE_LOAD_U:
23373 case TYPE_LOAD_UX:
23374 case TYPE_LOAD_EXT:
23375 case TYPE_LOAD_EXT_U:
23376 case TYPE_LOAD_EXT_UX:
23377 if ((rs6000_cpu == PROCESSOR_POWER6)
23378 && recog_memoized (dep_insn)
23379 && (INSN_CODE (dep_insn) >= 0))
23380 {
23381
23382 /* Adjust the cost for the case where the value written
23383 by a fixed point instruction is used within the address
23384 gen portion of a subsequent load(u)(x) */
23385 switch (get_attr_type (dep_insn))
23386 {
23387 case TYPE_LOAD:
23388 case TYPE_LOAD_U:
23389 case TYPE_LOAD_UX:
23390 case TYPE_CNTLZ:
23391 {
23392 if (set_to_load_agen (dep_insn, insn))
23393 return 4;
23394 break;
23395 }
23396 case TYPE_LOAD_EXT:
23397 case TYPE_LOAD_EXT_U:
23398 case TYPE_LOAD_EXT_UX:
23399 case TYPE_VAR_SHIFT_ROTATE:
23400 case TYPE_VAR_DELAYED_COMPARE:
23401 {
23402 if (set_to_load_agen (dep_insn, insn))
23403 return 6;
23404 break;
23405 }
23406 case TYPE_INTEGER:
23407 case TYPE_COMPARE:
23408 case TYPE_FAST_COMPARE:
23409 case TYPE_EXTS:
23410 case TYPE_SHIFT:
23411 case TYPE_INSERT_WORD:
23412 case TYPE_INSERT_DWORD:
23413 case TYPE_FPLOAD_U:
23414 case TYPE_FPLOAD_UX:
23415 case TYPE_STORE_U:
23416 case TYPE_STORE_UX:
23417 case TYPE_FPSTORE_U:
23418 case TYPE_FPSTORE_UX:
23419 {
23420 if (set_to_load_agen (dep_insn, insn))
23421 return 3;
23422 break;
23423 }
23424 case TYPE_IMUL:
23425 case TYPE_IMUL2:
23426 case TYPE_IMUL3:
23427 case TYPE_LMUL:
23428 case TYPE_IMUL_COMPARE:
23429 case TYPE_LMUL_COMPARE:
23430 {
23431 if (set_to_load_agen (dep_insn, insn))
23432 return 17;
23433 break;
23434 }
23435 case TYPE_IDIV:
23436 {
23437 if (set_to_load_agen (dep_insn, insn))
23438 return 45;
23439 break;
23440 }
23441 case TYPE_LDIV:
23442 {
23443 if (set_to_load_agen (dep_insn, insn))
23444 return 57;
23445 break;
23446 }
23447 default:
23448 break;
23449 }
23450 }
23451 break;
23452
23453 case TYPE_FPLOAD:
23454 if ((rs6000_cpu == PROCESSOR_POWER6)
23455 && recog_memoized (dep_insn)
23456 && (INSN_CODE (dep_insn) >= 0)
23457 && (get_attr_type (dep_insn) == TYPE_MFFGPR))
23458 return 2;
23459
23460 default:
23461 break;
23462 }
23463
23464 /* Fall out to return default cost. */
23465 }
23466 break;
23467
23468 case REG_DEP_OUTPUT:
23469 /* Output dependency; DEP_INSN writes a register that INSN writes some
23470 cycles later. */
23471 if ((rs6000_cpu == PROCESSOR_POWER6)
23472 && recog_memoized (dep_insn)
23473 && (INSN_CODE (dep_insn) >= 0))
23474 {
23475 attr_type = get_attr_type (insn);
23476
23477 switch (attr_type)
23478 {
23479 case TYPE_FP:
23480 if (get_attr_type (dep_insn) == TYPE_FP)
23481 return 1;
23482 break;
23483 case TYPE_FPLOAD:
23484 if (get_attr_type (dep_insn) == TYPE_MFFGPR)
23485 return 2;
23486 break;
23487 default:
23488 break;
23489 }
23490 }
23491 case REG_DEP_ANTI:
23492 /* Anti dependency; DEP_INSN reads a register that INSN writes some
23493 cycles later. */
23494 return 0;
23495
23496 default:
23497 gcc_unreachable ();
23498 }
23499
23500 return cost;
23501 }
23502
23503 /* Debug version of rs6000_adjust_cost. */
23504
23505 static int
23506 rs6000_debug_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
23507 {
23508 int ret = rs6000_adjust_cost (insn, link, dep_insn, cost);
23509
23510 if (ret != cost)
23511 {
23512 const char *dep;
23513
23514 switch (REG_NOTE_KIND (link))
23515 {
23516 default: dep = "unknown depencency"; break;
23517 case REG_DEP_TRUE: dep = "data dependency"; break;
23518 case REG_DEP_OUTPUT: dep = "output dependency"; break;
23519 case REG_DEP_ANTI: dep = "anti depencency"; break;
23520 }
23521
23522 fprintf (stderr,
23523 "\nrs6000_adjust_cost, final cost = %d, orig cost = %d, "
23524 "%s, insn:\n", ret, cost, dep);
23525
23526 debug_rtx (insn);
23527 }
23528
23529 return ret;
23530 }
23531
23532 /* The function returns a true if INSN is microcoded.
23533 Return false otherwise. */
23534
23535 static bool
23536 is_microcoded_insn (rtx insn)
23537 {
23538 if (!insn || !NONDEBUG_INSN_P (insn)
23539 || GET_CODE (PATTERN (insn)) == USE
23540 || GET_CODE (PATTERN (insn)) == CLOBBER)
23541 return false;
23542
23543 if (rs6000_cpu_attr == CPU_CELL)
23544 return get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS;
23545
23546 if (rs6000_sched_groups)
23547 {
23548 enum attr_type type = get_attr_type (insn);
23549 if (type == TYPE_LOAD_EXT_U
23550 || type == TYPE_LOAD_EXT_UX
23551 || type == TYPE_LOAD_UX
23552 || type == TYPE_STORE_UX
23553 || type == TYPE_MFCR)
23554 return true;
23555 }
23556
23557 return false;
23558 }
23559
23560 /* The function returns true if INSN is cracked into 2 instructions
23561 by the processor (and therefore occupies 2 issue slots). */
23562
23563 static bool
23564 is_cracked_insn (rtx insn)
23565 {
23566 if (!insn || !NONDEBUG_INSN_P (insn)
23567 || GET_CODE (PATTERN (insn)) == USE
23568 || GET_CODE (PATTERN (insn)) == CLOBBER)
23569 return false;
23570
23571 if (rs6000_sched_groups)
23572 {
23573 enum attr_type type = get_attr_type (insn);
23574 if (type == TYPE_LOAD_U || type == TYPE_STORE_U
23575 || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
23576 || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
23577 || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
23578 || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
23579 || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
23580 || type == TYPE_IDIV || type == TYPE_LDIV
23581 || type == TYPE_INSERT_WORD)
23582 return true;
23583 }
23584
23585 return false;
23586 }
23587
23588 /* The function returns true if INSN can be issued only from
23589 the branch slot. */
23590
23591 static bool
23592 is_branch_slot_insn (rtx insn)
23593 {
23594 if (!insn || !NONDEBUG_INSN_P (insn)
23595 || GET_CODE (PATTERN (insn)) == USE
23596 || GET_CODE (PATTERN (insn)) == CLOBBER)
23597 return false;
23598
23599 if (rs6000_sched_groups)
23600 {
23601 enum attr_type type = get_attr_type (insn);
23602 if (type == TYPE_BRANCH || type == TYPE_JMPREG)
23603 return true;
23604 return false;
23605 }
23606
23607 return false;
23608 }
23609
23610 /* The function returns true if out_inst sets a value that is
23611 used in the address generation computation of in_insn */
23612 static bool
23613 set_to_load_agen (rtx out_insn, rtx in_insn)
23614 {
23615 rtx out_set, in_set;
23616
23617 /* For performance reasons, only handle the simple case where
23618 both loads are a single_set. */
23619 out_set = single_set (out_insn);
23620 if (out_set)
23621 {
23622 in_set = single_set (in_insn);
23623 if (in_set)
23624 return reg_mentioned_p (SET_DEST (out_set), SET_SRC (in_set));
23625 }
23626
23627 return false;
23628 }
23629
23630 /* The function returns true if the target storage location of
23631 out_insn is adjacent to the target storage location of in_insn */
23632 /* Return 1 if memory locations are adjacent. */
23633
23634 static bool
23635 adjacent_mem_locations (rtx insn1, rtx insn2)
23636 {
23637
23638 rtx a = get_store_dest (PATTERN (insn1));
23639 rtx b = get_store_dest (PATTERN (insn2));
23640
23641 if ((GET_CODE (XEXP (a, 0)) == REG
23642 || (GET_CODE (XEXP (a, 0)) == PLUS
23643 && GET_CODE (XEXP (XEXP (a, 0), 1)) == CONST_INT))
23644 && (GET_CODE (XEXP (b, 0)) == REG
23645 || (GET_CODE (XEXP (b, 0)) == PLUS
23646 && GET_CODE (XEXP (XEXP (b, 0), 1)) == CONST_INT)))
23647 {
23648 HOST_WIDE_INT val0 = 0, val1 = 0, val_diff;
23649 rtx reg0, reg1;
23650
23651 if (GET_CODE (XEXP (a, 0)) == PLUS)
23652 {
23653 reg0 = XEXP (XEXP (a, 0), 0);
23654 val0 = INTVAL (XEXP (XEXP (a, 0), 1));
23655 }
23656 else
23657 reg0 = XEXP (a, 0);
23658
23659 if (GET_CODE (XEXP (b, 0)) == PLUS)
23660 {
23661 reg1 = XEXP (XEXP (b, 0), 0);
23662 val1 = INTVAL (XEXP (XEXP (b, 0), 1));
23663 }
23664 else
23665 reg1 = XEXP (b, 0);
23666
23667 val_diff = val1 - val0;
23668
23669 return ((REGNO (reg0) == REGNO (reg1))
23670 && ((MEM_SIZE (a) && val_diff == INTVAL (MEM_SIZE (a)))
23671 || (MEM_SIZE (b) && val_diff == -INTVAL (MEM_SIZE (b)))));
23672 }
23673
23674 return false;
23675 }
23676
23677 /* A C statement (sans semicolon) to update the integer scheduling
23678 priority INSN_PRIORITY (INSN). Increase the priority to execute the
23679 INSN earlier, reduce the priority to execute INSN later. Do not
23680 define this macro if you do not need to adjust the scheduling
23681 priorities of insns. */
23682
23683 static int
23684 rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
23685 {
23686 /* On machines (like the 750) which have asymmetric integer units,
23687 where one integer unit can do multiply and divides and the other
23688 can't, reduce the priority of multiply/divide so it is scheduled
23689 before other integer operations. */
23690
23691 #if 0
23692 if (! INSN_P (insn))
23693 return priority;
23694
23695 if (GET_CODE (PATTERN (insn)) == USE)
23696 return priority;
23697
23698 switch (rs6000_cpu_attr) {
23699 case CPU_PPC750:
23700 switch (get_attr_type (insn))
23701 {
23702 default:
23703 break;
23704
23705 case TYPE_IMUL:
23706 case TYPE_IDIV:
23707 fprintf (stderr, "priority was %#x (%d) before adjustment\n",
23708 priority, priority);
23709 if (priority >= 0 && priority < 0x01000000)
23710 priority >>= 3;
23711 break;
23712 }
23713 }
23714 #endif
23715
23716 if (insn_must_be_first_in_group (insn)
23717 && reload_completed
23718 && current_sched_info->sched_max_insns_priority
23719 && rs6000_sched_restricted_insns_priority)
23720 {
23721
23722 /* Prioritize insns that can be dispatched only in the first
23723 dispatch slot. */
23724 if (rs6000_sched_restricted_insns_priority == 1)
23725 /* Attach highest priority to insn. This means that in
23726 haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
23727 precede 'priority' (critical path) considerations. */
23728 return current_sched_info->sched_max_insns_priority;
23729 else if (rs6000_sched_restricted_insns_priority == 2)
23730 /* Increase priority of insn by a minimal amount. This means that in
23731 haifa-sched.c:ready_sort(), only 'priority' (critical path)
23732 considerations precede dispatch-slot restriction considerations. */
23733 return (priority + 1);
23734 }
23735
23736 if (rs6000_cpu == PROCESSOR_POWER6
23737 && ((load_store_pendulum == -2 && is_load_insn (insn))
23738 || (load_store_pendulum == 2 && is_store_insn (insn))))
23739 /* Attach highest priority to insn if the scheduler has just issued two
23740 stores and this instruction is a load, or two loads and this instruction
23741 is a store. Power6 wants loads and stores scheduled alternately
23742 when possible */
23743 return current_sched_info->sched_max_insns_priority;
23744
23745 return priority;
23746 }
23747
23748 /* Return true if the instruction is nonpipelined on the Cell. */
23749 static bool
23750 is_nonpipeline_insn (rtx insn)
23751 {
23752 enum attr_type type;
23753 if (!insn || !NONDEBUG_INSN_P (insn)
23754 || GET_CODE (PATTERN (insn)) == USE
23755 || GET_CODE (PATTERN (insn)) == CLOBBER)
23756 return false;
23757
23758 type = get_attr_type (insn);
23759 if (type == TYPE_IMUL
23760 || type == TYPE_IMUL2
23761 || type == TYPE_IMUL3
23762 || type == TYPE_LMUL
23763 || type == TYPE_IDIV
23764 || type == TYPE_LDIV
23765 || type == TYPE_SDIV
23766 || type == TYPE_DDIV
23767 || type == TYPE_SSQRT
23768 || type == TYPE_DSQRT
23769 || type == TYPE_MFCR
23770 || type == TYPE_MFCRF
23771 || type == TYPE_MFJMPR)
23772 {
23773 return true;
23774 }
23775 return false;
23776 }
23777
23778
23779 /* Return how many instructions the machine can issue per cycle. */
23780
23781 static int
23782 rs6000_issue_rate (void)
23783 {
23784 /* Unless scheduling for register pressure, use issue rate of 1 for
23785 first scheduling pass to decrease degradation. */
23786 if (!reload_completed && !flag_sched_pressure)
23787 return 1;
23788
23789 switch (rs6000_cpu_attr) {
23790 case CPU_RIOS1: /* ? */
23791 case CPU_RS64A:
23792 case CPU_PPC601: /* ? */
23793 case CPU_PPC7450:
23794 return 3;
23795 case CPU_PPC440:
23796 case CPU_PPC603:
23797 case CPU_PPC750:
23798 case CPU_PPC7400:
23799 case CPU_PPC8540:
23800 case CPU_CELL:
23801 case CPU_PPCE300C2:
23802 case CPU_PPCE300C3:
23803 case CPU_PPCE500MC:
23804 case CPU_PPCE500MC64:
23805 case CPU_TITAN:
23806 return 2;
23807 case CPU_RIOS2:
23808 case CPU_PPC476:
23809 case CPU_PPC604:
23810 case CPU_PPC604E:
23811 case CPU_PPC620:
23812 case CPU_PPC630:
23813 return 4;
23814 case CPU_POWER4:
23815 case CPU_POWER5:
23816 case CPU_POWER6:
23817 case CPU_POWER7:
23818 return 5;
23819 default:
23820 return 1;
23821 }
23822 }
23823
23824 /* Return how many instructions to look ahead for better insn
23825 scheduling. */
23826
23827 static int
23828 rs6000_use_sched_lookahead (void)
23829 {
23830 if (rs6000_cpu_attr == CPU_PPC8540)
23831 return 4;
23832 if (rs6000_cpu_attr == CPU_CELL)
23833 return (reload_completed ? 8 : 0);
23834 return 0;
23835 }
23836
23837 /* We are choosing insn from the ready queue. Return nonzero if INSN can be chosen. */
23838 static int
23839 rs6000_use_sched_lookahead_guard (rtx insn)
23840 {
23841 if (rs6000_cpu_attr != CPU_CELL)
23842 return 1;
23843
23844 if (insn == NULL_RTX || !INSN_P (insn))
23845 abort ();
23846
23847 if (!reload_completed
23848 || is_nonpipeline_insn (insn)
23849 || is_microcoded_insn (insn))
23850 return 0;
23851
23852 return 1;
23853 }
23854
23855 /* Determine is PAT refers to memory. */
23856
23857 static bool
23858 is_mem_ref (rtx pat)
23859 {
23860 const char * fmt;
23861 int i, j;
23862 bool ret = false;
23863
23864 /* stack_tie does not produce any real memory traffic. */
23865 if (GET_CODE (pat) == UNSPEC
23866 && XINT (pat, 1) == UNSPEC_TIE)
23867 return false;
23868
23869 if (GET_CODE (pat) == MEM)
23870 return true;
23871
23872 /* Recursively process the pattern. */
23873 fmt = GET_RTX_FORMAT (GET_CODE (pat));
23874
23875 for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0 && !ret; i--)
23876 {
23877 if (fmt[i] == 'e')
23878 ret |= is_mem_ref (XEXP (pat, i));
23879 else if (fmt[i] == 'E')
23880 for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
23881 ret |= is_mem_ref (XVECEXP (pat, i, j));
23882 }
23883
23884 return ret;
23885 }
23886
23887 /* Determine if PAT is a PATTERN of a load insn. */
23888
23889 static bool
23890 is_load_insn1 (rtx pat)
23891 {
23892 if (!pat || pat == NULL_RTX)
23893 return false;
23894
23895 if (GET_CODE (pat) == SET)
23896 return is_mem_ref (SET_SRC (pat));
23897
23898 if (GET_CODE (pat) == PARALLEL)
23899 {
23900 int i;
23901
23902 for (i = 0; i < XVECLEN (pat, 0); i++)
23903 if (is_load_insn1 (XVECEXP (pat, 0, i)))
23904 return true;
23905 }
23906
23907 return false;
23908 }
23909
23910 /* Determine if INSN loads from memory. */
23911
23912 static bool
23913 is_load_insn (rtx insn)
23914 {
23915 if (!insn || !INSN_P (insn))
23916 return false;
23917
23918 if (GET_CODE (insn) == CALL_INSN)
23919 return false;
23920
23921 return is_load_insn1 (PATTERN (insn));
23922 }
23923
23924 /* Determine if PAT is a PATTERN of a store insn. */
23925
23926 static bool
23927 is_store_insn1 (rtx pat)
23928 {
23929 if (!pat || pat == NULL_RTX)
23930 return false;
23931
23932 if (GET_CODE (pat) == SET)
23933 return is_mem_ref (SET_DEST (pat));
23934
23935 if (GET_CODE (pat) == PARALLEL)
23936 {
23937 int i;
23938
23939 for (i = 0; i < XVECLEN (pat, 0); i++)
23940 if (is_store_insn1 (XVECEXP (pat, 0, i)))
23941 return true;
23942 }
23943
23944 return false;
23945 }
23946
23947 /* Determine if INSN stores to memory. */
23948
23949 static bool
23950 is_store_insn (rtx insn)
23951 {
23952 if (!insn || !INSN_P (insn))
23953 return false;
23954
23955 return is_store_insn1 (PATTERN (insn));
23956 }
23957
23958 /* Return the dest of a store insn. */
23959
23960 static rtx
23961 get_store_dest (rtx pat)
23962 {
23963 gcc_assert (is_store_insn1 (pat));
23964
23965 if (GET_CODE (pat) == SET)
23966 return SET_DEST (pat);
23967 else if (GET_CODE (pat) == PARALLEL)
23968 {
23969 int i;
23970
23971 for (i = 0; i < XVECLEN (pat, 0); i++)
23972 {
23973 rtx inner_pat = XVECEXP (pat, 0, i);
23974 if (GET_CODE (inner_pat) == SET
23975 && is_mem_ref (SET_DEST (inner_pat)))
23976 return inner_pat;
23977 }
23978 }
23979 /* We shouldn't get here, because we should have either a simple
23980 store insn or a store with update which are covered above. */
23981 gcc_unreachable();
23982 }
23983
23984 /* Returns whether the dependence between INSN and NEXT is considered
23985 costly by the given target. */
23986
23987 static bool
23988 rs6000_is_costly_dependence (dep_t dep, int cost, int distance)
23989 {
23990 rtx insn;
23991 rtx next;
23992
23993 /* If the flag is not enabled - no dependence is considered costly;
23994 allow all dependent insns in the same group.
23995 This is the most aggressive option. */
23996 if (rs6000_sched_costly_dep == no_dep_costly)
23997 return false;
23998
23999 /* If the flag is set to 1 - a dependence is always considered costly;
24000 do not allow dependent instructions in the same group.
24001 This is the most conservative option. */
24002 if (rs6000_sched_costly_dep == all_deps_costly)
24003 return true;
24004
24005 insn = DEP_PRO (dep);
24006 next = DEP_CON (dep);
24007
24008 if (rs6000_sched_costly_dep == store_to_load_dep_costly
24009 && is_load_insn (next)
24010 && is_store_insn (insn))
24011 /* Prevent load after store in the same group. */
24012 return true;
24013
24014 if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
24015 && is_load_insn (next)
24016 && is_store_insn (insn)
24017 && DEP_TYPE (dep) == REG_DEP_TRUE)
24018 /* Prevent load after store in the same group if it is a true
24019 dependence. */
24020 return true;
24021
24022 /* The flag is set to X; dependences with latency >= X are considered costly,
24023 and will not be scheduled in the same group. */
24024 if (rs6000_sched_costly_dep <= max_dep_latency
24025 && ((cost - distance) >= (int)rs6000_sched_costly_dep))
24026 return true;
24027
24028 return false;
24029 }
24030
24031 /* Return the next insn after INSN that is found before TAIL is reached,
24032 skipping any "non-active" insns - insns that will not actually occupy
24033 an issue slot. Return NULL_RTX if such an insn is not found. */
24034
24035 static rtx
24036 get_next_active_insn (rtx insn, rtx tail)
24037 {
24038 if (insn == NULL_RTX || insn == tail)
24039 return NULL_RTX;
24040
24041 while (1)
24042 {
24043 insn = NEXT_INSN (insn);
24044 if (insn == NULL_RTX || insn == tail)
24045 return NULL_RTX;
24046
24047 if (CALL_P (insn)
24048 || JUMP_P (insn)
24049 || (NONJUMP_INSN_P (insn)
24050 && GET_CODE (PATTERN (insn)) != USE
24051 && GET_CODE (PATTERN (insn)) != CLOBBER
24052 && INSN_CODE (insn) != CODE_FOR_stack_tie))
24053 break;
24054 }
24055 return insn;
24056 }
24057
24058 /* We are about to begin issuing insns for this clock cycle. */
24059
24060 static int
24061 rs6000_sched_reorder (FILE *dump ATTRIBUTE_UNUSED, int sched_verbose,
24062 rtx *ready ATTRIBUTE_UNUSED,
24063 int *pn_ready ATTRIBUTE_UNUSED,
24064 int clock_var ATTRIBUTE_UNUSED)
24065 {
24066 int n_ready = *pn_ready;
24067
24068 if (sched_verbose)
24069 fprintf (dump, "// rs6000_sched_reorder :\n");
24070
24071 /* Reorder the ready list, if the second to last ready insn
24072 is a nonepipeline insn. */
24073 if (rs6000_cpu_attr == CPU_CELL && n_ready > 1)
24074 {
24075 if (is_nonpipeline_insn (ready[n_ready - 1])
24076 && (recog_memoized (ready[n_ready - 2]) > 0))
24077 /* Simply swap first two insns. */
24078 {
24079 rtx tmp = ready[n_ready - 1];
24080 ready[n_ready - 1] = ready[n_ready - 2];
24081 ready[n_ready - 2] = tmp;
24082 }
24083 }
24084
24085 if (rs6000_cpu == PROCESSOR_POWER6)
24086 load_store_pendulum = 0;
24087
24088 return rs6000_issue_rate ();
24089 }
24090
24091 /* Like rs6000_sched_reorder, but called after issuing each insn. */
24092
24093 static int
24094 rs6000_sched_reorder2 (FILE *dump, int sched_verbose, rtx *ready,
24095 int *pn_ready, int clock_var ATTRIBUTE_UNUSED)
24096 {
24097 if (sched_verbose)
24098 fprintf (dump, "// rs6000_sched_reorder2 :\n");
24099
24100 /* For Power6, we need to handle some special cases to try and keep the
24101 store queue from overflowing and triggering expensive flushes.
24102
24103 This code monitors how load and store instructions are being issued
24104 and skews the ready list one way or the other to increase the likelihood
24105 that a desired instruction is issued at the proper time.
24106
24107 A couple of things are done. First, we maintain a "load_store_pendulum"
24108 to track the current state of load/store issue.
24109
24110 - If the pendulum is at zero, then no loads or stores have been
24111 issued in the current cycle so we do nothing.
24112
24113 - If the pendulum is 1, then a single load has been issued in this
24114 cycle and we attempt to locate another load in the ready list to
24115 issue with it.
24116
24117 - If the pendulum is -2, then two stores have already been
24118 issued in this cycle, so we increase the priority of the first load
24119 in the ready list to increase it's likelihood of being chosen first
24120 in the next cycle.
24121
24122 - If the pendulum is -1, then a single store has been issued in this
24123 cycle and we attempt to locate another store in the ready list to
24124 issue with it, preferring a store to an adjacent memory location to
24125 facilitate store pairing in the store queue.
24126
24127 - If the pendulum is 2, then two loads have already been
24128 issued in this cycle, so we increase the priority of the first store
24129 in the ready list to increase it's likelihood of being chosen first
24130 in the next cycle.
24131
24132 - If the pendulum < -2 or > 2, then do nothing.
24133
24134 Note: This code covers the most common scenarios. There exist non
24135 load/store instructions which make use of the LSU and which
24136 would need to be accounted for to strictly model the behavior
24137 of the machine. Those instructions are currently unaccounted
24138 for to help minimize compile time overhead of this code.
24139 */
24140 if (rs6000_cpu == PROCESSOR_POWER6 && last_scheduled_insn)
24141 {
24142 int pos;
24143 int i;
24144 rtx tmp;
24145
24146 if (is_store_insn (last_scheduled_insn))
24147 /* Issuing a store, swing the load_store_pendulum to the left */
24148 load_store_pendulum--;
24149 else if (is_load_insn (last_scheduled_insn))
24150 /* Issuing a load, swing the load_store_pendulum to the right */
24151 load_store_pendulum++;
24152 else
24153 return cached_can_issue_more;
24154
24155 /* If the pendulum is balanced, or there is only one instruction on
24156 the ready list, then all is well, so return. */
24157 if ((load_store_pendulum == 0) || (*pn_ready <= 1))
24158 return cached_can_issue_more;
24159
24160 if (load_store_pendulum == 1)
24161 {
24162 /* A load has been issued in this cycle. Scan the ready list
24163 for another load to issue with it */
24164 pos = *pn_ready-1;
24165
24166 while (pos >= 0)
24167 {
24168 if (is_load_insn (ready[pos]))
24169 {
24170 /* Found a load. Move it to the head of the ready list,
24171 and adjust it's priority so that it is more likely to
24172 stay there */
24173 tmp = ready[pos];
24174 for (i=pos; i<*pn_ready-1; i++)
24175 ready[i] = ready[i + 1];
24176 ready[*pn_ready-1] = tmp;
24177
24178 if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
24179 INSN_PRIORITY (tmp)++;
24180 break;
24181 }
24182 pos--;
24183 }
24184 }
24185 else if (load_store_pendulum == -2)
24186 {
24187 /* Two stores have been issued in this cycle. Increase the
24188 priority of the first load in the ready list to favor it for
24189 issuing in the next cycle. */
24190 pos = *pn_ready-1;
24191
24192 while (pos >= 0)
24193 {
24194 if (is_load_insn (ready[pos])
24195 && !sel_sched_p ()
24196 && INSN_PRIORITY_KNOWN (ready[pos]))
24197 {
24198 INSN_PRIORITY (ready[pos])++;
24199
24200 /* Adjust the pendulum to account for the fact that a load
24201 was found and increased in priority. This is to prevent
24202 increasing the priority of multiple loads */
24203 load_store_pendulum--;
24204
24205 break;
24206 }
24207 pos--;
24208 }
24209 }
24210 else if (load_store_pendulum == -1)
24211 {
24212 /* A store has been issued in this cycle. Scan the ready list for
24213 another store to issue with it, preferring a store to an adjacent
24214 memory location */
24215 int first_store_pos = -1;
24216
24217 pos = *pn_ready-1;
24218
24219 while (pos >= 0)
24220 {
24221 if (is_store_insn (ready[pos]))
24222 {
24223 /* Maintain the index of the first store found on the
24224 list */
24225 if (first_store_pos == -1)
24226 first_store_pos = pos;
24227
24228 if (is_store_insn (last_scheduled_insn)
24229 && adjacent_mem_locations (last_scheduled_insn,ready[pos]))
24230 {
24231 /* Found an adjacent store. Move it to the head of the
24232 ready list, and adjust it's priority so that it is
24233 more likely to stay there */
24234 tmp = ready[pos];
24235 for (i=pos; i<*pn_ready-1; i++)
24236 ready[i] = ready[i + 1];
24237 ready[*pn_ready-1] = tmp;
24238
24239 if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
24240 INSN_PRIORITY (tmp)++;
24241
24242 first_store_pos = -1;
24243
24244 break;
24245 };
24246 }
24247 pos--;
24248 }
24249
24250 if (first_store_pos >= 0)
24251 {
24252 /* An adjacent store wasn't found, but a non-adjacent store was,
24253 so move the non-adjacent store to the front of the ready
24254 list, and adjust its priority so that it is more likely to
24255 stay there. */
24256 tmp = ready[first_store_pos];
24257 for (i=first_store_pos; i<*pn_ready-1; i++)
24258 ready[i] = ready[i + 1];
24259 ready[*pn_ready-1] = tmp;
24260 if (!sel_sched_p () && INSN_PRIORITY_KNOWN (tmp))
24261 INSN_PRIORITY (tmp)++;
24262 }
24263 }
24264 else if (load_store_pendulum == 2)
24265 {
24266 /* Two loads have been issued in this cycle. Increase the priority
24267 of the first store in the ready list to favor it for issuing in
24268 the next cycle. */
24269 pos = *pn_ready-1;
24270
24271 while (pos >= 0)
24272 {
24273 if (is_store_insn (ready[pos])
24274 && !sel_sched_p ()
24275 && INSN_PRIORITY_KNOWN (ready[pos]))
24276 {
24277 INSN_PRIORITY (ready[pos])++;
24278
24279 /* Adjust the pendulum to account for the fact that a store
24280 was found and increased in priority. This is to prevent
24281 increasing the priority of multiple stores */
24282 load_store_pendulum++;
24283
24284 break;
24285 }
24286 pos--;
24287 }
24288 }
24289 }
24290
24291 return cached_can_issue_more;
24292 }
24293
24294 /* Return whether the presence of INSN causes a dispatch group termination
24295 of group WHICH_GROUP.
24296
24297 If WHICH_GROUP == current_group, this function will return true if INSN
24298 causes the termination of the current group (i.e, the dispatch group to
24299 which INSN belongs). This means that INSN will be the last insn in the
24300 group it belongs to.
24301
24302 If WHICH_GROUP == previous_group, this function will return true if INSN
24303 causes the termination of the previous group (i.e, the dispatch group that
24304 precedes the group to which INSN belongs). This means that INSN will be
24305 the first insn in the group it belongs to). */
24306
24307 static bool
24308 insn_terminates_group_p (rtx insn, enum group_termination which_group)
24309 {
24310 bool first, last;
24311
24312 if (! insn)
24313 return false;
24314
24315 first = insn_must_be_first_in_group (insn);
24316 last = insn_must_be_last_in_group (insn);
24317
24318 if (first && last)
24319 return true;
24320
24321 if (which_group == current_group)
24322 return last;
24323 else if (which_group == previous_group)
24324 return first;
24325
24326 return false;
24327 }
24328
24329
24330 static bool
24331 insn_must_be_first_in_group (rtx insn)
24332 {
24333 enum attr_type type;
24334
24335 if (!insn
24336 || GET_CODE (insn) == NOTE
24337 || DEBUG_INSN_P (insn)
24338 || GET_CODE (PATTERN (insn)) == USE
24339 || GET_CODE (PATTERN (insn)) == CLOBBER)
24340 return false;
24341
24342 switch (rs6000_cpu)
24343 {
24344 case PROCESSOR_POWER5:
24345 if (is_cracked_insn (insn))
24346 return true;
24347 case PROCESSOR_POWER4:
24348 if (is_microcoded_insn (insn))
24349 return true;
24350
24351 if (!rs6000_sched_groups)
24352 return false;
24353
24354 type = get_attr_type (insn);
24355
24356 switch (type)
24357 {
24358 case TYPE_MFCR:
24359 case TYPE_MFCRF:
24360 case TYPE_MTCR:
24361 case TYPE_DELAYED_CR:
24362 case TYPE_CR_LOGICAL:
24363 case TYPE_MTJMPR:
24364 case TYPE_MFJMPR:
24365 case TYPE_IDIV:
24366 case TYPE_LDIV:
24367 case TYPE_LOAD_L:
24368 case TYPE_STORE_C:
24369 case TYPE_ISYNC:
24370 case TYPE_SYNC:
24371 return true;
24372 default:
24373 break;
24374 }
24375 break;
24376 case PROCESSOR_POWER6:
24377 type = get_attr_type (insn);
24378
24379 switch (type)
24380 {
24381 case TYPE_INSERT_DWORD:
24382 case TYPE_EXTS:
24383 case TYPE_CNTLZ:
24384 case TYPE_SHIFT:
24385 case TYPE_VAR_SHIFT_ROTATE:
24386 case TYPE_TRAP:
24387 case TYPE_IMUL:
24388 case TYPE_IMUL2:
24389 case TYPE_IMUL3:
24390 case TYPE_LMUL:
24391 case TYPE_IDIV:
24392 case TYPE_INSERT_WORD:
24393 case TYPE_DELAYED_COMPARE:
24394 case TYPE_IMUL_COMPARE:
24395 case TYPE_LMUL_COMPARE:
24396 case TYPE_FPCOMPARE:
24397 case TYPE_MFCR:
24398 case TYPE_MTCR:
24399 case TYPE_MFJMPR:
24400 case TYPE_MTJMPR:
24401 case TYPE_ISYNC:
24402 case TYPE_SYNC:
24403 case TYPE_LOAD_L:
24404 case TYPE_STORE_C:
24405 case TYPE_LOAD_U:
24406 case TYPE_LOAD_UX:
24407 case TYPE_LOAD_EXT_UX:
24408 case TYPE_STORE_U:
24409 case TYPE_STORE_UX:
24410 case TYPE_FPLOAD_U:
24411 case TYPE_FPLOAD_UX:
24412 case TYPE_FPSTORE_U:
24413 case TYPE_FPSTORE_UX:
24414 return true;
24415 default:
24416 break;
24417 }
24418 break;
24419 case PROCESSOR_POWER7:
24420 type = get_attr_type (insn);
24421
24422 switch (type)
24423 {
24424 case TYPE_CR_LOGICAL:
24425 case TYPE_MFCR:
24426 case TYPE_MFCRF:
24427 case TYPE_MTCR:
24428 case TYPE_IDIV:
24429 case TYPE_LDIV:
24430 case TYPE_COMPARE:
24431 case TYPE_DELAYED_COMPARE:
24432 case TYPE_VAR_DELAYED_COMPARE:
24433 case TYPE_ISYNC:
24434 case TYPE_LOAD_L:
24435 case TYPE_STORE_C:
24436 case TYPE_LOAD_U:
24437 case TYPE_LOAD_UX:
24438 case TYPE_LOAD_EXT:
24439 case TYPE_LOAD_EXT_U:
24440 case TYPE_LOAD_EXT_UX:
24441 case TYPE_STORE_U:
24442 case TYPE_STORE_UX:
24443 case TYPE_FPLOAD_U:
24444 case TYPE_FPLOAD_UX:
24445 case TYPE_FPSTORE_U:
24446 case TYPE_FPSTORE_UX:
24447 case TYPE_MFJMPR:
24448 case TYPE_MTJMPR:
24449 return true;
24450 default:
24451 break;
24452 }
24453 break;
24454 default:
24455 break;
24456 }
24457
24458 return false;
24459 }
24460
24461 static bool
24462 insn_must_be_last_in_group (rtx insn)
24463 {
24464 enum attr_type type;
24465
24466 if (!insn
24467 || GET_CODE (insn) == NOTE
24468 || DEBUG_INSN_P (insn)
24469 || GET_CODE (PATTERN (insn)) == USE
24470 || GET_CODE (PATTERN (insn)) == CLOBBER)
24471 return false;
24472
24473 switch (rs6000_cpu) {
24474 case PROCESSOR_POWER4:
24475 case PROCESSOR_POWER5:
24476 if (is_microcoded_insn (insn))
24477 return true;
24478
24479 if (is_branch_slot_insn (insn))
24480 return true;
24481
24482 break;
24483 case PROCESSOR_POWER6:
24484 type = get_attr_type (insn);
24485
24486 switch (type)
24487 {
24488 case TYPE_EXTS:
24489 case TYPE_CNTLZ:
24490 case TYPE_SHIFT:
24491 case TYPE_VAR_SHIFT_ROTATE:
24492 case TYPE_TRAP:
24493 case TYPE_IMUL:
24494 case TYPE_IMUL2:
24495 case TYPE_IMUL3:
24496 case TYPE_LMUL:
24497 case TYPE_IDIV:
24498 case TYPE_DELAYED_COMPARE:
24499 case TYPE_IMUL_COMPARE:
24500 case TYPE_LMUL_COMPARE:
24501 case TYPE_FPCOMPARE:
24502 case TYPE_MFCR:
24503 case TYPE_MTCR:
24504 case TYPE_MFJMPR:
24505 case TYPE_MTJMPR:
24506 case TYPE_ISYNC:
24507 case TYPE_SYNC:
24508 case TYPE_LOAD_L:
24509 case TYPE_STORE_C:
24510 return true;
24511 default:
24512 break;
24513 }
24514 break;
24515 case PROCESSOR_POWER7:
24516 type = get_attr_type (insn);
24517
24518 switch (type)
24519 {
24520 case TYPE_ISYNC:
24521 case TYPE_SYNC:
24522 case TYPE_LOAD_L:
24523 case TYPE_STORE_C:
24524 case TYPE_LOAD_EXT_U:
24525 case TYPE_LOAD_EXT_UX:
24526 case TYPE_STORE_UX:
24527 return true;
24528 default:
24529 break;
24530 }
24531 break;
24532 default:
24533 break;
24534 }
24535
24536 return false;
24537 }
24538
24539 /* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
24540 dispatch group) from the insns in GROUP_INSNS. Return false otherwise. */
24541
24542 static bool
24543 is_costly_group (rtx *group_insns, rtx next_insn)
24544 {
24545 int i;
24546 int issue_rate = rs6000_issue_rate ();
24547
24548 for (i = 0; i < issue_rate; i++)
24549 {
24550 sd_iterator_def sd_it;
24551 dep_t dep;
24552 rtx insn = group_insns[i];
24553
24554 if (!insn)
24555 continue;
24556
24557 FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
24558 {
24559 rtx next = DEP_CON (dep);
24560
24561 if (next == next_insn
24562 && rs6000_is_costly_dependence (dep, dep_cost (dep), 0))
24563 return true;
24564 }
24565 }
24566
24567 return false;
24568 }
24569
24570 /* Utility of the function redefine_groups.
24571 Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
24572 in the same dispatch group. If so, insert nops before NEXT_INSN, in order
24573 to keep it "far" (in a separate group) from GROUP_INSNS, following
24574 one of the following schemes, depending on the value of the flag
24575 -minsert_sched_nops = X:
24576 (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
24577 in order to force NEXT_INSN into a separate group.
24578 (2) X < sched_finish_regroup_exact: insert exactly X nops.
24579 GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
24580 insertion (has a group just ended, how many vacant issue slots remain in the
24581 last group, and how many dispatch groups were encountered so far). */
24582
24583 static int
24584 force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
24585 rtx next_insn, bool *group_end, int can_issue_more,
24586 int *group_count)
24587 {
24588 rtx nop;
24589 bool force;
24590 int issue_rate = rs6000_issue_rate ();
24591 bool end = *group_end;
24592 int i;
24593
24594 if (next_insn == NULL_RTX || DEBUG_INSN_P (next_insn))
24595 return can_issue_more;
24596
24597 if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
24598 return can_issue_more;
24599
24600 force = is_costly_group (group_insns, next_insn);
24601 if (!force)
24602 return can_issue_more;
24603
24604 if (sched_verbose > 6)
24605 fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
24606 *group_count ,can_issue_more);
24607
24608 if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
24609 {
24610 if (*group_end)
24611 can_issue_more = 0;
24612
24613 /* Since only a branch can be issued in the last issue_slot, it is
24614 sufficient to insert 'can_issue_more - 1' nops if next_insn is not
24615 a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
24616 in this case the last nop will start a new group and the branch
24617 will be forced to the new group. */
24618 if (can_issue_more && !is_branch_slot_insn (next_insn))
24619 can_issue_more--;
24620
24621 while (can_issue_more > 0)
24622 {
24623 nop = gen_nop ();
24624 emit_insn_before (nop, next_insn);
24625 can_issue_more--;
24626 }
24627
24628 *group_end = true;
24629 return 0;
24630 }
24631
24632 if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
24633 {
24634 int n_nops = rs6000_sched_insert_nops;
24635
24636 /* Nops can't be issued from the branch slot, so the effective
24637 issue_rate for nops is 'issue_rate - 1'. */
24638 if (can_issue_more == 0)
24639 can_issue_more = issue_rate;
24640 can_issue_more--;
24641 if (can_issue_more == 0)
24642 {
24643 can_issue_more = issue_rate - 1;
24644 (*group_count)++;
24645 end = true;
24646 for (i = 0; i < issue_rate; i++)
24647 {
24648 group_insns[i] = 0;
24649 }
24650 }
24651
24652 while (n_nops > 0)
24653 {
24654 nop = gen_nop ();
24655 emit_insn_before (nop, next_insn);
24656 if (can_issue_more == issue_rate - 1) /* new group begins */
24657 end = false;
24658 can_issue_more--;
24659 if (can_issue_more == 0)
24660 {
24661 can_issue_more = issue_rate - 1;
24662 (*group_count)++;
24663 end = true;
24664 for (i = 0; i < issue_rate; i++)
24665 {
24666 group_insns[i] = 0;
24667 }
24668 }
24669 n_nops--;
24670 }
24671
24672 /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1'). */
24673 can_issue_more++;
24674
24675 /* Is next_insn going to start a new group? */
24676 *group_end
24677 = (end
24678 || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
24679 || (can_issue_more <= 2 && is_cracked_insn (next_insn))
24680 || (can_issue_more < issue_rate &&
24681 insn_terminates_group_p (next_insn, previous_group)));
24682 if (*group_end && end)
24683 (*group_count)--;
24684
24685 if (sched_verbose > 6)
24686 fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
24687 *group_count, can_issue_more);
24688 return can_issue_more;
24689 }
24690
24691 return can_issue_more;
24692 }
24693
24694 /* This function tries to synch the dispatch groups that the compiler "sees"
24695 with the dispatch groups that the processor dispatcher is expected to
24696 form in practice. It tries to achieve this synchronization by forcing the
24697 estimated processor grouping on the compiler (as opposed to the function
24698 'pad_goups' which tries to force the scheduler's grouping on the processor).
24699
24700 The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
24701 examines the (estimated) dispatch groups that will be formed by the processor
24702 dispatcher. It marks these group boundaries to reflect the estimated
24703 processor grouping, overriding the grouping that the scheduler had marked.
24704 Depending on the value of the flag '-minsert-sched-nops' this function can
24705 force certain insns into separate groups or force a certain distance between
24706 them by inserting nops, for example, if there exists a "costly dependence"
24707 between the insns.
24708
24709 The function estimates the group boundaries that the processor will form as
24710 follows: It keeps track of how many vacant issue slots are available after
24711 each insn. A subsequent insn will start a new group if one of the following
24712 4 cases applies:
24713 - no more vacant issue slots remain in the current dispatch group.
24714 - only the last issue slot, which is the branch slot, is vacant, but the next
24715 insn is not a branch.
24716 - only the last 2 or less issue slots, including the branch slot, are vacant,
24717 which means that a cracked insn (which occupies two issue slots) can't be
24718 issued in this group.
24719 - less than 'issue_rate' slots are vacant, and the next insn always needs to
24720 start a new group. */
24721
24722 static int
24723 redefine_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
24724 {
24725 rtx insn, next_insn;
24726 int issue_rate;
24727 int can_issue_more;
24728 int slot, i;
24729 bool group_end;
24730 int group_count = 0;
24731 rtx *group_insns;
24732
24733 /* Initialize. */
24734 issue_rate = rs6000_issue_rate ();
24735 group_insns = XALLOCAVEC (rtx, issue_rate);
24736 for (i = 0; i < issue_rate; i++)
24737 {
24738 group_insns[i] = 0;
24739 }
24740 can_issue_more = issue_rate;
24741 slot = 0;
24742 insn = get_next_active_insn (prev_head_insn, tail);
24743 group_end = false;
24744
24745 while (insn != NULL_RTX)
24746 {
24747 slot = (issue_rate - can_issue_more);
24748 group_insns[slot] = insn;
24749 can_issue_more =
24750 rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
24751 if (insn_terminates_group_p (insn, current_group))
24752 can_issue_more = 0;
24753
24754 next_insn = get_next_active_insn (insn, tail);
24755 if (next_insn == NULL_RTX)
24756 return group_count + 1;
24757
24758 /* Is next_insn going to start a new group? */
24759 group_end
24760 = (can_issue_more == 0
24761 || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
24762 || (can_issue_more <= 2 && is_cracked_insn (next_insn))
24763 || (can_issue_more < issue_rate &&
24764 insn_terminates_group_p (next_insn, previous_group)));
24765
24766 can_issue_more = force_new_group (sched_verbose, dump, group_insns,
24767 next_insn, &group_end, can_issue_more,
24768 &group_count);
24769
24770 if (group_end)
24771 {
24772 group_count++;
24773 can_issue_more = 0;
24774 for (i = 0; i < issue_rate; i++)
24775 {
24776 group_insns[i] = 0;
24777 }
24778 }
24779
24780 if (GET_MODE (next_insn) == TImode && can_issue_more)
24781 PUT_MODE (next_insn, VOIDmode);
24782 else if (!can_issue_more && GET_MODE (next_insn) != TImode)
24783 PUT_MODE (next_insn, TImode);
24784
24785 insn = next_insn;
24786 if (can_issue_more == 0)
24787 can_issue_more = issue_rate;
24788 } /* while */
24789
24790 return group_count;
24791 }
24792
24793 /* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
24794 dispatch group boundaries that the scheduler had marked. Pad with nops
24795 any dispatch groups which have vacant issue slots, in order to force the
24796 scheduler's grouping on the processor dispatcher. The function
24797 returns the number of dispatch groups found. */
24798
24799 static int
24800 pad_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
24801 {
24802 rtx insn, next_insn;
24803 rtx nop;
24804 int issue_rate;
24805 int can_issue_more;
24806 int group_end;
24807 int group_count = 0;
24808
24809 /* Initialize issue_rate. */
24810 issue_rate = rs6000_issue_rate ();
24811 can_issue_more = issue_rate;
24812
24813 insn = get_next_active_insn (prev_head_insn, tail);
24814 next_insn = get_next_active_insn (insn, tail);
24815
24816 while (insn != NULL_RTX)
24817 {
24818 can_issue_more =
24819 rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
24820
24821 group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
24822
24823 if (next_insn == NULL_RTX)
24824 break;
24825
24826 if (group_end)
24827 {
24828 /* If the scheduler had marked group termination at this location
24829 (between insn and next_insn), and neither insn nor next_insn will
24830 force group termination, pad the group with nops to force group
24831 termination. */
24832 if (can_issue_more
24833 && (rs6000_sched_insert_nops == sched_finish_pad_groups)
24834 && !insn_terminates_group_p (insn, current_group)
24835 && !insn_terminates_group_p (next_insn, previous_group))
24836 {
24837 if (!is_branch_slot_insn (next_insn))
24838 can_issue_more--;
24839
24840 while (can_issue_more)
24841 {
24842 nop = gen_nop ();
24843 emit_insn_before (nop, next_insn);
24844 can_issue_more--;
24845 }
24846 }
24847
24848 can_issue_more = issue_rate;
24849 group_count++;
24850 }
24851
24852 insn = next_insn;
24853 next_insn = get_next_active_insn (insn, tail);
24854 }
24855
24856 return group_count;
24857 }
24858
24859 /* We're beginning a new block. Initialize data structures as necessary. */
24860
24861 static void
24862 rs6000_sched_init (FILE *dump ATTRIBUTE_UNUSED,
24863 int sched_verbose ATTRIBUTE_UNUSED,
24864 int max_ready ATTRIBUTE_UNUSED)
24865 {
24866 last_scheduled_insn = NULL_RTX;
24867 load_store_pendulum = 0;
24868 }
24869
24870 /* The following function is called at the end of scheduling BB.
24871 After reload, it inserts nops at insn group bundling. */
24872
24873 static void
24874 rs6000_sched_finish (FILE *dump, int sched_verbose)
24875 {
24876 int n_groups;
24877
24878 if (sched_verbose)
24879 fprintf (dump, "=== Finishing schedule.\n");
24880
24881 if (reload_completed && rs6000_sched_groups)
24882 {
24883 /* Do not run sched_finish hook when selective scheduling enabled. */
24884 if (sel_sched_p ())
24885 return;
24886
24887 if (rs6000_sched_insert_nops == sched_finish_none)
24888 return;
24889
24890 if (rs6000_sched_insert_nops == sched_finish_pad_groups)
24891 n_groups = pad_groups (dump, sched_verbose,
24892 current_sched_info->prev_head,
24893 current_sched_info->next_tail);
24894 else
24895 n_groups = redefine_groups (dump, sched_verbose,
24896 current_sched_info->prev_head,
24897 current_sched_info->next_tail);
24898
24899 if (sched_verbose >= 6)
24900 {
24901 fprintf (dump, "ngroups = %d\n", n_groups);
24902 print_rtl (dump, current_sched_info->prev_head);
24903 fprintf (dump, "Done finish_sched\n");
24904 }
24905 }
24906 }
24907
24908 struct _rs6000_sched_context
24909 {
24910 short cached_can_issue_more;
24911 rtx last_scheduled_insn;
24912 int load_store_pendulum;
24913 };
24914
24915 typedef struct _rs6000_sched_context rs6000_sched_context_def;
24916 typedef rs6000_sched_context_def *rs6000_sched_context_t;
24917
24918 /* Allocate store for new scheduling context. */
24919 static void *
24920 rs6000_alloc_sched_context (void)
24921 {
24922 return xmalloc (sizeof (rs6000_sched_context_def));
24923 }
24924
24925 /* If CLEAN_P is true then initializes _SC with clean data,
24926 and from the global context otherwise. */
24927 static void
24928 rs6000_init_sched_context (void *_sc, bool clean_p)
24929 {
24930 rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
24931
24932 if (clean_p)
24933 {
24934 sc->cached_can_issue_more = 0;
24935 sc->last_scheduled_insn = NULL_RTX;
24936 sc->load_store_pendulum = 0;
24937 }
24938 else
24939 {
24940 sc->cached_can_issue_more = cached_can_issue_more;
24941 sc->last_scheduled_insn = last_scheduled_insn;
24942 sc->load_store_pendulum = load_store_pendulum;
24943 }
24944 }
24945
24946 /* Sets the global scheduling context to the one pointed to by _SC. */
24947 static void
24948 rs6000_set_sched_context (void *_sc)
24949 {
24950 rs6000_sched_context_t sc = (rs6000_sched_context_t) _sc;
24951
24952 gcc_assert (sc != NULL);
24953
24954 cached_can_issue_more = sc->cached_can_issue_more;
24955 last_scheduled_insn = sc->last_scheduled_insn;
24956 load_store_pendulum = sc->load_store_pendulum;
24957 }
24958
24959 /* Free _SC. */
24960 static void
24961 rs6000_free_sched_context (void *_sc)
24962 {
24963 gcc_assert (_sc != NULL);
24964
24965 free (_sc);
24966 }
24967
24968 \f
24969 /* Length in units of the trampoline for entering a nested function. */
24970
24971 int
24972 rs6000_trampoline_size (void)
24973 {
24974 int ret = 0;
24975
24976 switch (DEFAULT_ABI)
24977 {
24978 default:
24979 gcc_unreachable ();
24980
24981 case ABI_AIX:
24982 ret = (TARGET_32BIT) ? 12 : 24;
24983 break;
24984
24985 case ABI_DARWIN:
24986 case ABI_V4:
24987 ret = (TARGET_32BIT) ? 40 : 48;
24988 break;
24989 }
24990
24991 return ret;
24992 }
24993
24994 /* Emit RTL insns to initialize the variable parts of a trampoline.
24995 FNADDR is an RTX for the address of the function's pure code.
24996 CXT is an RTX for the static chain value for the function. */
24997
24998 static void
24999 rs6000_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
25000 {
25001 int regsize = (TARGET_32BIT) ? 4 : 8;
25002 rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
25003 rtx ctx_reg = force_reg (Pmode, cxt);
25004 rtx addr = force_reg (Pmode, XEXP (m_tramp, 0));
25005
25006 switch (DEFAULT_ABI)
25007 {
25008 default:
25009 gcc_unreachable ();
25010
25011 /* Under AIX, just build the 3 word function descriptor */
25012 case ABI_AIX:
25013 {
25014 rtx fnmem = gen_const_mem (Pmode, force_reg (Pmode, fnaddr));
25015 rtx fn_reg = gen_reg_rtx (Pmode);
25016 rtx toc_reg = gen_reg_rtx (Pmode);
25017
25018 /* Macro to shorten the code expansions below. */
25019 # define MEM_PLUS(MEM, OFFSET) adjust_address (MEM, Pmode, OFFSET)
25020
25021 m_tramp = replace_equiv_address (m_tramp, addr);
25022
25023 emit_move_insn (fn_reg, MEM_PLUS (fnmem, 0));
25024 emit_move_insn (toc_reg, MEM_PLUS (fnmem, regsize));
25025 emit_move_insn (MEM_PLUS (m_tramp, 0), fn_reg);
25026 emit_move_insn (MEM_PLUS (m_tramp, regsize), toc_reg);
25027 emit_move_insn (MEM_PLUS (m_tramp, 2*regsize), ctx_reg);
25028
25029 # undef MEM_PLUS
25030 }
25031 break;
25032
25033 /* Under V.4/eabi/darwin, __trampoline_setup does the real work. */
25034 case ABI_DARWIN:
25035 case ABI_V4:
25036 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
25037 LCT_NORMAL, VOIDmode, 4,
25038 addr, Pmode,
25039 GEN_INT (rs6000_trampoline_size ()), SImode,
25040 fnaddr, Pmode,
25041 ctx_reg, Pmode);
25042 break;
25043 }
25044 }
25045
25046 \f
25047 /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain
25048 identifier as an argument, so the front end shouldn't look it up. */
25049
25050 static bool
25051 rs6000_attribute_takes_identifier_p (const_tree attr_id)
25052 {
25053 return is_attribute_p ("altivec", attr_id);
25054 }
25055
25056 /* Handle the "altivec" attribute. The attribute may have
25057 arguments as follows:
25058
25059 __attribute__((altivec(vector__)))
25060 __attribute__((altivec(pixel__))) (always followed by 'unsigned short')
25061 __attribute__((altivec(bool__))) (always followed by 'unsigned')
25062
25063 and may appear more than once (e.g., 'vector bool char') in a
25064 given declaration. */
25065
25066 static tree
25067 rs6000_handle_altivec_attribute (tree *node,
25068 tree name ATTRIBUTE_UNUSED,
25069 tree args,
25070 int flags ATTRIBUTE_UNUSED,
25071 bool *no_add_attrs)
25072 {
25073 tree type = *node, result = NULL_TREE;
25074 enum machine_mode mode;
25075 int unsigned_p;
25076 char altivec_type
25077 = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
25078 && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
25079 ? *IDENTIFIER_POINTER (TREE_VALUE (args))
25080 : '?');
25081
25082 while (POINTER_TYPE_P (type)
25083 || TREE_CODE (type) == FUNCTION_TYPE
25084 || TREE_CODE (type) == METHOD_TYPE
25085 || TREE_CODE (type) == ARRAY_TYPE)
25086 type = TREE_TYPE (type);
25087
25088 mode = TYPE_MODE (type);
25089
25090 /* Check for invalid AltiVec type qualifiers. */
25091 if (type == long_double_type_node)
25092 error ("use of %<long double%> in AltiVec types is invalid");
25093 else if (type == boolean_type_node)
25094 error ("use of boolean types in AltiVec types is invalid");
25095 else if (TREE_CODE (type) == COMPLEX_TYPE)
25096 error ("use of %<complex%> in AltiVec types is invalid");
25097 else if (DECIMAL_FLOAT_MODE_P (mode))
25098 error ("use of decimal floating point types in AltiVec types is invalid");
25099 else if (!TARGET_VSX)
25100 {
25101 if (type == long_unsigned_type_node || type == long_integer_type_node)
25102 {
25103 if (TARGET_64BIT)
25104 error ("use of %<long%> in AltiVec types is invalid for "
25105 "64-bit code without -mvsx");
25106 else if (rs6000_warn_altivec_long)
25107 warning (0, "use of %<long%> in AltiVec types is deprecated; "
25108 "use %<int%>");
25109 }
25110 else if (type == long_long_unsigned_type_node
25111 || type == long_long_integer_type_node)
25112 error ("use of %<long long%> in AltiVec types is invalid without "
25113 "-mvsx");
25114 else if (type == double_type_node)
25115 error ("use of %<double%> in AltiVec types is invalid without -mvsx");
25116 }
25117
25118 switch (altivec_type)
25119 {
25120 case 'v':
25121 unsigned_p = TYPE_UNSIGNED (type);
25122 switch (mode)
25123 {
25124 case DImode:
25125 result = (unsigned_p ? unsigned_V2DI_type_node : V2DI_type_node);
25126 break;
25127 case SImode:
25128 result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
25129 break;
25130 case HImode:
25131 result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
25132 break;
25133 case QImode:
25134 result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
25135 break;
25136 case SFmode: result = V4SF_type_node; break;
25137 case DFmode: result = V2DF_type_node; break;
25138 /* If the user says 'vector int bool', we may be handed the 'bool'
25139 attribute _before_ the 'vector' attribute, and so select the
25140 proper type in the 'b' case below. */
25141 case V4SImode: case V8HImode: case V16QImode: case V4SFmode:
25142 case V2DImode: case V2DFmode:
25143 result = type;
25144 default: break;
25145 }
25146 break;
25147 case 'b':
25148 switch (mode)
25149 {
25150 case DImode: case V2DImode: result = bool_V2DI_type_node; break;
25151 case SImode: case V4SImode: result = bool_V4SI_type_node; break;
25152 case HImode: case V8HImode: result = bool_V8HI_type_node; break;
25153 case QImode: case V16QImode: result = bool_V16QI_type_node;
25154 default: break;
25155 }
25156 break;
25157 case 'p':
25158 switch (mode)
25159 {
25160 case V8HImode: result = pixel_V8HI_type_node;
25161 default: break;
25162 }
25163 default: break;
25164 }
25165
25166 /* Propagate qualifiers attached to the element type
25167 onto the vector type. */
25168 if (result && result != type && TYPE_QUALS (type))
25169 result = build_qualified_type (result, TYPE_QUALS (type));
25170
25171 *no_add_attrs = true; /* No need to hang on to the attribute. */
25172
25173 if (result)
25174 *node = lang_hooks.types.reconstruct_complex_type (*node, result);
25175
25176 return NULL_TREE;
25177 }
25178
25179 /* AltiVec defines four built-in scalar types that serve as vector
25180 elements; we must teach the compiler how to mangle them. */
25181
25182 static const char *
25183 rs6000_mangle_type (const_tree type)
25184 {
25185 type = TYPE_MAIN_VARIANT (type);
25186
25187 if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
25188 && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
25189 return NULL;
25190
25191 if (type == bool_char_type_node) return "U6__boolc";
25192 if (type == bool_short_type_node) return "U6__bools";
25193 if (type == pixel_type_node) return "u7__pixel";
25194 if (type == bool_int_type_node) return "U6__booli";
25195 if (type == bool_long_type_node) return "U6__booll";
25196
25197 /* Mangle IBM extended float long double as `g' (__float128) on
25198 powerpc*-linux where long-double-64 previously was the default. */
25199 if (TYPE_MAIN_VARIANT (type) == long_double_type_node
25200 && TARGET_ELF
25201 && TARGET_LONG_DOUBLE_128
25202 && !TARGET_IEEEQUAD)
25203 return "g";
25204
25205 /* For all other types, use normal C++ mangling. */
25206 return NULL;
25207 }
25208
25209 /* Handle a "longcall" or "shortcall" attribute; arguments as in
25210 struct attribute_spec.handler. */
25211
25212 static tree
25213 rs6000_handle_longcall_attribute (tree *node, tree name,
25214 tree args ATTRIBUTE_UNUSED,
25215 int flags ATTRIBUTE_UNUSED,
25216 bool *no_add_attrs)
25217 {
25218 if (TREE_CODE (*node) != FUNCTION_TYPE
25219 && TREE_CODE (*node) != FIELD_DECL
25220 && TREE_CODE (*node) != TYPE_DECL)
25221 {
25222 warning (OPT_Wattributes, "%qE attribute only applies to functions",
25223 name);
25224 *no_add_attrs = true;
25225 }
25226
25227 return NULL_TREE;
25228 }
25229
25230 /* Set longcall attributes on all functions declared when
25231 rs6000_default_long_calls is true. */
25232 static void
25233 rs6000_set_default_type_attributes (tree type)
25234 {
25235 if (rs6000_default_long_calls
25236 && (TREE_CODE (type) == FUNCTION_TYPE
25237 || TREE_CODE (type) == METHOD_TYPE))
25238 TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
25239 NULL_TREE,
25240 TYPE_ATTRIBUTES (type));
25241
25242 #if TARGET_MACHO
25243 darwin_set_default_type_attributes (type);
25244 #endif
25245 }
25246
25247 /* Return a reference suitable for calling a function with the
25248 longcall attribute. */
25249
25250 rtx
25251 rs6000_longcall_ref (rtx call_ref)
25252 {
25253 const char *call_name;
25254 tree node;
25255
25256 if (GET_CODE (call_ref) != SYMBOL_REF)
25257 return call_ref;
25258
25259 /* System V adds '.' to the internal name, so skip them. */
25260 call_name = XSTR (call_ref, 0);
25261 if (*call_name == '.')
25262 {
25263 while (*call_name == '.')
25264 call_name++;
25265
25266 node = get_identifier (call_name);
25267 call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
25268 }
25269
25270 return force_reg (Pmode, call_ref);
25271 }
25272 \f
25273 #ifndef TARGET_USE_MS_BITFIELD_LAYOUT
25274 #define TARGET_USE_MS_BITFIELD_LAYOUT 0
25275 #endif
25276
25277 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
25278 struct attribute_spec.handler. */
25279 static tree
25280 rs6000_handle_struct_attribute (tree *node, tree name,
25281 tree args ATTRIBUTE_UNUSED,
25282 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
25283 {
25284 tree *type = NULL;
25285 if (DECL_P (*node))
25286 {
25287 if (TREE_CODE (*node) == TYPE_DECL)
25288 type = &TREE_TYPE (*node);
25289 }
25290 else
25291 type = node;
25292
25293 if (!(type && (TREE_CODE (*type) == RECORD_TYPE
25294 || TREE_CODE (*type) == UNION_TYPE)))
25295 {
25296 warning (OPT_Wattributes, "%qE attribute ignored", name);
25297 *no_add_attrs = true;
25298 }
25299
25300 else if ((is_attribute_p ("ms_struct", name)
25301 && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
25302 || ((is_attribute_p ("gcc_struct", name)
25303 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
25304 {
25305 warning (OPT_Wattributes, "%qE incompatible attribute ignored",
25306 name);
25307 *no_add_attrs = true;
25308 }
25309
25310 return NULL_TREE;
25311 }
25312
25313 static bool
25314 rs6000_ms_bitfield_layout_p (const_tree record_type)
25315 {
25316 return (TARGET_USE_MS_BITFIELD_LAYOUT &&
25317 !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
25318 || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
25319 }
25320 \f
25321 #ifdef USING_ELFOS_H
25322
25323 /* A get_unnamed_section callback, used for switching to toc_section. */
25324
25325 static void
25326 rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
25327 {
25328 if (DEFAULT_ABI == ABI_AIX
25329 && TARGET_MINIMAL_TOC
25330 && !TARGET_RELOCATABLE)
25331 {
25332 if (!toc_initialized)
25333 {
25334 toc_initialized = 1;
25335 fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
25336 (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0);
25337 fprintf (asm_out_file, "\t.tc ");
25338 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],");
25339 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
25340 fprintf (asm_out_file, "\n");
25341
25342 fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
25343 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
25344 fprintf (asm_out_file, " = .+32768\n");
25345 }
25346 else
25347 fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
25348 }
25349 else if (DEFAULT_ABI == ABI_AIX && !TARGET_RELOCATABLE)
25350 fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
25351 else
25352 {
25353 fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
25354 if (!toc_initialized)
25355 {
25356 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
25357 fprintf (asm_out_file, " = .+32768\n");
25358 toc_initialized = 1;
25359 }
25360 }
25361 }
25362
25363 /* Implement TARGET_ASM_INIT_SECTIONS. */
25364
25365 static void
25366 rs6000_elf_asm_init_sections (void)
25367 {
25368 toc_section
25369 = get_unnamed_section (0, rs6000_elf_output_toc_section_asm_op, NULL);
25370
25371 sdata2_section
25372 = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
25373 SDATA2_SECTION_ASM_OP);
25374 }
25375
25376 /* Implement TARGET_SELECT_RTX_SECTION. */
25377
25378 static section *
25379 rs6000_elf_select_rtx_section (enum machine_mode mode, rtx x,
25380 unsigned HOST_WIDE_INT align)
25381 {
25382 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
25383 return toc_section;
25384 else
25385 return default_elf_select_rtx_section (mode, x, align);
25386 }
25387 \f
25388 /* For a SYMBOL_REF, set generic flags and then perform some
25389 target-specific processing.
25390
25391 When the AIX ABI is requested on a non-AIX system, replace the
25392 function name with the real name (with a leading .) rather than the
25393 function descriptor name. This saves a lot of overriding code to
25394 read the prefixes. */
25395
25396 static void
25397 rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
25398 {
25399 default_encode_section_info (decl, rtl, first);
25400
25401 if (first
25402 && TREE_CODE (decl) == FUNCTION_DECL
25403 && !TARGET_AIX
25404 && DEFAULT_ABI == ABI_AIX)
25405 {
25406 rtx sym_ref = XEXP (rtl, 0);
25407 size_t len = strlen (XSTR (sym_ref, 0));
25408 char *str = XALLOCAVEC (char, len + 2);
25409 str[0] = '.';
25410 memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
25411 XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
25412 }
25413 }
25414
25415 static inline bool
25416 compare_section_name (const char *section, const char *templ)
25417 {
25418 int len;
25419
25420 len = strlen (templ);
25421 return (strncmp (section, templ, len) == 0
25422 && (section[len] == 0 || section[len] == '.'));
25423 }
25424
25425 bool
25426 rs6000_elf_in_small_data_p (const_tree decl)
25427 {
25428 if (rs6000_sdata == SDATA_NONE)
25429 return false;
25430
25431 /* We want to merge strings, so we never consider them small data. */
25432 if (TREE_CODE (decl) == STRING_CST)
25433 return false;
25434
25435 /* Functions are never in the small data area. */
25436 if (TREE_CODE (decl) == FUNCTION_DECL)
25437 return false;
25438
25439 if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
25440 {
25441 const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
25442 if (compare_section_name (section, ".sdata")
25443 || compare_section_name (section, ".sdata2")
25444 || compare_section_name (section, ".gnu.linkonce.s")
25445 || compare_section_name (section, ".sbss")
25446 || compare_section_name (section, ".sbss2")
25447 || compare_section_name (section, ".gnu.linkonce.sb")
25448 || strcmp (section, ".PPC.EMB.sdata0") == 0
25449 || strcmp (section, ".PPC.EMB.sbss0") == 0)
25450 return true;
25451 }
25452 else
25453 {
25454 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
25455
25456 if (size > 0
25457 && size <= g_switch_value
25458 /* If it's not public, and we're not going to reference it there,
25459 there's no need to put it in the small data section. */
25460 && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
25461 return true;
25462 }
25463
25464 return false;
25465 }
25466
25467 #endif /* USING_ELFOS_H */
25468 \f
25469 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P. */
25470
25471 static bool
25472 rs6000_use_blocks_for_constant_p (enum machine_mode mode, const_rtx x)
25473 {
25474 return !ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode);
25475 }
25476 \f
25477 /* Return a REG that occurs in ADDR with coefficient 1.
25478 ADDR can be effectively incremented by incrementing REG.
25479
25480 r0 is special and we must not select it as an address
25481 register by this routine since our caller will try to
25482 increment the returned register via an "la" instruction. */
25483
25484 rtx
25485 find_addr_reg (rtx addr)
25486 {
25487 while (GET_CODE (addr) == PLUS)
25488 {
25489 if (GET_CODE (XEXP (addr, 0)) == REG
25490 && REGNO (XEXP (addr, 0)) != 0)
25491 addr = XEXP (addr, 0);
25492 else if (GET_CODE (XEXP (addr, 1)) == REG
25493 && REGNO (XEXP (addr, 1)) != 0)
25494 addr = XEXP (addr, 1);
25495 else if (CONSTANT_P (XEXP (addr, 0)))
25496 addr = XEXP (addr, 1);
25497 else if (CONSTANT_P (XEXP (addr, 1)))
25498 addr = XEXP (addr, 0);
25499 else
25500 gcc_unreachable ();
25501 }
25502 gcc_assert (GET_CODE (addr) == REG && REGNO (addr) != 0);
25503 return addr;
25504 }
25505
25506 void
25507 rs6000_fatal_bad_address (rtx op)
25508 {
25509 fatal_insn ("bad address", op);
25510 }
25511
25512 #if TARGET_MACHO
25513
25514 typedef struct branch_island_d {
25515 tree function_name;
25516 tree label_name;
25517 int line_number;
25518 } branch_island;
25519
25520 DEF_VEC_O(branch_island);
25521 DEF_VEC_ALLOC_O(branch_island,gc);
25522
25523 static VEC(branch_island,gc) *branch_islands;
25524
25525 /* Remember to generate a branch island for far calls to the given
25526 function. */
25527
25528 static void
25529 add_compiler_branch_island (tree label_name, tree function_name,
25530 int line_number)
25531 {
25532 branch_island *bi = VEC_safe_push (branch_island, gc, branch_islands, NULL);
25533
25534 bi->function_name = function_name;
25535 bi->label_name = label_name;
25536 bi->line_number = line_number;
25537 }
25538
25539 /* Generate far-jump branch islands for everything recorded in
25540 branch_islands. Invoked immediately after the last instruction of
25541 the epilogue has been emitted; the branch islands must be appended
25542 to, and contiguous with, the function body. Mach-O stubs are
25543 generated in machopic_output_stub(). */
25544
25545 static void
25546 macho_branch_islands (void)
25547 {
25548 char tmp_buf[512];
25549
25550 while (!VEC_empty (branch_island, branch_islands))
25551 {
25552 branch_island *bi = VEC_last (branch_island, branch_islands);
25553 const char *label = IDENTIFIER_POINTER (bi->label_name);
25554 const char *name = IDENTIFIER_POINTER (bi->function_name);
25555 char name_buf[512];
25556 /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF(). */
25557 if (name[0] == '*' || name[0] == '&')
25558 strcpy (name_buf, name+1);
25559 else
25560 {
25561 name_buf[0] = '_';
25562 strcpy (name_buf+1, name);
25563 }
25564 strcpy (tmp_buf, "\n");
25565 strcat (tmp_buf, label);
25566 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
25567 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
25568 dbxout_stabd (N_SLINE, bi->line_number);
25569 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
25570 if (flag_pic)
25571 {
25572 strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
25573 strcat (tmp_buf, label);
25574 strcat (tmp_buf, "_pic\n");
25575 strcat (tmp_buf, label);
25576 strcat (tmp_buf, "_pic:\n\tmflr r11\n");
25577
25578 strcat (tmp_buf, "\taddis r11,r11,ha16(");
25579 strcat (tmp_buf, name_buf);
25580 strcat (tmp_buf, " - ");
25581 strcat (tmp_buf, label);
25582 strcat (tmp_buf, "_pic)\n");
25583
25584 strcat (tmp_buf, "\tmtlr r0\n");
25585
25586 strcat (tmp_buf, "\taddi r12,r11,lo16(");
25587 strcat (tmp_buf, name_buf);
25588 strcat (tmp_buf, " - ");
25589 strcat (tmp_buf, label);
25590 strcat (tmp_buf, "_pic)\n");
25591
25592 strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
25593 }
25594 else
25595 {
25596 strcat (tmp_buf, ":\nlis r12,hi16(");
25597 strcat (tmp_buf, name_buf);
25598 strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
25599 strcat (tmp_buf, name_buf);
25600 strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
25601 }
25602 output_asm_insn (tmp_buf, 0);
25603 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
25604 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
25605 dbxout_stabd (N_SLINE, bi->line_number);
25606 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
25607 VEC_pop (branch_island, branch_islands);
25608 }
25609 }
25610
25611 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
25612 already there or not. */
25613
25614 static int
25615 no_previous_def (tree function_name)
25616 {
25617 branch_island *bi;
25618 unsigned ix;
25619
25620 FOR_EACH_VEC_ELT (branch_island, branch_islands, ix, bi)
25621 if (function_name == bi->function_name)
25622 return 0;
25623 return 1;
25624 }
25625
25626 /* GET_PREV_LABEL gets the label name from the previous definition of
25627 the function. */
25628
25629 static tree
25630 get_prev_label (tree function_name)
25631 {
25632 branch_island *bi;
25633 unsigned ix;
25634
25635 FOR_EACH_VEC_ELT (branch_island, branch_islands, ix, bi)
25636 if (function_name == bi->function_name)
25637 return bi->label_name;
25638 return NULL_TREE;
25639 }
25640
25641 /* INSN is either a function call or a millicode call. It may have an
25642 unconditional jump in its delay slot.
25643
25644 CALL_DEST is the routine we are calling. */
25645
25646 char *
25647 output_call (rtx insn, rtx *operands, int dest_operand_number,
25648 int cookie_operand_number)
25649 {
25650 static char buf[256];
25651 if (darwin_emit_branch_islands
25652 && GET_CODE (operands[dest_operand_number]) == SYMBOL_REF
25653 && (INTVAL (operands[cookie_operand_number]) & CALL_LONG))
25654 {
25655 tree labelname;
25656 tree funname = get_identifier (XSTR (operands[dest_operand_number], 0));
25657
25658 if (no_previous_def (funname))
25659 {
25660 rtx label_rtx = gen_label_rtx ();
25661 char *label_buf, temp_buf[256];
25662 ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
25663 CODE_LABEL_NUMBER (label_rtx));
25664 label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
25665 labelname = get_identifier (label_buf);
25666 add_compiler_branch_island (labelname, funname, insn_line (insn));
25667 }
25668 else
25669 labelname = get_prev_label (funname);
25670
25671 /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
25672 instruction will reach 'foo', otherwise link as 'bl L42'".
25673 "L42" should be a 'branch island', that will do a far jump to
25674 'foo'. Branch islands are generated in
25675 macho_branch_islands(). */
25676 sprintf (buf, "jbsr %%z%d,%.246s",
25677 dest_operand_number, IDENTIFIER_POINTER (labelname));
25678 }
25679 else
25680 sprintf (buf, "bl %%z%d", dest_operand_number);
25681 return buf;
25682 }
25683
25684 /* Generate PIC and indirect symbol stubs. */
25685
25686 void
25687 machopic_output_stub (FILE *file, const char *symb, const char *stub)
25688 {
25689 unsigned int length;
25690 char *symbol_name, *lazy_ptr_name;
25691 char *local_label_0;
25692 static int label = 0;
25693
25694 /* Lose our funky encoding stuff so it doesn't contaminate the stub. */
25695 symb = (*targetm.strip_name_encoding) (symb);
25696
25697
25698 length = strlen (symb);
25699 symbol_name = XALLOCAVEC (char, length + 32);
25700 GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
25701
25702 lazy_ptr_name = XALLOCAVEC (char, length + 32);
25703 GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
25704
25705 if (flag_pic == 2)
25706 switch_to_section (darwin_sections[machopic_picsymbol_stub1_section]);
25707 else
25708 switch_to_section (darwin_sections[machopic_symbol_stub1_section]);
25709
25710 if (flag_pic == 2)
25711 {
25712 fprintf (file, "\t.align 5\n");
25713
25714 fprintf (file, "%s:\n", stub);
25715 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25716
25717 label++;
25718 local_label_0 = XALLOCAVEC (char, sizeof ("\"L00000000000$spb\""));
25719 sprintf (local_label_0, "\"L%011d$spb\"", label);
25720
25721 fprintf (file, "\tmflr r0\n");
25722 fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
25723 fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
25724 fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
25725 lazy_ptr_name, local_label_0);
25726 fprintf (file, "\tmtlr r0\n");
25727 fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
25728 (TARGET_64BIT ? "ldu" : "lwzu"),
25729 lazy_ptr_name, local_label_0);
25730 fprintf (file, "\tmtctr r12\n");
25731 fprintf (file, "\tbctr\n");
25732 }
25733 else
25734 {
25735 fprintf (file, "\t.align 4\n");
25736
25737 fprintf (file, "%s:\n", stub);
25738 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25739
25740 fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
25741 fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
25742 (TARGET_64BIT ? "ldu" : "lwzu"),
25743 lazy_ptr_name);
25744 fprintf (file, "\tmtctr r12\n");
25745 fprintf (file, "\tbctr\n");
25746 }
25747
25748 switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
25749 fprintf (file, "%s:\n", lazy_ptr_name);
25750 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25751 fprintf (file, "%sdyld_stub_binding_helper\n",
25752 (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
25753 }
25754
25755 /* Legitimize PIC addresses. If the address is already
25756 position-independent, we return ORIG. Newly generated
25757 position-independent addresses go into a reg. This is REG if non
25758 zero, otherwise we allocate register(s) as necessary. */
25759
25760 #define SMALL_INT(X) ((UINTVAL (X) + 0x8000) < 0x10000)
25761
25762 rtx
25763 rs6000_machopic_legitimize_pic_address (rtx orig, enum machine_mode mode,
25764 rtx reg)
25765 {
25766 rtx base, offset;
25767
25768 if (reg == NULL && ! reload_in_progress && ! reload_completed)
25769 reg = gen_reg_rtx (Pmode);
25770
25771 if (GET_CODE (orig) == CONST)
25772 {
25773 rtx reg_temp;
25774
25775 if (GET_CODE (XEXP (orig, 0)) == PLUS
25776 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
25777 return orig;
25778
25779 gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
25780
25781 /* Use a different reg for the intermediate value, as
25782 it will be marked UNCHANGING. */
25783 reg_temp = !can_create_pseudo_p () ? reg : gen_reg_rtx (Pmode);
25784 base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
25785 Pmode, reg_temp);
25786 offset =
25787 rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
25788 Pmode, reg);
25789
25790 if (GET_CODE (offset) == CONST_INT)
25791 {
25792 if (SMALL_INT (offset))
25793 return plus_constant (base, INTVAL (offset));
25794 else if (! reload_in_progress && ! reload_completed)
25795 offset = force_reg (Pmode, offset);
25796 else
25797 {
25798 rtx mem = force_const_mem (Pmode, orig);
25799 return machopic_legitimize_pic_address (mem, Pmode, reg);
25800 }
25801 }
25802 return gen_rtx_PLUS (Pmode, base, offset);
25803 }
25804
25805 /* Fall back on generic machopic code. */
25806 return machopic_legitimize_pic_address (orig, mode, reg);
25807 }
25808
25809 /* Output a .machine directive for the Darwin assembler, and call
25810 the generic start_file routine. */
25811
25812 static void
25813 rs6000_darwin_file_start (void)
25814 {
25815 static const struct
25816 {
25817 const char *arg;
25818 const char *name;
25819 int if_set;
25820 } mapping[] = {
25821 { "ppc64", "ppc64", MASK_64BIT },
25822 { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
25823 { "power4", "ppc970", 0 },
25824 { "G5", "ppc970", 0 },
25825 { "7450", "ppc7450", 0 },
25826 { "7400", "ppc7400", MASK_ALTIVEC },
25827 { "G4", "ppc7400", 0 },
25828 { "750", "ppc750", 0 },
25829 { "740", "ppc750", 0 },
25830 { "G3", "ppc750", 0 },
25831 { "604e", "ppc604e", 0 },
25832 { "604", "ppc604", 0 },
25833 { "603e", "ppc603", 0 },
25834 { "603", "ppc603", 0 },
25835 { "601", "ppc601", 0 },
25836 { NULL, "ppc", 0 } };
25837 const char *cpu_id = "";
25838 size_t i;
25839
25840 rs6000_file_start ();
25841 darwin_file_start ();
25842
25843 /* Determine the argument to -mcpu=. Default to G3 if not specified. */
25844 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
25845 if (rs6000_select[i].set_arch_p && rs6000_select[i].string
25846 && rs6000_select[i].string[0] != '\0')
25847 cpu_id = rs6000_select[i].string;
25848
25849 /* Look through the mapping array. Pick the first name that either
25850 matches the argument, has a bit set in IF_SET that is also set
25851 in the target flags, or has a NULL name. */
25852
25853 i = 0;
25854 while (mapping[i].arg != NULL
25855 && strcmp (mapping[i].arg, cpu_id) != 0
25856 && (mapping[i].if_set & target_flags) == 0)
25857 i++;
25858
25859 fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
25860 }
25861
25862 #endif /* TARGET_MACHO */
25863
25864 #if TARGET_ELF
25865 static int
25866 rs6000_elf_reloc_rw_mask (void)
25867 {
25868 if (flag_pic)
25869 return 3;
25870 else if (DEFAULT_ABI == ABI_AIX)
25871 return 2;
25872 else
25873 return 0;
25874 }
25875
25876 /* Record an element in the table of global constructors. SYMBOL is
25877 a SYMBOL_REF of the function to be called; PRIORITY is a number
25878 between 0 and MAX_INIT_PRIORITY.
25879
25880 This differs from default_named_section_asm_out_constructor in
25881 that we have special handling for -mrelocatable. */
25882
25883 static void
25884 rs6000_elf_asm_out_constructor (rtx symbol, int priority)
25885 {
25886 const char *section = ".ctors";
25887 char buf[16];
25888
25889 if (priority != DEFAULT_INIT_PRIORITY)
25890 {
25891 sprintf (buf, ".ctors.%.5u",
25892 /* Invert the numbering so the linker puts us in the proper
25893 order; constructors are run from right to left, and the
25894 linker sorts in increasing order. */
25895 MAX_INIT_PRIORITY - priority);
25896 section = buf;
25897 }
25898
25899 switch_to_section (get_section (section, SECTION_WRITE, NULL));
25900 assemble_align (POINTER_SIZE);
25901
25902 if (TARGET_RELOCATABLE)
25903 {
25904 fputs ("\t.long (", asm_out_file);
25905 output_addr_const (asm_out_file, symbol);
25906 fputs (")@fixup\n", asm_out_file);
25907 }
25908 else
25909 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
25910 }
25911
25912 static void
25913 rs6000_elf_asm_out_destructor (rtx symbol, int priority)
25914 {
25915 const char *section = ".dtors";
25916 char buf[16];
25917
25918 if (priority != DEFAULT_INIT_PRIORITY)
25919 {
25920 sprintf (buf, ".dtors.%.5u",
25921 /* Invert the numbering so the linker puts us in the proper
25922 order; constructors are run from right to left, and the
25923 linker sorts in increasing order. */
25924 MAX_INIT_PRIORITY - priority);
25925 section = buf;
25926 }
25927
25928 switch_to_section (get_section (section, SECTION_WRITE, NULL));
25929 assemble_align (POINTER_SIZE);
25930
25931 if (TARGET_RELOCATABLE)
25932 {
25933 fputs ("\t.long (", asm_out_file);
25934 output_addr_const (asm_out_file, symbol);
25935 fputs (")@fixup\n", asm_out_file);
25936 }
25937 else
25938 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
25939 }
25940
25941 void
25942 rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
25943 {
25944 if (TARGET_64BIT)
25945 {
25946 fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
25947 ASM_OUTPUT_LABEL (file, name);
25948 fputs (DOUBLE_INT_ASM_OP, file);
25949 rs6000_output_function_entry (file, name);
25950 fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
25951 if (DOT_SYMBOLS)
25952 {
25953 fputs ("\t.size\t", file);
25954 assemble_name (file, name);
25955 fputs (",24\n\t.type\t.", file);
25956 assemble_name (file, name);
25957 fputs (",@function\n", file);
25958 if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
25959 {
25960 fputs ("\t.globl\t.", file);
25961 assemble_name (file, name);
25962 putc ('\n', file);
25963 }
25964 }
25965 else
25966 ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
25967 ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
25968 rs6000_output_function_entry (file, name);
25969 fputs (":\n", file);
25970 return;
25971 }
25972
25973 if (TARGET_RELOCATABLE
25974 && !TARGET_SECURE_PLT
25975 && (get_pool_size () != 0 || crtl->profile)
25976 && uses_TOC ())
25977 {
25978 char buf[256];
25979
25980 (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
25981
25982 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
25983 fprintf (file, "\t.long ");
25984 assemble_name (file, buf);
25985 putc ('-', file);
25986 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
25987 assemble_name (file, buf);
25988 putc ('\n', file);
25989 }
25990
25991 ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
25992 ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
25993
25994 if (DEFAULT_ABI == ABI_AIX)
25995 {
25996 const char *desc_name, *orig_name;
25997
25998 orig_name = (*targetm.strip_name_encoding) (name);
25999 desc_name = orig_name;
26000 while (*desc_name == '.')
26001 desc_name++;
26002
26003 if (TREE_PUBLIC (decl))
26004 fprintf (file, "\t.globl %s\n", desc_name);
26005
26006 fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
26007 fprintf (file, "%s:\n", desc_name);
26008 fprintf (file, "\t.long %s\n", orig_name);
26009 fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
26010 if (DEFAULT_ABI == ABI_AIX)
26011 fputs ("\t.long 0\n", file);
26012 fprintf (file, "\t.previous\n");
26013 }
26014 ASM_OUTPUT_LABEL (file, name);
26015 }
26016
26017 static void
26018 rs6000_elf_file_end (void)
26019 {
26020 #ifdef HAVE_AS_GNU_ATTRIBUTE
26021 if (TARGET_32BIT && DEFAULT_ABI == ABI_V4)
26022 {
26023 if (rs6000_passes_float)
26024 fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
26025 ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT) ? 1
26026 : (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_SINGLE_FLOAT) ? 3
26027 : 2));
26028 if (rs6000_passes_vector)
26029 fprintf (asm_out_file, "\t.gnu_attribute 8, %d\n",
26030 (TARGET_ALTIVEC_ABI ? 2
26031 : TARGET_SPE_ABI ? 3
26032 : 1));
26033 if (rs6000_returns_struct)
26034 fprintf (asm_out_file, "\t.gnu_attribute 12, %d\n",
26035 aix_struct_return ? 2 : 1);
26036 }
26037 #endif
26038 #ifdef POWERPC_LINUX
26039 if (TARGET_32BIT)
26040 file_end_indicate_exec_stack ();
26041 #endif
26042 }
26043 #endif
26044
26045 #if TARGET_XCOFF
26046 static void
26047 rs6000_xcoff_asm_output_anchor (rtx symbol)
26048 {
26049 char buffer[100];
26050
26051 sprintf (buffer, "$ + " HOST_WIDE_INT_PRINT_DEC,
26052 SYMBOL_REF_BLOCK_OFFSET (symbol));
26053 ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
26054 }
26055
26056 static void
26057 rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
26058 {
26059 fputs (GLOBAL_ASM_OP, stream);
26060 RS6000_OUTPUT_BASENAME (stream, name);
26061 putc ('\n', stream);
26062 }
26063
26064 /* A get_unnamed_decl callback, used for read-only sections. PTR
26065 points to the section string variable. */
26066
26067 static void
26068 rs6000_xcoff_output_readonly_section_asm_op (const void *directive)
26069 {
26070 fprintf (asm_out_file, "\t.csect %s[RO],%s\n",
26071 *(const char *const *) directive,
26072 XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
26073 }
26074
26075 /* Likewise for read-write sections. */
26076
26077 static void
26078 rs6000_xcoff_output_readwrite_section_asm_op (const void *directive)
26079 {
26080 fprintf (asm_out_file, "\t.csect %s[RW],%s\n",
26081 *(const char *const *) directive,
26082 XCOFF_CSECT_DEFAULT_ALIGNMENT_STR);
26083 }
26084
26085 /* A get_unnamed_section callback, used for switching to toc_section. */
26086
26087 static void
26088 rs6000_xcoff_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED)
26089 {
26090 if (TARGET_MINIMAL_TOC)
26091 {
26092 /* toc_section is always selected at least once from
26093 rs6000_xcoff_file_start, so this is guaranteed to
26094 always be defined once and only once in each file. */
26095 if (!toc_initialized)
26096 {
26097 fputs ("\t.toc\nLCTOC..1:\n", asm_out_file);
26098 fputs ("\t.tc toc_table[TC],toc_table[RW]\n", asm_out_file);
26099 toc_initialized = 1;
26100 }
26101 fprintf (asm_out_file, "\t.csect toc_table[RW]%s\n",
26102 (TARGET_32BIT ? "" : ",3"));
26103 }
26104 else
26105 fputs ("\t.toc\n", asm_out_file);
26106 }
26107
26108 /* Implement TARGET_ASM_INIT_SECTIONS. */
26109
26110 static void
26111 rs6000_xcoff_asm_init_sections (void)
26112 {
26113 read_only_data_section
26114 = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
26115 &xcoff_read_only_section_name);
26116
26117 private_data_section
26118 = get_unnamed_section (SECTION_WRITE,
26119 rs6000_xcoff_output_readwrite_section_asm_op,
26120 &xcoff_private_data_section_name);
26121
26122 read_only_private_data_section
26123 = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
26124 &xcoff_private_data_section_name);
26125
26126 toc_section
26127 = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);
26128
26129 readonly_data_section = read_only_data_section;
26130 exception_section = data_section;
26131 }
26132
26133 static int
26134 rs6000_xcoff_reloc_rw_mask (void)
26135 {
26136 return 3;
26137 }
26138
26139 static void
26140 rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
26141 tree decl ATTRIBUTE_UNUSED)
26142 {
26143 int smclass;
26144 static const char * const suffix[3] = { "PR", "RO", "RW" };
26145
26146 if (flags & SECTION_CODE)
26147 smclass = 0;
26148 else if (flags & SECTION_WRITE)
26149 smclass = 2;
26150 else
26151 smclass = 1;
26152
26153 fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
26154 (flags & SECTION_CODE) ? "." : "",
26155 name, suffix[smclass], flags & SECTION_ENTSIZE);
26156 }
26157
26158 static section *
26159 rs6000_xcoff_select_section (tree decl, int reloc,
26160 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
26161 {
26162 if (decl_readonly_section (decl, reloc))
26163 {
26164 if (TREE_PUBLIC (decl))
26165 return read_only_data_section;
26166 else
26167 return read_only_private_data_section;
26168 }
26169 else
26170 {
26171 if (TREE_PUBLIC (decl))
26172 return data_section;
26173 else
26174 return private_data_section;
26175 }
26176 }
26177
26178 static void
26179 rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
26180 {
26181 const char *name;
26182
26183 /* Use select_section for private and uninitialized data. */
26184 if (!TREE_PUBLIC (decl)
26185 || DECL_COMMON (decl)
26186 || DECL_INITIAL (decl) == NULL_TREE
26187 || DECL_INITIAL (decl) == error_mark_node
26188 || (flag_zero_initialized_in_bss
26189 && initializer_zerop (DECL_INITIAL (decl))))
26190 return;
26191
26192 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
26193 name = (*targetm.strip_name_encoding) (name);
26194 DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
26195 }
26196
26197 /* Select section for constant in constant pool.
26198
26199 On RS/6000, all constants are in the private read-only data area.
26200 However, if this is being placed in the TOC it must be output as a
26201 toc entry. */
26202
26203 static section *
26204 rs6000_xcoff_select_rtx_section (enum machine_mode mode, rtx x,
26205 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
26206 {
26207 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
26208 return toc_section;
26209 else
26210 return read_only_private_data_section;
26211 }
26212
26213 /* Remove any trailing [DS] or the like from the symbol name. */
26214
26215 static const char *
26216 rs6000_xcoff_strip_name_encoding (const char *name)
26217 {
26218 size_t len;
26219 if (*name == '*')
26220 name++;
26221 len = strlen (name);
26222 if (name[len - 1] == ']')
26223 return ggc_alloc_string (name, len - 4);
26224 else
26225 return name;
26226 }
26227
26228 /* Section attributes. AIX is always PIC. */
26229
26230 static unsigned int
26231 rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
26232 {
26233 unsigned int align;
26234 unsigned int flags = default_section_type_flags (decl, name, reloc);
26235
26236 /* Align to at least UNIT size. */
26237 if (flags & SECTION_CODE)
26238 align = MIN_UNITS_PER_WORD;
26239 else
26240 /* Increase alignment of large objects if not already stricter. */
26241 align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
26242 int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
26243 ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
26244
26245 return flags | (exact_log2 (align) & SECTION_ENTSIZE);
26246 }
26247
26248 /* Output at beginning of assembler file.
26249
26250 Initialize the section names for the RS/6000 at this point.
26251
26252 Specify filename, including full path, to assembler.
26253
26254 We want to go into the TOC section so at least one .toc will be emitted.
26255 Also, in order to output proper .bs/.es pairs, we need at least one static
26256 [RW] section emitted.
26257
26258 Finally, declare mcount when profiling to make the assembler happy. */
26259
26260 static void
26261 rs6000_xcoff_file_start (void)
26262 {
26263 rs6000_gen_section_name (&xcoff_bss_section_name,
26264 main_input_filename, ".bss_");
26265 rs6000_gen_section_name (&xcoff_private_data_section_name,
26266 main_input_filename, ".rw_");
26267 rs6000_gen_section_name (&xcoff_read_only_section_name,
26268 main_input_filename, ".ro_");
26269
26270 fputs ("\t.file\t", asm_out_file);
26271 output_quoted_string (asm_out_file, main_input_filename);
26272 fputc ('\n', asm_out_file);
26273 if (write_symbols != NO_DEBUG)
26274 switch_to_section (private_data_section);
26275 switch_to_section (text_section);
26276 if (profile_flag)
26277 fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
26278 rs6000_file_start ();
26279 }
26280
26281 /* Output at end of assembler file.
26282 On the RS/6000, referencing data should automatically pull in text. */
26283
26284 static void
26285 rs6000_xcoff_file_end (void)
26286 {
26287 switch_to_section (text_section);
26288 fputs ("_section_.text:\n", asm_out_file);
26289 switch_to_section (data_section);
26290 fputs (TARGET_32BIT
26291 ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
26292 asm_out_file);
26293 }
26294 #endif /* TARGET_XCOFF */
26295
26296 /* Compute a (partial) cost for rtx X. Return true if the complete
26297 cost has been computed, and false if subexpressions should be
26298 scanned. In either case, *TOTAL contains the cost result. */
26299
26300 static bool
26301 rs6000_rtx_costs (rtx x, int code, int outer_code, int *total,
26302 bool speed)
26303 {
26304 enum machine_mode mode = GET_MODE (x);
26305
26306 switch (code)
26307 {
26308 /* On the RS/6000, if it is valid in the insn, it is free. */
26309 case CONST_INT:
26310 if (((outer_code == SET
26311 || outer_code == PLUS
26312 || outer_code == MINUS)
26313 && (satisfies_constraint_I (x)
26314 || satisfies_constraint_L (x)))
26315 || (outer_code == AND
26316 && (satisfies_constraint_K (x)
26317 || (mode == SImode
26318 ? satisfies_constraint_L (x)
26319 : satisfies_constraint_J (x))
26320 || mask_operand (x, mode)
26321 || (mode == DImode
26322 && mask64_operand (x, DImode))))
26323 || ((outer_code == IOR || outer_code == XOR)
26324 && (satisfies_constraint_K (x)
26325 || (mode == SImode
26326 ? satisfies_constraint_L (x)
26327 : satisfies_constraint_J (x))))
26328 || outer_code == ASHIFT
26329 || outer_code == ASHIFTRT
26330 || outer_code == LSHIFTRT
26331 || outer_code == ROTATE
26332 || outer_code == ROTATERT
26333 || outer_code == ZERO_EXTRACT
26334 || (outer_code == MULT
26335 && satisfies_constraint_I (x))
26336 || ((outer_code == DIV || outer_code == UDIV
26337 || outer_code == MOD || outer_code == UMOD)
26338 && exact_log2 (INTVAL (x)) >= 0)
26339 || (outer_code == COMPARE
26340 && (satisfies_constraint_I (x)
26341 || satisfies_constraint_K (x)))
26342 || ((outer_code == EQ || outer_code == NE)
26343 && (satisfies_constraint_I (x)
26344 || satisfies_constraint_K (x)
26345 || (mode == SImode
26346 ? satisfies_constraint_L (x)
26347 : satisfies_constraint_J (x))))
26348 || (outer_code == GTU
26349 && satisfies_constraint_I (x))
26350 || (outer_code == LTU
26351 && satisfies_constraint_P (x)))
26352 {
26353 *total = 0;
26354 return true;
26355 }
26356 else if ((outer_code == PLUS
26357 && reg_or_add_cint_operand (x, VOIDmode))
26358 || (outer_code == MINUS
26359 && reg_or_sub_cint_operand (x, VOIDmode))
26360 || ((outer_code == SET
26361 || outer_code == IOR
26362 || outer_code == XOR)
26363 && (INTVAL (x)
26364 & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
26365 {
26366 *total = COSTS_N_INSNS (1);
26367 return true;
26368 }
26369 /* FALLTHRU */
26370
26371 case CONST_DOUBLE:
26372 if (mode == DImode && code == CONST_DOUBLE)
26373 {
26374 if ((outer_code == IOR || outer_code == XOR)
26375 && CONST_DOUBLE_HIGH (x) == 0
26376 && (CONST_DOUBLE_LOW (x)
26377 & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0)
26378 {
26379 *total = 0;
26380 return true;
26381 }
26382 else if ((outer_code == AND && and64_2_operand (x, DImode))
26383 || ((outer_code == SET
26384 || outer_code == IOR
26385 || outer_code == XOR)
26386 && CONST_DOUBLE_HIGH (x) == 0))
26387 {
26388 *total = COSTS_N_INSNS (1);
26389 return true;
26390 }
26391 }
26392 /* FALLTHRU */
26393
26394 case CONST:
26395 case HIGH:
26396 case SYMBOL_REF:
26397 case MEM:
26398 /* When optimizing for size, MEM should be slightly more expensive
26399 than generating address, e.g., (plus (reg) (const)).
26400 L1 cache latency is about two instructions. */
26401 *total = !speed ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
26402 return true;
26403
26404 case LABEL_REF:
26405 *total = 0;
26406 return true;
26407
26408 case PLUS:
26409 case MINUS:
26410 if (FLOAT_MODE_P (mode))
26411 *total = rs6000_cost->fp;
26412 else
26413 *total = COSTS_N_INSNS (1);
26414 return false;
26415
26416 case MULT:
26417 if (GET_CODE (XEXP (x, 1)) == CONST_INT
26418 && satisfies_constraint_I (XEXP (x, 1)))
26419 {
26420 if (INTVAL (XEXP (x, 1)) >= -256
26421 && INTVAL (XEXP (x, 1)) <= 255)
26422 *total = rs6000_cost->mulsi_const9;
26423 else
26424 *total = rs6000_cost->mulsi_const;
26425 }
26426 else if (mode == SFmode)
26427 *total = rs6000_cost->fp;
26428 else if (FLOAT_MODE_P (mode))
26429 *total = rs6000_cost->dmul;
26430 else if (mode == DImode)
26431 *total = rs6000_cost->muldi;
26432 else
26433 *total = rs6000_cost->mulsi;
26434 return false;
26435
26436 case FMA:
26437 if (mode == SFmode)
26438 *total = rs6000_cost->fp;
26439 else
26440 *total = rs6000_cost->dmul;
26441 break;
26442
26443 case DIV:
26444 case MOD:
26445 if (FLOAT_MODE_P (mode))
26446 {
26447 *total = mode == DFmode ? rs6000_cost->ddiv
26448 : rs6000_cost->sdiv;
26449 return false;
26450 }
26451 /* FALLTHRU */
26452
26453 case UDIV:
26454 case UMOD:
26455 if (GET_CODE (XEXP (x, 1)) == CONST_INT
26456 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
26457 {
26458 if (code == DIV || code == MOD)
26459 /* Shift, addze */
26460 *total = COSTS_N_INSNS (2);
26461 else
26462 /* Shift */
26463 *total = COSTS_N_INSNS (1);
26464 }
26465 else
26466 {
26467 if (GET_MODE (XEXP (x, 1)) == DImode)
26468 *total = rs6000_cost->divdi;
26469 else
26470 *total = rs6000_cost->divsi;
26471 }
26472 /* Add in shift and subtract for MOD. */
26473 if (code == MOD || code == UMOD)
26474 *total += COSTS_N_INSNS (2);
26475 return false;
26476
26477 case CTZ:
26478 case FFS:
26479 *total = COSTS_N_INSNS (4);
26480 return false;
26481
26482 case POPCOUNT:
26483 *total = COSTS_N_INSNS (TARGET_POPCNTD ? 1 : 6);
26484 return false;
26485
26486 case PARITY:
26487 *total = COSTS_N_INSNS (TARGET_CMPB ? 2 : 6);
26488 return false;
26489
26490 case NOT:
26491 if (outer_code == AND || outer_code == IOR || outer_code == XOR)
26492 {
26493 *total = 0;
26494 return false;
26495 }
26496 /* FALLTHRU */
26497
26498 case AND:
26499 case CLZ:
26500 case IOR:
26501 case XOR:
26502 case ZERO_EXTRACT:
26503 *total = COSTS_N_INSNS (1);
26504 return false;
26505
26506 case ASHIFT:
26507 case ASHIFTRT:
26508 case LSHIFTRT:
26509 case ROTATE:
26510 case ROTATERT:
26511 /* Handle mul_highpart. */
26512 if (outer_code == TRUNCATE
26513 && GET_CODE (XEXP (x, 0)) == MULT)
26514 {
26515 if (mode == DImode)
26516 *total = rs6000_cost->muldi;
26517 else
26518 *total = rs6000_cost->mulsi;
26519 return true;
26520 }
26521 else if (outer_code == AND)
26522 *total = 0;
26523 else
26524 *total = COSTS_N_INSNS (1);
26525 return false;
26526
26527 case SIGN_EXTEND:
26528 case ZERO_EXTEND:
26529 if (GET_CODE (XEXP (x, 0)) == MEM)
26530 *total = 0;
26531 else
26532 *total = COSTS_N_INSNS (1);
26533 return false;
26534
26535 case COMPARE:
26536 case NEG:
26537 case ABS:
26538 if (!FLOAT_MODE_P (mode))
26539 {
26540 *total = COSTS_N_INSNS (1);
26541 return false;
26542 }
26543 /* FALLTHRU */
26544
26545 case FLOAT:
26546 case UNSIGNED_FLOAT:
26547 case FIX:
26548 case UNSIGNED_FIX:
26549 case FLOAT_TRUNCATE:
26550 *total = rs6000_cost->fp;
26551 return false;
26552
26553 case FLOAT_EXTEND:
26554 if (mode == DFmode)
26555 *total = 0;
26556 else
26557 *total = rs6000_cost->fp;
26558 return false;
26559
26560 case UNSPEC:
26561 switch (XINT (x, 1))
26562 {
26563 case UNSPEC_FRSP:
26564 *total = rs6000_cost->fp;
26565 return true;
26566
26567 default:
26568 break;
26569 }
26570 break;
26571
26572 case CALL:
26573 case IF_THEN_ELSE:
26574 if (!speed)
26575 {
26576 *total = COSTS_N_INSNS (1);
26577 return true;
26578 }
26579 else if (FLOAT_MODE_P (mode)
26580 && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS)
26581 {
26582 *total = rs6000_cost->fp;
26583 return false;
26584 }
26585 break;
26586
26587 case EQ:
26588 case GTU:
26589 case LTU:
26590 /* Carry bit requires mode == Pmode.
26591 NEG or PLUS already counted so only add one. */
26592 if (mode == Pmode
26593 && (outer_code == NEG || outer_code == PLUS))
26594 {
26595 *total = COSTS_N_INSNS (1);
26596 return true;
26597 }
26598 if (outer_code == SET)
26599 {
26600 if (XEXP (x, 1) == const0_rtx)
26601 {
26602 if (TARGET_ISEL && !TARGET_MFCRF)
26603 *total = COSTS_N_INSNS (8);
26604 else
26605 *total = COSTS_N_INSNS (2);
26606 return true;
26607 }
26608 else if (mode == Pmode)
26609 {
26610 *total = COSTS_N_INSNS (3);
26611 return false;
26612 }
26613 }
26614 /* FALLTHRU */
26615
26616 case GT:
26617 case LT:
26618 case UNORDERED:
26619 if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
26620 {
26621 if (TARGET_ISEL && !TARGET_MFCRF)
26622 *total = COSTS_N_INSNS (8);
26623 else
26624 *total = COSTS_N_INSNS (2);
26625 return true;
26626 }
26627 /* CC COMPARE. */
26628 if (outer_code == COMPARE)
26629 {
26630 *total = 0;
26631 return true;
26632 }
26633 break;
26634
26635 default:
26636 break;
26637 }
26638
26639 return false;
26640 }
26641
26642 /* Debug form of r6000_rtx_costs that is selected if -mdebug=cost. */
26643
26644 static bool
26645 rs6000_debug_rtx_costs (rtx x, int code, int outer_code, int *total,
26646 bool speed)
26647 {
26648 bool ret = rs6000_rtx_costs (x, code, outer_code, total, speed);
26649
26650 fprintf (stderr,
26651 "\nrs6000_rtx_costs, return = %s, code = %s, outer_code = %s, "
26652 "total = %d, speed = %s, x:\n",
26653 ret ? "complete" : "scan inner",
26654 GET_RTX_NAME (code),
26655 GET_RTX_NAME (outer_code),
26656 *total,
26657 speed ? "true" : "false");
26658
26659 debug_rtx (x);
26660
26661 return ret;
26662 }
26663
26664 /* Debug form of ADDRESS_COST that is selected if -mdebug=cost. */
26665
26666 static int
26667 rs6000_debug_address_cost (rtx x, bool speed)
26668 {
26669 int ret = TARGET_ADDRESS_COST (x, speed);
26670
26671 fprintf (stderr, "\nrs6000_address_cost, return = %d, speed = %s, x:\n",
26672 ret, speed ? "true" : "false");
26673 debug_rtx (x);
26674
26675 return ret;
26676 }
26677
26678
26679 /* A C expression returning the cost of moving data from a register of class
26680 CLASS1 to one of CLASS2. */
26681
26682 static int
26683 rs6000_register_move_cost (enum machine_mode mode,
26684 reg_class_t from, reg_class_t to)
26685 {
26686 int ret;
26687
26688 /* Moves from/to GENERAL_REGS. */
26689 if (reg_classes_intersect_p (to, GENERAL_REGS)
26690 || reg_classes_intersect_p (from, GENERAL_REGS))
26691 {
26692 if (! reg_classes_intersect_p (to, GENERAL_REGS))
26693 from = to;
26694
26695 if (from == FLOAT_REGS || from == ALTIVEC_REGS || from == VSX_REGS)
26696 ret = (rs6000_memory_move_cost (mode, from, false)
26697 + rs6000_memory_move_cost (mode, GENERAL_REGS, false));
26698
26699 /* It's more expensive to move CR_REGS than CR0_REGS because of the
26700 shift. */
26701 else if (from == CR_REGS)
26702 ret = 4;
26703
26704 /* Power6 has slower LR/CTR moves so make them more expensive than
26705 memory in order to bias spills to memory .*/
26706 else if (rs6000_cpu == PROCESSOR_POWER6
26707 && reg_classes_intersect_p (from, LINK_OR_CTR_REGS))
26708 ret = 6 * hard_regno_nregs[0][mode];
26709
26710 else
26711 /* A move will cost one instruction per GPR moved. */
26712 ret = 2 * hard_regno_nregs[0][mode];
26713 }
26714
26715 /* If we have VSX, we can easily move between FPR or Altivec registers. */
26716 else if (VECTOR_UNIT_VSX_P (mode)
26717 && reg_classes_intersect_p (to, VSX_REGS)
26718 && reg_classes_intersect_p (from, VSX_REGS))
26719 ret = 2 * hard_regno_nregs[32][mode];
26720
26721 /* Moving between two similar registers is just one instruction. */
26722 else if (reg_classes_intersect_p (to, from))
26723 ret = (mode == TFmode || mode == TDmode) ? 4 : 2;
26724
26725 /* Everything else has to go through GENERAL_REGS. */
26726 else
26727 ret = (rs6000_register_move_cost (mode, GENERAL_REGS, to)
26728 + rs6000_register_move_cost (mode, from, GENERAL_REGS));
26729
26730 if (TARGET_DEBUG_COST)
26731 fprintf (stderr,
26732 "rs6000_register_move_cost:, ret=%d, mode=%s, from=%s, to=%s\n",
26733 ret, GET_MODE_NAME (mode), reg_class_names[from],
26734 reg_class_names[to]);
26735
26736 return ret;
26737 }
26738
26739 /* A C expressions returning the cost of moving data of MODE from a register to
26740 or from memory. */
26741
26742 static int
26743 rs6000_memory_move_cost (enum machine_mode mode, reg_class_t rclass,
26744 bool in ATTRIBUTE_UNUSED)
26745 {
26746 int ret;
26747
26748 if (reg_classes_intersect_p (rclass, GENERAL_REGS))
26749 ret = 4 * hard_regno_nregs[0][mode];
26750 else if (reg_classes_intersect_p (rclass, FLOAT_REGS))
26751 ret = 4 * hard_regno_nregs[32][mode];
26752 else if (reg_classes_intersect_p (rclass, ALTIVEC_REGS))
26753 ret = 4 * hard_regno_nregs[FIRST_ALTIVEC_REGNO][mode];
26754 else
26755 ret = 4 + rs6000_register_move_cost (mode, rclass, GENERAL_REGS);
26756
26757 if (TARGET_DEBUG_COST)
26758 fprintf (stderr,
26759 "rs6000_memory_move_cost: ret=%d, mode=%s, rclass=%s, in=%d\n",
26760 ret, GET_MODE_NAME (mode), reg_class_names[rclass], in);
26761
26762 return ret;
26763 }
26764
26765 /* Returns a code for a target-specific builtin that implements
26766 reciprocal of the function, or NULL_TREE if not available. */
26767
26768 static tree
26769 rs6000_builtin_reciprocal (unsigned int fn, bool md_fn,
26770 bool sqrt ATTRIBUTE_UNUSED)
26771 {
26772 if (optimize_insn_for_size_p ())
26773 return NULL_TREE;
26774
26775 if (md_fn)
26776 switch (fn)
26777 {
26778 case VSX_BUILTIN_XVSQRTDP:
26779 if (!RS6000_RECIP_AUTO_RSQRTE_P (V2DFmode))
26780 return NULL_TREE;
26781
26782 return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V2DF];
26783
26784 case VSX_BUILTIN_XVSQRTSP:
26785 if (!RS6000_RECIP_AUTO_RSQRTE_P (V4SFmode))
26786 return NULL_TREE;
26787
26788 return rs6000_builtin_decls[VSX_BUILTIN_VEC_RSQRT_V4SF];
26789
26790 default:
26791 return NULL_TREE;
26792 }
26793
26794 else
26795 switch (fn)
26796 {
26797 case BUILT_IN_SQRT:
26798 if (!RS6000_RECIP_AUTO_RSQRTE_P (DFmode))
26799 return NULL_TREE;
26800
26801 return rs6000_builtin_decls[RS6000_BUILTIN_RSQRT];
26802
26803 case BUILT_IN_SQRTF:
26804 if (!RS6000_RECIP_AUTO_RSQRTE_P (SFmode))
26805 return NULL_TREE;
26806
26807 return rs6000_builtin_decls[RS6000_BUILTIN_RSQRTF];
26808
26809 default:
26810 return NULL_TREE;
26811 }
26812 }
26813
26814 /* Load up a constant. If the mode is a vector mode, splat the value across
26815 all of the vector elements. */
26816
26817 static rtx
26818 rs6000_load_constant_and_splat (enum machine_mode mode, REAL_VALUE_TYPE dconst)
26819 {
26820 rtx reg;
26821
26822 if (mode == SFmode || mode == DFmode)
26823 {
26824 rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, mode);
26825 reg = force_reg (mode, d);
26826 }
26827 else if (mode == V4SFmode)
26828 {
26829 rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, SFmode);
26830 rtvec v = gen_rtvec (4, d, d, d, d);
26831 reg = gen_reg_rtx (mode);
26832 rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
26833 }
26834 else if (mode == V2DFmode)
26835 {
26836 rtx d = CONST_DOUBLE_FROM_REAL_VALUE (dconst, DFmode);
26837 rtvec v = gen_rtvec (2, d, d);
26838 reg = gen_reg_rtx (mode);
26839 rs6000_expand_vector_init (reg, gen_rtx_PARALLEL (mode, v));
26840 }
26841 else
26842 gcc_unreachable ();
26843
26844 return reg;
26845 }
26846
26847 /* Generate an FMA instruction. */
26848
26849 static void
26850 rs6000_emit_madd (rtx target, rtx m1, rtx m2, rtx a)
26851 {
26852 enum machine_mode mode = GET_MODE (target);
26853 rtx dst;
26854
26855 dst = expand_ternary_op (mode, fma_optab, m1, m2, a, target, 0);
26856 gcc_assert (dst != NULL);
26857
26858 if (dst != target)
26859 emit_move_insn (target, dst);
26860 }
26861
26862 /* Generate a FMSUB instruction: dst = fma(m1, m2, -a). */
26863
26864 static void
26865 rs6000_emit_msub (rtx target, rtx m1, rtx m2, rtx a)
26866 {
26867 enum machine_mode mode = GET_MODE (target);
26868 rtx dst;
26869
26870 /* Altivec does not support fms directly;
26871 generate in terms of fma in that case. */
26872 if (optab_handler (fms_optab, mode) != CODE_FOR_nothing)
26873 dst = expand_ternary_op (mode, fms_optab, m1, m2, a, target, 0);
26874 else
26875 {
26876 a = expand_unop (mode, neg_optab, a, NULL_RTX, 0);
26877 dst = expand_ternary_op (mode, fma_optab, m1, m2, a, target, 0);
26878 }
26879 gcc_assert (dst != NULL);
26880
26881 if (dst != target)
26882 emit_move_insn (target, dst);
26883 }
26884
26885 /* Generate a FNMSUB instruction: dst = -fma(m1, m2, -a). */
26886
26887 static void
26888 rs6000_emit_nmsub (rtx dst, rtx m1, rtx m2, rtx a)
26889 {
26890 enum machine_mode mode = GET_MODE (dst);
26891 rtx r;
26892
26893 /* This is a tad more complicated, since the fnma_optab is for
26894 a different expression: fma(-m1, m2, a), which is the same
26895 thing except in the case of signed zeros.
26896
26897 Fortunately we know that if FMA is supported that FNMSUB is
26898 also supported in the ISA. Just expand it directly. */
26899
26900 gcc_assert (optab_handler (fma_optab, mode) != CODE_FOR_nothing);
26901
26902 r = gen_rtx_NEG (mode, a);
26903 r = gen_rtx_FMA (mode, m1, m2, r);
26904 r = gen_rtx_NEG (mode, r);
26905 emit_insn (gen_rtx_SET (VOIDmode, dst, r));
26906 }
26907
26908 /* Newton-Raphson approximation of floating point divide with just 2 passes
26909 (either single precision floating point, or newer machines with higher
26910 accuracy estimates). Support both scalar and vector divide. Assumes no
26911 trapping math and finite arguments. */
26912
26913 static void
26914 rs6000_emit_swdiv_high_precision (rtx dst, rtx n, rtx d)
26915 {
26916 enum machine_mode mode = GET_MODE (dst);
26917 rtx x0, e0, e1, y1, u0, v0;
26918 enum insn_code code = optab_handler (smul_optab, mode);
26919 gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26920 rtx one = rs6000_load_constant_and_splat (mode, dconst1);
26921
26922 gcc_assert (code != CODE_FOR_nothing);
26923
26924 /* x0 = 1./d estimate */
26925 x0 = gen_reg_rtx (mode);
26926 emit_insn (gen_rtx_SET (VOIDmode, x0,
26927 gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
26928 UNSPEC_FRES)));
26929
26930 e0 = gen_reg_rtx (mode);
26931 rs6000_emit_nmsub (e0, d, x0, one); /* e0 = 1. - (d * x0) */
26932
26933 e1 = gen_reg_rtx (mode);
26934 rs6000_emit_madd (e1, e0, e0, e0); /* e1 = (e0 * e0) + e0 */
26935
26936 y1 = gen_reg_rtx (mode);
26937 rs6000_emit_madd (y1, e1, x0, x0); /* y1 = (e1 * x0) + x0 */
26938
26939 u0 = gen_reg_rtx (mode);
26940 emit_insn (gen_mul (u0, n, y1)); /* u0 = n * y1 */
26941
26942 v0 = gen_reg_rtx (mode);
26943 rs6000_emit_nmsub (v0, d, u0, n); /* v0 = n - (d * u0) */
26944
26945 rs6000_emit_madd (dst, v0, y1, u0); /* dst = (v0 * y1) + u0 */
26946 }
26947
26948 /* Newton-Raphson approximation of floating point divide that has a low
26949 precision estimate. Assumes no trapping math and finite arguments. */
26950
26951 static void
26952 rs6000_emit_swdiv_low_precision (rtx dst, rtx n, rtx d)
26953 {
26954 enum machine_mode mode = GET_MODE (dst);
26955 rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
26956 enum insn_code code = optab_handler (smul_optab, mode);
26957 gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
26958
26959 gcc_assert (code != CODE_FOR_nothing);
26960
26961 one = rs6000_load_constant_and_splat (mode, dconst1);
26962
26963 /* x0 = 1./d estimate */
26964 x0 = gen_reg_rtx (mode);
26965 emit_insn (gen_rtx_SET (VOIDmode, x0,
26966 gen_rtx_UNSPEC (mode, gen_rtvec (1, d),
26967 UNSPEC_FRES)));
26968
26969 e0 = gen_reg_rtx (mode);
26970 rs6000_emit_nmsub (e0, d, x0, one); /* e0 = 1. - d * x0 */
26971
26972 y1 = gen_reg_rtx (mode);
26973 rs6000_emit_madd (y1, e0, x0, x0); /* y1 = x0 + e0 * x0 */
26974
26975 e1 = gen_reg_rtx (mode);
26976 emit_insn (gen_mul (e1, e0, e0)); /* e1 = e0 * e0 */
26977
26978 y2 = gen_reg_rtx (mode);
26979 rs6000_emit_madd (y2, e1, y1, y1); /* y2 = y1 + e1 * y1 */
26980
26981 e2 = gen_reg_rtx (mode);
26982 emit_insn (gen_mul (e2, e1, e1)); /* e2 = e1 * e1 */
26983
26984 y3 = gen_reg_rtx (mode);
26985 rs6000_emit_madd (y3, e2, y2, y2); /* y3 = y2 + e2 * y2 */
26986
26987 u0 = gen_reg_rtx (mode);
26988 emit_insn (gen_mul (u0, n, y3)); /* u0 = n * y3 */
26989
26990 v0 = gen_reg_rtx (mode);
26991 rs6000_emit_nmsub (v0, d, u0, n); /* v0 = n - d * u0 */
26992
26993 rs6000_emit_madd (dst, v0, y3, u0); /* dst = u0 + v0 * y3 */
26994 }
26995
26996 /* Newton-Raphson approximation of floating point divide DST = N/D. If NOTE_P,
26997 add a reg_note saying that this was a division. Support both scalar and
26998 vector divide. Assumes no trapping math and finite arguments. */
26999
27000 void
27001 rs6000_emit_swdiv (rtx dst, rtx n, rtx d, bool note_p)
27002 {
27003 enum machine_mode mode = GET_MODE (dst);
27004
27005 if (RS6000_RECIP_HIGH_PRECISION_P (mode))
27006 rs6000_emit_swdiv_high_precision (dst, n, d);
27007 else
27008 rs6000_emit_swdiv_low_precision (dst, n, d);
27009
27010 if (note_p)
27011 add_reg_note (get_last_insn (), REG_EQUAL, gen_rtx_DIV (mode, n, d));
27012 }
27013
27014 /* Newton-Raphson approximation of single/double-precision floating point
27015 rsqrt. Assumes no trapping math and finite arguments. */
27016
27017 void
27018 rs6000_emit_swrsqrt (rtx dst, rtx src)
27019 {
27020 enum machine_mode mode = GET_MODE (src);
27021 rtx x0 = gen_reg_rtx (mode);
27022 rtx y = gen_reg_rtx (mode);
27023 int passes = (TARGET_RECIP_PRECISION) ? 2 : 3;
27024 REAL_VALUE_TYPE dconst3_2;
27025 int i;
27026 rtx halfthree;
27027 enum insn_code code = optab_handler (smul_optab, mode);
27028 gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
27029
27030 gcc_assert (code != CODE_FOR_nothing);
27031
27032 /* Load up the constant 1.5 either as a scalar, or as a vector. */
27033 real_from_integer (&dconst3_2, VOIDmode, 3, 0, 0);
27034 SET_REAL_EXP (&dconst3_2, REAL_EXP (&dconst3_2) - 1);
27035
27036 halfthree = rs6000_load_constant_and_splat (mode, dconst3_2);
27037
27038 /* x0 = rsqrt estimate */
27039 emit_insn (gen_rtx_SET (VOIDmode, x0,
27040 gen_rtx_UNSPEC (mode, gen_rtvec (1, src),
27041 UNSPEC_RSQRT)));
27042
27043 /* y = 0.5 * src = 1.5 * src - src -> fewer constants */
27044 rs6000_emit_msub (y, src, halfthree, src);
27045
27046 for (i = 0; i < passes; i++)
27047 {
27048 rtx x1 = gen_reg_rtx (mode);
27049 rtx u = gen_reg_rtx (mode);
27050 rtx v = gen_reg_rtx (mode);
27051
27052 /* x1 = x0 * (1.5 - y * (x0 * x0)) */
27053 emit_insn (gen_mul (u, x0, x0));
27054 rs6000_emit_nmsub (v, y, u, halfthree);
27055 emit_insn (gen_mul (x1, x0, v));
27056 x0 = x1;
27057 }
27058
27059 emit_move_insn (dst, x0);
27060 return;
27061 }
27062
27063 /* Emit popcount intrinsic on TARGET_POPCNTB (Power5) and TARGET_POPCNTD
27064 (Power7) targets. DST is the target, and SRC is the argument operand. */
27065
27066 void
27067 rs6000_emit_popcount (rtx dst, rtx src)
27068 {
27069 enum machine_mode mode = GET_MODE (dst);
27070 rtx tmp1, tmp2;
27071
27072 /* Use the PPC ISA 2.06 popcnt{w,d} instruction if we can. */
27073 if (TARGET_POPCNTD)
27074 {
27075 if (mode == SImode)
27076 emit_insn (gen_popcntdsi2 (dst, src));
27077 else
27078 emit_insn (gen_popcntddi2 (dst, src));
27079 return;
27080 }
27081
27082 tmp1 = gen_reg_rtx (mode);
27083
27084 if (mode == SImode)
27085 {
27086 emit_insn (gen_popcntbsi2 (tmp1, src));
27087 tmp2 = expand_mult (SImode, tmp1, GEN_INT (0x01010101),
27088 NULL_RTX, 0);
27089 tmp2 = force_reg (SImode, tmp2);
27090 emit_insn (gen_lshrsi3 (dst, tmp2, GEN_INT (24)));
27091 }
27092 else
27093 {
27094 emit_insn (gen_popcntbdi2 (tmp1, src));
27095 tmp2 = expand_mult (DImode, tmp1,
27096 GEN_INT ((HOST_WIDE_INT)
27097 0x01010101 << 32 | 0x01010101),
27098 NULL_RTX, 0);
27099 tmp2 = force_reg (DImode, tmp2);
27100 emit_insn (gen_lshrdi3 (dst, tmp2, GEN_INT (56)));
27101 }
27102 }
27103
27104
27105 /* Emit parity intrinsic on TARGET_POPCNTB targets. DST is the
27106 target, and SRC is the argument operand. */
27107
27108 void
27109 rs6000_emit_parity (rtx dst, rtx src)
27110 {
27111 enum machine_mode mode = GET_MODE (dst);
27112 rtx tmp;
27113
27114 tmp = gen_reg_rtx (mode);
27115
27116 /* Use the PPC ISA 2.05 prtyw/prtyd instruction if we can. */
27117 if (TARGET_CMPB)
27118 {
27119 if (mode == SImode)
27120 {
27121 emit_insn (gen_popcntbsi2 (tmp, src));
27122 emit_insn (gen_paritysi2_cmpb (dst, tmp));
27123 }
27124 else
27125 {
27126 emit_insn (gen_popcntbdi2 (tmp, src));
27127 emit_insn (gen_paritydi2_cmpb (dst, tmp));
27128 }
27129 return;
27130 }
27131
27132 if (mode == SImode)
27133 {
27134 /* Is mult+shift >= shift+xor+shift+xor? */
27135 if (rs6000_cost->mulsi_const >= COSTS_N_INSNS (3))
27136 {
27137 rtx tmp1, tmp2, tmp3, tmp4;
27138
27139 tmp1 = gen_reg_rtx (SImode);
27140 emit_insn (gen_popcntbsi2 (tmp1, src));
27141
27142 tmp2 = gen_reg_rtx (SImode);
27143 emit_insn (gen_lshrsi3 (tmp2, tmp1, GEN_INT (16)));
27144 tmp3 = gen_reg_rtx (SImode);
27145 emit_insn (gen_xorsi3 (tmp3, tmp1, tmp2));
27146
27147 tmp4 = gen_reg_rtx (SImode);
27148 emit_insn (gen_lshrsi3 (tmp4, tmp3, GEN_INT (8)));
27149 emit_insn (gen_xorsi3 (tmp, tmp3, tmp4));
27150 }
27151 else
27152 rs6000_emit_popcount (tmp, src);
27153 emit_insn (gen_andsi3 (dst, tmp, const1_rtx));
27154 }
27155 else
27156 {
27157 /* Is mult+shift >= shift+xor+shift+xor+shift+xor? */
27158 if (rs6000_cost->muldi >= COSTS_N_INSNS (5))
27159 {
27160 rtx tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
27161
27162 tmp1 = gen_reg_rtx (DImode);
27163 emit_insn (gen_popcntbdi2 (tmp1, src));
27164
27165 tmp2 = gen_reg_rtx (DImode);
27166 emit_insn (gen_lshrdi3 (tmp2, tmp1, GEN_INT (32)));
27167 tmp3 = gen_reg_rtx (DImode);
27168 emit_insn (gen_xordi3 (tmp3, tmp1, tmp2));
27169
27170 tmp4 = gen_reg_rtx (DImode);
27171 emit_insn (gen_lshrdi3 (tmp4, tmp3, GEN_INT (16)));
27172 tmp5 = gen_reg_rtx (DImode);
27173 emit_insn (gen_xordi3 (tmp5, tmp3, tmp4));
27174
27175 tmp6 = gen_reg_rtx (DImode);
27176 emit_insn (gen_lshrdi3 (tmp6, tmp5, GEN_INT (8)));
27177 emit_insn (gen_xordi3 (tmp, tmp5, tmp6));
27178 }
27179 else
27180 rs6000_emit_popcount (tmp, src);
27181 emit_insn (gen_anddi3 (dst, tmp, const1_rtx));
27182 }
27183 }
27184
27185 /* Return an RTX representing where to find the function value of a
27186 function returning MODE. */
27187 static rtx
27188 rs6000_complex_function_value (enum machine_mode mode)
27189 {
27190 unsigned int regno;
27191 rtx r1, r2;
27192 enum machine_mode inner = GET_MODE_INNER (mode);
27193 unsigned int inner_bytes = GET_MODE_SIZE (inner);
27194
27195 if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
27196 regno = FP_ARG_RETURN;
27197 else
27198 {
27199 regno = GP_ARG_RETURN;
27200
27201 /* 32-bit is OK since it'll go in r3/r4. */
27202 if (TARGET_32BIT && inner_bytes >= 4)
27203 return gen_rtx_REG (mode, regno);
27204 }
27205
27206 if (inner_bytes >= 8)
27207 return gen_rtx_REG (mode, regno);
27208
27209 r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
27210 const0_rtx);
27211 r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
27212 GEN_INT (inner_bytes));
27213 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
27214 }
27215
27216 /* Target hook for TARGET_FUNCTION_VALUE.
27217
27218 On the SPE, both FPs and vectors are returned in r3.
27219
27220 On RS/6000 an integer value is in r3 and a floating-point value is in
27221 fp1, unless -msoft-float. */
27222
27223 rtx
27224 rs6000_function_value (const_tree valtype,
27225 const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
27226 bool outgoing ATTRIBUTE_UNUSED)
27227 {
27228 enum machine_mode mode;
27229 unsigned int regno;
27230
27231 /* Special handling for structs in darwin64. */
27232 if (TARGET_MACHO
27233 && rs6000_darwin64_struct_check_p (TYPE_MODE (valtype), valtype))
27234 {
27235 CUMULATIVE_ARGS valcum;
27236 rtx valret;
27237
27238 valcum.words = 0;
27239 valcum.fregno = FP_ARG_MIN_REG;
27240 valcum.vregno = ALTIVEC_ARG_MIN_REG;
27241 /* Do a trial code generation as if this were going to be passed as
27242 an argument; if any part goes in memory, we return NULL. */
27243 valret = rs6000_darwin64_record_arg (&valcum, valtype, true, /* retval= */ true);
27244 if (valret)
27245 return valret;
27246 /* Otherwise fall through to standard ABI rules. */
27247 }
27248
27249 if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DImode)
27250 {
27251 /* Long long return value need be split in -mpowerpc64, 32bit ABI. */
27252 return gen_rtx_PARALLEL (DImode,
27253 gen_rtvec (2,
27254 gen_rtx_EXPR_LIST (VOIDmode,
27255 gen_rtx_REG (SImode, GP_ARG_RETURN),
27256 const0_rtx),
27257 gen_rtx_EXPR_LIST (VOIDmode,
27258 gen_rtx_REG (SImode,
27259 GP_ARG_RETURN + 1),
27260 GEN_INT (4))));
27261 }
27262 if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DCmode)
27263 {
27264 return gen_rtx_PARALLEL (DCmode,
27265 gen_rtvec (4,
27266 gen_rtx_EXPR_LIST (VOIDmode,
27267 gen_rtx_REG (SImode, GP_ARG_RETURN),
27268 const0_rtx),
27269 gen_rtx_EXPR_LIST (VOIDmode,
27270 gen_rtx_REG (SImode,
27271 GP_ARG_RETURN + 1),
27272 GEN_INT (4)),
27273 gen_rtx_EXPR_LIST (VOIDmode,
27274 gen_rtx_REG (SImode,
27275 GP_ARG_RETURN + 2),
27276 GEN_INT (8)),
27277 gen_rtx_EXPR_LIST (VOIDmode,
27278 gen_rtx_REG (SImode,
27279 GP_ARG_RETURN + 3),
27280 GEN_INT (12))));
27281 }
27282
27283 mode = TYPE_MODE (valtype);
27284 if ((INTEGRAL_TYPE_P (valtype) && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
27285 || POINTER_TYPE_P (valtype))
27286 mode = TARGET_32BIT ? SImode : DImode;
27287
27288 if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
27289 /* _Decimal128 must use an even/odd register pair. */
27290 regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
27291 else if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS
27292 && ((TARGET_SINGLE_FLOAT && (mode == SFmode)) || TARGET_DOUBLE_FLOAT))
27293 regno = FP_ARG_RETURN;
27294 else if (TREE_CODE (valtype) == COMPLEX_TYPE
27295 && targetm.calls.split_complex_arg)
27296 return rs6000_complex_function_value (mode);
27297 else if (TREE_CODE (valtype) == VECTOR_TYPE
27298 && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
27299 && ALTIVEC_VECTOR_MODE (mode))
27300 regno = ALTIVEC_ARG_RETURN;
27301 else if (TREE_CODE (valtype) == VECTOR_TYPE
27302 && TARGET_VSX && TARGET_ALTIVEC_ABI
27303 && VSX_VECTOR_MODE (mode))
27304 regno = ALTIVEC_ARG_RETURN;
27305 else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
27306 && (mode == DFmode || mode == DCmode
27307 || mode == TFmode || mode == TCmode))
27308 return spe_build_register_parallel (mode, GP_ARG_RETURN);
27309 else
27310 regno = GP_ARG_RETURN;
27311
27312 return gen_rtx_REG (mode, regno);
27313 }
27314
27315 /* Define how to find the value returned by a library function
27316 assuming the value has mode MODE. */
27317 rtx
27318 rs6000_libcall_value (enum machine_mode mode)
27319 {
27320 unsigned int regno;
27321
27322 if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
27323 {
27324 /* Long long return value need be split in -mpowerpc64, 32bit ABI. */
27325 return gen_rtx_PARALLEL (DImode,
27326 gen_rtvec (2,
27327 gen_rtx_EXPR_LIST (VOIDmode,
27328 gen_rtx_REG (SImode, GP_ARG_RETURN),
27329 const0_rtx),
27330 gen_rtx_EXPR_LIST (VOIDmode,
27331 gen_rtx_REG (SImode,
27332 GP_ARG_RETURN + 1),
27333 GEN_INT (4))));
27334 }
27335
27336 if (DECIMAL_FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
27337 /* _Decimal128 must use an even/odd register pair. */
27338 regno = (mode == TDmode) ? FP_ARG_RETURN + 1 : FP_ARG_RETURN;
27339 else if (SCALAR_FLOAT_MODE_P (mode)
27340 && TARGET_HARD_FLOAT && TARGET_FPRS
27341 && ((TARGET_SINGLE_FLOAT && mode == SFmode) || TARGET_DOUBLE_FLOAT))
27342 regno = FP_ARG_RETURN;
27343 else if (ALTIVEC_VECTOR_MODE (mode)
27344 && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
27345 regno = ALTIVEC_ARG_RETURN;
27346 else if (VSX_VECTOR_MODE (mode)
27347 && TARGET_VSX && TARGET_ALTIVEC_ABI)
27348 regno = ALTIVEC_ARG_RETURN;
27349 else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
27350 return rs6000_complex_function_value (mode);
27351 else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
27352 && (mode == DFmode || mode == DCmode
27353 || mode == TFmode || mode == TCmode))
27354 return spe_build_register_parallel (mode, GP_ARG_RETURN);
27355 else
27356 regno = GP_ARG_RETURN;
27357
27358 return gen_rtx_REG (mode, regno);
27359 }
27360
27361
27362 /* Given FROM and TO register numbers, say whether this elimination is allowed.
27363 Frame pointer elimination is automatically handled.
27364
27365 For the RS/6000, if frame pointer elimination is being done, we would like
27366 to convert ap into fp, not sp.
27367
27368 We need r30 if -mminimal-toc was specified, and there are constant pool
27369 references. */
27370
27371 bool
27372 rs6000_can_eliminate (const int from, const int to)
27373 {
27374 return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
27375 ? ! frame_pointer_needed
27376 : from == RS6000_PIC_OFFSET_TABLE_REGNUM
27377 ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC || get_pool_size () == 0
27378 : true);
27379 }
27380
27381 /* Define the offset between two registers, FROM to be eliminated and its
27382 replacement TO, at the start of a routine. */
27383 HOST_WIDE_INT
27384 rs6000_initial_elimination_offset (int from, int to)
27385 {
27386 rs6000_stack_t *info = rs6000_stack_info ();
27387 HOST_WIDE_INT offset;
27388
27389 if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
27390 offset = info->push_p ? 0 : -info->total_size;
27391 else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
27392 {
27393 offset = info->push_p ? 0 : -info->total_size;
27394 if (FRAME_GROWS_DOWNWARD)
27395 offset += info->fixed_size + info->vars_size + info->parm_size;
27396 }
27397 else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
27398 offset = FRAME_GROWS_DOWNWARD
27399 ? info->fixed_size + info->vars_size + info->parm_size
27400 : 0;
27401 else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
27402 offset = info->total_size;
27403 else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
27404 offset = info->push_p ? info->total_size : 0;
27405 else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
27406 offset = 0;
27407 else
27408 gcc_unreachable ();
27409
27410 return offset;
27411 }
27412
27413 static rtx
27414 rs6000_dwarf_register_span (rtx reg)
27415 {
27416 rtx parts[8];
27417 int i, words;
27418 unsigned regno = REGNO (reg);
27419 enum machine_mode mode = GET_MODE (reg);
27420
27421 if (TARGET_SPE
27422 && regno < 32
27423 && (SPE_VECTOR_MODE (GET_MODE (reg))
27424 || (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode)
27425 && mode != SFmode && mode != SDmode && mode != SCmode)))
27426 ;
27427 else
27428 return NULL_RTX;
27429
27430 regno = REGNO (reg);
27431
27432 /* The duality of the SPE register size wreaks all kinds of havoc.
27433 This is a way of distinguishing r0 in 32-bits from r0 in
27434 64-bits. */
27435 words = (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
27436 gcc_assert (words <= 4);
27437 for (i = 0; i < words; i++, regno++)
27438 {
27439 if (BYTES_BIG_ENDIAN)
27440 {
27441 parts[2 * i] = gen_rtx_REG (SImode, regno + 1200);
27442 parts[2 * i + 1] = gen_rtx_REG (SImode, regno);
27443 }
27444 else
27445 {
27446 parts[2 * i] = gen_rtx_REG (SImode, regno);
27447 parts[2 * i + 1] = gen_rtx_REG (SImode, regno + 1200);
27448 }
27449 }
27450
27451 return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (words * 2, parts));
27452 }
27453
27454 /* Fill in sizes for SPE register high parts in table used by unwinder. */
27455
27456 static void
27457 rs6000_init_dwarf_reg_sizes_extra (tree address)
27458 {
27459 if (TARGET_SPE)
27460 {
27461 int i;
27462 enum machine_mode mode = TYPE_MODE (char_type_node);
27463 rtx addr = expand_expr (address, NULL_RTX, VOIDmode, EXPAND_NORMAL);
27464 rtx mem = gen_rtx_MEM (BLKmode, addr);
27465 rtx value = gen_int_mode (4, mode);
27466
27467 for (i = 1201; i < 1232; i++)
27468 {
27469 int column = DWARF_REG_TO_UNWIND_COLUMN (i);
27470 HOST_WIDE_INT offset
27471 = DWARF_FRAME_REGNUM (column) * GET_MODE_SIZE (mode);
27472
27473 emit_move_insn (adjust_address (mem, mode, offset), value);
27474 }
27475 }
27476 }
27477
27478 /* Map internal gcc register numbers to DWARF2 register numbers. */
27479
27480 unsigned int
27481 rs6000_dbx_register_number (unsigned int regno)
27482 {
27483 if (regno <= 63 || write_symbols != DWARF2_DEBUG)
27484 return regno;
27485 if (regno == MQ_REGNO)
27486 return 100;
27487 if (regno == LR_REGNO)
27488 return 108;
27489 if (regno == CTR_REGNO)
27490 return 109;
27491 if (CR_REGNO_P (regno))
27492 return regno - CR0_REGNO + 86;
27493 if (regno == CA_REGNO)
27494 return 101; /* XER */
27495 if (ALTIVEC_REGNO_P (regno))
27496 return regno - FIRST_ALTIVEC_REGNO + 1124;
27497 if (regno == VRSAVE_REGNO)
27498 return 356;
27499 if (regno == VSCR_REGNO)
27500 return 67;
27501 if (regno == SPE_ACC_REGNO)
27502 return 99;
27503 if (regno == SPEFSCR_REGNO)
27504 return 612;
27505 /* SPE high reg number. We get these values of regno from
27506 rs6000_dwarf_register_span. */
27507 gcc_assert (regno >= 1200 && regno < 1232);
27508 return regno;
27509 }
27510
27511 /* target hook eh_return_filter_mode */
27512 static enum machine_mode
27513 rs6000_eh_return_filter_mode (void)
27514 {
27515 return TARGET_32BIT ? SImode : word_mode;
27516 }
27517
27518 /* Target hook for scalar_mode_supported_p. */
27519 static bool
27520 rs6000_scalar_mode_supported_p (enum machine_mode mode)
27521 {
27522 if (DECIMAL_FLOAT_MODE_P (mode))
27523 return default_decimal_float_supported_p ();
27524 else
27525 return default_scalar_mode_supported_p (mode);
27526 }
27527
27528 /* Target hook for vector_mode_supported_p. */
27529 static bool
27530 rs6000_vector_mode_supported_p (enum machine_mode mode)
27531 {
27532
27533 if (TARGET_PAIRED_FLOAT && PAIRED_VECTOR_MODE (mode))
27534 return true;
27535
27536 if (TARGET_SPE && SPE_VECTOR_MODE (mode))
27537 return true;
27538
27539 else if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode))
27540 return true;
27541
27542 else
27543 return false;
27544 }
27545
27546 /* Target hook for invalid_arg_for_unprototyped_fn. */
27547 static const char *
27548 invalid_arg_for_unprototyped_fn (const_tree typelist, const_tree funcdecl, const_tree val)
27549 {
27550 return (!rs6000_darwin64_abi
27551 && typelist == 0
27552 && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
27553 && (funcdecl == NULL_TREE
27554 || (TREE_CODE (funcdecl) == FUNCTION_DECL
27555 && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
27556 ? N_("AltiVec argument passed to unprototyped function")
27557 : NULL;
27558 }
27559
27560 /* For TARGET_SECURE_PLT 32-bit PIC code we can save PIC register
27561 setup by using __stack_chk_fail_local hidden function instead of
27562 calling __stack_chk_fail directly. Otherwise it is better to call
27563 __stack_chk_fail directly. */
27564
27565 static tree
27566 rs6000_stack_protect_fail (void)
27567 {
27568 return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
27569 ? default_hidden_stack_protect_fail ()
27570 : default_external_stack_protect_fail ();
27571 }
27572
27573 void
27574 rs6000_final_prescan_insn (rtx insn, rtx *operand ATTRIBUTE_UNUSED,
27575 int num_operands ATTRIBUTE_UNUSED)
27576 {
27577 if (rs6000_warn_cell_microcode)
27578 {
27579 const char *temp;
27580 int insn_code_number = recog_memoized (insn);
27581 location_t location = locator_location (INSN_LOCATOR (insn));
27582
27583 /* Punt on insns we cannot recognize. */
27584 if (insn_code_number < 0)
27585 return;
27586
27587 temp = get_insn_template (insn_code_number, insn);
27588
27589 if (get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS)
27590 warning_at (location, OPT_mwarn_cell_microcode,
27591 "emitting microcode insn %s\t[%s] #%d",
27592 temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn));
27593 else if (get_attr_cell_micro (insn) == CELL_MICRO_CONDITIONAL)
27594 warning_at (location, OPT_mwarn_cell_microcode,
27595 "emitting conditional microcode insn %s\t[%s] #%d",
27596 temp, insn_data[INSN_CODE (insn)].name, INSN_UID (insn));
27597 }
27598 }
27599
27600 \f
27601 /* Mask options that we want to support inside of attribute((target)) and
27602 #pragma GCC target operations. Note, we do not include things like
27603 64/32-bit, endianess, hard/soft floating point, etc. that would have
27604 different calling sequences. */
27605
27606 struct rs6000_opt_mask {
27607 const char *name; /* option name */
27608 int mask; /* mask to set */
27609 bool invert; /* invert sense of mask */
27610 bool valid_target; /* option is a target option */
27611 };
27612
27613 static struct rs6000_opt_mask const rs6000_opt_masks[] =
27614 {
27615 { "altivec", MASK_ALTIVEC, false, true },
27616 { "cmpb", MASK_CMPB, false, true },
27617 { "dlmzb", MASK_DLMZB, false, true },
27618 { "fprnd", MASK_FPRND, false, true },
27619 { "hard-dfp", MASK_DFP, false, true },
27620 { "isel", MASK_ISEL, false, true },
27621 { "mfcrf", MASK_MFCRF, false, true },
27622 { "mfpgpr", MASK_MFPGPR, false, true },
27623 { "mulhw", MASK_MULHW, false, true },
27624 { "multiple", MASK_MULTIPLE, false, true },
27625 { "update", MASK_NO_UPDATE, true , true },
27626 { "popcntb", MASK_POPCNTB, false, true },
27627 { "popcntd", MASK_POPCNTD, false, true },
27628 { "powerpc-gfxopt", MASK_PPC_GFXOPT, false, true },
27629 { "powerpc-gpopt", MASK_PPC_GPOPT, false, true },
27630 { "recip-precision", MASK_RECIP_PRECISION, false, true },
27631 { "string", MASK_STRING, false, true },
27632 { "vsx", MASK_VSX, false, true },
27633 #ifdef MASK_64BIT
27634 #if TARGET_AIX_OS
27635 { "aix64", MASK_64BIT, false, false },
27636 { "aix32", MASK_64BIT, true, false },
27637 #else
27638 { "64", MASK_64BIT, false, false },
27639 { "32", MASK_64BIT, true, false },
27640 #endif
27641 #endif
27642 #ifdef MASK_EABI
27643 { "eabi", MASK_EABI, false, false },
27644 #endif
27645 #ifdef MASK_LITTLE_ENDIAN
27646 { "little", MASK_LITTLE_ENDIAN, false, false },
27647 { "big", MASK_LITTLE_ENDIAN, true, false },
27648 #endif
27649 #ifdef MASK_RELOCATABLE
27650 { "relocatable", MASK_RELOCATABLE, false, false },
27651 #endif
27652 #ifdef MASK_STRICT_ALIGN
27653 { "strict-align", MASK_STRICT_ALIGN, false, false },
27654 #endif
27655 { "power", MASK_POWER, false, false },
27656 { "power2", MASK_POWER2, false, false },
27657 { "powerpc", MASK_POWERPC, false, false },
27658 { "soft-float", MASK_SOFT_FLOAT, false, false },
27659 { "string", MASK_STRING, false, false },
27660 };
27661
27662 /* Option variables that we want to support inside attribute((target)) and
27663 #pragma GCC target operations. */
27664
27665 struct rs6000_opt_var {
27666 const char *name; /* option name */
27667 size_t global_offset; /* offset of the option in global_options. */
27668 size_t target_offset; /* offset of the option in target optiosn. */
27669 };
27670
27671 static struct rs6000_opt_var const rs6000_opt_vars[] =
27672 {
27673 { "friz",
27674 offsetof (struct gcc_options, x_TARGET_FRIZ),
27675 offsetof (struct cl_target_option, x_TARGET_FRIZ), },
27676 { "avoid-indexed-addresses",
27677 offsetof (struct gcc_options, x_TARGET_AVOID_XFORM),
27678 offsetof (struct cl_target_option, x_TARGET_AVOID_XFORM) },
27679 { "paired",
27680 offsetof (struct gcc_options, x_rs6000_paired_float),
27681 offsetof (struct cl_target_option, x_rs6000_paired_float), },
27682 { "longcall",
27683 offsetof (struct gcc_options, x_rs6000_default_long_calls),
27684 offsetof (struct cl_target_option, x_rs6000_default_long_calls), },
27685 };
27686
27687 /* Inner function to handle attribute((target("..."))) and #pragma GCC target
27688 parsing. Return true if there were no errors. */
27689
27690 static bool
27691 rs6000_inner_target_options (tree args, bool attr_p)
27692 {
27693 bool ret = true;
27694
27695 if (args == NULL_TREE)
27696 ;
27697
27698 else if (TREE_CODE (args) == STRING_CST)
27699 {
27700 char *p = ASTRDUP (TREE_STRING_POINTER (args));
27701 char *q;
27702
27703 while ((q = strtok (p, ",")) != NULL)
27704 {
27705 bool error_p = false;
27706 bool not_valid_p = false;
27707 const char *cpu_opt = NULL;
27708
27709 p = NULL;
27710 if (strncmp (q, "cpu=", 4) == 0)
27711 {
27712 int cpu_index = rs6000_cpu_name_lookup (q+4);
27713 if (cpu_index >= 0)
27714 rs6000_cpu_index = cpu_index;
27715 else
27716 {
27717 error_p = true;
27718 cpu_opt = q+4;
27719 }
27720 }
27721 else if (strncmp (q, "tune=", 5) == 0)
27722 {
27723 int tune_index = rs6000_cpu_name_lookup (q+5);
27724 if (tune_index >= 0)
27725 rs6000_tune_index = tune_index;
27726 else
27727 {
27728 error_p = true;
27729 cpu_opt = q+5;
27730 }
27731 }
27732 else
27733 {
27734 size_t i;
27735 bool invert = false;
27736 char *r = q;
27737
27738 error_p = true;
27739 if (strncmp (r, "no-", 3) == 0)
27740 {
27741 invert = true;
27742 r += 3;
27743 }
27744
27745 for (i = 0; i < ARRAY_SIZE (rs6000_opt_masks); i++)
27746 if (strcmp (r, rs6000_opt_masks[i].name) == 0)
27747 {
27748 int mask = rs6000_opt_masks[i].mask;
27749
27750 if (!rs6000_opt_masks[i].valid_target)
27751 not_valid_p = true;
27752 else
27753 {
27754 error_p = false;
27755 target_flags_explicit |= mask;
27756
27757 if (rs6000_opt_masks[i].invert)
27758 invert = !invert;
27759
27760 if (invert)
27761 target_flags &= ~mask;
27762 else
27763 target_flags |= mask;
27764 }
27765 break;
27766 }
27767
27768 if (error_p && !not_valid_p)
27769 {
27770 for (i = 0; i < ARRAY_SIZE (rs6000_opt_vars); i++)
27771 if (strcmp (r, rs6000_opt_vars[i].name) == 0)
27772 {
27773 size_t j = rs6000_opt_vars[i].global_offset;
27774 ((int *) &global_options)[j] = !invert;
27775 error_p = false;
27776 break;
27777 }
27778 }
27779 }
27780
27781 if (error_p)
27782 {
27783 const char *eprefix, *esuffix;
27784
27785 ret = false;
27786 if (attr_p)
27787 {
27788 eprefix = "__attribute__((__target__(";
27789 esuffix = ")))";
27790 }
27791 else
27792 {
27793 eprefix = "#pragma GCC target ";
27794 esuffix = "";
27795 }
27796
27797 if (cpu_opt)
27798 error ("invalid cpu \"%s\" for %s\"%s\"%s", cpu_opt, eprefix,
27799 q, esuffix);
27800 else if (not_valid_p)
27801 error ("%s\"%s\"%s is not allowed", eprefix, q, esuffix);
27802 else
27803 error ("%s\"%s\"%s is invalid", eprefix, q, esuffix);
27804 }
27805 }
27806 }
27807
27808 else if (TREE_CODE (args) == TREE_LIST)
27809 {
27810 do
27811 {
27812 tree value = TREE_VALUE (args);
27813 if (value)
27814 {
27815 bool ret2 = rs6000_inner_target_options (value, attr_p);
27816 if (!ret2)
27817 ret = false;
27818 }
27819 args = TREE_CHAIN (args);
27820 }
27821 while (args != NULL_TREE);
27822 }
27823
27824 else
27825 gcc_unreachable ();
27826
27827 return ret;
27828 }
27829
27830 /* Print out the target options as a list for -mdebug=target. */
27831
27832 static void
27833 rs6000_debug_target_options (tree args, const char *prefix)
27834 {
27835 if (args == NULL_TREE)
27836 fprintf (stderr, "%s<NULL>", prefix);
27837
27838 else if (TREE_CODE (args) == STRING_CST)
27839 {
27840 char *p = ASTRDUP (TREE_STRING_POINTER (args));
27841 char *q;
27842
27843 while ((q = strtok (p, ",")) != NULL)
27844 {
27845 p = NULL;
27846 fprintf (stderr, "%s\"%s\"", prefix, q);
27847 prefix = ", ";
27848 }
27849 }
27850
27851 else if (TREE_CODE (args) == TREE_LIST)
27852 {
27853 do
27854 {
27855 tree value = TREE_VALUE (args);
27856 if (value)
27857 {
27858 rs6000_debug_target_options (value, prefix);
27859 prefix = ", ";
27860 }
27861 args = TREE_CHAIN (args);
27862 }
27863 while (args != NULL_TREE);
27864 }
27865
27866 else
27867 gcc_unreachable ();
27868
27869 return;
27870 }
27871
27872 \f
27873 /* Hook to validate attribute((target("..."))). */
27874
27875 static bool
27876 rs6000_valid_attribute_p (tree fndecl,
27877 tree ARG_UNUSED (name),
27878 tree args,
27879 int flags)
27880 {
27881 struct cl_target_option cur_target;
27882 bool ret;
27883 tree old_optimize = build_optimization_node ();
27884 tree new_target, new_optimize;
27885 tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
27886
27887 gcc_assert ((fndecl != NULL_TREE) && (args != NULL_TREE));
27888
27889 if (TARGET_DEBUG_TARGET)
27890 {
27891 tree tname = DECL_NAME (fndecl);
27892 fprintf (stderr, "\n==================== rs6000_valid_attribute_p:\n");
27893 if (tname)
27894 fprintf (stderr, "function: %.*s\n",
27895 (int) IDENTIFIER_LENGTH (tname),
27896 IDENTIFIER_POINTER (tname));
27897 else
27898 fprintf (stderr, "function: unknown\n");
27899
27900 fprintf (stderr, "args:");
27901 rs6000_debug_target_options (args, " ");
27902 fprintf (stderr, "\n");
27903
27904 if (flags)
27905 fprintf (stderr, "flags: 0x%x\n", flags);
27906
27907 fprintf (stderr, "--------------------\n");
27908 }
27909
27910 old_optimize = build_optimization_node ();
27911 func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
27912
27913 /* If the function changed the optimization levels as well as setting target
27914 options, start with the optimizations specified. */
27915 if (func_optimize && func_optimize != old_optimize)
27916 cl_optimization_restore (&global_options,
27917 TREE_OPTIMIZATION (func_optimize));
27918
27919 /* The target attributes may also change some optimization flags, so update
27920 the optimization options if necessary. */
27921 cl_target_option_save (&cur_target, &global_options);
27922 rs6000_cpu_index = rs6000_tune_index = -1;
27923 ret = rs6000_inner_target_options (args, true);
27924
27925 /* Set up any additional state. */
27926 if (ret)
27927 {
27928 ret = rs6000_option_override_internal (false);
27929 new_target = build_target_option_node ();
27930 }
27931 else
27932 new_target = NULL;
27933
27934 new_optimize = build_optimization_node ();
27935
27936 if (!new_target)
27937 ret = false;
27938
27939 else if (fndecl)
27940 {
27941 DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
27942
27943 if (old_optimize != new_optimize)
27944 DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
27945 }
27946
27947 cl_target_option_restore (&global_options, &cur_target);
27948
27949 if (old_optimize != new_optimize)
27950 cl_optimization_restore (&global_options,
27951 TREE_OPTIMIZATION (old_optimize));
27952
27953 return ret;
27954 }
27955
27956 \f
27957 /* Hook to validate the current #pragma GCC target and set the state, and
27958 update the macros based on what was changed. If ARGS is NULL, then
27959 POP_TARGET is used to reset the options. */
27960
27961 bool
27962 rs6000_pragma_target_parse (tree args, tree pop_target)
27963 {
27964 tree cur_tree;
27965 bool ret;
27966
27967 if (TARGET_DEBUG_TARGET)
27968 {
27969 fprintf (stderr, "\n==================== rs6000_pragma_target_parse\n");
27970 fprintf (stderr, "args:");
27971 rs6000_debug_target_options (args, " ");
27972 fprintf (stderr, "\n");
27973
27974 if (pop_target)
27975 {
27976 fprintf (stderr, "pop_target:\n");
27977 debug_tree (pop_target);
27978 }
27979 else
27980 fprintf (stderr, "pop_target: <NULL>\n");
27981
27982 fprintf (stderr, "--------------------\n");
27983 }
27984
27985 if (! args)
27986 {
27987 ret = true;
27988 cur_tree = ((pop_target)
27989 ? pop_target
27990 : target_option_default_node);
27991 cl_target_option_restore (&global_options,
27992 TREE_TARGET_OPTION (cur_tree));
27993 }
27994 else
27995 {
27996 rs6000_cpu_index = rs6000_tune_index = -1;
27997 ret = rs6000_inner_target_options (args, false);
27998 cur_tree = build_target_option_node ();
27999
28000 if (!cur_tree)
28001 ret = false;
28002 }
28003
28004 if (cur_tree)
28005 target_option_current_node = cur_tree;
28006
28007 return ret;
28008 }
28009
28010 \f
28011 /* Remember the last target of rs6000_set_current_function. */
28012 static GTY(()) tree rs6000_previous_fndecl;
28013
28014 /* Establish appropriate back-end context for processing the function
28015 FNDECL. The argument might be NULL to indicate processing at top
28016 level, outside of any function scope. */
28017 static void
28018 rs6000_set_current_function (tree fndecl)
28019 {
28020 tree old_tree = (rs6000_previous_fndecl
28021 ? DECL_FUNCTION_SPECIFIC_TARGET (rs6000_previous_fndecl)
28022 : NULL_TREE);
28023
28024 tree new_tree = (fndecl
28025 ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
28026 : NULL_TREE);
28027
28028 if (TARGET_DEBUG_TARGET)
28029 {
28030 bool print_final = false;
28031 fprintf (stderr, "\n==================== rs6000_set_current_function");
28032
28033 if (fndecl)
28034 fprintf (stderr, ", fndecl %s (%p)",
28035 (DECL_NAME (fndecl)
28036 ? IDENTIFIER_POINTER (DECL_NAME (fndecl))
28037 : "<unknown>"), (void *)fndecl);
28038
28039 if (rs6000_previous_fndecl)
28040 fprintf (stderr, ", prev_fndecl (%p)", (void *)rs6000_previous_fndecl);
28041
28042 fprintf (stderr, "\n");
28043 if (new_tree)
28044 {
28045 fprintf (stderr, "\nnew fndecl target specific options:\n");
28046 debug_tree (new_tree);
28047 print_final = true;
28048 }
28049
28050 if (old_tree)
28051 {
28052 fprintf (stderr, "\nold fndecl target specific options:\n");
28053 debug_tree (old_tree);
28054 print_final = true;
28055 }
28056
28057 if (print_final)
28058 fprintf (stderr, "--------------------\n");
28059 }
28060
28061 /* Only change the context if the function changes. This hook is called
28062 several times in the course of compiling a function, and we don't want to
28063 slow things down too much or call target_reinit when it isn't safe. */
28064 if (fndecl && fndecl != rs6000_previous_fndecl)
28065 {
28066 rs6000_previous_fndecl = fndecl;
28067 if (old_tree == new_tree)
28068 ;
28069
28070 else if (new_tree)
28071 {
28072 cl_target_option_restore (&global_options,
28073 TREE_TARGET_OPTION (new_tree));
28074 target_reinit ();
28075 }
28076
28077 else if (old_tree)
28078 {
28079 struct cl_target_option *def
28080 = TREE_TARGET_OPTION (target_option_current_node);
28081
28082 cl_target_option_restore (&global_options, def);
28083 target_reinit ();
28084 }
28085 }
28086 }
28087
28088 \f
28089 /* Save the current options */
28090
28091 static void
28092 rs6000_function_specific_save (struct cl_target_option *ptr)
28093 {
28094 ptr->rs6000_target_flags_explicit = target_flags_explicit;
28095 }
28096
28097 /* Restore the current options */
28098
28099 static void
28100 rs6000_function_specific_restore (struct cl_target_option *ptr)
28101 {
28102 target_flags_explicit = ptr->rs6000_target_flags_explicit;
28103 (void) rs6000_option_override_internal (false);
28104 }
28105
28106 /* Print the current options */
28107
28108 static void
28109 rs6000_function_specific_print (FILE *file, int indent,
28110 struct cl_target_option *ptr)
28111 {
28112 size_t i;
28113 int flags = ptr->x_target_flags;
28114
28115 /* Print the various mask options. */
28116 for (i = 0; i < ARRAY_SIZE (rs6000_opt_masks); i++)
28117 if ((flags & rs6000_opt_masks[i].mask) != 0)
28118 {
28119 flags &= ~ rs6000_opt_masks[i].mask;
28120 fprintf (file, "%*s-m%s%s\n", indent, "",
28121 rs6000_opt_masks[i].invert ? "no-" : "",
28122 rs6000_opt_masks[i].name);
28123 }
28124
28125 /* Print the various options that are variables. */
28126 for (i = 0; i < ARRAY_SIZE (rs6000_opt_vars); i++)
28127 {
28128 size_t j = rs6000_opt_vars[i].target_offset;
28129 if (((signed char *) ptr)[j])
28130 fprintf (file, "%*s-m%s\n", indent, "",
28131 rs6000_opt_vars[i].name);
28132 }
28133 }
28134
28135 \f
28136 /* Hook to determine if one function can safely inline another. */
28137
28138 static bool
28139 rs6000_can_inline_p (tree caller, tree callee)
28140 {
28141 bool ret = false;
28142 tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
28143 tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
28144
28145 /* If callee has no option attributes, then it is ok to inline. */
28146 if (!callee_tree)
28147 ret = true;
28148
28149 /* If caller has no option attributes, but callee does then it is not ok to
28150 inline. */
28151 else if (!caller_tree)
28152 ret = false;
28153
28154 else
28155 {
28156 struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
28157 struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
28158
28159 /* Callee's options should a subset of the caller's, i.e. a vsx function
28160 can inline an altivec function but a non-vsx function can't inline a
28161 vsx function. */
28162 if ((caller_opts->x_target_flags & callee_opts->x_target_flags)
28163 == callee_opts->x_target_flags)
28164 ret = true;
28165 }
28166
28167 if (TARGET_DEBUG_TARGET)
28168 fprintf (stderr, "rs6000_can_inline_p:, caller %s, callee %s, %s inline\n",
28169 (DECL_NAME (caller)
28170 ? IDENTIFIER_POINTER (DECL_NAME (caller))
28171 : "<unknown>"),
28172 (DECL_NAME (callee)
28173 ? IDENTIFIER_POINTER (DECL_NAME (callee))
28174 : "<unknown>"),
28175 (ret ? "can" : "cannot"));
28176
28177 return ret;
28178 }
28179 \f
28180 /* Allocate a stack temp and fixup the address so it meets the particular
28181 memory requirements (either offetable or REG+REG addressing). */
28182
28183 rtx
28184 rs6000_allocate_stack_temp (enum machine_mode mode,
28185 bool offsettable_p,
28186 bool reg_reg_p)
28187 {
28188 rtx stack = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
28189 rtx addr = XEXP (stack, 0);
28190 int strict_p = (reload_in_progress || reload_completed);
28191
28192 if (!legitimate_indirect_address_p (addr, strict_p))
28193 {
28194 if (offsettable_p
28195 && !rs6000_legitimate_offset_address_p (mode, addr, strict_p))
28196 stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
28197
28198 else if (reg_reg_p && !legitimate_indexed_address_p (addr, strict_p))
28199 stack = replace_equiv_address (stack, copy_addr_to_reg (addr));
28200 }
28201
28202 return stack;
28203 }
28204
28205 /* Given a memory reference, if it is not a reg or reg+reg addressing, convert
28206 to such a form to deal with memory reference instructions like STFIWX that
28207 only take reg+reg addressing. */
28208
28209 rtx
28210 rs6000_address_for_fpconvert (rtx x)
28211 {
28212 int strict_p = (reload_in_progress || reload_completed);
28213 rtx addr;
28214
28215 gcc_assert (MEM_P (x));
28216 addr = XEXP (x, 0);
28217 if (! legitimate_indirect_address_p (addr, strict_p)
28218 && ! legitimate_indexed_address_p (addr, strict_p))
28219 {
28220 if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
28221 {
28222 rtx reg = XEXP (addr, 0);
28223 HOST_WIDE_INT size = GET_MODE_SIZE (GET_MODE (x));
28224 rtx size_rtx = GEN_INT ((GET_CODE (addr) == PRE_DEC) ? -size : size);
28225 gcc_assert (REG_P (reg));
28226 emit_insn (gen_add3_insn (reg, reg, size_rtx));
28227 addr = reg;
28228 }
28229 else if (GET_CODE (addr) == PRE_MODIFY)
28230 {
28231 rtx reg = XEXP (addr, 0);
28232 rtx expr = XEXP (addr, 1);
28233 gcc_assert (REG_P (reg));
28234 gcc_assert (GET_CODE (expr) == PLUS);
28235 emit_insn (gen_add3_insn (reg, XEXP (expr, 0), XEXP (expr, 1)));
28236 addr = reg;
28237 }
28238
28239 x = replace_equiv_address (x, copy_addr_to_reg (addr));
28240 }
28241
28242 return x;
28243 }
28244
28245 /* Given a memory reference, if it is not in the form for altivec memory
28246 reference instructions (i.e. reg or reg+reg addressing with AND of -16),
28247 convert to the altivec format. */
28248
28249 rtx
28250 rs6000_address_for_altivec (rtx x)
28251 {
28252 gcc_assert (MEM_P (x));
28253 if (!altivec_indexed_or_indirect_operand (x, GET_MODE (x)))
28254 {
28255 rtx addr = XEXP (x, 0);
28256 int strict_p = (reload_in_progress || reload_completed);
28257
28258 if (!legitimate_indexed_address_p (addr, strict_p)
28259 && !legitimate_indirect_address_p (addr, strict_p))
28260 addr = copy_to_mode_reg (Pmode, addr);
28261
28262 addr = gen_rtx_AND (Pmode, addr, GEN_INT (-16));
28263 x = change_address (x, GET_MODE (x), addr);
28264 }
28265
28266 return x;
28267 }
28268
28269
28270 #include "gt-rs6000.h"