]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/rs6000/rs6000.c
i386.c (legitimate_pic_address_disp_p): Refuse GOTOFF in 64bit mode.
[thirdparty/gcc.git] / gcc / config / rs6000 / rs6000.c
CommitLineData
9878760c 1/* Subroutines used for code generation on IBM RS/6000.
f676971a 2 Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
5b86a469 3 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
fab3bcc3 4 Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
9878760c 5
5de601cf 6 This file is part of GCC.
9878760c 7
5de601cf
NC
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published
10 by the Free Software Foundation; either version 2, or (at your
11 option) any later version.
9878760c 12
5de601cf
NC
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
9878760c 17
5de601cf
NC
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the
39d14dda
KC
20 Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
21 MA 02110-1301, USA. */
9878760c 22
956d6950 23#include "config.h"
c4d38ccb 24#include "system.h"
4977bab6
ZW
25#include "coretypes.h"
26#include "tm.h"
9878760c
RK
27#include "rtl.h"
28#include "regs.h"
29#include "hard-reg-set.h"
30#include "real.h"
31#include "insn-config.h"
32#include "conditions.h"
9878760c
RK
33#include "insn-attr.h"
34#include "flags.h"
35#include "recog.h"
9878760c 36#include "obstack.h"
9b30bae2 37#include "tree.h"
dfafc897 38#include "expr.h"
2fc1c679 39#include "optabs.h"
2a430ec1 40#include "except.h"
a7df97e6 41#include "function.h"
296b8152 42#include "output.h"
d5fa86ba 43#include "basic-block.h"
d0101753 44#include "integrate.h"
296b8152 45#include "toplev.h"
c8023011 46#include "ggc.h"
9ebbca7d
GK
47#include "hashtab.h"
48#include "tm_p.h"
672a6f42
NB
49#include "target.h"
50#include "target-def.h"
3ac88239 51#include "langhooks.h"
24ea750e 52#include "reload.h"
117dca74 53#include "cfglayout.h"
79ae11c4 54#include "sched-int.h"
cd3ce9b4 55#include "tree-gimple.h"
4d3e6fae 56#include "intl.h"
1bc7c5b6
ZW
57#if TARGET_XCOFF
58#include "xcoffout.h" /* get declarations of xcoff_*_section_name */
59#endif
93a27b7b
ZW
60#if TARGET_MACHO
61#include "gstab.h" /* for N_SLINE */
62#endif
9b30bae2 63
7509c759
MM
64#ifndef TARGET_NO_PROTOTYPE
65#define TARGET_NO_PROTOTYPE 0
66#endif
67
9878760c
RK
68#define min(A,B) ((A) < (B) ? (A) : (B))
69#define max(A,B) ((A) > (B) ? (A) : (B))
70
d1d0c603
JJ
71/* Structure used to define the rs6000 stack */
72typedef struct rs6000_stack {
73 int first_gp_reg_save; /* first callee saved GP register used */
74 int first_fp_reg_save; /* first callee saved FP register used */
75 int first_altivec_reg_save; /* first callee saved AltiVec register used */
76 int lr_save_p; /* true if the link reg needs to be saved */
77 int cr_save_p; /* true if the CR reg needs to be saved */
78 unsigned int vrsave_mask; /* mask of vec registers to save */
79 int toc_save_p; /* true if the TOC needs to be saved */
80 int push_p; /* true if we need to allocate stack space */
81 int calls_p; /* true if the function makes any calls */
c4ad648e 82 int world_save_p; /* true if we're saving *everything*:
d62294f5 83 r13-r31, cr, f14-f31, vrsave, v20-v31 */
d1d0c603
JJ
84 enum rs6000_abi abi; /* which ABI to use */
85 int gp_save_offset; /* offset to save GP regs from initial SP */
86 int fp_save_offset; /* offset to save FP regs from initial SP */
87 int altivec_save_offset; /* offset to save AltiVec regs from initial SP */
88 int lr_save_offset; /* offset to save LR from initial SP */
89 int cr_save_offset; /* offset to save CR from initial SP */
90 int vrsave_save_offset; /* offset to save VRSAVE from initial SP */
91 int spe_gp_save_offset; /* offset to save spe 64-bit gprs */
92 int toc_save_offset; /* offset to save the TOC pointer */
93 int varargs_save_offset; /* offset to save the varargs registers */
94 int ehrd_offset; /* offset to EH return data */
95 int reg_size; /* register size (4 or 8) */
d1d0c603
JJ
96 HOST_WIDE_INT vars_size; /* variable save area size */
97 int parm_size; /* outgoing parameter size */
98 int save_size; /* save area size */
99 int fixed_size; /* fixed size of stack frame */
100 int gp_size; /* size of saved GP registers */
101 int fp_size; /* size of saved FP registers */
102 int altivec_size; /* size of saved AltiVec registers */
103 int cr_size; /* size to hold CR if not in save_size */
104 int lr_size; /* size to hold LR if not in save_size */
105 int vrsave_size; /* size to hold VRSAVE if not in save_size */
106 int altivec_padding_size; /* size of altivec alignment padding if
107 not in save_size */
108 int spe_gp_size; /* size of 64-bit GPR save size for SPE */
109 int spe_padding_size;
110 int toc_size; /* size to hold TOC if not in save_size */
111 HOST_WIDE_INT total_size; /* total bytes allocated for stack */
112 int spe_64bit_regs_used;
113} rs6000_stack_t;
114
5b667039
JJ
115/* A C structure for machine-specific, per-function data.
116 This is added to the cfun structure. */
117typedef struct machine_function GTY(())
118{
119 /* Flags if __builtin_return_address (n) with n >= 1 was used. */
120 int ra_needs_full_frame;
121 /* Some local-dynamic symbol. */
122 const char *some_ld_name;
123 /* Whether the instruction chain has been scanned already. */
124 int insn_chain_scanned_p;
125 /* Flags if __builtin_return_address (0) was used. */
126 int ra_need_lr;
127 /* Offset from virtual_stack_vars_rtx to the start of the ABI_V4
128 varargs save area. */
129 HOST_WIDE_INT varargs_save_offset;
130} machine_function;
131
5248c961
RK
132/* Target cpu type */
133
134enum processor_type rs6000_cpu;
8e3f41e7
MM
135struct rs6000_cpu_select rs6000_select[3] =
136{
815cdc52
MM
137 /* switch name, tune arch */
138 { (const char *)0, "--with-cpu=", 1, 1 },
139 { (const char *)0, "-mcpu=", 1, 1 },
140 { (const char *)0, "-mtune=", 1, 0 },
8e3f41e7 141};
5248c961 142
ec507f2d
DE
143/* Always emit branch hint bits. */
144static GTY(()) bool rs6000_always_hint;
145
146/* Schedule instructions for group formation. */
147static GTY(()) bool rs6000_sched_groups;
148
569fa502
DN
149/* Support for -msched-costly-dep option. */
150const char *rs6000_sched_costly_dep_str;
151enum rs6000_dependence_cost rs6000_sched_costly_dep;
152
cbe26ab8
DN
153/* Support for -minsert-sched-nops option. */
154const char *rs6000_sched_insert_nops_str;
155enum rs6000_nop_insertion rs6000_sched_insert_nops;
156
7ccf35ed 157/* Support targetm.vectorize.builtin_mask_for_load. */
13c62176 158static GTY(()) tree altivec_builtin_mask_for_load;
7ccf35ed 159
6fa3f289 160/* Size of long double */
6fa3f289
ZW
161int rs6000_long_double_type_size;
162
163/* Whether -mabi=altivec has appeared */
164int rs6000_altivec_abi;
165
a3170dc6
AH
166/* Nonzero if we want SPE ABI extensions. */
167int rs6000_spe_abi;
168
5da702b1
AH
169/* Nonzero if floating point operations are done in the GPRs. */
170int rs6000_float_gprs = 0;
171
594a51fe
SS
172/* Nonzero if we want Darwin's struct-by-value-in-regs ABI. */
173int rs6000_darwin64_abi;
174
a0ab749a 175/* Set to nonzero once AIX common-mode calls have been defined. */
bbfb86aa 176static GTY(()) int common_mode_defined;
c81bebd7 177
9878760c
RK
178/* Save information from a "cmpxx" operation until the branch or scc is
179 emitted. */
9878760c
RK
180rtx rs6000_compare_op0, rs6000_compare_op1;
181int rs6000_compare_fp_p;
874a0744 182
874a0744
MM
183/* Label number of label created for -mrelocatable, to call to so we can
184 get the address of the GOT section */
185int rs6000_pic_labelno;
c81bebd7 186
b91da81f 187#ifdef USING_ELFOS_H
c81bebd7 188/* Which abi to adhere to */
9739c90c 189const char *rs6000_abi_name;
d9407988
MM
190
191/* Semantics of the small data area */
192enum rs6000_sdata_type rs6000_sdata = SDATA_DATA;
193
194/* Which small data model to use */
815cdc52 195const char *rs6000_sdata_name = (char *)0;
9ebbca7d
GK
196
197/* Counter for labels which are to be placed in .fixup. */
198int fixuplabelno = 0;
874a0744 199#endif
4697a36c 200
c4501e62
JJ
201/* Bit size of immediate TLS offsets and string from which it is decoded. */
202int rs6000_tls_size = 32;
203const char *rs6000_tls_size_string;
204
b6c9286a
MM
205/* ABI enumeration available for subtarget to use. */
206enum rs6000_abi rs6000_current_abi;
207
85b776df
AM
208/* Whether to use variant of AIX ABI for PowerPC64 Linux. */
209int dot_symbols;
210
38c1f2d7 211/* Debug flags */
815cdc52 212const char *rs6000_debug_name;
38c1f2d7
MM
213int rs6000_debug_stack; /* debug stack applications */
214int rs6000_debug_arg; /* debug argument handling */
215
aabcd309 216/* Value is TRUE if register/mode pair is acceptable. */
0d1fbc8c
AH
217bool rs6000_hard_regno_mode_ok_p[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
218
58646b77
PB
219/* Built in types. */
220
221tree rs6000_builtin_types[RS6000_BTI_MAX];
222tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
8bb418a3 223
57ac7be9
AM
224const char *rs6000_traceback_name;
225static enum {
226 traceback_default = 0,
227 traceback_none,
228 traceback_part,
229 traceback_full
230} rs6000_traceback;
231
38c1f2d7
MM
232/* Flag to say the TOC is initialized */
233int toc_initialized;
9ebbca7d 234char toc_label_name[10];
38c1f2d7 235
9ebbca7d 236/* Alias set for saves and restores from the rs6000 stack. */
f103e34d 237static GTY(()) int rs6000_sr_alias_set;
c8023011 238
a3c9585f
KH
239/* Control alignment for fields within structures. */
240/* String from -malign-XXXXX. */
025d9908
KH
241int rs6000_alignment_flags;
242
78f5898b
AH
243/* True for any options that were explicitly set. */
244struct {
df01da37 245 bool aix_struct_ret; /* True if -maix-struct-ret was used. */
78f5898b
AH
246 bool alignment; /* True if -malign- was used. */
247 bool abi; /* True if -mabi= was used. */
248 bool spe; /* True if -mspe= was used. */
249 bool float_gprs; /* True if -mfloat-gprs= was used. */
250 bool isel; /* True if -misel was used. */
251 bool long_double; /* True if -mlong-double- was used. */
252} rs6000_explicit_options;
253
a3170dc6
AH
254struct builtin_description
255{
256 /* mask is not const because we're going to alter it below. This
257 nonsense will go away when we rewrite the -march infrastructure
258 to give us more target flag bits. */
259 unsigned int mask;
260 const enum insn_code icode;
261 const char *const name;
262 const enum rs6000_builtins code;
263};
8b897cfa
RS
264\f
265/* Target cpu costs. */
266
267struct processor_costs {
c4ad648e 268 const int mulsi; /* cost of SImode multiplication. */
8b897cfa
RS
269 const int mulsi_const; /* cost of SImode multiplication by constant. */
270 const int mulsi_const9; /* cost of SImode mult by short constant. */
c4ad648e
AM
271 const int muldi; /* cost of DImode multiplication. */
272 const int divsi; /* cost of SImode division. */
273 const int divdi; /* cost of DImode division. */
274 const int fp; /* cost of simple SFmode and DFmode insns. */
275 const int dmul; /* cost of DFmode multiplication (and fmadd). */
276 const int sdiv; /* cost of SFmode division (fdivs). */
277 const int ddiv; /* cost of DFmode division (fdiv). */
8b897cfa
RS
278};
279
280const struct processor_costs *rs6000_cost;
281
282/* Processor costs (relative to an add) */
283
284/* Instruction size costs on 32bit processors. */
285static const
286struct processor_costs size32_cost = {
06a67bdd
RS
287 COSTS_N_INSNS (1), /* mulsi */
288 COSTS_N_INSNS (1), /* mulsi_const */
289 COSTS_N_INSNS (1), /* mulsi_const9 */
290 COSTS_N_INSNS (1), /* muldi */
291 COSTS_N_INSNS (1), /* divsi */
292 COSTS_N_INSNS (1), /* divdi */
293 COSTS_N_INSNS (1), /* fp */
294 COSTS_N_INSNS (1), /* dmul */
295 COSTS_N_INSNS (1), /* sdiv */
296 COSTS_N_INSNS (1), /* ddiv */
8b897cfa
RS
297};
298
299/* Instruction size costs on 64bit processors. */
300static const
301struct processor_costs size64_cost = {
06a67bdd
RS
302 COSTS_N_INSNS (1), /* mulsi */
303 COSTS_N_INSNS (1), /* mulsi_const */
304 COSTS_N_INSNS (1), /* mulsi_const9 */
305 COSTS_N_INSNS (1), /* muldi */
306 COSTS_N_INSNS (1), /* divsi */
307 COSTS_N_INSNS (1), /* divdi */
308 COSTS_N_INSNS (1), /* fp */
309 COSTS_N_INSNS (1), /* dmul */
310 COSTS_N_INSNS (1), /* sdiv */
311 COSTS_N_INSNS (1), /* ddiv */
8b897cfa
RS
312};
313
314/* Instruction costs on RIOS1 processors. */
315static const
316struct processor_costs rios1_cost = {
06a67bdd
RS
317 COSTS_N_INSNS (5), /* mulsi */
318 COSTS_N_INSNS (4), /* mulsi_const */
319 COSTS_N_INSNS (3), /* mulsi_const9 */
320 COSTS_N_INSNS (5), /* muldi */
321 COSTS_N_INSNS (19), /* divsi */
322 COSTS_N_INSNS (19), /* divdi */
323 COSTS_N_INSNS (2), /* fp */
324 COSTS_N_INSNS (2), /* dmul */
325 COSTS_N_INSNS (19), /* sdiv */
326 COSTS_N_INSNS (19), /* ddiv */
8b897cfa
RS
327};
328
329/* Instruction costs on RIOS2 processors. */
330static const
331struct processor_costs rios2_cost = {
06a67bdd
RS
332 COSTS_N_INSNS (2), /* mulsi */
333 COSTS_N_INSNS (2), /* mulsi_const */
334 COSTS_N_INSNS (2), /* mulsi_const9 */
335 COSTS_N_INSNS (2), /* muldi */
336 COSTS_N_INSNS (13), /* divsi */
337 COSTS_N_INSNS (13), /* divdi */
338 COSTS_N_INSNS (2), /* fp */
339 COSTS_N_INSNS (2), /* dmul */
340 COSTS_N_INSNS (17), /* sdiv */
341 COSTS_N_INSNS (17), /* ddiv */
8b897cfa
RS
342};
343
344/* Instruction costs on RS64A processors. */
345static const
346struct processor_costs rs64a_cost = {
06a67bdd
RS
347 COSTS_N_INSNS (20), /* mulsi */
348 COSTS_N_INSNS (12), /* mulsi_const */
349 COSTS_N_INSNS (8), /* mulsi_const9 */
350 COSTS_N_INSNS (34), /* muldi */
351 COSTS_N_INSNS (65), /* divsi */
352 COSTS_N_INSNS (67), /* divdi */
353 COSTS_N_INSNS (4), /* fp */
354 COSTS_N_INSNS (4), /* dmul */
355 COSTS_N_INSNS (31), /* sdiv */
356 COSTS_N_INSNS (31), /* ddiv */
8b897cfa
RS
357};
358
359/* Instruction costs on MPCCORE processors. */
360static const
361struct processor_costs mpccore_cost = {
06a67bdd
RS
362 COSTS_N_INSNS (2), /* mulsi */
363 COSTS_N_INSNS (2), /* mulsi_const */
364 COSTS_N_INSNS (2), /* mulsi_const9 */
365 COSTS_N_INSNS (2), /* muldi */
366 COSTS_N_INSNS (6), /* divsi */
367 COSTS_N_INSNS (6), /* divdi */
368 COSTS_N_INSNS (4), /* fp */
369 COSTS_N_INSNS (5), /* dmul */
370 COSTS_N_INSNS (10), /* sdiv */
371 COSTS_N_INSNS (17), /* ddiv */
8b897cfa
RS
372};
373
374/* Instruction costs on PPC403 processors. */
375static const
376struct processor_costs ppc403_cost = {
06a67bdd
RS
377 COSTS_N_INSNS (4), /* mulsi */
378 COSTS_N_INSNS (4), /* mulsi_const */
379 COSTS_N_INSNS (4), /* mulsi_const9 */
380 COSTS_N_INSNS (4), /* muldi */
381 COSTS_N_INSNS (33), /* divsi */
382 COSTS_N_INSNS (33), /* divdi */
383 COSTS_N_INSNS (11), /* fp */
384 COSTS_N_INSNS (11), /* dmul */
385 COSTS_N_INSNS (11), /* sdiv */
386 COSTS_N_INSNS (11), /* ddiv */
8b897cfa
RS
387};
388
389/* Instruction costs on PPC405 processors. */
390static const
391struct processor_costs ppc405_cost = {
06a67bdd
RS
392 COSTS_N_INSNS (5), /* mulsi */
393 COSTS_N_INSNS (4), /* mulsi_const */
394 COSTS_N_INSNS (3), /* mulsi_const9 */
395 COSTS_N_INSNS (5), /* muldi */
396 COSTS_N_INSNS (35), /* divsi */
397 COSTS_N_INSNS (35), /* divdi */
398 COSTS_N_INSNS (11), /* fp */
399 COSTS_N_INSNS (11), /* dmul */
400 COSTS_N_INSNS (11), /* sdiv */
401 COSTS_N_INSNS (11), /* ddiv */
8b897cfa
RS
402};
403
404/* Instruction costs on PPC440 processors. */
405static const
406struct processor_costs ppc440_cost = {
06a67bdd
RS
407 COSTS_N_INSNS (3), /* mulsi */
408 COSTS_N_INSNS (2), /* mulsi_const */
409 COSTS_N_INSNS (2), /* mulsi_const9 */
410 COSTS_N_INSNS (3), /* muldi */
411 COSTS_N_INSNS (34), /* divsi */
412 COSTS_N_INSNS (34), /* divdi */
413 COSTS_N_INSNS (5), /* fp */
414 COSTS_N_INSNS (5), /* dmul */
415 COSTS_N_INSNS (19), /* sdiv */
416 COSTS_N_INSNS (33), /* ddiv */
8b897cfa
RS
417};
418
419/* Instruction costs on PPC601 processors. */
420static const
421struct processor_costs ppc601_cost = {
06a67bdd
RS
422 COSTS_N_INSNS (5), /* mulsi */
423 COSTS_N_INSNS (5), /* mulsi_const */
424 COSTS_N_INSNS (5), /* mulsi_const9 */
425 COSTS_N_INSNS (5), /* muldi */
426 COSTS_N_INSNS (36), /* divsi */
427 COSTS_N_INSNS (36), /* divdi */
428 COSTS_N_INSNS (4), /* fp */
429 COSTS_N_INSNS (5), /* dmul */
430 COSTS_N_INSNS (17), /* sdiv */
431 COSTS_N_INSNS (31), /* ddiv */
8b897cfa
RS
432};
433
434/* Instruction costs on PPC603 processors. */
435static const
436struct processor_costs ppc603_cost = {
06a67bdd
RS
437 COSTS_N_INSNS (5), /* mulsi */
438 COSTS_N_INSNS (3), /* mulsi_const */
439 COSTS_N_INSNS (2), /* mulsi_const9 */
440 COSTS_N_INSNS (5), /* muldi */
441 COSTS_N_INSNS (37), /* divsi */
442 COSTS_N_INSNS (37), /* divdi */
443 COSTS_N_INSNS (3), /* fp */
444 COSTS_N_INSNS (4), /* dmul */
445 COSTS_N_INSNS (18), /* sdiv */
446 COSTS_N_INSNS (33), /* ddiv */
8b897cfa
RS
447};
448
449/* Instruction costs on PPC604 processors. */
450static const
451struct processor_costs ppc604_cost = {
06a67bdd
RS
452 COSTS_N_INSNS (4), /* mulsi */
453 COSTS_N_INSNS (4), /* mulsi_const */
454 COSTS_N_INSNS (4), /* mulsi_const9 */
455 COSTS_N_INSNS (4), /* muldi */
456 COSTS_N_INSNS (20), /* divsi */
457 COSTS_N_INSNS (20), /* divdi */
458 COSTS_N_INSNS (3), /* fp */
459 COSTS_N_INSNS (3), /* dmul */
460 COSTS_N_INSNS (18), /* sdiv */
461 COSTS_N_INSNS (32), /* ddiv */
8b897cfa
RS
462};
463
464/* Instruction costs on PPC604e processors. */
465static const
466struct processor_costs ppc604e_cost = {
06a67bdd
RS
467 COSTS_N_INSNS (2), /* mulsi */
468 COSTS_N_INSNS (2), /* mulsi_const */
469 COSTS_N_INSNS (2), /* mulsi_const9 */
470 COSTS_N_INSNS (2), /* muldi */
471 COSTS_N_INSNS (20), /* divsi */
472 COSTS_N_INSNS (20), /* divdi */
473 COSTS_N_INSNS (3), /* fp */
474 COSTS_N_INSNS (3), /* dmul */
475 COSTS_N_INSNS (18), /* sdiv */
476 COSTS_N_INSNS (32), /* ddiv */
8b897cfa
RS
477};
478
f0517163 479/* Instruction costs on PPC620 processors. */
8b897cfa
RS
480static const
481struct processor_costs ppc620_cost = {
06a67bdd
RS
482 COSTS_N_INSNS (5), /* mulsi */
483 COSTS_N_INSNS (4), /* mulsi_const */
484 COSTS_N_INSNS (3), /* mulsi_const9 */
485 COSTS_N_INSNS (7), /* muldi */
486 COSTS_N_INSNS (21), /* divsi */
487 COSTS_N_INSNS (37), /* divdi */
488 COSTS_N_INSNS (3), /* fp */
489 COSTS_N_INSNS (3), /* dmul */
490 COSTS_N_INSNS (18), /* sdiv */
491 COSTS_N_INSNS (32), /* ddiv */
f0517163
RS
492};
493
494/* Instruction costs on PPC630 processors. */
495static const
496struct processor_costs ppc630_cost = {
06a67bdd
RS
497 COSTS_N_INSNS (5), /* mulsi */
498 COSTS_N_INSNS (4), /* mulsi_const */
499 COSTS_N_INSNS (3), /* mulsi_const9 */
500 COSTS_N_INSNS (7), /* muldi */
501 COSTS_N_INSNS (21), /* divsi */
502 COSTS_N_INSNS (37), /* divdi */
503 COSTS_N_INSNS (3), /* fp */
504 COSTS_N_INSNS (3), /* dmul */
505 COSTS_N_INSNS (17), /* sdiv */
506 COSTS_N_INSNS (21), /* ddiv */
8b897cfa
RS
507};
508
509/* Instruction costs on PPC750 and PPC7400 processors. */
510static const
511struct processor_costs ppc750_cost = {
06a67bdd
RS
512 COSTS_N_INSNS (5), /* mulsi */
513 COSTS_N_INSNS (3), /* mulsi_const */
514 COSTS_N_INSNS (2), /* mulsi_const9 */
515 COSTS_N_INSNS (5), /* muldi */
516 COSTS_N_INSNS (17), /* divsi */
517 COSTS_N_INSNS (17), /* divdi */
518 COSTS_N_INSNS (3), /* fp */
519 COSTS_N_INSNS (3), /* dmul */
520 COSTS_N_INSNS (17), /* sdiv */
521 COSTS_N_INSNS (31), /* ddiv */
8b897cfa
RS
522};
523
524/* Instruction costs on PPC7450 processors. */
525static const
526struct processor_costs ppc7450_cost = {
06a67bdd
RS
527 COSTS_N_INSNS (4), /* mulsi */
528 COSTS_N_INSNS (3), /* mulsi_const */
529 COSTS_N_INSNS (3), /* mulsi_const9 */
530 COSTS_N_INSNS (4), /* muldi */
531 COSTS_N_INSNS (23), /* divsi */
532 COSTS_N_INSNS (23), /* divdi */
533 COSTS_N_INSNS (5), /* fp */
534 COSTS_N_INSNS (5), /* dmul */
535 COSTS_N_INSNS (21), /* sdiv */
536 COSTS_N_INSNS (35), /* ddiv */
8b897cfa 537};
a3170dc6 538
8b897cfa
RS
539/* Instruction costs on PPC8540 processors. */
540static const
541struct processor_costs ppc8540_cost = {
06a67bdd
RS
542 COSTS_N_INSNS (4), /* mulsi */
543 COSTS_N_INSNS (4), /* mulsi_const */
544 COSTS_N_INSNS (4), /* mulsi_const9 */
545 COSTS_N_INSNS (4), /* muldi */
546 COSTS_N_INSNS (19), /* divsi */
547 COSTS_N_INSNS (19), /* divdi */
548 COSTS_N_INSNS (4), /* fp */
549 COSTS_N_INSNS (4), /* dmul */
550 COSTS_N_INSNS (29), /* sdiv */
551 COSTS_N_INSNS (29), /* ddiv */
8b897cfa
RS
552};
553
554/* Instruction costs on POWER4 and POWER5 processors. */
555static const
556struct processor_costs power4_cost = {
06a67bdd
RS
557 COSTS_N_INSNS (3), /* mulsi */
558 COSTS_N_INSNS (2), /* mulsi_const */
559 COSTS_N_INSNS (2), /* mulsi_const9 */
560 COSTS_N_INSNS (4), /* muldi */
561 COSTS_N_INSNS (18), /* divsi */
562 COSTS_N_INSNS (34), /* divdi */
563 COSTS_N_INSNS (3), /* fp */
564 COSTS_N_INSNS (3), /* dmul */
565 COSTS_N_INSNS (17), /* sdiv */
566 COSTS_N_INSNS (17), /* ddiv */
8b897cfa
RS
567};
568
569\f
a2369ed3 570static bool rs6000_function_ok_for_sibcall (tree, tree);
2ffa9a0c 571static const char *rs6000_invalid_within_doloop (rtx);
a2369ed3
DJ
572static rtx rs6000_generate_compare (enum rtx_code);
573static void rs6000_maybe_dead (rtx);
574static void rs6000_emit_stack_tie (void);
575static void rs6000_frame_related (rtx, rtx, HOST_WIDE_INT, rtx, rtx);
576static rtx spe_synthesize_frame_save (rtx);
577static bool spe_func_has_64bit_regs_p (void);
b20a9cca 578static void emit_frame_save (rtx, rtx, enum machine_mode, unsigned int,
d1d0c603 579 int, HOST_WIDE_INT);
a2369ed3
DJ
580static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
581static void rs6000_emit_allocate_stack (HOST_WIDE_INT, int);
582static unsigned rs6000_hash_constant (rtx);
583static unsigned toc_hash_function (const void *);
584static int toc_hash_eq (const void *, const void *);
585static int constant_pool_expr_1 (rtx, int *, int *);
586static bool constant_pool_expr_p (rtx);
a2369ed3 587static bool legitimate_small_data_p (enum machine_mode, rtx);
a2369ed3 588static bool legitimate_indexed_address_p (rtx, int);
a2369ed3
DJ
589static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
590static struct machine_function * rs6000_init_machine_status (void);
591static bool rs6000_assemble_integer (rtx, unsigned int, int);
6d0a8091 592static bool no_global_regs_above (int);
5add3202 593#ifdef HAVE_GAS_HIDDEN
a2369ed3 594static void rs6000_assemble_visibility (tree, int);
5add3202 595#endif
a2369ed3
DJ
596static int rs6000_ra_ever_killed (void);
597static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
8bb418a3 598static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
76d2b81d 599static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
f18eca82 600static const char *rs6000_mangle_fundamental_type (tree);
b86fe7b4 601extern const struct attribute_spec rs6000_attribute_table[];
a2369ed3
DJ
602static void rs6000_set_default_type_attributes (tree);
603static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT);
604static void rs6000_output_function_epilogue (FILE *, HOST_WIDE_INT);
b20a9cca
AM
605static void rs6000_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
606 tree);
a2369ed3 607static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
c6e8c921 608static bool rs6000_return_in_memory (tree, tree);
a2369ed3 609static void rs6000_file_start (void);
7c262518 610#if TARGET_ELF
a2369ed3
DJ
611static unsigned int rs6000_elf_section_type_flags (tree, const char *, int);
612static void rs6000_elf_asm_out_constructor (rtx, int);
613static void rs6000_elf_asm_out_destructor (rtx, int);
1334b570 614static void rs6000_elf_end_indicate_exec_stack (void) ATTRIBUTE_UNUSED;
a2369ed3
DJ
615static void rs6000_elf_select_section (tree, int, unsigned HOST_WIDE_INT);
616static void rs6000_elf_unique_section (tree, int);
617static void rs6000_elf_select_rtx_section (enum machine_mode, rtx,
b20a9cca 618 unsigned HOST_WIDE_INT);
a56d7372 619static void rs6000_elf_encode_section_info (tree, rtx, int)
0e5dbd9b 620 ATTRIBUTE_UNUSED;
a2369ed3 621static bool rs6000_elf_in_small_data_p (tree);
7c262518 622#endif
cbaaba19 623#if TARGET_XCOFF
a2369ed3 624static void rs6000_xcoff_asm_globalize_label (FILE *, const char *);
8210e4c4 625static void rs6000_xcoff_asm_named_section (const char *, unsigned int, tree);
a2369ed3
DJ
626static void rs6000_xcoff_select_section (tree, int, unsigned HOST_WIDE_INT);
627static void rs6000_xcoff_unique_section (tree, int);
628static void rs6000_xcoff_select_rtx_section (enum machine_mode, rtx,
b20a9cca 629 unsigned HOST_WIDE_INT);
a2369ed3
DJ
630static const char * rs6000_xcoff_strip_name_encoding (const char *);
631static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
632static void rs6000_xcoff_file_start (void);
633static void rs6000_xcoff_file_end (void);
f1384257 634#endif
a2369ed3
DJ
635static int rs6000_variable_issue (FILE *, int, rtx, int);
636static bool rs6000_rtx_costs (rtx, int, int, int *);
637static int rs6000_adjust_cost (rtx, rtx, rtx, int);
cbe26ab8 638static bool is_microcoded_insn (rtx);
79ae11c4 639static int is_dispatch_slot_restricted (rtx);
cbe26ab8
DN
640static bool is_cracked_insn (rtx);
641static bool is_branch_slot_insn (rtx);
a2369ed3
DJ
642static int rs6000_adjust_priority (rtx, int);
643static int rs6000_issue_rate (void);
569fa502 644static bool rs6000_is_costly_dependence (rtx, rtx, rtx, int, int);
cbe26ab8
DN
645static rtx get_next_active_insn (rtx, rtx);
646static bool insn_terminates_group_p (rtx , enum group_termination);
647static bool is_costly_group (rtx *, rtx);
648static int force_new_group (int, FILE *, rtx *, rtx, bool *, int, int *);
649static int redefine_groups (FILE *, int, rtx, rtx);
650static int pad_groups (FILE *, int, rtx, rtx);
651static void rs6000_sched_finish (FILE *, int);
a2369ed3 652static int rs6000_use_sched_lookahead (void);
7ccf35ed 653static tree rs6000_builtin_mask_for_load (void);
a2369ed3 654
58646b77 655static void def_builtin (int, const char *, tree, int);
a2369ed3
DJ
656static void rs6000_init_builtins (void);
657static rtx rs6000_expand_unop_builtin (enum insn_code, tree, rtx);
658static rtx rs6000_expand_binop_builtin (enum insn_code, tree, rtx);
659static rtx rs6000_expand_ternop_builtin (enum insn_code, tree, rtx);
660static rtx rs6000_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
661static void altivec_init_builtins (void);
662static void rs6000_common_init_builtins (void);
c15c90bb 663static void rs6000_init_libfuncs (void);
a2369ed3 664
b20a9cca
AM
665static void enable_mask_for_builtins (struct builtin_description *, int,
666 enum rs6000_builtins,
667 enum rs6000_builtins);
7c62e993 668static tree build_opaque_vector_type (tree, int);
a2369ed3
DJ
669static void spe_init_builtins (void);
670static rtx spe_expand_builtin (tree, rtx, bool *);
61bea3b0 671static rtx spe_expand_stv_builtin (enum insn_code, tree);
a2369ed3
DJ
672static rtx spe_expand_predicate_builtin (enum insn_code, tree, rtx);
673static rtx spe_expand_evsel_builtin (enum insn_code, tree, rtx);
674static int rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
d1d0c603
JJ
675static rs6000_stack_t *rs6000_stack_info (void);
676static void debug_stack_info (rs6000_stack_t *);
a2369ed3
DJ
677
678static rtx altivec_expand_builtin (tree, rtx, bool *);
679static rtx altivec_expand_ld_builtin (tree, rtx, bool *);
680static rtx altivec_expand_st_builtin (tree, rtx, bool *);
681static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
682static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
f676971a 683static rtx altivec_expand_predicate_builtin (enum insn_code,
c4ad648e 684 const char *, tree, rtx);
b4a62fa0 685static rtx altivec_expand_lv_builtin (enum insn_code, tree, rtx);
a2369ed3 686static rtx altivec_expand_stv_builtin (enum insn_code, tree);
78f5898b 687static bool rs6000_handle_option (size_t, const char *, int);
a2369ed3 688static void rs6000_parse_tls_size_option (void);
5da702b1 689static void rs6000_parse_yes_no_option (const char *, const char *, int *);
a2369ed3
DJ
690static int first_altivec_reg_to_save (void);
691static unsigned int compute_vrsave_mask (void);
9390387d 692static void compute_save_world_info (rs6000_stack_t *info_ptr);
a2369ed3
DJ
693static void is_altivec_return_reg (rtx, void *);
694static rtx generate_set_vrsave (rtx, rs6000_stack_t *, int);
695int easy_vector_constant (rtx, enum machine_mode);
58646b77 696static bool rs6000_is_opaque_type (tree);
a2369ed3
DJ
697static rtx rs6000_dwarf_register_span (rtx);
698static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
fdbe66f2 699static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
a2369ed3
DJ
700static rtx rs6000_tls_get_addr (void);
701static rtx rs6000_got_sym (void);
9390387d 702static int rs6000_tls_symbol_ref_1 (rtx *, void *);
a2369ed3
DJ
703static const char *rs6000_get_some_local_dynamic_name (void);
704static int rs6000_get_some_local_dynamic_name_1 (rtx *, void *);
ded9bf77 705static rtx rs6000_complex_function_value (enum machine_mode);
b20a9cca 706static rtx rs6000_spe_function_arg (CUMULATIVE_ARGS *,
a2369ed3 707 enum machine_mode, tree);
0b5383eb
DJ
708static void rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *,
709 HOST_WIDE_INT);
710static void rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *,
711 tree, HOST_WIDE_INT);
712static void rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *,
713 HOST_WIDE_INT,
714 rtx[], int *);
715static void rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *,
716 tree, HOST_WIDE_INT,
717 rtx[], int *);
718static rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, tree, int, bool);
ec6376ab 719static rtx rs6000_mixed_function_arg (enum machine_mode, tree, int);
b1917422 720static void rs6000_move_block_from_reg (int regno, rtx x, int nregs);
c6e8c921
GK
721static void setup_incoming_varargs (CUMULATIVE_ARGS *,
722 enum machine_mode, tree,
723 int *, int);
8cd5a4e0
RH
724static bool rs6000_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
725 tree, bool);
78a52f11
RH
726static int rs6000_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
727 tree, bool);
4d3e6fae 728static const char *invalid_arg_for_unprototyped_fn (tree, tree, tree);
efdba735
SH
729#if TARGET_MACHO
730static void macho_branch_islands (void);
731static void add_compiler_branch_island (tree, tree, int);
732static int no_previous_def (tree function_name);
733static tree get_prev_label (tree function_name);
c4e18b1c 734static void rs6000_darwin_file_start (void);
efdba735
SH
735#endif
736
c35d187f 737static tree rs6000_build_builtin_va_list (void);
23a60a04 738static tree rs6000_gimplify_va_arg (tree, tree, tree *, tree *);
fe984136 739static bool rs6000_must_pass_in_stack (enum machine_mode, tree);
f676971a 740static bool rs6000_vector_mode_supported_p (enum machine_mode);
94ff898d 741static int get_vec_cmp_insn (enum rtx_code, enum machine_mode,
21213b4c 742 enum machine_mode);
94ff898d 743static rtx rs6000_emit_vector_compare (enum rtx_code, rtx, rtx,
21213b4c
DP
744 enum machine_mode);
745static int get_vsel_insn (enum machine_mode);
746static void rs6000_emit_vector_select (rtx, rtx, rtx, rtx);
3aebbe5f 747static tree rs6000_stack_protect_fail (void);
21213b4c
DP
748
749const int INSN_NOT_AVAILABLE = -1;
93f90be6
FJ
750static enum machine_mode rs6000_eh_return_filter_mode (void);
751
17211ab5
GK
752/* Hash table stuff for keeping track of TOC entries. */
753
754struct toc_hash_struct GTY(())
755{
756 /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
757 ASM_OUTPUT_SPECIAL_POOL_ENTRY_P. */
758 rtx key;
759 enum machine_mode key_mode;
760 int labelno;
761};
762
763static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
c81bebd7
MM
764\f
765/* Default register names. */
766char rs6000_reg_names[][8] =
767{
802a0058
MM
768 "0", "1", "2", "3", "4", "5", "6", "7",
769 "8", "9", "10", "11", "12", "13", "14", "15",
770 "16", "17", "18", "19", "20", "21", "22", "23",
771 "24", "25", "26", "27", "28", "29", "30", "31",
772 "0", "1", "2", "3", "4", "5", "6", "7",
773 "8", "9", "10", "11", "12", "13", "14", "15",
774 "16", "17", "18", "19", "20", "21", "22", "23",
775 "24", "25", "26", "27", "28", "29", "30", "31",
776 "mq", "lr", "ctr","ap",
777 "0", "1", "2", "3", "4", "5", "6", "7",
0ac081f6
AH
778 "xer",
779 /* AltiVec registers. */
0cd5e3a1
AH
780 "0", "1", "2", "3", "4", "5", "6", "7",
781 "8", "9", "10", "11", "12", "13", "14", "15",
782 "16", "17", "18", "19", "20", "21", "22", "23",
783 "24", "25", "26", "27", "28", "29", "30", "31",
59a4c851
AH
784 "vrsave", "vscr",
785 /* SPE registers. */
7d5175e1
JJ
786 "spe_acc", "spefscr",
787 /* Soft frame pointer. */
788 "sfp"
c81bebd7
MM
789};
790
791#ifdef TARGET_REGNAMES
8b60264b 792static const char alt_reg_names[][8] =
c81bebd7 793{
802a0058
MM
794 "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7",
795 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
796 "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
797 "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
798 "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
799 "%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
800 "%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
801 "%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
802 "mq", "lr", "ctr", "ap",
803 "%cr0", "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
0ac081f6 804 "xer",
59a4c851 805 /* AltiVec registers. */
0ac081f6 806 "%v0", "%v1", "%v2", "%v3", "%v4", "%v5", "%v6", "%v7",
59a4c851
AH
807 "%v8", "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
808 "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
809 "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
810 "vrsave", "vscr",
811 /* SPE registers. */
7d5175e1
JJ
812 "spe_acc", "spefscr",
813 /* Soft frame pointer. */
814 "sfp"
c81bebd7
MM
815};
816#endif
9878760c 817\f
daf11973
MM
818#ifndef MASK_STRICT_ALIGN
819#define MASK_STRICT_ALIGN 0
820#endif
ffcfcb5f
AM
821#ifndef TARGET_PROFILE_KERNEL
822#define TARGET_PROFILE_KERNEL 0
823#endif
3961e8fe
RH
824
825/* The VRSAVE bitmask puts bit %v0 as the most significant bit. */
826#define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
672a6f42
NB
827\f
828/* Initialize the GCC target structure. */
91d231cb
JM
829#undef TARGET_ATTRIBUTE_TABLE
830#define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
a5c76ee6
ZW
831#undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
832#define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
daf11973 833
301d03af
RS
834#undef TARGET_ASM_ALIGNED_DI_OP
835#define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
836
837/* Default unaligned ops are only provided for ELF. Find the ops needed
838 for non-ELF systems. */
839#ifndef OBJECT_FORMAT_ELF
cbaaba19 840#if TARGET_XCOFF
ae6c1efd 841/* For XCOFF. rs6000_assemble_integer will handle unaligned DIs on
301d03af
RS
842 64-bit targets. */
843#undef TARGET_ASM_UNALIGNED_HI_OP
844#define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
845#undef TARGET_ASM_UNALIGNED_SI_OP
846#define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
847#undef TARGET_ASM_UNALIGNED_DI_OP
848#define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
849#else
850/* For Darwin. */
851#undef TARGET_ASM_UNALIGNED_HI_OP
852#define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
853#undef TARGET_ASM_UNALIGNED_SI_OP
854#define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
49bd1d27
SS
855#undef TARGET_ASM_UNALIGNED_DI_OP
856#define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
857#undef TARGET_ASM_ALIGNED_DI_OP
858#define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
301d03af
RS
859#endif
860#endif
861
862/* This hook deals with fixups for relocatable code and DI-mode objects
863 in 64-bit code. */
864#undef TARGET_ASM_INTEGER
865#define TARGET_ASM_INTEGER rs6000_assemble_integer
866
93638d7a
AM
867#ifdef HAVE_GAS_HIDDEN
868#undef TARGET_ASM_ASSEMBLE_VISIBILITY
869#define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
870#endif
871
c4501e62
JJ
872#undef TARGET_HAVE_TLS
873#define TARGET_HAVE_TLS HAVE_AS_TLS
874
875#undef TARGET_CANNOT_FORCE_CONST_MEM
876#define TARGET_CANNOT_FORCE_CONST_MEM rs6000_tls_referenced_p
877
08c148a8
NB
878#undef TARGET_ASM_FUNCTION_PROLOGUE
879#define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
880#undef TARGET_ASM_FUNCTION_EPILOGUE
881#define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
882
b54cf83a
DE
883#undef TARGET_SCHED_VARIABLE_ISSUE
884#define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
885
c237e94a
ZW
886#undef TARGET_SCHED_ISSUE_RATE
887#define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
888#undef TARGET_SCHED_ADJUST_COST
889#define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
890#undef TARGET_SCHED_ADJUST_PRIORITY
891#define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
f676971a 892#undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
569fa502 893#define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
cbe26ab8
DN
894#undef TARGET_SCHED_FINISH
895#define TARGET_SCHED_FINISH rs6000_sched_finish
c237e94a 896
be12c2b0
VM
897#undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
898#define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
899
7ccf35ed
DN
900#undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD
901#define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load
902
0ac081f6
AH
903#undef TARGET_INIT_BUILTINS
904#define TARGET_INIT_BUILTINS rs6000_init_builtins
905
906#undef TARGET_EXPAND_BUILTIN
907#define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
908
f18eca82
ZL
909#undef TARGET_MANGLE_FUNDAMENTAL_TYPE
910#define TARGET_MANGLE_FUNDAMENTAL_TYPE rs6000_mangle_fundamental_type
911
c15c90bb
ZW
912#undef TARGET_INIT_LIBFUNCS
913#define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
914
f1384257 915#if TARGET_MACHO
0e5dbd9b 916#undef TARGET_BINDS_LOCAL_P
31920d83 917#define TARGET_BINDS_LOCAL_P darwin_binds_local_p
f1384257 918#endif
0e5dbd9b 919
3961e8fe
RH
920#undef TARGET_ASM_OUTPUT_MI_THUNK
921#define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
922
3961e8fe 923#undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
5b71a4e7 924#define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_tree_hwi_hwi_tree_true
00b960c7 925
4977bab6
ZW
926#undef TARGET_FUNCTION_OK_FOR_SIBCALL
927#define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
928
2e3f0db6
DJ
929#undef TARGET_INVALID_WITHIN_DOLOOP
930#define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop
9419649c 931
3c50106f
RH
932#undef TARGET_RTX_COSTS
933#define TARGET_RTX_COSTS rs6000_rtx_costs
dcefdf67
RH
934#undef TARGET_ADDRESS_COST
935#define TARGET_ADDRESS_COST hook_int_rtx_0
3c50106f 936
c8e4f0e9 937#undef TARGET_VECTOR_OPAQUE_P
58646b77 938#define TARGET_VECTOR_OPAQUE_P rs6000_is_opaque_type
62e1dfcf 939
96714395
AH
940#undef TARGET_DWARF_REGISTER_SPAN
941#define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
942
c6e8c921
GK
943/* On rs6000, function arguments are promoted, as are function return
944 values. */
945#undef TARGET_PROMOTE_FUNCTION_ARGS
946#define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
947#undef TARGET_PROMOTE_FUNCTION_RETURN
948#define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
949
c6e8c921
GK
950#undef TARGET_RETURN_IN_MEMORY
951#define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
952
953#undef TARGET_SETUP_INCOMING_VARARGS
954#define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
955
956/* Always strict argument naming on rs6000. */
957#undef TARGET_STRICT_ARGUMENT_NAMING
958#define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
959#undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
960#define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
42ba5130
RH
961#undef TARGET_SPLIT_COMPLEX_ARG
962#define TARGET_SPLIT_COMPLEX_ARG hook_bool_tree_true
fe984136
RH
963#undef TARGET_MUST_PASS_IN_STACK
964#define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
8cd5a4e0
RH
965#undef TARGET_PASS_BY_REFERENCE
966#define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
78a52f11
RH
967#undef TARGET_ARG_PARTIAL_BYTES
968#define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes
c6e8c921 969
c35d187f
RH
970#undef TARGET_BUILD_BUILTIN_VA_LIST
971#define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
972
cd3ce9b4
JM
973#undef TARGET_GIMPLIFY_VA_ARG_EXPR
974#define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
975
93f90be6
FJ
976#undef TARGET_EH_RETURN_FILTER_MODE
977#define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
978
f676971a
EC
979#undef TARGET_VECTOR_MODE_SUPPORTED_P
980#define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p
981
4d3e6fae
FJ
982#undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
983#define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn
984
78f5898b
AH
985#undef TARGET_HANDLE_OPTION
986#define TARGET_HANDLE_OPTION rs6000_handle_option
987
988#undef TARGET_DEFAULT_TARGET_FLAGS
989#define TARGET_DEFAULT_TARGET_FLAGS \
990 (TARGET_DEFAULT | MASK_SCHED_PROLOG)
991
3aebbe5f
JJ
992#undef TARGET_STACK_PROTECT_FAIL
993#define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail
994
445cf5eb
JM
995/* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors
996 The PowerPC architecture requires only weak consistency among
997 processors--that is, memory accesses between processors need not be
998 sequentially consistent and memory accesses among processors can occur
999 in any order. The ability to order memory accesses weakly provides
1000 opportunities for more efficient use of the system bus. Unless a
1001 dependency exists, the 604e allows read operations to precede store
1002 operations. */
1003#undef TARGET_RELAXED_ORDERING
1004#define TARGET_RELAXED_ORDERING true
1005
fdbe66f2
EB
1006#ifdef HAVE_AS_TLS
1007#undef TARGET_ASM_OUTPUT_DWARF_DTPREL
1008#define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
1009#endif
1010
f6897b10 1011struct gcc_target targetm = TARGET_INITIALIZER;
672a6f42 1012\f
0d1fbc8c
AH
1013
1014/* Value is 1 if hard register REGNO can hold a value of machine-mode
1015 MODE. */
1016static int
1017rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
1018{
1019 /* The GPRs can hold any mode, but values bigger than one register
1020 cannot go past R31. */
1021 if (INT_REGNO_P (regno))
1022 return INT_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1);
1023
1024 /* The float registers can only hold floating modes and DImode. */
1025 if (FP_REGNO_P (regno))
1026 return
1027 (GET_MODE_CLASS (mode) == MODE_FLOAT
1028 && FP_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1))
1029 || (GET_MODE_CLASS (mode) == MODE_INT
1030 && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD);
1031
1032 /* The CR register can only hold CC modes. */
1033 if (CR_REGNO_P (regno))
1034 return GET_MODE_CLASS (mode) == MODE_CC;
1035
1036 if (XER_REGNO_P (regno))
1037 return mode == PSImode;
1038
1039 /* AltiVec only in AldyVec registers. */
1040 if (ALTIVEC_REGNO_P (regno))
1041 return ALTIVEC_VECTOR_MODE (mode);
1042
1043 /* ...but GPRs can hold SIMD data on the SPE in one register. */
1044 if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1045 return 1;
1046
1047 /* We cannot put TImode anywhere except general register and it must be
1048 able to fit within the register set. */
1049
1050 return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
1051}
1052
1053/* Initialize rs6000_hard_regno_mode_ok_p table. */
1054static void
1055rs6000_init_hard_regno_mode_ok (void)
1056{
1057 int r, m;
1058
1059 for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
1060 for (m = 0; m < NUM_MACHINE_MODES; ++m)
1061 if (rs6000_hard_regno_mode_ok (r, m))
1062 rs6000_hard_regno_mode_ok_p[m][r] = true;
1063}
1064
c1e55850
GK
1065/* If not otherwise specified by a target, make 'long double' equivalent to
1066 'double'. */
1067
1068#ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
1069#define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
1070#endif
1071
5248c961
RK
1072/* Override command line options. Mostly we process the processor
1073 type and sometimes adjust other TARGET_ options. */
1074
1075void
d779d0dc 1076rs6000_override_options (const char *default_cpu)
5248c961 1077{
c4d38ccb 1078 size_t i, j;
8e3f41e7 1079 struct rs6000_cpu_select *ptr;
66188a7e 1080 int set_masks;
5248c961 1081
66188a7e 1082 /* Simplifications for entries below. */
85638c0d 1083
66188a7e
GK
1084 enum {
1085 POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS,
1086 POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC
1087 };
85638c0d 1088
66188a7e
GK
1089 /* This table occasionally claims that a processor does not support
1090 a particular feature even though it does, but the feature is slower
1091 than the alternative. Thus, it shouldn't be relied on as a
f676971a 1092 complete description of the processor's support.
66188a7e
GK
1093
1094 Please keep this list in order, and don't forget to update the
1095 documentation in invoke.texi when adding a new processor or
1096 flag. */
5248c961
RK
1097 static struct ptt
1098 {
8b60264b
KG
1099 const char *const name; /* Canonical processor name. */
1100 const enum processor_type processor; /* Processor type enum value. */
1101 const int target_enable; /* Target flags to enable. */
8b60264b 1102 } const processor_target_table[]
66188a7e 1103 = {{"401", PROCESSOR_PPC403, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
49a0b204 1104 {"403", PROCESSOR_PPC403,
66188a7e
GK
1105 POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_STRICT_ALIGN},
1106 {"405", PROCESSOR_PPC405, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1107 {"405fp", PROCESSOR_PPC405, POWERPC_BASE_MASK},
1108 {"440", PROCESSOR_PPC440, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1109 {"440fp", PROCESSOR_PPC440, POWERPC_BASE_MASK},
1110 {"505", PROCESSOR_MPCCORE, POWERPC_BASE_MASK},
5248c961 1111 {"601", PROCESSOR_PPC601,
66188a7e
GK
1112 MASK_POWER | POWERPC_BASE_MASK | MASK_MULTIPLE | MASK_STRING},
1113 {"602", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1114 {"603", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1115 {"603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1116 {"604", PROCESSOR_PPC604, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1117 {"604e", PROCESSOR_PPC604e, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
7ddb6568
AM
1118 {"620", PROCESSOR_PPC620,
1119 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1120 {"630", PROCESSOR_PPC630,
1121 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
66188a7e
GK
1122 {"740", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1123 {"7400", PROCESSOR_PPC7400, POWERPC_7400_MASK},
1124 {"7450", PROCESSOR_PPC7450, POWERPC_7400_MASK},
1125 {"750", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1126 {"801", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1127 {"821", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1128 {"823", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1129 {"8540", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
4d4cbc0e
AH
1130 /* 8548 has a dummy entry for now. */
1131 {"8548", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
66188a7e 1132 {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
7177e720 1133 {"970", PROCESSOR_POWER4,
66188a7e
GK
1134 POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1135 {"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS},
1136 {"ec603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1137 {"G3", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1138 {"G4", PROCESSOR_PPC7450, POWERPC_7400_MASK},
49ffe578 1139 {"G5", PROCESSOR_POWER4,
66188a7e
GK
1140 POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1141 {"power", PROCESSOR_POWER, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1142 {"power2", PROCESSOR_POWER,
1143 MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
7ddb6568
AM
1144 {"power3", PROCESSOR_PPC630,
1145 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1146 {"power4", PROCESSOR_POWER4,
fc091c8e 1147 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POWERPC64},
ec507f2d 1148 {"power5", PROCESSOR_POWER5,
432218ba
DE
1149 POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GFXOPT
1150 | MASK_MFCRF | MASK_POPCNTB},
66188a7e
GK
1151 {"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK},
1152 {"powerpc64", PROCESSOR_POWERPC64,
98c41d98 1153 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
66188a7e
GK
1154 {"rios", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1155 {"rios1", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1156 {"rios2", PROCESSOR_RIOS2,
1157 MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1158 {"rsc", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1159 {"rsc1", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
98c41d98
DE
1160 {"rs64", PROCESSOR_RS64A,
1161 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}
66188a7e 1162 };
5248c961 1163
ca7558fc 1164 const size_t ptt_size = ARRAY_SIZE (processor_target_table);
5248c961 1165
66188a7e
GK
1166 /* Some OSs don't support saving the high part of 64-bit registers on
1167 context switch. Other OSs don't support saving Altivec registers.
1168 On those OSs, we don't touch the MASK_POWERPC64 or MASK_ALTIVEC
1169 settings; if the user wants either, the user must explicitly specify
1170 them and we won't interfere with the user's specification. */
1171
1172 enum {
1173 POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
f676971a 1174 POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT
66188a7e
GK
1175 | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
1176 | MASK_MFCRF)
1177 };
0d1fbc8c
AH
1178
1179 rs6000_init_hard_regno_mode_ok ();
1180
c4ad648e 1181 set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;
66188a7e
GK
1182#ifdef OS_MISSING_POWERPC64
1183 if (OS_MISSING_POWERPC64)
1184 set_masks &= ~MASK_POWERPC64;
1185#endif
1186#ifdef OS_MISSING_ALTIVEC
1187 if (OS_MISSING_ALTIVEC)
1188 set_masks &= ~MASK_ALTIVEC;
1189#endif
1190
768875a8
AM
1191 /* Don't override by the processor default if given explicitly. */
1192 set_masks &= ~target_flags_explicit;
957211c3 1193
a4f6c312 1194 /* Identify the processor type. */
8e3f41e7 1195 rs6000_select[0].string = default_cpu;
3cb999d8 1196 rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
8e3f41e7 1197
b6a1cbae 1198 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
5248c961 1199 {
8e3f41e7
MM
1200 ptr = &rs6000_select[i];
1201 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
5248c961 1202 {
8e3f41e7
MM
1203 for (j = 0; j < ptt_size; j++)
1204 if (! strcmp (ptr->string, processor_target_table[j].name))
1205 {
1206 if (ptr->set_tune_p)
1207 rs6000_cpu = processor_target_table[j].processor;
1208
1209 if (ptr->set_arch_p)
1210 {
66188a7e
GK
1211 target_flags &= ~set_masks;
1212 target_flags |= (processor_target_table[j].target_enable
1213 & set_masks);
8e3f41e7
MM
1214 }
1215 break;
1216 }
1217
4406229e 1218 if (j == ptt_size)
8e3f41e7 1219 error ("bad value (%s) for %s switch", ptr->string, ptr->name);
5248c961
RK
1220 }
1221 }
8a61d227 1222
993f19a8 1223 if (TARGET_E500)
a3170dc6
AH
1224 rs6000_isel = 1;
1225
dff9f1b6
DE
1226 /* If we are optimizing big endian systems for space, use the load/store
1227 multiple and string instructions. */
ef792183 1228 if (BYTES_BIG_ENDIAN && optimize_size)
957211c3 1229 target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
938937d8 1230
a4f6c312
SS
1231 /* Don't allow -mmultiple or -mstring on little endian systems
1232 unless the cpu is a 750, because the hardware doesn't support the
1233 instructions used in little endian mode, and causes an alignment
1234 trap. The 750 does not cause an alignment trap (except when the
1235 target is unaligned). */
bef84347 1236
b21fb038 1237 if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
7e69e155
MM
1238 {
1239 if (TARGET_MULTIPLE)
1240 {
1241 target_flags &= ~MASK_MULTIPLE;
b21fb038 1242 if ((target_flags_explicit & MASK_MULTIPLE) != 0)
d4ee4d25 1243 warning (0, "-mmultiple is not supported on little endian systems");
7e69e155
MM
1244 }
1245
1246 if (TARGET_STRING)
1247 {
1248 target_flags &= ~MASK_STRING;
b21fb038 1249 if ((target_flags_explicit & MASK_STRING) != 0)
d4ee4d25 1250 warning (0, "-mstring is not supported on little endian systems");
7e69e155
MM
1251 }
1252 }
3933e0e1 1253
38c1f2d7
MM
1254 /* Set debug flags */
1255 if (rs6000_debug_name)
1256 {
bfc79d3b 1257 if (! strcmp (rs6000_debug_name, "all"))
38c1f2d7 1258 rs6000_debug_stack = rs6000_debug_arg = 1;
bfc79d3b 1259 else if (! strcmp (rs6000_debug_name, "stack"))
38c1f2d7 1260 rs6000_debug_stack = 1;
bfc79d3b 1261 else if (! strcmp (rs6000_debug_name, "arg"))
38c1f2d7
MM
1262 rs6000_debug_arg = 1;
1263 else
c725bd79 1264 error ("unknown -mdebug-%s switch", rs6000_debug_name);
38c1f2d7
MM
1265 }
1266
57ac7be9
AM
1267 if (rs6000_traceback_name)
1268 {
1269 if (! strncmp (rs6000_traceback_name, "full", 4))
1270 rs6000_traceback = traceback_full;
1271 else if (! strncmp (rs6000_traceback_name, "part", 4))
1272 rs6000_traceback = traceback_part;
1273 else if (! strncmp (rs6000_traceback_name, "no", 2))
1274 rs6000_traceback = traceback_none;
1275 else
9e637a26 1276 error ("unknown -mtraceback arg %qs; expecting %<full%>, %<partial%> or %<none%>",
57ac7be9
AM
1277 rs6000_traceback_name);
1278 }
1279
78f5898b
AH
1280 if (!rs6000_explicit_options.long_double)
1281 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
6fa3f289 1282
6d0ef01e
HP
1283 /* Set Altivec ABI as default for powerpc64 linux. */
1284 if (TARGET_ELF && TARGET_64BIT)
1285 {
1286 rs6000_altivec_abi = 1;
78f5898b 1287 TARGET_ALTIVEC_VRSAVE = 1;
6d0ef01e
HP
1288 }
1289
594a51fe
SS
1290 /* Set the Darwin64 ABI as default for 64-bit Darwin. */
1291 if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
1292 {
1293 rs6000_darwin64_abi = 1;
9c7956fd 1294#if TARGET_MACHO
6ac49599 1295 darwin_one_byte_bool = 1;
9c7956fd 1296#endif
d9168963
SS
1297 /* Default to natural alignment, for better performance. */
1298 rs6000_alignment_flags = MASK_ALIGN_NATURAL;
594a51fe
SS
1299 }
1300
c4501e62
JJ
1301 /* Handle -mtls-size option. */
1302 rs6000_parse_tls_size_option ();
1303
a7ae18e2
AH
1304#ifdef SUBTARGET_OVERRIDE_OPTIONS
1305 SUBTARGET_OVERRIDE_OPTIONS;
1306#endif
1307#ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
1308 SUBSUBTARGET_OVERRIDE_OPTIONS;
1309#endif
4d4cbc0e
AH
1310#ifdef SUB3TARGET_OVERRIDE_OPTIONS
1311 SUB3TARGET_OVERRIDE_OPTIONS;
1312#endif
a7ae18e2 1313
5da702b1
AH
1314 if (TARGET_E500)
1315 {
e4463bf1
AH
1316 if (TARGET_ALTIVEC)
1317 error ("AltiVec and E500 instructions cannot coexist");
1318
5da702b1
AH
1319 /* The e500 does not have string instructions, and we set
1320 MASK_STRING above when optimizing for size. */
1321 if ((target_flags & MASK_STRING) != 0)
1322 target_flags = target_flags & ~MASK_STRING;
1323 }
1324 else if (rs6000_select[1].string != NULL)
1325 {
1326 /* For the powerpc-eabispe configuration, we set all these by
1327 default, so let's unset them if we manually set another
1328 CPU that is not the E500. */
78f5898b 1329 if (!rs6000_explicit_options.abi)
5da702b1 1330 rs6000_spe_abi = 0;
78f5898b 1331 if (!rs6000_explicit_options.spe)
5da702b1 1332 rs6000_spe = 0;
78f5898b 1333 if (!rs6000_explicit_options.float_gprs)
5da702b1 1334 rs6000_float_gprs = 0;
78f5898b 1335 if (!rs6000_explicit_options.isel)
5da702b1 1336 rs6000_isel = 0;
78f5898b 1337 if (!rs6000_explicit_options.long_double)
c1e55850 1338 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
5da702b1 1339 }
b5044283 1340
ec507f2d
DE
1341 rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4
1342 && rs6000_cpu != PROCESSOR_POWER5);
1343 rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
1344 || rs6000_cpu == PROCESSOR_POWER5);
1345
ec507f2d
DE
1346 rs6000_sched_restricted_insns_priority
1347 = (rs6000_sched_groups ? 1 : 0);
79ae11c4 1348
569fa502 1349 /* Handle -msched-costly-dep option. */
ec507f2d
DE
1350 rs6000_sched_costly_dep
1351 = (rs6000_sched_groups ? store_to_load_dep_costly : no_dep_costly);
432218ba 1352
569fa502
DN
1353 if (rs6000_sched_costly_dep_str)
1354 {
f676971a 1355 if (! strcmp (rs6000_sched_costly_dep_str, "no"))
c4ad648e 1356 rs6000_sched_costly_dep = no_dep_costly;
569fa502 1357 else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
c4ad648e 1358 rs6000_sched_costly_dep = all_deps_costly;
569fa502 1359 else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
c4ad648e 1360 rs6000_sched_costly_dep = true_store_to_load_dep_costly;
569fa502 1361 else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
c4ad648e 1362 rs6000_sched_costly_dep = store_to_load_dep_costly;
f676971a 1363 else
c4ad648e 1364 rs6000_sched_costly_dep = atoi (rs6000_sched_costly_dep_str);
cbe26ab8
DN
1365 }
1366
1367 /* Handle -minsert-sched-nops option. */
ec507f2d
DE
1368 rs6000_sched_insert_nops
1369 = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
432218ba 1370
cbe26ab8
DN
1371 if (rs6000_sched_insert_nops_str)
1372 {
1373 if (! strcmp (rs6000_sched_insert_nops_str, "no"))
c4ad648e 1374 rs6000_sched_insert_nops = sched_finish_none;
cbe26ab8 1375 else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
c4ad648e 1376 rs6000_sched_insert_nops = sched_finish_pad_groups;
cbe26ab8 1377 else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
c4ad648e 1378 rs6000_sched_insert_nops = sched_finish_regroup_exact;
cbe26ab8 1379 else
c4ad648e 1380 rs6000_sched_insert_nops = atoi (rs6000_sched_insert_nops_str);
569fa502
DN
1381 }
1382
c81bebd7 1383#ifdef TARGET_REGNAMES
a4f6c312
SS
1384 /* If the user desires alternate register names, copy in the
1385 alternate names now. */
c81bebd7 1386 if (TARGET_REGNAMES)
4e135bdd 1387 memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
c81bebd7
MM
1388#endif
1389
df01da37 1390 /* Set aix_struct_return last, after the ABI is determined.
6fa3f289
ZW
1391 If -maix-struct-return or -msvr4-struct-return was explicitly
1392 used, don't override with the ABI default. */
df01da37
DE
1393 if (!rs6000_explicit_options.aix_struct_ret)
1394 aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
6fa3f289 1395
fcce224d
DE
1396 if (TARGET_LONG_DOUBLE_128
1397 && (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN))
70a01792 1398 REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
fcce224d 1399
9ebbca7d
GK
1400 /* Allocate an alias set for register saves & restores from stack. */
1401 rs6000_sr_alias_set = new_alias_set ();
1402
f676971a 1403 if (TARGET_TOC)
9ebbca7d 1404 ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
71f123ca 1405
301d03af
RS
1406 /* We can only guarantee the availability of DI pseudo-ops when
1407 assembling for 64-bit targets. */
ae6c1efd 1408 if (!TARGET_64BIT)
301d03af
RS
1409 {
1410 targetm.asm_out.aligned_op.di = NULL;
1411 targetm.asm_out.unaligned_op.di = NULL;
1412 }
1413
1494c534
DE
1414 /* Set branch target alignment, if not optimizing for size. */
1415 if (!optimize_size)
1416 {
1417 if (rs6000_sched_groups)
1418 {
1419 if (align_functions <= 0)
1420 align_functions = 16;
1421 if (align_jumps <= 0)
1422 align_jumps = 16;
1423 if (align_loops <= 0)
1424 align_loops = 16;
1425 }
1426 if (align_jumps_max_skip <= 0)
1427 align_jumps_max_skip = 15;
1428 if (align_loops_max_skip <= 0)
1429 align_loops_max_skip = 15;
1430 }
2792d578 1431
71f123ca
FS
1432 /* Arrange to save and restore machine status around nested functions. */
1433 init_machine_status = rs6000_init_machine_status;
42ba5130
RH
1434
1435 /* We should always be splitting complex arguments, but we can't break
1436 Linux and Darwin ABIs at the moment. For now, only AIX is fixed. */
18f63bfa 1437 if (DEFAULT_ABI != ABI_AIX)
42ba5130 1438 targetm.calls.split_complex_arg = NULL;
8b897cfa
RS
1439
1440 /* Initialize rs6000_cost with the appropriate target costs. */
1441 if (optimize_size)
1442 rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost;
1443 else
1444 switch (rs6000_cpu)
1445 {
1446 case PROCESSOR_RIOS1:
1447 rs6000_cost = &rios1_cost;
1448 break;
1449
1450 case PROCESSOR_RIOS2:
1451 rs6000_cost = &rios2_cost;
1452 break;
1453
1454 case PROCESSOR_RS64A:
1455 rs6000_cost = &rs64a_cost;
1456 break;
1457
1458 case PROCESSOR_MPCCORE:
1459 rs6000_cost = &mpccore_cost;
1460 break;
1461
1462 case PROCESSOR_PPC403:
1463 rs6000_cost = &ppc403_cost;
1464 break;
1465
1466 case PROCESSOR_PPC405:
1467 rs6000_cost = &ppc405_cost;
1468 break;
1469
1470 case PROCESSOR_PPC440:
1471 rs6000_cost = &ppc440_cost;
1472 break;
1473
1474 case PROCESSOR_PPC601:
1475 rs6000_cost = &ppc601_cost;
1476 break;
1477
1478 case PROCESSOR_PPC603:
1479 rs6000_cost = &ppc603_cost;
1480 break;
1481
1482 case PROCESSOR_PPC604:
1483 rs6000_cost = &ppc604_cost;
1484 break;
1485
1486 case PROCESSOR_PPC604e:
1487 rs6000_cost = &ppc604e_cost;
1488 break;
1489
1490 case PROCESSOR_PPC620:
8b897cfa
RS
1491 rs6000_cost = &ppc620_cost;
1492 break;
1493
f0517163
RS
1494 case PROCESSOR_PPC630:
1495 rs6000_cost = &ppc630_cost;
1496 break;
1497
8b897cfa
RS
1498 case PROCESSOR_PPC750:
1499 case PROCESSOR_PPC7400:
1500 rs6000_cost = &ppc750_cost;
1501 break;
1502
1503 case PROCESSOR_PPC7450:
1504 rs6000_cost = &ppc7450_cost;
1505 break;
1506
1507 case PROCESSOR_PPC8540:
1508 rs6000_cost = &ppc8540_cost;
1509 break;
1510
1511 case PROCESSOR_POWER4:
1512 case PROCESSOR_POWER5:
1513 rs6000_cost = &power4_cost;
1514 break;
1515
1516 default:
37409796 1517 gcc_unreachable ();
8b897cfa 1518 }
5248c961 1519}
5accd822 1520
7ccf35ed
DN
1521/* Implement targetm.vectorize.builtin_mask_for_load. */
1522static tree
1523rs6000_builtin_mask_for_load (void)
1524{
1525 if (TARGET_ALTIVEC)
1526 return altivec_builtin_mask_for_load;
1527 else
1528 return 0;
1529}
1530
5da702b1
AH
1531/* Handle generic options of the form -mfoo=yes/no.
1532 NAME is the option name.
1533 VALUE is the option value.
1534 FLAG is the pointer to the flag where to store a 1 or 0, depending on
1535 whether the option value is 'yes' or 'no' respectively. */
993f19a8 1536static void
5da702b1 1537rs6000_parse_yes_no_option (const char *name, const char *value, int *flag)
993f19a8 1538{
5da702b1 1539 if (value == 0)
993f19a8 1540 return;
5da702b1
AH
1541 else if (!strcmp (value, "yes"))
1542 *flag = 1;
1543 else if (!strcmp (value, "no"))
1544 *flag = 0;
08b57fb3 1545 else
5da702b1 1546 error ("unknown -m%s= option specified: '%s'", name, value);
08b57fb3
AH
1547}
1548
c4501e62
JJ
1549/* Validate and record the size specified with the -mtls-size option. */
1550
1551static void
863d938c 1552rs6000_parse_tls_size_option (void)
c4501e62
JJ
1553{
1554 if (rs6000_tls_size_string == 0)
1555 return;
1556 else if (strcmp (rs6000_tls_size_string, "16") == 0)
1557 rs6000_tls_size = 16;
1558 else if (strcmp (rs6000_tls_size_string, "32") == 0)
1559 rs6000_tls_size = 32;
1560 else if (strcmp (rs6000_tls_size_string, "64") == 0)
1561 rs6000_tls_size = 64;
1562 else
9e637a26 1563 error ("bad value %qs for -mtls-size switch", rs6000_tls_size_string);
c4501e62
JJ
1564}
1565
5accd822 1566void
a2369ed3 1567optimization_options (int level ATTRIBUTE_UNUSED, int size ATTRIBUTE_UNUSED)
5accd822 1568{
2e3f0db6
DJ
1569 if (DEFAULT_ABI == ABI_DARWIN)
1570 /* The Darwin libraries never set errno, so we might as well
1571 avoid calling them when that's the only reason we would. */
1572 flag_errno_math = 0;
5accd822 1573}
78f5898b
AH
1574
1575/* Implement TARGET_HANDLE_OPTION. */
1576
1577static bool
1578rs6000_handle_option (size_t code, const char *arg, int value)
1579{
1580 switch (code)
1581 {
1582 case OPT_mno_power:
1583 target_flags &= ~(MASK_POWER | MASK_POWER2
1584 | MASK_MULTIPLE | MASK_STRING);
c2dba4ab
AH
1585 target_flags_explicit |= (MASK_POWER | MASK_POWER2
1586 | MASK_MULTIPLE | MASK_STRING);
78f5898b
AH
1587 break;
1588 case OPT_mno_powerpc:
1589 target_flags &= ~(MASK_POWERPC | MASK_PPC_GPOPT
1590 | MASK_PPC_GFXOPT | MASK_POWERPC64);
c2dba4ab
AH
1591 target_flags_explicit |= (MASK_POWERPC | MASK_PPC_GPOPT
1592 | MASK_PPC_GFXOPT | MASK_POWERPC64);
78f5898b
AH
1593 break;
1594 case OPT_mfull_toc:
1595 target_flags &= ~(MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC
1596 | MASK_NO_SUM_IN_TOC);
c2dba4ab
AH
1597 target_flags_explicit |= (MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC
1598 | MASK_NO_SUM_IN_TOC);
78f5898b
AH
1599#ifdef TARGET_USES_SYSV4_OPT
1600 /* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be
1601 just the same as -mminimal-toc. */
1602 target_flags |= MASK_MINIMAL_TOC;
c2dba4ab 1603 target_flags_explicit |= MASK_MINIMAL_TOC;
78f5898b
AH
1604#endif
1605 break;
1606
1607#ifdef TARGET_USES_SYSV4_OPT
1608 case OPT_mtoc:
1609 /* Make -mtoc behave like -mminimal-toc. */
1610 target_flags |= MASK_MINIMAL_TOC;
c2dba4ab 1611 target_flags_explicit |= MASK_MINIMAL_TOC;
78f5898b
AH
1612 break;
1613#endif
1614
1615#ifdef TARGET_USES_AIX64_OPT
1616 case OPT_maix64:
1617#else
1618 case OPT_m64:
1619#endif
1620 target_flags |= MASK_POWERPC64 | MASK_POWERPC | MASK_PPC_GFXOPT;
c2dba4ab
AH
1621 target_flags_explicit |= MASK_POWERPC64 | MASK_POWERPC
1622 | MASK_PPC_GFXOPT;
78f5898b
AH
1623 break;
1624
1625#ifdef TARGET_USES_AIX64_OPT
1626 case OPT_maix32:
1627#else
1628 case OPT_m32:
1629#endif
1630 target_flags &= ~MASK_POWERPC64;
c2dba4ab 1631 target_flags_explicit |= MASK_POWERPC64;
78f5898b
AH
1632 break;
1633
1634 case OPT_minsert_sched_nops_:
1635 rs6000_sched_insert_nops_str = arg;
1636 break;
1637
1638 case OPT_mminimal_toc:
1639 if (value == 1)
1640 {
c2dba4ab
AH
1641 target_flags &= ~(MASK_NO_FP_IN_TOC | MASK_NO_SUM_IN_TOC);
1642 target_flags_explicit |= (MASK_NO_FP_IN_TOC | MASK_NO_SUM_IN_TOC);
78f5898b
AH
1643 }
1644 break;
1645
1646 case OPT_mpower:
1647 if (value == 1)
c2dba4ab
AH
1648 {
1649 target_flags |= (MASK_MULTIPLE | MASK_STRING);
1650 target_flags_explicit |= (MASK_MULTIPLE | MASK_STRING);
1651 }
78f5898b
AH
1652 break;
1653
1654 case OPT_mpower2:
1655 if (value == 1)
c2dba4ab
AH
1656 {
1657 target_flags |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
1658 target_flags_explicit |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING);
1659 }
78f5898b
AH
1660 break;
1661
1662 case OPT_mpowerpc_gpopt:
1663 case OPT_mpowerpc_gfxopt:
1664 if (value == 1)
c2dba4ab
AH
1665 {
1666 target_flags |= MASK_POWERPC;
1667 target_flags_explicit |= MASK_POWERPC;
1668 }
78f5898b
AH
1669 break;
1670
df01da37
DE
1671 case OPT_maix_struct_return:
1672 case OPT_msvr4_struct_return:
1673 rs6000_explicit_options.aix_struct_ret = true;
1674 break;
1675
78f5898b
AH
1676 case OPT_mvrsave_:
1677 rs6000_parse_yes_no_option ("vrsave", arg, &(TARGET_ALTIVEC_VRSAVE));
1678 break;
78f5898b
AH
1679
1680 case OPT_misel_:
1681 rs6000_explicit_options.isel = true;
1682 rs6000_parse_yes_no_option ("isel", arg, &(rs6000_isel));
1683 break;
1684
1685 case OPT_mspe_:
1686 rs6000_explicit_options.spe = true;
1687 rs6000_parse_yes_no_option ("spe", arg, &(rs6000_spe));
1688 /* No SPE means 64-bit long doubles, even if an E500. */
1689 if (!rs6000_spe)
1690 rs6000_long_double_type_size = 64;
1691 break;
1692
1693 case OPT_mdebug_:
1694 rs6000_debug_name = arg;
1695 break;
1696
1697#ifdef TARGET_USES_SYSV4_OPT
1698 case OPT_mcall_:
1699 rs6000_abi_name = arg;
1700 break;
1701
1702 case OPT_msdata_:
1703 rs6000_sdata_name = arg;
1704 break;
1705
1706 case OPT_mtls_size_:
1707 rs6000_tls_size_string = arg;
1708 break;
1709
1710 case OPT_mrelocatable:
1711 if (value == 1)
c2dba4ab
AH
1712 {
1713 target_flags |= MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC;
1714 target_flags_explicit |= MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC;
1715 }
78f5898b
AH
1716 break;
1717
1718 case OPT_mrelocatable_lib:
1719 if (value == 1)
c2dba4ab
AH
1720 {
1721 target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC
1722 | MASK_NO_FP_IN_TOC;
1723 target_flags_explicit |= MASK_RELOCATABLE | MASK_MINIMAL_TOC
1724 | MASK_NO_FP_IN_TOC;
1725 }
78f5898b 1726 else
c2dba4ab
AH
1727 {
1728 target_flags &= ~MASK_RELOCATABLE;
1729 target_flags_explicit |= MASK_RELOCATABLE;
1730 }
78f5898b
AH
1731 break;
1732#endif
1733
1734 case OPT_mabi_:
1735 rs6000_explicit_options.abi = true;
1736 if (!strcmp (arg, "altivec"))
1737 {
1738 rs6000_altivec_abi = 1;
1739 rs6000_spe_abi = 0;
1740 }
1741 else if (! strcmp (arg, "no-altivec"))
1742 rs6000_altivec_abi = 0;
1743 else if (! strcmp (arg, "spe"))
1744 {
1745 rs6000_spe_abi = 1;
1746 rs6000_altivec_abi = 0;
1747 if (!TARGET_SPE_ABI)
1748 error ("not configured for ABI: '%s'", arg);
1749 }
1750 else if (! strcmp (arg, "no-spe"))
1751 rs6000_spe_abi = 0;
1752
1753 /* These are here for testing during development only, do not
1754 document in the manual please. */
1755 else if (! strcmp (arg, "d64"))
1756 {
1757 rs6000_darwin64_abi = 1;
1758 warning (0, "Using darwin64 ABI");
1759 }
1760 else if (! strcmp (arg, "d32"))
1761 {
1762 rs6000_darwin64_abi = 0;
1763 warning (0, "Using old darwin ABI");
1764 }
1765
1766 else
1767 {
1768 error ("unknown ABI specified: '%s'", arg);
1769 return false;
1770 }
1771 break;
1772
1773 case OPT_mcpu_:
1774 rs6000_select[1].string = arg;
1775 break;
1776
1777 case OPT_mtune_:
1778 rs6000_select[2].string = arg;
1779 break;
1780
1781 case OPT_mtraceback_:
1782 rs6000_traceback_name = arg;
1783 break;
1784
1785 case OPT_mfloat_gprs_:
1786 rs6000_explicit_options.float_gprs = true;
1787 if (! strcmp (arg, "yes") || ! strcmp (arg, "single"))
1788 rs6000_float_gprs = 1;
1789 else if (! strcmp (arg, "double"))
1790 rs6000_float_gprs = 2;
1791 else if (! strcmp (arg, "no"))
1792 rs6000_float_gprs = 0;
1793 else
1794 {
1795 error ("invalid option for -mfloat-gprs: '%s'", arg);
1796 return false;
1797 }
1798 break;
1799
1800 case OPT_mlong_double_:
1801 rs6000_explicit_options.long_double = true;
1802 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
1803 if (value != 64 && value != 128)
1804 {
1805 error ("Unknown switch -mlong-double-%s", arg);
1806 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
1807 return false;
1808 }
1809 else
1810 rs6000_long_double_type_size = value;
1811 break;
1812
1813 case OPT_msched_costly_dep_:
1814 rs6000_sched_costly_dep_str = arg;
1815 break;
1816
1817 case OPT_malign_:
1818 rs6000_explicit_options.alignment = true;
1819 if (! strcmp (arg, "power"))
1820 {
1821 /* On 64-bit Darwin, power alignment is ABI-incompatible with
1822 some C library functions, so warn about it. The flag may be
1823 useful for performance studies from time to time though, so
1824 don't disable it entirely. */
1825 if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT)
1826 warning (0, "-malign-power is not supported for 64-bit Darwin;"
1827 " it is incompatible with the installed C and C++ libraries");
1828 rs6000_alignment_flags = MASK_ALIGN_POWER;
1829 }
1830 else if (! strcmp (arg, "natural"))
1831 rs6000_alignment_flags = MASK_ALIGN_NATURAL;
1832 else
1833 {
1834 error ("unknown -malign-XXXXX option specified: '%s'", arg);
1835 return false;
1836 }
1837 break;
1838 }
1839 return true;
1840}
3cfa4909
MM
1841\f
1842/* Do anything needed at the start of the asm file. */
1843
1bc7c5b6 1844static void
863d938c 1845rs6000_file_start (void)
3cfa4909 1846{
c4d38ccb 1847 size_t i;
3cfa4909 1848 char buffer[80];
d330fd93 1849 const char *start = buffer;
3cfa4909 1850 struct rs6000_cpu_select *ptr;
1bc7c5b6
ZW
1851 const char *default_cpu = TARGET_CPU_DEFAULT;
1852 FILE *file = asm_out_file;
1853
1854 default_file_start ();
1855
1856#ifdef TARGET_BI_ARCH
1857 if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
1858 default_cpu = 0;
1859#endif
3cfa4909
MM
1860
1861 if (flag_verbose_asm)
1862 {
1863 sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
1864 rs6000_select[0].string = default_cpu;
1865
b6a1cbae 1866 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
3cfa4909
MM
1867 {
1868 ptr = &rs6000_select[i];
1869 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
1870 {
1871 fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
1872 start = "";
1873 }
1874 }
1875
9c6b4ed9 1876 if (PPC405_ERRATUM77)
b0bfee6e 1877 {
9c6b4ed9 1878 fprintf (file, "%s PPC405CR_ERRATUM77", start);
b0bfee6e
DE
1879 start = "";
1880 }
b0bfee6e 1881
b91da81f 1882#ifdef USING_ELFOS_H
3cfa4909
MM
1883 switch (rs6000_sdata)
1884 {
1885 case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
1886 case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
1887 case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
1888 case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
1889 }
1890
1891 if (rs6000_sdata && g_switch_value)
1892 {
307b599c
MK
1893 fprintf (file, "%s -G " HOST_WIDE_INT_PRINT_UNSIGNED, start,
1894 g_switch_value);
3cfa4909
MM
1895 start = "";
1896 }
1897#endif
1898
1899 if (*start == '\0')
949ea356 1900 putc ('\n', file);
3cfa4909 1901 }
b723e82f
JJ
1902
1903 if (DEFAULT_ABI == ABI_AIX || (TARGET_ELF && flag_pic == 2))
1904 {
1905 toc_section ();
1906 text_section ();
1907 }
3cfa4909 1908}
c4e18b1c 1909
5248c961 1910\f
a0ab749a 1911/* Return nonzero if this function is known to have a null epilogue. */
9878760c
RK
1912
1913int
863d938c 1914direct_return (void)
9878760c 1915{
4697a36c
MM
1916 if (reload_completed)
1917 {
1918 rs6000_stack_t *info = rs6000_stack_info ();
1919
1920 if (info->first_gp_reg_save == 32
1921 && info->first_fp_reg_save == 64
00b960c7 1922 && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
c81fc13e
DE
1923 && ! info->lr_save_p
1924 && ! info->cr_save_p
00b960c7 1925 && info->vrsave_mask == 0
c81fc13e 1926 && ! info->push_p)
4697a36c
MM
1927 return 1;
1928 }
1929
1930 return 0;
9878760c
RK
1931}
1932
4e74d8ec
MM
1933/* Return the number of instructions it takes to form a constant in an
1934 integer register. */
1935
48d72335 1936int
a2369ed3 1937num_insns_constant_wide (HOST_WIDE_INT value)
4e74d8ec
MM
1938{
1939 /* signed constant loadable with {cal|addi} */
5f59ecb7 1940 if (CONST_OK_FOR_LETTER_P (value, 'I'))
0865c631
GK
1941 return 1;
1942
4e74d8ec 1943 /* constant loadable with {cau|addis} */
5f59ecb7 1944 else if (CONST_OK_FOR_LETTER_P (value, 'L'))
4e74d8ec
MM
1945 return 1;
1946
5f59ecb7 1947#if HOST_BITS_PER_WIDE_INT == 64
c81fc13e 1948 else if (TARGET_POWERPC64)
4e74d8ec 1949 {
a65c591c
DE
1950 HOST_WIDE_INT low = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
1951 HOST_WIDE_INT high = value >> 31;
4e74d8ec 1952
a65c591c 1953 if (high == 0 || high == -1)
4e74d8ec
MM
1954 return 2;
1955
a65c591c 1956 high >>= 1;
4e74d8ec 1957
a65c591c 1958 if (low == 0)
4e74d8ec 1959 return num_insns_constant_wide (high) + 1;
4e74d8ec
MM
1960 else
1961 return (num_insns_constant_wide (high)
e396202a 1962 + num_insns_constant_wide (low) + 1);
4e74d8ec
MM
1963 }
1964#endif
1965
1966 else
1967 return 2;
1968}
1969
1970int
a2369ed3 1971num_insns_constant (rtx op, enum machine_mode mode)
4e74d8ec 1972{
37409796
NS
1973 HOST_WIDE_INT low, high;
1974
1975 switch (GET_CODE (op))
0d30d435 1976 {
37409796 1977 case CONST_INT:
0d30d435 1978#if HOST_BITS_PER_WIDE_INT == 64
4e2c1c44 1979 if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
4ae234b0 1980 && mask_operand (op, mode))
c4ad648e 1981 return 2;
0d30d435
DE
1982 else
1983#endif
1984 return num_insns_constant_wide (INTVAL (op));
4e74d8ec 1985
37409796
NS
1986 case CONST_DOUBLE:
1987 if (mode == SFmode)
1988 {
1989 long l;
1990 REAL_VALUE_TYPE rv;
1991
1992 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1993 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
1994 return num_insns_constant_wide ((HOST_WIDE_INT) l);
1995 }
a260abc9 1996
37409796
NS
1997 if (mode == VOIDmode || mode == DImode)
1998 {
1999 high = CONST_DOUBLE_HIGH (op);
2000 low = CONST_DOUBLE_LOW (op);
2001 }
2002 else
2003 {
2004 long l[2];
2005 REAL_VALUE_TYPE rv;
2006
2007 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
2008 REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
2009 high = l[WORDS_BIG_ENDIAN == 0];
2010 low = l[WORDS_BIG_ENDIAN != 0];
2011 }
47ad8c61 2012
37409796
NS
2013 if (TARGET_32BIT)
2014 return (num_insns_constant_wide (low)
2015 + num_insns_constant_wide (high));
2016 else
2017 {
2018 if ((high == 0 && low >= 0)
2019 || (high == -1 && low < 0))
2020 return num_insns_constant_wide (low);
2021
4ae234b0 2022 else if (mask_operand (op, mode))
37409796
NS
2023 return 2;
2024
2025 else if (low == 0)
2026 return num_insns_constant_wide (high) + 1;
2027
2028 else
2029 return (num_insns_constant_wide (high)
2030 + num_insns_constant_wide (low) + 1);
2031 }
2032
2033 default:
2034 gcc_unreachable ();
4e74d8ec 2035 }
4e74d8ec
MM
2036}
2037
effa5d5d 2038/* Returns the constant for the splat instruction, if exists. */
452a7d36 2039
48d72335 2040int
452a7d36
HP
2041easy_vector_splat_const (int cst, enum machine_mode mode)
2042{
f676971a 2043 switch (mode)
452a7d36
HP
2044 {
2045 case V4SImode:
f676971a
EC
2046 if (EASY_VECTOR_15 (cst)
2047 || EASY_VECTOR_15_ADD_SELF (cst))
452a7d36
HP
2048 return cst;
2049 if ((cst & 0xffff) != ((cst >> 16) & 0xffff))
2050 break;
2051 cst = cst >> 16;
c4ad648e
AM
2052 /* Fall thru */
2053
452a7d36 2054 case V8HImode:
f676971a
EC
2055 if (EASY_VECTOR_15 (cst)
2056 || EASY_VECTOR_15_ADD_SELF (cst))
452a7d36
HP
2057 return cst;
2058 if ((cst & 0xff) != ((cst >> 8) & 0xff))
2059 break;
2060 cst = cst >> 8;
c4ad648e
AM
2061 /* Fall thru */
2062
452a7d36 2063 case V16QImode:
c4ad648e
AM
2064 if (EASY_VECTOR_15 (cst)
2065 || EASY_VECTOR_15_ADD_SELF (cst))
2066 return cst;
f676971a 2067 default:
452a7d36
HP
2068 break;
2069 }
2070 return 0;
2071}
2072
72ac76be 2073/* Return nonzero if all elements of a vector have the same value. */
69ef87e2 2074
48d72335 2075int
a2369ed3 2076easy_vector_same (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
d744e06e
AH
2077{
2078 int units, i, cst;
2079
2080 units = CONST_VECTOR_NUNITS (op);
2081
2082 cst = INTVAL (CONST_VECTOR_ELT (op, 0));
2083 for (i = 1; i < units; ++i)
2084 if (INTVAL (CONST_VECTOR_ELT (op, i)) != cst)
2085 break;
452a7d36 2086 if (i == units && easy_vector_splat_const (cst, mode))
d744e06e
AH
2087 return 1;
2088 return 0;
2089}
2090
452a7d36 2091/* Generate easy_vector_constant out of a easy_vector_constant_add_self. */
d744e06e 2092
f676971a 2093rtx
452a7d36
HP
2094gen_easy_vector_constant_add_self (rtx op)
2095{
2096 int i, units;
2097 rtvec v;
2098 units = GET_MODE_NUNITS (GET_MODE (op));
2099 v = rtvec_alloc (units);
2100
2101 for (i = 0; i < units; i++)
f676971a 2102 RTVEC_ELT (v, i) =
452a7d36
HP
2103 GEN_INT (INTVAL (CONST_VECTOR_ELT (op, i)) >> 1);
2104 return gen_rtx_raw_CONST_VECTOR (GET_MODE (op), v);
d744e06e
AH
2105}
2106
2107const char *
a2369ed3 2108output_vec_const_move (rtx *operands)
d744e06e
AH
2109{
2110 int cst, cst2;
2111 enum machine_mode mode;
2112 rtx dest, vec;
2113
2114 dest = operands[0];
2115 vec = operands[1];
69ef87e2 2116
d744e06e
AH
2117 cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
2118 cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
2119 mode = GET_MODE (dest);
69ef87e2 2120
d744e06e
AH
2121 if (TARGET_ALTIVEC)
2122 {
2123 if (zero_constant (vec, mode))
2124 return "vxor %0,%0,%0";
37409796
NS
2125
2126 gcc_assert (easy_vector_constant (vec, mode));
2127
2128 operands[1] = GEN_INT (cst);
2129 switch (mode)
98ef3137 2130 {
37409796
NS
2131 case V4SImode:
2132 if (EASY_VECTOR_15 (cst))
d744e06e 2133 {
37409796
NS
2134 operands[1] = GEN_INT (cst);
2135 return "vspltisw %0,%1";
2136 }
2137 else if (EASY_VECTOR_15_ADD_SELF (cst))
2138 return "#";
2139 cst = cst >> 16;
2140 /* Fall thru */
c4ad648e 2141
37409796
NS
2142 case V8HImode:
2143 if (EASY_VECTOR_15 (cst))
2144 {
2145 operands[1] = GEN_INT (cst);
2146 return "vspltish %0,%1";
2147 }
2148 else if (EASY_VECTOR_15_ADD_SELF (cst))
2149 return "#";
2150 cst = cst >> 8;
2151 /* Fall thru */
c4ad648e 2152
37409796
NS
2153 case V16QImode:
2154 if (EASY_VECTOR_15 (cst))
2155 {
2156 operands[1] = GEN_INT (cst);
2157 return "vspltisb %0,%1";
d744e06e 2158 }
37409796
NS
2159 else if (EASY_VECTOR_15_ADD_SELF (cst))
2160 return "#";
2161
2162 default:
2163 gcc_unreachable ();
98ef3137 2164 }
69ef87e2
AH
2165 }
2166
37409796
NS
2167 gcc_assert (TARGET_SPE);
2168
2169 /* Vector constant 0 is handled as a splitter of V2SI, and in the
2170 pattern of V1DI, V4HI, and V2SF.
2171
2172 FIXME: We should probably return # and add post reload
2173 splitters for these, but this way is so easy ;-). */
2174 operands[1] = GEN_INT (cst);
2175 operands[2] = GEN_INT (cst2);
2176 if (cst == cst2)
2177 return "li %0,%1\n\tevmergelo %0,%0,%0";
2178 else
2179 return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
69ef87e2
AH
2180}
2181
914c2e77 2182int
e1e2e653
NS
2183mask64_1or2_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED,
2184 bool allow_one)
0ba1b2ff
AM
2185{
2186 if (GET_CODE (op) == CONST_INT)
a260abc9 2187 {
0ba1b2ff 2188 HOST_WIDE_INT c, lsb;
e1e2e653
NS
2189 bool one_ok;
2190
0ba1b2ff 2191 c = INTVAL (op);
a260abc9 2192
0ba1b2ff
AM
2193 /* Disallow all zeros. */
2194 if (c == 0)
2195 return 0;
a260abc9 2196
e1e2e653
NS
2197 /* We can use a single rlwinm insn if no upper bits of C are set
2198 AND there are zero, one or two transitions in the _whole_ of
2199 C. */
2200 one_ok = !(c & ~(HOST_WIDE_INT)0xffffffff);
2201
0ba1b2ff
AM
2202 /* We don't change the number of transitions by inverting,
2203 so make sure we start with the LS bit zero. */
2204 if (c & 1)
2205 c = ~c;
a260abc9 2206
0ba1b2ff
AM
2207 /* Find the first transition. */
2208 lsb = c & -c;
a260abc9 2209
0ba1b2ff
AM
2210 /* Invert to look for a second transition. */
2211 c = ~c;
2212
2213 /* Erase first transition. */
2214 c &= -lsb;
2215
2216 /* Find the second transition. */
2217 lsb = c & -c;
2218
2219 /* Invert to look for a third transition. */
2220 c = ~c;
2221
2222 /* Erase second transition. */
2223 c &= -lsb;
2224
e1e2e653
NS
2225 if (one_ok && !(allow_one || c))
2226 return 0;
2227
0ba1b2ff
AM
2228 /* Find the third transition (if any). */
2229 lsb = c & -c;
2230
2231 /* Match if all the bits above are 1's (or c is zero). */
2232 return c == -lsb;
2233 }
2234 return 0;
2235}
2236
2237/* Generates shifts and masks for a pair of rldicl or rldicr insns to
2238 implement ANDing by the mask IN. */
2239void
a2369ed3 2240build_mask64_2_operands (rtx in, rtx *out)
0ba1b2ff
AM
2241{
2242#if HOST_BITS_PER_WIDE_INT >= 64
2243 unsigned HOST_WIDE_INT c, lsb, m1, m2;
2244 int shift;
2245
37409796 2246 gcc_assert (GET_CODE (in) == CONST_INT);
0ba1b2ff
AM
2247
2248 c = INTVAL (in);
2249 if (c & 1)
2250 {
2251 /* Assume c initially something like 0x00fff000000fffff. The idea
2252 is to rotate the word so that the middle ^^^^^^ group of zeros
2253 is at the MS end and can be cleared with an rldicl mask. We then
2254 rotate back and clear off the MS ^^ group of zeros with a
2255 second rldicl. */
2256 c = ~c; /* c == 0xff000ffffff00000 */
2257 lsb = c & -c; /* lsb == 0x0000000000100000 */
2258 m1 = -lsb; /* m1 == 0xfffffffffff00000 */
2259 c = ~c; /* c == 0x00fff000000fffff */
2260 c &= -lsb; /* c == 0x00fff00000000000 */
2261 lsb = c & -c; /* lsb == 0x0000100000000000 */
2262 c = ~c; /* c == 0xff000fffffffffff */
2263 c &= -lsb; /* c == 0xff00000000000000 */
2264 shift = 0;
2265 while ((lsb >>= 1) != 0)
2266 shift++; /* shift == 44 on exit from loop */
2267 m1 <<= 64 - shift; /* m1 == 0xffffff0000000000 */
2268 m1 = ~m1; /* m1 == 0x000000ffffffffff */
2269 m2 = ~c; /* m2 == 0x00ffffffffffffff */
a260abc9
DE
2270 }
2271 else
0ba1b2ff
AM
2272 {
2273 /* Assume c initially something like 0xff000f0000000000. The idea
2274 is to rotate the word so that the ^^^ middle group of zeros
2275 is at the LS end and can be cleared with an rldicr mask. We then
2276 rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
2277 a second rldicr. */
2278 lsb = c & -c; /* lsb == 0x0000010000000000 */
2279 m2 = -lsb; /* m2 == 0xffffff0000000000 */
2280 c = ~c; /* c == 0x00fff0ffffffffff */
2281 c &= -lsb; /* c == 0x00fff00000000000 */
2282 lsb = c & -c; /* lsb == 0x0000100000000000 */
2283 c = ~c; /* c == 0xff000fffffffffff */
2284 c &= -lsb; /* c == 0xff00000000000000 */
2285 shift = 0;
2286 while ((lsb >>= 1) != 0)
2287 shift++; /* shift == 44 on exit from loop */
2288 m1 = ~c; /* m1 == 0x00ffffffffffffff */
2289 m1 >>= shift; /* m1 == 0x0000000000000fff */
2290 m1 = ~m1; /* m1 == 0xfffffffffffff000 */
2291 }
2292
2293 /* Note that when we only have two 0->1 and 1->0 transitions, one of the
2294 masks will be all 1's. We are guaranteed more than one transition. */
2295 out[0] = GEN_INT (64 - shift);
2296 out[1] = GEN_INT (m1);
2297 out[2] = GEN_INT (shift);
2298 out[3] = GEN_INT (m2);
2299#else
045572c7
GK
2300 (void)in;
2301 (void)out;
37409796 2302 gcc_unreachable ();
0ba1b2ff 2303#endif
a260abc9
DE
2304}
2305
54b695e7 2306/* Return TRUE if OP is an invalid SUBREG operation on the e500. */
48d72335
DE
2307
2308bool
54b695e7
AH
2309invalid_e500_subreg (rtx op, enum machine_mode mode)
2310{
2311 /* Reject (subreg:SI (reg:DF)). */
2312 if (GET_CODE (op) == SUBREG
2313 && mode == SImode
2314 && REG_P (SUBREG_REG (op))
2315 && GET_MODE (SUBREG_REG (op)) == DFmode)
2316 return true;
2317
2318 /* Reject (subreg:DF (reg:DI)). */
2319 if (GET_CODE (op) == SUBREG
2320 && mode == DFmode
2321 && REG_P (SUBREG_REG (op))
2322 && GET_MODE (SUBREG_REG (op)) == DImode)
2323 return true;
2324
2325 return false;
2326}
2327
95727fb8
AP
2328/* Darwin, AIX increases natural record alignment to doubleword if the first
2329 field is an FP double while the FP fields remain word aligned. */
2330
19d66194 2331unsigned int
95727fb8
AP
2332rs6000_special_round_type_align (tree type, int computed, int specified)
2333{
2334 tree field = TYPE_FIELDS (type);
95727fb8 2335
85962ac8
AP
2336 /* Skip all non field decls */
2337 while (field != NULL && TREE_CODE (field) != FIELD_DECL)
95727fb8
AP
2338 field = TREE_CHAIN (field);
2339
3ce5437a 2340 if (field == NULL || field == type || DECL_MODE (field) != DFmode)
95727fb8
AP
2341 return MAX (computed, specified);
2342
2343 return MAX (MAX (computed, specified), 64);
2344}
2345
a4f6c312 2346/* Return 1 for an operand in small memory on V.4/eabi. */
7509c759
MM
2347
2348int
f676971a 2349small_data_operand (rtx op ATTRIBUTE_UNUSED,
a2369ed3 2350 enum machine_mode mode ATTRIBUTE_UNUSED)
7509c759 2351{
38c1f2d7 2352#if TARGET_ELF
5f59ecb7 2353 rtx sym_ref;
7509c759 2354
d9407988 2355 if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
a54d04b7 2356 return 0;
a54d04b7 2357
f607bc57 2358 if (DEFAULT_ABI != ABI_V4)
7509c759
MM
2359 return 0;
2360
88228c4b
MM
2361 if (GET_CODE (op) == SYMBOL_REF)
2362 sym_ref = op;
2363
2364 else if (GET_CODE (op) != CONST
2365 || GET_CODE (XEXP (op, 0)) != PLUS
2366 || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
2367 || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
7509c759
MM
2368 return 0;
2369
88228c4b 2370 else
dbf55e53
MM
2371 {
2372 rtx sum = XEXP (op, 0);
2373 HOST_WIDE_INT summand;
2374
2375 /* We have to be careful here, because it is the referenced address
c4ad648e 2376 that must be 32k from _SDA_BASE_, not just the symbol. */
dbf55e53 2377 summand = INTVAL (XEXP (sum, 1));
307b599c 2378 if (summand < 0 || (unsigned HOST_WIDE_INT) summand > g_switch_value)
9390387d 2379 return 0;
dbf55e53
MM
2380
2381 sym_ref = XEXP (sum, 0);
2382 }
88228c4b 2383
20bfcd69 2384 return SYMBOL_REF_SMALL_P (sym_ref);
d9407988
MM
2385#else
2386 return 0;
2387#endif
7509c759 2388}
46c07df8 2389
3a1f863f 2390/* Return true if either operand is a general purpose register. */
46c07df8 2391
3a1f863f
DE
2392bool
2393gpr_or_gpr_p (rtx op0, rtx op1)
46c07df8 2394{
3a1f863f
DE
2395 return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
2396 || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
46c07df8
HP
2397}
2398
9ebbca7d 2399\f
4d588c14
RH
2400/* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address. */
2401
f676971a
EC
2402static int
2403constant_pool_expr_1 (rtx op, int *have_sym, int *have_toc)
9ebbca7d 2404{
9390387d 2405 switch (GET_CODE (op))
9ebbca7d
GK
2406 {
2407 case SYMBOL_REF:
c4501e62
JJ
2408 if (RS6000_SYMBOL_REF_TLS_P (op))
2409 return 0;
2410 else if (CONSTANT_POOL_ADDRESS_P (op))
a4f6c312
SS
2411 {
2412 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (op), Pmode))
2413 {
2414 *have_sym = 1;
2415 return 1;
2416 }
2417 else
2418 return 0;
2419 }
2420 else if (! strcmp (XSTR (op, 0), toc_label_name))
2421 {
2422 *have_toc = 1;
2423 return 1;
2424 }
2425 else
2426 return 0;
9ebbca7d
GK
2427 case PLUS:
2428 case MINUS:
c1f11548
DE
2429 return (constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc)
2430 && constant_pool_expr_1 (XEXP (op, 1), have_sym, have_toc));
9ebbca7d 2431 case CONST:
a4f6c312 2432 return constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc);
9ebbca7d 2433 case CONST_INT:
a4f6c312 2434 return 1;
9ebbca7d 2435 default:
a4f6c312 2436 return 0;
9ebbca7d
GK
2437 }
2438}
2439
4d588c14 2440static bool
a2369ed3 2441constant_pool_expr_p (rtx op)
9ebbca7d
GK
2442{
2443 int have_sym = 0;
2444 int have_toc = 0;
2445 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_sym;
2446}
2447
48d72335 2448bool
a2369ed3 2449toc_relative_expr_p (rtx op)
9ebbca7d 2450{
4d588c14
RH
2451 int have_sym = 0;
2452 int have_toc = 0;
2453 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_toc;
2454}
2455
4d588c14 2456bool
a2369ed3 2457legitimate_constant_pool_address_p (rtx x)
4d588c14
RH
2458{
2459 return (TARGET_TOC
2460 && GET_CODE (x) == PLUS
2461 && GET_CODE (XEXP (x, 0)) == REG
2462 && (TARGET_MINIMAL_TOC || REGNO (XEXP (x, 0)) == TOC_REGISTER)
2463 && constant_pool_expr_p (XEXP (x, 1)));
2464}
2465
2466static bool
a2369ed3 2467legitimate_small_data_p (enum machine_mode mode, rtx x)
4d588c14
RH
2468{
2469 return (DEFAULT_ABI == ABI_V4
2470 && !flag_pic && !TARGET_TOC
2471 && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
2472 && small_data_operand (x, mode));
2473}
2474
60cdabab
DE
2475/* SPE offset addressing is limited to 5-bits worth of double words. */
2476#define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
2477
76d2b81d
DJ
2478bool
2479rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
4d588c14
RH
2480{
2481 unsigned HOST_WIDE_INT offset, extra;
2482
2483 if (GET_CODE (x) != PLUS)
2484 return false;
2485 if (GET_CODE (XEXP (x, 0)) != REG)
2486 return false;
2487 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
2488 return false;
60cdabab
DE
2489 if (legitimate_constant_pool_address_p (x))
2490 return true;
4d588c14
RH
2491 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
2492 return false;
2493
2494 offset = INTVAL (XEXP (x, 1));
2495 extra = 0;
2496 switch (mode)
2497 {
2498 case V16QImode:
2499 case V8HImode:
2500 case V4SFmode:
2501 case V4SImode:
2502 /* AltiVec vector modes. Only reg+reg addressing is valid here,
2503 which leaves the only valid constant offset of zero, which by
2504 canonicalization rules is also invalid. */
2505 return false;
2506
2507 case V4HImode:
2508 case V2SImode:
2509 case V1DImode:
2510 case V2SFmode:
2511 /* SPE vector modes. */
2512 return SPE_CONST_OFFSET_OK (offset);
2513
2514 case DFmode:
4d4cbc0e
AH
2515 if (TARGET_E500_DOUBLE)
2516 return SPE_CONST_OFFSET_OK (offset);
2517
4d588c14 2518 case DImode:
54b695e7
AH
2519 /* On e500v2, we may have:
2520
2521 (subreg:DF (mem:DI (plus (reg) (const_int))) 0).
2522
2523 Which gets addressed with evldd instructions. */
2524 if (TARGET_E500_DOUBLE)
2525 return SPE_CONST_OFFSET_OK (offset);
2526
3364872d 2527 if (mode == DFmode || !TARGET_POWERPC64)
4d588c14
RH
2528 extra = 4;
2529 else if (offset & 3)
2530 return false;
2531 break;
2532
2533 case TFmode:
2534 case TImode:
3364872d 2535 if (mode == TFmode || !TARGET_POWERPC64)
4d588c14
RH
2536 extra = 12;
2537 else if (offset & 3)
2538 return false;
2539 else
2540 extra = 8;
2541 break;
2542
2543 default:
2544 break;
2545 }
2546
b1917422
AM
2547 offset += 0x8000;
2548 return (offset < 0x10000) && (offset + extra < 0x10000);
4d588c14
RH
2549}
2550
2551static bool
a2369ed3 2552legitimate_indexed_address_p (rtx x, int strict)
4d588c14
RH
2553{
2554 rtx op0, op1;
2555
2556 if (GET_CODE (x) != PLUS)
2557 return false;
850e8d3d 2558
4d588c14
RH
2559 op0 = XEXP (x, 0);
2560 op1 = XEXP (x, 1);
2561
2562 if (!REG_P (op0) || !REG_P (op1))
2563 return false;
2564
2565 return ((INT_REG_OK_FOR_BASE_P (op0, strict)
2566 && INT_REG_OK_FOR_INDEX_P (op1, strict))
2567 || (INT_REG_OK_FOR_BASE_P (op1, strict)
2568 && INT_REG_OK_FOR_INDEX_P (op0, strict)));
9ebbca7d
GK
2569}
2570
48d72335 2571inline bool
a2369ed3 2572legitimate_indirect_address_p (rtx x, int strict)
4d588c14
RH
2573{
2574 return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
2575}
2576
48d72335 2577bool
4c81e946
FJ
2578macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
2579{
c4ad648e 2580 if (!TARGET_MACHO || !flag_pic
9390387d 2581 || mode != SImode || GET_CODE (x) != MEM)
c4ad648e
AM
2582 return false;
2583 x = XEXP (x, 0);
4c81e946
FJ
2584
2585 if (GET_CODE (x) != LO_SUM)
2586 return false;
2587 if (GET_CODE (XEXP (x, 0)) != REG)
2588 return false;
2589 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
2590 return false;
2591 x = XEXP (x, 1);
2592
2593 return CONSTANT_P (x);
2594}
2595
4d588c14 2596static bool
a2369ed3 2597legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
4d588c14
RH
2598{
2599 if (GET_CODE (x) != LO_SUM)
2600 return false;
2601 if (GET_CODE (XEXP (x, 0)) != REG)
2602 return false;
2603 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
2604 return false;
54b695e7
AH
2605 /* Restrict addressing for DI because of our SUBREG hackery. */
2606 if (TARGET_E500_DOUBLE && (mode == DFmode || mode == DImode))
f82f556d 2607 return false;
4d588c14
RH
2608 x = XEXP (x, 1);
2609
8622e235 2610 if (TARGET_ELF || TARGET_MACHO)
4d588c14 2611 {
a29077da 2612 if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
4d588c14
RH
2613 return false;
2614 if (TARGET_TOC)
2615 return false;
2616 if (GET_MODE_NUNITS (mode) != 1)
2617 return false;
5e5f01b9 2618 if (GET_MODE_BITSIZE (mode) > 64
3c028f65
AM
2619 || (GET_MODE_BITSIZE (mode) > 32 && !TARGET_POWERPC64
2620 && !(TARGET_HARD_FLOAT && TARGET_FPRS && mode == DFmode)))
4d588c14
RH
2621 return false;
2622
2623 return CONSTANT_P (x);
2624 }
2625
2626 return false;
2627}
2628
2629
9ebbca7d
GK
2630/* Try machine-dependent ways of modifying an illegitimate address
2631 to be legitimate. If we find one, return the new, valid address.
2632 This is used from only one place: `memory_address' in explow.c.
2633
a4f6c312
SS
2634 OLDX is the address as it was before break_out_memory_refs was
2635 called. In some cases it is useful to look at this to decide what
2636 needs to be done.
9ebbca7d 2637
a4f6c312 2638 MODE is passed so that this function can use GO_IF_LEGITIMATE_ADDRESS.
9ebbca7d 2639
a4f6c312
SS
2640 It is always safe for this function to do nothing. It exists to
2641 recognize opportunities to optimize the output.
9ebbca7d
GK
2642
2643 On RS/6000, first check for the sum of a register with a constant
2644 integer that is out of range. If so, generate code to add the
2645 constant with the low-order 16 bits masked to the register and force
2646 this result into another register (this can be done with `cau').
2647 Then generate an address of REG+(CONST&0xffff), allowing for the
2648 possibility of bit 16 being a one.
2649
2650 Then check for the sum of a register and something not constant, try to
2651 load the other things into a register and return the sum. */
4d588c14 2652
9ebbca7d 2653rtx
a2369ed3
DJ
2654rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
2655 enum machine_mode mode)
0ac081f6 2656{
c4501e62
JJ
2657 if (GET_CODE (x) == SYMBOL_REF)
2658 {
2659 enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
2660 if (model != 0)
2661 return rs6000_legitimize_tls_address (x, model);
2662 }
2663
f676971a 2664 if (GET_CODE (x) == PLUS
9ebbca7d
GK
2665 && GET_CODE (XEXP (x, 0)) == REG
2666 && GET_CODE (XEXP (x, 1)) == CONST_INT
2667 && (unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000) >= 0x10000)
f676971a 2668 {
9ebbca7d
GK
2669 HOST_WIDE_INT high_int, low_int;
2670 rtx sum;
a65c591c
DE
2671 low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
2672 high_int = INTVAL (XEXP (x, 1)) - low_int;
9ebbca7d
GK
2673 sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
2674 GEN_INT (high_int)), 0);
2675 return gen_rtx_PLUS (Pmode, sum, GEN_INT (low_int));
2676 }
f676971a 2677 else if (GET_CODE (x) == PLUS
9ebbca7d
GK
2678 && GET_CODE (XEXP (x, 0)) == REG
2679 && GET_CODE (XEXP (x, 1)) != CONST_INT
6ac7bf2c 2680 && GET_MODE_NUNITS (mode) == 1
a3170dc6
AH
2681 && ((TARGET_HARD_FLOAT && TARGET_FPRS)
2682 || TARGET_POWERPC64
54b695e7
AH
2683 || (((mode != DImode && mode != DFmode) || TARGET_E500_DOUBLE)
2684 && mode != TFmode))
9ebbca7d
GK
2685 && (TARGET_POWERPC64 || mode != DImode)
2686 && mode != TImode)
2687 {
2688 return gen_rtx_PLUS (Pmode, XEXP (x, 0),
2689 force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
2690 }
0ac081f6
AH
2691 else if (ALTIVEC_VECTOR_MODE (mode))
2692 {
2693 rtx reg;
2694
2695 /* Make sure both operands are registers. */
2696 if (GET_CODE (x) == PLUS)
9f85ed45 2697 return gen_rtx_PLUS (Pmode, force_reg (Pmode, XEXP (x, 0)),
0ac081f6
AH
2698 force_reg (Pmode, XEXP (x, 1)));
2699
2700 reg = force_reg (Pmode, x);
2701 return reg;
2702 }
4d4cbc0e 2703 else if (SPE_VECTOR_MODE (mode)
54b695e7
AH
2704 || (TARGET_E500_DOUBLE && (mode == DFmode
2705 || mode == DImode)))
a3170dc6 2706 {
54b695e7
AH
2707 if (mode == DImode)
2708 return NULL_RTX;
a3170dc6
AH
2709 /* We accept [reg + reg] and [reg + OFFSET]. */
2710
2711 if (GET_CODE (x) == PLUS)
c4ad648e
AM
2712 {
2713 rtx op1 = XEXP (x, 0);
2714 rtx op2 = XEXP (x, 1);
a3170dc6 2715
c4ad648e 2716 op1 = force_reg (Pmode, op1);
a3170dc6 2717
c4ad648e
AM
2718 if (GET_CODE (op2) != REG
2719 && (GET_CODE (op2) != CONST_INT
2720 || !SPE_CONST_OFFSET_OK (INTVAL (op2))))
2721 op2 = force_reg (Pmode, op2);
a3170dc6 2722
c4ad648e
AM
2723 return gen_rtx_PLUS (Pmode, op1, op2);
2724 }
a3170dc6
AH
2725
2726 return force_reg (Pmode, x);
2727 }
f1384257
AM
2728 else if (TARGET_ELF
2729 && TARGET_32BIT
2730 && TARGET_NO_TOC
2731 && ! flag_pic
9ebbca7d 2732 && GET_CODE (x) != CONST_INT
f676971a 2733 && GET_CODE (x) != CONST_DOUBLE
9ebbca7d 2734 && CONSTANT_P (x)
6ac7bf2c
GK
2735 && GET_MODE_NUNITS (mode) == 1
2736 && (GET_MODE_BITSIZE (mode) <= 32
a3170dc6 2737 || ((TARGET_HARD_FLOAT && TARGET_FPRS) && mode == DFmode)))
9ebbca7d
GK
2738 {
2739 rtx reg = gen_reg_rtx (Pmode);
8a1977f3
GK
2740 emit_insn (gen_elf_high (reg, x));
2741 return gen_rtx_LO_SUM (Pmode, reg, x);
9ebbca7d 2742 }
ee890fe2
SS
2743 else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
2744 && ! flag_pic
ab82a49f
AP
2745#if TARGET_MACHO
2746 && ! MACHO_DYNAMIC_NO_PIC_P
2747#endif
ee890fe2 2748 && GET_CODE (x) != CONST_INT
f676971a 2749 && GET_CODE (x) != CONST_DOUBLE
ee890fe2 2750 && CONSTANT_P (x)
f82f556d 2751 && ((TARGET_HARD_FLOAT && TARGET_FPRS) || mode != DFmode)
f676971a 2752 && mode != DImode
ee890fe2
SS
2753 && mode != TImode)
2754 {
2755 rtx reg = gen_reg_rtx (Pmode);
8a1977f3
GK
2756 emit_insn (gen_macho_high (reg, x));
2757 return gen_rtx_LO_SUM (Pmode, reg, x);
ee890fe2 2758 }
f676971a 2759 else if (TARGET_TOC
4d588c14 2760 && constant_pool_expr_p (x)
a9098fd0 2761 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
9ebbca7d
GK
2762 {
2763 return create_TOC_reference (x);
2764 }
2765 else
2766 return NULL_RTX;
2767}
258bfae2 2768
fdbe66f2 2769/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
c973d557
JJ
2770 We need to emit DTP-relative relocations. */
2771
fdbe66f2 2772static void
c973d557
JJ
2773rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
2774{
2775 switch (size)
2776 {
2777 case 4:
2778 fputs ("\t.long\t", file);
2779 break;
2780 case 8:
2781 fputs (DOUBLE_INT_ASM_OP, file);
2782 break;
2783 default:
37409796 2784 gcc_unreachable ();
c973d557
JJ
2785 }
2786 output_addr_const (file, x);
2787 fputs ("@dtprel+0x8000", file);
2788}
2789
c4501e62
JJ
2790/* Construct the SYMBOL_REF for the tls_get_addr function. */
2791
2792static GTY(()) rtx rs6000_tls_symbol;
2793static rtx
863d938c 2794rs6000_tls_get_addr (void)
c4501e62
JJ
2795{
2796 if (!rs6000_tls_symbol)
2797 rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
2798
2799 return rs6000_tls_symbol;
2800}
2801
2802/* Construct the SYMBOL_REF for TLS GOT references. */
2803
2804static GTY(()) rtx rs6000_got_symbol;
2805static rtx
863d938c 2806rs6000_got_sym (void)
c4501e62
JJ
2807{
2808 if (!rs6000_got_symbol)
2809 {
2810 rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
2811 SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
2812 SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
f676971a 2813 }
c4501e62
JJ
2814
2815 return rs6000_got_symbol;
2816}
2817
2818/* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
2819 this (thread-local) address. */
2820
2821static rtx
a2369ed3 2822rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
c4501e62
JJ
2823{
2824 rtx dest, insn;
2825
2826 dest = gen_reg_rtx (Pmode);
2827 if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
2828 {
2829 rtx tlsreg;
2830
2831 if (TARGET_64BIT)
2832 {
2833 tlsreg = gen_rtx_REG (Pmode, 13);
2834 insn = gen_tls_tprel_64 (dest, tlsreg, addr);
2835 }
2836 else
2837 {
2838 tlsreg = gen_rtx_REG (Pmode, 2);
2839 insn = gen_tls_tprel_32 (dest, tlsreg, addr);
2840 }
2841 emit_insn (insn);
2842 }
2843 else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
2844 {
2845 rtx tlsreg, tmp;
2846
2847 tmp = gen_reg_rtx (Pmode);
2848 if (TARGET_64BIT)
2849 {
2850 tlsreg = gen_rtx_REG (Pmode, 13);
2851 insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
2852 }
2853 else
2854 {
2855 tlsreg = gen_rtx_REG (Pmode, 2);
2856 insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
2857 }
2858 emit_insn (insn);
2859 if (TARGET_64BIT)
2860 insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
2861 else
2862 insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
2863 emit_insn (insn);
2864 }
2865 else
2866 {
2867 rtx r3, got, tga, tmp1, tmp2, eqv;
2868
2869 if (TARGET_64BIT)
2870 got = gen_rtx_REG (Pmode, TOC_REGISTER);
2871 else
2872 {
2873 if (flag_pic == 1)
2874 got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
2875 else
2876 {
2877 rtx gsym = rs6000_got_sym ();
2878 got = gen_reg_rtx (Pmode);
2879 if (flag_pic == 0)
2880 rs6000_emit_move (got, gsym, Pmode);
2881 else
2882 {
ccbca5e4 2883 rtx tempLR, tmp3, mem;
c4501e62
JJ
2884 rtx first, last;
2885
c4501e62
JJ
2886 tempLR = gen_reg_rtx (Pmode);
2887 tmp1 = gen_reg_rtx (Pmode);
2888 tmp2 = gen_reg_rtx (Pmode);
2889 tmp3 = gen_reg_rtx (Pmode);
542a8afa 2890 mem = gen_const_mem (Pmode, tmp1);
c4501e62 2891
ccbca5e4 2892 first = emit_insn (gen_load_toc_v4_PIC_1b (tempLR, gsym));
c4501e62
JJ
2893 emit_move_insn (tmp1, tempLR);
2894 emit_move_insn (tmp2, mem);
2895 emit_insn (gen_addsi3 (tmp3, tmp1, tmp2));
2896 last = emit_move_insn (got, tmp3);
2897 REG_NOTES (last) = gen_rtx_EXPR_LIST (REG_EQUAL, gsym,
2898 REG_NOTES (last));
2899 REG_NOTES (first) = gen_rtx_INSN_LIST (REG_LIBCALL, last,
2900 REG_NOTES (first));
2901 REG_NOTES (last) = gen_rtx_INSN_LIST (REG_RETVAL, first,
2902 REG_NOTES (last));
2903 }
2904 }
2905 }
2906
2907 if (model == TLS_MODEL_GLOBAL_DYNAMIC)
2908 {
2909 r3 = gen_rtx_REG (Pmode, 3);
2910 if (TARGET_64BIT)
2911 insn = gen_tls_gd_64 (r3, got, addr);
2912 else
2913 insn = gen_tls_gd_32 (r3, got, addr);
2914 start_sequence ();
2915 emit_insn (insn);
2916 tga = gen_rtx_MEM (Pmode, rs6000_tls_get_addr ());
2917 insn = gen_call_value (r3, tga, const0_rtx, const0_rtx);
2918 insn = emit_call_insn (insn);
2919 CONST_OR_PURE_CALL_P (insn) = 1;
2920 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
2921 insn = get_insns ();
2922 end_sequence ();
2923 emit_libcall_block (insn, dest, r3, addr);
2924 }
2925 else if (model == TLS_MODEL_LOCAL_DYNAMIC)
2926 {
2927 r3 = gen_rtx_REG (Pmode, 3);
2928 if (TARGET_64BIT)
2929 insn = gen_tls_ld_64 (r3, got);
2930 else
2931 insn = gen_tls_ld_32 (r3, got);
2932 start_sequence ();
2933 emit_insn (insn);
2934 tga = gen_rtx_MEM (Pmode, rs6000_tls_get_addr ());
2935 insn = gen_call_value (r3, tga, const0_rtx, const0_rtx);
2936 insn = emit_call_insn (insn);
2937 CONST_OR_PURE_CALL_P (insn) = 1;
2938 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
2939 insn = get_insns ();
2940 end_sequence ();
2941 tmp1 = gen_reg_rtx (Pmode);
2942 eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
2943 UNSPEC_TLSLD);
2944 emit_libcall_block (insn, tmp1, r3, eqv);
2945 if (rs6000_tls_size == 16)
2946 {
2947 if (TARGET_64BIT)
2948 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
2949 else
2950 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
2951 }
2952 else if (rs6000_tls_size == 32)
2953 {
2954 tmp2 = gen_reg_rtx (Pmode);
2955 if (TARGET_64BIT)
2956 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
2957 else
2958 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
2959 emit_insn (insn);
2960 if (TARGET_64BIT)
2961 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
2962 else
2963 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
2964 }
2965 else
2966 {
2967 tmp2 = gen_reg_rtx (Pmode);
2968 if (TARGET_64BIT)
2969 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
2970 else
2971 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
2972 emit_insn (insn);
2973 insn = gen_rtx_SET (Pmode, dest,
2974 gen_rtx_PLUS (Pmode, tmp2, tmp1));
2975 }
2976 emit_insn (insn);
2977 }
2978 else
2979 {
2980 /* IE, or 64 bit offset LE. */
2981 tmp2 = gen_reg_rtx (Pmode);
2982 if (TARGET_64BIT)
2983 insn = gen_tls_got_tprel_64 (tmp2, got, addr);
2984 else
2985 insn = gen_tls_got_tprel_32 (tmp2, got, addr);
2986 emit_insn (insn);
2987 if (TARGET_64BIT)
2988 insn = gen_tls_tls_64 (dest, tmp2, addr);
2989 else
2990 insn = gen_tls_tls_32 (dest, tmp2, addr);
2991 emit_insn (insn);
2992 }
2993 }
2994
2995 return dest;
2996}
2997
c4501e62
JJ
2998/* Return 1 if X contains a thread-local symbol. */
2999
3000bool
a2369ed3 3001rs6000_tls_referenced_p (rtx x)
c4501e62 3002{
cd413cab
AP
3003 if (! TARGET_HAVE_TLS)
3004 return false;
3005
c4501e62
JJ
3006 return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
3007}
3008
3009/* Return 1 if *X is a thread-local symbol. This is the same as
3010 rs6000_tls_symbol_ref except for the type of the unused argument. */
3011
9390387d 3012static int
a2369ed3 3013rs6000_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
c4501e62
JJ
3014{
3015 return RS6000_SYMBOL_REF_TLS_P (*x);
3016}
3017
24ea750e
DJ
3018/* The convention appears to be to define this wherever it is used.
3019 With legitimize_reload_address now defined here, REG_MODE_OK_FOR_BASE_P
3020 is now used here. */
3021#ifndef REG_MODE_OK_FOR_BASE_P
3022#define REG_MODE_OK_FOR_BASE_P(REGNO, MODE) REG_OK_FOR_BASE_P (REGNO)
3023#endif
3024
3025/* Our implementation of LEGITIMIZE_RELOAD_ADDRESS. Returns a value to
3026 replace the input X, or the original X if no replacement is called for.
3027 The output parameter *WIN is 1 if the calling macro should goto WIN,
3028 0 if it should not.
3029
3030 For RS/6000, we wish to handle large displacements off a base
3031 register by splitting the addend across an addiu/addis and the mem insn.
3032 This cuts number of extra insns needed from 3 to 1.
3033
3034 On Darwin, we use this to generate code for floating point constants.
3035 A movsf_low is generated so we wind up with 2 instructions rather than 3.
3036 The Darwin code is inside #if TARGET_MACHO because only then is
3037 machopic_function_base_name() defined. */
3038rtx
f676971a 3039rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
c4ad648e
AM
3040 int opnum, int type,
3041 int ind_levels ATTRIBUTE_UNUSED, int *win)
24ea750e 3042{
f676971a 3043 /* We must recognize output that we have already generated ourselves. */
24ea750e
DJ
3044 if (GET_CODE (x) == PLUS
3045 && GET_CODE (XEXP (x, 0)) == PLUS
3046 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
3047 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3048 && GET_CODE (XEXP (x, 1)) == CONST_INT)
3049 {
3050 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
c4ad648e
AM
3051 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3052 opnum, (enum reload_type)type);
24ea750e
DJ
3053 *win = 1;
3054 return x;
3055 }
3deb2758 3056
24ea750e
DJ
3057#if TARGET_MACHO
3058 if (DEFAULT_ABI == ABI_DARWIN && flag_pic
3059 && GET_CODE (x) == LO_SUM
3060 && GET_CODE (XEXP (x, 0)) == PLUS
3061 && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
3062 && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
3063 && GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 0)) == CONST
3064 && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
3065 && GET_CODE (XEXP (XEXP (x, 1), 0)) == MINUS
3066 && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 0)) == SYMBOL_REF
3067 && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 1)) == SYMBOL_REF)
3068 {
3069 /* Result of previous invocation of this function on Darwin
6f317ef3 3070 floating point constant. */
24ea750e 3071 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
c4ad648e
AM
3072 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
3073 opnum, (enum reload_type)type);
24ea750e
DJ
3074 *win = 1;
3075 return x;
3076 }
3077#endif
4937d02d
DE
3078
3079 /* Force ld/std non-word aligned offset into base register by wrapping
3080 in offset 0. */
3081 if (GET_CODE (x) == PLUS
3082 && GET_CODE (XEXP (x, 0)) == REG
3083 && REGNO (XEXP (x, 0)) < 32
3084 && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
3085 && GET_CODE (XEXP (x, 1)) == CONST_INT
3086 && (INTVAL (XEXP (x, 1)) & 3) != 0
78796ad5 3087 && !ALTIVEC_VECTOR_MODE (mode)
4937d02d
DE
3088 && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
3089 && TARGET_POWERPC64)
3090 {
3091 x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
3092 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3093 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3094 opnum, (enum reload_type) type);
3095 *win = 1;
3096 return x;
3097 }
3098
24ea750e
DJ
3099 if (GET_CODE (x) == PLUS
3100 && GET_CODE (XEXP (x, 0)) == REG
3101 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
3102 && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
78c875e8 3103 && GET_CODE (XEXP (x, 1)) == CONST_INT
93638d7a 3104 && !SPE_VECTOR_MODE (mode)
54b695e7
AH
3105 && !(TARGET_E500_DOUBLE && (mode == DFmode
3106 || mode == DImode))
78c875e8 3107 && !ALTIVEC_VECTOR_MODE (mode))
24ea750e
DJ
3108 {
3109 HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
3110 HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
3111 HOST_WIDE_INT high
c4ad648e 3112 = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
24ea750e
DJ
3113
3114 /* Check for 32-bit overflow. */
3115 if (high + low != val)
c4ad648e 3116 {
24ea750e
DJ
3117 *win = 0;
3118 return x;
3119 }
3120
3121 /* Reload the high part into a base reg; leave the low part
c4ad648e 3122 in the mem directly. */
24ea750e
DJ
3123
3124 x = gen_rtx_PLUS (GET_MODE (x),
c4ad648e
AM
3125 gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
3126 GEN_INT (high)),
3127 GEN_INT (low));
24ea750e
DJ
3128
3129 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
c4ad648e
AM
3130 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3131 opnum, (enum reload_type)type);
24ea750e
DJ
3132 *win = 1;
3133 return x;
3134 }
4937d02d 3135
24ea750e
DJ
3136#if TARGET_MACHO
3137 if (GET_CODE (x) == SYMBOL_REF
3138 && DEFAULT_ABI == ABI_DARWIN
69ef87e2 3139 && !ALTIVEC_VECTOR_MODE (mode)
a29077da 3140 && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
0d8c1c97
AM
3141 /* Don't do this for TFmode, since the result isn't offsettable.
3142 The same goes for DImode without 64-bit gprs. */
3143 && mode != TFmode
3144 && (mode != DImode || TARGET_POWERPC64))
24ea750e 3145 {
a29077da
GK
3146 if (flag_pic)
3147 {
3148 rtx offset = gen_rtx_CONST (Pmode,
3149 gen_rtx_MINUS (Pmode, x,
11abc112 3150 machopic_function_base_sym ()));
a29077da
GK
3151 x = gen_rtx_LO_SUM (GET_MODE (x),
3152 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
3153 gen_rtx_HIGH (Pmode, offset)), offset);
3154 }
3155 else
3156 x = gen_rtx_LO_SUM (GET_MODE (x),
c4ad648e 3157 gen_rtx_HIGH (Pmode, x), x);
a29077da 3158
24ea750e 3159 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
a29077da
GK
3160 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
3161 opnum, (enum reload_type)type);
24ea750e
DJ
3162 *win = 1;
3163 return x;
3164 }
3165#endif
4937d02d 3166
24ea750e 3167 if (TARGET_TOC
4d588c14 3168 && constant_pool_expr_p (x)
c1f11548 3169 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
24ea750e
DJ
3170 {
3171 (x) = create_TOC_reference (x);
3172 *win = 1;
3173 return x;
3174 }
3175 *win = 0;
3176 return x;
f676971a 3177}
24ea750e 3178
258bfae2
FS
3179/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
3180 that is a valid memory address for an instruction.
3181 The MODE argument is the machine mode for the MEM expression
3182 that wants to use this address.
3183
3184 On the RS/6000, there are four valid address: a SYMBOL_REF that
3185 refers to a constant pool entry of an address (or the sum of it
3186 plus a constant), a short (16-bit signed) constant plus a register,
3187 the sum of two registers, or a register indirect, possibly with an
5bdc5878 3188 auto-increment. For DFmode and DImode with a constant plus register,
258bfae2
FS
3189 we must ensure that both words are addressable or PowerPC64 with offset
3190 word aligned.
3191
3192 For modes spanning multiple registers (DFmode in 32-bit GPRs,
76d2b81d 3193 32-bit DImode, TImode, TFmode), indexed addressing cannot be used because
258bfae2
FS
3194 adjacent memory cells are accessed by adding word-sized offsets
3195 during assembly output. */
3196int
a2369ed3 3197rs6000_legitimate_address (enum machine_mode mode, rtx x, int reg_ok_strict)
258bfae2 3198{
850e8d3d
DN
3199 /* If this is an unaligned stvx/ldvx type address, discard the outer AND. */
3200 if (TARGET_ALTIVEC
3201 && ALTIVEC_VECTOR_MODE (mode)
3202 && GET_CODE (x) == AND
3203 && GET_CODE (XEXP (x, 1)) == CONST_INT
3204 && INTVAL (XEXP (x, 1)) == -16)
3205 x = XEXP (x, 0);
3206
c4501e62
JJ
3207 if (RS6000_SYMBOL_REF_TLS_P (x))
3208 return 0;
4d588c14 3209 if (legitimate_indirect_address_p (x, reg_ok_strict))
258bfae2
FS
3210 return 1;
3211 if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
0d6d6892 3212 && !ALTIVEC_VECTOR_MODE (mode)
a3170dc6 3213 && !SPE_VECTOR_MODE (mode)
54b695e7
AH
3214 /* Restrict addressing for DI because of our SUBREG hackery. */
3215 && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == DImode))
258bfae2 3216 && TARGET_UPDATE
4d588c14 3217 && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
258bfae2 3218 return 1;
4d588c14 3219 if (legitimate_small_data_p (mode, x))
258bfae2 3220 return 1;
4d588c14 3221 if (legitimate_constant_pool_address_p (x))
258bfae2
FS
3222 return 1;
3223 /* If not REG_OK_STRICT (before reload) let pass any stack offset. */
3224 if (! reg_ok_strict
3225 && GET_CODE (x) == PLUS
3226 && GET_CODE (XEXP (x, 0)) == REG
708d2456 3227 && (XEXP (x, 0) == virtual_stack_vars_rtx
c4ad648e 3228 || XEXP (x, 0) == arg_pointer_rtx)
258bfae2
FS
3229 && GET_CODE (XEXP (x, 1)) == CONST_INT)
3230 return 1;
76d2b81d 3231 if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
258bfae2
FS
3232 return 1;
3233 if (mode != TImode
76d2b81d 3234 && mode != TFmode
a3170dc6
AH
3235 && ((TARGET_HARD_FLOAT && TARGET_FPRS)
3236 || TARGET_POWERPC64
4d4cbc0e 3237 || ((mode != DFmode || TARGET_E500_DOUBLE) && mode != TFmode))
258bfae2 3238 && (TARGET_POWERPC64 || mode != DImode)
4d588c14 3239 && legitimate_indexed_address_p (x, reg_ok_strict))
258bfae2 3240 return 1;
4d588c14 3241 if (legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
258bfae2
FS
3242 return 1;
3243 return 0;
3244}
4d588c14
RH
3245
3246/* Go to LABEL if ADDR (a legitimate address expression)
3247 has an effect that depends on the machine mode it is used for.
3248
3249 On the RS/6000 this is true of all integral offsets (since AltiVec
3250 modes don't allow them) or is a pre-increment or decrement.
3251
3252 ??? Except that due to conceptual problems in offsettable_address_p
3253 we can't really report the problems of integral offsets. So leave
f676971a 3254 this assuming that the adjustable offset must be valid for the
4d588c14
RH
3255 sub-words of a TFmode operand, which is what we had before. */
3256
3257bool
a2369ed3 3258rs6000_mode_dependent_address (rtx addr)
4d588c14
RH
3259{
3260 switch (GET_CODE (addr))
3261 {
3262 case PLUS:
3263 if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
3264 {
3265 unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
3266 return val + 12 + 0x8000 >= 0x10000;
3267 }
3268 break;
3269
3270 case LO_SUM:
3271 return true;
3272
3273 case PRE_INC:
3274 case PRE_DEC:
3275 return TARGET_UPDATE;
3276
3277 default:
3278 break;
3279 }
3280
3281 return false;
3282}
d8ecbcdb
AH
3283
3284/* Return number of consecutive hard regs needed starting at reg REGNO
3285 to hold something of mode MODE.
3286 This is ordinarily the length in words of a value of mode MODE
3287 but can be less for certain modes in special long registers.
3288
3289 For the SPE, GPRs are 64 bits but only 32 bits are visible in
3290 scalar instructions. The upper 32 bits are only available to the
3291 SIMD instructions.
3292
3293 POWER and PowerPC GPRs hold 32 bits worth;
3294 PowerPC64 GPRs and FPRs point register holds 64 bits worth. */
3295
3296int
3297rs6000_hard_regno_nregs (int regno, enum machine_mode mode)
3298{
3299 if (FP_REGNO_P (regno))
3300 return (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
3301
4d4cbc0e
AH
3302 if (TARGET_E500_DOUBLE && mode == DFmode)
3303 return 1;
3304
d8ecbcdb
AH
3305 if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
3306 return (GET_MODE_SIZE (mode) + UNITS_PER_SPE_WORD - 1) / UNITS_PER_SPE_WORD;
3307
3308 if (ALTIVEC_REGNO_P (regno))
3309 return
3310 (GET_MODE_SIZE (mode) + UNITS_PER_ALTIVEC_WORD - 1) / UNITS_PER_ALTIVEC_WORD;
3311
3312 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3313}
2aa4498c
AH
3314
3315/* Change register usage conditional on target flags. */
3316void
3317rs6000_conditional_register_usage (void)
3318{
3319 int i;
3320
3321 /* Set MQ register fixed (already call_used) if not POWER
3322 architecture (RIOS1, RIOS2, RSC, and PPC601) so that it will not
3323 be allocated. */
3324 if (! TARGET_POWER)
3325 fixed_regs[64] = 1;
3326
7c9ac5c0 3327 /* 64-bit AIX and Linux reserve GPR13 for thread-private data. */
2aa4498c
AH
3328 if (TARGET_64BIT)
3329 fixed_regs[13] = call_used_regs[13]
3330 = call_really_used_regs[13] = 1;
3331
3332 /* Conditionally disable FPRs. */
3333 if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
3334 for (i = 32; i < 64; i++)
3335 fixed_regs[i] = call_used_regs[i]
c4ad648e 3336 = call_really_used_regs[i] = 1;
2aa4498c 3337
7c9ac5c0
PH
3338 /* The TOC register is not killed across calls in a way that is
3339 visible to the compiler. */
3340 if (DEFAULT_ABI == ABI_AIX)
3341 call_really_used_regs[2] = 0;
3342
2aa4498c
AH
3343 if (DEFAULT_ABI == ABI_V4
3344 && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
3345 && flag_pic == 2)
3346 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3347
3348 if (DEFAULT_ABI == ABI_V4
3349 && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
3350 && flag_pic == 1)
3351 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3352 = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3353 = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3354
3355 if (DEFAULT_ABI == ABI_DARWIN
3356 && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
6d0a8091 3357 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
2aa4498c
AH
3358 = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3359 = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3360
b4db40bf
JJ
3361 if (TARGET_TOC && TARGET_MINIMAL_TOC)
3362 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3363 = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3364
2aa4498c
AH
3365 if (TARGET_ALTIVEC)
3366 global_regs[VSCR_REGNO] = 1;
3367
3368 if (TARGET_SPE)
3369 {
3370 global_regs[SPEFSCR_REGNO] = 1;
3371 fixed_regs[FIXED_SCRATCH]
c4ad648e 3372 = call_used_regs[FIXED_SCRATCH]
2aa4498c
AH
3373 = call_really_used_regs[FIXED_SCRATCH] = 1;
3374 }
3375
3376 if (! TARGET_ALTIVEC)
3377 {
3378 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
3379 fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
3380 call_really_used_regs[VRSAVE_REGNO] = 1;
3381 }
3382
3383 if (TARGET_ALTIVEC_ABI)
3384 for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
3385 call_used_regs[i] = call_really_used_regs[i] = 1;
3386}
fb4d4348 3387\f
a4f6c312
SS
3388/* Try to output insns to set TARGET equal to the constant C if it can
3389 be done in less than N insns. Do all computations in MODE.
3390 Returns the place where the output has been placed if it can be
3391 done and the insns have been emitted. If it would take more than N
3392 insns, zero is returned and no insns and emitted. */
2bfcf297
DB
3393
3394rtx
f676971a 3395rs6000_emit_set_const (rtx dest, enum machine_mode mode,
a2369ed3 3396 rtx source, int n ATTRIBUTE_UNUSED)
2bfcf297 3397{
af8cb5c5 3398 rtx result, insn, set;
2bfcf297
DB
3399 HOST_WIDE_INT c0, c1;
3400
37409796 3401 switch (mode)
2bfcf297 3402 {
37409796
NS
3403 case QImode:
3404 case HImode:
2bfcf297 3405 if (dest == NULL)
c4ad648e 3406 dest = gen_reg_rtx (mode);
2bfcf297
DB
3407 emit_insn (gen_rtx_SET (VOIDmode, dest, source));
3408 return dest;
37409796
NS
3409
3410 case SImode:
af8cb5c5 3411 result = no_new_pseudos ? dest : gen_reg_rtx (SImode);
37409796 3412
af8cb5c5
DE
3413 emit_insn (gen_rtx_SET (VOIDmode, result,
3414 GEN_INT (INTVAL (source)
3415 & (~ (HOST_WIDE_INT) 0xffff))));
3416 emit_insn (gen_rtx_SET (VOIDmode, dest,
3417 gen_rtx_IOR (SImode, result,
3418 GEN_INT (INTVAL (source) & 0xffff))));
3419 result = dest;
37409796
NS
3420 break;
3421
3422 case DImode:
3423 switch (GET_CODE (source))
af8cb5c5 3424 {
37409796 3425 case CONST_INT:
af8cb5c5
DE
3426 c0 = INTVAL (source);
3427 c1 = -(c0 < 0);
37409796
NS
3428 break;
3429
3430 case CONST_DOUBLE:
2bfcf297 3431#if HOST_BITS_PER_WIDE_INT >= 64
af8cb5c5
DE
3432 c0 = CONST_DOUBLE_LOW (source);
3433 c1 = -(c0 < 0);
2bfcf297 3434#else
af8cb5c5
DE
3435 c0 = CONST_DOUBLE_LOW (source);
3436 c1 = CONST_DOUBLE_HIGH (source);
2bfcf297 3437#endif
37409796
NS
3438 break;
3439
3440 default:
3441 gcc_unreachable ();
af8cb5c5 3442 }
af8cb5c5
DE
3443
3444 result = rs6000_emit_set_long_const (dest, c0, c1);
37409796
NS
3445 break;
3446
3447 default:
3448 gcc_unreachable ();
2bfcf297 3449 }
2bfcf297 3450
af8cb5c5
DE
3451 insn = get_last_insn ();
3452 set = single_set (insn);
3453 if (! CONSTANT_P (SET_SRC (set)))
3454 set_unique_reg_note (insn, REG_EQUAL, source);
3455
3456 return result;
2bfcf297
DB
3457}
3458
3459/* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
3460 fall back to a straight forward decomposition. We do this to avoid
3461 exponential run times encountered when looking for longer sequences
3462 with rs6000_emit_set_const. */
3463static rtx
a2369ed3 3464rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
2bfcf297
DB
3465{
3466 if (!TARGET_POWERPC64)
3467 {
3468 rtx operand1, operand2;
3469
3470 operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
3471 DImode);
3472 operand2 = operand_subword_force (dest, WORDS_BIG_ENDIAN != 0,
3473 DImode);
3474 emit_move_insn (operand1, GEN_INT (c1));
3475 emit_move_insn (operand2, GEN_INT (c2));
3476 }
3477 else
3478 {
bc06712d 3479 HOST_WIDE_INT ud1, ud2, ud3, ud4;
252b88f7 3480
bc06712d 3481 ud1 = c1 & 0xffff;
f921c9c9 3482 ud2 = (c1 & 0xffff0000) >> 16;
2bfcf297 3483#if HOST_BITS_PER_WIDE_INT >= 64
bc06712d 3484 c2 = c1 >> 32;
2bfcf297 3485#endif
bc06712d 3486 ud3 = c2 & 0xffff;
f921c9c9 3487 ud4 = (c2 & 0xffff0000) >> 16;
2bfcf297 3488
f676971a 3489 if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
bc06712d 3490 || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
2bfcf297 3491 {
bc06712d 3492 if (ud1 & 0x8000)
b78d48dd 3493 emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) - 0x8000)));
bc06712d
TR
3494 else
3495 emit_move_insn (dest, GEN_INT (ud1));
2bfcf297 3496 }
2bfcf297 3497
f676971a 3498 else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
bc06712d 3499 || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
252b88f7 3500 {
bc06712d 3501 if (ud2 & 0x8000)
f676971a 3502 emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
bc06712d 3503 - 0x80000000));
252b88f7 3504 else
bc06712d
TR
3505 emit_move_insn (dest, GEN_INT (ud2 << 16));
3506 if (ud1 != 0)
3507 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
252b88f7 3508 }
f676971a 3509 else if ((ud4 == 0xffff && (ud3 & 0x8000))
bc06712d
TR
3510 || (ud4 == 0 && ! (ud3 & 0x8000)))
3511 {
3512 if (ud3 & 0x8000)
f676971a 3513 emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
bc06712d
TR
3514 - 0x80000000));
3515 else
3516 emit_move_insn (dest, GEN_INT (ud3 << 16));
3517
3518 if (ud2 != 0)
3519 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud2)));
3520 emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (16)));
3521 if (ud1 != 0)
3522 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
3523 }
f676971a 3524 else
bc06712d
TR
3525 {
3526 if (ud4 & 0x8000)
f676971a 3527 emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
bc06712d
TR
3528 - 0x80000000));
3529 else
3530 emit_move_insn (dest, GEN_INT (ud4 << 16));
3531
3532 if (ud3 != 0)
3533 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud3)));
2bfcf297 3534
bc06712d
TR
3535 emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (32)));
3536 if (ud2 != 0)
f676971a
EC
3537 emit_move_insn (dest, gen_rtx_IOR (DImode, dest,
3538 GEN_INT (ud2 << 16)));
bc06712d
TR
3539 if (ud1 != 0)
3540 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
3541 }
3542 }
2bfcf297
DB
3543 return dest;
3544}
3545
76d2b81d
DJ
3546/* Helper for the following. Get rid of [r+r] memory refs
3547 in cases where it won't work (TImode, TFmode). */
3548
3549static void
3550rs6000_eliminate_indexed_memrefs (rtx operands[2])
3551{
3552 if (GET_CODE (operands[0]) == MEM
3553 && GET_CODE (XEXP (operands[0], 0)) != REG
55aa0757 3554 && ! legitimate_constant_pool_address_p (XEXP (operands[0], 0))
76d2b81d
DJ
3555 && ! reload_in_progress)
3556 operands[0]
3557 = replace_equiv_address (operands[0],
3558 copy_addr_to_reg (XEXP (operands[0], 0)));
3559
3560 if (GET_CODE (operands[1]) == MEM
3561 && GET_CODE (XEXP (operands[1], 0)) != REG
55aa0757 3562 && ! legitimate_constant_pool_address_p (XEXP (operands[1], 0))
76d2b81d
DJ
3563 && ! reload_in_progress)
3564 operands[1]
3565 = replace_equiv_address (operands[1],
3566 copy_addr_to_reg (XEXP (operands[1], 0)));
3567}
3568
fb4d4348
GK
3569/* Emit a move from SOURCE to DEST in mode MODE. */
3570void
a2369ed3 3571rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
fb4d4348
GK
3572{
3573 rtx operands[2];
3574 operands[0] = dest;
3575 operands[1] = source;
f676971a 3576
fb4d4348
GK
3577 /* Sanity checks. Check that we get CONST_DOUBLE only when we should. */
3578 if (GET_CODE (operands[1]) == CONST_DOUBLE
3579 && ! FLOAT_MODE_P (mode)
3580 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
3581 {
3582 /* FIXME. This should never happen. */
3583 /* Since it seems that it does, do the safe thing and convert
3584 to a CONST_INT. */
2496c7bd 3585 operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
fb4d4348 3586 }
37409796
NS
3587 gcc_assert (GET_CODE (operands[1]) != CONST_DOUBLE
3588 || FLOAT_MODE_P (mode)
3589 || ((CONST_DOUBLE_HIGH (operands[1]) != 0
3590 || CONST_DOUBLE_LOW (operands[1]) < 0)
3591 && (CONST_DOUBLE_HIGH (operands[1]) != -1
3592 || CONST_DOUBLE_LOW (operands[1]) >= 0)));
3593
c9e8cb32
DD
3594 /* Check if GCC is setting up a block move that will end up using FP
3595 registers as temporaries. We must make sure this is acceptable. */
3596 if (GET_CODE (operands[0]) == MEM
3597 && GET_CODE (operands[1]) == MEM
3598 && mode == DImode
41543739
GK
3599 && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
3600 || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
3601 && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
3602 ? 32 : MEM_ALIGN (operands[0])))
3603 || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
f676971a 3604 ? 32
41543739
GK
3605 : MEM_ALIGN (operands[1]))))
3606 && ! MEM_VOLATILE_P (operands [0])
3607 && ! MEM_VOLATILE_P (operands [1]))
c9e8cb32 3608 {
41543739
GK
3609 emit_move_insn (adjust_address (operands[0], SImode, 0),
3610 adjust_address (operands[1], SImode, 0));
3611 emit_move_insn (adjust_address (operands[0], SImode, 4),
3612 adjust_address (operands[1], SImode, 4));
c9e8cb32
DD
3613 return;
3614 }
630d42a0 3615
55aa0757 3616 if (!no_new_pseudos && GET_CODE (operands[0]) == MEM
c9dbf840 3617 && !gpc_reg_operand (operands[1], mode))
f6219a5e 3618 operands[1] = force_reg (mode, operands[1]);
a9098fd0 3619
a3170dc6
AH
3620 if (mode == SFmode && ! TARGET_POWERPC
3621 && TARGET_HARD_FLOAT && TARGET_FPRS
ffc14f31 3622 && GET_CODE (operands[0]) == MEM)
fb4d4348 3623 {
ffc14f31
GK
3624 int regnum;
3625
3626 if (reload_in_progress || reload_completed)
3627 regnum = true_regnum (operands[1]);
3628 else if (GET_CODE (operands[1]) == REG)
3629 regnum = REGNO (operands[1]);
3630 else
3631 regnum = -1;
f676971a 3632
fb4d4348
GK
3633 /* If operands[1] is a register, on POWER it may have
3634 double-precision data in it, so truncate it to single
3635 precision. */
3636 if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
3637 {
3638 rtx newreg;
3639 newreg = (no_new_pseudos ? operands[1] : gen_reg_rtx (mode));
3640 emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
3641 operands[1] = newreg;
3642 }
3643 }
3644
c4501e62
JJ
3645 /* Recognize the case where operand[1] is a reference to thread-local
3646 data and load its address to a register. */
84f52ebd 3647 if (rs6000_tls_referenced_p (operands[1]))
c4501e62 3648 {
84f52ebd
RH
3649 enum tls_model model;
3650 rtx tmp = operands[1];
3651 rtx addend = NULL;
3652
3653 if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
3654 {
3655 addend = XEXP (XEXP (tmp, 0), 1);
3656 tmp = XEXP (XEXP (tmp, 0), 0);
3657 }
3658
3659 gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
3660 model = SYMBOL_REF_TLS_MODEL (tmp);
3661 gcc_assert (model != 0);
3662
3663 tmp = rs6000_legitimize_tls_address (tmp, model);
3664 if (addend)
3665 {
3666 tmp = gen_rtx_PLUS (mode, tmp, addend);
3667 tmp = force_operand (tmp, operands[0]);
3668 }
3669 operands[1] = tmp;
c4501e62
JJ
3670 }
3671
8f4e6caf
RH
3672 /* Handle the case where reload calls us with an invalid address. */
3673 if (reload_in_progress && mode == Pmode
69ef87e2 3674 && (! general_operand (operands[1], mode)
8f4e6caf
RH
3675 || ! nonimmediate_operand (operands[0], mode)))
3676 goto emit_set;
3677
a9baceb1
GK
3678 /* 128-bit constant floating-point values on Darwin should really be
3679 loaded as two parts. */
3680 if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
3681 && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128
3682 && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
3683 {
3684 /* DImode is used, not DFmode, because simplify_gen_subreg doesn't
3685 know how to get a DFmode SUBREG of a TFmode. */
3686 rs6000_emit_move (simplify_gen_subreg (DImode, operands[0], mode, 0),
3687 simplify_gen_subreg (DImode, operands[1], mode, 0),
3688 DImode);
3689 rs6000_emit_move (simplify_gen_subreg (DImode, operands[0], mode,
3690 GET_MODE_SIZE (DImode)),
3691 simplify_gen_subreg (DImode, operands[1], mode,
3692 GET_MODE_SIZE (DImode)),
3693 DImode);
3694 return;
3695 }
3696
fb4d4348
GK
3697 /* FIXME: In the long term, this switch statement should go away
3698 and be replaced by a sequence of tests based on things like
3699 mode == Pmode. */
3700 switch (mode)
3701 {
3702 case HImode:
3703 case QImode:
3704 if (CONSTANT_P (operands[1])
3705 && GET_CODE (operands[1]) != CONST_INT)
a9098fd0 3706 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
3707 break;
3708
06f4e019 3709 case TFmode:
76d2b81d
DJ
3710 rs6000_eliminate_indexed_memrefs (operands);
3711 /* fall through */
3712
fb4d4348
GK
3713 case DFmode:
3714 case SFmode:
f676971a 3715 if (CONSTANT_P (operands[1])
fb4d4348 3716 && ! easy_fp_constant (operands[1], mode))
a9098fd0 3717 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348 3718 break;
f676971a 3719
0ac081f6
AH
3720 case V16QImode:
3721 case V8HImode:
3722 case V4SFmode:
3723 case V4SImode:
a3170dc6
AH
3724 case V4HImode:
3725 case V2SFmode:
3726 case V2SImode:
00a892b8 3727 case V1DImode:
69ef87e2 3728 if (CONSTANT_P (operands[1])
d744e06e 3729 && !easy_vector_constant (operands[1], mode))
0ac081f6
AH
3730 operands[1] = force_const_mem (mode, operands[1]);
3731 break;
f676971a 3732
fb4d4348 3733 case SImode:
a9098fd0 3734 case DImode:
fb4d4348
GK
3735 /* Use default pattern for address of ELF small data */
3736 if (TARGET_ELF
a9098fd0 3737 && mode == Pmode
f607bc57 3738 && DEFAULT_ABI == ABI_V4
f676971a 3739 && (GET_CODE (operands[1]) == SYMBOL_REF
a9098fd0
GK
3740 || GET_CODE (operands[1]) == CONST)
3741 && small_data_operand (operands[1], mode))
fb4d4348
GK
3742 {
3743 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
3744 return;
3745 }
3746
f607bc57 3747 if (DEFAULT_ABI == ABI_V4
a9098fd0
GK
3748 && mode == Pmode && mode == SImode
3749 && flag_pic == 1 && got_operand (operands[1], mode))
fb4d4348
GK
3750 {
3751 emit_insn (gen_movsi_got (operands[0], operands[1]));
3752 return;
3753 }
3754
ee890fe2 3755 if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
f1384257
AM
3756 && TARGET_NO_TOC
3757 && ! flag_pic
a9098fd0 3758 && mode == Pmode
fb4d4348
GK
3759 && CONSTANT_P (operands[1])
3760 && GET_CODE (operands[1]) != HIGH
3761 && GET_CODE (operands[1]) != CONST_INT)
3762 {
a9098fd0 3763 rtx target = (no_new_pseudos ? operands[0] : gen_reg_rtx (mode));
fb4d4348
GK
3764
3765 /* If this is a function address on -mcall-aixdesc,
3766 convert it to the address of the descriptor. */
3767 if (DEFAULT_ABI == ABI_AIX
3768 && GET_CODE (operands[1]) == SYMBOL_REF
3769 && XSTR (operands[1], 0)[0] == '.')
3770 {
3771 const char *name = XSTR (operands[1], 0);
3772 rtx new_ref;
3773 while (*name == '.')
3774 name++;
3775 new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
3776 CONSTANT_POOL_ADDRESS_P (new_ref)
3777 = CONSTANT_POOL_ADDRESS_P (operands[1]);
d1908feb 3778 SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
fb4d4348 3779 SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
d1908feb 3780 SYMBOL_REF_DECL (new_ref) = SYMBOL_REF_DECL (operands[1]);
fb4d4348
GK
3781 operands[1] = new_ref;
3782 }
7509c759 3783
ee890fe2
SS
3784 if (DEFAULT_ABI == ABI_DARWIN)
3785 {
ab82a49f
AP
3786#if TARGET_MACHO
3787 if (MACHO_DYNAMIC_NO_PIC_P)
3788 {
3789 /* Take care of any required data indirection. */
3790 operands[1] = rs6000_machopic_legitimize_pic_address (
3791 operands[1], mode, operands[0]);
3792 if (operands[0] != operands[1])
3793 emit_insn (gen_rtx_SET (VOIDmode,
c4ad648e 3794 operands[0], operands[1]));
ab82a49f
AP
3795 return;
3796 }
3797#endif
b8a55285
AP
3798 emit_insn (gen_macho_high (target, operands[1]));
3799 emit_insn (gen_macho_low (operands[0], target, operands[1]));
ee890fe2
SS
3800 return;
3801 }
3802
fb4d4348
GK
3803 emit_insn (gen_elf_high (target, operands[1]));
3804 emit_insn (gen_elf_low (operands[0], target, operands[1]));
3805 return;
3806 }
3807
a9098fd0
GK
3808 /* If this is a SYMBOL_REF that refers to a constant pool entry,
3809 and we have put it in the TOC, we just need to make a TOC-relative
3810 reference to it. */
3811 if (TARGET_TOC
3812 && GET_CODE (operands[1]) == SYMBOL_REF
4d588c14 3813 && constant_pool_expr_p (operands[1])
a9098fd0
GK
3814 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
3815 get_pool_mode (operands[1])))
fb4d4348 3816 {
a9098fd0 3817 operands[1] = create_TOC_reference (operands[1]);
fb4d4348 3818 }
a9098fd0
GK
3819 else if (mode == Pmode
3820 && CONSTANT_P (operands[1])
38886f37
AO
3821 && ((GET_CODE (operands[1]) != CONST_INT
3822 && ! easy_fp_constant (operands[1], mode))
3823 || (GET_CODE (operands[1]) == CONST_INT
3824 && num_insns_constant (operands[1], mode) > 2)
3825 || (GET_CODE (operands[0]) == REG
3826 && FP_REGNO_P (REGNO (operands[0]))))
a9098fd0 3827 && GET_CODE (operands[1]) != HIGH
4d588c14
RH
3828 && ! legitimate_constant_pool_address_p (operands[1])
3829 && ! toc_relative_expr_p (operands[1]))
fb4d4348
GK
3830 {
3831 /* Emit a USE operation so that the constant isn't deleted if
3832 expensive optimizations are turned on because nobody
3833 references it. This should only be done for operands that
3834 contain SYMBOL_REFs with CONSTANT_POOL_ADDRESS_P set.
3835 This should not be done for operands that contain LABEL_REFs.
3836 For now, we just handle the obvious case. */
3837 if (GET_CODE (operands[1]) != LABEL_REF)
3838 emit_insn (gen_rtx_USE (VOIDmode, operands[1]));
3839
c859cda6 3840#if TARGET_MACHO
ee890fe2 3841 /* Darwin uses a special PIC legitimizer. */
ab82a49f 3842 if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
ee890fe2 3843 {
ee890fe2
SS
3844 operands[1] =
3845 rs6000_machopic_legitimize_pic_address (operands[1], mode,
c859cda6
DJ
3846 operands[0]);
3847 if (operands[0] != operands[1])
3848 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
ee890fe2
SS
3849 return;
3850 }
c859cda6 3851#endif
ee890fe2 3852
fb4d4348
GK
3853 /* If we are to limit the number of things we put in the TOC and
3854 this is a symbol plus a constant we can add in one insn,
3855 just put the symbol in the TOC and add the constant. Don't do
3856 this if reload is in progress. */
3857 if (GET_CODE (operands[1]) == CONST
3858 && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
3859 && GET_CODE (XEXP (operands[1], 0)) == PLUS
a9098fd0 3860 && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
fb4d4348
GK
3861 && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
3862 || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
3863 && ! side_effects_p (operands[0]))
3864 {
a4f6c312
SS
3865 rtx sym =
3866 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
fb4d4348
GK
3867 rtx other = XEXP (XEXP (operands[1], 0), 1);
3868
a9098fd0
GK
3869 sym = force_reg (mode, sym);
3870 if (mode == SImode)
3871 emit_insn (gen_addsi3 (operands[0], sym, other));
3872 else
3873 emit_insn (gen_adddi3 (operands[0], sym, other));
fb4d4348
GK
3874 return;
3875 }
3876
a9098fd0 3877 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348 3878
f676971a 3879 if (TARGET_TOC
4d588c14 3880 && constant_pool_expr_p (XEXP (operands[1], 0))
d34c5b80
DE
3881 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
3882 get_pool_constant (XEXP (operands[1], 0)),
3883 get_pool_mode (XEXP (operands[1], 0))))
a9098fd0 3884 {
ba4828e0 3885 operands[1]
542a8afa 3886 = gen_const_mem (mode,
c4ad648e 3887 create_TOC_reference (XEXP (operands[1], 0)));
ba4828e0 3888 set_mem_alias_set (operands[1], get_TOC_alias_set ());
a9098fd0 3889 }
fb4d4348
GK
3890 }
3891 break;
a9098fd0 3892
fb4d4348 3893 case TImode:
76d2b81d
DJ
3894 rs6000_eliminate_indexed_memrefs (operands);
3895
27dc0551
DE
3896 if (TARGET_POWER)
3897 {
3898 emit_insn (gen_rtx_PARALLEL (VOIDmode,
3899 gen_rtvec (2,
3900 gen_rtx_SET (VOIDmode,
3901 operands[0], operands[1]),
3902 gen_rtx_CLOBBER (VOIDmode,
3903 gen_rtx_SCRATCH (SImode)))));
3904 return;
3905 }
fb4d4348
GK
3906 break;
3907
3908 default:
37409796 3909 gcc_unreachable ();
fb4d4348
GK
3910 }
3911
a9098fd0
GK
3912 /* Above, we may have called force_const_mem which may have returned
3913 an invalid address. If we can, fix this up; otherwise, reload will
3914 have to deal with it. */
8f4e6caf
RH
3915 if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
3916 operands[1] = validize_mem (operands[1]);
a9098fd0 3917
8f4e6caf 3918 emit_set:
fb4d4348
GK
3919 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
3920}
4697a36c 3921\f
2858f73a
GK
3922/* Nonzero if we can use a floating-point register to pass this arg. */
3923#define USE_FP_FOR_ARG_P(CUM,MODE,TYPE) \
3924 (GET_MODE_CLASS (MODE) == MODE_FLOAT \
3925 && (CUM)->fregno <= FP_ARG_MAX_REG \
3926 && TARGET_HARD_FLOAT && TARGET_FPRS)
3927
3928/* Nonzero if we can use an AltiVec register to pass this arg. */
3929#define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE,NAMED) \
3930 (ALTIVEC_VECTOR_MODE (MODE) \
3931 && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG \
3932 && TARGET_ALTIVEC_ABI \
83953138 3933 && (NAMED))
2858f73a 3934
c6e8c921
GK
3935/* Return a nonzero value to say to return the function value in
3936 memory, just as large structures are always returned. TYPE will be
3937 the data type of the value, and FNTYPE will be the type of the
3938 function doing the returning, or @code{NULL} for libcalls.
3939
3940 The AIX ABI for the RS/6000 specifies that all structures are
3941 returned in memory. The Darwin ABI does the same. The SVR4 ABI
3942 specifies that structures <= 8 bytes are returned in r3/r4, but a
3943 draft put them in memory, and GCC used to implement the draft
df01da37 3944 instead of the final standard. Therefore, aix_struct_return
c6e8c921
GK
3945 controls this instead of DEFAULT_ABI; V.4 targets needing backward
3946 compatibility can change DRAFT_V4_STRUCT_RET to override the
3947 default, and -m switches get the final word. See
3948 rs6000_override_options for more details.
3949
3950 The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
3951 long double support is enabled. These values are returned in memory.
3952
3953 int_size_in_bytes returns -1 for variable size objects, which go in
3954 memory always. The cast to unsigned makes -1 > 8. */
3955
3956static bool
3957rs6000_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
3958{
594a51fe
SS
3959 /* In the darwin64 abi, try to use registers for larger structs
3960 if possible. */
0b5383eb 3961 if (rs6000_darwin64_abi
594a51fe 3962 && TREE_CODE (type) == RECORD_TYPE
0b5383eb
DJ
3963 && int_size_in_bytes (type) > 0)
3964 {
3965 CUMULATIVE_ARGS valcum;
3966 rtx valret;
3967
3968 valcum.words = 0;
3969 valcum.fregno = FP_ARG_MIN_REG;
3970 valcum.vregno = ALTIVEC_ARG_MIN_REG;
3971 /* Do a trial code generation as if this were going to be passed
3972 as an argument; if any part goes in memory, we return NULL. */
3973 valret = rs6000_darwin64_record_arg (&valcum, type, 1, true);
3974 if (valret)
3975 return false;
3976 /* Otherwise fall through to more conventional ABI rules. */
3977 }
594a51fe 3978
c6e8c921 3979 if (AGGREGATE_TYPE_P (type)
df01da37 3980 && (aix_struct_return
c6e8c921
GK
3981 || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
3982 return true;
b693336b 3983
bada2eb8
DE
3984 /* Allow -maltivec -mabi=no-altivec without warning. Altivec vector
3985 modes only exist for GCC vector types if -maltivec. */
3986 if (TARGET_32BIT && !TARGET_ALTIVEC_ABI
3987 && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
3988 return false;
3989
b693336b
PB
3990 /* Return synthetic vectors in memory. */
3991 if (TREE_CODE (type) == VECTOR_TYPE
ad630bef 3992 && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
b693336b
PB
3993 {
3994 static bool warned_for_return_big_vectors = false;
3995 if (!warned_for_return_big_vectors)
3996 {
d4ee4d25 3997 warning (0, "GCC vector returned by reference: "
b693336b
PB
3998 "non-standard ABI extension with no compatibility guarantee");
3999 warned_for_return_big_vectors = true;
4000 }
4001 return true;
4002 }
4003
c6e8c921
GK
4004 if (DEFAULT_ABI == ABI_V4 && TYPE_MODE (type) == TFmode)
4005 return true;
ad630bef 4006
c6e8c921
GK
4007 return false;
4008}
4009
4697a36c
MM
4010/* Initialize a variable CUM of type CUMULATIVE_ARGS
4011 for a call to a function whose data type is FNTYPE.
4012 For a library call, FNTYPE is 0.
4013
4014 For incoming args we set the number of arguments in the prototype large
1c20ae99 4015 so we never return a PARALLEL. */
4697a36c
MM
4016
4017void
f676971a 4018init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
0f6937fe
AM
4019 rtx libname ATTRIBUTE_UNUSED, int incoming,
4020 int libcall, int n_named_args)
4697a36c
MM
4021{
4022 static CUMULATIVE_ARGS zero_cumulative;
4023
4024 *cum = zero_cumulative;
4025 cum->words = 0;
4026 cum->fregno = FP_ARG_MIN_REG;
0ac081f6 4027 cum->vregno = ALTIVEC_ARG_MIN_REG;
4697a36c 4028 cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
ddcc8263
DE
4029 cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
4030 ? CALL_LIBCALL : CALL_NORMAL);
4cc833b7 4031 cum->sysv_gregno = GP_ARG_MIN_REG;
a6c9bed4
AH
4032 cum->stdarg = fntype
4033 && (TYPE_ARG_TYPES (fntype) != 0
4034 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
4035 != void_type_node));
4697a36c 4036
0f6937fe
AM
4037 cum->nargs_prototype = 0;
4038 if (incoming || cum->prototype)
4039 cum->nargs_prototype = n_named_args;
4697a36c 4040
a5c76ee6 4041 /* Check for a longcall attribute. */
3eb4e360
AM
4042 if ((!fntype && rs6000_default_long_calls)
4043 || (fntype
4044 && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
4045 && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
4046 cum->call_cookie |= CALL_LONG;
6a4cee5f 4047
4697a36c
MM
4048 if (TARGET_DEBUG_ARG)
4049 {
4050 fprintf (stderr, "\ninit_cumulative_args:");
4051 if (fntype)
4052 {
4053 tree ret_type = TREE_TYPE (fntype);
4054 fprintf (stderr, " ret code = %s,",
4055 tree_code_name[ (int)TREE_CODE (ret_type) ]);
4056 }
4057
6a4cee5f
MM
4058 if (cum->call_cookie & CALL_LONG)
4059 fprintf (stderr, " longcall,");
4060
4697a36c
MM
4061 fprintf (stderr, " proto = %d, nargs = %d\n",
4062 cum->prototype, cum->nargs_prototype);
4063 }
f676971a 4064
c4ad648e
AM
4065 if (fntype
4066 && !TARGET_ALTIVEC
4067 && TARGET_ALTIVEC_ABI
4068 && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
4069 {
c85ce869 4070 error ("cannot return value in vector register because"
c4ad648e 4071 " altivec instructions are disabled, use -maltivec"
c85ce869 4072 " to enable them");
c4ad648e 4073 }
4697a36c
MM
4074}
4075\f
fe984136
RH
4076/* Return true if TYPE must be passed on the stack and not in registers. */
4077
4078static bool
4079rs6000_must_pass_in_stack (enum machine_mode mode, tree type)
4080{
4081 if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT)
4082 return must_pass_in_stack_var_size (mode, type);
4083 else
4084 return must_pass_in_stack_var_size_or_pad (mode, type);
4085}
4086
c229cba9
DE
4087/* If defined, a C expression which determines whether, and in which
4088 direction, to pad out an argument with extra space. The value
4089 should be of type `enum direction': either `upward' to pad above
4090 the argument, `downward' to pad below, or `none' to inhibit
4091 padding.
4092
4093 For the AIX ABI structs are always stored left shifted in their
4094 argument slot. */
4095
9ebbca7d 4096enum direction
a2369ed3 4097function_arg_padding (enum machine_mode mode, tree type)
c229cba9 4098{
6e985040
AM
4099#ifndef AGGREGATE_PADDING_FIXED
4100#define AGGREGATE_PADDING_FIXED 0
4101#endif
4102#ifndef AGGREGATES_PAD_UPWARD_ALWAYS
4103#define AGGREGATES_PAD_UPWARD_ALWAYS 0
4104#endif
4105
4106 if (!AGGREGATE_PADDING_FIXED)
4107 {
4108 /* GCC used to pass structures of the same size as integer types as
4109 if they were in fact integers, ignoring FUNCTION_ARG_PADDING.
19525b57 4110 i.e. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
6e985040
AM
4111 passed padded downward, except that -mstrict-align further
4112 muddied the water in that multi-component structures of 2 and 4
4113 bytes in size were passed padded upward.
4114
4115 The following arranges for best compatibility with previous
4116 versions of gcc, but removes the -mstrict-align dependency. */
4117 if (BYTES_BIG_ENDIAN)
4118 {
4119 HOST_WIDE_INT size = 0;
4120
4121 if (mode == BLKmode)
4122 {
4123 if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
4124 size = int_size_in_bytes (type);
4125 }
4126 else
4127 size = GET_MODE_SIZE (mode);
4128
4129 if (size == 1 || size == 2 || size == 4)
4130 return downward;
4131 }
4132 return upward;
4133 }
4134
4135 if (AGGREGATES_PAD_UPWARD_ALWAYS)
4136 {
4137 if (type != 0 && AGGREGATE_TYPE_P (type))
4138 return upward;
4139 }
c229cba9 4140
d3704c46
KH
4141 /* Fall back to the default. */
4142 return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
c229cba9
DE
4143}
4144
b6c9286a 4145/* If defined, a C expression that gives the alignment boundary, in bits,
f676971a 4146 of an argument with the specified mode and type. If it is not defined,
b6c9286a 4147 PARM_BOUNDARY is used for all arguments.
f676971a 4148
b693336b
PB
4149 V.4 wants long longs to be double word aligned.
4150 Doubleword align SPE vectors.
4151 Quadword align Altivec vectors.
4152 Quadword align large synthetic vector types. */
b6c9286a
MM
4153
4154int
b693336b 4155function_arg_boundary (enum machine_mode mode, tree type)
b6c9286a 4156{
4ed78545
AM
4157 if (DEFAULT_ABI == ABI_V4 && GET_MODE_SIZE (mode) == 8)
4158 return 64;
ad630bef
DE
4159 else if (SPE_VECTOR_MODE (mode)
4160 || (type && TREE_CODE (type) == VECTOR_TYPE
4161 && int_size_in_bytes (type) >= 8
4162 && int_size_in_bytes (type) < 16))
e1f83b4d 4163 return 64;
ad630bef
DE
4164 else if (ALTIVEC_VECTOR_MODE (mode)
4165 || (type && TREE_CODE (type) == VECTOR_TYPE
4166 && int_size_in_bytes (type) >= 16))
0ac081f6 4167 return 128;
0b5383eb
DJ
4168 else if (rs6000_darwin64_abi && mode == BLKmode
4169 && type && TYPE_ALIGN (type) > 64)
4170 return 128;
9ebbca7d 4171 else
b6c9286a 4172 return PARM_BOUNDARY;
b6c9286a 4173}
c53bdcf5 4174
294bd182
AM
4175/* For a function parm of MODE and TYPE, return the starting word in
4176 the parameter area. NWORDS of the parameter area are already used. */
4177
4178static unsigned int
4179rs6000_parm_start (enum machine_mode mode, tree type, unsigned int nwords)
4180{
4181 unsigned int align;
4182 unsigned int parm_offset;
4183
4184 align = function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
4185 parm_offset = DEFAULT_ABI == ABI_V4 ? 2 : 6;
4186 return nwords + (-(parm_offset + nwords) & align);
4187}
4188
c53bdcf5
AM
4189/* Compute the size (in words) of a function argument. */
4190
4191static unsigned long
4192rs6000_arg_size (enum machine_mode mode, tree type)
4193{
4194 unsigned long size;
4195
4196 if (mode != BLKmode)
4197 size = GET_MODE_SIZE (mode);
4198 else
4199 size = int_size_in_bytes (type);
4200
4201 if (TARGET_32BIT)
4202 return (size + 3) >> 2;
4203 else
4204 return (size + 7) >> 3;
4205}
b6c9286a 4206\f
0b5383eb 4207/* Use this to flush pending int fields. */
594a51fe
SS
4208
4209static void
0b5383eb
DJ
4210rs6000_darwin64_record_arg_advance_flush (CUMULATIVE_ARGS *cum,
4211 HOST_WIDE_INT bitpos)
594a51fe 4212{
0b5383eb
DJ
4213 unsigned int startbit, endbit;
4214 int intregs, intoffset;
4215 enum machine_mode mode;
594a51fe 4216
0b5383eb
DJ
4217 if (cum->intoffset == -1)
4218 return;
594a51fe 4219
0b5383eb
DJ
4220 intoffset = cum->intoffset;
4221 cum->intoffset = -1;
4222
4223 if (intoffset % BITS_PER_WORD != 0)
4224 {
4225 mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
4226 MODE_INT, 0);
4227 if (mode == BLKmode)
594a51fe 4228 {
0b5383eb
DJ
4229 /* We couldn't find an appropriate mode, which happens,
4230 e.g., in packed structs when there are 3 bytes to load.
4231 Back intoffset back to the beginning of the word in this
4232 case. */
4233 intoffset = intoffset & -BITS_PER_WORD;
594a51fe 4234 }
594a51fe 4235 }
0b5383eb
DJ
4236
4237 startbit = intoffset & -BITS_PER_WORD;
4238 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
4239 intregs = (endbit - startbit) / BITS_PER_WORD;
4240 cum->words += intregs;
4241}
4242
4243/* The darwin64 ABI calls for us to recurse down through structs,
4244 looking for elements passed in registers. Unfortunately, we have
4245 to track int register count here also because of misalignments
4246 in powerpc alignment mode. */
4247
4248static void
4249rs6000_darwin64_record_arg_advance_recurse (CUMULATIVE_ARGS *cum,
4250 tree type,
4251 HOST_WIDE_INT startbitpos)
4252{
4253 tree f;
4254
4255 for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
4256 if (TREE_CODE (f) == FIELD_DECL)
4257 {
4258 HOST_WIDE_INT bitpos = startbitpos;
4259 tree ftype = TREE_TYPE (f);
4260 enum machine_mode mode = TYPE_MODE (ftype);
4261
4262 if (DECL_SIZE (f) != 0
4263 && host_integerp (bit_position (f), 1))
4264 bitpos += int_bit_position (f);
4265
4266 /* ??? FIXME: else assume zero offset. */
4267
4268 if (TREE_CODE (ftype) == RECORD_TYPE)
4269 rs6000_darwin64_record_arg_advance_recurse (cum, ftype, bitpos);
4270 else if (USE_FP_FOR_ARG_P (cum, mode, ftype))
4271 {
4272 rs6000_darwin64_record_arg_advance_flush (cum, bitpos);
4273 cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
4274 cum->words += (GET_MODE_SIZE (mode) + 7) >> 3;
4275 }
4276 else if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, 1))
4277 {
4278 rs6000_darwin64_record_arg_advance_flush (cum, bitpos);
4279 cum->vregno++;
4280 cum->words += 2;
4281 }
4282 else if (cum->intoffset == -1)
4283 cum->intoffset = bitpos;
4284 }
594a51fe
SS
4285}
4286
4697a36c
MM
4287/* Update the data in CUM to advance over an argument
4288 of mode MODE and data type TYPE.
b2d04ecf
AM
4289 (TYPE is null for libcalls where that information may not be available.)
4290
4291 Note that for args passed by reference, function_arg will be called
4292 with MODE and TYPE set to that of the pointer to the arg, not the arg
4293 itself. */
4697a36c
MM
4294
4295void
f676971a 4296function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
594a51fe 4297 tree type, int named, int depth)
4697a36c 4298{
0b5383eb
DJ
4299 int size;
4300
594a51fe
SS
4301 /* Only tick off an argument if we're not recursing. */
4302 if (depth == 0)
4303 cum->nargs_prototype--;
4697a36c 4304
ad630bef
DE
4305 if (TARGET_ALTIVEC_ABI
4306 && (ALTIVEC_VECTOR_MODE (mode)
4307 || (type && TREE_CODE (type) == VECTOR_TYPE
4308 && int_size_in_bytes (type) == 16)))
0ac081f6 4309 {
4ed78545
AM
4310 bool stack = false;
4311
2858f73a 4312 if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
c4ad648e 4313 {
6d0ef01e
HP
4314 cum->vregno++;
4315 if (!TARGET_ALTIVEC)
c85ce869 4316 error ("cannot pass argument in vector register because"
6d0ef01e 4317 " altivec instructions are disabled, use -maltivec"
c85ce869 4318 " to enable them");
4ed78545
AM
4319
4320 /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
f676971a 4321 even if it is going to be passed in a vector register.
4ed78545
AM
4322 Darwin does the same for variable-argument functions. */
4323 if ((DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
4324 || (cum->stdarg && DEFAULT_ABI != ABI_V4))
4325 stack = true;
6d0ef01e 4326 }
4ed78545
AM
4327 else
4328 stack = true;
4329
4330 if (stack)
c4ad648e 4331 {
a594a19c 4332 int align;
f676971a 4333
2858f73a
GK
4334 /* Vector parameters must be 16-byte aligned. This places
4335 them at 2 mod 4 in terms of words in 32-bit mode, since
4336 the parameter save area starts at offset 24 from the
4337 stack. In 64-bit mode, they just have to start on an
4338 even word, since the parameter save area is 16-byte
4339 aligned. Space for GPRs is reserved even if the argument
4340 will be passed in memory. */
4341 if (TARGET_32BIT)
4ed78545 4342 align = (2 - cum->words) & 3;
2858f73a
GK
4343 else
4344 align = cum->words & 1;
c53bdcf5 4345 cum->words += align + rs6000_arg_size (mode, type);
f676971a 4346
a594a19c
GK
4347 if (TARGET_DEBUG_ARG)
4348 {
f676971a 4349 fprintf (stderr, "function_adv: words = %2d, align=%d, ",
a594a19c
GK
4350 cum->words, align);
4351 fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
f676971a 4352 cum->nargs_prototype, cum->prototype,
2858f73a 4353 GET_MODE_NAME (mode));
a594a19c
GK
4354 }
4355 }
0ac081f6 4356 }
a4b0320c 4357 else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
a6c9bed4
AH
4358 && !cum->stdarg
4359 && cum->sysv_gregno <= GP_ARG_MAX_REG)
a4b0320c 4360 cum->sysv_gregno++;
594a51fe
SS
4361
4362 else if (rs6000_darwin64_abi
4363 && mode == BLKmode
0b5383eb
DJ
4364 && TREE_CODE (type) == RECORD_TYPE
4365 && (size = int_size_in_bytes (type)) > 0)
4366 {
4367 /* Variable sized types have size == -1 and are
4368 treated as if consisting entirely of ints.
4369 Pad to 16 byte boundary if needed. */
4370 if (TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
4371 && (cum->words % 2) != 0)
4372 cum->words++;
4373 /* For varargs, we can just go up by the size of the struct. */
4374 if (!named)
4375 cum->words += (size + 7) / 8;
4376 else
4377 {
4378 /* It is tempting to say int register count just goes up by
4379 sizeof(type)/8, but this is wrong in a case such as
4380 { int; double; int; } [powerpc alignment]. We have to
4381 grovel through the fields for these too. */
4382 cum->intoffset = 0;
4383 rs6000_darwin64_record_arg_advance_recurse (cum, type, 0);
4384 rs6000_darwin64_record_arg_advance_flush (cum,
4385 size * BITS_PER_UNIT);
4386 }
4387 }
f607bc57 4388 else if (DEFAULT_ABI == ABI_V4)
4697a36c 4389 {
a3170dc6 4390 if (TARGET_HARD_FLOAT && TARGET_FPRS
4cc833b7 4391 && (mode == SFmode || mode == DFmode))
4697a36c 4392 {
4cc833b7
RH
4393 if (cum->fregno <= FP_ARG_V4_MAX_REG)
4394 cum->fregno++;
4395 else
4396 {
4397 if (mode == DFmode)
c4ad648e 4398 cum->words += cum->words & 1;
c53bdcf5 4399 cum->words += rs6000_arg_size (mode, type);
4cc833b7 4400 }
4697a36c 4401 }
4cc833b7
RH
4402 else
4403 {
b2d04ecf 4404 int n_words = rs6000_arg_size (mode, type);
4cc833b7
RH
4405 int gregno = cum->sysv_gregno;
4406
4ed78545
AM
4407 /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
4408 (r7,r8) or (r9,r10). As does any other 2 word item such
4409 as complex int due to a historical mistake. */
4410 if (n_words == 2)
4411 gregno += (1 - gregno) & 1;
4cc833b7 4412
4ed78545 4413 /* Multi-reg args are not split between registers and stack. */
4cc833b7
RH
4414 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
4415 {
4ed78545
AM
4416 /* Long long and SPE vectors are aligned on the stack.
4417 So are other 2 word items such as complex int due to
4418 a historical mistake. */
4cc833b7
RH
4419 if (n_words == 2)
4420 cum->words += cum->words & 1;
4421 cum->words += n_words;
4422 }
4697a36c 4423
4cc833b7
RH
4424 /* Note: continuing to accumulate gregno past when we've started
4425 spilling to the stack indicates the fact that we've started
4426 spilling to the stack to expand_builtin_saveregs. */
4427 cum->sysv_gregno = gregno + n_words;
4428 }
4697a36c 4429
4cc833b7
RH
4430 if (TARGET_DEBUG_ARG)
4431 {
4432 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
4433 cum->words, cum->fregno);
4434 fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
4435 cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
4436 fprintf (stderr, "mode = %4s, named = %d\n",
4437 GET_MODE_NAME (mode), named);
4438 }
4697a36c
MM
4439 }
4440 else
4cc833b7 4441 {
b2d04ecf 4442 int n_words = rs6000_arg_size (mode, type);
294bd182
AM
4443 int start_words = cum->words;
4444 int align_words = rs6000_parm_start (mode, type, start_words);
a4f6c312 4445
294bd182 4446 cum->words = align_words + n_words;
4697a36c 4447
a3170dc6
AH
4448 if (GET_MODE_CLASS (mode) == MODE_FLOAT
4449 && TARGET_HARD_FLOAT && TARGET_FPRS)
c53bdcf5 4450 cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
4cc833b7
RH
4451
4452 if (TARGET_DEBUG_ARG)
4453 {
4454 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
4455 cum->words, cum->fregno);
4456 fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
4457 cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
594a51fe 4458 fprintf (stderr, "named = %d, align = %d, depth = %d\n",
294bd182 4459 named, align_words - start_words, depth);
4cc833b7
RH
4460 }
4461 }
4697a36c 4462}
a6c9bed4 4463
f82f556d
AH
4464static rtx
4465spe_build_register_parallel (enum machine_mode mode, int gregno)
4466{
54b695e7 4467 rtx r1, r3;
f82f556d 4468
37409796 4469 switch (mode)
f82f556d 4470 {
37409796 4471 case DFmode:
54b695e7
AH
4472 r1 = gen_rtx_REG (DImode, gregno);
4473 r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
4474 return gen_rtx_PARALLEL (mode, gen_rtvec (1, r1));
37409796
NS
4475
4476 case DCmode:
54b695e7
AH
4477 r1 = gen_rtx_REG (DImode, gregno);
4478 r1 = gen_rtx_EXPR_LIST (VOIDmode, r1, const0_rtx);
4479 r3 = gen_rtx_REG (DImode, gregno + 2);
4480 r3 = gen_rtx_EXPR_LIST (VOIDmode, r3, GEN_INT (8));
4481 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r3));
37409796
NS
4482
4483 default:
4484 gcc_unreachable ();
f82f556d 4485 }
f82f556d 4486}
b78d48dd 4487
f82f556d 4488/* Determine where to put a SIMD argument on the SPE. */
a6c9bed4 4489static rtx
f676971a 4490rs6000_spe_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
a2369ed3 4491 tree type)
a6c9bed4 4492{
f82f556d
AH
4493 int gregno = cum->sysv_gregno;
4494
4495 /* On E500 v2, double arithmetic is done on the full 64-bit GPR, but
600e1f95 4496 are passed and returned in a pair of GPRs for ABI compatibility. */
18f63bfa 4497 if (TARGET_E500_DOUBLE && (mode == DFmode || mode == DCmode))
f82f556d 4498 {
b5870bee
AH
4499 int n_words = rs6000_arg_size (mode, type);
4500
f82f556d 4501 /* Doubles go in an odd/even register pair (r5/r6, etc). */
b5870bee
AH
4502 if (mode == DFmode)
4503 gregno += (1 - gregno) & 1;
f82f556d 4504
b5870bee
AH
4505 /* Multi-reg args are not split between registers and stack. */
4506 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
f82f556d
AH
4507 return NULL_RTX;
4508
4509 return spe_build_register_parallel (mode, gregno);
4510 }
a6c9bed4
AH
4511 if (cum->stdarg)
4512 {
c53bdcf5 4513 int n_words = rs6000_arg_size (mode, type);
a6c9bed4
AH
4514
4515 /* SPE vectors are put in odd registers. */
4516 if (n_words == 2 && (gregno & 1) == 0)
4517 gregno += 1;
4518
4519 if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
4520 {
4521 rtx r1, r2;
4522 enum machine_mode m = SImode;
4523
4524 r1 = gen_rtx_REG (m, gregno);
4525 r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
4526 r2 = gen_rtx_REG (m, gregno + 1);
4527 r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
4528 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
4529 }
4530 else
b78d48dd 4531 return NULL_RTX;
a6c9bed4
AH
4532 }
4533 else
4534 {
f82f556d
AH
4535 if (gregno <= GP_ARG_MAX_REG)
4536 return gen_rtx_REG (mode, gregno);
a6c9bed4 4537 else
b78d48dd 4538 return NULL_RTX;
a6c9bed4
AH
4539 }
4540}
4541
0b5383eb
DJ
4542/* A subroutine of rs6000_darwin64_record_arg. Assign the bits of the
4543 structure between cum->intoffset and bitpos to integer registers. */
594a51fe 4544
0b5383eb
DJ
4545static void
4546rs6000_darwin64_record_arg_flush (CUMULATIVE_ARGS *cum,
4547 HOST_WIDE_INT bitpos, rtx rvec[], int *k)
594a51fe 4548{
0b5383eb
DJ
4549 enum machine_mode mode;
4550 unsigned int regno;
4551 unsigned int startbit, endbit;
4552 int this_regno, intregs, intoffset;
4553 rtx reg;
594a51fe 4554
0b5383eb
DJ
4555 if (cum->intoffset == -1)
4556 return;
4557
4558 intoffset = cum->intoffset;
4559 cum->intoffset = -1;
4560
4561 /* If this is the trailing part of a word, try to only load that
4562 much into the register. Otherwise load the whole register. Note
4563 that in the latter case we may pick up unwanted bits. It's not a
4564 problem at the moment but may wish to revisit. */
4565
4566 if (intoffset % BITS_PER_WORD != 0)
594a51fe 4567 {
0b5383eb
DJ
4568 mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
4569 MODE_INT, 0);
4570 if (mode == BLKmode)
4571 {
4572 /* We couldn't find an appropriate mode, which happens,
4573 e.g., in packed structs when there are 3 bytes to load.
4574 Back intoffset back to the beginning of the word in this
4575 case. */
4576 intoffset = intoffset & -BITS_PER_WORD;
4577 mode = word_mode;
4578 }
4579 }
4580 else
4581 mode = word_mode;
4582
4583 startbit = intoffset & -BITS_PER_WORD;
4584 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
4585 intregs = (endbit - startbit) / BITS_PER_WORD;
4586 this_regno = cum->words + intoffset / BITS_PER_WORD;
4587
4588 if (intregs > 0 && intregs > GP_ARG_NUM_REG - this_regno)
4589 cum->use_stack = 1;
4590
4591 intregs = MIN (intregs, GP_ARG_NUM_REG - this_regno);
4592 if (intregs <= 0)
4593 return;
4594
4595 intoffset /= BITS_PER_UNIT;
4596 do
4597 {
4598 regno = GP_ARG_MIN_REG + this_regno;
4599 reg = gen_rtx_REG (mode, regno);
4600 rvec[(*k)++] =
4601 gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
4602
4603 this_regno += 1;
4604 intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
4605 mode = word_mode;
4606 intregs -= 1;
4607 }
4608 while (intregs > 0);
4609}
4610
4611/* Recursive workhorse for the following. */
4612
4613static void
4614rs6000_darwin64_record_arg_recurse (CUMULATIVE_ARGS *cum, tree type,
4615 HOST_WIDE_INT startbitpos, rtx rvec[],
4616 int *k)
4617{
4618 tree f;
4619
4620 for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
4621 if (TREE_CODE (f) == FIELD_DECL)
4622 {
4623 HOST_WIDE_INT bitpos = startbitpos;
4624 tree ftype = TREE_TYPE (f);
4625 enum machine_mode mode = TYPE_MODE (ftype);
4626
4627 if (DECL_SIZE (f) != 0
4628 && host_integerp (bit_position (f), 1))
4629 bitpos += int_bit_position (f);
4630
4631 /* ??? FIXME: else assume zero offset. */
4632
4633 if (TREE_CODE (ftype) == RECORD_TYPE)
4634 rs6000_darwin64_record_arg_recurse (cum, ftype, bitpos, rvec, k);
4635 else if (cum->named && USE_FP_FOR_ARG_P (cum, mode, ftype))
594a51fe 4636 {
0b5383eb
DJ
4637#if 0
4638 switch (mode)
594a51fe 4639 {
0b5383eb
DJ
4640 case SCmode: mode = SFmode; break;
4641 case DCmode: mode = DFmode; break;
4642 case TCmode: mode = TFmode; break;
4643 default: break;
594a51fe 4644 }
0b5383eb
DJ
4645#endif
4646 rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
4647 rvec[(*k)++]
4648 = gen_rtx_EXPR_LIST (VOIDmode,
4649 gen_rtx_REG (mode, cum->fregno++),
4650 GEN_INT (bitpos / BITS_PER_UNIT));
4651 if (mode == TFmode)
4652 cum->fregno++;
594a51fe 4653 }
0b5383eb
DJ
4654 else if (cum->named && USE_ALTIVEC_FOR_ARG_P (cum, mode, ftype, 1))
4655 {
4656 rs6000_darwin64_record_arg_flush (cum, bitpos, rvec, k);
4657 rvec[(*k)++]
4658 = gen_rtx_EXPR_LIST (VOIDmode,
4659 gen_rtx_REG (mode, cum->vregno++),
4660 GEN_INT (bitpos / BITS_PER_UNIT));
4661 }
4662 else if (cum->intoffset == -1)
4663 cum->intoffset = bitpos;
4664 }
4665}
594a51fe 4666
0b5383eb
DJ
4667/* For the darwin64 ABI, we want to construct a PARALLEL consisting of
4668 the register(s) to be used for each field and subfield of a struct
4669 being passed by value, along with the offset of where the
4670 register's value may be found in the block. FP fields go in FP
4671 register, vector fields go in vector registers, and everything
4672 else goes in int registers, packed as in memory.
8ff40a74 4673
0b5383eb
DJ
4674 This code is also used for function return values. RETVAL indicates
4675 whether this is the case.
8ff40a74 4676
a4d05547 4677 Much of this is taken from the SPARC V9 port, which has a similar
0b5383eb 4678 calling convention. */
594a51fe 4679
0b5383eb
DJ
4680static rtx
4681rs6000_darwin64_record_arg (CUMULATIVE_ARGS *orig_cum, tree type,
4682 int named, bool retval)
4683{
4684 rtx rvec[FIRST_PSEUDO_REGISTER];
4685 int k = 1, kbase = 1;
4686 HOST_WIDE_INT typesize = int_size_in_bytes (type);
4687 /* This is a copy; modifications are not visible to our caller. */
4688 CUMULATIVE_ARGS copy_cum = *orig_cum;
4689 CUMULATIVE_ARGS *cum = &copy_cum;
4690
4691 /* Pad to 16 byte boundary if needed. */
4692 if (!retval && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
4693 && (cum->words % 2) != 0)
4694 cum->words++;
4695
4696 cum->intoffset = 0;
4697 cum->use_stack = 0;
4698 cum->named = named;
4699
4700 /* Put entries into rvec[] for individual FP and vector fields, and
4701 for the chunks of memory that go in int regs. Note we start at
4702 element 1; 0 is reserved for an indication of using memory, and
4703 may or may not be filled in below. */
4704 rs6000_darwin64_record_arg_recurse (cum, type, 0, rvec, &k);
4705 rs6000_darwin64_record_arg_flush (cum, typesize * BITS_PER_UNIT, rvec, &k);
4706
4707 /* If any part of the struct went on the stack put all of it there.
4708 This hack is because the generic code for
4709 FUNCTION_ARG_PARTIAL_NREGS cannot handle cases where the register
4710 parts of the struct are not at the beginning. */
4711 if (cum->use_stack)
4712 {
4713 if (retval)
4714 return NULL_RTX; /* doesn't go in registers at all */
4715 kbase = 0;
4716 rvec[0] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
4717 }
4718 if (k > 1 || cum->use_stack)
4719 return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (k - kbase, &rvec[kbase]));
594a51fe
SS
4720 else
4721 return NULL_RTX;
4722}
4723
b78d48dd
FJ
4724/* Determine where to place an argument in 64-bit mode with 32-bit ABI. */
4725
4726static rtx
ec6376ab 4727rs6000_mixed_function_arg (enum machine_mode mode, tree type, int align_words)
b78d48dd 4728{
ec6376ab
AM
4729 int n_units;
4730 int i, k;
4731 rtx rvec[GP_ARG_NUM_REG + 1];
4732
4733 if (align_words >= GP_ARG_NUM_REG)
4734 return NULL_RTX;
4735
4736 n_units = rs6000_arg_size (mode, type);
4737
4738 /* Optimize the simple case where the arg fits in one gpr, except in
4739 the case of BLKmode due to assign_parms assuming that registers are
4740 BITS_PER_WORD wide. */
4741 if (n_units == 0
4742 || (n_units == 1 && mode != BLKmode))
4743 return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
4744
4745 k = 0;
4746 if (align_words + n_units > GP_ARG_NUM_REG)
4747 /* Not all of the arg fits in gprs. Say that it goes in memory too,
4748 using a magic NULL_RTX component.
4749 FIXME: This is not strictly correct. Only some of the arg
4750 belongs in memory, not all of it. However, there isn't any way
4751 to do this currently, apart from building rtx descriptions for
4752 the pieces of memory we want stored. Due to bugs in the generic
4753 code we can't use the normal function_arg_partial_nregs scheme
4754 with the PARALLEL arg description we emit here.
4755 In any case, the code to store the whole arg to memory is often
4756 more efficient than code to store pieces, and we know that space
4757 is available in the right place for the whole arg. */
78a52f11
RH
4758 /* FIXME: This should be fixed since the conversion to
4759 TARGET_ARG_PARTIAL_BYTES. */
ec6376ab
AM
4760 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
4761
4762 i = 0;
4763 do
36a454e1 4764 {
ec6376ab
AM
4765 rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
4766 rtx off = GEN_INT (i++ * 4);
4767 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
36a454e1 4768 }
ec6376ab
AM
4769 while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
4770
4771 return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
b78d48dd
FJ
4772}
4773
4697a36c
MM
4774/* Determine where to put an argument to a function.
4775 Value is zero to push the argument on the stack,
4776 or a hard register in which to store the argument.
4777
4778 MODE is the argument's machine mode.
4779 TYPE is the data type of the argument (as a tree).
4780 This is null for libcalls where that information may
4781 not be available.
4782 CUM is a variable of type CUMULATIVE_ARGS which gives info about
0b5383eb
DJ
4783 the preceding args and about the function being called. It is
4784 not modified in this routine.
4697a36c
MM
4785 NAMED is nonzero if this argument is a named parameter
4786 (otherwise it is an extra parameter matching an ellipsis).
4787
4788 On RS/6000 the first eight words of non-FP are normally in registers
4789 and the rest are pushed. Under AIX, the first 13 FP args are in registers.
4790 Under V.4, the first 8 FP args are in registers.
4791
4792 If this is floating-point and no prototype is specified, we use
4793 both an FP and integer register (or possibly FP reg and stack). Library
b9599e46 4794 functions (when CALL_LIBCALL is set) always have the proper types for args,
4697a36c 4795 so we can pass the FP value just in one register. emit_library_function
b2d04ecf
AM
4796 doesn't support PARALLEL anyway.
4797
4798 Note that for args passed by reference, function_arg will be called
4799 with MODE and TYPE set to that of the pointer to the arg, not the arg
4800 itself. */
4697a36c 4801
9390387d 4802rtx
f676971a 4803function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
a2369ed3 4804 tree type, int named)
4697a36c 4805{
4cc833b7 4806 enum rs6000_abi abi = DEFAULT_ABI;
4697a36c 4807
a4f6c312
SS
4808 /* Return a marker to indicate whether CR1 needs to set or clear the
4809 bit that V.4 uses to say fp args were passed in registers.
4810 Assume that we don't need the marker for software floating point,
4811 or compiler generated library calls. */
4697a36c
MM
4812 if (mode == VOIDmode)
4813 {
f607bc57 4814 if (abi == ABI_V4
7509c759 4815 && cum->nargs_prototype < 0
b9599e46
FS
4816 && (cum->call_cookie & CALL_LIBCALL) == 0
4817 && (cum->prototype || TARGET_NO_PROTOTYPE))
7509c759 4818 {
a3170dc6
AH
4819 /* For the SPE, we need to crxor CR6 always. */
4820 if (TARGET_SPE_ABI)
4821 return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
4822 else if (TARGET_HARD_FLOAT && TARGET_FPRS)
4823 return GEN_INT (cum->call_cookie
4824 | ((cum->fregno == FP_ARG_MIN_REG)
4825 ? CALL_V4_SET_FP_ARGS
4826 : CALL_V4_CLEAR_FP_ARGS));
7509c759 4827 }
4697a36c 4828
7509c759 4829 return GEN_INT (cum->call_cookie);
4697a36c
MM
4830 }
4831
0b5383eb
DJ
4832 if (rs6000_darwin64_abi && mode == BLKmode
4833 && TREE_CODE (type) == RECORD_TYPE)
8ff40a74 4834 {
0b5383eb 4835 rtx rslt = rs6000_darwin64_record_arg (cum, type, named, false);
8ff40a74
SS
4836 if (rslt != NULL_RTX)
4837 return rslt;
4838 /* Else fall through to usual handling. */
4839 }
4840
2858f73a 4841 if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
c72d6c26
HP
4842 if (TARGET_64BIT && ! cum->prototype)
4843 {
c4ad648e
AM
4844 /* Vector parameters get passed in vector register
4845 and also in GPRs or memory, in absence of prototype. */
4846 int align_words;
4847 rtx slot;
4848 align_words = (cum->words + 1) & ~1;
4849
4850 if (align_words >= GP_ARG_NUM_REG)
4851 {
4852 slot = NULL_RTX;
4853 }
4854 else
4855 {
4856 slot = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
4857 }
4858 return gen_rtx_PARALLEL (mode,
4859 gen_rtvec (2,
4860 gen_rtx_EXPR_LIST (VOIDmode,
4861 slot, const0_rtx),
4862 gen_rtx_EXPR_LIST (VOIDmode,
4863 gen_rtx_REG (mode, cum->vregno),
4864 const0_rtx)));
c72d6c26
HP
4865 }
4866 else
4867 return gen_rtx_REG (mode, cum->vregno);
ad630bef
DE
4868 else if (TARGET_ALTIVEC_ABI
4869 && (ALTIVEC_VECTOR_MODE (mode)
4870 || (type && TREE_CODE (type) == VECTOR_TYPE
4871 && int_size_in_bytes (type) == 16)))
0ac081f6 4872 {
2858f73a 4873 if (named || abi == ABI_V4)
a594a19c 4874 return NULL_RTX;
0ac081f6 4875 else
a594a19c
GK
4876 {
4877 /* Vector parameters to varargs functions under AIX or Darwin
4878 get passed in memory and possibly also in GPRs. */
ec6376ab
AM
4879 int align, align_words, n_words;
4880 enum machine_mode part_mode;
a594a19c
GK
4881
4882 /* Vector parameters must be 16-byte aligned. This places them at
2858f73a
GK
4883 2 mod 4 in terms of words in 32-bit mode, since the parameter
4884 save area starts at offset 24 from the stack. In 64-bit mode,
4885 they just have to start on an even word, since the parameter
4886 save area is 16-byte aligned. */
4887 if (TARGET_32BIT)
4ed78545 4888 align = (2 - cum->words) & 3;
2858f73a
GK
4889 else
4890 align = cum->words & 1;
a594a19c
GK
4891 align_words = cum->words + align;
4892
4893 /* Out of registers? Memory, then. */
4894 if (align_words >= GP_ARG_NUM_REG)
4895 return NULL_RTX;
ec6376ab
AM
4896
4897 if (TARGET_32BIT && TARGET_POWERPC64)
4898 return rs6000_mixed_function_arg (mode, type, align_words);
4899
2858f73a
GK
4900 /* The vector value goes in GPRs. Only the part of the
4901 value in GPRs is reported here. */
ec6376ab
AM
4902 part_mode = mode;
4903 n_words = rs6000_arg_size (mode, type);
4904 if (align_words + n_words > GP_ARG_NUM_REG)
839a4992 4905 /* Fortunately, there are only two possibilities, the value
2858f73a
GK
4906 is either wholly in GPRs or half in GPRs and half not. */
4907 part_mode = DImode;
ec6376ab
AM
4908
4909 return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
a594a19c 4910 }
0ac081f6 4911 }
f82f556d
AH
4912 else if (TARGET_SPE_ABI && TARGET_SPE
4913 && (SPE_VECTOR_MODE (mode)
18f63bfa
AH
4914 || (TARGET_E500_DOUBLE && (mode == DFmode
4915 || mode == DCmode))))
a6c9bed4 4916 return rs6000_spe_function_arg (cum, mode, type);
594a51fe 4917
f607bc57 4918 else if (abi == ABI_V4)
4697a36c 4919 {
a3170dc6 4920 if (TARGET_HARD_FLOAT && TARGET_FPRS
4cc833b7
RH
4921 && (mode == SFmode || mode == DFmode))
4922 {
4923 if (cum->fregno <= FP_ARG_V4_MAX_REG)
4924 return gen_rtx_REG (mode, cum->fregno);
4925 else
b78d48dd 4926 return NULL_RTX;
4cc833b7
RH
4927 }
4928 else
4929 {
b2d04ecf 4930 int n_words = rs6000_arg_size (mode, type);
4cc833b7
RH
4931 int gregno = cum->sysv_gregno;
4932
4ed78545
AM
4933 /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
4934 (r7,r8) or (r9,r10). As does any other 2 word item such
4935 as complex int due to a historical mistake. */
4936 if (n_words == 2)
4937 gregno += (1 - gregno) & 1;
4cc833b7 4938
4ed78545 4939 /* Multi-reg args are not split between registers and stack. */
ec6376ab 4940 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
b78d48dd 4941 return NULL_RTX;
ec6376ab
AM
4942
4943 if (TARGET_32BIT && TARGET_POWERPC64)
4944 return rs6000_mixed_function_arg (mode, type,
4945 gregno - GP_ARG_MIN_REG);
4946 return gen_rtx_REG (mode, gregno);
4cc833b7 4947 }
4697a36c 4948 }
4cc833b7
RH
4949 else
4950 {
294bd182 4951 int align_words = rs6000_parm_start (mode, type, cum->words);
b78d48dd 4952
2858f73a 4953 if (USE_FP_FOR_ARG_P (cum, mode, type))
4cc833b7 4954 {
ec6376ab
AM
4955 rtx rvec[GP_ARG_NUM_REG + 1];
4956 rtx r;
4957 int k;
c53bdcf5
AM
4958 bool needs_psave;
4959 enum machine_mode fmode = mode;
c53bdcf5
AM
4960 unsigned long n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
4961
4962 if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
4963 {
c53bdcf5
AM
4964 /* Currently, we only ever need one reg here because complex
4965 doubles are split. */
37409796 4966 gcc_assert (cum->fregno == FP_ARG_MAX_REG && fmode == TFmode);
ec6376ab
AM
4967
4968 /* Long double split over regs and memory. */
4969 fmode = DFmode;
c53bdcf5 4970 }
c53bdcf5
AM
4971
4972 /* Do we also need to pass this arg in the parameter save
4973 area? */
4974 needs_psave = (type
4975 && (cum->nargs_prototype <= 0
4976 || (DEFAULT_ABI == ABI_AIX
de17c25f 4977 && TARGET_XL_COMPAT
c53bdcf5
AM
4978 && align_words >= GP_ARG_NUM_REG)));
4979
4980 if (!needs_psave && mode == fmode)
ec6376ab 4981 return gen_rtx_REG (fmode, cum->fregno);
c53bdcf5 4982
ec6376ab 4983 k = 0;
c53bdcf5
AM
4984 if (needs_psave)
4985 {
ec6376ab 4986 /* Describe the part that goes in gprs or the stack.
c53bdcf5 4987 This piece must come first, before the fprs. */
c53bdcf5
AM
4988 if (align_words < GP_ARG_NUM_REG)
4989 {
4990 unsigned long n_words = rs6000_arg_size (mode, type);
ec6376ab
AM
4991
4992 if (align_words + n_words > GP_ARG_NUM_REG
4993 || (TARGET_32BIT && TARGET_POWERPC64))
4994 {
4995 /* If this is partially on the stack, then we only
4996 include the portion actually in registers here. */
4997 enum machine_mode rmode = TARGET_32BIT ? SImode : DImode;
4998 rtx off;
2e6c9641 4999 int i=0;
c4ad648e
AM
5000 if (align_words + n_words > GP_ARG_NUM_REG
5001 && (TARGET_32BIT && TARGET_POWERPC64))
5002 /* Not all of the arg fits in gprs. Say that it
5003 goes in memory too, using a magic NULL_RTX
5004 component. Also see comment in
5005 rs6000_mixed_function_arg for why the normal
5006 function_arg_partial_nregs scheme doesn't work
5007 in this case. */
5008 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX,
5009 const0_rtx);
ec6376ab
AM
5010 do
5011 {
5012 r = gen_rtx_REG (rmode,
5013 GP_ARG_MIN_REG + align_words);
2e6c9641 5014 off = GEN_INT (i++ * GET_MODE_SIZE (rmode));
ec6376ab
AM
5015 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
5016 }
5017 while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
5018 }
5019 else
5020 {
5021 /* The whole arg fits in gprs. */
5022 r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
5023 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
5024 }
c53bdcf5 5025 }
ec6376ab
AM
5026 else
5027 /* It's entirely in memory. */
5028 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
c53bdcf5
AM
5029 }
5030
ec6376ab
AM
5031 /* Describe where this piece goes in the fprs. */
5032 r = gen_rtx_REG (fmode, cum->fregno);
5033 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
5034
5035 return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
4cc833b7
RH
5036 }
5037 else if (align_words < GP_ARG_NUM_REG)
b2d04ecf 5038 {
ec6376ab
AM
5039 if (TARGET_32BIT && TARGET_POWERPC64)
5040 return rs6000_mixed_function_arg (mode, type, align_words);
b2d04ecf 5041
4eeca74f
AM
5042 if (mode == BLKmode)
5043 mode = Pmode;
5044
b2d04ecf
AM
5045 return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
5046 }
4cc833b7
RH
5047 else
5048 return NULL_RTX;
4697a36c 5049 }
4697a36c
MM
5050}
5051\f
ec6376ab 5052/* For an arg passed partly in registers and partly in memory, this is
fb63c729
AM
5053 the number of bytes passed in registers. For args passed entirely in
5054 registers or entirely in memory, zero. When an arg is described by a
5055 PARALLEL, perhaps using more than one register type, this function
5056 returns the number of bytes used by the first element of the PARALLEL. */
4697a36c 5057
78a52f11
RH
5058static int
5059rs6000_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5060 tree type, bool named)
4697a36c 5061{
c53bdcf5 5062 int ret = 0;
ec6376ab 5063 int align_words;
c53bdcf5 5064
f607bc57 5065 if (DEFAULT_ABI == ABI_V4)
4697a36c 5066 return 0;
4697a36c 5067
c53bdcf5
AM
5068 if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)
5069 && cum->nargs_prototype >= 0)
5070 return 0;
5071
0b5383eb
DJ
5072 /* In this complicated case we just disable the partial_nregs code. */
5073 if (rs6000_darwin64_abi && mode == BLKmode
5074 && TREE_CODE (type) == RECORD_TYPE
5075 && int_size_in_bytes (type) > 0)
5076 return 0;
5077
294bd182 5078 align_words = rs6000_parm_start (mode, type, cum->words);
ec6376ab
AM
5079
5080 if (USE_FP_FOR_ARG_P (cum, mode, type)
fb63c729
AM
5081 /* If we are passing this arg in the fixed parameter save area
5082 (gprs or memory) as well as fprs, then this function should
5083 return the number of bytes passed in the parameter save area
5084 rather than bytes passed in fprs. */
ec6376ab
AM
5085 && !(type
5086 && (cum->nargs_prototype <= 0
5087 || (DEFAULT_ABI == ABI_AIX
de17c25f 5088 && TARGET_XL_COMPAT
ec6376ab 5089 && align_words >= GP_ARG_NUM_REG))))
4697a36c 5090 {
c53bdcf5 5091 if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3) > FP_ARG_MAX_REG + 1)
ac7e839c 5092 ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8;
c53bdcf5 5093 else if (cum->nargs_prototype >= 0)
4697a36c
MM
5094 return 0;
5095 }
5096
ec6376ab
AM
5097 if (align_words < GP_ARG_NUM_REG
5098 && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
ac7e839c 5099 ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
78a52f11 5100
c53bdcf5 5101 if (ret != 0 && TARGET_DEBUG_ARG)
78a52f11 5102 fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
4697a36c 5103
c53bdcf5 5104 return ret;
4697a36c
MM
5105}
5106\f
5107/* A C expression that indicates when an argument must be passed by
5108 reference. If nonzero for an argument, a copy of that argument is
5109 made in memory and a pointer to the argument is passed instead of
5110 the argument itself. The pointer is passed in whatever way is
5111 appropriate for passing a pointer to that type.
5112
b2d04ecf
AM
5113 Under V.4, aggregates and long double are passed by reference.
5114
5115 As an extension to all 32-bit ABIs, AltiVec vectors are passed by
5116 reference unless the AltiVec vector extension ABI is in force.
c8c99a68
DE
5117
5118 As an extension to all ABIs, variable sized types are passed by
5119 reference. */
4697a36c 5120
8cd5a4e0 5121static bool
f676971a 5122rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
bada2eb8
DE
5123 enum machine_mode mode, tree type,
5124 bool named ATTRIBUTE_UNUSED)
4697a36c 5125{
bada2eb8 5126 if (DEFAULT_ABI == ABI_V4 && mode == TFmode)
4697a36c
MM
5127 {
5128 if (TARGET_DEBUG_ARG)
bada2eb8
DE
5129 fprintf (stderr, "function_arg_pass_by_reference: V4 long double\n");
5130 return 1;
5131 }
5132
5133 if (!type)
5134 return 0;
4697a36c 5135
bada2eb8
DE
5136 if (DEFAULT_ABI == ABI_V4 && AGGREGATE_TYPE_P (type))
5137 {
5138 if (TARGET_DEBUG_ARG)
5139 fprintf (stderr, "function_arg_pass_by_reference: V4 aggregate\n");
5140 return 1;
5141 }
5142
5143 if (int_size_in_bytes (type) < 0)
5144 {
5145 if (TARGET_DEBUG_ARG)
5146 fprintf (stderr, "function_arg_pass_by_reference: variable size\n");
5147 return 1;
5148 }
5149
5150 /* Allow -maltivec -mabi=no-altivec without warning. Altivec vector
5151 modes only exist for GCC vector types if -maltivec. */
5152 if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
5153 {
5154 if (TARGET_DEBUG_ARG)
5155 fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n");
4697a36c
MM
5156 return 1;
5157 }
b693336b
PB
5158
5159 /* Pass synthetic vectors in memory. */
bada2eb8 5160 if (TREE_CODE (type) == VECTOR_TYPE
ad630bef 5161 && int_size_in_bytes (type) > (TARGET_ALTIVEC_ABI ? 16 : 8))
b693336b
PB
5162 {
5163 static bool warned_for_pass_big_vectors = false;
5164 if (TARGET_DEBUG_ARG)
5165 fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
5166 if (!warned_for_pass_big_vectors)
5167 {
d4ee4d25 5168 warning (0, "GCC vector passed by reference: "
b693336b
PB
5169 "non-standard ABI extension with no compatibility guarantee");
5170 warned_for_pass_big_vectors = true;
5171 }
5172 return 1;
5173 }
5174
b2d04ecf 5175 return 0;
4697a36c 5176}
5985c7a6
FJ
5177
5178static void
2d9db8eb 5179rs6000_move_block_from_reg (int regno, rtx x, int nregs)
5985c7a6
FJ
5180{
5181 int i;
5182 enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
5183
5184 if (nregs == 0)
5185 return;
5186
c4ad648e 5187 for (i = 0; i < nregs; i++)
5985c7a6 5188 {
9390387d 5189 rtx tem = adjust_address_nv (x, reg_mode, i * GET_MODE_SIZE (reg_mode));
5985c7a6 5190 if (reload_completed)
c4ad648e
AM
5191 {
5192 if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
5193 tem = NULL_RTX;
5194 else
5195 tem = simplify_gen_subreg (reg_mode, x, BLKmode,
9390387d 5196 i * GET_MODE_SIZE (reg_mode));
c4ad648e 5197 }
5985c7a6
FJ
5198 else
5199 tem = replace_equiv_address (tem, XEXP (tem, 0));
5200
37409796 5201 gcc_assert (tem);
5985c7a6
FJ
5202
5203 emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
5204 }
5205}
4697a36c
MM
5206\f
5207/* Perform any needed actions needed for a function that is receiving a
f676971a 5208 variable number of arguments.
4697a36c
MM
5209
5210 CUM is as above.
5211
5212 MODE and TYPE are the mode and type of the current parameter.
5213
5214 PRETEND_SIZE is a variable that should be set to the amount of stack
5215 that must be pushed by the prolog to pretend that our caller pushed
5216 it.
5217
5218 Normally, this macro will push all remaining incoming registers on the
5219 stack and set PRETEND_SIZE to the length of the registers pushed. */
5220
c6e8c921 5221static void
f676971a 5222setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
c4ad648e
AM
5223 tree type, int *pretend_size ATTRIBUTE_UNUSED,
5224 int no_rtl)
4697a36c 5225{
4cc833b7
RH
5226 CUMULATIVE_ARGS next_cum;
5227 int reg_size = TARGET_32BIT ? 4 : 8;
ca5adc63 5228 rtx save_area = NULL_RTX, mem;
dfafc897 5229 int first_reg_offset, set;
4697a36c 5230
f31bf321 5231 /* Skip the last named argument. */
d34c5b80 5232 next_cum = *cum;
594a51fe 5233 function_arg_advance (&next_cum, mode, type, 1, 0);
4cc833b7 5234
f607bc57 5235 if (DEFAULT_ABI == ABI_V4)
d34c5b80 5236 {
5b667039
JJ
5237 first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
5238
60e2d0ca 5239 if (! no_rtl)
5b667039
JJ
5240 {
5241 int gpr_reg_num = 0, gpr_size = 0, fpr_size = 0;
5242 HOST_WIDE_INT offset = 0;
5243
5244 /* Try to optimize the size of the varargs save area.
5245 The ABI requires that ap.reg_save_area is doubleword
5246 aligned, but we don't need to allocate space for all
5247 the bytes, only those to which we actually will save
5248 anything. */
5249 if (cfun->va_list_gpr_size && first_reg_offset < GP_ARG_NUM_REG)
5250 gpr_reg_num = GP_ARG_NUM_REG - first_reg_offset;
5251 if (TARGET_HARD_FLOAT && TARGET_FPRS
5252 && next_cum.fregno <= FP_ARG_V4_MAX_REG
5253 && cfun->va_list_fpr_size)
5254 {
5255 if (gpr_reg_num)
5256 fpr_size = (next_cum.fregno - FP_ARG_MIN_REG)
5257 * UNITS_PER_FP_WORD;
5258 if (cfun->va_list_fpr_size
5259 < FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
5260 fpr_size += cfun->va_list_fpr_size * UNITS_PER_FP_WORD;
5261 else
5262 fpr_size += (FP_ARG_V4_MAX_REG + 1 - next_cum.fregno)
5263 * UNITS_PER_FP_WORD;
5264 }
5265 if (gpr_reg_num)
5266 {
5267 offset = -((first_reg_offset * reg_size) & ~7);
5268 if (!fpr_size && gpr_reg_num > cfun->va_list_gpr_size)
5269 {
5270 gpr_reg_num = cfun->va_list_gpr_size;
5271 if (reg_size == 4 && (first_reg_offset & 1))
5272 gpr_reg_num++;
5273 }
5274 gpr_size = (gpr_reg_num * reg_size + 7) & ~7;
5275 }
5276 else if (fpr_size)
5277 offset = - (int) (next_cum.fregno - FP_ARG_MIN_REG)
5278 * UNITS_PER_FP_WORD
5279 - (int) (GP_ARG_NUM_REG * reg_size);
4cc833b7 5280
5b667039
JJ
5281 if (gpr_size + fpr_size)
5282 {
5283 rtx reg_save_area
5284 = assign_stack_local (BLKmode, gpr_size + fpr_size, 64);
5285 gcc_assert (GET_CODE (reg_save_area) == MEM);
5286 reg_save_area = XEXP (reg_save_area, 0);
5287 if (GET_CODE (reg_save_area) == PLUS)
5288 {
5289 gcc_assert (XEXP (reg_save_area, 0)
5290 == virtual_stack_vars_rtx);
5291 gcc_assert (GET_CODE (XEXP (reg_save_area, 1)) == CONST_INT);
5292 offset += INTVAL (XEXP (reg_save_area, 1));
5293 }
5294 else
5295 gcc_assert (reg_save_area == virtual_stack_vars_rtx);
5296 }
5297
5298 cfun->machine->varargs_save_offset = offset;
5299 save_area = plus_constant (virtual_stack_vars_rtx, offset);
5300 }
4697a36c 5301 }
60e2d0ca 5302 else
4697a36c 5303 {
d34c5b80 5304 first_reg_offset = next_cum.words;
4cc833b7 5305 save_area = virtual_incoming_args_rtx;
4697a36c 5306
fe984136 5307 if (targetm.calls.must_pass_in_stack (mode, type))
c53bdcf5 5308 first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
4cc833b7 5309 }
4697a36c 5310
dfafc897 5311 set = get_varargs_alias_set ();
9d30f3c1
JJ
5312 if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG
5313 && cfun->va_list_gpr_size)
4cc833b7 5314 {
9d30f3c1
JJ
5315 int nregs = GP_ARG_NUM_REG - first_reg_offset;
5316
5317 if (va_list_gpr_counter_field)
5318 {
5319 /* V4 va_list_gpr_size counts number of registers needed. */
5320 if (nregs > cfun->va_list_gpr_size)
5321 nregs = cfun->va_list_gpr_size;
5322 }
5323 else
5324 {
5325 /* char * va_list instead counts number of bytes needed. */
5326 if (nregs > cfun->va_list_gpr_size / reg_size)
5327 nregs = cfun->va_list_gpr_size / reg_size;
5328 }
5329
dfafc897 5330 mem = gen_rtx_MEM (BLKmode,
c4ad648e 5331 plus_constant (save_area,
dfafc897 5332 first_reg_offset * reg_size)),
ba4828e0 5333 set_mem_alias_set (mem, set);
8ac61af7 5334 set_mem_align (mem, BITS_PER_WORD);
dfafc897 5335
f676971a 5336 rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
9d30f3c1 5337 nregs);
4697a36c
MM
5338 }
5339
4697a36c 5340 /* Save FP registers if needed. */
f607bc57 5341 if (DEFAULT_ABI == ABI_V4
a3170dc6
AH
5342 && TARGET_HARD_FLOAT && TARGET_FPRS
5343 && ! no_rtl
9d30f3c1
JJ
5344 && next_cum.fregno <= FP_ARG_V4_MAX_REG
5345 && cfun->va_list_fpr_size)
4697a36c 5346 {
9d30f3c1 5347 int fregno = next_cum.fregno, nregs;
9ebbca7d 5348 rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
4cc833b7 5349 rtx lab = gen_label_rtx ();
5b667039
JJ
5350 int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG)
5351 * UNITS_PER_FP_WORD);
4697a36c 5352
c4ad648e
AM
5353 emit_jump_insn
5354 (gen_rtx_SET (VOIDmode,
5355 pc_rtx,
5356 gen_rtx_IF_THEN_ELSE (VOIDmode,
4cc833b7 5357 gen_rtx_NE (VOIDmode, cr1,
c4ad648e 5358 const0_rtx),
39403d82 5359 gen_rtx_LABEL_REF (VOIDmode, lab),
4697a36c
MM
5360 pc_rtx)));
5361
9d30f3c1
JJ
5362 for (nregs = 0;
5363 fregno <= FP_ARG_V4_MAX_REG && nregs < cfun->va_list_fpr_size;
5b667039 5364 fregno++, off += UNITS_PER_FP_WORD, nregs++)
4cc833b7 5365 {
5496b36f 5366 mem = gen_rtx_MEM (DFmode, plus_constant (save_area, off));
c4ad648e 5367 set_mem_alias_set (mem, set);
94ff898d 5368 set_mem_align (mem, GET_MODE_ALIGNMENT (DFmode));
dfafc897 5369 emit_move_insn (mem, gen_rtx_REG (DFmode, fregno));
4697a36c 5370 }
4cc833b7
RH
5371
5372 emit_label (lab);
4697a36c 5373 }
4697a36c 5374}
4697a36c 5375
dfafc897 5376/* Create the va_list data type. */
2c4974b7 5377
c35d187f
RH
5378static tree
5379rs6000_build_builtin_va_list (void)
dfafc897 5380{
64c2816f 5381 tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
4697a36c 5382
9ebbca7d
GK
5383 /* For AIX, prefer 'char *' because that's what the system
5384 header files like. */
f607bc57 5385 if (DEFAULT_ABI != ABI_V4)
9ebbca7d 5386 return build_pointer_type (char_type_node);
dfafc897 5387
f1e639b1 5388 record = (*lang_hooks.types.make_type) (RECORD_TYPE);
bab45a51 5389 type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
0f4fd75d 5390
f676971a 5391 f_gpr = build_decl (FIELD_DECL, get_identifier ("gpr"),
9ebbca7d 5392 unsigned_char_type_node);
f676971a 5393 f_fpr = build_decl (FIELD_DECL, get_identifier ("fpr"),
9ebbca7d 5394 unsigned_char_type_node);
64c2816f
DT
5395 /* Give the two bytes of padding a name, so that -Wpadded won't warn on
5396 every user file. */
5397 f_res = build_decl (FIELD_DECL, get_identifier ("reserved"),
5398 short_unsigned_type_node);
dfafc897
FS
5399 f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
5400 ptr_type_node);
5401 f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
5402 ptr_type_node);
5403
9d30f3c1
JJ
5404 va_list_gpr_counter_field = f_gpr;
5405 va_list_fpr_counter_field = f_fpr;
5406
dfafc897
FS
5407 DECL_FIELD_CONTEXT (f_gpr) = record;
5408 DECL_FIELD_CONTEXT (f_fpr) = record;
64c2816f 5409 DECL_FIELD_CONTEXT (f_res) = record;
dfafc897
FS
5410 DECL_FIELD_CONTEXT (f_ovf) = record;
5411 DECL_FIELD_CONTEXT (f_sav) = record;
5412
bab45a51
FS
5413 TREE_CHAIN (record) = type_decl;
5414 TYPE_NAME (record) = type_decl;
dfafc897
FS
5415 TYPE_FIELDS (record) = f_gpr;
5416 TREE_CHAIN (f_gpr) = f_fpr;
64c2816f
DT
5417 TREE_CHAIN (f_fpr) = f_res;
5418 TREE_CHAIN (f_res) = f_ovf;
dfafc897
FS
5419 TREE_CHAIN (f_ovf) = f_sav;
5420
5421 layout_type (record);
5422
5423 /* The correct type is an array type of one element. */
5424 return build_array_type (record, build_index_type (size_zero_node));
5425}
5426
5427/* Implement va_start. */
5428
5429void
a2369ed3 5430rs6000_va_start (tree valist, rtx nextarg)
4697a36c 5431{
dfafc897 5432 HOST_WIDE_INT words, n_gpr, n_fpr;
c566f9bd 5433 tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
dfafc897 5434 tree gpr, fpr, ovf, sav, t;
2c4974b7 5435
dfafc897 5436 /* Only SVR4 needs something special. */
f607bc57 5437 if (DEFAULT_ABI != ABI_V4)
dfafc897 5438 {
e5faf155 5439 std_expand_builtin_va_start (valist, nextarg);
dfafc897
FS
5440 return;
5441 }
5442
973a648b 5443 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
dfafc897 5444 f_fpr = TREE_CHAIN (f_gpr);
c566f9bd
DT
5445 f_res = TREE_CHAIN (f_fpr);
5446 f_ovf = TREE_CHAIN (f_res);
dfafc897
FS
5447 f_sav = TREE_CHAIN (f_ovf);
5448
872a65b5 5449 valist = build_va_arg_indirect_ref (valist);
44de5aeb
RK
5450 gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
5451 fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
5452 ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
5453 sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
dfafc897
FS
5454
5455 /* Count number of gp and fp argument registers used. */
4cc833b7 5456 words = current_function_args_info.words;
987732e0
DE
5457 n_gpr = MIN (current_function_args_info.sysv_gregno - GP_ARG_MIN_REG,
5458 GP_ARG_NUM_REG);
5459 n_fpr = MIN (current_function_args_info.fregno - FP_ARG_MIN_REG,
5460 FP_ARG_NUM_REG);
dfafc897
FS
5461
5462 if (TARGET_DEBUG_ARG)
4a0a75dd
KG
5463 fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
5464 HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
5465 words, n_gpr, n_fpr);
dfafc897 5466
9d30f3c1
JJ
5467 if (cfun->va_list_gpr_size)
5468 {
5469 t = build (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
5470 build_int_cst (NULL_TREE, n_gpr));
5471 TREE_SIDE_EFFECTS (t) = 1;
5472 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5473 }
58c8adc1 5474
9d30f3c1
JJ
5475 if (cfun->va_list_fpr_size)
5476 {
5477 t = build (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
5478 build_int_cst (NULL_TREE, n_fpr));
5479 TREE_SIDE_EFFECTS (t) = 1;
5480 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5481 }
dfafc897
FS
5482
5483 /* Find the overflow area. */
5484 t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
5485 if (words != 0)
5486 t = build (PLUS_EXPR, TREE_TYPE (ovf), t,
7d60be94 5487 build_int_cst (NULL_TREE, words * UNITS_PER_WORD));
dfafc897
FS
5488 t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
5489 TREE_SIDE_EFFECTS (t) = 1;
5490 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5491
9d30f3c1
JJ
5492 /* If there were no va_arg invocations, don't set up the register
5493 save area. */
5494 if (!cfun->va_list_gpr_size
5495 && !cfun->va_list_fpr_size
5496 && n_gpr < GP_ARG_NUM_REG
5497 && n_fpr < FP_ARG_V4_MAX_REG)
5498 return;
5499
dfafc897
FS
5500 /* Find the register save area. */
5501 t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
5b667039
JJ
5502 if (cfun->machine->varargs_save_offset)
5503 t = build (PLUS_EXPR, TREE_TYPE (sav), t,
5504 build_int_cst (NULL_TREE, cfun->machine->varargs_save_offset));
dfafc897
FS
5505 t = build (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
5506 TREE_SIDE_EFFECTS (t) = 1;
5507 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5508}
5509
5510/* Implement va_arg. */
5511
23a60a04
JM
5512tree
5513rs6000_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p)
cd3ce9b4 5514{
cd3ce9b4
JM
5515 tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
5516 tree gpr, fpr, ovf, sav, reg, t, u;
08b0dc1b 5517 int size, rsize, n_reg, sav_ofs, sav_scale;
cd3ce9b4
JM
5518 tree lab_false, lab_over, addr;
5519 int align;
5520 tree ptrtype = build_pointer_type (type);
5521
08b0dc1b
RH
5522 if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
5523 {
5524 t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
872a65b5 5525 return build_va_arg_indirect_ref (t);
08b0dc1b
RH
5526 }
5527
cd3ce9b4
JM
5528 if (DEFAULT_ABI != ABI_V4)
5529 {
08b0dc1b 5530 if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
cd3ce9b4
JM
5531 {
5532 tree elem_type = TREE_TYPE (type);
5533 enum machine_mode elem_mode = TYPE_MODE (elem_type);
5534 int elem_size = GET_MODE_SIZE (elem_mode);
5535
5536 if (elem_size < UNITS_PER_WORD)
5537 {
23a60a04 5538 tree real_part, imag_part;
cd3ce9b4
JM
5539 tree post = NULL_TREE;
5540
23a60a04
JM
5541 real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
5542 &post);
5543 /* Copy the value into a temporary, lest the formal temporary
5544 be reused out from under us. */
5545 real_part = get_initialized_tmp_var (real_part, pre_p, &post);
cd3ce9b4
JM
5546 append_to_statement_list (post, pre_p);
5547
23a60a04
JM
5548 imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
5549 post_p);
cd3ce9b4 5550
23a60a04 5551 return build (COMPLEX_EXPR, type, real_part, imag_part);
cd3ce9b4
JM
5552 }
5553 }
5554
23a60a04 5555 return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
cd3ce9b4
JM
5556 }
5557
5558 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
5559 f_fpr = TREE_CHAIN (f_gpr);
5560 f_res = TREE_CHAIN (f_fpr);
5561 f_ovf = TREE_CHAIN (f_res);
5562 f_sav = TREE_CHAIN (f_ovf);
5563
872a65b5 5564 valist = build_va_arg_indirect_ref (valist);
44de5aeb
RK
5565 gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
5566 fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
5567 ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
5568 sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
cd3ce9b4
JM
5569
5570 size = int_size_in_bytes (type);
5571 rsize = (size + 3) / 4;
5572 align = 1;
5573
08b0dc1b
RH
5574 if (TARGET_HARD_FLOAT && TARGET_FPRS
5575 && (TYPE_MODE (type) == SFmode || TYPE_MODE (type) == DFmode))
cd3ce9b4
JM
5576 {
5577 /* FP args go in FP registers, if present. */
cd3ce9b4
JM
5578 reg = fpr;
5579 n_reg = 1;
5580 sav_ofs = 8*4;
5581 sav_scale = 8;
5582 if (TYPE_MODE (type) == DFmode)
5583 align = 8;
5584 }
5585 else
5586 {
5587 /* Otherwise into GP registers. */
cd3ce9b4
JM
5588 reg = gpr;
5589 n_reg = rsize;
5590 sav_ofs = 0;
5591 sav_scale = 4;
5592 if (n_reg == 2)
5593 align = 8;
5594 }
5595
5596 /* Pull the value out of the saved registers.... */
5597
5598 lab_over = NULL;
5599 addr = create_tmp_var (ptr_type_node, "addr");
5600 DECL_POINTER_ALIAS_SET (addr) = get_varargs_alias_set ();
5601
5602 /* AltiVec vectors never go in registers when -mabi=altivec. */
5603 if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
5604 align = 16;
5605 else
5606 {
5607 lab_false = create_artificial_label ();
5608 lab_over = create_artificial_label ();
5609
5610 /* Long long and SPE vectors are aligned in the registers.
5611 As are any other 2 gpr item such as complex int due to a
5612 historical mistake. */
5613 u = reg;
5614 if (n_reg == 2)
5615 {
5616 u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), reg,
95674810 5617 size_int (n_reg - 1));
cd3ce9b4
JM
5618 u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg, u);
5619 }
5620
95674810 5621 t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
cd3ce9b4
JM
5622 t = build2 (GE_EXPR, boolean_type_node, u, t);
5623 u = build1 (GOTO_EXPR, void_type_node, lab_false);
5624 t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
5625 gimplify_and_add (t, pre_p);
5626
5627 t = sav;
5628 if (sav_ofs)
95674810 5629 t = build2 (PLUS_EXPR, ptr_type_node, sav, size_int (sav_ofs));
cd3ce9b4 5630
95674810 5631 u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg, size_int (n_reg));
cd3ce9b4 5632 u = build1 (CONVERT_EXPR, integer_type_node, u);
95674810 5633 u = build2 (MULT_EXPR, integer_type_node, u, size_int (sav_scale));
cd3ce9b4
JM
5634 t = build2 (PLUS_EXPR, ptr_type_node, t, u);
5635
5636 t = build2 (MODIFY_EXPR, void_type_node, addr, t);
5637 gimplify_and_add (t, pre_p);
5638
5639 t = build1 (GOTO_EXPR, void_type_node, lab_over);
5640 gimplify_and_add (t, pre_p);
5641
5642 t = build1 (LABEL_EXPR, void_type_node, lab_false);
5643 append_to_statement_list (t, pre_p);
5644
5645 if (n_reg > 2)
5646 {
5647 /* Ensure that we don't find any more args in regs.
5648 Alignment has taken care of the n_reg == 2 case. */
95674810 5649 t = build (MODIFY_EXPR, TREE_TYPE (reg), reg, size_int (8));
cd3ce9b4
JM
5650 gimplify_and_add (t, pre_p);
5651 }
5652 }
5653
5654 /* ... otherwise out of the overflow area. */
5655
5656 /* Care for on-stack alignment if needed. */
5657 t = ovf;
5658 if (align != 1)
5659 {
95674810 5660 t = build2 (PLUS_EXPR, TREE_TYPE (t), t, size_int (align - 1));
4a90aeeb 5661 t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
7d60be94 5662 build_int_cst (NULL_TREE, -align));
cd3ce9b4
JM
5663 }
5664 gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
5665
5666 u = build2 (MODIFY_EXPR, void_type_node, addr, t);
5667 gimplify_and_add (u, pre_p);
5668
95674810 5669 t = build2 (PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
cd3ce9b4
JM
5670 t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
5671 gimplify_and_add (t, pre_p);
5672
5673 if (lab_over)
5674 {
5675 t = build1 (LABEL_EXPR, void_type_node, lab_over);
5676 append_to_statement_list (t, pre_p);
5677 }
5678
08b0dc1b 5679 addr = fold_convert (ptrtype, addr);
872a65b5 5680 return build_va_arg_indirect_ref (addr);
cd3ce9b4
JM
5681}
5682
0ac081f6
AH
5683/* Builtins. */
5684
58646b77
PB
5685static void
5686def_builtin (int mask, const char *name, tree type, int code)
5687{
5688 if (mask & target_flags)
5689 {
5690 if (rs6000_builtin_decls[code])
5691 abort ();
5692
5693 rs6000_builtin_decls[code] =
5694 lang_hooks.builtin_function (name, type, code, BUILT_IN_MD,
5695 NULL, NULL_TREE);
5696 }
5697}
0ac081f6 5698
24408032
AH
5699/* Simple ternary operations: VECd = foo (VECa, VECb, VECc). */
5700
2212663f 5701static const struct builtin_description bdesc_3arg[] =
24408032
AH
5702{
5703 { MASK_ALTIVEC, CODE_FOR_altivec_vmaddfp, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
5704 { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
5705 { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
5706 { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
5707 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
5708 { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
5709 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
5710 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
5711 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
5712 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
f676971a 5713 { MASK_ALTIVEC, CODE_FOR_altivec_vnmsubfp, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
aba5fb01
NS
5714 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
5715 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
5716 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
5717 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_v16qi, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
5718 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
5719 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
5720 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
5721 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_v16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
5722 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
5723 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
5724 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
5725 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_v4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
58646b77
PB
5726
5727 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madd", ALTIVEC_BUILTIN_VEC_MADD },
5728 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_madds", ALTIVEC_BUILTIN_VEC_MADDS },
5729 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mladd", ALTIVEC_BUILTIN_VEC_MLADD },
5730 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mradds", ALTIVEC_BUILTIN_VEC_MRADDS },
5731 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msum", ALTIVEC_BUILTIN_VEC_MSUM },
5732 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshm", ALTIVEC_BUILTIN_VEC_VMSUMSHM },
5733 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhm", ALTIVEC_BUILTIN_VEC_VMSUMUHM },
5734 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsummbm", ALTIVEC_BUILTIN_VEC_VMSUMMBM },
5735 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumubm", ALTIVEC_BUILTIN_VEC_VMSUMUBM },
5736 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_msums", ALTIVEC_BUILTIN_VEC_MSUMS },
5737 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumshs", ALTIVEC_BUILTIN_VEC_VMSUMSHS },
5738 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmsumuhs", ALTIVEC_BUILTIN_VEC_VMSUMUHS },
5739 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nmsub", ALTIVEC_BUILTIN_VEC_NMSUB },
5740 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_perm", ALTIVEC_BUILTIN_VEC_PERM },
5741 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sel", ALTIVEC_BUILTIN_VEC_SEL },
24408032 5742};
2212663f 5743
95385cbb
AH
5744/* DST operations: void foo (void *, const int, const char). */
5745
5746static const struct builtin_description bdesc_dst[] =
5747{
5748 { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
5749 { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
5750 { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
58646b77
PB
5751 { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT },
5752
5753 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dst", ALTIVEC_BUILTIN_VEC_DST },
5754 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstt", ALTIVEC_BUILTIN_VEC_DSTT },
5755 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dstst", ALTIVEC_BUILTIN_VEC_DSTST },
5756 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_dststt", ALTIVEC_BUILTIN_VEC_DSTSTT }
95385cbb
AH
5757};
5758
2212663f 5759/* Simple binary operations: VECc = foo (VECa, VECb). */
24408032 5760
a3170dc6 5761static struct builtin_description bdesc_2arg[] =
0ac081f6 5762{
f18c054f
DB
5763 { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
5764 { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
5765 { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
5766 { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
0ac081f6
AH
5767 { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
5768 { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
5769 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
5770 { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
5771 { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
5772 { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
5773 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
f18c054f 5774 { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
aba5fb01 5775 { MASK_ALTIVEC, CODE_FOR_andcv4si3, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
0ac081f6
AH
5776 { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
5777 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
5778 { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
5779 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
5780 { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
5781 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
617e0e1d
DB
5782 { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
5783 { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
0ac081f6
AH
5784 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
5785 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequb, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
5786 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequh, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
5787 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequw, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
5788 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpeqfp, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
5789 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgefp, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
5790 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtub, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
5791 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsb, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
5792 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuh, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
5793 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsh, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
5794 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuw, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
5795 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsw, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
5796 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtfp, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
617e0e1d
DB
5797 { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
5798 { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
f18c054f
DB
5799 { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
5800 { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
df966bff
AH
5801 { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
5802 { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
5803 { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
5804 { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
5805 { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
0ac081f6
AH
5806 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
5807 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
5808 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
5809 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
5810 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
5811 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
f18c054f
DB
5812 { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
5813 { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
5814 { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
5815 { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
5816 { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
5817 { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
5818 { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
0ac081f6
AH
5819 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
5820 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
5821 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
5822 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
5823 { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
5824 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
5825 { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
5826 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
f96bc213 5827 { MASK_ALTIVEC, CODE_FOR_altivec_norv4si3, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
f18c054f 5828 { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
0ac081f6
AH
5829 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
5830 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
5831 { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
5832 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhss, "__builtin_altivec_vpkuhss", ALTIVEC_BUILTIN_VPKUHSS },
5833 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
5834 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwss, "__builtin_altivec_vpkuwss", ALTIVEC_BUILTIN_VPKUWSS },
5835 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
5836 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
5837 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
5838 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
5839 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
5840 { MASK_ALTIVEC, CODE_FOR_altivec_vrlb, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
5841 { MASK_ALTIVEC, CODE_FOR_altivec_vrlh, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
5842 { MASK_ALTIVEC, CODE_FOR_altivec_vrlw, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
5843 { MASK_ALTIVEC, CODE_FOR_altivec_vslb, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
5844 { MASK_ALTIVEC, CODE_FOR_altivec_vslh, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
5845 { MASK_ALTIVEC, CODE_FOR_altivec_vslw, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
5846 { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
5847 { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
2212663f
DB
5848 { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
5849 { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
5850 { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
3e0de9d1
DP
5851 { MASK_ALTIVEC, CODE_FOR_lshrv16qi3, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
5852 { MASK_ALTIVEC, CODE_FOR_lshrv8hi3, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
5853 { MASK_ALTIVEC, CODE_FOR_lshrv4si3, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
5854 { MASK_ALTIVEC, CODE_FOR_ashrv16qi3, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
5855 { MASK_ALTIVEC, CODE_FOR_ashrv8hi3, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
5856 { MASK_ALTIVEC, CODE_FOR_ashrv4si3, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
0ac081f6
AH
5857 { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
5858 { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
f18c054f
DB
5859 { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
5860 { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
5861 { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
5862 { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
0ac081f6
AH
5863 { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
5864 { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
5865 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
5866 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
5867 { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
5868 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
5869 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
5870 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
5871 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
5872 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
5873 { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
5874 { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
f18c054f 5875 { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
a3170dc6 5876
58646b77
PB
5877 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_add", ALTIVEC_BUILTIN_VEC_ADD },
5878 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddfp", ALTIVEC_BUILTIN_VEC_VADDFP },
5879 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduwm", ALTIVEC_BUILTIN_VEC_VADDUWM },
5880 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhm", ALTIVEC_BUILTIN_VEC_VADDUHM },
5881 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubm", ALTIVEC_BUILTIN_VEC_VADDUBM },
5882 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_addc", ALTIVEC_BUILTIN_VEC_ADDC },
5883 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_adds", ALTIVEC_BUILTIN_VEC_ADDS },
5884 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsws", ALTIVEC_BUILTIN_VEC_VADDSWS },
5885 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduws", ALTIVEC_BUILTIN_VEC_VADDUWS },
5886 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddshs", ALTIVEC_BUILTIN_VEC_VADDSHS },
5887 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vadduhs", ALTIVEC_BUILTIN_VEC_VADDUHS },
5888 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddsbs", ALTIVEC_BUILTIN_VEC_VADDSBS },
5889 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vaddubs", ALTIVEC_BUILTIN_VEC_VADDUBS },
5890 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_and", ALTIVEC_BUILTIN_VEC_AND },
5891 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_andc", ALTIVEC_BUILTIN_VEC_ANDC },
5892 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_avg", ALTIVEC_BUILTIN_VEC_AVG },
5893 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsw", ALTIVEC_BUILTIN_VEC_VAVGSW },
5894 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguw", ALTIVEC_BUILTIN_VEC_VAVGUW },
5895 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsh", ALTIVEC_BUILTIN_VEC_VAVGSH },
5896 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavguh", ALTIVEC_BUILTIN_VEC_VAVGUH },
5897 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgsb", ALTIVEC_BUILTIN_VEC_VAVGSB },
5898 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vavgub", ALTIVEC_BUILTIN_VEC_VAVGUB },
5899 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpb", ALTIVEC_BUILTIN_VEC_CMPB },
5900 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpeq", ALTIVEC_BUILTIN_VEC_CMPEQ },
5901 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpeqfp", ALTIVEC_BUILTIN_VEC_VCMPEQFP },
5902 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequw", ALTIVEC_BUILTIN_VEC_VCMPEQUW },
5903 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequh", ALTIVEC_BUILTIN_VEC_VCMPEQUH },
5904 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpequb", ALTIVEC_BUILTIN_VEC_VCMPEQUB },
5905 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpge", ALTIVEC_BUILTIN_VEC_CMPGE },
5906 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmpgt", ALTIVEC_BUILTIN_VEC_CMPGT },
5907 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtfp", ALTIVEC_BUILTIN_VEC_VCMPGTFP },
5908 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsw", ALTIVEC_BUILTIN_VEC_VCMPGTSW },
5909 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuw", ALTIVEC_BUILTIN_VEC_VCMPGTUW },
5910 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsh", ALTIVEC_BUILTIN_VEC_VCMPGTSH },
5911 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtuh", ALTIVEC_BUILTIN_VEC_VCMPGTUH },
5912 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtsb", ALTIVEC_BUILTIN_VEC_VCMPGTSB },
5913 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vcmpgtub", ALTIVEC_BUILTIN_VEC_VCMPGTUB },
5914 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmple", ALTIVEC_BUILTIN_VEC_CMPLE },
5915 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_cmplt", ALTIVEC_BUILTIN_VEC_CMPLT },
5916 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_max", ALTIVEC_BUILTIN_VEC_MAX },
5917 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxfp", ALTIVEC_BUILTIN_VEC_VMAXFP },
5918 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsw", ALTIVEC_BUILTIN_VEC_VMAXSW },
5919 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuw", ALTIVEC_BUILTIN_VEC_VMAXUW },
5920 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsh", ALTIVEC_BUILTIN_VEC_VMAXSH },
5921 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxuh", ALTIVEC_BUILTIN_VEC_VMAXUH },
5922 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxsb", ALTIVEC_BUILTIN_VEC_VMAXSB },
5923 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmaxub", ALTIVEC_BUILTIN_VEC_VMAXUB },
5924 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergeh", ALTIVEC_BUILTIN_VEC_MERGEH },
5925 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghw", ALTIVEC_BUILTIN_VEC_VMRGHW },
5926 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghh", ALTIVEC_BUILTIN_VEC_VMRGHH },
5927 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrghb", ALTIVEC_BUILTIN_VEC_VMRGHB },
5928 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mergel", ALTIVEC_BUILTIN_VEC_MERGEL },
5929 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglw", ALTIVEC_BUILTIN_VEC_VMRGLW },
5930 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglh", ALTIVEC_BUILTIN_VEC_VMRGLH },
5931 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmrglb", ALTIVEC_BUILTIN_VEC_VMRGLB },
5932 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_min", ALTIVEC_BUILTIN_VEC_MIN },
5933 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminfp", ALTIVEC_BUILTIN_VEC_VMINFP },
5934 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsw", ALTIVEC_BUILTIN_VEC_VMINSW },
5935 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuw", ALTIVEC_BUILTIN_VEC_VMINUW },
5936 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsh", ALTIVEC_BUILTIN_VEC_VMINSH },
5937 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminuh", ALTIVEC_BUILTIN_VEC_VMINUH },
5938 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminsb", ALTIVEC_BUILTIN_VEC_VMINSB },
5939 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vminub", ALTIVEC_BUILTIN_VEC_VMINUB },
5940 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mule", ALTIVEC_BUILTIN_VEC_MULE },
5941 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleub", ALTIVEC_BUILTIN_VEC_VMULEUB },
5942 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesb", ALTIVEC_BUILTIN_VEC_VMULESB },
5943 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuleuh", ALTIVEC_BUILTIN_VEC_VMULEUH },
5944 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulesh", ALTIVEC_BUILTIN_VEC_VMULESH },
5945 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mulo", ALTIVEC_BUILTIN_VEC_MULO },
5946 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosh", ALTIVEC_BUILTIN_VEC_VMULOSH },
5947 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulouh", ALTIVEC_BUILTIN_VEC_VMULOUH },
5948 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmulosb", ALTIVEC_BUILTIN_VEC_VMULOSB },
5949 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vmuloub", ALTIVEC_BUILTIN_VEC_VMULOUB },
5950 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_nor", ALTIVEC_BUILTIN_VEC_NOR },
5951 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_or", ALTIVEC_BUILTIN_VEC_OR },
5952 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_pack", ALTIVEC_BUILTIN_VEC_PACK },
5953 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwum", ALTIVEC_BUILTIN_VEC_VPKUWUM },
5954 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhum", ALTIVEC_BUILTIN_VEC_VPKUHUM },
5955 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packpx", ALTIVEC_BUILTIN_VEC_PACKPX },
5956 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packs", ALTIVEC_BUILTIN_VEC_PACKS },
5957 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswss", ALTIVEC_BUILTIN_VEC_VPKSWSS },
5958 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuwus", ALTIVEC_BUILTIN_VEC_VPKUWUS },
5959 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshss", ALTIVEC_BUILTIN_VEC_VPKSHSS },
5960 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkuhus", ALTIVEC_BUILTIN_VEC_VPKUHUS },
5961 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_packsu", ALTIVEC_BUILTIN_VEC_PACKSU },
5962 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkswus", ALTIVEC_BUILTIN_VEC_VPKSWUS },
5963 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vpkshus", ALTIVEC_BUILTIN_VEC_VPKSHUS },
5964 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rl", ALTIVEC_BUILTIN_VEC_RL },
5965 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlw", ALTIVEC_BUILTIN_VEC_VRLW },
5966 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlh", ALTIVEC_BUILTIN_VEC_VRLH },
5967 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vrlb", ALTIVEC_BUILTIN_VEC_VRLB },
5968 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sl", ALTIVEC_BUILTIN_VEC_SL },
5969 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslw", ALTIVEC_BUILTIN_VEC_VSLW },
5970 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslh", ALTIVEC_BUILTIN_VEC_VSLH },
5971 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vslb", ALTIVEC_BUILTIN_VEC_VSLB },
5972 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sll", ALTIVEC_BUILTIN_VEC_SLL },
5973 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_slo", ALTIVEC_BUILTIN_VEC_SLO },
5974 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sr", ALTIVEC_BUILTIN_VEC_SR },
5975 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrw", ALTIVEC_BUILTIN_VEC_VSRW },
5976 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrh", ALTIVEC_BUILTIN_VEC_VSRH },
5977 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrb", ALTIVEC_BUILTIN_VEC_VSRB },
5978 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sra", ALTIVEC_BUILTIN_VEC_SRA },
5979 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsraw", ALTIVEC_BUILTIN_VEC_VSRAW },
5980 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrah", ALTIVEC_BUILTIN_VEC_VSRAH },
5981 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsrab", ALTIVEC_BUILTIN_VEC_VSRAB },
5982 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_srl", ALTIVEC_BUILTIN_VEC_SRL },
5983 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sro", ALTIVEC_BUILTIN_VEC_SRO },
5984 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sub", ALTIVEC_BUILTIN_VEC_SUB },
5985 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubfp", ALTIVEC_BUILTIN_VEC_VSUBFP },
5986 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuwm", ALTIVEC_BUILTIN_VEC_VSUBUWM },
5987 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhm", ALTIVEC_BUILTIN_VEC_VSUBUHM },
5988 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububm", ALTIVEC_BUILTIN_VEC_VSUBUBM },
5989 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subc", ALTIVEC_BUILTIN_VEC_SUBC },
5990 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_subs", ALTIVEC_BUILTIN_VEC_SUBS },
5991 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsws", ALTIVEC_BUILTIN_VEC_VSUBSWS },
5992 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuws", ALTIVEC_BUILTIN_VEC_VSUBUWS },
5993 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubshs", ALTIVEC_BUILTIN_VEC_VSUBSHS },
5994 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubuhs", ALTIVEC_BUILTIN_VEC_VSUBUHS },
5995 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsubsbs", ALTIVEC_BUILTIN_VEC_VSUBSBS },
5996 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsububs", ALTIVEC_BUILTIN_VEC_VSUBUBS },
5997 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum4s", ALTIVEC_BUILTIN_VEC_SUM4S },
5998 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4shs", ALTIVEC_BUILTIN_VEC_VSUM4SHS },
5999 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4sbs", ALTIVEC_BUILTIN_VEC_VSUM4SBS },
6000 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vsum4ubs", ALTIVEC_BUILTIN_VEC_VSUM4UBS },
6001 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sum2s", ALTIVEC_BUILTIN_VEC_SUM2S },
6002 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sums", ALTIVEC_BUILTIN_VEC_SUMS },
6003 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_xor", ALTIVEC_BUILTIN_VEC_XOR },
6004
a3170dc6
AH
6005 /* Place holder, leave as first spe builtin. */
6006 { 0, CODE_FOR_spe_evaddw, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
6007 { 0, CODE_FOR_spe_evand, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
6008 { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
6009 { 0, CODE_FOR_spe_evdivws, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
6010 { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
6011 { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
6012 { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
6013 { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
6014 { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
6015 { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
6016 { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
6017 { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
6018 { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
6019 { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
6020 { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
6021 { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
6022 { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
6023 { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
6024 { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
6025 { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
6026 { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
6027 { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
6028 { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
6029 { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
6030 { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
6031 { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
6032 { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
6033 { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
6034 { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
6035 { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
6036 { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
6037 { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
6038 { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
6039 { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
6040 { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
6041 { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
6042 { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
6043 { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
6044 { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
6045 { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
6046 { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
6047 { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
6048 { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
6049 { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
6050 { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
6051 { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
6052 { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
6053 { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
6054 { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
6055 { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
6056 { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
6057 { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
6058 { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
6059 { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
6060 { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
6061 { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
6062 { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
6063 { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
6064 { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
6065 { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
6066 { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
6067 { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
6068 { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
6069 { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
6070 { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
6071 { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
6072 { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
6073 { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
6074 { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
6075 { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
6076 { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
6077 { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
6078 { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
6079 { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
a3170dc6
AH
6080 { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
6081 { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
a3170dc6
AH
6082 { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
6083 { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
6084 { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
6085 { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
6086 { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
6087 { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
6088 { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
6089 { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
6090 { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
6091 { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
6092 { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
6093 { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
6094 { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
6095 { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
6096 { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
6097 { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
6098 { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
6099 { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
6100 { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
6101 { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
6102 { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
6103 { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
6104 { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
6105 { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
6106 { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
6107 { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
6108 { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
6109 { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
6110 { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
6111 { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
6112 { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
6113 { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
6114 { 0, CODE_FOR_spe_evsubfw, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
6115
6116 /* SPE binary operations expecting a 5-bit unsigned literal. */
6117 { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
6118
6119 { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
6120 { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
6121 { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
6122 { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
6123 { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
6124 { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
6125 { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
6126 { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
6127 { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
6128 { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
6129 { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
6130 { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
6131 { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
6132 { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
6133 { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
6134 { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
6135 { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
6136 { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
6137 { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
6138 { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
6139 { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
6140 { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
6141 { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
6142 { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
6143 { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
6144 { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
6145
6146 /* Place-holder. Leave as last binary SPE builtin. */
58646b77 6147 { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR }
ae4b4a02
AH
6148};
6149
6150/* AltiVec predicates. */
6151
6152struct builtin_description_predicates
6153{
6154 const unsigned int mask;
6155 const enum insn_code icode;
6156 const char *opcode;
6157 const char *const name;
6158 const enum rs6000_builtins code;
6159};
6160
6161static const struct builtin_description_predicates bdesc_altivec_preds[] =
6162{
6163 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpbfp.", "__builtin_altivec_vcmpbfp_p", ALTIVEC_BUILTIN_VCMPBFP_P },
6164 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpeqfp.", "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
6165 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgefp.", "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
6166 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgtfp.", "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
6167 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpequw.", "__builtin_altivec_vcmpequw_p", ALTIVEC_BUILTIN_VCMPEQUW_P },
6168 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtsw.", "__builtin_altivec_vcmpgtsw_p", ALTIVEC_BUILTIN_VCMPGTSW_P },
6169 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtuw.", "__builtin_altivec_vcmpgtuw_p", ALTIVEC_BUILTIN_VCMPGTUW_P },
6170 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtuh.", "__builtin_altivec_vcmpgtuh_p", ALTIVEC_BUILTIN_VCMPGTUH_P },
6171 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtsh.", "__builtin_altivec_vcmpgtsh_p", ALTIVEC_BUILTIN_VCMPGTSH_P },
6172 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpequh.", "__builtin_altivec_vcmpequh_p", ALTIVEC_BUILTIN_VCMPEQUH_P },
6173 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpequb.", "__builtin_altivec_vcmpequb_p", ALTIVEC_BUILTIN_VCMPEQUB_P },
6174 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtsb.", "__builtin_altivec_vcmpgtsb_p", ALTIVEC_BUILTIN_VCMPGTSB_P },
58646b77
PB
6175 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtub.", "__builtin_altivec_vcmpgtub_p", ALTIVEC_BUILTIN_VCMPGTUB_P },
6176
6177 { MASK_ALTIVEC, 0, NULL, "__builtin_vec_vcmpeq_p", ALTIVEC_BUILTIN_VCMPEQ_P },
6178 { MASK_ALTIVEC, 0, NULL, "__builtin_vec_vcmpgt_p", ALTIVEC_BUILTIN_VCMPGT_P },
6179 { MASK_ALTIVEC, 0, NULL, "__builtin_vec_vcmpge_p", ALTIVEC_BUILTIN_VCMPGE_P }
0ac081f6 6180};
24408032 6181
a3170dc6
AH
6182/* SPE predicates. */
6183static struct builtin_description bdesc_spe_predicates[] =
6184{
6185 /* Place-holder. Leave as first. */
6186 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
6187 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
6188 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
6189 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
6190 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
6191 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
6192 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
6193 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
6194 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
6195 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
6196 /* Place-holder. Leave as last. */
6197 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
6198};
6199
6200/* SPE evsel predicates. */
6201static struct builtin_description bdesc_spe_evsel[] =
6202{
6203 /* Place-holder. Leave as first. */
6204 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
6205 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
6206 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
6207 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
6208 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
6209 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
6210 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
6211 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
6212 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
6213 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
6214 /* Place-holder. Leave as last. */
6215 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
6216};
6217
b6d08ca1 6218/* ABS* operations. */
100c4561
AH
6219
6220static const struct builtin_description bdesc_abs[] =
6221{
6222 { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
6223 { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
6224 { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
6225 { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
6226 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
6227 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
6228 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI }
6229};
6230
617e0e1d
DB
6231/* Simple unary operations: VECb = foo (unsigned literal) or VECb =
6232 foo (VECa). */
24408032 6233
a3170dc6 6234static struct builtin_description bdesc_1arg[] =
2212663f 6235{
617e0e1d
DB
6236 { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
6237 { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
6238 { MASK_ALTIVEC, CODE_FOR_altivec_vrefp, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
6239 { MASK_ALTIVEC, CODE_FOR_altivec_vrfim, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
6240 { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
6241 { MASK_ALTIVEC, CODE_FOR_altivec_vrfip, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
6242 { MASK_ALTIVEC, CODE_FOR_ftruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
6243 { MASK_ALTIVEC, CODE_FOR_altivec_vrsqrtefp, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
2212663f
DB
6244 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
6245 { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
6246 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
20e26713
AH
6247 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
6248 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
6249 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
6250 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
6251 { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
6252 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
a3170dc6 6253
58646b77
PB
6254 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abs", ALTIVEC_BUILTIN_VEC_ABS },
6255 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_abss", ALTIVEC_BUILTIN_VEC_ABSS },
6256 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_ceil", ALTIVEC_BUILTIN_VEC_CEIL },
6257 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_expte", ALTIVEC_BUILTIN_VEC_EXPTE },
6258 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_floor", ALTIVEC_BUILTIN_VEC_FLOOR },
6259 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_loge", ALTIVEC_BUILTIN_VEC_LOGE },
6260 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_mtvscr", ALTIVEC_BUILTIN_VEC_MTVSCR },
6261 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_re", ALTIVEC_BUILTIN_VEC_RE },
6262 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_round", ALTIVEC_BUILTIN_VEC_ROUND },
6263 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_rsqrte", ALTIVEC_BUILTIN_VEC_RSQRTE },
6264 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_trunc", ALTIVEC_BUILTIN_VEC_TRUNC },
6265 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackh", ALTIVEC_BUILTIN_VEC_UNPACKH },
6266 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsh", ALTIVEC_BUILTIN_VEC_VUPKHSH },
6267 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhpx", ALTIVEC_BUILTIN_VEC_VUPKHPX },
6268 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupkhsb", ALTIVEC_BUILTIN_VEC_VUPKHSB },
6269 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_unpackl", ALTIVEC_BUILTIN_VEC_UNPACKL },
6270 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklpx", ALTIVEC_BUILTIN_VEC_VUPKLPX },
6271 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsh", ALTIVEC_BUILTIN_VEC_VUPKLSH },
6272 { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_vupklsb", ALTIVEC_BUILTIN_VEC_VUPKLSB },
6273
a3170dc6
AH
6274 /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
6275 end with SPE_BUILTIN_EVSUBFUSIAAW. */
6276 { 0, CODE_FOR_spe_evabs, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
6277 { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
6278 { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
6279 { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
6280 { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
6281 { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
6282 { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
6283 { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
6284 { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
6285 { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
6286 { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
6287 { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
6288 { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
6289 { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
6290 { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
6291 { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
6292 { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
6293 { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
6294 { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
6295 { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
6296 { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
6297 { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
6298 { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
6a599451 6299 { 0, CODE_FOR_negv2si2, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
a3170dc6
AH
6300 { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
6301 { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
6302 { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
6303 { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
a3170dc6
AH
6304
6305 /* Place-holder. Leave as last unary SPE builtin. */
58646b77 6306 { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW }
2212663f
DB
6307};
6308
6309static rtx
a2369ed3 6310rs6000_expand_unop_builtin (enum insn_code icode, tree arglist, rtx target)
2212663f
DB
6311{
6312 rtx pat;
6313 tree arg0 = TREE_VALUE (arglist);
6314 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6315 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6316 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6317
0559cc77
DE
6318 if (icode == CODE_FOR_nothing)
6319 /* Builtin not supported on this processor. */
6320 return 0;
6321
20e26713
AH
6322 /* If we got invalid arguments bail out before generating bad rtl. */
6323 if (arg0 == error_mark_node)
9a171fcd 6324 return const0_rtx;
20e26713 6325
0559cc77
DE
6326 if (icode == CODE_FOR_altivec_vspltisb
6327 || icode == CODE_FOR_altivec_vspltish
6328 || icode == CODE_FOR_altivec_vspltisw
6329 || icode == CODE_FOR_spe_evsplatfi
6330 || icode == CODE_FOR_spe_evsplati)
b44140e7
AH
6331 {
6332 /* Only allow 5-bit *signed* literals. */
b44140e7 6333 if (GET_CODE (op0) != CONST_INT
afca671b
DP
6334 || INTVAL (op0) > 15
6335 || INTVAL (op0) < -16)
b44140e7
AH
6336 {
6337 error ("argument 1 must be a 5-bit signed literal");
9a171fcd 6338 return const0_rtx;
b44140e7 6339 }
b44140e7
AH
6340 }
6341
c62f2db5 6342 if (target == 0
2212663f
DB
6343 || GET_MODE (target) != tmode
6344 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6345 target = gen_reg_rtx (tmode);
6346
6347 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6348 op0 = copy_to_mode_reg (mode0, op0);
6349
6350 pat = GEN_FCN (icode) (target, op0);
6351 if (! pat)
6352 return 0;
6353 emit_insn (pat);
0ac081f6 6354
2212663f
DB
6355 return target;
6356}
ae4b4a02 6357
100c4561 6358static rtx
a2369ed3 6359altivec_expand_abs_builtin (enum insn_code icode, tree arglist, rtx target)
100c4561
AH
6360{
6361 rtx pat, scratch1, scratch2;
6362 tree arg0 = TREE_VALUE (arglist);
6363 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6364 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6365 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6366
6367 /* If we have invalid arguments, bail out before generating bad rtl. */
6368 if (arg0 == error_mark_node)
9a171fcd 6369 return const0_rtx;
100c4561
AH
6370
6371 if (target == 0
6372 || GET_MODE (target) != tmode
6373 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6374 target = gen_reg_rtx (tmode);
6375
6376 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6377 op0 = copy_to_mode_reg (mode0, op0);
6378
6379 scratch1 = gen_reg_rtx (mode0);
6380 scratch2 = gen_reg_rtx (mode0);
6381
6382 pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
6383 if (! pat)
6384 return 0;
6385 emit_insn (pat);
6386
6387 return target;
6388}
6389
0ac081f6 6390static rtx
a2369ed3 6391rs6000_expand_binop_builtin (enum insn_code icode, tree arglist, rtx target)
0ac081f6
AH
6392{
6393 rtx pat;
6394 tree arg0 = TREE_VALUE (arglist);
6395 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6396 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6397 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6398 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6399 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6400 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
6401
0559cc77
DE
6402 if (icode == CODE_FOR_nothing)
6403 /* Builtin not supported on this processor. */
6404 return 0;
6405
20e26713
AH
6406 /* If we got invalid arguments bail out before generating bad rtl. */
6407 if (arg0 == error_mark_node || arg1 == error_mark_node)
9a171fcd 6408 return const0_rtx;
20e26713 6409
0559cc77
DE
6410 if (icode == CODE_FOR_altivec_vcfux
6411 || icode == CODE_FOR_altivec_vcfsx
6412 || icode == CODE_FOR_altivec_vctsxs
6413 || icode == CODE_FOR_altivec_vctuxs
6414 || icode == CODE_FOR_altivec_vspltb
6415 || icode == CODE_FOR_altivec_vsplth
6416 || icode == CODE_FOR_altivec_vspltw
6417 || icode == CODE_FOR_spe_evaddiw
6418 || icode == CODE_FOR_spe_evldd
6419 || icode == CODE_FOR_spe_evldh
6420 || icode == CODE_FOR_spe_evldw
6421 || icode == CODE_FOR_spe_evlhhesplat
6422 || icode == CODE_FOR_spe_evlhhossplat
6423 || icode == CODE_FOR_spe_evlhhousplat
6424 || icode == CODE_FOR_spe_evlwhe
6425 || icode == CODE_FOR_spe_evlwhos
6426 || icode == CODE_FOR_spe_evlwhou
6427 || icode == CODE_FOR_spe_evlwhsplat
6428 || icode == CODE_FOR_spe_evlwwsplat
6429 || icode == CODE_FOR_spe_evrlwi
6430 || icode == CODE_FOR_spe_evslwi
6431 || icode == CODE_FOR_spe_evsrwis
f5119d10 6432 || icode == CODE_FOR_spe_evsubifw
0559cc77 6433 || icode == CODE_FOR_spe_evsrwiu)
b44140e7
AH
6434 {
6435 /* Only allow 5-bit unsigned literals. */
8bb418a3 6436 STRIP_NOPS (arg1);
b44140e7
AH
6437 if (TREE_CODE (arg1) != INTEGER_CST
6438 || TREE_INT_CST_LOW (arg1) & ~0x1f)
6439 {
6440 error ("argument 2 must be a 5-bit unsigned literal");
9a171fcd 6441 return const0_rtx;
b44140e7 6442 }
b44140e7
AH
6443 }
6444
c62f2db5 6445 if (target == 0
0ac081f6
AH
6446 || GET_MODE (target) != tmode
6447 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6448 target = gen_reg_rtx (tmode);
6449
6450 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6451 op0 = copy_to_mode_reg (mode0, op0);
6452 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
6453 op1 = copy_to_mode_reg (mode1, op1);
6454
6455 pat = GEN_FCN (icode) (target, op0, op1);
6456 if (! pat)
6457 return 0;
6458 emit_insn (pat);
6459
6460 return target;
6461}
6525c0e7 6462
ae4b4a02 6463static rtx
f676971a 6464altivec_expand_predicate_builtin (enum insn_code icode, const char *opcode,
a2369ed3 6465 tree arglist, rtx target)
ae4b4a02
AH
6466{
6467 rtx pat, scratch;
6468 tree cr6_form = TREE_VALUE (arglist);
6469 tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
6470 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6471 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6472 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6473 enum machine_mode tmode = SImode;
6474 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6475 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
6476 int cr6_form_int;
6477
6478 if (TREE_CODE (cr6_form) != INTEGER_CST)
6479 {
6480 error ("argument 1 of __builtin_altivec_predicate must be a constant");
9a171fcd 6481 return const0_rtx;
ae4b4a02
AH
6482 }
6483 else
6484 cr6_form_int = TREE_INT_CST_LOW (cr6_form);
6485
37409796 6486 gcc_assert (mode0 == mode1);
ae4b4a02
AH
6487
6488 /* If we have invalid arguments, bail out before generating bad rtl. */
6489 if (arg0 == error_mark_node || arg1 == error_mark_node)
9a171fcd 6490 return const0_rtx;
ae4b4a02
AH
6491
6492 if (target == 0
6493 || GET_MODE (target) != tmode
6494 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6495 target = gen_reg_rtx (tmode);
6496
6497 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6498 op0 = copy_to_mode_reg (mode0, op0);
6499 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
6500 op1 = copy_to_mode_reg (mode1, op1);
6501
6502 scratch = gen_reg_rtx (mode0);
6503
6504 pat = GEN_FCN (icode) (scratch, op0, op1,
f1c25d3b 6505 gen_rtx_SYMBOL_REF (Pmode, opcode));
ae4b4a02
AH
6506 if (! pat)
6507 return 0;
6508 emit_insn (pat);
6509
6510 /* The vec_any* and vec_all* predicates use the same opcodes for two
6511 different operations, but the bits in CR6 will be different
6512 depending on what information we want. So we have to play tricks
6513 with CR6 to get the right bits out.
6514
6515 If you think this is disgusting, look at the specs for the
6516 AltiVec predicates. */
6517
c4ad648e
AM
6518 switch (cr6_form_int)
6519 {
6520 case 0:
6521 emit_insn (gen_cr6_test_for_zero (target));
6522 break;
6523 case 1:
6524 emit_insn (gen_cr6_test_for_zero_reverse (target));
6525 break;
6526 case 2:
6527 emit_insn (gen_cr6_test_for_lt (target));
6528 break;
6529 case 3:
6530 emit_insn (gen_cr6_test_for_lt_reverse (target));
6531 break;
6532 default:
6533 error ("argument 1 of __builtin_altivec_predicate is out of range");
6534 break;
6535 }
ae4b4a02
AH
6536
6537 return target;
6538}
6539
b4a62fa0 6540static rtx
38f391a5 6541altivec_expand_lv_builtin (enum insn_code icode, tree arglist, rtx target)
b4a62fa0
SB
6542{
6543 rtx pat, addr;
6544 tree arg0 = TREE_VALUE (arglist);
6545 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6546 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6547 enum machine_mode mode0 = Pmode;
6548 enum machine_mode mode1 = Pmode;
6549 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6550 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6551
6552 if (icode == CODE_FOR_nothing)
6553 /* Builtin not supported on this processor. */
6554 return 0;
6555
6556 /* If we got invalid arguments bail out before generating bad rtl. */
6557 if (arg0 == error_mark_node || arg1 == error_mark_node)
6558 return const0_rtx;
6559
6560 if (target == 0
6561 || GET_MODE (target) != tmode
6562 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6563 target = gen_reg_rtx (tmode);
6564
f676971a 6565 op1 = copy_to_mode_reg (mode1, op1);
b4a62fa0
SB
6566
6567 if (op0 == const0_rtx)
6568 {
6569 addr = gen_rtx_MEM (tmode, op1);
6570 }
6571 else
6572 {
6573 op0 = copy_to_mode_reg (mode0, op0);
6574 addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
6575 }
6576
6577 pat = GEN_FCN (icode) (target, addr);
6578
6579 if (! pat)
6580 return 0;
6581 emit_insn (pat);
6582
6583 return target;
6584}
6585
61bea3b0
AH
6586static rtx
6587spe_expand_stv_builtin (enum insn_code icode, tree arglist)
6588{
6589 tree arg0 = TREE_VALUE (arglist);
6590 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6591 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6592 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6593 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6594 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
6595 rtx pat;
6596 enum machine_mode mode0 = insn_data[icode].operand[0].mode;
6597 enum machine_mode mode1 = insn_data[icode].operand[1].mode;
6598 enum machine_mode mode2 = insn_data[icode].operand[2].mode;
6599
6600 /* Invalid arguments. Bail before doing anything stoopid! */
6601 if (arg0 == error_mark_node
6602 || arg1 == error_mark_node
6603 || arg2 == error_mark_node)
6604 return const0_rtx;
6605
6606 if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
6607 op0 = copy_to_mode_reg (mode2, op0);
6608 if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
6609 op1 = copy_to_mode_reg (mode0, op1);
6610 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
6611 op2 = copy_to_mode_reg (mode1, op2);
6612
6613 pat = GEN_FCN (icode) (op1, op2, op0);
6614 if (pat)
6615 emit_insn (pat);
6616 return NULL_RTX;
6617}
6618
6525c0e7 6619static rtx
a2369ed3 6620altivec_expand_stv_builtin (enum insn_code icode, tree arglist)
6525c0e7
AH
6621{
6622 tree arg0 = TREE_VALUE (arglist);
6623 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6624 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6625 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6626 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6627 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
b4a62fa0
SB
6628 rtx pat, addr;
6629 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6630 enum machine_mode mode1 = Pmode;
6631 enum machine_mode mode2 = Pmode;
6525c0e7
AH
6632
6633 /* Invalid arguments. Bail before doing anything stoopid! */
6634 if (arg0 == error_mark_node
6635 || arg1 == error_mark_node
6636 || arg2 == error_mark_node)
9a171fcd 6637 return const0_rtx;
6525c0e7 6638
b4a62fa0
SB
6639 if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
6640 op0 = copy_to_mode_reg (tmode, op0);
6641
f676971a 6642 op2 = copy_to_mode_reg (mode2, op2);
b4a62fa0
SB
6643
6644 if (op1 == const0_rtx)
6645 {
6646 addr = gen_rtx_MEM (tmode, op2);
6647 }
6648 else
6649 {
6650 op1 = copy_to_mode_reg (mode1, op1);
6651 addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
6652 }
6525c0e7 6653
b4a62fa0 6654 pat = GEN_FCN (icode) (addr, op0);
6525c0e7
AH
6655 if (pat)
6656 emit_insn (pat);
6657 return NULL_RTX;
6658}
6659
2212663f 6660static rtx
a2369ed3 6661rs6000_expand_ternop_builtin (enum insn_code icode, tree arglist, rtx target)
2212663f
DB
6662{
6663 rtx pat;
6664 tree arg0 = TREE_VALUE (arglist);
6665 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6666 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6667 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6668 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6669 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
6670 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6671 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6672 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
6673 enum machine_mode mode2 = insn_data[icode].operand[3].mode;
0ac081f6 6674
774b5662
DE
6675 if (icode == CODE_FOR_nothing)
6676 /* Builtin not supported on this processor. */
6677 return 0;
6678
20e26713
AH
6679 /* If we got invalid arguments bail out before generating bad rtl. */
6680 if (arg0 == error_mark_node
6681 || arg1 == error_mark_node
6682 || arg2 == error_mark_node)
9a171fcd 6683 return const0_rtx;
20e26713 6684
aba5fb01
NS
6685 if (icode == CODE_FOR_altivec_vsldoi_v4sf
6686 || icode == CODE_FOR_altivec_vsldoi_v4si
6687 || icode == CODE_FOR_altivec_vsldoi_v8hi
6688 || icode == CODE_FOR_altivec_vsldoi_v16qi)
b44140e7
AH
6689 {
6690 /* Only allow 4-bit unsigned literals. */
8bb418a3 6691 STRIP_NOPS (arg2);
b44140e7
AH
6692 if (TREE_CODE (arg2) != INTEGER_CST
6693 || TREE_INT_CST_LOW (arg2) & ~0xf)
6694 {
6695 error ("argument 3 must be a 4-bit unsigned literal");
e3277ffb 6696 return const0_rtx;
b44140e7 6697 }
b44140e7
AH
6698 }
6699
c62f2db5 6700 if (target == 0
2212663f
DB
6701 || GET_MODE (target) != tmode
6702 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6703 target = gen_reg_rtx (tmode);
6704
6705 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6706 op0 = copy_to_mode_reg (mode0, op0);
6707 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
6708 op1 = copy_to_mode_reg (mode1, op1);
6709 if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
6710 op2 = copy_to_mode_reg (mode2, op2);
6711
6712 pat = GEN_FCN (icode) (target, op0, op1, op2);
6713 if (! pat)
6714 return 0;
6715 emit_insn (pat);
6716
6717 return target;
6718}
92898235 6719
3a9b8c7e 6720/* Expand the lvx builtins. */
0ac081f6 6721static rtx
a2369ed3 6722altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp)
0ac081f6 6723{
0ac081f6
AH
6724 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6725 tree arglist = TREE_OPERAND (exp, 1);
0ac081f6 6726 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
3a9b8c7e
AH
6727 tree arg0;
6728 enum machine_mode tmode, mode0;
7c3abc73 6729 rtx pat, op0;
3a9b8c7e 6730 enum insn_code icode;
92898235 6731
0ac081f6
AH
6732 switch (fcode)
6733 {
f18c054f 6734 case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
81466555 6735 icode = CODE_FOR_altivec_lvx_v16qi;
3a9b8c7e 6736 break;
f18c054f 6737 case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
81466555 6738 icode = CODE_FOR_altivec_lvx_v8hi;
3a9b8c7e
AH
6739 break;
6740 case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
81466555 6741 icode = CODE_FOR_altivec_lvx_v4si;
3a9b8c7e
AH
6742 break;
6743 case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
81466555 6744 icode = CODE_FOR_altivec_lvx_v4sf;
3a9b8c7e
AH
6745 break;
6746 default:
6747 *expandedp = false;
6748 return NULL_RTX;
6749 }
0ac081f6 6750
3a9b8c7e 6751 *expandedp = true;
f18c054f 6752
3a9b8c7e
AH
6753 arg0 = TREE_VALUE (arglist);
6754 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6755 tmode = insn_data[icode].operand[0].mode;
6756 mode0 = insn_data[icode].operand[1].mode;
f18c054f 6757
3a9b8c7e
AH
6758 if (target == 0
6759 || GET_MODE (target) != tmode
6760 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6761 target = gen_reg_rtx (tmode);
24408032 6762
3a9b8c7e
AH
6763 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6764 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
f18c054f 6765
3a9b8c7e
AH
6766 pat = GEN_FCN (icode) (target, op0);
6767 if (! pat)
6768 return 0;
6769 emit_insn (pat);
6770 return target;
6771}
f18c054f 6772
3a9b8c7e
AH
6773/* Expand the stvx builtins. */
6774static rtx
f676971a 6775altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
a2369ed3 6776 bool *expandedp)
3a9b8c7e
AH
6777{
6778 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6779 tree arglist = TREE_OPERAND (exp, 1);
6780 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
6781 tree arg0, arg1;
6782 enum machine_mode mode0, mode1;
7c3abc73 6783 rtx pat, op0, op1;
3a9b8c7e 6784 enum insn_code icode;
f18c054f 6785
3a9b8c7e
AH
6786 switch (fcode)
6787 {
6788 case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
81466555 6789 icode = CODE_FOR_altivec_stvx_v16qi;
3a9b8c7e
AH
6790 break;
6791 case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
81466555 6792 icode = CODE_FOR_altivec_stvx_v8hi;
3a9b8c7e
AH
6793 break;
6794 case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
81466555 6795 icode = CODE_FOR_altivec_stvx_v4si;
3a9b8c7e
AH
6796 break;
6797 case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
81466555 6798 icode = CODE_FOR_altivec_stvx_v4sf;
3a9b8c7e
AH
6799 break;
6800 default:
6801 *expandedp = false;
6802 return NULL_RTX;
6803 }
24408032 6804
3a9b8c7e
AH
6805 arg0 = TREE_VALUE (arglist);
6806 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6807 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6808 op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6809 mode0 = insn_data[icode].operand[0].mode;
6810 mode1 = insn_data[icode].operand[1].mode;
f18c054f 6811
3a9b8c7e
AH
6812 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
6813 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
6814 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
6815 op1 = copy_to_mode_reg (mode1, op1);
f18c054f 6816
3a9b8c7e
AH
6817 pat = GEN_FCN (icode) (op0, op1);
6818 if (pat)
6819 emit_insn (pat);
f18c054f 6820
3a9b8c7e
AH
6821 *expandedp = true;
6822 return NULL_RTX;
6823}
f18c054f 6824
3a9b8c7e
AH
6825/* Expand the dst builtins. */
6826static rtx
f676971a 6827altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
a2369ed3 6828 bool *expandedp)
3a9b8c7e
AH
6829{
6830 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6831 tree arglist = TREE_OPERAND (exp, 1);
6832 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
6833 tree arg0, arg1, arg2;
6834 enum machine_mode mode0, mode1, mode2;
7c3abc73 6835 rtx pat, op0, op1, op2;
3a9b8c7e 6836 struct builtin_description *d;
a3170dc6 6837 size_t i;
f18c054f 6838
3a9b8c7e 6839 *expandedp = false;
f18c054f 6840
3a9b8c7e
AH
6841 /* Handle DST variants. */
6842 d = (struct builtin_description *) bdesc_dst;
6843 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
6844 if (d->code == fcode)
6845 {
6846 arg0 = TREE_VALUE (arglist);
6847 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6848 arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6849 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6850 op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6851 op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
6852 mode0 = insn_data[d->icode].operand[0].mode;
6853 mode1 = insn_data[d->icode].operand[1].mode;
6854 mode2 = insn_data[d->icode].operand[2].mode;
24408032 6855
3a9b8c7e
AH
6856 /* Invalid arguments, bail out before generating bad rtl. */
6857 if (arg0 == error_mark_node
6858 || arg1 == error_mark_node
6859 || arg2 == error_mark_node)
6860 return const0_rtx;
f18c054f 6861
86e7df90 6862 *expandedp = true;
8bb418a3 6863 STRIP_NOPS (arg2);
3a9b8c7e
AH
6864 if (TREE_CODE (arg2) != INTEGER_CST
6865 || TREE_INT_CST_LOW (arg2) & ~0x3)
6866 {
9e637a26 6867 error ("argument to %qs must be a 2-bit unsigned literal", d->name);
3a9b8c7e
AH
6868 return const0_rtx;
6869 }
f18c054f 6870
3a9b8c7e 6871 if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
666158b9 6872 op0 = copy_to_mode_reg (Pmode, op0);
3a9b8c7e
AH
6873 if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
6874 op1 = copy_to_mode_reg (mode1, op1);
24408032 6875
3a9b8c7e
AH
6876 pat = GEN_FCN (d->icode) (op0, op1, op2);
6877 if (pat != 0)
6878 emit_insn (pat);
f18c054f 6879
3a9b8c7e
AH
6880 return NULL_RTX;
6881 }
f18c054f 6882
3a9b8c7e
AH
6883 return NULL_RTX;
6884}
24408032 6885
3a9b8c7e
AH
6886/* Expand the builtin in EXP and store the result in TARGET. Store
6887 true in *EXPANDEDP if we found a builtin to expand. */
6888static rtx
a2369ed3 6889altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
3a9b8c7e
AH
6890{
6891 struct builtin_description *d;
6892 struct builtin_description_predicates *dp;
6893 size_t i;
6894 enum insn_code icode;
6895 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6896 tree arglist = TREE_OPERAND (exp, 1);
7c3abc73
AH
6897 tree arg0;
6898 rtx op0, pat;
6899 enum machine_mode tmode, mode0;
3a9b8c7e 6900 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
0ac081f6 6901
58646b77
PB
6902 if (fcode >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
6903 && fcode <= ALTIVEC_BUILTIN_OVERLOADED_LAST)
6904 {
6905 *expandedp = true;
ea40ba9c 6906 error ("unresolved overload for Altivec builtin %qF", fndecl);
58646b77
PB
6907 return const0_rtx;
6908 }
6909
3a9b8c7e
AH
6910 target = altivec_expand_ld_builtin (exp, target, expandedp);
6911 if (*expandedp)
6912 return target;
0ac081f6 6913
3a9b8c7e
AH
6914 target = altivec_expand_st_builtin (exp, target, expandedp);
6915 if (*expandedp)
6916 return target;
6917
6918 target = altivec_expand_dst_builtin (exp, target, expandedp);
6919 if (*expandedp)
6920 return target;
6921
6922 *expandedp = true;
95385cbb 6923
3a9b8c7e
AH
6924 switch (fcode)
6925 {
6525c0e7
AH
6926 case ALTIVEC_BUILTIN_STVX:
6927 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, arglist);
6928 case ALTIVEC_BUILTIN_STVEBX:
6929 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, arglist);
6930 case ALTIVEC_BUILTIN_STVEHX:
6931 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, arglist);
6932 case ALTIVEC_BUILTIN_STVEWX:
6933 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, arglist);
6934 case ALTIVEC_BUILTIN_STVXL:
6935 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, arglist);
3a9b8c7e 6936
95385cbb
AH
6937 case ALTIVEC_BUILTIN_MFVSCR:
6938 icode = CODE_FOR_altivec_mfvscr;
6939 tmode = insn_data[icode].operand[0].mode;
6940
6941 if (target == 0
6942 || GET_MODE (target) != tmode
6943 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6944 target = gen_reg_rtx (tmode);
f676971a 6945
95385cbb 6946 pat = GEN_FCN (icode) (target);
0ac081f6
AH
6947 if (! pat)
6948 return 0;
6949 emit_insn (pat);
95385cbb
AH
6950 return target;
6951
6952 case ALTIVEC_BUILTIN_MTVSCR:
6953 icode = CODE_FOR_altivec_mtvscr;
6954 arg0 = TREE_VALUE (arglist);
6955 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6956 mode0 = insn_data[icode].operand[0].mode;
6957
6958 /* If we got invalid arguments bail out before generating bad rtl. */
6959 if (arg0 == error_mark_node)
9a171fcd 6960 return const0_rtx;
95385cbb
AH
6961
6962 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
6963 op0 = copy_to_mode_reg (mode0, op0);
6964
6965 pat = GEN_FCN (icode) (op0);
6966 if (pat)
6967 emit_insn (pat);
6968 return NULL_RTX;
3a9b8c7e 6969
95385cbb
AH
6970 case ALTIVEC_BUILTIN_DSSALL:
6971 emit_insn (gen_altivec_dssall ());
6972 return NULL_RTX;
6973
6974 case ALTIVEC_BUILTIN_DSS:
6975 icode = CODE_FOR_altivec_dss;
6976 arg0 = TREE_VALUE (arglist);
8bb418a3 6977 STRIP_NOPS (arg0);
95385cbb
AH
6978 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6979 mode0 = insn_data[icode].operand[0].mode;
6980
6981 /* If we got invalid arguments bail out before generating bad rtl. */
6982 if (arg0 == error_mark_node)
9a171fcd 6983 return const0_rtx;
95385cbb 6984
b44140e7
AH
6985 if (TREE_CODE (arg0) != INTEGER_CST
6986 || TREE_INT_CST_LOW (arg0) & ~0x3)
6987 {
6988 error ("argument to dss must be a 2-bit unsigned literal");
9a171fcd 6989 return const0_rtx;
b44140e7
AH
6990 }
6991
95385cbb
AH
6992 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
6993 op0 = copy_to_mode_reg (mode0, op0);
6994
6995 emit_insn (gen_altivec_dss (op0));
0ac081f6
AH
6996 return NULL_RTX;
6997 }
24408032 6998
100c4561
AH
6999 /* Expand abs* operations. */
7000 d = (struct builtin_description *) bdesc_abs;
ca7558fc 7001 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
100c4561
AH
7002 if (d->code == fcode)
7003 return altivec_expand_abs_builtin (d->icode, arglist, target);
7004
ae4b4a02
AH
7005 /* Expand the AltiVec predicates. */
7006 dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
ca7558fc 7007 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
ae4b4a02 7008 if (dp->code == fcode)
c4ad648e
AM
7009 return altivec_expand_predicate_builtin (dp->icode, dp->opcode,
7010 arglist, target);
ae4b4a02 7011
6525c0e7
AH
7012 /* LV* are funky. We initialized them differently. */
7013 switch (fcode)
7014 {
7015 case ALTIVEC_BUILTIN_LVSL:
b4a62fa0 7016 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
c4ad648e 7017 arglist, target);
6525c0e7 7018 case ALTIVEC_BUILTIN_LVSR:
b4a62fa0 7019 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
c4ad648e 7020 arglist, target);
6525c0e7 7021 case ALTIVEC_BUILTIN_LVEBX:
b4a62fa0 7022 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
c4ad648e 7023 arglist, target);
6525c0e7 7024 case ALTIVEC_BUILTIN_LVEHX:
b4a62fa0 7025 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
c4ad648e 7026 arglist, target);
6525c0e7 7027 case ALTIVEC_BUILTIN_LVEWX:
b4a62fa0 7028 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
c4ad648e 7029 arglist, target);
6525c0e7 7030 case ALTIVEC_BUILTIN_LVXL:
b4a62fa0 7031 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
c4ad648e 7032 arglist, target);
6525c0e7 7033 case ALTIVEC_BUILTIN_LVX:
b4a62fa0 7034 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx,
c4ad648e 7035 arglist, target);
6525c0e7
AH
7036 default:
7037 break;
7038 /* Fall through. */
7039 }
95385cbb 7040
92898235 7041 *expandedp = false;
0ac081f6
AH
7042 return NULL_RTX;
7043}
7044
a3170dc6
AH
7045/* Binops that need to be initialized manually, but can be expanded
7046 automagically by rs6000_expand_binop_builtin. */
7047static struct builtin_description bdesc_2arg_spe[] =
7048{
7049 { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
7050 { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
7051 { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
7052 { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
7053 { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
7054 { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
7055 { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
7056 { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
7057 { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
7058 { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
7059 { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
7060 { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
7061 { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
7062 { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
7063 { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
7064 { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
7065 { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
7066 { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
7067 { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
7068 { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
7069 { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
7070 { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
7071};
7072
7073/* Expand the builtin in EXP and store the result in TARGET. Store
7074 true in *EXPANDEDP if we found a builtin to expand.
7075
7076 This expands the SPE builtins that are not simple unary and binary
7077 operations. */
7078static rtx
a2369ed3 7079spe_expand_builtin (tree exp, rtx target, bool *expandedp)
a3170dc6
AH
7080{
7081 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7082 tree arglist = TREE_OPERAND (exp, 1);
7083 tree arg1, arg0;
7084 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
7085 enum insn_code icode;
7086 enum machine_mode tmode, mode0;
7087 rtx pat, op0;
7088 struct builtin_description *d;
7089 size_t i;
7090
7091 *expandedp = true;
7092
7093 /* Syntax check for a 5-bit unsigned immediate. */
7094 switch (fcode)
7095 {
7096 case SPE_BUILTIN_EVSTDD:
7097 case SPE_BUILTIN_EVSTDH:
7098 case SPE_BUILTIN_EVSTDW:
7099 case SPE_BUILTIN_EVSTWHE:
7100 case SPE_BUILTIN_EVSTWHO:
7101 case SPE_BUILTIN_EVSTWWE:
7102 case SPE_BUILTIN_EVSTWWO:
7103 arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7104 if (TREE_CODE (arg1) != INTEGER_CST
7105 || TREE_INT_CST_LOW (arg1) & ~0x1f)
7106 {
7107 error ("argument 2 must be a 5-bit unsigned literal");
7108 return const0_rtx;
7109 }
7110 break;
7111 default:
7112 break;
7113 }
7114
00332c9f
AH
7115 /* The evsplat*i instructions are not quite generic. */
7116 switch (fcode)
7117 {
7118 case SPE_BUILTIN_EVSPLATFI:
7119 return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
7120 arglist, target);
7121 case SPE_BUILTIN_EVSPLATI:
7122 return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
7123 arglist, target);
7124 default:
7125 break;
7126 }
7127
a3170dc6
AH
7128 d = (struct builtin_description *) bdesc_2arg_spe;
7129 for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
7130 if (d->code == fcode)
7131 return rs6000_expand_binop_builtin (d->icode, arglist, target);
7132
7133 d = (struct builtin_description *) bdesc_spe_predicates;
7134 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
7135 if (d->code == fcode)
7136 return spe_expand_predicate_builtin (d->icode, arglist, target);
7137
7138 d = (struct builtin_description *) bdesc_spe_evsel;
7139 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
7140 if (d->code == fcode)
7141 return spe_expand_evsel_builtin (d->icode, arglist, target);
7142
7143 switch (fcode)
7144 {
7145 case SPE_BUILTIN_EVSTDDX:
61bea3b0 7146 return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, arglist);
a3170dc6 7147 case SPE_BUILTIN_EVSTDHX:
61bea3b0 7148 return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, arglist);
a3170dc6 7149 case SPE_BUILTIN_EVSTDWX:
61bea3b0 7150 return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, arglist);
a3170dc6 7151 case SPE_BUILTIN_EVSTWHEX:
61bea3b0 7152 return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, arglist);
a3170dc6 7153 case SPE_BUILTIN_EVSTWHOX:
61bea3b0 7154 return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, arglist);
a3170dc6 7155 case SPE_BUILTIN_EVSTWWEX:
61bea3b0 7156 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, arglist);
a3170dc6 7157 case SPE_BUILTIN_EVSTWWOX:
61bea3b0 7158 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, arglist);
a3170dc6 7159 case SPE_BUILTIN_EVSTDD:
61bea3b0 7160 return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, arglist);
a3170dc6 7161 case SPE_BUILTIN_EVSTDH:
61bea3b0 7162 return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, arglist);
a3170dc6 7163 case SPE_BUILTIN_EVSTDW:
61bea3b0 7164 return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, arglist);
a3170dc6 7165 case SPE_BUILTIN_EVSTWHE:
61bea3b0 7166 return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, arglist);
a3170dc6 7167 case SPE_BUILTIN_EVSTWHO:
61bea3b0 7168 return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, arglist);
a3170dc6 7169 case SPE_BUILTIN_EVSTWWE:
61bea3b0 7170 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, arglist);
a3170dc6 7171 case SPE_BUILTIN_EVSTWWO:
61bea3b0 7172 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, arglist);
a3170dc6
AH
7173 case SPE_BUILTIN_MFSPEFSCR:
7174 icode = CODE_FOR_spe_mfspefscr;
7175 tmode = insn_data[icode].operand[0].mode;
7176
7177 if (target == 0
7178 || GET_MODE (target) != tmode
7179 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7180 target = gen_reg_rtx (tmode);
f676971a 7181
a3170dc6
AH
7182 pat = GEN_FCN (icode) (target);
7183 if (! pat)
7184 return 0;
7185 emit_insn (pat);
7186 return target;
7187 case SPE_BUILTIN_MTSPEFSCR:
7188 icode = CODE_FOR_spe_mtspefscr;
7189 arg0 = TREE_VALUE (arglist);
7190 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
7191 mode0 = insn_data[icode].operand[0].mode;
7192
7193 if (arg0 == error_mark_node)
7194 return const0_rtx;
7195
7196 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
7197 op0 = copy_to_mode_reg (mode0, op0);
7198
7199 pat = GEN_FCN (icode) (op0);
7200 if (pat)
7201 emit_insn (pat);
7202 return NULL_RTX;
7203 default:
7204 break;
7205 }
7206
7207 *expandedp = false;
7208 return NULL_RTX;
7209}
7210
7211static rtx
a2369ed3 7212spe_expand_predicate_builtin (enum insn_code icode, tree arglist, rtx target)
a3170dc6
AH
7213{
7214 rtx pat, scratch, tmp;
7215 tree form = TREE_VALUE (arglist);
7216 tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
7217 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7218 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
7219 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
7220 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7221 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
7222 int form_int;
7223 enum rtx_code code;
7224
7225 if (TREE_CODE (form) != INTEGER_CST)
7226 {
7227 error ("argument 1 of __builtin_spe_predicate must be a constant");
7228 return const0_rtx;
7229 }
7230 else
7231 form_int = TREE_INT_CST_LOW (form);
7232
37409796 7233 gcc_assert (mode0 == mode1);
a3170dc6
AH
7234
7235 if (arg0 == error_mark_node || arg1 == error_mark_node)
7236 return const0_rtx;
7237
7238 if (target == 0
7239 || GET_MODE (target) != SImode
7240 || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
7241 target = gen_reg_rtx (SImode);
7242
7243 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7244 op0 = copy_to_mode_reg (mode0, op0);
7245 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
7246 op1 = copy_to_mode_reg (mode1, op1);
7247
7248 scratch = gen_reg_rtx (CCmode);
7249
7250 pat = GEN_FCN (icode) (scratch, op0, op1);
7251 if (! pat)
7252 return const0_rtx;
7253 emit_insn (pat);
7254
7255 /* There are 4 variants for each predicate: _any_, _all_, _upper_,
7256 _lower_. We use one compare, but look in different bits of the
7257 CR for each variant.
7258
7259 There are 2 elements in each SPE simd type (upper/lower). The CR
7260 bits are set as follows:
7261
7262 BIT0 | BIT 1 | BIT 2 | BIT 3
7263 U | L | (U | L) | (U & L)
7264
7265 So, for an "all" relationship, BIT 3 would be set.
7266 For an "any" relationship, BIT 2 would be set. Etc.
7267
7268 Following traditional nomenclature, these bits map to:
7269
7270 BIT0 | BIT 1 | BIT 2 | BIT 3
7271 LT | GT | EQ | OV
7272
7273 Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
7274 */
7275
7276 switch (form_int)
7277 {
7278 /* All variant. OV bit. */
7279 case 0:
7280 /* We need to get to the OV bit, which is the ORDERED bit. We
7281 could generate (ordered:SI (reg:CC xx) (const_int 0)), but
992d08b1 7282 that's ugly and will make validate_condition_mode die.
a3170dc6
AH
7283 So let's just use another pattern. */
7284 emit_insn (gen_move_from_CR_ov_bit (target, scratch));
7285 return target;
7286 /* Any variant. EQ bit. */
7287 case 1:
7288 code = EQ;
7289 break;
7290 /* Upper variant. LT bit. */
7291 case 2:
7292 code = LT;
7293 break;
7294 /* Lower variant. GT bit. */
7295 case 3:
7296 code = GT;
7297 break;
7298 default:
7299 error ("argument 1 of __builtin_spe_predicate is out of range");
7300 return const0_rtx;
7301 }
7302
7303 tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
7304 emit_move_insn (target, tmp);
7305
7306 return target;
7307}
7308
7309/* The evsel builtins look like this:
7310
7311 e = __builtin_spe_evsel_OP (a, b, c, d);
7312
7313 and work like this:
7314
7315 e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
7316 e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
7317*/
7318
7319static rtx
a2369ed3 7320spe_expand_evsel_builtin (enum insn_code icode, tree arglist, rtx target)
a3170dc6
AH
7321{
7322 rtx pat, scratch;
7323 tree arg0 = TREE_VALUE (arglist);
7324 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
7325 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7326 tree arg3 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist))));
7327 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
7328 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
7329 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
7330 rtx op3 = expand_expr (arg3, NULL_RTX, VOIDmode, 0);
7331 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7332 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
7333
37409796 7334 gcc_assert (mode0 == mode1);
a3170dc6
AH
7335
7336 if (arg0 == error_mark_node || arg1 == error_mark_node
7337 || arg2 == error_mark_node || arg3 == error_mark_node)
7338 return const0_rtx;
7339
7340 if (target == 0
7341 || GET_MODE (target) != mode0
7342 || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
7343 target = gen_reg_rtx (mode0);
7344
7345 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7346 op0 = copy_to_mode_reg (mode0, op0);
7347 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
7348 op1 = copy_to_mode_reg (mode0, op1);
7349 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
7350 op2 = copy_to_mode_reg (mode0, op2);
7351 if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
7352 op3 = copy_to_mode_reg (mode0, op3);
7353
7354 /* Generate the compare. */
7355 scratch = gen_reg_rtx (CCmode);
7356 pat = GEN_FCN (icode) (scratch, op0, op1);
7357 if (! pat)
7358 return const0_rtx;
7359 emit_insn (pat);
7360
7361 if (mode0 == V2SImode)
7362 emit_insn (gen_spe_evsel (target, op2, op3, scratch));
7363 else
7364 emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
7365
7366 return target;
7367}
7368
0ac081f6
AH
7369/* Expand an expression EXP that calls a built-in function,
7370 with result going to TARGET if that's convenient
7371 (and in mode MODE if that's convenient).
7372 SUBTARGET may be used as the target for computing one of EXP's operands.
7373 IGNORE is nonzero if the value is to be ignored. */
7374
7375static rtx
a2369ed3 7376rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
c4ad648e
AM
7377 enum machine_mode mode ATTRIBUTE_UNUSED,
7378 int ignore ATTRIBUTE_UNUSED)
0ac081f6 7379{
92898235
AH
7380 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7381 tree arglist = TREE_OPERAND (exp, 1);
7382 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
7383 struct builtin_description *d;
7384 size_t i;
7385 rtx ret;
7386 bool success;
f676971a 7387
7ccf35ed
DN
7388 if (fcode == ALTIVEC_BUILTIN_MASK_FOR_LOAD
7389 || fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
7390 {
7391 int icode = (int) CODE_FOR_altivec_lvsr;
7392 enum machine_mode tmode = insn_data[icode].operand[0].mode;
7393 enum machine_mode mode = insn_data[icode].operand[1].mode;
7394 tree arg;
7395 rtx op, addr, pat;
7396
37409796 7397 gcc_assert (TARGET_ALTIVEC);
7ccf35ed
DN
7398
7399 arg = TREE_VALUE (arglist);
37409796 7400 gcc_assert (TREE_CODE (TREE_TYPE (arg)) == POINTER_TYPE);
7ccf35ed
DN
7401 op = expand_expr (arg, NULL_RTX, Pmode, EXPAND_NORMAL);
7402 addr = memory_address (mode, op);
7403 if (fcode == ALTIVEC_BUILTIN_MASK_FOR_STORE)
7404 op = addr;
7405 else
7406 {
7407 /* For the load case need to negate the address. */
7408 op = gen_reg_rtx (GET_MODE (addr));
7409 emit_insn (gen_rtx_SET (VOIDmode, op,
7410 gen_rtx_NEG (GET_MODE (addr), addr)));
c4ad648e 7411 }
7ccf35ed
DN
7412 op = gen_rtx_MEM (mode, op);
7413
7414 if (target == 0
7415 || GET_MODE (target) != tmode
7416 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7417 target = gen_reg_rtx (tmode);
7418
7419 /*pat = gen_altivec_lvsr (target, op);*/
7420 pat = GEN_FCN (icode) (target, op);
7421 if (!pat)
7422 return 0;
7423 emit_insn (pat);
7424
7425 return target;
7426 }
7427
0ac081f6 7428 if (TARGET_ALTIVEC)
92898235
AH
7429 {
7430 ret = altivec_expand_builtin (exp, target, &success);
7431
a3170dc6
AH
7432 if (success)
7433 return ret;
7434 }
7435 if (TARGET_SPE)
7436 {
7437 ret = spe_expand_builtin (exp, target, &success);
7438
92898235
AH
7439 if (success)
7440 return ret;
7441 }
7442
37409796
NS
7443 gcc_assert (TARGET_ALTIVEC || TARGET_SPE);
7444
7445 /* Handle simple unary operations. */
7446 d = (struct builtin_description *) bdesc_1arg;
7447 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
7448 if (d->code == fcode)
7449 return rs6000_expand_unop_builtin (d->icode, arglist, target);
7450
7451 /* Handle simple binary operations. */
7452 d = (struct builtin_description *) bdesc_2arg;
7453 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
7454 if (d->code == fcode)
7455 return rs6000_expand_binop_builtin (d->icode, arglist, target);
0ac081f6 7456
37409796
NS
7457 /* Handle simple ternary operations. */
7458 d = (struct builtin_description *) bdesc_3arg;
7459 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
7460 if (d->code == fcode)
7461 return rs6000_expand_ternop_builtin (d->icode, arglist, target);
7462
7463 gcc_unreachable ();
0ac081f6
AH
7464}
7465
7c62e993
PB
7466static tree
7467build_opaque_vector_type (tree node, int nunits)
7468{
7469 node = copy_node (node);
7470 TYPE_MAIN_VARIANT (node) = node;
7471 return build_vector_type (node, nunits);
7472}
7473
0ac081f6 7474static void
863d938c 7475rs6000_init_builtins (void)
0ac081f6 7476{
4a5eab38
PB
7477 V2SI_type_node = build_vector_type (intSI_type_node, 2);
7478 V2SF_type_node = build_vector_type (float_type_node, 2);
7479 V4HI_type_node = build_vector_type (intHI_type_node, 4);
7480 V4SI_type_node = build_vector_type (intSI_type_node, 4);
7481 V4SF_type_node = build_vector_type (float_type_node, 4);
7e463bda 7482 V8HI_type_node = build_vector_type (intHI_type_node, 8);
4a5eab38
PB
7483 V16QI_type_node = build_vector_type (intQI_type_node, 16);
7484
7485 unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16);
7486 unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8);
7487 unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4);
7488
7c62e993
PB
7489 opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2);
7490 opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2);
6035d635 7491 opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
58646b77 7492 opaque_V4SI_type_node = copy_node (V4SI_type_node);
3fdaa45a 7493
8bb418a3
ZL
7494 /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
7495 types, especially in C++ land. Similarly, 'vector pixel' is distinct from
7496 'vector unsigned short'. */
7497
8dd16ecc
NS
7498 bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
7499 bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
7500 bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
7501 pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
8bb418a3 7502
58646b77
PB
7503 long_integer_type_internal_node = long_integer_type_node;
7504 long_unsigned_type_internal_node = long_unsigned_type_node;
7505 intQI_type_internal_node = intQI_type_node;
7506 uintQI_type_internal_node = unsigned_intQI_type_node;
7507 intHI_type_internal_node = intHI_type_node;
7508 uintHI_type_internal_node = unsigned_intHI_type_node;
7509 intSI_type_internal_node = intSI_type_node;
7510 uintSI_type_internal_node = unsigned_intSI_type_node;
7511 float_type_internal_node = float_type_node;
7512 void_type_internal_node = void_type_node;
7513
8bb418a3
ZL
7514 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7515 get_identifier ("__bool char"),
7516 bool_char_type_node));
7517 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7518 get_identifier ("__bool short"),
7519 bool_short_type_node));
7520 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7521 get_identifier ("__bool int"),
7522 bool_int_type_node));
7523 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7524 get_identifier ("__pixel"),
7525 pixel_type_node));
7526
4a5eab38
PB
7527 bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
7528 bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
7529 bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
7530 pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
8bb418a3
ZL
7531
7532 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7533 get_identifier ("__vector unsigned char"),
7534 unsigned_V16QI_type_node));
7535 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7536 get_identifier ("__vector signed char"),
7537 V16QI_type_node));
7538 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7539 get_identifier ("__vector __bool char"),
7540 bool_V16QI_type_node));
7541
7542 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7543 get_identifier ("__vector unsigned short"),
7544 unsigned_V8HI_type_node));
7545 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7546 get_identifier ("__vector signed short"),
7547 V8HI_type_node));
7548 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7549 get_identifier ("__vector __bool short"),
7550 bool_V8HI_type_node));
7551
7552 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7553 get_identifier ("__vector unsigned int"),
7554 unsigned_V4SI_type_node));
7555 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7556 get_identifier ("__vector signed int"),
7557 V4SI_type_node));
7558 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7559 get_identifier ("__vector __bool int"),
7560 bool_V4SI_type_node));
7561
7562 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7563 get_identifier ("__vector float"),
7564 V4SF_type_node));
7565 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7566 get_identifier ("__vector __pixel"),
7567 pixel_V8HI_type_node));
7568
a3170dc6 7569 if (TARGET_SPE)
3fdaa45a 7570 spe_init_builtins ();
0ac081f6
AH
7571 if (TARGET_ALTIVEC)
7572 altivec_init_builtins ();
0559cc77
DE
7573 if (TARGET_ALTIVEC || TARGET_SPE)
7574 rs6000_common_init_builtins ();
0ac081f6
AH
7575}
7576
a3170dc6
AH
7577/* Search through a set of builtins and enable the mask bits.
7578 DESC is an array of builtins.
b6d08ca1 7579 SIZE is the total number of builtins.
a3170dc6
AH
7580 START is the builtin enum at which to start.
7581 END is the builtin enum at which to end. */
0ac081f6 7582static void
a2369ed3 7583enable_mask_for_builtins (struct builtin_description *desc, int size,
f676971a 7584 enum rs6000_builtins start,
a2369ed3 7585 enum rs6000_builtins end)
a3170dc6
AH
7586{
7587 int i;
7588
7589 for (i = 0; i < size; ++i)
7590 if (desc[i].code == start)
7591 break;
7592
7593 if (i == size)
7594 return;
7595
7596 for (; i < size; ++i)
7597 {
7598 /* Flip all the bits on. */
7599 desc[i].mask = target_flags;
7600 if (desc[i].code == end)
7601 break;
7602 }
7603}
7604
7605static void
863d938c 7606spe_init_builtins (void)
0ac081f6 7607{
a3170dc6
AH
7608 tree endlink = void_list_node;
7609 tree puint_type_node = build_pointer_type (unsigned_type_node);
7610 tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
ae4b4a02 7611 struct builtin_description *d;
0ac081f6
AH
7612 size_t i;
7613
a3170dc6
AH
7614 tree v2si_ftype_4_v2si
7615 = build_function_type
3fdaa45a
AH
7616 (opaque_V2SI_type_node,
7617 tree_cons (NULL_TREE, opaque_V2SI_type_node,
7618 tree_cons (NULL_TREE, opaque_V2SI_type_node,
7619 tree_cons (NULL_TREE, opaque_V2SI_type_node,
7620 tree_cons (NULL_TREE, opaque_V2SI_type_node,
a3170dc6
AH
7621 endlink)))));
7622
7623 tree v2sf_ftype_4_v2sf
7624 = build_function_type
3fdaa45a
AH
7625 (opaque_V2SF_type_node,
7626 tree_cons (NULL_TREE, opaque_V2SF_type_node,
7627 tree_cons (NULL_TREE, opaque_V2SF_type_node,
7628 tree_cons (NULL_TREE, opaque_V2SF_type_node,
7629 tree_cons (NULL_TREE, opaque_V2SF_type_node,
a3170dc6
AH
7630 endlink)))));
7631
7632 tree int_ftype_int_v2si_v2si
7633 = build_function_type
7634 (integer_type_node,
7635 tree_cons (NULL_TREE, integer_type_node,
3fdaa45a
AH
7636 tree_cons (NULL_TREE, opaque_V2SI_type_node,
7637 tree_cons (NULL_TREE, opaque_V2SI_type_node,
a3170dc6
AH
7638 endlink))));
7639
7640 tree int_ftype_int_v2sf_v2sf
7641 = build_function_type
7642 (integer_type_node,
7643 tree_cons (NULL_TREE, integer_type_node,
3fdaa45a
AH
7644 tree_cons (NULL_TREE, opaque_V2SF_type_node,
7645 tree_cons (NULL_TREE, opaque_V2SF_type_node,
a3170dc6
AH
7646 endlink))));
7647
7648 tree void_ftype_v2si_puint_int
7649 = build_function_type (void_type_node,
3fdaa45a 7650 tree_cons (NULL_TREE, opaque_V2SI_type_node,
a3170dc6
AH
7651 tree_cons (NULL_TREE, puint_type_node,
7652 tree_cons (NULL_TREE,
7653 integer_type_node,
7654 endlink))));
7655
7656 tree void_ftype_v2si_puint_char
7657 = build_function_type (void_type_node,
3fdaa45a 7658 tree_cons (NULL_TREE, opaque_V2SI_type_node,
a3170dc6
AH
7659 tree_cons (NULL_TREE, puint_type_node,
7660 tree_cons (NULL_TREE,
7661 char_type_node,
7662 endlink))));
7663
7664 tree void_ftype_v2si_pv2si_int
7665 = build_function_type (void_type_node,
3fdaa45a 7666 tree_cons (NULL_TREE, opaque_V2SI_type_node,
6035d635 7667 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
a3170dc6
AH
7668 tree_cons (NULL_TREE,
7669 integer_type_node,
7670 endlink))));
7671
7672 tree void_ftype_v2si_pv2si_char
7673 = build_function_type (void_type_node,
3fdaa45a 7674 tree_cons (NULL_TREE, opaque_V2SI_type_node,
6035d635 7675 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
a3170dc6
AH
7676 tree_cons (NULL_TREE,
7677 char_type_node,
7678 endlink))));
7679
7680 tree void_ftype_int
7681 = build_function_type (void_type_node,
7682 tree_cons (NULL_TREE, integer_type_node, endlink));
7683
7684 tree int_ftype_void
36e8d515 7685 = build_function_type (integer_type_node, endlink);
a3170dc6
AH
7686
7687 tree v2si_ftype_pv2si_int
3fdaa45a 7688 = build_function_type (opaque_V2SI_type_node,
6035d635 7689 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
a3170dc6
AH
7690 tree_cons (NULL_TREE, integer_type_node,
7691 endlink)));
7692
7693 tree v2si_ftype_puint_int
3fdaa45a 7694 = build_function_type (opaque_V2SI_type_node,
a3170dc6
AH
7695 tree_cons (NULL_TREE, puint_type_node,
7696 tree_cons (NULL_TREE, integer_type_node,
7697 endlink)));
7698
7699 tree v2si_ftype_pushort_int
3fdaa45a 7700 = build_function_type (opaque_V2SI_type_node,
a3170dc6
AH
7701 tree_cons (NULL_TREE, pushort_type_node,
7702 tree_cons (NULL_TREE, integer_type_node,
7703 endlink)));
7704
00332c9f
AH
7705 tree v2si_ftype_signed_char
7706 = build_function_type (opaque_V2SI_type_node,
7707 tree_cons (NULL_TREE, signed_char_type_node,
7708 endlink));
7709
a3170dc6
AH
7710 /* The initialization of the simple binary and unary builtins is
7711 done in rs6000_common_init_builtins, but we have to enable the
7712 mask bits here manually because we have run out of `target_flags'
7713 bits. We really need to redesign this mask business. */
7714
7715 enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
7716 ARRAY_SIZE (bdesc_2arg),
7717 SPE_BUILTIN_EVADDW,
7718 SPE_BUILTIN_EVXOR);
7719 enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
7720 ARRAY_SIZE (bdesc_1arg),
7721 SPE_BUILTIN_EVABS,
7722 SPE_BUILTIN_EVSUBFUSIAAW);
7723 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
7724 ARRAY_SIZE (bdesc_spe_predicates),
7725 SPE_BUILTIN_EVCMPEQ,
7726 SPE_BUILTIN_EVFSTSTLT);
7727 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
7728 ARRAY_SIZE (bdesc_spe_evsel),
7729 SPE_BUILTIN_EVSEL_CMPGTS,
7730 SPE_BUILTIN_EVSEL_FSTSTEQ);
7731
36252949
AH
7732 (*lang_hooks.decls.pushdecl)
7733 (build_decl (TYPE_DECL, get_identifier ("__ev64_opaque__"),
7734 opaque_V2SI_type_node));
7735
a3170dc6 7736 /* Initialize irregular SPE builtins. */
f676971a 7737
a3170dc6
AH
7738 def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
7739 def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
7740 def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
7741 def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
7742 def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
7743 def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
7744 def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
7745 def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
7746 def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
7747 def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
7748 def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
7749 def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
7750 def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
7751 def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
7752 def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
7753 def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
00332c9f
AH
7754 def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
7755 def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
a3170dc6
AH
7756
7757 /* Loads. */
7758 def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
7759 def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
7760 def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
7761 def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
7762 def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
7763 def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
7764 def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
7765 def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
7766 def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
7767 def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
7768 def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
7769 def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
7770 def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
7771 def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
7772 def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
7773 def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
7774 def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
7775 def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
7776 def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
7777 def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
7778 def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
7779 def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
7780
7781 /* Predicates. */
7782 d = (struct builtin_description *) bdesc_spe_predicates;
7783 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
7784 {
7785 tree type;
7786
7787 switch (insn_data[d->icode].operand[1].mode)
7788 {
7789 case V2SImode:
7790 type = int_ftype_int_v2si_v2si;
7791 break;
7792 case V2SFmode:
7793 type = int_ftype_int_v2sf_v2sf;
7794 break;
7795 default:
37409796 7796 gcc_unreachable ();
a3170dc6
AH
7797 }
7798
7799 def_builtin (d->mask, d->name, type, d->code);
7800 }
7801
7802 /* Evsel predicates. */
7803 d = (struct builtin_description *) bdesc_spe_evsel;
7804 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
7805 {
7806 tree type;
7807
7808 switch (insn_data[d->icode].operand[1].mode)
7809 {
7810 case V2SImode:
7811 type = v2si_ftype_4_v2si;
7812 break;
7813 case V2SFmode:
7814 type = v2sf_ftype_4_v2sf;
7815 break;
7816 default:
37409796 7817 gcc_unreachable ();
a3170dc6
AH
7818 }
7819
7820 def_builtin (d->mask, d->name, type, d->code);
7821 }
7822}
7823
7824static void
863d938c 7825altivec_init_builtins (void)
a3170dc6
AH
7826{
7827 struct builtin_description *d;
7828 struct builtin_description_predicates *dp;
7829 size_t i;
7830 tree pfloat_type_node = build_pointer_type (float_type_node);
7831 tree pint_type_node = build_pointer_type (integer_type_node);
7832 tree pshort_type_node = build_pointer_type (short_integer_type_node);
7833 tree pchar_type_node = build_pointer_type (char_type_node);
7834
7835 tree pvoid_type_node = build_pointer_type (void_type_node);
7836
0dbc3651
ZW
7837 tree pcfloat_type_node = build_pointer_type (build_qualified_type (float_type_node, TYPE_QUAL_CONST));
7838 tree pcint_type_node = build_pointer_type (build_qualified_type (integer_type_node, TYPE_QUAL_CONST));
7839 tree pcshort_type_node = build_pointer_type (build_qualified_type (short_integer_type_node, TYPE_QUAL_CONST));
7840 tree pcchar_type_node = build_pointer_type (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
7841
7842 tree pcvoid_type_node = build_pointer_type (build_qualified_type (void_type_node, TYPE_QUAL_CONST));
7843
58646b77
PB
7844 tree int_ftype_opaque
7845 = build_function_type_list (integer_type_node,
7846 opaque_V4SI_type_node, NULL_TREE);
7847
7848 tree opaque_ftype_opaque_int
7849 = build_function_type_list (opaque_V4SI_type_node,
7850 opaque_V4SI_type_node, integer_type_node, NULL_TREE);
7851 tree opaque_ftype_opaque_opaque_int
7852 = build_function_type_list (opaque_V4SI_type_node,
7853 opaque_V4SI_type_node, opaque_V4SI_type_node,
7854 integer_type_node, NULL_TREE);
7855 tree int_ftype_int_opaque_opaque
7856 = build_function_type_list (integer_type_node,
7857 integer_type_node, opaque_V4SI_type_node,
7858 opaque_V4SI_type_node, NULL_TREE);
a3170dc6
AH
7859 tree int_ftype_int_v4si_v4si
7860 = build_function_type_list (integer_type_node,
7861 integer_type_node, V4SI_type_node,
7862 V4SI_type_node, NULL_TREE);
0dbc3651
ZW
7863 tree v4sf_ftype_pcfloat
7864 = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
a3170dc6 7865 tree void_ftype_pfloat_v4sf
b4de2f7d 7866 = build_function_type_list (void_type_node,
a3170dc6 7867 pfloat_type_node, V4SF_type_node, NULL_TREE);
0dbc3651
ZW
7868 tree v4si_ftype_pcint
7869 = build_function_type_list (V4SI_type_node, pcint_type_node, NULL_TREE);
7870 tree void_ftype_pint_v4si
b4de2f7d
AH
7871 = build_function_type_list (void_type_node,
7872 pint_type_node, V4SI_type_node, NULL_TREE);
0dbc3651
ZW
7873 tree v8hi_ftype_pcshort
7874 = build_function_type_list (V8HI_type_node, pcshort_type_node, NULL_TREE);
f18c054f 7875 tree void_ftype_pshort_v8hi
b4de2f7d
AH
7876 = build_function_type_list (void_type_node,
7877 pshort_type_node, V8HI_type_node, NULL_TREE);
0dbc3651
ZW
7878 tree v16qi_ftype_pcchar
7879 = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
f18c054f 7880 tree void_ftype_pchar_v16qi
b4de2f7d
AH
7881 = build_function_type_list (void_type_node,
7882 pchar_type_node, V16QI_type_node, NULL_TREE);
95385cbb 7883 tree void_ftype_v4si
b4de2f7d 7884 = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
a3170dc6
AH
7885 tree v8hi_ftype_void
7886 = build_function_type (V8HI_type_node, void_list_node);
7887 tree void_ftype_void
7888 = build_function_type (void_type_node, void_list_node);
e34b6648
JJ
7889 tree void_ftype_int
7890 = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
0dbc3651 7891
58646b77
PB
7892 tree opaque_ftype_long_pcvoid
7893 = build_function_type_list (opaque_V4SI_type_node,
7894 long_integer_type_node, pcvoid_type_node, NULL_TREE);
b4a62fa0 7895 tree v16qi_ftype_long_pcvoid
a3170dc6 7896 = build_function_type_list (V16QI_type_node,
b4a62fa0
SB
7897 long_integer_type_node, pcvoid_type_node, NULL_TREE);
7898 tree v8hi_ftype_long_pcvoid
a3170dc6 7899 = build_function_type_list (V8HI_type_node,
b4a62fa0
SB
7900 long_integer_type_node, pcvoid_type_node, NULL_TREE);
7901 tree v4si_ftype_long_pcvoid
a3170dc6 7902 = build_function_type_list (V4SI_type_node,
b4a62fa0 7903 long_integer_type_node, pcvoid_type_node, NULL_TREE);
0dbc3651 7904
58646b77
PB
7905 tree void_ftype_opaque_long_pvoid
7906 = build_function_type_list (void_type_node,
7907 opaque_V4SI_type_node, long_integer_type_node,
7908 pvoid_type_node, NULL_TREE);
b4a62fa0 7909 tree void_ftype_v4si_long_pvoid
b4de2f7d 7910 = build_function_type_list (void_type_node,
b4a62fa0 7911 V4SI_type_node, long_integer_type_node,
b4de2f7d 7912 pvoid_type_node, NULL_TREE);
b4a62fa0 7913 tree void_ftype_v16qi_long_pvoid
b4de2f7d 7914 = build_function_type_list (void_type_node,
b4a62fa0 7915 V16QI_type_node, long_integer_type_node,
b4de2f7d 7916 pvoid_type_node, NULL_TREE);
b4a62fa0 7917 tree void_ftype_v8hi_long_pvoid
b4de2f7d 7918 = build_function_type_list (void_type_node,
b4a62fa0 7919 V8HI_type_node, long_integer_type_node,
b4de2f7d 7920 pvoid_type_node, NULL_TREE);
a3170dc6
AH
7921 tree int_ftype_int_v8hi_v8hi
7922 = build_function_type_list (integer_type_node,
7923 integer_type_node, V8HI_type_node,
7924 V8HI_type_node, NULL_TREE);
7925 tree int_ftype_int_v16qi_v16qi
7926 = build_function_type_list (integer_type_node,
7927 integer_type_node, V16QI_type_node,
7928 V16QI_type_node, NULL_TREE);
7929 tree int_ftype_int_v4sf_v4sf
7930 = build_function_type_list (integer_type_node,
7931 integer_type_node, V4SF_type_node,
7932 V4SF_type_node, NULL_TREE);
7933 tree v4si_ftype_v4si
7934 = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
7935 tree v8hi_ftype_v8hi
7936 = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
7937 tree v16qi_ftype_v16qi
7938 = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
7939 tree v4sf_ftype_v4sf
7940 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
8bb418a3 7941 tree void_ftype_pcvoid_int_int
a3170dc6 7942 = build_function_type_list (void_type_node,
0dbc3651 7943 pcvoid_type_node, integer_type_node,
8bb418a3 7944 integer_type_node, NULL_TREE);
8bb418a3 7945
0dbc3651
ZW
7946 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4sf", v4sf_ftype_pcfloat,
7947 ALTIVEC_BUILTIN_LD_INTERNAL_4sf);
7948 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4sf", void_ftype_pfloat_v4sf,
7949 ALTIVEC_BUILTIN_ST_INTERNAL_4sf);
7950 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4si", v4si_ftype_pcint,
7951 ALTIVEC_BUILTIN_LD_INTERNAL_4si);
7952 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4si", void_ftype_pint_v4si,
7953 ALTIVEC_BUILTIN_ST_INTERNAL_4si);
7954 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_8hi", v8hi_ftype_pcshort,
7955 ALTIVEC_BUILTIN_LD_INTERNAL_8hi);
7956 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_8hi", void_ftype_pshort_v8hi,
7957 ALTIVEC_BUILTIN_ST_INTERNAL_8hi);
7958 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_16qi", v16qi_ftype_pcchar,
7959 ALTIVEC_BUILTIN_LD_INTERNAL_16qi);
7960 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_16qi", void_ftype_pchar_v16qi,
7961 ALTIVEC_BUILTIN_ST_INTERNAL_16qi);
a3170dc6
AH
7962 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
7963 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
7964 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
e34b6648 7965 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
b4a62fa0
SB
7966 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
7967 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
7968 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
7969 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
7970 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
7971 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
7972 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
7973 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
7974 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
7975 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
7976 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
7977 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
58646b77
PB
7978 def_builtin (MASK_ALTIVEC, "__builtin_vec_ld", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LD);
7979 def_builtin (MASK_ALTIVEC, "__builtin_vec_lde", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDE);
7980 def_builtin (MASK_ALTIVEC, "__builtin_vec_ldl", opaque_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LDL);
7981 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSL);
7982 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVSR);
7983 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEBX);
7984 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEHX);
7985 def_builtin (MASK_ALTIVEC, "__builtin_vec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVEWX);
7986 def_builtin (MASK_ALTIVEC, "__builtin_vec_st", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_ST);
7987 def_builtin (MASK_ALTIVEC, "__builtin_vec_ste", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STE);
7988 def_builtin (MASK_ALTIVEC, "__builtin_vec_stl", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STL);
7989 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvewx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEWX);
7990 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
7991 def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
7992
7993 def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
7994
7995 def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
7996 def_builtin (MASK_ALTIVEC, "__builtin_vec_splat", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_SPLAT);
7997 def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltw", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTW);
7998 def_builtin (MASK_ALTIVEC, "__builtin_vec_vsplth", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTH);
7999 def_builtin (MASK_ALTIVEC, "__builtin_vec_vspltb", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VSPLTB);
8000 def_builtin (MASK_ALTIVEC, "__builtin_vec_ctf", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTF);
8001 def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfsx", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFSX);
8002 def_builtin (MASK_ALTIVEC, "__builtin_vec_vcfux", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_VCFUX);
8003 def_builtin (MASK_ALTIVEC, "__builtin_vec_cts", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTS);
8004 def_builtin (MASK_ALTIVEC, "__builtin_vec_ctu", opaque_ftype_opaque_int, ALTIVEC_BUILTIN_VEC_CTU);
8bb418a3 8005
a3170dc6
AH
8006 /* Add the DST variants. */
8007 d = (struct builtin_description *) bdesc_dst;
8008 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
8bb418a3 8009 def_builtin (d->mask, d->name, void_ftype_pcvoid_int_int, d->code);
a3170dc6
AH
8010
8011 /* Initialize the predicates. */
8012 dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
8013 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
8014 {
8015 enum machine_mode mode1;
8016 tree type;
58646b77
PB
8017 bool is_overloaded = dp->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
8018 && dp->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
a3170dc6 8019
58646b77
PB
8020 if (is_overloaded)
8021 mode1 = VOIDmode;
8022 else
8023 mode1 = insn_data[dp->icode].operand[1].mode;
a3170dc6
AH
8024
8025 switch (mode1)
8026 {
58646b77
PB
8027 case VOIDmode:
8028 type = int_ftype_int_opaque_opaque;
8029 break;
a3170dc6
AH
8030 case V4SImode:
8031 type = int_ftype_int_v4si_v4si;
8032 break;
8033 case V8HImode:
8034 type = int_ftype_int_v8hi_v8hi;
8035 break;
8036 case V16QImode:
8037 type = int_ftype_int_v16qi_v16qi;
8038 break;
8039 case V4SFmode:
8040 type = int_ftype_int_v4sf_v4sf;
8041 break;
8042 default:
37409796 8043 gcc_unreachable ();
a3170dc6 8044 }
f676971a 8045
a3170dc6
AH
8046 def_builtin (dp->mask, dp->name, type, dp->code);
8047 }
8048
8049 /* Initialize the abs* operators. */
8050 d = (struct builtin_description *) bdesc_abs;
8051 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
8052 {
8053 enum machine_mode mode0;
8054 tree type;
8055
8056 mode0 = insn_data[d->icode].operand[0].mode;
8057
8058 switch (mode0)
8059 {
8060 case V4SImode:
8061 type = v4si_ftype_v4si;
8062 break;
8063 case V8HImode:
8064 type = v8hi_ftype_v8hi;
8065 break;
8066 case V16QImode:
8067 type = v16qi_ftype_v16qi;
8068 break;
8069 case V4SFmode:
8070 type = v4sf_ftype_v4sf;
8071 break;
8072 default:
37409796 8073 gcc_unreachable ();
a3170dc6 8074 }
f676971a 8075
a3170dc6
AH
8076 def_builtin (d->mask, d->name, type, d->code);
8077 }
7ccf35ed 8078
13c62176
DN
8079 if (TARGET_ALTIVEC)
8080 {
8081 tree decl;
8082
8083 /* Initialize target builtin that implements
8084 targetm.vectorize.builtin_mask_for_load. */
8085
8086 decl = lang_hooks.builtin_function ("__builtin_altivec_mask_for_load",
8bb46326
DN
8087 v16qi_ftype_long_pcvoid,
8088 ALTIVEC_BUILTIN_MASK_FOR_LOAD,
8089 BUILT_IN_MD, NULL,
8090 tree_cons (get_identifier ("const"),
8091 NULL_TREE, NULL_TREE));
13c62176
DN
8092 /* Record the decl. Will be used by rs6000_builtin_mask_for_load. */
8093 altivec_builtin_mask_for_load = decl;
13c62176 8094 }
a3170dc6
AH
8095}
8096
8097static void
863d938c 8098rs6000_common_init_builtins (void)
a3170dc6
AH
8099{
8100 struct builtin_description *d;
8101 size_t i;
8102
8103 tree v4sf_ftype_v4sf_v4sf_v16qi
8104 = build_function_type_list (V4SF_type_node,
8105 V4SF_type_node, V4SF_type_node,
8106 V16QI_type_node, NULL_TREE);
8107 tree v4si_ftype_v4si_v4si_v16qi
8108 = build_function_type_list (V4SI_type_node,
8109 V4SI_type_node, V4SI_type_node,
8110 V16QI_type_node, NULL_TREE);
8111 tree v8hi_ftype_v8hi_v8hi_v16qi
8112 = build_function_type_list (V8HI_type_node,
8113 V8HI_type_node, V8HI_type_node,
8114 V16QI_type_node, NULL_TREE);
8115 tree v16qi_ftype_v16qi_v16qi_v16qi
8116 = build_function_type_list (V16QI_type_node,
8117 V16QI_type_node, V16QI_type_node,
8118 V16QI_type_node, NULL_TREE);
b9e4e5d1
ZL
8119 tree v4si_ftype_int
8120 = build_function_type_list (V4SI_type_node, integer_type_node, NULL_TREE);
8121 tree v8hi_ftype_int
8122 = build_function_type_list (V8HI_type_node, integer_type_node, NULL_TREE);
8123 tree v16qi_ftype_int
8124 = build_function_type_list (V16QI_type_node, integer_type_node, NULL_TREE);
a3170dc6
AH
8125 tree v8hi_ftype_v16qi
8126 = build_function_type_list (V8HI_type_node, V16QI_type_node, NULL_TREE);
8127 tree v4sf_ftype_v4sf
8128 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
8129
8130 tree v2si_ftype_v2si_v2si
2abe3e28
AH
8131 = build_function_type_list (opaque_V2SI_type_node,
8132 opaque_V2SI_type_node,
8133 opaque_V2SI_type_node, NULL_TREE);
a3170dc6
AH
8134
8135 tree v2sf_ftype_v2sf_v2sf
2abe3e28
AH
8136 = build_function_type_list (opaque_V2SF_type_node,
8137 opaque_V2SF_type_node,
8138 opaque_V2SF_type_node, NULL_TREE);
a3170dc6
AH
8139
8140 tree v2si_ftype_int_int
2abe3e28 8141 = build_function_type_list (opaque_V2SI_type_node,
a3170dc6
AH
8142 integer_type_node, integer_type_node,
8143 NULL_TREE);
8144
58646b77
PB
8145 tree opaque_ftype_opaque
8146 = build_function_type_list (opaque_V4SI_type_node,
8147 opaque_V4SI_type_node, NULL_TREE);
8148
a3170dc6 8149 tree v2si_ftype_v2si
2abe3e28
AH
8150 = build_function_type_list (opaque_V2SI_type_node,
8151 opaque_V2SI_type_node, NULL_TREE);
a3170dc6
AH
8152
8153 tree v2sf_ftype_v2sf
2abe3e28
AH
8154 = build_function_type_list (opaque_V2SF_type_node,
8155 opaque_V2SF_type_node, NULL_TREE);
f676971a 8156
a3170dc6 8157 tree v2sf_ftype_v2si
2abe3e28
AH
8158 = build_function_type_list (opaque_V2SF_type_node,
8159 opaque_V2SI_type_node, NULL_TREE);
a3170dc6
AH
8160
8161 tree v2si_ftype_v2sf
2abe3e28
AH
8162 = build_function_type_list (opaque_V2SI_type_node,
8163 opaque_V2SF_type_node, NULL_TREE);
a3170dc6
AH
8164
8165 tree v2si_ftype_v2si_char
2abe3e28
AH
8166 = build_function_type_list (opaque_V2SI_type_node,
8167 opaque_V2SI_type_node,
8168 char_type_node, NULL_TREE);
a3170dc6
AH
8169
8170 tree v2si_ftype_int_char
2abe3e28 8171 = build_function_type_list (opaque_V2SI_type_node,
a3170dc6
AH
8172 integer_type_node, char_type_node, NULL_TREE);
8173
8174 tree v2si_ftype_char
2abe3e28
AH
8175 = build_function_type_list (opaque_V2SI_type_node,
8176 char_type_node, NULL_TREE);
a3170dc6
AH
8177
8178 tree int_ftype_int_int
8179 = build_function_type_list (integer_type_node,
8180 integer_type_node, integer_type_node,
8181 NULL_TREE);
95385cbb 8182
58646b77
PB
8183 tree opaque_ftype_opaque_opaque
8184 = build_function_type_list (opaque_V4SI_type_node,
8185 opaque_V4SI_type_node, opaque_V4SI_type_node, NULL_TREE);
0ac081f6 8186 tree v4si_ftype_v4si_v4si
b4de2f7d
AH
8187 = build_function_type_list (V4SI_type_node,
8188 V4SI_type_node, V4SI_type_node, NULL_TREE);
b9e4e5d1 8189 tree v4sf_ftype_v4si_int
b4de2f7d 8190 = build_function_type_list (V4SF_type_node,
b9e4e5d1
ZL
8191 V4SI_type_node, integer_type_node, NULL_TREE);
8192 tree v4si_ftype_v4sf_int
b4de2f7d 8193 = build_function_type_list (V4SI_type_node,
b9e4e5d1
ZL
8194 V4SF_type_node, integer_type_node, NULL_TREE);
8195 tree v4si_ftype_v4si_int
b4de2f7d 8196 = build_function_type_list (V4SI_type_node,
b9e4e5d1
ZL
8197 V4SI_type_node, integer_type_node, NULL_TREE);
8198 tree v8hi_ftype_v8hi_int
b4de2f7d 8199 = build_function_type_list (V8HI_type_node,
b9e4e5d1
ZL
8200 V8HI_type_node, integer_type_node, NULL_TREE);
8201 tree v16qi_ftype_v16qi_int
b4de2f7d 8202 = build_function_type_list (V16QI_type_node,
b9e4e5d1
ZL
8203 V16QI_type_node, integer_type_node, NULL_TREE);
8204 tree v16qi_ftype_v16qi_v16qi_int
b4de2f7d
AH
8205 = build_function_type_list (V16QI_type_node,
8206 V16QI_type_node, V16QI_type_node,
b9e4e5d1
ZL
8207 integer_type_node, NULL_TREE);
8208 tree v8hi_ftype_v8hi_v8hi_int
b4de2f7d
AH
8209 = build_function_type_list (V8HI_type_node,
8210 V8HI_type_node, V8HI_type_node,
b9e4e5d1
ZL
8211 integer_type_node, NULL_TREE);
8212 tree v4si_ftype_v4si_v4si_int
b4de2f7d
AH
8213 = build_function_type_list (V4SI_type_node,
8214 V4SI_type_node, V4SI_type_node,
b9e4e5d1
ZL
8215 integer_type_node, NULL_TREE);
8216 tree v4sf_ftype_v4sf_v4sf_int
b4de2f7d
AH
8217 = build_function_type_list (V4SF_type_node,
8218 V4SF_type_node, V4SF_type_node,
b9e4e5d1 8219 integer_type_node, NULL_TREE);
0ac081f6 8220 tree v4sf_ftype_v4sf_v4sf
b4de2f7d
AH
8221 = build_function_type_list (V4SF_type_node,
8222 V4SF_type_node, V4SF_type_node, NULL_TREE);
58646b77
PB
8223 tree opaque_ftype_opaque_opaque_opaque
8224 = build_function_type_list (opaque_V4SI_type_node,
8225 opaque_V4SI_type_node, opaque_V4SI_type_node,
8226 opaque_V4SI_type_node, NULL_TREE);
617e0e1d 8227 tree v4sf_ftype_v4sf_v4sf_v4si
b4de2f7d
AH
8228 = build_function_type_list (V4SF_type_node,
8229 V4SF_type_node, V4SF_type_node,
8230 V4SI_type_node, NULL_TREE);
2212663f 8231 tree v4sf_ftype_v4sf_v4sf_v4sf
b4de2f7d
AH
8232 = build_function_type_list (V4SF_type_node,
8233 V4SF_type_node, V4SF_type_node,
8234 V4SF_type_node, NULL_TREE);
f676971a 8235 tree v4si_ftype_v4si_v4si_v4si
b4de2f7d
AH
8236 = build_function_type_list (V4SI_type_node,
8237 V4SI_type_node, V4SI_type_node,
8238 V4SI_type_node, NULL_TREE);
0ac081f6 8239 tree v8hi_ftype_v8hi_v8hi
b4de2f7d
AH
8240 = build_function_type_list (V8HI_type_node,
8241 V8HI_type_node, V8HI_type_node, NULL_TREE);
2212663f 8242 tree v8hi_ftype_v8hi_v8hi_v8hi
b4de2f7d
AH
8243 = build_function_type_list (V8HI_type_node,
8244 V8HI_type_node, V8HI_type_node,
8245 V8HI_type_node, NULL_TREE);
c4ad648e 8246 tree v4si_ftype_v8hi_v8hi_v4si
b4de2f7d
AH
8247 = build_function_type_list (V4SI_type_node,
8248 V8HI_type_node, V8HI_type_node,
8249 V4SI_type_node, NULL_TREE);
c4ad648e 8250 tree v4si_ftype_v16qi_v16qi_v4si
b4de2f7d
AH
8251 = build_function_type_list (V4SI_type_node,
8252 V16QI_type_node, V16QI_type_node,
8253 V4SI_type_node, NULL_TREE);
0ac081f6 8254 tree v16qi_ftype_v16qi_v16qi
b4de2f7d
AH
8255 = build_function_type_list (V16QI_type_node,
8256 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 8257 tree v4si_ftype_v4sf_v4sf
b4de2f7d
AH
8258 = build_function_type_list (V4SI_type_node,
8259 V4SF_type_node, V4SF_type_node, NULL_TREE);
0ac081f6 8260 tree v8hi_ftype_v16qi_v16qi
b4de2f7d
AH
8261 = build_function_type_list (V8HI_type_node,
8262 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 8263 tree v4si_ftype_v8hi_v8hi
b4de2f7d
AH
8264 = build_function_type_list (V4SI_type_node,
8265 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 8266 tree v8hi_ftype_v4si_v4si
b4de2f7d
AH
8267 = build_function_type_list (V8HI_type_node,
8268 V4SI_type_node, V4SI_type_node, NULL_TREE);
0ac081f6 8269 tree v16qi_ftype_v8hi_v8hi
b4de2f7d
AH
8270 = build_function_type_list (V16QI_type_node,
8271 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 8272 tree v4si_ftype_v16qi_v4si
b4de2f7d
AH
8273 = build_function_type_list (V4SI_type_node,
8274 V16QI_type_node, V4SI_type_node, NULL_TREE);
fa066a23 8275 tree v4si_ftype_v16qi_v16qi
b4de2f7d
AH
8276 = build_function_type_list (V4SI_type_node,
8277 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 8278 tree v4si_ftype_v8hi_v4si
b4de2f7d
AH
8279 = build_function_type_list (V4SI_type_node,
8280 V8HI_type_node, V4SI_type_node, NULL_TREE);
a3170dc6
AH
8281 tree v4si_ftype_v8hi
8282 = build_function_type_list (V4SI_type_node, V8HI_type_node, NULL_TREE);
8283 tree int_ftype_v4si_v4si
8284 = build_function_type_list (integer_type_node,
8285 V4SI_type_node, V4SI_type_node, NULL_TREE);
8286 tree int_ftype_v4sf_v4sf
8287 = build_function_type_list (integer_type_node,
8288 V4SF_type_node, V4SF_type_node, NULL_TREE);
8289 tree int_ftype_v16qi_v16qi
8290 = build_function_type_list (integer_type_node,
8291 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 8292 tree int_ftype_v8hi_v8hi
b4de2f7d
AH
8293 = build_function_type_list (integer_type_node,
8294 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 8295
6f317ef3 8296 /* Add the simple ternary operators. */
2212663f 8297 d = (struct builtin_description *) bdesc_3arg;
ca7558fc 8298 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
2212663f 8299 {
2212663f
DB
8300 enum machine_mode mode0, mode1, mode2, mode3;
8301 tree type;
58646b77
PB
8302 bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
8303 && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
2212663f 8304
58646b77
PB
8305 if (is_overloaded)
8306 {
8307 mode0 = VOIDmode;
8308 mode1 = VOIDmode;
8309 mode2 = VOIDmode;
8310 mode3 = VOIDmode;
8311 }
8312 else
8313 {
8314 if (d->name == 0 || d->icode == CODE_FOR_nothing)
8315 continue;
f676971a 8316
58646b77
PB
8317 mode0 = insn_data[d->icode].operand[0].mode;
8318 mode1 = insn_data[d->icode].operand[1].mode;
8319 mode2 = insn_data[d->icode].operand[2].mode;
8320 mode3 = insn_data[d->icode].operand[3].mode;
8321 }
8322
2212663f
DB
8323 /* When all four are of the same mode. */
8324 if (mode0 == mode1 && mode1 == mode2 && mode2 == mode3)
8325 {
8326 switch (mode0)
8327 {
58646b77
PB
8328 case VOIDmode:
8329 type = opaque_ftype_opaque_opaque_opaque;
8330 break;
617e0e1d
DB
8331 case V4SImode:
8332 type = v4si_ftype_v4si_v4si_v4si;
8333 break;
2212663f
DB
8334 case V4SFmode:
8335 type = v4sf_ftype_v4sf_v4sf_v4sf;
8336 break;
8337 case V8HImode:
8338 type = v8hi_ftype_v8hi_v8hi_v8hi;
f676971a 8339 break;
2212663f
DB
8340 case V16QImode:
8341 type = v16qi_ftype_v16qi_v16qi_v16qi;
f676971a 8342 break;
2212663f 8343 default:
37409796 8344 gcc_unreachable ();
2212663f
DB
8345 }
8346 }
8347 else if (mode0 == mode1 && mode1 == mode2 && mode3 == V16QImode)
c4ad648e 8348 {
2212663f
DB
8349 switch (mode0)
8350 {
8351 case V4SImode:
8352 type = v4si_ftype_v4si_v4si_v16qi;
8353 break;
8354 case V4SFmode:
8355 type = v4sf_ftype_v4sf_v4sf_v16qi;
8356 break;
8357 case V8HImode:
8358 type = v8hi_ftype_v8hi_v8hi_v16qi;
f676971a 8359 break;
2212663f
DB
8360 case V16QImode:
8361 type = v16qi_ftype_v16qi_v16qi_v16qi;
f676971a 8362 break;
2212663f 8363 default:
37409796 8364 gcc_unreachable ();
2212663f
DB
8365 }
8366 }
f676971a 8367 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode
2212663f 8368 && mode3 == V4SImode)
24408032 8369 type = v4si_ftype_v16qi_v16qi_v4si;
f676971a 8370 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode
2212663f 8371 && mode3 == V4SImode)
24408032 8372 type = v4si_ftype_v8hi_v8hi_v4si;
f676971a 8373 else if (mode0 == V4SFmode && mode1 == V4SFmode && mode2 == V4SFmode
617e0e1d 8374 && mode3 == V4SImode)
24408032
AH
8375 type = v4sf_ftype_v4sf_v4sf_v4si;
8376
8377 /* vchar, vchar, vchar, 4 bit literal. */
8378 else if (mode0 == V16QImode && mode1 == mode0 && mode2 == mode0
8379 && mode3 == QImode)
b9e4e5d1 8380 type = v16qi_ftype_v16qi_v16qi_int;
24408032
AH
8381
8382 /* vshort, vshort, vshort, 4 bit literal. */
8383 else if (mode0 == V8HImode && mode1 == mode0 && mode2 == mode0
8384 && mode3 == QImode)
b9e4e5d1 8385 type = v8hi_ftype_v8hi_v8hi_int;
24408032
AH
8386
8387 /* vint, vint, vint, 4 bit literal. */
8388 else if (mode0 == V4SImode && mode1 == mode0 && mode2 == mode0
8389 && mode3 == QImode)
b9e4e5d1 8390 type = v4si_ftype_v4si_v4si_int;
24408032
AH
8391
8392 /* vfloat, vfloat, vfloat, 4 bit literal. */
8393 else if (mode0 == V4SFmode && mode1 == mode0 && mode2 == mode0
8394 && mode3 == QImode)
b9e4e5d1 8395 type = v4sf_ftype_v4sf_v4sf_int;
24408032 8396
2212663f 8397 else
37409796 8398 gcc_unreachable ();
2212663f
DB
8399
8400 def_builtin (d->mask, d->name, type, d->code);
8401 }
8402
0ac081f6 8403 /* Add the simple binary operators. */
00b960c7 8404 d = (struct builtin_description *) bdesc_2arg;
ca7558fc 8405 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
0ac081f6
AH
8406 {
8407 enum machine_mode mode0, mode1, mode2;
8408 tree type;
58646b77
PB
8409 bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
8410 && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
0ac081f6 8411
58646b77
PB
8412 if (is_overloaded)
8413 {
8414 mode0 = VOIDmode;
8415 mode1 = VOIDmode;
8416 mode2 = VOIDmode;
8417 }
8418 else
8419 {
8420 if (d->name == 0 || d->icode == CODE_FOR_nothing)
8421 continue;
f676971a 8422
58646b77
PB
8423 mode0 = insn_data[d->icode].operand[0].mode;
8424 mode1 = insn_data[d->icode].operand[1].mode;
8425 mode2 = insn_data[d->icode].operand[2].mode;
8426 }
0ac081f6
AH
8427
8428 /* When all three operands are of the same mode. */
8429 if (mode0 == mode1 && mode1 == mode2)
8430 {
8431 switch (mode0)
8432 {
58646b77
PB
8433 case VOIDmode:
8434 type = opaque_ftype_opaque_opaque;
8435 break;
0ac081f6
AH
8436 case V4SFmode:
8437 type = v4sf_ftype_v4sf_v4sf;
8438 break;
8439 case V4SImode:
8440 type = v4si_ftype_v4si_v4si;
8441 break;
8442 case V16QImode:
8443 type = v16qi_ftype_v16qi_v16qi;
8444 break;
8445 case V8HImode:
8446 type = v8hi_ftype_v8hi_v8hi;
8447 break;
a3170dc6
AH
8448 case V2SImode:
8449 type = v2si_ftype_v2si_v2si;
8450 break;
8451 case V2SFmode:
8452 type = v2sf_ftype_v2sf_v2sf;
8453 break;
8454 case SImode:
8455 type = int_ftype_int_int;
8456 break;
0ac081f6 8457 default:
37409796 8458 gcc_unreachable ();
0ac081f6
AH
8459 }
8460 }
8461
8462 /* A few other combos we really don't want to do manually. */
8463
8464 /* vint, vfloat, vfloat. */
8465 else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == V4SFmode)
8466 type = v4si_ftype_v4sf_v4sf;
8467
8468 /* vshort, vchar, vchar. */
8469 else if (mode0 == V8HImode && mode1 == V16QImode && mode2 == V16QImode)
8470 type = v8hi_ftype_v16qi_v16qi;
8471
8472 /* vint, vshort, vshort. */
8473 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode)
8474 type = v4si_ftype_v8hi_v8hi;
8475
8476 /* vshort, vint, vint. */
8477 else if (mode0 == V8HImode && mode1 == V4SImode && mode2 == V4SImode)
8478 type = v8hi_ftype_v4si_v4si;
8479
8480 /* vchar, vshort, vshort. */
8481 else if (mode0 == V16QImode && mode1 == V8HImode && mode2 == V8HImode)
8482 type = v16qi_ftype_v8hi_v8hi;
8483
8484 /* vint, vchar, vint. */
8485 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V4SImode)
8486 type = v4si_ftype_v16qi_v4si;
8487
fa066a23
AH
8488 /* vint, vchar, vchar. */
8489 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode)
8490 type = v4si_ftype_v16qi_v16qi;
8491
0ac081f6
AH
8492 /* vint, vshort, vint. */
8493 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V4SImode)
8494 type = v4si_ftype_v8hi_v4si;
f676971a 8495
2212663f
DB
8496 /* vint, vint, 5 bit literal. */
8497 else if (mode0 == V4SImode && mode1 == V4SImode && mode2 == QImode)
b9e4e5d1 8498 type = v4si_ftype_v4si_int;
f676971a 8499
2212663f
DB
8500 /* vshort, vshort, 5 bit literal. */
8501 else if (mode0 == V8HImode && mode1 == V8HImode && mode2 == QImode)
b9e4e5d1 8502 type = v8hi_ftype_v8hi_int;
f676971a 8503
2212663f
DB
8504 /* vchar, vchar, 5 bit literal. */
8505 else if (mode0 == V16QImode && mode1 == V16QImode && mode2 == QImode)
b9e4e5d1 8506 type = v16qi_ftype_v16qi_int;
0ac081f6 8507
617e0e1d
DB
8508 /* vfloat, vint, 5 bit literal. */
8509 else if (mode0 == V4SFmode && mode1 == V4SImode && mode2 == QImode)
b9e4e5d1 8510 type = v4sf_ftype_v4si_int;
f676971a 8511
617e0e1d
DB
8512 /* vint, vfloat, 5 bit literal. */
8513 else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == QImode)
b9e4e5d1 8514 type = v4si_ftype_v4sf_int;
617e0e1d 8515
a3170dc6
AH
8516 else if (mode0 == V2SImode && mode1 == SImode && mode2 == SImode)
8517 type = v2si_ftype_int_int;
8518
8519 else if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
8520 type = v2si_ftype_v2si_char;
8521
8522 else if (mode0 == V2SImode && mode1 == SImode && mode2 == QImode)
8523 type = v2si_ftype_int_char;
8524
37409796 8525 else
0ac081f6 8526 {
37409796
NS
8527 /* int, x, x. */
8528 gcc_assert (mode0 == SImode);
0ac081f6
AH
8529 switch (mode1)
8530 {
8531 case V4SImode:
8532 type = int_ftype_v4si_v4si;
8533 break;
8534 case V4SFmode:
8535 type = int_ftype_v4sf_v4sf;
8536 break;
8537 case V16QImode:
8538 type = int_ftype_v16qi_v16qi;
8539 break;
8540 case V8HImode:
8541 type = int_ftype_v8hi_v8hi;
8542 break;
8543 default:
37409796 8544 gcc_unreachable ();
0ac081f6
AH
8545 }
8546 }
8547
2212663f
DB
8548 def_builtin (d->mask, d->name, type, d->code);
8549 }
24408032 8550
2212663f
DB
8551 /* Add the simple unary operators. */
8552 d = (struct builtin_description *) bdesc_1arg;
ca7558fc 8553 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
2212663f
DB
8554 {
8555 enum machine_mode mode0, mode1;
8556 tree type;
58646b77
PB
8557 bool is_overloaded = d->code >= ALTIVEC_BUILTIN_OVERLOADED_FIRST
8558 && d->code <= ALTIVEC_BUILTIN_OVERLOADED_LAST;
8559
8560 if (is_overloaded)
8561 {
8562 mode0 = VOIDmode;
8563 mode1 = VOIDmode;
8564 }
8565 else
8566 {
8567 if (d->name == 0 || d->icode == CODE_FOR_nothing)
8568 continue;
8569
8570 mode0 = insn_data[d->icode].operand[0].mode;
8571 mode1 = insn_data[d->icode].operand[1].mode;
8572 }
2212663f
DB
8573
8574 if (mode0 == V4SImode && mode1 == QImode)
c4ad648e 8575 type = v4si_ftype_int;
2212663f 8576 else if (mode0 == V8HImode && mode1 == QImode)
c4ad648e 8577 type = v8hi_ftype_int;
2212663f 8578 else if (mode0 == V16QImode && mode1 == QImode)
c4ad648e 8579 type = v16qi_ftype_int;
58646b77
PB
8580 else if (mode0 == VOIDmode && mode1 == VOIDmode)
8581 type = opaque_ftype_opaque;
617e0e1d
DB
8582 else if (mode0 == V4SFmode && mode1 == V4SFmode)
8583 type = v4sf_ftype_v4sf;
20e26713
AH
8584 else if (mode0 == V8HImode && mode1 == V16QImode)
8585 type = v8hi_ftype_v16qi;
8586 else if (mode0 == V4SImode && mode1 == V8HImode)
8587 type = v4si_ftype_v8hi;
a3170dc6
AH
8588 else if (mode0 == V2SImode && mode1 == V2SImode)
8589 type = v2si_ftype_v2si;
8590 else if (mode0 == V2SFmode && mode1 == V2SFmode)
8591 type = v2sf_ftype_v2sf;
8592 else if (mode0 == V2SFmode && mode1 == V2SImode)
8593 type = v2sf_ftype_v2si;
8594 else if (mode0 == V2SImode && mode1 == V2SFmode)
8595 type = v2si_ftype_v2sf;
8596 else if (mode0 == V2SImode && mode1 == QImode)
8597 type = v2si_ftype_char;
2212663f 8598 else
37409796 8599 gcc_unreachable ();
2212663f 8600
0ac081f6
AH
8601 def_builtin (d->mask, d->name, type, d->code);
8602 }
8603}
8604
c15c90bb
ZW
8605static void
8606rs6000_init_libfuncs (void)
8607{
8608 if (!TARGET_HARD_FLOAT)
8609 return;
8610
c9034561 8611 if (DEFAULT_ABI != ABI_V4)
c15c90bb 8612 {
c9034561 8613 if (TARGET_XCOFF && ! TARGET_POWER2 && ! TARGET_POWERPC)
c15c90bb 8614 {
c9034561 8615 /* AIX library routines for float->int conversion. */
85363ca0
ZW
8616 set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc");
8617 set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc");
4274207b
DE
8618 set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc");
8619 set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc");
c15c90bb
ZW
8620 }
8621
98c41d98
DE
8622 /* AIX/Darwin/64-bit Linux quad floating point routines. */
8623 if (!TARGET_XL_COMPAT)
8624 {
8625 set_optab_libfunc (add_optab, TFmode, "__gcc_qadd");
8626 set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
8627 set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
8628 set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
8629 }
8630 else
8631 {
8632 set_optab_libfunc (add_optab, TFmode, "_xlqadd");
8633 set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
8634 set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
8635 set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
8636 }
c15c90bb 8637 }
c9034561 8638 else
c15c90bb 8639 {
c9034561 8640 /* 32-bit SVR4 quad floating point routines. */
c15c90bb
ZW
8641
8642 set_optab_libfunc (add_optab, TFmode, "_q_add");
8643 set_optab_libfunc (sub_optab, TFmode, "_q_sub");
8644 set_optab_libfunc (neg_optab, TFmode, "_q_neg");
8645 set_optab_libfunc (smul_optab, TFmode, "_q_mul");
8646 set_optab_libfunc (sdiv_optab, TFmode, "_q_div");
8647 if (TARGET_PPC_GPOPT || TARGET_POWER2)
8648 set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
8649
c9034561
ZW
8650 set_optab_libfunc (eq_optab, TFmode, "_q_feq");
8651 set_optab_libfunc (ne_optab, TFmode, "_q_fne");
8652 set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
8653 set_optab_libfunc (ge_optab, TFmode, "_q_fge");
8654 set_optab_libfunc (lt_optab, TFmode, "_q_flt");
8655 set_optab_libfunc (le_optab, TFmode, "_q_fle");
8656
85363ca0
ZW
8657 set_conv_libfunc (sext_optab, TFmode, SFmode, "_q_stoq");
8658 set_conv_libfunc (sext_optab, TFmode, DFmode, "_q_dtoq");
8659 set_conv_libfunc (trunc_optab, SFmode, TFmode, "_q_qtos");
8660 set_conv_libfunc (trunc_optab, DFmode, TFmode, "_q_qtod");
8661 set_conv_libfunc (sfix_optab, SImode, TFmode, "_q_qtoi");
8662 set_conv_libfunc (ufix_optab, SImode, TFmode, "_q_qtou");
8663 set_conv_libfunc (sfloat_optab, TFmode, SImode, "_q_itoq");
c15c90bb
ZW
8664 }
8665}
fba73eb1
DE
8666
8667\f
8668/* Expand a block clear operation, and return 1 if successful. Return 0
8669 if we should let the compiler generate normal code.
8670
8671 operands[0] is the destination
8672 operands[1] is the length
57e84f18 8673 operands[3] is the alignment */
fba73eb1
DE
8674
8675int
8676expand_block_clear (rtx operands[])
8677{
8678 rtx orig_dest = operands[0];
8679 rtx bytes_rtx = operands[1];
57e84f18 8680 rtx align_rtx = operands[3];
5514620a
GK
8681 bool constp = (GET_CODE (bytes_rtx) == CONST_INT);
8682 HOST_WIDE_INT align;
8683 HOST_WIDE_INT bytes;
fba73eb1
DE
8684 int offset;
8685 int clear_bytes;
5514620a 8686 int clear_step;
fba73eb1
DE
8687
8688 /* If this is not a fixed size move, just call memcpy */
8689 if (! constp)
8690 return 0;
8691
37409796
NS
8692 /* This must be a fixed size alignment */
8693 gcc_assert (GET_CODE (align_rtx) == CONST_INT);
fba73eb1
DE
8694 align = INTVAL (align_rtx) * BITS_PER_UNIT;
8695
8696 /* Anything to clear? */
8697 bytes = INTVAL (bytes_rtx);
8698 if (bytes <= 0)
8699 return 1;
8700
5514620a
GK
8701 /* Use the builtin memset after a point, to avoid huge code bloat.
8702 When optimize_size, avoid any significant code bloat; calling
8703 memset is about 4 instructions, so allow for one instruction to
8704 load zero and three to do clearing. */
8705 if (TARGET_ALTIVEC && align >= 128)
8706 clear_step = 16;
8707 else if (TARGET_POWERPC64 && align >= 32)
8708 clear_step = 8;
8709 else
8710 clear_step = 4;
fba73eb1 8711
5514620a
GK
8712 if (optimize_size && bytes > 3 * clear_step)
8713 return 0;
8714 if (! optimize_size && bytes > 8 * clear_step)
fba73eb1
DE
8715 return 0;
8716
8717 for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes)
8718 {
fba73eb1
DE
8719 enum machine_mode mode = BLKmode;
8720 rtx dest;
f676971a 8721
5514620a
GK
8722 if (bytes >= 16 && TARGET_ALTIVEC && align >= 128)
8723 {
8724 clear_bytes = 16;
8725 mode = V4SImode;
8726 }
8727 else if (bytes >= 8 && TARGET_POWERPC64
8728 /* 64-bit loads and stores require word-aligned
8729 displacements. */
8730 && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
fba73eb1
DE
8731 {
8732 clear_bytes = 8;
8733 mode = DImode;
fba73eb1 8734 }
5514620a 8735 else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
fba73eb1
DE
8736 { /* move 4 bytes */
8737 clear_bytes = 4;
8738 mode = SImode;
fba73eb1 8739 }
5514620a 8740 else if (bytes == 2 && (align >= 16 || !STRICT_ALIGNMENT))
fba73eb1
DE
8741 { /* move 2 bytes */
8742 clear_bytes = 2;
8743 mode = HImode;
fba73eb1
DE
8744 }
8745 else /* move 1 byte at a time */
8746 {
8747 clear_bytes = 1;
8748 mode = QImode;
fba73eb1 8749 }
f676971a 8750
fba73eb1 8751 dest = adjust_address (orig_dest, mode, offset);
f676971a 8752
5514620a 8753 emit_move_insn (dest, CONST0_RTX (mode));
fba73eb1
DE
8754 }
8755
8756 return 1;
8757}
8758
35aff10b 8759\f
7e69e155
MM
8760/* Expand a block move operation, and return 1 if successful. Return 0
8761 if we should let the compiler generate normal code.
8762
8763 operands[0] is the destination
8764 operands[1] is the source
8765 operands[2] is the length
8766 operands[3] is the alignment */
8767
3933e0e1
MM
8768#define MAX_MOVE_REG 4
8769
7e69e155 8770int
a2369ed3 8771expand_block_move (rtx operands[])
7e69e155 8772{
b6c9286a
MM
8773 rtx orig_dest = operands[0];
8774 rtx orig_src = operands[1];
7e69e155 8775 rtx bytes_rtx = operands[2];
7e69e155 8776 rtx align_rtx = operands[3];
3933e0e1 8777 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
5ee95df6 8778 int align;
3933e0e1
MM
8779 int bytes;
8780 int offset;
7e69e155 8781 int move_bytes;
cabfd258
GK
8782 rtx stores[MAX_MOVE_REG];
8783 int num_reg = 0;
7e69e155 8784
3933e0e1 8785 /* If this is not a fixed size move, just call memcpy */
cc0d9ba8 8786 if (! constp)
3933e0e1
MM
8787 return 0;
8788
37409796
NS
8789 /* This must be a fixed size alignment */
8790 gcc_assert (GET_CODE (align_rtx) == CONST_INT);
fba73eb1 8791 align = INTVAL (align_rtx) * BITS_PER_UNIT;
5ee95df6 8792
7e69e155 8793 /* Anything to move? */
3933e0e1
MM
8794 bytes = INTVAL (bytes_rtx);
8795 if (bytes <= 0)
7e69e155
MM
8796 return 1;
8797
ea9982a8 8798 /* store_one_arg depends on expand_block_move to handle at least the size of
f676971a 8799 reg_parm_stack_space. */
ea9982a8 8800 if (bytes > (TARGET_POWERPC64 ? 64 : 32))
7e69e155
MM
8801 return 0;
8802
cabfd258 8803 for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
7e69e155 8804 {
cabfd258 8805 union {
70128ad9 8806 rtx (*movmemsi) (rtx, rtx, rtx, rtx);
a2369ed3 8807 rtx (*mov) (rtx, rtx);
cabfd258
GK
8808 } gen_func;
8809 enum machine_mode mode = BLKmode;
8810 rtx src, dest;
f676971a 8811
5514620a
GK
8812 /* Altivec first, since it will be faster than a string move
8813 when it applies, and usually not significantly larger. */
8814 if (TARGET_ALTIVEC && bytes >= 16 && align >= 128)
8815 {
8816 move_bytes = 16;
8817 mode = V4SImode;
8818 gen_func.mov = gen_movv4si;
8819 }
8820 else if (TARGET_STRING
cabfd258
GK
8821 && bytes > 24 /* move up to 32 bytes at a time */
8822 && ! fixed_regs[5]
8823 && ! fixed_regs[6]
8824 && ! fixed_regs[7]
8825 && ! fixed_regs[8]
8826 && ! fixed_regs[9]
8827 && ! fixed_regs[10]
8828 && ! fixed_regs[11]
8829 && ! fixed_regs[12])
7e69e155 8830 {
cabfd258 8831 move_bytes = (bytes > 32) ? 32 : bytes;
70128ad9 8832 gen_func.movmemsi = gen_movmemsi_8reg;
cabfd258
GK
8833 }
8834 else if (TARGET_STRING
8835 && bytes > 16 /* move up to 24 bytes at a time */
8836 && ! fixed_regs[5]
8837 && ! fixed_regs[6]
8838 && ! fixed_regs[7]
8839 && ! fixed_regs[8]
8840 && ! fixed_regs[9]
8841 && ! fixed_regs[10])
8842 {
8843 move_bytes = (bytes > 24) ? 24 : bytes;
70128ad9 8844 gen_func.movmemsi = gen_movmemsi_6reg;
cabfd258
GK
8845 }
8846 else if (TARGET_STRING
8847 && bytes > 8 /* move up to 16 bytes at a time */
8848 && ! fixed_regs[5]
8849 && ! fixed_regs[6]
8850 && ! fixed_regs[7]
8851 && ! fixed_regs[8])
8852 {
8853 move_bytes = (bytes > 16) ? 16 : bytes;
70128ad9 8854 gen_func.movmemsi = gen_movmemsi_4reg;
cabfd258
GK
8855 }
8856 else if (bytes >= 8 && TARGET_POWERPC64
8857 /* 64-bit loads and stores require word-aligned
8858 displacements. */
fba73eb1 8859 && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
cabfd258
GK
8860 {
8861 move_bytes = 8;
8862 mode = DImode;
8863 gen_func.mov = gen_movdi;
8864 }
8865 else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
8866 { /* move up to 8 bytes at a time */
8867 move_bytes = (bytes > 8) ? 8 : bytes;
70128ad9 8868 gen_func.movmemsi = gen_movmemsi_2reg;
cabfd258 8869 }
cd7d9ca4 8870 else if (bytes >= 4 && (align >= 32 || !STRICT_ALIGNMENT))
cabfd258
GK
8871 { /* move 4 bytes */
8872 move_bytes = 4;
8873 mode = SImode;
8874 gen_func.mov = gen_movsi;
8875 }
cd7d9ca4 8876 else if (bytes == 2 && (align >= 16 || !STRICT_ALIGNMENT))
cabfd258
GK
8877 { /* move 2 bytes */
8878 move_bytes = 2;
8879 mode = HImode;
8880 gen_func.mov = gen_movhi;
8881 }
8882 else if (TARGET_STRING && bytes > 1)
8883 { /* move up to 4 bytes at a time */
8884 move_bytes = (bytes > 4) ? 4 : bytes;
70128ad9 8885 gen_func.movmemsi = gen_movmemsi_1reg;
cabfd258
GK
8886 }
8887 else /* move 1 byte at a time */
8888 {
8889 move_bytes = 1;
8890 mode = QImode;
8891 gen_func.mov = gen_movqi;
8892 }
f676971a 8893
cabfd258
GK
8894 src = adjust_address (orig_src, mode, offset);
8895 dest = adjust_address (orig_dest, mode, offset);
f676971a
EC
8896
8897 if (mode != BLKmode)
cabfd258
GK
8898 {
8899 rtx tmp_reg = gen_reg_rtx (mode);
f676971a 8900
cabfd258
GK
8901 emit_insn ((*gen_func.mov) (tmp_reg, src));
8902 stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
4c64a852 8903 }
3933e0e1 8904
cabfd258
GK
8905 if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
8906 {
8907 int i;
8908 for (i = 0; i < num_reg; i++)
8909 emit_insn (stores[i]);
8910 num_reg = 0;
8911 }
35aff10b 8912
cabfd258 8913 if (mode == BLKmode)
7e69e155 8914 {
70128ad9 8915 /* Move the address into scratch registers. The movmemsi
cabfd258
GK
8916 patterns require zero offset. */
8917 if (!REG_P (XEXP (src, 0)))
b6c9286a 8918 {
cabfd258
GK
8919 rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
8920 src = replace_equiv_address (src, src_reg);
b6c9286a 8921 }
cabfd258 8922 set_mem_size (src, GEN_INT (move_bytes));
f676971a 8923
cabfd258 8924 if (!REG_P (XEXP (dest, 0)))
3933e0e1 8925 {
cabfd258
GK
8926 rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
8927 dest = replace_equiv_address (dest, dest_reg);
7e69e155 8928 }
cabfd258 8929 set_mem_size (dest, GEN_INT (move_bytes));
f676971a 8930
70128ad9 8931 emit_insn ((*gen_func.movmemsi) (dest, src,
cabfd258
GK
8932 GEN_INT (move_bytes & 31),
8933 align_rtx));
7e69e155 8934 }
7e69e155
MM
8935 }
8936
8937 return 1;
8938}
8939
d62294f5 8940\f
9caa3eb2
DE
8941/* Return a string to perform a load_multiple operation.
8942 operands[0] is the vector.
8943 operands[1] is the source address.
8944 operands[2] is the first destination register. */
8945
8946const char *
a2369ed3 8947rs6000_output_load_multiple (rtx operands[3])
9caa3eb2
DE
8948{
8949 /* We have to handle the case where the pseudo used to contain the address
8950 is assigned to one of the output registers. */
8951 int i, j;
8952 int words = XVECLEN (operands[0], 0);
8953 rtx xop[10];
8954
8955 if (XVECLEN (operands[0], 0) == 1)
8956 return "{l|lwz} %2,0(%1)";
8957
8958 for (i = 0; i < words; i++)
8959 if (refers_to_regno_p (REGNO (operands[2]) + i,
8960 REGNO (operands[2]) + i + 1, operands[1], 0))
8961 {
8962 if (i == words-1)
8963 {
8964 xop[0] = GEN_INT (4 * (words-1));
8965 xop[1] = operands[1];
8966 xop[2] = operands[2];
8967 output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
8968 return "";
8969 }
8970 else if (i == 0)
8971 {
8972 xop[0] = GEN_INT (4 * (words-1));
8973 xop[1] = operands[1];
8974 xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
8975 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);
8976 return "";
8977 }
8978 else
8979 {
8980 for (j = 0; j < words; j++)
8981 if (j != i)
8982 {
8983 xop[0] = GEN_INT (j * 4);
8984 xop[1] = operands[1];
8985 xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
8986 output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
8987 }
8988 xop[0] = GEN_INT (i * 4);
8989 xop[1] = operands[1];
8990 output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
8991 return "";
8992 }
8993 }
8994
8995 return "{lsi|lswi} %2,%1,%N0";
8996}
8997
9878760c 8998\f
a4f6c312
SS
8999/* A validation routine: say whether CODE, a condition code, and MODE
9000 match. The other alternatives either don't make sense or should
9001 never be generated. */
39a10a29 9002
48d72335 9003void
a2369ed3 9004validate_condition_mode (enum rtx_code code, enum machine_mode mode)
39a10a29 9005{
37409796
NS
9006 gcc_assert ((GET_RTX_CLASS (code) == RTX_COMPARE
9007 || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
9008 && GET_MODE_CLASS (mode) == MODE_CC);
39a10a29
GK
9009
9010 /* These don't make sense. */
37409796
NS
9011 gcc_assert ((code != GT && code != LT && code != GE && code != LE)
9012 || mode != CCUNSmode);
39a10a29 9013
37409796
NS
9014 gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU)
9015 || mode == CCUNSmode);
39a10a29 9016
37409796
NS
9017 gcc_assert (mode == CCFPmode
9018 || (code != ORDERED && code != UNORDERED
9019 && code != UNEQ && code != LTGT
9020 && code != UNGT && code != UNLT
9021 && code != UNGE && code != UNLE));
f676971a
EC
9022
9023 /* These should never be generated except for
bc9ec0e0 9024 flag_finite_math_only. */
37409796
NS
9025 gcc_assert (mode != CCFPmode
9026 || flag_finite_math_only
9027 || (code != LE && code != GE
9028 && code != UNEQ && code != LTGT
9029 && code != UNGT && code != UNLT));
39a10a29
GK
9030
9031 /* These are invalid; the information is not there. */
37409796 9032 gcc_assert (mode != CCEQmode || code == EQ || code == NE);
39a10a29
GK
9033}
9034
9878760c
RK
9035\f
9036/* Return 1 if ANDOP is a mask that has no bits on that are not in the
9037 mask required to convert the result of a rotate insn into a shift
b1765bde 9038 left insn of SHIFTOP bits. Both are known to be SImode CONST_INT. */
9878760c
RK
9039
9040int
a2369ed3 9041includes_lshift_p (rtx shiftop, rtx andop)
9878760c 9042{
e2c953b6
DE
9043 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
9044
9045 shift_mask <<= INTVAL (shiftop);
9878760c 9046
b1765bde 9047 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
9878760c
RK
9048}
9049
9050/* Similar, but for right shift. */
9051
9052int
a2369ed3 9053includes_rshift_p (rtx shiftop, rtx andop)
9878760c 9054{
a7653a2c 9055 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
9878760c
RK
9056
9057 shift_mask >>= INTVAL (shiftop);
9058
b1765bde 9059 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
e2c953b6
DE
9060}
9061
c5059423
AM
9062/* Return 1 if ANDOP is a mask suitable for use with an rldic insn
9063 to perform a left shift. It must have exactly SHIFTOP least
b6d08ca1 9064 significant 0's, then one or more 1's, then zero or more 0's. */
e2c953b6
DE
9065
9066int
a2369ed3 9067includes_rldic_lshift_p (rtx shiftop, rtx andop)
e2c953b6 9068{
c5059423
AM
9069 if (GET_CODE (andop) == CONST_INT)
9070 {
02071907 9071 HOST_WIDE_INT c, lsb, shift_mask;
e2c953b6 9072
c5059423 9073 c = INTVAL (andop);
02071907 9074 if (c == 0 || c == ~0)
c5059423 9075 return 0;
e2c953b6 9076
02071907 9077 shift_mask = ~0;
c5059423
AM
9078 shift_mask <<= INTVAL (shiftop);
9079
b6d08ca1 9080 /* Find the least significant one bit. */
c5059423
AM
9081 lsb = c & -c;
9082
9083 /* It must coincide with the LSB of the shift mask. */
9084 if (-lsb != shift_mask)
9085 return 0;
e2c953b6 9086
c5059423
AM
9087 /* Invert to look for the next transition (if any). */
9088 c = ~c;
9089
9090 /* Remove the low group of ones (originally low group of zeros). */
9091 c &= -lsb;
9092
9093 /* Again find the lsb, and check we have all 1's above. */
9094 lsb = c & -c;
9095 return c == -lsb;
9096 }
9097 else if (GET_CODE (andop) == CONST_DOUBLE
9098 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
9099 {
02071907
AM
9100 HOST_WIDE_INT low, high, lsb;
9101 HOST_WIDE_INT shift_mask_low, shift_mask_high;
c5059423
AM
9102
9103 low = CONST_DOUBLE_LOW (andop);
9104 if (HOST_BITS_PER_WIDE_INT < 64)
9105 high = CONST_DOUBLE_HIGH (andop);
9106
9107 if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
02071907 9108 || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
c5059423
AM
9109 return 0;
9110
9111 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
9112 {
02071907 9113 shift_mask_high = ~0;
c5059423
AM
9114 if (INTVAL (shiftop) > 32)
9115 shift_mask_high <<= INTVAL (shiftop) - 32;
9116
9117 lsb = high & -high;
9118
9119 if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
9120 return 0;
9121
9122 high = ~high;
9123 high &= -lsb;
9124
9125 lsb = high & -high;
9126 return high == -lsb;
9127 }
9128
02071907 9129 shift_mask_low = ~0;
c5059423
AM
9130 shift_mask_low <<= INTVAL (shiftop);
9131
9132 lsb = low & -low;
9133
9134 if (-lsb != shift_mask_low)
9135 return 0;
9136
9137 if (HOST_BITS_PER_WIDE_INT < 64)
9138 high = ~high;
9139 low = ~low;
9140 low &= -lsb;
9141
9142 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
9143 {
9144 lsb = high & -high;
9145 return high == -lsb;
9146 }
9147
9148 lsb = low & -low;
9149 return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
9150 }
9151 else
9152 return 0;
9153}
e2c953b6 9154
c5059423
AM
9155/* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
9156 to perform a left shift. It must have SHIFTOP or more least
c1207243 9157 significant 0's, with the remainder of the word 1's. */
e2c953b6 9158
c5059423 9159int
a2369ed3 9160includes_rldicr_lshift_p (rtx shiftop, rtx andop)
c5059423 9161{
e2c953b6 9162 if (GET_CODE (andop) == CONST_INT)
c5059423 9163 {
02071907 9164 HOST_WIDE_INT c, lsb, shift_mask;
c5059423 9165
02071907 9166 shift_mask = ~0;
c5059423
AM
9167 shift_mask <<= INTVAL (shiftop);
9168 c = INTVAL (andop);
9169
c1207243 9170 /* Find the least significant one bit. */
c5059423
AM
9171 lsb = c & -c;
9172
9173 /* It must be covered by the shift mask.
a4f6c312 9174 This test also rejects c == 0. */
c5059423
AM
9175 if ((lsb & shift_mask) == 0)
9176 return 0;
9177
9178 /* Check we have all 1's above the transition, and reject all 1's. */
9179 return c == -lsb && lsb != 1;
9180 }
9181 else if (GET_CODE (andop) == CONST_DOUBLE
9182 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
9183 {
02071907 9184 HOST_WIDE_INT low, lsb, shift_mask_low;
c5059423
AM
9185
9186 low = CONST_DOUBLE_LOW (andop);
9187
9188 if (HOST_BITS_PER_WIDE_INT < 64)
9189 {
02071907 9190 HOST_WIDE_INT high, shift_mask_high;
c5059423
AM
9191
9192 high = CONST_DOUBLE_HIGH (andop);
9193
9194 if (low == 0)
9195 {
02071907 9196 shift_mask_high = ~0;
c5059423
AM
9197 if (INTVAL (shiftop) > 32)
9198 shift_mask_high <<= INTVAL (shiftop) - 32;
9199
9200 lsb = high & -high;
9201
9202 if ((lsb & shift_mask_high) == 0)
9203 return 0;
9204
9205 return high == -lsb;
9206 }
9207 if (high != ~0)
9208 return 0;
9209 }
9210
02071907 9211 shift_mask_low = ~0;
c5059423
AM
9212 shift_mask_low <<= INTVAL (shiftop);
9213
9214 lsb = low & -low;
9215
9216 if ((lsb & shift_mask_low) == 0)
9217 return 0;
9218
9219 return low == -lsb && lsb != 1;
9220 }
e2c953b6 9221 else
c5059423 9222 return 0;
9878760c 9223}
35068b43 9224
11ac38b2
DE
9225/* Return 1 if operands will generate a valid arguments to rlwimi
9226instruction for insert with right shift in 64-bit mode. The mask may
9227not start on the first bit or stop on the last bit because wrap-around
9228effects of instruction do not correspond to semantics of RTL insn. */
9229
9230int
9231insvdi_rshift_rlwimi_p (rtx sizeop, rtx startop, rtx shiftop)
9232{
9233 if (INTVAL (startop) < 64
9234 && INTVAL (startop) > 32
9235 && (INTVAL (sizeop) + INTVAL (startop) < 64)
9236 && (INTVAL (sizeop) + INTVAL (startop) > 33)
9237 && (INTVAL (sizeop) + INTVAL (startop) + INTVAL (shiftop) < 96)
9238 && (INTVAL (sizeop) + INTVAL (startop) + INTVAL (shiftop) >= 64)
9239 && (64 - (INTVAL (shiftop) & 63)) >= INTVAL (sizeop))
9240 return 1;
9241
9242 return 0;
9243}
9244
35068b43 9245/* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
90f81f99 9246 for lfq and stfq insns iff the registers are hard registers. */
35068b43
RK
9247
9248int
a2369ed3 9249registers_ok_for_quad_peep (rtx reg1, rtx reg2)
35068b43
RK
9250{
9251 /* We might have been passed a SUBREG. */
f676971a 9252 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
35068b43 9253 return 0;
f676971a 9254
90f81f99
AP
9255 /* We might have been passed non floating point registers. */
9256 if (!FP_REGNO_P (REGNO (reg1))
9257 || !FP_REGNO_P (REGNO (reg2)))
9258 return 0;
35068b43
RK
9259
9260 return (REGNO (reg1) == REGNO (reg2) - 1);
9261}
9262
a4f6c312
SS
9263/* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
9264 addr1 and addr2 must be in consecutive memory locations
9265 (addr2 == addr1 + 8). */
35068b43
RK
9266
9267int
90f81f99 9268mems_ok_for_quad_peep (rtx mem1, rtx mem2)
35068b43 9269{
90f81f99 9270 rtx addr1, addr2;
e2c953b6 9271 unsigned int reg1;
35068b43
RK
9272 int offset1;
9273
90f81f99
AP
9274 /* The mems cannot be volatile. */
9275 if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
9276 return 0;
f676971a 9277
90f81f99
AP
9278 addr1 = XEXP (mem1, 0);
9279 addr2 = XEXP (mem2, 0);
9280
35068b43
RK
9281 /* Extract an offset (if used) from the first addr. */
9282 if (GET_CODE (addr1) == PLUS)
9283 {
9284 /* If not a REG, return zero. */
9285 if (GET_CODE (XEXP (addr1, 0)) != REG)
9286 return 0;
9287 else
9288 {
c4ad648e 9289 reg1 = REGNO (XEXP (addr1, 0));
35068b43
RK
9290 /* The offset must be constant! */
9291 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
c4ad648e
AM
9292 return 0;
9293 offset1 = INTVAL (XEXP (addr1, 1));
35068b43
RK
9294 }
9295 }
9296 else if (GET_CODE (addr1) != REG)
9297 return 0;
9298 else
9299 {
9300 reg1 = REGNO (addr1);
9301 /* This was a simple (mem (reg)) expression. Offset is 0. */
9302 offset1 = 0;
9303 }
9304
a2369ed3 9305 /* Make sure the second address is a (mem (plus (reg) (const_int)))
f676971a 9306 or if it is (mem (reg)) then make sure that offset1 is -8 and the same
0f6937fe 9307 register as addr1. */
984e25ac 9308 if (offset1 == -8 && GET_CODE (addr2) == REG && reg1 == REGNO (addr2))
0f6937fe 9309 return 1;
35068b43
RK
9310 if (GET_CODE (addr2) != PLUS)
9311 return 0;
9312
9313 if (GET_CODE (XEXP (addr2, 0)) != REG
9314 || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
9315 return 0;
9316
9317 if (reg1 != REGNO (XEXP (addr2, 0)))
9318 return 0;
9319
9320 /* The offset for the second addr must be 8 more than the first addr. */
9321 if (INTVAL (XEXP (addr2, 1)) != offset1 + 8)
9322 return 0;
9323
9324 /* All the tests passed. addr1 and addr2 are valid for lfq or stfq
9325 instructions. */
9326 return 1;
9327}
9878760c
RK
9328\f
9329/* Return the register class of a scratch register needed to copy IN into
9330 or out of a register in CLASS in MODE. If it can be done directly,
9331 NO_REGS is returned. */
9332
9333enum reg_class
f676971a 9334secondary_reload_class (enum reg_class class,
a9baceb1
GK
9335 enum machine_mode mode ATTRIBUTE_UNUSED,
9336 rtx in)
9878760c 9337{
5accd822 9338 int regno;
9878760c 9339
ab82a49f
AP
9340 if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
9341#if TARGET_MACHO
c4ad648e 9342 && MACHOPIC_INDIRECT
ab82a49f 9343#endif
c4ad648e 9344 ))
46fad5b7
DJ
9345 {
9346 /* We cannot copy a symbolic operand directly into anything
c4ad648e
AM
9347 other than BASE_REGS for TARGET_ELF. So indicate that a
9348 register from BASE_REGS is needed as an intermediate
9349 register.
f676971a 9350
46fad5b7
DJ
9351 On Darwin, pic addresses require a load from memory, which
9352 needs a base register. */
9353 if (class != BASE_REGS
c4ad648e
AM
9354 && (GET_CODE (in) == SYMBOL_REF
9355 || GET_CODE (in) == HIGH
9356 || GET_CODE (in) == LABEL_REF
9357 || GET_CODE (in) == CONST))
9358 return BASE_REGS;
46fad5b7 9359 }
e7b7998a 9360
5accd822
DE
9361 if (GET_CODE (in) == REG)
9362 {
9363 regno = REGNO (in);
9364 if (regno >= FIRST_PSEUDO_REGISTER)
9365 {
9366 regno = true_regnum (in);
9367 if (regno >= FIRST_PSEUDO_REGISTER)
9368 regno = -1;
9369 }
9370 }
9371 else if (GET_CODE (in) == SUBREG)
9372 {
9373 regno = true_regnum (in);
9374 if (regno >= FIRST_PSEUDO_REGISTER)
9375 regno = -1;
9376 }
9377 else
9378 regno = -1;
9379
9878760c
RK
9380 /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
9381 into anything. */
9382 if (class == GENERAL_REGS || class == BASE_REGS
9383 || (regno >= 0 && INT_REGNO_P (regno)))
9384 return NO_REGS;
9385
9386 /* Constants, memory, and FP registers can go into FP registers. */
9387 if ((regno == -1 || FP_REGNO_P (regno))
9388 && (class == FLOAT_REGS || class == NON_SPECIAL_REGS))
9389 return NO_REGS;
9390
0ac081f6
AH
9391 /* Memory, and AltiVec registers can go into AltiVec registers. */
9392 if ((regno == -1 || ALTIVEC_REGNO_P (regno))
9393 && class == ALTIVEC_REGS)
9394 return NO_REGS;
9395
9878760c
RK
9396 /* We can copy among the CR registers. */
9397 if ((class == CR_REGS || class == CR0_REGS)
9398 && regno >= 0 && CR_REGNO_P (regno))
9399 return NO_REGS;
9400
9401 /* Otherwise, we need GENERAL_REGS. */
9402 return GENERAL_REGS;
9403}
9404\f
9405/* Given a comparison operation, return the bit number in CCR to test. We
f676971a 9406 know this is a valid comparison.
9878760c
RK
9407
9408 SCC_P is 1 if this is for an scc. That means that %D will have been
9409 used instead of %C, so the bits will be in different places.
9410
b4ac57ab 9411 Return -1 if OP isn't a valid comparison for some reason. */
9878760c
RK
9412
9413int
a2369ed3 9414ccr_bit (rtx op, int scc_p)
9878760c
RK
9415{
9416 enum rtx_code code = GET_CODE (op);
9417 enum machine_mode cc_mode;
9418 int cc_regnum;
9419 int base_bit;
9ebbca7d 9420 rtx reg;
9878760c 9421
ec8e098d 9422 if (!COMPARISON_P (op))
9878760c
RK
9423 return -1;
9424
9ebbca7d
GK
9425 reg = XEXP (op, 0);
9426
37409796 9427 gcc_assert (GET_CODE (reg) == REG && CR_REGNO_P (REGNO (reg)));
9ebbca7d
GK
9428
9429 cc_mode = GET_MODE (reg);
9430 cc_regnum = REGNO (reg);
9431 base_bit = 4 * (cc_regnum - CR0_REGNO);
9878760c 9432
39a10a29 9433 validate_condition_mode (code, cc_mode);
c5defebb 9434
b7053a3f
GK
9435 /* When generating a sCOND operation, only positive conditions are
9436 allowed. */
37409796
NS
9437 gcc_assert (!scc_p
9438 || code == EQ || code == GT || code == LT || code == UNORDERED
9439 || code == GTU || code == LTU);
f676971a 9440
9878760c
RK
9441 switch (code)
9442 {
9443 case NE:
9444 return scc_p ? base_bit + 3 : base_bit + 2;
9445 case EQ:
9446 return base_bit + 2;
1c882ea4 9447 case GT: case GTU: case UNLE:
9878760c 9448 return base_bit + 1;
1c882ea4 9449 case LT: case LTU: case UNGE:
9878760c 9450 return base_bit;
1c882ea4
GK
9451 case ORDERED: case UNORDERED:
9452 return base_bit + 3;
9878760c
RK
9453
9454 case GE: case GEU:
39a10a29 9455 /* If scc, we will have done a cror to put the bit in the
9878760c
RK
9456 unordered position. So test that bit. For integer, this is ! LT
9457 unless this is an scc insn. */
39a10a29 9458 return scc_p ? base_bit + 3 : base_bit;
9878760c
RK
9459
9460 case LE: case LEU:
39a10a29 9461 return scc_p ? base_bit + 3 : base_bit + 1;
1c882ea4 9462
9878760c 9463 default:
37409796 9464 gcc_unreachable ();
9878760c
RK
9465 }
9466}
1ff7789b 9467\f
8d30c4ee 9468/* Return the GOT register. */
1ff7789b 9469
9390387d 9470rtx
a2369ed3 9471rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
1ff7789b 9472{
a4f6c312
SS
9473 /* The second flow pass currently (June 1999) can't update
9474 regs_ever_live without disturbing other parts of the compiler, so
9475 update it here to make the prolog/epilogue code happy. */
1db02437
FS
9476 if (no_new_pseudos && ! regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM])
9477 regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
1ff7789b 9478
8d30c4ee 9479 current_function_uses_pic_offset_table = 1;
3cb999d8 9480
1ff7789b
MM
9481 return pic_offset_table_rtx;
9482}
a7df97e6 9483\f
e2500fed
GK
9484/* Function to init struct machine_function.
9485 This will be called, via a pointer variable,
9486 from push_function_context. */
a7df97e6 9487
e2500fed 9488static struct machine_function *
863d938c 9489rs6000_init_machine_status (void)
a7df97e6 9490{
e2500fed 9491 return ggc_alloc_cleared (sizeof (machine_function));
a7df97e6 9492}
9878760c 9493\f
0ba1b2ff
AM
9494/* These macros test for integers and extract the low-order bits. */
9495#define INT_P(X) \
9496((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE) \
9497 && GET_MODE (X) == VOIDmode)
9498
9499#define INT_LOWPART(X) \
9500 (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
9501
9502int
a2369ed3 9503extract_MB (rtx op)
0ba1b2ff
AM
9504{
9505 int i;
9506 unsigned long val = INT_LOWPART (op);
9507
9508 /* If the high bit is zero, the value is the first 1 bit we find
9509 from the left. */
9510 if ((val & 0x80000000) == 0)
9511 {
37409796 9512 gcc_assert (val & 0xffffffff);
0ba1b2ff
AM
9513
9514 i = 1;
9515 while (((val <<= 1) & 0x80000000) == 0)
9516 ++i;
9517 return i;
9518 }
9519
9520 /* If the high bit is set and the low bit is not, or the mask is all
9521 1's, the value is zero. */
9522 if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
9523 return 0;
9524
9525 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
9526 from the right. */
9527 i = 31;
9528 while (((val >>= 1) & 1) != 0)
9529 --i;
9530
9531 return i;
9532}
9533
9534int
a2369ed3 9535extract_ME (rtx op)
0ba1b2ff
AM
9536{
9537 int i;
9538 unsigned long val = INT_LOWPART (op);
9539
9540 /* If the low bit is zero, the value is the first 1 bit we find from
9541 the right. */
9542 if ((val & 1) == 0)
9543 {
37409796 9544 gcc_assert (val & 0xffffffff);
0ba1b2ff
AM
9545
9546 i = 30;
9547 while (((val >>= 1) & 1) == 0)
9548 --i;
9549
9550 return i;
9551 }
9552
9553 /* If the low bit is set and the high bit is not, or the mask is all
9554 1's, the value is 31. */
9555 if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
9556 return 31;
9557
9558 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
9559 from the left. */
9560 i = 0;
9561 while (((val <<= 1) & 0x80000000) != 0)
9562 ++i;
9563
9564 return i;
9565}
9566
c4501e62
JJ
9567/* Locate some local-dynamic symbol still in use by this function
9568 so that we can print its name in some tls_ld pattern. */
9569
9570static const char *
863d938c 9571rs6000_get_some_local_dynamic_name (void)
c4501e62
JJ
9572{
9573 rtx insn;
9574
9575 if (cfun->machine->some_ld_name)
9576 return cfun->machine->some_ld_name;
9577
9578 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
9579 if (INSN_P (insn)
9580 && for_each_rtx (&PATTERN (insn),
9581 rs6000_get_some_local_dynamic_name_1, 0))
9582 return cfun->machine->some_ld_name;
9583
37409796 9584 gcc_unreachable ();
c4501e62
JJ
9585}
9586
9587/* Helper function for rs6000_get_some_local_dynamic_name. */
9588
9589static int
a2369ed3 9590rs6000_get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
c4501e62
JJ
9591{
9592 rtx x = *px;
9593
9594 if (GET_CODE (x) == SYMBOL_REF)
9595 {
9596 const char *str = XSTR (x, 0);
9597 if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
9598 {
9599 cfun->machine->some_ld_name = str;
9600 return 1;
9601 }
9602 }
9603
9604 return 0;
9605}
9606
85b776df
AM
9607/* Write out a function code label. */
9608
9609void
9610rs6000_output_function_entry (FILE *file, const char *fname)
9611{
9612 if (fname[0] != '.')
9613 {
9614 switch (DEFAULT_ABI)
9615 {
9616 default:
37409796 9617 gcc_unreachable ();
85b776df
AM
9618
9619 case ABI_AIX:
9620 if (DOT_SYMBOLS)
9621 putc ('.', file);
9622 else
9623 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
9624 break;
9625
9626 case ABI_V4:
9627 case ABI_DARWIN:
9628 break;
9629 }
9630 }
9631 if (TARGET_AIX)
9632 RS6000_OUTPUT_BASENAME (file, fname);
9633 else
9634 assemble_name (file, fname);
9635}
9636
9878760c
RK
9637/* Print an operand. Recognize special options, documented below. */
9638
38c1f2d7 9639#if TARGET_ELF
d9407988 9640#define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
8fbd2dc7 9641#define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
ba5e43aa
MM
9642#else
9643#define SMALL_DATA_RELOC "sda21"
8fbd2dc7 9644#define SMALL_DATA_REG 0
ba5e43aa
MM
9645#endif
9646
9878760c 9647void
a2369ed3 9648print_operand (FILE *file, rtx x, int code)
9878760c
RK
9649{
9650 int i;
a260abc9 9651 HOST_WIDE_INT val;
0ba1b2ff 9652 unsigned HOST_WIDE_INT uval;
9878760c
RK
9653
9654 switch (code)
9655 {
a8b3aeda 9656 case '.':
a85d226b
RK
9657 /* Write out an instruction after the call which may be replaced
9658 with glue code by the loader. This depends on the AIX version. */
9659 asm_fprintf (file, RS6000_CALL_GLUE);
a8b3aeda
RK
9660 return;
9661
81eace42
GK
9662 /* %a is output_address. */
9663
9854d9ed
RK
9664 case 'A':
9665 /* If X is a constant integer whose low-order 5 bits are zero,
9666 write 'l'. Otherwise, write 'r'. This is a kludge to fix a bug
76229ac8 9667 in the AIX assembler where "sri" with a zero shift count
20e26713 9668 writes a trash instruction. */
9854d9ed 9669 if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
76229ac8 9670 putc ('l', file);
9854d9ed 9671 else
76229ac8 9672 putc ('r', file);
9854d9ed
RK
9673 return;
9674
9675 case 'b':
e2c953b6
DE
9676 /* If constant, low-order 16 bits of constant, unsigned.
9677 Otherwise, write normally. */
9678 if (INT_P (x))
9679 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
9680 else
9681 print_operand (file, x, 0);
cad12a8d
RK
9682 return;
9683
a260abc9
DE
9684 case 'B':
9685 /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
9686 for 64-bit mask direction. */
9390387d 9687 putc (((INT_LOWPART (x) & 1) == 0 ? 'r' : 'l'), file);
a238cd8b 9688 return;
a260abc9 9689
81eace42
GK
9690 /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
9691 output_operand. */
9692
423c1189
AH
9693 case 'c':
9694 /* X is a CR register. Print the number of the GT bit of the CR. */
9695 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9696 output_operand_lossage ("invalid %%E value");
9697 else
9698 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 1);
9699 return;
9700
9701 case 'D':
6b1fedc3 9702 /* Like 'J' but get to the EQ bit. */
37409796 9703 gcc_assert (GET_CODE (x) == REG);
423c1189 9704
6b1fedc3
AH
9705 /* Bit 1 is EQ bit. */
9706 i = 4 * (REGNO (x) - CR0_REGNO) + 2;
423c1189 9707
64022b5d 9708 fprintf (file, "%d", i);
423c1189
AH
9709 return;
9710
9854d9ed 9711 case 'E':
39a10a29 9712 /* X is a CR register. Print the number of the EQ bit of the CR */
9854d9ed
RK
9713 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9714 output_operand_lossage ("invalid %%E value");
78fbdbf7 9715 else
39a10a29 9716 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
a85d226b 9717 return;
9854d9ed
RK
9718
9719 case 'f':
9720 /* X is a CR register. Print the shift count needed to move it
9721 to the high-order four bits. */
9722 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9723 output_operand_lossage ("invalid %%f value");
9724 else
9ebbca7d 9725 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
9854d9ed
RK
9726 return;
9727
9728 case 'F':
9729 /* Similar, but print the count for the rotate in the opposite
9730 direction. */
9731 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9732 output_operand_lossage ("invalid %%F value");
9733 else
9ebbca7d 9734 fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
9854d9ed
RK
9735 return;
9736
9737 case 'G':
9738 /* X is a constant integer. If it is negative, print "m",
43aa4e05 9739 otherwise print "z". This is to make an aze or ame insn. */
9854d9ed
RK
9740 if (GET_CODE (x) != CONST_INT)
9741 output_operand_lossage ("invalid %%G value");
9742 else if (INTVAL (x) >= 0)
76229ac8 9743 putc ('z', file);
9854d9ed 9744 else
76229ac8 9745 putc ('m', file);
9854d9ed 9746 return;
e2c953b6 9747
9878760c 9748 case 'h':
a4f6c312
SS
9749 /* If constant, output low-order five bits. Otherwise, write
9750 normally. */
9878760c 9751 if (INT_P (x))
5f59ecb7 9752 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
9878760c
RK
9753 else
9754 print_operand (file, x, 0);
9755 return;
9756
64305719 9757 case 'H':
a4f6c312
SS
9758 /* If constant, output low-order six bits. Otherwise, write
9759 normally. */
64305719 9760 if (INT_P (x))
5f59ecb7 9761 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
64305719
DE
9762 else
9763 print_operand (file, x, 0);
9764 return;
9765
9854d9ed
RK
9766 case 'I':
9767 /* Print `i' if this is a constant, else nothing. */
9878760c 9768 if (INT_P (x))
76229ac8 9769 putc ('i', file);
9878760c
RK
9770 return;
9771
9854d9ed
RK
9772 case 'j':
9773 /* Write the bit number in CCR for jump. */
9774 i = ccr_bit (x, 0);
9775 if (i == -1)
9776 output_operand_lossage ("invalid %%j code");
9878760c 9777 else
9854d9ed 9778 fprintf (file, "%d", i);
9878760c
RK
9779 return;
9780
9854d9ed
RK
9781 case 'J':
9782 /* Similar, but add one for shift count in rlinm for scc and pass
9783 scc flag to `ccr_bit'. */
9784 i = ccr_bit (x, 1);
9785 if (i == -1)
9786 output_operand_lossage ("invalid %%J code");
9787 else
a0466a68
RK
9788 /* If we want bit 31, write a shift count of zero, not 32. */
9789 fprintf (file, "%d", i == 31 ? 0 : i + 1);
9878760c
RK
9790 return;
9791
9854d9ed
RK
9792 case 'k':
9793 /* X must be a constant. Write the 1's complement of the
9794 constant. */
9878760c 9795 if (! INT_P (x))
9854d9ed 9796 output_operand_lossage ("invalid %%k value");
e2c953b6
DE
9797 else
9798 fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
9878760c
RK
9799 return;
9800
81eace42 9801 case 'K':
9ebbca7d
GK
9802 /* X must be a symbolic constant on ELF. Write an
9803 expression suitable for an 'addi' that adds in the low 16
9804 bits of the MEM. */
9805 if (GET_CODE (x) != CONST)
9806 {
9807 print_operand_address (file, x);
9808 fputs ("@l", file);
9809 }
9810 else
9811 {
9812 if (GET_CODE (XEXP (x, 0)) != PLUS
9813 || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
9814 && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
9815 || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
53cd5d6c 9816 output_operand_lossage ("invalid %%K value");
9ebbca7d
GK
9817 print_operand_address (file, XEXP (XEXP (x, 0), 0));
9818 fputs ("@l", file);
ed8d2920
MM
9819 /* For GNU as, there must be a non-alphanumeric character
9820 between 'l' and the number. The '-' is added by
9821 print_operand() already. */
9822 if (INTVAL (XEXP (XEXP (x, 0), 1)) >= 0)
9823 fputs ("+", file);
9ebbca7d
GK
9824 print_operand (file, XEXP (XEXP (x, 0), 1), 0);
9825 }
81eace42
GK
9826 return;
9827
9828 /* %l is output_asm_label. */
9ebbca7d 9829
9854d9ed
RK
9830 case 'L':
9831 /* Write second word of DImode or DFmode reference. Works on register
9832 or non-indexed memory only. */
9833 if (GET_CODE (x) == REG)
fb5c67a7 9834 fputs (reg_names[REGNO (x) + 1], file);
9854d9ed
RK
9835 else if (GET_CODE (x) == MEM)
9836 {
9837 /* Handle possible auto-increment. Since it is pre-increment and
1427100a 9838 we have already done it, we can just use an offset of word. */
9854d9ed
RK
9839 if (GET_CODE (XEXP (x, 0)) == PRE_INC
9840 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
ed8908e7
RK
9841 output_address (plus_constant (XEXP (XEXP (x, 0), 0),
9842 UNITS_PER_WORD));
9854d9ed 9843 else
d7624dc0
RK
9844 output_address (XEXP (adjust_address_nv (x, SImode,
9845 UNITS_PER_WORD),
9846 0));
ed8908e7 9847
ba5e43aa 9848 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
9849 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
9850 reg_names[SMALL_DATA_REG]);
9854d9ed 9851 }
9878760c 9852 return;
f676971a 9853
9878760c
RK
9854 case 'm':
9855 /* MB value for a mask operand. */
b1765bde 9856 if (! mask_operand (x, SImode))
9878760c
RK
9857 output_operand_lossage ("invalid %%m value");
9858
0ba1b2ff 9859 fprintf (file, "%d", extract_MB (x));
9878760c
RK
9860 return;
9861
9862 case 'M':
9863 /* ME value for a mask operand. */
b1765bde 9864 if (! mask_operand (x, SImode))
a260abc9 9865 output_operand_lossage ("invalid %%M value");
9878760c 9866
0ba1b2ff 9867 fprintf (file, "%d", extract_ME (x));
9878760c
RK
9868 return;
9869
81eace42
GK
9870 /* %n outputs the negative of its operand. */
9871
9878760c
RK
9872 case 'N':
9873 /* Write the number of elements in the vector times 4. */
9874 if (GET_CODE (x) != PARALLEL)
9875 output_operand_lossage ("invalid %%N value");
e2c953b6
DE
9876 else
9877 fprintf (file, "%d", XVECLEN (x, 0) * 4);
9878760c
RK
9878 return;
9879
9880 case 'O':
9881 /* Similar, but subtract 1 first. */
9882 if (GET_CODE (x) != PARALLEL)
1427100a 9883 output_operand_lossage ("invalid %%O value");
e2c953b6
DE
9884 else
9885 fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
9878760c
RK
9886 return;
9887
9854d9ed
RK
9888 case 'p':
9889 /* X is a CONST_INT that is a power of two. Output the logarithm. */
9890 if (! INT_P (x)
2bfcf297 9891 || INT_LOWPART (x) < 0
9854d9ed
RK
9892 || (i = exact_log2 (INT_LOWPART (x))) < 0)
9893 output_operand_lossage ("invalid %%p value");
e2c953b6
DE
9894 else
9895 fprintf (file, "%d", i);
9854d9ed
RK
9896 return;
9897
9878760c
RK
9898 case 'P':
9899 /* The operand must be an indirect memory reference. The result
8bb418a3 9900 is the register name. */
9878760c
RK
9901 if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
9902 || REGNO (XEXP (x, 0)) >= 32)
9903 output_operand_lossage ("invalid %%P value");
e2c953b6 9904 else
fb5c67a7 9905 fputs (reg_names[REGNO (XEXP (x, 0))], file);
9878760c
RK
9906 return;
9907
dfbdccdb
GK
9908 case 'q':
9909 /* This outputs the logical code corresponding to a boolean
9910 expression. The expression may have one or both operands
39a10a29 9911 negated (if one, only the first one). For condition register
c4ad648e
AM
9912 logical operations, it will also treat the negated
9913 CR codes as NOTs, but not handle NOTs of them. */
dfbdccdb 9914 {
63bc1d05 9915 const char *const *t = 0;
dfbdccdb
GK
9916 const char *s;
9917 enum rtx_code code = GET_CODE (x);
9918 static const char * const tbl[3][3] = {
9919 { "and", "andc", "nor" },
9920 { "or", "orc", "nand" },
9921 { "xor", "eqv", "xor" } };
9922
9923 if (code == AND)
9924 t = tbl[0];
9925 else if (code == IOR)
9926 t = tbl[1];
9927 else if (code == XOR)
9928 t = tbl[2];
9929 else
9930 output_operand_lossage ("invalid %%q value");
9931
9932 if (GET_CODE (XEXP (x, 0)) != NOT)
9933 s = t[0];
9934 else
9935 {
9936 if (GET_CODE (XEXP (x, 1)) == NOT)
9937 s = t[2];
9938 else
9939 s = t[1];
9940 }
f676971a 9941
dfbdccdb
GK
9942 fputs (s, file);
9943 }
9944 return;
9945
2c4a9cff
DE
9946 case 'Q':
9947 if (TARGET_MFCRF)
3b6ce0af 9948 fputc (',', file);
5efb1046 9949 /* FALLTHRU */
2c4a9cff
DE
9950 else
9951 return;
9952
9854d9ed
RK
9953 case 'R':
9954 /* X is a CR register. Print the mask for `mtcrf'. */
9955 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9956 output_operand_lossage ("invalid %%R value");
9957 else
9ebbca7d 9958 fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
9878760c 9959 return;
9854d9ed
RK
9960
9961 case 's':
9962 /* Low 5 bits of 32 - value */
9963 if (! INT_P (x))
9964 output_operand_lossage ("invalid %%s value");
e2c953b6
DE
9965 else
9966 fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
9878760c 9967 return;
9854d9ed 9968
a260abc9 9969 case 'S':
0ba1b2ff 9970 /* PowerPC64 mask position. All 0's is excluded.
a260abc9
DE
9971 CONST_INT 32-bit mask is considered sign-extended so any
9972 transition must occur within the CONST_INT, not on the boundary. */
4ae234b0 9973 if (! mask_operand (x, DImode))
a260abc9
DE
9974 output_operand_lossage ("invalid %%S value");
9975
0ba1b2ff 9976 uval = INT_LOWPART (x);
a260abc9 9977
0ba1b2ff 9978 if (uval & 1) /* Clear Left */
a260abc9 9979 {
f099d360
GK
9980#if HOST_BITS_PER_WIDE_INT > 64
9981 uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
9982#endif
0ba1b2ff 9983 i = 64;
a260abc9 9984 }
0ba1b2ff 9985 else /* Clear Right */
a260abc9 9986 {
0ba1b2ff 9987 uval = ~uval;
f099d360
GK
9988#if HOST_BITS_PER_WIDE_INT > 64
9989 uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
9990#endif
0ba1b2ff 9991 i = 63;
a260abc9 9992 }
0ba1b2ff
AM
9993 while (uval != 0)
9994 --i, uval >>= 1;
37409796 9995 gcc_assert (i >= 0);
0ba1b2ff
AM
9996 fprintf (file, "%d", i);
9997 return;
a260abc9 9998
a3170dc6
AH
9999 case 't':
10000 /* Like 'J' but get to the OVERFLOW/UNORDERED bit. */
37409796 10001 gcc_assert (GET_CODE (x) == REG && GET_MODE (x) == CCmode);
a3170dc6
AH
10002
10003 /* Bit 3 is OV bit. */
10004 i = 4 * (REGNO (x) - CR0_REGNO) + 3;
10005
10006 /* If we want bit 31, write a shift count of zero, not 32. */
10007 fprintf (file, "%d", i == 31 ? 0 : i + 1);
10008 return;
10009
cccf3bdc
DE
10010 case 'T':
10011 /* Print the symbolic name of a branch target register. */
10012 if (GET_CODE (x) != REG || (REGNO (x) != LINK_REGISTER_REGNUM
10013 && REGNO (x) != COUNT_REGISTER_REGNUM))
10014 output_operand_lossage ("invalid %%T value");
e2c953b6 10015 else if (REGNO (x) == LINK_REGISTER_REGNUM)
cccf3bdc
DE
10016 fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
10017 else
10018 fputs ("ctr", file);
10019 return;
10020
9854d9ed 10021 case 'u':
802a0058 10022 /* High-order 16 bits of constant for use in unsigned operand. */
9854d9ed
RK
10023 if (! INT_P (x))
10024 output_operand_lossage ("invalid %%u value");
e2c953b6 10025 else
f676971a 10026 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
e2c953b6 10027 (INT_LOWPART (x) >> 16) & 0xffff);
9878760c
RK
10028 return;
10029
802a0058
MM
10030 case 'v':
10031 /* High-order 16 bits of constant for use in signed operand. */
10032 if (! INT_P (x))
10033 output_operand_lossage ("invalid %%v value");
e2c953b6 10034 else
134c32f6
DE
10035 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
10036 (INT_LOWPART (x) >> 16) & 0xffff);
10037 return;
802a0058 10038
9854d9ed
RK
10039 case 'U':
10040 /* Print `u' if this has an auto-increment or auto-decrement. */
10041 if (GET_CODE (x) == MEM
10042 && (GET_CODE (XEXP (x, 0)) == PRE_INC
10043 || GET_CODE (XEXP (x, 0)) == PRE_DEC))
76229ac8 10044 putc ('u', file);
9854d9ed 10045 return;
9878760c 10046
e0cd0770
JC
10047 case 'V':
10048 /* Print the trap code for this operand. */
10049 switch (GET_CODE (x))
10050 {
10051 case EQ:
10052 fputs ("eq", file); /* 4 */
10053 break;
10054 case NE:
10055 fputs ("ne", file); /* 24 */
10056 break;
10057 case LT:
10058 fputs ("lt", file); /* 16 */
10059 break;
10060 case LE:
10061 fputs ("le", file); /* 20 */
10062 break;
10063 case GT:
10064 fputs ("gt", file); /* 8 */
10065 break;
10066 case GE:
10067 fputs ("ge", file); /* 12 */
10068 break;
10069 case LTU:
10070 fputs ("llt", file); /* 2 */
10071 break;
10072 case LEU:
10073 fputs ("lle", file); /* 6 */
10074 break;
10075 case GTU:
10076 fputs ("lgt", file); /* 1 */
10077 break;
10078 case GEU:
10079 fputs ("lge", file); /* 5 */
10080 break;
10081 default:
37409796 10082 gcc_unreachable ();
e0cd0770
JC
10083 }
10084 break;
10085
9854d9ed
RK
10086 case 'w':
10087 /* If constant, low-order 16 bits of constant, signed. Otherwise, write
10088 normally. */
10089 if (INT_P (x))
f676971a 10090 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
5f59ecb7 10091 ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
9854d9ed
RK
10092 else
10093 print_operand (file, x, 0);
9878760c
RK
10094 return;
10095
9854d9ed 10096 case 'W':
e2c953b6 10097 /* MB value for a PowerPC64 rldic operand. */
e2c953b6
DE
10098 val = (GET_CODE (x) == CONST_INT
10099 ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
10100
10101 if (val < 0)
10102 i = -1;
9854d9ed 10103 else
e2c953b6
DE
10104 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
10105 if ((val <<= 1) < 0)
10106 break;
10107
10108#if HOST_BITS_PER_WIDE_INT == 32
10109 if (GET_CODE (x) == CONST_INT && i >= 0)
10110 i += 32; /* zero-extend high-part was all 0's */
10111 else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
10112 {
10113 val = CONST_DOUBLE_LOW (x);
10114
37409796
NS
10115 gcc_assert (val);
10116 if (val < 0)
e2c953b6
DE
10117 --i;
10118 else
10119 for ( ; i < 64; i++)
10120 if ((val <<= 1) < 0)
10121 break;
10122 }
10123#endif
10124
10125 fprintf (file, "%d", i + 1);
9854d9ed 10126 return;
9878760c 10127
9854d9ed
RK
10128 case 'X':
10129 if (GET_CODE (x) == MEM
4d588c14 10130 && legitimate_indexed_address_p (XEXP (x, 0), 0))
76229ac8 10131 putc ('x', file);
9854d9ed 10132 return;
9878760c 10133
9854d9ed
RK
10134 case 'Y':
10135 /* Like 'L', for third word of TImode */
10136 if (GET_CODE (x) == REG)
fb5c67a7 10137 fputs (reg_names[REGNO (x) + 2], file);
9854d9ed 10138 else if (GET_CODE (x) == MEM)
9878760c 10139 {
9854d9ed
RK
10140 if (GET_CODE (XEXP (x, 0)) == PRE_INC
10141 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
a54d04b7 10142 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
9854d9ed 10143 else
d7624dc0 10144 output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
ba5e43aa 10145 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
10146 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10147 reg_names[SMALL_DATA_REG]);
9878760c
RK
10148 }
10149 return;
f676971a 10150
9878760c 10151 case 'z':
b4ac57ab
RS
10152 /* X is a SYMBOL_REF. Write out the name preceded by a
10153 period and without any trailing data in brackets. Used for function
4d30c363
MM
10154 names. If we are configured for System V (or the embedded ABI) on
10155 the PowerPC, do not emit the period, since those systems do not use
10156 TOCs and the like. */
37409796 10157 gcc_assert (GET_CODE (x) == SYMBOL_REF);
9878760c 10158
c4ad648e
AM
10159 /* Mark the decl as referenced so that cgraph will output the
10160 function. */
9bf6462a 10161 if (SYMBOL_REF_DECL (x))
c4ad648e 10162 mark_decl_referenced (SYMBOL_REF_DECL (x));
9bf6462a 10163
85b776df 10164 /* For macho, check to see if we need a stub. */
f9da97f0
AP
10165 if (TARGET_MACHO)
10166 {
10167 const char *name = XSTR (x, 0);
a031e781 10168#if TARGET_MACHO
3b48085e 10169 if (MACHOPIC_INDIRECT
11abc112
MM
10170 && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
10171 name = machopic_indirection_name (x, /*stub_p=*/true);
f9da97f0
AP
10172#endif
10173 assemble_name (file, name);
10174 }
85b776df 10175 else if (!DOT_SYMBOLS)
9739c90c 10176 assemble_name (file, XSTR (x, 0));
85b776df
AM
10177 else
10178 rs6000_output_function_entry (file, XSTR (x, 0));
9878760c
RK
10179 return;
10180
9854d9ed
RK
10181 case 'Z':
10182 /* Like 'L', for last word of TImode. */
10183 if (GET_CODE (x) == REG)
fb5c67a7 10184 fputs (reg_names[REGNO (x) + 3], file);
9854d9ed
RK
10185 else if (GET_CODE (x) == MEM)
10186 {
10187 if (GET_CODE (XEXP (x, 0)) == PRE_INC
10188 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
a54d04b7 10189 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
9854d9ed 10190 else
d7624dc0 10191 output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
ba5e43aa 10192 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
10193 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10194 reg_names[SMALL_DATA_REG]);
9854d9ed 10195 }
5c23c401 10196 return;
0ac081f6 10197
a3170dc6 10198 /* Print AltiVec or SPE memory operand. */
0ac081f6
AH
10199 case 'y':
10200 {
10201 rtx tmp;
10202
37409796 10203 gcc_assert (GET_CODE (x) == MEM);
0ac081f6
AH
10204
10205 tmp = XEXP (x, 0);
10206
993f19a8 10207 if (TARGET_E500)
a3170dc6
AH
10208 {
10209 /* Handle [reg]. */
10210 if (GET_CODE (tmp) == REG)
10211 {
10212 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
10213 break;
10214 }
10215 /* Handle [reg+UIMM]. */
10216 else if (GET_CODE (tmp) == PLUS &&
10217 GET_CODE (XEXP (tmp, 1)) == CONST_INT)
10218 {
10219 int x;
10220
37409796 10221 gcc_assert (GET_CODE (XEXP (tmp, 0)) == REG);
a3170dc6
AH
10222
10223 x = INTVAL (XEXP (tmp, 1));
10224 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
10225 break;
10226 }
10227
10228 /* Fall through. Must be [reg+reg]. */
10229 }
850e8d3d
DN
10230 if (TARGET_ALTIVEC
10231 && GET_CODE (tmp) == AND
10232 && GET_CODE (XEXP (tmp, 1)) == CONST_INT
10233 && INTVAL (XEXP (tmp, 1)) == -16)
10234 tmp = XEXP (tmp, 0);
0ac081f6 10235 if (GET_CODE (tmp) == REG)
c62f2db5 10236 fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
37409796 10237 else
0ac081f6 10238 {
37409796
NS
10239 gcc_assert (GET_CODE (tmp) == PLUS
10240 && GET_CODE (XEXP (tmp, 1)) == REG);
10241
0ac081f6
AH
10242 if (REGNO (XEXP (tmp, 0)) == 0)
10243 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
10244 reg_names[ REGNO (XEXP (tmp, 0)) ]);
10245 else
10246 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
10247 reg_names[ REGNO (XEXP (tmp, 1)) ]);
10248 }
0ac081f6
AH
10249 break;
10250 }
f676971a 10251
9878760c
RK
10252 case 0:
10253 if (GET_CODE (x) == REG)
10254 fprintf (file, "%s", reg_names[REGNO (x)]);
10255 else if (GET_CODE (x) == MEM)
10256 {
10257 /* We need to handle PRE_INC and PRE_DEC here, since we need to
10258 know the width from the mode. */
10259 if (GET_CODE (XEXP (x, 0)) == PRE_INC)
79ba6d34
MM
10260 fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
10261 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
9878760c 10262 else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
79ba6d34
MM
10263 fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
10264 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
9878760c 10265 else
a54d04b7 10266 output_address (XEXP (x, 0));
9878760c
RK
10267 }
10268 else
a54d04b7 10269 output_addr_const (file, x);
a85d226b 10270 return;
9878760c 10271
c4501e62
JJ
10272 case '&':
10273 assemble_name (file, rs6000_get_some_local_dynamic_name ());
10274 return;
10275
9878760c
RK
10276 default:
10277 output_operand_lossage ("invalid %%xn code");
10278 }
10279}
10280\f
10281/* Print the address of an operand. */
10282
10283void
a2369ed3 10284print_operand_address (FILE *file, rtx x)
9878760c
RK
10285{
10286 if (GET_CODE (x) == REG)
4697a36c 10287 fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
9ebbca7d
GK
10288 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
10289 || GET_CODE (x) == LABEL_REF)
9878760c
RK
10290 {
10291 output_addr_const (file, x);
ba5e43aa 10292 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
10293 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10294 reg_names[SMALL_DATA_REG]);
37409796
NS
10295 else
10296 gcc_assert (!TARGET_TOC);
9878760c
RK
10297 }
10298 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
10299 {
10300 if (REGNO (XEXP (x, 0)) == 0)
4697a36c
MM
10301 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
10302 reg_names[ REGNO (XEXP (x, 0)) ]);
9878760c 10303 else
4697a36c
MM
10304 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
10305 reg_names[ REGNO (XEXP (x, 1)) ]);
9878760c
RK
10306 }
10307 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
4a0a75dd
KG
10308 fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
10309 INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
3cb999d8
DE
10310#if TARGET_ELF
10311 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
c4ad648e 10312 && CONSTANT_P (XEXP (x, 1)))
4697a36c
MM
10313 {
10314 output_addr_const (file, XEXP (x, 1));
10315 fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
10316 }
c859cda6
DJ
10317#endif
10318#if TARGET_MACHO
10319 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
c4ad648e 10320 && CONSTANT_P (XEXP (x, 1)))
c859cda6
DJ
10321 {
10322 fprintf (file, "lo16(");
10323 output_addr_const (file, XEXP (x, 1));
10324 fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
10325 }
3cb999d8 10326#endif
4d588c14 10327 else if (legitimate_constant_pool_address_p (x))
9ebbca7d 10328 {
2bfcf297 10329 if (TARGET_AIX && (!TARGET_ELF || !TARGET_MINIMAL_TOC))
9ebbca7d 10330 {
2bfcf297
DB
10331 rtx contains_minus = XEXP (x, 1);
10332 rtx minus, symref;
10333 const char *name;
f676971a 10334
9ebbca7d 10335 /* Find the (minus (sym) (toc)) buried in X, and temporarily
a4f6c312 10336 turn it into (sym) for output_addr_const. */
9ebbca7d
GK
10337 while (GET_CODE (XEXP (contains_minus, 0)) != MINUS)
10338 contains_minus = XEXP (contains_minus, 0);
10339
2bfcf297
DB
10340 minus = XEXP (contains_minus, 0);
10341 symref = XEXP (minus, 0);
10342 XEXP (contains_minus, 0) = symref;
10343 if (TARGET_ELF)
10344 {
10345 char *newname;
10346
10347 name = XSTR (symref, 0);
10348 newname = alloca (strlen (name) + sizeof ("@toc"));
10349 strcpy (newname, name);
10350 strcat (newname, "@toc");
10351 XSTR (symref, 0) = newname;
10352 }
10353 output_addr_const (file, XEXP (x, 1));
10354 if (TARGET_ELF)
10355 XSTR (symref, 0) = name;
9ebbca7d
GK
10356 XEXP (contains_minus, 0) = minus;
10357 }
10358 else
10359 output_addr_const (file, XEXP (x, 1));
10360
10361 fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
10362 }
9878760c 10363 else
37409796 10364 gcc_unreachable ();
9878760c
RK
10365}
10366\f
88cad84b 10367/* Target hook for assembling integer objects. The PowerPC version has
301d03af
RS
10368 to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
10369 is defined. It also needs to handle DI-mode objects on 64-bit
10370 targets. */
10371
10372static bool
a2369ed3 10373rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
301d03af 10374{
f4f4921e 10375#ifdef RELOCATABLE_NEEDS_FIXUP
301d03af 10376 /* Special handling for SI values. */
84dcde01 10377 if (RELOCATABLE_NEEDS_FIXUP && size == 4 && aligned_p)
301d03af 10378 {
a2369ed3 10379 extern int in_toc_section (void);
301d03af 10380 static int recurse = 0;
f676971a 10381
301d03af
RS
10382 /* For -mrelocatable, we mark all addresses that need to be fixed up
10383 in the .fixup section. */
10384 if (TARGET_RELOCATABLE
10385 && !in_toc_section ()
10386 && !in_text_section ()
642af3be 10387 && !in_unlikely_text_section ()
301d03af
RS
10388 && !recurse
10389 && GET_CODE (x) != CONST_INT
10390 && GET_CODE (x) != CONST_DOUBLE
10391 && CONSTANT_P (x))
10392 {
10393 char buf[256];
10394
10395 recurse = 1;
10396 ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
10397 fixuplabelno++;
10398 ASM_OUTPUT_LABEL (asm_out_file, buf);
10399 fprintf (asm_out_file, "\t.long\t(");
10400 output_addr_const (asm_out_file, x);
10401 fprintf (asm_out_file, ")@fixup\n");
10402 fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
10403 ASM_OUTPUT_ALIGN (asm_out_file, 2);
10404 fprintf (asm_out_file, "\t.long\t");
10405 assemble_name (asm_out_file, buf);
10406 fprintf (asm_out_file, "\n\t.previous\n");
10407 recurse = 0;
10408 return true;
10409 }
10410 /* Remove initial .'s to turn a -mcall-aixdesc function
10411 address into the address of the descriptor, not the function
10412 itself. */
10413 else if (GET_CODE (x) == SYMBOL_REF
10414 && XSTR (x, 0)[0] == '.'
10415 && DEFAULT_ABI == ABI_AIX)
10416 {
10417 const char *name = XSTR (x, 0);
10418 while (*name == '.')
10419 name++;
10420
10421 fprintf (asm_out_file, "\t.long\t%s\n", name);
10422 return true;
10423 }
10424 }
f4f4921e 10425#endif /* RELOCATABLE_NEEDS_FIXUP */
301d03af
RS
10426 return default_assemble_integer (x, size, aligned_p);
10427}
93638d7a
AM
10428
10429#ifdef HAVE_GAS_HIDDEN
10430/* Emit an assembler directive to set symbol visibility for DECL to
10431 VISIBILITY_TYPE. */
10432
5add3202 10433static void
a2369ed3 10434rs6000_assemble_visibility (tree decl, int vis)
93638d7a 10435{
93638d7a
AM
10436 /* Functions need to have their entry point symbol visibility set as
10437 well as their descriptor symbol visibility. */
85b776df
AM
10438 if (DEFAULT_ABI == ABI_AIX
10439 && DOT_SYMBOLS
10440 && TREE_CODE (decl) == FUNCTION_DECL)
93638d7a 10441 {
25fdb4dc 10442 static const char * const visibility_types[] = {
c4ad648e 10443 NULL, "internal", "hidden", "protected"
25fdb4dc
RH
10444 };
10445
10446 const char *name, *type;
93638d7a
AM
10447
10448 name = ((* targetm.strip_name_encoding)
10449 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
25fdb4dc 10450 type = visibility_types[vis];
93638d7a 10451
25fdb4dc
RH
10452 fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
10453 fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
93638d7a 10454 }
25fdb4dc
RH
10455 else
10456 default_assemble_visibility (decl, vis);
93638d7a
AM
10457}
10458#endif
301d03af 10459\f
39a10a29 10460enum rtx_code
a2369ed3 10461rs6000_reverse_condition (enum machine_mode mode, enum rtx_code code)
39a10a29
GK
10462{
10463 /* Reversal of FP compares takes care -- an ordered compare
10464 becomes an unordered compare and vice versa. */
f676971a 10465 if (mode == CCFPmode
bc9ec0e0
GK
10466 && (!flag_finite_math_only
10467 || code == UNLT || code == UNLE || code == UNGT || code == UNGE
10468 || code == UNEQ || code == LTGT))
bab6226b 10469 return reverse_condition_maybe_unordered (code);
39a10a29 10470 else
bab6226b 10471 return reverse_condition (code);
39a10a29
GK
10472}
10473
39a10a29
GK
10474/* Generate a compare for CODE. Return a brand-new rtx that
10475 represents the result of the compare. */
a4f6c312 10476
39a10a29 10477static rtx
a2369ed3 10478rs6000_generate_compare (enum rtx_code code)
39a10a29
GK
10479{
10480 enum machine_mode comp_mode;
10481 rtx compare_result;
10482
10483 if (rs6000_compare_fp_p)
10484 comp_mode = CCFPmode;
10485 else if (code == GTU || code == LTU
c4ad648e 10486 || code == GEU || code == LEU)
39a10a29 10487 comp_mode = CCUNSmode;
60934f9c
NS
10488 else if ((code == EQ || code == NE)
10489 && GET_CODE (rs6000_compare_op0) == SUBREG
10490 && GET_CODE (rs6000_compare_op1) == SUBREG
10491 && SUBREG_PROMOTED_UNSIGNED_P (rs6000_compare_op0)
10492 && SUBREG_PROMOTED_UNSIGNED_P (rs6000_compare_op1))
10493 /* These are unsigned values, perhaps there will be a later
10494 ordering compare that can be shared with this one.
10495 Unfortunately we cannot detect the signedness of the operands
10496 for non-subregs. */
10497 comp_mode = CCUNSmode;
39a10a29
GK
10498 else
10499 comp_mode = CCmode;
10500
10501 /* First, the compare. */
10502 compare_result = gen_reg_rtx (comp_mode);
a3170dc6
AH
10503
10504 /* SPE FP compare instructions on the GPRs. Yuck! */
993f19a8
AH
10505 if ((TARGET_E500 && !TARGET_FPRS && TARGET_HARD_FLOAT)
10506 && rs6000_compare_fp_p)
a3170dc6 10507 {
64022b5d 10508 rtx cmp, or_result, compare_result2;
4d4cbc0e
AH
10509 enum machine_mode op_mode = GET_MODE (rs6000_compare_op0);
10510
10511 if (op_mode == VOIDmode)
10512 op_mode = GET_MODE (rs6000_compare_op1);
a3170dc6 10513
423c1189
AH
10514 /* Note: The E500 comparison instructions set the GT bit (x +
10515 1), on success. This explains the mess. */
10516
a3170dc6
AH
10517 switch (code)
10518 {
423c1189 10519 case EQ: case UNEQ: case NE: case LTGT:
37409796
NS
10520 switch (op_mode)
10521 {
10522 case SFmode:
10523 cmp = flag_unsafe_math_optimizations
10524 ? gen_tstsfeq_gpr (compare_result, rs6000_compare_op0,
10525 rs6000_compare_op1)
10526 : gen_cmpsfeq_gpr (compare_result, rs6000_compare_op0,
10527 rs6000_compare_op1);
10528 break;
10529
10530 case DFmode:
10531 cmp = flag_unsafe_math_optimizations
10532 ? gen_tstdfeq_gpr (compare_result, rs6000_compare_op0,
10533 rs6000_compare_op1)
10534 : gen_cmpdfeq_gpr (compare_result, rs6000_compare_op0,
10535 rs6000_compare_op1);
10536 break;
10537
10538 default:
10539 gcc_unreachable ();
10540 }
a3170dc6 10541 break;
37409796 10542
423c1189 10543 case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
37409796
NS
10544 switch (op_mode)
10545 {
10546 case SFmode:
10547 cmp = flag_unsafe_math_optimizations
10548 ? gen_tstsfgt_gpr (compare_result, rs6000_compare_op0,
10549 rs6000_compare_op1)
10550 : gen_cmpsfgt_gpr (compare_result, rs6000_compare_op0,
10551 rs6000_compare_op1);
10552 break;
10553
10554 case DFmode:
10555 cmp = flag_unsafe_math_optimizations
10556 ? gen_tstdfgt_gpr (compare_result, rs6000_compare_op0,
10557 rs6000_compare_op1)
10558 : gen_cmpdfgt_gpr (compare_result, rs6000_compare_op0,
10559 rs6000_compare_op1);
10560 break;
10561
10562 default:
10563 gcc_unreachable ();
10564 }
a3170dc6 10565 break;
37409796 10566
423c1189 10567 case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
37409796
NS
10568 switch (op_mode)
10569 {
10570 case SFmode:
10571 cmp = flag_unsafe_math_optimizations
10572 ? gen_tstsflt_gpr (compare_result, rs6000_compare_op0,
10573 rs6000_compare_op1)
10574 : gen_cmpsflt_gpr (compare_result, rs6000_compare_op0,
10575 rs6000_compare_op1);
10576 break;
10577
10578 case DFmode:
10579 cmp = flag_unsafe_math_optimizations
10580 ? gen_tstdflt_gpr (compare_result, rs6000_compare_op0,
10581 rs6000_compare_op1)
10582 : gen_cmpdflt_gpr (compare_result, rs6000_compare_op0,
10583 rs6000_compare_op1);
10584 break;
10585
10586 default:
10587 gcc_unreachable ();
10588 }
a3170dc6 10589 break;
4d4cbc0e 10590 default:
37409796 10591 gcc_unreachable ();
a3170dc6
AH
10592 }
10593
10594 /* Synthesize LE and GE from LT/GT || EQ. */
10595 if (code == LE || code == GE || code == LEU || code == GEU)
10596 {
a3170dc6
AH
10597 emit_insn (cmp);
10598
10599 switch (code)
10600 {
10601 case LE: code = LT; break;
10602 case GE: code = GT; break;
10603 case LEU: code = LT; break;
10604 case GEU: code = GT; break;
37409796 10605 default: gcc_unreachable ();
a3170dc6
AH
10606 }
10607
a3170dc6
AH
10608 compare_result2 = gen_reg_rtx (CCFPmode);
10609
10610 /* Do the EQ. */
37409796
NS
10611 switch (op_mode)
10612 {
10613 case SFmode:
10614 cmp = flag_unsafe_math_optimizations
10615 ? gen_tstsfeq_gpr (compare_result2, rs6000_compare_op0,
10616 rs6000_compare_op1)
10617 : gen_cmpsfeq_gpr (compare_result2, rs6000_compare_op0,
10618 rs6000_compare_op1);
10619 break;
10620
10621 case DFmode:
10622 cmp = flag_unsafe_math_optimizations
10623 ? gen_tstdfeq_gpr (compare_result2, rs6000_compare_op0,
10624 rs6000_compare_op1)
10625 : gen_cmpdfeq_gpr (compare_result2, rs6000_compare_op0,
10626 rs6000_compare_op1);
10627 break;
10628
10629 default:
10630 gcc_unreachable ();
10631 }
a3170dc6
AH
10632 emit_insn (cmp);
10633
a3170dc6 10634 /* OR them together. */
64022b5d
AH
10635 or_result = gen_reg_rtx (CCFPmode);
10636 cmp = gen_e500_cr_ior_compare (or_result, compare_result,
10637 compare_result2);
a3170dc6
AH
10638 compare_result = or_result;
10639 code = EQ;
10640 }
10641 else
10642 {
a3170dc6 10643 if (code == NE || code == LTGT)
a3170dc6 10644 code = NE;
423c1189
AH
10645 else
10646 code = EQ;
a3170dc6
AH
10647 }
10648
10649 emit_insn (cmp);
10650 }
10651 else
de17c25f
DE
10652 {
10653 /* Generate XLC-compatible TFmode compare as PARALLEL with extra
10654 CLOBBERs to match cmptf_internal2 pattern. */
10655 if (comp_mode == CCFPmode && TARGET_XL_COMPAT
10656 && GET_MODE (rs6000_compare_op0) == TFmode
10657 && (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
10658 && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128)
10659 emit_insn (gen_rtx_PARALLEL (VOIDmode,
10660 gen_rtvec (9,
10661 gen_rtx_SET (VOIDmode,
10662 compare_result,
10663 gen_rtx_COMPARE (comp_mode,
10664 rs6000_compare_op0,
10665 rs6000_compare_op1)),
10666 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10667 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10668 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10669 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10670 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10671 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10672 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
10673 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)))));
3aebbe5f
JJ
10674 else if (GET_CODE (rs6000_compare_op1) == UNSPEC
10675 && XINT (rs6000_compare_op1, 1) == UNSPEC_SP_TEST)
10676 {
10677 rtx op1 = XVECEXP (rs6000_compare_op1, 0, 0);
10678 comp_mode = CCEQmode;
10679 compare_result = gen_reg_rtx (CCEQmode);
10680 if (TARGET_64BIT)
10681 emit_insn (gen_stack_protect_testdi (compare_result,
10682 rs6000_compare_op0, op1));
10683 else
10684 emit_insn (gen_stack_protect_testsi (compare_result,
10685 rs6000_compare_op0, op1));
10686 }
de17c25f
DE
10687 else
10688 emit_insn (gen_rtx_SET (VOIDmode, compare_result,
10689 gen_rtx_COMPARE (comp_mode,
10690 rs6000_compare_op0,
10691 rs6000_compare_op1)));
10692 }
f676971a 10693
ca5adc63 10694 /* Some kinds of FP comparisons need an OR operation;
e7108df9 10695 under flag_finite_math_only we don't bother. */
39a10a29 10696 if (rs6000_compare_fp_p
e7108df9
DE
10697 && !flag_finite_math_only
10698 && !(TARGET_HARD_FLOAT && TARGET_E500 && !TARGET_FPRS)
39a10a29
GK
10699 && (code == LE || code == GE
10700 || code == UNEQ || code == LTGT
10701 || code == UNGT || code == UNLT))
10702 {
10703 enum rtx_code or1, or2;
10704 rtx or1_rtx, or2_rtx, compare2_rtx;
10705 rtx or_result = gen_reg_rtx (CCEQmode);
f676971a 10706
39a10a29
GK
10707 switch (code)
10708 {
10709 case LE: or1 = LT; or2 = EQ; break;
10710 case GE: or1 = GT; or2 = EQ; break;
10711 case UNEQ: or1 = UNORDERED; or2 = EQ; break;
10712 case LTGT: or1 = LT; or2 = GT; break;
10713 case UNGT: or1 = UNORDERED; or2 = GT; break;
10714 case UNLT: or1 = UNORDERED; or2 = LT; break;
37409796 10715 default: gcc_unreachable ();
39a10a29
GK
10716 }
10717 validate_condition_mode (or1, comp_mode);
10718 validate_condition_mode (or2, comp_mode);
1c563bed
KH
10719 or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
10720 or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
39a10a29
GK
10721 compare2_rtx = gen_rtx_COMPARE (CCEQmode,
10722 gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
10723 const_true_rtx);
10724 emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
10725
10726 compare_result = or_result;
10727 code = EQ;
10728 }
10729
10730 validate_condition_mode (code, GET_MODE (compare_result));
f676971a 10731
1c563bed 10732 return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
39a10a29
GK
10733}
10734
10735
10736/* Emit the RTL for an sCOND pattern. */
10737
10738void
a2369ed3 10739rs6000_emit_sCOND (enum rtx_code code, rtx result)
39a10a29
GK
10740{
10741 rtx condition_rtx;
10742 enum machine_mode op_mode;
b7053a3f 10743 enum rtx_code cond_code;
39a10a29
GK
10744
10745 condition_rtx = rs6000_generate_compare (code);
b7053a3f
GK
10746 cond_code = GET_CODE (condition_rtx);
10747
423c1189
AH
10748 if (TARGET_E500 && rs6000_compare_fp_p
10749 && !TARGET_FPRS && TARGET_HARD_FLOAT)
10750 {
10751 rtx t;
10752
10753 PUT_MODE (condition_rtx, SImode);
10754 t = XEXP (condition_rtx, 0);
10755
37409796 10756 gcc_assert (cond_code == NE || cond_code == EQ);
423c1189
AH
10757
10758 if (cond_code == NE)
64022b5d 10759 emit_insn (gen_e500_flip_gt_bit (t, t));
423c1189 10760
64022b5d 10761 emit_insn (gen_move_from_CR_gt_bit (result, t));
423c1189
AH
10762 return;
10763 }
10764
b7053a3f
GK
10765 if (cond_code == NE
10766 || cond_code == GE || cond_code == LE
10767 || cond_code == GEU || cond_code == LEU
10768 || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
10769 {
10770 rtx not_result = gen_reg_rtx (CCEQmode);
10771 rtx not_op, rev_cond_rtx;
10772 enum machine_mode cc_mode;
f676971a 10773
b7053a3f
GK
10774 cc_mode = GET_MODE (XEXP (condition_rtx, 0));
10775
1c563bed 10776 rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
0f4c242b 10777 SImode, XEXP (condition_rtx, 0), const0_rtx);
b7053a3f
GK
10778 not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
10779 emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
10780 condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
10781 }
39a10a29
GK
10782
10783 op_mode = GET_MODE (rs6000_compare_op0);
10784 if (op_mode == VOIDmode)
10785 op_mode = GET_MODE (rs6000_compare_op1);
10786
10787 if (TARGET_POWERPC64 && (op_mode == DImode || rs6000_compare_fp_p))
10788 {
10789 PUT_MODE (condition_rtx, DImode);
10790 convert_move (result, condition_rtx, 0);
10791 }
10792 else
10793 {
10794 PUT_MODE (condition_rtx, SImode);
10795 emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
10796 }
10797}
10798
39a10a29
GK
10799/* Emit a branch of kind CODE to location LOC. */
10800
10801void
a2369ed3 10802rs6000_emit_cbranch (enum rtx_code code, rtx loc)
39a10a29
GK
10803{
10804 rtx condition_rtx, loc_ref;
10805
10806 condition_rtx = rs6000_generate_compare (code);
10807 loc_ref = gen_rtx_LABEL_REF (VOIDmode, loc);
10808 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
10809 gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
10810 loc_ref, pc_rtx)));
10811}
10812
12a4e8c5
GK
10813/* Return the string to output a conditional branch to LABEL, which is
10814 the operand number of the label, or -1 if the branch is really a
f676971a 10815 conditional return.
12a4e8c5
GK
10816
10817 OP is the conditional expression. XEXP (OP, 0) is assumed to be a
10818 condition code register and its mode specifies what kind of
10819 comparison we made.
10820
a0ab749a 10821 REVERSED is nonzero if we should reverse the sense of the comparison.
12a4e8c5
GK
10822
10823 INSN is the insn. */
10824
10825char *
a2369ed3 10826output_cbranch (rtx op, const char *label, int reversed, rtx insn)
12a4e8c5
GK
10827{
10828 static char string[64];
10829 enum rtx_code code = GET_CODE (op);
10830 rtx cc_reg = XEXP (op, 0);
10831 enum machine_mode mode = GET_MODE (cc_reg);
10832 int cc_regno = REGNO (cc_reg) - CR0_REGNO;
39a10a29 10833 int need_longbranch = label != NULL && get_attr_length (insn) == 8;
12a4e8c5
GK
10834 int really_reversed = reversed ^ need_longbranch;
10835 char *s = string;
10836 const char *ccode;
10837 const char *pred;
10838 rtx note;
10839
39a10a29
GK
10840 validate_condition_mode (code, mode);
10841
10842 /* Work out which way this really branches. We could use
10843 reverse_condition_maybe_unordered here always but this
10844 makes the resulting assembler clearer. */
12a4e8c5 10845 if (really_reversed)
de40e1df
DJ
10846 {
10847 /* Reversal of FP compares takes care -- an ordered compare
10848 becomes an unordered compare and vice versa. */
10849 if (mode == CCFPmode)
10850 code = reverse_condition_maybe_unordered (code);
10851 else
10852 code = reverse_condition (code);
10853 }
12a4e8c5 10854
993f19a8 10855 if ((TARGET_E500 && !TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
a3170dc6
AH
10856 {
10857 /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
10858 to the GT bit. */
37409796
NS
10859 switch (code)
10860 {
10861 case EQ:
10862 /* Opposite of GT. */
10863 code = GT;
10864 break;
10865
10866 case NE:
10867 code = UNLE;
10868 break;
10869
10870 default:
10871 gcc_unreachable ();
10872 }
a3170dc6
AH
10873 }
10874
39a10a29 10875 switch (code)
12a4e8c5
GK
10876 {
10877 /* Not all of these are actually distinct opcodes, but
10878 we distinguish them for clarity of the resulting assembler. */
50a0b056
GK
10879 case NE: case LTGT:
10880 ccode = "ne"; break;
10881 case EQ: case UNEQ:
10882 ccode = "eq"; break;
f676971a 10883 case GE: case GEU:
50a0b056 10884 ccode = "ge"; break;
f676971a 10885 case GT: case GTU: case UNGT:
50a0b056 10886 ccode = "gt"; break;
f676971a 10887 case LE: case LEU:
50a0b056 10888 ccode = "le"; break;
f676971a 10889 case LT: case LTU: case UNLT:
50a0b056 10890 ccode = "lt"; break;
12a4e8c5
GK
10891 case UNORDERED: ccode = "un"; break;
10892 case ORDERED: ccode = "nu"; break;
10893 case UNGE: ccode = "nl"; break;
10894 case UNLE: ccode = "ng"; break;
10895 default:
37409796 10896 gcc_unreachable ();
12a4e8c5 10897 }
f676971a
EC
10898
10899 /* Maybe we have a guess as to how likely the branch is.
94a54f47 10900 The old mnemonics don't have a way to specify this information. */
f4857b9b 10901 pred = "";
12a4e8c5
GK
10902 note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
10903 if (note != NULL_RTX)
10904 {
10905 /* PROB is the difference from 50%. */
10906 int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
f4857b9b
AM
10907
10908 /* Only hint for highly probable/improbable branches on newer
10909 cpus as static prediction overrides processor dynamic
10910 prediction. For older cpus we may as well always hint, but
10911 assume not taken for branches that are very close to 50% as a
10912 mispredicted taken branch is more expensive than a
f676971a 10913 mispredicted not-taken branch. */
ec507f2d 10914 if (rs6000_always_hint
f4857b9b
AM
10915 || abs (prob) > REG_BR_PROB_BASE / 100 * 48)
10916 {
10917 if (abs (prob) > REG_BR_PROB_BASE / 20
10918 && ((prob > 0) ^ need_longbranch))
c4ad648e 10919 pred = "+";
f4857b9b
AM
10920 else
10921 pred = "-";
10922 }
12a4e8c5 10923 }
12a4e8c5
GK
10924
10925 if (label == NULL)
94a54f47 10926 s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
12a4e8c5 10927 else
94a54f47 10928 s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
12a4e8c5 10929
37c67319 10930 /* We need to escape any '%' characters in the reg_names string.
a3c9585f 10931 Assume they'd only be the first character.... */
37c67319
GK
10932 if (reg_names[cc_regno + CR0_REGNO][0] == '%')
10933 *s++ = '%';
94a54f47 10934 s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
12a4e8c5
GK
10935
10936 if (label != NULL)
10937 {
10938 /* If the branch distance was too far, we may have to use an
10939 unconditional branch to go the distance. */
10940 if (need_longbranch)
44518ddd 10941 s += sprintf (s, ",$+8\n\tb %s", label);
12a4e8c5
GK
10942 else
10943 s += sprintf (s, ",%s", label);
10944 }
10945
10946 return string;
10947}
50a0b056 10948
64022b5d 10949/* Return the string to flip the GT bit on a CR. */
423c1189 10950char *
64022b5d 10951output_e500_flip_gt_bit (rtx dst, rtx src)
423c1189
AH
10952{
10953 static char string[64];
10954 int a, b;
10955
37409796
NS
10956 gcc_assert (GET_CODE (dst) == REG && CR_REGNO_P (REGNO (dst))
10957 && GET_CODE (src) == REG && CR_REGNO_P (REGNO (src)));
423c1189 10958
64022b5d
AH
10959 /* GT bit. */
10960 a = 4 * (REGNO (dst) - CR0_REGNO) + 1;
10961 b = 4 * (REGNO (src) - CR0_REGNO) + 1;
423c1189
AH
10962
10963 sprintf (string, "crnot %d,%d", a, b);
10964 return string;
10965}
10966
21213b4c
DP
10967/* Return insn index for the vector compare instruction for given CODE,
10968 and DEST_MODE, OP_MODE. Return INSN_NOT_AVAILABLE if valid insn is
10969 not available. */
10970
10971static int
94ff898d 10972get_vec_cmp_insn (enum rtx_code code,
21213b4c
DP
10973 enum machine_mode dest_mode,
10974 enum machine_mode op_mode)
10975{
10976 if (!TARGET_ALTIVEC)
10977 return INSN_NOT_AVAILABLE;
10978
10979 switch (code)
10980 {
10981 case EQ:
10982 if (dest_mode == V16QImode && op_mode == V16QImode)
10983 return UNSPEC_VCMPEQUB;
10984 if (dest_mode == V8HImode && op_mode == V8HImode)
10985 return UNSPEC_VCMPEQUH;
10986 if (dest_mode == V4SImode && op_mode == V4SImode)
10987 return UNSPEC_VCMPEQUW;
10988 if (dest_mode == V4SImode && op_mode == V4SFmode)
10989 return UNSPEC_VCMPEQFP;
10990 break;
10991 case GE:
10992 if (dest_mode == V4SImode && op_mode == V4SFmode)
10993 return UNSPEC_VCMPGEFP;
10994 case GT:
10995 if (dest_mode == V16QImode && op_mode == V16QImode)
10996 return UNSPEC_VCMPGTSB;
10997 if (dest_mode == V8HImode && op_mode == V8HImode)
10998 return UNSPEC_VCMPGTSH;
10999 if (dest_mode == V4SImode && op_mode == V4SImode)
11000 return UNSPEC_VCMPGTSW;
11001 if (dest_mode == V4SImode && op_mode == V4SFmode)
11002 return UNSPEC_VCMPGTFP;
11003 break;
11004 case GTU:
11005 if (dest_mode == V16QImode && op_mode == V16QImode)
11006 return UNSPEC_VCMPGTUB;
11007 if (dest_mode == V8HImode && op_mode == V8HImode)
11008 return UNSPEC_VCMPGTUH;
11009 if (dest_mode == V4SImode && op_mode == V4SImode)
11010 return UNSPEC_VCMPGTUW;
11011 break;
11012 default:
11013 break;
11014 }
11015 return INSN_NOT_AVAILABLE;
11016}
11017
11018/* Emit vector compare for operands OP0 and OP1 using code RCODE.
11019 DMODE is expected destination mode. This is a recursive function. */
11020
11021static rtx
11022rs6000_emit_vector_compare (enum rtx_code rcode,
11023 rtx op0, rtx op1,
11024 enum machine_mode dmode)
11025{
11026 int vec_cmp_insn;
11027 rtx mask;
11028 enum machine_mode dest_mode;
11029 enum machine_mode op_mode = GET_MODE (op1);
11030
37409796
NS
11031 gcc_assert (TARGET_ALTIVEC);
11032 gcc_assert (GET_MODE (op0) == GET_MODE (op1));
21213b4c
DP
11033
11034 /* Floating point vector compare instructions uses destination V4SImode.
11035 Move destination to appropriate mode later. */
11036 if (dmode == V4SFmode)
11037 dest_mode = V4SImode;
11038 else
11039 dest_mode = dmode;
11040
11041 mask = gen_reg_rtx (dest_mode);
11042 vec_cmp_insn = get_vec_cmp_insn (rcode, dest_mode, op_mode);
11043
11044 if (vec_cmp_insn == INSN_NOT_AVAILABLE)
11045 {
11046 bool swap_operands = false;
11047 bool try_again = false;
11048 switch (rcode)
11049 {
11050 case LT:
11051 rcode = GT;
11052 swap_operands = true;
11053 try_again = true;
11054 break;
11055 case LTU:
11056 rcode = GTU;
11057 swap_operands = true;
11058 try_again = true;
11059 break;
11060 case NE:
11061 /* Treat A != B as ~(A==B). */
11062 {
11063 enum insn_code nor_code;
11064 rtx eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1,
11065 dest_mode);
94ff898d 11066
21213b4c 11067 nor_code = one_cmpl_optab->handlers[(int)dest_mode].insn_code;
37409796 11068 gcc_assert (nor_code != CODE_FOR_nothing);
21213b4c
DP
11069 emit_insn (GEN_FCN (nor_code) (mask, eq_rtx));
11070
11071 if (dmode != dest_mode)
11072 {
11073 rtx temp = gen_reg_rtx (dest_mode);
11074 convert_move (temp, mask, 0);
11075 return temp;
11076 }
11077 return mask;
11078 }
11079 break;
11080 case GE:
11081 case GEU:
11082 case LE:
11083 case LEU:
11084 /* Try GT/GTU/LT/LTU OR EQ */
11085 {
11086 rtx c_rtx, eq_rtx;
11087 enum insn_code ior_code;
11088 enum rtx_code new_code;
11089
37409796
NS
11090 switch (rcode)
11091 {
11092 case GE:
11093 new_code = GT;
11094 break;
11095
11096 case GEU:
11097 new_code = GTU;
11098 break;
11099
11100 case LE:
11101 new_code = LT;
11102 break;
11103
11104 case LEU:
11105 new_code = LTU;
11106 break;
11107
11108 default:
11109 gcc_unreachable ();
11110 }
21213b4c
DP
11111
11112 c_rtx = rs6000_emit_vector_compare (new_code,
11113 op0, op1, dest_mode);
11114 eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1,
11115 dest_mode);
11116
11117 ior_code = ior_optab->handlers[(int)dest_mode].insn_code;
37409796 11118 gcc_assert (ior_code != CODE_FOR_nothing);
21213b4c
DP
11119 emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx));
11120 if (dmode != dest_mode)
11121 {
11122 rtx temp = gen_reg_rtx (dest_mode);
11123 convert_move (temp, mask, 0);
11124 return temp;
11125 }
11126 return mask;
11127 }
11128 break;
11129 default:
37409796 11130 gcc_unreachable ();
21213b4c
DP
11131 }
11132
11133 if (try_again)
11134 {
11135 vec_cmp_insn = get_vec_cmp_insn (rcode, dest_mode, op_mode);
37409796
NS
11136 /* You only get two chances. */
11137 gcc_assert (vec_cmp_insn != INSN_NOT_AVAILABLE);
21213b4c
DP
11138 }
11139
11140 if (swap_operands)
11141 {
11142 rtx tmp;
11143 tmp = op0;
11144 op0 = op1;
11145 op1 = tmp;
11146 }
11147 }
11148
915167f5
GK
11149 emit_insn (gen_rtx_SET (VOIDmode, mask,
11150 gen_rtx_UNSPEC (dest_mode,
11151 gen_rtvec (2, op0, op1),
11152 vec_cmp_insn)));
21213b4c
DP
11153 if (dmode != dest_mode)
11154 {
11155 rtx temp = gen_reg_rtx (dest_mode);
11156 convert_move (temp, mask, 0);
11157 return temp;
11158 }
11159 return mask;
11160}
11161
11162/* Return vector select instruction for MODE. Return INSN_NOT_AVAILABLE, if
11163 valid insn doesn exist for given mode. */
11164
11165static int
11166get_vsel_insn (enum machine_mode mode)
11167{
11168 switch (mode)
11169 {
11170 case V4SImode:
11171 return UNSPEC_VSEL4SI;
11172 break;
11173 case V4SFmode:
11174 return UNSPEC_VSEL4SF;
11175 break;
11176 case V8HImode:
11177 return UNSPEC_VSEL8HI;
11178 break;
11179 case V16QImode:
11180 return UNSPEC_VSEL16QI;
11181 break;
11182 default:
11183 return INSN_NOT_AVAILABLE;
11184 break;
11185 }
11186 return INSN_NOT_AVAILABLE;
11187}
11188
11189/* Emit vector select insn where DEST is destination using
11190 operands OP1, OP2 and MASK. */
11191
11192static void
11193rs6000_emit_vector_select (rtx dest, rtx op1, rtx op2, rtx mask)
11194{
11195 rtx t, temp;
11196 enum machine_mode dest_mode = GET_MODE (dest);
11197 int vsel_insn_index = get_vsel_insn (GET_MODE (dest));
11198
11199 temp = gen_reg_rtx (dest_mode);
94ff898d 11200
19f1ebc7
DP
11201 /* For each vector element, select op1 when mask is 1 otherwise
11202 select op2. */
915167f5
GK
11203 t = gen_rtx_SET (VOIDmode, temp,
11204 gen_rtx_UNSPEC (dest_mode,
11205 gen_rtvec (3, op2, op1, mask),
11206 vsel_insn_index));
21213b4c
DP
11207 emit_insn (t);
11208 emit_move_insn (dest, temp);
11209 return;
11210}
11211
94ff898d 11212/* Emit vector conditional expression.
21213b4c
DP
11213 DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands.
11214 CC_OP0 and CC_OP1 are the two operands for the relation operation COND. */
11215
11216int
11217rs6000_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2,
11218 rtx cond, rtx cc_op0, rtx cc_op1)
11219{
11220 enum machine_mode dest_mode = GET_MODE (dest);
11221 enum rtx_code rcode = GET_CODE (cond);
11222 rtx mask;
11223
11224 if (!TARGET_ALTIVEC)
11225 return 0;
11226
11227 /* Get the vector mask for the given relational operations. */
11228 mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode);
11229
11230 rs6000_emit_vector_select (dest, op1, op2, mask);
11231
11232 return 1;
11233}
11234
50a0b056
GK
11235/* Emit a conditional move: move TRUE_COND to DEST if OP of the
11236 operands of the last comparison is nonzero/true, FALSE_COND if it
11237 is zero/false. Return 0 if the hardware has no such operation. */
a4f6c312 11238
50a0b056 11239int
a2369ed3 11240rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
50a0b056
GK
11241{
11242 enum rtx_code code = GET_CODE (op);
11243 rtx op0 = rs6000_compare_op0;
11244 rtx op1 = rs6000_compare_op1;
11245 REAL_VALUE_TYPE c1;
3148ad6d
DJ
11246 enum machine_mode compare_mode = GET_MODE (op0);
11247 enum machine_mode result_mode = GET_MODE (dest);
50a0b056 11248 rtx temp;
add2402e 11249 bool is_against_zero;
50a0b056 11250
a3c9585f 11251 /* These modes should always match. */
a3170dc6
AH
11252 if (GET_MODE (op1) != compare_mode
11253 /* In the isel case however, we can use a compare immediate, so
11254 op1 may be a small constant. */
11255 && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
3148ad6d 11256 return 0;
178c3eff 11257 if (GET_MODE (true_cond) != result_mode)
3148ad6d 11258 return 0;
178c3eff 11259 if (GET_MODE (false_cond) != result_mode)
3148ad6d
DJ
11260 return 0;
11261
50a0b056 11262 /* First, work out if the hardware can do this at all, or
a3c9585f 11263 if it's too slow.... */
50a0b056 11264 if (! rs6000_compare_fp_p)
a3170dc6
AH
11265 {
11266 if (TARGET_ISEL)
11267 return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
11268 return 0;
11269 }
fef98bf2
AH
11270 else if (TARGET_E500 && TARGET_HARD_FLOAT && !TARGET_FPRS
11271 && GET_MODE_CLASS (compare_mode) == MODE_FLOAT)
11272 return 0;
50a0b056 11273
add2402e 11274 is_against_zero = op1 == CONST0_RTX (compare_mode);
94ff898d 11275
add2402e
GK
11276 /* A floating-point subtract might overflow, underflow, or produce
11277 an inexact result, thus changing the floating-point flags, so it
11278 can't be generated if we care about that. It's safe if one side
11279 of the construct is zero, since then no subtract will be
11280 generated. */
11281 if (GET_MODE_CLASS (compare_mode) == MODE_FLOAT
11282 && flag_trapping_math && ! is_against_zero)
11283 return 0;
11284
50a0b056
GK
11285 /* Eliminate half of the comparisons by switching operands, this
11286 makes the remaining code simpler. */
11287 if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
bc9ec0e0 11288 || code == LTGT || code == LT || code == UNLE)
50a0b056
GK
11289 {
11290 code = reverse_condition_maybe_unordered (code);
11291 temp = true_cond;
11292 true_cond = false_cond;
11293 false_cond = temp;
11294 }
11295
11296 /* UNEQ and LTGT take four instructions for a comparison with zero,
11297 it'll probably be faster to use a branch here too. */
bc9ec0e0 11298 if (code == UNEQ && HONOR_NANS (compare_mode))
50a0b056 11299 return 0;
f676971a 11300
50a0b056
GK
11301 if (GET_CODE (op1) == CONST_DOUBLE)
11302 REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
f676971a 11303
b6d08ca1 11304 /* We're going to try to implement comparisons by performing
50a0b056
GK
11305 a subtract, then comparing against zero. Unfortunately,
11306 Inf - Inf is NaN which is not zero, and so if we don't
27d30956 11307 know that the operand is finite and the comparison
50a0b056 11308 would treat EQ different to UNORDERED, we can't do it. */
bc9ec0e0 11309 if (HONOR_INFINITIES (compare_mode)
50a0b056 11310 && code != GT && code != UNGE
045572c7 11311 && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
50a0b056
GK
11312 /* Constructs of the form (a OP b ? a : b) are safe. */
11313 && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
f676971a 11314 || (! rtx_equal_p (op0, true_cond)
50a0b056
GK
11315 && ! rtx_equal_p (op1, true_cond))))
11316 return 0;
add2402e 11317
50a0b056
GK
11318 /* At this point we know we can use fsel. */
11319
11320 /* Reduce the comparison to a comparison against zero. */
add2402e
GK
11321 if (! is_against_zero)
11322 {
11323 temp = gen_reg_rtx (compare_mode);
11324 emit_insn (gen_rtx_SET (VOIDmode, temp,
11325 gen_rtx_MINUS (compare_mode, op0, op1)));
11326 op0 = temp;
11327 op1 = CONST0_RTX (compare_mode);
11328 }
50a0b056
GK
11329
11330 /* If we don't care about NaNs we can reduce some of the comparisons
11331 down to faster ones. */
bc9ec0e0 11332 if (! HONOR_NANS (compare_mode))
50a0b056
GK
11333 switch (code)
11334 {
11335 case GT:
11336 code = LE;
11337 temp = true_cond;
11338 true_cond = false_cond;
11339 false_cond = temp;
11340 break;
11341 case UNGE:
11342 code = GE;
11343 break;
11344 case UNEQ:
11345 code = EQ;
11346 break;
11347 default:
11348 break;
11349 }
11350
11351 /* Now, reduce everything down to a GE. */
11352 switch (code)
11353 {
11354 case GE:
11355 break;
11356
11357 case LE:
3148ad6d
DJ
11358 temp = gen_reg_rtx (compare_mode);
11359 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
11360 op0 = temp;
11361 break;
11362
11363 case ORDERED:
3148ad6d
DJ
11364 temp = gen_reg_rtx (compare_mode);
11365 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
50a0b056
GK
11366 op0 = temp;
11367 break;
11368
11369 case EQ:
3148ad6d 11370 temp = gen_reg_rtx (compare_mode);
f676971a 11371 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d
DJ
11372 gen_rtx_NEG (compare_mode,
11373 gen_rtx_ABS (compare_mode, op0))));
50a0b056
GK
11374 op0 = temp;
11375 break;
11376
11377 case UNGE:
bc9ec0e0 11378 /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
3148ad6d 11379 temp = gen_reg_rtx (result_mode);
50a0b056 11380 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 11381 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
11382 gen_rtx_GE (VOIDmode,
11383 op0, op1),
11384 true_cond, false_cond)));
bc9ec0e0
GK
11385 false_cond = true_cond;
11386 true_cond = temp;
50a0b056 11387
3148ad6d
DJ
11388 temp = gen_reg_rtx (compare_mode);
11389 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
11390 op0 = temp;
11391 break;
11392
11393 case GT:
bc9ec0e0 11394 /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
3148ad6d 11395 temp = gen_reg_rtx (result_mode);
50a0b056 11396 emit_insn (gen_rtx_SET (VOIDmode, temp,
f676971a 11397 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
11398 gen_rtx_GE (VOIDmode,
11399 op0, op1),
11400 true_cond, false_cond)));
bc9ec0e0
GK
11401 true_cond = false_cond;
11402 false_cond = temp;
50a0b056 11403
3148ad6d
DJ
11404 temp = gen_reg_rtx (compare_mode);
11405 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
11406 op0 = temp;
11407 break;
11408
11409 default:
37409796 11410 gcc_unreachable ();
50a0b056
GK
11411 }
11412
11413 emit_insn (gen_rtx_SET (VOIDmode, dest,
3148ad6d 11414 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
11415 gen_rtx_GE (VOIDmode,
11416 op0, op1),
11417 true_cond, false_cond)));
11418 return 1;
11419}
11420
a3170dc6
AH
11421/* Same as above, but for ints (isel). */
11422
11423static int
a2369ed3 11424rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
a3170dc6
AH
11425{
11426 rtx condition_rtx, cr;
11427
11428 /* All isel implementations thus far are 32-bits. */
11429 if (GET_MODE (rs6000_compare_op0) != SImode)
11430 return 0;
11431
11432 /* We still have to do the compare, because isel doesn't do a
11433 compare, it just looks at the CRx bits set by a previous compare
11434 instruction. */
11435 condition_rtx = rs6000_generate_compare (GET_CODE (op));
11436 cr = XEXP (condition_rtx, 0);
11437
11438 if (GET_MODE (cr) == CCmode)
11439 emit_insn (gen_isel_signed (dest, condition_rtx,
11440 true_cond, false_cond, cr));
11441 else
11442 emit_insn (gen_isel_unsigned (dest, condition_rtx,
11443 true_cond, false_cond, cr));
11444
11445 return 1;
11446}
11447
11448const char *
a2369ed3 11449output_isel (rtx *operands)
a3170dc6
AH
11450{
11451 enum rtx_code code;
11452
11453 code = GET_CODE (operands[1]);
11454 if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
11455 {
11456 PUT_CODE (operands[1], reverse_condition (code));
11457 return "isel %0,%3,%2,%j1";
11458 }
11459 else
11460 return "isel %0,%2,%3,%j1";
11461}
11462
50a0b056 11463void
a2369ed3 11464rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
50a0b056
GK
11465{
11466 enum machine_mode mode = GET_MODE (op0);
5dc8d536 11467 enum rtx_code c;
50a0b056 11468 rtx target;
5dc8d536
AH
11469
11470 if (code == SMAX || code == SMIN)
11471 c = GE;
11472 else
11473 c = GEU;
11474
50a0b056 11475 if (code == SMAX || code == UMAX)
f676971a 11476 target = emit_conditional_move (dest, c, op0, op1, mode,
50a0b056
GK
11477 op0, op1, mode, 0);
11478 else
f676971a 11479 target = emit_conditional_move (dest, c, op0, op1, mode,
50a0b056 11480 op1, op0, mode, 0);
37409796 11481 gcc_assert (target);
50a0b056
GK
11482 if (target != dest)
11483 emit_move_insn (dest, target);
11484}
46c07df8 11485
915167f5
GK
11486/* Emit instructions to perform a load-reserved/store-conditional operation.
11487 The operation performed is an atomic
11488 (set M (CODE:MODE M OP))
11489 If not NULL, BEFORE is atomically set to M before the operation, and
11490 AFTER is set to M after the operation (that is, (CODE:MODE M OP)).
11491 If SYNC_P then a memory barrier is emitted before the operation.
11492 Either OP or M may be wrapped in a NOT operation. */
11493
11494void
11495rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
11496 rtx m, rtx op, rtx before_param, rtx after_param,
11497 bool sync_p)
11498{
11499 enum machine_mode used_mode;
11500 rtx the_op, set_before, set_after, set_atomic, cc_scratch, before, after;
11501 rtx used_m;
11502 rtvec vec;
11503 HOST_WIDE_INT imask = GET_MODE_MASK (mode);
11504 rtx shift = NULL_RTX;
11505
11506 if (sync_p)
11507 emit_insn (gen_memory_barrier ());
11508
11509 if (GET_CODE (m) == NOT)
11510 used_m = XEXP (m, 0);
11511 else
11512 used_m = m;
11513
11514 /* If this is smaller than SImode, we'll have to use SImode with
11515 adjustments. */
11516 if (mode == QImode || mode == HImode)
11517 {
11518 rtx newop, oldop;
11519
11520 if (MEM_ALIGN (used_m) >= 32)
11521 {
11522 int ishift = 0;
11523 if (BYTES_BIG_ENDIAN)
11524 ishift = GET_MODE_BITSIZE (SImode) - GET_MODE_BITSIZE (mode);
11525
11526 shift = GEN_INT (ishift);
11527 }
11528 else
11529 {
11530 rtx addrSI, aligned_addr;
a9c9d3fa 11531 int shift_mask = mode == QImode ? 0x18 : 0x10;
915167f5
GK
11532
11533 addrSI = force_reg (SImode, gen_lowpart_common (SImode,
11534 XEXP (used_m, 0)));
11535 shift = gen_reg_rtx (SImode);
11536
11537 emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
a9c9d3fa
GK
11538 GEN_INT (shift_mask)));
11539 emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
915167f5
GK
11540
11541 aligned_addr = expand_binop (Pmode, and_optab,
11542 XEXP (used_m, 0),
11543 GEN_INT (-4), NULL_RTX,
11544 1, OPTAB_LIB_WIDEN);
11545 used_m = change_address (used_m, SImode, aligned_addr);
11546 set_mem_align (used_m, 32);
11547 /* It's safe to keep the old alias set of USED_M, because
11548 the operation is atomic and only affects the original
11549 USED_M. */
11550 if (GET_CODE (m) == NOT)
11551 m = gen_rtx_NOT (SImode, used_m);
11552 else
11553 m = used_m;
11554 }
11555
11556 if (GET_CODE (op) == NOT)
11557 {
11558 oldop = lowpart_subreg (SImode, XEXP (op, 0), mode);
11559 oldop = gen_rtx_NOT (SImode, oldop);
11560 }
11561 else
11562 oldop = lowpart_subreg (SImode, op, mode);
9f0076e5 11563
915167f5
GK
11564 switch (code)
11565 {
11566 case IOR:
11567 case XOR:
11568 newop = expand_binop (SImode, and_optab,
11569 oldop, GEN_INT (imask), NULL_RTX,
11570 1, OPTAB_LIB_WIDEN);
11571 emit_insn (gen_ashlsi3 (newop, newop, shift));
11572 break;
11573
11574 case AND:
11575 newop = expand_binop (SImode, ior_optab,
11576 oldop, GEN_INT (~imask), NULL_RTX,
11577 1, OPTAB_LIB_WIDEN);
a9c9d3fa 11578 emit_insn (gen_rotlsi3 (newop, newop, shift));
915167f5
GK
11579 break;
11580
11581 case PLUS:
9f0076e5 11582 case MINUS:
915167f5
GK
11583 {
11584 rtx mask;
11585
11586 newop = expand_binop (SImode, and_optab,
11587 oldop, GEN_INT (imask), NULL_RTX,
11588 1, OPTAB_LIB_WIDEN);
11589 emit_insn (gen_ashlsi3 (newop, newop, shift));
11590
11591 mask = gen_reg_rtx (SImode);
11592 emit_move_insn (mask, GEN_INT (imask));
11593 emit_insn (gen_ashlsi3 (mask, mask, shift));
11594
9f0076e5
DE
11595 if (code == PLUS)
11596 newop = gen_rtx_PLUS (SImode, m, newop);
11597 else
11598 newop = gen_rtx_MINUS (SImode, m, newop);
11599 newop = gen_rtx_AND (SImode, newop, mask);
915167f5
GK
11600 newop = gen_rtx_IOR (SImode, newop,
11601 gen_rtx_AND (SImode,
11602 gen_rtx_NOT (SImode, mask),
11603 m));
11604 break;
11605 }
11606
11607 default:
11608 gcc_unreachable ();
11609 }
11610
a9c9d3fa
GK
11611 if (GET_CODE (m) == NOT)
11612 {
11613 rtx mask, xorm;
11614
11615 mask = gen_reg_rtx (SImode);
11616 emit_move_insn (mask, GEN_INT (imask));
11617 emit_insn (gen_ashlsi3 (mask, mask, shift));
11618
11619 xorm = gen_rtx_XOR (SImode, used_m, mask);
11620 /* Depending on the value of 'op', the XOR or the operation might
11621 be able to be simplified away. */
11622 newop = simplify_gen_binary (code, SImode, xorm, newop);
11623 }
915167f5
GK
11624 op = newop;
11625 used_mode = SImode;
11626 before = gen_reg_rtx (used_mode);
11627 after = gen_reg_rtx (used_mode);
11628 }
11629 else
11630 {
11631 used_mode = mode;
11632 before = before_param;
11633 after = after_param;
11634
11635 if (before == NULL_RTX)
11636 before = gen_reg_rtx (used_mode);
11637 if (after == NULL_RTX)
11638 after = gen_reg_rtx (used_mode);
11639 }
11640
9f0076e5
DE
11641 if ((code == PLUS || code == MINUS || GET_CODE (m) == NOT)
11642 && used_mode != mode)
915167f5
GK
11643 the_op = op; /* Computed above. */
11644 else if (GET_CODE (op) == NOT && GET_CODE (m) != NOT)
11645 the_op = gen_rtx_fmt_ee (code, used_mode, op, m);
11646 else
11647 the_op = gen_rtx_fmt_ee (code, used_mode, m, op);
11648
11649 set_after = gen_rtx_SET (VOIDmode, after, the_op);
11650 set_before = gen_rtx_SET (VOIDmode, before, used_m);
11651 set_atomic = gen_rtx_SET (VOIDmode, used_m,
9f0076e5
DE
11652 gen_rtx_UNSPEC (used_mode,
11653 gen_rtvec (1, the_op),
11654 UNSPEC_SYNC_OP));
915167f5
GK
11655 cc_scratch = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode));
11656
9f0076e5 11657 if ((code == PLUS || code == MINUS) && used_mode != mode)
915167f5
GK
11658 vec = gen_rtvec (5, set_after, set_before, set_atomic, cc_scratch,
11659 gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
11660 else
11661 vec = gen_rtvec (4, set_after, set_before, set_atomic, cc_scratch);
11662 emit_insn (gen_rtx_PARALLEL (VOIDmode, vec));
11663
11664 /* Shift and mask the return values properly. */
11665 if (used_mode != mode && before_param)
11666 {
11667 emit_insn (gen_lshrsi3 (before, before, shift));
11668 convert_move (before_param, before, 1);
11669 }
11670
11671 if (used_mode != mode && after_param)
11672 {
11673 emit_insn (gen_lshrsi3 (after, after, shift));
11674 convert_move (after_param, after, 1);
11675 }
11676
11677 /* The previous sequence will end with a branch that's dependent on
11678 the conditional store, so placing an isync will ensure that no
11679 other instructions (especially, no load or store instructions)
11680 can start before the atomic operation completes. */
11681 if (sync_p)
11682 emit_insn (gen_isync ());
11683}
11684
b52110d4
DE
11685/* A subroutine of the atomic operation splitters. Jump to LABEL if
11686 COND is true. Mark the jump as unlikely to be taken. */
11687
11688static void
11689emit_unlikely_jump (rtx cond, rtx label)
11690{
11691 rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
11692 rtx x;
11693
11694 x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
11695 x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
11696 REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_BR_PROB, very_unlikely, NULL_RTX);
11697}
11698
11699/* A subroutine of the atomic operation splitters. Emit a load-locked
11700 instruction in MODE. */
11701
11702static void
11703emit_load_locked (enum machine_mode mode, rtx reg, rtx mem)
11704{
11705 rtx (*fn) (rtx, rtx) = NULL;
11706 if (mode == SImode)
11707 fn = gen_load_locked_si;
11708 else if (mode == DImode)
11709 fn = gen_load_locked_di;
11710 emit_insn (fn (reg, mem));
11711}
11712
11713/* A subroutine of the atomic operation splitters. Emit a store-conditional
11714 instruction in MODE. */
11715
11716static void
11717emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
11718{
11719 rtx (*fn) (rtx, rtx, rtx) = NULL;
11720 if (mode == SImode)
11721 fn = gen_store_conditional_si;
11722 else if (mode == DImode)
11723 fn = gen_store_conditional_di;
11724
9f0076e5 11725 /* Emit sync before stwcx. to address PPC405 Erratum. */
b52110d4
DE
11726 if (PPC405_ERRATUM77)
11727 emit_insn (gen_memory_barrier ());
11728
11729 emit_insn (fn (res, mem, val));
11730}
11731
9f0076e5
DE
11732/* Expand an an atomic fetch-and-operate pattern. CODE is the binary operation
11733 to perform. MEM is the memory on which to operate. VAL is the second
11734 operand of the binary operator. BEFORE and AFTER are optional locations to
11735 return the value of MEM either before of after the operation. SCRATCH is
11736 a scratch register. */
11737
11738void
11739rs6000_split_atomic_op (enum rtx_code code, rtx mem, rtx val,
11740 rtx before, rtx after, rtx scratch)
11741{
11742 enum machine_mode mode = GET_MODE (mem);
11743 rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
11744
11745 emit_insn (gen_memory_barrier ());
11746
11747 label = gen_label_rtx ();
11748 emit_label (label);
11749 label = gen_rtx_LABEL_REF (VOIDmode, label);
11750
11751 if (before == NULL_RTX)
11752 before = scratch;
11753 emit_load_locked (mode, before, mem);
11754
11755 if (code == NOT)
11756 x = gen_rtx_AND (mode, gen_rtx_NOT (mode, before), val);
11757 else if (code == AND)
11758 x = gen_rtx_UNSPEC (mode, gen_rtvec (2, before, val), UNSPEC_AND);
11759 else
11760 x = gen_rtx_fmt_ee (code, mode, before, val);
11761
11762 if (after != NULL_RTX)
11763 emit_insn (gen_rtx_SET (VOIDmode, after, copy_rtx (x)));
11764 emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
11765
11766 emit_store_conditional (mode, cond, mem, scratch);
11767
11768 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
11769 emit_unlikely_jump (x, label);
11770
11771 emit_insn (gen_isync ());
11772}
11773
b52110d4
DE
11774/* Expand an atomic compare and swap operation. MEM is the memory on which
11775 to operate. OLDVAL is the old value to be compared. NEWVAL is the new
11776 value to be stored. SCRATCH is a scratch GPR. */
11777
11778void
11779rs6000_split_compare_and_swap (rtx retval, rtx mem, rtx oldval, rtx newval,
11780 rtx scratch)
11781{
11782 enum machine_mode mode = GET_MODE (mem);
11783 rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
11784
11785 emit_insn (gen_memory_barrier ());
11786
11787 label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
11788 label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
11789 emit_label (XEXP (label1, 0));
11790
11791 emit_load_locked (mode, retval, mem);
11792
11793 x = gen_rtx_COMPARE (CCmode, retval, oldval);
11794 emit_insn (gen_rtx_SET (VOIDmode, cond, x));
11795
11796 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
11797 emit_unlikely_jump (x, label2);
11798
11799 emit_move_insn (scratch, newval);
11800 emit_store_conditional (mode, cond, mem, scratch);
11801
11802 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
11803 emit_unlikely_jump (x, label1);
11804
11805 emit_insn (gen_isync ());
11806 emit_label (XEXP (label2, 0));
11807}
11808
11809/* Expand an atomic test and set operation. MEM is the memory on which
11810 to operate. VAL is the value set. SCRATCH is a scratch GPR. */
11811
11812void
11813rs6000_split_lock_test_and_set (rtx retval, rtx mem, rtx val, rtx scratch)
11814{
11815 enum machine_mode mode = GET_MODE (mem);
11816 rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO);
11817
11818 emit_insn (gen_memory_barrier ());
11819
11820 label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
11821 emit_label (XEXP (label, 0));
11822
11823 emit_load_locked (mode, retval, mem);
11824 emit_move_insn (scratch, val);
11825 emit_store_conditional (mode, cond, mem, scratch);
11826
11827 x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
11828 emit_unlikely_jump (x, label);
11829
11830 emit_insn (gen_isync ());
11831}
11832
11833 /* Emit instructions to move SRC to DST. Called by splitters for
a9baceb1
GK
11834 multi-register moves. It will emit at most one instruction for
11835 each register that is accessed; that is, it won't emit li/lis pairs
11836 (or equivalent for 64-bit code). One of SRC or DST must be a hard
11837 register. */
46c07df8 11838
46c07df8 11839void
a9baceb1 11840rs6000_split_multireg_move (rtx dst, rtx src)
46c07df8 11841{
a9baceb1
GK
11842 /* The register number of the first register being moved. */
11843 int reg;
11844 /* The mode that is to be moved. */
11845 enum machine_mode mode;
11846 /* The mode that the move is being done in, and its size. */
11847 enum machine_mode reg_mode;
11848 int reg_mode_size;
11849 /* The number of registers that will be moved. */
11850 int nregs;
11851
11852 reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
11853 mode = GET_MODE (dst);
c8b622ff 11854 nregs = hard_regno_nregs[reg][mode];
a9baceb1
GK
11855 if (FP_REGNO_P (reg))
11856 reg_mode = DFmode;
11857 else if (ALTIVEC_REGNO_P (reg))
11858 reg_mode = V16QImode;
11859 else
11860 reg_mode = word_mode;
11861 reg_mode_size = GET_MODE_SIZE (reg_mode);
f676971a 11862
37409796 11863 gcc_assert (reg_mode_size * nregs == GET_MODE_SIZE (mode));
f676971a 11864
a9baceb1
GK
11865 if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
11866 {
11867 /* Move register range backwards, if we might have destructive
11868 overlap. */
11869 int i;
11870 for (i = nregs - 1; i >= 0; i--)
f676971a 11871 emit_insn (gen_rtx_SET (VOIDmode,
a9baceb1
GK
11872 simplify_gen_subreg (reg_mode, dst, mode,
11873 i * reg_mode_size),
11874 simplify_gen_subreg (reg_mode, src, mode,
11875 i * reg_mode_size)));
11876 }
46c07df8
HP
11877 else
11878 {
a9baceb1
GK
11879 int i;
11880 int j = -1;
11881 bool used_update = false;
46c07df8 11882
c1e55850 11883 if (MEM_P (src) && INT_REGNO_P (reg))
c4ad648e
AM
11884 {
11885 rtx breg;
3a1f863f 11886
a9baceb1
GK
11887 if (GET_CODE (XEXP (src, 0)) == PRE_INC
11888 || GET_CODE (XEXP (src, 0)) == PRE_DEC)
3a1f863f
DE
11889 {
11890 rtx delta_rtx;
a9baceb1 11891 breg = XEXP (XEXP (src, 0), 0);
c4ad648e
AM
11892 delta_rtx = (GET_CODE (XEXP (src, 0)) == PRE_INC
11893 ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
11894 : GEN_INT (-GET_MODE_SIZE (GET_MODE (src))));
a9baceb1
GK
11895 emit_insn (TARGET_32BIT
11896 ? gen_addsi3 (breg, breg, delta_rtx)
11897 : gen_adddi3 (breg, breg, delta_rtx));
3a1f863f
DE
11898 src = gen_rtx_MEM (mode, breg);
11899 }
c1e55850
GK
11900 else if (! offsettable_memref_p (src))
11901 {
11902 rtx newsrc, basereg;
11903 basereg = gen_rtx_REG (Pmode, reg);
11904 emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0)));
11905 newsrc = gen_rtx_MEM (GET_MODE (src), basereg);
11906 MEM_COPY_ATTRIBUTES (newsrc, src);
11907 src = newsrc;
11908 }
3a1f863f 11909
0423421f
AM
11910 breg = XEXP (src, 0);
11911 if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
11912 breg = XEXP (breg, 0);
11913
11914 /* If the base register we are using to address memory is
11915 also a destination reg, then change that register last. */
11916 if (REG_P (breg)
11917 && REGNO (breg) >= REGNO (dst)
3a1f863f
DE
11918 && REGNO (breg) < REGNO (dst) + nregs)
11919 j = REGNO (breg) - REGNO (dst);
c4ad648e 11920 }
46c07df8 11921
a9baceb1 11922 if (GET_CODE (dst) == MEM && INT_REGNO_P (reg))
3a1f863f
DE
11923 {
11924 rtx breg;
11925
a9baceb1
GK
11926 if (GET_CODE (XEXP (dst, 0)) == PRE_INC
11927 || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
3a1f863f
DE
11928 {
11929 rtx delta_rtx;
a9baceb1 11930 breg = XEXP (XEXP (dst, 0), 0);
c4ad648e
AM
11931 delta_rtx = (GET_CODE (XEXP (dst, 0)) == PRE_INC
11932 ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
11933 : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst))));
3a1f863f
DE
11934
11935 /* We have to update the breg before doing the store.
11936 Use store with update, if available. */
11937
11938 if (TARGET_UPDATE)
11939 {
a9baceb1 11940 rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
c4ad648e
AM
11941 emit_insn (TARGET_32BIT
11942 ? (TARGET_POWERPC64
11943 ? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
11944 : gen_movsi_update (breg, breg, delta_rtx, nsrc))
11945 : gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
a9baceb1 11946 used_update = true;
3a1f863f
DE
11947 }
11948 else
a9baceb1
GK
11949 emit_insn (TARGET_32BIT
11950 ? gen_addsi3 (breg, breg, delta_rtx)
11951 : gen_adddi3 (breg, breg, delta_rtx));
3a1f863f
DE
11952 dst = gen_rtx_MEM (mode, breg);
11953 }
37409796
NS
11954 else
11955 gcc_assert (offsettable_memref_p (dst));
3a1f863f
DE
11956 }
11957
46c07df8 11958 for (i = 0; i < nregs; i++)
f676971a 11959 {
3a1f863f
DE
11960 /* Calculate index to next subword. */
11961 ++j;
f676971a 11962 if (j == nregs)
3a1f863f 11963 j = 0;
46c07df8 11964
112cdef5 11965 /* If compiler already emitted move of first word by
a9baceb1 11966 store with update, no need to do anything. */
3a1f863f 11967 if (j == 0 && used_update)
a9baceb1 11968 continue;
f676971a 11969
a9baceb1
GK
11970 emit_insn (gen_rtx_SET (VOIDmode,
11971 simplify_gen_subreg (reg_mode, dst, mode,
11972 j * reg_mode_size),
11973 simplify_gen_subreg (reg_mode, src, mode,
11974 j * reg_mode_size)));
3a1f863f 11975 }
46c07df8
HP
11976 }
11977}
11978
12a4e8c5 11979\f
a4f6c312
SS
11980/* This page contains routines that are used to determine what the
11981 function prologue and epilogue code will do and write them out. */
9878760c 11982
a4f6c312
SS
11983/* Return the first fixed-point register that is required to be
11984 saved. 32 if none. */
9878760c
RK
11985
11986int
863d938c 11987first_reg_to_save (void)
9878760c
RK
11988{
11989 int first_reg;
11990
11991 /* Find lowest numbered live register. */
11992 for (first_reg = 13; first_reg <= 31; first_reg++)
f676971a 11993 if (regs_ever_live[first_reg]
a38d360d 11994 && (! call_used_regs[first_reg]
1db02437 11995 || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
14f00213 11996 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
b4db40bf
JJ
11997 || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
11998 || (TARGET_TOC && TARGET_MINIMAL_TOC)))))
9878760c
RK
11999 break;
12000
ee890fe2 12001#if TARGET_MACHO
93638d7a
AM
12002 if (flag_pic
12003 && current_function_uses_pic_offset_table
12004 && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
1db02437 12005 return RS6000_PIC_OFFSET_TABLE_REGNUM;
ee890fe2
SS
12006#endif
12007
9878760c
RK
12008 return first_reg;
12009}
12010
12011/* Similar, for FP regs. */
12012
12013int
863d938c 12014first_fp_reg_to_save (void)
9878760c
RK
12015{
12016 int first_reg;
12017
12018 /* Find lowest numbered live register. */
12019 for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
12020 if (regs_ever_live[first_reg])
12021 break;
12022
12023 return first_reg;
12024}
00b960c7
AH
12025
12026/* Similar, for AltiVec regs. */
12027
12028static int
863d938c 12029first_altivec_reg_to_save (void)
00b960c7
AH
12030{
12031 int i;
12032
12033 /* Stack frame remains as is unless we are in AltiVec ABI. */
12034 if (! TARGET_ALTIVEC_ABI)
12035 return LAST_ALTIVEC_REGNO + 1;
12036
12037 /* Find lowest numbered live register. */
12038 for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
12039 if (regs_ever_live[i])
12040 break;
12041
12042 return i;
12043}
12044
12045/* Return a 32-bit mask of the AltiVec registers we need to set in
12046 VRSAVE. Bit n of the return value is 1 if Vn is live. The MSB in
12047 the 32-bit word is 0. */
12048
12049static unsigned int
863d938c 12050compute_vrsave_mask (void)
00b960c7
AH
12051{
12052 unsigned int i, mask = 0;
12053
12054 /* First, find out if we use _any_ altivec registers. */
12055 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
12056 if (regs_ever_live[i])
12057 mask |= ALTIVEC_REG_BIT (i);
12058
12059 if (mask == 0)
12060 return mask;
12061
00b960c7
AH
12062 /* Next, remove the argument registers from the set. These must
12063 be in the VRSAVE mask set by the caller, so we don't need to add
12064 them in again. More importantly, the mask we compute here is
12065 used to generate CLOBBERs in the set_vrsave insn, and we do not
12066 wish the argument registers to die. */
a6cf80f2 12067 for (i = cfun->args_info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
00b960c7
AH
12068 mask &= ~ALTIVEC_REG_BIT (i);
12069
12070 /* Similarly, remove the return value from the set. */
12071 {
12072 bool yes = false;
12073 diddle_return_value (is_altivec_return_reg, &yes);
12074 if (yes)
12075 mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
12076 }
12077
12078 return mask;
12079}
12080
d62294f5 12081/* For a very restricted set of circumstances, we can cut down the
f57fe068
AM
12082 size of prologues/epilogues by calling our own save/restore-the-world
12083 routines. */
d62294f5
FJ
12084
12085static void
f57fe068
AM
12086compute_save_world_info (rs6000_stack_t *info_ptr)
12087{
12088 info_ptr->world_save_p = 1;
12089 info_ptr->world_save_p
12090 = (WORLD_SAVE_P (info_ptr)
12091 && DEFAULT_ABI == ABI_DARWIN
12092 && ! (current_function_calls_setjmp && flag_exceptions)
12093 && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
12094 && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
12095 && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
12096 && info_ptr->cr_save_p);
f676971a 12097
d62294f5
FJ
12098 /* This will not work in conjunction with sibcalls. Make sure there
12099 are none. (This check is expensive, but seldom executed.) */
f57fe068 12100 if (WORLD_SAVE_P (info_ptr))
f676971a 12101 {
d62294f5
FJ
12102 rtx insn;
12103 for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
c4ad648e
AM
12104 if ( GET_CODE (insn) == CALL_INSN
12105 && SIBLING_CALL_P (insn))
12106 {
12107 info_ptr->world_save_p = 0;
12108 break;
12109 }
d62294f5 12110 }
f676971a 12111
f57fe068 12112 if (WORLD_SAVE_P (info_ptr))
d62294f5
FJ
12113 {
12114 /* Even if we're not touching VRsave, make sure there's room on the
12115 stack for it, if it looks like we're calling SAVE_WORLD, which
c4ad648e 12116 will attempt to save it. */
d62294f5
FJ
12117 info_ptr->vrsave_size = 4;
12118
12119 /* "Save" the VRsave register too if we're saving the world. */
12120 if (info_ptr->vrsave_mask == 0)
c4ad648e 12121 info_ptr->vrsave_mask = compute_vrsave_mask ();
d62294f5
FJ
12122
12123 /* Because the Darwin register save/restore routines only handle
c4ad648e 12124 F14 .. F31 and V20 .. V31 as per the ABI, perform a consistency
992d08b1 12125 check. */
37409796
NS
12126 gcc_assert (info_ptr->first_fp_reg_save >= FIRST_SAVED_FP_REGNO
12127 && (info_ptr->first_altivec_reg_save
12128 >= FIRST_SAVED_ALTIVEC_REGNO));
d62294f5 12129 }
f676971a 12130 return;
d62294f5
FJ
12131}
12132
12133
00b960c7 12134static void
a2369ed3 12135is_altivec_return_reg (rtx reg, void *xyes)
00b960c7
AH
12136{
12137 bool *yes = (bool *) xyes;
12138 if (REGNO (reg) == ALTIVEC_ARG_RETURN)
12139 *yes = true;
12140}
12141
4697a36c
MM
12142\f
12143/* Calculate the stack information for the current function. This is
12144 complicated by having two separate calling sequences, the AIX calling
12145 sequence and the V.4 calling sequence.
12146
592696dd 12147 AIX (and Darwin/Mac OS X) stack frames look like:
a260abc9 12148 32-bit 64-bit
4697a36c 12149 SP----> +---------------------------------------+
a260abc9 12150 | back chain to caller | 0 0
4697a36c 12151 +---------------------------------------+
a260abc9 12152 | saved CR | 4 8 (8-11)
4697a36c 12153 +---------------------------------------+
a260abc9 12154 | saved LR | 8 16
4697a36c 12155 +---------------------------------------+
a260abc9 12156 | reserved for compilers | 12 24
4697a36c 12157 +---------------------------------------+
a260abc9 12158 | reserved for binders | 16 32
4697a36c 12159 +---------------------------------------+
a260abc9 12160 | saved TOC pointer | 20 40
4697a36c 12161 +---------------------------------------+
a260abc9 12162 | Parameter save area (P) | 24 48
4697a36c 12163 +---------------------------------------+
a260abc9 12164 | Alloca space (A) | 24+P etc.
802a0058 12165 +---------------------------------------+
a7df97e6 12166 | Local variable space (L) | 24+P+A
4697a36c 12167 +---------------------------------------+
a7df97e6 12168 | Float/int conversion temporary (X) | 24+P+A+L
4697a36c 12169 +---------------------------------------+
00b960c7
AH
12170 | Save area for AltiVec registers (W) | 24+P+A+L+X
12171 +---------------------------------------+
12172 | AltiVec alignment padding (Y) | 24+P+A+L+X+W
12173 +---------------------------------------+
12174 | Save area for VRSAVE register (Z) | 24+P+A+L+X+W+Y
4697a36c 12175 +---------------------------------------+
00b960c7
AH
12176 | Save area for GP registers (G) | 24+P+A+X+L+X+W+Y+Z
12177 +---------------------------------------+
12178 | Save area for FP registers (F) | 24+P+A+X+L+X+W+Y+Z+G
4697a36c
MM
12179 +---------------------------------------+
12180 old SP->| back chain to caller's caller |
12181 +---------------------------------------+
12182
5376a30c
KR
12183 The required alignment for AIX configurations is two words (i.e., 8
12184 or 16 bytes).
12185
12186
4697a36c
MM
12187 V.4 stack frames look like:
12188
12189 SP----> +---------------------------------------+
12190 | back chain to caller | 0
12191 +---------------------------------------+
5eb387b8 12192 | caller's saved LR | 4
4697a36c
MM
12193 +---------------------------------------+
12194 | Parameter save area (P) | 8
12195 +---------------------------------------+
a7df97e6 12196 | Alloca space (A) | 8+P
f676971a 12197 +---------------------------------------+
a7df97e6 12198 | Varargs save area (V) | 8+P+A
f676971a 12199 +---------------------------------------+
a7df97e6 12200 | Local variable space (L) | 8+P+A+V
f676971a 12201 +---------------------------------------+
a7df97e6 12202 | Float/int conversion temporary (X) | 8+P+A+V+L
4697a36c 12203 +---------------------------------------+
00b960c7
AH
12204 | Save area for AltiVec registers (W) | 8+P+A+V+L+X
12205 +---------------------------------------+
12206 | AltiVec alignment padding (Y) | 8+P+A+V+L+X+W
12207 +---------------------------------------+
12208 | Save area for VRSAVE register (Z) | 8+P+A+V+L+X+W+Y
12209 +---------------------------------------+
c4ad648e
AM
12210 | SPE: area for 64-bit GP registers |
12211 +---------------------------------------+
12212 | SPE alignment padding |
12213 +---------------------------------------+
00b960c7 12214 | saved CR (C) | 8+P+A+V+L+X+W+Y+Z
f676971a 12215 +---------------------------------------+
00b960c7 12216 | Save area for GP registers (G) | 8+P+A+V+L+X+W+Y+Z+C
f676971a 12217 +---------------------------------------+
00b960c7 12218 | Save area for FP registers (F) | 8+P+A+V+L+X+W+Y+Z+C+G
4697a36c
MM
12219 +---------------------------------------+
12220 old SP->| back chain to caller's caller |
12221 +---------------------------------------+
b6c9286a 12222
5376a30c
KR
12223 The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
12224 given. (But note below and in sysv4.h that we require only 8 and
12225 may round up the size of our stack frame anyways. The historical
12226 reason is early versions of powerpc-linux which didn't properly
12227 align the stack at program startup. A happy side-effect is that
12228 -mno-eabi libraries can be used with -meabi programs.)
12229
50d440bc 12230 The EABI configuration defaults to the V.4 layout. However,
5376a30c
KR
12231 the stack alignment requirements may differ. If -mno-eabi is not
12232 given, the required stack alignment is 8 bytes; if -mno-eabi is
12233 given, the required alignment is 16 bytes. (But see V.4 comment
12234 above.) */
4697a36c 12235
61b2fbe7
MM
12236#ifndef ABI_STACK_BOUNDARY
12237#define ABI_STACK_BOUNDARY STACK_BOUNDARY
12238#endif
12239
d1d0c603 12240static rs6000_stack_t *
863d938c 12241rs6000_stack_info (void)
4697a36c
MM
12242{
12243 static rs6000_stack_t info, zero_info;
12244 rs6000_stack_t *info_ptr = &info;
327e5343 12245 int reg_size = TARGET_32BIT ? 4 : 8;
83720594 12246 int ehrd_size;
64045029 12247 int save_align;
44688022 12248 HOST_WIDE_INT non_fixed_size;
4697a36c 12249
a4f6c312 12250 /* Zero all fields portably. */
4697a36c
MM
12251 info = zero_info;
12252
c19de7aa
AH
12253 if (TARGET_SPE)
12254 {
12255 /* Cache value so we don't rescan instruction chain over and over. */
9b7b447f 12256 if (cfun->machine->insn_chain_scanned_p == 0)
b5a5beb9
AH
12257 cfun->machine->insn_chain_scanned_p
12258 = spe_func_has_64bit_regs_p () + 1;
12259 info_ptr->spe_64bit_regs_used = cfun->machine->insn_chain_scanned_p - 1;
c19de7aa
AH
12260 }
12261
a4f6c312 12262 /* Select which calling sequence. */
178274da 12263 info_ptr->abi = DEFAULT_ABI;
9878760c 12264
a4f6c312 12265 /* Calculate which registers need to be saved & save area size. */
4697a36c 12266 info_ptr->first_gp_reg_save = first_reg_to_save ();
f676971a 12267 /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
906fb125 12268 even if it currently looks like we won't. */
2bfcf297 12269 if (((TARGET_TOC && TARGET_MINIMAL_TOC)
178274da
AM
12270 || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
12271 || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
1db02437
FS
12272 && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
12273 info_ptr->gp_size = reg_size * (32 - RS6000_PIC_OFFSET_TABLE_REGNUM);
906fb125
GK
12274 else
12275 info_ptr->gp_size = reg_size * (32 - info_ptr->first_gp_reg_save);
4697a36c 12276
a3170dc6
AH
12277 /* For the SPE, we have an additional upper 32-bits on each GPR.
12278 Ideally we should save the entire 64-bits only when the upper
12279 half is used in SIMD instructions. Since we only record
12280 registers live (not the size they are used in), this proves
12281 difficult because we'd have to traverse the instruction chain at
12282 the right time, taking reload into account. This is a real pain,
c19de7aa
AH
12283 so we opt to save the GPRs in 64-bits always if but one register
12284 gets used in 64-bits. Otherwise, all the registers in the frame
12285 get saved in 32-bits.
a3170dc6 12286
c19de7aa 12287 So... since when we save all GPRs (except the SP) in 64-bits, the
a3170dc6 12288 traditional GP save area will be empty. */
c19de7aa 12289 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
a3170dc6
AH
12290 info_ptr->gp_size = 0;
12291
4697a36c
MM
12292 info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
12293 info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
12294
00b960c7
AH
12295 info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
12296 info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
12297 - info_ptr->first_altivec_reg_save);
12298
592696dd 12299 /* Does this function call anything? */
71f123ca
FS
12300 info_ptr->calls_p = (! current_function_is_leaf
12301 || cfun->machine->ra_needs_full_frame);
b6c9286a 12302
a4f6c312 12303 /* Determine if we need to save the link register. */
71f123ca 12304 if (rs6000_ra_ever_killed ()
ffcfcb5f
AM
12305 || (DEFAULT_ABI == ABI_AIX
12306 && current_function_profile
12307 && !TARGET_PROFILE_KERNEL)
4697a36c
MM
12308#ifdef TARGET_RELOCATABLE
12309 || (TARGET_RELOCATABLE && (get_pool_size () != 0))
12310#endif
12311 || (info_ptr->first_fp_reg_save != 64
12312 && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save))
00b960c7 12313 || info_ptr->first_altivec_reg_save <= LAST_ALTIVEC_REGNO
178274da 12314 || (DEFAULT_ABI == ABI_V4 && current_function_calls_alloca)
4697a36c
MM
12315 || info_ptr->calls_p)
12316 {
12317 info_ptr->lr_save_p = 1;
9ebbca7d 12318 regs_ever_live[LINK_REGISTER_REGNUM] = 1;
4697a36c
MM
12319 }
12320
9ebbca7d 12321 /* Determine if we need to save the condition code registers. */
f676971a 12322 if (regs_ever_live[CR2_REGNO]
9ebbca7d
GK
12323 || regs_ever_live[CR3_REGNO]
12324 || regs_ever_live[CR4_REGNO])
4697a36c
MM
12325 {
12326 info_ptr->cr_save_p = 1;
178274da 12327 if (DEFAULT_ABI == ABI_V4)
4697a36c
MM
12328 info_ptr->cr_size = reg_size;
12329 }
12330
83720594
RH
12331 /* If the current function calls __builtin_eh_return, then we need
12332 to allocate stack space for registers that will hold data for
12333 the exception handler. */
12334 if (current_function_calls_eh_return)
12335 {
12336 unsigned int i;
12337 for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
12338 continue;
a3170dc6
AH
12339
12340 /* SPE saves EH registers in 64-bits. */
c19de7aa
AH
12341 ehrd_size = i * (TARGET_SPE_ABI
12342 && info_ptr->spe_64bit_regs_used != 0
12343 ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
83720594
RH
12344 }
12345 else
12346 ehrd_size = 0;
12347
592696dd 12348 /* Determine various sizes. */
4697a36c
MM
12349 info_ptr->reg_size = reg_size;
12350 info_ptr->fixed_size = RS6000_SAVE_AREA;
189e03e3 12351 info_ptr->vars_size = RS6000_ALIGN (get_frame_size (), 8);
a4f6c312 12352 info_ptr->parm_size = RS6000_ALIGN (current_function_outgoing_args_size,
03e007d7 12353 TARGET_ALTIVEC ? 16 : 8);
7d5175e1
JJ
12354 if (FRAME_GROWS_DOWNWARD)
12355 info_ptr->vars_size
5b667039
JJ
12356 += RS6000_ALIGN (info_ptr->fixed_size + info_ptr->vars_size
12357 + info_ptr->parm_size,
7d5175e1 12358 ABI_STACK_BOUNDARY / BITS_PER_UNIT)
5b667039
JJ
12359 - (info_ptr->fixed_size + info_ptr->vars_size
12360 + info_ptr->parm_size);
00b960c7 12361
c19de7aa 12362 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
a3170dc6
AH
12363 info_ptr->spe_gp_size = 8 * (32 - info_ptr->first_gp_reg_save);
12364 else
12365 info_ptr->spe_gp_size = 0;
12366
4d774ff8
HP
12367 if (TARGET_ALTIVEC_ABI)
12368 info_ptr->vrsave_mask = compute_vrsave_mask ();
00b960c7 12369 else
4d774ff8
HP
12370 info_ptr->vrsave_mask = 0;
12371
12372 if (TARGET_ALTIVEC_VRSAVE && info_ptr->vrsave_mask)
12373 info_ptr->vrsave_size = 4;
12374 else
12375 info_ptr->vrsave_size = 0;
b6c9286a 12376
d62294f5
FJ
12377 compute_save_world_info (info_ptr);
12378
592696dd 12379 /* Calculate the offsets. */
178274da 12380 switch (DEFAULT_ABI)
4697a36c 12381 {
b6c9286a 12382 case ABI_NONE:
24d304eb 12383 default:
37409796 12384 gcc_unreachable ();
b6c9286a
MM
12385
12386 case ABI_AIX:
ee890fe2 12387 case ABI_DARWIN:
b6c9286a
MM
12388 info_ptr->fp_save_offset = - info_ptr->fp_size;
12389 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
00b960c7
AH
12390
12391 if (TARGET_ALTIVEC_ABI)
12392 {
12393 info_ptr->vrsave_save_offset
12394 = info_ptr->gp_save_offset - info_ptr->vrsave_size;
12395
12396 /* Align stack so vector save area is on a quadword boundary. */
12397 if (info_ptr->altivec_size != 0)
12398 info_ptr->altivec_padding_size
12399 = 16 - (-info_ptr->vrsave_save_offset % 16);
12400 else
12401 info_ptr->altivec_padding_size = 0;
12402
12403 info_ptr->altivec_save_offset
12404 = info_ptr->vrsave_save_offset
12405 - info_ptr->altivec_padding_size
12406 - info_ptr->altivec_size;
12407
12408 /* Adjust for AltiVec case. */
12409 info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
12410 }
12411 else
12412 info_ptr->ehrd_offset = info_ptr->gp_save_offset - ehrd_size;
a260abc9
DE
12413 info_ptr->cr_save_offset = reg_size; /* first word when 64-bit. */
12414 info_ptr->lr_save_offset = 2*reg_size;
24d304eb
RK
12415 break;
12416
12417 case ABI_V4:
b6c9286a
MM
12418 info_ptr->fp_save_offset = - info_ptr->fp_size;
12419 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
a7df97e6 12420 info_ptr->cr_save_offset = info_ptr->gp_save_offset - info_ptr->cr_size;
00b960c7 12421
c19de7aa 12422 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
c4ad648e
AM
12423 {
12424 /* Align stack so SPE GPR save area is aligned on a
12425 double-word boundary. */
12426 if (info_ptr->spe_gp_size != 0)
12427 info_ptr->spe_padding_size
12428 = 8 - (-info_ptr->cr_save_offset % 8);
12429 else
12430 info_ptr->spe_padding_size = 0;
12431
12432 info_ptr->spe_gp_save_offset
12433 = info_ptr->cr_save_offset
12434 - info_ptr->spe_padding_size
12435 - info_ptr->spe_gp_size;
12436
12437 /* Adjust for SPE case. */
12438 info_ptr->toc_save_offset
12439 = info_ptr->spe_gp_save_offset - info_ptr->toc_size;
12440 }
a3170dc6 12441 else if (TARGET_ALTIVEC_ABI)
00b960c7
AH
12442 {
12443 info_ptr->vrsave_save_offset
12444 = info_ptr->cr_save_offset - info_ptr->vrsave_size;
12445
12446 /* Align stack so vector save area is on a quadword boundary. */
12447 if (info_ptr->altivec_size != 0)
12448 info_ptr->altivec_padding_size
12449 = 16 - (-info_ptr->vrsave_save_offset % 16);
12450 else
12451 info_ptr->altivec_padding_size = 0;
12452
12453 info_ptr->altivec_save_offset
12454 = info_ptr->vrsave_save_offset
12455 - info_ptr->altivec_padding_size
12456 - info_ptr->altivec_size;
12457
12458 /* Adjust for AltiVec case. */
12459 info_ptr->toc_save_offset
12460 = info_ptr->altivec_save_offset - info_ptr->toc_size;
12461 }
12462 else
12463 info_ptr->toc_save_offset = info_ptr->cr_save_offset - info_ptr->toc_size;
83720594 12464 info_ptr->ehrd_offset = info_ptr->toc_save_offset - ehrd_size;
b6c9286a
MM
12465 info_ptr->lr_save_offset = reg_size;
12466 break;
4697a36c
MM
12467 }
12468
64045029 12469 save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
00b960c7
AH
12470 info_ptr->save_size = RS6000_ALIGN (info_ptr->fp_size
12471 + info_ptr->gp_size
12472 + info_ptr->altivec_size
12473 + info_ptr->altivec_padding_size
a3170dc6
AH
12474 + info_ptr->spe_gp_size
12475 + info_ptr->spe_padding_size
00b960c7
AH
12476 + ehrd_size
12477 + info_ptr->cr_size
12478 + info_ptr->lr_size
12479 + info_ptr->vrsave_size
12480 + info_ptr->toc_size,
64045029 12481 save_align);
00b960c7 12482
44688022 12483 non_fixed_size = (info_ptr->vars_size
ff381587 12484 + info_ptr->parm_size
5b667039 12485 + info_ptr->save_size);
ff381587 12486
44688022
AM
12487 info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size,
12488 ABI_STACK_BOUNDARY / BITS_PER_UNIT);
ff381587
MM
12489
12490 /* Determine if we need to allocate any stack frame:
12491
a4f6c312
SS
12492 For AIX we need to push the stack if a frame pointer is needed
12493 (because the stack might be dynamically adjusted), if we are
12494 debugging, if we make calls, or if the sum of fp_save, gp_save,
12495 and local variables are more than the space needed to save all
12496 non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
12497 + 18*8 = 288 (GPR13 reserved).
ff381587 12498
a4f6c312
SS
12499 For V.4 we don't have the stack cushion that AIX uses, but assume
12500 that the debugger can handle stackless frames. */
ff381587
MM
12501
12502 if (info_ptr->calls_p)
12503 info_ptr->push_p = 1;
12504
178274da 12505 else if (DEFAULT_ABI == ABI_V4)
44688022 12506 info_ptr->push_p = non_fixed_size != 0;
ff381587 12507
178274da
AM
12508 else if (frame_pointer_needed)
12509 info_ptr->push_p = 1;
12510
12511 else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
12512 info_ptr->push_p = 1;
12513
ff381587 12514 else
44688022 12515 info_ptr->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
ff381587 12516
a4f6c312 12517 /* Zero offsets if we're not saving those registers. */
8dda1a21 12518 if (info_ptr->fp_size == 0)
4697a36c
MM
12519 info_ptr->fp_save_offset = 0;
12520
8dda1a21 12521 if (info_ptr->gp_size == 0)
4697a36c
MM
12522 info_ptr->gp_save_offset = 0;
12523
00b960c7
AH
12524 if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
12525 info_ptr->altivec_save_offset = 0;
12526
12527 if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
12528 info_ptr->vrsave_save_offset = 0;
12529
c19de7aa
AH
12530 if (! TARGET_SPE_ABI
12531 || info_ptr->spe_64bit_regs_used == 0
12532 || info_ptr->spe_gp_size == 0)
a3170dc6
AH
12533 info_ptr->spe_gp_save_offset = 0;
12534
c81fc13e 12535 if (! info_ptr->lr_save_p)
4697a36c
MM
12536 info_ptr->lr_save_offset = 0;
12537
c81fc13e 12538 if (! info_ptr->cr_save_p)
4697a36c
MM
12539 info_ptr->cr_save_offset = 0;
12540
c81fc13e 12541 if (! info_ptr->toc_save_p)
b6c9286a
MM
12542 info_ptr->toc_save_offset = 0;
12543
4697a36c
MM
12544 return info_ptr;
12545}
12546
c19de7aa
AH
12547/* Return true if the current function uses any GPRs in 64-bit SIMD
12548 mode. */
12549
12550static bool
863d938c 12551spe_func_has_64bit_regs_p (void)
c19de7aa
AH
12552{
12553 rtx insns, insn;
12554
12555 /* Functions that save and restore all the call-saved registers will
12556 need to save/restore the registers in 64-bits. */
12557 if (current_function_calls_eh_return
12558 || current_function_calls_setjmp
12559 || current_function_has_nonlocal_goto)
12560 return true;
12561
12562 insns = get_insns ();
12563
12564 for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
12565 {
12566 if (INSN_P (insn))
12567 {
12568 rtx i;
12569
b5a5beb9
AH
12570 /* FIXME: This should be implemented with attributes...
12571
12572 (set_attr "spe64" "true")....then,
12573 if (get_spe64(insn)) return true;
12574
12575 It's the only reliable way to do the stuff below. */
12576
c19de7aa 12577 i = PATTERN (insn);
f82f556d
AH
12578 if (GET_CODE (i) == SET)
12579 {
12580 enum machine_mode mode = GET_MODE (SET_SRC (i));
12581
12582 if (SPE_VECTOR_MODE (mode))
12583 return true;
12584 if (TARGET_E500_DOUBLE && mode == DFmode)
12585 return true;
12586 }
c19de7aa
AH
12587 }
12588 }
12589
12590 return false;
12591}
12592
d1d0c603 12593static void
a2369ed3 12594debug_stack_info (rs6000_stack_t *info)
9878760c 12595{
d330fd93 12596 const char *abi_string;
24d304eb 12597
c81fc13e 12598 if (! info)
4697a36c
MM
12599 info = rs6000_stack_info ();
12600
12601 fprintf (stderr, "\nStack information for function %s:\n",
12602 ((current_function_decl && DECL_NAME (current_function_decl))
12603 ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
12604 : "<unknown>"));
12605
24d304eb
RK
12606 switch (info->abi)
12607 {
b6c9286a
MM
12608 default: abi_string = "Unknown"; break;
12609 case ABI_NONE: abi_string = "NONE"; break;
50d440bc 12610 case ABI_AIX: abi_string = "AIX"; break;
ee890fe2 12611 case ABI_DARWIN: abi_string = "Darwin"; break;
b6c9286a 12612 case ABI_V4: abi_string = "V.4"; break;
24d304eb
RK
12613 }
12614
12615 fprintf (stderr, "\tABI = %5s\n", abi_string);
12616
00b960c7
AH
12617 if (TARGET_ALTIVEC_ABI)
12618 fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
12619
a3170dc6
AH
12620 if (TARGET_SPE_ABI)
12621 fprintf (stderr, "\tSPE ABI extensions enabled.\n");
12622
4697a36c
MM
12623 if (info->first_gp_reg_save != 32)
12624 fprintf (stderr, "\tfirst_gp_reg_save = %5d\n", info->first_gp_reg_save);
12625
12626 if (info->first_fp_reg_save != 64)
12627 fprintf (stderr, "\tfirst_fp_reg_save = %5d\n", info->first_fp_reg_save);
9878760c 12628
00b960c7
AH
12629 if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
12630 fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
12631 info->first_altivec_reg_save);
12632
4697a36c
MM
12633 if (info->lr_save_p)
12634 fprintf (stderr, "\tlr_save_p = %5d\n", info->lr_save_p);
9878760c 12635
4697a36c
MM
12636 if (info->cr_save_p)
12637 fprintf (stderr, "\tcr_save_p = %5d\n", info->cr_save_p);
12638
b6c9286a
MM
12639 if (info->toc_save_p)
12640 fprintf (stderr, "\ttoc_save_p = %5d\n", info->toc_save_p);
12641
00b960c7
AH
12642 if (info->vrsave_mask)
12643 fprintf (stderr, "\tvrsave_mask = 0x%x\n", info->vrsave_mask);
12644
4697a36c
MM
12645 if (info->push_p)
12646 fprintf (stderr, "\tpush_p = %5d\n", info->push_p);
12647
12648 if (info->calls_p)
12649 fprintf (stderr, "\tcalls_p = %5d\n", info->calls_p);
12650
4697a36c
MM
12651 if (info->gp_save_offset)
12652 fprintf (stderr, "\tgp_save_offset = %5d\n", info->gp_save_offset);
12653
12654 if (info->fp_save_offset)
12655 fprintf (stderr, "\tfp_save_offset = %5d\n", info->fp_save_offset);
12656
00b960c7
AH
12657 if (info->altivec_save_offset)
12658 fprintf (stderr, "\taltivec_save_offset = %5d\n",
12659 info->altivec_save_offset);
12660
a3170dc6
AH
12661 if (info->spe_gp_save_offset)
12662 fprintf (stderr, "\tspe_gp_save_offset = %5d\n",
12663 info->spe_gp_save_offset);
12664
00b960c7
AH
12665 if (info->vrsave_save_offset)
12666 fprintf (stderr, "\tvrsave_save_offset = %5d\n",
12667 info->vrsave_save_offset);
12668
4697a36c
MM
12669 if (info->lr_save_offset)
12670 fprintf (stderr, "\tlr_save_offset = %5d\n", info->lr_save_offset);
12671
12672 if (info->cr_save_offset)
12673 fprintf (stderr, "\tcr_save_offset = %5d\n", info->cr_save_offset);
12674
b6c9286a
MM
12675 if (info->toc_save_offset)
12676 fprintf (stderr, "\ttoc_save_offset = %5d\n", info->toc_save_offset);
12677
4697a36c
MM
12678 if (info->varargs_save_offset)
12679 fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
12680
12681 if (info->total_size)
d1d0c603
JJ
12682 fprintf (stderr, "\ttotal_size = "HOST_WIDE_INT_PRINT_DEC"\n",
12683 info->total_size);
4697a36c 12684
4697a36c 12685 if (info->vars_size)
d1d0c603
JJ
12686 fprintf (stderr, "\tvars_size = "HOST_WIDE_INT_PRINT_DEC"\n",
12687 info->vars_size);
4697a36c
MM
12688
12689 if (info->parm_size)
12690 fprintf (stderr, "\tparm_size = %5d\n", info->parm_size);
12691
12692 if (info->fixed_size)
12693 fprintf (stderr, "\tfixed_size = %5d\n", info->fixed_size);
12694
12695 if (info->gp_size)
12696 fprintf (stderr, "\tgp_size = %5d\n", info->gp_size);
12697
a3170dc6
AH
12698 if (info->spe_gp_size)
12699 fprintf (stderr, "\tspe_gp_size = %5d\n", info->spe_gp_size);
12700
4697a36c
MM
12701 if (info->fp_size)
12702 fprintf (stderr, "\tfp_size = %5d\n", info->fp_size);
12703
00b960c7
AH
12704 if (info->altivec_size)
12705 fprintf (stderr, "\taltivec_size = %5d\n", info->altivec_size);
12706
12707 if (info->vrsave_size)
12708 fprintf (stderr, "\tvrsave_size = %5d\n", info->vrsave_size);
12709
12710 if (info->altivec_padding_size)
12711 fprintf (stderr, "\taltivec_padding_size= %5d\n",
12712 info->altivec_padding_size);
12713
a3170dc6
AH
12714 if (info->spe_padding_size)
12715 fprintf (stderr, "\tspe_padding_size = %5d\n",
12716 info->spe_padding_size);
12717
a4f6c312 12718 if (info->lr_size)
ed947a96 12719 fprintf (stderr, "\tlr_size = %5d\n", info->lr_size);
b6c9286a 12720
4697a36c
MM
12721 if (info->cr_size)
12722 fprintf (stderr, "\tcr_size = %5d\n", info->cr_size);
12723
a4f6c312 12724 if (info->toc_size)
b6c9286a
MM
12725 fprintf (stderr, "\ttoc_size = %5d\n", info->toc_size);
12726
4697a36c
MM
12727 if (info->save_size)
12728 fprintf (stderr, "\tsave_size = %5d\n", info->save_size);
12729
12730 if (info->reg_size != 4)
12731 fprintf (stderr, "\treg_size = %5d\n", info->reg_size);
12732
12733 fprintf (stderr, "\n");
9878760c 12734}
71f123ca
FS
12735
12736rtx
a2369ed3 12737rs6000_return_addr (int count, rtx frame)
71f123ca 12738{
a4f6c312
SS
12739 /* Currently we don't optimize very well between prolog and body
12740 code and for PIC code the code can be actually quite bad, so
12741 don't try to be too clever here. */
f1384257 12742 if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
71f123ca
FS
12743 {
12744 cfun->machine->ra_needs_full_frame = 1;
8ac61af7
RK
12745
12746 return
12747 gen_rtx_MEM
12748 (Pmode,
12749 memory_address
12750 (Pmode,
12751 plus_constant (copy_to_reg
12752 (gen_rtx_MEM (Pmode,
12753 memory_address (Pmode, frame))),
12754 RETURN_ADDRESS_OFFSET)));
71f123ca
FS
12755 }
12756
8c29550d 12757 cfun->machine->ra_need_lr = 1;
9e2f7ec7 12758 return get_hard_reg_initial_val (Pmode, LINK_REGISTER_REGNUM);
71f123ca
FS
12759}
12760
5e1bf043
DJ
12761/* Say whether a function is a candidate for sibcall handling or not.
12762 We do not allow indirect calls to be optimized into sibling calls.
12763 Also, we can't do it if there are any vector parameters; there's
12764 nowhere to put the VRsave code so it works; note that functions with
12765 vector parameters are required to have a prototype, so the argument
12766 type info must be available here. (The tail recursion case can work
12767 with vector parameters, but there's no way to distinguish here.) */
4977bab6 12768static bool
a2369ed3 12769rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
5e1bf043
DJ
12770{
12771 tree type;
4977bab6 12772 if (decl)
5e1bf043
DJ
12773 {
12774 if (TARGET_ALTIVEC_VRSAVE)
c4ad648e 12775 {
4977bab6 12776 for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
5e1bf043
DJ
12777 type; type = TREE_CHAIN (type))
12778 {
c15b529f 12779 if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
4977bab6 12780 return false;
5e1bf043 12781 }
c4ad648e 12782 }
5e1bf043 12783 if (DEFAULT_ABI == ABI_DARWIN
4977bab6 12784 || (*targetm.binds_local_p) (decl))
2bcc50d0 12785 {
4977bab6 12786 tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
2bcc50d0
AM
12787
12788 if (!lookup_attribute ("longcall", attr_list)
12789 || lookup_attribute ("shortcall", attr_list))
4977bab6 12790 return true;
2bcc50d0 12791 }
5e1bf043 12792 }
4977bab6 12793 return false;
5e1bf043
DJ
12794}
12795
e7e64a25
AS
12796/* NULL if INSN insn is valid within a low-overhead loop.
12797 Otherwise return why doloop cannot be applied.
9419649c
DE
12798 PowerPC uses the COUNT register for branch on table instructions. */
12799
e7e64a25
AS
12800static const char *
12801rs6000_invalid_within_doloop (rtx insn)
9419649c
DE
12802{
12803 if (CALL_P (insn))
e7e64a25 12804 return "Function call in the loop.";
9419649c
DE
12805
12806 if (JUMP_P (insn)
12807 && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
12808 || GET_CODE (PATTERN (insn)) == ADDR_VEC))
e7e64a25 12809 return "Computed branch in the loop.";
9419649c 12810
e7e64a25 12811 return NULL;
9419649c
DE
12812}
12813
71f123ca 12814static int
863d938c 12815rs6000_ra_ever_killed (void)
71f123ca
FS
12816{
12817 rtx top;
5e1bf043
DJ
12818 rtx reg;
12819 rtx insn;
71f123ca 12820
dd292d0a 12821 if (current_function_is_thunk)
71f123ca 12822 return 0;
eb0424da 12823
36f7e964
AH
12824 /* regs_ever_live has LR marked as used if any sibcalls are present,
12825 but this should not force saving and restoring in the
12826 pro/epilogue. Likewise, reg_set_between_p thinks a sibcall
a3c9585f 12827 clobbers LR, so that is inappropriate. */
36f7e964 12828
5e1bf043
DJ
12829 /* Also, the prologue can generate a store into LR that
12830 doesn't really count, like this:
36f7e964 12831
5e1bf043
DJ
12832 move LR->R0
12833 bcl to set PIC register
12834 move LR->R31
12835 move R0->LR
36f7e964
AH
12836
12837 When we're called from the epilogue, we need to avoid counting
12838 this as a store. */
f676971a 12839
71f123ca
FS
12840 push_topmost_sequence ();
12841 top = get_insns ();
12842 pop_topmost_sequence ();
5e1bf043 12843 reg = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
71f123ca 12844
5e1bf043
DJ
12845 for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
12846 {
12847 if (INSN_P (insn))
12848 {
12849 if (FIND_REG_INC_NOTE (insn, reg))
12850 return 1;
f676971a 12851 else if (GET_CODE (insn) == CALL_INSN
c15b529f 12852 && !SIBLING_CALL_P (insn))
5e1bf043 12853 return 1;
36f7e964
AH
12854 else if (set_of (reg, insn) != NULL_RTX
12855 && !prologue_epilogue_contains (insn))
5e1bf043
DJ
12856 return 1;
12857 }
12858 }
12859 return 0;
71f123ca 12860}
4697a36c 12861\f
8cd8f856
GK
12862/* Add a REG_MAYBE_DEAD note to the insn. */
12863static void
a2369ed3 12864rs6000_maybe_dead (rtx insn)
8cd8f856
GK
12865{
12866 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD,
12867 const0_rtx,
12868 REG_NOTES (insn));
12869}
12870
9ebbca7d 12871/* Emit instructions needed to load the TOC register.
c7ca610e 12872 This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
9ebbca7d 12873 a constant pool; or for SVR4 -fpic. */
c7ca610e
RK
12874
12875void
a2369ed3 12876rs6000_emit_load_toc_table (int fromprolog)
c7ca610e 12877{
027fbf43 12878 rtx dest, insn;
1db02437 12879 dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
c7ca610e 12880
7f970b70 12881 if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
20b71b17 12882 {
7f970b70
AM
12883 char buf[30];
12884 rtx lab, tmp1, tmp2, got, tempLR;
12885
12886 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
12887 lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
12888 if (flag_pic == 2)
12889 got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
12890 else
12891 got = rs6000_got_sym ();
12892 tmp1 = tmp2 = dest;
12893 if (!fromprolog)
12894 {
12895 tmp1 = gen_reg_rtx (Pmode);
12896 tmp2 = gen_reg_rtx (Pmode);
12897 }
12898 tempLR = (fromprolog
12899 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
12900 : gen_reg_rtx (Pmode));
12901 insn = emit_insn (gen_load_toc_v4_PIC_1 (tempLR, lab));
12902 if (fromprolog)
12903 rs6000_maybe_dead (insn);
12904 insn = emit_move_insn (tmp1, tempLR);
12905 if (fromprolog)
12906 rs6000_maybe_dead (insn);
12907 insn = emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
12908 if (fromprolog)
12909 rs6000_maybe_dead (insn);
12910 insn = emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
12911 if (fromprolog)
12912 rs6000_maybe_dead (insn);
12913 }
12914 else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
12915 {
12916 rtx tempLR = (fromprolog
12917 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
12918 : gen_reg_rtx (Pmode));
12919
12920 insn = emit_insn (gen_load_toc_v4_pic_si (tempLR));
027fbf43
JJ
12921 if (fromprolog)
12922 rs6000_maybe_dead (insn);
7f970b70 12923 insn = emit_move_insn (dest, tempLR);
027fbf43
JJ
12924 if (fromprolog)
12925 rs6000_maybe_dead (insn);
20b71b17
AM
12926 }
12927 else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
12928 {
12929 char buf[30];
12930 rtx tempLR = (fromprolog
12931 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
12932 : gen_reg_rtx (Pmode));
12933 rtx temp0 = (fromprolog
12934 ? gen_rtx_REG (Pmode, 0)
12935 : gen_reg_rtx (Pmode));
20b71b17 12936
20b71b17
AM
12937 if (fromprolog)
12938 {
ccbca5e4 12939 rtx symF, symL;
38c1f2d7 12940
20b71b17
AM
12941 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
12942 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9ebbca7d 12943
20b71b17
AM
12944 ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
12945 symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
12946
12947 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1 (tempLR,
12948 symF)));
12949 rs6000_maybe_dead (emit_move_insn (dest, tempLR));
12950 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest,
12951 symL,
12952 symF)));
9ebbca7d
GK
12953 }
12954 else
20b71b17
AM
12955 {
12956 rtx tocsym;
20b71b17
AM
12957
12958 tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
ccbca5e4 12959 emit_insn (gen_load_toc_v4_PIC_1b (tempLR, tocsym));
027fbf43
JJ
12960 emit_move_insn (dest, tempLR);
12961 emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
20b71b17 12962 }
027fbf43
JJ
12963 insn = emit_insn (gen_addsi3 (dest, temp0, dest));
12964 if (fromprolog)
12965 rs6000_maybe_dead (insn);
9ebbca7d 12966 }
20b71b17
AM
12967 else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
12968 {
12969 /* This is for AIX code running in non-PIC ELF32. */
12970 char buf[30];
12971 rtx realsym;
12972 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
12973 realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
12974
027fbf43
JJ
12975 insn = emit_insn (gen_elf_high (dest, realsym));
12976 if (fromprolog)
12977 rs6000_maybe_dead (insn);
12978 insn = emit_insn (gen_elf_low (dest, dest, realsym));
12979 if (fromprolog)
12980 rs6000_maybe_dead (insn);
20b71b17 12981 }
37409796 12982 else
9ebbca7d 12983 {
37409796
NS
12984 gcc_assert (DEFAULT_ABI == ABI_AIX);
12985
9ebbca7d 12986 if (TARGET_32BIT)
027fbf43 12987 insn = emit_insn (gen_load_toc_aix_si (dest));
9ebbca7d 12988 else
027fbf43
JJ
12989 insn = emit_insn (gen_load_toc_aix_di (dest));
12990 if (fromprolog)
12991 rs6000_maybe_dead (insn);
9ebbca7d
GK
12992 }
12993}
12994
d1d0c603
JJ
12995/* Emit instructions to restore the link register after determining where
12996 its value has been stored. */
12997
12998void
12999rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
13000{
13001 rs6000_stack_t *info = rs6000_stack_info ();
13002 rtx operands[2];
13003
13004 operands[0] = source;
13005 operands[1] = scratch;
13006
13007 if (info->lr_save_p)
13008 {
13009 rtx frame_rtx = stack_pointer_rtx;
13010 HOST_WIDE_INT sp_offset = 0;
13011 rtx tmp;
13012
13013 if (frame_pointer_needed
13014 || current_function_calls_alloca
13015 || info->total_size > 32767)
13016 {
13017 emit_move_insn (operands[1], gen_rtx_MEM (Pmode, frame_rtx));
13018 frame_rtx = operands[1];
13019 }
13020 else if (info->push_p)
13021 sp_offset = info->total_size;
13022
13023 tmp = plus_constant (frame_rtx, info->lr_save_offset + sp_offset);
13024 tmp = gen_rtx_MEM (Pmode, tmp);
13025 emit_move_insn (tmp, operands[0]);
13026 }
13027 else
13028 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM), operands[0]);
13029}
13030
f103e34d
GK
13031static GTY(()) int set = -1;
13032
f676971a 13033int
863d938c 13034get_TOC_alias_set (void)
9ebbca7d 13035{
f103e34d
GK
13036 if (set == -1)
13037 set = new_alias_set ();
13038 return set;
f676971a 13039}
9ebbca7d 13040
c1207243 13041/* This returns nonzero if the current function uses the TOC. This is
3c9eb5f4
AM
13042 determined by the presence of (use (unspec ... UNSPEC_TOC)), which
13043 is generated by the ABI_V4 load_toc_* patterns. */
c954844a 13044#if TARGET_ELF
3c9eb5f4 13045static int
f676971a 13046uses_TOC (void)
9ebbca7d 13047{
c4501e62 13048 rtx insn;
38c1f2d7 13049
c4501e62
JJ
13050 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
13051 if (INSN_P (insn))
13052 {
13053 rtx pat = PATTERN (insn);
13054 int i;
9ebbca7d 13055
f676971a 13056 if (GET_CODE (pat) == PARALLEL)
c4501e62
JJ
13057 for (i = 0; i < XVECLEN (pat, 0); i++)
13058 {
13059 rtx sub = XVECEXP (pat, 0, i);
13060 if (GET_CODE (sub) == USE)
13061 {
13062 sub = XEXP (sub, 0);
13063 if (GET_CODE (sub) == UNSPEC
13064 && XINT (sub, 1) == UNSPEC_TOC)
13065 return 1;
13066 }
13067 }
13068 }
13069 return 0;
9ebbca7d 13070}
c954844a 13071#endif
38c1f2d7 13072
9ebbca7d 13073rtx
f676971a 13074create_TOC_reference (rtx symbol)
9ebbca7d 13075{
f676971a 13076 return gen_rtx_PLUS (Pmode,
a8a05998 13077 gen_rtx_REG (Pmode, TOC_REGISTER),
f676971a
EC
13078 gen_rtx_CONST (Pmode,
13079 gen_rtx_MINUS (Pmode, symbol,
b999aaeb 13080 gen_rtx_SYMBOL_REF (Pmode, toc_label_name))));
9ebbca7d 13081}
38c1f2d7 13082
fc4767bb
JJ
13083/* If _Unwind_* has been called from within the same module,
13084 toc register is not guaranteed to be saved to 40(1) on function
13085 entry. Save it there in that case. */
c7ca610e 13086
9ebbca7d 13087void
863d938c 13088rs6000_aix_emit_builtin_unwind_init (void)
9ebbca7d
GK
13089{
13090 rtx mem;
13091 rtx stack_top = gen_reg_rtx (Pmode);
13092 rtx opcode_addr = gen_reg_rtx (Pmode);
fc4767bb
JJ
13093 rtx opcode = gen_reg_rtx (SImode);
13094 rtx tocompare = gen_reg_rtx (SImode);
13095 rtx no_toc_save_needed = gen_label_rtx ();
9ebbca7d
GK
13096
13097 mem = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
13098 emit_move_insn (stack_top, mem);
13099
fc4767bb
JJ
13100 mem = gen_rtx_MEM (Pmode,
13101 gen_rtx_PLUS (Pmode, stack_top,
9ebbca7d
GK
13102 GEN_INT (2 * GET_MODE_SIZE (Pmode))));
13103 emit_move_insn (opcode_addr, mem);
fc4767bb
JJ
13104 emit_move_insn (opcode, gen_rtx_MEM (SImode, opcode_addr));
13105 emit_move_insn (tocompare, gen_int_mode (TARGET_32BIT ? 0x80410014
2496c7bd 13106 : 0xE8410028, SImode));
9ebbca7d 13107
fc4767bb 13108 do_compare_rtx_and_jump (opcode, tocompare, EQ, 1,
06f4e019 13109 SImode, NULL_RTX, NULL_RTX,
fc4767bb 13110 no_toc_save_needed);
9ebbca7d 13111
fc4767bb
JJ
13112 mem = gen_rtx_MEM (Pmode,
13113 gen_rtx_PLUS (Pmode, stack_top,
13114 GEN_INT (5 * GET_MODE_SIZE (Pmode))));
13115 emit_move_insn (mem, gen_rtx_REG (Pmode, 2));
13116 emit_label (no_toc_save_needed);
9ebbca7d 13117}
38c1f2d7 13118\f
ba4828e0
RK
13119/* This ties together stack memory (MEM with an alias set of
13120 rs6000_sr_alias_set) and the change to the stack pointer. */
13121
9ebbca7d 13122static void
863d938c 13123rs6000_emit_stack_tie (void)
9ebbca7d 13124{
ba4828e0
RK
13125 rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
13126
13127 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
13128 emit_insn (gen_stack_tie (mem));
13129}
38c1f2d7 13130
9ebbca7d
GK
13131/* Emit the correct code for allocating stack space, as insns.
13132 If COPY_R12, make sure a copy of the old frame is left in r12.
13133 The generated code may use hard register 0 as a temporary. */
13134
13135static void
a2369ed3 13136rs6000_emit_allocate_stack (HOST_WIDE_INT size, int copy_r12)
38c1f2d7 13137{
9ebbca7d
GK
13138 rtx insn;
13139 rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
13140 rtx tmp_reg = gen_rtx_REG (Pmode, 0);
61168ff1
RS
13141 rtx todec = gen_int_mode (-size, Pmode);
13142
13143 if (INTVAL (todec) != -size)
13144 {
d4ee4d25 13145 warning (0, "stack frame too large");
61168ff1
RS
13146 emit_insn (gen_trap ());
13147 return;
13148 }
a157febd
GK
13149
13150 if (current_function_limit_stack)
13151 {
13152 if (REG_P (stack_limit_rtx)
f676971a 13153 && REGNO (stack_limit_rtx) > 1
a157febd
GK
13154 && REGNO (stack_limit_rtx) <= 31)
13155 {
5b71a4e7 13156 emit_insn (TARGET_32BIT
9ebbca7d
GK
13157 ? gen_addsi3 (tmp_reg,
13158 stack_limit_rtx,
13159 GEN_INT (size))
13160 : gen_adddi3 (tmp_reg,
13161 stack_limit_rtx,
13162 GEN_INT (size)));
5b71a4e7 13163
9ebbca7d
GK
13164 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
13165 const0_rtx));
a157febd
GK
13166 }
13167 else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
9ebbca7d 13168 && TARGET_32BIT
f607bc57 13169 && DEFAULT_ABI == ABI_V4)
a157febd 13170 {
9ebbca7d 13171 rtx toload = gen_rtx_CONST (VOIDmode,
f676971a
EC
13172 gen_rtx_PLUS (Pmode,
13173 stack_limit_rtx,
9ebbca7d 13174 GEN_INT (size)));
5b71a4e7 13175
9ebbca7d
GK
13176 emit_insn (gen_elf_high (tmp_reg, toload));
13177 emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
13178 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
13179 const0_rtx));
a157febd
GK
13180 }
13181 else
d4ee4d25 13182 warning (0, "stack limit expression is not supported");
a157febd
GK
13183 }
13184
9ebbca7d
GK
13185 if (copy_r12 || ! TARGET_UPDATE)
13186 emit_move_insn (gen_rtx_REG (Pmode, 12), stack_reg);
13187
38c1f2d7
MM
13188 if (TARGET_UPDATE)
13189 {
9ebbca7d 13190 if (size > 32767)
38c1f2d7 13191 {
9ebbca7d 13192 /* Need a note here so that try_split doesn't get confused. */
9390387d 13193 if (get_last_insn () == NULL_RTX)
2e040219 13194 emit_note (NOTE_INSN_DELETED);
9ebbca7d
GK
13195 insn = emit_move_insn (tmp_reg, todec);
13196 try_split (PATTERN (insn), insn, 0);
13197 todec = tmp_reg;
38c1f2d7 13198 }
5b71a4e7
DE
13199
13200 insn = emit_insn (TARGET_32BIT
13201 ? gen_movsi_update (stack_reg, stack_reg,
13202 todec, stack_reg)
c4ad648e 13203 : gen_movdi_di_update (stack_reg, stack_reg,
9ebbca7d 13204 todec, stack_reg));
38c1f2d7
MM
13205 }
13206 else
13207 {
5b71a4e7
DE
13208 insn = emit_insn (TARGET_32BIT
13209 ? gen_addsi3 (stack_reg, stack_reg, todec)
13210 : gen_adddi3 (stack_reg, stack_reg, todec));
9ebbca7d
GK
13211 emit_move_insn (gen_rtx_MEM (Pmode, stack_reg),
13212 gen_rtx_REG (Pmode, 12));
13213 }
f676971a 13214
9ebbca7d 13215 RTX_FRAME_RELATED_P (insn) = 1;
f676971a 13216 REG_NOTES (insn) =
9ebbca7d 13217 gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
f676971a 13218 gen_rtx_SET (VOIDmode, stack_reg,
9ebbca7d
GK
13219 gen_rtx_PLUS (Pmode, stack_reg,
13220 GEN_INT (-size))),
13221 REG_NOTES (insn));
13222}
13223
a4f6c312
SS
13224/* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
13225 with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
13226 is not NULL. It would be nice if dwarf2out_frame_debug_expr could
13227 deduce these equivalences by itself so it wasn't necessary to hold
13228 its hand so much. */
9ebbca7d
GK
13229
13230static void
f676971a 13231rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
a2369ed3 13232 rtx reg2, rtx rreg)
9ebbca7d
GK
13233{
13234 rtx real, temp;
13235
e56c4463
JL
13236 /* copy_rtx will not make unique copies of registers, so we need to
13237 ensure we don't have unwanted sharing here. */
13238 if (reg == reg2)
13239 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
13240
13241 if (reg == rreg)
13242 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
13243
9ebbca7d
GK
13244 real = copy_rtx (PATTERN (insn));
13245
89e7058f
AH
13246 if (reg2 != NULL_RTX)
13247 real = replace_rtx (real, reg2, rreg);
f676971a
EC
13248
13249 real = replace_rtx (real, reg,
9ebbca7d
GK
13250 gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
13251 STACK_POINTER_REGNUM),
13252 GEN_INT (val)));
f676971a 13253
9ebbca7d
GK
13254 /* We expect that 'real' is either a SET or a PARALLEL containing
13255 SETs (and possibly other stuff). In a PARALLEL, all the SETs
13256 are important so they all have to be marked RTX_FRAME_RELATED_P. */
13257
13258 if (GET_CODE (real) == SET)
13259 {
13260 rtx set = real;
f676971a 13261
9ebbca7d
GK
13262 temp = simplify_rtx (SET_SRC (set));
13263 if (temp)
13264 SET_SRC (set) = temp;
13265 temp = simplify_rtx (SET_DEST (set));
13266 if (temp)
13267 SET_DEST (set) = temp;
13268 if (GET_CODE (SET_DEST (set)) == MEM)
38c1f2d7 13269 {
9ebbca7d
GK
13270 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
13271 if (temp)
13272 XEXP (SET_DEST (set), 0) = temp;
38c1f2d7 13273 }
38c1f2d7 13274 }
37409796 13275 else
9ebbca7d
GK
13276 {
13277 int i;
37409796
NS
13278
13279 gcc_assert (GET_CODE (real) == PARALLEL);
9ebbca7d
GK
13280 for (i = 0; i < XVECLEN (real, 0); i++)
13281 if (GET_CODE (XVECEXP (real, 0, i)) == SET)
13282 {
13283 rtx set = XVECEXP (real, 0, i);
f676971a 13284
9ebbca7d
GK
13285 temp = simplify_rtx (SET_SRC (set));
13286 if (temp)
13287 SET_SRC (set) = temp;
13288 temp = simplify_rtx (SET_DEST (set));
13289 if (temp)
13290 SET_DEST (set) = temp;
13291 if (GET_CODE (SET_DEST (set)) == MEM)
13292 {
13293 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
13294 if (temp)
13295 XEXP (SET_DEST (set), 0) = temp;
13296 }
13297 RTX_FRAME_RELATED_P (set) = 1;
13298 }
13299 }
c19de7aa
AH
13300
13301 if (TARGET_SPE)
13302 real = spe_synthesize_frame_save (real);
13303
9ebbca7d
GK
13304 RTX_FRAME_RELATED_P (insn) = 1;
13305 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
13306 real,
13307 REG_NOTES (insn));
38c1f2d7
MM
13308}
13309
c19de7aa
AH
13310/* Given an SPE frame note, return a PARALLEL of SETs with the
13311 original note, plus a synthetic register save. */
13312
13313static rtx
a2369ed3 13314spe_synthesize_frame_save (rtx real)
c19de7aa
AH
13315{
13316 rtx synth, offset, reg, real2;
13317
13318 if (GET_CODE (real) != SET
13319 || GET_MODE (SET_SRC (real)) != V2SImode)
13320 return real;
13321
13322 /* For the SPE, registers saved in 64-bits, get a PARALLEL for their
13323 frame related note. The parallel contains a set of the register
41f3a930 13324 being saved, and another set to a synthetic register (n+1200).
c19de7aa
AH
13325 This is so we can differentiate between 64-bit and 32-bit saves.
13326 Words cannot describe this nastiness. */
13327
37409796
NS
13328 gcc_assert (GET_CODE (SET_DEST (real)) == MEM
13329 && GET_CODE (XEXP (SET_DEST (real), 0)) == PLUS
13330 && GET_CODE (SET_SRC (real)) == REG);
c19de7aa
AH
13331
13332 /* Transform:
13333 (set (mem (plus (reg x) (const y)))
13334 (reg z))
13335 into:
13336 (set (mem (plus (reg x) (const y+4)))
41f3a930 13337 (reg z+1200))
c19de7aa
AH
13338 */
13339
13340 real2 = copy_rtx (real);
13341 PUT_MODE (SET_DEST (real2), SImode);
13342 reg = SET_SRC (real2);
13343 real2 = replace_rtx (real2, reg, gen_rtx_REG (SImode, REGNO (reg)));
13344 synth = copy_rtx (real2);
13345
13346 if (BYTES_BIG_ENDIAN)
13347 {
13348 offset = XEXP (XEXP (SET_DEST (real2), 0), 1);
13349 real2 = replace_rtx (real2, offset, GEN_INT (INTVAL (offset) + 4));
13350 }
13351
13352 reg = SET_SRC (synth);
41f3a930 13353
c19de7aa 13354 synth = replace_rtx (synth, reg,
41f3a930 13355 gen_rtx_REG (SImode, REGNO (reg) + 1200));
c19de7aa
AH
13356
13357 offset = XEXP (XEXP (SET_DEST (synth), 0), 1);
13358 synth = replace_rtx (synth, offset,
13359 GEN_INT (INTVAL (offset)
13360 + (BYTES_BIG_ENDIAN ? 0 : 4)));
13361
13362 RTX_FRAME_RELATED_P (synth) = 1;
13363 RTX_FRAME_RELATED_P (real2) = 1;
13364 if (BYTES_BIG_ENDIAN)
13365 real = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, synth, real2));
13366 else
13367 real = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, real2, synth));
13368
13369 return real;
13370}
13371
00b960c7
AH
13372/* Returns an insn that has a vrsave set operation with the
13373 appropriate CLOBBERs. */
13374
13375static rtx
a2369ed3 13376generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
00b960c7
AH
13377{
13378 int nclobs, i;
13379 rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
a004eb82 13380 rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
00b960c7 13381
a004eb82
AH
13382 clobs[0]
13383 = gen_rtx_SET (VOIDmode,
13384 vrsave,
13385 gen_rtx_UNSPEC_VOLATILE (SImode,
13386 gen_rtvec (2, reg, vrsave),
3aca4bff 13387 UNSPECV_SET_VRSAVE));
00b960c7
AH
13388
13389 nclobs = 1;
13390
9aa86737
AH
13391 /* We need to clobber the registers in the mask so the scheduler
13392 does not move sets to VRSAVE before sets of AltiVec registers.
13393
13394 However, if the function receives nonlocal gotos, reload will set
13395 all call saved registers live. We will end up with:
13396
13397 (set (reg 999) (mem))
13398 (parallel [ (set (reg vrsave) (unspec blah))
13399 (clobber (reg 999))])
13400
13401 The clobber will cause the store into reg 999 to be dead, and
13402 flow will attempt to delete an epilogue insn. In this case, we
13403 need an unspec use/set of the register. */
00b960c7
AH
13404
13405 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
44688022 13406 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
9aa86737
AH
13407 {
13408 if (!epiloguep || call_used_regs [i])
13409 clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
13410 gen_rtx_REG (V4SImode, i));
13411 else
13412 {
13413 rtx reg = gen_rtx_REG (V4SImode, i);
9aa86737
AH
13414
13415 clobs[nclobs++]
a004eb82
AH
13416 = gen_rtx_SET (VOIDmode,
13417 reg,
13418 gen_rtx_UNSPEC (V4SImode,
13419 gen_rtvec (1, reg), 27));
9aa86737
AH
13420 }
13421 }
00b960c7
AH
13422
13423 insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
13424
13425 for (i = 0; i < nclobs; ++i)
13426 XVECEXP (insn, 0, i) = clobs[i];
13427
13428 return insn;
13429}
13430
89e7058f
AH
13431/* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
13432 Save REGNO into [FRAME_REG + OFFSET] in mode MODE. */
13433
13434static void
f676971a 13435emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
d1d0c603 13436 unsigned int regno, int offset, HOST_WIDE_INT total_size)
89e7058f
AH
13437{
13438 rtx reg, offset_rtx, insn, mem, addr, int_rtx;
13439 rtx replacea, replaceb;
13440
13441 int_rtx = GEN_INT (offset);
13442
13443 /* Some cases that need register indexed addressing. */
13444 if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
4d4cbc0e 13445 || (TARGET_E500_DOUBLE && mode == DFmode)
a3170dc6
AH
13446 || (TARGET_SPE_ABI
13447 && SPE_VECTOR_MODE (mode)
13448 && !SPE_CONST_OFFSET_OK (offset)))
89e7058f
AH
13449 {
13450 /* Whomever calls us must make sure r11 is available in the
c4ad648e 13451 flow path of instructions in the prologue. */
89e7058f
AH
13452 offset_rtx = gen_rtx_REG (Pmode, 11);
13453 emit_move_insn (offset_rtx, int_rtx);
13454
13455 replacea = offset_rtx;
13456 replaceb = int_rtx;
13457 }
13458 else
13459 {
13460 offset_rtx = int_rtx;
13461 replacea = NULL_RTX;
13462 replaceb = NULL_RTX;
13463 }
13464
13465 reg = gen_rtx_REG (mode, regno);
13466 addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
13467 mem = gen_rtx_MEM (mode, addr);
13468 set_mem_alias_set (mem, rs6000_sr_alias_set);
13469
13470 insn = emit_move_insn (mem, reg);
13471
13472 rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
13473}
13474
a3170dc6
AH
13475/* Emit an offset memory reference suitable for a frame store, while
13476 converting to a valid addressing mode. */
13477
13478static rtx
a2369ed3 13479gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
a3170dc6
AH
13480{
13481 rtx int_rtx, offset_rtx;
13482
13483 int_rtx = GEN_INT (offset);
13484
4d4cbc0e
AH
13485 if ((TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
13486 || (TARGET_E500_DOUBLE && mode == DFmode))
a3170dc6
AH
13487 {
13488 offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
13489 emit_move_insn (offset_rtx, int_rtx);
13490 }
13491 else
13492 offset_rtx = int_rtx;
13493
13494 return gen_rtx_MEM (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
13495}
13496
6d0a8091
DJ
13497/* Look for user-defined global regs. We should not save and restore these,
13498 and cannot use stmw/lmw if there are any in its range. */
13499
13500static bool
13501no_global_regs_above (int first_greg)
13502{
13503 int i;
13504 for (i = 0; i < 32 - first_greg; i++)
13505 if (global_regs[first_greg + i])
13506 return false;
13507 return true;
13508}
13509
699c914a
MS
13510#ifndef TARGET_FIX_AND_CONTINUE
13511#define TARGET_FIX_AND_CONTINUE 0
13512#endif
13513
9ebbca7d
GK
13514/* Emit function prologue as insns. */
13515
9878760c 13516void
863d938c 13517rs6000_emit_prologue (void)
9878760c 13518{
4697a36c 13519 rs6000_stack_t *info = rs6000_stack_info ();
0e67400a 13520 enum machine_mode reg_mode = Pmode;
327e5343 13521 int reg_size = TARGET_32BIT ? 4 : 8;
9ebbca7d
GK
13522 rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
13523 rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
13524 rtx frame_reg_rtx = sp_reg_rtx;
b78d48dd 13525 rtx cr_save_rtx = NULL_RTX;
9ebbca7d
GK
13526 rtx insn;
13527 int saving_FPRs_inline;
13528 int using_store_multiple;
13529 HOST_WIDE_INT sp_offset = 0;
f676971a 13530
699c914a
MS
13531 if (TARGET_FIX_AND_CONTINUE)
13532 {
13533 /* gdb on darwin arranges to forward a function from the old
de2ab0ca 13534 address by modifying the first 5 instructions of the function
699c914a
MS
13535 to branch to the overriding function. This is necessary to
13536 permit function pointers that point to the old function to
13537 actually forward to the new function. */
13538 emit_insn (gen_nop ());
13539 emit_insn (gen_nop ());
de2ab0ca 13540 emit_insn (gen_nop ());
699c914a
MS
13541 emit_insn (gen_nop ());
13542 emit_insn (gen_nop ());
13543 }
13544
13545 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
13546 {
13547 reg_mode = V2SImode;
13548 reg_size = 8;
13549 }
a3170dc6 13550
9ebbca7d 13551 using_store_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
c19de7aa
AH
13552 && (!TARGET_SPE_ABI
13553 || info->spe_64bit_regs_used == 0)
6d0a8091
DJ
13554 && info->first_gp_reg_save < 31
13555 && no_global_regs_above (info->first_gp_reg_save));
9ebbca7d 13556 saving_FPRs_inline = (info->first_fp_reg_save == 64
8c29550d 13557 || FP_SAVE_INLINE (info->first_fp_reg_save)
acd0b319 13558 || current_function_calls_eh_return
8c29550d 13559 || cfun->machine->ra_need_lr);
9ebbca7d
GK
13560
13561 /* For V.4, update stack before we do any saving and set back pointer. */
fc4767bb 13562 if (info->push_p
acd0b319
AM
13563 && (DEFAULT_ABI == ABI_V4
13564 || current_function_calls_eh_return))
9ebbca7d
GK
13565 {
13566 if (info->total_size < 32767)
13567 sp_offset = info->total_size;
13568 else
13569 frame_reg_rtx = frame_ptr_rtx;
f676971a 13570 rs6000_emit_allocate_stack (info->total_size,
9ebbca7d
GK
13571 (frame_reg_rtx != sp_reg_rtx
13572 && (info->cr_save_p
13573 || info->lr_save_p
13574 || info->first_fp_reg_save < 64
13575 || info->first_gp_reg_save < 32
13576 )));
13577 if (frame_reg_rtx != sp_reg_rtx)
13578 rs6000_emit_stack_tie ();
13579 }
13580
d62294f5 13581 /* Handle world saves specially here. */
f57fe068 13582 if (WORLD_SAVE_P (info))
d62294f5
FJ
13583 {
13584 int i, j, sz;
13585 rtx treg;
13586 rtvec p;
13587
13588 /* save_world expects lr in r0. */
13589 if (info->lr_save_p)
c4ad648e
AM
13590 {
13591 insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
13592 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
13593 RTX_FRAME_RELATED_P (insn) = 1;
13594 }
d62294f5
FJ
13595
13596 /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
c4ad648e 13597 assumptions about the offsets of various bits of the stack
992d08b1 13598 frame. */
37409796
NS
13599 gcc_assert (info->gp_save_offset == -220
13600 && info->fp_save_offset == -144
13601 && info->lr_save_offset == 8
13602 && info->cr_save_offset == 4
13603 && info->push_p
13604 && info->lr_save_p
13605 && (!current_function_calls_eh_return
13606 || info->ehrd_offset == -432)
13607 && info->vrsave_save_offset == -224
13608 && info->altivec_save_offset == (-224 -16 -192));
d62294f5
FJ
13609
13610 treg = gen_rtx_REG (SImode, 11);
13611 emit_move_insn (treg, GEN_INT (-info->total_size));
13612
13613 /* SAVE_WORLD takes the caller's LR in R0 and the frame size
c4ad648e 13614 in R11. It also clobbers R12, so beware! */
d62294f5
FJ
13615
13616 /* Preserve CR2 for save_world prologues */
13617 sz = 6;
13618 sz += 32 - info->first_gp_reg_save;
13619 sz += 64 - info->first_fp_reg_save;
13620 sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
13621 p = rtvec_alloc (sz);
13622 j = 0;
13623 RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode,
c4ad648e
AM
13624 gen_rtx_REG (Pmode,
13625 LINK_REGISTER_REGNUM));
d62294f5 13626 RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
c4ad648e
AM
13627 gen_rtx_SYMBOL_REF (Pmode,
13628 "*save_world"));
d62294f5 13629 /* We do floats first so that the instruction pattern matches
c4ad648e
AM
13630 properly. */
13631 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
13632 {
13633 rtx reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
13634 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13635 GEN_INT (info->fp_save_offset
13636 + sp_offset + 8 * i));
13637 rtx mem = gen_rtx_MEM (DFmode, addr);
13638 set_mem_alias_set (mem, rs6000_sr_alias_set);
13639
13640 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
13641 }
d62294f5 13642 for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
c4ad648e
AM
13643 {
13644 rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
13645 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13646 GEN_INT (info->altivec_save_offset
13647 + sp_offset + 16 * i));
13648 rtx mem = gen_rtx_MEM (V4SImode, addr);
13649 set_mem_alias_set (mem, rs6000_sr_alias_set);
13650
13651 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
13652 }
d62294f5 13653 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
c4ad648e
AM
13654 {
13655 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
13656 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13657 GEN_INT (info->gp_save_offset
13658 + sp_offset + reg_size * i));
13659 rtx mem = gen_rtx_MEM (reg_mode, addr);
13660 set_mem_alias_set (mem, rs6000_sr_alias_set);
13661
13662 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
13663 }
13664
13665 {
13666 /* CR register traditionally saved as CR2. */
13667 rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
13668 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13669 GEN_INT (info->cr_save_offset
13670 + sp_offset));
13671 rtx mem = gen_rtx_MEM (reg_mode, addr);
13672 set_mem_alias_set (mem, rs6000_sr_alias_set);
13673
13674 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
13675 }
d62294f5
FJ
13676 /* Prevent any attempt to delete the setting of r0 and treg! */
13677 RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 0));
13678 RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode, treg);
13679 RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode, sp_reg_rtx);
13680
13681 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
13682 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
c4ad648e 13683 NULL_RTX, NULL_RTX);
d62294f5
FJ
13684
13685 if (current_function_calls_eh_return)
c4ad648e
AM
13686 {
13687 unsigned int i;
13688 for (i = 0; ; ++i)
13689 {
13690 unsigned int regno = EH_RETURN_DATA_REGNO (i);
13691 if (regno == INVALID_REGNUM)
13692 break;
13693 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
13694 info->ehrd_offset + sp_offset
13695 + reg_size * (int) i,
13696 info->total_size);
13697 }
13698 }
d62294f5
FJ
13699 }
13700
9aa86737 13701 /* Save AltiVec registers if needed. */
f57fe068 13702 if (!WORLD_SAVE_P (info) && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
9aa86737
AH
13703 {
13704 int i;
13705
13706 /* There should be a non inline version of this, for when we
13707 are saving lots of vector registers. */
13708 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
13709 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
13710 {
13711 rtx areg, savereg, mem;
13712 int offset;
13713
13714 offset = info->altivec_save_offset + sp_offset
13715 + 16 * (i - info->first_altivec_reg_save);
13716
13717 savereg = gen_rtx_REG (V4SImode, i);
13718
13719 areg = gen_rtx_REG (Pmode, 0);
13720 emit_move_insn (areg, GEN_INT (offset));
13721
13722 /* AltiVec addressing mode is [reg+reg]. */
13723 mem = gen_rtx_MEM (V4SImode,
13724 gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
f676971a 13725
9aa86737
AH
13726 set_mem_alias_set (mem, rs6000_sr_alias_set);
13727
13728 insn = emit_move_insn (mem, savereg);
13729
5c242421
SB
13730 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13731 areg, GEN_INT (offset));
9aa86737
AH
13732 }
13733 }
13734
13735 /* VRSAVE is a bit vector representing which AltiVec registers
13736 are used. The OS uses this to determine which vector
13737 registers to save on a context switch. We need to save
13738 VRSAVE on the stack frame, add whatever AltiVec registers we
13739 used in this function, and do the corresponding magic in the
13740 epilogue. */
13741
4d774ff8 13742 if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
bcb604b6 13743 && info->vrsave_mask != 0)
9aa86737 13744 {
a004eb82 13745 rtx reg, mem, vrsave;
9aa86737
AH
13746 int offset;
13747
eab97e44
AM
13748 /* Get VRSAVE onto a GPR. Note that ABI_V4 might be using r12
13749 as frame_reg_rtx and r11 as the static chain pointer for
13750 nested functions. */
13751 reg = gen_rtx_REG (SImode, 0);
a004eb82 13752 vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
b188f760
AH
13753 if (TARGET_MACHO)
13754 emit_insn (gen_get_vrsave_internal (reg));
13755 else
13756 emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
9aa86737 13757
bcb604b6
FJ
13758 if (!WORLD_SAVE_P (info))
13759 {
13760 /* Save VRSAVE. */
13761 offset = info->vrsave_save_offset + sp_offset;
13762 mem
13763 = gen_rtx_MEM (SImode,
13764 gen_rtx_PLUS (Pmode, frame_reg_rtx, GEN_INT (offset)));
13765 set_mem_alias_set (mem, rs6000_sr_alias_set);
13766 insn = emit_move_insn (mem, reg);
13767 }
9aa86737
AH
13768
13769 /* Include the registers in the mask. */
13770 emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
13771
13772 insn = emit_insn (generate_set_vrsave (reg, info, 0));
13773 }
13774
9ebbca7d 13775 /* If we use the link register, get it into r0. */
f57fe068 13776 if (!WORLD_SAVE_P (info) && info->lr_save_p)
f8a57be8
GK
13777 {
13778 insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
13779 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
13780 RTX_FRAME_RELATED_P (insn) = 1;
13781 }
9ebbca7d
GK
13782
13783 /* If we need to save CR, put it into r12. */
f57fe068 13784 if (!WORLD_SAVE_P (info) && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
9ebbca7d 13785 {
f8a57be8 13786 rtx set;
f676971a 13787
9ebbca7d 13788 cr_save_rtx = gen_rtx_REG (SImode, 12);
f8a57be8
GK
13789 insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
13790 RTX_FRAME_RELATED_P (insn) = 1;
13791 /* Now, there's no way that dwarf2out_frame_debug_expr is going
13792 to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
13793 But that's OK. All we have to do is specify that _one_ condition
13794 code register is saved in this stack slot. The thrower's epilogue
13795 will then restore all the call-saved registers.
13796 We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux. */
13797 set = gen_rtx_SET (VOIDmode, cr_save_rtx,
13798 gen_rtx_REG (SImode, CR2_REGNO));
13799 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
13800 set,
13801 REG_NOTES (insn));
9ebbca7d
GK
13802 }
13803
a4f6c312
SS
13804 /* Do any required saving of fpr's. If only one or two to save, do
13805 it ourselves. Otherwise, call function. */
f57fe068 13806 if (!WORLD_SAVE_P (info) && saving_FPRs_inline)
9ebbca7d
GK
13807 {
13808 int i;
13809 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
f676971a 13810 if ((regs_ever_live[info->first_fp_reg_save+i]
9ebbca7d 13811 && ! call_used_regs[info->first_fp_reg_save+i]))
89e7058f
AH
13812 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, DFmode,
13813 info->first_fp_reg_save + i,
13814 info->fp_save_offset + sp_offset + 8 * i,
13815 info->total_size);
9ebbca7d 13816 }
f57fe068 13817 else if (!WORLD_SAVE_P (info) && info->first_fp_reg_save != 64)
9ebbca7d
GK
13818 {
13819 int i;
13820 char rname[30];
520a57c8 13821 const char *alloc_rname;
9ebbca7d
GK
13822 rtvec p;
13823 p = rtvec_alloc (2 + 64 - info->first_fp_reg_save);
f676971a
EC
13824
13825 RTVEC_ELT (p, 0) = gen_rtx_CLOBBER (VOIDmode,
13826 gen_rtx_REG (Pmode,
9ebbca7d
GK
13827 LINK_REGISTER_REGNUM));
13828 sprintf (rname, "%s%d%s", SAVE_FP_PREFIX,
13829 info->first_fp_reg_save - 32, SAVE_FP_SUFFIX);
a8a05998 13830 alloc_rname = ggc_strdup (rname);
9ebbca7d
GK
13831 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
13832 gen_rtx_SYMBOL_REF (Pmode,
13833 alloc_rname));
13834 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
13835 {
13836 rtx addr, reg, mem;
13837 reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
13838 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
f676971a 13839 GEN_INT (info->fp_save_offset
9ebbca7d
GK
13840 + sp_offset + 8*i));
13841 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 13842 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
13843
13844 RTVEC_ELT (p, i + 2) = gen_rtx_SET (VOIDmode, mem, reg);
13845 }
13846 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
f676971a 13847 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
9ebbca7d
GK
13848 NULL_RTX, NULL_RTX);
13849 }
b6c9286a 13850
9ebbca7d
GK
13851 /* Save GPRs. This is done as a PARALLEL if we are using
13852 the store-multiple instructions. */
f57fe068 13853 if (!WORLD_SAVE_P (info) && using_store_multiple)
b6c9286a 13854 {
308c142a 13855 rtvec p;
9ebbca7d
GK
13856 int i;
13857 p = rtvec_alloc (32 - info->first_gp_reg_save);
9ebbca7d
GK
13858 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
13859 {
13860 rtx addr, reg, mem;
13861 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
f676971a
EC
13862 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13863 GEN_INT (info->gp_save_offset
13864 + sp_offset
9ebbca7d
GK
13865 + reg_size * i));
13866 mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0 13867 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
13868
13869 RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
13870 }
13871 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
f676971a 13872 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
9ebbca7d 13873 NULL_RTX, NULL_RTX);
b6c9286a 13874 }
f57fe068 13875 else if (!WORLD_SAVE_P (info))
b6c9286a 13876 {
9ebbca7d
GK
13877 int i;
13878 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
6d0a8091
DJ
13879 if ((regs_ever_live[info->first_gp_reg_save + i]
13880 && (!call_used_regs[info->first_gp_reg_save + i]
13881 || (i + info->first_gp_reg_save
b4db40bf
JJ
13882 == RS6000_PIC_OFFSET_TABLE_REGNUM
13883 && TARGET_TOC && TARGET_MINIMAL_TOC)))
6d0a8091 13884 || (i + info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
14f00213 13885 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
f607bc57 13886 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
a3170dc6
AH
13887 {
13888 rtx addr, reg, mem;
13889 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
13890
c19de7aa 13891 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
a3170dc6
AH
13892 {
13893 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
13894 rtx b;
13895
13896 if (!SPE_CONST_OFFSET_OK (offset))
13897 {
13898 b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
13899 emit_move_insn (b, GEN_INT (offset));
13900 }
13901 else
13902 b = GEN_INT (offset);
13903
13904 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
13905 mem = gen_rtx_MEM (V2SImode, addr);
13906 set_mem_alias_set (mem, rs6000_sr_alias_set);
13907 insn = emit_move_insn (mem, reg);
13908
13909 if (GET_CODE (b) == CONST_INT)
13910 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13911 NULL_RTX, NULL_RTX);
13912 else
13913 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13914 b, GEN_INT (offset));
13915 }
13916 else
13917 {
f676971a
EC
13918 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13919 GEN_INT (info->gp_save_offset
13920 + sp_offset
a3170dc6
AH
13921 + reg_size * i));
13922 mem = gen_rtx_MEM (reg_mode, addr);
13923 set_mem_alias_set (mem, rs6000_sr_alias_set);
13924
13925 insn = emit_move_insn (mem, reg);
f676971a 13926 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
a3170dc6
AH
13927 NULL_RTX, NULL_RTX);
13928 }
13929 }
9ebbca7d
GK
13930 }
13931
83720594
RH
13932 /* ??? There's no need to emit actual instructions here, but it's the
13933 easiest way to get the frame unwind information emitted. */
f57fe068 13934 if (!WORLD_SAVE_P (info) && current_function_calls_eh_return)
83720594 13935 {
78e1b90d
DE
13936 unsigned int i, regno;
13937
fc4767bb
JJ
13938 /* In AIX ABI we need to pretend we save r2 here. */
13939 if (TARGET_AIX)
13940 {
13941 rtx addr, reg, mem;
13942
13943 reg = gen_rtx_REG (reg_mode, 2);
13944 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13945 GEN_INT (sp_offset + 5 * reg_size));
13946 mem = gen_rtx_MEM (reg_mode, addr);
13947 set_mem_alias_set (mem, rs6000_sr_alias_set);
13948
13949 insn = emit_move_insn (mem, reg);
f676971a 13950 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
fc4767bb
JJ
13951 NULL_RTX, NULL_RTX);
13952 PATTERN (insn) = gen_blockage ();
13953 }
13954
83720594
RH
13955 for (i = 0; ; ++i)
13956 {
83720594
RH
13957 regno = EH_RETURN_DATA_REGNO (i);
13958 if (regno == INVALID_REGNUM)
13959 break;
13960
89e7058f
AH
13961 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
13962 info->ehrd_offset + sp_offset
13963 + reg_size * (int) i,
13964 info->total_size);
83720594
RH
13965 }
13966 }
13967
9ebbca7d 13968 /* Save lr if we used it. */
f57fe068 13969 if (!WORLD_SAVE_P (info) && info->lr_save_p)
9ebbca7d
GK
13970 {
13971 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13972 GEN_INT (info->lr_save_offset + sp_offset));
13973 rtx reg = gen_rtx_REG (Pmode, 0);
13974 rtx mem = gen_rtx_MEM (Pmode, addr);
13975 /* This should not be of rs6000_sr_alias_set, because of
13976 __builtin_return_address. */
f676971a 13977
9ebbca7d 13978 insn = emit_move_insn (mem, reg);
f676971a 13979 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
f8a57be8 13980 NULL_RTX, NULL_RTX);
9ebbca7d
GK
13981 }
13982
13983 /* Save CR if we use any that must be preserved. */
f57fe068 13984 if (!WORLD_SAVE_P (info) && info->cr_save_p)
9ebbca7d
GK
13985 {
13986 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13987 GEN_INT (info->cr_save_offset + sp_offset));
13988 rtx mem = gen_rtx_MEM (SImode, addr);
f8a57be8
GK
13989 /* See the large comment above about why CR2_REGNO is used. */
13990 rtx magic_eh_cr_reg = gen_rtx_REG (SImode, CR2_REGNO);
ba4828e0
RK
13991
13992 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
13993
13994 /* If r12 was used to hold the original sp, copy cr into r0 now
13995 that it's free. */
13996 if (REGNO (frame_reg_rtx) == 12)
13997 {
f8a57be8
GK
13998 rtx set;
13999
9ebbca7d 14000 cr_save_rtx = gen_rtx_REG (SImode, 0);
f8a57be8
GK
14001 insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
14002 RTX_FRAME_RELATED_P (insn) = 1;
14003 set = gen_rtx_SET (VOIDmode, cr_save_rtx, magic_eh_cr_reg);
14004 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
14005 set,
14006 REG_NOTES (insn));
f676971a 14007
9ebbca7d
GK
14008 }
14009 insn = emit_move_insn (mem, cr_save_rtx);
14010
f676971a 14011 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
f8a57be8 14012 NULL_RTX, NULL_RTX);
9ebbca7d
GK
14013 }
14014
f676971a 14015 /* Update stack and set back pointer unless this is V.4,
9ebbca7d 14016 for which it was done previously. */
f57fe068 14017 if (!WORLD_SAVE_P (info) && info->push_p
fc4767bb 14018 && !(DEFAULT_ABI == ABI_V4 || current_function_calls_eh_return))
9ebbca7d
GK
14019 rs6000_emit_allocate_stack (info->total_size, FALSE);
14020
14021 /* Set frame pointer, if needed. */
14022 if (frame_pointer_needed)
14023 {
7d5175e1 14024 insn = emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
9ebbca7d
GK
14025 sp_reg_rtx);
14026 RTX_FRAME_RELATED_P (insn) = 1;
b6c9286a 14027 }
9878760c 14028
1db02437 14029 /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up. */
9ebbca7d 14030 if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
7f970b70
AM
14031 || (DEFAULT_ABI == ABI_V4
14032 && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
1db02437 14033 && regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM]))
c4ad648e
AM
14034 {
14035 /* If emit_load_toc_table will use the link register, we need to save
14036 it. We use R12 for this purpose because emit_load_toc_table
14037 can use register 0. This allows us to use a plain 'blr' to return
14038 from the procedure more often. */
14039 int save_LR_around_toc_setup = (TARGET_ELF
14040 && DEFAULT_ABI != ABI_AIX
14041 && flag_pic
14042 && ! info->lr_save_p
14043 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0);
14044 if (save_LR_around_toc_setup)
14045 {
14046 rtx lr = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
f8a57be8 14047
c4ad648e
AM
14048 insn = emit_move_insn (frame_ptr_rtx, lr);
14049 rs6000_maybe_dead (insn);
14050 RTX_FRAME_RELATED_P (insn) = 1;
f8a57be8 14051
c4ad648e 14052 rs6000_emit_load_toc_table (TRUE);
f8a57be8 14053
c4ad648e
AM
14054 insn = emit_move_insn (lr, frame_ptr_rtx);
14055 rs6000_maybe_dead (insn);
14056 RTX_FRAME_RELATED_P (insn) = 1;
14057 }
14058 else
14059 rs6000_emit_load_toc_table (TRUE);
14060 }
ee890fe2 14061
fcce224d 14062#if TARGET_MACHO
ee890fe2
SS
14063 if (DEFAULT_ABI == ABI_DARWIN
14064 && flag_pic && current_function_uses_pic_offset_table)
14065 {
f8a57be8 14066 rtx lr = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
11abc112 14067 rtx src = machopic_function_base_sym ();
ee890fe2 14068
6d0a8091
DJ
14069 /* Save and restore LR locally around this call (in R0). */
14070 if (!info->lr_save_p)
14071 rs6000_maybe_dead (emit_move_insn (gen_rtx_REG (Pmode, 0), lr));
14072
f8a57be8 14073 rs6000_maybe_dead (emit_insn (gen_load_macho_picbase (lr, src)));
ee890fe2 14074
f676971a 14075 insn = emit_move_insn (gen_rtx_REG (Pmode,
f8a57be8
GK
14076 RS6000_PIC_OFFSET_TABLE_REGNUM),
14077 lr);
14078 rs6000_maybe_dead (insn);
6d0a8091
DJ
14079
14080 if (!info->lr_save_p)
14081 rs6000_maybe_dead (emit_move_insn (lr, gen_rtx_REG (Pmode, 0)));
ee890fe2 14082 }
fcce224d 14083#endif
9ebbca7d
GK
14084}
14085
9ebbca7d 14086/* Write function prologue. */
a4f6c312 14087
08c148a8 14088static void
f676971a 14089rs6000_output_function_prologue (FILE *file,
a2369ed3 14090 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9ebbca7d
GK
14091{
14092 rs6000_stack_t *info = rs6000_stack_info ();
14093
4697a36c
MM
14094 if (TARGET_DEBUG_STACK)
14095 debug_stack_info (info);
9878760c 14096
a4f6c312
SS
14097 /* Write .extern for any function we will call to save and restore
14098 fp values. */
14099 if (info->first_fp_reg_save < 64
14100 && !FP_SAVE_INLINE (info->first_fp_reg_save))
4d30c363 14101 fprintf (file, "\t.extern %s%d%s\n\t.extern %s%d%s\n",
4697a36c 14102 SAVE_FP_PREFIX, info->first_fp_reg_save - 32, SAVE_FP_SUFFIX,
a4f6c312
SS
14103 RESTORE_FP_PREFIX, info->first_fp_reg_save - 32,
14104 RESTORE_FP_SUFFIX);
9878760c 14105
c764f757
RK
14106 /* Write .extern for AIX common mode routines, if needed. */
14107 if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
14108 {
f6709c70
JW
14109 fputs ("\t.extern __mulh\n", file);
14110 fputs ("\t.extern __mull\n", file);
14111 fputs ("\t.extern __divss\n", file);
14112 fputs ("\t.extern __divus\n", file);
14113 fputs ("\t.extern __quoss\n", file);
14114 fputs ("\t.extern __quous\n", file);
c764f757
RK
14115 common_mode_defined = 1;
14116 }
9878760c 14117
9ebbca7d 14118 if (! HAVE_prologue)
979721f8 14119 {
9ebbca7d 14120 start_sequence ();
9dda4cc8 14121
a4f6c312
SS
14122 /* A NOTE_INSN_DELETED is supposed to be at the start and end of
14123 the "toplevel" insn chain. */
2e040219 14124 emit_note (NOTE_INSN_DELETED);
9ebbca7d 14125 rs6000_emit_prologue ();
2e040219 14126 emit_note (NOTE_INSN_DELETED);
178c3eff 14127
a3c9585f 14128 /* Expand INSN_ADDRESSES so final() doesn't crash. */
178c3eff
DJ
14129 {
14130 rtx insn;
14131 unsigned addr = 0;
14132 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
14133 {
14134 INSN_ADDRESSES_NEW (insn, addr);
14135 addr += 4;
14136 }
14137 }
9dda4cc8 14138
9ebbca7d 14139 if (TARGET_DEBUG_STACK)
a4f6c312 14140 debug_rtx_list (get_insns (), 100);
c9d691e9 14141 final (get_insns (), file, FALSE);
9ebbca7d 14142 end_sequence ();
979721f8
MM
14143 }
14144
9ebbca7d
GK
14145 rs6000_pic_labelno++;
14146}
f676971a 14147
9ebbca7d 14148/* Emit function epilogue as insns.
9878760c 14149
9ebbca7d
GK
14150 At present, dwarf2out_frame_debug_expr doesn't understand
14151 register restores, so we don't bother setting RTX_FRAME_RELATED_P
14152 anywhere in the epilogue. Most of the insns below would in any case
14153 need special notes to explain where r11 is in relation to the stack. */
9878760c 14154
9ebbca7d 14155void
a2369ed3 14156rs6000_emit_epilogue (int sibcall)
9ebbca7d
GK
14157{
14158 rs6000_stack_t *info;
14159 int restoring_FPRs_inline;
14160 int using_load_multiple;
14161 int using_mfcr_multiple;
14162 int use_backchain_to_restore_sp;
14163 int sp_offset = 0;
14164 rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
14165 rtx frame_reg_rtx = sp_reg_rtx;
0e67400a 14166 enum machine_mode reg_mode = Pmode;
327e5343 14167 int reg_size = TARGET_32BIT ? 4 : 8;
9ebbca7d
GK
14168 int i;
14169
c19de7aa
AH
14170 info = rs6000_stack_info ();
14171
14172 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
a3170dc6
AH
14173 {
14174 reg_mode = V2SImode;
14175 reg_size = 8;
14176 }
14177
9ebbca7d 14178 using_load_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
c19de7aa
AH
14179 && (!TARGET_SPE_ABI
14180 || info->spe_64bit_regs_used == 0)
6d0a8091
DJ
14181 && info->first_gp_reg_save < 31
14182 && no_global_regs_above (info->first_gp_reg_save));
9ebbca7d 14183 restoring_FPRs_inline = (sibcall
83720594 14184 || current_function_calls_eh_return
9ebbca7d
GK
14185 || info->first_fp_reg_save == 64
14186 || FP_SAVE_INLINE (info->first_fp_reg_save));
f676971a 14187 use_backchain_to_restore_sp = (frame_pointer_needed
9ebbca7d
GK
14188 || current_function_calls_alloca
14189 || info->total_size > 32767);
14190 using_mfcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
14191 || rs6000_cpu == PROCESSOR_PPC603
14192 || rs6000_cpu == PROCESSOR_PPC750
14193 || optimize_size);
14194
f57fe068 14195 if (WORLD_SAVE_P (info))
d62294f5
FJ
14196 {
14197 int i, j;
14198 char rname[30];
14199 const char *alloc_rname;
14200 rtvec p;
14201
14202 /* eh_rest_world_r10 will return to the location saved in the LR
c4ad648e
AM
14203 stack slot (which is not likely to be our caller.)
14204 Input: R10 -- stack adjustment. Clobbers R0, R11, R12, R7, R8.
14205 rest_world is similar, except any R10 parameter is ignored.
14206 The exception-handling stuff that was here in 2.95 is no
14207 longer necessary. */
d62294f5
FJ
14208
14209 p = rtvec_alloc (9
14210 + 1
f676971a 14211 + 32 - info->first_gp_reg_save
c4ad648e
AM
14212 + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
14213 + 63 + 1 - info->first_fp_reg_save);
d62294f5 14214
c4ad648e
AM
14215 strcpy (rname, ((current_function_calls_eh_return) ?
14216 "*eh_rest_world_r10" : "*rest_world"));
d62294f5
FJ
14217 alloc_rname = ggc_strdup (rname);
14218
14219 j = 0;
14220 RTVEC_ELT (p, j++) = gen_rtx_RETURN (VOIDmode);
14221 RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
c4ad648e
AM
14222 gen_rtx_REG (Pmode,
14223 LINK_REGISTER_REGNUM));
d62294f5 14224 RTVEC_ELT (p, j++)
c4ad648e 14225 = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, alloc_rname));
d62294f5 14226 /* The instruction pattern requires a clobber here;
c4ad648e 14227 it is shared with the restVEC helper. */
d62294f5 14228 RTVEC_ELT (p, j++)
c4ad648e 14229 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
d62294f5
FJ
14230
14231 {
c4ad648e
AM
14232 /* CR register traditionally saved as CR2. */
14233 rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
14234 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14235 GEN_INT (info->cr_save_offset));
14236 rtx mem = gen_rtx_MEM (reg_mode, addr);
14237 set_mem_alias_set (mem, rs6000_sr_alias_set);
14238
14239 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
d62294f5
FJ
14240 }
14241
14242 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
c4ad648e
AM
14243 {
14244 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
14245 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14246 GEN_INT (info->gp_save_offset
14247 + reg_size * i));
14248 rtx mem = gen_rtx_MEM (reg_mode, addr);
14249 set_mem_alias_set (mem, rs6000_sr_alias_set);
14250
14251 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
14252 }
d62294f5 14253 for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
c4ad648e
AM
14254 {
14255 rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
14256 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14257 GEN_INT (info->altivec_save_offset
14258 + 16 * i));
14259 rtx mem = gen_rtx_MEM (V4SImode, addr);
14260 set_mem_alias_set (mem, rs6000_sr_alias_set);
14261
14262 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
14263 }
d62294f5 14264 for (i = 0; info->first_fp_reg_save + i <= 63; i++)
c4ad648e
AM
14265 {
14266 rtx reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
14267 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14268 GEN_INT (info->fp_save_offset
14269 + 8 * i));
14270 rtx mem = gen_rtx_MEM (DFmode, addr);
14271 set_mem_alias_set (mem, rs6000_sr_alias_set);
14272
14273 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
14274 }
d62294f5 14275 RTVEC_ELT (p, j++)
c4ad648e 14276 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 0));
d62294f5 14277 RTVEC_ELT (p, j++)
c4ad648e 14278 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 12));
d62294f5 14279 RTVEC_ELT (p, j++)
c4ad648e 14280 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 7));
d62294f5 14281 RTVEC_ELT (p, j++)
c4ad648e 14282 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 8));
d62294f5 14283 RTVEC_ELT (p, j++)
c4ad648e 14284 = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
d62294f5
FJ
14285 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
14286
14287 return;
14288 }
14289
9ebbca7d
GK
14290 /* If we have a frame pointer, a call to alloca, or a large stack
14291 frame, restore the old stack pointer using the backchain. Otherwise,
14292 we know what size to update it with. */
14293 if (use_backchain_to_restore_sp)
bacbde18 14294 {
9ebbca7d
GK
14295 /* Under V.4, don't reset the stack pointer until after we're done
14296 loading the saved registers. */
f607bc57 14297 if (DEFAULT_ABI == ABI_V4)
9ebbca7d 14298 frame_reg_rtx = gen_rtx_REG (Pmode, 11);
4697a36c 14299
9ebbca7d
GK
14300 emit_move_insn (frame_reg_rtx,
14301 gen_rtx_MEM (Pmode, sp_reg_rtx));
f676971a 14302
bacbde18 14303 }
9ebbca7d 14304 else if (info->push_p)
85638c0d 14305 {
fc4767bb
JJ
14306 if (DEFAULT_ABI == ABI_V4
14307 || current_function_calls_eh_return)
9ebbca7d
GK
14308 sp_offset = info->total_size;
14309 else
14310 {
14311 emit_insn (TARGET_32BIT
14312 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
14313 GEN_INT (info->total_size))
14314 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
14315 GEN_INT (info->total_size)));
14316 }
85638c0d 14317 }
f676971a 14318
9aa86737
AH
14319 /* Restore AltiVec registers if needed. */
14320 if (TARGET_ALTIVEC_ABI && info->altivec_size != 0)
14321 {
14322 int i;
14323
14324 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
14325 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
14326 {
14327 rtx addr, areg, mem;
14328
14329 areg = gen_rtx_REG (Pmode, 0);
14330 emit_move_insn
14331 (areg, GEN_INT (info->altivec_save_offset
14332 + sp_offset
14333 + 16 * (i - info->first_altivec_reg_save)));
14334
14335 /* AltiVec addressing mode is [reg+reg]. */
14336 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
14337 mem = gen_rtx_MEM (V4SImode, addr);
14338 set_mem_alias_set (mem, rs6000_sr_alias_set);
14339
14340 emit_move_insn (gen_rtx_REG (V4SImode, i), mem);
14341 }
14342 }
14343
14344 /* Restore VRSAVE if needed. */
44688022 14345 if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
4d774ff8 14346 && info->vrsave_mask != 0)
9aa86737
AH
14347 {
14348 rtx addr, mem, reg;
14349
14350 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14351 GEN_INT (info->vrsave_save_offset + sp_offset));
14352 mem = gen_rtx_MEM (SImode, addr);
14353 set_mem_alias_set (mem, rs6000_sr_alias_set);
14354 reg = gen_rtx_REG (SImode, 12);
14355 emit_move_insn (reg, mem);
14356
14357 emit_insn (generate_set_vrsave (reg, info, 1));
14358 }
14359
9ebbca7d
GK
14360 /* Get the old lr if we saved it. */
14361 if (info->lr_save_p)
b6c9286a 14362 {
a3170dc6
AH
14363 rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
14364 info->lr_save_offset + sp_offset);
ba4828e0
RK
14365
14366 set_mem_alias_set (mem, rs6000_sr_alias_set);
b6c9286a 14367
9ebbca7d 14368 emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
b6c9286a 14369 }
f676971a 14370
9ebbca7d
GK
14371 /* Get the old cr if we saved it. */
14372 if (info->cr_save_p)
14373 {
14374 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14375 GEN_INT (info->cr_save_offset + sp_offset));
14376 rtx mem = gen_rtx_MEM (SImode, addr);
ba4828e0
RK
14377
14378 set_mem_alias_set (mem, rs6000_sr_alias_set);
b6c9286a 14379
9ebbca7d
GK
14380 emit_move_insn (gen_rtx_REG (SImode, 12), mem);
14381 }
f676971a 14382
9ebbca7d 14383 /* Set LR here to try to overlap restores below. */
4697a36c 14384 if (info->lr_save_p)
9ebbca7d
GK
14385 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM),
14386 gen_rtx_REG (Pmode, 0));
f676971a 14387
83720594
RH
14388 /* Load exception handler data registers, if needed. */
14389 if (current_function_calls_eh_return)
14390 {
78e1b90d
DE
14391 unsigned int i, regno;
14392
fc4767bb
JJ
14393 if (TARGET_AIX)
14394 {
14395 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14396 GEN_INT (sp_offset + 5 * reg_size));
14397 rtx mem = gen_rtx_MEM (reg_mode, addr);
14398
14399 set_mem_alias_set (mem, rs6000_sr_alias_set);
14400
14401 emit_move_insn (gen_rtx_REG (reg_mode, 2), mem);
14402 }
14403
83720594
RH
14404 for (i = 0; ; ++i)
14405 {
a3170dc6 14406 rtx mem;
83720594
RH
14407
14408 regno = EH_RETURN_DATA_REGNO (i);
14409 if (regno == INVALID_REGNUM)
14410 break;
14411
a3170dc6
AH
14412 mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
14413 info->ehrd_offset + sp_offset
14414 + reg_size * (int) i);
ba4828e0 14415 set_mem_alias_set (mem, rs6000_sr_alias_set);
83720594
RH
14416
14417 emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
14418 }
14419 }
f676971a 14420
9ebbca7d
GK
14421 /* Restore GPRs. This is done as a PARALLEL if we are using
14422 the load-multiple instructions. */
14423 if (using_load_multiple)
979721f8 14424 {
9ebbca7d
GK
14425 rtvec p;
14426 p = rtvec_alloc (32 - info->first_gp_reg_save);
14427 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
979721f8 14428 {
f676971a
EC
14429 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14430 GEN_INT (info->gp_save_offset
14431 + sp_offset
9ebbca7d
GK
14432 + reg_size * i));
14433 rtx mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0
RK
14434
14435 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d 14436
f676971a 14437 RTVEC_ELT (p, i) =
9ebbca7d
GK
14438 gen_rtx_SET (VOIDmode,
14439 gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
14440 mem);
979721f8 14441 }
9ebbca7d 14442 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
979721f8 14443 }
9ebbca7d
GK
14444 else
14445 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
6d0a8091
DJ
14446 if ((regs_ever_live[info->first_gp_reg_save + i]
14447 && (!call_used_regs[info->first_gp_reg_save + i]
14448 || (i + info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
b4db40bf 14449 && TARGET_TOC && TARGET_MINIMAL_TOC)))
6d0a8091 14450 || (i + info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
14f00213 14451 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
f607bc57 14452 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
9ebbca7d 14453 {
f676971a
EC
14454 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
14455 GEN_INT (info->gp_save_offset
14456 + sp_offset
9ebbca7d
GK
14457 + reg_size * i));
14458 rtx mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0 14459
a3170dc6 14460 /* Restore 64-bit quantities for SPE. */
c19de7aa 14461 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
a3170dc6
AH
14462 {
14463 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
14464 rtx b;
14465
14466 if (!SPE_CONST_OFFSET_OK (offset))
14467 {
14468 b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
14469 emit_move_insn (b, GEN_INT (offset));
14470 }
14471 else
14472 b = GEN_INT (offset);
14473
14474 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
14475 mem = gen_rtx_MEM (V2SImode, addr);
14476 }
14477
ba4828e0 14478 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d 14479
f676971a 14480 emit_move_insn (gen_rtx_REG (reg_mode,
a3170dc6 14481 info->first_gp_reg_save + i), mem);
9ebbca7d 14482 }
9878760c 14483
9ebbca7d
GK
14484 /* Restore fpr's if we need to do it without calling a function. */
14485 if (restoring_FPRs_inline)
14486 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
f676971a 14487 if ((regs_ever_live[info->first_fp_reg_save+i]
9ebbca7d
GK
14488 && ! call_used_regs[info->first_fp_reg_save+i]))
14489 {
14490 rtx addr, mem;
14491 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
f676971a
EC
14492 GEN_INT (info->fp_save_offset
14493 + sp_offset
a4f6c312 14494 + 8 * i));
9ebbca7d 14495 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 14496 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d 14497
f676971a 14498 emit_move_insn (gen_rtx_REG (DFmode,
9ebbca7d
GK
14499 info->first_fp_reg_save + i),
14500 mem);
14501 }
8d30c4ee 14502
9ebbca7d
GK
14503 /* If we saved cr, restore it here. Just those that were used. */
14504 if (info->cr_save_p)
979721f8 14505 {
9ebbca7d 14506 rtx r12_rtx = gen_rtx_REG (SImode, 12);
e35b9579 14507 int count = 0;
f676971a 14508
9ebbca7d 14509 if (using_mfcr_multiple)
979721f8 14510 {
9ebbca7d
GK
14511 for (i = 0; i < 8; i++)
14512 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
e35b9579 14513 count++;
37409796 14514 gcc_assert (count);
e35b9579
GK
14515 }
14516
14517 if (using_mfcr_multiple && count > 1)
14518 {
14519 rtvec p;
14520 int ndx;
f676971a 14521
e35b9579 14522 p = rtvec_alloc (count);
9ebbca7d 14523
e35b9579 14524 ndx = 0;
9ebbca7d
GK
14525 for (i = 0; i < 8; i++)
14526 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
14527 {
14528 rtvec r = rtvec_alloc (2);
14529 RTVEC_ELT (r, 0) = r12_rtx;
14530 RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
e35b9579 14531 RTVEC_ELT (p, ndx) =
f676971a 14532 gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
615158e2 14533 gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
e35b9579 14534 ndx++;
9ebbca7d
GK
14535 }
14536 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
37409796 14537 gcc_assert (ndx == count);
979721f8
MM
14538 }
14539 else
9ebbca7d
GK
14540 for (i = 0; i < 8; i++)
14541 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
979721f8 14542 {
f676971a 14543 emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
9ebbca7d
GK
14544 CR0_REGNO+i),
14545 r12_rtx));
979721f8 14546 }
979721f8
MM
14547 }
14548
9ebbca7d
GK
14549 /* If this is V.4, unwind the stack pointer after all of the loads
14550 have been done. We need to emit a block here so that sched
14551 doesn't decide to move the sp change before the register restores
14552 (which may not have any obvious dependency on the stack). This
14553 doesn't hurt performance, because there is no scheduling that can
14554 be done after this point. */
fc4767bb
JJ
14555 if (DEFAULT_ABI == ABI_V4
14556 || current_function_calls_eh_return)
b6c9286a 14557 {
9ebbca7d 14558 if (frame_reg_rtx != sp_reg_rtx)
c4ad648e 14559 rs6000_emit_stack_tie ();
b6c9286a 14560
9ebbca7d 14561 if (use_backchain_to_restore_sp)
b6c9286a 14562 {
9ebbca7d 14563 emit_move_insn (sp_reg_rtx, frame_reg_rtx);
b6c9286a 14564 }
9ebbca7d 14565 else if (sp_offset != 0)
13f1623b 14566 {
5b71a4e7 14567 emit_insn (TARGET_32BIT
9ebbca7d
GK
14568 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
14569 GEN_INT (sp_offset))
14570 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
14571 GEN_INT (sp_offset)));
13f1623b 14572 }
9ebbca7d 14573 }
b6c9286a 14574
83720594
RH
14575 if (current_function_calls_eh_return)
14576 {
14577 rtx sa = EH_RETURN_STACKADJ_RTX;
5b71a4e7 14578 emit_insn (TARGET_32BIT
83720594
RH
14579 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx, sa)
14580 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx, sa));
14581 }
14582
9ebbca7d
GK
14583 if (!sibcall)
14584 {
14585 rtvec p;
14586 if (! restoring_FPRs_inline)
14587 p = rtvec_alloc (3 + 64 - info->first_fp_reg_save);
14588 else
14589 p = rtvec_alloc (2);
b6c9286a 14590
e35b9579 14591 RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
f676971a
EC
14592 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
14593 gen_rtx_REG (Pmode,
9ebbca7d 14594 LINK_REGISTER_REGNUM));
9ebbca7d
GK
14595
14596 /* If we have to restore more than two FP registers, branch to the
14597 restore function. It will return to our caller. */
14598 if (! restoring_FPRs_inline)
14599 {
14600 int i;
14601 char rname[30];
520a57c8 14602 const char *alloc_rname;
979721f8 14603
f676971a 14604 sprintf (rname, "%s%d%s", RESTORE_FP_PREFIX,
9ebbca7d 14605 info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX);
a8a05998 14606 alloc_rname = ggc_strdup (rname);
9ebbca7d
GK
14607 RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode,
14608 gen_rtx_SYMBOL_REF (Pmode,
14609 alloc_rname));
b6c9286a 14610
9ebbca7d
GK
14611 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
14612 {
14613 rtx addr, mem;
14614 addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
14615 GEN_INT (info->fp_save_offset + 8*i));
14616 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 14617 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d 14618
f676971a 14619 RTVEC_ELT (p, i+3) =
9ebbca7d
GK
14620 gen_rtx_SET (VOIDmode,
14621 gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
14622 mem);
b6c9286a
MM
14623 }
14624 }
f676971a 14625
9ebbca7d 14626 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
3daf36a4 14627 }
9878760c
RK
14628}
14629
14630/* Write function epilogue. */
14631
08c148a8 14632static void
f676971a 14633rs6000_output_function_epilogue (FILE *file,
a2369ed3 14634 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9878760c 14635{
4697a36c 14636 rs6000_stack_t *info = rs6000_stack_info ();
9878760c 14637
9ebbca7d 14638 if (! HAVE_epilogue)
9878760c 14639 {
9ebbca7d
GK
14640 rtx insn = get_last_insn ();
14641 /* If the last insn was a BARRIER, we don't have to write anything except
14642 the trace table. */
14643 if (GET_CODE (insn) == NOTE)
14644 insn = prev_nonnote_insn (insn);
14645 if (insn == 0 || GET_CODE (insn) != BARRIER)
4697a36c 14646 {
9ebbca7d
GK
14647 /* This is slightly ugly, but at least we don't have two
14648 copies of the epilogue-emitting code. */
14649 start_sequence ();
14650
14651 /* A NOTE_INSN_DELETED is supposed to be at the start
14652 and end of the "toplevel" insn chain. */
2e040219 14653 emit_note (NOTE_INSN_DELETED);
9ebbca7d 14654 rs6000_emit_epilogue (FALSE);
2e040219 14655 emit_note (NOTE_INSN_DELETED);
9ebbca7d 14656
a3c9585f 14657 /* Expand INSN_ADDRESSES so final() doesn't crash. */
178c3eff
DJ
14658 {
14659 rtx insn;
14660 unsigned addr = 0;
14661 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
14662 {
14663 INSN_ADDRESSES_NEW (insn, addr);
14664 addr += 4;
14665 }
14666 }
14667
9ebbca7d 14668 if (TARGET_DEBUG_STACK)
a4f6c312 14669 debug_rtx_list (get_insns (), 100);
c9d691e9 14670 final (get_insns (), file, FALSE);
9ebbca7d 14671 end_sequence ();
4697a36c 14672 }
9878760c 14673 }
b4ac57ab 14674
efdba735
SH
14675#if TARGET_MACHO
14676 macho_branch_islands ();
0e5da0be
GK
14677 /* Mach-O doesn't support labels at the end of objects, so if
14678 it looks like we might want one, insert a NOP. */
14679 {
14680 rtx insn = get_last_insn ();
14681 while (insn
14682 && NOTE_P (insn)
14683 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED_LABEL)
14684 insn = PREV_INSN (insn);
f676971a
EC
14685 if (insn
14686 && (LABEL_P (insn)
0e5da0be
GK
14687 || (NOTE_P (insn)
14688 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL)))
14689 fputs ("\tnop\n", file);
14690 }
14691#endif
14692
9b30bae2 14693 /* Output a traceback table here. See /usr/include/sys/debug.h for info
314fc5a9
ILT
14694 on its format.
14695
14696 We don't output a traceback table if -finhibit-size-directive was
14697 used. The documentation for -finhibit-size-directive reads
14698 ``don't output a @code{.size} assembler directive, or anything
14699 else that would cause trouble if the function is split in the
14700 middle, and the two halves are placed at locations far apart in
14701 memory.'' The traceback table has this property, since it
14702 includes the offset from the start of the function to the
4d30c363
MM
14703 traceback table itself.
14704
14705 System V.4 Powerpc's (and the embedded ABI derived from it) use a
b6c9286a 14706 different traceback table. */
57ac7be9
AM
14707 if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
14708 && rs6000_traceback != traceback_none)
9b30bae2 14709 {
69c75916 14710 const char *fname = NULL;
3ac88239 14711 const char *language_string = lang_hooks.name;
6041bf2f 14712 int fixed_parms = 0, float_parms = 0, parm_info = 0;
314fc5a9 14713 int i;
57ac7be9
AM
14714 int optional_tbtab;
14715
14716 if (rs6000_traceback == traceback_full)
14717 optional_tbtab = 1;
14718 else if (rs6000_traceback == traceback_part)
14719 optional_tbtab = 0;
14720 else
14721 optional_tbtab = !optimize_size && !TARGET_ELF;
314fc5a9 14722
69c75916
AM
14723 if (optional_tbtab)
14724 {
14725 fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
14726 while (*fname == '.') /* V.4 encodes . in the name */
14727 fname++;
14728
14729 /* Need label immediately before tbtab, so we can compute
14730 its offset from the function start. */
14731 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
14732 ASM_OUTPUT_LABEL (file, fname);
14733 }
314fc5a9
ILT
14734
14735 /* The .tbtab pseudo-op can only be used for the first eight
14736 expressions, since it can't handle the possibly variable
14737 length fields that follow. However, if you omit the optional
14738 fields, the assembler outputs zeros for all optional fields
14739 anyways, giving each variable length field is minimum length
14740 (as defined in sys/debug.h). Thus we can not use the .tbtab
14741 pseudo-op at all. */
14742
14743 /* An all-zero word flags the start of the tbtab, for debuggers
14744 that have to find it by searching forward from the entry
14745 point or from the current pc. */
19d2d16f 14746 fputs ("\t.long 0\n", file);
314fc5a9
ILT
14747
14748 /* Tbtab format type. Use format type 0. */
19d2d16f 14749 fputs ("\t.byte 0,", file);
314fc5a9 14750
5fc921c1
DE
14751 /* Language type. Unfortunately, there does not seem to be any
14752 official way to discover the language being compiled, so we
14753 use language_string.
14754 C is 0. Fortran is 1. Pascal is 2. Ada is 3. C++ is 9.
14755 Java is 13. Objective-C is 14. */
14756 if (! strcmp (language_string, "GNU C"))
314fc5a9 14757 i = 0;
6de9cd9a
DN
14758 else if (! strcmp (language_string, "GNU F77")
14759 || ! strcmp (language_string, "GNU F95"))
314fc5a9 14760 i = 1;
8b83775b 14761 else if (! strcmp (language_string, "GNU Pascal"))
314fc5a9 14762 i = 2;
5fc921c1
DE
14763 else if (! strcmp (language_string, "GNU Ada"))
14764 i = 3;
314fc5a9
ILT
14765 else if (! strcmp (language_string, "GNU C++"))
14766 i = 9;
9517ead8
AG
14767 else if (! strcmp (language_string, "GNU Java"))
14768 i = 13;
5fc921c1
DE
14769 else if (! strcmp (language_string, "GNU Objective-C"))
14770 i = 14;
314fc5a9 14771 else
37409796 14772 gcc_unreachable ();
314fc5a9
ILT
14773 fprintf (file, "%d,", i);
14774
14775 /* 8 single bit fields: global linkage (not set for C extern linkage,
14776 apparently a PL/I convention?), out-of-line epilogue/prologue, offset
14777 from start of procedure stored in tbtab, internal function, function
14778 has controlled storage, function has no toc, function uses fp,
14779 function logs/aborts fp operations. */
14780 /* Assume that fp operations are used if any fp reg must be saved. */
6041bf2f
DE
14781 fprintf (file, "%d,",
14782 (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
314fc5a9
ILT
14783
14784 /* 6 bitfields: function is interrupt handler, name present in
14785 proc table, function calls alloca, on condition directives
14786 (controls stack walks, 3 bits), saves condition reg, saves
14787 link reg. */
14788 /* The `function calls alloca' bit seems to be set whenever reg 31 is
14789 set up as a frame pointer, even when there is no alloca call. */
14790 fprintf (file, "%d,",
6041bf2f
DE
14791 ((optional_tbtab << 6)
14792 | ((optional_tbtab & frame_pointer_needed) << 5)
14793 | (info->cr_save_p << 1)
14794 | (info->lr_save_p)));
314fc5a9 14795
6041bf2f 14796 /* 3 bitfields: saves backchain, fixup code, number of fpr saved
314fc5a9
ILT
14797 (6 bits). */
14798 fprintf (file, "%d,",
4697a36c 14799 (info->push_p << 7) | (64 - info->first_fp_reg_save));
314fc5a9
ILT
14800
14801 /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits). */
14802 fprintf (file, "%d,", (32 - first_reg_to_save ()));
14803
6041bf2f
DE
14804 if (optional_tbtab)
14805 {
14806 /* Compute the parameter info from the function decl argument
14807 list. */
14808 tree decl;
14809 int next_parm_info_bit = 31;
314fc5a9 14810
6041bf2f
DE
14811 for (decl = DECL_ARGUMENTS (current_function_decl);
14812 decl; decl = TREE_CHAIN (decl))
14813 {
14814 rtx parameter = DECL_INCOMING_RTL (decl);
14815 enum machine_mode mode = GET_MODE (parameter);
314fc5a9 14816
6041bf2f
DE
14817 if (GET_CODE (parameter) == REG)
14818 {
14819 if (GET_MODE_CLASS (mode) == MODE_FLOAT)
14820 {
14821 int bits;
14822
14823 float_parms++;
14824
37409796
NS
14825 switch (mode)
14826 {
14827 case SFmode:
14828 bits = 0x2;
14829 break;
14830
14831 case DFmode:
14832 case TFmode:
14833 bits = 0x3;
14834 break;
14835
14836 default:
14837 gcc_unreachable ();
14838 }
6041bf2f
DE
14839
14840 /* If only one bit will fit, don't or in this entry. */
14841 if (next_parm_info_bit > 0)
14842 parm_info |= (bits << (next_parm_info_bit - 1));
14843 next_parm_info_bit -= 2;
14844 }
14845 else
14846 {
14847 fixed_parms += ((GET_MODE_SIZE (mode)
14848 + (UNITS_PER_WORD - 1))
14849 / UNITS_PER_WORD);
14850 next_parm_info_bit -= 1;
14851 }
14852 }
14853 }
14854 }
314fc5a9
ILT
14855
14856 /* Number of fixed point parameters. */
14857 /* This is actually the number of words of fixed point parameters; thus
14858 an 8 byte struct counts as 2; and thus the maximum value is 8. */
14859 fprintf (file, "%d,", fixed_parms);
14860
14861 /* 2 bitfields: number of floating point parameters (7 bits), parameters
14862 all on stack. */
14863 /* This is actually the number of fp registers that hold parameters;
14864 and thus the maximum value is 13. */
14865 /* Set parameters on stack bit if parameters are not in their original
14866 registers, regardless of whether they are on the stack? Xlc
14867 seems to set the bit when not optimizing. */
14868 fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
14869
6041bf2f
DE
14870 if (! optional_tbtab)
14871 return;
14872
314fc5a9
ILT
14873 /* Optional fields follow. Some are variable length. */
14874
14875 /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
14876 11 double float. */
14877 /* There is an entry for each parameter in a register, in the order that
14878 they occur in the parameter list. Any intervening arguments on the
14879 stack are ignored. If the list overflows a long (max possible length
14880 34 bits) then completely leave off all elements that don't fit. */
14881 /* Only emit this long if there was at least one parameter. */
14882 if (fixed_parms || float_parms)
14883 fprintf (file, "\t.long %d\n", parm_info);
14884
14885 /* Offset from start of code to tb table. */
19d2d16f 14886 fputs ("\t.long ", file);
314fc5a9 14887 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
85b776df
AM
14888 if (TARGET_AIX)
14889 RS6000_OUTPUT_BASENAME (file, fname);
14890 else
14891 assemble_name (file, fname);
14892 putc ('-', file);
14893 rs6000_output_function_entry (file, fname);
19d2d16f 14894 putc ('\n', file);
314fc5a9
ILT
14895
14896 /* Interrupt handler mask. */
14897 /* Omit this long, since we never set the interrupt handler bit
14898 above. */
14899
14900 /* Number of CTL (controlled storage) anchors. */
14901 /* Omit this long, since the has_ctl bit is never set above. */
14902
14903 /* Displacement into stack of each CTL anchor. */
14904 /* Omit this list of longs, because there are no CTL anchors. */
14905
14906 /* Length of function name. */
69c75916
AM
14907 if (*fname == '*')
14908 ++fname;
296b8152 14909 fprintf (file, "\t.short %d\n", (int) strlen (fname));
314fc5a9
ILT
14910
14911 /* Function name. */
14912 assemble_string (fname, strlen (fname));
14913
14914 /* Register for alloca automatic storage; this is always reg 31.
14915 Only emit this if the alloca bit was set above. */
14916 if (frame_pointer_needed)
19d2d16f 14917 fputs ("\t.byte 31\n", file);
b1765bde
DE
14918
14919 fputs ("\t.align 2\n", file);
9b30bae2 14920 }
9878760c 14921}
17167fd8 14922\f
a4f6c312
SS
14923/* A C compound statement that outputs the assembler code for a thunk
14924 function, used to implement C++ virtual function calls with
14925 multiple inheritance. The thunk acts as a wrapper around a virtual
14926 function, adjusting the implicit object parameter before handing
14927 control off to the real function.
14928
14929 First, emit code to add the integer DELTA to the location that
14930 contains the incoming first argument. Assume that this argument
14931 contains a pointer, and is the one used to pass the `this' pointer
14932 in C++. This is the incoming argument *before* the function
14933 prologue, e.g. `%o0' on a sparc. The addition must preserve the
14934 values of all other incoming arguments.
17167fd8
MM
14935
14936 After the addition, emit code to jump to FUNCTION, which is a
a4f6c312
SS
14937 `FUNCTION_DECL'. This is a direct pure jump, not a call, and does
14938 not touch the return address. Hence returning from FUNCTION will
14939 return to whoever called the current `thunk'.
17167fd8 14940
a4f6c312
SS
14941 The effect must be as if FUNCTION had been called directly with the
14942 adjusted first argument. This macro is responsible for emitting
14943 all of the code for a thunk function; output_function_prologue()
14944 and output_function_epilogue() are not invoked.
17167fd8 14945
a4f6c312
SS
14946 The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already
14947 been extracted from it.) It might possibly be useful on some
14948 targets, but probably not.
17167fd8 14949
a4f6c312
SS
14950 If you do not define this macro, the target-independent code in the
14951 C++ frontend will generate a less efficient heavyweight thunk that
14952 calls FUNCTION instead of jumping to it. The generic approach does
14953 not support varargs. */
17167fd8 14954
3961e8fe 14955static void
f676971a
EC
14956rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
14957 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
a2369ed3 14958 tree function)
17167fd8 14959{
5b71a4e7 14960 rtx this, insn, funexp;
17167fd8 14961
5b71a4e7 14962 reload_completed = 1;
fe3ad572 14963 epilogue_completed = 1;
5b71a4e7 14964 no_new_pseudos = 1;
6429e3be 14965 reset_block_changes ();
56a7189a 14966
5b71a4e7 14967 /* Mark the end of the (empty) prologue. */
2e040219 14968 emit_note (NOTE_INSN_PROLOGUE_END);
17167fd8 14969
5b71a4e7
DE
14970 /* Find the "this" pointer. If the function returns a structure,
14971 the structure return pointer is in r3. */
61f71b34 14972 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
5b71a4e7 14973 this = gen_rtx_REG (Pmode, 4);
56a7189a 14974 else
5b71a4e7 14975 this = gen_rtx_REG (Pmode, 3);
17167fd8 14976
5b71a4e7
DE
14977 /* Apply the constant offset, if required. */
14978 if (delta)
14979 {
14980 rtx delta_rtx = GEN_INT (delta);
14981 emit_insn (TARGET_32BIT
14982 ? gen_addsi3 (this, this, delta_rtx)
14983 : gen_adddi3 (this, this, delta_rtx));
17167fd8
MM
14984 }
14985
5b71a4e7
DE
14986 /* Apply the offset from the vtable, if required. */
14987 if (vcall_offset)
17167fd8 14988 {
5b71a4e7
DE
14989 rtx vcall_offset_rtx = GEN_INT (vcall_offset);
14990 rtx tmp = gen_rtx_REG (Pmode, 12);
17167fd8 14991
5b71a4e7 14992 emit_move_insn (tmp, gen_rtx_MEM (Pmode, this));
eeff9307
JJ
14993 if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
14994 {
14995 emit_insn (TARGET_32BIT
14996 ? gen_addsi3 (tmp, tmp, vcall_offset_rtx)
14997 : gen_adddi3 (tmp, tmp, vcall_offset_rtx));
14998 emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
14999 }
15000 else
15001 {
15002 rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
15003
15004 emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
15005 }
5b71a4e7
DE
15006 emit_insn (TARGET_32BIT
15007 ? gen_addsi3 (this, this, tmp)
15008 : gen_adddi3 (this, this, tmp));
17167fd8
MM
15009 }
15010
5b71a4e7
DE
15011 /* Generate a tail call to the target function. */
15012 if (!TREE_USED (function))
15013 {
15014 assemble_external (function);
15015 TREE_USED (function) = 1;
15016 }
15017 funexp = XEXP (DECL_RTL (function), 0);
5b71a4e7 15018 funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
ee890fe2
SS
15019
15020#if TARGET_MACHO
ab82a49f 15021 if (MACHOPIC_INDIRECT)
5b71a4e7 15022 funexp = machopic_indirect_call_target (funexp);
ee890fe2 15023#endif
5b71a4e7
DE
15024
15025 /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
992d08b1 15026 generate sibcall RTL explicitly. */
5b71a4e7
DE
15027 insn = emit_call_insn (
15028 gen_rtx_PARALLEL (VOIDmode,
15029 gen_rtvec (4,
15030 gen_rtx_CALL (VOIDmode,
15031 funexp, const0_rtx),
15032 gen_rtx_USE (VOIDmode, const0_rtx),
15033 gen_rtx_USE (VOIDmode,
15034 gen_rtx_REG (SImode,
15035 LINK_REGISTER_REGNUM)),
15036 gen_rtx_RETURN (VOIDmode))));
15037 SIBLING_CALL_P (insn) = 1;
15038 emit_barrier ();
15039
15040 /* Run just enough of rest_of_compilation to get the insns emitted.
15041 There's not really enough bulk here to make other passes such as
15042 instruction scheduling worth while. Note that use_thunk calls
15043 assemble_start_function and assemble_end_function. */
15044 insn = get_insns ();
a2855205 15045 insn_locators_initialize ();
5b71a4e7
DE
15046 shorten_branches (insn);
15047 final_start_function (insn, file, 1);
c9d691e9 15048 final (insn, file, 1);
5b71a4e7
DE
15049 final_end_function ();
15050
15051 reload_completed = 0;
fe3ad572 15052 epilogue_completed = 0;
5b71a4e7 15053 no_new_pseudos = 0;
9ebbca7d 15054}
9ebbca7d
GK
15055\f
15056/* A quick summary of the various types of 'constant-pool tables'
15057 under PowerPC:
15058
f676971a 15059 Target Flags Name One table per
9ebbca7d
GK
15060 AIX (none) AIX TOC object file
15061 AIX -mfull-toc AIX TOC object file
15062 AIX -mminimal-toc AIX minimal TOC translation unit
15063 SVR4/EABI (none) SVR4 SDATA object file
15064 SVR4/EABI -fpic SVR4 pic object file
15065 SVR4/EABI -fPIC SVR4 PIC translation unit
15066 SVR4/EABI -mrelocatable EABI TOC function
15067 SVR4/EABI -maix AIX TOC object file
f676971a 15068 SVR4/EABI -maix -mminimal-toc
9ebbca7d
GK
15069 AIX minimal TOC translation unit
15070
15071 Name Reg. Set by entries contains:
15072 made by addrs? fp? sum?
15073
15074 AIX TOC 2 crt0 as Y option option
15075 AIX minimal TOC 30 prolog gcc Y Y option
15076 SVR4 SDATA 13 crt0 gcc N Y N
15077 SVR4 pic 30 prolog ld Y not yet N
15078 SVR4 PIC 30 prolog gcc Y option option
15079 EABI TOC 30 prolog gcc Y option option
15080
15081*/
15082
9ebbca7d
GK
15083/* Hash functions for the hash table. */
15084
15085static unsigned
a2369ed3 15086rs6000_hash_constant (rtx k)
9ebbca7d 15087{
46b33600
RH
15088 enum rtx_code code = GET_CODE (k);
15089 enum machine_mode mode = GET_MODE (k);
15090 unsigned result = (code << 3) ^ mode;
15091 const char *format;
15092 int flen, fidx;
f676971a 15093
46b33600
RH
15094 format = GET_RTX_FORMAT (code);
15095 flen = strlen (format);
15096 fidx = 0;
9ebbca7d 15097
46b33600
RH
15098 switch (code)
15099 {
15100 case LABEL_REF:
15101 return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
15102
15103 case CONST_DOUBLE:
15104 if (mode != VOIDmode)
15105 return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
15106 flen = 2;
15107 break;
15108
15109 case CODE_LABEL:
15110 fidx = 3;
15111 break;
15112
15113 default:
15114 break;
15115 }
9ebbca7d
GK
15116
15117 for (; fidx < flen; fidx++)
15118 switch (format[fidx])
15119 {
15120 case 's':
15121 {
15122 unsigned i, len;
15123 const char *str = XSTR (k, fidx);
15124 len = strlen (str);
15125 result = result * 613 + len;
15126 for (i = 0; i < len; i++)
15127 result = result * 613 + (unsigned) str[i];
17167fd8
MM
15128 break;
15129 }
9ebbca7d
GK
15130 case 'u':
15131 case 'e':
15132 result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
15133 break;
15134 case 'i':
15135 case 'n':
15136 result = result * 613 + (unsigned) XINT (k, fidx);
15137 break;
15138 case 'w':
15139 if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
15140 result = result * 613 + (unsigned) XWINT (k, fidx);
15141 else
15142 {
15143 size_t i;
9390387d 15144 for (i = 0; i < sizeof (HOST_WIDE_INT) / sizeof (unsigned); i++)
9ebbca7d
GK
15145 result = result * 613 + (unsigned) (XWINT (k, fidx)
15146 >> CHAR_BIT * i);
15147 }
15148 break;
09501938
DE
15149 case '0':
15150 break;
9ebbca7d 15151 default:
37409796 15152 gcc_unreachable ();
9ebbca7d 15153 }
46b33600 15154
9ebbca7d
GK
15155 return result;
15156}
15157
15158static unsigned
a2369ed3 15159toc_hash_function (const void *hash_entry)
9ebbca7d 15160{
f676971a 15161 const struct toc_hash_struct *thc =
a9098fd0
GK
15162 (const struct toc_hash_struct *) hash_entry;
15163 return rs6000_hash_constant (thc->key) ^ thc->key_mode;
9ebbca7d
GK
15164}
15165
15166/* Compare H1 and H2 for equivalence. */
15167
15168static int
a2369ed3 15169toc_hash_eq (const void *h1, const void *h2)
9ebbca7d
GK
15170{
15171 rtx r1 = ((const struct toc_hash_struct *) h1)->key;
15172 rtx r2 = ((const struct toc_hash_struct *) h2)->key;
15173
a9098fd0
GK
15174 if (((const struct toc_hash_struct *) h1)->key_mode
15175 != ((const struct toc_hash_struct *) h2)->key_mode)
15176 return 0;
15177
5692c7bc 15178 return rtx_equal_p (r1, r2);
9ebbca7d
GK
15179}
15180
28e510bd
MM
15181/* These are the names given by the C++ front-end to vtables, and
15182 vtable-like objects. Ideally, this logic should not be here;
15183 instead, there should be some programmatic way of inquiring as
15184 to whether or not an object is a vtable. */
15185
15186#define VTABLE_NAME_P(NAME) \
9390387d 15187 (strncmp ("_vt.", name, strlen ("_vt.")) == 0 \
28e510bd
MM
15188 || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0 \
15189 || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0 \
26be75db 15190 || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0 \
f676971a 15191 || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
28e510bd
MM
15192
15193void
a2369ed3 15194rs6000_output_symbol_ref (FILE *file, rtx x)
28e510bd
MM
15195{
15196 /* Currently C++ toc references to vtables can be emitted before it
15197 is decided whether the vtable is public or private. If this is
15198 the case, then the linker will eventually complain that there is
f676971a 15199 a reference to an unknown section. Thus, for vtables only,
28e510bd
MM
15200 we emit the TOC reference to reference the symbol and not the
15201 section. */
15202 const char *name = XSTR (x, 0);
54ee9799 15203
f676971a 15204 if (VTABLE_NAME_P (name))
54ee9799
DE
15205 {
15206 RS6000_OUTPUT_BASENAME (file, name);
15207 }
15208 else
15209 assemble_name (file, name);
28e510bd
MM
15210}
15211
a4f6c312
SS
15212/* Output a TOC entry. We derive the entry name from what is being
15213 written. */
9878760c
RK
15214
15215void
a2369ed3 15216output_toc (FILE *file, rtx x, int labelno, enum machine_mode mode)
9878760c
RK
15217{
15218 char buf[256];
3cce094d 15219 const char *name = buf;
ec940faa 15220 const char *real_name;
9878760c
RK
15221 rtx base = x;
15222 int offset = 0;
15223
37409796 15224 gcc_assert (!TARGET_NO_TOC);
4697a36c 15225
9ebbca7d
GK
15226 /* When the linker won't eliminate them, don't output duplicate
15227 TOC entries (this happens on AIX if there is any kind of TOC,
17211ab5
GK
15228 and on SVR4 under -fPIC or -mrelocatable). Don't do this for
15229 CODE_LABELs. */
15230 if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
9ebbca7d
GK
15231 {
15232 struct toc_hash_struct *h;
15233 void * * found;
f676971a 15234
17211ab5 15235 /* Create toc_hash_table. This can't be done at OVERRIDE_OPTIONS
c4ad648e 15236 time because GGC is not initialized at that point. */
17211ab5 15237 if (toc_hash_table == NULL)
f676971a 15238 toc_hash_table = htab_create_ggc (1021, toc_hash_function,
17211ab5
GK
15239 toc_hash_eq, NULL);
15240
9ebbca7d
GK
15241 h = ggc_alloc (sizeof (*h));
15242 h->key = x;
a9098fd0 15243 h->key_mode = mode;
9ebbca7d 15244 h->labelno = labelno;
f676971a 15245
9ebbca7d
GK
15246 found = htab_find_slot (toc_hash_table, h, 1);
15247 if (*found == NULL)
15248 *found = h;
f676971a 15249 else /* This is indeed a duplicate.
9ebbca7d
GK
15250 Set this label equal to that label. */
15251 {
15252 fputs ("\t.set ", file);
15253 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
15254 fprintf (file, "%d,", labelno);
15255 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
f676971a 15256 fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
9ebbca7d
GK
15257 found)->labelno));
15258 return;
15259 }
15260 }
15261
15262 /* If we're going to put a double constant in the TOC, make sure it's
15263 aligned properly when strict alignment is on. */
ff1720ed
RK
15264 if (GET_CODE (x) == CONST_DOUBLE
15265 && STRICT_ALIGNMENT
a9098fd0 15266 && GET_MODE_BITSIZE (mode) >= 64
ff1720ed
RK
15267 && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
15268 ASM_OUTPUT_ALIGN (file, 3);
15269 }
15270
4977bab6 15271 (*targetm.asm_out.internal_label) (file, "LC", labelno);
9878760c 15272
37c37a57
RK
15273 /* Handle FP constants specially. Note that if we have a minimal
15274 TOC, things we put here aren't actually in the TOC, so we can allow
15275 FP constants. */
fcce224d
DE
15276 if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == TFmode)
15277 {
15278 REAL_VALUE_TYPE rv;
15279 long k[4];
15280
15281 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
15282 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
15283
15284 if (TARGET_64BIT)
15285 {
15286 if (TARGET_MINIMAL_TOC)
15287 fputs (DOUBLE_INT_ASM_OP, file);
15288 else
15289 fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
15290 k[0] & 0xffffffff, k[1] & 0xffffffff,
15291 k[2] & 0xffffffff, k[3] & 0xffffffff);
15292 fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
15293 k[0] & 0xffffffff, k[1] & 0xffffffff,
15294 k[2] & 0xffffffff, k[3] & 0xffffffff);
15295 return;
15296 }
15297 else
15298 {
15299 if (TARGET_MINIMAL_TOC)
15300 fputs ("\t.long ", file);
15301 else
15302 fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
15303 k[0] & 0xffffffff, k[1] & 0xffffffff,
15304 k[2] & 0xffffffff, k[3] & 0xffffffff);
15305 fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
15306 k[0] & 0xffffffff, k[1] & 0xffffffff,
15307 k[2] & 0xffffffff, k[3] & 0xffffffff);
15308 return;
15309 }
15310 }
15311 else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
9878760c 15312 {
042259f2
DE
15313 REAL_VALUE_TYPE rv;
15314 long k[2];
0adc764e 15315
042259f2
DE
15316 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
15317 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
31bfaa0b 15318
13ded975
DE
15319 if (TARGET_64BIT)
15320 {
15321 if (TARGET_MINIMAL_TOC)
2bfcf297 15322 fputs (DOUBLE_INT_ASM_OP, file);
13ded975 15323 else
2f0552b6
AM
15324 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
15325 k[0] & 0xffffffff, k[1] & 0xffffffff);
15326 fprintf (file, "0x%lx%08lx\n",
15327 k[0] & 0xffffffff, k[1] & 0xffffffff);
13ded975
DE
15328 return;
15329 }
1875cc88 15330 else
13ded975
DE
15331 {
15332 if (TARGET_MINIMAL_TOC)
2bfcf297 15333 fputs ("\t.long ", file);
13ded975 15334 else
2f0552b6
AM
15335 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
15336 k[0] & 0xffffffff, k[1] & 0xffffffff);
15337 fprintf (file, "0x%lx,0x%lx\n",
15338 k[0] & 0xffffffff, k[1] & 0xffffffff);
13ded975
DE
15339 return;
15340 }
9878760c 15341 }
a9098fd0 15342 else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
9878760c 15343 {
042259f2
DE
15344 REAL_VALUE_TYPE rv;
15345 long l;
9878760c 15346
042259f2
DE
15347 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
15348 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
15349
31bfaa0b
DE
15350 if (TARGET_64BIT)
15351 {
15352 if (TARGET_MINIMAL_TOC)
2bfcf297 15353 fputs (DOUBLE_INT_ASM_OP, file);
31bfaa0b 15354 else
2f0552b6
AM
15355 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
15356 fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
31bfaa0b
DE
15357 return;
15358 }
042259f2 15359 else
31bfaa0b
DE
15360 {
15361 if (TARGET_MINIMAL_TOC)
2bfcf297 15362 fputs ("\t.long ", file);
31bfaa0b 15363 else
2f0552b6
AM
15364 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
15365 fprintf (file, "0x%lx\n", l & 0xffffffff);
31bfaa0b
DE
15366 return;
15367 }
042259f2 15368 }
f176e826 15369 else if (GET_MODE (x) == VOIDmode
a9098fd0 15370 && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
042259f2 15371 {
e2c953b6 15372 unsigned HOST_WIDE_INT low;
042259f2
DE
15373 HOST_WIDE_INT high;
15374
15375 if (GET_CODE (x) == CONST_DOUBLE)
15376 {
15377 low = CONST_DOUBLE_LOW (x);
15378 high = CONST_DOUBLE_HIGH (x);
15379 }
15380 else
15381#if HOST_BITS_PER_WIDE_INT == 32
15382 {
15383 low = INTVAL (x);
0858c623 15384 high = (low & 0x80000000) ? ~0 : 0;
042259f2
DE
15385 }
15386#else
15387 {
c4ad648e
AM
15388 low = INTVAL (x) & 0xffffffff;
15389 high = (HOST_WIDE_INT) INTVAL (x) >> 32;
042259f2
DE
15390 }
15391#endif
9878760c 15392
a9098fd0
GK
15393 /* TOC entries are always Pmode-sized, but since this
15394 is a bigendian machine then if we're putting smaller
15395 integer constants in the TOC we have to pad them.
15396 (This is still a win over putting the constants in
15397 a separate constant pool, because then we'd have
02a4ec28
FS
15398 to have both a TOC entry _and_ the actual constant.)
15399
15400 For a 32-bit target, CONST_INT values are loaded and shifted
15401 entirely within `low' and can be stored in one TOC entry. */
15402
37409796
NS
15403 /* It would be easy to make this work, but it doesn't now. */
15404 gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
02a4ec28
FS
15405
15406 if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
fb52d8de
AM
15407 {
15408#if HOST_BITS_PER_WIDE_INT == 32
15409 lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
15410 POINTER_SIZE, &low, &high, 0);
15411#else
15412 low |= high << 32;
15413 low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
15414 high = (HOST_WIDE_INT) low >> 32;
15415 low &= 0xffffffff;
15416#endif
15417 }
a9098fd0 15418
13ded975
DE
15419 if (TARGET_64BIT)
15420 {
15421 if (TARGET_MINIMAL_TOC)
2bfcf297 15422 fputs (DOUBLE_INT_ASM_OP, file);
13ded975 15423 else
2f0552b6
AM
15424 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
15425 (long) high & 0xffffffff, (long) low & 0xffffffff);
15426 fprintf (file, "0x%lx%08lx\n",
15427 (long) high & 0xffffffff, (long) low & 0xffffffff);
13ded975
DE
15428 return;
15429 }
1875cc88 15430 else
13ded975 15431 {
02a4ec28
FS
15432 if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
15433 {
15434 if (TARGET_MINIMAL_TOC)
2bfcf297 15435 fputs ("\t.long ", file);
02a4ec28 15436 else
2bfcf297 15437 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
2f0552b6
AM
15438 (long) high & 0xffffffff, (long) low & 0xffffffff);
15439 fprintf (file, "0x%lx,0x%lx\n",
15440 (long) high & 0xffffffff, (long) low & 0xffffffff);
02a4ec28 15441 }
13ded975 15442 else
02a4ec28
FS
15443 {
15444 if (TARGET_MINIMAL_TOC)
2bfcf297 15445 fputs ("\t.long ", file);
02a4ec28 15446 else
2f0552b6
AM
15447 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
15448 fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
02a4ec28 15449 }
13ded975
DE
15450 return;
15451 }
9878760c
RK
15452 }
15453
15454 if (GET_CODE (x) == CONST)
15455 {
37409796 15456 gcc_assert (GET_CODE (XEXP (x, 0)) == PLUS);
2bfcf297 15457
9878760c
RK
15458 base = XEXP (XEXP (x, 0), 0);
15459 offset = INTVAL (XEXP (XEXP (x, 0), 1));
15460 }
f676971a 15461
37409796
NS
15462 switch (GET_CODE (base))
15463 {
15464 case SYMBOL_REF:
15465 name = XSTR (base, 0);
15466 break;
15467
15468 case LABEL_REF:
15469 ASM_GENERATE_INTERNAL_LABEL (buf, "L",
15470 CODE_LABEL_NUMBER (XEXP (base, 0)));
15471 break;
15472
15473 case CODE_LABEL:
15474 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
15475 break;
15476
15477 default:
15478 gcc_unreachable ();
15479 }
9878760c 15480
772c5265 15481 real_name = (*targetm.strip_name_encoding) (name);
1875cc88 15482 if (TARGET_MINIMAL_TOC)
2bfcf297 15483 fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
1875cc88
JW
15484 else
15485 {
b6c9286a 15486 fprintf (file, "\t.tc %s", real_name);
9878760c 15487
1875cc88
JW
15488 if (offset < 0)
15489 fprintf (file, ".N%d", - offset);
15490 else if (offset)
15491 fprintf (file, ".P%d", offset);
9878760c 15492
19d2d16f 15493 fputs ("[TC],", file);
1875cc88 15494 }
581bc4de
MM
15495
15496 /* Currently C++ toc references to vtables can be emitted before it
15497 is decided whether the vtable is public or private. If this is
15498 the case, then the linker will eventually complain that there is
15499 a TOC reference to an unknown section. Thus, for vtables only,
15500 we emit the TOC reference to reference the symbol and not the
15501 section. */
28e510bd 15502 if (VTABLE_NAME_P (name))
581bc4de 15503 {
54ee9799 15504 RS6000_OUTPUT_BASENAME (file, name);
581bc4de
MM
15505 if (offset < 0)
15506 fprintf (file, "%d", offset);
15507 else if (offset > 0)
15508 fprintf (file, "+%d", offset);
15509 }
15510 else
15511 output_addr_const (file, x);
19d2d16f 15512 putc ('\n', file);
9878760c
RK
15513}
15514\f
15515/* Output an assembler pseudo-op to write an ASCII string of N characters
15516 starting at P to FILE.
15517
15518 On the RS/6000, we have to do this using the .byte operation and
15519 write out special characters outside the quoted string.
15520 Also, the assembler is broken; very long strings are truncated,
a4f6c312 15521 so we must artificially break them up early. */
9878760c
RK
15522
15523void
a2369ed3 15524output_ascii (FILE *file, const char *p, int n)
9878760c
RK
15525{
15526 char c;
15527 int i, count_string;
d330fd93
KG
15528 const char *for_string = "\t.byte \"";
15529 const char *for_decimal = "\t.byte ";
15530 const char *to_close = NULL;
9878760c
RK
15531
15532 count_string = 0;
15533 for (i = 0; i < n; i++)
15534 {
15535 c = *p++;
15536 if (c >= ' ' && c < 0177)
15537 {
15538 if (for_string)
15539 fputs (for_string, file);
15540 putc (c, file);
15541
15542 /* Write two quotes to get one. */
15543 if (c == '"')
15544 {
15545 putc (c, file);
15546 ++count_string;
15547 }
15548
15549 for_string = NULL;
15550 for_decimal = "\"\n\t.byte ";
15551 to_close = "\"\n";
15552 ++count_string;
15553
15554 if (count_string >= 512)
15555 {
15556 fputs (to_close, file);
15557
15558 for_string = "\t.byte \"";
15559 for_decimal = "\t.byte ";
15560 to_close = NULL;
15561 count_string = 0;
15562 }
15563 }
15564 else
15565 {
15566 if (for_decimal)
15567 fputs (for_decimal, file);
15568 fprintf (file, "%d", c);
15569
15570 for_string = "\n\t.byte \"";
15571 for_decimal = ", ";
15572 to_close = "\n";
15573 count_string = 0;
15574 }
15575 }
15576
15577 /* Now close the string if we have written one. Then end the line. */
15578 if (to_close)
9ebbca7d 15579 fputs (to_close, file);
9878760c
RK
15580}
15581\f
15582/* Generate a unique section name for FILENAME for a section type
15583 represented by SECTION_DESC. Output goes into BUF.
15584
15585 SECTION_DESC can be any string, as long as it is different for each
15586 possible section type.
15587
15588 We name the section in the same manner as xlc. The name begins with an
15589 underscore followed by the filename (after stripping any leading directory
11e5fe42
RK
15590 names) with the last period replaced by the string SECTION_DESC. If
15591 FILENAME does not contain a period, SECTION_DESC is appended to the end of
15592 the name. */
9878760c
RK
15593
15594void
f676971a 15595rs6000_gen_section_name (char **buf, const char *filename,
c4ad648e 15596 const char *section_desc)
9878760c 15597{
9ebbca7d 15598 const char *q, *after_last_slash, *last_period = 0;
9878760c
RK
15599 char *p;
15600 int len;
9878760c
RK
15601
15602 after_last_slash = filename;
15603 for (q = filename; *q; q++)
11e5fe42
RK
15604 {
15605 if (*q == '/')
15606 after_last_slash = q + 1;
15607 else if (*q == '.')
15608 last_period = q;
15609 }
9878760c 15610
11e5fe42 15611 len = strlen (after_last_slash) + strlen (section_desc) + 2;
6d9f628e 15612 *buf = (char *) xmalloc (len);
9878760c
RK
15613
15614 p = *buf;
15615 *p++ = '_';
15616
15617 for (q = after_last_slash; *q; q++)
15618 {
11e5fe42 15619 if (q == last_period)
c4ad648e 15620 {
9878760c
RK
15621 strcpy (p, section_desc);
15622 p += strlen (section_desc);
e3981aab 15623 break;
c4ad648e 15624 }
9878760c 15625
e9a780ec 15626 else if (ISALNUM (*q))
c4ad648e 15627 *p++ = *q;
9878760c
RK
15628 }
15629
11e5fe42 15630 if (last_period == 0)
9878760c
RK
15631 strcpy (p, section_desc);
15632 else
15633 *p = '\0';
15634}
e165f3f0 15635\f
a4f6c312 15636/* Emit profile function. */
411707f4 15637
411707f4 15638void
a2369ed3 15639output_profile_hook (int labelno ATTRIBUTE_UNUSED)
411707f4 15640{
858081ad
AH
15641 /* Non-standard profiling for kernels, which just saves LR then calls
15642 _mcount without worrying about arg saves. The idea is to change
15643 the function prologue as little as possible as it isn't easy to
15644 account for arg save/restore code added just for _mcount. */
ffcfcb5f
AM
15645 if (TARGET_PROFILE_KERNEL)
15646 return;
15647
8480e480
CC
15648 if (DEFAULT_ABI == ABI_AIX)
15649 {
9739c90c
JJ
15650#ifndef NO_PROFILE_COUNTERS
15651# define NO_PROFILE_COUNTERS 0
15652#endif
f676971a 15653 if (NO_PROFILE_COUNTERS)
9739c90c
JJ
15654 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 0);
15655 else
15656 {
15657 char buf[30];
15658 const char *label_name;
15659 rtx fun;
411707f4 15660
9739c90c
JJ
15661 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
15662 label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
15663 fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
411707f4 15664
9739c90c
JJ
15665 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 1,
15666 fun, Pmode);
15667 }
8480e480 15668 }
ee890fe2
SS
15669 else if (DEFAULT_ABI == ABI_DARWIN)
15670 {
d5fa86ba 15671 const char *mcount_name = RS6000_MCOUNT;
ee890fe2
SS
15672 int caller_addr_regno = LINK_REGISTER_REGNUM;
15673
15674 /* Be conservative and always set this, at least for now. */
15675 current_function_uses_pic_offset_table = 1;
15676
15677#if TARGET_MACHO
15678 /* For PIC code, set up a stub and collect the caller's address
15679 from r0, which is where the prologue puts it. */
11abc112
MM
15680 if (MACHOPIC_INDIRECT
15681 && current_function_uses_pic_offset_table)
15682 caller_addr_regno = 0;
ee890fe2
SS
15683#endif
15684 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
15685 0, VOIDmode, 1,
15686 gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
15687 }
411707f4
CC
15688}
15689
a4f6c312 15690/* Write function profiler code. */
e165f3f0
RK
15691
15692void
a2369ed3 15693output_function_profiler (FILE *file, int labelno)
e165f3f0 15694{
3daf36a4 15695 char buf[100];
e165f3f0 15696
38c1f2d7 15697 switch (DEFAULT_ABI)
3daf36a4 15698 {
38c1f2d7 15699 default:
37409796 15700 gcc_unreachable ();
38c1f2d7
MM
15701
15702 case ABI_V4:
09eeeacb
AM
15703 if (!TARGET_32BIT)
15704 {
d4ee4d25 15705 warning (0, "no profiling of 64-bit code for this ABI");
09eeeacb
AM
15706 return;
15707 }
ffcfcb5f 15708 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
38c1f2d7 15709 fprintf (file, "\tmflr %s\n", reg_names[0]);
71625f3d
AM
15710 if (NO_PROFILE_COUNTERS)
15711 {
15712 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
15713 reg_names[0], reg_names[1]);
15714 }
15715 else if (TARGET_SECURE_PLT && flag_pic)
15716 {
15717 asm_fprintf (file, "\tbcl 20,31,1f\n1:\n\t{st|stw} %s,4(%s)\n",
15718 reg_names[0], reg_names[1]);
15719 asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
15720 asm_fprintf (file, "\t{cau|addis} %s,%s,",
15721 reg_names[12], reg_names[12]);
15722 assemble_name (file, buf);
15723 asm_fprintf (file, "-1b@ha\n\t{cal|la} %s,", reg_names[0]);
15724 assemble_name (file, buf);
15725 asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
15726 }
15727 else if (flag_pic == 1)
38c1f2d7 15728 {
dfdfa60f 15729 fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
71625f3d
AM
15730 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
15731 reg_names[0], reg_names[1]);
17167fd8 15732 asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
dfdfa60f 15733 asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
38c1f2d7 15734 assemble_name (file, buf);
17167fd8 15735 asm_fprintf (file, "@got(%s)\n", reg_names[12]);
38c1f2d7 15736 }
9ebbca7d 15737 else if (flag_pic > 1)
38c1f2d7 15738 {
71625f3d
AM
15739 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
15740 reg_names[0], reg_names[1]);
9ebbca7d 15741 /* Now, we need to get the address of the label. */
71625f3d 15742 fputs ("\tbcl 20,31,1f\n\t.long ", file);
034e84c4 15743 assemble_name (file, buf);
9ebbca7d
GK
15744 fputs ("-.\n1:", file);
15745 asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
f676971a 15746 asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
9ebbca7d
GK
15747 reg_names[0], reg_names[11]);
15748 asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
15749 reg_names[0], reg_names[0], reg_names[11]);
38c1f2d7 15750 }
38c1f2d7
MM
15751 else
15752 {
17167fd8 15753 asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
38c1f2d7 15754 assemble_name (file, buf);
dfdfa60f 15755 fputs ("@ha\n", file);
71625f3d
AM
15756 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
15757 reg_names[0], reg_names[1]);
a260abc9 15758 asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
38c1f2d7 15759 assemble_name (file, buf);
17167fd8 15760 asm_fprintf (file, "@l(%s)\n", reg_names[12]);
38c1f2d7
MM
15761 }
15762
50d440bc 15763 /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH. */
3b6ce0af
DE
15764 fprintf (file, "\tbl %s%s\n",
15765 RS6000_MCOUNT, flag_pic ? "@plt" : "");
38c1f2d7
MM
15766 break;
15767
15768 case ABI_AIX:
ee890fe2 15769 case ABI_DARWIN:
ffcfcb5f
AM
15770 if (!TARGET_PROFILE_KERNEL)
15771 {
a3c9585f 15772 /* Don't do anything, done in output_profile_hook (). */
ffcfcb5f
AM
15773 }
15774 else
15775 {
37409796 15776 gcc_assert (!TARGET_32BIT);
ffcfcb5f
AM
15777
15778 asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
15779 asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
15780
6de9cd9a 15781 if (cfun->static_chain_decl != NULL)
ffcfcb5f
AM
15782 {
15783 asm_fprintf (file, "\tstd %s,24(%s)\n",
15784 reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
15785 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
15786 asm_fprintf (file, "\tld %s,24(%s)\n",
15787 reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
15788 }
15789 else
15790 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
15791 }
38c1f2d7
MM
15792 break;
15793 }
e165f3f0 15794}
a251ffd0 15795
b54cf83a 15796\f
b54cf83a
DE
15797/* Power4 load update and store update instructions are cracked into a
15798 load or store and an integer insn which are executed in the same cycle.
15799 Branches have their own dispatch slot which does not count against the
15800 GCC issue rate, but it changes the program flow so there are no other
15801 instructions to issue in this cycle. */
15802
15803static int
f676971a
EC
15804rs6000_variable_issue (FILE *stream ATTRIBUTE_UNUSED,
15805 int verbose ATTRIBUTE_UNUSED,
a2369ed3 15806 rtx insn, int more)
b54cf83a
DE
15807{
15808 if (GET_CODE (PATTERN (insn)) == USE
15809 || GET_CODE (PATTERN (insn)) == CLOBBER)
15810 return more;
15811
ec507f2d 15812 if (rs6000_sched_groups)
b54cf83a 15813 {
cbe26ab8 15814 if (is_microcoded_insn (insn))
c4ad648e 15815 return 0;
cbe26ab8 15816 else if (is_cracked_insn (insn))
c4ad648e 15817 return more > 2 ? more - 2 : 0;
b54cf83a 15818 }
165b263e
DE
15819
15820 return more - 1;
b54cf83a
DE
15821}
15822
a251ffd0
TG
15823/* Adjust the cost of a scheduling dependency. Return the new cost of
15824 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
15825
c237e94a 15826static int
0a4f0294 15827rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
a251ffd0
TG
15828{
15829 if (! recog_memoized (insn))
15830 return 0;
15831
15832 if (REG_NOTE_KIND (link) != 0)
15833 return 0;
15834
15835 if (REG_NOTE_KIND (link) == 0)
15836 {
ed947a96
DJ
15837 /* Data dependency; DEP_INSN writes a register that INSN reads
15838 some cycles later. */
c9dbf840
DE
15839
15840 /* Separate a load from a narrower, dependent store. */
15841 if (rs6000_sched_groups
15842 && GET_CODE (PATTERN (insn)) == SET
15843 && GET_CODE (PATTERN (dep_insn)) == SET
15844 && GET_CODE (XEXP (PATTERN (insn), 1)) == MEM
15845 && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == MEM
15846 && (GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (insn), 1)))
15847 > GET_MODE_SIZE (GET_MODE (XEXP (PATTERN (dep_insn), 0)))))
15848 return cost + 14;
15849
ed947a96
DJ
15850 switch (get_attr_type (insn))
15851 {
15852 case TYPE_JMPREG:
309323c2 15853 /* Tell the first scheduling pass about the latency between
ed947a96
DJ
15854 a mtctr and bctr (and mtlr and br/blr). The first
15855 scheduling pass will not know about this latency since
15856 the mtctr instruction, which has the latency associated
15857 to it, will be generated by reload. */
309323c2 15858 return TARGET_POWER ? 5 : 4;
ed947a96
DJ
15859 case TYPE_BRANCH:
15860 /* Leave some extra cycles between a compare and its
15861 dependent branch, to inhibit expensive mispredicts. */
309323c2
DE
15862 if ((rs6000_cpu_attr == CPU_PPC603
15863 || rs6000_cpu_attr == CPU_PPC604
15864 || rs6000_cpu_attr == CPU_PPC604E
15865 || rs6000_cpu_attr == CPU_PPC620
15866 || rs6000_cpu_attr == CPU_PPC630
15867 || rs6000_cpu_attr == CPU_PPC750
15868 || rs6000_cpu_attr == CPU_PPC7400
15869 || rs6000_cpu_attr == CPU_PPC7450
ec507f2d
DE
15870 || rs6000_cpu_attr == CPU_POWER4
15871 || rs6000_cpu_attr == CPU_POWER5)
ed947a96
DJ
15872 && recog_memoized (dep_insn)
15873 && (INSN_CODE (dep_insn) >= 0)
b54cf83a
DE
15874 && (get_attr_type (dep_insn) == TYPE_CMP
15875 || get_attr_type (dep_insn) == TYPE_COMPARE
ed947a96 15876 || get_attr_type (dep_insn) == TYPE_DELAYED_COMPARE
9259f3b0
DE
15877 || get_attr_type (dep_insn) == TYPE_IMUL_COMPARE
15878 || get_attr_type (dep_insn) == TYPE_LMUL_COMPARE
ed947a96 15879 || get_attr_type (dep_insn) == TYPE_FPCOMPARE
b54cf83a
DE
15880 || get_attr_type (dep_insn) == TYPE_CR_LOGICAL
15881 || get_attr_type (dep_insn) == TYPE_DELAYED_CR))
ed947a96
DJ
15882 return cost + 2;
15883 default:
15884 break;
15885 }
a251ffd0
TG
15886 /* Fall out to return default cost. */
15887 }
15888
15889 return cost;
15890}
b6c9286a 15891
cbe26ab8 15892/* The function returns a true if INSN is microcoded.
839a4992 15893 Return false otherwise. */
cbe26ab8
DN
15894
15895static bool
15896is_microcoded_insn (rtx insn)
15897{
15898 if (!insn || !INSN_P (insn)
15899 || GET_CODE (PATTERN (insn)) == USE
15900 || GET_CODE (PATTERN (insn)) == CLOBBER)
15901 return false;
15902
ec507f2d 15903 if (rs6000_sched_groups)
cbe26ab8
DN
15904 {
15905 enum attr_type type = get_attr_type (insn);
15906 if (type == TYPE_LOAD_EXT_U
15907 || type == TYPE_LOAD_EXT_UX
15908 || type == TYPE_LOAD_UX
15909 || type == TYPE_STORE_UX
15910 || type == TYPE_MFCR)
c4ad648e 15911 return true;
cbe26ab8
DN
15912 }
15913
15914 return false;
15915}
15916
5c425df5 15917/* The function returns a nonzero value if INSN can be scheduled only
cbe26ab8
DN
15918 as the first insn in a dispatch group ("dispatch-slot restricted").
15919 In this case, the returned value indicates how many dispatch slots
15920 the insn occupies (at the beginning of the group).
79ae11c4
DN
15921 Return 0 otherwise. */
15922
cbe26ab8 15923static int
79ae11c4
DN
15924is_dispatch_slot_restricted (rtx insn)
15925{
15926 enum attr_type type;
15927
ec507f2d 15928 if (!rs6000_sched_groups)
79ae11c4
DN
15929 return 0;
15930
15931 if (!insn
15932 || insn == NULL_RTX
15933 || GET_CODE (insn) == NOTE
15934 || GET_CODE (PATTERN (insn)) == USE
15935 || GET_CODE (PATTERN (insn)) == CLOBBER)
15936 return 0;
15937
15938 type = get_attr_type (insn);
15939
ec507f2d
DE
15940 switch (type)
15941 {
15942 case TYPE_MFCR:
15943 case TYPE_MFCRF:
15944 case TYPE_MTCR:
15945 case TYPE_DELAYED_CR:
15946 case TYPE_CR_LOGICAL:
15947 case TYPE_MTJMPR:
15948 case TYPE_MFJMPR:
15949 return 1;
15950 case TYPE_IDIV:
15951 case TYPE_LDIV:
15952 return 2;
b52110d4
DE
15953 case TYPE_LOAD_L:
15954 case TYPE_STORE_C:
15955 case TYPE_ISYNC:
15956 case TYPE_SYNC:
15957 return 4;
ec507f2d
DE
15958 default:
15959 if (rs6000_cpu == PROCESSOR_POWER5
15960 && is_cracked_insn (insn))
15961 return 2;
15962 return 0;
15963 }
79ae11c4
DN
15964}
15965
cbe26ab8
DN
15966/* The function returns true if INSN is cracked into 2 instructions
15967 by the processor (and therefore occupies 2 issue slots). */
15968
15969static bool
15970is_cracked_insn (rtx insn)
15971{
15972 if (!insn || !INSN_P (insn)
15973 || GET_CODE (PATTERN (insn)) == USE
15974 || GET_CODE (PATTERN (insn)) == CLOBBER)
15975 return false;
15976
ec507f2d 15977 if (rs6000_sched_groups)
cbe26ab8
DN
15978 {
15979 enum attr_type type = get_attr_type (insn);
15980 if (type == TYPE_LOAD_U || type == TYPE_STORE_U
c4ad648e
AM
15981 || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
15982 || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
15983 || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
15984 || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
15985 || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
15986 || type == TYPE_IDIV || type == TYPE_LDIV
15987 || type == TYPE_INSERT_WORD)
15988 return true;
cbe26ab8
DN
15989 }
15990
15991 return false;
15992}
15993
15994/* The function returns true if INSN can be issued only from
a3c9585f 15995 the branch slot. */
cbe26ab8
DN
15996
15997static bool
15998is_branch_slot_insn (rtx insn)
15999{
16000 if (!insn || !INSN_P (insn)
16001 || GET_CODE (PATTERN (insn)) == USE
16002 || GET_CODE (PATTERN (insn)) == CLOBBER)
16003 return false;
16004
ec507f2d 16005 if (rs6000_sched_groups)
cbe26ab8
DN
16006 {
16007 enum attr_type type = get_attr_type (insn);
16008 if (type == TYPE_BRANCH || type == TYPE_JMPREG)
f676971a 16009 return true;
cbe26ab8
DN
16010 return false;
16011 }
16012
16013 return false;
16014}
79ae11c4 16015
a4f6c312 16016/* A C statement (sans semicolon) to update the integer scheduling
79ae11c4
DN
16017 priority INSN_PRIORITY (INSN). Increase the priority to execute the
16018 INSN earlier, reduce the priority to execute INSN later. Do not
a4f6c312
SS
16019 define this macro if you do not need to adjust the scheduling
16020 priorities of insns. */
bef84347 16021
c237e94a 16022static int
a2369ed3 16023rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
bef84347 16024{
a4f6c312
SS
16025 /* On machines (like the 750) which have asymmetric integer units,
16026 where one integer unit can do multiply and divides and the other
16027 can't, reduce the priority of multiply/divide so it is scheduled
16028 before other integer operations. */
bef84347
VM
16029
16030#if 0
2c3c49de 16031 if (! INSN_P (insn))
bef84347
VM
16032 return priority;
16033
16034 if (GET_CODE (PATTERN (insn)) == USE)
16035 return priority;
16036
16037 switch (rs6000_cpu_attr) {
16038 case CPU_PPC750:
16039 switch (get_attr_type (insn))
16040 {
16041 default:
16042 break;
16043
16044 case TYPE_IMUL:
16045 case TYPE_IDIV:
3cb999d8
DE
16046 fprintf (stderr, "priority was %#x (%d) before adjustment\n",
16047 priority, priority);
bef84347
VM
16048 if (priority >= 0 && priority < 0x01000000)
16049 priority >>= 3;
16050 break;
16051 }
16052 }
16053#endif
16054
79ae11c4
DN
16055 if (is_dispatch_slot_restricted (insn)
16056 && reload_completed
f676971a 16057 && current_sched_info->sched_max_insns_priority
79ae11c4
DN
16058 && rs6000_sched_restricted_insns_priority)
16059 {
16060
c4ad648e
AM
16061 /* Prioritize insns that can be dispatched only in the first
16062 dispatch slot. */
79ae11c4 16063 if (rs6000_sched_restricted_insns_priority == 1)
f676971a
EC
16064 /* Attach highest priority to insn. This means that in
16065 haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
79ae11c4 16066 precede 'priority' (critical path) considerations. */
f676971a 16067 return current_sched_info->sched_max_insns_priority;
79ae11c4 16068 else if (rs6000_sched_restricted_insns_priority == 2)
f676971a 16069 /* Increase priority of insn by a minimal amount. This means that in
c4ad648e
AM
16070 haifa-sched.c:ready_sort(), only 'priority' (critical path)
16071 considerations precede dispatch-slot restriction considerations. */
f676971a
EC
16072 return (priority + 1);
16073 }
79ae11c4 16074
bef84347
VM
16075 return priority;
16076}
16077
a4f6c312
SS
16078/* Return how many instructions the machine can issue per cycle. */
16079
c237e94a 16080static int
863d938c 16081rs6000_issue_rate (void)
b6c9286a 16082{
3317bab1
DE
16083 /* Use issue rate of 1 for first scheduling pass to decrease degradation. */
16084 if (!reload_completed)
16085 return 1;
16086
b6c9286a 16087 switch (rs6000_cpu_attr) {
3cb999d8
DE
16088 case CPU_RIOS1: /* ? */
16089 case CPU_RS64A:
16090 case CPU_PPC601: /* ? */
ed947a96 16091 case CPU_PPC7450:
3cb999d8 16092 return 3;
b54cf83a 16093 case CPU_PPC440:
b6c9286a 16094 case CPU_PPC603:
bef84347 16095 case CPU_PPC750:
ed947a96 16096 case CPU_PPC7400:
be12c2b0 16097 case CPU_PPC8540:
f676971a 16098 return 2;
3cb999d8 16099 case CPU_RIOS2:
b6c9286a 16100 case CPU_PPC604:
19684119 16101 case CPU_PPC604E:
b6c9286a 16102 case CPU_PPC620:
3cb999d8 16103 case CPU_PPC630:
b6c9286a 16104 return 4;
cbe26ab8 16105 case CPU_POWER4:
ec507f2d 16106 case CPU_POWER5:
cbe26ab8 16107 return 5;
b6c9286a
MM
16108 default:
16109 return 1;
16110 }
16111}
16112
be12c2b0
VM
16113/* Return how many instructions to look ahead for better insn
16114 scheduling. */
16115
16116static int
863d938c 16117rs6000_use_sched_lookahead (void)
be12c2b0
VM
16118{
16119 if (rs6000_cpu_attr == CPU_PPC8540)
16120 return 4;
16121 return 0;
16122}
16123
569fa502
DN
16124/* Determine is PAT refers to memory. */
16125
16126static bool
16127is_mem_ref (rtx pat)
16128{
16129 const char * fmt;
16130 int i, j;
16131 bool ret = false;
16132
16133 if (GET_CODE (pat) == MEM)
16134 return true;
16135
16136 /* Recursively process the pattern. */
16137 fmt = GET_RTX_FORMAT (GET_CODE (pat));
16138
16139 for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0 && !ret; i--)
16140 {
16141 if (fmt[i] == 'e')
16142 ret |= is_mem_ref (XEXP (pat, i));
16143 else if (fmt[i] == 'E')
16144 for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
16145 ret |= is_mem_ref (XVECEXP (pat, i, j));
16146 }
16147
16148 return ret;
16149}
16150
16151/* Determine if PAT is a PATTERN of a load insn. */
f676971a 16152
569fa502
DN
16153static bool
16154is_load_insn1 (rtx pat)
16155{
16156 if (!pat || pat == NULL_RTX)
16157 return false;
16158
16159 if (GET_CODE (pat) == SET)
16160 return is_mem_ref (SET_SRC (pat));
16161
16162 if (GET_CODE (pat) == PARALLEL)
16163 {
16164 int i;
16165
16166 for (i = 0; i < XVECLEN (pat, 0); i++)
16167 if (is_load_insn1 (XVECEXP (pat, 0, i)))
16168 return true;
16169 }
16170
16171 return false;
16172}
16173
16174/* Determine if INSN loads from memory. */
16175
16176static bool
16177is_load_insn (rtx insn)
16178{
16179 if (!insn || !INSN_P (insn))
16180 return false;
16181
16182 if (GET_CODE (insn) == CALL_INSN)
16183 return false;
16184
16185 return is_load_insn1 (PATTERN (insn));
16186}
16187
16188/* Determine if PAT is a PATTERN of a store insn. */
16189
16190static bool
16191is_store_insn1 (rtx pat)
16192{
16193 if (!pat || pat == NULL_RTX)
16194 return false;
16195
16196 if (GET_CODE (pat) == SET)
16197 return is_mem_ref (SET_DEST (pat));
16198
16199 if (GET_CODE (pat) == PARALLEL)
16200 {
16201 int i;
16202
16203 for (i = 0; i < XVECLEN (pat, 0); i++)
16204 if (is_store_insn1 (XVECEXP (pat, 0, i)))
16205 return true;
16206 }
16207
16208 return false;
16209}
16210
16211/* Determine if INSN stores to memory. */
16212
16213static bool
16214is_store_insn (rtx insn)
16215{
16216 if (!insn || !INSN_P (insn))
16217 return false;
16218
16219 return is_store_insn1 (PATTERN (insn));
16220}
16221
16222/* Returns whether the dependence between INSN and NEXT is considered
16223 costly by the given target. */
16224
16225static bool
c4ad648e
AM
16226rs6000_is_costly_dependence (rtx insn, rtx next, rtx link, int cost,
16227 int distance)
f676971a 16228{
aabcd309 16229 /* If the flag is not enabled - no dependence is considered costly;
f676971a 16230 allow all dependent insns in the same group.
569fa502
DN
16231 This is the most aggressive option. */
16232 if (rs6000_sched_costly_dep == no_dep_costly)
16233 return false;
16234
f676971a 16235 /* If the flag is set to 1 - a dependence is always considered costly;
569fa502
DN
16236 do not allow dependent instructions in the same group.
16237 This is the most conservative option. */
16238 if (rs6000_sched_costly_dep == all_deps_costly)
f676971a 16239 return true;
569fa502 16240
f676971a
EC
16241 if (rs6000_sched_costly_dep == store_to_load_dep_costly
16242 && is_load_insn (next)
569fa502
DN
16243 && is_store_insn (insn))
16244 /* Prevent load after store in the same group. */
16245 return true;
16246
16247 if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
f676971a 16248 && is_load_insn (next)
569fa502
DN
16249 && is_store_insn (insn)
16250 && (!link || (int) REG_NOTE_KIND (link) == 0))
c4ad648e
AM
16251 /* Prevent load after store in the same group if it is a true
16252 dependence. */
569fa502 16253 return true;
f676971a
EC
16254
16255 /* The flag is set to X; dependences with latency >= X are considered costly,
569fa502
DN
16256 and will not be scheduled in the same group. */
16257 if (rs6000_sched_costly_dep <= max_dep_latency
16258 && ((cost - distance) >= (int)rs6000_sched_costly_dep))
16259 return true;
16260
16261 return false;
16262}
16263
f676971a 16264/* Return the next insn after INSN that is found before TAIL is reached,
cbe26ab8
DN
16265 skipping any "non-active" insns - insns that will not actually occupy
16266 an issue slot. Return NULL_RTX if such an insn is not found. */
16267
16268static rtx
16269get_next_active_insn (rtx insn, rtx tail)
16270{
16271 rtx next_insn;
16272
16273 if (!insn || insn == tail)
16274 return NULL_RTX;
16275
16276 next_insn = NEXT_INSN (insn);
16277
16278 while (next_insn
16279 && next_insn != tail
9390387d 16280 && (GET_CODE (next_insn) == NOTE
cbe26ab8
DN
16281 || GET_CODE (PATTERN (next_insn)) == USE
16282 || GET_CODE (PATTERN (next_insn)) == CLOBBER))
16283 {
16284 next_insn = NEXT_INSN (next_insn);
16285 }
16286
16287 if (!next_insn || next_insn == tail)
16288 return NULL_RTX;
16289
16290 return next_insn;
16291}
16292
839a4992 16293/* Return whether the presence of INSN causes a dispatch group termination
cbe26ab8
DN
16294 of group WHICH_GROUP.
16295
16296 If WHICH_GROUP == current_group, this function will return true if INSN
16297 causes the termination of the current group (i.e, the dispatch group to
16298 which INSN belongs). This means that INSN will be the last insn in the
16299 group it belongs to.
16300
16301 If WHICH_GROUP == previous_group, this function will return true if INSN
16302 causes the termination of the previous group (i.e, the dispatch group that
16303 precedes the group to which INSN belongs). This means that INSN will be
16304 the first insn in the group it belongs to). */
16305
16306static bool
16307insn_terminates_group_p (rtx insn, enum group_termination which_group)
16308{
16309 enum attr_type type;
16310
16311 if (! insn)
16312 return false;
569fa502 16313
cbe26ab8
DN
16314 type = get_attr_type (insn);
16315
16316 if (is_microcoded_insn (insn))
16317 return true;
16318
16319 if (which_group == current_group)
16320 {
16321 if (is_branch_slot_insn (insn))
c4ad648e 16322 return true;
cbe26ab8
DN
16323 return false;
16324 }
16325 else if (which_group == previous_group)
16326 {
16327 if (is_dispatch_slot_restricted (insn))
c4ad648e 16328 return true;
cbe26ab8
DN
16329 return false;
16330 }
16331
16332 return false;
16333}
16334
839a4992 16335/* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
cbe26ab8
DN
16336 dispatch group) from the insns in GROUP_INSNS. Return false otherwise. */
16337
16338static bool
16339is_costly_group (rtx *group_insns, rtx next_insn)
16340{
16341 int i;
16342 rtx link;
16343 int cost;
16344 int issue_rate = rs6000_issue_rate ();
16345
16346 for (i = 0; i < issue_rate; i++)
16347 {
16348 rtx insn = group_insns[i];
16349 if (!insn)
c4ad648e 16350 continue;
cbe26ab8 16351 for (link = INSN_DEPEND (insn); link != 0; link = XEXP (link, 1))
c4ad648e
AM
16352 {
16353 rtx next = XEXP (link, 0);
16354 if (next == next_insn)
16355 {
16356 cost = insn_cost (insn, link, next_insn);
16357 if (rs6000_is_costly_dependence (insn, next_insn, link, cost, 0))
16358 return true;
16359 }
16360 }
cbe26ab8
DN
16361 }
16362
16363 return false;
16364}
16365
f676971a 16366/* Utility of the function redefine_groups.
cbe26ab8
DN
16367 Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
16368 in the same dispatch group. If so, insert nops before NEXT_INSN, in order
16369 to keep it "far" (in a separate group) from GROUP_INSNS, following
16370 one of the following schemes, depending on the value of the flag
16371 -minsert_sched_nops = X:
16372 (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
839a4992 16373 in order to force NEXT_INSN into a separate group.
f676971a
EC
16374 (2) X < sched_finish_regroup_exact: insert exactly X nops.
16375 GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
cbe26ab8
DN
16376 insertion (has a group just ended, how many vacant issue slots remain in the
16377 last group, and how many dispatch groups were encountered so far). */
16378
f676971a 16379static int
c4ad648e
AM
16380force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
16381 rtx next_insn, bool *group_end, int can_issue_more,
16382 int *group_count)
cbe26ab8
DN
16383{
16384 rtx nop;
16385 bool force;
16386 int issue_rate = rs6000_issue_rate ();
16387 bool end = *group_end;
16388 int i;
16389
16390 if (next_insn == NULL_RTX)
16391 return can_issue_more;
16392
16393 if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
16394 return can_issue_more;
16395
16396 force = is_costly_group (group_insns, next_insn);
16397 if (!force)
16398 return can_issue_more;
16399
16400 if (sched_verbose > 6)
16401 fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
c4ad648e 16402 *group_count ,can_issue_more);
cbe26ab8
DN
16403
16404 if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
16405 {
16406 if (*group_end)
c4ad648e 16407 can_issue_more = 0;
cbe26ab8
DN
16408
16409 /* Since only a branch can be issued in the last issue_slot, it is
16410 sufficient to insert 'can_issue_more - 1' nops if next_insn is not
16411 a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
c4ad648e
AM
16412 in this case the last nop will start a new group and the branch
16413 will be forced to the new group. */
cbe26ab8 16414 if (can_issue_more && !is_branch_slot_insn (next_insn))
c4ad648e 16415 can_issue_more--;
cbe26ab8
DN
16416
16417 while (can_issue_more > 0)
c4ad648e 16418 {
9390387d 16419 nop = gen_nop ();
c4ad648e
AM
16420 emit_insn_before (nop, next_insn);
16421 can_issue_more--;
16422 }
cbe26ab8
DN
16423
16424 *group_end = true;
16425 return 0;
f676971a 16426 }
cbe26ab8
DN
16427
16428 if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
16429 {
16430 int n_nops = rs6000_sched_insert_nops;
16431
f676971a 16432 /* Nops can't be issued from the branch slot, so the effective
c4ad648e 16433 issue_rate for nops is 'issue_rate - 1'. */
cbe26ab8 16434 if (can_issue_more == 0)
c4ad648e 16435 can_issue_more = issue_rate;
cbe26ab8
DN
16436 can_issue_more--;
16437 if (can_issue_more == 0)
c4ad648e
AM
16438 {
16439 can_issue_more = issue_rate - 1;
16440 (*group_count)++;
16441 end = true;
16442 for (i = 0; i < issue_rate; i++)
16443 {
16444 group_insns[i] = 0;
16445 }
16446 }
cbe26ab8
DN
16447
16448 while (n_nops > 0)
c4ad648e
AM
16449 {
16450 nop = gen_nop ();
16451 emit_insn_before (nop, next_insn);
16452 if (can_issue_more == issue_rate - 1) /* new group begins */
16453 end = false;
16454 can_issue_more--;
16455 if (can_issue_more == 0)
16456 {
16457 can_issue_more = issue_rate - 1;
16458 (*group_count)++;
16459 end = true;
16460 for (i = 0; i < issue_rate; i++)
16461 {
16462 group_insns[i] = 0;
16463 }
16464 }
16465 n_nops--;
16466 }
cbe26ab8
DN
16467
16468 /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1'). */
f676971a 16469 can_issue_more++;
cbe26ab8 16470
c4ad648e
AM
16471 /* Is next_insn going to start a new group? */
16472 *group_end
16473 = (end
cbe26ab8
DN
16474 || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
16475 || (can_issue_more <= 2 && is_cracked_insn (next_insn))
16476 || (can_issue_more < issue_rate &&
c4ad648e 16477 insn_terminates_group_p (next_insn, previous_group)));
cbe26ab8 16478 if (*group_end && end)
c4ad648e 16479 (*group_count)--;
cbe26ab8
DN
16480
16481 if (sched_verbose > 6)
c4ad648e
AM
16482 fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
16483 *group_count, can_issue_more);
f676971a
EC
16484 return can_issue_more;
16485 }
cbe26ab8
DN
16486
16487 return can_issue_more;
16488}
16489
16490/* This function tries to synch the dispatch groups that the compiler "sees"
f676971a 16491 with the dispatch groups that the processor dispatcher is expected to
cbe26ab8
DN
16492 form in practice. It tries to achieve this synchronization by forcing the
16493 estimated processor grouping on the compiler (as opposed to the function
16494 'pad_goups' which tries to force the scheduler's grouping on the processor).
16495
16496 The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
16497 examines the (estimated) dispatch groups that will be formed by the processor
16498 dispatcher. It marks these group boundaries to reflect the estimated
16499 processor grouping, overriding the grouping that the scheduler had marked.
16500 Depending on the value of the flag '-minsert-sched-nops' this function can
16501 force certain insns into separate groups or force a certain distance between
16502 them by inserting nops, for example, if there exists a "costly dependence"
16503 between the insns.
16504
16505 The function estimates the group boundaries that the processor will form as
0fa2e4df 16506 follows: It keeps track of how many vacant issue slots are available after
cbe26ab8
DN
16507 each insn. A subsequent insn will start a new group if one of the following
16508 4 cases applies:
16509 - no more vacant issue slots remain in the current dispatch group.
16510 - only the last issue slot, which is the branch slot, is vacant, but the next
16511 insn is not a branch.
16512 - only the last 2 or less issue slots, including the branch slot, are vacant,
16513 which means that a cracked insn (which occupies two issue slots) can't be
16514 issued in this group.
f676971a 16515 - less than 'issue_rate' slots are vacant, and the next insn always needs to
cbe26ab8
DN
16516 start a new group. */
16517
16518static int
16519redefine_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
16520{
16521 rtx insn, next_insn;
16522 int issue_rate;
16523 int can_issue_more;
16524 int slot, i;
16525 bool group_end;
16526 int group_count = 0;
16527 rtx *group_insns;
16528
16529 /* Initialize. */
16530 issue_rate = rs6000_issue_rate ();
16531 group_insns = alloca (issue_rate * sizeof (rtx));
f676971a 16532 for (i = 0; i < issue_rate; i++)
cbe26ab8
DN
16533 {
16534 group_insns[i] = 0;
16535 }
16536 can_issue_more = issue_rate;
16537 slot = 0;
16538 insn = get_next_active_insn (prev_head_insn, tail);
16539 group_end = false;
16540
16541 while (insn != NULL_RTX)
16542 {
16543 slot = (issue_rate - can_issue_more);
16544 group_insns[slot] = insn;
16545 can_issue_more =
c4ad648e 16546 rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
cbe26ab8 16547 if (insn_terminates_group_p (insn, current_group))
c4ad648e 16548 can_issue_more = 0;
cbe26ab8
DN
16549
16550 next_insn = get_next_active_insn (insn, tail);
16551 if (next_insn == NULL_RTX)
c4ad648e 16552 return group_count + 1;
cbe26ab8 16553
c4ad648e
AM
16554 /* Is next_insn going to start a new group? */
16555 group_end
16556 = (can_issue_more == 0
16557 || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
16558 || (can_issue_more <= 2 && is_cracked_insn (next_insn))
16559 || (can_issue_more < issue_rate &&
16560 insn_terminates_group_p (next_insn, previous_group)));
cbe26ab8 16561
f676971a 16562 can_issue_more = force_new_group (sched_verbose, dump, group_insns,
c4ad648e
AM
16563 next_insn, &group_end, can_issue_more,
16564 &group_count);
cbe26ab8
DN
16565
16566 if (group_end)
c4ad648e
AM
16567 {
16568 group_count++;
16569 can_issue_more = 0;
16570 for (i = 0; i < issue_rate; i++)
16571 {
16572 group_insns[i] = 0;
16573 }
16574 }
cbe26ab8
DN
16575
16576 if (GET_MODE (next_insn) == TImode && can_issue_more)
9390387d 16577 PUT_MODE (next_insn, VOIDmode);
cbe26ab8 16578 else if (!can_issue_more && GET_MODE (next_insn) != TImode)
c4ad648e 16579 PUT_MODE (next_insn, TImode);
cbe26ab8
DN
16580
16581 insn = next_insn;
16582 if (can_issue_more == 0)
c4ad648e
AM
16583 can_issue_more = issue_rate;
16584 } /* while */
cbe26ab8
DN
16585
16586 return group_count;
16587}
16588
16589/* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
16590 dispatch group boundaries that the scheduler had marked. Pad with nops
16591 any dispatch groups which have vacant issue slots, in order to force the
16592 scheduler's grouping on the processor dispatcher. The function
16593 returns the number of dispatch groups found. */
16594
16595static int
16596pad_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
16597{
16598 rtx insn, next_insn;
16599 rtx nop;
16600 int issue_rate;
16601 int can_issue_more;
16602 int group_end;
16603 int group_count = 0;
16604
16605 /* Initialize issue_rate. */
16606 issue_rate = rs6000_issue_rate ();
16607 can_issue_more = issue_rate;
16608
16609 insn = get_next_active_insn (prev_head_insn, tail);
16610 next_insn = get_next_active_insn (insn, tail);
16611
16612 while (insn != NULL_RTX)
16613 {
16614 can_issue_more =
16615 rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
16616
16617 group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
16618
16619 if (next_insn == NULL_RTX)
c4ad648e 16620 break;
cbe26ab8
DN
16621
16622 if (group_end)
c4ad648e
AM
16623 {
16624 /* If the scheduler had marked group termination at this location
16625 (between insn and next_indn), and neither insn nor next_insn will
16626 force group termination, pad the group with nops to force group
16627 termination. */
16628 if (can_issue_more
16629 && (rs6000_sched_insert_nops == sched_finish_pad_groups)
16630 && !insn_terminates_group_p (insn, current_group)
16631 && !insn_terminates_group_p (next_insn, previous_group))
16632 {
9390387d 16633 if (!is_branch_slot_insn (next_insn))
c4ad648e
AM
16634 can_issue_more--;
16635
16636 while (can_issue_more)
16637 {
16638 nop = gen_nop ();
16639 emit_insn_before (nop, next_insn);
16640 can_issue_more--;
16641 }
16642 }
16643
16644 can_issue_more = issue_rate;
16645 group_count++;
16646 }
cbe26ab8
DN
16647
16648 insn = next_insn;
16649 next_insn = get_next_active_insn (insn, tail);
16650 }
16651
16652 return group_count;
16653}
16654
16655/* The following function is called at the end of scheduling BB.
16656 After reload, it inserts nops at insn group bundling. */
16657
16658static void
38f391a5 16659rs6000_sched_finish (FILE *dump, int sched_verbose)
cbe26ab8
DN
16660{
16661 int n_groups;
16662
16663 if (sched_verbose)
16664 fprintf (dump, "=== Finishing schedule.\n");
16665
ec507f2d 16666 if (reload_completed && rs6000_sched_groups)
cbe26ab8
DN
16667 {
16668 if (rs6000_sched_insert_nops == sched_finish_none)
c4ad648e 16669 return;
cbe26ab8
DN
16670
16671 if (rs6000_sched_insert_nops == sched_finish_pad_groups)
c4ad648e
AM
16672 n_groups = pad_groups (dump, sched_verbose,
16673 current_sched_info->prev_head,
16674 current_sched_info->next_tail);
cbe26ab8 16675 else
c4ad648e
AM
16676 n_groups = redefine_groups (dump, sched_verbose,
16677 current_sched_info->prev_head,
16678 current_sched_info->next_tail);
cbe26ab8
DN
16679
16680 if (sched_verbose >= 6)
16681 {
16682 fprintf (dump, "ngroups = %d\n", n_groups);
16683 print_rtl (dump, current_sched_info->prev_head);
16684 fprintf (dump, "Done finish_sched\n");
16685 }
16686 }
16687}
b6c9286a 16688\f
b6c9286a
MM
16689/* Length in units of the trampoline for entering a nested function. */
16690
16691int
863d938c 16692rs6000_trampoline_size (void)
b6c9286a
MM
16693{
16694 int ret = 0;
16695
16696 switch (DEFAULT_ABI)
16697 {
16698 default:
37409796 16699 gcc_unreachable ();
b6c9286a
MM
16700
16701 case ABI_AIX:
8f802bfb 16702 ret = (TARGET_32BIT) ? 12 : 24;
b6c9286a
MM
16703 break;
16704
4dabc42d 16705 case ABI_DARWIN:
b6c9286a 16706 case ABI_V4:
03a7e1a5 16707 ret = (TARGET_32BIT) ? 40 : 48;
b6c9286a 16708 break;
b6c9286a
MM
16709 }
16710
16711 return ret;
16712}
16713
16714/* Emit RTL insns to initialize the variable parts of a trampoline.
16715 FNADDR is an RTX for the address of the function's pure code.
16716 CXT is an RTX for the static chain value for the function. */
16717
16718void
a2369ed3 16719rs6000_initialize_trampoline (rtx addr, rtx fnaddr, rtx cxt)
b6c9286a 16720{
ac2a93a1 16721 enum machine_mode pmode = Pmode;
8bd04c56
MM
16722 int regsize = (TARGET_32BIT) ? 4 : 8;
16723 rtx ctx_reg = force_reg (pmode, cxt);
b6c9286a
MM
16724
16725 switch (DEFAULT_ABI)
16726 {
16727 default:
37409796 16728 gcc_unreachable ();
b6c9286a 16729
8bd04c56 16730/* Macros to shorten the code expansions below. */
39403d82 16731#define MEM_DEREF(addr) gen_rtx_MEM (pmode, memory_address (pmode, addr))
c5c76735
JL
16732#define MEM_PLUS(addr,offset) \
16733 gen_rtx_MEM (pmode, memory_address (pmode, plus_constant (addr, offset)))
7c59dc5d 16734
b6c9286a
MM
16735 /* Under AIX, just build the 3 word function descriptor */
16736 case ABI_AIX:
8bd04c56
MM
16737 {
16738 rtx fn_reg = gen_reg_rtx (pmode);
16739 rtx toc_reg = gen_reg_rtx (pmode);
16740 emit_move_insn (fn_reg, MEM_DEREF (fnaddr));
1cb18e3c 16741 emit_move_insn (toc_reg, MEM_PLUS (fnaddr, regsize));
8bd04c56
MM
16742 emit_move_insn (MEM_DEREF (addr), fn_reg);
16743 emit_move_insn (MEM_PLUS (addr, regsize), toc_reg);
16744 emit_move_insn (MEM_PLUS (addr, 2*regsize), ctx_reg);
16745 }
b6c9286a
MM
16746 break;
16747
4dabc42d
TC
16748 /* Under V.4/eabi/darwin, __trampoline_setup does the real work. */
16749 case ABI_DARWIN:
b6c9286a 16750 case ABI_V4:
39403d82 16751 emit_library_call (gen_rtx_SYMBOL_REF (SImode, "__trampoline_setup"),
eaf1bcf1
MM
16752 FALSE, VOIDmode, 4,
16753 addr, pmode,
16754 GEN_INT (rs6000_trampoline_size ()), SImode,
16755 fnaddr, pmode,
16756 ctx_reg, pmode);
b6c9286a 16757 break;
b6c9286a
MM
16758 }
16759
16760 return;
16761}
7509c759
MM
16762
16763\f
91d231cb 16764/* Table of valid machine attributes. */
a4f6c312 16765
91d231cb 16766const struct attribute_spec rs6000_attribute_table[] =
7509c759 16767{
91d231cb 16768 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
8bb418a3 16769 { "altivec", 1, 1, false, true, false, rs6000_handle_altivec_attribute },
a5c76ee6
ZW
16770 { "longcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
16771 { "shortcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
005c1a13
GK
16772#ifdef SUBTARGET_ATTRIBUTE_TABLE
16773 SUBTARGET_ATTRIBUTE_TABLE,
16774#endif
a5c76ee6 16775 { NULL, 0, 0, false, false, false, NULL }
91d231cb 16776};
7509c759 16777
8bb418a3
ZL
16778/* Handle the "altivec" attribute. The attribute may have
16779 arguments as follows:
f676971a 16780
8bb418a3
ZL
16781 __attribute__((altivec(vector__)))
16782 __attribute__((altivec(pixel__))) (always followed by 'unsigned short')
16783 __attribute__((altivec(bool__))) (always followed by 'unsigned')
16784
16785 and may appear more than once (e.g., 'vector bool char') in a
16786 given declaration. */
16787
16788static tree
f90ac3f0
UP
16789rs6000_handle_altivec_attribute (tree *node,
16790 tree name ATTRIBUTE_UNUSED,
16791 tree args,
8bb418a3
ZL
16792 int flags ATTRIBUTE_UNUSED,
16793 bool *no_add_attrs)
16794{
16795 tree type = *node, result = NULL_TREE;
16796 enum machine_mode mode;
16797 int unsigned_p;
16798 char altivec_type
16799 = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
16800 && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
16801 ? *IDENTIFIER_POINTER (TREE_VALUE (args))
f676971a 16802 : '?');
8bb418a3
ZL
16803
16804 while (POINTER_TYPE_P (type)
16805 || TREE_CODE (type) == FUNCTION_TYPE
16806 || TREE_CODE (type) == METHOD_TYPE
16807 || TREE_CODE (type) == ARRAY_TYPE)
16808 type = TREE_TYPE (type);
16809
16810 mode = TYPE_MODE (type);
16811
f90ac3f0
UP
16812 /* Check for invalid AltiVec type qualifiers. */
16813 if (type == long_unsigned_type_node || type == long_integer_type_node)
16814 {
16815 if (TARGET_64BIT)
16816 error ("use of %<long%> in AltiVec types is invalid for 64-bit code");
16817 else if (rs6000_warn_altivec_long)
d4ee4d25 16818 warning (0, "use of %<long%> in AltiVec types is deprecated; use %<int%>");
f90ac3f0
UP
16819 }
16820 else if (type == long_long_unsigned_type_node
16821 || type == long_long_integer_type_node)
16822 error ("use of %<long long%> in AltiVec types is invalid");
16823 else if (type == double_type_node)
16824 error ("use of %<double%> in AltiVec types is invalid");
16825 else if (type == long_double_type_node)
16826 error ("use of %<long double%> in AltiVec types is invalid");
16827 else if (type == boolean_type_node)
16828 error ("use of boolean types in AltiVec types is invalid");
16829 else if (TREE_CODE (type) == COMPLEX_TYPE)
16830 error ("use of %<complex%> in AltiVec types is invalid");
8bb418a3
ZL
16831
16832 switch (altivec_type)
16833 {
16834 case 'v':
8df83eae 16835 unsigned_p = TYPE_UNSIGNED (type);
8bb418a3
ZL
16836 switch (mode)
16837 {
c4ad648e
AM
16838 case SImode:
16839 result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
16840 break;
16841 case HImode:
16842 result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
16843 break;
16844 case QImode:
16845 result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
16846 break;
16847 case SFmode: result = V4SF_type_node; break;
16848 /* If the user says 'vector int bool', we may be handed the 'bool'
16849 attribute _before_ the 'vector' attribute, and so select the
16850 proper type in the 'b' case below. */
16851 case V4SImode: case V8HImode: case V16QImode: case V4SFmode:
16852 result = type;
16853 default: break;
8bb418a3
ZL
16854 }
16855 break;
16856 case 'b':
16857 switch (mode)
16858 {
c4ad648e
AM
16859 case SImode: case V4SImode: result = bool_V4SI_type_node; break;
16860 case HImode: case V8HImode: result = bool_V8HI_type_node; break;
16861 case QImode: case V16QImode: result = bool_V16QI_type_node;
16862 default: break;
8bb418a3
ZL
16863 }
16864 break;
16865 case 'p':
16866 switch (mode)
16867 {
c4ad648e
AM
16868 case V8HImode: result = pixel_V8HI_type_node;
16869 default: break;
8bb418a3
ZL
16870 }
16871 default: break;
16872 }
16873
7958a2a6
FJ
16874 if (result && result != type && TYPE_READONLY (type))
16875 result = build_qualified_type (result, TYPE_QUAL_CONST);
16876
8bb418a3
ZL
16877 *no_add_attrs = true; /* No need to hang on to the attribute. */
16878
f90ac3f0 16879 if (result)
8bb418a3
ZL
16880 *node = reconstruct_complex_type (*node, result);
16881
16882 return NULL_TREE;
16883}
16884
f18eca82
ZL
16885/* AltiVec defines four built-in scalar types that serve as vector
16886 elements; we must teach the compiler how to mangle them. */
16887
16888static const char *
16889rs6000_mangle_fundamental_type (tree type)
16890{
16891 if (type == bool_char_type_node) return "U6__boolc";
16892 if (type == bool_short_type_node) return "U6__bools";
16893 if (type == pixel_type_node) return "u7__pixel";
16894 if (type == bool_int_type_node) return "U6__booli";
16895
16896 /* For all other types, use normal C++ mangling. */
16897 return NULL;
16898}
16899
a5c76ee6
ZW
16900/* Handle a "longcall" or "shortcall" attribute; arguments as in
16901 struct attribute_spec.handler. */
a4f6c312 16902
91d231cb 16903static tree
f676971a
EC
16904rs6000_handle_longcall_attribute (tree *node, tree name,
16905 tree args ATTRIBUTE_UNUSED,
16906 int flags ATTRIBUTE_UNUSED,
a2369ed3 16907 bool *no_add_attrs)
91d231cb
JM
16908{
16909 if (TREE_CODE (*node) != FUNCTION_TYPE
16910 && TREE_CODE (*node) != FIELD_DECL
16911 && TREE_CODE (*node) != TYPE_DECL)
16912 {
5c498b10 16913 warning (OPT_Wattributes, "%qs attribute only applies to functions",
91d231cb
JM
16914 IDENTIFIER_POINTER (name));
16915 *no_add_attrs = true;
16916 }
6a4cee5f 16917
91d231cb 16918 return NULL_TREE;
7509c759
MM
16919}
16920
a5c76ee6
ZW
16921/* Set longcall attributes on all functions declared when
16922 rs6000_default_long_calls is true. */
16923static void
a2369ed3 16924rs6000_set_default_type_attributes (tree type)
a5c76ee6
ZW
16925{
16926 if (rs6000_default_long_calls
16927 && (TREE_CODE (type) == FUNCTION_TYPE
16928 || TREE_CODE (type) == METHOD_TYPE))
16929 TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
16930 NULL_TREE,
16931 TYPE_ATTRIBUTES (type));
16932}
16933
3cb999d8
DE
16934/* Return a reference suitable for calling a function with the
16935 longcall attribute. */
a4f6c312 16936
9390387d 16937rtx
a2369ed3 16938rs6000_longcall_ref (rtx call_ref)
6a4cee5f 16939{
d330fd93 16940 const char *call_name;
6a4cee5f
MM
16941 tree node;
16942
16943 if (GET_CODE (call_ref) != SYMBOL_REF)
16944 return call_ref;
16945
16946 /* System V adds '.' to the internal name, so skip them. */
16947 call_name = XSTR (call_ref, 0);
16948 if (*call_name == '.')
16949 {
16950 while (*call_name == '.')
16951 call_name++;
16952
16953 node = get_identifier (call_name);
39403d82 16954 call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
6a4cee5f
MM
16955 }
16956
16957 return force_reg (Pmode, call_ref);
16958}
7509c759 16959\f
b64a1b53
RH
16960#ifdef USING_ELFOS_H
16961
7509c759
MM
16962/* A C statement or statements to switch to the appropriate section
16963 for output of RTX in mode MODE. You can assume that RTX is some
16964 kind of constant in RTL. The argument MODE is redundant except in
16965 the case of a `const_int' rtx. Select the section by calling
16966 `text_section' or one of the alternatives for other sections.
16967
16968 Do not define this macro if you put all constants in the read-only
16969 data section. */
16970
b64a1b53 16971static void
f676971a 16972rs6000_elf_select_rtx_section (enum machine_mode mode, rtx x,
a2369ed3 16973 unsigned HOST_WIDE_INT align)
7509c759 16974{
a9098fd0 16975 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
7509c759 16976 toc_section ();
7509c759 16977 else
b64a1b53 16978 default_elf_select_rtx_section (mode, x, align);
7509c759
MM
16979}
16980
16981/* A C statement or statements to switch to the appropriate
16982 section for output of DECL. DECL is either a `VAR_DECL' node
16983 or a constant of some sort. RELOC indicates whether forming
16984 the initial value of DECL requires link-time relocations. */
16985
ae46c4e0 16986static void
f676971a 16987rs6000_elf_select_section (tree decl, int reloc,
a2369ed3 16988 unsigned HOST_WIDE_INT align)
7509c759 16989{
f1384257
AM
16990 /* Pretend that we're always building for a shared library when
16991 ABI_AIX, because otherwise we end up with dynamic relocations
16992 in read-only sections. This happens for function pointers,
16993 references to vtables in typeinfo, and probably other cases. */
0e5dbd9b
DE
16994 default_elf_select_section_1 (decl, reloc, align,
16995 flag_pic || DEFAULT_ABI == ABI_AIX);
63019373
GK
16996}
16997
16998/* A C statement to build up a unique section name, expressed as a
16999 STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
17000 RELOC indicates whether the initial value of EXP requires
17001 link-time relocations. If you do not define this macro, GCC will use
17002 the symbol name prefixed by `.' as the section name. Note - this
f5143c46 17003 macro can now be called for uninitialized data items as well as
4912a07c 17004 initialized data and functions. */
63019373 17005
ae46c4e0 17006static void
a2369ed3 17007rs6000_elf_unique_section (tree decl, int reloc)
63019373 17008{
f1384257
AM
17009 /* As above, pretend that we're always building for a shared library
17010 when ABI_AIX, to avoid dynamic relocations in read-only sections. */
0e5dbd9b
DE
17011 default_unique_section_1 (decl, reloc,
17012 flag_pic || DEFAULT_ABI == ABI_AIX);
7509c759 17013}
d9407988 17014\f
d1908feb
JJ
17015/* For a SYMBOL_REF, set generic flags and then perform some
17016 target-specific processing.
17017
d1908feb
JJ
17018 When the AIX ABI is requested on a non-AIX system, replace the
17019 function name with the real name (with a leading .) rather than the
17020 function descriptor name. This saves a lot of overriding code to
17021 read the prefixes. */
d9407988 17022
fb49053f 17023static void
a2369ed3 17024rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
d9407988 17025{
d1908feb 17026 default_encode_section_info (decl, rtl, first);
b2003250 17027
d1908feb
JJ
17028 if (first
17029 && TREE_CODE (decl) == FUNCTION_DECL
17030 && !TARGET_AIX
17031 && DEFAULT_ABI == ABI_AIX)
d9407988 17032 {
c6a2438a 17033 rtx sym_ref = XEXP (rtl, 0);
d1908feb
JJ
17034 size_t len = strlen (XSTR (sym_ref, 0));
17035 char *str = alloca (len + 2);
17036 str[0] = '.';
17037 memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
17038 XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
d9407988 17039 }
d9407988
MM
17040}
17041
0e5dbd9b 17042static bool
a2369ed3 17043rs6000_elf_in_small_data_p (tree decl)
0e5dbd9b
DE
17044{
17045 if (rs6000_sdata == SDATA_NONE)
17046 return false;
17047
7482ad25
AF
17048 /* We want to merge strings, so we never consider them small data. */
17049 if (TREE_CODE (decl) == STRING_CST)
17050 return false;
17051
17052 /* Functions are never in the small data area. */
17053 if (TREE_CODE (decl) == FUNCTION_DECL)
17054 return false;
17055
0e5dbd9b
DE
17056 if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
17057 {
17058 const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
17059 if (strcmp (section, ".sdata") == 0
17060 || strcmp (section, ".sdata2") == 0
20bfcd69
GK
17061 || strcmp (section, ".sbss") == 0
17062 || strcmp (section, ".sbss2") == 0
17063 || strcmp (section, ".PPC.EMB.sdata0") == 0
17064 || strcmp (section, ".PPC.EMB.sbss0") == 0)
0e5dbd9b
DE
17065 return true;
17066 }
17067 else
17068 {
17069 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
17070
17071 if (size > 0
307b599c 17072 && (unsigned HOST_WIDE_INT) size <= g_switch_value
20bfcd69
GK
17073 /* If it's not public, and we're not going to reference it there,
17074 there's no need to put it in the small data section. */
0e5dbd9b
DE
17075 && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
17076 return true;
17077 }
17078
17079 return false;
17080}
17081
b91da81f 17082#endif /* USING_ELFOS_H */
000034eb 17083
a6c2a102 17084\f
000034eb 17085/* Return a REG that occurs in ADDR with coefficient 1.
02441cd6
JL
17086 ADDR can be effectively incremented by incrementing REG.
17087
17088 r0 is special and we must not select it as an address
17089 register by this routine since our caller will try to
17090 increment the returned register via an "la" instruction. */
000034eb 17091
9390387d 17092rtx
a2369ed3 17093find_addr_reg (rtx addr)
000034eb
DE
17094{
17095 while (GET_CODE (addr) == PLUS)
17096 {
02441cd6
JL
17097 if (GET_CODE (XEXP (addr, 0)) == REG
17098 && REGNO (XEXP (addr, 0)) != 0)
000034eb 17099 addr = XEXP (addr, 0);
02441cd6
JL
17100 else if (GET_CODE (XEXP (addr, 1)) == REG
17101 && REGNO (XEXP (addr, 1)) != 0)
000034eb
DE
17102 addr = XEXP (addr, 1);
17103 else if (CONSTANT_P (XEXP (addr, 0)))
17104 addr = XEXP (addr, 1);
17105 else if (CONSTANT_P (XEXP (addr, 1)))
17106 addr = XEXP (addr, 0);
17107 else
37409796 17108 gcc_unreachable ();
000034eb 17109 }
37409796
NS
17110 gcc_assert (GET_CODE (addr) == REG && REGNO (addr) != 0);
17111 return addr;
000034eb
DE
17112}
17113
a6c2a102 17114void
a2369ed3 17115rs6000_fatal_bad_address (rtx op)
a6c2a102
DE
17116{
17117 fatal_insn ("bad address", op);
17118}
c8023011 17119
ee890fe2
SS
17120#if TARGET_MACHO
17121
efdba735 17122static tree branch_island_list = 0;
ee890fe2 17123
efdba735
SH
17124/* Remember to generate a branch island for far calls to the given
17125 function. */
ee890fe2 17126
f676971a 17127static void
c4ad648e
AM
17128add_compiler_branch_island (tree label_name, tree function_name,
17129 int line_number)
ee890fe2 17130{
efdba735 17131 tree branch_island = build_tree_list (function_name, label_name);
7d60be94 17132 TREE_TYPE (branch_island) = build_int_cst (NULL_TREE, line_number);
efdba735
SH
17133 TREE_CHAIN (branch_island) = branch_island_list;
17134 branch_island_list = branch_island;
ee890fe2
SS
17135}
17136
efdba735
SH
17137#define BRANCH_ISLAND_LABEL_NAME(BRANCH_ISLAND) TREE_VALUE (BRANCH_ISLAND)
17138#define BRANCH_ISLAND_FUNCTION_NAME(BRANCH_ISLAND) TREE_PURPOSE (BRANCH_ISLAND)
17139#define BRANCH_ISLAND_LINE_NUMBER(BRANCH_ISLAND) \
17140 TREE_INT_CST_LOW (TREE_TYPE (BRANCH_ISLAND))
ee890fe2 17141
efdba735
SH
17142/* Generate far-jump branch islands for everything on the
17143 branch_island_list. Invoked immediately after the last instruction
17144 of the epilogue has been emitted; the branch-islands must be
17145 appended to, and contiguous with, the function body. Mach-O stubs
17146 are generated in machopic_output_stub(). */
ee890fe2 17147
efdba735
SH
17148static void
17149macho_branch_islands (void)
17150{
17151 char tmp_buf[512];
17152 tree branch_island;
17153
17154 for (branch_island = branch_island_list;
17155 branch_island;
17156 branch_island = TREE_CHAIN (branch_island))
17157 {
17158 const char *label =
17159 IDENTIFIER_POINTER (BRANCH_ISLAND_LABEL_NAME (branch_island));
17160 const char *name =
11abc112 17161 IDENTIFIER_POINTER (BRANCH_ISLAND_FUNCTION_NAME (branch_island));
efdba735
SH
17162 char name_buf[512];
17163 /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF(). */
17164 if (name[0] == '*' || name[0] == '&')
17165 strcpy (name_buf, name+1);
17166 else
17167 {
17168 name_buf[0] = '_';
17169 strcpy (name_buf+1, name);
17170 }
17171 strcpy (tmp_buf, "\n");
17172 strcat (tmp_buf, label);
ee890fe2 17173#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
efdba735 17174 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
93a27b7b 17175 dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
ee890fe2 17176#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
efdba735
SH
17177 if (flag_pic)
17178 {
17179 strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
17180 strcat (tmp_buf, label);
17181 strcat (tmp_buf, "_pic\n");
17182 strcat (tmp_buf, label);
17183 strcat (tmp_buf, "_pic:\n\tmflr r11\n");
f676971a 17184
efdba735
SH
17185 strcat (tmp_buf, "\taddis r11,r11,ha16(");
17186 strcat (tmp_buf, name_buf);
17187 strcat (tmp_buf, " - ");
17188 strcat (tmp_buf, label);
17189 strcat (tmp_buf, "_pic)\n");
f676971a 17190
efdba735 17191 strcat (tmp_buf, "\tmtlr r0\n");
f676971a 17192
efdba735
SH
17193 strcat (tmp_buf, "\taddi r12,r11,lo16(");
17194 strcat (tmp_buf, name_buf);
17195 strcat (tmp_buf, " - ");
17196 strcat (tmp_buf, label);
17197 strcat (tmp_buf, "_pic)\n");
f676971a 17198
efdba735
SH
17199 strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
17200 }
17201 else
17202 {
17203 strcat (tmp_buf, ":\nlis r12,hi16(");
17204 strcat (tmp_buf, name_buf);
17205 strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
17206 strcat (tmp_buf, name_buf);
17207 strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
17208 }
17209 output_asm_insn (tmp_buf, 0);
ee890fe2 17210#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
efdba735 17211 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
93a27b7b 17212 dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
ee890fe2 17213#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
efdba735 17214 }
ee890fe2 17215
efdba735 17216 branch_island_list = 0;
ee890fe2
SS
17217}
17218
17219/* NO_PREVIOUS_DEF checks in the link list whether the function name is
17220 already there or not. */
17221
efdba735 17222static int
a2369ed3 17223no_previous_def (tree function_name)
ee890fe2 17224{
efdba735
SH
17225 tree branch_island;
17226 for (branch_island = branch_island_list;
17227 branch_island;
17228 branch_island = TREE_CHAIN (branch_island))
17229 if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
ee890fe2
SS
17230 return 0;
17231 return 1;
17232}
17233
17234/* GET_PREV_LABEL gets the label name from the previous definition of
17235 the function. */
17236
efdba735 17237static tree
a2369ed3 17238get_prev_label (tree function_name)
ee890fe2 17239{
efdba735
SH
17240 tree branch_island;
17241 for (branch_island = branch_island_list;
17242 branch_island;
17243 branch_island = TREE_CHAIN (branch_island))
17244 if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
17245 return BRANCH_ISLAND_LABEL_NAME (branch_island);
ee890fe2
SS
17246 return 0;
17247}
17248
17249/* INSN is either a function call or a millicode call. It may have an
f676971a 17250 unconditional jump in its delay slot.
ee890fe2
SS
17251
17252 CALL_DEST is the routine we are calling. */
17253
17254char *
c4ad648e
AM
17255output_call (rtx insn, rtx *operands, int dest_operand_number,
17256 int cookie_operand_number)
ee890fe2
SS
17257{
17258 static char buf[256];
efdba735
SH
17259 if (GET_CODE (operands[dest_operand_number]) == SYMBOL_REF
17260 && (INTVAL (operands[cookie_operand_number]) & CALL_LONG))
ee890fe2
SS
17261 {
17262 tree labelname;
efdba735 17263 tree funname = get_identifier (XSTR (operands[dest_operand_number], 0));
f676971a 17264
ee890fe2
SS
17265 if (no_previous_def (funname))
17266 {
308c142a 17267 int line_number = 0;
ee890fe2
SS
17268 rtx label_rtx = gen_label_rtx ();
17269 char *label_buf, temp_buf[256];
17270 ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
17271 CODE_LABEL_NUMBER (label_rtx));
17272 label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
17273 labelname = get_identifier (label_buf);
17274 for (; insn && GET_CODE (insn) != NOTE; insn = PREV_INSN (insn));
17275 if (insn)
17276 line_number = NOTE_LINE_NUMBER (insn);
efdba735 17277 add_compiler_branch_island (labelname, funname, line_number);
ee890fe2
SS
17278 }
17279 else
17280 labelname = get_prev_label (funname);
17281
efdba735
SH
17282 /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
17283 instruction will reach 'foo', otherwise link as 'bl L42'".
17284 "L42" should be a 'branch island', that will do a far jump to
17285 'foo'. Branch islands are generated in
17286 macho_branch_islands(). */
ee890fe2 17287 sprintf (buf, "jbsr %%z%d,%.246s",
efdba735 17288 dest_operand_number, IDENTIFIER_POINTER (labelname));
ee890fe2
SS
17289 }
17290 else
efdba735
SH
17291 sprintf (buf, "bl %%z%d", dest_operand_number);
17292 return buf;
ee890fe2
SS
17293}
17294
ee890fe2
SS
17295/* Generate PIC and indirect symbol stubs. */
17296
17297void
a2369ed3 17298machopic_output_stub (FILE *file, const char *symb, const char *stub)
ee890fe2
SS
17299{
17300 unsigned int length;
a4f6c312
SS
17301 char *symbol_name, *lazy_ptr_name;
17302 char *local_label_0;
ee890fe2
SS
17303 static int label = 0;
17304
df56a27f 17305 /* Lose our funky encoding stuff so it doesn't contaminate the stub. */
772c5265 17306 symb = (*targetm.strip_name_encoding) (symb);
df56a27f 17307
ee890fe2 17308
ee890fe2
SS
17309 length = strlen (symb);
17310 symbol_name = alloca (length + 32);
17311 GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
17312
17313 lazy_ptr_name = alloca (length + 32);
17314 GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
17315
ee890fe2 17316 if (flag_pic == 2)
d3c300d2 17317 machopic_picsymbol_stub1_section ();
ee890fe2 17318 else
d3c300d2 17319 machopic_symbol_stub1_section ();
ee890fe2
SS
17320
17321 if (flag_pic == 2)
17322 {
d974312d
DJ
17323 fprintf (file, "\t.align 5\n");
17324
17325 fprintf (file, "%s:\n", stub);
17326 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
17327
876455fa 17328 label++;
89da1f32 17329 local_label_0 = alloca (sizeof ("\"L00000000000$spb\""));
876455fa 17330 sprintf (local_label_0, "\"L%011d$spb\"", label);
f676971a 17331
ee890fe2
SS
17332 fprintf (file, "\tmflr r0\n");
17333 fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
17334 fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
17335 fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
17336 lazy_ptr_name, local_label_0);
17337 fprintf (file, "\tmtlr r0\n");
3d0e2d58
SS
17338 fprintf (file, "\t%s r12,lo16(%s-%s)(r11)\n",
17339 (TARGET_64BIT ? "ldu" : "lwzu"),
ee890fe2
SS
17340 lazy_ptr_name, local_label_0);
17341 fprintf (file, "\tmtctr r12\n");
ee890fe2
SS
17342 fprintf (file, "\tbctr\n");
17343 }
17344 else
d974312d
DJ
17345 {
17346 fprintf (file, "\t.align 4\n");
17347
17348 fprintf (file, "%s:\n", stub);
17349 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
17350
17351 fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
d9e4e4f5
SS
17352 fprintf (file, "\t%s r12,lo16(%s)(r11)\n",
17353 (TARGET_64BIT ? "ldu" : "lwzu"),
17354 lazy_ptr_name);
d974312d
DJ
17355 fprintf (file, "\tmtctr r12\n");
17356 fprintf (file, "\tbctr\n");
17357 }
f676971a 17358
ee890fe2
SS
17359 machopic_lazy_symbol_ptr_section ();
17360 fprintf (file, "%s:\n", lazy_ptr_name);
17361 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
49bd1d27
SS
17362 fprintf (file, "%sdyld_stub_binding_helper\n",
17363 (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
ee890fe2
SS
17364}
17365
17366/* Legitimize PIC addresses. If the address is already
17367 position-independent, we return ORIG. Newly generated
17368 position-independent addresses go into a reg. This is REG if non
17369 zero, otherwise we allocate register(s) as necessary. */
17370
9390387d 17371#define SMALL_INT(X) ((unsigned) (INTVAL (X) + 0x8000) < 0x10000)
ee890fe2
SS
17372
17373rtx
f676971a 17374rs6000_machopic_legitimize_pic_address (rtx orig, enum machine_mode mode,
a2369ed3 17375 rtx reg)
ee890fe2
SS
17376{
17377 rtx base, offset;
17378
17379 if (reg == NULL && ! reload_in_progress && ! reload_completed)
17380 reg = gen_reg_rtx (Pmode);
17381
17382 if (GET_CODE (orig) == CONST)
17383 {
37409796
NS
17384 rtx reg_temp;
17385
ee890fe2
SS
17386 if (GET_CODE (XEXP (orig, 0)) == PLUS
17387 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
17388 return orig;
17389
37409796
NS
17390 gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
17391
17392 /* Use a different reg for the intermediate value, as
17393 it will be marked UNCHANGING. */
17394 reg_temp = no_new_pseudos ? reg : gen_reg_rtx (Pmode);
17395 base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
17396 Pmode, reg_temp);
17397 offset =
17398 rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
17399 Pmode, reg);
17400
ee890fe2
SS
17401 if (GET_CODE (offset) == CONST_INT)
17402 {
17403 if (SMALL_INT (offset))
ed8908e7 17404 return plus_constant (base, INTVAL (offset));
ee890fe2
SS
17405 else if (! reload_in_progress && ! reload_completed)
17406 offset = force_reg (Pmode, offset);
17407 else
c859cda6
DJ
17408 {
17409 rtx mem = force_const_mem (Pmode, orig);
17410 return machopic_legitimize_pic_address (mem, Pmode, reg);
17411 }
ee890fe2 17412 }
f1c25d3b 17413 return gen_rtx_PLUS (Pmode, base, offset);
ee890fe2
SS
17414 }
17415
17416 /* Fall back on generic machopic code. */
17417 return machopic_legitimize_pic_address (orig, mode, reg);
17418}
17419
17420/* This is just a placeholder to make linking work without having to
17421 add this to the generic Darwin EXTRA_SECTIONS. If -mcall-aix is
17422 ever needed for Darwin (not too likely!) this would have to get a
17423 real definition. */
17424
17425void
863d938c 17426toc_section (void)
ee890fe2
SS
17427{
17428}
17429
c4e18b1c
GK
17430/* Output a .machine directive for the Darwin assembler, and call
17431 the generic start_file routine. */
17432
17433static void
17434rs6000_darwin_file_start (void)
17435{
94ff898d 17436 static const struct
c4e18b1c
GK
17437 {
17438 const char *arg;
17439 const char *name;
17440 int if_set;
17441 } mapping[] = {
55dbfb48 17442 { "ppc64", "ppc64", MASK_64BIT },
c4e18b1c
GK
17443 { "970", "ppc970", MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64 },
17444 { "power4", "ppc970", 0 },
17445 { "G5", "ppc970", 0 },
17446 { "7450", "ppc7450", 0 },
17447 { "7400", "ppc7400", MASK_ALTIVEC },
17448 { "G4", "ppc7400", 0 },
17449 { "750", "ppc750", 0 },
17450 { "740", "ppc750", 0 },
17451 { "G3", "ppc750", 0 },
17452 { "604e", "ppc604e", 0 },
17453 { "604", "ppc604", 0 },
17454 { "603e", "ppc603", 0 },
17455 { "603", "ppc603", 0 },
17456 { "601", "ppc601", 0 },
17457 { NULL, "ppc", 0 } };
17458 const char *cpu_id = "";
17459 size_t i;
94ff898d 17460
9390387d 17461 rs6000_file_start ();
c4e18b1c
GK
17462
17463 /* Determine the argument to -mcpu=. Default to G3 if not specified. */
17464 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
17465 if (rs6000_select[i].set_arch_p && rs6000_select[i].string
17466 && rs6000_select[i].string[0] != '\0')
17467 cpu_id = rs6000_select[i].string;
17468
17469 /* Look through the mapping array. Pick the first name that either
17470 matches the argument, has a bit set in IF_SET that is also set
17471 in the target flags, or has a NULL name. */
17472
17473 i = 0;
17474 while (mapping[i].arg != NULL
17475 && strcmp (mapping[i].arg, cpu_id) != 0
17476 && (mapping[i].if_set & target_flags) == 0)
17477 i++;
17478
17479 fprintf (asm_out_file, "\t.machine %s\n", mapping[i].name);
17480}
17481
ee890fe2 17482#endif /* TARGET_MACHO */
7c262518
RH
17483
17484#if TARGET_ELF
17485static unsigned int
a2369ed3 17486rs6000_elf_section_type_flags (tree decl, const char *name, int reloc)
7c262518 17487{
1ff8f81a
AM
17488 return default_section_type_flags_1 (decl, name, reloc,
17489 flag_pic || DEFAULT_ABI == ABI_AIX);
7c262518 17490}
d9f6800d
RH
17491
17492/* Record an element in the table of global constructors. SYMBOL is
17493 a SYMBOL_REF of the function to be called; PRIORITY is a number
17494 between 0 and MAX_INIT_PRIORITY.
17495
17496 This differs from default_named_section_asm_out_constructor in
17497 that we have special handling for -mrelocatable. */
17498
17499static void
a2369ed3 17500rs6000_elf_asm_out_constructor (rtx symbol, int priority)
d9f6800d
RH
17501{
17502 const char *section = ".ctors";
17503 char buf[16];
17504
17505 if (priority != DEFAULT_INIT_PRIORITY)
17506 {
17507 sprintf (buf, ".ctors.%.5u",
c4ad648e
AM
17508 /* Invert the numbering so the linker puts us in the proper
17509 order; constructors are run from right to left, and the
17510 linker sorts in increasing order. */
17511 MAX_INIT_PRIORITY - priority);
d9f6800d
RH
17512 section = buf;
17513 }
17514
715bdd29
RH
17515 named_section_flags (section, SECTION_WRITE);
17516 assemble_align (POINTER_SIZE);
d9f6800d
RH
17517
17518 if (TARGET_RELOCATABLE)
17519 {
17520 fputs ("\t.long (", asm_out_file);
17521 output_addr_const (asm_out_file, symbol);
17522 fputs (")@fixup\n", asm_out_file);
17523 }
17524 else
c8af3574 17525 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
d9f6800d
RH
17526}
17527
17528static void
a2369ed3 17529rs6000_elf_asm_out_destructor (rtx symbol, int priority)
d9f6800d
RH
17530{
17531 const char *section = ".dtors";
17532 char buf[16];
17533
17534 if (priority != DEFAULT_INIT_PRIORITY)
17535 {
17536 sprintf (buf, ".dtors.%.5u",
c4ad648e
AM
17537 /* Invert the numbering so the linker puts us in the proper
17538 order; constructors are run from right to left, and the
17539 linker sorts in increasing order. */
17540 MAX_INIT_PRIORITY - priority);
d9f6800d
RH
17541 section = buf;
17542 }
17543
715bdd29
RH
17544 named_section_flags (section, SECTION_WRITE);
17545 assemble_align (POINTER_SIZE);
d9f6800d
RH
17546
17547 if (TARGET_RELOCATABLE)
17548 {
17549 fputs ("\t.long (", asm_out_file);
17550 output_addr_const (asm_out_file, symbol);
17551 fputs (")@fixup\n", asm_out_file);
17552 }
17553 else
c8af3574 17554 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
d9f6800d 17555}
9739c90c
JJ
17556
17557void
a2369ed3 17558rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
9739c90c
JJ
17559{
17560 if (TARGET_64BIT)
17561 {
17562 fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
17563 ASM_OUTPUT_LABEL (file, name);
17564 fputs (DOUBLE_INT_ASM_OP, file);
85b776df
AM
17565 rs6000_output_function_entry (file, name);
17566 fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
17567 if (DOT_SYMBOLS)
9739c90c 17568 {
85b776df 17569 fputs ("\t.size\t", file);
9739c90c 17570 assemble_name (file, name);
85b776df
AM
17571 fputs (",24\n\t.type\t.", file);
17572 assemble_name (file, name);
17573 fputs (",@function\n", file);
17574 if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
17575 {
17576 fputs ("\t.globl\t.", file);
17577 assemble_name (file, name);
17578 putc ('\n', file);
17579 }
9739c90c 17580 }
85b776df
AM
17581 else
17582 ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
9739c90c 17583 ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
85b776df
AM
17584 rs6000_output_function_entry (file, name);
17585 fputs (":\n", file);
9739c90c
JJ
17586 return;
17587 }
17588
17589 if (TARGET_RELOCATABLE
7f970b70 17590 && !TARGET_SECURE_PLT
9739c90c 17591 && (get_pool_size () != 0 || current_function_profile)
3c9eb5f4 17592 && uses_TOC ())
9739c90c
JJ
17593 {
17594 char buf[256];
17595
17596 (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
17597
17598 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
17599 fprintf (file, "\t.long ");
17600 assemble_name (file, buf);
17601 putc ('-', file);
17602 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
17603 assemble_name (file, buf);
17604 putc ('\n', file);
17605 }
17606
17607 ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
17608 ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
17609
17610 if (DEFAULT_ABI == ABI_AIX)
17611 {
17612 const char *desc_name, *orig_name;
17613
17614 orig_name = (*targetm.strip_name_encoding) (name);
17615 desc_name = orig_name;
17616 while (*desc_name == '.')
17617 desc_name++;
17618
17619 if (TREE_PUBLIC (decl))
17620 fprintf (file, "\t.globl %s\n", desc_name);
17621
17622 fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
17623 fprintf (file, "%s:\n", desc_name);
17624 fprintf (file, "\t.long %s\n", orig_name);
17625 fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
17626 if (DEFAULT_ABI == ABI_AIX)
17627 fputs ("\t.long 0\n", file);
17628 fprintf (file, "\t.previous\n");
17629 }
17630 ASM_OUTPUT_LABEL (file, name);
17631}
1334b570
AM
17632
17633static void
17634rs6000_elf_end_indicate_exec_stack (void)
17635{
17636 if (TARGET_32BIT)
17637 file_end_indicate_exec_stack ();
17638}
7c262518
RH
17639#endif
17640
cbaaba19 17641#if TARGET_XCOFF
7c262518 17642static void
a2369ed3 17643rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
b275d088
DE
17644{
17645 fputs (GLOBAL_ASM_OP, stream);
17646 RS6000_OUTPUT_BASENAME (stream, name);
17647 putc ('\n', stream);
17648}
17649
17650static void
c18a5b6c
MM
17651rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
17652 tree decl ATTRIBUTE_UNUSED)
7c262518 17653{
0e5dbd9b
DE
17654 int smclass;
17655 static const char * const suffix[3] = { "PR", "RO", "RW" };
17656
17657 if (flags & SECTION_CODE)
17658 smclass = 0;
17659 else if (flags & SECTION_WRITE)
17660 smclass = 2;
17661 else
17662 smclass = 1;
17663
5b5198f7 17664 fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
0e5dbd9b 17665 (flags & SECTION_CODE) ? "." : "",
5b5198f7 17666 name, suffix[smclass], flags & SECTION_ENTSIZE);
7c262518 17667}
ae46c4e0
RH
17668
17669static void
f676971a 17670rs6000_xcoff_select_section (tree decl, int reloc,
c4ad648e 17671 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
ae46c4e0 17672{
5add3202 17673 if (decl_readonly_section_1 (decl, reloc, 1))
ae46c4e0 17674 {
0e5dbd9b 17675 if (TREE_PUBLIC (decl))
c4ad648e 17676 read_only_data_section ();
ae46c4e0 17677 else
c4ad648e 17678 read_only_private_data_section ();
ae46c4e0
RH
17679 }
17680 else
17681 {
0e5dbd9b 17682 if (TREE_PUBLIC (decl))
c4ad648e 17683 data_section ();
ae46c4e0 17684 else
c4ad648e 17685 private_data_section ();
ae46c4e0
RH
17686 }
17687}
17688
17689static void
a2369ed3 17690rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
ae46c4e0
RH
17691{
17692 const char *name;
ae46c4e0 17693
5b5198f7
DE
17694 /* Use select_section for private and uninitialized data. */
17695 if (!TREE_PUBLIC (decl)
17696 || DECL_COMMON (decl)
0e5dbd9b
DE
17697 || DECL_INITIAL (decl) == NULL_TREE
17698 || DECL_INITIAL (decl) == error_mark_node
17699 || (flag_zero_initialized_in_bss
17700 && initializer_zerop (DECL_INITIAL (decl))))
17701 return;
17702
17703 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
17704 name = (*targetm.strip_name_encoding) (name);
17705 DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
ae46c4e0 17706}
b64a1b53 17707
fb49053f
RH
17708/* Select section for constant in constant pool.
17709
17710 On RS/6000, all constants are in the private read-only data area.
17711 However, if this is being placed in the TOC it must be output as a
17712 toc entry. */
17713
b64a1b53 17714static void
f676971a 17715rs6000_xcoff_select_rtx_section (enum machine_mode mode, rtx x,
c4ad648e 17716 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
b64a1b53
RH
17717{
17718 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
17719 toc_section ();
17720 else
17721 read_only_private_data_section ();
17722}
772c5265
RH
17723
17724/* Remove any trailing [DS] or the like from the symbol name. */
17725
17726static const char *
a2369ed3 17727rs6000_xcoff_strip_name_encoding (const char *name)
772c5265
RH
17728{
17729 size_t len;
17730 if (*name == '*')
17731 name++;
17732 len = strlen (name);
17733 if (name[len - 1] == ']')
17734 return ggc_alloc_string (name, len - 4);
17735 else
17736 return name;
17737}
17738
5add3202
DE
17739/* Section attributes. AIX is always PIC. */
17740
17741static unsigned int
a2369ed3 17742rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
5add3202 17743{
5b5198f7
DE
17744 unsigned int align;
17745 unsigned int flags = default_section_type_flags_1 (decl, name, reloc, 1);
17746
17747 /* Align to at least UNIT size. */
17748 if (flags & SECTION_CODE)
17749 align = MIN_UNITS_PER_WORD;
17750 else
17751 /* Increase alignment of large objects if not already stricter. */
17752 align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
17753 int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
17754 ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
17755
17756 return flags | (exact_log2 (align) & SECTION_ENTSIZE);
5add3202 17757}
a5fe455b 17758
1bc7c5b6
ZW
17759/* Output at beginning of assembler file.
17760
17761 Initialize the section names for the RS/6000 at this point.
17762
17763 Specify filename, including full path, to assembler.
17764
17765 We want to go into the TOC section so at least one .toc will be emitted.
17766 Also, in order to output proper .bs/.es pairs, we need at least one static
17767 [RW] section emitted.
17768
17769 Finally, declare mcount when profiling to make the assembler happy. */
17770
17771static void
863d938c 17772rs6000_xcoff_file_start (void)
1bc7c5b6
ZW
17773{
17774 rs6000_gen_section_name (&xcoff_bss_section_name,
17775 main_input_filename, ".bss_");
17776 rs6000_gen_section_name (&xcoff_private_data_section_name,
17777 main_input_filename, ".rw_");
17778 rs6000_gen_section_name (&xcoff_read_only_section_name,
17779 main_input_filename, ".ro_");
17780
17781 fputs ("\t.file\t", asm_out_file);
17782 output_quoted_string (asm_out_file, main_input_filename);
17783 fputc ('\n', asm_out_file);
1bc7c5b6
ZW
17784 if (write_symbols != NO_DEBUG)
17785 private_data_section ();
17786 text_section ();
17787 if (profile_flag)
17788 fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
17789 rs6000_file_start ();
17790}
17791
a5fe455b
ZW
17792/* Output at end of assembler file.
17793 On the RS/6000, referencing data should automatically pull in text. */
17794
17795static void
863d938c 17796rs6000_xcoff_file_end (void)
a5fe455b
ZW
17797{
17798 text_section ();
17799 fputs ("_section_.text:\n", asm_out_file);
17800 data_section ();
17801 fputs (TARGET_32BIT
17802 ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
17803 asm_out_file);
17804}
f1384257 17805#endif /* TARGET_XCOFF */
0e5dbd9b 17806
3c50106f
RH
17807/* Compute a (partial) cost for rtx X. Return true if the complete
17808 cost has been computed, and false if subexpressions should be
17809 scanned. In either case, *TOTAL contains the cost result. */
17810
17811static bool
1494c534 17812rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
3c50106f 17813{
f0517163
RS
17814 enum machine_mode mode = GET_MODE (x);
17815
3c50106f
RH
17816 switch (code)
17817 {
30a555d9 17818 /* On the RS/6000, if it is valid in the insn, it is free. */
3c50106f 17819 case CONST_INT:
066cd967
DE
17820 if (((outer_code == SET
17821 || outer_code == PLUS
17822 || outer_code == MINUS)
17823 && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
17824 || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')))
066cd967
DE
17825 || (outer_code == AND
17826 && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
22e54023
DE
17827 || (CONST_OK_FOR_LETTER_P (INTVAL (x),
17828 mode == SImode ? 'L' : 'J'))
d5861a7a 17829 || mask_operand (x, VOIDmode)))
22e54023
DE
17830 || ((outer_code == IOR || outer_code == XOR)
17831 && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
17832 || (CONST_OK_FOR_LETTER_P (INTVAL (x),
17833 mode == SImode ? 'L' : 'J'))))
066cd967
DE
17834 || outer_code == ASHIFT
17835 || outer_code == ASHIFTRT
17836 || outer_code == LSHIFTRT
17837 || outer_code == ROTATE
17838 || outer_code == ROTATERT
d5861a7a 17839 || outer_code == ZERO_EXTRACT
066cd967
DE
17840 || (outer_code == MULT
17841 && CONST_OK_FOR_LETTER_P (INTVAL (x), 'I'))
22e54023
DE
17842 || ((outer_code == DIV || outer_code == UDIV
17843 || outer_code == MOD || outer_code == UMOD)
17844 && exact_log2 (INTVAL (x)) >= 0)
066cd967
DE
17845 || (outer_code == COMPARE
17846 && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
22e54023
DE
17847 || CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')))
17848 || (outer_code == EQ
17849 && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
17850 || CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
17851 || (CONST_OK_FOR_LETTER_P (INTVAL (x),
17852 mode == SImode ? 'L' : 'J'))))
17853 || (outer_code == GTU
17854 && CONST_OK_FOR_LETTER_P (INTVAL (x), 'I'))
17855 || (outer_code == LTU
17856 && CONST_OK_FOR_LETTER_P (INTVAL (x), 'P')))
066cd967
DE
17857 {
17858 *total = 0;
17859 return true;
17860 }
17861 else if ((outer_code == PLUS
4ae234b0 17862 && reg_or_add_cint_operand (x, VOIDmode))
066cd967 17863 || (outer_code == MINUS
4ae234b0 17864 && reg_or_sub_cint_operand (x, VOIDmode))
066cd967
DE
17865 || ((outer_code == SET
17866 || outer_code == IOR
17867 || outer_code == XOR)
17868 && (INTVAL (x)
17869 & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
17870 {
17871 *total = COSTS_N_INSNS (1);
17872 return true;
17873 }
17874 /* FALLTHRU */
17875
17876 case CONST_DOUBLE:
17877 if (mode == DImode
17878 && ((outer_code == AND
17879 && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
17880 || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')
4ae234b0 17881 || mask_operand (x, DImode)))
066cd967
DE
17882 || ((outer_code == IOR || outer_code == XOR)
17883 && CONST_DOUBLE_HIGH (x) == 0
17884 && (CONST_DOUBLE_LOW (x)
17885 & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0)))
17886 {
17887 *total = 0;
17888 return true;
17889 }
17890 else if (mode == DImode
17891 && (outer_code == SET
17892 || outer_code == IOR
17893 || outer_code == XOR)
17894 && CONST_DOUBLE_HIGH (x) == 0)
17895 {
17896 *total = COSTS_N_INSNS (1);
17897 return true;
17898 }
17899 /* FALLTHRU */
17900
3c50106f 17901 case CONST:
066cd967 17902 case HIGH:
3c50106f 17903 case SYMBOL_REF:
066cd967
DE
17904 case MEM:
17905 /* When optimizing for size, MEM should be slightly more expensive
17906 than generating address, e.g., (plus (reg) (const)).
c112cf2b 17907 L1 cache latency is about two instructions. */
066cd967 17908 *total = optimize_size ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
3c50106f
RH
17909 return true;
17910
30a555d9
DE
17911 case LABEL_REF:
17912 *total = 0;
17913 return true;
17914
3c50106f 17915 case PLUS:
f0517163 17916 if (mode == DFmode)
066cd967
DE
17917 {
17918 if (GET_CODE (XEXP (x, 0)) == MULT)
17919 {
17920 /* FNMA accounted in outer NEG. */
17921 if (outer_code == NEG)
17922 *total = rs6000_cost->dmul - rs6000_cost->fp;
17923 else
17924 *total = rs6000_cost->dmul;
17925 }
17926 else
17927 *total = rs6000_cost->fp;
17928 }
f0517163 17929 else if (mode == SFmode)
066cd967
DE
17930 {
17931 /* FNMA accounted in outer NEG. */
17932 if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
17933 *total = 0;
17934 else
17935 *total = rs6000_cost->fp;
17936 }
938bf747
RS
17937 else if (GET_CODE (XEXP (x, 0)) == MULT)
17938 {
17939 /* The rs6000 doesn't have shift-and-add instructions. */
17940 rs6000_rtx_costs (XEXP (x, 0), MULT, PLUS, total);
17941 *total += COSTS_N_INSNS (1);
17942 }
f0517163 17943 else
066cd967
DE
17944 *total = COSTS_N_INSNS (1);
17945 return false;
3c50106f 17946
52190329 17947 case MINUS:
f0517163 17948 if (mode == DFmode)
066cd967
DE
17949 {
17950 if (GET_CODE (XEXP (x, 0)) == MULT)
17951 {
17952 /* FNMA accounted in outer NEG. */
17953 if (outer_code == NEG)
17954 *total = 0;
17955 else
17956 *total = rs6000_cost->dmul;
17957 }
17958 else
17959 *total = rs6000_cost->fp;
17960 }
f0517163 17961 else if (mode == SFmode)
066cd967
DE
17962 {
17963 /* FNMA accounted in outer NEG. */
17964 if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
17965 *total = 0;
17966 else
17967 *total = rs6000_cost->fp;
17968 }
938bf747
RS
17969 else if (GET_CODE (XEXP (x, 0)) == MULT)
17970 {
17971 /* The rs6000 doesn't have shift-and-sub instructions. */
17972 rs6000_rtx_costs (XEXP (x, 0), MULT, MINUS, total);
17973 *total += COSTS_N_INSNS (1);
17974 }
f0517163 17975 else
c4ad648e 17976 *total = COSTS_N_INSNS (1);
066cd967 17977 return false;
3c50106f
RH
17978
17979 case MULT:
c9dbf840
DE
17980 if (GET_CODE (XEXP (x, 1)) == CONST_INT
17981 && CONST_OK_FOR_LETTER_P (INTVAL (XEXP (x, 1)), 'I'))
3c50106f 17982 {
8b897cfa
RS
17983 if (INTVAL (XEXP (x, 1)) >= -256
17984 && INTVAL (XEXP (x, 1)) <= 255)
06a67bdd 17985 *total = rs6000_cost->mulsi_const9;
8b897cfa 17986 else
06a67bdd 17987 *total = rs6000_cost->mulsi_const;
3c50106f 17988 }
066cd967
DE
17989 /* FMA accounted in outer PLUS/MINUS. */
17990 else if ((mode == DFmode || mode == SFmode)
17991 && (outer_code == PLUS || outer_code == MINUS))
17992 *total = 0;
f0517163 17993 else if (mode == DFmode)
06a67bdd 17994 *total = rs6000_cost->dmul;
f0517163 17995 else if (mode == SFmode)
06a67bdd 17996 *total = rs6000_cost->fp;
f0517163 17997 else if (mode == DImode)
06a67bdd 17998 *total = rs6000_cost->muldi;
8b897cfa 17999 else
06a67bdd 18000 *total = rs6000_cost->mulsi;
066cd967 18001 return false;
3c50106f
RH
18002
18003 case DIV:
18004 case MOD:
f0517163
RS
18005 if (FLOAT_MODE_P (mode))
18006 {
06a67bdd
RS
18007 *total = mode == DFmode ? rs6000_cost->ddiv
18008 : rs6000_cost->sdiv;
066cd967 18009 return false;
f0517163 18010 }
5efb1046 18011 /* FALLTHRU */
3c50106f
RH
18012
18013 case UDIV:
18014 case UMOD:
627b6fe2
DJ
18015 if (GET_CODE (XEXP (x, 1)) == CONST_INT
18016 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
18017 {
18018 if (code == DIV || code == MOD)
18019 /* Shift, addze */
18020 *total = COSTS_N_INSNS (2);
18021 else
18022 /* Shift */
18023 *total = COSTS_N_INSNS (1);
18024 }
c4ad648e 18025 else
627b6fe2
DJ
18026 {
18027 if (GET_MODE (XEXP (x, 1)) == DImode)
18028 *total = rs6000_cost->divdi;
18029 else
18030 *total = rs6000_cost->divsi;
18031 }
18032 /* Add in shift and subtract for MOD. */
18033 if (code == MOD || code == UMOD)
18034 *total += COSTS_N_INSNS (2);
066cd967 18035 return false;
3c50106f
RH
18036
18037 case FFS:
18038 *total = COSTS_N_INSNS (4);
066cd967 18039 return false;
3c50106f 18040
06a67bdd 18041 case NOT:
066cd967
DE
18042 if (outer_code == AND || outer_code == IOR || outer_code == XOR)
18043 {
18044 *total = 0;
18045 return false;
18046 }
18047 /* FALLTHRU */
18048
18049 case AND:
18050 case IOR:
18051 case XOR:
d5861a7a
DE
18052 case ZERO_EXTRACT:
18053 *total = COSTS_N_INSNS (1);
18054 return false;
18055
066cd967
DE
18056 case ASHIFT:
18057 case ASHIFTRT:
18058 case LSHIFTRT:
18059 case ROTATE:
18060 case ROTATERT:
d5861a7a 18061 /* Handle mul_highpart. */
066cd967
DE
18062 if (outer_code == TRUNCATE
18063 && GET_CODE (XEXP (x, 0)) == MULT)
18064 {
18065 if (mode == DImode)
18066 *total = rs6000_cost->muldi;
18067 else
18068 *total = rs6000_cost->mulsi;
18069 return true;
18070 }
d5861a7a
DE
18071 else if (outer_code == AND)
18072 *total = 0;
18073 else
18074 *total = COSTS_N_INSNS (1);
18075 return false;
18076
18077 case SIGN_EXTEND:
18078 case ZERO_EXTEND:
18079 if (GET_CODE (XEXP (x, 0)) == MEM)
18080 *total = 0;
18081 else
18082 *total = COSTS_N_INSNS (1);
066cd967 18083 return false;
06a67bdd 18084
066cd967
DE
18085 case COMPARE:
18086 case NEG:
18087 case ABS:
18088 if (!FLOAT_MODE_P (mode))
18089 {
18090 *total = COSTS_N_INSNS (1);
18091 return false;
18092 }
18093 /* FALLTHRU */
18094
18095 case FLOAT:
18096 case UNSIGNED_FLOAT:
18097 case FIX:
18098 case UNSIGNED_FIX:
06a67bdd
RS
18099 case FLOAT_TRUNCATE:
18100 *total = rs6000_cost->fp;
066cd967 18101 return false;
06a67bdd 18102
a2af5043
DJ
18103 case FLOAT_EXTEND:
18104 if (mode == DFmode)
18105 *total = 0;
18106 else
18107 *total = rs6000_cost->fp;
18108 return false;
18109
06a67bdd
RS
18110 case UNSPEC:
18111 switch (XINT (x, 1))
18112 {
18113 case UNSPEC_FRSP:
18114 *total = rs6000_cost->fp;
18115 return true;
18116
18117 default:
18118 break;
18119 }
18120 break;
18121
18122 case CALL:
18123 case IF_THEN_ELSE:
18124 if (optimize_size)
18125 {
18126 *total = COSTS_N_INSNS (1);
18127 return true;
18128 }
066cd967
DE
18129 else if (FLOAT_MODE_P (mode)
18130 && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS)
18131 {
18132 *total = rs6000_cost->fp;
18133 return false;
18134 }
06a67bdd
RS
18135 break;
18136
c0600ecd
DE
18137 case EQ:
18138 case GTU:
18139 case LTU:
22e54023
DE
18140 /* Carry bit requires mode == Pmode.
18141 NEG or PLUS already counted so only add one. */
18142 if (mode == Pmode
18143 && (outer_code == NEG || outer_code == PLUS))
c0600ecd 18144 {
22e54023
DE
18145 *total = COSTS_N_INSNS (1);
18146 return true;
18147 }
18148 if (outer_code == SET)
18149 {
18150 if (XEXP (x, 1) == const0_rtx)
c0600ecd 18151 {
22e54023 18152 *total = COSTS_N_INSNS (2);
c0600ecd 18153 return true;
c0600ecd 18154 }
22e54023
DE
18155 else if (mode == Pmode)
18156 {
18157 *total = COSTS_N_INSNS (3);
18158 return false;
18159 }
18160 }
18161 /* FALLTHRU */
18162
18163 case GT:
18164 case LT:
18165 case UNORDERED:
18166 if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
18167 {
18168 *total = COSTS_N_INSNS (2);
18169 return true;
c0600ecd 18170 }
22e54023
DE
18171 /* CC COMPARE. */
18172 if (outer_code == COMPARE)
18173 {
18174 *total = 0;
18175 return true;
18176 }
18177 break;
c0600ecd 18178
3c50106f 18179 default:
06a67bdd 18180 break;
3c50106f 18181 }
06a67bdd
RS
18182
18183 return false;
3c50106f
RH
18184}
18185
34bb030a
DE
18186/* A C expression returning the cost of moving data from a register of class
18187 CLASS1 to one of CLASS2. */
18188
18189int
f676971a 18190rs6000_register_move_cost (enum machine_mode mode,
a2369ed3 18191 enum reg_class from, enum reg_class to)
34bb030a
DE
18192{
18193 /* Moves from/to GENERAL_REGS. */
18194 if (reg_classes_intersect_p (to, GENERAL_REGS)
18195 || reg_classes_intersect_p (from, GENERAL_REGS))
18196 {
18197 if (! reg_classes_intersect_p (to, GENERAL_REGS))
18198 from = to;
18199
18200 if (from == FLOAT_REGS || from == ALTIVEC_REGS)
18201 return (rs6000_memory_move_cost (mode, from, 0)
18202 + rs6000_memory_move_cost (mode, GENERAL_REGS, 0));
18203
c4ad648e
AM
18204 /* It's more expensive to move CR_REGS than CR0_REGS because of the
18205 shift. */
34bb030a
DE
18206 else if (from == CR_REGS)
18207 return 4;
18208
18209 else
c4ad648e 18210 /* A move will cost one instruction per GPR moved. */
c8b622ff 18211 return 2 * hard_regno_nregs[0][mode];
34bb030a
DE
18212 }
18213
c4ad648e 18214 /* Moving between two similar registers is just one instruction. */
34bb030a
DE
18215 else if (reg_classes_intersect_p (to, from))
18216 return mode == TFmode ? 4 : 2;
18217
c4ad648e 18218 /* Everything else has to go through GENERAL_REGS. */
34bb030a 18219 else
f676971a 18220 return (rs6000_register_move_cost (mode, GENERAL_REGS, to)
34bb030a
DE
18221 + rs6000_register_move_cost (mode, from, GENERAL_REGS));
18222}
18223
18224/* A C expressions returning the cost of moving data of MODE from a register to
18225 or from memory. */
18226
18227int
f676971a 18228rs6000_memory_move_cost (enum machine_mode mode, enum reg_class class,
a2369ed3 18229 int in ATTRIBUTE_UNUSED)
34bb030a
DE
18230{
18231 if (reg_classes_intersect_p (class, GENERAL_REGS))
c8b622ff 18232 return 4 * hard_regno_nregs[0][mode];
34bb030a 18233 else if (reg_classes_intersect_p (class, FLOAT_REGS))
c8b622ff 18234 return 4 * hard_regno_nregs[32][mode];
34bb030a 18235 else if (reg_classes_intersect_p (class, ALTIVEC_REGS))
c8b622ff 18236 return 4 * hard_regno_nregs[FIRST_ALTIVEC_REGNO][mode];
34bb030a
DE
18237 else
18238 return 4 + rs6000_register_move_cost (mode, class, GENERAL_REGS);
18239}
18240
ef765ea9
DE
18241/* Newton-Raphson approximation of single-precision floating point divide n/d.
18242 Assumes no trapping math and finite arguments. */
18243
18244void
18245rs6000_emit_swdivsf (rtx res, rtx n, rtx d)
18246{
18247 rtx x0, e0, e1, y1, u0, v0, one;
18248
18249 x0 = gen_reg_rtx (SFmode);
18250 e0 = gen_reg_rtx (SFmode);
18251 e1 = gen_reg_rtx (SFmode);
18252 y1 = gen_reg_rtx (SFmode);
18253 u0 = gen_reg_rtx (SFmode);
18254 v0 = gen_reg_rtx (SFmode);
18255 one = force_reg (SFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, SFmode));
18256
18257 /* x0 = 1./d estimate */
18258 emit_insn (gen_rtx_SET (VOIDmode, x0,
18259 gen_rtx_UNSPEC (SFmode, gen_rtvec (1, d),
18260 UNSPEC_FRES)));
18261 /* e0 = 1. - d * x0 */
18262 emit_insn (gen_rtx_SET (VOIDmode, e0,
18263 gen_rtx_MINUS (SFmode, one,
18264 gen_rtx_MULT (SFmode, d, x0))));
18265 /* e1 = e0 + e0 * e0 */
18266 emit_insn (gen_rtx_SET (VOIDmode, e1,
18267 gen_rtx_PLUS (SFmode,
18268 gen_rtx_MULT (SFmode, e0, e0), e0)));
18269 /* y1 = x0 + e1 * x0 */
18270 emit_insn (gen_rtx_SET (VOIDmode, y1,
18271 gen_rtx_PLUS (SFmode,
18272 gen_rtx_MULT (SFmode, e1, x0), x0)));
18273 /* u0 = n * y1 */
18274 emit_insn (gen_rtx_SET (VOIDmode, u0,
18275 gen_rtx_MULT (SFmode, n, y1)));
18276 /* v0 = n - d * u0 */
18277 emit_insn (gen_rtx_SET (VOIDmode, v0,
18278 gen_rtx_MINUS (SFmode, n,
18279 gen_rtx_MULT (SFmode, d, u0))));
18280 /* res = u0 + v0 * y1 */
18281 emit_insn (gen_rtx_SET (VOIDmode, res,
18282 gen_rtx_PLUS (SFmode,
18283 gen_rtx_MULT (SFmode, v0, y1), u0)));
18284}
18285
18286/* Newton-Raphson approximation of double-precision floating point divide n/d.
18287 Assumes no trapping math and finite arguments. */
18288
18289void
18290rs6000_emit_swdivdf (rtx res, rtx n, rtx d)
18291{
18292 rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
18293
18294 x0 = gen_reg_rtx (DFmode);
18295 e0 = gen_reg_rtx (DFmode);
18296 e1 = gen_reg_rtx (DFmode);
18297 e2 = gen_reg_rtx (DFmode);
18298 y1 = gen_reg_rtx (DFmode);
18299 y2 = gen_reg_rtx (DFmode);
18300 y3 = gen_reg_rtx (DFmode);
18301 u0 = gen_reg_rtx (DFmode);
18302 v0 = gen_reg_rtx (DFmode);
18303 one = force_reg (DFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, DFmode));
18304
18305 /* x0 = 1./d estimate */
18306 emit_insn (gen_rtx_SET (VOIDmode, x0,
18307 gen_rtx_UNSPEC (DFmode, gen_rtvec (1, d),
18308 UNSPEC_FRES)));
18309 /* e0 = 1. - d * x0 */
18310 emit_insn (gen_rtx_SET (VOIDmode, e0,
18311 gen_rtx_MINUS (DFmode, one,
18312 gen_rtx_MULT (SFmode, d, x0))));
18313 /* y1 = x0 + e0 * x0 */
18314 emit_insn (gen_rtx_SET (VOIDmode, y1,
18315 gen_rtx_PLUS (DFmode,
18316 gen_rtx_MULT (DFmode, e0, x0), x0)));
18317 /* e1 = e0 * e0 */
18318 emit_insn (gen_rtx_SET (VOIDmode, e1,
18319 gen_rtx_MULT (DFmode, e0, e0)));
18320 /* y2 = y1 + e1 * y1 */
18321 emit_insn (gen_rtx_SET (VOIDmode, y2,
18322 gen_rtx_PLUS (DFmode,
18323 gen_rtx_MULT (DFmode, e1, y1), y1)));
18324 /* e2 = e1 * e1 */
18325 emit_insn (gen_rtx_SET (VOIDmode, e2,
18326 gen_rtx_MULT (DFmode, e1, e1)));
18327 /* y3 = y2 + e2 * y2 */
18328 emit_insn (gen_rtx_SET (VOIDmode, y3,
18329 gen_rtx_PLUS (DFmode,
18330 gen_rtx_MULT (DFmode, e2, y2), y2)));
18331 /* u0 = n * y3 */
18332 emit_insn (gen_rtx_SET (VOIDmode, u0,
18333 gen_rtx_MULT (DFmode, n, y3)));
18334 /* v0 = n - d * u0 */
18335 emit_insn (gen_rtx_SET (VOIDmode, v0,
18336 gen_rtx_MINUS (DFmode, n,
18337 gen_rtx_MULT (DFmode, d, u0))));
18338 /* res = u0 + v0 * y3 */
18339 emit_insn (gen_rtx_SET (VOIDmode, res,
18340 gen_rtx_PLUS (DFmode,
18341 gen_rtx_MULT (DFmode, v0, y3), u0)));
18342}
18343
ded9bf77
AH
18344/* Return an RTX representing where to find the function value of a
18345 function returning MODE. */
18346static rtx
18347rs6000_complex_function_value (enum machine_mode mode)
18348{
18349 unsigned int regno;
18350 rtx r1, r2;
18351 enum machine_mode inner = GET_MODE_INNER (mode);
fb7e4164 18352 unsigned int inner_bytes = GET_MODE_SIZE (inner);
ded9bf77 18353
18f63bfa
AH
18354 if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
18355 regno = FP_ARG_RETURN;
354ed18f
AH
18356 else
18357 {
18f63bfa 18358 regno = GP_ARG_RETURN;
ded9bf77 18359
18f63bfa
AH
18360 /* 32-bit is OK since it'll go in r3/r4. */
18361 if (TARGET_32BIT && inner_bytes >= 4)
ded9bf77
AH
18362 return gen_rtx_REG (mode, regno);
18363 }
18364
18f63bfa
AH
18365 if (inner_bytes >= 8)
18366 return gen_rtx_REG (mode, regno);
18367
ded9bf77
AH
18368 r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
18369 const0_rtx);
18370 r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
fb7e4164 18371 GEN_INT (inner_bytes));
ded9bf77
AH
18372 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
18373}
18374
a6ebc39a
AH
18375/* Define how to find the value returned by a function.
18376 VALTYPE is the data type of the value (as a tree).
18377 If the precise function being called is known, FUNC is its FUNCTION_DECL;
18378 otherwise, FUNC is 0.
18379
18380 On the SPE, both FPs and vectors are returned in r3.
18381
18382 On RS/6000 an integer value is in r3 and a floating-point value is in
18383 fp1, unless -msoft-float. */
18384
18385rtx
18386rs6000_function_value (tree valtype, tree func ATTRIBUTE_UNUSED)
18387{
18388 enum machine_mode mode;
2a8fa26c 18389 unsigned int regno;
a6ebc39a 18390
594a51fe
SS
18391 /* Special handling for structs in darwin64. */
18392 if (rs6000_darwin64_abi
18393 && TYPE_MODE (valtype) == BLKmode
0b5383eb
DJ
18394 && TREE_CODE (valtype) == RECORD_TYPE
18395 && int_size_in_bytes (valtype) > 0)
594a51fe
SS
18396 {
18397 CUMULATIVE_ARGS valcum;
18398 rtx valret;
18399
0b5383eb 18400 valcum.words = 0;
594a51fe
SS
18401 valcum.fregno = FP_ARG_MIN_REG;
18402 valcum.vregno = ALTIVEC_ARG_MIN_REG;
0b5383eb
DJ
18403 /* Do a trial code generation as if this were going to be passed as
18404 an argument; if any part goes in memory, we return NULL. */
18405 valret = rs6000_darwin64_record_arg (&valcum, valtype, 1, true);
594a51fe
SS
18406 if (valret)
18407 return valret;
18408 /* Otherwise fall through to standard ABI rules. */
18409 }
18410
0e67400a
FJ
18411 if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DImode)
18412 {
18413 /* Long long return value need be split in -mpowerpc64, 32bit ABI. */
18414 return gen_rtx_PARALLEL (DImode,
18415 gen_rtvec (2,
18416 gen_rtx_EXPR_LIST (VOIDmode,
18417 gen_rtx_REG (SImode, GP_ARG_RETURN),
18418 const0_rtx),
18419 gen_rtx_EXPR_LIST (VOIDmode,
18420 gen_rtx_REG (SImode,
18421 GP_ARG_RETURN + 1),
18422 GEN_INT (4))));
18423 }
18424
a6ebc39a
AH
18425 if ((INTEGRAL_TYPE_P (valtype)
18426 && TYPE_PRECISION (valtype) < BITS_PER_WORD)
18427 || POINTER_TYPE_P (valtype))
b78d48dd 18428 mode = TARGET_32BIT ? SImode : DImode;
a6ebc39a
AH
18429 else
18430 mode = TYPE_MODE (valtype);
18431
4ed78545 18432 if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS)
2a8fa26c 18433 regno = FP_ARG_RETURN;
ded9bf77 18434 else if (TREE_CODE (valtype) == COMPLEX_TYPE
42ba5130 18435 && targetm.calls.split_complex_arg)
ded9bf77 18436 return rs6000_complex_function_value (mode);
44688022 18437 else if (TREE_CODE (valtype) == VECTOR_TYPE
d0b2079e 18438 && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
23ba09f0 18439 && ALTIVEC_VECTOR_MODE (mode))
a6ebc39a 18440 regno = ALTIVEC_ARG_RETURN;
18f63bfa
AH
18441 else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
18442 && (mode == DFmode || mode == DCmode))
18443 return spe_build_register_parallel (mode, GP_ARG_RETURN);
a6ebc39a
AH
18444 else
18445 regno = GP_ARG_RETURN;
18446
18447 return gen_rtx_REG (mode, regno);
18448}
18449
ded9bf77
AH
18450/* Define how to find the value returned by a library function
18451 assuming the value has mode MODE. */
18452rtx
18453rs6000_libcall_value (enum machine_mode mode)
18454{
18455 unsigned int regno;
18456
2e6c9641
FJ
18457 if (TARGET_32BIT && TARGET_POWERPC64 && mode == DImode)
18458 {
18459 /* Long long return value need be split in -mpowerpc64, 32bit ABI. */
18460 return gen_rtx_PARALLEL (DImode,
18461 gen_rtvec (2,
18462 gen_rtx_EXPR_LIST (VOIDmode,
18463 gen_rtx_REG (SImode, GP_ARG_RETURN),
18464 const0_rtx),
18465 gen_rtx_EXPR_LIST (VOIDmode,
18466 gen_rtx_REG (SImode,
18467 GP_ARG_RETURN + 1),
18468 GEN_INT (4))));
18469 }
18470
ded9bf77
AH
18471 if (GET_MODE_CLASS (mode) == MODE_FLOAT
18472 && TARGET_HARD_FLOAT && TARGET_FPRS)
18473 regno = FP_ARG_RETURN;
44688022
AM
18474 else if (ALTIVEC_VECTOR_MODE (mode)
18475 && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
ded9bf77 18476 regno = ALTIVEC_ARG_RETURN;
42ba5130 18477 else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
ded9bf77 18478 return rs6000_complex_function_value (mode);
18f63bfa
AH
18479 else if (TARGET_E500_DOUBLE && TARGET_HARD_FLOAT
18480 && (mode == DFmode || mode == DCmode))
18481 return spe_build_register_parallel (mode, GP_ARG_RETURN);
ded9bf77
AH
18482 else
18483 regno = GP_ARG_RETURN;
18484
18485 return gen_rtx_REG (mode, regno);
18486}
18487
d1d0c603
JJ
18488/* Define the offset between two registers, FROM to be eliminated and its
18489 replacement TO, at the start of a routine. */
18490HOST_WIDE_INT
18491rs6000_initial_elimination_offset (int from, int to)
18492{
18493 rs6000_stack_t *info = rs6000_stack_info ();
18494 HOST_WIDE_INT offset;
18495
7d5175e1 18496 if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
d1d0c603 18497 offset = info->push_p ? 0 : -info->total_size;
7d5175e1
JJ
18498 else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
18499 {
18500 offset = info->push_p ? 0 : -info->total_size;
18501 if (FRAME_GROWS_DOWNWARD)
5b667039 18502 offset += info->fixed_size + info->vars_size + info->parm_size;
7d5175e1
JJ
18503 }
18504 else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
18505 offset = FRAME_GROWS_DOWNWARD
5b667039 18506 ? info->fixed_size + info->vars_size + info->parm_size
7d5175e1
JJ
18507 : 0;
18508 else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
d1d0c603
JJ
18509 offset = info->total_size;
18510 else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
18511 offset = info->push_p ? info->total_size : 0;
18512 else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
18513 offset = 0;
18514 else
37409796 18515 gcc_unreachable ();
d1d0c603
JJ
18516
18517 return offset;
18518}
18519
58646b77 18520/* Return true if TYPE is a SPE or AltiVec opaque type. */
62e1dfcf 18521
c8e4f0e9 18522static bool
58646b77 18523rs6000_is_opaque_type (tree type)
62e1dfcf 18524{
58646b77 18525 return (type == opaque_V2SI_type_node
2abe3e28 18526 || type == opaque_V2SF_type_node
58646b77
PB
18527 || type == opaque_p_V2SI_type_node
18528 || type == opaque_V4SI_type_node);
62e1dfcf
NC
18529}
18530
96714395 18531static rtx
a2369ed3 18532rs6000_dwarf_register_span (rtx reg)
96714395
AH
18533{
18534 unsigned regno;
18535
4d4cbc0e
AH
18536 if (TARGET_SPE
18537 && (SPE_VECTOR_MODE (GET_MODE (reg))
18538 || (TARGET_E500_DOUBLE && GET_MODE (reg) == DFmode)))
18539 ;
18540 else
96714395
AH
18541 return NULL_RTX;
18542
18543 regno = REGNO (reg);
18544
18545 /* The duality of the SPE register size wreaks all kinds of havoc.
18546 This is a way of distinguishing r0 in 32-bits from r0 in
18547 64-bits. */
18548 return
18549 gen_rtx_PARALLEL (VOIDmode,
3bd104d1
AH
18550 BYTES_BIG_ENDIAN
18551 ? gen_rtvec (2,
18552 gen_rtx_REG (SImode, regno + 1200),
18553 gen_rtx_REG (SImode, regno))
18554 : gen_rtvec (2,
18555 gen_rtx_REG (SImode, regno),
18556 gen_rtx_REG (SImode, regno + 1200)));
96714395
AH
18557}
18558
93c9d1ba
AM
18559/* Map internal gcc register numbers to DWARF2 register numbers. */
18560
18561unsigned int
18562rs6000_dbx_register_number (unsigned int regno)
18563{
18564 if (regno <= 63 || write_symbols != DWARF2_DEBUG)
18565 return regno;
18566 if (regno == MQ_REGNO)
18567 return 100;
18568 if (regno == LINK_REGISTER_REGNUM)
18569 return 108;
18570 if (regno == COUNT_REGISTER_REGNUM)
18571 return 109;
18572 if (CR_REGNO_P (regno))
18573 return regno - CR0_REGNO + 86;
18574 if (regno == XER_REGNO)
18575 return 101;
18576 if (ALTIVEC_REGNO_P (regno))
18577 return regno - FIRST_ALTIVEC_REGNO + 1124;
18578 if (regno == VRSAVE_REGNO)
18579 return 356;
18580 if (regno == VSCR_REGNO)
18581 return 67;
18582 if (regno == SPE_ACC_REGNO)
18583 return 99;
18584 if (regno == SPEFSCR_REGNO)
18585 return 612;
18586 /* SPE high reg number. We get these values of regno from
18587 rs6000_dwarf_register_span. */
37409796
NS
18588 gcc_assert (regno >= 1200 && regno < 1232);
18589 return regno;
93c9d1ba
AM
18590}
18591
93f90be6 18592/* target hook eh_return_filter_mode */
f676971a 18593static enum machine_mode
93f90be6
FJ
18594rs6000_eh_return_filter_mode (void)
18595{
18596 return TARGET_32BIT ? SImode : word_mode;
18597}
18598
f676971a
EC
18599/* Target hook for vector_mode_supported_p. */
18600static bool
18601rs6000_vector_mode_supported_p (enum machine_mode mode)
18602{
18603
18604 if (TARGET_SPE && SPE_VECTOR_MODE (mode))
18605 return true;
18606
18607 else if (TARGET_ALTIVEC && ALTIVEC_VECTOR_MODE (mode))
18608 return true;
18609
18610 else
18611 return false;
18612}
18613
4d3e6fae
FJ
18614/* Target hook for invalid_arg_for_unprototyped_fn. */
18615static const char *
18616invalid_arg_for_unprototyped_fn (tree typelist, tree funcdecl, tree val)
18617{
18618 return (!rs6000_darwin64_abi
18619 && typelist == 0
18620 && TREE_CODE (TREE_TYPE (val)) == VECTOR_TYPE
18621 && (funcdecl == NULL_TREE
18622 || (TREE_CODE (funcdecl) == FUNCTION_DECL
18623 && DECL_BUILT_IN_CLASS (funcdecl) != BUILT_IN_MD)))
18624 ? N_("AltiVec argument passed to unprototyped function")
18625 : NULL;
18626}
18627
3aebbe5f
JJ
18628/* For TARGET_SECURE_PLT 32-bit PIC code we can save PIC register
18629 setup by using __stack_chk_fail_local hidden function instead of
18630 calling __stack_chk_fail directly. Otherwise it is better to call
18631 __stack_chk_fail directly. */
18632
18633static tree
18634rs6000_stack_protect_fail (void)
18635{
18636 return (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT && flag_pic)
18637 ? default_hidden_stack_protect_fail ()
18638 : default_external_stack_protect_fail ();
18639}
18640
17211ab5 18641#include "gt-rs6000.h"