]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/rs6000/rs6000.c
Daily bump.
[thirdparty/gcc.git] / gcc / config / rs6000 / rs6000.c
CommitLineData
9878760c 1/* Subroutines used for code generation on IBM RS/6000.
9ebbca7d 2 Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
93c9d1ba 3 2000, 2001, 2002, 2003, 2004 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
20 Free Software Foundation, 59 Temple Place - Suite 330, Boston,
21 MA 02111-1307, 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"
1bc7c5b6
ZW
56#if TARGET_XCOFF
57#include "xcoffout.h" /* get declarations of xcoff_*_section_name */
58#endif
9b30bae2 59
7509c759
MM
60#ifndef TARGET_NO_PROTOTYPE
61#define TARGET_NO_PROTOTYPE 0
62#endif
63
452a7d36
HP
64#define EASY_VECTOR_15(n) ((n) >= -16 && (n) <= 15)
65#define EASY_VECTOR_15_ADD_SELF(n) ((n) >= 0x10 && (n) <= 0x1e \
66 && !((n) & 1))
d744e06e 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 */
d62294f5
FJ
82 int world_save_p; /* true if we're saving *everything*:
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) */
96 int varargs_size; /* size to hold V.4 args passed in regs */
97 HOST_WIDE_INT vars_size; /* variable save area size */
98 int parm_size; /* outgoing parameter size */
99 int save_size; /* save area size */
100 int fixed_size; /* fixed size of stack frame */
101 int gp_size; /* size of saved GP registers */
102 int fp_size; /* size of saved FP registers */
103 int altivec_size; /* size of saved AltiVec registers */
104 int cr_size; /* size to hold CR if not in save_size */
105 int lr_size; /* size to hold LR if not in save_size */
106 int vrsave_size; /* size to hold VRSAVE if not in save_size */
107 int altivec_padding_size; /* size of altivec alignment padding if
108 not in save_size */
109 int spe_gp_size; /* size of 64-bit GPR save size for SPE */
110 int spe_padding_size;
111 int toc_size; /* size to hold TOC if not in save_size */
112 HOST_WIDE_INT total_size; /* total bytes allocated for stack */
113 int spe_64bit_regs_used;
114} rs6000_stack_t;
115
5248c961
RK
116/* Target cpu type */
117
118enum processor_type rs6000_cpu;
8e3f41e7
MM
119struct rs6000_cpu_select rs6000_select[3] =
120{
815cdc52
MM
121 /* switch name, tune arch */
122 { (const char *)0, "--with-cpu=", 1, 1 },
123 { (const char *)0, "-mcpu=", 1, 1 },
124 { (const char *)0, "-mtune=", 1, 0 },
8e3f41e7 125};
5248c961 126
ec507f2d
DE
127/* Always emit branch hint bits. */
128static GTY(()) bool rs6000_always_hint;
129
130/* Schedule instructions for group formation. */
131static GTY(()) bool rs6000_sched_groups;
132
79ae11c4
DN
133/* Support adjust_priority scheduler hook
134 and -mprioritize-restricted-insns= option. */
135const char *rs6000_sched_restricted_insns_priority_str;
136int rs6000_sched_restricted_insns_priority;
137
569fa502
DN
138/* Support for -msched-costly-dep option. */
139const char *rs6000_sched_costly_dep_str;
140enum rs6000_dependence_cost rs6000_sched_costly_dep;
141
cbe26ab8
DN
142/* Support for -minsert-sched-nops option. */
143const char *rs6000_sched_insert_nops_str;
144enum rs6000_nop_insertion rs6000_sched_insert_nops;
145
6fa3f289
ZW
146/* Size of long double */
147const char *rs6000_long_double_size_string;
148int rs6000_long_double_type_size;
149
150/* Whether -mabi=altivec has appeared */
151int rs6000_altivec_abi;
152
08b57fb3
AH
153/* Whether VRSAVE instructions should be generated. */
154int rs6000_altivec_vrsave;
155
156/* String from -mvrsave= option. */
157const char *rs6000_altivec_vrsave_string;
158
a3170dc6
AH
159/* Nonzero if we want SPE ABI extensions. */
160int rs6000_spe_abi;
161
162/* Whether isel instructions should be generated. */
163int rs6000_isel;
164
993f19a8
AH
165/* Whether SPE simd instructions should be generated. */
166int rs6000_spe;
167
5da702b1
AH
168/* Nonzero if floating point operations are done in the GPRs. */
169int rs6000_float_gprs = 0;
170
171/* String from -mfloat-gprs=. */
172const char *rs6000_float_gprs_string;
a3170dc6
AH
173
174/* String from -misel=. */
175const char *rs6000_isel_string;
176
993f19a8
AH
177/* String from -mspe=. */
178const char *rs6000_spe_string;
179
a0ab749a 180/* Set to nonzero once AIX common-mode calls have been defined. */
bbfb86aa 181static GTY(()) int common_mode_defined;
c81bebd7 182
9878760c
RK
183/* Save information from a "cmpxx" operation until the branch or scc is
184 emitted. */
9878760c
RK
185rtx rs6000_compare_op0, rs6000_compare_op1;
186int rs6000_compare_fp_p;
874a0744 187
874a0744
MM
188/* Label number of label created for -mrelocatable, to call to so we can
189 get the address of the GOT section */
190int rs6000_pic_labelno;
c81bebd7 191
b91da81f 192#ifdef USING_ELFOS_H
c81bebd7 193/* Which abi to adhere to */
9739c90c 194const char *rs6000_abi_name;
d9407988
MM
195
196/* Semantics of the small data area */
197enum rs6000_sdata_type rs6000_sdata = SDATA_DATA;
198
199/* Which small data model to use */
815cdc52 200const char *rs6000_sdata_name = (char *)0;
9ebbca7d
GK
201
202/* Counter for labels which are to be placed in .fixup. */
203int fixuplabelno = 0;
874a0744 204#endif
4697a36c 205
c4501e62
JJ
206/* Bit size of immediate TLS offsets and string from which it is decoded. */
207int rs6000_tls_size = 32;
208const char *rs6000_tls_size_string;
209
b6c9286a
MM
210/* ABI enumeration available for subtarget to use. */
211enum rs6000_abi rs6000_current_abi;
212
0ac081f6
AH
213/* ABI string from -mabi= option. */
214const char *rs6000_abi_string;
215
85b776df
AM
216/* Whether to use variant of AIX ABI for PowerPC64 Linux. */
217int dot_symbols;
218
38c1f2d7 219/* Debug flags */
815cdc52 220const char *rs6000_debug_name;
38c1f2d7
MM
221int rs6000_debug_stack; /* debug stack applications */
222int rs6000_debug_arg; /* debug argument handling */
223
0d1fbc8c
AH
224/* Value is TRUE if register/mode pair is accepatable. */
225bool rs6000_hard_regno_mode_ok_p[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
226
6035d635 227/* Opaque types. */
2abe3e28 228static GTY(()) tree opaque_V2SI_type_node;
2abe3e28 229static GTY(()) tree opaque_V2SF_type_node;
6035d635 230static GTY(()) tree opaque_p_V2SI_type_node;
4a5eab38
PB
231static GTY(()) tree V16QI_type_node;
232static GTY(()) tree V2SI_type_node;
233static GTY(()) tree V2SF_type_node;
234static GTY(()) tree V4HI_type_node;
235static GTY(()) tree V4SI_type_node;
236static GTY(()) tree V4SF_type_node;
237static GTY(()) tree V8HI_type_node;
238static GTY(()) tree unsigned_V16QI_type_node;
239static GTY(()) tree unsigned_V8HI_type_node;
240static GTY(()) tree unsigned_V4SI_type_node;
8bb418a3
ZL
241static GTY(()) tree bool_char_type_node; /* __bool char */
242static GTY(()) tree bool_short_type_node; /* __bool short */
243static GTY(()) tree bool_int_type_node; /* __bool int */
244static GTY(()) tree pixel_type_node; /* __pixel */
245static GTY(()) tree bool_V16QI_type_node; /* __vector __bool char */
246static GTY(()) tree bool_V8HI_type_node; /* __vector __bool short */
247static GTY(()) tree bool_V4SI_type_node; /* __vector __bool int */
248static GTY(()) tree pixel_V8HI_type_node; /* __vector __pixel */
249
250int rs6000_warn_altivec_long = 1; /* On by default. */
251const char *rs6000_warn_altivec_long_switch;
252
57ac7be9
AM
253const char *rs6000_traceback_name;
254static enum {
255 traceback_default = 0,
256 traceback_none,
257 traceback_part,
258 traceback_full
259} rs6000_traceback;
260
38c1f2d7
MM
261/* Flag to say the TOC is initialized */
262int toc_initialized;
9ebbca7d 263char toc_label_name[10];
38c1f2d7 264
9ebbca7d 265/* Alias set for saves and restores from the rs6000 stack. */
f103e34d 266static GTY(()) int rs6000_sr_alias_set;
c8023011 267
a5c76ee6
ZW
268/* Call distance, overridden by -mlongcall and #pragma longcall(1).
269 The only place that looks at this is rs6000_set_default_type_attributes;
270 everywhere else should rely on the presence or absence of a longcall
271 attribute on the function declaration. */
272int rs6000_default_long_calls;
273const char *rs6000_longcall_switch;
274
a3c9585f
KH
275/* Control alignment for fields within structures. */
276/* String from -malign-XXXXX. */
025d9908
KH
277const char *rs6000_alignment_string;
278int rs6000_alignment_flags;
279
a3170dc6
AH
280struct builtin_description
281{
282 /* mask is not const because we're going to alter it below. This
283 nonsense will go away when we rewrite the -march infrastructure
284 to give us more target flag bits. */
285 unsigned int mask;
286 const enum insn_code icode;
287 const char *const name;
288 const enum rs6000_builtins code;
289};
8b897cfa
RS
290\f
291/* Target cpu costs. */
292
293struct processor_costs {
294 const int mulsi; /* cost of SImode multiplication. */
295 const int mulsi_const; /* cost of SImode multiplication by constant. */
296 const int mulsi_const9; /* cost of SImode mult by short constant. */
297 const int muldi; /* cost of DImode multiplication. */
298 const int divsi; /* cost of SImode division. */
299 const int divdi; /* cost of DImode division. */
f0517163
RS
300 const int fp; /* cost of simple SFmode and DFmode insns. */
301 const int dmul; /* cost of DFmode multiplication (and fmadd). */
302 const int sdiv; /* cost of SFmode division (fdivs). */
303 const int ddiv; /* cost of DFmode division (fdiv). */
8b897cfa
RS
304};
305
306const struct processor_costs *rs6000_cost;
307
308/* Processor costs (relative to an add) */
309
310/* Instruction size costs on 32bit processors. */
311static const
312struct processor_costs size32_cost = {
06a67bdd
RS
313 COSTS_N_INSNS (1), /* mulsi */
314 COSTS_N_INSNS (1), /* mulsi_const */
315 COSTS_N_INSNS (1), /* mulsi_const9 */
316 COSTS_N_INSNS (1), /* muldi */
317 COSTS_N_INSNS (1), /* divsi */
318 COSTS_N_INSNS (1), /* divdi */
319 COSTS_N_INSNS (1), /* fp */
320 COSTS_N_INSNS (1), /* dmul */
321 COSTS_N_INSNS (1), /* sdiv */
322 COSTS_N_INSNS (1), /* ddiv */
8b897cfa
RS
323};
324
325/* Instruction size costs on 64bit processors. */
326static const
327struct processor_costs size64_cost = {
06a67bdd
RS
328 COSTS_N_INSNS (1), /* mulsi */
329 COSTS_N_INSNS (1), /* mulsi_const */
330 COSTS_N_INSNS (1), /* mulsi_const9 */
331 COSTS_N_INSNS (1), /* muldi */
332 COSTS_N_INSNS (1), /* divsi */
333 COSTS_N_INSNS (1), /* divdi */
334 COSTS_N_INSNS (1), /* fp */
335 COSTS_N_INSNS (1), /* dmul */
336 COSTS_N_INSNS (1), /* sdiv */
337 COSTS_N_INSNS (1), /* ddiv */
8b897cfa
RS
338};
339
340/* Instruction costs on RIOS1 processors. */
341static const
342struct processor_costs rios1_cost = {
06a67bdd
RS
343 COSTS_N_INSNS (5), /* mulsi */
344 COSTS_N_INSNS (4), /* mulsi_const */
345 COSTS_N_INSNS (3), /* mulsi_const9 */
346 COSTS_N_INSNS (5), /* muldi */
347 COSTS_N_INSNS (19), /* divsi */
348 COSTS_N_INSNS (19), /* divdi */
349 COSTS_N_INSNS (2), /* fp */
350 COSTS_N_INSNS (2), /* dmul */
351 COSTS_N_INSNS (19), /* sdiv */
352 COSTS_N_INSNS (19), /* ddiv */
8b897cfa
RS
353};
354
355/* Instruction costs on RIOS2 processors. */
356static const
357struct processor_costs rios2_cost = {
06a67bdd
RS
358 COSTS_N_INSNS (2), /* mulsi */
359 COSTS_N_INSNS (2), /* mulsi_const */
360 COSTS_N_INSNS (2), /* mulsi_const9 */
361 COSTS_N_INSNS (2), /* muldi */
362 COSTS_N_INSNS (13), /* divsi */
363 COSTS_N_INSNS (13), /* divdi */
364 COSTS_N_INSNS (2), /* fp */
365 COSTS_N_INSNS (2), /* dmul */
366 COSTS_N_INSNS (17), /* sdiv */
367 COSTS_N_INSNS (17), /* ddiv */
8b897cfa
RS
368};
369
370/* Instruction costs on RS64A processors. */
371static const
372struct processor_costs rs64a_cost = {
06a67bdd
RS
373 COSTS_N_INSNS (20), /* mulsi */
374 COSTS_N_INSNS (12), /* mulsi_const */
375 COSTS_N_INSNS (8), /* mulsi_const9 */
376 COSTS_N_INSNS (34), /* muldi */
377 COSTS_N_INSNS (65), /* divsi */
378 COSTS_N_INSNS (67), /* divdi */
379 COSTS_N_INSNS (4), /* fp */
380 COSTS_N_INSNS (4), /* dmul */
381 COSTS_N_INSNS (31), /* sdiv */
382 COSTS_N_INSNS (31), /* ddiv */
8b897cfa
RS
383};
384
385/* Instruction costs on MPCCORE processors. */
386static const
387struct processor_costs mpccore_cost = {
06a67bdd
RS
388 COSTS_N_INSNS (2), /* mulsi */
389 COSTS_N_INSNS (2), /* mulsi_const */
390 COSTS_N_INSNS (2), /* mulsi_const9 */
391 COSTS_N_INSNS (2), /* muldi */
392 COSTS_N_INSNS (6), /* divsi */
393 COSTS_N_INSNS (6), /* divdi */
394 COSTS_N_INSNS (4), /* fp */
395 COSTS_N_INSNS (5), /* dmul */
396 COSTS_N_INSNS (10), /* sdiv */
397 COSTS_N_INSNS (17), /* ddiv */
8b897cfa
RS
398};
399
400/* Instruction costs on PPC403 processors. */
401static const
402struct processor_costs ppc403_cost = {
06a67bdd
RS
403 COSTS_N_INSNS (4), /* mulsi */
404 COSTS_N_INSNS (4), /* mulsi_const */
405 COSTS_N_INSNS (4), /* mulsi_const9 */
406 COSTS_N_INSNS (4), /* muldi */
407 COSTS_N_INSNS (33), /* divsi */
408 COSTS_N_INSNS (33), /* divdi */
409 COSTS_N_INSNS (11), /* fp */
410 COSTS_N_INSNS (11), /* dmul */
411 COSTS_N_INSNS (11), /* sdiv */
412 COSTS_N_INSNS (11), /* ddiv */
8b897cfa
RS
413};
414
415/* Instruction costs on PPC405 processors. */
416static const
417struct processor_costs ppc405_cost = {
06a67bdd
RS
418 COSTS_N_INSNS (5), /* mulsi */
419 COSTS_N_INSNS (4), /* mulsi_const */
420 COSTS_N_INSNS (3), /* mulsi_const9 */
421 COSTS_N_INSNS (5), /* muldi */
422 COSTS_N_INSNS (35), /* divsi */
423 COSTS_N_INSNS (35), /* divdi */
424 COSTS_N_INSNS (11), /* fp */
425 COSTS_N_INSNS (11), /* dmul */
426 COSTS_N_INSNS (11), /* sdiv */
427 COSTS_N_INSNS (11), /* ddiv */
8b897cfa
RS
428};
429
430/* Instruction costs on PPC440 processors. */
431static const
432struct processor_costs ppc440_cost = {
06a67bdd
RS
433 COSTS_N_INSNS (3), /* mulsi */
434 COSTS_N_INSNS (2), /* mulsi_const */
435 COSTS_N_INSNS (2), /* mulsi_const9 */
436 COSTS_N_INSNS (3), /* muldi */
437 COSTS_N_INSNS (34), /* divsi */
438 COSTS_N_INSNS (34), /* divdi */
439 COSTS_N_INSNS (5), /* fp */
440 COSTS_N_INSNS (5), /* dmul */
441 COSTS_N_INSNS (19), /* sdiv */
442 COSTS_N_INSNS (33), /* ddiv */
8b897cfa
RS
443};
444
445/* Instruction costs on PPC601 processors. */
446static const
447struct processor_costs ppc601_cost = {
06a67bdd
RS
448 COSTS_N_INSNS (5), /* mulsi */
449 COSTS_N_INSNS (5), /* mulsi_const */
450 COSTS_N_INSNS (5), /* mulsi_const9 */
451 COSTS_N_INSNS (5), /* muldi */
452 COSTS_N_INSNS (36), /* divsi */
453 COSTS_N_INSNS (36), /* divdi */
454 COSTS_N_INSNS (4), /* fp */
455 COSTS_N_INSNS (5), /* dmul */
456 COSTS_N_INSNS (17), /* sdiv */
457 COSTS_N_INSNS (31), /* ddiv */
8b897cfa
RS
458};
459
460/* Instruction costs on PPC603 processors. */
461static const
462struct processor_costs ppc603_cost = {
06a67bdd
RS
463 COSTS_N_INSNS (5), /* mulsi */
464 COSTS_N_INSNS (3), /* mulsi_const */
465 COSTS_N_INSNS (2), /* mulsi_const9 */
466 COSTS_N_INSNS (5), /* muldi */
467 COSTS_N_INSNS (37), /* divsi */
468 COSTS_N_INSNS (37), /* divdi */
469 COSTS_N_INSNS (3), /* fp */
470 COSTS_N_INSNS (4), /* dmul */
471 COSTS_N_INSNS (18), /* sdiv */
472 COSTS_N_INSNS (33), /* ddiv */
8b897cfa
RS
473};
474
475/* Instruction costs on PPC604 processors. */
476static const
477struct processor_costs ppc604_cost = {
06a67bdd
RS
478 COSTS_N_INSNS (4), /* mulsi */
479 COSTS_N_INSNS (4), /* mulsi_const */
480 COSTS_N_INSNS (4), /* mulsi_const9 */
481 COSTS_N_INSNS (4), /* muldi */
482 COSTS_N_INSNS (20), /* divsi */
483 COSTS_N_INSNS (20), /* divdi */
484 COSTS_N_INSNS (3), /* fp */
485 COSTS_N_INSNS (3), /* dmul */
486 COSTS_N_INSNS (18), /* sdiv */
487 COSTS_N_INSNS (32), /* ddiv */
8b897cfa
RS
488};
489
490/* Instruction costs on PPC604e processors. */
491static const
492struct processor_costs ppc604e_cost = {
06a67bdd
RS
493 COSTS_N_INSNS (2), /* mulsi */
494 COSTS_N_INSNS (2), /* mulsi_const */
495 COSTS_N_INSNS (2), /* mulsi_const9 */
496 COSTS_N_INSNS (2), /* muldi */
497 COSTS_N_INSNS (20), /* divsi */
498 COSTS_N_INSNS (20), /* divdi */
499 COSTS_N_INSNS (3), /* fp */
500 COSTS_N_INSNS (3), /* dmul */
501 COSTS_N_INSNS (18), /* sdiv */
502 COSTS_N_INSNS (32), /* ddiv */
8b897cfa
RS
503};
504
f0517163 505/* Instruction costs on PPC620 processors. */
8b897cfa
RS
506static const
507struct processor_costs ppc620_cost = {
06a67bdd
RS
508 COSTS_N_INSNS (5), /* mulsi */
509 COSTS_N_INSNS (4), /* mulsi_const */
510 COSTS_N_INSNS (3), /* mulsi_const9 */
511 COSTS_N_INSNS (7), /* muldi */
512 COSTS_N_INSNS (21), /* divsi */
513 COSTS_N_INSNS (37), /* divdi */
514 COSTS_N_INSNS (3), /* fp */
515 COSTS_N_INSNS (3), /* dmul */
516 COSTS_N_INSNS (18), /* sdiv */
517 COSTS_N_INSNS (32), /* ddiv */
f0517163
RS
518};
519
520/* Instruction costs on PPC630 processors. */
521static const
522struct processor_costs ppc630_cost = {
06a67bdd
RS
523 COSTS_N_INSNS (5), /* mulsi */
524 COSTS_N_INSNS (4), /* mulsi_const */
525 COSTS_N_INSNS (3), /* mulsi_const9 */
526 COSTS_N_INSNS (7), /* muldi */
527 COSTS_N_INSNS (21), /* divsi */
528 COSTS_N_INSNS (37), /* divdi */
529 COSTS_N_INSNS (3), /* fp */
530 COSTS_N_INSNS (3), /* dmul */
531 COSTS_N_INSNS (17), /* sdiv */
532 COSTS_N_INSNS (21), /* ddiv */
8b897cfa
RS
533};
534
535/* Instruction costs on PPC750 and PPC7400 processors. */
536static const
537struct processor_costs ppc750_cost = {
06a67bdd
RS
538 COSTS_N_INSNS (5), /* mulsi */
539 COSTS_N_INSNS (3), /* mulsi_const */
540 COSTS_N_INSNS (2), /* mulsi_const9 */
541 COSTS_N_INSNS (5), /* muldi */
542 COSTS_N_INSNS (17), /* divsi */
543 COSTS_N_INSNS (17), /* divdi */
544 COSTS_N_INSNS (3), /* fp */
545 COSTS_N_INSNS (3), /* dmul */
546 COSTS_N_INSNS (17), /* sdiv */
547 COSTS_N_INSNS (31), /* ddiv */
8b897cfa
RS
548};
549
550/* Instruction costs on PPC7450 processors. */
551static const
552struct processor_costs ppc7450_cost = {
06a67bdd
RS
553 COSTS_N_INSNS (4), /* mulsi */
554 COSTS_N_INSNS (3), /* mulsi_const */
555 COSTS_N_INSNS (3), /* mulsi_const9 */
556 COSTS_N_INSNS (4), /* muldi */
557 COSTS_N_INSNS (23), /* divsi */
558 COSTS_N_INSNS (23), /* divdi */
559 COSTS_N_INSNS (5), /* fp */
560 COSTS_N_INSNS (5), /* dmul */
561 COSTS_N_INSNS (21), /* sdiv */
562 COSTS_N_INSNS (35), /* ddiv */
8b897cfa 563};
a3170dc6 564
8b897cfa
RS
565/* Instruction costs on PPC8540 processors. */
566static const
567struct processor_costs ppc8540_cost = {
06a67bdd
RS
568 COSTS_N_INSNS (4), /* mulsi */
569 COSTS_N_INSNS (4), /* mulsi_const */
570 COSTS_N_INSNS (4), /* mulsi_const9 */
571 COSTS_N_INSNS (4), /* muldi */
572 COSTS_N_INSNS (19), /* divsi */
573 COSTS_N_INSNS (19), /* divdi */
574 COSTS_N_INSNS (4), /* fp */
575 COSTS_N_INSNS (4), /* dmul */
576 COSTS_N_INSNS (29), /* sdiv */
577 COSTS_N_INSNS (29), /* ddiv */
8b897cfa
RS
578};
579
580/* Instruction costs on POWER4 and POWER5 processors. */
581static const
582struct processor_costs power4_cost = {
06a67bdd
RS
583 COSTS_N_INSNS (3), /* mulsi */
584 COSTS_N_INSNS (2), /* mulsi_const */
585 COSTS_N_INSNS (2), /* mulsi_const9 */
586 COSTS_N_INSNS (4), /* muldi */
587 COSTS_N_INSNS (18), /* divsi */
588 COSTS_N_INSNS (34), /* divdi */
589 COSTS_N_INSNS (3), /* fp */
590 COSTS_N_INSNS (3), /* dmul */
591 COSTS_N_INSNS (17), /* sdiv */
592 COSTS_N_INSNS (17), /* ddiv */
8b897cfa
RS
593};
594
595\f
a2369ed3
DJ
596static bool rs6000_function_ok_for_sibcall (tree, tree);
597static int num_insns_constant_wide (HOST_WIDE_INT);
598static void validate_condition_mode (enum rtx_code, enum machine_mode);
599static rtx rs6000_generate_compare (enum rtx_code);
600static void rs6000_maybe_dead (rtx);
601static void rs6000_emit_stack_tie (void);
602static void rs6000_frame_related (rtx, rtx, HOST_WIDE_INT, rtx, rtx);
603static rtx spe_synthesize_frame_save (rtx);
604static bool spe_func_has_64bit_regs_p (void);
b20a9cca 605static void emit_frame_save (rtx, rtx, enum machine_mode, unsigned int,
d1d0c603 606 int, HOST_WIDE_INT);
a2369ed3
DJ
607static rtx gen_frame_mem_offset (enum machine_mode, rtx, int);
608static void rs6000_emit_allocate_stack (HOST_WIDE_INT, int);
609static unsigned rs6000_hash_constant (rtx);
610static unsigned toc_hash_function (const void *);
611static int toc_hash_eq (const void *, const void *);
612static int constant_pool_expr_1 (rtx, int *, int *);
613static bool constant_pool_expr_p (rtx);
614static bool toc_relative_expr_p (rtx);
615static bool legitimate_small_data_p (enum machine_mode, rtx);
a2369ed3
DJ
616static bool legitimate_indexed_address_p (rtx, int);
617static bool legitimate_indirect_address_p (rtx, int);
4c81e946 618static bool macho_lo_sum_memory_operand (rtx x, enum machine_mode mode);
a2369ed3
DJ
619static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
620static struct machine_function * rs6000_init_machine_status (void);
621static bool rs6000_assemble_integer (rtx, unsigned int, int);
5add3202 622#ifdef HAVE_GAS_HIDDEN
a2369ed3 623static void rs6000_assemble_visibility (tree, int);
5add3202 624#endif
a2369ed3
DJ
625static int rs6000_ra_ever_killed (void);
626static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
8bb418a3 627static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
76d2b81d 628static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
f18eca82 629static const char *rs6000_mangle_fundamental_type (tree);
b86fe7b4 630extern const struct attribute_spec rs6000_attribute_table[];
a2369ed3
DJ
631static void rs6000_set_default_type_attributes (tree);
632static void rs6000_output_function_prologue (FILE *, HOST_WIDE_INT);
633static void rs6000_output_function_epilogue (FILE *, HOST_WIDE_INT);
b20a9cca
AM
634static void rs6000_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
635 tree);
a2369ed3 636static rtx rs6000_emit_set_long_const (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
c6e8c921 637static bool rs6000_return_in_memory (tree, tree);
a2369ed3 638static void rs6000_file_start (void);
7c262518 639#if TARGET_ELF
a2369ed3
DJ
640static unsigned int rs6000_elf_section_type_flags (tree, const char *, int);
641static void rs6000_elf_asm_out_constructor (rtx, int);
642static void rs6000_elf_asm_out_destructor (rtx, int);
643static void rs6000_elf_select_section (tree, int, unsigned HOST_WIDE_INT);
644static void rs6000_elf_unique_section (tree, int);
645static void rs6000_elf_select_rtx_section (enum machine_mode, rtx,
b20a9cca 646 unsigned HOST_WIDE_INT);
a56d7372 647static void rs6000_elf_encode_section_info (tree, rtx, int)
0e5dbd9b 648 ATTRIBUTE_UNUSED;
a2369ed3 649static bool rs6000_elf_in_small_data_p (tree);
7c262518 650#endif
cbaaba19 651#if TARGET_XCOFF
a2369ed3
DJ
652static void rs6000_xcoff_asm_globalize_label (FILE *, const char *);
653static void rs6000_xcoff_asm_named_section (const char *, unsigned int);
654static void rs6000_xcoff_select_section (tree, int, unsigned HOST_WIDE_INT);
655static void rs6000_xcoff_unique_section (tree, int);
656static void rs6000_xcoff_select_rtx_section (enum machine_mode, rtx,
b20a9cca 657 unsigned HOST_WIDE_INT);
a2369ed3
DJ
658static const char * rs6000_xcoff_strip_name_encoding (const char *);
659static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
660static void rs6000_xcoff_file_start (void);
661static void rs6000_xcoff_file_end (void);
f1384257
AM
662#endif
663#if TARGET_MACHO
a2369ed3 664static bool rs6000_binds_local_p (tree);
f1384257 665#endif
a2369ed3
DJ
666static int rs6000_variable_issue (FILE *, int, rtx, int);
667static bool rs6000_rtx_costs (rtx, int, int, int *);
668static int rs6000_adjust_cost (rtx, rtx, rtx, int);
cbe26ab8 669static bool is_microcoded_insn (rtx);
79ae11c4 670static int is_dispatch_slot_restricted (rtx);
cbe26ab8
DN
671static bool is_cracked_insn (rtx);
672static bool is_branch_slot_insn (rtx);
a2369ed3
DJ
673static int rs6000_adjust_priority (rtx, int);
674static int rs6000_issue_rate (void);
569fa502 675static bool rs6000_is_costly_dependence (rtx, rtx, rtx, int, int);
cbe26ab8
DN
676static rtx get_next_active_insn (rtx, rtx);
677static bool insn_terminates_group_p (rtx , enum group_termination);
678static bool is_costly_group (rtx *, rtx);
679static int force_new_group (int, FILE *, rtx *, rtx, bool *, int, int *);
680static int redefine_groups (FILE *, int, rtx, rtx);
681static int pad_groups (FILE *, int, rtx, rtx);
682static void rs6000_sched_finish (FILE *, int);
a2369ed3
DJ
683static int rs6000_use_sched_lookahead (void);
684
685static void rs6000_init_builtins (void);
686static rtx rs6000_expand_unop_builtin (enum insn_code, tree, rtx);
687static rtx rs6000_expand_binop_builtin (enum insn_code, tree, rtx);
688static rtx rs6000_expand_ternop_builtin (enum insn_code, tree, rtx);
689static rtx rs6000_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
690static void altivec_init_builtins (void);
691static void rs6000_common_init_builtins (void);
c15c90bb 692static void rs6000_init_libfuncs (void);
a2369ed3 693
b20a9cca
AM
694static void enable_mask_for_builtins (struct builtin_description *, int,
695 enum rs6000_builtins,
696 enum rs6000_builtins);
7c62e993 697static tree build_opaque_vector_type (tree, int);
a2369ed3
DJ
698static void spe_init_builtins (void);
699static rtx spe_expand_builtin (tree, rtx, bool *);
61bea3b0 700static rtx spe_expand_stv_builtin (enum insn_code, tree);
a2369ed3
DJ
701static rtx spe_expand_predicate_builtin (enum insn_code, tree, rtx);
702static rtx spe_expand_evsel_builtin (enum insn_code, tree, rtx);
703static int rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
d1d0c603
JJ
704static rs6000_stack_t *rs6000_stack_info (void);
705static void debug_stack_info (rs6000_stack_t *);
a2369ed3
DJ
706
707static rtx altivec_expand_builtin (tree, rtx, bool *);
708static rtx altivec_expand_ld_builtin (tree, rtx, bool *);
709static rtx altivec_expand_st_builtin (tree, rtx, bool *);
710static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
711static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
712static rtx altivec_expand_predicate_builtin (enum insn_code,
713 const char *, tree, rtx);
b4a62fa0 714static rtx altivec_expand_lv_builtin (enum insn_code, tree, rtx);
a2369ed3
DJ
715static rtx altivec_expand_stv_builtin (enum insn_code, tree);
716static void rs6000_parse_abi_options (void);
717static void rs6000_parse_alignment_option (void);
718static void rs6000_parse_tls_size_option (void);
5da702b1 719static void rs6000_parse_yes_no_option (const char *, const char *, int *);
a2369ed3
DJ
720static int first_altivec_reg_to_save (void);
721static unsigned int compute_vrsave_mask (void);
d62294f5 722static void compute_save_world_info(rs6000_stack_t *info_ptr);
a2369ed3
DJ
723static void is_altivec_return_reg (rtx, void *);
724static rtx generate_set_vrsave (rtx, rs6000_stack_t *, int);
725int easy_vector_constant (rtx, enum machine_mode);
726static int easy_vector_same (rtx, enum machine_mode);
452a7d36 727static int easy_vector_splat_const (int, enum machine_mode);
a2369ed3
DJ
728static bool is_ev64_opaque_type (tree);
729static rtx rs6000_dwarf_register_span (rtx);
730static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
731static rtx rs6000_tls_get_addr (void);
732static rtx rs6000_got_sym (void);
733static inline int rs6000_tls_symbol_ref_1 (rtx *, void *);
734static const char *rs6000_get_some_local_dynamic_name (void);
735static int rs6000_get_some_local_dynamic_name_1 (rtx *, void *);
ded9bf77 736static rtx rs6000_complex_function_value (enum machine_mode);
b20a9cca 737static rtx rs6000_spe_function_arg (CUMULATIVE_ARGS *,
a2369ed3 738 enum machine_mode, tree);
ec6376ab 739static rtx rs6000_mixed_function_arg (enum machine_mode, tree, int);
b1917422 740static void rs6000_move_block_from_reg (int regno, rtx x, int nregs);
c6e8c921
GK
741static void setup_incoming_varargs (CUMULATIVE_ARGS *,
742 enum machine_mode, tree,
743 int *, int);
8cd5a4e0
RH
744static bool rs6000_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
745 tree, bool);
efdba735
SH
746#if TARGET_MACHO
747static void macho_branch_islands (void);
748static void add_compiler_branch_island (tree, tree, int);
749static int no_previous_def (tree function_name);
750static tree get_prev_label (tree function_name);
751#endif
752
c35d187f 753static tree rs6000_build_builtin_va_list (void);
23a60a04 754static tree rs6000_gimplify_va_arg (tree, tree, tree *, tree *);
fe984136 755static bool rs6000_must_pass_in_stack (enum machine_mode, tree);
17211ab5 756
93f90be6
FJ
757static enum machine_mode rs6000_eh_return_filter_mode (void);
758
17211ab5
GK
759/* Hash table stuff for keeping track of TOC entries. */
760
761struct toc_hash_struct GTY(())
762{
763 /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
764 ASM_OUTPUT_SPECIAL_POOL_ENTRY_P. */
765 rtx key;
766 enum machine_mode key_mode;
767 int labelno;
768};
769
770static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
c81bebd7
MM
771\f
772/* Default register names. */
773char rs6000_reg_names[][8] =
774{
802a0058
MM
775 "0", "1", "2", "3", "4", "5", "6", "7",
776 "8", "9", "10", "11", "12", "13", "14", "15",
777 "16", "17", "18", "19", "20", "21", "22", "23",
778 "24", "25", "26", "27", "28", "29", "30", "31",
779 "0", "1", "2", "3", "4", "5", "6", "7",
780 "8", "9", "10", "11", "12", "13", "14", "15",
781 "16", "17", "18", "19", "20", "21", "22", "23",
782 "24", "25", "26", "27", "28", "29", "30", "31",
783 "mq", "lr", "ctr","ap",
784 "0", "1", "2", "3", "4", "5", "6", "7",
0ac081f6
AH
785 "xer",
786 /* AltiVec registers. */
0cd5e3a1
AH
787 "0", "1", "2", "3", "4", "5", "6", "7",
788 "8", "9", "10", "11", "12", "13", "14", "15",
789 "16", "17", "18", "19", "20", "21", "22", "23",
790 "24", "25", "26", "27", "28", "29", "30", "31",
59a4c851
AH
791 "vrsave", "vscr",
792 /* SPE registers. */
793 "spe_acc", "spefscr"
c81bebd7
MM
794};
795
796#ifdef TARGET_REGNAMES
8b60264b 797static const char alt_reg_names[][8] =
c81bebd7 798{
802a0058
MM
799 "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7",
800 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
801 "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
802 "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
803 "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
804 "%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
805 "%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
806 "%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
807 "mq", "lr", "ctr", "ap",
808 "%cr0", "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
0ac081f6 809 "xer",
59a4c851 810 /* AltiVec registers. */
0ac081f6 811 "%v0", "%v1", "%v2", "%v3", "%v4", "%v5", "%v6", "%v7",
59a4c851
AH
812 "%v8", "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
813 "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
814 "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
815 "vrsave", "vscr",
816 /* SPE registers. */
817 "spe_acc", "spefscr"
c81bebd7
MM
818};
819#endif
9878760c 820\f
daf11973
MM
821#ifndef MASK_STRICT_ALIGN
822#define MASK_STRICT_ALIGN 0
823#endif
ffcfcb5f
AM
824#ifndef TARGET_PROFILE_KERNEL
825#define TARGET_PROFILE_KERNEL 0
826#endif
3961e8fe
RH
827
828/* The VRSAVE bitmask puts bit %v0 as the most significant bit. */
829#define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
c4501e62
JJ
830
831/* Return 1 for a symbol ref for a thread-local storage symbol. */
832#define RS6000_SYMBOL_REF_TLS_P(RTX) \
833 (GET_CODE (RTX) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (RTX) != 0)
672a6f42
NB
834\f
835/* Initialize the GCC target structure. */
91d231cb
JM
836#undef TARGET_ATTRIBUTE_TABLE
837#define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
a5c76ee6
ZW
838#undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
839#define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
daf11973 840
301d03af
RS
841#undef TARGET_ASM_ALIGNED_DI_OP
842#define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
843
844/* Default unaligned ops are only provided for ELF. Find the ops needed
845 for non-ELF systems. */
846#ifndef OBJECT_FORMAT_ELF
cbaaba19 847#if TARGET_XCOFF
ae6c1efd 848/* For XCOFF. rs6000_assemble_integer will handle unaligned DIs on
301d03af
RS
849 64-bit targets. */
850#undef TARGET_ASM_UNALIGNED_HI_OP
851#define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
852#undef TARGET_ASM_UNALIGNED_SI_OP
853#define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
854#undef TARGET_ASM_UNALIGNED_DI_OP
855#define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
856#else
857/* For Darwin. */
858#undef TARGET_ASM_UNALIGNED_HI_OP
859#define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
860#undef TARGET_ASM_UNALIGNED_SI_OP
861#define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
49bd1d27
SS
862#undef TARGET_ASM_UNALIGNED_DI_OP
863#define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"
864#undef TARGET_ASM_ALIGNED_DI_OP
865#define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
301d03af
RS
866#endif
867#endif
868
869/* This hook deals with fixups for relocatable code and DI-mode objects
870 in 64-bit code. */
871#undef TARGET_ASM_INTEGER
872#define TARGET_ASM_INTEGER rs6000_assemble_integer
873
93638d7a
AM
874#ifdef HAVE_GAS_HIDDEN
875#undef TARGET_ASM_ASSEMBLE_VISIBILITY
876#define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
877#endif
878
c4501e62
JJ
879#undef TARGET_HAVE_TLS
880#define TARGET_HAVE_TLS HAVE_AS_TLS
881
882#undef TARGET_CANNOT_FORCE_CONST_MEM
883#define TARGET_CANNOT_FORCE_CONST_MEM rs6000_tls_referenced_p
884
08c148a8
NB
885#undef TARGET_ASM_FUNCTION_PROLOGUE
886#define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
887#undef TARGET_ASM_FUNCTION_EPILOGUE
888#define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
889
b54cf83a
DE
890#undef TARGET_SCHED_VARIABLE_ISSUE
891#define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
892
c237e94a
ZW
893#undef TARGET_SCHED_ISSUE_RATE
894#define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
895#undef TARGET_SCHED_ADJUST_COST
896#define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
897#undef TARGET_SCHED_ADJUST_PRIORITY
898#define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
569fa502
DN
899#undef TARGET_SCHED_IS_COSTLY_DEPENDENCE
900#define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence
cbe26ab8
DN
901#undef TARGET_SCHED_FINISH
902#define TARGET_SCHED_FINISH rs6000_sched_finish
c237e94a 903
be12c2b0
VM
904#undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
905#define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
906
0ac081f6
AH
907#undef TARGET_INIT_BUILTINS
908#define TARGET_INIT_BUILTINS rs6000_init_builtins
909
910#undef TARGET_EXPAND_BUILTIN
911#define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
912
f18eca82
ZL
913#undef TARGET_MANGLE_FUNDAMENTAL_TYPE
914#define TARGET_MANGLE_FUNDAMENTAL_TYPE rs6000_mangle_fundamental_type
915
c15c90bb
ZW
916#undef TARGET_INIT_LIBFUNCS
917#define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs
918
f1384257 919#if TARGET_MACHO
0e5dbd9b
DE
920#undef TARGET_BINDS_LOCAL_P
921#define TARGET_BINDS_LOCAL_P rs6000_binds_local_p
f1384257 922#endif
0e5dbd9b 923
3961e8fe
RH
924#undef TARGET_ASM_OUTPUT_MI_THUNK
925#define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
926
3961e8fe 927#undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
5b71a4e7 928#define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_tree_hwi_hwi_tree_true
00b960c7 929
4977bab6
ZW
930#undef TARGET_FUNCTION_OK_FOR_SIBCALL
931#define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
932
3c50106f
RH
933#undef TARGET_RTX_COSTS
934#define TARGET_RTX_COSTS rs6000_rtx_costs
dcefdf67
RH
935#undef TARGET_ADDRESS_COST
936#define TARGET_ADDRESS_COST hook_int_rtx_0
3c50106f 937
c8e4f0e9
AH
938#undef TARGET_VECTOR_OPAQUE_P
939#define TARGET_VECTOR_OPAQUE_P is_ev64_opaque_type
62e1dfcf 940
96714395
AH
941#undef TARGET_DWARF_REGISTER_SPAN
942#define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
943
c6e8c921
GK
944/* On rs6000, function arguments are promoted, as are function return
945 values. */
946#undef TARGET_PROMOTE_FUNCTION_ARGS
947#define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
948#undef TARGET_PROMOTE_FUNCTION_RETURN
949#define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
950
c6e8c921
GK
951#undef TARGET_RETURN_IN_MEMORY
952#define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory
953
954#undef TARGET_SETUP_INCOMING_VARARGS
955#define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs
956
957/* Always strict argument naming on rs6000. */
958#undef TARGET_STRICT_ARGUMENT_NAMING
959#define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
960#undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
961#define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
42ba5130
RH
962#undef TARGET_SPLIT_COMPLEX_ARG
963#define TARGET_SPLIT_COMPLEX_ARG hook_bool_tree_true
fe984136
RH
964#undef TARGET_MUST_PASS_IN_STACK
965#define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack
8cd5a4e0
RH
966#undef TARGET_PASS_BY_REFERENCE
967#define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference
c6e8c921 968
c35d187f
RH
969#undef TARGET_BUILD_BUILTIN_VA_LIST
970#define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list
971
cd3ce9b4
JM
972#undef TARGET_GIMPLIFY_VA_ARG_EXPR
973#define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
974
93f90be6
FJ
975#undef TARGET_EH_RETURN_FILTER_MODE
976#define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
977
f6897b10 978struct gcc_target targetm = TARGET_INITIALIZER;
672a6f42 979\f
0d1fbc8c
AH
980
981/* Value is 1 if hard register REGNO can hold a value of machine-mode
982 MODE. */
983static int
984rs6000_hard_regno_mode_ok (int regno, enum machine_mode mode)
985{
986 /* The GPRs can hold any mode, but values bigger than one register
987 cannot go past R31. */
988 if (INT_REGNO_P (regno))
989 return INT_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1);
990
991 /* The float registers can only hold floating modes and DImode. */
992 if (FP_REGNO_P (regno))
993 return
994 (GET_MODE_CLASS (mode) == MODE_FLOAT
995 && FP_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1))
996 || (GET_MODE_CLASS (mode) == MODE_INT
997 && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD);
998
999 /* The CR register can only hold CC modes. */
1000 if (CR_REGNO_P (regno))
1001 return GET_MODE_CLASS (mode) == MODE_CC;
1002
1003 if (XER_REGNO_P (regno))
1004 return mode == PSImode;
1005
1006 /* AltiVec only in AldyVec registers. */
1007 if (ALTIVEC_REGNO_P (regno))
1008 return ALTIVEC_VECTOR_MODE (mode);
1009
1010 /* ...but GPRs can hold SIMD data on the SPE in one register. */
1011 if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
1012 return 1;
1013
1014 /* We cannot put TImode anywhere except general register and it must be
1015 able to fit within the register set. */
1016
1017 return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;
1018}
1019
1020/* Initialize rs6000_hard_regno_mode_ok_p table. */
1021static void
1022rs6000_init_hard_regno_mode_ok (void)
1023{
1024 int r, m;
1025
1026 for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r)
1027 for (m = 0; m < NUM_MACHINE_MODES; ++m)
1028 if (rs6000_hard_regno_mode_ok (r, m))
1029 rs6000_hard_regno_mode_ok_p[m][r] = true;
1030}
1031
c1e55850
GK
1032/* If not otherwise specified by a target, make 'long double' equivalent to
1033 'double'. */
1034
1035#ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE
1036#define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64
1037#endif
1038
5248c961
RK
1039/* Override command line options. Mostly we process the processor
1040 type and sometimes adjust other TARGET_ options. */
1041
1042void
d779d0dc 1043rs6000_override_options (const char *default_cpu)
5248c961 1044{
c4d38ccb 1045 size_t i, j;
8e3f41e7 1046 struct rs6000_cpu_select *ptr;
66188a7e 1047 int set_masks;
5248c961 1048
66188a7e 1049 /* Simplifications for entries below. */
85638c0d 1050
66188a7e
GK
1051 enum {
1052 POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS,
1053 POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC
1054 };
85638c0d 1055
66188a7e
GK
1056 /* This table occasionally claims that a processor does not support
1057 a particular feature even though it does, but the feature is slower
1058 than the alternative. Thus, it shouldn't be relied on as a
1059 complete description of the processor's support.
1060
1061 Please keep this list in order, and don't forget to update the
1062 documentation in invoke.texi when adding a new processor or
1063 flag. */
5248c961
RK
1064 static struct ptt
1065 {
8b60264b
KG
1066 const char *const name; /* Canonical processor name. */
1067 const enum processor_type processor; /* Processor type enum value. */
1068 const int target_enable; /* Target flags to enable. */
8b60264b 1069 } const processor_target_table[]
66188a7e 1070 = {{"401", PROCESSOR_PPC403, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
49a0b204 1071 {"403", PROCESSOR_PPC403,
66188a7e
GK
1072 POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_STRICT_ALIGN},
1073 {"405", PROCESSOR_PPC405, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1074 {"405fp", PROCESSOR_PPC405, POWERPC_BASE_MASK},
1075 {"440", PROCESSOR_PPC440, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1076 {"440fp", PROCESSOR_PPC440, POWERPC_BASE_MASK},
1077 {"505", PROCESSOR_MPCCORE, POWERPC_BASE_MASK},
5248c961 1078 {"601", PROCESSOR_PPC601,
66188a7e
GK
1079 MASK_POWER | POWERPC_BASE_MASK | MASK_MULTIPLE | MASK_STRING},
1080 {"602", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1081 {"603", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1082 {"603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1083 {"604", PROCESSOR_PPC604, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1084 {"604e", PROCESSOR_PPC604e, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
7ddb6568
AM
1085 {"620", PROCESSOR_PPC620,
1086 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1087 {"630", PROCESSOR_PPC630,
1088 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
66188a7e
GK
1089 {"740", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1090 {"7400", PROCESSOR_PPC7400, POWERPC_7400_MASK},
1091 {"7450", PROCESSOR_PPC7450, POWERPC_7400_MASK},
1092 {"750", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1093 {"801", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1094 {"821", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1095 {"823", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1096 {"8540", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1097 {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
7177e720 1098 {"970", PROCESSOR_POWER4,
66188a7e
GK
1099 POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1100 {"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS},
1101 {"ec603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_SOFT_FLOAT},
1102 {"G3", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT},
1103 {"G4", PROCESSOR_PPC7450, POWERPC_7400_MASK},
49ffe578 1104 {"G5", PROCESSOR_POWER4,
66188a7e
GK
1105 POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64},
1106 {"power", PROCESSOR_POWER, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1107 {"power2", PROCESSOR_POWER,
1108 MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
7ddb6568
AM
1109 {"power3", PROCESSOR_PPC630,
1110 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
1111 {"power4", PROCESSOR_POWER4,
fc091c8e 1112 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POWERPC64},
ec507f2d 1113 {"power5", PROCESSOR_POWER5,
fc091c8e 1114 POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POWERPC64},
66188a7e
GK
1115 {"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK},
1116 {"powerpc64", PROCESSOR_POWERPC64,
1117 POWERPC_BASE_MASK | MASK_POWERPC64},
1118 {"rios", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1119 {"rios1", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1120 {"rios2", PROCESSOR_RIOS2,
1121 MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING},
1122 {"rsc", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
1123 {"rsc1", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING},
7ddb6568 1124 {"rs64a", PROCESSOR_RS64A, POWERPC_BASE_MASK | MASK_POWERPC64},
66188a7e 1125 };
5248c961 1126
ca7558fc 1127 const size_t ptt_size = ARRAY_SIZE (processor_target_table);
5248c961 1128
66188a7e
GK
1129 /* Some OSs don't support saving the high part of 64-bit registers on
1130 context switch. Other OSs don't support saving Altivec registers.
1131 On those OSs, we don't touch the MASK_POWERPC64 or MASK_ALTIVEC
1132 settings; if the user wants either, the user must explicitly specify
1133 them and we won't interfere with the user's specification. */
1134
1135 enum {
1136 POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
1137 POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT
1138 | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
1139 | MASK_MFCRF)
1140 };
0d1fbc8c
AH
1141
1142 rs6000_init_hard_regno_mode_ok ();
1143
66188a7e
GK
1144 set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;
1145#ifdef OS_MISSING_POWERPC64
1146 if (OS_MISSING_POWERPC64)
1147 set_masks &= ~MASK_POWERPC64;
1148#endif
1149#ifdef OS_MISSING_ALTIVEC
1150 if (OS_MISSING_ALTIVEC)
1151 set_masks &= ~MASK_ALTIVEC;
1152#endif
1153
957211c3
AM
1154 /* Don't override these by the processor default if given explicitly. */
1155 set_masks &= ~(target_flags_explicit
1156 & (MASK_MULTIPLE | MASK_STRING | MASK_SOFT_FLOAT));
1157
a4f6c312 1158 /* Identify the processor type. */
8e3f41e7 1159 rs6000_select[0].string = default_cpu;
3cb999d8 1160 rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
8e3f41e7 1161
b6a1cbae 1162 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
5248c961 1163 {
8e3f41e7
MM
1164 ptr = &rs6000_select[i];
1165 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
5248c961 1166 {
8e3f41e7
MM
1167 for (j = 0; j < ptt_size; j++)
1168 if (! strcmp (ptr->string, processor_target_table[j].name))
1169 {
1170 if (ptr->set_tune_p)
1171 rs6000_cpu = processor_target_table[j].processor;
1172
1173 if (ptr->set_arch_p)
1174 {
66188a7e
GK
1175 target_flags &= ~set_masks;
1176 target_flags |= (processor_target_table[j].target_enable
1177 & set_masks);
8e3f41e7
MM
1178 }
1179 break;
1180 }
1181
4406229e 1182 if (j == ptt_size)
8e3f41e7 1183 error ("bad value (%s) for %s switch", ptr->string, ptr->name);
5248c961
RK
1184 }
1185 }
8a61d227 1186
993f19a8 1187 if (TARGET_E500)
a3170dc6
AH
1188 rs6000_isel = 1;
1189
dff9f1b6
DE
1190 /* If we are optimizing big endian systems for space, use the load/store
1191 multiple and string instructions. */
ef792183 1192 if (BYTES_BIG_ENDIAN && optimize_size)
957211c3 1193 target_flags |= ~target_flags_explicit & (MASK_MULTIPLE | MASK_STRING);
938937d8 1194
a4f6c312
SS
1195 /* Don't allow -mmultiple or -mstring on little endian systems
1196 unless the cpu is a 750, because the hardware doesn't support the
1197 instructions used in little endian mode, and causes an alignment
1198 trap. The 750 does not cause an alignment trap (except when the
1199 target is unaligned). */
bef84347 1200
b21fb038 1201 if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
7e69e155
MM
1202 {
1203 if (TARGET_MULTIPLE)
1204 {
1205 target_flags &= ~MASK_MULTIPLE;
b21fb038 1206 if ((target_flags_explicit & MASK_MULTIPLE) != 0)
7e69e155
MM
1207 warning ("-mmultiple is not supported on little endian systems");
1208 }
1209
1210 if (TARGET_STRING)
1211 {
1212 target_flags &= ~MASK_STRING;
b21fb038 1213 if ((target_flags_explicit & MASK_STRING) != 0)
938937d8 1214 warning ("-mstring is not supported on little endian systems");
7e69e155
MM
1215 }
1216 }
3933e0e1 1217
38c1f2d7
MM
1218 /* Set debug flags */
1219 if (rs6000_debug_name)
1220 {
bfc79d3b 1221 if (! strcmp (rs6000_debug_name, "all"))
38c1f2d7 1222 rs6000_debug_stack = rs6000_debug_arg = 1;
bfc79d3b 1223 else if (! strcmp (rs6000_debug_name, "stack"))
38c1f2d7 1224 rs6000_debug_stack = 1;
bfc79d3b 1225 else if (! strcmp (rs6000_debug_name, "arg"))
38c1f2d7
MM
1226 rs6000_debug_arg = 1;
1227 else
c725bd79 1228 error ("unknown -mdebug-%s switch", rs6000_debug_name);
38c1f2d7
MM
1229 }
1230
57ac7be9
AM
1231 if (rs6000_traceback_name)
1232 {
1233 if (! strncmp (rs6000_traceback_name, "full", 4))
1234 rs6000_traceback = traceback_full;
1235 else if (! strncmp (rs6000_traceback_name, "part", 4))
1236 rs6000_traceback = traceback_part;
1237 else if (! strncmp (rs6000_traceback_name, "no", 2))
1238 rs6000_traceback = traceback_none;
1239 else
1240 error ("unknown -mtraceback arg `%s'; expecting `full', `partial' or `none'",
1241 rs6000_traceback_name);
1242 }
1243
6fa3f289 1244 /* Set size of long double */
c1e55850 1245 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
6fa3f289
ZW
1246 if (rs6000_long_double_size_string)
1247 {
1248 char *tail;
1249 int size = strtol (rs6000_long_double_size_string, &tail, 10);
1250 if (*tail != '\0' || (size != 64 && size != 128))
1251 error ("Unknown switch -mlong-double-%s",
1252 rs6000_long_double_size_string);
1253 else
1254 rs6000_long_double_type_size = size;
1255 }
1256
6d0ef01e
HP
1257 /* Set Altivec ABI as default for powerpc64 linux. */
1258 if (TARGET_ELF && TARGET_64BIT)
1259 {
1260 rs6000_altivec_abi = 1;
1261 rs6000_altivec_vrsave = 1;
1262 }
1263
0ac081f6
AH
1264 /* Handle -mabi= options. */
1265 rs6000_parse_abi_options ();
1266
025d9908
KH
1267 /* Handle -malign-XXXXX option. */
1268 rs6000_parse_alignment_option ();
1269
5da702b1
AH
1270 /* Handle generic -mFOO=YES/NO options. */
1271 rs6000_parse_yes_no_option ("vrsave", rs6000_altivec_vrsave_string,
1272 &rs6000_altivec_vrsave);
1273 rs6000_parse_yes_no_option ("isel", rs6000_isel_string,
1274 &rs6000_isel);
1275 rs6000_parse_yes_no_option ("spe", rs6000_spe_string, &rs6000_spe);
1276 rs6000_parse_yes_no_option ("float-gprs", rs6000_float_gprs_string,
1277 &rs6000_float_gprs);
993f19a8 1278
c4501e62
JJ
1279 /* Handle -mtls-size option. */
1280 rs6000_parse_tls_size_option ();
1281
a7ae18e2
AH
1282#ifdef SUBTARGET_OVERRIDE_OPTIONS
1283 SUBTARGET_OVERRIDE_OPTIONS;
1284#endif
1285#ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
1286 SUBSUBTARGET_OVERRIDE_OPTIONS;
1287#endif
1288
5da702b1
AH
1289 if (TARGET_E500)
1290 {
e4463bf1
AH
1291 if (TARGET_ALTIVEC)
1292 error ("AltiVec and E500 instructions cannot coexist");
1293
5da702b1
AH
1294 /* The e500 does not have string instructions, and we set
1295 MASK_STRING above when optimizing for size. */
1296 if ((target_flags & MASK_STRING) != 0)
1297 target_flags = target_flags & ~MASK_STRING;
b6e59a3a
AH
1298
1299 /* No SPE means 64-bit long doubles, even if an E500. */
1300 if (rs6000_spe_string != 0
1301 && !strcmp (rs6000_spe_string, "no"))
1302 rs6000_long_double_type_size = 64;
5da702b1
AH
1303 }
1304 else if (rs6000_select[1].string != NULL)
1305 {
1306 /* For the powerpc-eabispe configuration, we set all these by
1307 default, so let's unset them if we manually set another
1308 CPU that is not the E500. */
1309 if (rs6000_abi_string == 0)
1310 rs6000_spe_abi = 0;
1311 if (rs6000_spe_string == 0)
1312 rs6000_spe = 0;
1313 if (rs6000_float_gprs_string == 0)
1314 rs6000_float_gprs = 0;
1315 if (rs6000_isel_string == 0)
1316 rs6000_isel = 0;
b6e59a3a 1317 if (rs6000_long_double_size_string == 0)
c1e55850 1318 rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE;
5da702b1 1319 }
b5044283 1320
ec507f2d
DE
1321 rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4
1322 && rs6000_cpu != PROCESSOR_POWER5);
1323 rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4
1324 || rs6000_cpu == PROCESSOR_POWER5);
1325
a5c76ee6
ZW
1326 /* Handle -m(no-)longcall option. This is a bit of a cheap hack,
1327 using TARGET_OPTIONS to handle a toggle switch, but we're out of
1328 bits in target_flags so TARGET_SWITCHES cannot be used.
1329 Assumption here is that rs6000_longcall_switch points into the
1330 text of the complete option, rather than being a copy, so we can
1331 scan back for the presence or absence of the no- modifier. */
1332 if (rs6000_longcall_switch)
1333 {
1334 const char *base = rs6000_longcall_switch;
1335 while (base[-1] != 'm') base--;
1336
1337 if (*rs6000_longcall_switch != '\0')
1338 error ("invalid option `%s'", base);
1339 rs6000_default_long_calls = (base[0] != 'n');
1340 }
1341
8bb418a3
ZL
1342 /* Handle -m(no-)warn-altivec-long similarly. */
1343 if (rs6000_warn_altivec_long_switch)
1344 {
1345 const char *base = rs6000_warn_altivec_long_switch;
1346 while (base[-1] != 'm') base--;
1347
1348 if (*rs6000_warn_altivec_long_switch != '\0')
1349 error ("invalid option `%s'", base);
1350 rs6000_warn_altivec_long = (base[0] != 'n');
1351 }
1352
cbe26ab8 1353 /* Handle -mprioritize-restricted-insns option. */
ec507f2d
DE
1354 rs6000_sched_restricted_insns_priority
1355 = (rs6000_sched_groups ? 1 : 0);
79ae11c4
DN
1356 if (rs6000_sched_restricted_insns_priority_str)
1357 rs6000_sched_restricted_insns_priority =
1358 atoi (rs6000_sched_restricted_insns_priority_str);
1359
569fa502 1360 /* Handle -msched-costly-dep option. */
ec507f2d
DE
1361 rs6000_sched_costly_dep
1362 = (rs6000_sched_groups ? store_to_load_dep_costly : no_dep_costly);
569fa502
DN
1363 if (rs6000_sched_costly_dep_str)
1364 {
1365 if (! strcmp (rs6000_sched_costly_dep_str, "no"))
1366 rs6000_sched_costly_dep = no_dep_costly;
1367 else if (! strcmp (rs6000_sched_costly_dep_str, "all"))
1368 rs6000_sched_costly_dep = all_deps_costly;
1369 else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load"))
1370 rs6000_sched_costly_dep = true_store_to_load_dep_costly;
1371 else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load"))
1372 rs6000_sched_costly_dep = store_to_load_dep_costly;
cbe26ab8
DN
1373 else
1374 rs6000_sched_costly_dep = atoi (rs6000_sched_costly_dep_str);
1375 }
1376
1377 /* Handle -minsert-sched-nops option. */
ec507f2d
DE
1378 rs6000_sched_insert_nops
1379 = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none);
cbe26ab8
DN
1380 if (rs6000_sched_insert_nops_str)
1381 {
1382 if (! strcmp (rs6000_sched_insert_nops_str, "no"))
1383 rs6000_sched_insert_nops = sched_finish_none;
1384 else if (! strcmp (rs6000_sched_insert_nops_str, "pad"))
1385 rs6000_sched_insert_nops = sched_finish_pad_groups;
1386 else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact"))
1387 rs6000_sched_insert_nops = sched_finish_regroup_exact;
1388 else
1389 rs6000_sched_insert_nops = atoi (rs6000_sched_insert_nops_str);
569fa502
DN
1390 }
1391
c81bebd7 1392#ifdef TARGET_REGNAMES
a4f6c312
SS
1393 /* If the user desires alternate register names, copy in the
1394 alternate names now. */
c81bebd7 1395 if (TARGET_REGNAMES)
4e135bdd 1396 memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
c81bebd7
MM
1397#endif
1398
6fa3f289
ZW
1399 /* Set TARGET_AIX_STRUCT_RET last, after the ABI is determined.
1400 If -maix-struct-return or -msvr4-struct-return was explicitly
1401 used, don't override with the ABI default. */
b21fb038 1402 if ((target_flags_explicit & MASK_AIX_STRUCT_RET) == 0)
6fa3f289
ZW
1403 {
1404 if (DEFAULT_ABI == ABI_V4 && !DRAFT_V4_STRUCT_RET)
1405 target_flags = (target_flags & ~MASK_AIX_STRUCT_RET);
1406 else
1407 target_flags |= MASK_AIX_STRUCT_RET;
1408 }
1409
fcce224d
DE
1410 if (TARGET_LONG_DOUBLE_128
1411 && (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN))
70a01792 1412 REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
fcce224d 1413
9ebbca7d
GK
1414 /* Allocate an alias set for register saves & restores from stack. */
1415 rs6000_sr_alias_set = new_alias_set ();
1416
1417 if (TARGET_TOC)
1418 ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
71f123ca 1419
301d03af
RS
1420 /* We can only guarantee the availability of DI pseudo-ops when
1421 assembling for 64-bit targets. */
ae6c1efd 1422 if (!TARGET_64BIT)
301d03af
RS
1423 {
1424 targetm.asm_out.aligned_op.di = NULL;
1425 targetm.asm_out.unaligned_op.di = NULL;
1426 }
1427
2792d578
DE
1428 /* Set maximum branch target alignment at two instructions, eight bytes. */
1429 align_jumps_max_skip = 8;
1430 align_loops_max_skip = 8;
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. */
1437 if (DEFAULT_ABI != ABI_AIX)
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:
1517 abort ();
1518 }
5248c961 1519}
5accd822 1520
5da702b1
AH
1521/* Handle generic options of the form -mfoo=yes/no.
1522 NAME is the option name.
1523 VALUE is the option value.
1524 FLAG is the pointer to the flag where to store a 1 or 0, depending on
1525 whether the option value is 'yes' or 'no' respectively. */
993f19a8 1526static void
5da702b1 1527rs6000_parse_yes_no_option (const char *name, const char *value, int *flag)
993f19a8 1528{
5da702b1 1529 if (value == 0)
993f19a8 1530 return;
5da702b1
AH
1531 else if (!strcmp (value, "yes"))
1532 *flag = 1;
1533 else if (!strcmp (value, "no"))
1534 *flag = 0;
08b57fb3 1535 else
5da702b1 1536 error ("unknown -m%s= option specified: '%s'", name, value);
08b57fb3
AH
1537}
1538
0ac081f6 1539/* Handle -mabi= options. */
00b960c7 1540static void
863d938c 1541rs6000_parse_abi_options (void)
0ac081f6
AH
1542{
1543 if (rs6000_abi_string == 0)
1544 return;
1545 else if (! strcmp (rs6000_abi_string, "altivec"))
5cc73f91
AH
1546 {
1547 rs6000_altivec_abi = 1;
1548 rs6000_spe_abi = 0;
1549 }
76a773f3
AH
1550 else if (! strcmp (rs6000_abi_string, "no-altivec"))
1551 rs6000_altivec_abi = 0;
a3170dc6 1552 else if (! strcmp (rs6000_abi_string, "spe"))
01f4962d
NS
1553 {
1554 rs6000_spe_abi = 1;
5cc73f91 1555 rs6000_altivec_abi = 0;
01f4962d
NS
1556 if (!TARGET_SPE_ABI)
1557 error ("not configured for ABI: '%s'", rs6000_abi_string);
1558 }
1559
a3170dc6
AH
1560 else if (! strcmp (rs6000_abi_string, "no-spe"))
1561 rs6000_spe_abi = 0;
0ac081f6 1562 else
c725bd79 1563 error ("unknown ABI specified: '%s'", rs6000_abi_string);
0ac081f6
AH
1564}
1565
025d9908
KH
1566/* Handle -malign-XXXXXX options. */
1567static void
863d938c 1568rs6000_parse_alignment_option (void)
025d9908 1569{
b20a9cca
AM
1570 if (rs6000_alignment_string == 0)
1571 return;
1572 else if (! strcmp (rs6000_alignment_string, "power"))
025d9908
KH
1573 rs6000_alignment_flags = MASK_ALIGN_POWER;
1574 else if (! strcmp (rs6000_alignment_string, "natural"))
1575 rs6000_alignment_flags = MASK_ALIGN_NATURAL;
1576 else
1577 error ("unknown -malign-XXXXX option specified: '%s'",
1578 rs6000_alignment_string);
1579}
1580
c4501e62
JJ
1581/* Validate and record the size specified with the -mtls-size option. */
1582
1583static void
863d938c 1584rs6000_parse_tls_size_option (void)
c4501e62
JJ
1585{
1586 if (rs6000_tls_size_string == 0)
1587 return;
1588 else if (strcmp (rs6000_tls_size_string, "16") == 0)
1589 rs6000_tls_size = 16;
1590 else if (strcmp (rs6000_tls_size_string, "32") == 0)
1591 rs6000_tls_size = 32;
1592 else if (strcmp (rs6000_tls_size_string, "64") == 0)
1593 rs6000_tls_size = 64;
1594 else
1595 error ("bad value `%s' for -mtls-size switch", rs6000_tls_size_string);
1596}
1597
5accd822 1598void
a2369ed3 1599optimization_options (int level ATTRIBUTE_UNUSED, int size ATTRIBUTE_UNUSED)
5accd822 1600{
5accd822 1601}
3cfa4909
MM
1602\f
1603/* Do anything needed at the start of the asm file. */
1604
1bc7c5b6 1605static void
863d938c 1606rs6000_file_start (void)
3cfa4909 1607{
c4d38ccb 1608 size_t i;
3cfa4909 1609 char buffer[80];
d330fd93 1610 const char *start = buffer;
3cfa4909 1611 struct rs6000_cpu_select *ptr;
1bc7c5b6
ZW
1612 const char *default_cpu = TARGET_CPU_DEFAULT;
1613 FILE *file = asm_out_file;
1614
1615 default_file_start ();
1616
1617#ifdef TARGET_BI_ARCH
1618 if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
1619 default_cpu = 0;
1620#endif
3cfa4909
MM
1621
1622 if (flag_verbose_asm)
1623 {
1624 sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
1625 rs6000_select[0].string = default_cpu;
1626
b6a1cbae 1627 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
3cfa4909
MM
1628 {
1629 ptr = &rs6000_select[i];
1630 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
1631 {
1632 fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
1633 start = "";
1634 }
1635 }
1636
b91da81f 1637#ifdef USING_ELFOS_H
3cfa4909
MM
1638 switch (rs6000_sdata)
1639 {
1640 case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
1641 case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
1642 case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
1643 case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
1644 }
1645
1646 if (rs6000_sdata && g_switch_value)
1647 {
307b599c
MK
1648 fprintf (file, "%s -G " HOST_WIDE_INT_PRINT_UNSIGNED, start,
1649 g_switch_value);
3cfa4909
MM
1650 start = "";
1651 }
1652#endif
1653
1654 if (*start == '\0')
949ea356 1655 putc ('\n', file);
3cfa4909
MM
1656 }
1657}
5248c961 1658\f
a0ab749a 1659/* Return nonzero if this function is known to have a null epilogue. */
9878760c
RK
1660
1661int
863d938c 1662direct_return (void)
9878760c 1663{
4697a36c
MM
1664 if (reload_completed)
1665 {
1666 rs6000_stack_t *info = rs6000_stack_info ();
1667
1668 if (info->first_gp_reg_save == 32
1669 && info->first_fp_reg_save == 64
00b960c7 1670 && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
c81fc13e
DE
1671 && ! info->lr_save_p
1672 && ! info->cr_save_p
00b960c7 1673 && info->vrsave_mask == 0
c81fc13e 1674 && ! info->push_p)
4697a36c
MM
1675 return 1;
1676 }
1677
1678 return 0;
9878760c
RK
1679}
1680
1681/* Returns 1 always. */
1682
1683int
a2369ed3
DJ
1684any_operand (rtx op ATTRIBUTE_UNUSED,
1685 enum machine_mode mode ATTRIBUTE_UNUSED)
9878760c
RK
1686{
1687 return 1;
1688}
1689
85d346f1
DE
1690/* Returns 1 always. */
1691
1692int
1693any_parallel_operand (rtx op ATTRIBUTE_UNUSED,
1694 enum machine_mode mode ATTRIBUTE_UNUSED)
1695{
1696 return 1;
1697}
1698
a4f6c312 1699/* Returns 1 if op is the count register. */
85d346f1 1700
38c1f2d7 1701int
a2369ed3 1702count_register_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
b6c9286a
MM
1703{
1704 if (GET_CODE (op) != REG)
1705 return 0;
1706
1707 if (REGNO (op) == COUNT_REGISTER_REGNUM)
1708 return 1;
1709
1710 if (REGNO (op) > FIRST_PSEUDO_REGISTER)
1711 return 1;
1712
1713 return 0;
1714}
1715
0ec4e2a8 1716/* Returns 1 if op is an altivec register. */
85d346f1 1717
0ec4e2a8 1718int
a2369ed3 1719altivec_register_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
0ec4e2a8
AH
1720{
1721
1722 return (register_operand (op, mode)
1723 && (GET_CODE (op) != REG
1724 || REGNO (op) > FIRST_PSEUDO_REGISTER
1725 || ALTIVEC_REGNO_P (REGNO (op))));
1726}
1727
38c1f2d7 1728int
a2369ed3 1729xer_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
802a0058
MM
1730{
1731 if (GET_CODE (op) != REG)
1732 return 0;
1733
9ebbca7d 1734 if (XER_REGNO_P (REGNO (op)))
802a0058
MM
1735 return 1;
1736
802a0058
MM
1737 return 0;
1738}
1739
c859cda6 1740/* Return 1 if OP is a signed 8-bit constant. Int multiplication
6f317ef3 1741 by such constants completes more quickly. */
c859cda6
DJ
1742
1743int
a2369ed3 1744s8bit_cint_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
c859cda6
DJ
1745{
1746 return ( GET_CODE (op) == CONST_INT
1747 && (INTVAL (op) >= -128 && INTVAL (op) <= 127));
1748}
1749
9878760c
RK
1750/* Return 1 if OP is a constant that can fit in a D field. */
1751
1752int
a2369ed3 1753short_cint_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
9878760c 1754{
5f59ecb7
DE
1755 return (GET_CODE (op) == CONST_INT
1756 && CONST_OK_FOR_LETTER_P (INTVAL (op), 'I'));
9878760c
RK
1757}
1758
5519a4f9 1759/* Similar for an unsigned D field. */
9878760c
RK
1760
1761int
a2369ed3 1762u_short_cint_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
9878760c 1763{
19684119 1764 return (GET_CODE (op) == CONST_INT
c1f11548 1765 && CONST_OK_FOR_LETTER_P (INTVAL (op) & GET_MODE_MASK (mode), 'K'));
9878760c
RK
1766}
1767
dcfedcd0
RK
1768/* Return 1 if OP is a CONST_INT that cannot fit in a signed D field. */
1769
1770int
a2369ed3 1771non_short_cint_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
dcfedcd0
RK
1772{
1773 return (GET_CODE (op) == CONST_INT
a7653a2c 1774 && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x8000) >= 0x10000);
dcfedcd0
RK
1775}
1776
2bfcf297
DB
1777/* Returns 1 if OP is a CONST_INT that is a positive value
1778 and an exact power of 2. */
1779
1780int
a2369ed3 1781exact_log2_cint_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2bfcf297
DB
1782{
1783 return (GET_CODE (op) == CONST_INT
1784 && INTVAL (op) > 0
1785 && exact_log2 (INTVAL (op)) >= 0);
1786}
1787
9878760c
RK
1788/* Returns 1 if OP is a register that is not special (i.e., not MQ,
1789 ctr, or lr). */
1790
1791int
a2369ed3 1792gpc_reg_operand (rtx op, enum machine_mode mode)
9878760c
RK
1793{
1794 return (register_operand (op, mode)
802a0058 1795 && (GET_CODE (op) != REG
9ebbca7d
GK
1796 || (REGNO (op) >= ARG_POINTER_REGNUM
1797 && !XER_REGNO_P (REGNO (op)))
1798 || REGNO (op) < MQ_REGNO));
9878760c
RK
1799}
1800
1801/* Returns 1 if OP is either a pseudo-register or a register denoting a
1802 CR field. */
1803
1804int
a2369ed3 1805cc_reg_operand (rtx op, enum machine_mode mode)
9878760c
RK
1806{
1807 return (register_operand (op, mode)
1808 && (GET_CODE (op) != REG
1809 || REGNO (op) >= FIRST_PSEUDO_REGISTER
1810 || CR_REGNO_P (REGNO (op))));
1811}
1812
815cdc52
MM
1813/* Returns 1 if OP is either a pseudo-register or a register denoting a
1814 CR field that isn't CR0. */
1815
1816int
a2369ed3 1817cc_reg_not_cr0_operand (rtx op, enum machine_mode mode)
815cdc52
MM
1818{
1819 return (register_operand (op, mode)
1820 && (GET_CODE (op) != REG
1821 || REGNO (op) >= FIRST_PSEUDO_REGISTER
1822 || CR_REGNO_NOT_CR0_P (REGNO (op))));
1823}
1824
a4f6c312
SS
1825/* Returns 1 if OP is either a constant integer valid for a D-field or
1826 a non-special register. If a register, it must be in the proper
1827 mode unless MODE is VOIDmode. */
9878760c
RK
1828
1829int
a2369ed3 1830reg_or_short_operand (rtx op, enum machine_mode mode)
9878760c 1831{
f5a28898 1832 return short_cint_operand (op, mode) || gpc_reg_operand (op, mode);
9878760c
RK
1833}
1834
a4f6c312 1835/* Similar, except check if the negation of the constant would be
42f806e5
AM
1836 valid for a D-field. Don't allow a constant zero, since all the
1837 patterns that call this predicate use "addic r1,r2,-constant" on
1838 a constant value to set a carry when r2 is greater or equal to
1839 "constant". That doesn't work for zero. */
9878760c
RK
1840
1841int
a2369ed3 1842reg_or_neg_short_operand (rtx op, enum machine_mode mode)
9878760c
RK
1843{
1844 if (GET_CODE (op) == CONST_INT)
42f806e5 1845 return CONST_OK_FOR_LETTER_P (INTVAL (op), 'P') && INTVAL (op) != 0;
9878760c 1846
cd2b37d9 1847 return gpc_reg_operand (op, mode);
9878760c
RK
1848}
1849
768070a0
TR
1850/* Returns 1 if OP is either a constant integer valid for a DS-field or
1851 a non-special register. If a register, it must be in the proper
1852 mode unless MODE is VOIDmode. */
1853
1854int
a2369ed3 1855reg_or_aligned_short_operand (rtx op, enum machine_mode mode)
768070a0
TR
1856{
1857 if (gpc_reg_operand (op, mode))
1858 return 1;
1859 else if (short_cint_operand (op, mode) && !(INTVAL (op) & 3))
1860 return 1;
1861
1862 return 0;
1863}
1864
1865
a4f6c312
SS
1866/* Return 1 if the operand is either a register or an integer whose
1867 high-order 16 bits are zero. */
9878760c
RK
1868
1869int
a2369ed3 1870reg_or_u_short_operand (rtx op, enum machine_mode mode)
9878760c 1871{
e675f625 1872 return u_short_cint_operand (op, mode) || gpc_reg_operand (op, mode);
9878760c
RK
1873}
1874
1875/* Return 1 is the operand is either a non-special register or ANY
1876 constant integer. */
1877
1878int
a2369ed3 1879reg_or_cint_operand (rtx op, enum machine_mode mode)
9878760c 1880{
a4f6c312 1881 return (GET_CODE (op) == CONST_INT || gpc_reg_operand (op, mode));
f6bf7de2
DE
1882}
1883
1884/* Return 1 is the operand is either a non-special register or ANY
1885 32-bit signed constant integer. */
1886
1887int
a2369ed3 1888reg_or_arith_cint_operand (rtx op, enum machine_mode mode)
f6bf7de2 1889{
a4f6c312
SS
1890 return (gpc_reg_operand (op, mode)
1891 || (GET_CODE (op) == CONST_INT
f6bf7de2 1892#if HOST_BITS_PER_WIDE_INT != 32
a4f6c312
SS
1893 && ((unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80000000)
1894 < (unsigned HOST_WIDE_INT) 0x100000000ll)
f6bf7de2 1895#endif
a4f6c312 1896 ));
9878760c
RK
1897}
1898
2bfcf297
DB
1899/* Return 1 is the operand is either a non-special register or a 32-bit
1900 signed constant integer valid for 64-bit addition. */
1901
1902int
a2369ed3 1903reg_or_add_cint64_operand (rtx op, enum machine_mode mode)
2bfcf297 1904{
a4f6c312
SS
1905 return (gpc_reg_operand (op, mode)
1906 || (GET_CODE (op) == CONST_INT
a65c591c 1907#if HOST_BITS_PER_WIDE_INT == 32
a4f6c312 1908 && INTVAL (op) < 0x7fff8000
a65c591c 1909#else
a4f6c312
SS
1910 && ((unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80008000)
1911 < 0x100000000ll)
2bfcf297 1912#endif
a4f6c312 1913 ));
2bfcf297
DB
1914}
1915
1916/* Return 1 is the operand is either a non-special register or a 32-bit
1917 signed constant integer valid for 64-bit subtraction. */
1918
1919int
a2369ed3 1920reg_or_sub_cint64_operand (rtx op, enum machine_mode mode)
2bfcf297 1921{
a4f6c312
SS
1922 return (gpc_reg_operand (op, mode)
1923 || (GET_CODE (op) == CONST_INT
a65c591c 1924#if HOST_BITS_PER_WIDE_INT == 32
a4f6c312 1925 && (- INTVAL (op)) < 0x7fff8000
a65c591c 1926#else
a4f6c312
SS
1927 && ((unsigned HOST_WIDE_INT) ((- INTVAL (op)) + 0x80008000)
1928 < 0x100000000ll)
2bfcf297 1929#endif
a4f6c312 1930 ));
2bfcf297
DB
1931}
1932
9ebbca7d
GK
1933/* Return 1 is the operand is either a non-special register or ANY
1934 32-bit unsigned constant integer. */
1935
1936int
a2369ed3 1937reg_or_logical_cint_operand (rtx op, enum machine_mode mode)
9ebbca7d 1938{
1d328b19
GK
1939 if (GET_CODE (op) == CONST_INT)
1940 {
1941 if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
1942 {
1943 if (GET_MODE_BITSIZE (mode) <= 32)
a4f6c312 1944 abort ();
1d328b19
GK
1945
1946 if (INTVAL (op) < 0)
1947 return 0;
1948 }
1949
1950 return ((INTVAL (op) & GET_MODE_MASK (mode)
0858c623 1951 & (~ (unsigned HOST_WIDE_INT) 0xffffffff)) == 0);
1d328b19
GK
1952 }
1953 else if (GET_CODE (op) == CONST_DOUBLE)
1954 {
1955 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
1956 || mode != DImode)
a4f6c312 1957 abort ();
1d328b19
GK
1958
1959 return CONST_DOUBLE_HIGH (op) == 0;
1960 }
1961 else
1962 return gpc_reg_operand (op, mode);
9ebbca7d
GK
1963}
1964
51d3e7d6 1965/* Return 1 if the operand is an operand that can be loaded via the GOT. */
766a866c
MM
1966
1967int
a2369ed3 1968got_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
766a866c
MM
1969{
1970 return (GET_CODE (op) == SYMBOL_REF
1971 || GET_CODE (op) == CONST
1972 || GET_CODE (op) == LABEL_REF);
1973}
1974
38c1f2d7
MM
1975/* Return 1 if the operand is a simple references that can be loaded via
1976 the GOT (labels involving addition aren't allowed). */
1977
1978int
a2369ed3 1979got_no_const_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
38c1f2d7
MM
1980{
1981 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF);
1982}
1983
4e74d8ec
MM
1984/* Return the number of instructions it takes to form a constant in an
1985 integer register. */
1986
1987static int
a2369ed3 1988num_insns_constant_wide (HOST_WIDE_INT value)
4e74d8ec
MM
1989{
1990 /* signed constant loadable with {cal|addi} */
5f59ecb7 1991 if (CONST_OK_FOR_LETTER_P (value, 'I'))
0865c631
GK
1992 return 1;
1993
4e74d8ec 1994 /* constant loadable with {cau|addis} */
5f59ecb7 1995 else if (CONST_OK_FOR_LETTER_P (value, 'L'))
4e74d8ec
MM
1996 return 1;
1997
5f59ecb7 1998#if HOST_BITS_PER_WIDE_INT == 64
c81fc13e 1999 else if (TARGET_POWERPC64)
4e74d8ec 2000 {
a65c591c
DE
2001 HOST_WIDE_INT low = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
2002 HOST_WIDE_INT high = value >> 31;
4e74d8ec 2003
a65c591c 2004 if (high == 0 || high == -1)
4e74d8ec
MM
2005 return 2;
2006
a65c591c 2007 high >>= 1;
4e74d8ec 2008
a65c591c 2009 if (low == 0)
4e74d8ec 2010 return num_insns_constant_wide (high) + 1;
4e74d8ec
MM
2011 else
2012 return (num_insns_constant_wide (high)
e396202a 2013 + num_insns_constant_wide (low) + 1);
4e74d8ec
MM
2014 }
2015#endif
2016
2017 else
2018 return 2;
2019}
2020
2021int
a2369ed3 2022num_insns_constant (rtx op, enum machine_mode mode)
4e74d8ec 2023{
4e74d8ec 2024 if (GET_CODE (op) == CONST_INT)
0d30d435
DE
2025 {
2026#if HOST_BITS_PER_WIDE_INT == 64
4e2c1c44
DE
2027 if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
2028 && mask64_operand (op, mode))
0d30d435
DE
2029 return 2;
2030 else
2031#endif
2032 return num_insns_constant_wide (INTVAL (op));
2033 }
4e74d8ec 2034
6fc48950
MM
2035 else if (GET_CODE (op) == CONST_DOUBLE && mode == SFmode)
2036 {
2037 long l;
2038 REAL_VALUE_TYPE rv;
2039
2040 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
2041 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
e72247f4 2042 return num_insns_constant_wide ((HOST_WIDE_INT) l);
6fc48950
MM
2043 }
2044
47ad8c61 2045 else if (GET_CODE (op) == CONST_DOUBLE)
4e74d8ec 2046 {
47ad8c61
MM
2047 HOST_WIDE_INT low;
2048 HOST_WIDE_INT high;
2049 long l[2];
2050 REAL_VALUE_TYPE rv;
2051 int endian = (WORDS_BIG_ENDIAN == 0);
4e74d8ec 2052
47ad8c61
MM
2053 if (mode == VOIDmode || mode == DImode)
2054 {
2055 high = CONST_DOUBLE_HIGH (op);
2056 low = CONST_DOUBLE_LOW (op);
2057 }
2058 else
2059 {
2060 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
2061 REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
2062 high = l[endian];
2063 low = l[1 - endian];
2064 }
4e74d8ec 2065
47ad8c61
MM
2066 if (TARGET_32BIT)
2067 return (num_insns_constant_wide (low)
2068 + num_insns_constant_wide (high));
4e74d8ec
MM
2069
2070 else
47ad8c61 2071 {
e72247f4 2072 if (high == 0 && low >= 0)
47ad8c61
MM
2073 return num_insns_constant_wide (low);
2074
e72247f4 2075 else if (high == -1 && low < 0)
47ad8c61
MM
2076 return num_insns_constant_wide (low);
2077
a260abc9
DE
2078 else if (mask64_operand (op, mode))
2079 return 2;
2080
47ad8c61
MM
2081 else if (low == 0)
2082 return num_insns_constant_wide (high) + 1;
2083
2084 else
2085 return (num_insns_constant_wide (high)
2086 + num_insns_constant_wide (low) + 1);
2087 }
4e74d8ec
MM
2088 }
2089
2090 else
2091 abort ();
2092}
2093
a4f6c312
SS
2094/* Return 1 if the operand is a CONST_DOUBLE and it can be put into a
2095 register with one instruction per word. We only do this if we can
2096 safely read CONST_DOUBLE_{LOW,HIGH}. */
9878760c
RK
2097
2098int
a2369ed3 2099easy_fp_constant (rtx op, enum machine_mode mode)
9878760c 2100{
9878760c
RK
2101 if (GET_CODE (op) != CONST_DOUBLE
2102 || GET_MODE (op) != mode
4e74d8ec 2103 || (GET_MODE_CLASS (mode) != MODE_FLOAT && mode != DImode))
9878760c
RK
2104 return 0;
2105
a4f6c312 2106 /* Consider all constants with -msoft-float to be easy. */
a3170dc6
AH
2107 if ((TARGET_SOFT_FLOAT || !TARGET_FPRS)
2108 && mode != DImode)
b6c9286a
MM
2109 return 1;
2110
a4f6c312 2111 /* If we are using V.4 style PIC, consider all constants to be hard. */
f607bc57 2112 if (flag_pic && DEFAULT_ABI == ABI_V4)
a7273471
MM
2113 return 0;
2114
5ae4759c 2115#ifdef TARGET_RELOCATABLE
a4f6c312
SS
2116 /* Similarly if we are using -mrelocatable, consider all constants
2117 to be hard. */
5ae4759c
MM
2118 if (TARGET_RELOCATABLE)
2119 return 0;
2120#endif
2121
fcce224d
DE
2122 if (mode == TFmode)
2123 {
2124 long k[4];
2125 REAL_VALUE_TYPE rv;
2126
2127 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
2128 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
2129
2130 return (num_insns_constant_wide ((HOST_WIDE_INT) k[0]) == 1
2131 && num_insns_constant_wide ((HOST_WIDE_INT) k[1]) == 1
2132 && num_insns_constant_wide ((HOST_WIDE_INT) k[2]) == 1
2133 && num_insns_constant_wide ((HOST_WIDE_INT) k[3]) == 1);
2134 }
2135
2136 else if (mode == DFmode)
042259f2
DE
2137 {
2138 long k[2];
2139 REAL_VALUE_TYPE rv;
2140
2141 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
2142 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
9878760c 2143
a65c591c
DE
2144 return (num_insns_constant_wide ((HOST_WIDE_INT) k[0]) == 1
2145 && num_insns_constant_wide ((HOST_WIDE_INT) k[1]) == 1);
042259f2 2146 }
4e74d8ec
MM
2147
2148 else if (mode == SFmode)
042259f2
DE
2149 {
2150 long l;
2151 REAL_VALUE_TYPE rv;
2152
2153 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
2154 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
9878760c 2155
4e74d8ec 2156 return num_insns_constant_wide (l) == 1;
042259f2 2157 }
4e74d8ec 2158
a260abc9 2159 else if (mode == DImode)
c81fc13e 2160 return ((TARGET_POWERPC64
a260abc9
DE
2161 && GET_CODE (op) == CONST_DOUBLE && CONST_DOUBLE_LOW (op) == 0)
2162 || (num_insns_constant (op, DImode) <= 2));
4e74d8ec 2163
a9098fd0
GK
2164 else if (mode == SImode)
2165 return 1;
4e74d8ec
MM
2166 else
2167 abort ();
9878760c 2168}
8f75773e 2169
effa5d5d 2170/* Returns the constant for the splat instruction, if exists. */
452a7d36
HP
2171
2172static int
2173easy_vector_splat_const (int cst, enum machine_mode mode)
2174{
2175 switch (mode)
2176 {
2177 case V4SImode:
2178 if (EASY_VECTOR_15 (cst)
2179 || EASY_VECTOR_15_ADD_SELF (cst))
2180 return cst;
2181 if ((cst & 0xffff) != ((cst >> 16) & 0xffff))
2182 break;
2183 cst = cst >> 16;
2184 case V8HImode:
2185 if (EASY_VECTOR_15 (cst)
2186 || EASY_VECTOR_15_ADD_SELF (cst))
2187 return cst;
2188 if ((cst & 0xff) != ((cst >> 8) & 0xff))
2189 break;
2190 cst = cst >> 8;
2191 case V16QImode:
2192 if (EASY_VECTOR_15 (cst)
2193 || EASY_VECTOR_15_ADD_SELF (cst))
2194 return cst;
2195 default:
2196 break;
2197 }
2198 return 0;
2199}
2200
2201
72ac76be 2202/* Return nonzero if all elements of a vector have the same value. */
69ef87e2
AH
2203
2204static int
a2369ed3 2205easy_vector_same (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
d744e06e
AH
2206{
2207 int units, i, cst;
2208
2209 units = CONST_VECTOR_NUNITS (op);
2210
2211 cst = INTVAL (CONST_VECTOR_ELT (op, 0));
2212 for (i = 1; i < units; ++i)
2213 if (INTVAL (CONST_VECTOR_ELT (op, i)) != cst)
2214 break;
452a7d36 2215 if (i == units && easy_vector_splat_const (cst, mode))
d744e06e
AH
2216 return 1;
2217 return 0;
2218}
2219
2220/* Return 1 if the operand is a CONST_INT and can be put into a
2221 register without using memory. */
2222
2223int
a2369ed3 2224easy_vector_constant (rtx op, enum machine_mode mode)
69ef87e2 2225{
d744e06e 2226 int cst, cst2;
69ef87e2 2227
d744e06e
AH
2228 if (GET_CODE (op) != CONST_VECTOR
2229 || (!TARGET_ALTIVEC
2230 && !TARGET_SPE))
69ef87e2
AH
2231 return 0;
2232
d744e06e
AH
2233 if (zero_constant (op, mode)
2234 && ((TARGET_ALTIVEC && ALTIVEC_VECTOR_MODE (mode))
2235 || (TARGET_SPE && SPE_VECTOR_MODE (mode))))
2236 return 1;
69ef87e2 2237
d744e06e
AH
2238 if (GET_MODE_CLASS (mode) != MODE_VECTOR_INT)
2239 return 0;
2240
f5119d10
AH
2241 if (TARGET_SPE && mode == V1DImode)
2242 return 0;
2243
d744e06e
AH
2244 cst = INTVAL (CONST_VECTOR_ELT (op, 0));
2245 cst2 = INTVAL (CONST_VECTOR_ELT (op, 1));
2246
2247 /* Limit SPE vectors to 15 bits signed. These we can generate with:
2248 li r0, CONSTANT1
2249 evmergelo r0, r0, r0
2250 li r0, CONSTANT2
2251
2252 I don't know how efficient it would be to allow bigger constants,
2253 considering we'll have an extra 'ori' for every 'li'. I doubt 5
2254 instructions is better than a 64-bit memory load, but I don't
2255 have the e500 timing specs. */
2256 if (TARGET_SPE && mode == V2SImode
2257 && cst >= -0x7fff && cst <= 0x7fff
f5119d10 2258 && cst2 >= -0x7fff && cst2 <= 0x7fff)
d744e06e
AH
2259 return 1;
2260
452a7d36
HP
2261 if (TARGET_ALTIVEC
2262 && easy_vector_same (op, mode))
2263 {
2264 cst = easy_vector_splat_const (cst, mode);
2265 if (EASY_VECTOR_15_ADD_SELF (cst)
2266 || EASY_VECTOR_15 (cst))
2267 return 1;
2268 }
d744e06e
AH
2269 return 0;
2270}
2271
2272/* Same as easy_vector_constant but only for EASY_VECTOR_15_ADD_SELF. */
2273
2274int
a2369ed3 2275easy_vector_constant_add_self (rtx op, enum machine_mode mode)
d744e06e
AH
2276{
2277 int cst;
452a7d36
HP
2278 if (TARGET_ALTIVEC
2279 && GET_CODE (op) == CONST_VECTOR
2280 && easy_vector_same (op, mode))
2281 {
2282 cst = easy_vector_splat_const (INTVAL (CONST_VECTOR_ELT (op, 0)), mode);
2283 if (EASY_VECTOR_15_ADD_SELF (cst))
2284 return 1;
2285 }
2286 return 0;
2287}
d744e06e 2288
452a7d36 2289/* Generate easy_vector_constant out of a easy_vector_constant_add_self. */
d744e06e 2290
452a7d36
HP
2291rtx
2292gen_easy_vector_constant_add_self (rtx op)
2293{
2294 int i, units;
2295 rtvec v;
2296 units = GET_MODE_NUNITS (GET_MODE (op));
2297 v = rtvec_alloc (units);
2298
2299 for (i = 0; i < units; i++)
2300 RTVEC_ELT (v, i) =
2301 GEN_INT (INTVAL (CONST_VECTOR_ELT (op, i)) >> 1);
2302 return gen_rtx_raw_CONST_VECTOR (GET_MODE (op), v);
d744e06e
AH
2303}
2304
2305const char *
a2369ed3 2306output_vec_const_move (rtx *operands)
d744e06e
AH
2307{
2308 int cst, cst2;
2309 enum machine_mode mode;
2310 rtx dest, vec;
2311
2312 dest = operands[0];
2313 vec = operands[1];
69ef87e2 2314
d744e06e
AH
2315 cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
2316 cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
2317 mode = GET_MODE (dest);
69ef87e2 2318
d744e06e
AH
2319 if (TARGET_ALTIVEC)
2320 {
2321 if (zero_constant (vec, mode))
2322 return "vxor %0,%0,%0";
ce1f50b2 2323 else if (easy_vector_constant (vec, mode))
98ef3137 2324 {
d744e06e
AH
2325 operands[1] = GEN_INT (cst);
2326 switch (mode)
2327 {
2328 case V4SImode:
452a7d36 2329 if (EASY_VECTOR_15 (cst))
ce1f50b2
HP
2330 {
2331 operands[1] = GEN_INT (cst);
2332 return "vspltisw %0,%1";
2333 }
452a7d36
HP
2334 else if (EASY_VECTOR_15_ADD_SELF (cst))
2335 return "#";
ce1f50b2 2336 cst = cst >> 16;
d744e06e 2337 case V8HImode:
452a7d36 2338 if (EASY_VECTOR_15 (cst))
ce1f50b2
HP
2339 {
2340 operands[1] = GEN_INT (cst);
2341 return "vspltish %0,%1";
2342 }
452a7d36
HP
2343 else if (EASY_VECTOR_15_ADD_SELF (cst))
2344 return "#";
ce1f50b2 2345 cst = cst >> 8;
d744e06e 2346 case V16QImode:
452a7d36 2347 if (EASY_VECTOR_15 (cst))
ce1f50b2
HP
2348 {
2349 operands[1] = GEN_INT (cst);
2350 return "vspltisb %0,%1";
2351 }
452a7d36
HP
2352 else if (EASY_VECTOR_15_ADD_SELF (cst))
2353 return "#";
d744e06e
AH
2354 default:
2355 abort ();
2356 }
98ef3137 2357 }
d744e06e
AH
2358 else
2359 abort ();
69ef87e2
AH
2360 }
2361
d744e06e
AH
2362 if (TARGET_SPE)
2363 {
2364 /* Vector constant 0 is handled as a splitter of V2SI, and in the
2365 pattern of V1DI, V4HI, and V2SF.
2366
c1207243 2367 FIXME: We should probably return # and add post reload
d744e06e
AH
2368 splitters for these, but this way is so easy ;-).
2369 */
2370 operands[1] = GEN_INT (cst);
2371 operands[2] = GEN_INT (cst2);
2372 if (cst == cst2)
2373 return "li %0,%1\n\tevmergelo %0,%0,%0";
2374 else
2375 return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
2376 }
2377
2378 abort ();
69ef87e2
AH
2379}
2380
2381/* Return 1 if the operand is the constant 0. This works for scalars
2382 as well as vectors. */
2383int
a2369ed3 2384zero_constant (rtx op, enum machine_mode mode)
69ef87e2
AH
2385{
2386 return op == CONST0_RTX (mode);
2387}
2388
50a0b056
GK
2389/* Return 1 if the operand is 0.0. */
2390int
a2369ed3 2391zero_fp_constant (rtx op, enum machine_mode mode)
50a0b056
GK
2392{
2393 return GET_MODE_CLASS (mode) == MODE_FLOAT && op == CONST0_RTX (mode);
2394}
2395
a4f6c312
SS
2396/* Return 1 if the operand is in volatile memory. Note that during
2397 the RTL generation phase, memory_operand does not return TRUE for
b6c9286a
MM
2398 volatile memory references. So this function allows us to
2399 recognize volatile references where its safe. */
2400
2401int
a2369ed3 2402volatile_mem_operand (rtx op, enum machine_mode mode)
b6c9286a
MM
2403{
2404 if (GET_CODE (op) != MEM)
2405 return 0;
2406
2407 if (!MEM_VOLATILE_P (op))
2408 return 0;
2409
2410 if (mode != GET_MODE (op))
2411 return 0;
2412
2413 if (reload_completed)
2414 return memory_operand (op, mode);
2415
2416 if (reload_in_progress)
2417 return strict_memory_address_p (mode, XEXP (op, 0));
2418
2419 return memory_address_p (mode, XEXP (op, 0));
2420}
2421
97f6e72f 2422/* Return 1 if the operand is an offsettable memory operand. */
914c2e77
RK
2423
2424int
a2369ed3 2425offsettable_mem_operand (rtx op, enum machine_mode mode)
914c2e77 2426{
97f6e72f 2427 return ((GET_CODE (op) == MEM)
677a9668 2428 && offsettable_address_p (reload_completed || reload_in_progress,
97f6e72f 2429 mode, XEXP (op, 0)));
914c2e77
RK
2430}
2431
9878760c
RK
2432/* Return 1 if the operand is either an easy FP constant (see above) or
2433 memory. */
2434
2435int
a2369ed3 2436mem_or_easy_const_operand (rtx op, enum machine_mode mode)
9878760c
RK
2437{
2438 return memory_operand (op, mode) || easy_fp_constant (op, mode);
2439}
2440
2441/* Return 1 if the operand is either a non-special register or an item
5f59ecb7 2442 that can be used as the operand of a `mode' add insn. */
9878760c
RK
2443
2444int
a2369ed3 2445add_operand (rtx op, enum machine_mode mode)
9878760c 2446{
2bfcf297 2447 if (GET_CODE (op) == CONST_INT)
e72247f4
DE
2448 return (CONST_OK_FOR_LETTER_P (INTVAL (op), 'I')
2449 || CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'));
2bfcf297
DB
2450
2451 return gpc_reg_operand (op, mode);
9878760c
RK
2452}
2453
dcfedcd0
RK
2454/* Return 1 if OP is a constant but not a valid add_operand. */
2455
2456int
a2369ed3 2457non_add_cint_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
dcfedcd0
RK
2458{
2459 return (GET_CODE (op) == CONST_INT
e72247f4
DE
2460 && !CONST_OK_FOR_LETTER_P (INTVAL (op), 'I')
2461 && !CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'));
dcfedcd0
RK
2462}
2463
9878760c
RK
2464/* Return 1 if the operand is a non-special register or a constant that
2465 can be used as the operand of an OR or XOR insn on the RS/6000. */
2466
2467int
a2369ed3 2468logical_operand (rtx op, enum machine_mode mode)
9878760c 2469{
40501e5f 2470 HOST_WIDE_INT opl, oph;
1d328b19 2471
dfbdccdb
GK
2472 if (gpc_reg_operand (op, mode))
2473 return 1;
1d328b19 2474
dfbdccdb 2475 if (GET_CODE (op) == CONST_INT)
40501e5f
AM
2476 {
2477 opl = INTVAL (op) & GET_MODE_MASK (mode);
2478
2479#if HOST_BITS_PER_WIDE_INT <= 32
2480 if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT && opl < 0)
2481 return 0;
2482#endif
2483 }
dfbdccdb
GK
2484 else if (GET_CODE (op) == CONST_DOUBLE)
2485 {
1d328b19 2486 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
40501e5f 2487 abort ();
1d328b19
GK
2488
2489 opl = CONST_DOUBLE_LOW (op);
2490 oph = CONST_DOUBLE_HIGH (op);
40501e5f 2491 if (oph != 0)
38886f37 2492 return 0;
dfbdccdb
GK
2493 }
2494 else
2495 return 0;
1d328b19 2496
40501e5f
AM
2497 return ((opl & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0
2498 || (opl & ~ (unsigned HOST_WIDE_INT) 0xffff0000) == 0);
9878760c
RK
2499}
2500
dcfedcd0 2501/* Return 1 if C is a constant that is not a logical operand (as
1d328b19 2502 above), but could be split into one. */
dcfedcd0
RK
2503
2504int
a2369ed3 2505non_logical_cint_operand (rtx op, enum machine_mode mode)
dcfedcd0 2506{
dfbdccdb 2507 return ((GET_CODE (op) == CONST_INT || GET_CODE (op) == CONST_DOUBLE)
1d328b19
GK
2508 && ! logical_operand (op, mode)
2509 && reg_or_logical_cint_operand (op, mode));
dcfedcd0
RK
2510}
2511
19ba8161 2512/* Return 1 if C is a constant that can be encoded in a 32-bit mask on the
9878760c
RK
2513 RS/6000. It is if there are no more than two 1->0 or 0->1 transitions.
2514 Reject all ones and all zeros, since these should have been optimized
2515 away and confuse the making of MB and ME. */
2516
2517int
a2369ed3 2518mask_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
9878760c 2519{
02071907 2520 HOST_WIDE_INT c, lsb;
9878760c 2521
19ba8161
DE
2522 if (GET_CODE (op) != CONST_INT)
2523 return 0;
2524
2525 c = INTVAL (op);
2526
57deb3a1
AM
2527 /* Fail in 64-bit mode if the mask wraps around because the upper
2528 32-bits of the mask will all be 1s, contrary to GCC's internal view. */
2529 if (TARGET_POWERPC64 && (c & 0x80000001) == 0x80000001)
2530 return 0;
2531
c5059423
AM
2532 /* We don't change the number of transitions by inverting,
2533 so make sure we start with the LS bit zero. */
2534 if (c & 1)
2535 c = ~c;
2536
2537 /* Reject all zeros or all ones. */
2538 if (c == 0)
9878760c
RK
2539 return 0;
2540
c5059423
AM
2541 /* Find the first transition. */
2542 lsb = c & -c;
2543
2544 /* Invert to look for a second transition. */
2545 c = ~c;
9878760c 2546
c5059423
AM
2547 /* Erase first transition. */
2548 c &= -lsb;
9878760c 2549
c5059423
AM
2550 /* Find the second transition (if any). */
2551 lsb = c & -c;
2552
2553 /* Match if all the bits above are 1's (or c is zero). */
2554 return c == -lsb;
9878760c
RK
2555}
2556
0ba1b2ff
AM
2557/* Return 1 for the PowerPC64 rlwinm corner case. */
2558
2559int
a2369ed3 2560mask_operand_wrap (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
0ba1b2ff
AM
2561{
2562 HOST_WIDE_INT c, lsb;
2563
2564 if (GET_CODE (op) != CONST_INT)
2565 return 0;
2566
2567 c = INTVAL (op);
2568
2569 if ((c & 0x80000001) != 0x80000001)
2570 return 0;
2571
2572 c = ~c;
2573 if (c == 0)
2574 return 0;
2575
2576 lsb = c & -c;
2577 c = ~c;
2578 c &= -lsb;
2579 lsb = c & -c;
2580 return c == -lsb;
2581}
2582
a260abc9
DE
2583/* Return 1 if the operand is a constant that is a PowerPC64 mask.
2584 It is if there are no more than one 1->0 or 0->1 transitions.
0ba1b2ff
AM
2585 Reject all zeros, since zero should have been optimized away and
2586 confuses the making of MB and ME. */
9878760c
RK
2587
2588int
a2369ed3 2589mask64_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
a260abc9
DE
2590{
2591 if (GET_CODE (op) == CONST_INT)
2592 {
02071907 2593 HOST_WIDE_INT c, lsb;
a260abc9 2594
c5059423 2595 c = INTVAL (op);
a260abc9 2596
0ba1b2ff 2597 /* Reject all zeros. */
c5059423 2598 if (c == 0)
e2c953b6
DE
2599 return 0;
2600
0ba1b2ff
AM
2601 /* We don't change the number of transitions by inverting,
2602 so make sure we start with the LS bit zero. */
2603 if (c & 1)
2604 c = ~c;
2605
c5059423
AM
2606 /* Find the transition, and check that all bits above are 1's. */
2607 lsb = c & -c;
e3981aab
DE
2608
2609 /* Match if all the bits above are 1's (or c is zero). */
c5059423 2610 return c == -lsb;
e2c953b6 2611 }
0ba1b2ff
AM
2612 return 0;
2613}
2614
2615/* Like mask64_operand, but allow up to three transitions. This
2616 predicate is used by insn patterns that generate two rldicl or
2617 rldicr machine insns. */
2618
2619int
a2369ed3 2620mask64_2_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
0ba1b2ff
AM
2621{
2622 if (GET_CODE (op) == CONST_INT)
a260abc9 2623 {
0ba1b2ff 2624 HOST_WIDE_INT c, lsb;
a260abc9 2625
0ba1b2ff 2626 c = INTVAL (op);
a260abc9 2627
0ba1b2ff
AM
2628 /* Disallow all zeros. */
2629 if (c == 0)
2630 return 0;
a260abc9 2631
0ba1b2ff
AM
2632 /* We don't change the number of transitions by inverting,
2633 so make sure we start with the LS bit zero. */
2634 if (c & 1)
2635 c = ~c;
a260abc9 2636
0ba1b2ff
AM
2637 /* Find the first transition. */
2638 lsb = c & -c;
a260abc9 2639
0ba1b2ff
AM
2640 /* Invert to look for a second transition. */
2641 c = ~c;
2642
2643 /* Erase first transition. */
2644 c &= -lsb;
2645
2646 /* Find the second transition. */
2647 lsb = c & -c;
2648
2649 /* Invert to look for a third transition. */
2650 c = ~c;
2651
2652 /* Erase second transition. */
2653 c &= -lsb;
2654
2655 /* Find the third transition (if any). */
2656 lsb = c & -c;
2657
2658 /* Match if all the bits above are 1's (or c is zero). */
2659 return c == -lsb;
2660 }
2661 return 0;
2662}
2663
2664/* Generates shifts and masks for a pair of rldicl or rldicr insns to
2665 implement ANDing by the mask IN. */
2666void
a2369ed3 2667build_mask64_2_operands (rtx in, rtx *out)
0ba1b2ff
AM
2668{
2669#if HOST_BITS_PER_WIDE_INT >= 64
2670 unsigned HOST_WIDE_INT c, lsb, m1, m2;
2671 int shift;
2672
2673 if (GET_CODE (in) != CONST_INT)
2674 abort ();
2675
2676 c = INTVAL (in);
2677 if (c & 1)
2678 {
2679 /* Assume c initially something like 0x00fff000000fffff. The idea
2680 is to rotate the word so that the middle ^^^^^^ group of zeros
2681 is at the MS end and can be cleared with an rldicl mask. We then
2682 rotate back and clear off the MS ^^ group of zeros with a
2683 second rldicl. */
2684 c = ~c; /* c == 0xff000ffffff00000 */
2685 lsb = c & -c; /* lsb == 0x0000000000100000 */
2686 m1 = -lsb; /* m1 == 0xfffffffffff00000 */
2687 c = ~c; /* c == 0x00fff000000fffff */
2688 c &= -lsb; /* c == 0x00fff00000000000 */
2689 lsb = c & -c; /* lsb == 0x0000100000000000 */
2690 c = ~c; /* c == 0xff000fffffffffff */
2691 c &= -lsb; /* c == 0xff00000000000000 */
2692 shift = 0;
2693 while ((lsb >>= 1) != 0)
2694 shift++; /* shift == 44 on exit from loop */
2695 m1 <<= 64 - shift; /* m1 == 0xffffff0000000000 */
2696 m1 = ~m1; /* m1 == 0x000000ffffffffff */
2697 m2 = ~c; /* m2 == 0x00ffffffffffffff */
a260abc9
DE
2698 }
2699 else
0ba1b2ff
AM
2700 {
2701 /* Assume c initially something like 0xff000f0000000000. The idea
2702 is to rotate the word so that the ^^^ middle group of zeros
2703 is at the LS end and can be cleared with an rldicr mask. We then
2704 rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
2705 a second rldicr. */
2706 lsb = c & -c; /* lsb == 0x0000010000000000 */
2707 m2 = -lsb; /* m2 == 0xffffff0000000000 */
2708 c = ~c; /* c == 0x00fff0ffffffffff */
2709 c &= -lsb; /* c == 0x00fff00000000000 */
2710 lsb = c & -c; /* lsb == 0x0000100000000000 */
2711 c = ~c; /* c == 0xff000fffffffffff */
2712 c &= -lsb; /* c == 0xff00000000000000 */
2713 shift = 0;
2714 while ((lsb >>= 1) != 0)
2715 shift++; /* shift == 44 on exit from loop */
2716 m1 = ~c; /* m1 == 0x00ffffffffffffff */
2717 m1 >>= shift; /* m1 == 0x0000000000000fff */
2718 m1 = ~m1; /* m1 == 0xfffffffffffff000 */
2719 }
2720
2721 /* Note that when we only have two 0->1 and 1->0 transitions, one of the
2722 masks will be all 1's. We are guaranteed more than one transition. */
2723 out[0] = GEN_INT (64 - shift);
2724 out[1] = GEN_INT (m1);
2725 out[2] = GEN_INT (shift);
2726 out[3] = GEN_INT (m2);
2727#else
045572c7
GK
2728 (void)in;
2729 (void)out;
0ba1b2ff
AM
2730 abort ();
2731#endif
a260abc9
DE
2732}
2733
2734/* Return 1 if the operand is either a non-special register or a constant
2735 that can be used as the operand of a PowerPC64 logical AND insn. */
2736
2737int
a2369ed3 2738and64_operand (rtx op, enum machine_mode mode)
9878760c 2739{
a4f6c312 2740 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
52d3af72
DE
2741 return (gpc_reg_operand (op, mode) || mask64_operand (op, mode));
2742
2743 return (logical_operand (op, mode) || mask64_operand (op, mode));
9878760c
RK
2744}
2745
0ba1b2ff
AM
2746/* Like the above, but also match constants that can be implemented
2747 with two rldicl or rldicr insns. */
2748
2749int
a2369ed3 2750and64_2_operand (rtx op, enum machine_mode mode)
0ba1b2ff 2751{
a3c9585f 2752 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
0ba1b2ff
AM
2753 return gpc_reg_operand (op, mode) || mask64_2_operand (op, mode);
2754
2755 return logical_operand (op, mode) || mask64_2_operand (op, mode);
2756}
2757
a260abc9
DE
2758/* Return 1 if the operand is either a non-special register or a
2759 constant that can be used as the operand of an RS/6000 logical AND insn. */
dcfedcd0
RK
2760
2761int
a2369ed3 2762and_operand (rtx op, enum machine_mode mode)
dcfedcd0 2763{
a4f6c312 2764 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
52d3af72
DE
2765 return (gpc_reg_operand (op, mode) || mask_operand (op, mode));
2766
2767 return (logical_operand (op, mode) || mask_operand (op, mode));
dcfedcd0
RK
2768}
2769
9878760c
RK
2770/* Return 1 if the operand is a general register or memory operand. */
2771
2772int
a2369ed3 2773reg_or_mem_operand (rtx op, enum machine_mode mode)
9878760c 2774{
b6c9286a
MM
2775 return (gpc_reg_operand (op, mode)
2776 || memory_operand (op, mode)
4c81e946 2777 || macho_lo_sum_memory_operand (op, mode)
b6c9286a 2778 || volatile_mem_operand (op, mode));
9878760c
RK
2779}
2780
a7a813f7 2781/* Return 1 if the operand is a general register or memory operand without
3cb999d8 2782 pre_inc or pre_dec which produces invalid form of PowerPC lwa
a7a813f7
RK
2783 instruction. */
2784
2785int
a2369ed3 2786lwa_operand (rtx op, enum machine_mode mode)
a7a813f7
RK
2787{
2788 rtx inner = op;
2789
2790 if (reload_completed && GET_CODE (inner) == SUBREG)
2791 inner = SUBREG_REG (inner);
2792
2793 return gpc_reg_operand (inner, mode)
2794 || (memory_operand (inner, mode)
2795 && GET_CODE (XEXP (inner, 0)) != PRE_INC
6a40a9d6
DE
2796 && GET_CODE (XEXP (inner, 0)) != PRE_DEC
2797 && (GET_CODE (XEXP (inner, 0)) != PLUS
e903c96a
DE
2798 || GET_CODE (XEXP (XEXP (inner, 0), 1)) != CONST_INT
2799 || INTVAL (XEXP (XEXP (inner, 0), 1)) % 4 == 0));
a7a813f7
RK
2800}
2801
cc4d5fec
JH
2802/* Return 1 if the operand, used inside a MEM, is a SYMBOL_REF. */
2803
2804int
a2369ed3 2805symbol_ref_operand (rtx op, enum machine_mode mode)
cc4d5fec
JH
2806{
2807 if (mode != VOIDmode && GET_MODE (op) != mode)
2808 return 0;
2809
473f51b6
DE
2810 return (GET_CODE (op) == SYMBOL_REF
2811 && (DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op)));
cc4d5fec
JH
2812}
2813
9878760c 2814/* Return 1 if the operand, used inside a MEM, is a valid first argument
cc4d5fec 2815 to CALL. This is a SYMBOL_REF, a pseudo-register, LR or CTR. */
9878760c
RK
2816
2817int
a2369ed3 2818call_operand (rtx op, enum machine_mode mode)
9878760c
RK
2819{
2820 if (mode != VOIDmode && GET_MODE (op) != mode)
2821 return 0;
2822
2823 return (GET_CODE (op) == SYMBOL_REF
cc4d5fec
JH
2824 || (GET_CODE (op) == REG
2825 && (REGNO (op) == LINK_REGISTER_REGNUM
2826 || REGNO (op) == COUNT_REGISTER_REGNUM
2827 || REGNO (op) >= FIRST_PSEUDO_REGISTER)));
9878760c
RK
2828}
2829
2af3d377 2830/* Return 1 if the operand is a SYMBOL_REF for a function known to be in
d1908feb 2831 this file. */
2af3d377
RK
2832
2833int
a2369ed3
DJ
2834current_file_function_operand (rtx op,
2835 enum machine_mode mode ATTRIBUTE_UNUSED)
2af3d377 2836{
473f51b6
DE
2837 return (GET_CODE (op) == SYMBOL_REF
2838 && (DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op))
2839 && (SYMBOL_REF_LOCAL_P (op)
2840 || (op == XEXP (DECL_RTL (current_function_decl), 0))));
2af3d377
RK
2841}
2842
9878760c
RK
2843/* Return 1 if this operand is a valid input for a move insn. */
2844
2845int
a2369ed3 2846input_operand (rtx op, enum machine_mode mode)
9878760c 2847{
eb4e8003 2848 /* Memory is always valid. */
9878760c
RK
2849 if (memory_operand (op, mode))
2850 return 1;
2851
eb4e8003
RK
2852 /* For floating-point, easy constants are valid. */
2853 if (GET_MODE_CLASS (mode) == MODE_FLOAT
2854 && CONSTANT_P (op)
2855 && easy_fp_constant (op, mode))
2856 return 1;
2857
4e74d8ec
MM
2858 /* Allow any integer constant. */
2859 if (GET_MODE_CLASS (mode) == MODE_INT
e675f625 2860 && (GET_CODE (op) == CONST_INT
e675f625 2861 || GET_CODE (op) == CONST_DOUBLE))
4e74d8ec
MM
2862 return 1;
2863
d744e06e
AH
2864 /* Allow easy vector constants. */
2865 if (GET_CODE (op) == CONST_VECTOR
2866 && easy_vector_constant (op, mode))
2867 return 1;
2868
eb4e8003
RK
2869 /* For floating-point or multi-word mode, the only remaining valid type
2870 is a register. */
9878760c
RK
2871 if (GET_MODE_CLASS (mode) == MODE_FLOAT
2872 || GET_MODE_SIZE (mode) > UNITS_PER_WORD)
eb4e8003 2873 return register_operand (op, mode);
9878760c 2874
88fe15a1
RK
2875 /* The only cases left are integral modes one word or smaller (we
2876 do not get called for MODE_CC values). These can be in any
2877 register. */
2878 if (register_operand (op, mode))
a8b3aeda 2879 return 1;
88fe15a1 2880
84cf9dda 2881 /* A SYMBOL_REF referring to the TOC is valid. */
4d588c14 2882 if (legitimate_constant_pool_address_p (op))
84cf9dda
RK
2883 return 1;
2884
9ebbca7d 2885 /* A constant pool expression (relative to the TOC) is valid */
4d588c14 2886 if (toc_relative_expr_p (op))
b6c9286a
MM
2887 return 1;
2888
88228c4b
MM
2889 /* V.4 allows SYMBOL_REFs and CONSTs that are in the small data region
2890 to be valid. */
f607bc57 2891 if (DEFAULT_ABI == ABI_V4
88228c4b
MM
2892 && (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST)
2893 && small_data_operand (op, Pmode))
2894 return 1;
2895
042259f2 2896 return 0;
9878760c 2897}
7509c759 2898
95727fb8
AP
2899
2900/* Darwin, AIX increases natural record alignment to doubleword if the first
2901 field is an FP double while the FP fields remain word aligned. */
2902
19d66194 2903unsigned int
95727fb8
AP
2904rs6000_special_round_type_align (tree type, int computed, int specified)
2905{
2906 tree field = TYPE_FIELDS (type);
95727fb8
AP
2907
2908 /* Skip all the static variables only if ABI is greater than
71cc389b 2909 1 or equal to 0. */
3ce5437a 2910 while (field != NULL && TREE_CODE (field) == VAR_DECL)
95727fb8
AP
2911 field = TREE_CHAIN (field);
2912
3ce5437a 2913 if (field == NULL || field == type || DECL_MODE (field) != DFmode)
95727fb8
AP
2914 return MAX (computed, specified);
2915
2916 return MAX (MAX (computed, specified), 64);
2917}
2918
a4f6c312 2919/* Return 1 for an operand in small memory on V.4/eabi. */
7509c759
MM
2920
2921int
a2369ed3
DJ
2922small_data_operand (rtx op ATTRIBUTE_UNUSED,
2923 enum machine_mode mode ATTRIBUTE_UNUSED)
7509c759 2924{
38c1f2d7 2925#if TARGET_ELF
5f59ecb7 2926 rtx sym_ref;
7509c759 2927
d9407988 2928 if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
a54d04b7 2929 return 0;
a54d04b7 2930
f607bc57 2931 if (DEFAULT_ABI != ABI_V4)
7509c759
MM
2932 return 0;
2933
88228c4b
MM
2934 if (GET_CODE (op) == SYMBOL_REF)
2935 sym_ref = op;
2936
2937 else if (GET_CODE (op) != CONST
2938 || GET_CODE (XEXP (op, 0)) != PLUS
2939 || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
2940 || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
7509c759
MM
2941 return 0;
2942
88228c4b 2943 else
dbf55e53
MM
2944 {
2945 rtx sum = XEXP (op, 0);
2946 HOST_WIDE_INT summand;
2947
2948 /* We have to be careful here, because it is the referenced address
2949 that must be 32k from _SDA_BASE_, not just the symbol. */
2950 summand = INTVAL (XEXP (sum, 1));
307b599c 2951 if (summand < 0 || (unsigned HOST_WIDE_INT) summand > g_switch_value)
dbf55e53
MM
2952 return 0;
2953
2954 sym_ref = XEXP (sum, 0);
2955 }
88228c4b 2956
20bfcd69 2957 return SYMBOL_REF_SMALL_P (sym_ref);
d9407988
MM
2958#else
2959 return 0;
2960#endif
7509c759 2961}
46c07df8 2962
d2288d5d
HP
2963/* Return true, if operand is a memory operand and has a
2964 displacement divisible by 4. */
2965
2966int
2967word_offset_memref_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2968{
2969 rtx addr;
2970 int off = 0;
2971
2972 if (!memory_operand (op, mode))
2973 return 0;
2974
2975 addr = XEXP (op, 0);
2976 if (GET_CODE (addr) == PLUS
2977 && GET_CODE (XEXP (addr, 0)) == REG
2978 && GET_CODE (XEXP (addr, 1)) == CONST_INT)
2979 off = INTVAL (XEXP (addr, 1));
2980
2981 return (off % 4) == 0;
2982}
2983
3a1f863f 2984/* Return true if either operand is a general purpose register. */
46c07df8 2985
3a1f863f
DE
2986bool
2987gpr_or_gpr_p (rtx op0, rtx op1)
46c07df8 2988{
3a1f863f
DE
2989 return ((REG_P (op0) && INT_REGNO_P (REGNO (op0)))
2990 || (REG_P (op1) && INT_REGNO_P (REGNO (op1))));
46c07df8
HP
2991}
2992
9ebbca7d 2993\f
4d588c14
RH
2994/* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address. */
2995
9ebbca7d 2996static int
a2369ed3 2997constant_pool_expr_1 (rtx op, int *have_sym, int *have_toc)
9ebbca7d
GK
2998{
2999 switch (GET_CODE(op))
3000 {
3001 case SYMBOL_REF:
c4501e62
JJ
3002 if (RS6000_SYMBOL_REF_TLS_P (op))
3003 return 0;
3004 else if (CONSTANT_POOL_ADDRESS_P (op))
a4f6c312
SS
3005 {
3006 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (op), Pmode))
3007 {
3008 *have_sym = 1;
3009 return 1;
3010 }
3011 else
3012 return 0;
3013 }
3014 else if (! strcmp (XSTR (op, 0), toc_label_name))
3015 {
3016 *have_toc = 1;
3017 return 1;
3018 }
3019 else
3020 return 0;
9ebbca7d
GK
3021 case PLUS:
3022 case MINUS:
c1f11548
DE
3023 return (constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc)
3024 && constant_pool_expr_1 (XEXP (op, 1), have_sym, have_toc));
9ebbca7d 3025 case CONST:
a4f6c312 3026 return constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc);
9ebbca7d 3027 case CONST_INT:
a4f6c312 3028 return 1;
9ebbca7d 3029 default:
a4f6c312 3030 return 0;
9ebbca7d
GK
3031 }
3032}
3033
4d588c14 3034static bool
a2369ed3 3035constant_pool_expr_p (rtx op)
9ebbca7d
GK
3036{
3037 int have_sym = 0;
3038 int have_toc = 0;
3039 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_sym;
3040}
3041
4d588c14 3042static bool
a2369ed3 3043toc_relative_expr_p (rtx op)
9ebbca7d 3044{
4d588c14
RH
3045 int have_sym = 0;
3046 int have_toc = 0;
3047 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_toc;
3048}
3049
4d588c14 3050bool
a2369ed3 3051legitimate_constant_pool_address_p (rtx x)
4d588c14
RH
3052{
3053 return (TARGET_TOC
3054 && GET_CODE (x) == PLUS
3055 && GET_CODE (XEXP (x, 0)) == REG
3056 && (TARGET_MINIMAL_TOC || REGNO (XEXP (x, 0)) == TOC_REGISTER)
3057 && constant_pool_expr_p (XEXP (x, 1)));
3058}
3059
3060static bool
a2369ed3 3061legitimate_small_data_p (enum machine_mode mode, rtx x)
4d588c14
RH
3062{
3063 return (DEFAULT_ABI == ABI_V4
3064 && !flag_pic && !TARGET_TOC
3065 && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
3066 && small_data_operand (x, mode));
3067}
3068
60cdabab
DE
3069/* SPE offset addressing is limited to 5-bits worth of double words. */
3070#define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
3071
76d2b81d
DJ
3072bool
3073rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
4d588c14
RH
3074{
3075 unsigned HOST_WIDE_INT offset, extra;
3076
3077 if (GET_CODE (x) != PLUS)
3078 return false;
3079 if (GET_CODE (XEXP (x, 0)) != REG)
3080 return false;
3081 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
3082 return false;
60cdabab
DE
3083 if (legitimate_constant_pool_address_p (x))
3084 return true;
4d588c14
RH
3085 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
3086 return false;
3087
3088 offset = INTVAL (XEXP (x, 1));
3089 extra = 0;
3090 switch (mode)
3091 {
3092 case V16QImode:
3093 case V8HImode:
3094 case V4SFmode:
3095 case V4SImode:
3096 /* AltiVec vector modes. Only reg+reg addressing is valid here,
3097 which leaves the only valid constant offset of zero, which by
3098 canonicalization rules is also invalid. */
3099 return false;
3100
3101 case V4HImode:
3102 case V2SImode:
3103 case V1DImode:
3104 case V2SFmode:
3105 /* SPE vector modes. */
3106 return SPE_CONST_OFFSET_OK (offset);
3107
3108 case DFmode:
3109 case DImode:
3364872d 3110 if (mode == DFmode || !TARGET_POWERPC64)
4d588c14
RH
3111 extra = 4;
3112 else if (offset & 3)
3113 return false;
3114 break;
3115
3116 case TFmode:
3117 case TImode:
3364872d 3118 if (mode == TFmode || !TARGET_POWERPC64)
4d588c14
RH
3119 extra = 12;
3120 else if (offset & 3)
3121 return false;
3122 else
3123 extra = 8;
3124 break;
3125
3126 default:
3127 break;
3128 }
3129
b1917422
AM
3130 offset += 0x8000;
3131 return (offset < 0x10000) && (offset + extra < 0x10000);
4d588c14
RH
3132}
3133
3134static bool
a2369ed3 3135legitimate_indexed_address_p (rtx x, int strict)
4d588c14
RH
3136{
3137 rtx op0, op1;
3138
3139 if (GET_CODE (x) != PLUS)
3140 return false;
3141 op0 = XEXP (x, 0);
3142 op1 = XEXP (x, 1);
3143
3144 if (!REG_P (op0) || !REG_P (op1))
3145 return false;
3146
3147 return ((INT_REG_OK_FOR_BASE_P (op0, strict)
3148 && INT_REG_OK_FOR_INDEX_P (op1, strict))
3149 || (INT_REG_OK_FOR_BASE_P (op1, strict)
3150 && INT_REG_OK_FOR_INDEX_P (op0, strict)));
9ebbca7d
GK
3151}
3152
4d588c14 3153static inline bool
a2369ed3 3154legitimate_indirect_address_p (rtx x, int strict)
4d588c14
RH
3155{
3156 return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
3157}
3158
4c81e946
FJ
3159static bool
3160macho_lo_sum_memory_operand (rtx x, enum machine_mode mode)
3161{
3162 if (!TARGET_MACHO || !flag_pic
3163 || mode != SImode || GET_CODE(x) != MEM)
3164 return false;
3165 x = XEXP (x, 0);
3166
3167 if (GET_CODE (x) != LO_SUM)
3168 return false;
3169 if (GET_CODE (XEXP (x, 0)) != REG)
3170 return false;
3171 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), 0))
3172 return false;
3173 x = XEXP (x, 1);
3174
3175 return CONSTANT_P (x);
3176}
3177
4d588c14 3178static bool
a2369ed3 3179legitimate_lo_sum_address_p (enum machine_mode mode, rtx x, int strict)
4d588c14
RH
3180{
3181 if (GET_CODE (x) != LO_SUM)
3182 return false;
3183 if (GET_CODE (XEXP (x, 0)) != REG)
3184 return false;
3185 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
3186 return false;
3187 x = XEXP (x, 1);
3188
8622e235 3189 if (TARGET_ELF || TARGET_MACHO)
4d588c14 3190 {
a29077da 3191 if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
4d588c14
RH
3192 return false;
3193 if (TARGET_TOC)
3194 return false;
3195 if (GET_MODE_NUNITS (mode) != 1)
3196 return false;
c1e55850 3197 if (GET_MODE_BITSIZE (mode) > 64)
4d588c14
RH
3198 return false;
3199
3200 return CONSTANT_P (x);
3201 }
3202
3203 return false;
3204}
3205
3206
9ebbca7d
GK
3207/* Try machine-dependent ways of modifying an illegitimate address
3208 to be legitimate. If we find one, return the new, valid address.
3209 This is used from only one place: `memory_address' in explow.c.
3210
a4f6c312
SS
3211 OLDX is the address as it was before break_out_memory_refs was
3212 called. In some cases it is useful to look at this to decide what
3213 needs to be done.
9ebbca7d 3214
a4f6c312 3215 MODE is passed so that this function can use GO_IF_LEGITIMATE_ADDRESS.
9ebbca7d 3216
a4f6c312
SS
3217 It is always safe for this function to do nothing. It exists to
3218 recognize opportunities to optimize the output.
9ebbca7d
GK
3219
3220 On RS/6000, first check for the sum of a register with a constant
3221 integer that is out of range. If so, generate code to add the
3222 constant with the low-order 16 bits masked to the register and force
3223 this result into another register (this can be done with `cau').
3224 Then generate an address of REG+(CONST&0xffff), allowing for the
3225 possibility of bit 16 being a one.
3226
3227 Then check for the sum of a register and something not constant, try to
3228 load the other things into a register and return the sum. */
4d588c14 3229
9ebbca7d 3230rtx
a2369ed3
DJ
3231rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
3232 enum machine_mode mode)
0ac081f6 3233{
c4501e62
JJ
3234 if (GET_CODE (x) == SYMBOL_REF)
3235 {
3236 enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
3237 if (model != 0)
3238 return rs6000_legitimize_tls_address (x, model);
3239 }
3240
9ebbca7d
GK
3241 if (GET_CODE (x) == PLUS
3242 && GET_CODE (XEXP (x, 0)) == REG
3243 && GET_CODE (XEXP (x, 1)) == CONST_INT
3244 && (unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000) >= 0x10000)
3245 {
3246 HOST_WIDE_INT high_int, low_int;
3247 rtx sum;
a65c591c
DE
3248 low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
3249 high_int = INTVAL (XEXP (x, 1)) - low_int;
9ebbca7d
GK
3250 sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
3251 GEN_INT (high_int)), 0);
3252 return gen_rtx_PLUS (Pmode, sum, GEN_INT (low_int));
3253 }
3254 else if (GET_CODE (x) == PLUS
3255 && GET_CODE (XEXP (x, 0)) == REG
3256 && GET_CODE (XEXP (x, 1)) != CONST_INT
6ac7bf2c 3257 && GET_MODE_NUNITS (mode) == 1
a3170dc6
AH
3258 && ((TARGET_HARD_FLOAT && TARGET_FPRS)
3259 || TARGET_POWERPC64
fcce224d 3260 || (mode != DFmode && mode != TFmode))
9ebbca7d
GK
3261 && (TARGET_POWERPC64 || mode != DImode)
3262 && mode != TImode)
3263 {
3264 return gen_rtx_PLUS (Pmode, XEXP (x, 0),
3265 force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
3266 }
0ac081f6
AH
3267 else if (ALTIVEC_VECTOR_MODE (mode))
3268 {
3269 rtx reg;
3270
3271 /* Make sure both operands are registers. */
3272 if (GET_CODE (x) == PLUS)
9f85ed45 3273 return gen_rtx_PLUS (Pmode, force_reg (Pmode, XEXP (x, 0)),
0ac081f6
AH
3274 force_reg (Pmode, XEXP (x, 1)));
3275
3276 reg = force_reg (Pmode, x);
3277 return reg;
3278 }
a3170dc6
AH
3279 else if (SPE_VECTOR_MODE (mode))
3280 {
3281 /* We accept [reg + reg] and [reg + OFFSET]. */
3282
3283 if (GET_CODE (x) == PLUS)
3284 {
3285 rtx op1 = XEXP (x, 0);
3286 rtx op2 = XEXP (x, 1);
3287
3288 op1 = force_reg (Pmode, op1);
3289
3290 if (GET_CODE (op2) != REG
3291 && (GET_CODE (op2) != CONST_INT
3292 || !SPE_CONST_OFFSET_OK (INTVAL (op2))))
3293 op2 = force_reg (Pmode, op2);
3294
3295 return gen_rtx_PLUS (Pmode, op1, op2);
3296 }
3297
3298 return force_reg (Pmode, x);
3299 }
f1384257
AM
3300 else if (TARGET_ELF
3301 && TARGET_32BIT
3302 && TARGET_NO_TOC
3303 && ! flag_pic
9ebbca7d
GK
3304 && GET_CODE (x) != CONST_INT
3305 && GET_CODE (x) != CONST_DOUBLE
3306 && CONSTANT_P (x)
6ac7bf2c
GK
3307 && GET_MODE_NUNITS (mode) == 1
3308 && (GET_MODE_BITSIZE (mode) <= 32
a3170dc6 3309 || ((TARGET_HARD_FLOAT && TARGET_FPRS) && mode == DFmode)))
9ebbca7d
GK
3310 {
3311 rtx reg = gen_reg_rtx (Pmode);
8a1977f3
GK
3312 emit_insn (gen_elf_high (reg, x));
3313 return gen_rtx_LO_SUM (Pmode, reg, x);
9ebbca7d 3314 }
ee890fe2
SS
3315 else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
3316 && ! flag_pic
ab82a49f
AP
3317#if TARGET_MACHO
3318 && ! MACHO_DYNAMIC_NO_PIC_P
3319#endif
ee890fe2
SS
3320 && GET_CODE (x) != CONST_INT
3321 && GET_CODE (x) != CONST_DOUBLE
3322 && CONSTANT_P (x)
a3170dc6 3323 && ((TARGET_HARD_FLOAT && TARGET_FPRS) || mode != DFmode)
ee890fe2
SS
3324 && mode != DImode
3325 && mode != TImode)
3326 {
3327 rtx reg = gen_reg_rtx (Pmode);
8a1977f3
GK
3328 emit_insn (gen_macho_high (reg, x));
3329 return gen_rtx_LO_SUM (Pmode, reg, x);
ee890fe2 3330 }
9ebbca7d 3331 else if (TARGET_TOC
4d588c14 3332 && constant_pool_expr_p (x)
a9098fd0 3333 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
9ebbca7d
GK
3334 {
3335 return create_TOC_reference (x);
3336 }
3337 else
3338 return NULL_RTX;
3339}
258bfae2 3340
c973d557
JJ
3341/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
3342 We need to emit DTP-relative relocations. */
3343
3344void
3345rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
3346{
3347 switch (size)
3348 {
3349 case 4:
3350 fputs ("\t.long\t", file);
3351 break;
3352 case 8:
3353 fputs (DOUBLE_INT_ASM_OP, file);
3354 break;
3355 default:
3356 abort ();
3357 }
3358 output_addr_const (file, x);
3359 fputs ("@dtprel+0x8000", file);
3360}
3361
c4501e62
JJ
3362/* Construct the SYMBOL_REF for the tls_get_addr function. */
3363
3364static GTY(()) rtx rs6000_tls_symbol;
3365static rtx
863d938c 3366rs6000_tls_get_addr (void)
c4501e62
JJ
3367{
3368 if (!rs6000_tls_symbol)
3369 rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
3370
3371 return rs6000_tls_symbol;
3372}
3373
3374/* Construct the SYMBOL_REF for TLS GOT references. */
3375
3376static GTY(()) rtx rs6000_got_symbol;
3377static rtx
863d938c 3378rs6000_got_sym (void)
c4501e62
JJ
3379{
3380 if (!rs6000_got_symbol)
3381 {
3382 rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3383 SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
3384 SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
3385 }
3386
3387 return rs6000_got_symbol;
3388}
3389
3390/* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
3391 this (thread-local) address. */
3392
3393static rtx
a2369ed3 3394rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
c4501e62
JJ
3395{
3396 rtx dest, insn;
3397
3398 dest = gen_reg_rtx (Pmode);
3399 if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
3400 {
3401 rtx tlsreg;
3402
3403 if (TARGET_64BIT)
3404 {
3405 tlsreg = gen_rtx_REG (Pmode, 13);
3406 insn = gen_tls_tprel_64 (dest, tlsreg, addr);
3407 }
3408 else
3409 {
3410 tlsreg = gen_rtx_REG (Pmode, 2);
3411 insn = gen_tls_tprel_32 (dest, tlsreg, addr);
3412 }
3413 emit_insn (insn);
3414 }
3415 else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
3416 {
3417 rtx tlsreg, tmp;
3418
3419 tmp = gen_reg_rtx (Pmode);
3420 if (TARGET_64BIT)
3421 {
3422 tlsreg = gen_rtx_REG (Pmode, 13);
3423 insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
3424 }
3425 else
3426 {
3427 tlsreg = gen_rtx_REG (Pmode, 2);
3428 insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
3429 }
3430 emit_insn (insn);
3431 if (TARGET_64BIT)
3432 insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
3433 else
3434 insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
3435 emit_insn (insn);
3436 }
3437 else
3438 {
3439 rtx r3, got, tga, tmp1, tmp2, eqv;
3440
3441 if (TARGET_64BIT)
3442 got = gen_rtx_REG (Pmode, TOC_REGISTER);
3443 else
3444 {
3445 if (flag_pic == 1)
3446 got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
3447 else
3448 {
3449 rtx gsym = rs6000_got_sym ();
3450 got = gen_reg_rtx (Pmode);
3451 if (flag_pic == 0)
3452 rs6000_emit_move (got, gsym, Pmode);
3453 else
3454 {
3455 char buf[30];
3456 static int tls_got_labelno = 0;
3457 rtx tempLR, lab, tmp3, mem;
3458 rtx first, last;
3459
3460 ASM_GENERATE_INTERNAL_LABEL (buf, "LTLS", tls_got_labelno++);
3461 lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
3462 tempLR = gen_reg_rtx (Pmode);
3463 tmp1 = gen_reg_rtx (Pmode);
3464 tmp2 = gen_reg_rtx (Pmode);
3465 tmp3 = gen_reg_rtx (Pmode);
542a8afa 3466 mem = gen_const_mem (Pmode, tmp1);
c4501e62
JJ
3467
3468 first = emit_insn (gen_load_toc_v4_PIC_1b (tempLR, lab,
3469 gsym));
3470 emit_move_insn (tmp1, tempLR);
3471 emit_move_insn (tmp2, mem);
3472 emit_insn (gen_addsi3 (tmp3, tmp1, tmp2));
3473 last = emit_move_insn (got, tmp3);
3474 REG_NOTES (last) = gen_rtx_EXPR_LIST (REG_EQUAL, gsym,
3475 REG_NOTES (last));
3476 REG_NOTES (first) = gen_rtx_INSN_LIST (REG_LIBCALL, last,
3477 REG_NOTES (first));
3478 REG_NOTES (last) = gen_rtx_INSN_LIST (REG_RETVAL, first,
3479 REG_NOTES (last));
3480 }
3481 }
3482 }
3483
3484 if (model == TLS_MODEL_GLOBAL_DYNAMIC)
3485 {
3486 r3 = gen_rtx_REG (Pmode, 3);
3487 if (TARGET_64BIT)
3488 insn = gen_tls_gd_64 (r3, got, addr);
3489 else
3490 insn = gen_tls_gd_32 (r3, got, addr);
3491 start_sequence ();
3492 emit_insn (insn);
3493 tga = gen_rtx_MEM (Pmode, rs6000_tls_get_addr ());
3494 insn = gen_call_value (r3, tga, const0_rtx, const0_rtx);
3495 insn = emit_call_insn (insn);
3496 CONST_OR_PURE_CALL_P (insn) = 1;
3497 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
3498 insn = get_insns ();
3499 end_sequence ();
3500 emit_libcall_block (insn, dest, r3, addr);
3501 }
3502 else if (model == TLS_MODEL_LOCAL_DYNAMIC)
3503 {
3504 r3 = gen_rtx_REG (Pmode, 3);
3505 if (TARGET_64BIT)
3506 insn = gen_tls_ld_64 (r3, got);
3507 else
3508 insn = gen_tls_ld_32 (r3, got);
3509 start_sequence ();
3510 emit_insn (insn);
3511 tga = gen_rtx_MEM (Pmode, rs6000_tls_get_addr ());
3512 insn = gen_call_value (r3, tga, const0_rtx, const0_rtx);
3513 insn = emit_call_insn (insn);
3514 CONST_OR_PURE_CALL_P (insn) = 1;
3515 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
3516 insn = get_insns ();
3517 end_sequence ();
3518 tmp1 = gen_reg_rtx (Pmode);
3519 eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
3520 UNSPEC_TLSLD);
3521 emit_libcall_block (insn, tmp1, r3, eqv);
3522 if (rs6000_tls_size == 16)
3523 {
3524 if (TARGET_64BIT)
3525 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
3526 else
3527 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
3528 }
3529 else if (rs6000_tls_size == 32)
3530 {
3531 tmp2 = gen_reg_rtx (Pmode);
3532 if (TARGET_64BIT)
3533 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
3534 else
3535 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
3536 emit_insn (insn);
3537 if (TARGET_64BIT)
3538 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
3539 else
3540 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
3541 }
3542 else
3543 {
3544 tmp2 = gen_reg_rtx (Pmode);
3545 if (TARGET_64BIT)
3546 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
3547 else
3548 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
3549 emit_insn (insn);
3550 insn = gen_rtx_SET (Pmode, dest,
3551 gen_rtx_PLUS (Pmode, tmp2, tmp1));
3552 }
3553 emit_insn (insn);
3554 }
3555 else
3556 {
3557 /* IE, or 64 bit offset LE. */
3558 tmp2 = gen_reg_rtx (Pmode);
3559 if (TARGET_64BIT)
3560 insn = gen_tls_got_tprel_64 (tmp2, got, addr);
3561 else
3562 insn = gen_tls_got_tprel_32 (tmp2, got, addr);
3563 emit_insn (insn);
3564 if (TARGET_64BIT)
3565 insn = gen_tls_tls_64 (dest, tmp2, addr);
3566 else
3567 insn = gen_tls_tls_32 (dest, tmp2, addr);
3568 emit_insn (insn);
3569 }
3570 }
3571
3572 return dest;
3573}
3574
3575/* Return 1 if X is a SYMBOL_REF for a TLS symbol. This is used in
3576 instruction definitions. */
3577
3578int
a2369ed3 3579rs6000_tls_symbol_ref (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED)
c4501e62
JJ
3580{
3581 return RS6000_SYMBOL_REF_TLS_P (x);
3582}
3583
3584/* Return 1 if X contains a thread-local symbol. */
3585
3586bool
a2369ed3 3587rs6000_tls_referenced_p (rtx x)
c4501e62 3588{
cd413cab
AP
3589 if (! TARGET_HAVE_TLS)
3590 return false;
3591
c4501e62
JJ
3592 return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
3593}
3594
3595/* Return 1 if *X is a thread-local symbol. This is the same as
3596 rs6000_tls_symbol_ref except for the type of the unused argument. */
3597
3598static inline int
a2369ed3 3599rs6000_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
c4501e62
JJ
3600{
3601 return RS6000_SYMBOL_REF_TLS_P (*x);
3602}
3603
24ea750e
DJ
3604/* The convention appears to be to define this wherever it is used.
3605 With legitimize_reload_address now defined here, REG_MODE_OK_FOR_BASE_P
3606 is now used here. */
3607#ifndef REG_MODE_OK_FOR_BASE_P
3608#define REG_MODE_OK_FOR_BASE_P(REGNO, MODE) REG_OK_FOR_BASE_P (REGNO)
3609#endif
3610
3611/* Our implementation of LEGITIMIZE_RELOAD_ADDRESS. Returns a value to
3612 replace the input X, or the original X if no replacement is called for.
3613 The output parameter *WIN is 1 if the calling macro should goto WIN,
3614 0 if it should not.
3615
3616 For RS/6000, we wish to handle large displacements off a base
3617 register by splitting the addend across an addiu/addis and the mem insn.
3618 This cuts number of extra insns needed from 3 to 1.
3619
3620 On Darwin, we use this to generate code for floating point constants.
3621 A movsf_low is generated so we wind up with 2 instructions rather than 3.
3622 The Darwin code is inside #if TARGET_MACHO because only then is
3623 machopic_function_base_name() defined. */
3624rtx
a2369ed3
DJ
3625rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
3626 int opnum, int type, int ind_levels ATTRIBUTE_UNUSED, int *win)
24ea750e
DJ
3627{
3628 /* We must recognize output that we have already generated ourselves. */
3629 if (GET_CODE (x) == PLUS
3630 && GET_CODE (XEXP (x, 0)) == PLUS
3631 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
3632 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3633 && GET_CODE (XEXP (x, 1)) == CONST_INT)
3634 {
3635 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3636 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3637 opnum, (enum reload_type)type);
3638 *win = 1;
3639 return x;
3640 }
3deb2758 3641
24ea750e
DJ
3642#if TARGET_MACHO
3643 if (DEFAULT_ABI == ABI_DARWIN && flag_pic
3644 && GET_CODE (x) == LO_SUM
3645 && GET_CODE (XEXP (x, 0)) == PLUS
3646 && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
3647 && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
3648 && GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 0)) == CONST
3649 && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
3650 && GET_CODE (XEXP (XEXP (x, 1), 0)) == MINUS
3651 && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 0)) == SYMBOL_REF
3652 && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 1)) == SYMBOL_REF)
3653 {
3654 /* Result of previous invocation of this function on Darwin
6f317ef3 3655 floating point constant. */
24ea750e
DJ
3656 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3657 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
3658 opnum, (enum reload_type)type);
3659 *win = 1;
3660 return x;
3661 }
3662#endif
3663 if (GET_CODE (x) == PLUS
3664 && GET_CODE (XEXP (x, 0)) == REG
3665 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
3666 && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
78c875e8 3667 && GET_CODE (XEXP (x, 1)) == CONST_INT
93638d7a 3668 && !SPE_VECTOR_MODE (mode)
78c875e8 3669 && !ALTIVEC_VECTOR_MODE (mode))
24ea750e
DJ
3670 {
3671 HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
3672 HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
3673 HOST_WIDE_INT high
3674 = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
3675
3676 /* Check for 32-bit overflow. */
3677 if (high + low != val)
3678 {
3679 *win = 0;
3680 return x;
3681 }
3682
3683 /* Reload the high part into a base reg; leave the low part
3684 in the mem directly. */
3685
3686 x = gen_rtx_PLUS (GET_MODE (x),
3687 gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
3688 GEN_INT (high)),
3689 GEN_INT (low));
3690
3691 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3692 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3693 opnum, (enum reload_type)type);
3694 *win = 1;
3695 return x;
3696 }
3697#if TARGET_MACHO
3698 if (GET_CODE (x) == SYMBOL_REF
3699 && DEFAULT_ABI == ABI_DARWIN
69ef87e2 3700 && !ALTIVEC_VECTOR_MODE (mode)
a29077da
GK
3701 && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
3702 /* Don't do this for TFmode, since the result isn't offsettable. */
3703 && mode != TFmode)
24ea750e 3704 {
a29077da
GK
3705 if (flag_pic)
3706 {
3707 rtx offset = gen_rtx_CONST (Pmode,
3708 gen_rtx_MINUS (Pmode, x,
11abc112 3709 machopic_function_base_sym ()));
a29077da
GK
3710 x = gen_rtx_LO_SUM (GET_MODE (x),
3711 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
3712 gen_rtx_HIGH (Pmode, offset)), offset);
3713 }
3714 else
3715 x = gen_rtx_LO_SUM (GET_MODE (x),
3716 gen_rtx_HIGH (Pmode, x), x);
3717
24ea750e 3718 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
a29077da
GK
3719 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
3720 opnum, (enum reload_type)type);
24ea750e
DJ
3721 *win = 1;
3722 return x;
3723 }
3724#endif
3725 if (TARGET_TOC
4d588c14 3726 && constant_pool_expr_p (x)
c1f11548 3727 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
24ea750e
DJ
3728 {
3729 (x) = create_TOC_reference (x);
3730 *win = 1;
3731 return x;
3732 }
3733 *win = 0;
3734 return x;
3735}
3736
258bfae2
FS
3737/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
3738 that is a valid memory address for an instruction.
3739 The MODE argument is the machine mode for the MEM expression
3740 that wants to use this address.
3741
3742 On the RS/6000, there are four valid address: a SYMBOL_REF that
3743 refers to a constant pool entry of an address (or the sum of it
3744 plus a constant), a short (16-bit signed) constant plus a register,
3745 the sum of two registers, or a register indirect, possibly with an
5bdc5878 3746 auto-increment. For DFmode and DImode with a constant plus register,
258bfae2
FS
3747 we must ensure that both words are addressable or PowerPC64 with offset
3748 word aligned.
3749
3750 For modes spanning multiple registers (DFmode in 32-bit GPRs,
76d2b81d 3751 32-bit DImode, TImode, TFmode), indexed addressing cannot be used because
258bfae2
FS
3752 adjacent memory cells are accessed by adding word-sized offsets
3753 during assembly output. */
3754int
a2369ed3 3755rs6000_legitimate_address (enum machine_mode mode, rtx x, int reg_ok_strict)
258bfae2 3756{
c4501e62
JJ
3757 if (RS6000_SYMBOL_REF_TLS_P (x))
3758 return 0;
4d588c14 3759 if (legitimate_indirect_address_p (x, reg_ok_strict))
258bfae2
FS
3760 return 1;
3761 if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
0d6d6892 3762 && !ALTIVEC_VECTOR_MODE (mode)
a3170dc6 3763 && !SPE_VECTOR_MODE (mode)
258bfae2 3764 && TARGET_UPDATE
4d588c14 3765 && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
258bfae2 3766 return 1;
4d588c14 3767 if (legitimate_small_data_p (mode, x))
258bfae2 3768 return 1;
4d588c14 3769 if (legitimate_constant_pool_address_p (x))
258bfae2
FS
3770 return 1;
3771 /* If not REG_OK_STRICT (before reload) let pass any stack offset. */
3772 if (! reg_ok_strict
3773 && GET_CODE (x) == PLUS
3774 && GET_CODE (XEXP (x, 0)) == REG
708d2456
HP
3775 && (XEXP (x, 0) == virtual_stack_vars_rtx
3776 || XEXP (x, 0) == arg_pointer_rtx)
258bfae2
FS
3777 && GET_CODE (XEXP (x, 1)) == CONST_INT)
3778 return 1;
76d2b81d 3779 if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
258bfae2
FS
3780 return 1;
3781 if (mode != TImode
76d2b81d 3782 && mode != TFmode
a3170dc6
AH
3783 && ((TARGET_HARD_FLOAT && TARGET_FPRS)
3784 || TARGET_POWERPC64
fcce224d 3785 || (mode != DFmode && mode != TFmode))
258bfae2 3786 && (TARGET_POWERPC64 || mode != DImode)
4d588c14 3787 && legitimate_indexed_address_p (x, reg_ok_strict))
258bfae2 3788 return 1;
4d588c14 3789 if (legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
258bfae2
FS
3790 return 1;
3791 return 0;
3792}
4d588c14
RH
3793
3794/* Go to LABEL if ADDR (a legitimate address expression)
3795 has an effect that depends on the machine mode it is used for.
3796
3797 On the RS/6000 this is true of all integral offsets (since AltiVec
3798 modes don't allow them) or is a pre-increment or decrement.
3799
3800 ??? Except that due to conceptual problems in offsettable_address_p
3801 we can't really report the problems of integral offsets. So leave
3802 this assuming that the adjustable offset must be valid for the
3803 sub-words of a TFmode operand, which is what we had before. */
3804
3805bool
a2369ed3 3806rs6000_mode_dependent_address (rtx addr)
4d588c14
RH
3807{
3808 switch (GET_CODE (addr))
3809 {
3810 case PLUS:
3811 if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
3812 {
3813 unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
3814 return val + 12 + 0x8000 >= 0x10000;
3815 }
3816 break;
3817
3818 case LO_SUM:
3819 return true;
3820
3821 case PRE_INC:
3822 case PRE_DEC:
3823 return TARGET_UPDATE;
3824
3825 default:
3826 break;
3827 }
3828
3829 return false;
3830}
d8ecbcdb
AH
3831
3832/* Return number of consecutive hard regs needed starting at reg REGNO
3833 to hold something of mode MODE.
3834 This is ordinarily the length in words of a value of mode MODE
3835 but can be less for certain modes in special long registers.
3836
3837 For the SPE, GPRs are 64 bits but only 32 bits are visible in
3838 scalar instructions. The upper 32 bits are only available to the
3839 SIMD instructions.
3840
3841 POWER and PowerPC GPRs hold 32 bits worth;
3842 PowerPC64 GPRs and FPRs point register holds 64 bits worth. */
3843
3844int
3845rs6000_hard_regno_nregs (int regno, enum machine_mode mode)
3846{
3847 if (FP_REGNO_P (regno))
3848 return (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
3849
3850 if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode))
3851 return (GET_MODE_SIZE (mode) + UNITS_PER_SPE_WORD - 1) / UNITS_PER_SPE_WORD;
3852
3853 if (ALTIVEC_REGNO_P (regno))
3854 return
3855 (GET_MODE_SIZE (mode) + UNITS_PER_ALTIVEC_WORD - 1) / UNITS_PER_ALTIVEC_WORD;
3856
3857 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3858}
2aa4498c
AH
3859
3860/* Change register usage conditional on target flags. */
3861void
3862rs6000_conditional_register_usage (void)
3863{
3864 int i;
3865
3866 /* Set MQ register fixed (already call_used) if not POWER
3867 architecture (RIOS1, RIOS2, RSC, and PPC601) so that it will not
3868 be allocated. */
3869 if (! TARGET_POWER)
3870 fixed_regs[64] = 1;
3871
3872 /* 64-bit AIX reserves GPR13 for thread-private data. */
3873 if (TARGET_64BIT)
3874 fixed_regs[13] = call_used_regs[13]
3875 = call_really_used_regs[13] = 1;
3876
3877 /* Conditionally disable FPRs. */
3878 if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
3879 for (i = 32; i < 64; i++)
3880 fixed_regs[i] = call_used_regs[i]
3881 = call_really_used_regs[i] = 1;
3882
3883 if (DEFAULT_ABI == ABI_V4
3884 && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
3885 && flag_pic == 2)
3886 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3887
3888 if (DEFAULT_ABI == ABI_V4
3889 && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
3890 && flag_pic == 1)
3891 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3892 = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3893 = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3894
3895 if (DEFAULT_ABI == ABI_DARWIN
3896 && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
3897 global_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3898 = fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3899 = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3900 = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3901
b4db40bf
JJ
3902 if (TARGET_TOC && TARGET_MINIMAL_TOC)
3903 fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
3904 = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
3905
2aa4498c
AH
3906 if (TARGET_ALTIVEC)
3907 global_regs[VSCR_REGNO] = 1;
3908
3909 if (TARGET_SPE)
3910 {
3911 global_regs[SPEFSCR_REGNO] = 1;
3912 fixed_regs[FIXED_SCRATCH]
3913 = call_used_regs[FIXED_SCRATCH]
3914 = call_really_used_regs[FIXED_SCRATCH] = 1;
3915 }
3916
3917 if (! TARGET_ALTIVEC)
3918 {
3919 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
3920 fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
3921 call_really_used_regs[VRSAVE_REGNO] = 1;
3922 }
3923
3924 if (TARGET_ALTIVEC_ABI)
3925 for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
3926 call_used_regs[i] = call_really_used_regs[i] = 1;
3927}
fb4d4348 3928\f
a4f6c312
SS
3929/* Try to output insns to set TARGET equal to the constant C if it can
3930 be done in less than N insns. Do all computations in MODE.
3931 Returns the place where the output has been placed if it can be
3932 done and the insns have been emitted. If it would take more than N
3933 insns, zero is returned and no insns and emitted. */
2bfcf297
DB
3934
3935rtx
a2369ed3
DJ
3936rs6000_emit_set_const (rtx dest, enum machine_mode mode,
3937 rtx source, int n ATTRIBUTE_UNUSED)
2bfcf297 3938{
af8cb5c5 3939 rtx result, insn, set;
2bfcf297
DB
3940 HOST_WIDE_INT c0, c1;
3941
af8cb5c5 3942 if (mode == QImode || mode == HImode)
2bfcf297
DB
3943 {
3944 if (dest == NULL)
3945 dest = gen_reg_rtx (mode);
3946 emit_insn (gen_rtx_SET (VOIDmode, dest, source));
3947 return dest;
3948 }
af8cb5c5 3949 else if (mode == SImode)
2bfcf297 3950 {
af8cb5c5
DE
3951 result = no_new_pseudos ? dest : gen_reg_rtx (SImode);
3952
3953 emit_insn (gen_rtx_SET (VOIDmode, result,
3954 GEN_INT (INTVAL (source)
3955 & (~ (HOST_WIDE_INT) 0xffff))));
3956 emit_insn (gen_rtx_SET (VOIDmode, dest,
3957 gen_rtx_IOR (SImode, result,
3958 GEN_INT (INTVAL (source) & 0xffff))));
3959 result = dest;
2bfcf297 3960 }
af8cb5c5 3961 else if (mode == DImode)
2bfcf297 3962 {
af8cb5c5
DE
3963 if (GET_CODE (source) == CONST_INT)
3964 {
3965 c0 = INTVAL (source);
3966 c1 = -(c0 < 0);
3967 }
3968 else if (GET_CODE (source) == CONST_DOUBLE)
3969 {
2bfcf297 3970#if HOST_BITS_PER_WIDE_INT >= 64
af8cb5c5
DE
3971 c0 = CONST_DOUBLE_LOW (source);
3972 c1 = -(c0 < 0);
2bfcf297 3973#else
af8cb5c5
DE
3974 c0 = CONST_DOUBLE_LOW (source);
3975 c1 = CONST_DOUBLE_HIGH (source);
2bfcf297 3976#endif
af8cb5c5
DE
3977 }
3978 else
3979 abort ();
3980
3981 result = rs6000_emit_set_long_const (dest, c0, c1);
2bfcf297
DB
3982 }
3983 else
a4f6c312 3984 abort ();
2bfcf297 3985
af8cb5c5
DE
3986 insn = get_last_insn ();
3987 set = single_set (insn);
3988 if (! CONSTANT_P (SET_SRC (set)))
3989 set_unique_reg_note (insn, REG_EQUAL, source);
3990
3991 return result;
2bfcf297
DB
3992}
3993
3994/* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
3995 fall back to a straight forward decomposition. We do this to avoid
3996 exponential run times encountered when looking for longer sequences
3997 with rs6000_emit_set_const. */
3998static rtx
a2369ed3 3999rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
2bfcf297
DB
4000{
4001 if (!TARGET_POWERPC64)
4002 {
4003 rtx operand1, operand2;
4004
4005 operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
4006 DImode);
4007 operand2 = operand_subword_force (dest, WORDS_BIG_ENDIAN != 0,
4008 DImode);
4009 emit_move_insn (operand1, GEN_INT (c1));
4010 emit_move_insn (operand2, GEN_INT (c2));
4011 }
4012 else
4013 {
bc06712d 4014 HOST_WIDE_INT ud1, ud2, ud3, ud4;
252b88f7 4015
bc06712d 4016 ud1 = c1 & 0xffff;
f921c9c9 4017 ud2 = (c1 & 0xffff0000) >> 16;
2bfcf297 4018#if HOST_BITS_PER_WIDE_INT >= 64
bc06712d 4019 c2 = c1 >> 32;
2bfcf297 4020#endif
bc06712d 4021 ud3 = c2 & 0xffff;
f921c9c9 4022 ud4 = (c2 & 0xffff0000) >> 16;
2bfcf297 4023
bc06712d
TR
4024 if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
4025 || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
2bfcf297 4026 {
bc06712d 4027 if (ud1 & 0x8000)
b78d48dd 4028 emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) - 0x8000)));
bc06712d
TR
4029 else
4030 emit_move_insn (dest, GEN_INT (ud1));
2bfcf297 4031 }
2bfcf297 4032
bc06712d
TR
4033 else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
4034 || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
252b88f7 4035 {
bc06712d
TR
4036 if (ud2 & 0x8000)
4037 emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
4038 - 0x80000000));
252b88f7 4039 else
bc06712d
TR
4040 emit_move_insn (dest, GEN_INT (ud2 << 16));
4041 if (ud1 != 0)
4042 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
252b88f7 4043 }
bc06712d
TR
4044 else if ((ud4 == 0xffff && (ud3 & 0x8000))
4045 || (ud4 == 0 && ! (ud3 & 0x8000)))
4046 {
4047 if (ud3 & 0x8000)
4048 emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
4049 - 0x80000000));
4050 else
4051 emit_move_insn (dest, GEN_INT (ud3 << 16));
4052
4053 if (ud2 != 0)
4054 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud2)));
4055 emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (16)));
4056 if (ud1 != 0)
4057 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
4058 }
4059 else
4060 {
4061 if (ud4 & 0x8000)
4062 emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
4063 - 0x80000000));
4064 else
4065 emit_move_insn (dest, GEN_INT (ud4 << 16));
4066
4067 if (ud3 != 0)
4068 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud3)));
2bfcf297 4069
bc06712d
TR
4070 emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (32)));
4071 if (ud2 != 0)
4072 emit_move_insn (dest, gen_rtx_IOR (DImode, dest,
4073 GEN_INT (ud2 << 16)));
4074 if (ud1 != 0)
4075 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
4076 }
4077 }
2bfcf297
DB
4078 return dest;
4079}
4080
76d2b81d
DJ
4081/* Helper for the following. Get rid of [r+r] memory refs
4082 in cases where it won't work (TImode, TFmode). */
4083
4084static void
4085rs6000_eliminate_indexed_memrefs (rtx operands[2])
4086{
4087 if (GET_CODE (operands[0]) == MEM
4088 && GET_CODE (XEXP (operands[0], 0)) != REG
4089 && ! reload_in_progress)
4090 operands[0]
4091 = replace_equiv_address (operands[0],
4092 copy_addr_to_reg (XEXP (operands[0], 0)));
4093
4094 if (GET_CODE (operands[1]) == MEM
4095 && GET_CODE (XEXP (operands[1], 0)) != REG
4096 && ! reload_in_progress)
4097 operands[1]
4098 = replace_equiv_address (operands[1],
4099 copy_addr_to_reg (XEXP (operands[1], 0)));
4100}
4101
fb4d4348
GK
4102/* Emit a move from SOURCE to DEST in mode MODE. */
4103void
a2369ed3 4104rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
fb4d4348
GK
4105{
4106 rtx operands[2];
4107 operands[0] = dest;
4108 operands[1] = source;
4109
4110 /* Sanity checks. Check that we get CONST_DOUBLE only when we should. */
4111 if (GET_CODE (operands[1]) == CONST_DOUBLE
4112 && ! FLOAT_MODE_P (mode)
4113 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
4114 {
4115 /* FIXME. This should never happen. */
4116 /* Since it seems that it does, do the safe thing and convert
4117 to a CONST_INT. */
2496c7bd 4118 operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
fb4d4348
GK
4119 }
4120 if (GET_CODE (operands[1]) == CONST_DOUBLE
4121 && ! FLOAT_MODE_P (mode)
4122 && ((CONST_DOUBLE_HIGH (operands[1]) == 0
4123 && CONST_DOUBLE_LOW (operands[1]) >= 0)
4124 || (CONST_DOUBLE_HIGH (operands[1]) == -1
4125 && CONST_DOUBLE_LOW (operands[1]) < 0)))
4126 abort ();
c9e8cb32
DD
4127
4128 /* Check if GCC is setting up a block move that will end up using FP
4129 registers as temporaries. We must make sure this is acceptable. */
4130 if (GET_CODE (operands[0]) == MEM
4131 && GET_CODE (operands[1]) == MEM
4132 && mode == DImode
41543739
GK
4133 && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
4134 || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
4135 && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
4136 ? 32 : MEM_ALIGN (operands[0])))
4137 || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
4138 ? 32
4139 : MEM_ALIGN (operands[1]))))
4140 && ! MEM_VOLATILE_P (operands [0])
4141 && ! MEM_VOLATILE_P (operands [1]))
c9e8cb32 4142 {
41543739
GK
4143 emit_move_insn (adjust_address (operands[0], SImode, 0),
4144 adjust_address (operands[1], SImode, 0));
4145 emit_move_insn (adjust_address (operands[0], SImode, 4),
4146 adjust_address (operands[1], SImode, 4));
c9e8cb32
DD
4147 return;
4148 }
630d42a0 4149
67cef334
DE
4150 if (!no_new_pseudos)
4151 {
4152 if (GET_CODE (operands[1]) == MEM && optimize > 0
4153 && (mode == QImode || mode == HImode || mode == SImode)
4154 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (word_mode))
4155 {
4156 rtx reg = gen_reg_rtx (word_mode);
4157
4158 emit_insn (gen_rtx_SET (word_mode, reg,
4159 gen_rtx_ZERO_EXTEND (word_mode,
4160 operands[1])));
4161 operands[1] = gen_lowpart (mode, reg);
4162 }
4163 if (GET_CODE (operands[0]) != REG)
4164 operands[1] = force_reg (mode, operands[1]);
4165 }
a9098fd0 4166
a3170dc6
AH
4167 if (mode == SFmode && ! TARGET_POWERPC
4168 && TARGET_HARD_FLOAT && TARGET_FPRS
ffc14f31 4169 && GET_CODE (operands[0]) == MEM)
fb4d4348 4170 {
ffc14f31
GK
4171 int regnum;
4172
4173 if (reload_in_progress || reload_completed)
4174 regnum = true_regnum (operands[1]);
4175 else if (GET_CODE (operands[1]) == REG)
4176 regnum = REGNO (operands[1]);
4177 else
4178 regnum = -1;
fb4d4348
GK
4179
4180 /* If operands[1] is a register, on POWER it may have
4181 double-precision data in it, so truncate it to single
4182 precision. */
4183 if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
4184 {
4185 rtx newreg;
4186 newreg = (no_new_pseudos ? operands[1] : gen_reg_rtx (mode));
4187 emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
4188 operands[1] = newreg;
4189 }
4190 }
4191
c4501e62
JJ
4192 /* Recognize the case where operand[1] is a reference to thread-local
4193 data and load its address to a register. */
4194 if (GET_CODE (operands[1]) == SYMBOL_REF)
4195 {
4196 enum tls_model model = SYMBOL_REF_TLS_MODEL (operands[1]);
4197 if (model != 0)
4198 operands[1] = rs6000_legitimize_tls_address (operands[1], model);
4199 }
4200
8f4e6caf
RH
4201 /* Handle the case where reload calls us with an invalid address. */
4202 if (reload_in_progress && mode == Pmode
69ef87e2 4203 && (! general_operand (operands[1], mode)
8f4e6caf
RH
4204 || ! nonimmediate_operand (operands[0], mode)))
4205 goto emit_set;
4206
a9baceb1
GK
4207 /* 128-bit constant floating-point values on Darwin should really be
4208 loaded as two parts. */
4209 if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
4210 && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128
4211 && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
4212 {
4213 /* DImode is used, not DFmode, because simplify_gen_subreg doesn't
4214 know how to get a DFmode SUBREG of a TFmode. */
4215 rs6000_emit_move (simplify_gen_subreg (DImode, operands[0], mode, 0),
4216 simplify_gen_subreg (DImode, operands[1], mode, 0),
4217 DImode);
4218 rs6000_emit_move (simplify_gen_subreg (DImode, operands[0], mode,
4219 GET_MODE_SIZE (DImode)),
4220 simplify_gen_subreg (DImode, operands[1], mode,
4221 GET_MODE_SIZE (DImode)),
4222 DImode);
4223 return;
4224 }
4225
fb4d4348
GK
4226 /* FIXME: In the long term, this switch statement should go away
4227 and be replaced by a sequence of tests based on things like
4228 mode == Pmode. */
4229 switch (mode)
4230 {
4231 case HImode:
4232 case QImode:
4233 if (CONSTANT_P (operands[1])
4234 && GET_CODE (operands[1]) != CONST_INT)
a9098fd0 4235 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
4236 break;
4237
06f4e019 4238 case TFmode:
76d2b81d
DJ
4239 rs6000_eliminate_indexed_memrefs (operands);
4240 /* fall through */
4241
fb4d4348
GK
4242 case DFmode:
4243 case SFmode:
4244 if (CONSTANT_P (operands[1])
4245 && ! easy_fp_constant (operands[1], mode))
a9098fd0 4246 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
4247 break;
4248
0ac081f6
AH
4249 case V16QImode:
4250 case V8HImode:
4251 case V4SFmode:
4252 case V4SImode:
a3170dc6
AH
4253 case V4HImode:
4254 case V2SFmode:
4255 case V2SImode:
00a892b8 4256 case V1DImode:
69ef87e2 4257 if (CONSTANT_P (operands[1])
d744e06e 4258 && !easy_vector_constant (operands[1], mode))
0ac081f6
AH
4259 operands[1] = force_const_mem (mode, operands[1]);
4260 break;
4261
fb4d4348 4262 case SImode:
a9098fd0 4263 case DImode:
fb4d4348
GK
4264 /* Use default pattern for address of ELF small data */
4265 if (TARGET_ELF
a9098fd0 4266 && mode == Pmode
f607bc57 4267 && DEFAULT_ABI == ABI_V4
a9098fd0
GK
4268 && (GET_CODE (operands[1]) == SYMBOL_REF
4269 || GET_CODE (operands[1]) == CONST)
4270 && small_data_operand (operands[1], mode))
fb4d4348
GK
4271 {
4272 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
4273 return;
4274 }
4275
f607bc57 4276 if (DEFAULT_ABI == ABI_V4
a9098fd0
GK
4277 && mode == Pmode && mode == SImode
4278 && flag_pic == 1 && got_operand (operands[1], mode))
fb4d4348
GK
4279 {
4280 emit_insn (gen_movsi_got (operands[0], operands[1]));
4281 return;
4282 }
4283
ee890fe2 4284 if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
f1384257
AM
4285 && TARGET_NO_TOC
4286 && ! flag_pic
a9098fd0 4287 && mode == Pmode
fb4d4348
GK
4288 && CONSTANT_P (operands[1])
4289 && GET_CODE (operands[1]) != HIGH
4290 && GET_CODE (operands[1]) != CONST_INT)
4291 {
a9098fd0 4292 rtx target = (no_new_pseudos ? operands[0] : gen_reg_rtx (mode));
fb4d4348
GK
4293
4294 /* If this is a function address on -mcall-aixdesc,
4295 convert it to the address of the descriptor. */
4296 if (DEFAULT_ABI == ABI_AIX
4297 && GET_CODE (operands[1]) == SYMBOL_REF
4298 && XSTR (operands[1], 0)[0] == '.')
4299 {
4300 const char *name = XSTR (operands[1], 0);
4301 rtx new_ref;
4302 while (*name == '.')
4303 name++;
4304 new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
4305 CONSTANT_POOL_ADDRESS_P (new_ref)
4306 = CONSTANT_POOL_ADDRESS_P (operands[1]);
d1908feb 4307 SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
fb4d4348 4308 SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
d1908feb 4309 SYMBOL_REF_DECL (new_ref) = SYMBOL_REF_DECL (operands[1]);
fb4d4348
GK
4310 operands[1] = new_ref;
4311 }
7509c759 4312
ee890fe2
SS
4313 if (DEFAULT_ABI == ABI_DARWIN)
4314 {
ab82a49f
AP
4315#if TARGET_MACHO
4316 if (MACHO_DYNAMIC_NO_PIC_P)
4317 {
4318 /* Take care of any required data indirection. */
4319 operands[1] = rs6000_machopic_legitimize_pic_address (
4320 operands[1], mode, operands[0]);
4321 if (operands[0] != operands[1])
4322 emit_insn (gen_rtx_SET (VOIDmode,
4323 operands[0], operands[1]));
4324 return;
4325 }
4326#endif
ac9e2cff
AP
4327 if (mode == DImode)
4328 {
4329 emit_insn (gen_macho_high_di (target, operands[1]));
4330 emit_insn (gen_macho_low_di (operands[0], target, operands[1]));
4331 }
4332 else
4333 {
4334 emit_insn (gen_macho_high (target, operands[1]));
4335 emit_insn (gen_macho_low (operands[0], target, operands[1]));
4336 }
ee890fe2
SS
4337 return;
4338 }
4339
fb4d4348
GK
4340 emit_insn (gen_elf_high (target, operands[1]));
4341 emit_insn (gen_elf_low (operands[0], target, operands[1]));
4342 return;
4343 }
4344
a9098fd0
GK
4345 /* If this is a SYMBOL_REF that refers to a constant pool entry,
4346 and we have put it in the TOC, we just need to make a TOC-relative
4347 reference to it. */
4348 if (TARGET_TOC
4349 && GET_CODE (operands[1]) == SYMBOL_REF
4d588c14 4350 && constant_pool_expr_p (operands[1])
a9098fd0
GK
4351 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
4352 get_pool_mode (operands[1])))
fb4d4348 4353 {
a9098fd0 4354 operands[1] = create_TOC_reference (operands[1]);
fb4d4348 4355 }
a9098fd0
GK
4356 else if (mode == Pmode
4357 && CONSTANT_P (operands[1])
38886f37
AO
4358 && ((GET_CODE (operands[1]) != CONST_INT
4359 && ! easy_fp_constant (operands[1], mode))
4360 || (GET_CODE (operands[1]) == CONST_INT
4361 && num_insns_constant (operands[1], mode) > 2)
4362 || (GET_CODE (operands[0]) == REG
4363 && FP_REGNO_P (REGNO (operands[0]))))
a9098fd0 4364 && GET_CODE (operands[1]) != HIGH
4d588c14
RH
4365 && ! legitimate_constant_pool_address_p (operands[1])
4366 && ! toc_relative_expr_p (operands[1]))
fb4d4348
GK
4367 {
4368 /* Emit a USE operation so that the constant isn't deleted if
4369 expensive optimizations are turned on because nobody
4370 references it. This should only be done for operands that
4371 contain SYMBOL_REFs with CONSTANT_POOL_ADDRESS_P set.
4372 This should not be done for operands that contain LABEL_REFs.
4373 For now, we just handle the obvious case. */
4374 if (GET_CODE (operands[1]) != LABEL_REF)
4375 emit_insn (gen_rtx_USE (VOIDmode, operands[1]));
4376
c859cda6 4377#if TARGET_MACHO
ee890fe2 4378 /* Darwin uses a special PIC legitimizer. */
ab82a49f 4379 if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
ee890fe2 4380 {
ee890fe2
SS
4381 operands[1] =
4382 rs6000_machopic_legitimize_pic_address (operands[1], mode,
c859cda6
DJ
4383 operands[0]);
4384 if (operands[0] != operands[1])
4385 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
ee890fe2
SS
4386 return;
4387 }
c859cda6 4388#endif
ee890fe2 4389
fb4d4348
GK
4390 /* If we are to limit the number of things we put in the TOC and
4391 this is a symbol plus a constant we can add in one insn,
4392 just put the symbol in the TOC and add the constant. Don't do
4393 this if reload is in progress. */
4394 if (GET_CODE (operands[1]) == CONST
4395 && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
4396 && GET_CODE (XEXP (operands[1], 0)) == PLUS
a9098fd0 4397 && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
fb4d4348
GK
4398 && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
4399 || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
4400 && ! side_effects_p (operands[0]))
4401 {
a4f6c312
SS
4402 rtx sym =
4403 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
fb4d4348
GK
4404 rtx other = XEXP (XEXP (operands[1], 0), 1);
4405
a9098fd0
GK
4406 sym = force_reg (mode, sym);
4407 if (mode == SImode)
4408 emit_insn (gen_addsi3 (operands[0], sym, other));
4409 else
4410 emit_insn (gen_adddi3 (operands[0], sym, other));
fb4d4348
GK
4411 return;
4412 }
4413
a9098fd0 4414 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
4415
4416 if (TARGET_TOC
4d588c14 4417 && constant_pool_expr_p (XEXP (operands[1], 0))
d34c5b80
DE
4418 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
4419 get_pool_constant (XEXP (operands[1], 0)),
4420 get_pool_mode (XEXP (operands[1], 0))))
a9098fd0 4421 {
ba4828e0 4422 operands[1]
542a8afa
RH
4423 = gen_const_mem (mode,
4424 create_TOC_reference (XEXP (operands[1], 0)));
ba4828e0 4425 set_mem_alias_set (operands[1], get_TOC_alias_set ());
a9098fd0 4426 }
fb4d4348
GK
4427 }
4428 break;
a9098fd0 4429
fb4d4348 4430 case TImode:
76d2b81d
DJ
4431 rs6000_eliminate_indexed_memrefs (operands);
4432
27dc0551
DE
4433 if (TARGET_POWER)
4434 {
4435 emit_insn (gen_rtx_PARALLEL (VOIDmode,
4436 gen_rtvec (2,
4437 gen_rtx_SET (VOIDmode,
4438 operands[0], operands[1]),
4439 gen_rtx_CLOBBER (VOIDmode,
4440 gen_rtx_SCRATCH (SImode)))));
4441 return;
4442 }
fb4d4348
GK
4443 break;
4444
4445 default:
4446 abort ();
4447 }
4448
a9098fd0
GK
4449 /* Above, we may have called force_const_mem which may have returned
4450 an invalid address. If we can, fix this up; otherwise, reload will
4451 have to deal with it. */
8f4e6caf
RH
4452 if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
4453 operands[1] = validize_mem (operands[1]);
a9098fd0 4454
8f4e6caf 4455 emit_set:
fb4d4348
GK
4456 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
4457}
4697a36c 4458\f
2858f73a
GK
4459/* Nonzero if we can use a floating-point register to pass this arg. */
4460#define USE_FP_FOR_ARG_P(CUM,MODE,TYPE) \
4461 (GET_MODE_CLASS (MODE) == MODE_FLOAT \
4462 && (CUM)->fregno <= FP_ARG_MAX_REG \
4463 && TARGET_HARD_FLOAT && TARGET_FPRS)
4464
4465/* Nonzero if we can use an AltiVec register to pass this arg. */
4466#define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE,NAMED) \
4467 (ALTIVEC_VECTOR_MODE (MODE) \
4468 && (CUM)->vregno <= ALTIVEC_ARG_MAX_REG \
4469 && TARGET_ALTIVEC_ABI \
83953138 4470 && (NAMED))
2858f73a 4471
c6e8c921
GK
4472/* Return a nonzero value to say to return the function value in
4473 memory, just as large structures are always returned. TYPE will be
4474 the data type of the value, and FNTYPE will be the type of the
4475 function doing the returning, or @code{NULL} for libcalls.
4476
4477 The AIX ABI for the RS/6000 specifies that all structures are
4478 returned in memory. The Darwin ABI does the same. The SVR4 ABI
4479 specifies that structures <= 8 bytes are returned in r3/r4, but a
4480 draft put them in memory, and GCC used to implement the draft
4481 instead of the final standard. Therefore, TARGET_AIX_STRUCT_RET
4482 controls this instead of DEFAULT_ABI; V.4 targets needing backward
4483 compatibility can change DRAFT_V4_STRUCT_RET to override the
4484 default, and -m switches get the final word. See
4485 rs6000_override_options for more details.
4486
4487 The PPC32 SVR4 ABI uses IEEE double extended for long double, if 128-bit
4488 long double support is enabled. These values are returned in memory.
4489
4490 int_size_in_bytes returns -1 for variable size objects, which go in
4491 memory always. The cast to unsigned makes -1 > 8. */
4492
4493static bool
4494rs6000_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
4495{
4496 if (AGGREGATE_TYPE_P (type)
4497 && (TARGET_AIX_STRUCT_RET
4498 || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
4499 return true;
4500 if (DEFAULT_ABI == ABI_V4 && TYPE_MODE (type) == TFmode)
4501 return true;
4502 return false;
4503}
4504
4697a36c
MM
4505/* Initialize a variable CUM of type CUMULATIVE_ARGS
4506 for a call to a function whose data type is FNTYPE.
4507 For a library call, FNTYPE is 0.
4508
4509 For incoming args we set the number of arguments in the prototype large
1c20ae99 4510 so we never return a PARALLEL. */
4697a36c
MM
4511
4512void
a2369ed3 4513init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
0f6937fe
AM
4514 rtx libname ATTRIBUTE_UNUSED, int incoming,
4515 int libcall, int n_named_args)
4697a36c
MM
4516{
4517 static CUMULATIVE_ARGS zero_cumulative;
4518
4519 *cum = zero_cumulative;
4520 cum->words = 0;
4521 cum->fregno = FP_ARG_MIN_REG;
0ac081f6 4522 cum->vregno = ALTIVEC_ARG_MIN_REG;
4697a36c 4523 cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
ddcc8263
DE
4524 cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
4525 ? CALL_LIBCALL : CALL_NORMAL);
4cc833b7 4526 cum->sysv_gregno = GP_ARG_MIN_REG;
a6c9bed4
AH
4527 cum->stdarg = fntype
4528 && (TYPE_ARG_TYPES (fntype) != 0
4529 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
4530 != void_type_node));
4697a36c 4531
0f6937fe
AM
4532 cum->nargs_prototype = 0;
4533 if (incoming || cum->prototype)
4534 cum->nargs_prototype = n_named_args;
4697a36c 4535
a5c76ee6
ZW
4536 /* Check for a longcall attribute. */
4537 if (fntype
4538 && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
4539 && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype)))
6a4cee5f
MM
4540 cum->call_cookie = CALL_LONG;
4541
4697a36c
MM
4542 if (TARGET_DEBUG_ARG)
4543 {
4544 fprintf (stderr, "\ninit_cumulative_args:");
4545 if (fntype)
4546 {
4547 tree ret_type = TREE_TYPE (fntype);
4548 fprintf (stderr, " ret code = %s,",
4549 tree_code_name[ (int)TREE_CODE (ret_type) ]);
4550 }
4551
6a4cee5f
MM
4552 if (cum->call_cookie & CALL_LONG)
4553 fprintf (stderr, " longcall,");
4554
4697a36c
MM
4555 fprintf (stderr, " proto = %d, nargs = %d\n",
4556 cum->prototype, cum->nargs_prototype);
4557 }
6d0ef01e
HP
4558
4559 if (fntype
4560 && !TARGET_ALTIVEC
4561 && TARGET_ALTIVEC_ABI
4562 && ALTIVEC_VECTOR_MODE (TYPE_MODE (TREE_TYPE (fntype))))
4563 {
4564 error ("Cannot return value in vector register because"
4565 " altivec instructions are disabled, use -maltivec"
4566 " to enable them.");
4567 }
4697a36c
MM
4568}
4569\f
fe984136
RH
4570/* Return true if TYPE must be passed on the stack and not in registers. */
4571
4572static bool
4573rs6000_must_pass_in_stack (enum machine_mode mode, tree type)
4574{
4575 if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT)
4576 return must_pass_in_stack_var_size (mode, type);
4577 else
4578 return must_pass_in_stack_var_size_or_pad (mode, type);
4579}
4580
c229cba9
DE
4581/* If defined, a C expression which determines whether, and in which
4582 direction, to pad out an argument with extra space. The value
4583 should be of type `enum direction': either `upward' to pad above
4584 the argument, `downward' to pad below, or `none' to inhibit
4585 padding.
4586
4587 For the AIX ABI structs are always stored left shifted in their
4588 argument slot. */
4589
9ebbca7d 4590enum direction
a2369ed3 4591function_arg_padding (enum machine_mode mode, tree type)
c229cba9 4592{
6e985040
AM
4593#ifndef AGGREGATE_PADDING_FIXED
4594#define AGGREGATE_PADDING_FIXED 0
4595#endif
4596#ifndef AGGREGATES_PAD_UPWARD_ALWAYS
4597#define AGGREGATES_PAD_UPWARD_ALWAYS 0
4598#endif
4599
4600 if (!AGGREGATE_PADDING_FIXED)
4601 {
4602 /* GCC used to pass structures of the same size as integer types as
4603 if they were in fact integers, ignoring FUNCTION_ARG_PADDING.
4604 ie. Structures of size 1 or 2 (or 4 when TARGET_64BIT) were
4605 passed padded downward, except that -mstrict-align further
4606 muddied the water in that multi-component structures of 2 and 4
4607 bytes in size were passed padded upward.
4608
4609 The following arranges for best compatibility with previous
4610 versions of gcc, but removes the -mstrict-align dependency. */
4611 if (BYTES_BIG_ENDIAN)
4612 {
4613 HOST_WIDE_INT size = 0;
4614
4615 if (mode == BLKmode)
4616 {
4617 if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
4618 size = int_size_in_bytes (type);
4619 }
4620 else
4621 size = GET_MODE_SIZE (mode);
4622
4623 if (size == 1 || size == 2 || size == 4)
4624 return downward;
4625 }
4626 return upward;
4627 }
4628
4629 if (AGGREGATES_PAD_UPWARD_ALWAYS)
4630 {
4631 if (type != 0 && AGGREGATE_TYPE_P (type))
4632 return upward;
4633 }
c229cba9 4634
d3704c46
KH
4635 /* Fall back to the default. */
4636 return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
c229cba9
DE
4637}
4638
b6c9286a
MM
4639/* If defined, a C expression that gives the alignment boundary, in bits,
4640 of an argument with the specified mode and type. If it is not defined,
4641 PARM_BOUNDARY is used for all arguments.
4642
2310f99a 4643 V.4 wants long longs to be double word aligned. */
b6c9286a
MM
4644
4645int
a2369ed3 4646function_arg_boundary (enum machine_mode mode, tree type ATTRIBUTE_UNUSED)
b6c9286a 4647{
4ed78545
AM
4648 if (DEFAULT_ABI == ABI_V4 && GET_MODE_SIZE (mode) == 8)
4649 return 64;
4650 else if (SPE_VECTOR_MODE (mode))
e1f83b4d 4651 return 64;
b2d04ecf 4652 else if (ALTIVEC_VECTOR_MODE (mode))
0ac081f6 4653 return 128;
9ebbca7d 4654 else
b6c9286a 4655 return PARM_BOUNDARY;
b6c9286a 4656}
c53bdcf5
AM
4657
4658/* Compute the size (in words) of a function argument. */
4659
4660static unsigned long
4661rs6000_arg_size (enum machine_mode mode, tree type)
4662{
4663 unsigned long size;
4664
4665 if (mode != BLKmode)
4666 size = GET_MODE_SIZE (mode);
4667 else
4668 size = int_size_in_bytes (type);
4669
4670 if (TARGET_32BIT)
4671 return (size + 3) >> 2;
4672 else
4673 return (size + 7) >> 3;
4674}
b6c9286a 4675\f
4697a36c
MM
4676/* Update the data in CUM to advance over an argument
4677 of mode MODE and data type TYPE.
b2d04ecf
AM
4678 (TYPE is null for libcalls where that information may not be available.)
4679
4680 Note that for args passed by reference, function_arg will be called
4681 with MODE and TYPE set to that of the pointer to the arg, not the arg
4682 itself. */
4697a36c
MM
4683
4684void
a2369ed3
DJ
4685function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4686 tree type, int named)
4697a36c
MM
4687{
4688 cum->nargs_prototype--;
4689
0ac081f6
AH
4690 if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
4691 {
4ed78545
AM
4692 bool stack = false;
4693
2858f73a 4694 if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
6d0ef01e
HP
4695 {
4696 cum->vregno++;
4697 if (!TARGET_ALTIVEC)
4698 error ("Cannot pass argument in vector register because"
4699 " altivec instructions are disabled, use -maltivec"
4700 " to enable them.");
4ed78545
AM
4701
4702 /* PowerPC64 Linux and AIX allocate GPRs for a vector argument
4703 even if it is going to be passed in a vector register.
4704 Darwin does the same for variable-argument functions. */
4705 if ((DEFAULT_ABI == ABI_AIX && TARGET_64BIT)
4706 || (cum->stdarg && DEFAULT_ABI != ABI_V4))
4707 stack = true;
6d0ef01e 4708 }
4ed78545
AM
4709 else
4710 stack = true;
4711
4712 if (stack)
c72d6c26 4713 {
a594a19c
GK
4714 int align;
4715
2858f73a
GK
4716 /* Vector parameters must be 16-byte aligned. This places
4717 them at 2 mod 4 in terms of words in 32-bit mode, since
4718 the parameter save area starts at offset 24 from the
4719 stack. In 64-bit mode, they just have to start on an
4720 even word, since the parameter save area is 16-byte
4721 aligned. Space for GPRs is reserved even if the argument
4722 will be passed in memory. */
4723 if (TARGET_32BIT)
4ed78545 4724 align = (2 - cum->words) & 3;
2858f73a
GK
4725 else
4726 align = cum->words & 1;
c53bdcf5 4727 cum->words += align + rs6000_arg_size (mode, type);
2858f73a 4728
a594a19c
GK
4729 if (TARGET_DEBUG_ARG)
4730 {
4731 fprintf (stderr, "function_adv: words = %2d, align=%d, ",
4732 cum->words, align);
4733 fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s\n",
2858f73a
GK
4734 cum->nargs_prototype, cum->prototype,
4735 GET_MODE_NAME (mode));
a594a19c
GK
4736 }
4737 }
0ac081f6 4738 }
a4b0320c 4739 else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
a6c9bed4
AH
4740 && !cum->stdarg
4741 && cum->sysv_gregno <= GP_ARG_MAX_REG)
a4b0320c 4742 cum->sysv_gregno++;
f607bc57 4743 else if (DEFAULT_ABI == ABI_V4)
4697a36c 4744 {
a3170dc6 4745 if (TARGET_HARD_FLOAT && TARGET_FPRS
4cc833b7 4746 && (mode == SFmode || mode == DFmode))
4697a36c 4747 {
4cc833b7
RH
4748 if (cum->fregno <= FP_ARG_V4_MAX_REG)
4749 cum->fregno++;
4750 else
4751 {
4752 if (mode == DFmode)
4753 cum->words += cum->words & 1;
c53bdcf5 4754 cum->words += rs6000_arg_size (mode, type);
4cc833b7 4755 }
4697a36c 4756 }
4cc833b7
RH
4757 else
4758 {
b2d04ecf 4759 int n_words = rs6000_arg_size (mode, type);
4cc833b7
RH
4760 int gregno = cum->sysv_gregno;
4761
4ed78545
AM
4762 /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
4763 (r7,r8) or (r9,r10). As does any other 2 word item such
4764 as complex int due to a historical mistake. */
4765 if (n_words == 2)
4766 gregno += (1 - gregno) & 1;
4cc833b7 4767
4ed78545 4768 /* Multi-reg args are not split between registers and stack. */
4cc833b7
RH
4769 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
4770 {
4ed78545
AM
4771 /* Long long and SPE vectors are aligned on the stack.
4772 So are other 2 word items such as complex int due to
4773 a historical mistake. */
4cc833b7
RH
4774 if (n_words == 2)
4775 cum->words += cum->words & 1;
4776 cum->words += n_words;
4777 }
4697a36c 4778
4cc833b7
RH
4779 /* Note: continuing to accumulate gregno past when we've started
4780 spilling to the stack indicates the fact that we've started
4781 spilling to the stack to expand_builtin_saveregs. */
4782 cum->sysv_gregno = gregno + n_words;
4783 }
4697a36c 4784
4cc833b7
RH
4785 if (TARGET_DEBUG_ARG)
4786 {
4787 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
4788 cum->words, cum->fregno);
4789 fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
4790 cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
4791 fprintf (stderr, "mode = %4s, named = %d\n",
4792 GET_MODE_NAME (mode), named);
4793 }
4697a36c
MM
4794 }
4795 else
4cc833b7 4796 {
b2d04ecf
AM
4797 int n_words = rs6000_arg_size (mode, type);
4798 int align = function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
a4f6c312 4799
b2d04ecf
AM
4800 /* The simple alignment calculation here works because
4801 function_arg_boundary / PARM_BOUNDARY will only be 1 or 2.
4802 If we ever want to handle alignments larger than 8 bytes for
4803 32-bit or 16 bytes for 64-bit, then we'll need to take into
4804 account the offset to the start of the parm save area. */
4805 align &= cum->words;
4806 cum->words += align + n_words;
4697a36c 4807
a3170dc6
AH
4808 if (GET_MODE_CLASS (mode) == MODE_FLOAT
4809 && TARGET_HARD_FLOAT && TARGET_FPRS)
c53bdcf5 4810 cum->fregno += (GET_MODE_SIZE (mode) + 7) >> 3;
4cc833b7
RH
4811
4812 if (TARGET_DEBUG_ARG)
4813 {
4814 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
4815 cum->words, cum->fregno);
4816 fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
4817 cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
4818 fprintf (stderr, "named = %d, align = %d\n", named, align);
4819 }
4820 }
4697a36c 4821}
a6c9bed4
AH
4822
4823/* Determine where to put a SIMD argument on the SPE. */
b78d48dd 4824
a6c9bed4 4825static rtx
a2369ed3
DJ
4826rs6000_spe_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4827 tree type)
a6c9bed4
AH
4828{
4829 if (cum->stdarg)
4830 {
4831 int gregno = cum->sysv_gregno;
c53bdcf5 4832 int n_words = rs6000_arg_size (mode, type);
a6c9bed4
AH
4833
4834 /* SPE vectors are put in odd registers. */
4835 if (n_words == 2 && (gregno & 1) == 0)
4836 gregno += 1;
4837
4838 if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
4839 {
4840 rtx r1, r2;
4841 enum machine_mode m = SImode;
4842
4843 r1 = gen_rtx_REG (m, gregno);
4844 r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
4845 r2 = gen_rtx_REG (m, gregno + 1);
4846 r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
4847 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
4848 }
4849 else
b78d48dd 4850 return NULL_RTX;
a6c9bed4
AH
4851 }
4852 else
4853 {
4854 if (cum->sysv_gregno <= GP_ARG_MAX_REG)
4855 return gen_rtx_REG (mode, cum->sysv_gregno);
4856 else
b78d48dd 4857 return NULL_RTX;
a6c9bed4
AH
4858 }
4859}
4860
b78d48dd
FJ
4861/* Determine where to place an argument in 64-bit mode with 32-bit ABI. */
4862
4863static rtx
ec6376ab 4864rs6000_mixed_function_arg (enum machine_mode mode, tree type, int align_words)
b78d48dd 4865{
ec6376ab
AM
4866 int n_units;
4867 int i, k;
4868 rtx rvec[GP_ARG_NUM_REG + 1];
4869
4870 if (align_words >= GP_ARG_NUM_REG)
4871 return NULL_RTX;
4872
4873 n_units = rs6000_arg_size (mode, type);
4874
4875 /* Optimize the simple case where the arg fits in one gpr, except in
4876 the case of BLKmode due to assign_parms assuming that registers are
4877 BITS_PER_WORD wide. */
4878 if (n_units == 0
4879 || (n_units == 1 && mode != BLKmode))
4880 return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
4881
4882 k = 0;
4883 if (align_words + n_units > GP_ARG_NUM_REG)
4884 /* Not all of the arg fits in gprs. Say that it goes in memory too,
4885 using a magic NULL_RTX component.
4886 FIXME: This is not strictly correct. Only some of the arg
4887 belongs in memory, not all of it. However, there isn't any way
4888 to do this currently, apart from building rtx descriptions for
4889 the pieces of memory we want stored. Due to bugs in the generic
4890 code we can't use the normal function_arg_partial_nregs scheme
4891 with the PARALLEL arg description we emit here.
4892 In any case, the code to store the whole arg to memory is often
4893 more efficient than code to store pieces, and we know that space
4894 is available in the right place for the whole arg. */
4895 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
4896
4897 i = 0;
4898 do
36a454e1 4899 {
ec6376ab
AM
4900 rtx r = gen_rtx_REG (SImode, GP_ARG_MIN_REG + align_words);
4901 rtx off = GEN_INT (i++ * 4);
4902 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
36a454e1 4903 }
ec6376ab
AM
4904 while (++align_words < GP_ARG_NUM_REG && --n_units != 0);
4905
4906 return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
b78d48dd
FJ
4907}
4908
4697a36c
MM
4909/* Determine where to put an argument to a function.
4910 Value is zero to push the argument on the stack,
4911 or a hard register in which to store the argument.
4912
4913 MODE is the argument's machine mode.
4914 TYPE is the data type of the argument (as a tree).
4915 This is null for libcalls where that information may
4916 not be available.
4917 CUM is a variable of type CUMULATIVE_ARGS which gives info about
4918 the preceding args and about the function being called.
4919 NAMED is nonzero if this argument is a named parameter
4920 (otherwise it is an extra parameter matching an ellipsis).
4921
4922 On RS/6000 the first eight words of non-FP are normally in registers
4923 and the rest are pushed. Under AIX, the first 13 FP args are in registers.
4924 Under V.4, the first 8 FP args are in registers.
4925
4926 If this is floating-point and no prototype is specified, we use
4927 both an FP and integer register (or possibly FP reg and stack). Library
b9599e46 4928 functions (when CALL_LIBCALL is set) always have the proper types for args,
4697a36c 4929 so we can pass the FP value just in one register. emit_library_function
b2d04ecf
AM
4930 doesn't support PARALLEL anyway.
4931
4932 Note that for args passed by reference, function_arg will be called
4933 with MODE and TYPE set to that of the pointer to the arg, not the arg
4934 itself. */
4697a36c
MM
4935
4936struct rtx_def *
a2369ed3
DJ
4937function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4938 tree type, int named)
4697a36c 4939{
4cc833b7 4940 enum rs6000_abi abi = DEFAULT_ABI;
4697a36c 4941
a4f6c312
SS
4942 /* Return a marker to indicate whether CR1 needs to set or clear the
4943 bit that V.4 uses to say fp args were passed in registers.
4944 Assume that we don't need the marker for software floating point,
4945 or compiler generated library calls. */
4697a36c
MM
4946 if (mode == VOIDmode)
4947 {
f607bc57 4948 if (abi == ABI_V4
7509c759 4949 && cum->nargs_prototype < 0
b9599e46
FS
4950 && (cum->call_cookie & CALL_LIBCALL) == 0
4951 && (cum->prototype || TARGET_NO_PROTOTYPE))
7509c759 4952 {
a3170dc6
AH
4953 /* For the SPE, we need to crxor CR6 always. */
4954 if (TARGET_SPE_ABI)
4955 return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
4956 else if (TARGET_HARD_FLOAT && TARGET_FPRS)
4957 return GEN_INT (cum->call_cookie
4958 | ((cum->fregno == FP_ARG_MIN_REG)
4959 ? CALL_V4_SET_FP_ARGS
4960 : CALL_V4_CLEAR_FP_ARGS));
7509c759 4961 }
4697a36c 4962
7509c759 4963 return GEN_INT (cum->call_cookie);
4697a36c
MM
4964 }
4965
2858f73a 4966 if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named))
c72d6c26
HP
4967 if (TARGET_64BIT && ! cum->prototype)
4968 {
4969 /* Vector parameters get passed in vector register
4970 and also in GPRs or memory, in absence of prototype. */
4971 int align_words;
4972 rtx slot;
4973 align_words = (cum->words + 1) & ~1;
4974
4975 if (align_words >= GP_ARG_NUM_REG)
4976 {
4977 slot = NULL_RTX;
4978 }
4979 else
4980 {
4981 slot = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
4982 }
4983 return gen_rtx_PARALLEL (mode,
4984 gen_rtvec (2,
4985 gen_rtx_EXPR_LIST (VOIDmode,
4986 slot, const0_rtx),
4987 gen_rtx_EXPR_LIST (VOIDmode,
4988 gen_rtx_REG (mode, cum->vregno),
4989 const0_rtx)));
4990 }
4991 else
4992 return gen_rtx_REG (mode, cum->vregno);
2858f73a 4993 else if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
0ac081f6 4994 {
2858f73a 4995 if (named || abi == ABI_V4)
a594a19c 4996 return NULL_RTX;
0ac081f6 4997 else
a594a19c
GK
4998 {
4999 /* Vector parameters to varargs functions under AIX or Darwin
5000 get passed in memory and possibly also in GPRs. */
ec6376ab
AM
5001 int align, align_words, n_words;
5002 enum machine_mode part_mode;
a594a19c
GK
5003
5004 /* Vector parameters must be 16-byte aligned. This places them at
2858f73a
GK
5005 2 mod 4 in terms of words in 32-bit mode, since the parameter
5006 save area starts at offset 24 from the stack. In 64-bit mode,
5007 they just have to start on an even word, since the parameter
5008 save area is 16-byte aligned. */
5009 if (TARGET_32BIT)
4ed78545 5010 align = (2 - cum->words) & 3;
2858f73a
GK
5011 else
5012 align = cum->words & 1;
a594a19c
GK
5013 align_words = cum->words + align;
5014
5015 /* Out of registers? Memory, then. */
5016 if (align_words >= GP_ARG_NUM_REG)
5017 return NULL_RTX;
ec6376ab
AM
5018
5019 if (TARGET_32BIT && TARGET_POWERPC64)
5020 return rs6000_mixed_function_arg (mode, type, align_words);
5021
2858f73a
GK
5022 /* The vector value goes in GPRs. Only the part of the
5023 value in GPRs is reported here. */
ec6376ab
AM
5024 part_mode = mode;
5025 n_words = rs6000_arg_size (mode, type);
5026 if (align_words + n_words > GP_ARG_NUM_REG)
839a4992 5027 /* Fortunately, there are only two possibilities, the value
2858f73a
GK
5028 is either wholly in GPRs or half in GPRs and half not. */
5029 part_mode = DImode;
ec6376ab
AM
5030
5031 return gen_rtx_REG (part_mode, GP_ARG_MIN_REG + align_words);
a594a19c 5032 }
0ac081f6 5033 }
a6c9bed4
AH
5034 else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode))
5035 return rs6000_spe_function_arg (cum, mode, type);
f607bc57 5036 else if (abi == ABI_V4)
4697a36c 5037 {
a3170dc6 5038 if (TARGET_HARD_FLOAT && TARGET_FPRS
4cc833b7
RH
5039 && (mode == SFmode || mode == DFmode))
5040 {
5041 if (cum->fregno <= FP_ARG_V4_MAX_REG)
5042 return gen_rtx_REG (mode, cum->fregno);
5043 else
b78d48dd 5044 return NULL_RTX;
4cc833b7
RH
5045 }
5046 else
5047 {
b2d04ecf 5048 int n_words = rs6000_arg_size (mode, type);
4cc833b7
RH
5049 int gregno = cum->sysv_gregno;
5050
4ed78545
AM
5051 /* Long long and SPE vectors are put in (r3,r4), (r5,r6),
5052 (r7,r8) or (r9,r10). As does any other 2 word item such
5053 as complex int due to a historical mistake. */
5054 if (n_words == 2)
5055 gregno += (1 - gregno) & 1;
4cc833b7 5056
4ed78545 5057 /* Multi-reg args are not split between registers and stack. */
ec6376ab 5058 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
b78d48dd 5059 return NULL_RTX;
ec6376ab
AM
5060
5061 if (TARGET_32BIT && TARGET_POWERPC64)
5062 return rs6000_mixed_function_arg (mode, type,
5063 gregno - GP_ARG_MIN_REG);
5064 return gen_rtx_REG (mode, gregno);
4cc833b7 5065 }
4697a36c 5066 }
4cc833b7
RH
5067 else
5068 {
b2d04ecf
AM
5069 int align = function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
5070 int align_words = cum->words + (cum->words & align);
b78d48dd 5071
2858f73a 5072 if (USE_FP_FOR_ARG_P (cum, mode, type))
4cc833b7 5073 {
ec6376ab
AM
5074 rtx rvec[GP_ARG_NUM_REG + 1];
5075 rtx r;
5076 int k;
c53bdcf5
AM
5077 bool needs_psave;
5078 enum machine_mode fmode = mode;
c53bdcf5
AM
5079 unsigned long n_fpreg = (GET_MODE_SIZE (mode) + 7) >> 3;
5080
5081 if (cum->fregno + n_fpreg > FP_ARG_MAX_REG + 1)
5082 {
c53bdcf5
AM
5083 /* Currently, we only ever need one reg here because complex
5084 doubles are split. */
ec6376ab 5085 if (cum->fregno != FP_ARG_MAX_REG || fmode != TFmode)
c53bdcf5 5086 abort ();
ec6376ab
AM
5087
5088 /* Long double split over regs and memory. */
5089 fmode = DFmode;
c53bdcf5 5090 }
c53bdcf5
AM
5091
5092 /* Do we also need to pass this arg in the parameter save
5093 area? */
5094 needs_psave = (type
5095 && (cum->nargs_prototype <= 0
5096 || (DEFAULT_ABI == ABI_AIX
5097 && TARGET_XL_CALL
5098 && align_words >= GP_ARG_NUM_REG)));
5099
5100 if (!needs_psave && mode == fmode)
ec6376ab 5101 return gen_rtx_REG (fmode, cum->fregno);
c53bdcf5 5102
ec6376ab 5103 k = 0;
c53bdcf5
AM
5104 if (needs_psave)
5105 {
ec6376ab 5106 /* Describe the part that goes in gprs or the stack.
c53bdcf5 5107 This piece must come first, before the fprs. */
c53bdcf5
AM
5108 if (align_words < GP_ARG_NUM_REG)
5109 {
5110 unsigned long n_words = rs6000_arg_size (mode, type);
ec6376ab
AM
5111
5112 if (align_words + n_words > GP_ARG_NUM_REG
5113 || (TARGET_32BIT && TARGET_POWERPC64))
5114 {
5115 /* If this is partially on the stack, then we only
5116 include the portion actually in registers here. */
5117 enum machine_mode rmode = TARGET_32BIT ? SImode : DImode;
5118 rtx off;
5119 do
5120 {
5121 r = gen_rtx_REG (rmode,
5122 GP_ARG_MIN_REG + align_words);
5123 off = GEN_INT (k * GET_MODE_SIZE (rmode));
5124 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
5125 }
5126 while (++align_words < GP_ARG_NUM_REG && --n_words != 0);
5127 }
5128 else
5129 {
5130 /* The whole arg fits in gprs. */
5131 r = gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
5132 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
5133 }
c53bdcf5 5134 }
ec6376ab
AM
5135 else
5136 /* It's entirely in memory. */
5137 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
c53bdcf5
AM
5138 }
5139
ec6376ab
AM
5140 /* Describe where this piece goes in the fprs. */
5141 r = gen_rtx_REG (fmode, cum->fregno);
5142 rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, const0_rtx);
5143
5144 return gen_rtx_PARALLEL (mode, gen_rtvec_v (k, rvec));
4cc833b7
RH
5145 }
5146 else if (align_words < GP_ARG_NUM_REG)
b2d04ecf 5147 {
ec6376ab
AM
5148 if (TARGET_32BIT && TARGET_POWERPC64)
5149 return rs6000_mixed_function_arg (mode, type, align_words);
b2d04ecf
AM
5150
5151 return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
5152 }
4cc833b7
RH
5153 else
5154 return NULL_RTX;
4697a36c 5155 }
4697a36c
MM
5156}
5157\f
ec6376ab
AM
5158/* For an arg passed partly in registers and partly in memory, this is
5159 the number of registers used. For args passed entirely in registers
5160 or entirely in memory, zero. When an arg is described by a PARALLEL,
5161 perhaps using more than one register type, this function returns the
5162 number of registers used by the first element of the PARALLEL. */
4697a36c
MM
5163
5164int
a2369ed3 5165function_arg_partial_nregs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
2858f73a 5166 tree type, int named)
4697a36c 5167{
c53bdcf5 5168 int ret = 0;
ec6376ab
AM
5169 int align;
5170 int parm_offset;
5171 int align_words;
c53bdcf5 5172
f607bc57 5173 if (DEFAULT_ABI == ABI_V4)
4697a36c 5174 return 0;
4697a36c 5175
c53bdcf5
AM
5176 if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)
5177 && cum->nargs_prototype >= 0)
5178 return 0;
5179
ec6376ab
AM
5180 align = function_arg_boundary (mode, type) / PARM_BOUNDARY - 1;
5181 parm_offset = TARGET_32BIT ? 2 : 0;
5182 align_words = cum->words + ((parm_offset - cum->words) & align);
5183
5184 if (USE_FP_FOR_ARG_P (cum, mode, type)
5185 /* If we are passing this arg in gprs as well, then this function
5186 should return the number of gprs (or memory) partially passed,
5187 *not* the number of fprs. */
5188 && !(type
5189 && (cum->nargs_prototype <= 0
5190 || (DEFAULT_ABI == ABI_AIX
5191 && TARGET_XL_CALL
5192 && align_words >= GP_ARG_NUM_REG))))
4697a36c 5193 {
c53bdcf5 5194 if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3) > FP_ARG_MAX_REG + 1)
ec6376ab 5195 ret = FP_ARG_MAX_REG + 1 - cum->fregno;
c53bdcf5 5196 else if (cum->nargs_prototype >= 0)
4697a36c
MM
5197 return 0;
5198 }
5199
ec6376ab
AM
5200 if (align_words < GP_ARG_NUM_REG
5201 && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
5202 ret = GP_ARG_NUM_REG - align_words;
4697a36c 5203
c53bdcf5
AM
5204 if (ret != 0 && TARGET_DEBUG_ARG)
5205 fprintf (stderr, "function_arg_partial_nregs: %d\n", ret);
4697a36c 5206
c53bdcf5 5207 return ret;
4697a36c
MM
5208}
5209\f
5210/* A C expression that indicates when an argument must be passed by
5211 reference. If nonzero for an argument, a copy of that argument is
5212 made in memory and a pointer to the argument is passed instead of
5213 the argument itself. The pointer is passed in whatever way is
5214 appropriate for passing a pointer to that type.
5215
b2d04ecf
AM
5216 Under V.4, aggregates and long double are passed by reference.
5217
5218 As an extension to all 32-bit ABIs, AltiVec vectors are passed by
5219 reference unless the AltiVec vector extension ABI is in force.
c8c99a68
DE
5220
5221 As an extension to all ABIs, variable sized types are passed by
5222 reference. */
4697a36c 5223
8cd5a4e0
RH
5224static bool
5225rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5226 enum machine_mode mode ATTRIBUTE_UNUSED,
5227 tree type, bool named ATTRIBUTE_UNUSED)
4697a36c 5228{
b2d04ecf
AM
5229 if ((DEFAULT_ABI == ABI_V4
5230 && ((type && AGGREGATE_TYPE_P (type))
5231 || mode == TFmode))
5232 || (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
5233 || (type && int_size_in_bytes (type) < 0))
4697a36c
MM
5234 {
5235 if (TARGET_DEBUG_ARG)
b2d04ecf 5236 fprintf (stderr, "function_arg_pass_by_reference\n");
4697a36c
MM
5237
5238 return 1;
5239 }
b2d04ecf 5240 return 0;
4697a36c 5241}
5985c7a6
FJ
5242
5243static void
2d9db8eb 5244rs6000_move_block_from_reg (int regno, rtx x, int nregs)
5985c7a6
FJ
5245{
5246 int i;
5247 enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode;
5248
5249 if (nregs == 0)
5250 return;
5251
5252 for (i = 0; i < nregs; i++)
5253 {
5254 rtx tem = adjust_address_nv (x, reg_mode, i*GET_MODE_SIZE(reg_mode));
5255 if (reload_completed)
5256 {
5257 if (! strict_memory_address_p (reg_mode, XEXP (tem, 0)))
5258 tem = NULL_RTX;
5259 else
5260 tem = simplify_gen_subreg (reg_mode, x, BLKmode,
5261 i * GET_MODE_SIZE(reg_mode));
5262 }
5263 else
5264 tem = replace_equiv_address (tem, XEXP (tem, 0));
5265
5266 if (tem == NULL_RTX)
5267 abort ();
5268
5269 emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i));
5270 }
5271}
5272
4697a36c
MM
5273\f
5274/* Perform any needed actions needed for a function that is receiving a
5275 variable number of arguments.
5276
5277 CUM is as above.
5278
5279 MODE and TYPE are the mode and type of the current parameter.
5280
5281 PRETEND_SIZE is a variable that should be set to the amount of stack
5282 that must be pushed by the prolog to pretend that our caller pushed
5283 it.
5284
5285 Normally, this macro will push all remaining incoming registers on the
5286 stack and set PRETEND_SIZE to the length of the registers pushed. */
5287
c6e8c921 5288static void
a2369ed3
DJ
5289setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5290 tree type, int *pretend_size ATTRIBUTE_UNUSED, int no_rtl)
4697a36c 5291{
4cc833b7
RH
5292 CUMULATIVE_ARGS next_cum;
5293 int reg_size = TARGET_32BIT ? 4 : 8;
ca5adc63 5294 rtx save_area = NULL_RTX, mem;
dfafc897 5295 int first_reg_offset, set;
4697a36c 5296
f31bf321 5297 /* Skip the last named argument. */
d34c5b80 5298 next_cum = *cum;
f31bf321 5299 function_arg_advance (&next_cum, mode, type, 1);
4cc833b7 5300
f607bc57 5301 if (DEFAULT_ABI == ABI_V4)
d34c5b80 5302 {
4cc833b7 5303 /* Indicate to allocate space on the stack for varargs save area. */
00dba523 5304 cfun->machine->sysv_varargs_p = 1;
60e2d0ca 5305 if (! no_rtl)
2c4974b7 5306 save_area = plus_constant (virtual_stack_vars_rtx,
bd227acc 5307 - RS6000_VARARGS_SIZE);
4cc833b7
RH
5308
5309 first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
4697a36c 5310 }
60e2d0ca 5311 else
4697a36c 5312 {
d34c5b80 5313 first_reg_offset = next_cum.words;
4cc833b7 5314 save_area = virtual_incoming_args_rtx;
00dba523 5315 cfun->machine->sysv_varargs_p = 0;
4697a36c 5316
fe984136 5317 if (targetm.calls.must_pass_in_stack (mode, type))
c53bdcf5 5318 first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type);
4cc833b7 5319 }
4697a36c 5320
dfafc897 5321 set = get_varargs_alias_set ();
c81fc13e 5322 if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG)
4cc833b7 5323 {
dfafc897
FS
5324 mem = gen_rtx_MEM (BLKmode,
5325 plus_constant (save_area,
5326 first_reg_offset * reg_size)),
ba4828e0 5327 set_mem_alias_set (mem, set);
8ac61af7 5328 set_mem_align (mem, BITS_PER_WORD);
dfafc897 5329
5985c7a6
FJ
5330 rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
5331 GP_ARG_NUM_REG - first_reg_offset);
4697a36c
MM
5332 }
5333
4697a36c 5334 /* Save FP registers if needed. */
f607bc57 5335 if (DEFAULT_ABI == ABI_V4
a3170dc6
AH
5336 && TARGET_HARD_FLOAT && TARGET_FPRS
5337 && ! no_rtl
4cc833b7 5338 && next_cum.fregno <= FP_ARG_V4_MAX_REG)
4697a36c 5339 {
4cc833b7 5340 int fregno = next_cum.fregno;
9ebbca7d 5341 rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
4cc833b7
RH
5342 rtx lab = gen_label_rtx ();
5343 int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG) * 8);
4697a36c 5344
4cc833b7 5345 emit_jump_insn (gen_rtx_SET (VOIDmode,
4697a36c 5346 pc_rtx,
39403d82 5347 gen_rtx_IF_THEN_ELSE (VOIDmode,
4cc833b7
RH
5348 gen_rtx_NE (VOIDmode, cr1,
5349 const0_rtx),
39403d82 5350 gen_rtx_LABEL_REF (VOIDmode, lab),
4697a36c
MM
5351 pc_rtx)));
5352
4cc833b7
RH
5353 while (fregno <= FP_ARG_V4_MAX_REG)
5354 {
dfafc897 5355 mem = gen_rtx_MEM (DFmode, plus_constant (save_area, off));
ba4828e0 5356 set_mem_alias_set (mem, set);
dfafc897 5357 emit_move_insn (mem, gen_rtx_REG (DFmode, fregno));
4cc833b7
RH
5358 fregno++;
5359 off += 8;
4697a36c 5360 }
4cc833b7
RH
5361
5362 emit_label (lab);
4697a36c 5363 }
4697a36c 5364}
4697a36c 5365
dfafc897 5366/* Create the va_list data type. */
2c4974b7 5367
c35d187f
RH
5368static tree
5369rs6000_build_builtin_va_list (void)
dfafc897 5370{
64c2816f 5371 tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
4697a36c 5372
9ebbca7d
GK
5373 /* For AIX, prefer 'char *' because that's what the system
5374 header files like. */
f607bc57 5375 if (DEFAULT_ABI != ABI_V4)
9ebbca7d 5376 return build_pointer_type (char_type_node);
dfafc897 5377
f1e639b1 5378 record = (*lang_hooks.types.make_type) (RECORD_TYPE);
bab45a51 5379 type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
0f4fd75d 5380
9ebbca7d
GK
5381 f_gpr = build_decl (FIELD_DECL, get_identifier ("gpr"),
5382 unsigned_char_type_node);
5383 f_fpr = build_decl (FIELD_DECL, get_identifier ("fpr"),
5384 unsigned_char_type_node);
64c2816f
DT
5385 /* Give the two bytes of padding a name, so that -Wpadded won't warn on
5386 every user file. */
5387 f_res = build_decl (FIELD_DECL, get_identifier ("reserved"),
5388 short_unsigned_type_node);
dfafc897
FS
5389 f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
5390 ptr_type_node);
5391 f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
5392 ptr_type_node);
5393
5394 DECL_FIELD_CONTEXT (f_gpr) = record;
5395 DECL_FIELD_CONTEXT (f_fpr) = record;
64c2816f 5396 DECL_FIELD_CONTEXT (f_res) = record;
dfafc897
FS
5397 DECL_FIELD_CONTEXT (f_ovf) = record;
5398 DECL_FIELD_CONTEXT (f_sav) = record;
5399
bab45a51
FS
5400 TREE_CHAIN (record) = type_decl;
5401 TYPE_NAME (record) = type_decl;
dfafc897
FS
5402 TYPE_FIELDS (record) = f_gpr;
5403 TREE_CHAIN (f_gpr) = f_fpr;
64c2816f
DT
5404 TREE_CHAIN (f_fpr) = f_res;
5405 TREE_CHAIN (f_res) = f_ovf;
dfafc897
FS
5406 TREE_CHAIN (f_ovf) = f_sav;
5407
5408 layout_type (record);
5409
5410 /* The correct type is an array type of one element. */
5411 return build_array_type (record, build_index_type (size_zero_node));
5412}
5413
5414/* Implement va_start. */
5415
5416void
a2369ed3 5417rs6000_va_start (tree valist, rtx nextarg)
4697a36c 5418{
dfafc897 5419 HOST_WIDE_INT words, n_gpr, n_fpr;
c566f9bd 5420 tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
dfafc897 5421 tree gpr, fpr, ovf, sav, t;
2c4974b7 5422
dfafc897 5423 /* Only SVR4 needs something special. */
f607bc57 5424 if (DEFAULT_ABI != ABI_V4)
dfafc897 5425 {
e5faf155 5426 std_expand_builtin_va_start (valist, nextarg);
dfafc897
FS
5427 return;
5428 }
5429
973a648b 5430 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
dfafc897 5431 f_fpr = TREE_CHAIN (f_gpr);
c566f9bd
DT
5432 f_res = TREE_CHAIN (f_fpr);
5433 f_ovf = TREE_CHAIN (f_res);
dfafc897
FS
5434 f_sav = TREE_CHAIN (f_ovf);
5435
8ebecc3b 5436 valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
44de5aeb
RK
5437 gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
5438 fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
5439 ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
5440 sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
dfafc897
FS
5441
5442 /* Count number of gp and fp argument registers used. */
4cc833b7 5443 words = current_function_args_info.words;
dfafc897
FS
5444 n_gpr = current_function_args_info.sysv_gregno - GP_ARG_MIN_REG;
5445 n_fpr = current_function_args_info.fregno - FP_ARG_MIN_REG;
5446
5447 if (TARGET_DEBUG_ARG)
4a0a75dd
KG
5448 fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
5449 HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
5450 words, n_gpr, n_fpr);
dfafc897 5451
4a90aeeb
NS
5452 t = build (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
5453 build_int_cst (NULL_TREE, n_gpr, 0));
dfafc897
FS
5454 TREE_SIDE_EFFECTS (t) = 1;
5455 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5456
4a90aeeb
NS
5457 t = build (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
5458 build_int_cst (NULL_TREE, n_fpr, 0));
dfafc897
FS
5459 TREE_SIDE_EFFECTS (t) = 1;
5460 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5461
5462 /* Find the overflow area. */
5463 t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
5464 if (words != 0)
5465 t = build (PLUS_EXPR, TREE_TYPE (ovf), t,
4a90aeeb 5466 build_int_cst (NULL_TREE, words * UNITS_PER_WORD, 0));
dfafc897
FS
5467 t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
5468 TREE_SIDE_EFFECTS (t) = 1;
5469 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5470
5471 /* Find the register save area. */
5472 t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
5473 t = build (PLUS_EXPR, TREE_TYPE (sav), t,
4a90aeeb 5474 build_int_cst (NULL_TREE, -RS6000_VARARGS_SIZE, -1));
dfafc897
FS
5475 t = build (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
5476 TREE_SIDE_EFFECTS (t) = 1;
5477 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5478}
5479
5480/* Implement va_arg. */
5481
23a60a04
JM
5482tree
5483rs6000_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p)
cd3ce9b4 5484{
cd3ce9b4
JM
5485 tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
5486 tree gpr, fpr, ovf, sav, reg, t, u;
08b0dc1b 5487 int size, rsize, n_reg, sav_ofs, sav_scale;
cd3ce9b4
JM
5488 tree lab_false, lab_over, addr;
5489 int align;
5490 tree ptrtype = build_pointer_type (type);
5491
08b0dc1b
RH
5492 if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
5493 {
5494 t = rs6000_gimplify_va_arg (valist, ptrtype, pre_p, post_p);
5495 return build_fold_indirect_ref (t);
5496 }
5497
cd3ce9b4
JM
5498 if (DEFAULT_ABI != ABI_V4)
5499 {
08b0dc1b 5500 if (targetm.calls.split_complex_arg && TREE_CODE (type) == COMPLEX_TYPE)
cd3ce9b4
JM
5501 {
5502 tree elem_type = TREE_TYPE (type);
5503 enum machine_mode elem_mode = TYPE_MODE (elem_type);
5504 int elem_size = GET_MODE_SIZE (elem_mode);
5505
5506 if (elem_size < UNITS_PER_WORD)
5507 {
23a60a04 5508 tree real_part, imag_part;
cd3ce9b4
JM
5509 tree post = NULL_TREE;
5510
23a60a04
JM
5511 real_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
5512 &post);
5513 /* Copy the value into a temporary, lest the formal temporary
5514 be reused out from under us. */
5515 real_part = get_initialized_tmp_var (real_part, pre_p, &post);
cd3ce9b4
JM
5516 append_to_statement_list (post, pre_p);
5517
23a60a04
JM
5518 imag_part = rs6000_gimplify_va_arg (valist, elem_type, pre_p,
5519 post_p);
cd3ce9b4 5520
23a60a04 5521 return build (COMPLEX_EXPR, type, real_part, imag_part);
cd3ce9b4
JM
5522 }
5523 }
5524
23a60a04 5525 return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
cd3ce9b4
JM
5526 }
5527
5528 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
5529 f_fpr = TREE_CHAIN (f_gpr);
5530 f_res = TREE_CHAIN (f_fpr);
5531 f_ovf = TREE_CHAIN (f_res);
5532 f_sav = TREE_CHAIN (f_ovf);
5533
5534 valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
44de5aeb
RK
5535 gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
5536 fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
5537 ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
5538 sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
cd3ce9b4
JM
5539
5540 size = int_size_in_bytes (type);
5541 rsize = (size + 3) / 4;
5542 align = 1;
5543
08b0dc1b
RH
5544 if (TARGET_HARD_FLOAT && TARGET_FPRS
5545 && (TYPE_MODE (type) == SFmode || TYPE_MODE (type) == DFmode))
cd3ce9b4
JM
5546 {
5547 /* FP args go in FP registers, if present. */
cd3ce9b4
JM
5548 reg = fpr;
5549 n_reg = 1;
5550 sav_ofs = 8*4;
5551 sav_scale = 8;
5552 if (TYPE_MODE (type) == DFmode)
5553 align = 8;
5554 }
5555 else
5556 {
5557 /* Otherwise into GP registers. */
cd3ce9b4
JM
5558 reg = gpr;
5559 n_reg = rsize;
5560 sav_ofs = 0;
5561 sav_scale = 4;
5562 if (n_reg == 2)
5563 align = 8;
5564 }
5565
5566 /* Pull the value out of the saved registers.... */
5567
5568 lab_over = NULL;
5569 addr = create_tmp_var (ptr_type_node, "addr");
5570 DECL_POINTER_ALIAS_SET (addr) = get_varargs_alias_set ();
5571
5572 /* AltiVec vectors never go in registers when -mabi=altivec. */
5573 if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (TYPE_MODE (type)))
5574 align = 16;
5575 else
5576 {
5577 lab_false = create_artificial_label ();
5578 lab_over = create_artificial_label ();
5579
5580 /* Long long and SPE vectors are aligned in the registers.
5581 As are any other 2 gpr item such as complex int due to a
5582 historical mistake. */
5583 u = reg;
5584 if (n_reg == 2)
5585 {
5586 u = build2 (BIT_AND_EXPR, TREE_TYPE (reg), reg,
95674810 5587 size_int (n_reg - 1));
cd3ce9b4
JM
5588 u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg, u);
5589 }
5590
95674810 5591 t = fold_convert (TREE_TYPE (reg), size_int (8 - n_reg + 1));
cd3ce9b4
JM
5592 t = build2 (GE_EXPR, boolean_type_node, u, t);
5593 u = build1 (GOTO_EXPR, void_type_node, lab_false);
5594 t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
5595 gimplify_and_add (t, pre_p);
5596
5597 t = sav;
5598 if (sav_ofs)
95674810 5599 t = build2 (PLUS_EXPR, ptr_type_node, sav, size_int (sav_ofs));
cd3ce9b4 5600
95674810 5601 u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg, size_int (n_reg));
cd3ce9b4 5602 u = build1 (CONVERT_EXPR, integer_type_node, u);
95674810 5603 u = build2 (MULT_EXPR, integer_type_node, u, size_int (sav_scale));
cd3ce9b4
JM
5604 t = build2 (PLUS_EXPR, ptr_type_node, t, u);
5605
5606 t = build2 (MODIFY_EXPR, void_type_node, addr, t);
5607 gimplify_and_add (t, pre_p);
5608
5609 t = build1 (GOTO_EXPR, void_type_node, lab_over);
5610 gimplify_and_add (t, pre_p);
5611
5612 t = build1 (LABEL_EXPR, void_type_node, lab_false);
5613 append_to_statement_list (t, pre_p);
5614
5615 if (n_reg > 2)
5616 {
5617 /* Ensure that we don't find any more args in regs.
5618 Alignment has taken care of the n_reg == 2 case. */
95674810 5619 t = build (MODIFY_EXPR, TREE_TYPE (reg), reg, size_int (8));
cd3ce9b4
JM
5620 gimplify_and_add (t, pre_p);
5621 }
5622 }
5623
5624 /* ... otherwise out of the overflow area. */
5625
5626 /* Care for on-stack alignment if needed. */
5627 t = ovf;
5628 if (align != 1)
5629 {
95674810 5630 t = build2 (PLUS_EXPR, TREE_TYPE (t), t, size_int (align - 1));
4a90aeeb
NS
5631 t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
5632 build_int_cst (NULL_TREE, -align, -1));
cd3ce9b4
JM
5633 }
5634 gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
5635
5636 u = build2 (MODIFY_EXPR, void_type_node, addr, t);
5637 gimplify_and_add (u, pre_p);
5638
95674810 5639 t = build2 (PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
cd3ce9b4
JM
5640 t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
5641 gimplify_and_add (t, pre_p);
5642
5643 if (lab_over)
5644 {
5645 t = build1 (LABEL_EXPR, void_type_node, lab_over);
5646 append_to_statement_list (t, pre_p);
5647 }
5648
08b0dc1b 5649 addr = fold_convert (ptrtype, addr);
23a60a04 5650 return build_fold_indirect_ref (addr);
cd3ce9b4
JM
5651}
5652
0ac081f6
AH
5653/* Builtins. */
5654
6e34d3a3
JM
5655#define def_builtin(MASK, NAME, TYPE, CODE) \
5656do { \
5657 if ((MASK) & target_flags) \
5658 lang_hooks.builtin_function ((NAME), (TYPE), (CODE), BUILT_IN_MD, \
5659 NULL, NULL_TREE); \
0ac081f6
AH
5660} while (0)
5661
24408032
AH
5662/* Simple ternary operations: VECd = foo (VECa, VECb, VECc). */
5663
2212663f 5664static const struct builtin_description bdesc_3arg[] =
24408032
AH
5665{
5666 { MASK_ALTIVEC, CODE_FOR_altivec_vmaddfp, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
5667 { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
5668 { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
5669 { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
5670 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
5671 { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
5672 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
5673 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
5674 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
5675 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
5676 { MASK_ALTIVEC, CODE_FOR_altivec_vnmsubfp, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
5677 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
5678 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
5679 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
5680 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_16qi, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
5681 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
5682 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
5683 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
5684 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
5685 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
5686 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
5687 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
5688 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
5689};
2212663f 5690
95385cbb
AH
5691/* DST operations: void foo (void *, const int, const char). */
5692
5693static const struct builtin_description bdesc_dst[] =
5694{
5695 { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
5696 { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
5697 { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
5698 { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT }
5699};
5700
2212663f 5701/* Simple binary operations: VECc = foo (VECa, VECb). */
24408032 5702
a3170dc6 5703static struct builtin_description bdesc_2arg[] =
0ac081f6 5704{
f18c054f
DB
5705 { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
5706 { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
5707 { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
5708 { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
0ac081f6
AH
5709 { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
5710 { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
5711 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
5712 { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
5713 { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
5714 { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
5715 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
f18c054f 5716 { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
0ac081f6
AH
5717 { MASK_ALTIVEC, CODE_FOR_altivec_vandc, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
5718 { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
5719 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
5720 { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
5721 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
5722 { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
5723 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
617e0e1d
DB
5724 { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
5725 { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
0ac081f6
AH
5726 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
5727 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequb, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
5728 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequh, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
5729 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequw, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
5730 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpeqfp, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
5731 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgefp, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
5732 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtub, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
5733 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsb, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
5734 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuh, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
5735 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsh, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
5736 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuw, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
5737 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsw, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
5738 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtfp, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
617e0e1d
DB
5739 { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
5740 { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
f18c054f
DB
5741 { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
5742 { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
df966bff
AH
5743 { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
5744 { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
5745 { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
5746 { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
5747 { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
0ac081f6
AH
5748 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
5749 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
5750 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
5751 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
5752 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
5753 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
f18c054f
DB
5754 { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
5755 { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
5756 { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
5757 { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
5758 { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
5759 { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
5760 { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
0ac081f6
AH
5761 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
5762 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
5763 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
5764 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
5765 { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
5766 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
5767 { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
5768 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
5769 { MASK_ALTIVEC, CODE_FOR_altivec_vnor, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
f18c054f 5770 { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
0ac081f6
AH
5771 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
5772 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
5773 { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
5774 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhss, "__builtin_altivec_vpkuhss", ALTIVEC_BUILTIN_VPKUHSS },
5775 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
5776 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwss, "__builtin_altivec_vpkuwss", ALTIVEC_BUILTIN_VPKUWSS },
5777 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
5778 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
5779 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
5780 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
5781 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
5782 { MASK_ALTIVEC, CODE_FOR_altivec_vrlb, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
5783 { MASK_ALTIVEC, CODE_FOR_altivec_vrlh, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
5784 { MASK_ALTIVEC, CODE_FOR_altivec_vrlw, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
5785 { MASK_ALTIVEC, CODE_FOR_altivec_vslb, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
5786 { MASK_ALTIVEC, CODE_FOR_altivec_vslh, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
5787 { MASK_ALTIVEC, CODE_FOR_altivec_vslw, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
5788 { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
5789 { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
2212663f
DB
5790 { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
5791 { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
5792 { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
0ac081f6 5793 { MASK_ALTIVEC, CODE_FOR_altivec_vsrb, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
f18c054f
DB
5794 { MASK_ALTIVEC, CODE_FOR_altivec_vsrh, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
5795 { MASK_ALTIVEC, CODE_FOR_altivec_vsrw, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
0ac081f6
AH
5796 { MASK_ALTIVEC, CODE_FOR_altivec_vsrab, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
5797 { MASK_ALTIVEC, CODE_FOR_altivec_vsrah, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
5798 { MASK_ALTIVEC, CODE_FOR_altivec_vsraw, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
5799 { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
5800 { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
f18c054f
DB
5801 { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
5802 { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
5803 { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
5804 { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
0ac081f6
AH
5805 { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
5806 { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
5807 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
5808 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
5809 { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
5810 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
5811 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
5812 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
5813 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
5814 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
5815 { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
5816 { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
f18c054f 5817 { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
a3170dc6
AH
5818
5819 /* Place holder, leave as first spe builtin. */
5820 { 0, CODE_FOR_spe_evaddw, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
5821 { 0, CODE_FOR_spe_evand, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
5822 { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
5823 { 0, CODE_FOR_spe_evdivws, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
5824 { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
5825 { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
5826 { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
5827 { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
5828 { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
5829 { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
5830 { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
5831 { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
5832 { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
5833 { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
5834 { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
5835 { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
5836 { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
5837 { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
5838 { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
5839 { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
5840 { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
5841 { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
5842 { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
5843 { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
5844 { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
5845 { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
5846 { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
5847 { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
5848 { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
5849 { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
5850 { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
5851 { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
5852 { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
5853 { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
5854 { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
5855 { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
5856 { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
5857 { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
5858 { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
5859 { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
5860 { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
5861 { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
5862 { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
5863 { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
5864 { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
5865 { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
5866 { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
5867 { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
5868 { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
5869 { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
5870 { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
5871 { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
5872 { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
5873 { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
5874 { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
5875 { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
5876 { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
5877 { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
5878 { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
5879 { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
5880 { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
5881 { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
5882 { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
5883 { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
5884 { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
5885 { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
5886 { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
5887 { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
5888 { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
5889 { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
5890 { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
5891 { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
5892 { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
5893 { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
a3170dc6
AH
5894 { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
5895 { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
a3170dc6
AH
5896 { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
5897 { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
5898 { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
5899 { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
5900 { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
5901 { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
5902 { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
5903 { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
5904 { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
5905 { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
5906 { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
5907 { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
5908 { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
5909 { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
5910 { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
5911 { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
5912 { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
5913 { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
5914 { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
5915 { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
5916 { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
5917 { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
5918 { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
5919 { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
5920 { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
5921 { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
5922 { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
5923 { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
5924 { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
5925 { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
5926 { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
5927 { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
5928 { 0, CODE_FOR_spe_evsubfw, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
5929
5930 /* SPE binary operations expecting a 5-bit unsigned literal. */
5931 { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
5932
5933 { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
5934 { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
5935 { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
5936 { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
5937 { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
5938 { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
5939 { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
5940 { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
5941 { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
5942 { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
5943 { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
5944 { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
5945 { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
5946 { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
5947 { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
5948 { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
5949 { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
5950 { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
5951 { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
5952 { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
5953 { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
5954 { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
5955 { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
5956 { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
5957 { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
5958 { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
5959
5960 /* Place-holder. Leave as last binary SPE builtin. */
17edbda5 5961 { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR },
ae4b4a02
AH
5962};
5963
5964/* AltiVec predicates. */
5965
5966struct builtin_description_predicates
5967{
5968 const unsigned int mask;
5969 const enum insn_code icode;
5970 const char *opcode;
5971 const char *const name;
5972 const enum rs6000_builtins code;
5973};
5974
5975static const struct builtin_description_predicates bdesc_altivec_preds[] =
5976{
5977 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpbfp.", "__builtin_altivec_vcmpbfp_p", ALTIVEC_BUILTIN_VCMPBFP_P },
5978 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpeqfp.", "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
5979 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgefp.", "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
5980 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgtfp.", "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
5981 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpequw.", "__builtin_altivec_vcmpequw_p", ALTIVEC_BUILTIN_VCMPEQUW_P },
5982 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtsw.", "__builtin_altivec_vcmpgtsw_p", ALTIVEC_BUILTIN_VCMPGTSW_P },
5983 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtuw.", "__builtin_altivec_vcmpgtuw_p", ALTIVEC_BUILTIN_VCMPGTUW_P },
5984 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtuh.", "__builtin_altivec_vcmpgtuh_p", ALTIVEC_BUILTIN_VCMPGTUH_P },
5985 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtsh.", "__builtin_altivec_vcmpgtsh_p", ALTIVEC_BUILTIN_VCMPGTSH_P },
5986 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpequh.", "__builtin_altivec_vcmpequh_p", ALTIVEC_BUILTIN_VCMPEQUH_P },
5987 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpequb.", "__builtin_altivec_vcmpequb_p", ALTIVEC_BUILTIN_VCMPEQUB_P },
5988 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtsb.", "__builtin_altivec_vcmpgtsb_p", ALTIVEC_BUILTIN_VCMPGTSB_P },
5989 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtub.", "__builtin_altivec_vcmpgtub_p", ALTIVEC_BUILTIN_VCMPGTUB_P }
0ac081f6 5990};
24408032 5991
a3170dc6
AH
5992/* SPE predicates. */
5993static struct builtin_description bdesc_spe_predicates[] =
5994{
5995 /* Place-holder. Leave as first. */
5996 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
5997 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
5998 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
5999 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
6000 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
6001 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
6002 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
6003 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
6004 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
6005 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
6006 /* Place-holder. Leave as last. */
6007 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
6008};
6009
6010/* SPE evsel predicates. */
6011static struct builtin_description bdesc_spe_evsel[] =
6012{
6013 /* Place-holder. Leave as first. */
6014 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
6015 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
6016 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
6017 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
6018 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
6019 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
6020 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
6021 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
6022 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
6023 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
6024 /* Place-holder. Leave as last. */
6025 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
6026};
6027
b6d08ca1 6028/* ABS* operations. */
100c4561
AH
6029
6030static const struct builtin_description bdesc_abs[] =
6031{
6032 { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
6033 { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
6034 { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
6035 { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
6036 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
6037 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
6038 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI }
6039};
6040
617e0e1d
DB
6041/* Simple unary operations: VECb = foo (unsigned literal) or VECb =
6042 foo (VECa). */
24408032 6043
a3170dc6 6044static struct builtin_description bdesc_1arg[] =
2212663f 6045{
617e0e1d
DB
6046 { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
6047 { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
6048 { MASK_ALTIVEC, CODE_FOR_altivec_vrefp, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
6049 { MASK_ALTIVEC, CODE_FOR_altivec_vrfim, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
6050 { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
6051 { MASK_ALTIVEC, CODE_FOR_altivec_vrfip, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
6052 { MASK_ALTIVEC, CODE_FOR_ftruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
6053 { MASK_ALTIVEC, CODE_FOR_altivec_vrsqrtefp, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
2212663f
DB
6054 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
6055 { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
6056 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
20e26713
AH
6057 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
6058 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
6059 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
6060 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
6061 { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
6062 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
a3170dc6
AH
6063
6064 /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
6065 end with SPE_BUILTIN_EVSUBFUSIAAW. */
6066 { 0, CODE_FOR_spe_evabs, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
6067 { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
6068 { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
6069 { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
6070 { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
6071 { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
6072 { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
6073 { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
6074 { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
6075 { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
6076 { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
6077 { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
6078 { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
6079 { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
6080 { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
6081 { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
6082 { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
6083 { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
6084 { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
6085 { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
6086 { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
6087 { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
6088 { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
6a599451 6089 { 0, CODE_FOR_negv2si2, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
a3170dc6
AH
6090 { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
6091 { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
6092 { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
6093 { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
a3170dc6
AH
6094
6095 /* Place-holder. Leave as last unary SPE builtin. */
6096 { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
2212663f
DB
6097};
6098
6099static rtx
a2369ed3 6100rs6000_expand_unop_builtin (enum insn_code icode, tree arglist, rtx target)
2212663f
DB
6101{
6102 rtx pat;
6103 tree arg0 = TREE_VALUE (arglist);
6104 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6105 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6106 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6107
0559cc77
DE
6108 if (icode == CODE_FOR_nothing)
6109 /* Builtin not supported on this processor. */
6110 return 0;
6111
20e26713
AH
6112 /* If we got invalid arguments bail out before generating bad rtl. */
6113 if (arg0 == error_mark_node)
9a171fcd 6114 return const0_rtx;
20e26713 6115
0559cc77
DE
6116 if (icode == CODE_FOR_altivec_vspltisb
6117 || icode == CODE_FOR_altivec_vspltish
6118 || icode == CODE_FOR_altivec_vspltisw
6119 || icode == CODE_FOR_spe_evsplatfi
6120 || icode == CODE_FOR_spe_evsplati)
b44140e7
AH
6121 {
6122 /* Only allow 5-bit *signed* literals. */
b44140e7
AH
6123 if (GET_CODE (op0) != CONST_INT
6124 || INTVAL (op0) > 0x1f
6125 || INTVAL (op0) < -0x1f)
6126 {
6127 error ("argument 1 must be a 5-bit signed literal");
9a171fcd 6128 return const0_rtx;
b44140e7 6129 }
b44140e7
AH
6130 }
6131
c62f2db5 6132 if (target == 0
2212663f
DB
6133 || GET_MODE (target) != tmode
6134 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6135 target = gen_reg_rtx (tmode);
6136
6137 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6138 op0 = copy_to_mode_reg (mode0, op0);
6139
6140 pat = GEN_FCN (icode) (target, op0);
6141 if (! pat)
6142 return 0;
6143 emit_insn (pat);
0ac081f6 6144
2212663f
DB
6145 return target;
6146}
ae4b4a02 6147
100c4561 6148static rtx
a2369ed3 6149altivec_expand_abs_builtin (enum insn_code icode, tree arglist, rtx target)
100c4561
AH
6150{
6151 rtx pat, scratch1, scratch2;
6152 tree arg0 = TREE_VALUE (arglist);
6153 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6154 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6155 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6156
6157 /* If we have invalid arguments, bail out before generating bad rtl. */
6158 if (arg0 == error_mark_node)
9a171fcd 6159 return const0_rtx;
100c4561
AH
6160
6161 if (target == 0
6162 || GET_MODE (target) != tmode
6163 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6164 target = gen_reg_rtx (tmode);
6165
6166 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6167 op0 = copy_to_mode_reg (mode0, op0);
6168
6169 scratch1 = gen_reg_rtx (mode0);
6170 scratch2 = gen_reg_rtx (mode0);
6171
6172 pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
6173 if (! pat)
6174 return 0;
6175 emit_insn (pat);
6176
6177 return target;
6178}
6179
0ac081f6 6180static rtx
a2369ed3 6181rs6000_expand_binop_builtin (enum insn_code icode, tree arglist, rtx target)
0ac081f6
AH
6182{
6183 rtx pat;
6184 tree arg0 = TREE_VALUE (arglist);
6185 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6186 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6187 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6188 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6189 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6190 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
6191
0559cc77
DE
6192 if (icode == CODE_FOR_nothing)
6193 /* Builtin not supported on this processor. */
6194 return 0;
6195
20e26713
AH
6196 /* If we got invalid arguments bail out before generating bad rtl. */
6197 if (arg0 == error_mark_node || arg1 == error_mark_node)
9a171fcd 6198 return const0_rtx;
20e26713 6199
0559cc77
DE
6200 if (icode == CODE_FOR_altivec_vcfux
6201 || icode == CODE_FOR_altivec_vcfsx
6202 || icode == CODE_FOR_altivec_vctsxs
6203 || icode == CODE_FOR_altivec_vctuxs
6204 || icode == CODE_FOR_altivec_vspltb
6205 || icode == CODE_FOR_altivec_vsplth
6206 || icode == CODE_FOR_altivec_vspltw
6207 || icode == CODE_FOR_spe_evaddiw
6208 || icode == CODE_FOR_spe_evldd
6209 || icode == CODE_FOR_spe_evldh
6210 || icode == CODE_FOR_spe_evldw
6211 || icode == CODE_FOR_spe_evlhhesplat
6212 || icode == CODE_FOR_spe_evlhhossplat
6213 || icode == CODE_FOR_spe_evlhhousplat
6214 || icode == CODE_FOR_spe_evlwhe
6215 || icode == CODE_FOR_spe_evlwhos
6216 || icode == CODE_FOR_spe_evlwhou
6217 || icode == CODE_FOR_spe_evlwhsplat
6218 || icode == CODE_FOR_spe_evlwwsplat
6219 || icode == CODE_FOR_spe_evrlwi
6220 || icode == CODE_FOR_spe_evslwi
6221 || icode == CODE_FOR_spe_evsrwis
f5119d10 6222 || icode == CODE_FOR_spe_evsubifw
0559cc77 6223 || icode == CODE_FOR_spe_evsrwiu)
b44140e7
AH
6224 {
6225 /* Only allow 5-bit unsigned literals. */
8bb418a3 6226 STRIP_NOPS (arg1);
b44140e7
AH
6227 if (TREE_CODE (arg1) != INTEGER_CST
6228 || TREE_INT_CST_LOW (arg1) & ~0x1f)
6229 {
6230 error ("argument 2 must be a 5-bit unsigned literal");
9a171fcd 6231 return const0_rtx;
b44140e7 6232 }
b44140e7
AH
6233 }
6234
c62f2db5 6235 if (target == 0
0ac081f6
AH
6236 || GET_MODE (target) != tmode
6237 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6238 target = gen_reg_rtx (tmode);
6239
6240 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6241 op0 = copy_to_mode_reg (mode0, op0);
6242 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
6243 op1 = copy_to_mode_reg (mode1, op1);
6244
6245 pat = GEN_FCN (icode) (target, op0, op1);
6246 if (! pat)
6247 return 0;
6248 emit_insn (pat);
6249
6250 return target;
6251}
6525c0e7 6252
ae4b4a02 6253static rtx
a2369ed3
DJ
6254altivec_expand_predicate_builtin (enum insn_code icode, const char *opcode,
6255 tree arglist, rtx target)
ae4b4a02
AH
6256{
6257 rtx pat, scratch;
6258 tree cr6_form = TREE_VALUE (arglist);
6259 tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
6260 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6261 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6262 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6263 enum machine_mode tmode = SImode;
6264 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6265 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
6266 int cr6_form_int;
6267
6268 if (TREE_CODE (cr6_form) != INTEGER_CST)
6269 {
6270 error ("argument 1 of __builtin_altivec_predicate must be a constant");
9a171fcd 6271 return const0_rtx;
ae4b4a02
AH
6272 }
6273 else
6274 cr6_form_int = TREE_INT_CST_LOW (cr6_form);
6275
6276 if (mode0 != mode1)
6277 abort ();
6278
6279 /* If we have invalid arguments, bail out before generating bad rtl. */
6280 if (arg0 == error_mark_node || arg1 == error_mark_node)
9a171fcd 6281 return const0_rtx;
ae4b4a02
AH
6282
6283 if (target == 0
6284 || GET_MODE (target) != tmode
6285 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6286 target = gen_reg_rtx (tmode);
6287
6288 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6289 op0 = copy_to_mode_reg (mode0, op0);
6290 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
6291 op1 = copy_to_mode_reg (mode1, op1);
6292
6293 scratch = gen_reg_rtx (mode0);
6294
6295 pat = GEN_FCN (icode) (scratch, op0, op1,
f1c25d3b 6296 gen_rtx_SYMBOL_REF (Pmode, opcode));
ae4b4a02
AH
6297 if (! pat)
6298 return 0;
6299 emit_insn (pat);
6300
6301 /* The vec_any* and vec_all* predicates use the same opcodes for two
6302 different operations, but the bits in CR6 will be different
6303 depending on what information we want. So we have to play tricks
6304 with CR6 to get the right bits out.
6305
6306 If you think this is disgusting, look at the specs for the
6307 AltiVec predicates. */
6308
6309 switch (cr6_form_int)
6310 {
6311 case 0:
6312 emit_insn (gen_cr6_test_for_zero (target));
6313 break;
6314 case 1:
6315 emit_insn (gen_cr6_test_for_zero_reverse (target));
6316 break;
6317 case 2:
6318 emit_insn (gen_cr6_test_for_lt (target));
6319 break;
6320 case 3:
6321 emit_insn (gen_cr6_test_for_lt_reverse (target));
6322 break;
6323 default:
6324 error ("argument 1 of __builtin_altivec_predicate is out of range");
6325 break;
6326 }
6327
6328 return target;
6329}
6330
b4a62fa0 6331static rtx
38f391a5 6332altivec_expand_lv_builtin (enum insn_code icode, tree arglist, rtx target)
b4a62fa0
SB
6333{
6334 rtx pat, addr;
6335 tree arg0 = TREE_VALUE (arglist);
6336 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6337 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6338 enum machine_mode mode0 = Pmode;
6339 enum machine_mode mode1 = Pmode;
6340 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6341 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6342
6343 if (icode == CODE_FOR_nothing)
6344 /* Builtin not supported on this processor. */
6345 return 0;
6346
6347 /* If we got invalid arguments bail out before generating bad rtl. */
6348 if (arg0 == error_mark_node || arg1 == error_mark_node)
6349 return const0_rtx;
6350
6351 if (target == 0
6352 || GET_MODE (target) != tmode
6353 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6354 target = gen_reg_rtx (tmode);
6355
6356 op1 = copy_to_mode_reg (mode1, op1);
6357
6358 if (op0 == const0_rtx)
6359 {
6360 addr = gen_rtx_MEM (tmode, op1);
6361 }
6362 else
6363 {
6364 op0 = copy_to_mode_reg (mode0, op0);
6365 addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1));
6366 }
6367
6368 pat = GEN_FCN (icode) (target, addr);
6369
6370 if (! pat)
6371 return 0;
6372 emit_insn (pat);
6373
6374 return target;
6375}
6376
61bea3b0
AH
6377static rtx
6378spe_expand_stv_builtin (enum insn_code icode, tree arglist)
6379{
6380 tree arg0 = TREE_VALUE (arglist);
6381 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6382 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6383 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6384 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6385 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
6386 rtx pat;
6387 enum machine_mode mode0 = insn_data[icode].operand[0].mode;
6388 enum machine_mode mode1 = insn_data[icode].operand[1].mode;
6389 enum machine_mode mode2 = insn_data[icode].operand[2].mode;
6390
6391 /* Invalid arguments. Bail before doing anything stoopid! */
6392 if (arg0 == error_mark_node
6393 || arg1 == error_mark_node
6394 || arg2 == error_mark_node)
6395 return const0_rtx;
6396
6397 if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
6398 op0 = copy_to_mode_reg (mode2, op0);
6399 if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
6400 op1 = copy_to_mode_reg (mode0, op1);
6401 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
6402 op2 = copy_to_mode_reg (mode1, op2);
6403
6404 pat = GEN_FCN (icode) (op1, op2, op0);
6405 if (pat)
6406 emit_insn (pat);
6407 return NULL_RTX;
6408}
6409
6525c0e7 6410static rtx
a2369ed3 6411altivec_expand_stv_builtin (enum insn_code icode, tree arglist)
6525c0e7
AH
6412{
6413 tree arg0 = TREE_VALUE (arglist);
6414 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6415 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6416 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6417 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6418 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
b4a62fa0
SB
6419 rtx pat, addr;
6420 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6421 enum machine_mode mode1 = Pmode;
6422 enum machine_mode mode2 = Pmode;
6525c0e7
AH
6423
6424 /* Invalid arguments. Bail before doing anything stoopid! */
6425 if (arg0 == error_mark_node
6426 || arg1 == error_mark_node
6427 || arg2 == error_mark_node)
9a171fcd 6428 return const0_rtx;
6525c0e7 6429
b4a62fa0
SB
6430 if (! (*insn_data[icode].operand[1].predicate) (op0, tmode))
6431 op0 = copy_to_mode_reg (tmode, op0);
6432
6433 op2 = copy_to_mode_reg (mode2, op2);
6434
6435 if (op1 == const0_rtx)
6436 {
6437 addr = gen_rtx_MEM (tmode, op2);
6438 }
6439 else
6440 {
6441 op1 = copy_to_mode_reg (mode1, op1);
6442 addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op1, op2));
6443 }
6525c0e7 6444
b4a62fa0 6445 pat = GEN_FCN (icode) (addr, op0);
6525c0e7
AH
6446 if (pat)
6447 emit_insn (pat);
6448 return NULL_RTX;
6449}
6450
2212663f 6451static rtx
a2369ed3 6452rs6000_expand_ternop_builtin (enum insn_code icode, tree arglist, rtx target)
2212663f
DB
6453{
6454 rtx pat;
6455 tree arg0 = TREE_VALUE (arglist);
6456 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6457 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6458 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6459 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6460 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
6461 enum machine_mode tmode = insn_data[icode].operand[0].mode;
6462 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
6463 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
6464 enum machine_mode mode2 = insn_data[icode].operand[3].mode;
0ac081f6 6465
774b5662
DE
6466 if (icode == CODE_FOR_nothing)
6467 /* Builtin not supported on this processor. */
6468 return 0;
6469
20e26713
AH
6470 /* If we got invalid arguments bail out before generating bad rtl. */
6471 if (arg0 == error_mark_node
6472 || arg1 == error_mark_node
6473 || arg2 == error_mark_node)
9a171fcd 6474 return const0_rtx;
20e26713 6475
774b5662
DE
6476 if (icode == CODE_FOR_altivec_vsldoi_4sf
6477 || icode == CODE_FOR_altivec_vsldoi_4si
6478 || icode == CODE_FOR_altivec_vsldoi_8hi
6479 || icode == CODE_FOR_altivec_vsldoi_16qi)
b44140e7
AH
6480 {
6481 /* Only allow 4-bit unsigned literals. */
8bb418a3 6482 STRIP_NOPS (arg2);
b44140e7
AH
6483 if (TREE_CODE (arg2) != INTEGER_CST
6484 || TREE_INT_CST_LOW (arg2) & ~0xf)
6485 {
6486 error ("argument 3 must be a 4-bit unsigned literal");
e3277ffb 6487 return const0_rtx;
b44140e7 6488 }
b44140e7
AH
6489 }
6490
c62f2db5 6491 if (target == 0
2212663f
DB
6492 || GET_MODE (target) != tmode
6493 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6494 target = gen_reg_rtx (tmode);
6495
6496 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6497 op0 = copy_to_mode_reg (mode0, op0);
6498 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
6499 op1 = copy_to_mode_reg (mode1, op1);
6500 if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
6501 op2 = copy_to_mode_reg (mode2, op2);
6502
6503 pat = GEN_FCN (icode) (target, op0, op1, op2);
6504 if (! pat)
6505 return 0;
6506 emit_insn (pat);
6507
6508 return target;
6509}
92898235 6510
3a9b8c7e 6511/* Expand the lvx builtins. */
0ac081f6 6512static rtx
a2369ed3 6513altivec_expand_ld_builtin (tree exp, rtx target, bool *expandedp)
0ac081f6 6514{
0ac081f6
AH
6515 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6516 tree arglist = TREE_OPERAND (exp, 1);
0ac081f6 6517 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
3a9b8c7e
AH
6518 tree arg0;
6519 enum machine_mode tmode, mode0;
7c3abc73 6520 rtx pat, op0;
3a9b8c7e 6521 enum insn_code icode;
92898235 6522
0ac081f6
AH
6523 switch (fcode)
6524 {
f18c054f
DB
6525 case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
6526 icode = CODE_FOR_altivec_lvx_16qi;
3a9b8c7e 6527 break;
f18c054f
DB
6528 case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
6529 icode = CODE_FOR_altivec_lvx_8hi;
3a9b8c7e
AH
6530 break;
6531 case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
6532 icode = CODE_FOR_altivec_lvx_4si;
6533 break;
6534 case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
6535 icode = CODE_FOR_altivec_lvx_4sf;
6536 break;
6537 default:
6538 *expandedp = false;
6539 return NULL_RTX;
6540 }
0ac081f6 6541
3a9b8c7e 6542 *expandedp = true;
f18c054f 6543
3a9b8c7e
AH
6544 arg0 = TREE_VALUE (arglist);
6545 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6546 tmode = insn_data[icode].operand[0].mode;
6547 mode0 = insn_data[icode].operand[1].mode;
f18c054f 6548
3a9b8c7e
AH
6549 if (target == 0
6550 || GET_MODE (target) != tmode
6551 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6552 target = gen_reg_rtx (tmode);
24408032 6553
3a9b8c7e
AH
6554 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
6555 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
f18c054f 6556
3a9b8c7e
AH
6557 pat = GEN_FCN (icode) (target, op0);
6558 if (! pat)
6559 return 0;
6560 emit_insn (pat);
6561 return target;
6562}
f18c054f 6563
3a9b8c7e
AH
6564/* Expand the stvx builtins. */
6565static rtx
a2369ed3
DJ
6566altivec_expand_st_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
6567 bool *expandedp)
3a9b8c7e
AH
6568{
6569 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6570 tree arglist = TREE_OPERAND (exp, 1);
6571 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
6572 tree arg0, arg1;
6573 enum machine_mode mode0, mode1;
7c3abc73 6574 rtx pat, op0, op1;
3a9b8c7e 6575 enum insn_code icode;
f18c054f 6576
3a9b8c7e
AH
6577 switch (fcode)
6578 {
6579 case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
6580 icode = CODE_FOR_altivec_stvx_16qi;
6581 break;
6582 case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
6583 icode = CODE_FOR_altivec_stvx_8hi;
6584 break;
6585 case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
6586 icode = CODE_FOR_altivec_stvx_4si;
6587 break;
6588 case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
6589 icode = CODE_FOR_altivec_stvx_4sf;
6590 break;
6591 default:
6592 *expandedp = false;
6593 return NULL_RTX;
6594 }
24408032 6595
3a9b8c7e
AH
6596 arg0 = TREE_VALUE (arglist);
6597 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6598 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6599 op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6600 mode0 = insn_data[icode].operand[0].mode;
6601 mode1 = insn_data[icode].operand[1].mode;
f18c054f 6602
3a9b8c7e
AH
6603 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
6604 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
6605 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
6606 op1 = copy_to_mode_reg (mode1, op1);
f18c054f 6607
3a9b8c7e
AH
6608 pat = GEN_FCN (icode) (op0, op1);
6609 if (pat)
6610 emit_insn (pat);
f18c054f 6611
3a9b8c7e
AH
6612 *expandedp = true;
6613 return NULL_RTX;
6614}
f18c054f 6615
3a9b8c7e
AH
6616/* Expand the dst builtins. */
6617static rtx
a2369ed3
DJ
6618altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
6619 bool *expandedp)
3a9b8c7e
AH
6620{
6621 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6622 tree arglist = TREE_OPERAND (exp, 1);
6623 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
6624 tree arg0, arg1, arg2;
6625 enum machine_mode mode0, mode1, mode2;
7c3abc73 6626 rtx pat, op0, op1, op2;
3a9b8c7e 6627 struct builtin_description *d;
a3170dc6 6628 size_t i;
f18c054f 6629
3a9b8c7e 6630 *expandedp = false;
f18c054f 6631
3a9b8c7e
AH
6632 /* Handle DST variants. */
6633 d = (struct builtin_description *) bdesc_dst;
6634 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
6635 if (d->code == fcode)
6636 {
6637 arg0 = TREE_VALUE (arglist);
6638 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
6639 arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6640 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6641 op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
6642 op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
6643 mode0 = insn_data[d->icode].operand[0].mode;
6644 mode1 = insn_data[d->icode].operand[1].mode;
6645 mode2 = insn_data[d->icode].operand[2].mode;
24408032 6646
3a9b8c7e
AH
6647 /* Invalid arguments, bail out before generating bad rtl. */
6648 if (arg0 == error_mark_node
6649 || arg1 == error_mark_node
6650 || arg2 == error_mark_node)
6651 return const0_rtx;
f18c054f 6652
86e7df90 6653 *expandedp = true;
8bb418a3 6654 STRIP_NOPS (arg2);
3a9b8c7e
AH
6655 if (TREE_CODE (arg2) != INTEGER_CST
6656 || TREE_INT_CST_LOW (arg2) & ~0x3)
6657 {
6658 error ("argument to `%s' must be a 2-bit unsigned literal", d->name);
6659 return const0_rtx;
6660 }
f18c054f 6661
3a9b8c7e 6662 if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
b4a62fa0 6663 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
3a9b8c7e
AH
6664 if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
6665 op1 = copy_to_mode_reg (mode1, op1);
24408032 6666
3a9b8c7e
AH
6667 pat = GEN_FCN (d->icode) (op0, op1, op2);
6668 if (pat != 0)
6669 emit_insn (pat);
f18c054f 6670
3a9b8c7e
AH
6671 return NULL_RTX;
6672 }
f18c054f 6673
3a9b8c7e
AH
6674 return NULL_RTX;
6675}
24408032 6676
3a9b8c7e
AH
6677/* Expand the builtin in EXP and store the result in TARGET. Store
6678 true in *EXPANDEDP if we found a builtin to expand. */
6679static rtx
a2369ed3 6680altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
3a9b8c7e
AH
6681{
6682 struct builtin_description *d;
6683 struct builtin_description_predicates *dp;
6684 size_t i;
6685 enum insn_code icode;
6686 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6687 tree arglist = TREE_OPERAND (exp, 1);
7c3abc73
AH
6688 tree arg0;
6689 rtx op0, pat;
6690 enum machine_mode tmode, mode0;
3a9b8c7e 6691 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
0ac081f6 6692
3a9b8c7e
AH
6693 target = altivec_expand_ld_builtin (exp, target, expandedp);
6694 if (*expandedp)
6695 return target;
0ac081f6 6696
3a9b8c7e
AH
6697 target = altivec_expand_st_builtin (exp, target, expandedp);
6698 if (*expandedp)
6699 return target;
6700
6701 target = altivec_expand_dst_builtin (exp, target, expandedp);
6702 if (*expandedp)
6703 return target;
6704
6705 *expandedp = true;
95385cbb 6706
3a9b8c7e
AH
6707 switch (fcode)
6708 {
6525c0e7
AH
6709 case ALTIVEC_BUILTIN_STVX:
6710 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, arglist);
6711 case ALTIVEC_BUILTIN_STVEBX:
6712 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, arglist);
6713 case ALTIVEC_BUILTIN_STVEHX:
6714 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, arglist);
6715 case ALTIVEC_BUILTIN_STVEWX:
6716 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, arglist);
6717 case ALTIVEC_BUILTIN_STVXL:
6718 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, arglist);
3a9b8c7e 6719
95385cbb
AH
6720 case ALTIVEC_BUILTIN_MFVSCR:
6721 icode = CODE_FOR_altivec_mfvscr;
6722 tmode = insn_data[icode].operand[0].mode;
6723
6724 if (target == 0
6725 || GET_MODE (target) != tmode
6726 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6727 target = gen_reg_rtx (tmode);
6728
6729 pat = GEN_FCN (icode) (target);
0ac081f6
AH
6730 if (! pat)
6731 return 0;
6732 emit_insn (pat);
95385cbb
AH
6733 return target;
6734
6735 case ALTIVEC_BUILTIN_MTVSCR:
6736 icode = CODE_FOR_altivec_mtvscr;
6737 arg0 = TREE_VALUE (arglist);
6738 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6739 mode0 = insn_data[icode].operand[0].mode;
6740
6741 /* If we got invalid arguments bail out before generating bad rtl. */
6742 if (arg0 == error_mark_node)
9a171fcd 6743 return const0_rtx;
95385cbb
AH
6744
6745 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
6746 op0 = copy_to_mode_reg (mode0, op0);
6747
6748 pat = GEN_FCN (icode) (op0);
6749 if (pat)
6750 emit_insn (pat);
6751 return NULL_RTX;
3a9b8c7e 6752
95385cbb
AH
6753 case ALTIVEC_BUILTIN_DSSALL:
6754 emit_insn (gen_altivec_dssall ());
6755 return NULL_RTX;
6756
6757 case ALTIVEC_BUILTIN_DSS:
6758 icode = CODE_FOR_altivec_dss;
6759 arg0 = TREE_VALUE (arglist);
8bb418a3 6760 STRIP_NOPS (arg0);
95385cbb
AH
6761 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6762 mode0 = insn_data[icode].operand[0].mode;
6763
6764 /* If we got invalid arguments bail out before generating bad rtl. */
6765 if (arg0 == error_mark_node)
9a171fcd 6766 return const0_rtx;
95385cbb 6767
b44140e7
AH
6768 if (TREE_CODE (arg0) != INTEGER_CST
6769 || TREE_INT_CST_LOW (arg0) & ~0x3)
6770 {
6771 error ("argument to dss must be a 2-bit unsigned literal");
9a171fcd 6772 return const0_rtx;
b44140e7
AH
6773 }
6774
95385cbb
AH
6775 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
6776 op0 = copy_to_mode_reg (mode0, op0);
6777
6778 emit_insn (gen_altivec_dss (op0));
0ac081f6 6779 return NULL_RTX;
8bb418a3
ZL
6780
6781 case ALTIVEC_BUILTIN_COMPILETIME_ERROR:
6782 arg0 = TREE_VALUE (arglist);
6783 while (TREE_CODE (arg0) == NOP_EXPR || TREE_CODE (arg0) == ADDR_EXPR)
6784 arg0 = TREE_OPERAND (arg0, 0);
6785 error ("invalid parameter combination for `%s' AltiVec intrinsic",
6786 TREE_STRING_POINTER (arg0));
6787
6788 return const0_rtx;
0ac081f6 6789 }
24408032 6790
100c4561
AH
6791 /* Expand abs* operations. */
6792 d = (struct builtin_description *) bdesc_abs;
ca7558fc 6793 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
100c4561
AH
6794 if (d->code == fcode)
6795 return altivec_expand_abs_builtin (d->icode, arglist, target);
6796
ae4b4a02
AH
6797 /* Expand the AltiVec predicates. */
6798 dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
ca7558fc 6799 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
ae4b4a02
AH
6800 if (dp->code == fcode)
6801 return altivec_expand_predicate_builtin (dp->icode, dp->opcode, arglist, target);
6802
6525c0e7
AH
6803 /* LV* are funky. We initialized them differently. */
6804 switch (fcode)
6805 {
6806 case ALTIVEC_BUILTIN_LVSL:
b4a62fa0 6807 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
6525c0e7
AH
6808 arglist, target);
6809 case ALTIVEC_BUILTIN_LVSR:
b4a62fa0 6810 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
92898235 6811 arglist, target);
6525c0e7 6812 case ALTIVEC_BUILTIN_LVEBX:
b4a62fa0 6813 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
92898235 6814 arglist, target);
6525c0e7 6815 case ALTIVEC_BUILTIN_LVEHX:
b4a62fa0 6816 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
92898235 6817 arglist, target);
6525c0e7 6818 case ALTIVEC_BUILTIN_LVEWX:
b4a62fa0 6819 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
92898235 6820 arglist, target);
6525c0e7 6821 case ALTIVEC_BUILTIN_LVXL:
b4a62fa0 6822 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
92898235 6823 arglist, target);
6525c0e7 6824 case ALTIVEC_BUILTIN_LVX:
b4a62fa0 6825 return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx,
92898235 6826 arglist, target);
6525c0e7
AH
6827 default:
6828 break;
6829 /* Fall through. */
6830 }
95385cbb 6831
92898235 6832 *expandedp = false;
0ac081f6
AH
6833 return NULL_RTX;
6834}
6835
a3170dc6
AH
6836/* Binops that need to be initialized manually, but can be expanded
6837 automagically by rs6000_expand_binop_builtin. */
6838static struct builtin_description bdesc_2arg_spe[] =
6839{
6840 { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
6841 { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
6842 { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
6843 { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
6844 { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
6845 { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
6846 { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
6847 { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
6848 { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
6849 { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
6850 { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
6851 { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
6852 { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
6853 { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
6854 { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
6855 { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
6856 { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
6857 { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
6858 { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
6859 { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
6860 { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
6861 { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
6862};
6863
6864/* Expand the builtin in EXP and store the result in TARGET. Store
6865 true in *EXPANDEDP if we found a builtin to expand.
6866
6867 This expands the SPE builtins that are not simple unary and binary
6868 operations. */
6869static rtx
a2369ed3 6870spe_expand_builtin (tree exp, rtx target, bool *expandedp)
a3170dc6
AH
6871{
6872 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
6873 tree arglist = TREE_OPERAND (exp, 1);
6874 tree arg1, arg0;
6875 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
6876 enum insn_code icode;
6877 enum machine_mode tmode, mode0;
6878 rtx pat, op0;
6879 struct builtin_description *d;
6880 size_t i;
6881
6882 *expandedp = true;
6883
6884 /* Syntax check for a 5-bit unsigned immediate. */
6885 switch (fcode)
6886 {
6887 case SPE_BUILTIN_EVSTDD:
6888 case SPE_BUILTIN_EVSTDH:
6889 case SPE_BUILTIN_EVSTDW:
6890 case SPE_BUILTIN_EVSTWHE:
6891 case SPE_BUILTIN_EVSTWHO:
6892 case SPE_BUILTIN_EVSTWWE:
6893 case SPE_BUILTIN_EVSTWWO:
6894 arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
6895 if (TREE_CODE (arg1) != INTEGER_CST
6896 || TREE_INT_CST_LOW (arg1) & ~0x1f)
6897 {
6898 error ("argument 2 must be a 5-bit unsigned literal");
6899 return const0_rtx;
6900 }
6901 break;
6902 default:
6903 break;
6904 }
6905
00332c9f
AH
6906 /* The evsplat*i instructions are not quite generic. */
6907 switch (fcode)
6908 {
6909 case SPE_BUILTIN_EVSPLATFI:
6910 return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplatfi,
6911 arglist, target);
6912 case SPE_BUILTIN_EVSPLATI:
6913 return rs6000_expand_unop_builtin (CODE_FOR_spe_evsplati,
6914 arglist, target);
6915 default:
6916 break;
6917 }
6918
a3170dc6
AH
6919 d = (struct builtin_description *) bdesc_2arg_spe;
6920 for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
6921 if (d->code == fcode)
6922 return rs6000_expand_binop_builtin (d->icode, arglist, target);
6923
6924 d = (struct builtin_description *) bdesc_spe_predicates;
6925 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
6926 if (d->code == fcode)
6927 return spe_expand_predicate_builtin (d->icode, arglist, target);
6928
6929 d = (struct builtin_description *) bdesc_spe_evsel;
6930 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
6931 if (d->code == fcode)
6932 return spe_expand_evsel_builtin (d->icode, arglist, target);
6933
6934 switch (fcode)
6935 {
6936 case SPE_BUILTIN_EVSTDDX:
61bea3b0 6937 return spe_expand_stv_builtin (CODE_FOR_spe_evstddx, arglist);
a3170dc6 6938 case SPE_BUILTIN_EVSTDHX:
61bea3b0 6939 return spe_expand_stv_builtin (CODE_FOR_spe_evstdhx, arglist);
a3170dc6 6940 case SPE_BUILTIN_EVSTDWX:
61bea3b0 6941 return spe_expand_stv_builtin (CODE_FOR_spe_evstdwx, arglist);
a3170dc6 6942 case SPE_BUILTIN_EVSTWHEX:
61bea3b0 6943 return spe_expand_stv_builtin (CODE_FOR_spe_evstwhex, arglist);
a3170dc6 6944 case SPE_BUILTIN_EVSTWHOX:
61bea3b0 6945 return spe_expand_stv_builtin (CODE_FOR_spe_evstwhox, arglist);
a3170dc6 6946 case SPE_BUILTIN_EVSTWWEX:
61bea3b0 6947 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwex, arglist);
a3170dc6 6948 case SPE_BUILTIN_EVSTWWOX:
61bea3b0 6949 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwox, arglist);
a3170dc6 6950 case SPE_BUILTIN_EVSTDD:
61bea3b0 6951 return spe_expand_stv_builtin (CODE_FOR_spe_evstdd, arglist);
a3170dc6 6952 case SPE_BUILTIN_EVSTDH:
61bea3b0 6953 return spe_expand_stv_builtin (CODE_FOR_spe_evstdh, arglist);
a3170dc6 6954 case SPE_BUILTIN_EVSTDW:
61bea3b0 6955 return spe_expand_stv_builtin (CODE_FOR_spe_evstdw, arglist);
a3170dc6 6956 case SPE_BUILTIN_EVSTWHE:
61bea3b0 6957 return spe_expand_stv_builtin (CODE_FOR_spe_evstwhe, arglist);
a3170dc6 6958 case SPE_BUILTIN_EVSTWHO:
61bea3b0 6959 return spe_expand_stv_builtin (CODE_FOR_spe_evstwho, arglist);
a3170dc6 6960 case SPE_BUILTIN_EVSTWWE:
61bea3b0 6961 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwe, arglist);
a3170dc6 6962 case SPE_BUILTIN_EVSTWWO:
61bea3b0 6963 return spe_expand_stv_builtin (CODE_FOR_spe_evstwwo, arglist);
a3170dc6
AH
6964 case SPE_BUILTIN_MFSPEFSCR:
6965 icode = CODE_FOR_spe_mfspefscr;
6966 tmode = insn_data[icode].operand[0].mode;
6967
6968 if (target == 0
6969 || GET_MODE (target) != tmode
6970 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
6971 target = gen_reg_rtx (tmode);
6972
6973 pat = GEN_FCN (icode) (target);
6974 if (! pat)
6975 return 0;
6976 emit_insn (pat);
6977 return target;
6978 case SPE_BUILTIN_MTSPEFSCR:
6979 icode = CODE_FOR_spe_mtspefscr;
6980 arg0 = TREE_VALUE (arglist);
6981 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
6982 mode0 = insn_data[icode].operand[0].mode;
6983
6984 if (arg0 == error_mark_node)
6985 return const0_rtx;
6986
6987 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
6988 op0 = copy_to_mode_reg (mode0, op0);
6989
6990 pat = GEN_FCN (icode) (op0);
6991 if (pat)
6992 emit_insn (pat);
6993 return NULL_RTX;
6994 default:
6995 break;
6996 }
6997
6998 *expandedp = false;
6999 return NULL_RTX;
7000}
7001
7002static rtx
a2369ed3 7003spe_expand_predicate_builtin (enum insn_code icode, tree arglist, rtx target)
a3170dc6
AH
7004{
7005 rtx pat, scratch, tmp;
7006 tree form = TREE_VALUE (arglist);
7007 tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
7008 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7009 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
7010 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
7011 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7012 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
7013 int form_int;
7014 enum rtx_code code;
7015
7016 if (TREE_CODE (form) != INTEGER_CST)
7017 {
7018 error ("argument 1 of __builtin_spe_predicate must be a constant");
7019 return const0_rtx;
7020 }
7021 else
7022 form_int = TREE_INT_CST_LOW (form);
7023
7024 if (mode0 != mode1)
7025 abort ();
7026
7027 if (arg0 == error_mark_node || arg1 == error_mark_node)
7028 return const0_rtx;
7029
7030 if (target == 0
7031 || GET_MODE (target) != SImode
7032 || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
7033 target = gen_reg_rtx (SImode);
7034
7035 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7036 op0 = copy_to_mode_reg (mode0, op0);
7037 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
7038 op1 = copy_to_mode_reg (mode1, op1);
7039
7040 scratch = gen_reg_rtx (CCmode);
7041
7042 pat = GEN_FCN (icode) (scratch, op0, op1);
7043 if (! pat)
7044 return const0_rtx;
7045 emit_insn (pat);
7046
7047 /* There are 4 variants for each predicate: _any_, _all_, _upper_,
7048 _lower_. We use one compare, but look in different bits of the
7049 CR for each variant.
7050
7051 There are 2 elements in each SPE simd type (upper/lower). The CR
7052 bits are set as follows:
7053
7054 BIT0 | BIT 1 | BIT 2 | BIT 3
7055 U | L | (U | L) | (U & L)
7056
7057 So, for an "all" relationship, BIT 3 would be set.
7058 For an "any" relationship, BIT 2 would be set. Etc.
7059
7060 Following traditional nomenclature, these bits map to:
7061
7062 BIT0 | BIT 1 | BIT 2 | BIT 3
7063 LT | GT | EQ | OV
7064
7065 Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
7066 */
7067
7068 switch (form_int)
7069 {
7070 /* All variant. OV bit. */
7071 case 0:
7072 /* We need to get to the OV bit, which is the ORDERED bit. We
7073 could generate (ordered:SI (reg:CC xx) (const_int 0)), but
7074 that's ugly and will trigger a validate_condition_mode abort.
7075 So let's just use another pattern. */
7076 emit_insn (gen_move_from_CR_ov_bit (target, scratch));
7077 return target;
7078 /* Any variant. EQ bit. */
7079 case 1:
7080 code = EQ;
7081 break;
7082 /* Upper variant. LT bit. */
7083 case 2:
7084 code = LT;
7085 break;
7086 /* Lower variant. GT bit. */
7087 case 3:
7088 code = GT;
7089 break;
7090 default:
7091 error ("argument 1 of __builtin_spe_predicate is out of range");
7092 return const0_rtx;
7093 }
7094
7095 tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
7096 emit_move_insn (target, tmp);
7097
7098 return target;
7099}
7100
7101/* The evsel builtins look like this:
7102
7103 e = __builtin_spe_evsel_OP (a, b, c, d);
7104
7105 and work like this:
7106
7107 e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
7108 e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
7109*/
7110
7111static rtx
a2369ed3 7112spe_expand_evsel_builtin (enum insn_code icode, tree arglist, rtx target)
a3170dc6
AH
7113{
7114 rtx pat, scratch;
7115 tree arg0 = TREE_VALUE (arglist);
7116 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
7117 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
7118 tree arg3 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist))));
7119 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
7120 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
7121 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
7122 rtx op3 = expand_expr (arg3, NULL_RTX, VOIDmode, 0);
7123 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
7124 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
7125
7126 if (mode0 != mode1)
7127 abort ();
7128
7129 if (arg0 == error_mark_node || arg1 == error_mark_node
7130 || arg2 == error_mark_node || arg3 == error_mark_node)
7131 return const0_rtx;
7132
7133 if (target == 0
7134 || GET_MODE (target) != mode0
7135 || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
7136 target = gen_reg_rtx (mode0);
7137
7138 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
7139 op0 = copy_to_mode_reg (mode0, op0);
7140 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
7141 op1 = copy_to_mode_reg (mode0, op1);
7142 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
7143 op2 = copy_to_mode_reg (mode0, op2);
7144 if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
7145 op3 = copy_to_mode_reg (mode0, op3);
7146
7147 /* Generate the compare. */
7148 scratch = gen_reg_rtx (CCmode);
7149 pat = GEN_FCN (icode) (scratch, op0, op1);
7150 if (! pat)
7151 return const0_rtx;
7152 emit_insn (pat);
7153
7154 if (mode0 == V2SImode)
7155 emit_insn (gen_spe_evsel (target, op2, op3, scratch));
7156 else
7157 emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
7158
7159 return target;
7160}
7161
0ac081f6
AH
7162/* Expand an expression EXP that calls a built-in function,
7163 with result going to TARGET if that's convenient
7164 (and in mode MODE if that's convenient).
7165 SUBTARGET may be used as the target for computing one of EXP's operands.
7166 IGNORE is nonzero if the value is to be ignored. */
7167
7168static rtx
a2369ed3
DJ
7169rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
7170 enum machine_mode mode ATTRIBUTE_UNUSED,
7171 int ignore ATTRIBUTE_UNUSED)
0ac081f6 7172{
92898235
AH
7173 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7174 tree arglist = TREE_OPERAND (exp, 1);
7175 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
7176 struct builtin_description *d;
7177 size_t i;
7178 rtx ret;
7179 bool success;
7180
0ac081f6 7181 if (TARGET_ALTIVEC)
92898235
AH
7182 {
7183 ret = altivec_expand_builtin (exp, target, &success);
7184
a3170dc6
AH
7185 if (success)
7186 return ret;
7187 }
7188 if (TARGET_SPE)
7189 {
7190 ret = spe_expand_builtin (exp, target, &success);
7191
92898235
AH
7192 if (success)
7193 return ret;
7194 }
7195
0559cc77
DE
7196 if (TARGET_ALTIVEC || TARGET_SPE)
7197 {
7198 /* Handle simple unary operations. */
7199 d = (struct builtin_description *) bdesc_1arg;
7200 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
7201 if (d->code == fcode)
7202 return rs6000_expand_unop_builtin (d->icode, arglist, target);
7203
7204 /* Handle simple binary operations. */
7205 d = (struct builtin_description *) bdesc_2arg;
7206 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
7207 if (d->code == fcode)
7208 return rs6000_expand_binop_builtin (d->icode, arglist, target);
7209
7210 /* Handle simple ternary operations. */
7211 d = (struct builtin_description *) bdesc_3arg;
7212 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
7213 if (d->code == fcode)
7214 return rs6000_expand_ternop_builtin (d->icode, arglist, target);
7215 }
0ac081f6
AH
7216
7217 abort ();
92898235 7218 return NULL_RTX;
0ac081f6
AH
7219}
7220
7c62e993
PB
7221static tree
7222build_opaque_vector_type (tree node, int nunits)
7223{
7224 node = copy_node (node);
7225 TYPE_MAIN_VARIANT (node) = node;
7226 return build_vector_type (node, nunits);
7227}
7228
0ac081f6 7229static void
863d938c 7230rs6000_init_builtins (void)
0ac081f6 7231{
4a5eab38
PB
7232 V2SI_type_node = build_vector_type (intSI_type_node, 2);
7233 V2SF_type_node = build_vector_type (float_type_node, 2);
7234 V4HI_type_node = build_vector_type (intHI_type_node, 4);
7235 V4SI_type_node = build_vector_type (intSI_type_node, 4);
7236 V4SF_type_node = build_vector_type (float_type_node, 4);
7e463bda 7237 V8HI_type_node = build_vector_type (intHI_type_node, 8);
4a5eab38
PB
7238 V16QI_type_node = build_vector_type (intQI_type_node, 16);
7239
7240 unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16);
7241 unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8);
7242 unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4);
7243
7c62e993
PB
7244 opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2);
7245 opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2);
6035d635 7246 opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
3fdaa45a 7247
8bb418a3
ZL
7248 /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...'
7249 types, especially in C++ land. Similarly, 'vector pixel' is distinct from
7250 'vector unsigned short'. */
7251
8dd16ecc
NS
7252 bool_char_type_node = build_distinct_type_copy (unsigned_intQI_type_node);
7253 bool_short_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
7254 bool_int_type_node = build_distinct_type_copy (unsigned_intSI_type_node);
7255 pixel_type_node = build_distinct_type_copy (unsigned_intHI_type_node);
8bb418a3
ZL
7256
7257 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7258 get_identifier ("__bool char"),
7259 bool_char_type_node));
7260 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7261 get_identifier ("__bool short"),
7262 bool_short_type_node));
7263 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7264 get_identifier ("__bool int"),
7265 bool_int_type_node));
7266 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7267 get_identifier ("__pixel"),
7268 pixel_type_node));
7269
4a5eab38
PB
7270 bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
7271 bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
7272 bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
7273 pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
8bb418a3
ZL
7274
7275 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7276 get_identifier ("__vector unsigned char"),
7277 unsigned_V16QI_type_node));
7278 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7279 get_identifier ("__vector signed char"),
7280 V16QI_type_node));
7281 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7282 get_identifier ("__vector __bool char"),
7283 bool_V16QI_type_node));
7284
7285 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7286 get_identifier ("__vector unsigned short"),
7287 unsigned_V8HI_type_node));
7288 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7289 get_identifier ("__vector signed short"),
7290 V8HI_type_node));
7291 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7292 get_identifier ("__vector __bool short"),
7293 bool_V8HI_type_node));
7294
7295 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7296 get_identifier ("__vector unsigned int"),
7297 unsigned_V4SI_type_node));
7298 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7299 get_identifier ("__vector signed int"),
7300 V4SI_type_node));
7301 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7302 get_identifier ("__vector __bool int"),
7303 bool_V4SI_type_node));
7304
7305 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7306 get_identifier ("__vector float"),
7307 V4SF_type_node));
7308 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
7309 get_identifier ("__vector __pixel"),
7310 pixel_V8HI_type_node));
7311
a3170dc6 7312 if (TARGET_SPE)
3fdaa45a 7313 spe_init_builtins ();
0ac081f6
AH
7314 if (TARGET_ALTIVEC)
7315 altivec_init_builtins ();
0559cc77
DE
7316 if (TARGET_ALTIVEC || TARGET_SPE)
7317 rs6000_common_init_builtins ();
0ac081f6
AH
7318}
7319
a3170dc6
AH
7320/* Search through a set of builtins and enable the mask bits.
7321 DESC is an array of builtins.
b6d08ca1 7322 SIZE is the total number of builtins.
a3170dc6
AH
7323 START is the builtin enum at which to start.
7324 END is the builtin enum at which to end. */
0ac081f6 7325static void
a2369ed3
DJ
7326enable_mask_for_builtins (struct builtin_description *desc, int size,
7327 enum rs6000_builtins start,
7328 enum rs6000_builtins end)
a3170dc6
AH
7329{
7330 int i;
7331
7332 for (i = 0; i < size; ++i)
7333 if (desc[i].code == start)
7334 break;
7335
7336 if (i == size)
7337 return;
7338
7339 for (; i < size; ++i)
7340 {
7341 /* Flip all the bits on. */
7342 desc[i].mask = target_flags;
7343 if (desc[i].code == end)
7344 break;
7345 }
7346}
7347
7348static void
863d938c 7349spe_init_builtins (void)
0ac081f6 7350{
a3170dc6
AH
7351 tree endlink = void_list_node;
7352 tree puint_type_node = build_pointer_type (unsigned_type_node);
7353 tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
ae4b4a02 7354 struct builtin_description *d;
0ac081f6
AH
7355 size_t i;
7356
a3170dc6
AH
7357 tree v2si_ftype_4_v2si
7358 = build_function_type
3fdaa45a
AH
7359 (opaque_V2SI_type_node,
7360 tree_cons (NULL_TREE, opaque_V2SI_type_node,
7361 tree_cons (NULL_TREE, opaque_V2SI_type_node,
7362 tree_cons (NULL_TREE, opaque_V2SI_type_node,
7363 tree_cons (NULL_TREE, opaque_V2SI_type_node,
a3170dc6
AH
7364 endlink)))));
7365
7366 tree v2sf_ftype_4_v2sf
7367 = build_function_type
3fdaa45a
AH
7368 (opaque_V2SF_type_node,
7369 tree_cons (NULL_TREE, opaque_V2SF_type_node,
7370 tree_cons (NULL_TREE, opaque_V2SF_type_node,
7371 tree_cons (NULL_TREE, opaque_V2SF_type_node,
7372 tree_cons (NULL_TREE, opaque_V2SF_type_node,
a3170dc6
AH
7373 endlink)))));
7374
7375 tree int_ftype_int_v2si_v2si
7376 = build_function_type
7377 (integer_type_node,
7378 tree_cons (NULL_TREE, integer_type_node,
3fdaa45a
AH
7379 tree_cons (NULL_TREE, opaque_V2SI_type_node,
7380 tree_cons (NULL_TREE, opaque_V2SI_type_node,
a3170dc6
AH
7381 endlink))));
7382
7383 tree int_ftype_int_v2sf_v2sf
7384 = build_function_type
7385 (integer_type_node,
7386 tree_cons (NULL_TREE, integer_type_node,
3fdaa45a
AH
7387 tree_cons (NULL_TREE, opaque_V2SF_type_node,
7388 tree_cons (NULL_TREE, opaque_V2SF_type_node,
a3170dc6
AH
7389 endlink))));
7390
7391 tree void_ftype_v2si_puint_int
7392 = build_function_type (void_type_node,
3fdaa45a 7393 tree_cons (NULL_TREE, opaque_V2SI_type_node,
a3170dc6
AH
7394 tree_cons (NULL_TREE, puint_type_node,
7395 tree_cons (NULL_TREE,
7396 integer_type_node,
7397 endlink))));
7398
7399 tree void_ftype_v2si_puint_char
7400 = build_function_type (void_type_node,
3fdaa45a 7401 tree_cons (NULL_TREE, opaque_V2SI_type_node,
a3170dc6
AH
7402 tree_cons (NULL_TREE, puint_type_node,
7403 tree_cons (NULL_TREE,
7404 char_type_node,
7405 endlink))));
7406
7407 tree void_ftype_v2si_pv2si_int
7408 = build_function_type (void_type_node,
3fdaa45a 7409 tree_cons (NULL_TREE, opaque_V2SI_type_node,
6035d635 7410 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
a3170dc6
AH
7411 tree_cons (NULL_TREE,
7412 integer_type_node,
7413 endlink))));
7414
7415 tree void_ftype_v2si_pv2si_char
7416 = build_function_type (void_type_node,
3fdaa45a 7417 tree_cons (NULL_TREE, opaque_V2SI_type_node,
6035d635 7418 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
a3170dc6
AH
7419 tree_cons (NULL_TREE,
7420 char_type_node,
7421 endlink))));
7422
7423 tree void_ftype_int
7424 = build_function_type (void_type_node,
7425 tree_cons (NULL_TREE, integer_type_node, endlink));
7426
7427 tree int_ftype_void
36e8d515 7428 = build_function_type (integer_type_node, endlink);
a3170dc6
AH
7429
7430 tree v2si_ftype_pv2si_int
3fdaa45a 7431 = build_function_type (opaque_V2SI_type_node,
6035d635 7432 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
a3170dc6
AH
7433 tree_cons (NULL_TREE, integer_type_node,
7434 endlink)));
7435
7436 tree v2si_ftype_puint_int
3fdaa45a 7437 = build_function_type (opaque_V2SI_type_node,
a3170dc6
AH
7438 tree_cons (NULL_TREE, puint_type_node,
7439 tree_cons (NULL_TREE, integer_type_node,
7440 endlink)));
7441
7442 tree v2si_ftype_pushort_int
3fdaa45a 7443 = build_function_type (opaque_V2SI_type_node,
a3170dc6
AH
7444 tree_cons (NULL_TREE, pushort_type_node,
7445 tree_cons (NULL_TREE, integer_type_node,
7446 endlink)));
7447
00332c9f
AH
7448 tree v2si_ftype_signed_char
7449 = build_function_type (opaque_V2SI_type_node,
7450 tree_cons (NULL_TREE, signed_char_type_node,
7451 endlink));
7452
a3170dc6
AH
7453 /* The initialization of the simple binary and unary builtins is
7454 done in rs6000_common_init_builtins, but we have to enable the
7455 mask bits here manually because we have run out of `target_flags'
7456 bits. We really need to redesign this mask business. */
7457
7458 enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
7459 ARRAY_SIZE (bdesc_2arg),
7460 SPE_BUILTIN_EVADDW,
7461 SPE_BUILTIN_EVXOR);
7462 enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
7463 ARRAY_SIZE (bdesc_1arg),
7464 SPE_BUILTIN_EVABS,
7465 SPE_BUILTIN_EVSUBFUSIAAW);
7466 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
7467 ARRAY_SIZE (bdesc_spe_predicates),
7468 SPE_BUILTIN_EVCMPEQ,
7469 SPE_BUILTIN_EVFSTSTLT);
7470 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
7471 ARRAY_SIZE (bdesc_spe_evsel),
7472 SPE_BUILTIN_EVSEL_CMPGTS,
7473 SPE_BUILTIN_EVSEL_FSTSTEQ);
7474
36252949
AH
7475 (*lang_hooks.decls.pushdecl)
7476 (build_decl (TYPE_DECL, get_identifier ("__ev64_opaque__"),
7477 opaque_V2SI_type_node));
7478
a3170dc6
AH
7479 /* Initialize irregular SPE builtins. */
7480
7481 def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
7482 def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
7483 def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
7484 def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
7485 def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
7486 def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
7487 def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
7488 def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
7489 def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
7490 def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
7491 def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
7492 def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
7493 def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
7494 def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
7495 def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
7496 def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
00332c9f
AH
7497 def_builtin (target_flags, "__builtin_spe_evsplatfi", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATFI);
7498 def_builtin (target_flags, "__builtin_spe_evsplati", v2si_ftype_signed_char, SPE_BUILTIN_EVSPLATI);
a3170dc6
AH
7499
7500 /* Loads. */
7501 def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
7502 def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
7503 def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
7504 def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
7505 def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
7506 def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
7507 def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
7508 def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
7509 def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
7510 def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
7511 def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
7512 def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
7513 def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
7514 def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
7515 def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
7516 def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
7517 def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
7518 def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
7519 def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
7520 def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
7521 def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
7522 def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
7523
7524 /* Predicates. */
7525 d = (struct builtin_description *) bdesc_spe_predicates;
7526 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
7527 {
7528 tree type;
7529
7530 switch (insn_data[d->icode].operand[1].mode)
7531 {
7532 case V2SImode:
7533 type = int_ftype_int_v2si_v2si;
7534 break;
7535 case V2SFmode:
7536 type = int_ftype_int_v2sf_v2sf;
7537 break;
7538 default:
7539 abort ();
7540 }
7541
7542 def_builtin (d->mask, d->name, type, d->code);
7543 }
7544
7545 /* Evsel predicates. */
7546 d = (struct builtin_description *) bdesc_spe_evsel;
7547 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
7548 {
7549 tree type;
7550
7551 switch (insn_data[d->icode].operand[1].mode)
7552 {
7553 case V2SImode:
7554 type = v2si_ftype_4_v2si;
7555 break;
7556 case V2SFmode:
7557 type = v2sf_ftype_4_v2sf;
7558 break;
7559 default:
7560 abort ();
7561 }
7562
7563 def_builtin (d->mask, d->name, type, d->code);
7564 }
7565}
7566
7567static void
863d938c 7568altivec_init_builtins (void)
a3170dc6
AH
7569{
7570 struct builtin_description *d;
7571 struct builtin_description_predicates *dp;
7572 size_t i;
7573 tree pfloat_type_node = build_pointer_type (float_type_node);
7574 tree pint_type_node = build_pointer_type (integer_type_node);
7575 tree pshort_type_node = build_pointer_type (short_integer_type_node);
7576 tree pchar_type_node = build_pointer_type (char_type_node);
7577
7578 tree pvoid_type_node = build_pointer_type (void_type_node);
7579
0dbc3651
ZW
7580 tree pcfloat_type_node = build_pointer_type (build_qualified_type (float_type_node, TYPE_QUAL_CONST));
7581 tree pcint_type_node = build_pointer_type (build_qualified_type (integer_type_node, TYPE_QUAL_CONST));
7582 tree pcshort_type_node = build_pointer_type (build_qualified_type (short_integer_type_node, TYPE_QUAL_CONST));
7583 tree pcchar_type_node = build_pointer_type (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
7584
7585 tree pcvoid_type_node = build_pointer_type (build_qualified_type (void_type_node, TYPE_QUAL_CONST));
7586
a3170dc6
AH
7587 tree int_ftype_int_v4si_v4si
7588 = build_function_type_list (integer_type_node,
7589 integer_type_node, V4SI_type_node,
7590 V4SI_type_node, NULL_TREE);
0dbc3651
ZW
7591 tree v4sf_ftype_pcfloat
7592 = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
a3170dc6 7593 tree void_ftype_pfloat_v4sf
b4de2f7d 7594 = build_function_type_list (void_type_node,
a3170dc6 7595 pfloat_type_node, V4SF_type_node, NULL_TREE);
0dbc3651
ZW
7596 tree v4si_ftype_pcint
7597 = build_function_type_list (V4SI_type_node, pcint_type_node, NULL_TREE);
7598 tree void_ftype_pint_v4si
b4de2f7d
AH
7599 = build_function_type_list (void_type_node,
7600 pint_type_node, V4SI_type_node, NULL_TREE);
0dbc3651
ZW
7601 tree v8hi_ftype_pcshort
7602 = build_function_type_list (V8HI_type_node, pcshort_type_node, NULL_TREE);
f18c054f 7603 tree void_ftype_pshort_v8hi
b4de2f7d
AH
7604 = build_function_type_list (void_type_node,
7605 pshort_type_node, V8HI_type_node, NULL_TREE);
0dbc3651
ZW
7606 tree v16qi_ftype_pcchar
7607 = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
f18c054f 7608 tree void_ftype_pchar_v16qi
b4de2f7d
AH
7609 = build_function_type_list (void_type_node,
7610 pchar_type_node, V16QI_type_node, NULL_TREE);
95385cbb 7611 tree void_ftype_v4si
b4de2f7d 7612 = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
a3170dc6
AH
7613 tree v8hi_ftype_void
7614 = build_function_type (V8HI_type_node, void_list_node);
7615 tree void_ftype_void
7616 = build_function_type (void_type_node, void_list_node);
e34b6648
JJ
7617 tree void_ftype_int
7618 = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
0dbc3651 7619
b4a62fa0 7620 tree v16qi_ftype_long_pcvoid
a3170dc6 7621 = build_function_type_list (V16QI_type_node,
b4a62fa0
SB
7622 long_integer_type_node, pcvoid_type_node, NULL_TREE);
7623 tree v8hi_ftype_long_pcvoid
a3170dc6 7624 = build_function_type_list (V8HI_type_node,
b4a62fa0
SB
7625 long_integer_type_node, pcvoid_type_node, NULL_TREE);
7626 tree v4si_ftype_long_pcvoid
a3170dc6 7627 = build_function_type_list (V4SI_type_node,
b4a62fa0 7628 long_integer_type_node, pcvoid_type_node, NULL_TREE);
0dbc3651 7629
b4a62fa0 7630 tree void_ftype_v4si_long_pvoid
b4de2f7d 7631 = build_function_type_list (void_type_node,
b4a62fa0 7632 V4SI_type_node, long_integer_type_node,
b4de2f7d 7633 pvoid_type_node, NULL_TREE);
b4a62fa0 7634 tree void_ftype_v16qi_long_pvoid
b4de2f7d 7635 = build_function_type_list (void_type_node,
b4a62fa0 7636 V16QI_type_node, long_integer_type_node,
b4de2f7d 7637 pvoid_type_node, NULL_TREE);
b4a62fa0 7638 tree void_ftype_v8hi_long_pvoid
b4de2f7d 7639 = build_function_type_list (void_type_node,
b4a62fa0 7640 V8HI_type_node, long_integer_type_node,
b4de2f7d 7641 pvoid_type_node, NULL_TREE);
a3170dc6
AH
7642 tree int_ftype_int_v8hi_v8hi
7643 = build_function_type_list (integer_type_node,
7644 integer_type_node, V8HI_type_node,
7645 V8HI_type_node, NULL_TREE);
7646 tree int_ftype_int_v16qi_v16qi
7647 = build_function_type_list (integer_type_node,
7648 integer_type_node, V16QI_type_node,
7649 V16QI_type_node, NULL_TREE);
7650 tree int_ftype_int_v4sf_v4sf
7651 = build_function_type_list (integer_type_node,
7652 integer_type_node, V4SF_type_node,
7653 V4SF_type_node, NULL_TREE);
7654 tree v4si_ftype_v4si
7655 = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
7656 tree v8hi_ftype_v8hi
7657 = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
7658 tree v16qi_ftype_v16qi
7659 = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
7660 tree v4sf_ftype_v4sf
7661 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
8bb418a3 7662 tree void_ftype_pcvoid_int_int
a3170dc6 7663 = build_function_type_list (void_type_node,
0dbc3651 7664 pcvoid_type_node, integer_type_node,
8bb418a3
ZL
7665 integer_type_node, NULL_TREE);
7666 tree int_ftype_pcchar
7667 = build_function_type_list (integer_type_node,
7668 pcchar_type_node, NULL_TREE);
7669
0dbc3651
ZW
7670 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4sf", v4sf_ftype_pcfloat,
7671 ALTIVEC_BUILTIN_LD_INTERNAL_4sf);
7672 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4sf", void_ftype_pfloat_v4sf,
7673 ALTIVEC_BUILTIN_ST_INTERNAL_4sf);
7674 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4si", v4si_ftype_pcint,
7675 ALTIVEC_BUILTIN_LD_INTERNAL_4si);
7676 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4si", void_ftype_pint_v4si,
7677 ALTIVEC_BUILTIN_ST_INTERNAL_4si);
7678 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_8hi", v8hi_ftype_pcshort,
7679 ALTIVEC_BUILTIN_LD_INTERNAL_8hi);
7680 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_8hi", void_ftype_pshort_v8hi,
7681 ALTIVEC_BUILTIN_ST_INTERNAL_8hi);
7682 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_16qi", v16qi_ftype_pcchar,
7683 ALTIVEC_BUILTIN_LD_INTERNAL_16qi);
7684 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_16qi", void_ftype_pchar_v16qi,
7685 ALTIVEC_BUILTIN_ST_INTERNAL_16qi);
a3170dc6
AH
7686 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
7687 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
7688 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
e34b6648 7689 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_int, ALTIVEC_BUILTIN_DSS);
b4a62fa0
SB
7690 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSL);
7691 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVSR);
7692 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEBX);
7693 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEHX);
7694 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVEWX);
7695 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVXL);
7696 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVX);
7697 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVX);
7698 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVEWX);
7699 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_long_pvoid, ALTIVEC_BUILTIN_STVXL);
7700 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVEBX);
7701 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_long_pvoid, ALTIVEC_BUILTIN_STVEHX);
a3170dc6 7702
8bb418a3
ZL
7703 /* See altivec.h for usage of "__builtin_altivec_compiletime_error". */
7704 def_builtin (MASK_ALTIVEC, "__builtin_altivec_compiletime_error", int_ftype_pcchar,
7705 ALTIVEC_BUILTIN_COMPILETIME_ERROR);
7706
a3170dc6
AH
7707 /* Add the DST variants. */
7708 d = (struct builtin_description *) bdesc_dst;
7709 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
8bb418a3 7710 def_builtin (d->mask, d->name, void_ftype_pcvoid_int_int, d->code);
a3170dc6
AH
7711
7712 /* Initialize the predicates. */
7713 dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
7714 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
7715 {
7716 enum machine_mode mode1;
7717 tree type;
7718
7719 mode1 = insn_data[dp->icode].operand[1].mode;
7720
7721 switch (mode1)
7722 {
7723 case V4SImode:
7724 type = int_ftype_int_v4si_v4si;
7725 break;
7726 case V8HImode:
7727 type = int_ftype_int_v8hi_v8hi;
7728 break;
7729 case V16QImode:
7730 type = int_ftype_int_v16qi_v16qi;
7731 break;
7732 case V4SFmode:
7733 type = int_ftype_int_v4sf_v4sf;
7734 break;
7735 default:
7736 abort ();
7737 }
7738
7739 def_builtin (dp->mask, dp->name, type, dp->code);
7740 }
7741
7742 /* Initialize the abs* operators. */
7743 d = (struct builtin_description *) bdesc_abs;
7744 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
7745 {
7746 enum machine_mode mode0;
7747 tree type;
7748
7749 mode0 = insn_data[d->icode].operand[0].mode;
7750
7751 switch (mode0)
7752 {
7753 case V4SImode:
7754 type = v4si_ftype_v4si;
7755 break;
7756 case V8HImode:
7757 type = v8hi_ftype_v8hi;
7758 break;
7759 case V16QImode:
7760 type = v16qi_ftype_v16qi;
7761 break;
7762 case V4SFmode:
7763 type = v4sf_ftype_v4sf;
7764 break;
7765 default:
7766 abort ();
7767 }
7768
7769 def_builtin (d->mask, d->name, type, d->code);
7770 }
7771}
7772
7773static void
863d938c 7774rs6000_common_init_builtins (void)
a3170dc6
AH
7775{
7776 struct builtin_description *d;
7777 size_t i;
7778
7779 tree v4sf_ftype_v4sf_v4sf_v16qi
7780 = build_function_type_list (V4SF_type_node,
7781 V4SF_type_node, V4SF_type_node,
7782 V16QI_type_node, NULL_TREE);
7783 tree v4si_ftype_v4si_v4si_v16qi
7784 = build_function_type_list (V4SI_type_node,
7785 V4SI_type_node, V4SI_type_node,
7786 V16QI_type_node, NULL_TREE);
7787 tree v8hi_ftype_v8hi_v8hi_v16qi
7788 = build_function_type_list (V8HI_type_node,
7789 V8HI_type_node, V8HI_type_node,
7790 V16QI_type_node, NULL_TREE);
7791 tree v16qi_ftype_v16qi_v16qi_v16qi
7792 = build_function_type_list (V16QI_type_node,
7793 V16QI_type_node, V16QI_type_node,
7794 V16QI_type_node, NULL_TREE);
b9e4e5d1
ZL
7795 tree v4si_ftype_int
7796 = build_function_type_list (V4SI_type_node, integer_type_node, NULL_TREE);
7797 tree v8hi_ftype_int
7798 = build_function_type_list (V8HI_type_node, integer_type_node, NULL_TREE);
7799 tree v16qi_ftype_int
7800 = build_function_type_list (V16QI_type_node, integer_type_node, NULL_TREE);
a3170dc6
AH
7801 tree v8hi_ftype_v16qi
7802 = build_function_type_list (V8HI_type_node, V16QI_type_node, NULL_TREE);
7803 tree v4sf_ftype_v4sf
7804 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
7805
7806 tree v2si_ftype_v2si_v2si
2abe3e28
AH
7807 = build_function_type_list (opaque_V2SI_type_node,
7808 opaque_V2SI_type_node,
7809 opaque_V2SI_type_node, NULL_TREE);
a3170dc6
AH
7810
7811 tree v2sf_ftype_v2sf_v2sf
2abe3e28
AH
7812 = build_function_type_list (opaque_V2SF_type_node,
7813 opaque_V2SF_type_node,
7814 opaque_V2SF_type_node, NULL_TREE);
a3170dc6
AH
7815
7816 tree v2si_ftype_int_int
2abe3e28 7817 = build_function_type_list (opaque_V2SI_type_node,
a3170dc6
AH
7818 integer_type_node, integer_type_node,
7819 NULL_TREE);
7820
7821 tree v2si_ftype_v2si
2abe3e28
AH
7822 = build_function_type_list (opaque_V2SI_type_node,
7823 opaque_V2SI_type_node, NULL_TREE);
a3170dc6
AH
7824
7825 tree v2sf_ftype_v2sf
2abe3e28
AH
7826 = build_function_type_list (opaque_V2SF_type_node,
7827 opaque_V2SF_type_node, NULL_TREE);
a3170dc6
AH
7828
7829 tree v2sf_ftype_v2si
2abe3e28
AH
7830 = build_function_type_list (opaque_V2SF_type_node,
7831 opaque_V2SI_type_node, NULL_TREE);
a3170dc6
AH
7832
7833 tree v2si_ftype_v2sf
2abe3e28
AH
7834 = build_function_type_list (opaque_V2SI_type_node,
7835 opaque_V2SF_type_node, NULL_TREE);
a3170dc6
AH
7836
7837 tree v2si_ftype_v2si_char
2abe3e28
AH
7838 = build_function_type_list (opaque_V2SI_type_node,
7839 opaque_V2SI_type_node,
7840 char_type_node, NULL_TREE);
a3170dc6
AH
7841
7842 tree v2si_ftype_int_char
2abe3e28 7843 = build_function_type_list (opaque_V2SI_type_node,
a3170dc6
AH
7844 integer_type_node, char_type_node, NULL_TREE);
7845
7846 tree v2si_ftype_char
2abe3e28
AH
7847 = build_function_type_list (opaque_V2SI_type_node,
7848 char_type_node, NULL_TREE);
a3170dc6
AH
7849
7850 tree int_ftype_int_int
7851 = build_function_type_list (integer_type_node,
7852 integer_type_node, integer_type_node,
7853 NULL_TREE);
95385cbb 7854
0ac081f6 7855 tree v4si_ftype_v4si_v4si
b4de2f7d
AH
7856 = build_function_type_list (V4SI_type_node,
7857 V4SI_type_node, V4SI_type_node, NULL_TREE);
b9e4e5d1 7858 tree v4sf_ftype_v4si_int
b4de2f7d 7859 = build_function_type_list (V4SF_type_node,
b9e4e5d1
ZL
7860 V4SI_type_node, integer_type_node, NULL_TREE);
7861 tree v4si_ftype_v4sf_int
b4de2f7d 7862 = build_function_type_list (V4SI_type_node,
b9e4e5d1
ZL
7863 V4SF_type_node, integer_type_node, NULL_TREE);
7864 tree v4si_ftype_v4si_int
b4de2f7d 7865 = build_function_type_list (V4SI_type_node,
b9e4e5d1
ZL
7866 V4SI_type_node, integer_type_node, NULL_TREE);
7867 tree v8hi_ftype_v8hi_int
b4de2f7d 7868 = build_function_type_list (V8HI_type_node,
b9e4e5d1
ZL
7869 V8HI_type_node, integer_type_node, NULL_TREE);
7870 tree v16qi_ftype_v16qi_int
b4de2f7d 7871 = build_function_type_list (V16QI_type_node,
b9e4e5d1
ZL
7872 V16QI_type_node, integer_type_node, NULL_TREE);
7873 tree v16qi_ftype_v16qi_v16qi_int
b4de2f7d
AH
7874 = build_function_type_list (V16QI_type_node,
7875 V16QI_type_node, V16QI_type_node,
b9e4e5d1
ZL
7876 integer_type_node, NULL_TREE);
7877 tree v8hi_ftype_v8hi_v8hi_int
b4de2f7d
AH
7878 = build_function_type_list (V8HI_type_node,
7879 V8HI_type_node, V8HI_type_node,
b9e4e5d1
ZL
7880 integer_type_node, NULL_TREE);
7881 tree v4si_ftype_v4si_v4si_int
b4de2f7d
AH
7882 = build_function_type_list (V4SI_type_node,
7883 V4SI_type_node, V4SI_type_node,
b9e4e5d1
ZL
7884 integer_type_node, NULL_TREE);
7885 tree v4sf_ftype_v4sf_v4sf_int
b4de2f7d
AH
7886 = build_function_type_list (V4SF_type_node,
7887 V4SF_type_node, V4SF_type_node,
b9e4e5d1 7888 integer_type_node, NULL_TREE);
0ac081f6 7889 tree v4sf_ftype_v4sf_v4sf
b4de2f7d
AH
7890 = build_function_type_list (V4SF_type_node,
7891 V4SF_type_node, V4SF_type_node, NULL_TREE);
617e0e1d 7892 tree v4sf_ftype_v4sf_v4sf_v4si
b4de2f7d
AH
7893 = build_function_type_list (V4SF_type_node,
7894 V4SF_type_node, V4SF_type_node,
7895 V4SI_type_node, NULL_TREE);
2212663f 7896 tree v4sf_ftype_v4sf_v4sf_v4sf
b4de2f7d
AH
7897 = build_function_type_list (V4SF_type_node,
7898 V4SF_type_node, V4SF_type_node,
7899 V4SF_type_node, NULL_TREE);
617e0e1d 7900 tree v4si_ftype_v4si_v4si_v4si
b4de2f7d
AH
7901 = build_function_type_list (V4SI_type_node,
7902 V4SI_type_node, V4SI_type_node,
7903 V4SI_type_node, NULL_TREE);
0ac081f6 7904 tree v8hi_ftype_v8hi_v8hi
b4de2f7d
AH
7905 = build_function_type_list (V8HI_type_node,
7906 V8HI_type_node, V8HI_type_node, NULL_TREE);
2212663f 7907 tree v8hi_ftype_v8hi_v8hi_v8hi
b4de2f7d
AH
7908 = build_function_type_list (V8HI_type_node,
7909 V8HI_type_node, V8HI_type_node,
7910 V8HI_type_node, NULL_TREE);
2212663f 7911 tree v4si_ftype_v8hi_v8hi_v4si
b4de2f7d
AH
7912 = build_function_type_list (V4SI_type_node,
7913 V8HI_type_node, V8HI_type_node,
7914 V4SI_type_node, NULL_TREE);
2212663f 7915 tree v4si_ftype_v16qi_v16qi_v4si
b4de2f7d
AH
7916 = build_function_type_list (V4SI_type_node,
7917 V16QI_type_node, V16QI_type_node,
7918 V4SI_type_node, NULL_TREE);
0ac081f6 7919 tree v16qi_ftype_v16qi_v16qi
b4de2f7d
AH
7920 = build_function_type_list (V16QI_type_node,
7921 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 7922 tree v4si_ftype_v4sf_v4sf
b4de2f7d
AH
7923 = build_function_type_list (V4SI_type_node,
7924 V4SF_type_node, V4SF_type_node, NULL_TREE);
0ac081f6 7925 tree v8hi_ftype_v16qi_v16qi
b4de2f7d
AH
7926 = build_function_type_list (V8HI_type_node,
7927 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 7928 tree v4si_ftype_v8hi_v8hi
b4de2f7d
AH
7929 = build_function_type_list (V4SI_type_node,
7930 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 7931 tree v8hi_ftype_v4si_v4si
b4de2f7d
AH
7932 = build_function_type_list (V8HI_type_node,
7933 V4SI_type_node, V4SI_type_node, NULL_TREE);
0ac081f6 7934 tree v16qi_ftype_v8hi_v8hi
b4de2f7d
AH
7935 = build_function_type_list (V16QI_type_node,
7936 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 7937 tree v4si_ftype_v16qi_v4si
b4de2f7d
AH
7938 = build_function_type_list (V4SI_type_node,
7939 V16QI_type_node, V4SI_type_node, NULL_TREE);
fa066a23 7940 tree v4si_ftype_v16qi_v16qi
b4de2f7d
AH
7941 = build_function_type_list (V4SI_type_node,
7942 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 7943 tree v4si_ftype_v8hi_v4si
b4de2f7d
AH
7944 = build_function_type_list (V4SI_type_node,
7945 V8HI_type_node, V4SI_type_node, NULL_TREE);
a3170dc6
AH
7946 tree v4si_ftype_v8hi
7947 = build_function_type_list (V4SI_type_node, V8HI_type_node, NULL_TREE);
7948 tree int_ftype_v4si_v4si
7949 = build_function_type_list (integer_type_node,
7950 V4SI_type_node, V4SI_type_node, NULL_TREE);
7951 tree int_ftype_v4sf_v4sf
7952 = build_function_type_list (integer_type_node,
7953 V4SF_type_node, V4SF_type_node, NULL_TREE);
7954 tree int_ftype_v16qi_v16qi
7955 = build_function_type_list (integer_type_node,
7956 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 7957 tree int_ftype_v8hi_v8hi
b4de2f7d
AH
7958 = build_function_type_list (integer_type_node,
7959 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 7960
6f317ef3 7961 /* Add the simple ternary operators. */
2212663f 7962 d = (struct builtin_description *) bdesc_3arg;
ca7558fc 7963 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
2212663f
DB
7964 {
7965
7966 enum machine_mode mode0, mode1, mode2, mode3;
7967 tree type;
7968
0559cc77 7969 if (d->name == 0 || d->icode == CODE_FOR_nothing)
2212663f
DB
7970 continue;
7971
7972 mode0 = insn_data[d->icode].operand[0].mode;
7973 mode1 = insn_data[d->icode].operand[1].mode;
7974 mode2 = insn_data[d->icode].operand[2].mode;
7975 mode3 = insn_data[d->icode].operand[3].mode;
7976
7977 /* When all four are of the same mode. */
7978 if (mode0 == mode1 && mode1 == mode2 && mode2 == mode3)
7979 {
7980 switch (mode0)
7981 {
617e0e1d
DB
7982 case V4SImode:
7983 type = v4si_ftype_v4si_v4si_v4si;
7984 break;
2212663f
DB
7985 case V4SFmode:
7986 type = v4sf_ftype_v4sf_v4sf_v4sf;
7987 break;
7988 case V8HImode:
7989 type = v8hi_ftype_v8hi_v8hi_v8hi;
7990 break;
7991 case V16QImode:
7992 type = v16qi_ftype_v16qi_v16qi_v16qi;
7993 break;
7994 default:
7995 abort();
7996 }
7997 }
7998 else if (mode0 == mode1 && mode1 == mode2 && mode3 == V16QImode)
7999 {
8000 switch (mode0)
8001 {
8002 case V4SImode:
8003 type = v4si_ftype_v4si_v4si_v16qi;
8004 break;
8005 case V4SFmode:
8006 type = v4sf_ftype_v4sf_v4sf_v16qi;
8007 break;
8008 case V8HImode:
8009 type = v8hi_ftype_v8hi_v8hi_v16qi;
8010 break;
8011 case V16QImode:
8012 type = v16qi_ftype_v16qi_v16qi_v16qi;
8013 break;
8014 default:
8015 abort();
8016 }
8017 }
8018 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode
8019 && mode3 == V4SImode)
24408032 8020 type = v4si_ftype_v16qi_v16qi_v4si;
2212663f
DB
8021 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode
8022 && mode3 == V4SImode)
24408032 8023 type = v4si_ftype_v8hi_v8hi_v4si;
617e0e1d
DB
8024 else if (mode0 == V4SFmode && mode1 == V4SFmode && mode2 == V4SFmode
8025 && mode3 == V4SImode)
24408032
AH
8026 type = v4sf_ftype_v4sf_v4sf_v4si;
8027
8028 /* vchar, vchar, vchar, 4 bit literal. */
8029 else if (mode0 == V16QImode && mode1 == mode0 && mode2 == mode0
8030 && mode3 == QImode)
b9e4e5d1 8031 type = v16qi_ftype_v16qi_v16qi_int;
24408032
AH
8032
8033 /* vshort, vshort, vshort, 4 bit literal. */
8034 else if (mode0 == V8HImode && mode1 == mode0 && mode2 == mode0
8035 && mode3 == QImode)
b9e4e5d1 8036 type = v8hi_ftype_v8hi_v8hi_int;
24408032
AH
8037
8038 /* vint, vint, vint, 4 bit literal. */
8039 else if (mode0 == V4SImode && mode1 == mode0 && mode2 == mode0
8040 && mode3 == QImode)
b9e4e5d1 8041 type = v4si_ftype_v4si_v4si_int;
24408032
AH
8042
8043 /* vfloat, vfloat, vfloat, 4 bit literal. */
8044 else if (mode0 == V4SFmode && mode1 == mode0 && mode2 == mode0
8045 && mode3 == QImode)
b9e4e5d1 8046 type = v4sf_ftype_v4sf_v4sf_int;
24408032 8047
2212663f
DB
8048 else
8049 abort ();
8050
8051 def_builtin (d->mask, d->name, type, d->code);
8052 }
8053
0ac081f6 8054 /* Add the simple binary operators. */
00b960c7 8055 d = (struct builtin_description *) bdesc_2arg;
ca7558fc 8056 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
0ac081f6
AH
8057 {
8058 enum machine_mode mode0, mode1, mode2;
8059 tree type;
8060
0559cc77 8061 if (d->name == 0 || d->icode == CODE_FOR_nothing)
0ac081f6
AH
8062 continue;
8063
8064 mode0 = insn_data[d->icode].operand[0].mode;
8065 mode1 = insn_data[d->icode].operand[1].mode;
8066 mode2 = insn_data[d->icode].operand[2].mode;
8067
8068 /* When all three operands are of the same mode. */
8069 if (mode0 == mode1 && mode1 == mode2)
8070 {
8071 switch (mode0)
8072 {
8073 case V4SFmode:
8074 type = v4sf_ftype_v4sf_v4sf;
8075 break;
8076 case V4SImode:
8077 type = v4si_ftype_v4si_v4si;
8078 break;
8079 case V16QImode:
8080 type = v16qi_ftype_v16qi_v16qi;
8081 break;
8082 case V8HImode:
8083 type = v8hi_ftype_v8hi_v8hi;
8084 break;
a3170dc6
AH
8085 case V2SImode:
8086 type = v2si_ftype_v2si_v2si;
8087 break;
8088 case V2SFmode:
8089 type = v2sf_ftype_v2sf_v2sf;
8090 break;
8091 case SImode:
8092 type = int_ftype_int_int;
8093 break;
0ac081f6
AH
8094 default:
8095 abort ();
8096 }
8097 }
8098
8099 /* A few other combos we really don't want to do manually. */
8100
8101 /* vint, vfloat, vfloat. */
8102 else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == V4SFmode)
8103 type = v4si_ftype_v4sf_v4sf;
8104
8105 /* vshort, vchar, vchar. */
8106 else if (mode0 == V8HImode && mode1 == V16QImode && mode2 == V16QImode)
8107 type = v8hi_ftype_v16qi_v16qi;
8108
8109 /* vint, vshort, vshort. */
8110 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode)
8111 type = v4si_ftype_v8hi_v8hi;
8112
8113 /* vshort, vint, vint. */
8114 else if (mode0 == V8HImode && mode1 == V4SImode && mode2 == V4SImode)
8115 type = v8hi_ftype_v4si_v4si;
8116
8117 /* vchar, vshort, vshort. */
8118 else if (mode0 == V16QImode && mode1 == V8HImode && mode2 == V8HImode)
8119 type = v16qi_ftype_v8hi_v8hi;
8120
8121 /* vint, vchar, vint. */
8122 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V4SImode)
8123 type = v4si_ftype_v16qi_v4si;
8124
fa066a23
AH
8125 /* vint, vchar, vchar. */
8126 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode)
8127 type = v4si_ftype_v16qi_v16qi;
8128
0ac081f6
AH
8129 /* vint, vshort, vint. */
8130 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V4SImode)
8131 type = v4si_ftype_v8hi_v4si;
2212663f
DB
8132
8133 /* vint, vint, 5 bit literal. */
8134 else if (mode0 == V4SImode && mode1 == V4SImode && mode2 == QImode)
b9e4e5d1 8135 type = v4si_ftype_v4si_int;
2212663f
DB
8136
8137 /* vshort, vshort, 5 bit literal. */
8138 else if (mode0 == V8HImode && mode1 == V8HImode && mode2 == QImode)
b9e4e5d1 8139 type = v8hi_ftype_v8hi_int;
2212663f
DB
8140
8141 /* vchar, vchar, 5 bit literal. */
8142 else if (mode0 == V16QImode && mode1 == V16QImode && mode2 == QImode)
b9e4e5d1 8143 type = v16qi_ftype_v16qi_int;
0ac081f6 8144
617e0e1d
DB
8145 /* vfloat, vint, 5 bit literal. */
8146 else if (mode0 == V4SFmode && mode1 == V4SImode && mode2 == QImode)
b9e4e5d1 8147 type = v4sf_ftype_v4si_int;
617e0e1d
DB
8148
8149 /* vint, vfloat, 5 bit literal. */
8150 else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == QImode)
b9e4e5d1 8151 type = v4si_ftype_v4sf_int;
617e0e1d 8152
a3170dc6
AH
8153 else if (mode0 == V2SImode && mode1 == SImode && mode2 == SImode)
8154 type = v2si_ftype_int_int;
8155
8156 else if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
8157 type = v2si_ftype_v2si_char;
8158
8159 else if (mode0 == V2SImode && mode1 == SImode && mode2 == QImode)
8160 type = v2si_ftype_int_char;
8161
0ac081f6
AH
8162 /* int, x, x. */
8163 else if (mode0 == SImode)
8164 {
8165 switch (mode1)
8166 {
8167 case V4SImode:
8168 type = int_ftype_v4si_v4si;
8169 break;
8170 case V4SFmode:
8171 type = int_ftype_v4sf_v4sf;
8172 break;
8173 case V16QImode:
8174 type = int_ftype_v16qi_v16qi;
8175 break;
8176 case V8HImode:
8177 type = int_ftype_v8hi_v8hi;
8178 break;
8179 default:
8180 abort ();
8181 }
8182 }
8183
8184 else
8185 abort ();
8186
2212663f
DB
8187 def_builtin (d->mask, d->name, type, d->code);
8188 }
24408032 8189
2212663f
DB
8190 /* Add the simple unary operators. */
8191 d = (struct builtin_description *) bdesc_1arg;
ca7558fc 8192 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
2212663f
DB
8193 {
8194 enum machine_mode mode0, mode1;
8195 tree type;
8196
0559cc77 8197 if (d->name == 0 || d->icode == CODE_FOR_nothing)
2212663f
DB
8198 continue;
8199
8200 mode0 = insn_data[d->icode].operand[0].mode;
8201 mode1 = insn_data[d->icode].operand[1].mode;
8202
8203 if (mode0 == V4SImode && mode1 == QImode)
b9e4e5d1 8204 type = v4si_ftype_int;
2212663f 8205 else if (mode0 == V8HImode && mode1 == QImode)
b9e4e5d1 8206 type = v8hi_ftype_int;
2212663f 8207 else if (mode0 == V16QImode && mode1 == QImode)
b9e4e5d1 8208 type = v16qi_ftype_int;
617e0e1d
DB
8209 else if (mode0 == V4SFmode && mode1 == V4SFmode)
8210 type = v4sf_ftype_v4sf;
20e26713
AH
8211 else if (mode0 == V8HImode && mode1 == V16QImode)
8212 type = v8hi_ftype_v16qi;
8213 else if (mode0 == V4SImode && mode1 == V8HImode)
8214 type = v4si_ftype_v8hi;
a3170dc6
AH
8215 else if (mode0 == V2SImode && mode1 == V2SImode)
8216 type = v2si_ftype_v2si;
8217 else if (mode0 == V2SFmode && mode1 == V2SFmode)
8218 type = v2sf_ftype_v2sf;
8219 else if (mode0 == V2SFmode && mode1 == V2SImode)
8220 type = v2sf_ftype_v2si;
8221 else if (mode0 == V2SImode && mode1 == V2SFmode)
8222 type = v2si_ftype_v2sf;
8223 else if (mode0 == V2SImode && mode1 == QImode)
8224 type = v2si_ftype_char;
2212663f
DB
8225 else
8226 abort ();
8227
0ac081f6
AH
8228 def_builtin (d->mask, d->name, type, d->code);
8229 }
8230}
8231
c15c90bb
ZW
8232static void
8233rs6000_init_libfuncs (void)
8234{
8235 if (!TARGET_HARD_FLOAT)
8236 return;
8237
c9034561 8238 if (DEFAULT_ABI != ABI_V4)
c15c90bb 8239 {
c9034561 8240 if (TARGET_XCOFF && ! TARGET_POWER2 && ! TARGET_POWERPC)
c15c90bb 8241 {
c9034561 8242 /* AIX library routines for float->int conversion. */
85363ca0
ZW
8243 set_conv_libfunc (sfix_optab, SImode, DFmode, "__itrunc");
8244 set_conv_libfunc (ufix_optab, SImode, DFmode, "__uitrunc");
4274207b
DE
8245 set_conv_libfunc (sfix_optab, SImode, TFmode, "_qitrunc");
8246 set_conv_libfunc (ufix_optab, SImode, TFmode, "_quitrunc");
c15c90bb
ZW
8247 }
8248
c9034561 8249 /* Standard AIX/Darwin/64-bit SVR4 quad floating point routines. */
c15c90bb
ZW
8250 set_optab_libfunc (add_optab, TFmode, "_xlqadd");
8251 set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
8252 set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
8253 set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
8254 }
c9034561 8255 else
c15c90bb 8256 {
c9034561 8257 /* 32-bit SVR4 quad floating point routines. */
c15c90bb
ZW
8258
8259 set_optab_libfunc (add_optab, TFmode, "_q_add");
8260 set_optab_libfunc (sub_optab, TFmode, "_q_sub");
8261 set_optab_libfunc (neg_optab, TFmode, "_q_neg");
8262 set_optab_libfunc (smul_optab, TFmode, "_q_mul");
8263 set_optab_libfunc (sdiv_optab, TFmode, "_q_div");
8264 if (TARGET_PPC_GPOPT || TARGET_POWER2)
8265 set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
8266
c9034561
ZW
8267 set_optab_libfunc (eq_optab, TFmode, "_q_feq");
8268 set_optab_libfunc (ne_optab, TFmode, "_q_fne");
8269 set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
8270 set_optab_libfunc (ge_optab, TFmode, "_q_fge");
8271 set_optab_libfunc (lt_optab, TFmode, "_q_flt");
8272 set_optab_libfunc (le_optab, TFmode, "_q_fle");
8273
85363ca0
ZW
8274 set_conv_libfunc (sext_optab, TFmode, SFmode, "_q_stoq");
8275 set_conv_libfunc (sext_optab, TFmode, DFmode, "_q_dtoq");
8276 set_conv_libfunc (trunc_optab, SFmode, TFmode, "_q_qtos");
8277 set_conv_libfunc (trunc_optab, DFmode, TFmode, "_q_qtod");
8278 set_conv_libfunc (sfix_optab, SImode, TFmode, "_q_qtoi");
8279 set_conv_libfunc (ufix_optab, SImode, TFmode, "_q_qtou");
8280 set_conv_libfunc (sfloat_optab, TFmode, SImode, "_q_itoq");
c15c90bb
ZW
8281 }
8282}
fba73eb1
DE
8283
8284\f
8285/* Expand a block clear operation, and return 1 if successful. Return 0
8286 if we should let the compiler generate normal code.
8287
8288 operands[0] is the destination
8289 operands[1] is the length
8290 operands[2] is the alignment */
8291
8292int
8293expand_block_clear (rtx operands[])
8294{
8295 rtx orig_dest = operands[0];
8296 rtx bytes_rtx = operands[1];
8297 rtx align_rtx = operands[2];
8298 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
8299 int align;
8300 int bytes;
8301 int offset;
8302 int clear_bytes;
8303
8304 /* If this is not a fixed size move, just call memcpy */
8305 if (! constp)
8306 return 0;
8307
8308 /* If this is not a fixed size alignment, abort */
8309 if (GET_CODE (align_rtx) != CONST_INT)
8310 abort ();
8311 align = INTVAL (align_rtx) * BITS_PER_UNIT;
8312
8313 /* Anything to clear? */
8314 bytes = INTVAL (bytes_rtx);
8315 if (bytes <= 0)
8316 return 1;
8317
8318 if (bytes > (TARGET_POWERPC64 && align >= 32 ? 64 : 32))
8319 return 0;
8320
8321 if (optimize_size && bytes > 16)
8322 return 0;
8323
8324 for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes)
8325 {
8326 rtx (*mov) (rtx, rtx);
8327 enum machine_mode mode = BLKmode;
8328 rtx dest;
8329
8330 if (bytes >= 8 && TARGET_POWERPC64
8331 /* 64-bit loads and stores require word-aligned
8332 displacements. */
8333 && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
8334 {
8335 clear_bytes = 8;
8336 mode = DImode;
8337 mov = gen_movdi;
8338 }
8339 else if (bytes >= 4 && !STRICT_ALIGNMENT)
8340 { /* move 4 bytes */
8341 clear_bytes = 4;
8342 mode = SImode;
8343 mov = gen_movsi;
8344 }
8345 else if (bytes == 2 && !STRICT_ALIGNMENT)
8346 { /* move 2 bytes */
8347 clear_bytes = 2;
8348 mode = HImode;
8349 mov = gen_movhi;
8350 }
8351 else /* move 1 byte at a time */
8352 {
8353 clear_bytes = 1;
8354 mode = QImode;
8355 mov = gen_movqi;
8356 }
8357
8358 dest = adjust_address (orig_dest, mode, offset);
8359
8360 emit_insn ((*mov) (dest, const0_rtx));
8361 }
8362
8363 return 1;
8364}
8365
35aff10b 8366\f
7e69e155
MM
8367/* Expand a block move operation, and return 1 if successful. Return 0
8368 if we should let the compiler generate normal code.
8369
8370 operands[0] is the destination
8371 operands[1] is the source
8372 operands[2] is the length
8373 operands[3] is the alignment */
8374
3933e0e1
MM
8375#define MAX_MOVE_REG 4
8376
7e69e155 8377int
a2369ed3 8378expand_block_move (rtx operands[])
7e69e155 8379{
b6c9286a
MM
8380 rtx orig_dest = operands[0];
8381 rtx orig_src = operands[1];
7e69e155 8382 rtx bytes_rtx = operands[2];
7e69e155 8383 rtx align_rtx = operands[3];
3933e0e1 8384 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
5ee95df6 8385 int align;
3933e0e1
MM
8386 int bytes;
8387 int offset;
7e69e155 8388 int move_bytes;
cabfd258
GK
8389 rtx stores[MAX_MOVE_REG];
8390 int num_reg = 0;
7e69e155 8391
3933e0e1 8392 /* If this is not a fixed size move, just call memcpy */
cc0d9ba8 8393 if (! constp)
3933e0e1
MM
8394 return 0;
8395
5ee95df6
FS
8396 /* If this is not a fixed size alignment, abort */
8397 if (GET_CODE (align_rtx) != CONST_INT)
8398 abort ();
fba73eb1 8399 align = INTVAL (align_rtx) * BITS_PER_UNIT;
5ee95df6 8400
7e69e155 8401 /* Anything to move? */
3933e0e1
MM
8402 bytes = INTVAL (bytes_rtx);
8403 if (bytes <= 0)
7e69e155
MM
8404 return 1;
8405
ea9982a8 8406 /* store_one_arg depends on expand_block_move to handle at least the size of
6f317ef3 8407 reg_parm_stack_space. */
ea9982a8 8408 if (bytes > (TARGET_POWERPC64 ? 64 : 32))
7e69e155
MM
8409 return 0;
8410
cabfd258 8411 for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
7e69e155 8412 {
cabfd258 8413 union {
70128ad9 8414 rtx (*movmemsi) (rtx, rtx, rtx, rtx);
a2369ed3 8415 rtx (*mov) (rtx, rtx);
cabfd258
GK
8416 } gen_func;
8417 enum machine_mode mode = BLKmode;
8418 rtx src, dest;
8419
8420 if (TARGET_STRING
8421 && bytes > 24 /* move up to 32 bytes at a time */
8422 && ! fixed_regs[5]
8423 && ! fixed_regs[6]
8424 && ! fixed_regs[7]
8425 && ! fixed_regs[8]
8426 && ! fixed_regs[9]
8427 && ! fixed_regs[10]
8428 && ! fixed_regs[11]
8429 && ! fixed_regs[12])
7e69e155 8430 {
cabfd258 8431 move_bytes = (bytes > 32) ? 32 : bytes;
70128ad9 8432 gen_func.movmemsi = gen_movmemsi_8reg;
cabfd258
GK
8433 }
8434 else if (TARGET_STRING
8435 && bytes > 16 /* move up to 24 bytes at a time */
8436 && ! fixed_regs[5]
8437 && ! fixed_regs[6]
8438 && ! fixed_regs[7]
8439 && ! fixed_regs[8]
8440 && ! fixed_regs[9]
8441 && ! fixed_regs[10])
8442 {
8443 move_bytes = (bytes > 24) ? 24 : bytes;
70128ad9 8444 gen_func.movmemsi = gen_movmemsi_6reg;
cabfd258
GK
8445 }
8446 else if (TARGET_STRING
8447 && bytes > 8 /* move up to 16 bytes at a time */
8448 && ! fixed_regs[5]
8449 && ! fixed_regs[6]
8450 && ! fixed_regs[7]
8451 && ! fixed_regs[8])
8452 {
8453 move_bytes = (bytes > 16) ? 16 : bytes;
70128ad9 8454 gen_func.movmemsi = gen_movmemsi_4reg;
cabfd258
GK
8455 }
8456 else if (bytes >= 8 && TARGET_POWERPC64
8457 /* 64-bit loads and stores require word-aligned
8458 displacements. */
fba73eb1 8459 && (align >= 64 || (!STRICT_ALIGNMENT && align >= 32)))
cabfd258
GK
8460 {
8461 move_bytes = 8;
8462 mode = DImode;
8463 gen_func.mov = gen_movdi;
8464 }
8465 else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
8466 { /* move up to 8 bytes at a time */
8467 move_bytes = (bytes > 8) ? 8 : bytes;
70128ad9 8468 gen_func.movmemsi = gen_movmemsi_2reg;
cabfd258 8469 }
fba73eb1 8470 else if (bytes >= 4 && !STRICT_ALIGNMENT)
cabfd258
GK
8471 { /* move 4 bytes */
8472 move_bytes = 4;
8473 mode = SImode;
8474 gen_func.mov = gen_movsi;
8475 }
fba73eb1 8476 else if (bytes == 2 && !STRICT_ALIGNMENT)
cabfd258
GK
8477 { /* move 2 bytes */
8478 move_bytes = 2;
8479 mode = HImode;
8480 gen_func.mov = gen_movhi;
8481 }
8482 else if (TARGET_STRING && bytes > 1)
8483 { /* move up to 4 bytes at a time */
8484 move_bytes = (bytes > 4) ? 4 : bytes;
70128ad9 8485 gen_func.movmemsi = gen_movmemsi_1reg;
cabfd258
GK
8486 }
8487 else /* move 1 byte at a time */
8488 {
8489 move_bytes = 1;
8490 mode = QImode;
8491 gen_func.mov = gen_movqi;
8492 }
8493
8494 src = adjust_address (orig_src, mode, offset);
8495 dest = adjust_address (orig_dest, mode, offset);
8496
8497 if (mode != BLKmode)
8498 {
8499 rtx tmp_reg = gen_reg_rtx (mode);
8500
8501 emit_insn ((*gen_func.mov) (tmp_reg, src));
8502 stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
4c64a852 8503 }
3933e0e1 8504
cabfd258
GK
8505 if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
8506 {
8507 int i;
8508 for (i = 0; i < num_reg; i++)
8509 emit_insn (stores[i]);
8510 num_reg = 0;
8511 }
35aff10b 8512
cabfd258 8513 if (mode == BLKmode)
7e69e155 8514 {
70128ad9 8515 /* Move the address into scratch registers. The movmemsi
cabfd258
GK
8516 patterns require zero offset. */
8517 if (!REG_P (XEXP (src, 0)))
b6c9286a 8518 {
cabfd258
GK
8519 rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
8520 src = replace_equiv_address (src, src_reg);
b6c9286a 8521 }
cabfd258
GK
8522 set_mem_size (src, GEN_INT (move_bytes));
8523
8524 if (!REG_P (XEXP (dest, 0)))
3933e0e1 8525 {
cabfd258
GK
8526 rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
8527 dest = replace_equiv_address (dest, dest_reg);
7e69e155 8528 }
cabfd258
GK
8529 set_mem_size (dest, GEN_INT (move_bytes));
8530
70128ad9 8531 emit_insn ((*gen_func.movmemsi) (dest, src,
cabfd258
GK
8532 GEN_INT (move_bytes & 31),
8533 align_rtx));
7e69e155 8534 }
7e69e155
MM
8535 }
8536
8537 return 1;
8538}
8539
d62294f5
FJ
8540\f
8541/* Return 1 if OP is suitable for a save_world call in prologue. It is
8542 known to be a PARALLEL. */
8543int
8544save_world_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
8545{
8546 int index;
8547 int i;
8548 rtx elt;
8549 int count = XVECLEN (op, 0);
8550
8551 if (count != 55)
8552 return 0;
8553
8554 index = 0;
8555 if (GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER
8556 || GET_CODE (XVECEXP (op, 0, index++)) != USE)
8557 return 0;
8558
8559 for (i=1; i <= 18; i++)
8560 {
8561 elt = XVECEXP (op, 0, index++);
8562 if (GET_CODE (elt) != SET
8563 || GET_CODE (SET_DEST (elt)) != MEM
8564 || ! memory_operand (SET_DEST (elt), DFmode)
8565 || GET_CODE (SET_SRC (elt)) != REG
8566 || GET_MODE (SET_SRC (elt)) != DFmode)
8567 return 0;
8568 }
8569
8570 for (i=1; i <= 12; i++)
8571 {
8572 elt = XVECEXP (op, 0, index++);
8573 if (GET_CODE (elt) != SET
8574 || GET_CODE (SET_DEST (elt)) != MEM
8575 || GET_CODE (SET_SRC (elt)) != REG
8576 || GET_MODE (SET_SRC (elt)) != V4SImode)
8577 return 0;
8578 }
8579
8580 for (i=1; i <= 19; i++)
8581 {
8582 elt = XVECEXP (op, 0, index++);
8583 if (GET_CODE (elt) != SET
8584 || GET_CODE (SET_DEST (elt)) != MEM
8585 || ! memory_operand (SET_DEST (elt), Pmode)
8586 || GET_CODE (SET_SRC (elt)) != REG
8587 || GET_MODE (SET_SRC (elt)) != Pmode)
8588 return 0;
8589 }
8590
8591 elt = XVECEXP (op, 0, index++);
8592 if (GET_CODE (elt) != SET
8593 || GET_CODE (SET_DEST (elt)) != MEM
8594 || ! memory_operand (SET_DEST (elt), Pmode)
8595 || GET_CODE (SET_SRC (elt)) != REG
8596 || REGNO (SET_SRC (elt)) != CR2_REGNO
8597 || GET_MODE (SET_SRC (elt)) != Pmode)
8598 return 0;
8599
8600 if (GET_CODE (XVECEXP (op, 0, index++)) != USE
8601 || GET_CODE (XVECEXP (op, 0, index++)) != USE
8602 || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER)
8603 return 0;
8604 return 1;
8605}
8606
8607/* Return 1 if OP is suitable for a save_world call in prologue. It is
8608 known to be a PARALLEL. */
8609int
8610restore_world_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
8611{
8612 int index;
8613 int i;
8614 rtx elt;
8615 int count = XVECLEN (op, 0);
8616
8617 if (count != 59)
8618 return 0;
8619
8620 index = 0;
8621 if (GET_CODE (XVECEXP (op, 0, index++)) != RETURN
8622 || GET_CODE (XVECEXP (op, 0, index++)) != USE
8623 || GET_CODE (XVECEXP (op, 0, index++)) != USE
8624 || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER)
8625 return 0;
8626
8627 elt = XVECEXP (op, 0, index++);
8628 if (GET_CODE (elt) != SET
8629 || GET_CODE (SET_SRC (elt)) != MEM
8630 || ! memory_operand (SET_SRC (elt), Pmode)
8631 || GET_CODE (SET_DEST (elt)) != REG
8632 || REGNO (SET_DEST (elt)) != CR2_REGNO
8633 || GET_MODE (SET_DEST (elt)) != Pmode)
8634 return 0;
8635
8636 for (i=1; i <= 19; i++)
8637 {
8638 elt = XVECEXP (op, 0, index++);
8639 if (GET_CODE (elt) != SET
8640 || GET_CODE (SET_SRC (elt)) != MEM
8641 || ! memory_operand (SET_SRC (elt), Pmode)
8642 || GET_CODE (SET_DEST (elt)) != REG
8643 || GET_MODE (SET_DEST (elt)) != Pmode)
8644 return 0;
8645 }
8646
8647 for (i=1; i <= 12; i++)
8648 {
8649 elt = XVECEXP (op, 0, index++);
8650 if (GET_CODE (elt) != SET
8651 || GET_CODE (SET_SRC (elt)) != MEM
8652 || GET_CODE (SET_DEST (elt)) != REG
8653 || GET_MODE (SET_DEST (elt)) != V4SImode)
8654 return 0;
8655 }
8656
8657 for (i=1; i <= 18; i++)
8658 {
8659 elt = XVECEXP (op, 0, index++);
8660 if (GET_CODE (elt) != SET
8661 || GET_CODE (SET_SRC (elt)) != MEM
8662 || ! memory_operand (SET_SRC (elt), DFmode)
8663 || GET_CODE (SET_DEST (elt)) != REG
8664 || GET_MODE (SET_DEST (elt)) != DFmode)
8665 return 0;
8666 }
8667
8668 if (GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER
8669 || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER
8670 || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER
8671 || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER
8672 || GET_CODE (XVECEXP (op, 0, index++)) != USE)
8673 return 0;
8674 return 1;
8675}
8676
9878760c
RK
8677\f
8678/* Return 1 if OP is a load multiple operation. It is known to be a
8679 PARALLEL and the first section will be tested. */
8680
8681int
a2369ed3 8682load_multiple_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
9878760c
RK
8683{
8684 int count = XVECLEN (op, 0);
e2c953b6 8685 unsigned int dest_regno;
9878760c
RK
8686 rtx src_addr;
8687 int i;
8688
8689 /* Perform a quick check so we don't blow up below. */
8690 if (count <= 1
8691 || GET_CODE (XVECEXP (op, 0, 0)) != SET
8692 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
8693 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM)
8694 return 0;
8695
8696 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
8697 src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);
8698
8699 for (i = 1; i < count; i++)
8700 {
8701 rtx elt = XVECEXP (op, 0, i);
8702
8703 if (GET_CODE (elt) != SET
8704 || GET_CODE (SET_DEST (elt)) != REG
8705 || GET_MODE (SET_DEST (elt)) != SImode
8706 || REGNO (SET_DEST (elt)) != dest_regno + i
8707 || GET_CODE (SET_SRC (elt)) != MEM
8708 || GET_MODE (SET_SRC (elt)) != SImode
8709 || GET_CODE (XEXP (SET_SRC (elt), 0)) != PLUS
8710 || ! rtx_equal_p (XEXP (XEXP (SET_SRC (elt), 0), 0), src_addr)
8711 || GET_CODE (XEXP (XEXP (SET_SRC (elt), 0), 1)) != CONST_INT
8712 || INTVAL (XEXP (XEXP (SET_SRC (elt), 0), 1)) != i * 4)
8713 return 0;
8714 }
8715
8716 return 1;
8717}
8718
8719/* Similar, but tests for store multiple. Here, the second vector element
8720 is a CLOBBER. It will be tested later. */
8721
8722int
a2369ed3 8723store_multiple_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
9878760c
RK
8724{
8725 int count = XVECLEN (op, 0) - 1;
e2c953b6 8726 unsigned int src_regno;
9878760c
RK
8727 rtx dest_addr;
8728 int i;
8729
8730 /* Perform a quick check so we don't blow up below. */
8731 if (count <= 1
8732 || GET_CODE (XVECEXP (op, 0, 0)) != SET
8733 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM
8734 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG)
8735 return 0;
8736
8737 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
8738 dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);
8739
8740 for (i = 1; i < count; i++)
8741 {
8742 rtx elt = XVECEXP (op, 0, i + 1);
8743
8744 if (GET_CODE (elt) != SET
8745 || GET_CODE (SET_SRC (elt)) != REG
8746 || GET_MODE (SET_SRC (elt)) != SImode
8747 || REGNO (SET_SRC (elt)) != src_regno + i
8748 || GET_CODE (SET_DEST (elt)) != MEM
8749 || GET_MODE (SET_DEST (elt)) != SImode
8750 || GET_CODE (XEXP (SET_DEST (elt), 0)) != PLUS
8751 || ! rtx_equal_p (XEXP (XEXP (SET_DEST (elt), 0), 0), dest_addr)
8752 || GET_CODE (XEXP (XEXP (SET_DEST (elt), 0), 1)) != CONST_INT
8753 || INTVAL (XEXP (XEXP (SET_DEST (elt), 0), 1)) != i * 4)
8754 return 0;
8755 }
8756
8757 return 1;
8758}
9ebbca7d 8759
9caa3eb2
DE
8760/* Return a string to perform a load_multiple operation.
8761 operands[0] is the vector.
8762 operands[1] is the source address.
8763 operands[2] is the first destination register. */
8764
8765const char *
a2369ed3 8766rs6000_output_load_multiple (rtx operands[3])
9caa3eb2
DE
8767{
8768 /* We have to handle the case where the pseudo used to contain the address
8769 is assigned to one of the output registers. */
8770 int i, j;
8771 int words = XVECLEN (operands[0], 0);
8772 rtx xop[10];
8773
8774 if (XVECLEN (operands[0], 0) == 1)
8775 return "{l|lwz} %2,0(%1)";
8776
8777 for (i = 0; i < words; i++)
8778 if (refers_to_regno_p (REGNO (operands[2]) + i,
8779 REGNO (operands[2]) + i + 1, operands[1], 0))
8780 {
8781 if (i == words-1)
8782 {
8783 xop[0] = GEN_INT (4 * (words-1));
8784 xop[1] = operands[1];
8785 xop[2] = operands[2];
8786 output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
8787 return "";
8788 }
8789 else if (i == 0)
8790 {
8791 xop[0] = GEN_INT (4 * (words-1));
8792 xop[1] = operands[1];
8793 xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
8794 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);
8795 return "";
8796 }
8797 else
8798 {
8799 for (j = 0; j < words; j++)
8800 if (j != i)
8801 {
8802 xop[0] = GEN_INT (j * 4);
8803 xop[1] = operands[1];
8804 xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
8805 output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
8806 }
8807 xop[0] = GEN_INT (i * 4);
8808 xop[1] = operands[1];
8809 output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
8810 return "";
8811 }
8812 }
8813
8814 return "{lsi|lswi} %2,%1,%N0";
8815}
8816
00b960c7
AH
8817/* Return 1 for a parallel vrsave operation. */
8818
8819int
a2369ed3 8820vrsave_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
00b960c7
AH
8821{
8822 int count = XVECLEN (op, 0);
8823 unsigned int dest_regno, src_regno;
8824 int i;
8825
8826 if (count <= 1
8827 || GET_CODE (XVECEXP (op, 0, 0)) != SET
8828 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
a004eb82 8829 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC_VOLATILE)
00b960c7
AH
8830 return 0;
8831
8832 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
8833 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
8834
8835 if (dest_regno != VRSAVE_REGNO
8836 && src_regno != VRSAVE_REGNO)
8837 return 0;
8838
8839 for (i = 1; i < count; i++)
8840 {
8841 rtx elt = XVECEXP (op, 0, i);
8842
9aa86737
AH
8843 if (GET_CODE (elt) != CLOBBER
8844 && GET_CODE (elt) != SET)
00b960c7
AH
8845 return 0;
8846 }
8847
8848 return 1;
8849}
8850
2c4a9cff
DE
8851/* Return 1 for an PARALLEL suitable for mfcr. */
8852
8853int
a2369ed3 8854mfcr_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2c4a9cff
DE
8855{
8856 int count = XVECLEN (op, 0);
8857 int i;
8858
8859 /* Perform a quick check so we don't blow up below. */
8860 if (count < 1
8861 || GET_CODE (XVECEXP (op, 0, 0)) != SET
8862 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC
8863 || XVECLEN (SET_SRC (XVECEXP (op, 0, 0)), 0) != 2)
8864 return 0;
8865
8866 for (i = 0; i < count; i++)
8867 {
8868 rtx exp = XVECEXP (op, 0, i);
8869 rtx unspec;
8870 int maskval;
8871 rtx src_reg;
8872
8873 src_reg = XVECEXP (SET_SRC (exp), 0, 0);
8874
8875 if (GET_CODE (src_reg) != REG
8876 || GET_MODE (src_reg) != CCmode
8877 || ! CR_REGNO_P (REGNO (src_reg)))
8878 return 0;
8879
8880 if (GET_CODE (exp) != SET
8881 || GET_CODE (SET_DEST (exp)) != REG
8882 || GET_MODE (SET_DEST (exp)) != SImode
8883 || ! INT_REGNO_P (REGNO (SET_DEST (exp))))
8884 return 0;
8885 unspec = SET_SRC (exp);
8886 maskval = 1 << (MAX_CR_REGNO - REGNO (src_reg));
8887
8888 if (GET_CODE (unspec) != UNSPEC
8889 || XINT (unspec, 1) != UNSPEC_MOVESI_FROM_CR
8890 || XVECLEN (unspec, 0) != 2
8891 || XVECEXP (unspec, 0, 0) != src_reg
8892 || GET_CODE (XVECEXP (unspec, 0, 1)) != CONST_INT
8893 || INTVAL (XVECEXP (unspec, 0, 1)) != maskval)
8894 return 0;
8895 }
8896 return 1;
8897}
8898
a4f6c312 8899/* Return 1 for an PARALLEL suitable for mtcrf. */
9ebbca7d
GK
8900
8901int
a2369ed3 8902mtcrf_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
9ebbca7d
GK
8903{
8904 int count = XVECLEN (op, 0);
8905 int i;
9ebbca7d
GK
8906 rtx src_reg;
8907
8908 /* Perform a quick check so we don't blow up below. */
e35b9579
GK
8909 if (count < 1
8910 || GET_CODE (XVECEXP (op, 0, 0)) != SET
8911 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC
8912 || XVECLEN (SET_SRC (XVECEXP (op, 0, 0)), 0) != 2)
9ebbca7d 8913 return 0;
e35b9579 8914 src_reg = XVECEXP (SET_SRC (XVECEXP (op, 0, 0)), 0, 0);
9ebbca7d
GK
8915
8916 if (GET_CODE (src_reg) != REG
8917 || GET_MODE (src_reg) != SImode
8918 || ! INT_REGNO_P (REGNO (src_reg)))
8919 return 0;
8920
e35b9579 8921 for (i = 0; i < count; i++)
9ebbca7d
GK
8922 {
8923 rtx exp = XVECEXP (op, 0, i);
8924 rtx unspec;
8925 int maskval;
8926
8927 if (GET_CODE (exp) != SET
8928 || GET_CODE (SET_DEST (exp)) != REG
8929 || GET_MODE (SET_DEST (exp)) != CCmode
8930 || ! CR_REGNO_P (REGNO (SET_DEST (exp))))
8931 return 0;
8932 unspec = SET_SRC (exp);
8933 maskval = 1 << (MAX_CR_REGNO - REGNO (SET_DEST (exp)));
9ebbca7d
GK
8934
8935 if (GET_CODE (unspec) != UNSPEC
615158e2 8936 || XINT (unspec, 1) != UNSPEC_MOVESI_TO_CR
9ebbca7d
GK
8937 || XVECLEN (unspec, 0) != 2
8938 || XVECEXP (unspec, 0, 0) != src_reg
8939 || GET_CODE (XVECEXP (unspec, 0, 1)) != CONST_INT
8940 || INTVAL (XVECEXP (unspec, 0, 1)) != maskval)
8941 return 0;
8942 }
e35b9579 8943 return 1;
9ebbca7d
GK
8944}
8945
a4f6c312 8946/* Return 1 for an PARALLEL suitable for lmw. */
9ebbca7d
GK
8947
8948int
a2369ed3 8949lmw_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
9ebbca7d
GK
8950{
8951 int count = XVECLEN (op, 0);
e2c953b6 8952 unsigned int dest_regno;
9ebbca7d 8953 rtx src_addr;
e2c953b6 8954 unsigned int base_regno;
9ebbca7d
GK
8955 HOST_WIDE_INT offset;
8956 int i;
8957
8958 /* Perform a quick check so we don't blow up below. */
8959 if (count <= 1
8960 || GET_CODE (XVECEXP (op, 0, 0)) != SET
8961 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
8962 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM)
8963 return 0;
8964
8965 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
8966 src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);
8967
8968 if (dest_regno > 31
e2c953b6 8969 || count != 32 - (int) dest_regno)
9ebbca7d
GK
8970 return 0;
8971
4d588c14 8972 if (legitimate_indirect_address_p (src_addr, 0))
9ebbca7d
GK
8973 {
8974 offset = 0;
8975 base_regno = REGNO (src_addr);
8976 if (base_regno == 0)
8977 return 0;
8978 }
76d2b81d 8979 else if (rs6000_legitimate_offset_address_p (SImode, src_addr, 0))
9ebbca7d
GK
8980 {
8981 offset = INTVAL (XEXP (src_addr, 1));
8982 base_regno = REGNO (XEXP (src_addr, 0));
8983 }
8984 else
8985 return 0;
8986
8987 for (i = 0; i < count; i++)
8988 {
8989 rtx elt = XVECEXP (op, 0, i);
8990 rtx newaddr;
8991 rtx addr_reg;
8992 HOST_WIDE_INT newoffset;
8993
8994 if (GET_CODE (elt) != SET
8995 || GET_CODE (SET_DEST (elt)) != REG
8996 || GET_MODE (SET_DEST (elt)) != SImode
8997 || REGNO (SET_DEST (elt)) != dest_regno + i
8998 || GET_CODE (SET_SRC (elt)) != MEM
8999 || GET_MODE (SET_SRC (elt)) != SImode)
9000 return 0;
9001 newaddr = XEXP (SET_SRC (elt), 0);
4d588c14 9002 if (legitimate_indirect_address_p (newaddr, 0))
9ebbca7d
GK
9003 {
9004 newoffset = 0;
9005 addr_reg = newaddr;
9006 }
76d2b81d 9007 else if (rs6000_legitimate_offset_address_p (SImode, newaddr, 0))
9ebbca7d
GK
9008 {
9009 addr_reg = XEXP (newaddr, 0);
9010 newoffset = INTVAL (XEXP (newaddr, 1));
9011 }
9012 else
9013 return 0;
9014 if (REGNO (addr_reg) != base_regno
9015 || newoffset != offset + 4 * i)
9016 return 0;
9017 }
9018
9019 return 1;
9020}
9021
a4f6c312 9022/* Return 1 for an PARALLEL suitable for stmw. */
9ebbca7d
GK
9023
9024int
a2369ed3 9025stmw_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
9ebbca7d
GK
9026{
9027 int count = XVECLEN (op, 0);
e2c953b6 9028 unsigned int src_regno;
9ebbca7d 9029 rtx dest_addr;
e2c953b6 9030 unsigned int base_regno;
9ebbca7d
GK
9031 HOST_WIDE_INT offset;
9032 int i;
9033
9034 /* Perform a quick check so we don't blow up below. */
9035 if (count <= 1
9036 || GET_CODE (XVECEXP (op, 0, 0)) != SET
9037 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM
9038 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG)
9039 return 0;
9040
9041 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
9042 dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);
9043
9044 if (src_regno > 31
e2c953b6 9045 || count != 32 - (int) src_regno)
9ebbca7d
GK
9046 return 0;
9047
4d588c14 9048 if (legitimate_indirect_address_p (dest_addr, 0))
9ebbca7d
GK
9049 {
9050 offset = 0;
9051 base_regno = REGNO (dest_addr);
9052 if (base_regno == 0)
9053 return 0;
9054 }
76d2b81d 9055 else if (rs6000_legitimate_offset_address_p (SImode, dest_addr, 0))
9ebbca7d
GK
9056 {
9057 offset = INTVAL (XEXP (dest_addr, 1));
9058 base_regno = REGNO (XEXP (dest_addr, 0));
9059 }
9060 else
9061 return 0;
9062
9063 for (i = 0; i < count; i++)
9064 {
9065 rtx elt = XVECEXP (op, 0, i);
9066 rtx newaddr;
9067 rtx addr_reg;
9068 HOST_WIDE_INT newoffset;
9069
9070 if (GET_CODE (elt) != SET
9071 || GET_CODE (SET_SRC (elt)) != REG
9072 || GET_MODE (SET_SRC (elt)) != SImode
9073 || REGNO (SET_SRC (elt)) != src_regno + i
9074 || GET_CODE (SET_DEST (elt)) != MEM
9075 || GET_MODE (SET_DEST (elt)) != SImode)
9076 return 0;
9077 newaddr = XEXP (SET_DEST (elt), 0);
4d588c14 9078 if (legitimate_indirect_address_p (newaddr, 0))
9ebbca7d
GK
9079 {
9080 newoffset = 0;
9081 addr_reg = newaddr;
9082 }
76d2b81d 9083 else if (rs6000_legitimate_offset_address_p (SImode, newaddr, 0))
9ebbca7d
GK
9084 {
9085 addr_reg = XEXP (newaddr, 0);
9086 newoffset = INTVAL (XEXP (newaddr, 1));
9087 }
9088 else
9089 return 0;
9090 if (REGNO (addr_reg) != base_regno
9091 || newoffset != offset + 4 * i)
9092 return 0;
9093 }
9094
9095 return 1;
9096}
9878760c 9097\f
a4f6c312
SS
9098/* A validation routine: say whether CODE, a condition code, and MODE
9099 match. The other alternatives either don't make sense or should
9100 never be generated. */
39a10a29 9101
39a10a29 9102static void
a2369ed3 9103validate_condition_mode (enum rtx_code code, enum machine_mode mode)
39a10a29 9104{
ec8e098d
PB
9105 if ((GET_RTX_CLASS (code) != RTX_COMPARE
9106 && GET_RTX_CLASS (code) != RTX_COMM_COMPARE)
39a10a29
GK
9107 || GET_MODE_CLASS (mode) != MODE_CC)
9108 abort ();
9109
9110 /* These don't make sense. */
9111 if ((code == GT || code == LT || code == GE || code == LE)
9112 && mode == CCUNSmode)
9113 abort ();
9114
9115 if ((code == GTU || code == LTU || code == GEU || code == LEU)
9116 && mode != CCUNSmode)
9117 abort ();
9118
9119 if (mode != CCFPmode
9120 && (code == ORDERED || code == UNORDERED
9121 || code == UNEQ || code == LTGT
9122 || code == UNGT || code == UNLT
9123 || code == UNGE || code == UNLE))
a4f6c312 9124 abort ();
39a10a29 9125
de6c5979 9126 /* These should never be generated except for
bc9ec0e0 9127 flag_finite_math_only. */
39a10a29 9128 if (mode == CCFPmode
ad72b533 9129 && ! flag_finite_math_only
39a10a29
GK
9130 && (code == LE || code == GE
9131 || code == UNEQ || code == LTGT
9132 || code == UNGT || code == UNLT))
9133 abort ();
9134
9135 /* These are invalid; the information is not there. */
9136 if (mode == CCEQmode
9137 && code != EQ && code != NE)
9138 abort ();
9139}
9140
9878760c
RK
9141/* Return 1 if OP is a comparison operation that is valid for a branch insn.
9142 We only check the opcode against the mode of the CC value here. */
9143
9144int
a2369ed3 9145branch_comparison_operator (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
9878760c
RK
9146{
9147 enum rtx_code code = GET_CODE (op);
9148 enum machine_mode cc_mode;
9149
ec8e098d 9150 if (!COMPARISON_P (op))
9878760c
RK
9151 return 0;
9152
9153 cc_mode = GET_MODE (XEXP (op, 0));
9154 if (GET_MODE_CLASS (cc_mode) != MODE_CC)
9155 return 0;
9156
39a10a29 9157 validate_condition_mode (code, cc_mode);
9878760c 9158
39a10a29
GK
9159 return 1;
9160}
9161
9162/* Return 1 if OP is a comparison operation that is valid for a branch
9163 insn and which is true if the corresponding bit in the CC register
9164 is set. */
9165
9166int
a2369ed3 9167branch_positive_comparison_operator (rtx op, enum machine_mode mode)
39a10a29
GK
9168{
9169 enum rtx_code code;
9170
8daf2e65 9171 if (! branch_comparison_operator (op, mode))
9878760c
RK
9172 return 0;
9173
39a10a29
GK
9174 code = GET_CODE (op);
9175 return (code == EQ || code == LT || code == GT
9176 || code == LTU || code == GTU
9177 || code == UNORDERED);
9878760c
RK
9178}
9179
b7053a3f
GK
9180/* Return 1 if OP is a comparison operation that is valid for an scc
9181 insn: it must be a positive comparison. */
9878760c
RK
9182
9183int
a2369ed3 9184scc_comparison_operator (rtx op, enum machine_mode mode)
9878760c 9185{
b7053a3f 9186 return branch_positive_comparison_operator (op, mode);
9878760c 9187}
e0cd0770
JC
9188
9189int
a2369ed3 9190trap_comparison_operator (rtx op, enum machine_mode mode)
e0cd0770
JC
9191{
9192 if (mode != VOIDmode && mode != GET_MODE (op))
9193 return 0;
ec8e098d 9194 return COMPARISON_P (op);
e0cd0770 9195}
dfbdccdb
GK
9196
9197int
a2369ed3 9198boolean_operator (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
dfbdccdb
GK
9199{
9200 enum rtx_code code = GET_CODE (op);
9201 return (code == AND || code == IOR || code == XOR);
9202}
1d328b19
GK
9203
9204int
a2369ed3 9205boolean_or_operator (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1d328b19
GK
9206{
9207 enum rtx_code code = GET_CODE (op);
9208 return (code == IOR || code == XOR);
9209}
50a0b056
GK
9210
9211int
a2369ed3 9212min_max_operator (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
50a0b056
GK
9213{
9214 enum rtx_code code = GET_CODE (op);
9215 return (code == SMIN || code == SMAX || code == UMIN || code == UMAX);
9216}
9878760c
RK
9217\f
9218/* Return 1 if ANDOP is a mask that has no bits on that are not in the
9219 mask required to convert the result of a rotate insn into a shift
b1765bde 9220 left insn of SHIFTOP bits. Both are known to be SImode CONST_INT. */
9878760c
RK
9221
9222int
a2369ed3 9223includes_lshift_p (rtx shiftop, rtx andop)
9878760c 9224{
e2c953b6
DE
9225 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
9226
9227 shift_mask <<= INTVAL (shiftop);
9878760c 9228
b1765bde 9229 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
9878760c
RK
9230}
9231
9232/* Similar, but for right shift. */
9233
9234int
a2369ed3 9235includes_rshift_p (rtx shiftop, rtx andop)
9878760c 9236{
a7653a2c 9237 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
9878760c
RK
9238
9239 shift_mask >>= INTVAL (shiftop);
9240
b1765bde 9241 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
e2c953b6
DE
9242}
9243
c5059423
AM
9244/* Return 1 if ANDOP is a mask suitable for use with an rldic insn
9245 to perform a left shift. It must have exactly SHIFTOP least
b6d08ca1 9246 significant 0's, then one or more 1's, then zero or more 0's. */
e2c953b6
DE
9247
9248int
a2369ed3 9249includes_rldic_lshift_p (rtx shiftop, rtx andop)
e2c953b6 9250{
c5059423
AM
9251 if (GET_CODE (andop) == CONST_INT)
9252 {
02071907 9253 HOST_WIDE_INT c, lsb, shift_mask;
e2c953b6 9254
c5059423 9255 c = INTVAL (andop);
02071907 9256 if (c == 0 || c == ~0)
c5059423 9257 return 0;
e2c953b6 9258
02071907 9259 shift_mask = ~0;
c5059423
AM
9260 shift_mask <<= INTVAL (shiftop);
9261
b6d08ca1 9262 /* Find the least significant one bit. */
c5059423
AM
9263 lsb = c & -c;
9264
9265 /* It must coincide with the LSB of the shift mask. */
9266 if (-lsb != shift_mask)
9267 return 0;
e2c953b6 9268
c5059423
AM
9269 /* Invert to look for the next transition (if any). */
9270 c = ~c;
9271
9272 /* Remove the low group of ones (originally low group of zeros). */
9273 c &= -lsb;
9274
9275 /* Again find the lsb, and check we have all 1's above. */
9276 lsb = c & -c;
9277 return c == -lsb;
9278 }
9279 else if (GET_CODE (andop) == CONST_DOUBLE
9280 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
9281 {
02071907
AM
9282 HOST_WIDE_INT low, high, lsb;
9283 HOST_WIDE_INT shift_mask_low, shift_mask_high;
c5059423
AM
9284
9285 low = CONST_DOUBLE_LOW (andop);
9286 if (HOST_BITS_PER_WIDE_INT < 64)
9287 high = CONST_DOUBLE_HIGH (andop);
9288
9289 if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
02071907 9290 || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
c5059423
AM
9291 return 0;
9292
9293 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
9294 {
02071907 9295 shift_mask_high = ~0;
c5059423
AM
9296 if (INTVAL (shiftop) > 32)
9297 shift_mask_high <<= INTVAL (shiftop) - 32;
9298
9299 lsb = high & -high;
9300
9301 if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
9302 return 0;
9303
9304 high = ~high;
9305 high &= -lsb;
9306
9307 lsb = high & -high;
9308 return high == -lsb;
9309 }
9310
02071907 9311 shift_mask_low = ~0;
c5059423
AM
9312 shift_mask_low <<= INTVAL (shiftop);
9313
9314 lsb = low & -low;
9315
9316 if (-lsb != shift_mask_low)
9317 return 0;
9318
9319 if (HOST_BITS_PER_WIDE_INT < 64)
9320 high = ~high;
9321 low = ~low;
9322 low &= -lsb;
9323
9324 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
9325 {
9326 lsb = high & -high;
9327 return high == -lsb;
9328 }
9329
9330 lsb = low & -low;
9331 return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
9332 }
9333 else
9334 return 0;
9335}
e2c953b6 9336
c5059423
AM
9337/* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
9338 to perform a left shift. It must have SHIFTOP or more least
c1207243 9339 significant 0's, with the remainder of the word 1's. */
e2c953b6 9340
c5059423 9341int
a2369ed3 9342includes_rldicr_lshift_p (rtx shiftop, rtx andop)
c5059423 9343{
e2c953b6 9344 if (GET_CODE (andop) == CONST_INT)
c5059423 9345 {
02071907 9346 HOST_WIDE_INT c, lsb, shift_mask;
c5059423 9347
02071907 9348 shift_mask = ~0;
c5059423
AM
9349 shift_mask <<= INTVAL (shiftop);
9350 c = INTVAL (andop);
9351
c1207243 9352 /* Find the least significant one bit. */
c5059423
AM
9353 lsb = c & -c;
9354
9355 /* It must be covered by the shift mask.
a4f6c312 9356 This test also rejects c == 0. */
c5059423
AM
9357 if ((lsb & shift_mask) == 0)
9358 return 0;
9359
9360 /* Check we have all 1's above the transition, and reject all 1's. */
9361 return c == -lsb && lsb != 1;
9362 }
9363 else if (GET_CODE (andop) == CONST_DOUBLE
9364 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
9365 {
02071907 9366 HOST_WIDE_INT low, lsb, shift_mask_low;
c5059423
AM
9367
9368 low = CONST_DOUBLE_LOW (andop);
9369
9370 if (HOST_BITS_PER_WIDE_INT < 64)
9371 {
02071907 9372 HOST_WIDE_INT high, shift_mask_high;
c5059423
AM
9373
9374 high = CONST_DOUBLE_HIGH (andop);
9375
9376 if (low == 0)
9377 {
02071907 9378 shift_mask_high = ~0;
c5059423
AM
9379 if (INTVAL (shiftop) > 32)
9380 shift_mask_high <<= INTVAL (shiftop) - 32;
9381
9382 lsb = high & -high;
9383
9384 if ((lsb & shift_mask_high) == 0)
9385 return 0;
9386
9387 return high == -lsb;
9388 }
9389 if (high != ~0)
9390 return 0;
9391 }
9392
02071907 9393 shift_mask_low = ~0;
c5059423
AM
9394 shift_mask_low <<= INTVAL (shiftop);
9395
9396 lsb = low & -low;
9397
9398 if ((lsb & shift_mask_low) == 0)
9399 return 0;
9400
9401 return low == -lsb && lsb != 1;
9402 }
e2c953b6 9403 else
c5059423 9404 return 0;
9878760c 9405}
35068b43 9406
11ac38b2
DE
9407/* Return 1 if operands will generate a valid arguments to rlwimi
9408instruction for insert with right shift in 64-bit mode. The mask may
9409not start on the first bit or stop on the last bit because wrap-around
9410effects of instruction do not correspond to semantics of RTL insn. */
9411
9412int
9413insvdi_rshift_rlwimi_p (rtx sizeop, rtx startop, rtx shiftop)
9414{
9415 if (INTVAL (startop) < 64
9416 && INTVAL (startop) > 32
9417 && (INTVAL (sizeop) + INTVAL (startop) < 64)
9418 && (INTVAL (sizeop) + INTVAL (startop) > 33)
9419 && (INTVAL (sizeop) + INTVAL (startop) + INTVAL (shiftop) < 96)
9420 && (INTVAL (sizeop) + INTVAL (startop) + INTVAL (shiftop) >= 64)
9421 && (64 - (INTVAL (shiftop) & 63)) >= INTVAL (sizeop))
9422 return 1;
9423
9424 return 0;
9425}
9426
35068b43 9427/* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
90f81f99 9428 for lfq and stfq insns iff the registers are hard registers. */
35068b43
RK
9429
9430int
a2369ed3 9431registers_ok_for_quad_peep (rtx reg1, rtx reg2)
35068b43
RK
9432{
9433 /* We might have been passed a SUBREG. */
9434 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
9435 return 0;
90f81f99
AP
9436
9437 /* We might have been passed non floating point registers. */
9438 if (!FP_REGNO_P (REGNO (reg1))
9439 || !FP_REGNO_P (REGNO (reg2)))
9440 return 0;
35068b43
RK
9441
9442 return (REGNO (reg1) == REGNO (reg2) - 1);
9443}
9444
a4f6c312
SS
9445/* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
9446 addr1 and addr2 must be in consecutive memory locations
9447 (addr2 == addr1 + 8). */
35068b43
RK
9448
9449int
90f81f99 9450mems_ok_for_quad_peep (rtx mem1, rtx mem2)
35068b43 9451{
90f81f99 9452 rtx addr1, addr2;
e2c953b6 9453 unsigned int reg1;
35068b43
RK
9454 int offset1;
9455
90f81f99
AP
9456 /* The mems cannot be volatile. */
9457 if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
9458 return 0;
9459
9460 addr1 = XEXP (mem1, 0);
9461 addr2 = XEXP (mem2, 0);
9462
35068b43
RK
9463 /* Extract an offset (if used) from the first addr. */
9464 if (GET_CODE (addr1) == PLUS)
9465 {
9466 /* If not a REG, return zero. */
9467 if (GET_CODE (XEXP (addr1, 0)) != REG)
9468 return 0;
9469 else
9470 {
9471 reg1 = REGNO (XEXP (addr1, 0));
9472 /* The offset must be constant! */
9473 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
9474 return 0;
9475 offset1 = INTVAL (XEXP (addr1, 1));
9476 }
9477 }
9478 else if (GET_CODE (addr1) != REG)
9479 return 0;
9480 else
9481 {
9482 reg1 = REGNO (addr1);
9483 /* This was a simple (mem (reg)) expression. Offset is 0. */
9484 offset1 = 0;
9485 }
9486
a2369ed3 9487 /* Make sure the second address is a (mem (plus (reg) (const_int)))
0f6937fe
AM
9488 or if it is (mem (reg)) then make sure that offset1 is -8 and the same
9489 register as addr1. */
984e25ac 9490 if (offset1 == -8 && GET_CODE (addr2) == REG && reg1 == REGNO (addr2))
0f6937fe 9491 return 1;
35068b43
RK
9492 if (GET_CODE (addr2) != PLUS)
9493 return 0;
9494
9495 if (GET_CODE (XEXP (addr2, 0)) != REG
9496 || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
9497 return 0;
9498
9499 if (reg1 != REGNO (XEXP (addr2, 0)))
9500 return 0;
9501
9502 /* The offset for the second addr must be 8 more than the first addr. */
9503 if (INTVAL (XEXP (addr2, 1)) != offset1 + 8)
9504 return 0;
9505
9506 /* All the tests passed. addr1 and addr2 are valid for lfq or stfq
9507 instructions. */
9508 return 1;
9509}
9878760c
RK
9510\f
9511/* Return the register class of a scratch register needed to copy IN into
9512 or out of a register in CLASS in MODE. If it can be done directly,
9513 NO_REGS is returned. */
9514
9515enum reg_class
a2369ed3 9516secondary_reload_class (enum reg_class class,
a9baceb1
GK
9517 enum machine_mode mode ATTRIBUTE_UNUSED,
9518 rtx in)
9878760c 9519{
5accd822 9520 int regno;
9878760c 9521
ab82a49f
AP
9522 if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
9523#if TARGET_MACHO
9524 && MACHOPIC_INDIRECT
9525#endif
9526 ))
46fad5b7
DJ
9527 {
9528 /* We cannot copy a symbolic operand directly into anything
9529 other than BASE_REGS for TARGET_ELF. So indicate that a
9530 register from BASE_REGS is needed as an intermediate
9531 register.
9532
9533 On Darwin, pic addresses require a load from memory, which
9534 needs a base register. */
9535 if (class != BASE_REGS
9536 && (GET_CODE (in) == SYMBOL_REF
9537 || GET_CODE (in) == HIGH
9538 || GET_CODE (in) == LABEL_REF
9539 || GET_CODE (in) == CONST))
9540 return BASE_REGS;
9541 }
e7b7998a 9542
5accd822
DE
9543 if (GET_CODE (in) == REG)
9544 {
9545 regno = REGNO (in);
9546 if (regno >= FIRST_PSEUDO_REGISTER)
9547 {
9548 regno = true_regnum (in);
9549 if (regno >= FIRST_PSEUDO_REGISTER)
9550 regno = -1;
9551 }
9552 }
9553 else if (GET_CODE (in) == SUBREG)
9554 {
9555 regno = true_regnum (in);
9556 if (regno >= FIRST_PSEUDO_REGISTER)
9557 regno = -1;
9558 }
9559 else
9560 regno = -1;
9561
9878760c
RK
9562 /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
9563 into anything. */
9564 if (class == GENERAL_REGS || class == BASE_REGS
9565 || (regno >= 0 && INT_REGNO_P (regno)))
9566 return NO_REGS;
9567
9568 /* Constants, memory, and FP registers can go into FP registers. */
9569 if ((regno == -1 || FP_REGNO_P (regno))
9570 && (class == FLOAT_REGS || class == NON_SPECIAL_REGS))
9571 return NO_REGS;
9572
0ac081f6
AH
9573 /* Memory, and AltiVec registers can go into AltiVec registers. */
9574 if ((regno == -1 || ALTIVEC_REGNO_P (regno))
9575 && class == ALTIVEC_REGS)
9576 return NO_REGS;
9577
9878760c
RK
9578 /* We can copy among the CR registers. */
9579 if ((class == CR_REGS || class == CR0_REGS)
9580 && regno >= 0 && CR_REGNO_P (regno))
9581 return NO_REGS;
9582
9583 /* Otherwise, we need GENERAL_REGS. */
9584 return GENERAL_REGS;
9585}
9586\f
9587/* Given a comparison operation, return the bit number in CCR to test. We
9588 know this is a valid comparison.
9589
9590 SCC_P is 1 if this is for an scc. That means that %D will have been
9591 used instead of %C, so the bits will be in different places.
9592
b4ac57ab 9593 Return -1 if OP isn't a valid comparison for some reason. */
9878760c
RK
9594
9595int
a2369ed3 9596ccr_bit (rtx op, int scc_p)
9878760c
RK
9597{
9598 enum rtx_code code = GET_CODE (op);
9599 enum machine_mode cc_mode;
9600 int cc_regnum;
9601 int base_bit;
9ebbca7d 9602 rtx reg;
9878760c 9603
ec8e098d 9604 if (!COMPARISON_P (op))
9878760c
RK
9605 return -1;
9606
9ebbca7d
GK
9607 reg = XEXP (op, 0);
9608
9609 if (GET_CODE (reg) != REG
9610 || ! CR_REGNO_P (REGNO (reg)))
9611 abort ();
9612
9613 cc_mode = GET_MODE (reg);
9614 cc_regnum = REGNO (reg);
9615 base_bit = 4 * (cc_regnum - CR0_REGNO);
9878760c 9616
39a10a29 9617 validate_condition_mode (code, cc_mode);
c5defebb 9618
b7053a3f
GK
9619 /* When generating a sCOND operation, only positive conditions are
9620 allowed. */
9621 if (scc_p && code != EQ && code != GT && code != LT && code != UNORDERED
9622 && code != GTU && code != LTU)
9623 abort ();
9624
9878760c
RK
9625 switch (code)
9626 {
9627 case NE:
9628 return scc_p ? base_bit + 3 : base_bit + 2;
9629 case EQ:
9630 return base_bit + 2;
1c882ea4 9631 case GT: case GTU: case UNLE:
9878760c 9632 return base_bit + 1;
1c882ea4 9633 case LT: case LTU: case UNGE:
9878760c 9634 return base_bit;
1c882ea4
GK
9635 case ORDERED: case UNORDERED:
9636 return base_bit + 3;
9878760c
RK
9637
9638 case GE: case GEU:
39a10a29 9639 /* If scc, we will have done a cror to put the bit in the
9878760c
RK
9640 unordered position. So test that bit. For integer, this is ! LT
9641 unless this is an scc insn. */
39a10a29 9642 return scc_p ? base_bit + 3 : base_bit;
9878760c
RK
9643
9644 case LE: case LEU:
39a10a29 9645 return scc_p ? base_bit + 3 : base_bit + 1;
1c882ea4 9646
9878760c
RK
9647 default:
9648 abort ();
9649 }
9650}
1ff7789b 9651\f
8d30c4ee 9652/* Return the GOT register. */
1ff7789b
MM
9653
9654struct rtx_def *
a2369ed3 9655rs6000_got_register (rtx value ATTRIBUTE_UNUSED)
1ff7789b 9656{
a4f6c312
SS
9657 /* The second flow pass currently (June 1999) can't update
9658 regs_ever_live without disturbing other parts of the compiler, so
9659 update it here to make the prolog/epilogue code happy. */
1db02437
FS
9660 if (no_new_pseudos && ! regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM])
9661 regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
1ff7789b 9662
8d30c4ee 9663 current_function_uses_pic_offset_table = 1;
3cb999d8 9664
1ff7789b
MM
9665 return pic_offset_table_rtx;
9666}
a7df97e6 9667\f
e2500fed
GK
9668/* Function to init struct machine_function.
9669 This will be called, via a pointer variable,
9670 from push_function_context. */
a7df97e6 9671
e2500fed 9672static struct machine_function *
863d938c 9673rs6000_init_machine_status (void)
a7df97e6 9674{
e2500fed 9675 return ggc_alloc_cleared (sizeof (machine_function));
a7df97e6 9676}
9878760c 9677\f
0ba1b2ff
AM
9678/* These macros test for integers and extract the low-order bits. */
9679#define INT_P(X) \
9680((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE) \
9681 && GET_MODE (X) == VOIDmode)
9682
9683#define INT_LOWPART(X) \
9684 (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
9685
9686int
a2369ed3 9687extract_MB (rtx op)
0ba1b2ff
AM
9688{
9689 int i;
9690 unsigned long val = INT_LOWPART (op);
9691
9692 /* If the high bit is zero, the value is the first 1 bit we find
9693 from the left. */
9694 if ((val & 0x80000000) == 0)
9695 {
9696 if ((val & 0xffffffff) == 0)
9697 abort ();
9698
9699 i = 1;
9700 while (((val <<= 1) & 0x80000000) == 0)
9701 ++i;
9702 return i;
9703 }
9704
9705 /* If the high bit is set and the low bit is not, or the mask is all
9706 1's, the value is zero. */
9707 if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
9708 return 0;
9709
9710 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
9711 from the right. */
9712 i = 31;
9713 while (((val >>= 1) & 1) != 0)
9714 --i;
9715
9716 return i;
9717}
9718
9719int
a2369ed3 9720extract_ME (rtx op)
0ba1b2ff
AM
9721{
9722 int i;
9723 unsigned long val = INT_LOWPART (op);
9724
9725 /* If the low bit is zero, the value is the first 1 bit we find from
9726 the right. */
9727 if ((val & 1) == 0)
9728 {
9729 if ((val & 0xffffffff) == 0)
9730 abort ();
9731
9732 i = 30;
9733 while (((val >>= 1) & 1) == 0)
9734 --i;
9735
9736 return i;
9737 }
9738
9739 /* If the low bit is set and the high bit is not, or the mask is all
9740 1's, the value is 31. */
9741 if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
9742 return 31;
9743
9744 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
9745 from the left. */
9746 i = 0;
9747 while (((val <<= 1) & 0x80000000) != 0)
9748 ++i;
9749
9750 return i;
9751}
9752
c4501e62
JJ
9753/* Locate some local-dynamic symbol still in use by this function
9754 so that we can print its name in some tls_ld pattern. */
9755
9756static const char *
863d938c 9757rs6000_get_some_local_dynamic_name (void)
c4501e62
JJ
9758{
9759 rtx insn;
9760
9761 if (cfun->machine->some_ld_name)
9762 return cfun->machine->some_ld_name;
9763
9764 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
9765 if (INSN_P (insn)
9766 && for_each_rtx (&PATTERN (insn),
9767 rs6000_get_some_local_dynamic_name_1, 0))
9768 return cfun->machine->some_ld_name;
9769
9770 abort ();
9771}
9772
9773/* Helper function for rs6000_get_some_local_dynamic_name. */
9774
9775static int
a2369ed3 9776rs6000_get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
c4501e62
JJ
9777{
9778 rtx x = *px;
9779
9780 if (GET_CODE (x) == SYMBOL_REF)
9781 {
9782 const char *str = XSTR (x, 0);
9783 if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
9784 {
9785 cfun->machine->some_ld_name = str;
9786 return 1;
9787 }
9788 }
9789
9790 return 0;
9791}
9792
85b776df
AM
9793/* Write out a function code label. */
9794
9795void
9796rs6000_output_function_entry (FILE *file, const char *fname)
9797{
9798 if (fname[0] != '.')
9799 {
9800 switch (DEFAULT_ABI)
9801 {
9802 default:
9803 abort ();
9804
9805 case ABI_AIX:
9806 if (DOT_SYMBOLS)
9807 putc ('.', file);
9808 else
9809 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "L.");
9810 break;
9811
9812 case ABI_V4:
9813 case ABI_DARWIN:
9814 break;
9815 }
9816 }
9817 if (TARGET_AIX)
9818 RS6000_OUTPUT_BASENAME (file, fname);
9819 else
9820 assemble_name (file, fname);
9821}
9822
9878760c
RK
9823/* Print an operand. Recognize special options, documented below. */
9824
38c1f2d7 9825#if TARGET_ELF
d9407988 9826#define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
8fbd2dc7 9827#define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
ba5e43aa
MM
9828#else
9829#define SMALL_DATA_RELOC "sda21"
8fbd2dc7 9830#define SMALL_DATA_REG 0
ba5e43aa
MM
9831#endif
9832
9878760c 9833void
a2369ed3 9834print_operand (FILE *file, rtx x, int code)
9878760c
RK
9835{
9836 int i;
a260abc9 9837 HOST_WIDE_INT val;
0ba1b2ff 9838 unsigned HOST_WIDE_INT uval;
9878760c
RK
9839
9840 switch (code)
9841 {
a8b3aeda 9842 case '.':
a85d226b
RK
9843 /* Write out an instruction after the call which may be replaced
9844 with glue code by the loader. This depends on the AIX version. */
9845 asm_fprintf (file, RS6000_CALL_GLUE);
a8b3aeda
RK
9846 return;
9847
81eace42
GK
9848 /* %a is output_address. */
9849
9854d9ed
RK
9850 case 'A':
9851 /* If X is a constant integer whose low-order 5 bits are zero,
9852 write 'l'. Otherwise, write 'r'. This is a kludge to fix a bug
76229ac8 9853 in the AIX assembler where "sri" with a zero shift count
20e26713 9854 writes a trash instruction. */
9854d9ed 9855 if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
76229ac8 9856 putc ('l', file);
9854d9ed 9857 else
76229ac8 9858 putc ('r', file);
9854d9ed
RK
9859 return;
9860
9861 case 'b':
e2c953b6
DE
9862 /* If constant, low-order 16 bits of constant, unsigned.
9863 Otherwise, write normally. */
9864 if (INT_P (x))
9865 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
9866 else
9867 print_operand (file, x, 0);
cad12a8d
RK
9868 return;
9869
a260abc9
DE
9870 case 'B':
9871 /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
9872 for 64-bit mask direction. */
296b8152 9873 putc (((INT_LOWPART(x) & 1) == 0 ? 'r' : 'l'), file);
a238cd8b 9874 return;
a260abc9 9875
81eace42
GK
9876 /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
9877 output_operand. */
9878
423c1189
AH
9879 case 'c':
9880 /* X is a CR register. Print the number of the GT bit of the CR. */
9881 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9882 output_operand_lossage ("invalid %%E value");
9883 else
9884 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 1);
9885 return;
9886
9887 case 'D':
6b1fedc3 9888 /* Like 'J' but get to the EQ bit. */
423c1189
AH
9889 if (GET_CODE (x) != REG)
9890 abort ();
9891
6b1fedc3
AH
9892 /* Bit 1 is EQ bit. */
9893 i = 4 * (REGNO (x) - CR0_REGNO) + 2;
423c1189
AH
9894
9895 /* If we want bit 31, write a shift count of zero, not 32. */
9896 fprintf (file, "%d", i == 31 ? 0 : i + 1);
9897 return;
9898
9854d9ed 9899 case 'E':
39a10a29 9900 /* X is a CR register. Print the number of the EQ bit of the CR */
9854d9ed
RK
9901 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9902 output_operand_lossage ("invalid %%E value");
78fbdbf7 9903 else
39a10a29 9904 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
a85d226b 9905 return;
9854d9ed
RK
9906
9907 case 'f':
9908 /* X is a CR register. Print the shift count needed to move it
9909 to the high-order four bits. */
9910 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9911 output_operand_lossage ("invalid %%f value");
9912 else
9ebbca7d 9913 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
9854d9ed
RK
9914 return;
9915
9916 case 'F':
9917 /* Similar, but print the count for the rotate in the opposite
9918 direction. */
9919 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
9920 output_operand_lossage ("invalid %%F value");
9921 else
9ebbca7d 9922 fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
9854d9ed
RK
9923 return;
9924
9925 case 'G':
9926 /* X is a constant integer. If it is negative, print "m",
43aa4e05 9927 otherwise print "z". This is to make an aze or ame insn. */
9854d9ed
RK
9928 if (GET_CODE (x) != CONST_INT)
9929 output_operand_lossage ("invalid %%G value");
9930 else if (INTVAL (x) >= 0)
76229ac8 9931 putc ('z', file);
9854d9ed 9932 else
76229ac8 9933 putc ('m', file);
9854d9ed 9934 return;
e2c953b6 9935
9878760c 9936 case 'h':
a4f6c312
SS
9937 /* If constant, output low-order five bits. Otherwise, write
9938 normally. */
9878760c 9939 if (INT_P (x))
5f59ecb7 9940 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
9878760c
RK
9941 else
9942 print_operand (file, x, 0);
9943 return;
9944
64305719 9945 case 'H':
a4f6c312
SS
9946 /* If constant, output low-order six bits. Otherwise, write
9947 normally. */
64305719 9948 if (INT_P (x))
5f59ecb7 9949 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
64305719
DE
9950 else
9951 print_operand (file, x, 0);
9952 return;
9953
9854d9ed
RK
9954 case 'I':
9955 /* Print `i' if this is a constant, else nothing. */
9878760c 9956 if (INT_P (x))
76229ac8 9957 putc ('i', file);
9878760c
RK
9958 return;
9959
9854d9ed
RK
9960 case 'j':
9961 /* Write the bit number in CCR for jump. */
9962 i = ccr_bit (x, 0);
9963 if (i == -1)
9964 output_operand_lossage ("invalid %%j code");
9878760c 9965 else
9854d9ed 9966 fprintf (file, "%d", i);
9878760c
RK
9967 return;
9968
9854d9ed
RK
9969 case 'J':
9970 /* Similar, but add one for shift count in rlinm for scc and pass
9971 scc flag to `ccr_bit'. */
9972 i = ccr_bit (x, 1);
9973 if (i == -1)
9974 output_operand_lossage ("invalid %%J code");
9975 else
a0466a68
RK
9976 /* If we want bit 31, write a shift count of zero, not 32. */
9977 fprintf (file, "%d", i == 31 ? 0 : i + 1);
9878760c
RK
9978 return;
9979
9854d9ed
RK
9980 case 'k':
9981 /* X must be a constant. Write the 1's complement of the
9982 constant. */
9878760c 9983 if (! INT_P (x))
9854d9ed 9984 output_operand_lossage ("invalid %%k value");
e2c953b6
DE
9985 else
9986 fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
9878760c
RK
9987 return;
9988
81eace42 9989 case 'K':
9ebbca7d
GK
9990 /* X must be a symbolic constant on ELF. Write an
9991 expression suitable for an 'addi' that adds in the low 16
9992 bits of the MEM. */
9993 if (GET_CODE (x) != CONST)
9994 {
9995 print_operand_address (file, x);
9996 fputs ("@l", file);
9997 }
9998 else
9999 {
10000 if (GET_CODE (XEXP (x, 0)) != PLUS
10001 || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
10002 && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
10003 || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
53cd5d6c 10004 output_operand_lossage ("invalid %%K value");
9ebbca7d
GK
10005 print_operand_address (file, XEXP (XEXP (x, 0), 0));
10006 fputs ("@l", file);
ed8d2920
MM
10007 /* For GNU as, there must be a non-alphanumeric character
10008 between 'l' and the number. The '-' is added by
10009 print_operand() already. */
10010 if (INTVAL (XEXP (XEXP (x, 0), 1)) >= 0)
10011 fputs ("+", file);
9ebbca7d
GK
10012 print_operand (file, XEXP (XEXP (x, 0), 1), 0);
10013 }
81eace42
GK
10014 return;
10015
10016 /* %l is output_asm_label. */
9ebbca7d 10017
9854d9ed
RK
10018 case 'L':
10019 /* Write second word of DImode or DFmode reference. Works on register
10020 or non-indexed memory only. */
10021 if (GET_CODE (x) == REG)
5ebfb2ba 10022 fprintf (file, "%s", reg_names[REGNO (x) + 1]);
9854d9ed
RK
10023 else if (GET_CODE (x) == MEM)
10024 {
10025 /* Handle possible auto-increment. Since it is pre-increment and
1427100a 10026 we have already done it, we can just use an offset of word. */
9854d9ed
RK
10027 if (GET_CODE (XEXP (x, 0)) == PRE_INC
10028 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
ed8908e7
RK
10029 output_address (plus_constant (XEXP (XEXP (x, 0), 0),
10030 UNITS_PER_WORD));
9854d9ed 10031 else
d7624dc0
RK
10032 output_address (XEXP (adjust_address_nv (x, SImode,
10033 UNITS_PER_WORD),
10034 0));
ed8908e7 10035
ba5e43aa 10036 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
10037 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10038 reg_names[SMALL_DATA_REG]);
9854d9ed 10039 }
9878760c 10040 return;
9854d9ed 10041
9878760c
RK
10042 case 'm':
10043 /* MB value for a mask operand. */
b1765bde 10044 if (! mask_operand (x, SImode))
9878760c
RK
10045 output_operand_lossage ("invalid %%m value");
10046
0ba1b2ff 10047 fprintf (file, "%d", extract_MB (x));
9878760c
RK
10048 return;
10049
10050 case 'M':
10051 /* ME value for a mask operand. */
b1765bde 10052 if (! mask_operand (x, SImode))
a260abc9 10053 output_operand_lossage ("invalid %%M value");
9878760c 10054
0ba1b2ff 10055 fprintf (file, "%d", extract_ME (x));
9878760c
RK
10056 return;
10057
81eace42
GK
10058 /* %n outputs the negative of its operand. */
10059
9878760c
RK
10060 case 'N':
10061 /* Write the number of elements in the vector times 4. */
10062 if (GET_CODE (x) != PARALLEL)
10063 output_operand_lossage ("invalid %%N value");
e2c953b6
DE
10064 else
10065 fprintf (file, "%d", XVECLEN (x, 0) * 4);
9878760c
RK
10066 return;
10067
10068 case 'O':
10069 /* Similar, but subtract 1 first. */
10070 if (GET_CODE (x) != PARALLEL)
1427100a 10071 output_operand_lossage ("invalid %%O value");
e2c953b6
DE
10072 else
10073 fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
9878760c
RK
10074 return;
10075
9854d9ed
RK
10076 case 'p':
10077 /* X is a CONST_INT that is a power of two. Output the logarithm. */
10078 if (! INT_P (x)
2bfcf297 10079 || INT_LOWPART (x) < 0
9854d9ed
RK
10080 || (i = exact_log2 (INT_LOWPART (x))) < 0)
10081 output_operand_lossage ("invalid %%p value");
e2c953b6
DE
10082 else
10083 fprintf (file, "%d", i);
9854d9ed
RK
10084 return;
10085
9878760c
RK
10086 case 'P':
10087 /* The operand must be an indirect memory reference. The result
8bb418a3 10088 is the register name. */
9878760c
RK
10089 if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
10090 || REGNO (XEXP (x, 0)) >= 32)
10091 output_operand_lossage ("invalid %%P value");
e2c953b6 10092 else
8bb418a3 10093 fprintf (file, "%s", reg_names[REGNO (XEXP (x, 0))]);
9878760c
RK
10094 return;
10095
dfbdccdb
GK
10096 case 'q':
10097 /* This outputs the logical code corresponding to a boolean
10098 expression. The expression may have one or both operands
39a10a29
GK
10099 negated (if one, only the first one). For condition register
10100 logical operations, it will also treat the negated
10101 CR codes as NOTs, but not handle NOTs of them. */
dfbdccdb 10102 {
63bc1d05 10103 const char *const *t = 0;
dfbdccdb
GK
10104 const char *s;
10105 enum rtx_code code = GET_CODE (x);
10106 static const char * const tbl[3][3] = {
10107 { "and", "andc", "nor" },
10108 { "or", "orc", "nand" },
10109 { "xor", "eqv", "xor" } };
10110
10111 if (code == AND)
10112 t = tbl[0];
10113 else if (code == IOR)
10114 t = tbl[1];
10115 else if (code == XOR)
10116 t = tbl[2];
10117 else
10118 output_operand_lossage ("invalid %%q value");
10119
10120 if (GET_CODE (XEXP (x, 0)) != NOT)
10121 s = t[0];
10122 else
10123 {
10124 if (GET_CODE (XEXP (x, 1)) == NOT)
10125 s = t[2];
10126 else
10127 s = t[1];
10128 }
10129
10130 fputs (s, file);
10131 }
10132 return;
10133
2c4a9cff
DE
10134 case 'Q':
10135 if (TARGET_MFCRF)
3b6ce0af 10136 fputc (',', file);
5efb1046 10137 /* FALLTHRU */
2c4a9cff
DE
10138 else
10139 return;
10140
9854d9ed
RK
10141 case 'R':
10142 /* X is a CR register. Print the mask for `mtcrf'. */
10143 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
10144 output_operand_lossage ("invalid %%R value");
10145 else
9ebbca7d 10146 fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
9878760c 10147 return;
9854d9ed
RK
10148
10149 case 's':
10150 /* Low 5 bits of 32 - value */
10151 if (! INT_P (x))
10152 output_operand_lossage ("invalid %%s value");
e2c953b6
DE
10153 else
10154 fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
9878760c 10155 return;
9854d9ed 10156
a260abc9 10157 case 'S':
0ba1b2ff 10158 /* PowerPC64 mask position. All 0's is excluded.
a260abc9
DE
10159 CONST_INT 32-bit mask is considered sign-extended so any
10160 transition must occur within the CONST_INT, not on the boundary. */
b1765bde 10161 if (! mask64_operand (x, DImode))
a260abc9
DE
10162 output_operand_lossage ("invalid %%S value");
10163
0ba1b2ff 10164 uval = INT_LOWPART (x);
a260abc9 10165
0ba1b2ff 10166 if (uval & 1) /* Clear Left */
a260abc9 10167 {
f099d360
GK
10168#if HOST_BITS_PER_WIDE_INT > 64
10169 uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
10170#endif
0ba1b2ff 10171 i = 64;
a260abc9 10172 }
0ba1b2ff 10173 else /* Clear Right */
a260abc9 10174 {
0ba1b2ff 10175 uval = ~uval;
f099d360
GK
10176#if HOST_BITS_PER_WIDE_INT > 64
10177 uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
10178#endif
0ba1b2ff 10179 i = 63;
a260abc9 10180 }
0ba1b2ff
AM
10181 while (uval != 0)
10182 --i, uval >>= 1;
10183 if (i < 0)
10184 abort ();
10185 fprintf (file, "%d", i);
10186 return;
a260abc9 10187
a3170dc6
AH
10188 case 't':
10189 /* Like 'J' but get to the OVERFLOW/UNORDERED bit. */
10190 if (GET_CODE (x) != REG || GET_MODE (x) != CCmode)
10191 abort ();
10192
10193 /* Bit 3 is OV bit. */
10194 i = 4 * (REGNO (x) - CR0_REGNO) + 3;
10195
10196 /* If we want bit 31, write a shift count of zero, not 32. */
10197 fprintf (file, "%d", i == 31 ? 0 : i + 1);
10198 return;
10199
cccf3bdc
DE
10200 case 'T':
10201 /* Print the symbolic name of a branch target register. */
10202 if (GET_CODE (x) != REG || (REGNO (x) != LINK_REGISTER_REGNUM
10203 && REGNO (x) != COUNT_REGISTER_REGNUM))
10204 output_operand_lossage ("invalid %%T value");
e2c953b6 10205 else if (REGNO (x) == LINK_REGISTER_REGNUM)
cccf3bdc
DE
10206 fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
10207 else
10208 fputs ("ctr", file);
10209 return;
10210
9854d9ed 10211 case 'u':
802a0058 10212 /* High-order 16 bits of constant for use in unsigned operand. */
9854d9ed
RK
10213 if (! INT_P (x))
10214 output_operand_lossage ("invalid %%u value");
e2c953b6
DE
10215 else
10216 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
10217 (INT_LOWPART (x) >> 16) & 0xffff);
9878760c
RK
10218 return;
10219
802a0058
MM
10220 case 'v':
10221 /* High-order 16 bits of constant for use in signed operand. */
10222 if (! INT_P (x))
10223 output_operand_lossage ("invalid %%v value");
e2c953b6 10224 else
134c32f6
DE
10225 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
10226 (INT_LOWPART (x) >> 16) & 0xffff);
10227 return;
802a0058 10228
9854d9ed
RK
10229 case 'U':
10230 /* Print `u' if this has an auto-increment or auto-decrement. */
10231 if (GET_CODE (x) == MEM
10232 && (GET_CODE (XEXP (x, 0)) == PRE_INC
10233 || GET_CODE (XEXP (x, 0)) == PRE_DEC))
76229ac8 10234 putc ('u', file);
9854d9ed 10235 return;
9878760c 10236
e0cd0770
JC
10237 case 'V':
10238 /* Print the trap code for this operand. */
10239 switch (GET_CODE (x))
10240 {
10241 case EQ:
10242 fputs ("eq", file); /* 4 */
10243 break;
10244 case NE:
10245 fputs ("ne", file); /* 24 */
10246 break;
10247 case LT:
10248 fputs ("lt", file); /* 16 */
10249 break;
10250 case LE:
10251 fputs ("le", file); /* 20 */
10252 break;
10253 case GT:
10254 fputs ("gt", file); /* 8 */
10255 break;
10256 case GE:
10257 fputs ("ge", file); /* 12 */
10258 break;
10259 case LTU:
10260 fputs ("llt", file); /* 2 */
10261 break;
10262 case LEU:
10263 fputs ("lle", file); /* 6 */
10264 break;
10265 case GTU:
10266 fputs ("lgt", file); /* 1 */
10267 break;
10268 case GEU:
10269 fputs ("lge", file); /* 5 */
10270 break;
10271 default:
10272 abort ();
10273 }
10274 break;
10275
9854d9ed
RK
10276 case 'w':
10277 /* If constant, low-order 16 bits of constant, signed. Otherwise, write
10278 normally. */
10279 if (INT_P (x))
5f59ecb7
DE
10280 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
10281 ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
9854d9ed
RK
10282 else
10283 print_operand (file, x, 0);
9878760c
RK
10284 return;
10285
9854d9ed 10286 case 'W':
e2c953b6 10287 /* MB value for a PowerPC64 rldic operand. */
e2c953b6
DE
10288 val = (GET_CODE (x) == CONST_INT
10289 ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
10290
10291 if (val < 0)
10292 i = -1;
9854d9ed 10293 else
e2c953b6
DE
10294 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
10295 if ((val <<= 1) < 0)
10296 break;
10297
10298#if HOST_BITS_PER_WIDE_INT == 32
10299 if (GET_CODE (x) == CONST_INT && i >= 0)
10300 i += 32; /* zero-extend high-part was all 0's */
10301 else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
10302 {
10303 val = CONST_DOUBLE_LOW (x);
10304
10305 if (val == 0)
a4f6c312 10306 abort ();
e2c953b6
DE
10307 else if (val < 0)
10308 --i;
10309 else
10310 for ( ; i < 64; i++)
10311 if ((val <<= 1) < 0)
10312 break;
10313 }
10314#endif
10315
10316 fprintf (file, "%d", i + 1);
9854d9ed 10317 return;
9878760c 10318
9854d9ed
RK
10319 case 'X':
10320 if (GET_CODE (x) == MEM
4d588c14 10321 && legitimate_indexed_address_p (XEXP (x, 0), 0))
76229ac8 10322 putc ('x', file);
9854d9ed 10323 return;
9878760c 10324
9854d9ed
RK
10325 case 'Y':
10326 /* Like 'L', for third word of TImode */
10327 if (GET_CODE (x) == REG)
5ebfb2ba 10328 fprintf (file, "%s", reg_names[REGNO (x) + 2]);
9854d9ed 10329 else if (GET_CODE (x) == MEM)
9878760c 10330 {
9854d9ed
RK
10331 if (GET_CODE (XEXP (x, 0)) == PRE_INC
10332 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
a54d04b7 10333 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
9854d9ed 10334 else
d7624dc0 10335 output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
ba5e43aa 10336 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
10337 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10338 reg_names[SMALL_DATA_REG]);
9878760c
RK
10339 }
10340 return;
9854d9ed 10341
9878760c 10342 case 'z':
b4ac57ab
RS
10343 /* X is a SYMBOL_REF. Write out the name preceded by a
10344 period and without any trailing data in brackets. Used for function
4d30c363
MM
10345 names. If we are configured for System V (or the embedded ABI) on
10346 the PowerPC, do not emit the period, since those systems do not use
10347 TOCs and the like. */
9878760c
RK
10348 if (GET_CODE (x) != SYMBOL_REF)
10349 abort ();
10350
9bf6462a
AP
10351 /* Mark the decl as referenced so that cgraph will output the function. */
10352 if (SYMBOL_REF_DECL (x))
10353 mark_decl_referenced (SYMBOL_REF_DECL (x));
10354
85b776df 10355 /* For macho, check to see if we need a stub. */
f9da97f0
AP
10356 if (TARGET_MACHO)
10357 {
10358 const char *name = XSTR (x, 0);
a031e781 10359#if TARGET_MACHO
3b48085e 10360 if (MACHOPIC_INDIRECT
11abc112
MM
10361 && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
10362 name = machopic_indirection_name (x, /*stub_p=*/true);
f9da97f0
AP
10363#endif
10364 assemble_name (file, name);
10365 }
85b776df 10366 else if (!DOT_SYMBOLS)
9739c90c 10367 assemble_name (file, XSTR (x, 0));
85b776df
AM
10368 else
10369 rs6000_output_function_entry (file, XSTR (x, 0));
9878760c
RK
10370 return;
10371
9854d9ed
RK
10372 case 'Z':
10373 /* Like 'L', for last word of TImode. */
10374 if (GET_CODE (x) == REG)
5ebfb2ba 10375 fprintf (file, "%s", reg_names[REGNO (x) + 3]);
9854d9ed
RK
10376 else if (GET_CODE (x) == MEM)
10377 {
10378 if (GET_CODE (XEXP (x, 0)) == PRE_INC
10379 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
a54d04b7 10380 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
9854d9ed 10381 else
d7624dc0 10382 output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
ba5e43aa 10383 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
10384 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10385 reg_names[SMALL_DATA_REG]);
9854d9ed 10386 }
5c23c401 10387 return;
0ac081f6 10388
a3170dc6 10389 /* Print AltiVec or SPE memory operand. */
0ac081f6
AH
10390 case 'y':
10391 {
10392 rtx tmp;
10393
10394 if (GET_CODE (x) != MEM)
10395 abort ();
10396
10397 tmp = XEXP (x, 0);
10398
993f19a8 10399 if (TARGET_E500)
a3170dc6
AH
10400 {
10401 /* Handle [reg]. */
10402 if (GET_CODE (tmp) == REG)
10403 {
10404 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
10405 break;
10406 }
10407 /* Handle [reg+UIMM]. */
10408 else if (GET_CODE (tmp) == PLUS &&
10409 GET_CODE (XEXP (tmp, 1)) == CONST_INT)
10410 {
10411 int x;
10412
10413 if (GET_CODE (XEXP (tmp, 0)) != REG)
10414 abort ();
10415
10416 x = INTVAL (XEXP (tmp, 1));
10417 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
10418 break;
10419 }
10420
10421 /* Fall through. Must be [reg+reg]. */
10422 }
0ac081f6 10423 if (GET_CODE (tmp) == REG)
c62f2db5 10424 fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
0ac081f6
AH
10425 else if (GET_CODE (tmp) == PLUS && GET_CODE (XEXP (tmp, 1)) == REG)
10426 {
10427 if (REGNO (XEXP (tmp, 0)) == 0)
10428 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
10429 reg_names[ REGNO (XEXP (tmp, 0)) ]);
10430 else
10431 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
10432 reg_names[ REGNO (XEXP (tmp, 1)) ]);
10433 }
10434 else
10435 abort ();
10436 break;
10437 }
9854d9ed 10438
9878760c
RK
10439 case 0:
10440 if (GET_CODE (x) == REG)
10441 fprintf (file, "%s", reg_names[REGNO (x)]);
10442 else if (GET_CODE (x) == MEM)
10443 {
10444 /* We need to handle PRE_INC and PRE_DEC here, since we need to
10445 know the width from the mode. */
10446 if (GET_CODE (XEXP (x, 0)) == PRE_INC)
79ba6d34
MM
10447 fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
10448 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
9878760c 10449 else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
79ba6d34
MM
10450 fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
10451 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
9878760c 10452 else
a54d04b7 10453 output_address (XEXP (x, 0));
9878760c
RK
10454 }
10455 else
a54d04b7 10456 output_addr_const (file, x);
a85d226b 10457 return;
9878760c 10458
c4501e62
JJ
10459 case '&':
10460 assemble_name (file, rs6000_get_some_local_dynamic_name ());
10461 return;
10462
9878760c
RK
10463 default:
10464 output_operand_lossage ("invalid %%xn code");
10465 }
10466}
10467\f
10468/* Print the address of an operand. */
10469
10470void
a2369ed3 10471print_operand_address (FILE *file, rtx x)
9878760c
RK
10472{
10473 if (GET_CODE (x) == REG)
4697a36c 10474 fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
9ebbca7d
GK
10475 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
10476 || GET_CODE (x) == LABEL_REF)
9878760c
RK
10477 {
10478 output_addr_const (file, x);
ba5e43aa 10479 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
10480 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
10481 reg_names[SMALL_DATA_REG]);
9ebbca7d 10482 else if (TARGET_TOC)
a4f6c312 10483 abort ();
9878760c
RK
10484 }
10485 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
10486 {
10487 if (REGNO (XEXP (x, 0)) == 0)
4697a36c
MM
10488 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
10489 reg_names[ REGNO (XEXP (x, 0)) ]);
9878760c 10490 else
4697a36c
MM
10491 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
10492 reg_names[ REGNO (XEXP (x, 1)) ]);
9878760c
RK
10493 }
10494 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
4a0a75dd
KG
10495 fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
10496 INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
3cb999d8
DE
10497#if TARGET_ELF
10498 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
10499 && CONSTANT_P (XEXP (x, 1)))
4697a36c
MM
10500 {
10501 output_addr_const (file, XEXP (x, 1));
10502 fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
10503 }
c859cda6
DJ
10504#endif
10505#if TARGET_MACHO
10506 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
10507 && CONSTANT_P (XEXP (x, 1)))
10508 {
10509 fprintf (file, "lo16(");
10510 output_addr_const (file, XEXP (x, 1));
10511 fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
10512 }
3cb999d8 10513#endif
4d588c14 10514 else if (legitimate_constant_pool_address_p (x))
9ebbca7d 10515 {
2bfcf297 10516 if (TARGET_AIX && (!TARGET_ELF || !TARGET_MINIMAL_TOC))
9ebbca7d 10517 {
2bfcf297
DB
10518 rtx contains_minus = XEXP (x, 1);
10519 rtx minus, symref;
10520 const char *name;
9ebbca7d
GK
10521
10522 /* Find the (minus (sym) (toc)) buried in X, and temporarily
a4f6c312 10523 turn it into (sym) for output_addr_const. */
9ebbca7d
GK
10524 while (GET_CODE (XEXP (contains_minus, 0)) != MINUS)
10525 contains_minus = XEXP (contains_minus, 0);
10526
2bfcf297
DB
10527 minus = XEXP (contains_minus, 0);
10528 symref = XEXP (minus, 0);
10529 XEXP (contains_minus, 0) = symref;
10530 if (TARGET_ELF)
10531 {
10532 char *newname;
10533
10534 name = XSTR (symref, 0);
10535 newname = alloca (strlen (name) + sizeof ("@toc"));
10536 strcpy (newname, name);
10537 strcat (newname, "@toc");
10538 XSTR (symref, 0) = newname;
10539 }
10540 output_addr_const (file, XEXP (x, 1));
10541 if (TARGET_ELF)
10542 XSTR (symref, 0) = name;
9ebbca7d
GK
10543 XEXP (contains_minus, 0) = minus;
10544 }
10545 else
10546 output_addr_const (file, XEXP (x, 1));
10547
10548 fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
10549 }
9878760c
RK
10550 else
10551 abort ();
10552}
10553\f
88cad84b 10554/* Target hook for assembling integer objects. The PowerPC version has
301d03af
RS
10555 to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
10556 is defined. It also needs to handle DI-mode objects on 64-bit
10557 targets. */
10558
10559static bool
a2369ed3 10560rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
301d03af
RS
10561{
10562#ifdef RELOCATABLE_NEEDS_FIXUP
10563 /* Special handling for SI values. */
10564 if (size == 4 && aligned_p)
10565 {
a2369ed3 10566 extern int in_toc_section (void);
301d03af
RS
10567 static int recurse = 0;
10568
10569 /* For -mrelocatable, we mark all addresses that need to be fixed up
10570 in the .fixup section. */
10571 if (TARGET_RELOCATABLE
10572 && !in_toc_section ()
10573 && !in_text_section ()
642af3be 10574 && !in_unlikely_text_section ()
301d03af
RS
10575 && !recurse
10576 && GET_CODE (x) != CONST_INT
10577 && GET_CODE (x) != CONST_DOUBLE
10578 && CONSTANT_P (x))
10579 {
10580 char buf[256];
10581
10582 recurse = 1;
10583 ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
10584 fixuplabelno++;
10585 ASM_OUTPUT_LABEL (asm_out_file, buf);
10586 fprintf (asm_out_file, "\t.long\t(");
10587 output_addr_const (asm_out_file, x);
10588 fprintf (asm_out_file, ")@fixup\n");
10589 fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
10590 ASM_OUTPUT_ALIGN (asm_out_file, 2);
10591 fprintf (asm_out_file, "\t.long\t");
10592 assemble_name (asm_out_file, buf);
10593 fprintf (asm_out_file, "\n\t.previous\n");
10594 recurse = 0;
10595 return true;
10596 }
10597 /* Remove initial .'s to turn a -mcall-aixdesc function
10598 address into the address of the descriptor, not the function
10599 itself. */
10600 else if (GET_CODE (x) == SYMBOL_REF
10601 && XSTR (x, 0)[0] == '.'
10602 && DEFAULT_ABI == ABI_AIX)
10603 {
10604 const char *name = XSTR (x, 0);
10605 while (*name == '.')
10606 name++;
10607
10608 fprintf (asm_out_file, "\t.long\t%s\n", name);
10609 return true;
10610 }
10611 }
10612#endif /* RELOCATABLE_NEEDS_FIXUP */
10613 return default_assemble_integer (x, size, aligned_p);
10614}
93638d7a
AM
10615
10616#ifdef HAVE_GAS_HIDDEN
10617/* Emit an assembler directive to set symbol visibility for DECL to
10618 VISIBILITY_TYPE. */
10619
5add3202 10620static void
a2369ed3 10621rs6000_assemble_visibility (tree decl, int vis)
93638d7a 10622{
93638d7a
AM
10623 /* Functions need to have their entry point symbol visibility set as
10624 well as their descriptor symbol visibility. */
85b776df
AM
10625 if (DEFAULT_ABI == ABI_AIX
10626 && DOT_SYMBOLS
10627 && TREE_CODE (decl) == FUNCTION_DECL)
93638d7a 10628 {
25fdb4dc
RH
10629 static const char * const visibility_types[] = {
10630 NULL, "internal", "hidden", "protected"
10631 };
10632
10633 const char *name, *type;
93638d7a
AM
10634
10635 name = ((* targetm.strip_name_encoding)
10636 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
25fdb4dc 10637 type = visibility_types[vis];
93638d7a 10638
25fdb4dc
RH
10639 fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
10640 fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
93638d7a 10641 }
25fdb4dc
RH
10642 else
10643 default_assemble_visibility (decl, vis);
93638d7a
AM
10644}
10645#endif
301d03af 10646\f
39a10a29 10647enum rtx_code
a2369ed3 10648rs6000_reverse_condition (enum machine_mode mode, enum rtx_code code)
39a10a29
GK
10649{
10650 /* Reversal of FP compares takes care -- an ordered compare
10651 becomes an unordered compare and vice versa. */
bc9ec0e0
GK
10652 if (mode == CCFPmode
10653 && (!flag_finite_math_only
10654 || code == UNLT || code == UNLE || code == UNGT || code == UNGE
10655 || code == UNEQ || code == LTGT))
bab6226b 10656 return reverse_condition_maybe_unordered (code);
39a10a29 10657 else
bab6226b 10658 return reverse_condition (code);
39a10a29
GK
10659}
10660
39a10a29
GK
10661/* Generate a compare for CODE. Return a brand-new rtx that
10662 represents the result of the compare. */
a4f6c312 10663
39a10a29 10664static rtx
a2369ed3 10665rs6000_generate_compare (enum rtx_code code)
39a10a29
GK
10666{
10667 enum machine_mode comp_mode;
10668 rtx compare_result;
10669
10670 if (rs6000_compare_fp_p)
10671 comp_mode = CCFPmode;
10672 else if (code == GTU || code == LTU
10673 || code == GEU || code == LEU)
10674 comp_mode = CCUNSmode;
10675 else
10676 comp_mode = CCmode;
10677
10678 /* First, the compare. */
10679 compare_result = gen_reg_rtx (comp_mode);
a3170dc6
AH
10680
10681 /* SPE FP compare instructions on the GPRs. Yuck! */
993f19a8
AH
10682 if ((TARGET_E500 && !TARGET_FPRS && TARGET_HARD_FLOAT)
10683 && rs6000_compare_fp_p)
a3170dc6
AH
10684 {
10685 rtx cmp, or1, or2, or_result, compare_result2;
10686
423c1189
AH
10687 /* Note: The E500 comparison instructions set the GT bit (x +
10688 1), on success. This explains the mess. */
10689
a3170dc6
AH
10690 switch (code)
10691 {
423c1189 10692 case EQ: case UNEQ: case NE: case LTGT:
bc9ec0e0 10693 cmp = flag_finite_math_only
a3170dc6
AH
10694 ? gen_tstsfeq_gpr (compare_result, rs6000_compare_op0,
10695 rs6000_compare_op1)
10696 : gen_cmpsfeq_gpr (compare_result, rs6000_compare_op0,
10697 rs6000_compare_op1);
10698 break;
423c1189 10699 case GT: case GTU: case UNGT: case UNGE: case GE: case GEU:
bc9ec0e0 10700 cmp = flag_finite_math_only
a3170dc6
AH
10701 ? gen_tstsfgt_gpr (compare_result, rs6000_compare_op0,
10702 rs6000_compare_op1)
10703 : gen_cmpsfgt_gpr (compare_result, rs6000_compare_op0,
10704 rs6000_compare_op1);
10705 break;
423c1189 10706 case LT: case LTU: case UNLT: case UNLE: case LE: case LEU:
bc9ec0e0 10707 cmp = flag_finite_math_only
a3170dc6
AH
10708 ? gen_tstsflt_gpr (compare_result, rs6000_compare_op0,
10709 rs6000_compare_op1)
10710 : gen_cmpsflt_gpr (compare_result, rs6000_compare_op0,
10711 rs6000_compare_op1);
10712 break;
10713 default:
10714 abort ();
10715 }
10716
10717 /* Synthesize LE and GE from LT/GT || EQ. */
10718 if (code == LE || code == GE || code == LEU || code == GEU)
10719 {
a3170dc6
AH
10720 emit_insn (cmp);
10721
10722 switch (code)
10723 {
10724 case LE: code = LT; break;
10725 case GE: code = GT; break;
10726 case LEU: code = LT; break;
10727 case GEU: code = GT; break;
10728 default: abort ();
10729 }
10730
10731 or1 = gen_reg_rtx (SImode);
10732 or2 = gen_reg_rtx (SImode);
10733 or_result = gen_reg_rtx (CCEQmode);
10734 compare_result2 = gen_reg_rtx (CCFPmode);
10735
10736 /* Do the EQ. */
bc9ec0e0 10737 cmp = flag_finite_math_only
a3170dc6
AH
10738 ? gen_tstsfeq_gpr (compare_result2, rs6000_compare_op0,
10739 rs6000_compare_op1)
10740 : gen_cmpsfeq_gpr (compare_result2, rs6000_compare_op0,
10741 rs6000_compare_op1);
10742 emit_insn (cmp);
10743
423c1189
AH
10744 or1 = gen_rtx_GT (SImode, compare_result, const0_rtx);
10745 or2 = gen_rtx_GT (SImode, compare_result2, const0_rtx);
a3170dc6
AH
10746
10747 /* OR them together. */
10748 cmp = gen_rtx_SET (VOIDmode, or_result,
10749 gen_rtx_COMPARE (CCEQmode,
10750 gen_rtx_IOR (SImode, or1, or2),
10751 const_true_rtx));
10752 compare_result = or_result;
10753 code = EQ;
10754 }
10755 else
10756 {
a3170dc6 10757 if (code == NE || code == LTGT)
a3170dc6 10758 code = NE;
423c1189
AH
10759 else
10760 code = EQ;
a3170dc6
AH
10761 }
10762
10763 emit_insn (cmp);
10764 }
10765 else
10766 emit_insn (gen_rtx_SET (VOIDmode, compare_result,
10767 gen_rtx_COMPARE (comp_mode,
10768 rs6000_compare_op0,
10769 rs6000_compare_op1)));
39a10a29 10770
ca5adc63 10771 /* Some kinds of FP comparisons need an OR operation;
bc9ec0e0 10772 under flag_finite_math_only we don't bother. */
39a10a29 10773 if (rs6000_compare_fp_p
bc9ec0e0 10774 && ! flag_finite_math_only
993f19a8 10775 && ! (TARGET_HARD_FLOAT && TARGET_E500 && !TARGET_FPRS)
39a10a29
GK
10776 && (code == LE || code == GE
10777 || code == UNEQ || code == LTGT
10778 || code == UNGT || code == UNLT))
10779 {
10780 enum rtx_code or1, or2;
10781 rtx or1_rtx, or2_rtx, compare2_rtx;
10782 rtx or_result = gen_reg_rtx (CCEQmode);
10783
10784 switch (code)
10785 {
10786 case LE: or1 = LT; or2 = EQ; break;
10787 case GE: or1 = GT; or2 = EQ; break;
10788 case UNEQ: or1 = UNORDERED; or2 = EQ; break;
10789 case LTGT: or1 = LT; or2 = GT; break;
10790 case UNGT: or1 = UNORDERED; or2 = GT; break;
10791 case UNLT: or1 = UNORDERED; or2 = LT; break;
10792 default: abort ();
10793 }
10794 validate_condition_mode (or1, comp_mode);
10795 validate_condition_mode (or2, comp_mode);
1c563bed
KH
10796 or1_rtx = gen_rtx_fmt_ee (or1, SImode, compare_result, const0_rtx);
10797 or2_rtx = gen_rtx_fmt_ee (or2, SImode, compare_result, const0_rtx);
39a10a29
GK
10798 compare2_rtx = gen_rtx_COMPARE (CCEQmode,
10799 gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
10800 const_true_rtx);
10801 emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
10802
10803 compare_result = or_result;
10804 code = EQ;
10805 }
10806
10807 validate_condition_mode (code, GET_MODE (compare_result));
10808
1c563bed 10809 return gen_rtx_fmt_ee (code, VOIDmode, compare_result, const0_rtx);
39a10a29
GK
10810}
10811
10812
10813/* Emit the RTL for an sCOND pattern. */
10814
10815void
a2369ed3 10816rs6000_emit_sCOND (enum rtx_code code, rtx result)
39a10a29
GK
10817{
10818 rtx condition_rtx;
10819 enum machine_mode op_mode;
b7053a3f 10820 enum rtx_code cond_code;
39a10a29
GK
10821
10822 condition_rtx = rs6000_generate_compare (code);
b7053a3f
GK
10823 cond_code = GET_CODE (condition_rtx);
10824
423c1189
AH
10825 if (TARGET_E500 && rs6000_compare_fp_p
10826 && !TARGET_FPRS && TARGET_HARD_FLOAT)
10827 {
10828 rtx t;
10829
10830 PUT_MODE (condition_rtx, SImode);
10831 t = XEXP (condition_rtx, 0);
10832
10833 if (cond_code != NE && cond_code != EQ)
10834 abort ();
10835
10836 if (cond_code == NE)
6b1fedc3 10837 emit_insn (gen_e500_flip_eq_bit (t, t));
423c1189 10838
6b1fedc3 10839 emit_insn (gen_move_from_CR_eq_bit (result, t));
423c1189
AH
10840 return;
10841 }
10842
b7053a3f
GK
10843 if (cond_code == NE
10844 || cond_code == GE || cond_code == LE
10845 || cond_code == GEU || cond_code == LEU
10846 || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
10847 {
10848 rtx not_result = gen_reg_rtx (CCEQmode);
10849 rtx not_op, rev_cond_rtx;
10850 enum machine_mode cc_mode;
10851
10852 cc_mode = GET_MODE (XEXP (condition_rtx, 0));
10853
1c563bed 10854 rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, cond_code),
0f4c242b 10855 SImode, XEXP (condition_rtx, 0), const0_rtx);
b7053a3f
GK
10856 not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
10857 emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
10858 condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
10859 }
39a10a29
GK
10860
10861 op_mode = GET_MODE (rs6000_compare_op0);
10862 if (op_mode == VOIDmode)
10863 op_mode = GET_MODE (rs6000_compare_op1);
10864
10865 if (TARGET_POWERPC64 && (op_mode == DImode || rs6000_compare_fp_p))
10866 {
10867 PUT_MODE (condition_rtx, DImode);
10868 convert_move (result, condition_rtx, 0);
10869 }
10870 else
10871 {
10872 PUT_MODE (condition_rtx, SImode);
10873 emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
10874 }
10875}
10876
39a10a29
GK
10877/* Emit a branch of kind CODE to location LOC. */
10878
10879void
a2369ed3 10880rs6000_emit_cbranch (enum rtx_code code, rtx loc)
39a10a29
GK
10881{
10882 rtx condition_rtx, loc_ref;
10883
10884 condition_rtx = rs6000_generate_compare (code);
10885 loc_ref = gen_rtx_LABEL_REF (VOIDmode, loc);
10886 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
10887 gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
10888 loc_ref, pc_rtx)));
10889}
10890
12a4e8c5
GK
10891/* Return the string to output a conditional branch to LABEL, which is
10892 the operand number of the label, or -1 if the branch is really a
10893 conditional return.
10894
10895 OP is the conditional expression. XEXP (OP, 0) is assumed to be a
10896 condition code register and its mode specifies what kind of
10897 comparison we made.
10898
a0ab749a 10899 REVERSED is nonzero if we should reverse the sense of the comparison.
12a4e8c5
GK
10900
10901 INSN is the insn. */
10902
10903char *
a2369ed3 10904output_cbranch (rtx op, const char *label, int reversed, rtx insn)
12a4e8c5
GK
10905{
10906 static char string[64];
10907 enum rtx_code code = GET_CODE (op);
10908 rtx cc_reg = XEXP (op, 0);
10909 enum machine_mode mode = GET_MODE (cc_reg);
10910 int cc_regno = REGNO (cc_reg) - CR0_REGNO;
39a10a29 10911 int need_longbranch = label != NULL && get_attr_length (insn) == 8;
12a4e8c5
GK
10912 int really_reversed = reversed ^ need_longbranch;
10913 char *s = string;
10914 const char *ccode;
10915 const char *pred;
10916 rtx note;
10917
39a10a29
GK
10918 validate_condition_mode (code, mode);
10919
10920 /* Work out which way this really branches. We could use
10921 reverse_condition_maybe_unordered here always but this
10922 makes the resulting assembler clearer. */
12a4e8c5 10923 if (really_reversed)
de40e1df
DJ
10924 {
10925 /* Reversal of FP compares takes care -- an ordered compare
10926 becomes an unordered compare and vice versa. */
10927 if (mode == CCFPmode)
10928 code = reverse_condition_maybe_unordered (code);
10929 else
10930 code = reverse_condition (code);
10931 }
12a4e8c5 10932
993f19a8 10933 if ((TARGET_E500 && !TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
a3170dc6
AH
10934 {
10935 /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
10936 to the GT bit. */
10937 if (code == EQ)
10938 /* Opposite of GT. */
a3170dc6 10939 code = GT;
423c1189
AH
10940 else if (code == NE)
10941 code = UNLE;
a3170dc6
AH
10942 else
10943 abort ();
10944 }
10945
39a10a29 10946 switch (code)
12a4e8c5
GK
10947 {
10948 /* Not all of these are actually distinct opcodes, but
10949 we distinguish them for clarity of the resulting assembler. */
50a0b056
GK
10950 case NE: case LTGT:
10951 ccode = "ne"; break;
10952 case EQ: case UNEQ:
10953 ccode = "eq"; break;
10954 case GE: case GEU:
10955 ccode = "ge"; break;
10956 case GT: case GTU: case UNGT:
10957 ccode = "gt"; break;
10958 case LE: case LEU:
10959 ccode = "le"; break;
10960 case LT: case LTU: case UNLT:
10961 ccode = "lt"; break;
12a4e8c5
GK
10962 case UNORDERED: ccode = "un"; break;
10963 case ORDERED: ccode = "nu"; break;
10964 case UNGE: ccode = "nl"; break;
10965 case UNLE: ccode = "ng"; break;
10966 default:
a4f6c312 10967 abort ();
12a4e8c5
GK
10968 }
10969
94a54f47
GK
10970 /* Maybe we have a guess as to how likely the branch is.
10971 The old mnemonics don't have a way to specify this information. */
f4857b9b 10972 pred = "";
12a4e8c5
GK
10973 note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
10974 if (note != NULL_RTX)
10975 {
10976 /* PROB is the difference from 50%. */
10977 int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
f4857b9b
AM
10978
10979 /* Only hint for highly probable/improbable branches on newer
10980 cpus as static prediction overrides processor dynamic
10981 prediction. For older cpus we may as well always hint, but
10982 assume not taken for branches that are very close to 50% as a
10983 mispredicted taken branch is more expensive than a
10984 mispredicted not-taken branch. */
ec507f2d 10985 if (rs6000_always_hint
f4857b9b
AM
10986 || abs (prob) > REG_BR_PROB_BASE / 100 * 48)
10987 {
10988 if (abs (prob) > REG_BR_PROB_BASE / 20
10989 && ((prob > 0) ^ need_longbranch))
7f3d8013 10990 pred = "+";
f4857b9b
AM
10991 else
10992 pred = "-";
10993 }
12a4e8c5 10994 }
12a4e8c5
GK
10995
10996 if (label == NULL)
94a54f47 10997 s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
12a4e8c5 10998 else
94a54f47 10999 s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
12a4e8c5 11000
37c67319 11001 /* We need to escape any '%' characters in the reg_names string.
a3c9585f 11002 Assume they'd only be the first character.... */
37c67319
GK
11003 if (reg_names[cc_regno + CR0_REGNO][0] == '%')
11004 *s++ = '%';
94a54f47 11005 s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
12a4e8c5
GK
11006
11007 if (label != NULL)
11008 {
11009 /* If the branch distance was too far, we may have to use an
11010 unconditional branch to go the distance. */
11011 if (need_longbranch)
44518ddd 11012 s += sprintf (s, ",$+8\n\tb %s", label);
12a4e8c5
GK
11013 else
11014 s += sprintf (s, ",%s", label);
11015 }
11016
11017 return string;
11018}
50a0b056 11019
6b1fedc3 11020/* Return the string to flip the EQ bit on a CR. */
423c1189 11021char *
6b1fedc3 11022output_e500_flip_eq_bit (rtx dst, rtx src)
423c1189
AH
11023{
11024 static char string[64];
11025 int a, b;
11026
11027 if (GET_CODE (dst) != REG || ! CR_REGNO_P (REGNO (dst))
11028 || GET_CODE (src) != REG || ! CR_REGNO_P (REGNO (src)))
11029 abort ();
11030
6b1fedc3
AH
11031 /* EQ bit. */
11032 a = 4 * (REGNO (dst) - CR0_REGNO) + 2;
11033 b = 4 * (REGNO (src) - CR0_REGNO) + 2;
423c1189
AH
11034
11035 sprintf (string, "crnot %d,%d", a, b);
11036 return string;
11037}
11038
50a0b056
GK
11039/* Emit a conditional move: move TRUE_COND to DEST if OP of the
11040 operands of the last comparison is nonzero/true, FALSE_COND if it
11041 is zero/false. Return 0 if the hardware has no such operation. */
a4f6c312 11042
50a0b056 11043int
a2369ed3 11044rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
50a0b056
GK
11045{
11046 enum rtx_code code = GET_CODE (op);
11047 rtx op0 = rs6000_compare_op0;
11048 rtx op1 = rs6000_compare_op1;
11049 REAL_VALUE_TYPE c1;
3148ad6d
DJ
11050 enum machine_mode compare_mode = GET_MODE (op0);
11051 enum machine_mode result_mode = GET_MODE (dest);
50a0b056
GK
11052 rtx temp;
11053
a3c9585f 11054 /* These modes should always match. */
a3170dc6
AH
11055 if (GET_MODE (op1) != compare_mode
11056 /* In the isel case however, we can use a compare immediate, so
11057 op1 may be a small constant. */
11058 && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
3148ad6d 11059 return 0;
178c3eff 11060 if (GET_MODE (true_cond) != result_mode)
3148ad6d 11061 return 0;
178c3eff 11062 if (GET_MODE (false_cond) != result_mode)
3148ad6d
DJ
11063 return 0;
11064
50a0b056 11065 /* First, work out if the hardware can do this at all, or
a3c9585f 11066 if it's too slow.... */
50a0b056 11067 if (! rs6000_compare_fp_p)
a3170dc6
AH
11068 {
11069 if (TARGET_ISEL)
11070 return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
11071 return 0;
11072 }
fef98bf2
AH
11073 else if (TARGET_E500 && TARGET_HARD_FLOAT && !TARGET_FPRS
11074 && GET_MODE_CLASS (compare_mode) == MODE_FLOAT)
11075 return 0;
50a0b056
GK
11076
11077 /* Eliminate half of the comparisons by switching operands, this
11078 makes the remaining code simpler. */
11079 if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
bc9ec0e0 11080 || code == LTGT || code == LT || code == UNLE)
50a0b056
GK
11081 {
11082 code = reverse_condition_maybe_unordered (code);
11083 temp = true_cond;
11084 true_cond = false_cond;
11085 false_cond = temp;
11086 }
11087
11088 /* UNEQ and LTGT take four instructions for a comparison with zero,
11089 it'll probably be faster to use a branch here too. */
bc9ec0e0 11090 if (code == UNEQ && HONOR_NANS (compare_mode))
50a0b056
GK
11091 return 0;
11092
11093 if (GET_CODE (op1) == CONST_DOUBLE)
11094 REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
11095
b6d08ca1 11096 /* We're going to try to implement comparisons by performing
50a0b056
GK
11097 a subtract, then comparing against zero. Unfortunately,
11098 Inf - Inf is NaN which is not zero, and so if we don't
27d30956 11099 know that the operand is finite and the comparison
50a0b056 11100 would treat EQ different to UNORDERED, we can't do it. */
bc9ec0e0 11101 if (HONOR_INFINITIES (compare_mode)
50a0b056 11102 && code != GT && code != UNGE
045572c7 11103 && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
50a0b056
GK
11104 /* Constructs of the form (a OP b ? a : b) are safe. */
11105 && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
11106 || (! rtx_equal_p (op0, true_cond)
11107 && ! rtx_equal_p (op1, true_cond))))
11108 return 0;
11109 /* At this point we know we can use fsel. */
11110
11111 /* Reduce the comparison to a comparison against zero. */
3148ad6d 11112 temp = gen_reg_rtx (compare_mode);
50a0b056 11113 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 11114 gen_rtx_MINUS (compare_mode, op0, op1)));
50a0b056 11115 op0 = temp;
3148ad6d 11116 op1 = CONST0_RTX (compare_mode);
50a0b056
GK
11117
11118 /* If we don't care about NaNs we can reduce some of the comparisons
11119 down to faster ones. */
bc9ec0e0 11120 if (! HONOR_NANS (compare_mode))
50a0b056
GK
11121 switch (code)
11122 {
11123 case GT:
11124 code = LE;
11125 temp = true_cond;
11126 true_cond = false_cond;
11127 false_cond = temp;
11128 break;
11129 case UNGE:
11130 code = GE;
11131 break;
11132 case UNEQ:
11133 code = EQ;
11134 break;
11135 default:
11136 break;
11137 }
11138
11139 /* Now, reduce everything down to a GE. */
11140 switch (code)
11141 {
11142 case GE:
11143 break;
11144
11145 case LE:
3148ad6d
DJ
11146 temp = gen_reg_rtx (compare_mode);
11147 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
11148 op0 = temp;
11149 break;
11150
11151 case ORDERED:
3148ad6d
DJ
11152 temp = gen_reg_rtx (compare_mode);
11153 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
50a0b056
GK
11154 op0 = temp;
11155 break;
11156
11157 case EQ:
3148ad6d 11158 temp = gen_reg_rtx (compare_mode);
50a0b056 11159 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d
DJ
11160 gen_rtx_NEG (compare_mode,
11161 gen_rtx_ABS (compare_mode, op0))));
50a0b056
GK
11162 op0 = temp;
11163 break;
11164
11165 case UNGE:
bc9ec0e0 11166 /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
3148ad6d 11167 temp = gen_reg_rtx (result_mode);
50a0b056 11168 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 11169 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
11170 gen_rtx_GE (VOIDmode,
11171 op0, op1),
11172 true_cond, false_cond)));
bc9ec0e0
GK
11173 false_cond = true_cond;
11174 true_cond = temp;
50a0b056 11175
3148ad6d
DJ
11176 temp = gen_reg_rtx (compare_mode);
11177 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
11178 op0 = temp;
11179 break;
11180
11181 case GT:
bc9ec0e0 11182 /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
3148ad6d 11183 temp = gen_reg_rtx (result_mode);
50a0b056 11184 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 11185 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
11186 gen_rtx_GE (VOIDmode,
11187 op0, op1),
11188 true_cond, false_cond)));
bc9ec0e0
GK
11189 true_cond = false_cond;
11190 false_cond = temp;
50a0b056 11191
3148ad6d
DJ
11192 temp = gen_reg_rtx (compare_mode);
11193 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
11194 op0 = temp;
11195 break;
11196
11197 default:
11198 abort ();
11199 }
11200
11201 emit_insn (gen_rtx_SET (VOIDmode, dest,
3148ad6d 11202 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
11203 gen_rtx_GE (VOIDmode,
11204 op0, op1),
11205 true_cond, false_cond)));
11206 return 1;
11207}
11208
a3170dc6
AH
11209/* Same as above, but for ints (isel). */
11210
11211static int
a2369ed3 11212rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
a3170dc6
AH
11213{
11214 rtx condition_rtx, cr;
11215
11216 /* All isel implementations thus far are 32-bits. */
11217 if (GET_MODE (rs6000_compare_op0) != SImode)
11218 return 0;
11219
11220 /* We still have to do the compare, because isel doesn't do a
11221 compare, it just looks at the CRx bits set by a previous compare
11222 instruction. */
11223 condition_rtx = rs6000_generate_compare (GET_CODE (op));
11224 cr = XEXP (condition_rtx, 0);
11225
11226 if (GET_MODE (cr) == CCmode)
11227 emit_insn (gen_isel_signed (dest, condition_rtx,
11228 true_cond, false_cond, cr));
11229 else
11230 emit_insn (gen_isel_unsigned (dest, condition_rtx,
11231 true_cond, false_cond, cr));
11232
11233 return 1;
11234}
11235
11236const char *
a2369ed3 11237output_isel (rtx *operands)
a3170dc6
AH
11238{
11239 enum rtx_code code;
11240
11241 code = GET_CODE (operands[1]);
11242 if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
11243 {
11244 PUT_CODE (operands[1], reverse_condition (code));
11245 return "isel %0,%3,%2,%j1";
11246 }
11247 else
11248 return "isel %0,%2,%3,%j1";
11249}
11250
50a0b056 11251void
a2369ed3 11252rs6000_emit_minmax (rtx dest, enum rtx_code code, rtx op0, rtx op1)
50a0b056
GK
11253{
11254 enum machine_mode mode = GET_MODE (op0);
5dc8d536 11255 enum rtx_code c;
50a0b056 11256 rtx target;
5dc8d536
AH
11257
11258 if (code == SMAX || code == SMIN)
11259 c = GE;
11260 else
11261 c = GEU;
11262
50a0b056 11263 if (code == SMAX || code == UMAX)
5dc8d536 11264 target = emit_conditional_move (dest, c, op0, op1, mode,
50a0b056
GK
11265 op0, op1, mode, 0);
11266 else
5dc8d536 11267 target = emit_conditional_move (dest, c, op0, op1, mode,
50a0b056
GK
11268 op1, op0, mode, 0);
11269 if (target == NULL_RTX)
11270 abort ();
11271 if (target != dest)
11272 emit_move_insn (dest, target);
11273}
46c07df8 11274
a9baceb1
GK
11275/* Emit instructions to move SRC to DST. Called by splitters for
11276 multi-register moves. It will emit at most one instruction for
11277 each register that is accessed; that is, it won't emit li/lis pairs
11278 (or equivalent for 64-bit code). One of SRC or DST must be a hard
11279 register. */
46c07df8 11280
46c07df8 11281void
a9baceb1 11282rs6000_split_multireg_move (rtx dst, rtx src)
46c07df8 11283{
a9baceb1
GK
11284 /* The register number of the first register being moved. */
11285 int reg;
11286 /* The mode that is to be moved. */
11287 enum machine_mode mode;
11288 /* The mode that the move is being done in, and its size. */
11289 enum machine_mode reg_mode;
11290 int reg_mode_size;
11291 /* The number of registers that will be moved. */
11292 int nregs;
11293
11294 reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
11295 mode = GET_MODE (dst);
11296 nregs = HARD_REGNO_NREGS (reg, mode);
11297 if (FP_REGNO_P (reg))
11298 reg_mode = DFmode;
11299 else if (ALTIVEC_REGNO_P (reg))
11300 reg_mode = V16QImode;
11301 else
11302 reg_mode = word_mode;
11303 reg_mode_size = GET_MODE_SIZE (reg_mode);
46c07df8 11304
a9baceb1
GK
11305 if (reg_mode_size * nregs != GET_MODE_SIZE (mode))
11306 abort ();
11307
11308 if (REG_P (src) && REG_P (dst) && (REGNO (src) < REGNO (dst)))
11309 {
11310 /* Move register range backwards, if we might have destructive
11311 overlap. */
11312 int i;
11313 for (i = nregs - 1; i >= 0; i--)
11314 emit_insn (gen_rtx_SET (VOIDmode,
11315 simplify_gen_subreg (reg_mode, dst, mode,
11316 i * reg_mode_size),
11317 simplify_gen_subreg (reg_mode, src, mode,
11318 i * reg_mode_size)));
11319 }
46c07df8
HP
11320 else
11321 {
a9baceb1
GK
11322 int i;
11323 int j = -1;
11324 bool used_update = false;
46c07df8 11325
c1e55850 11326 if (MEM_P (src) && INT_REGNO_P (reg))
46c07df8
HP
11327 {
11328 rtx breg;
3a1f863f 11329
a9baceb1
GK
11330 if (GET_CODE (XEXP (src, 0)) == PRE_INC
11331 || GET_CODE (XEXP (src, 0)) == PRE_DEC)
3a1f863f
DE
11332 {
11333 rtx delta_rtx;
a9baceb1
GK
11334 breg = XEXP (XEXP (src, 0), 0);
11335 delta_rtx = GET_CODE (XEXP (src, 0)) == PRE_INC
11336 ? GEN_INT (GET_MODE_SIZE (GET_MODE (src)))
11337 : GEN_INT (-GET_MODE_SIZE (GET_MODE (src)));
11338 emit_insn (TARGET_32BIT
11339 ? gen_addsi3 (breg, breg, delta_rtx)
11340 : gen_adddi3 (breg, breg, delta_rtx));
3a1f863f
DE
11341 src = gen_rtx_MEM (mode, breg);
11342 }
c1e55850
GK
11343 else if (! offsettable_memref_p (src))
11344 {
11345 rtx newsrc, basereg;
11346 basereg = gen_rtx_REG (Pmode, reg);
11347 emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0)));
11348 newsrc = gen_rtx_MEM (GET_MODE (src), basereg);
11349 MEM_COPY_ATTRIBUTES (newsrc, src);
11350 src = newsrc;
11351 }
3a1f863f
DE
11352
11353 /* We have now address involving an base register only.
11354 If we use one of the registers to address memory,
11355 we have change that register last. */
11356
11357 breg = (GET_CODE (XEXP (src, 0)) == PLUS
11358 ? XEXP (XEXP (src, 0), 0)
11359 : XEXP (src, 0));
11360
11361 if (!REG_P (breg))
11362 abort();
11363
11364 if (REGNO (breg) >= REGNO (dst)
11365 && REGNO (breg) < REGNO (dst) + nregs)
11366 j = REGNO (breg) - REGNO (dst);
46c07df8
HP
11367 }
11368
a9baceb1 11369 if (GET_CODE (dst) == MEM && INT_REGNO_P (reg))
3a1f863f
DE
11370 {
11371 rtx breg;
11372
a9baceb1
GK
11373 if (GET_CODE (XEXP (dst, 0)) == PRE_INC
11374 || GET_CODE (XEXP (dst, 0)) == PRE_DEC)
3a1f863f
DE
11375 {
11376 rtx delta_rtx;
a9baceb1
GK
11377 breg = XEXP (XEXP (dst, 0), 0);
11378 delta_rtx = GET_CODE (XEXP (dst, 0)) == PRE_INC
11379 ? GEN_INT (GET_MODE_SIZE (GET_MODE (dst)))
11380 : GEN_INT (-GET_MODE_SIZE (GET_MODE (dst)));
3a1f863f
DE
11381
11382 /* We have to update the breg before doing the store.
11383 Use store with update, if available. */
11384
11385 if (TARGET_UPDATE)
11386 {
a9baceb1
GK
11387 rtx nsrc = simplify_gen_subreg (reg_mode, src, mode, 0);
11388 emit_insn (TARGET_32BIT
11389 ? gen_movsi_update (breg, breg, delta_rtx, nsrc)
11390 : gen_movdi_update (breg, breg, delta_rtx, nsrc));
11391 used_update = true;
3a1f863f
DE
11392 }
11393 else
a9baceb1
GK
11394 emit_insn (TARGET_32BIT
11395 ? gen_addsi3 (breg, breg, delta_rtx)
11396 : gen_adddi3 (breg, breg, delta_rtx));
3a1f863f
DE
11397 dst = gen_rtx_MEM (mode, breg);
11398 }
c1e55850 11399 else if (! offsettable_memref_p (dst))
112ccb83 11400 abort ();
3a1f863f
DE
11401 }
11402
46c07df8 11403 for (i = 0; i < nregs; i++)
3a1f863f
DE
11404 {
11405 /* Calculate index to next subword. */
11406 ++j;
11407 if (j == nregs)
11408 j = 0;
46c07df8 11409
a9baceb1
GK
11410 /* If compiler already emited move of first word by
11411 store with update, no need to do anything. */
3a1f863f 11412 if (j == 0 && used_update)
a9baceb1
GK
11413 continue;
11414
11415 emit_insn (gen_rtx_SET (VOIDmode,
11416 simplify_gen_subreg (reg_mode, dst, mode,
11417 j * reg_mode_size),
11418 simplify_gen_subreg (reg_mode, src, mode,
11419 j * reg_mode_size)));
3a1f863f 11420 }
46c07df8
HP
11421 }
11422}
11423
12a4e8c5 11424\f
a4f6c312
SS
11425/* This page contains routines that are used to determine what the
11426 function prologue and epilogue code will do and write them out. */
9878760c 11427
a4f6c312
SS
11428/* Return the first fixed-point register that is required to be
11429 saved. 32 if none. */
9878760c
RK
11430
11431int
863d938c 11432first_reg_to_save (void)
9878760c
RK
11433{
11434 int first_reg;
11435
11436 /* Find lowest numbered live register. */
11437 for (first_reg = 13; first_reg <= 31; first_reg++)
a38d360d
GK
11438 if (regs_ever_live[first_reg]
11439 && (! call_used_regs[first_reg]
1db02437 11440 || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
14f00213 11441 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
b4db40bf
JJ
11442 || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
11443 || (TARGET_TOC && TARGET_MINIMAL_TOC)))))
9878760c
RK
11444 break;
11445
ee890fe2 11446#if TARGET_MACHO
93638d7a
AM
11447 if (flag_pic
11448 && current_function_uses_pic_offset_table
11449 && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
1db02437 11450 return RS6000_PIC_OFFSET_TABLE_REGNUM;
ee890fe2
SS
11451#endif
11452
9878760c
RK
11453 return first_reg;
11454}
11455
11456/* Similar, for FP regs. */
11457
11458int
863d938c 11459first_fp_reg_to_save (void)
9878760c
RK
11460{
11461 int first_reg;
11462
11463 /* Find lowest numbered live register. */
11464 for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
11465 if (regs_ever_live[first_reg])
11466 break;
11467
11468 return first_reg;
11469}
00b960c7
AH
11470
11471/* Similar, for AltiVec regs. */
11472
11473static int
863d938c 11474first_altivec_reg_to_save (void)
00b960c7
AH
11475{
11476 int i;
11477
11478 /* Stack frame remains as is unless we are in AltiVec ABI. */
11479 if (! TARGET_ALTIVEC_ABI)
11480 return LAST_ALTIVEC_REGNO + 1;
11481
11482 /* Find lowest numbered live register. */
11483 for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
11484 if (regs_ever_live[i])
11485 break;
11486
11487 return i;
11488}
11489
11490/* Return a 32-bit mask of the AltiVec registers we need to set in
11491 VRSAVE. Bit n of the return value is 1 if Vn is live. The MSB in
11492 the 32-bit word is 0. */
11493
11494static unsigned int
863d938c 11495compute_vrsave_mask (void)
00b960c7
AH
11496{
11497 unsigned int i, mask = 0;
11498
11499 /* First, find out if we use _any_ altivec registers. */
11500 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
11501 if (regs_ever_live[i])
11502 mask |= ALTIVEC_REG_BIT (i);
11503
11504 if (mask == 0)
11505 return mask;
11506
00b960c7
AH
11507 /* Next, remove the argument registers from the set. These must
11508 be in the VRSAVE mask set by the caller, so we don't need to add
11509 them in again. More importantly, the mask we compute here is
11510 used to generate CLOBBERs in the set_vrsave insn, and we do not
11511 wish the argument registers to die. */
a6cf80f2 11512 for (i = cfun->args_info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
00b960c7
AH
11513 mask &= ~ALTIVEC_REG_BIT (i);
11514
11515 /* Similarly, remove the return value from the set. */
11516 {
11517 bool yes = false;
11518 diddle_return_value (is_altivec_return_reg, &yes);
11519 if (yes)
11520 mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
11521 }
11522
11523 return mask;
11524}
11525
d62294f5
FJ
11526/* For a very restricted set of circumstances, we can cut down the
11527 size of prologs/epilogs by calling our own save/restore-the-world
11528 routines. */
11529
11530static void
11531compute_save_world_info(rs6000_stack_t *info_ptr)
11532{
11533 info_ptr->world_save_p =
11534 (DEFAULT_ABI == ABI_DARWIN)
11535 && ! (current_function_calls_setjmp && flag_exceptions)
11536 && info_ptr->first_fp_reg_save == FIRST_SAVED_FP_REGNO
11537 && info_ptr->first_gp_reg_save == FIRST_SAVED_GP_REGNO
11538 && info_ptr->first_altivec_reg_save == FIRST_SAVED_ALTIVEC_REGNO
11539 && info_ptr->cr_save_p;
11540
11541 /* This will not work in conjunction with sibcalls. Make sure there
11542 are none. (This check is expensive, but seldom executed.) */
11543 if ( info_ptr->world_save_p )
11544 {
11545 rtx insn;
11546 for ( insn = get_last_insn_anywhere (); insn; insn = PREV_INSN (insn))
11547 if ( GET_CODE (insn) == CALL_INSN
11548 && SIBLING_CALL_P (insn))
11549 {
11550 info_ptr->world_save_p = 0;
11551 break;
11552 }
11553 }
11554
11555 if (info_ptr->world_save_p)
11556 {
11557 /* Even if we're not touching VRsave, make sure there's room on the
11558 stack for it, if it looks like we're calling SAVE_WORLD, which
11559 will attempt to save it. */
11560 info_ptr->vrsave_size = 4;
11561
11562 /* "Save" the VRsave register too if we're saving the world. */
11563 if (info_ptr->vrsave_mask == 0)
11564 info_ptr->vrsave_mask = compute_vrsave_mask ();
11565
11566 /* Because the Darwin register save/restore routines only handle
11567 F14 .. F31 and V20 .. V31 as per the ABI, perform a consistancy
11568 check and abort if there's something worng. */
11569 if (info_ptr->first_fp_reg_save < FIRST_SAVED_FP_REGNO
11570 || info_ptr->first_altivec_reg_save < FIRST_SAVED_ALTIVEC_REGNO)
11571 abort ();
11572 }
11573 return;
11574}
11575
11576
00b960c7 11577static void
a2369ed3 11578is_altivec_return_reg (rtx reg, void *xyes)
00b960c7
AH
11579{
11580 bool *yes = (bool *) xyes;
11581 if (REGNO (reg) == ALTIVEC_ARG_RETURN)
11582 *yes = true;
11583}
11584
4697a36c
MM
11585\f
11586/* Calculate the stack information for the current function. This is
11587 complicated by having two separate calling sequences, the AIX calling
11588 sequence and the V.4 calling sequence.
11589
592696dd 11590 AIX (and Darwin/Mac OS X) stack frames look like:
a260abc9 11591 32-bit 64-bit
4697a36c 11592 SP----> +---------------------------------------+
a260abc9 11593 | back chain to caller | 0 0
4697a36c 11594 +---------------------------------------+
a260abc9 11595 | saved CR | 4 8 (8-11)
4697a36c 11596 +---------------------------------------+
a260abc9 11597 | saved LR | 8 16
4697a36c 11598 +---------------------------------------+
a260abc9 11599 | reserved for compilers | 12 24
4697a36c 11600 +---------------------------------------+
a260abc9 11601 | reserved for binders | 16 32
4697a36c 11602 +---------------------------------------+
a260abc9 11603 | saved TOC pointer | 20 40
4697a36c 11604 +---------------------------------------+
a260abc9 11605 | Parameter save area (P) | 24 48
4697a36c 11606 +---------------------------------------+
a260abc9 11607 | Alloca space (A) | 24+P etc.
802a0058 11608 +---------------------------------------+
a7df97e6 11609 | Local variable space (L) | 24+P+A
4697a36c 11610 +---------------------------------------+
a7df97e6 11611 | Float/int conversion temporary (X) | 24+P+A+L
4697a36c 11612 +---------------------------------------+
00b960c7
AH
11613 | Save area for AltiVec registers (W) | 24+P+A+L+X
11614 +---------------------------------------+
11615 | AltiVec alignment padding (Y) | 24+P+A+L+X+W
11616 +---------------------------------------+
11617 | Save area for VRSAVE register (Z) | 24+P+A+L+X+W+Y
4697a36c 11618 +---------------------------------------+
00b960c7
AH
11619 | Save area for GP registers (G) | 24+P+A+X+L+X+W+Y+Z
11620 +---------------------------------------+
11621 | Save area for FP registers (F) | 24+P+A+X+L+X+W+Y+Z+G
4697a36c
MM
11622 +---------------------------------------+
11623 old SP->| back chain to caller's caller |
11624 +---------------------------------------+
11625
5376a30c
KR
11626 The required alignment for AIX configurations is two words (i.e., 8
11627 or 16 bytes).
11628
11629
4697a36c
MM
11630 V.4 stack frames look like:
11631
11632 SP----> +---------------------------------------+
11633 | back chain to caller | 0
11634 +---------------------------------------+
5eb387b8 11635 | caller's saved LR | 4
4697a36c
MM
11636 +---------------------------------------+
11637 | Parameter save area (P) | 8
11638 +---------------------------------------+
a7df97e6
MM
11639 | Alloca space (A) | 8+P
11640 +---------------------------------------+
11641 | Varargs save area (V) | 8+P+A
11642 +---------------------------------------+
11643 | Local variable space (L) | 8+P+A+V
11644 +---------------------------------------+
11645 | Float/int conversion temporary (X) | 8+P+A+V+L
4697a36c 11646 +---------------------------------------+
00b960c7
AH
11647 | Save area for AltiVec registers (W) | 8+P+A+V+L+X
11648 +---------------------------------------+
11649 | AltiVec alignment padding (Y) | 8+P+A+V+L+X+W
11650 +---------------------------------------+
11651 | Save area for VRSAVE register (Z) | 8+P+A+V+L+X+W+Y
11652 +---------------------------------------+
a3170dc6
AH
11653 | SPE: area for 64-bit GP registers |
11654 +---------------------------------------+
11655 | SPE alignment padding |
11656 +---------------------------------------+
00b960c7 11657 | saved CR (C) | 8+P+A+V+L+X+W+Y+Z
a7df97e6 11658 +---------------------------------------+
00b960c7 11659 | Save area for GP registers (G) | 8+P+A+V+L+X+W+Y+Z+C
a7df97e6 11660 +---------------------------------------+
00b960c7 11661 | Save area for FP registers (F) | 8+P+A+V+L+X+W+Y+Z+C+G
4697a36c
MM
11662 +---------------------------------------+
11663 old SP->| back chain to caller's caller |
11664 +---------------------------------------+
b6c9286a 11665
5376a30c
KR
11666 The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
11667 given. (But note below and in sysv4.h that we require only 8 and
11668 may round up the size of our stack frame anyways. The historical
11669 reason is early versions of powerpc-linux which didn't properly
11670 align the stack at program startup. A happy side-effect is that
11671 -mno-eabi libraries can be used with -meabi programs.)
11672
50d440bc 11673 The EABI configuration defaults to the V.4 layout. However,
5376a30c
KR
11674 the stack alignment requirements may differ. If -mno-eabi is not
11675 given, the required stack alignment is 8 bytes; if -mno-eabi is
11676 given, the required alignment is 16 bytes. (But see V.4 comment
11677 above.) */
4697a36c 11678
61b2fbe7
MM
11679#ifndef ABI_STACK_BOUNDARY
11680#define ABI_STACK_BOUNDARY STACK_BOUNDARY
11681#endif
11682
d1d0c603 11683static rs6000_stack_t *
863d938c 11684rs6000_stack_info (void)
4697a36c
MM
11685{
11686 static rs6000_stack_t info, zero_info;
11687 rs6000_stack_t *info_ptr = &info;
327e5343 11688 int reg_size = TARGET_32BIT ? 4 : 8;
83720594 11689 int ehrd_size;
44688022 11690 HOST_WIDE_INT non_fixed_size;
4697a36c 11691
a4f6c312 11692 /* Zero all fields portably. */
4697a36c
MM
11693 info = zero_info;
11694
c19de7aa
AH
11695 if (TARGET_SPE)
11696 {
11697 /* Cache value so we don't rescan instruction chain over and over. */
9b7b447f
AH
11698 if (cfun->machine->insn_chain_scanned_p == 0)
11699 {
11700 cfun->machine->insn_chain_scanned_p = 1;
11701 info_ptr->spe_64bit_regs_used = (int) spe_func_has_64bit_regs_p ();
11702 }
c19de7aa
AH
11703 }
11704
a4f6c312 11705 /* Select which calling sequence. */
178274da 11706 info_ptr->abi = DEFAULT_ABI;
9878760c 11707
a4f6c312 11708 /* Calculate which registers need to be saved & save area size. */
4697a36c 11709 info_ptr->first_gp_reg_save = first_reg_to_save ();
1db02437 11710 /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
906fb125 11711 even if it currently looks like we won't. */
2bfcf297 11712 if (((TARGET_TOC && TARGET_MINIMAL_TOC)
178274da
AM
11713 || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
11714 || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
1db02437
FS
11715 && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
11716 info_ptr->gp_size = reg_size * (32 - RS6000_PIC_OFFSET_TABLE_REGNUM);
906fb125
GK
11717 else
11718 info_ptr->gp_size = reg_size * (32 - info_ptr->first_gp_reg_save);
4697a36c 11719
a3170dc6
AH
11720 /* For the SPE, we have an additional upper 32-bits on each GPR.
11721 Ideally we should save the entire 64-bits only when the upper
11722 half is used in SIMD instructions. Since we only record
11723 registers live (not the size they are used in), this proves
11724 difficult because we'd have to traverse the instruction chain at
11725 the right time, taking reload into account. This is a real pain,
c19de7aa
AH
11726 so we opt to save the GPRs in 64-bits always if but one register
11727 gets used in 64-bits. Otherwise, all the registers in the frame
11728 get saved in 32-bits.
a3170dc6 11729
c19de7aa 11730 So... since when we save all GPRs (except the SP) in 64-bits, the
a3170dc6 11731 traditional GP save area will be empty. */
c19de7aa 11732 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
a3170dc6
AH
11733 info_ptr->gp_size = 0;
11734
4697a36c
MM
11735 info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
11736 info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
11737
00b960c7
AH
11738 info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
11739 info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
11740 - info_ptr->first_altivec_reg_save);
11741
592696dd 11742 /* Does this function call anything? */
71f123ca
FS
11743 info_ptr->calls_p = (! current_function_is_leaf
11744 || cfun->machine->ra_needs_full_frame);
b6c9286a 11745
a4f6c312 11746 /* Determine if we need to save the link register. */
71f123ca 11747 if (rs6000_ra_ever_killed ()
ffcfcb5f
AM
11748 || (DEFAULT_ABI == ABI_AIX
11749 && current_function_profile
11750 && !TARGET_PROFILE_KERNEL)
4697a36c
MM
11751#ifdef TARGET_RELOCATABLE
11752 || (TARGET_RELOCATABLE && (get_pool_size () != 0))
11753#endif
11754 || (info_ptr->first_fp_reg_save != 64
11755 && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save))
00b960c7 11756 || info_ptr->first_altivec_reg_save <= LAST_ALTIVEC_REGNO
178274da 11757 || (DEFAULT_ABI == ABI_V4 && current_function_calls_alloca)
a4f6c312
SS
11758 || (DEFAULT_ABI == ABI_DARWIN
11759 && flag_pic
11760 && current_function_uses_pic_offset_table)
4697a36c
MM
11761 || info_ptr->calls_p)
11762 {
11763 info_ptr->lr_save_p = 1;
9ebbca7d 11764 regs_ever_live[LINK_REGISTER_REGNUM] = 1;
4697a36c
MM
11765 }
11766
9ebbca7d
GK
11767 /* Determine if we need to save the condition code registers. */
11768 if (regs_ever_live[CR2_REGNO]
11769 || regs_ever_live[CR3_REGNO]
11770 || regs_ever_live[CR4_REGNO])
4697a36c
MM
11771 {
11772 info_ptr->cr_save_p = 1;
178274da 11773 if (DEFAULT_ABI == ABI_V4)
4697a36c
MM
11774 info_ptr->cr_size = reg_size;
11775 }
11776
83720594
RH
11777 /* If the current function calls __builtin_eh_return, then we need
11778 to allocate stack space for registers that will hold data for
11779 the exception handler. */
11780 if (current_function_calls_eh_return)
11781 {
11782 unsigned int i;
11783 for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
11784 continue;
a3170dc6
AH
11785
11786 /* SPE saves EH registers in 64-bits. */
c19de7aa
AH
11787 ehrd_size = i * (TARGET_SPE_ABI
11788 && info_ptr->spe_64bit_regs_used != 0
11789 ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
83720594
RH
11790 }
11791 else
11792 ehrd_size = 0;
11793
592696dd 11794 /* Determine various sizes. */
4697a36c
MM
11795 info_ptr->reg_size = reg_size;
11796 info_ptr->fixed_size = RS6000_SAVE_AREA;
11797 info_ptr->varargs_size = RS6000_VARARGS_AREA;
189e03e3 11798 info_ptr->vars_size = RS6000_ALIGN (get_frame_size (), 8);
a4f6c312 11799 info_ptr->parm_size = RS6000_ALIGN (current_function_outgoing_args_size,
03e007d7 11800 TARGET_ALTIVEC ? 16 : 8);
00b960c7 11801
c19de7aa 11802 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
a3170dc6
AH
11803 info_ptr->spe_gp_size = 8 * (32 - info_ptr->first_gp_reg_save);
11804 else
11805 info_ptr->spe_gp_size = 0;
11806
4d774ff8
HP
11807 if (TARGET_ALTIVEC_ABI)
11808 info_ptr->vrsave_mask = compute_vrsave_mask ();
00b960c7 11809 else
4d774ff8
HP
11810 info_ptr->vrsave_mask = 0;
11811
11812 if (TARGET_ALTIVEC_VRSAVE && info_ptr->vrsave_mask)
11813 info_ptr->vrsave_size = 4;
11814 else
11815 info_ptr->vrsave_size = 0;
b6c9286a 11816
d62294f5
FJ
11817 compute_save_world_info (info_ptr);
11818
592696dd 11819 /* Calculate the offsets. */
178274da 11820 switch (DEFAULT_ABI)
4697a36c 11821 {
b6c9286a 11822 case ABI_NONE:
24d304eb 11823 default:
b6c9286a
MM
11824 abort ();
11825
11826 case ABI_AIX:
ee890fe2 11827 case ABI_DARWIN:
b6c9286a
MM
11828 info_ptr->fp_save_offset = - info_ptr->fp_size;
11829 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
00b960c7
AH
11830
11831 if (TARGET_ALTIVEC_ABI)
11832 {
11833 info_ptr->vrsave_save_offset
11834 = info_ptr->gp_save_offset - info_ptr->vrsave_size;
11835
11836 /* Align stack so vector save area is on a quadword boundary. */
11837 if (info_ptr->altivec_size != 0)
11838 info_ptr->altivec_padding_size
11839 = 16 - (-info_ptr->vrsave_save_offset % 16);
11840 else
11841 info_ptr->altivec_padding_size = 0;
11842
11843 info_ptr->altivec_save_offset
11844 = info_ptr->vrsave_save_offset
11845 - info_ptr->altivec_padding_size
11846 - info_ptr->altivec_size;
11847
11848 /* Adjust for AltiVec case. */
11849 info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
11850 }
11851 else
11852 info_ptr->ehrd_offset = info_ptr->gp_save_offset - ehrd_size;
a260abc9
DE
11853 info_ptr->cr_save_offset = reg_size; /* first word when 64-bit. */
11854 info_ptr->lr_save_offset = 2*reg_size;
24d304eb
RK
11855 break;
11856
11857 case ABI_V4:
b6c9286a
MM
11858 info_ptr->fp_save_offset = - info_ptr->fp_size;
11859 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
a7df97e6 11860 info_ptr->cr_save_offset = info_ptr->gp_save_offset - info_ptr->cr_size;
00b960c7 11861
c19de7aa 11862 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
a3170dc6
AH
11863 {
11864 /* Align stack so SPE GPR save area is aligned on a
11865 double-word boundary. */
11866 if (info_ptr->spe_gp_size != 0)
11867 info_ptr->spe_padding_size
11868 = 8 - (-info_ptr->cr_save_offset % 8);
11869 else
11870 info_ptr->spe_padding_size = 0;
11871
11872 info_ptr->spe_gp_save_offset
11873 = info_ptr->cr_save_offset
11874 - info_ptr->spe_padding_size
11875 - info_ptr->spe_gp_size;
11876
11877 /* Adjust for SPE case. */
11878 info_ptr->toc_save_offset
11879 = info_ptr->spe_gp_save_offset - info_ptr->toc_size;
11880 }
11881 else if (TARGET_ALTIVEC_ABI)
00b960c7
AH
11882 {
11883 info_ptr->vrsave_save_offset
11884 = info_ptr->cr_save_offset - info_ptr->vrsave_size;
11885
11886 /* Align stack so vector save area is on a quadword boundary. */
11887 if (info_ptr->altivec_size != 0)
11888 info_ptr->altivec_padding_size
11889 = 16 - (-info_ptr->vrsave_save_offset % 16);
11890 else
11891 info_ptr->altivec_padding_size = 0;
11892
11893 info_ptr->altivec_save_offset
11894 = info_ptr->vrsave_save_offset
11895 - info_ptr->altivec_padding_size
11896 - info_ptr->altivec_size;
11897
11898 /* Adjust for AltiVec case. */
11899 info_ptr->toc_save_offset
11900 = info_ptr->altivec_save_offset - info_ptr->toc_size;
11901 }
11902 else
11903 info_ptr->toc_save_offset = info_ptr->cr_save_offset - info_ptr->toc_size;
83720594 11904 info_ptr->ehrd_offset = info_ptr->toc_save_offset - ehrd_size;
b6c9286a
MM
11905 info_ptr->lr_save_offset = reg_size;
11906 break;
4697a36c
MM
11907 }
11908
00b960c7
AH
11909 info_ptr->save_size = RS6000_ALIGN (info_ptr->fp_size
11910 + info_ptr->gp_size
11911 + info_ptr->altivec_size
11912 + info_ptr->altivec_padding_size
a3170dc6
AH
11913 + info_ptr->spe_gp_size
11914 + info_ptr->spe_padding_size
00b960c7
AH
11915 + ehrd_size
11916 + info_ptr->cr_size
11917 + info_ptr->lr_size
11918 + info_ptr->vrsave_size
11919 + info_ptr->toc_size,
11920 (TARGET_ALTIVEC_ABI || ABI_DARWIN)
11921 ? 16 : 8);
11922
44688022 11923 non_fixed_size = (info_ptr->vars_size
ff381587 11924 + info_ptr->parm_size
ff381587 11925 + info_ptr->save_size
44688022 11926 + info_ptr->varargs_size);
ff381587 11927
44688022
AM
11928 info_ptr->total_size = RS6000_ALIGN (non_fixed_size + info_ptr->fixed_size,
11929 ABI_STACK_BOUNDARY / BITS_PER_UNIT);
ff381587
MM
11930
11931 /* Determine if we need to allocate any stack frame:
11932
a4f6c312
SS
11933 For AIX we need to push the stack if a frame pointer is needed
11934 (because the stack might be dynamically adjusted), if we are
11935 debugging, if we make calls, or if the sum of fp_save, gp_save,
11936 and local variables are more than the space needed to save all
11937 non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
11938 + 18*8 = 288 (GPR13 reserved).
ff381587 11939
a4f6c312
SS
11940 For V.4 we don't have the stack cushion that AIX uses, but assume
11941 that the debugger can handle stackless frames. */
ff381587
MM
11942
11943 if (info_ptr->calls_p)
11944 info_ptr->push_p = 1;
11945
178274da 11946 else if (DEFAULT_ABI == ABI_V4)
44688022 11947 info_ptr->push_p = non_fixed_size != 0;
ff381587 11948
178274da
AM
11949 else if (frame_pointer_needed)
11950 info_ptr->push_p = 1;
11951
11952 else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
11953 info_ptr->push_p = 1;
11954
ff381587 11955 else
44688022 11956 info_ptr->push_p = non_fixed_size > (TARGET_32BIT ? 220 : 288);
ff381587 11957
a4f6c312 11958 /* Zero offsets if we're not saving those registers. */
8dda1a21 11959 if (info_ptr->fp_size == 0)
4697a36c
MM
11960 info_ptr->fp_save_offset = 0;
11961
8dda1a21 11962 if (info_ptr->gp_size == 0)
4697a36c
MM
11963 info_ptr->gp_save_offset = 0;
11964
00b960c7
AH
11965 if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
11966 info_ptr->altivec_save_offset = 0;
11967
11968 if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
11969 info_ptr->vrsave_save_offset = 0;
11970
c19de7aa
AH
11971 if (! TARGET_SPE_ABI
11972 || info_ptr->spe_64bit_regs_used == 0
11973 || info_ptr->spe_gp_size == 0)
a3170dc6
AH
11974 info_ptr->spe_gp_save_offset = 0;
11975
c81fc13e 11976 if (! info_ptr->lr_save_p)
4697a36c
MM
11977 info_ptr->lr_save_offset = 0;
11978
c81fc13e 11979 if (! info_ptr->cr_save_p)
4697a36c
MM
11980 info_ptr->cr_save_offset = 0;
11981
c81fc13e 11982 if (! info_ptr->toc_save_p)
b6c9286a
MM
11983 info_ptr->toc_save_offset = 0;
11984
4697a36c
MM
11985 return info_ptr;
11986}
11987
c19de7aa
AH
11988/* Return true if the current function uses any GPRs in 64-bit SIMD
11989 mode. */
11990
11991static bool
863d938c 11992spe_func_has_64bit_regs_p (void)
c19de7aa
AH
11993{
11994 rtx insns, insn;
11995
11996 /* Functions that save and restore all the call-saved registers will
11997 need to save/restore the registers in 64-bits. */
11998 if (current_function_calls_eh_return
11999 || current_function_calls_setjmp
12000 || current_function_has_nonlocal_goto)
12001 return true;
12002
12003 insns = get_insns ();
12004
12005 for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
12006 {
12007 if (INSN_P (insn))
12008 {
12009 rtx i;
12010
12011 i = PATTERN (insn);
12012 if (GET_CODE (i) == SET
12013 && SPE_VECTOR_MODE (GET_MODE (SET_SRC (i))))
12014 return true;
12015 }
12016 }
12017
12018 return false;
12019}
12020
d1d0c603 12021static void
a2369ed3 12022debug_stack_info (rs6000_stack_t *info)
9878760c 12023{
d330fd93 12024 const char *abi_string;
24d304eb 12025
c81fc13e 12026 if (! info)
4697a36c
MM
12027 info = rs6000_stack_info ();
12028
12029 fprintf (stderr, "\nStack information for function %s:\n",
12030 ((current_function_decl && DECL_NAME (current_function_decl))
12031 ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
12032 : "<unknown>"));
12033
24d304eb
RK
12034 switch (info->abi)
12035 {
b6c9286a
MM
12036 default: abi_string = "Unknown"; break;
12037 case ABI_NONE: abi_string = "NONE"; break;
50d440bc 12038 case ABI_AIX: abi_string = "AIX"; break;
ee890fe2 12039 case ABI_DARWIN: abi_string = "Darwin"; break;
b6c9286a 12040 case ABI_V4: abi_string = "V.4"; break;
24d304eb
RK
12041 }
12042
12043 fprintf (stderr, "\tABI = %5s\n", abi_string);
12044
00b960c7
AH
12045 if (TARGET_ALTIVEC_ABI)
12046 fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
12047
a3170dc6
AH
12048 if (TARGET_SPE_ABI)
12049 fprintf (stderr, "\tSPE ABI extensions enabled.\n");
12050
4697a36c
MM
12051 if (info->first_gp_reg_save != 32)
12052 fprintf (stderr, "\tfirst_gp_reg_save = %5d\n", info->first_gp_reg_save);
12053
12054 if (info->first_fp_reg_save != 64)
12055 fprintf (stderr, "\tfirst_fp_reg_save = %5d\n", info->first_fp_reg_save);
9878760c 12056
00b960c7
AH
12057 if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
12058 fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
12059 info->first_altivec_reg_save);
12060
4697a36c
MM
12061 if (info->lr_save_p)
12062 fprintf (stderr, "\tlr_save_p = %5d\n", info->lr_save_p);
9878760c 12063
4697a36c
MM
12064 if (info->cr_save_p)
12065 fprintf (stderr, "\tcr_save_p = %5d\n", info->cr_save_p);
12066
b6c9286a
MM
12067 if (info->toc_save_p)
12068 fprintf (stderr, "\ttoc_save_p = %5d\n", info->toc_save_p);
12069
00b960c7
AH
12070 if (info->vrsave_mask)
12071 fprintf (stderr, "\tvrsave_mask = 0x%x\n", info->vrsave_mask);
12072
4697a36c
MM
12073 if (info->push_p)
12074 fprintf (stderr, "\tpush_p = %5d\n", info->push_p);
12075
12076 if (info->calls_p)
12077 fprintf (stderr, "\tcalls_p = %5d\n", info->calls_p);
12078
4697a36c
MM
12079 if (info->gp_save_offset)
12080 fprintf (stderr, "\tgp_save_offset = %5d\n", info->gp_save_offset);
12081
12082 if (info->fp_save_offset)
12083 fprintf (stderr, "\tfp_save_offset = %5d\n", info->fp_save_offset);
12084
00b960c7
AH
12085 if (info->altivec_save_offset)
12086 fprintf (stderr, "\taltivec_save_offset = %5d\n",
12087 info->altivec_save_offset);
12088
a3170dc6
AH
12089 if (info->spe_gp_save_offset)
12090 fprintf (stderr, "\tspe_gp_save_offset = %5d\n",
12091 info->spe_gp_save_offset);
12092
00b960c7
AH
12093 if (info->vrsave_save_offset)
12094 fprintf (stderr, "\tvrsave_save_offset = %5d\n",
12095 info->vrsave_save_offset);
12096
4697a36c
MM
12097 if (info->lr_save_offset)
12098 fprintf (stderr, "\tlr_save_offset = %5d\n", info->lr_save_offset);
12099
12100 if (info->cr_save_offset)
12101 fprintf (stderr, "\tcr_save_offset = %5d\n", info->cr_save_offset);
12102
b6c9286a
MM
12103 if (info->toc_save_offset)
12104 fprintf (stderr, "\ttoc_save_offset = %5d\n", info->toc_save_offset);
12105
4697a36c
MM
12106 if (info->varargs_save_offset)
12107 fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
12108
12109 if (info->total_size)
d1d0c603
JJ
12110 fprintf (stderr, "\ttotal_size = "HOST_WIDE_INT_PRINT_DEC"\n",
12111 info->total_size);
4697a36c
MM
12112
12113 if (info->varargs_size)
12114 fprintf (stderr, "\tvarargs_size = %5d\n", info->varargs_size);
12115
12116 if (info->vars_size)
d1d0c603
JJ
12117 fprintf (stderr, "\tvars_size = "HOST_WIDE_INT_PRINT_DEC"\n",
12118 info->vars_size);
4697a36c
MM
12119
12120 if (info->parm_size)
12121 fprintf (stderr, "\tparm_size = %5d\n", info->parm_size);
12122
12123 if (info->fixed_size)
12124 fprintf (stderr, "\tfixed_size = %5d\n", info->fixed_size);
12125
12126 if (info->gp_size)
12127 fprintf (stderr, "\tgp_size = %5d\n", info->gp_size);
12128
a3170dc6
AH
12129 if (info->spe_gp_size)
12130 fprintf (stderr, "\tspe_gp_size = %5d\n", info->spe_gp_size);
12131
4697a36c
MM
12132 if (info->fp_size)
12133 fprintf (stderr, "\tfp_size = %5d\n", info->fp_size);
12134
00b960c7
AH
12135 if (info->altivec_size)
12136 fprintf (stderr, "\taltivec_size = %5d\n", info->altivec_size);
12137
12138 if (info->vrsave_size)
12139 fprintf (stderr, "\tvrsave_size = %5d\n", info->vrsave_size);
12140
12141 if (info->altivec_padding_size)
12142 fprintf (stderr, "\taltivec_padding_size= %5d\n",
12143 info->altivec_padding_size);
12144
a3170dc6
AH
12145 if (info->spe_padding_size)
12146 fprintf (stderr, "\tspe_padding_size = %5d\n",
12147 info->spe_padding_size);
12148
a4f6c312 12149 if (info->lr_size)
ed947a96 12150 fprintf (stderr, "\tlr_size = %5d\n", info->lr_size);
b6c9286a 12151
4697a36c
MM
12152 if (info->cr_size)
12153 fprintf (stderr, "\tcr_size = %5d\n", info->cr_size);
12154
a4f6c312 12155 if (info->toc_size)
b6c9286a
MM
12156 fprintf (stderr, "\ttoc_size = %5d\n", info->toc_size);
12157
4697a36c
MM
12158 if (info->save_size)
12159 fprintf (stderr, "\tsave_size = %5d\n", info->save_size);
12160
12161 if (info->reg_size != 4)
12162 fprintf (stderr, "\treg_size = %5d\n", info->reg_size);
12163
12164 fprintf (stderr, "\n");
9878760c 12165}
71f123ca
FS
12166
12167rtx
a2369ed3 12168rs6000_return_addr (int count, rtx frame)
71f123ca 12169{
a4f6c312
SS
12170 /* Currently we don't optimize very well between prolog and body
12171 code and for PIC code the code can be actually quite bad, so
12172 don't try to be too clever here. */
f1384257 12173 if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
71f123ca
FS
12174 {
12175 cfun->machine->ra_needs_full_frame = 1;
8ac61af7
RK
12176
12177 return
12178 gen_rtx_MEM
12179 (Pmode,
12180 memory_address
12181 (Pmode,
12182 plus_constant (copy_to_reg
12183 (gen_rtx_MEM (Pmode,
12184 memory_address (Pmode, frame))),
12185 RETURN_ADDRESS_OFFSET)));
71f123ca
FS
12186 }
12187
8c29550d 12188 cfun->machine->ra_need_lr = 1;
9e2f7ec7 12189 return get_hard_reg_initial_val (Pmode, LINK_REGISTER_REGNUM);
71f123ca
FS
12190}
12191
5e1bf043
DJ
12192/* Say whether a function is a candidate for sibcall handling or not.
12193 We do not allow indirect calls to be optimized into sibling calls.
12194 Also, we can't do it if there are any vector parameters; there's
12195 nowhere to put the VRsave code so it works; note that functions with
12196 vector parameters are required to have a prototype, so the argument
12197 type info must be available here. (The tail recursion case can work
12198 with vector parameters, but there's no way to distinguish here.) */
4977bab6 12199static bool
a2369ed3 12200rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
5e1bf043
DJ
12201{
12202 tree type;
4977bab6 12203 if (decl)
5e1bf043
DJ
12204 {
12205 if (TARGET_ALTIVEC_VRSAVE)
12206 {
4977bab6 12207 for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
5e1bf043
DJ
12208 type; type = TREE_CHAIN (type))
12209 {
c15b529f 12210 if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
4977bab6 12211 return false;
5e1bf043
DJ
12212 }
12213 }
12214 if (DEFAULT_ABI == ABI_DARWIN
4977bab6 12215 || (*targetm.binds_local_p) (decl))
2bcc50d0 12216 {
4977bab6 12217 tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
2bcc50d0
AM
12218
12219 if (!lookup_attribute ("longcall", attr_list)
12220 || lookup_attribute ("shortcall", attr_list))
4977bab6 12221 return true;
2bcc50d0 12222 }
5e1bf043 12223 }
4977bab6 12224 return false;
5e1bf043
DJ
12225}
12226
71f123ca 12227static int
863d938c 12228rs6000_ra_ever_killed (void)
71f123ca
FS
12229{
12230 rtx top;
5e1bf043
DJ
12231 rtx reg;
12232 rtx insn;
71f123ca 12233
dd292d0a 12234 if (current_function_is_thunk)
71f123ca 12235 return 0;
eb0424da 12236
36f7e964
AH
12237 /* regs_ever_live has LR marked as used if any sibcalls are present,
12238 but this should not force saving and restoring in the
12239 pro/epilogue. Likewise, reg_set_between_p thinks a sibcall
a3c9585f 12240 clobbers LR, so that is inappropriate. */
36f7e964 12241
5e1bf043
DJ
12242 /* Also, the prologue can generate a store into LR that
12243 doesn't really count, like this:
36f7e964 12244
5e1bf043
DJ
12245 move LR->R0
12246 bcl to set PIC register
12247 move LR->R31
12248 move R0->LR
36f7e964
AH
12249
12250 When we're called from the epilogue, we need to avoid counting
12251 this as a store. */
5e1bf043 12252
71f123ca
FS
12253 push_topmost_sequence ();
12254 top = get_insns ();
12255 pop_topmost_sequence ();
5e1bf043 12256 reg = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
71f123ca 12257
5e1bf043
DJ
12258 for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
12259 {
12260 if (INSN_P (insn))
12261 {
12262 if (FIND_REG_INC_NOTE (insn, reg))
12263 return 1;
12264 else if (GET_CODE (insn) == CALL_INSN
c15b529f 12265 && !SIBLING_CALL_P (insn))
5e1bf043 12266 return 1;
36f7e964
AH
12267 else if (set_of (reg, insn) != NULL_RTX
12268 && !prologue_epilogue_contains (insn))
5e1bf043
DJ
12269 return 1;
12270 }
12271 }
12272 return 0;
71f123ca 12273}
4697a36c 12274\f
8cd8f856
GK
12275/* Add a REG_MAYBE_DEAD note to the insn. */
12276static void
a2369ed3 12277rs6000_maybe_dead (rtx insn)
8cd8f856
GK
12278{
12279 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD,
12280 const0_rtx,
12281 REG_NOTES (insn));
12282}
12283
9ebbca7d 12284/* Emit instructions needed to load the TOC register.
c7ca610e 12285 This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
9ebbca7d 12286 a constant pool; or for SVR4 -fpic. */
c7ca610e
RK
12287
12288void
a2369ed3 12289rs6000_emit_load_toc_table (int fromprolog)
c7ca610e 12290{
027fbf43 12291 rtx dest, insn;
1db02437 12292 dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
c7ca610e 12293
20b71b17
AM
12294 if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
12295 {
12296 rtx temp = (fromprolog
12297 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
12298 : gen_reg_rtx (Pmode));
027fbf43
JJ
12299 insn = emit_insn (gen_load_toc_v4_pic_si (temp));
12300 if (fromprolog)
12301 rs6000_maybe_dead (insn);
12302 insn = emit_move_insn (dest, temp);
12303 if (fromprolog)
12304 rs6000_maybe_dead (insn);
20b71b17
AM
12305 }
12306 else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
12307 {
12308 char buf[30];
12309 rtx tempLR = (fromprolog
12310 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
12311 : gen_reg_rtx (Pmode));
12312 rtx temp0 = (fromprolog
12313 ? gen_rtx_REG (Pmode, 0)
12314 : gen_reg_rtx (Pmode));
12315 rtx symF;
12316
12317 /* possibly create the toc section */
12318 if (! toc_initialized)
38c1f2d7 12319 {
20b71b17
AM
12320 toc_section ();
12321 function_section (current_function_decl);
38c1f2d7 12322 }
9ebbca7d 12323
20b71b17
AM
12324 if (fromprolog)
12325 {
12326 rtx symL;
38c1f2d7 12327
20b71b17
AM
12328 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
12329 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9ebbca7d 12330
20b71b17
AM
12331 ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
12332 symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
12333
12334 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1 (tempLR,
12335 symF)));
12336 rs6000_maybe_dead (emit_move_insn (dest, tempLR));
12337 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest,
12338 symL,
12339 symF)));
9ebbca7d
GK
12340 }
12341 else
20b71b17
AM
12342 {
12343 rtx tocsym;
12344 static int reload_toc_labelno = 0;
12345
12346 tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
12347
12348 ASM_GENERATE_INTERNAL_LABEL (buf, "LCG", reload_toc_labelno++);
12349 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
12350
027fbf43
JJ
12351 emit_insn (gen_load_toc_v4_PIC_1b (tempLR, symF, tocsym));
12352 emit_move_insn (dest, tempLR);
12353 emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
20b71b17 12354 }
027fbf43
JJ
12355 insn = emit_insn (gen_addsi3 (dest, temp0, dest));
12356 if (fromprolog)
12357 rs6000_maybe_dead (insn);
9ebbca7d 12358 }
20b71b17
AM
12359 else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
12360 {
12361 /* This is for AIX code running in non-PIC ELF32. */
12362 char buf[30];
12363 rtx realsym;
12364 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
12365 realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
12366
027fbf43
JJ
12367 insn = emit_insn (gen_elf_high (dest, realsym));
12368 if (fromprolog)
12369 rs6000_maybe_dead (insn);
12370 insn = emit_insn (gen_elf_low (dest, dest, realsym));
12371 if (fromprolog)
12372 rs6000_maybe_dead (insn);
20b71b17
AM
12373 }
12374 else if (DEFAULT_ABI == ABI_AIX)
9ebbca7d
GK
12375 {
12376 if (TARGET_32BIT)
027fbf43 12377 insn = emit_insn (gen_load_toc_aix_si (dest));
9ebbca7d 12378 else
027fbf43
JJ
12379 insn = emit_insn (gen_load_toc_aix_di (dest));
12380 if (fromprolog)
12381 rs6000_maybe_dead (insn);
9ebbca7d 12382 }
20b71b17
AM
12383 else
12384 abort ();
9ebbca7d
GK
12385}
12386
d1d0c603
JJ
12387/* Emit instructions to restore the link register after determining where
12388 its value has been stored. */
12389
12390void
12391rs6000_emit_eh_reg_restore (rtx source, rtx scratch)
12392{
12393 rs6000_stack_t *info = rs6000_stack_info ();
12394 rtx operands[2];
12395
12396 operands[0] = source;
12397 operands[1] = scratch;
12398
12399 if (info->lr_save_p)
12400 {
12401 rtx frame_rtx = stack_pointer_rtx;
12402 HOST_WIDE_INT sp_offset = 0;
12403 rtx tmp;
12404
12405 if (frame_pointer_needed
12406 || current_function_calls_alloca
12407 || info->total_size > 32767)
12408 {
12409 emit_move_insn (operands[1], gen_rtx_MEM (Pmode, frame_rtx));
12410 frame_rtx = operands[1];
12411 }
12412 else if (info->push_p)
12413 sp_offset = info->total_size;
12414
12415 tmp = plus_constant (frame_rtx, info->lr_save_offset + sp_offset);
12416 tmp = gen_rtx_MEM (Pmode, tmp);
12417 emit_move_insn (tmp, operands[0]);
12418 }
12419 else
12420 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM), operands[0]);
12421}
12422
f103e34d
GK
12423static GTY(()) int set = -1;
12424
9ebbca7d 12425int
863d938c 12426get_TOC_alias_set (void)
9ebbca7d 12427{
f103e34d
GK
12428 if (set == -1)
12429 set = new_alias_set ();
12430 return set;
9ebbca7d
GK
12431}
12432
c1207243 12433/* This returns nonzero if the current function uses the TOC. This is
3c9eb5f4
AM
12434 determined by the presence of (use (unspec ... UNSPEC_TOC)), which
12435 is generated by the ABI_V4 load_toc_* patterns. */
c954844a 12436#if TARGET_ELF
3c9eb5f4 12437static int
38f391a5 12438uses_TOC (void)
9ebbca7d 12439{
c4501e62 12440 rtx insn;
38c1f2d7 12441
c4501e62
JJ
12442 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
12443 if (INSN_P (insn))
12444 {
12445 rtx pat = PATTERN (insn);
12446 int i;
9ebbca7d 12447
c4501e62
JJ
12448 if (GET_CODE (pat) == PARALLEL)
12449 for (i = 0; i < XVECLEN (pat, 0); i++)
12450 {
12451 rtx sub = XVECEXP (pat, 0, i);
12452 if (GET_CODE (sub) == USE)
12453 {
12454 sub = XEXP (sub, 0);
12455 if (GET_CODE (sub) == UNSPEC
12456 && XINT (sub, 1) == UNSPEC_TOC)
12457 return 1;
12458 }
12459 }
12460 }
12461 return 0;
9ebbca7d 12462}
c954844a 12463#endif
38c1f2d7 12464
9ebbca7d 12465rtx
a2369ed3 12466create_TOC_reference (rtx symbol)
9ebbca7d 12467{
a8a05998
ZW
12468 return gen_rtx_PLUS (Pmode,
12469 gen_rtx_REG (Pmode, TOC_REGISTER),
12470 gen_rtx_CONST (Pmode,
12471 gen_rtx_MINUS (Pmode, symbol,
b999aaeb 12472 gen_rtx_SYMBOL_REF (Pmode, toc_label_name))));
9ebbca7d 12473}
38c1f2d7 12474
fc4767bb
JJ
12475/* If _Unwind_* has been called from within the same module,
12476 toc register is not guaranteed to be saved to 40(1) on function
12477 entry. Save it there in that case. */
c7ca610e 12478
9ebbca7d 12479void
863d938c 12480rs6000_aix_emit_builtin_unwind_init (void)
9ebbca7d
GK
12481{
12482 rtx mem;
12483 rtx stack_top = gen_reg_rtx (Pmode);
12484 rtx opcode_addr = gen_reg_rtx (Pmode);
fc4767bb
JJ
12485 rtx opcode = gen_reg_rtx (SImode);
12486 rtx tocompare = gen_reg_rtx (SImode);
12487 rtx no_toc_save_needed = gen_label_rtx ();
9ebbca7d
GK
12488
12489 mem = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
12490 emit_move_insn (stack_top, mem);
12491
fc4767bb
JJ
12492 mem = gen_rtx_MEM (Pmode,
12493 gen_rtx_PLUS (Pmode, stack_top,
9ebbca7d
GK
12494 GEN_INT (2 * GET_MODE_SIZE (Pmode))));
12495 emit_move_insn (opcode_addr, mem);
fc4767bb
JJ
12496 emit_move_insn (opcode, gen_rtx_MEM (SImode, opcode_addr));
12497 emit_move_insn (tocompare, gen_int_mode (TARGET_32BIT ? 0x80410014
2496c7bd 12498 : 0xE8410028, SImode));
9ebbca7d 12499
fc4767bb 12500 do_compare_rtx_and_jump (opcode, tocompare, EQ, 1,
06f4e019 12501 SImode, NULL_RTX, NULL_RTX,
fc4767bb 12502 no_toc_save_needed);
9ebbca7d 12503
fc4767bb
JJ
12504 mem = gen_rtx_MEM (Pmode,
12505 gen_rtx_PLUS (Pmode, stack_top,
12506 GEN_INT (5 * GET_MODE_SIZE (Pmode))));
12507 emit_move_insn (mem, gen_rtx_REG (Pmode, 2));
12508 emit_label (no_toc_save_needed);
9ebbca7d 12509}
38c1f2d7 12510\f
ba4828e0
RK
12511/* This ties together stack memory (MEM with an alias set of
12512 rs6000_sr_alias_set) and the change to the stack pointer. */
12513
9ebbca7d 12514static void
863d938c 12515rs6000_emit_stack_tie (void)
9ebbca7d 12516{
ba4828e0
RK
12517 rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
12518
12519 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
12520 emit_insn (gen_stack_tie (mem));
12521}
38c1f2d7 12522
9ebbca7d
GK
12523/* Emit the correct code for allocating stack space, as insns.
12524 If COPY_R12, make sure a copy of the old frame is left in r12.
12525 The generated code may use hard register 0 as a temporary. */
12526
12527static void
a2369ed3 12528rs6000_emit_allocate_stack (HOST_WIDE_INT size, int copy_r12)
38c1f2d7 12529{
9ebbca7d
GK
12530 rtx insn;
12531 rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
12532 rtx tmp_reg = gen_rtx_REG (Pmode, 0);
12533 rtx todec = GEN_INT (-size);
a157febd
GK
12534
12535 if (current_function_limit_stack)
12536 {
12537 if (REG_P (stack_limit_rtx)
12538 && REGNO (stack_limit_rtx) > 1
12539 && REGNO (stack_limit_rtx) <= 31)
12540 {
5b71a4e7 12541 emit_insn (TARGET_32BIT
9ebbca7d
GK
12542 ? gen_addsi3 (tmp_reg,
12543 stack_limit_rtx,
12544 GEN_INT (size))
12545 : gen_adddi3 (tmp_reg,
12546 stack_limit_rtx,
12547 GEN_INT (size)));
5b71a4e7 12548
9ebbca7d
GK
12549 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
12550 const0_rtx));
a157febd
GK
12551 }
12552 else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
9ebbca7d 12553 && TARGET_32BIT
f607bc57 12554 && DEFAULT_ABI == ABI_V4)
a157febd 12555 {
9ebbca7d
GK
12556 rtx toload = gen_rtx_CONST (VOIDmode,
12557 gen_rtx_PLUS (Pmode,
12558 stack_limit_rtx,
12559 GEN_INT (size)));
5b71a4e7 12560
9ebbca7d
GK
12561 emit_insn (gen_elf_high (tmp_reg, toload));
12562 emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
12563 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
12564 const0_rtx));
a157febd
GK
12565 }
12566 else
12567 warning ("stack limit expression is not supported");
12568 }
12569
9ebbca7d
GK
12570 if (copy_r12 || ! TARGET_UPDATE)
12571 emit_move_insn (gen_rtx_REG (Pmode, 12), stack_reg);
12572
38c1f2d7
MM
12573 if (TARGET_UPDATE)
12574 {
9ebbca7d 12575 if (size > 32767)
38c1f2d7 12576 {
9ebbca7d
GK
12577 /* Need a note here so that try_split doesn't get confused. */
12578 if (get_last_insn() == NULL_RTX)
2e040219 12579 emit_note (NOTE_INSN_DELETED);
9ebbca7d
GK
12580 insn = emit_move_insn (tmp_reg, todec);
12581 try_split (PATTERN (insn), insn, 0);
12582 todec = tmp_reg;
38c1f2d7 12583 }
5b71a4e7
DE
12584
12585 insn = emit_insn (TARGET_32BIT
12586 ? gen_movsi_update (stack_reg, stack_reg,
12587 todec, stack_reg)
12588 : gen_movdi_update (stack_reg, stack_reg,
9ebbca7d 12589 todec, stack_reg));
38c1f2d7
MM
12590 }
12591 else
12592 {
5b71a4e7
DE
12593 insn = emit_insn (TARGET_32BIT
12594 ? gen_addsi3 (stack_reg, stack_reg, todec)
12595 : gen_adddi3 (stack_reg, stack_reg, todec));
9ebbca7d
GK
12596 emit_move_insn (gen_rtx_MEM (Pmode, stack_reg),
12597 gen_rtx_REG (Pmode, 12));
12598 }
5b71a4e7 12599
9ebbca7d
GK
12600 RTX_FRAME_RELATED_P (insn) = 1;
12601 REG_NOTES (insn) =
12602 gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
12603 gen_rtx_SET (VOIDmode, stack_reg,
12604 gen_rtx_PLUS (Pmode, stack_reg,
12605 GEN_INT (-size))),
12606 REG_NOTES (insn));
12607}
12608
a4f6c312
SS
12609/* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
12610 with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
12611 is not NULL. It would be nice if dwarf2out_frame_debug_expr could
12612 deduce these equivalences by itself so it wasn't necessary to hold
12613 its hand so much. */
9ebbca7d
GK
12614
12615static void
a2369ed3
DJ
12616rs6000_frame_related (rtx insn, rtx reg, HOST_WIDE_INT val,
12617 rtx reg2, rtx rreg)
9ebbca7d
GK
12618{
12619 rtx real, temp;
12620
e56c4463
JL
12621 /* copy_rtx will not make unique copies of registers, so we need to
12622 ensure we don't have unwanted sharing here. */
12623 if (reg == reg2)
12624 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
12625
12626 if (reg == rreg)
12627 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
12628
9ebbca7d
GK
12629 real = copy_rtx (PATTERN (insn));
12630
89e7058f
AH
12631 if (reg2 != NULL_RTX)
12632 real = replace_rtx (real, reg2, rreg);
12633
9ebbca7d
GK
12634 real = replace_rtx (real, reg,
12635 gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
12636 STACK_POINTER_REGNUM),
12637 GEN_INT (val)));
12638
12639 /* We expect that 'real' is either a SET or a PARALLEL containing
12640 SETs (and possibly other stuff). In a PARALLEL, all the SETs
12641 are important so they all have to be marked RTX_FRAME_RELATED_P. */
12642
12643 if (GET_CODE (real) == SET)
12644 {
12645 rtx set = real;
12646
12647 temp = simplify_rtx (SET_SRC (set));
12648 if (temp)
12649 SET_SRC (set) = temp;
12650 temp = simplify_rtx (SET_DEST (set));
12651 if (temp)
12652 SET_DEST (set) = temp;
12653 if (GET_CODE (SET_DEST (set)) == MEM)
38c1f2d7 12654 {
9ebbca7d
GK
12655 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
12656 if (temp)
12657 XEXP (SET_DEST (set), 0) = temp;
38c1f2d7 12658 }
38c1f2d7 12659 }
9ebbca7d
GK
12660 else if (GET_CODE (real) == PARALLEL)
12661 {
12662 int i;
12663 for (i = 0; i < XVECLEN (real, 0); i++)
12664 if (GET_CODE (XVECEXP (real, 0, i)) == SET)
12665 {
12666 rtx set = XVECEXP (real, 0, i);
12667
12668 temp = simplify_rtx (SET_SRC (set));
12669 if (temp)
12670 SET_SRC (set) = temp;
12671 temp = simplify_rtx (SET_DEST (set));
12672 if (temp)
12673 SET_DEST (set) = temp;
12674 if (GET_CODE (SET_DEST (set)) == MEM)
12675 {
12676 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
12677 if (temp)
12678 XEXP (SET_DEST (set), 0) = temp;
12679 }
12680 RTX_FRAME_RELATED_P (set) = 1;
12681 }
12682 }
12683 else
a4f6c312 12684 abort ();
c19de7aa
AH
12685
12686 if (TARGET_SPE)
12687 real = spe_synthesize_frame_save (real);
12688
9ebbca7d
GK
12689 RTX_FRAME_RELATED_P (insn) = 1;
12690 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
12691 real,
12692 REG_NOTES (insn));
38c1f2d7
MM
12693}
12694
c19de7aa
AH
12695/* Given an SPE frame note, return a PARALLEL of SETs with the
12696 original note, plus a synthetic register save. */
12697
12698static rtx
a2369ed3 12699spe_synthesize_frame_save (rtx real)
c19de7aa
AH
12700{
12701 rtx synth, offset, reg, real2;
12702
12703 if (GET_CODE (real) != SET
12704 || GET_MODE (SET_SRC (real)) != V2SImode)
12705 return real;
12706
12707 /* For the SPE, registers saved in 64-bits, get a PARALLEL for their
12708 frame related note. The parallel contains a set of the register
41f3a930 12709 being saved, and another set to a synthetic register (n+1200).
c19de7aa
AH
12710 This is so we can differentiate between 64-bit and 32-bit saves.
12711 Words cannot describe this nastiness. */
12712
12713 if (GET_CODE (SET_DEST (real)) != MEM
12714 || GET_CODE (XEXP (SET_DEST (real), 0)) != PLUS
12715 || GET_CODE (SET_SRC (real)) != REG)
12716 abort ();
12717
12718 /* Transform:
12719 (set (mem (plus (reg x) (const y)))
12720 (reg z))
12721 into:
12722 (set (mem (plus (reg x) (const y+4)))
41f3a930 12723 (reg z+1200))
c19de7aa
AH
12724 */
12725
12726 real2 = copy_rtx (real);
12727 PUT_MODE (SET_DEST (real2), SImode);
12728 reg = SET_SRC (real2);
12729 real2 = replace_rtx (real2, reg, gen_rtx_REG (SImode, REGNO (reg)));
12730 synth = copy_rtx (real2);
12731
12732 if (BYTES_BIG_ENDIAN)
12733 {
12734 offset = XEXP (XEXP (SET_DEST (real2), 0), 1);
12735 real2 = replace_rtx (real2, offset, GEN_INT (INTVAL (offset) + 4));
12736 }
12737
12738 reg = SET_SRC (synth);
41f3a930 12739
c19de7aa 12740 synth = replace_rtx (synth, reg,
41f3a930 12741 gen_rtx_REG (SImode, REGNO (reg) + 1200));
c19de7aa
AH
12742
12743 offset = XEXP (XEXP (SET_DEST (synth), 0), 1);
12744 synth = replace_rtx (synth, offset,
12745 GEN_INT (INTVAL (offset)
12746 + (BYTES_BIG_ENDIAN ? 0 : 4)));
12747
12748 RTX_FRAME_RELATED_P (synth) = 1;
12749 RTX_FRAME_RELATED_P (real2) = 1;
12750 if (BYTES_BIG_ENDIAN)
12751 real = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, synth, real2));
12752 else
12753 real = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, real2, synth));
12754
12755 return real;
12756}
12757
00b960c7
AH
12758/* Returns an insn that has a vrsave set operation with the
12759 appropriate CLOBBERs. */
12760
12761static rtx
a2369ed3 12762generate_set_vrsave (rtx reg, rs6000_stack_t *info, int epiloguep)
00b960c7
AH
12763{
12764 int nclobs, i;
12765 rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
a004eb82 12766 rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
00b960c7 12767
a004eb82
AH
12768 clobs[0]
12769 = gen_rtx_SET (VOIDmode,
12770 vrsave,
12771 gen_rtx_UNSPEC_VOLATILE (SImode,
12772 gen_rtvec (2, reg, vrsave),
12773 30));
00b960c7
AH
12774
12775 nclobs = 1;
12776
9aa86737
AH
12777 /* We need to clobber the registers in the mask so the scheduler
12778 does not move sets to VRSAVE before sets of AltiVec registers.
12779
12780 However, if the function receives nonlocal gotos, reload will set
12781 all call saved registers live. We will end up with:
12782
12783 (set (reg 999) (mem))
12784 (parallel [ (set (reg vrsave) (unspec blah))
12785 (clobber (reg 999))])
12786
12787 The clobber will cause the store into reg 999 to be dead, and
12788 flow will attempt to delete an epilogue insn. In this case, we
12789 need an unspec use/set of the register. */
00b960c7
AH
12790
12791 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
44688022 12792 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
9aa86737
AH
12793 {
12794 if (!epiloguep || call_used_regs [i])
12795 clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
12796 gen_rtx_REG (V4SImode, i));
12797 else
12798 {
12799 rtx reg = gen_rtx_REG (V4SImode, i);
9aa86737
AH
12800
12801 clobs[nclobs++]
a004eb82
AH
12802 = gen_rtx_SET (VOIDmode,
12803 reg,
12804 gen_rtx_UNSPEC (V4SImode,
12805 gen_rtvec (1, reg), 27));
9aa86737
AH
12806 }
12807 }
00b960c7
AH
12808
12809 insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
12810
12811 for (i = 0; i < nclobs; ++i)
12812 XVECEXP (insn, 0, i) = clobs[i];
12813
12814 return insn;
12815}
12816
89e7058f
AH
12817/* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
12818 Save REGNO into [FRAME_REG + OFFSET] in mode MODE. */
12819
12820static void
a2369ed3 12821emit_frame_save (rtx frame_reg, rtx frame_ptr, enum machine_mode mode,
d1d0c603 12822 unsigned int regno, int offset, HOST_WIDE_INT total_size)
89e7058f
AH
12823{
12824 rtx reg, offset_rtx, insn, mem, addr, int_rtx;
12825 rtx replacea, replaceb;
12826
12827 int_rtx = GEN_INT (offset);
12828
12829 /* Some cases that need register indexed addressing. */
12830 if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
a3170dc6
AH
12831 || (TARGET_SPE_ABI
12832 && SPE_VECTOR_MODE (mode)
12833 && !SPE_CONST_OFFSET_OK (offset)))
89e7058f
AH
12834 {
12835 /* Whomever calls us must make sure r11 is available in the
12836 flow path of instructions in the prologue. */
12837 offset_rtx = gen_rtx_REG (Pmode, 11);
12838 emit_move_insn (offset_rtx, int_rtx);
12839
12840 replacea = offset_rtx;
12841 replaceb = int_rtx;
12842 }
12843 else
12844 {
12845 offset_rtx = int_rtx;
12846 replacea = NULL_RTX;
12847 replaceb = NULL_RTX;
12848 }
12849
12850 reg = gen_rtx_REG (mode, regno);
12851 addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
12852 mem = gen_rtx_MEM (mode, addr);
12853 set_mem_alias_set (mem, rs6000_sr_alias_set);
12854
12855 insn = emit_move_insn (mem, reg);
12856
12857 rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
12858}
12859
a3170dc6
AH
12860/* Emit an offset memory reference suitable for a frame store, while
12861 converting to a valid addressing mode. */
12862
12863static rtx
a2369ed3 12864gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
a3170dc6
AH
12865{
12866 rtx int_rtx, offset_rtx;
12867
12868 int_rtx = GEN_INT (offset);
12869
12870 if (TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
12871 {
12872 offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
12873 emit_move_insn (offset_rtx, int_rtx);
12874 }
12875 else
12876 offset_rtx = int_rtx;
12877
12878 return gen_rtx_MEM (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
12879}
12880
699c914a
MS
12881#ifndef TARGET_FIX_AND_CONTINUE
12882#define TARGET_FIX_AND_CONTINUE 0
12883#endif
12884
9ebbca7d
GK
12885/* Emit function prologue as insns. */
12886
9878760c 12887void
863d938c 12888rs6000_emit_prologue (void)
9878760c 12889{
4697a36c 12890 rs6000_stack_t *info = rs6000_stack_info ();
0e67400a 12891 enum machine_mode reg_mode = Pmode;
327e5343 12892 int reg_size = TARGET_32BIT ? 4 : 8;
9ebbca7d
GK
12893 rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
12894 rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
12895 rtx frame_reg_rtx = sp_reg_rtx;
b78d48dd 12896 rtx cr_save_rtx = NULL_RTX;
9ebbca7d
GK
12897 rtx insn;
12898 int saving_FPRs_inline;
12899 int using_store_multiple;
12900 HOST_WIDE_INT sp_offset = 0;
12901
699c914a
MS
12902 if (TARGET_FIX_AND_CONTINUE)
12903 {
12904 /* gdb on darwin arranges to forward a function from the old
12905 address by modifying the first 4 instructions of the function
12906 to branch to the overriding function. This is necessary to
12907 permit function pointers that point to the old function to
12908 actually forward to the new function. */
12909 emit_insn (gen_nop ());
12910 emit_insn (gen_nop ());
12911 emit_insn (gen_nop ());
12912 emit_insn (gen_nop ());
12913 }
12914
12915 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
12916 {
12917 reg_mode = V2SImode;
12918 reg_size = 8;
12919 }
a3170dc6 12920
9ebbca7d 12921 using_store_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
c19de7aa
AH
12922 && (!TARGET_SPE_ABI
12923 || info->spe_64bit_regs_used == 0)
9ebbca7d
GK
12924 && info->first_gp_reg_save < 31);
12925 saving_FPRs_inline = (info->first_fp_reg_save == 64
8c29550d 12926 || FP_SAVE_INLINE (info->first_fp_reg_save)
acd0b319 12927 || current_function_calls_eh_return
8c29550d 12928 || cfun->machine->ra_need_lr);
9ebbca7d
GK
12929
12930 /* For V.4, update stack before we do any saving and set back pointer. */
fc4767bb 12931 if (info->push_p
acd0b319
AM
12932 && (DEFAULT_ABI == ABI_V4
12933 || current_function_calls_eh_return))
9ebbca7d
GK
12934 {
12935 if (info->total_size < 32767)
12936 sp_offset = info->total_size;
12937 else
12938 frame_reg_rtx = frame_ptr_rtx;
12939 rs6000_emit_allocate_stack (info->total_size,
12940 (frame_reg_rtx != sp_reg_rtx
12941 && (info->cr_save_p
12942 || info->lr_save_p
12943 || info->first_fp_reg_save < 64
12944 || info->first_gp_reg_save < 32
12945 )));
12946 if (frame_reg_rtx != sp_reg_rtx)
12947 rs6000_emit_stack_tie ();
12948 }
12949
d62294f5
FJ
12950 /* Handle world saves specially here. */
12951 if (info->world_save_p)
12952 {
12953 int i, j, sz;
12954 rtx treg;
12955 rtvec p;
12956
12957 /* save_world expects lr in r0. */
12958 if (info->lr_save_p)
12959 {
12960 insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
12961 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
12962 RTX_FRAME_RELATED_P (insn) = 1;
12963 }
12964
12965 /* The SAVE_WORLD and RESTORE_WORLD routines make a number of
12966 assumptions about the offsets of various bits of the stack
12967 frame. Abort if things aren't what they should be. */
12968 if (info->gp_save_offset != -220
12969 || info->fp_save_offset != -144
12970 || info->lr_save_offset != 8
12971 || info->cr_save_offset != 4
12972 || !info->push_p
12973 || !info->lr_save_p
12974 || (current_function_calls_eh_return && info->ehrd_offset != -432)
12975 || (info->vrsave_save_offset != -224
12976 || info->altivec_save_offset != (-224 -16 -192)))
12977 abort ();
12978
12979 treg = gen_rtx_REG (SImode, 11);
12980 emit_move_insn (treg, GEN_INT (-info->total_size));
12981
12982 /* SAVE_WORLD takes the caller's LR in R0 and the frame size
12983 in R11. It also clobbers R12, so beware! */
12984
12985 /* Preserve CR2 for save_world prologues */
12986 sz = 6;
12987 sz += 32 - info->first_gp_reg_save;
12988 sz += 64 - info->first_fp_reg_save;
12989 sz += LAST_ALTIVEC_REGNO - info->first_altivec_reg_save + 1;
12990 p = rtvec_alloc (sz);
12991 j = 0;
12992 RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode,
12993 gen_rtx_REG (Pmode,
12994 LINK_REGISTER_REGNUM));
12995 RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
12996 gen_rtx_SYMBOL_REF (Pmode,
12997 "*save_world"));
12998 /* We do floats first so that the instruction pattern matches
12999 properly. */
13000 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
13001 {
13002 rtx reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
13003 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13004 GEN_INT (info->fp_save_offset
13005 + sp_offset + 8 * i));
13006 rtx mem = gen_rtx_MEM (DFmode, addr);
13007 set_mem_alias_set (mem, rs6000_sr_alias_set);
13008
13009 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
13010 }
13011 for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
13012 {
13013 rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
13014 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13015 GEN_INT (info->altivec_save_offset
13016 + sp_offset + 16 * i));
13017 rtx mem = gen_rtx_MEM (V4SImode, addr);
13018 set_mem_alias_set (mem, rs6000_sr_alias_set);
13019
13020 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
13021 }
13022 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
13023 {
13024 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
13025 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13026 GEN_INT (info->gp_save_offset
13027 + sp_offset + reg_size * i));
13028 rtx mem = gen_rtx_MEM (reg_mode, addr);
13029 set_mem_alias_set (mem, rs6000_sr_alias_set);
13030
13031 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
13032 }
13033
13034 {
13035 /* CR register traditionally saved as CR2. */
13036 rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
13037 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13038 GEN_INT (info->cr_save_offset
13039 + sp_offset));
13040 rtx mem = gen_rtx_MEM (reg_mode, addr);
13041 set_mem_alias_set (mem, rs6000_sr_alias_set);
13042
13043 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, mem, reg);
13044 }
13045 /* Prevent any attempt to delete the setting of r0 and treg! */
13046 RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 0));
13047 RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode, treg);
13048 RTVEC_ELT (p, j++) = gen_rtx_CLOBBER (VOIDmode, sp_reg_rtx);
13049
13050 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
13051 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13052 NULL_RTX, NULL_RTX);
13053
13054 if (current_function_calls_eh_return)
13055 {
13056 unsigned int i;
13057 for (i = 0; ; ++i)
13058 {
13059 unsigned int regno = EH_RETURN_DATA_REGNO (i);
13060 if (regno == INVALID_REGNUM)
13061 break;
13062 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
13063 info->ehrd_offset + sp_offset
13064 + reg_size * (int) i,
13065 info->total_size);
13066 }
13067 }
13068 }
13069
9aa86737 13070 /* Save AltiVec registers if needed. */
d62294f5 13071 if (! info->world_save_p && TARGET_ALTIVEC_ABI && info->altivec_size != 0)
9aa86737
AH
13072 {
13073 int i;
13074
13075 /* There should be a non inline version of this, for when we
13076 are saving lots of vector registers. */
13077 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
13078 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
13079 {
13080 rtx areg, savereg, mem;
13081 int offset;
13082
13083 offset = info->altivec_save_offset + sp_offset
13084 + 16 * (i - info->first_altivec_reg_save);
13085
13086 savereg = gen_rtx_REG (V4SImode, i);
13087
13088 areg = gen_rtx_REG (Pmode, 0);
13089 emit_move_insn (areg, GEN_INT (offset));
13090
13091 /* AltiVec addressing mode is [reg+reg]. */
13092 mem = gen_rtx_MEM (V4SImode,
13093 gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
13094
13095 set_mem_alias_set (mem, rs6000_sr_alias_set);
13096
13097 insn = emit_move_insn (mem, savereg);
13098
5c242421
SB
13099 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13100 areg, GEN_INT (offset));
9aa86737
AH
13101 }
13102 }
13103
13104 /* VRSAVE is a bit vector representing which AltiVec registers
13105 are used. The OS uses this to determine which vector
13106 registers to save on a context switch. We need to save
13107 VRSAVE on the stack frame, add whatever AltiVec registers we
13108 used in this function, and do the corresponding magic in the
13109 epilogue. */
13110
4d774ff8 13111 if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
d62294f5 13112 && ! info->world_save_p && info->vrsave_mask != 0)
9aa86737 13113 {
a004eb82 13114 rtx reg, mem, vrsave;
9aa86737
AH
13115 int offset;
13116
13117 /* Get VRSAVE onto a GPR. */
13118 reg = gen_rtx_REG (SImode, 12);
a004eb82 13119 vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
b188f760
AH
13120 if (TARGET_MACHO)
13121 emit_insn (gen_get_vrsave_internal (reg));
13122 else
13123 emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
9aa86737
AH
13124
13125 /* Save VRSAVE. */
13126 offset = info->vrsave_save_offset + sp_offset;
13127 mem
13128 = gen_rtx_MEM (SImode,
13129 gen_rtx_PLUS (Pmode, frame_reg_rtx, GEN_INT (offset)));
13130 set_mem_alias_set (mem, rs6000_sr_alias_set);
13131 insn = emit_move_insn (mem, reg);
13132
13133 /* Include the registers in the mask. */
13134 emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
13135
13136 insn = emit_insn (generate_set_vrsave (reg, info, 0));
13137 }
13138
9ebbca7d 13139 /* If we use the link register, get it into r0. */
d62294f5 13140 if (! info->world_save_p && info->lr_save_p)
f8a57be8
GK
13141 {
13142 insn = emit_move_insn (gen_rtx_REG (Pmode, 0),
13143 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
13144 RTX_FRAME_RELATED_P (insn) = 1;
13145 }
9ebbca7d
GK
13146
13147 /* If we need to save CR, put it into r12. */
d62294f5 13148 if (! info->world_save_p && info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
9ebbca7d 13149 {
f8a57be8
GK
13150 rtx set;
13151
9ebbca7d 13152 cr_save_rtx = gen_rtx_REG (SImode, 12);
f8a57be8
GK
13153 insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
13154 RTX_FRAME_RELATED_P (insn) = 1;
13155 /* Now, there's no way that dwarf2out_frame_debug_expr is going
13156 to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
13157 But that's OK. All we have to do is specify that _one_ condition
13158 code register is saved in this stack slot. The thrower's epilogue
13159 will then restore all the call-saved registers.
13160 We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux. */
13161 set = gen_rtx_SET (VOIDmode, cr_save_rtx,
13162 gen_rtx_REG (SImode, CR2_REGNO));
13163 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
13164 set,
13165 REG_NOTES (insn));
9ebbca7d
GK
13166 }
13167
a4f6c312
SS
13168 /* Do any required saving of fpr's. If only one or two to save, do
13169 it ourselves. Otherwise, call function. */
d62294f5 13170 if (! info->world_save_p && saving_FPRs_inline)
9ebbca7d
GK
13171 {
13172 int i;
13173 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
13174 if ((regs_ever_live[info->first_fp_reg_save+i]
13175 && ! call_used_regs[info->first_fp_reg_save+i]))
89e7058f
AH
13176 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, DFmode,
13177 info->first_fp_reg_save + i,
13178 info->fp_save_offset + sp_offset + 8 * i,
13179 info->total_size);
9ebbca7d 13180 }
d62294f5 13181 else if (! info->world_save_p && info->first_fp_reg_save != 64)
9ebbca7d
GK
13182 {
13183 int i;
13184 char rname[30];
520a57c8 13185 const char *alloc_rname;
9ebbca7d
GK
13186 rtvec p;
13187 p = rtvec_alloc (2 + 64 - info->first_fp_reg_save);
13188
13189 RTVEC_ELT (p, 0) = gen_rtx_CLOBBER (VOIDmode,
13190 gen_rtx_REG (Pmode,
13191 LINK_REGISTER_REGNUM));
13192 sprintf (rname, "%s%d%s", SAVE_FP_PREFIX,
13193 info->first_fp_reg_save - 32, SAVE_FP_SUFFIX);
a8a05998 13194 alloc_rname = ggc_strdup (rname);
9ebbca7d
GK
13195 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
13196 gen_rtx_SYMBOL_REF (Pmode,
13197 alloc_rname));
13198 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
13199 {
13200 rtx addr, reg, mem;
13201 reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
13202 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13203 GEN_INT (info->fp_save_offset
13204 + sp_offset + 8*i));
13205 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 13206 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
13207
13208 RTVEC_ELT (p, i + 2) = gen_rtx_SET (VOIDmode, mem, reg);
13209 }
13210 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
13211 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13212 NULL_RTX, NULL_RTX);
13213 }
b6c9286a 13214
9ebbca7d
GK
13215 /* Save GPRs. This is done as a PARALLEL if we are using
13216 the store-multiple instructions. */
d62294f5 13217 if (! info->world_save_p && using_store_multiple)
b6c9286a 13218 {
308c142a 13219 rtvec p;
9ebbca7d
GK
13220 int i;
13221 p = rtvec_alloc (32 - info->first_gp_reg_save);
9ebbca7d
GK
13222 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
13223 {
13224 rtx addr, reg, mem;
13225 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
13226 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13227 GEN_INT (info->gp_save_offset
13228 + sp_offset
13229 + reg_size * i));
13230 mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0 13231 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
13232
13233 RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
13234 }
13235 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
13236 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13237 NULL_RTX, NULL_RTX);
b6c9286a 13238 }
d62294f5 13239 else if (! info->world_save_p)
b6c9286a 13240 {
9ebbca7d
GK
13241 int i;
13242 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
13243 if ((regs_ever_live[info->first_gp_reg_save+i]
b4db40bf
JJ
13244 && (! call_used_regs[info->first_gp_reg_save+i]
13245 || (i+info->first_gp_reg_save
13246 == RS6000_PIC_OFFSET_TABLE_REGNUM
13247 && TARGET_TOC && TARGET_MINIMAL_TOC)))
1db02437 13248 || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
14f00213 13249 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
f607bc57 13250 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
a3170dc6
AH
13251 {
13252 rtx addr, reg, mem;
13253 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
13254
c19de7aa 13255 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
a3170dc6
AH
13256 {
13257 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
13258 rtx b;
13259
13260 if (!SPE_CONST_OFFSET_OK (offset))
13261 {
13262 b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
13263 emit_move_insn (b, GEN_INT (offset));
13264 }
13265 else
13266 b = GEN_INT (offset);
13267
13268 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
13269 mem = gen_rtx_MEM (V2SImode, addr);
13270 set_mem_alias_set (mem, rs6000_sr_alias_set);
13271 insn = emit_move_insn (mem, reg);
13272
13273 if (GET_CODE (b) == CONST_INT)
13274 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13275 NULL_RTX, NULL_RTX);
13276 else
13277 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13278 b, GEN_INT (offset));
13279 }
13280 else
13281 {
13282 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13283 GEN_INT (info->gp_save_offset
13284 + sp_offset
13285 + reg_size * i));
13286 mem = gen_rtx_MEM (reg_mode, addr);
13287 set_mem_alias_set (mem, rs6000_sr_alias_set);
13288
13289 insn = emit_move_insn (mem, reg);
13290 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13291 NULL_RTX, NULL_RTX);
13292 }
13293 }
9ebbca7d
GK
13294 }
13295
83720594
RH
13296 /* ??? There's no need to emit actual instructions here, but it's the
13297 easiest way to get the frame unwind information emitted. */
d62294f5 13298 if (! info->world_save_p && current_function_calls_eh_return)
83720594 13299 {
78e1b90d
DE
13300 unsigned int i, regno;
13301
fc4767bb
JJ
13302 /* In AIX ABI we need to pretend we save r2 here. */
13303 if (TARGET_AIX)
13304 {
13305 rtx addr, reg, mem;
13306
13307 reg = gen_rtx_REG (reg_mode, 2);
13308 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13309 GEN_INT (sp_offset + 5 * reg_size));
13310 mem = gen_rtx_MEM (reg_mode, addr);
13311 set_mem_alias_set (mem, rs6000_sr_alias_set);
13312
13313 insn = emit_move_insn (mem, reg);
13314 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
13315 NULL_RTX, NULL_RTX);
13316 PATTERN (insn) = gen_blockage ();
13317 }
13318
83720594
RH
13319 for (i = 0; ; ++i)
13320 {
83720594
RH
13321 regno = EH_RETURN_DATA_REGNO (i);
13322 if (regno == INVALID_REGNUM)
13323 break;
13324
89e7058f
AH
13325 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
13326 info->ehrd_offset + sp_offset
13327 + reg_size * (int) i,
13328 info->total_size);
83720594
RH
13329 }
13330 }
13331
9ebbca7d 13332 /* Save lr if we used it. */
d62294f5 13333 if (! info->world_save_p && info->lr_save_p)
9ebbca7d
GK
13334 {
13335 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13336 GEN_INT (info->lr_save_offset + sp_offset));
13337 rtx reg = gen_rtx_REG (Pmode, 0);
13338 rtx mem = gen_rtx_MEM (Pmode, addr);
13339 /* This should not be of rs6000_sr_alias_set, because of
13340 __builtin_return_address. */
13341
13342 insn = emit_move_insn (mem, reg);
13343 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
f8a57be8 13344 NULL_RTX, NULL_RTX);
9ebbca7d
GK
13345 }
13346
13347 /* Save CR if we use any that must be preserved. */
d62294f5 13348 if (! info->world_save_p && info->cr_save_p)
9ebbca7d
GK
13349 {
13350 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13351 GEN_INT (info->cr_save_offset + sp_offset));
13352 rtx mem = gen_rtx_MEM (SImode, addr);
f8a57be8
GK
13353 /* See the large comment above about why CR2_REGNO is used. */
13354 rtx magic_eh_cr_reg = gen_rtx_REG (SImode, CR2_REGNO);
ba4828e0
RK
13355
13356 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
13357
13358 /* If r12 was used to hold the original sp, copy cr into r0 now
13359 that it's free. */
13360 if (REGNO (frame_reg_rtx) == 12)
13361 {
f8a57be8
GK
13362 rtx set;
13363
9ebbca7d 13364 cr_save_rtx = gen_rtx_REG (SImode, 0);
f8a57be8
GK
13365 insn = emit_insn (gen_movesi_from_cr (cr_save_rtx));
13366 RTX_FRAME_RELATED_P (insn) = 1;
13367 set = gen_rtx_SET (VOIDmode, cr_save_rtx, magic_eh_cr_reg);
13368 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
13369 set,
13370 REG_NOTES (insn));
13371
9ebbca7d
GK
13372 }
13373 insn = emit_move_insn (mem, cr_save_rtx);
13374
9ebbca7d 13375 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
f8a57be8 13376 NULL_RTX, NULL_RTX);
9ebbca7d
GK
13377 }
13378
13379 /* Update stack and set back pointer unless this is V.4,
13380 for which it was done previously. */
d62294f5 13381 if (! info->world_save_p && info->push_p
fc4767bb 13382 && !(DEFAULT_ABI == ABI_V4 || current_function_calls_eh_return))
9ebbca7d
GK
13383 rs6000_emit_allocate_stack (info->total_size, FALSE);
13384
13385 /* Set frame pointer, if needed. */
13386 if (frame_pointer_needed)
13387 {
a3170dc6 13388 insn = emit_move_insn (gen_rtx_REG (Pmode, FRAME_POINTER_REGNUM),
9ebbca7d
GK
13389 sp_reg_rtx);
13390 RTX_FRAME_RELATED_P (insn) = 1;
b6c9286a 13391 }
9878760c 13392
1db02437 13393 /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up. */
9ebbca7d 13394 if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
f607bc57 13395 || (DEFAULT_ABI == ABI_V4 && flag_pic == 1
1db02437 13396 && regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM]))
9ebbca7d
GK
13397 {
13398 /* If emit_load_toc_table will use the link register, we need to save
c4501e62 13399 it. We use R12 for this purpose because emit_load_toc_table
9ebbca7d
GK
13400 can use register 0. This allows us to use a plain 'blr' to return
13401 from the procedure more often. */
f1384257
AM
13402 int save_LR_around_toc_setup = (TARGET_ELF
13403 && DEFAULT_ABI != ABI_AIX
13404 && flag_pic
d5fa86ba
GK
13405 && ! info->lr_save_p
13406 && EXIT_BLOCK_PTR->pred != NULL);
9ebbca7d 13407 if (save_LR_around_toc_setup)
c4501e62
JJ
13408 {
13409 rtx lr = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
f8a57be8
GK
13410
13411 insn = emit_move_insn (frame_ptr_rtx, lr);
13412 rs6000_maybe_dead (insn);
13413 RTX_FRAME_RELATED_P (insn) = 1;
13414
c4501e62 13415 rs6000_emit_load_toc_table (TRUE);
f8a57be8
GK
13416
13417 insn = emit_move_insn (lr, frame_ptr_rtx);
13418 rs6000_maybe_dead (insn);
13419 RTX_FRAME_RELATED_P (insn) = 1;
c4501e62
JJ
13420 }
13421 else
13422 rs6000_emit_load_toc_table (TRUE);
9ebbca7d 13423 }
ee890fe2 13424
fcce224d 13425#if TARGET_MACHO
ee890fe2
SS
13426 if (DEFAULT_ABI == ABI_DARWIN
13427 && flag_pic && current_function_uses_pic_offset_table)
13428 {
f8a57be8 13429 rtx lr = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
11abc112 13430 rtx src = machopic_function_base_sym ();
ee890fe2 13431
f8a57be8 13432 rs6000_maybe_dead (emit_insn (gen_load_macho_picbase (lr, src)));
ee890fe2 13433
f8a57be8
GK
13434 insn = emit_move_insn (gen_rtx_REG (Pmode,
13435 RS6000_PIC_OFFSET_TABLE_REGNUM),
13436 lr);
13437 rs6000_maybe_dead (insn);
ee890fe2 13438 }
fcce224d 13439#endif
9ebbca7d
GK
13440}
13441
9ebbca7d 13442/* Write function prologue. */
a4f6c312 13443
08c148a8 13444static void
a2369ed3
DJ
13445rs6000_output_function_prologue (FILE *file,
13446 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9ebbca7d
GK
13447{
13448 rs6000_stack_t *info = rs6000_stack_info ();
13449
4697a36c
MM
13450 if (TARGET_DEBUG_STACK)
13451 debug_stack_info (info);
9878760c 13452
a4f6c312
SS
13453 /* Write .extern for any function we will call to save and restore
13454 fp values. */
13455 if (info->first_fp_reg_save < 64
13456 && !FP_SAVE_INLINE (info->first_fp_reg_save))
4d30c363 13457 fprintf (file, "\t.extern %s%d%s\n\t.extern %s%d%s\n",
4697a36c 13458 SAVE_FP_PREFIX, info->first_fp_reg_save - 32, SAVE_FP_SUFFIX,
a4f6c312
SS
13459 RESTORE_FP_PREFIX, info->first_fp_reg_save - 32,
13460 RESTORE_FP_SUFFIX);
9878760c 13461
c764f757
RK
13462 /* Write .extern for AIX common mode routines, if needed. */
13463 if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
13464 {
f6709c70
JW
13465 fputs ("\t.extern __mulh\n", file);
13466 fputs ("\t.extern __mull\n", file);
13467 fputs ("\t.extern __divss\n", file);
13468 fputs ("\t.extern __divus\n", file);
13469 fputs ("\t.extern __quoss\n", file);
13470 fputs ("\t.extern __quous\n", file);
c764f757
RK
13471 common_mode_defined = 1;
13472 }
9878760c 13473
9ebbca7d 13474 if (! HAVE_prologue)
979721f8 13475 {
9ebbca7d 13476 start_sequence ();
9dda4cc8 13477
a4f6c312
SS
13478 /* A NOTE_INSN_DELETED is supposed to be at the start and end of
13479 the "toplevel" insn chain. */
2e040219 13480 emit_note (NOTE_INSN_DELETED);
9ebbca7d 13481 rs6000_emit_prologue ();
2e040219 13482 emit_note (NOTE_INSN_DELETED);
178c3eff 13483
a3c9585f 13484 /* Expand INSN_ADDRESSES so final() doesn't crash. */
178c3eff
DJ
13485 {
13486 rtx insn;
13487 unsigned addr = 0;
13488 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
13489 {
13490 INSN_ADDRESSES_NEW (insn, addr);
13491 addr += 4;
13492 }
13493 }
9dda4cc8 13494
9ebbca7d 13495 if (TARGET_DEBUG_STACK)
a4f6c312
SS
13496 debug_rtx_list (get_insns (), 100);
13497 final (get_insns (), file, FALSE, FALSE);
9ebbca7d 13498 end_sequence ();
979721f8
MM
13499 }
13500
9ebbca7d
GK
13501 rs6000_pic_labelno++;
13502}
13503
13504/* Emit function epilogue as insns.
9878760c 13505
9ebbca7d
GK
13506 At present, dwarf2out_frame_debug_expr doesn't understand
13507 register restores, so we don't bother setting RTX_FRAME_RELATED_P
13508 anywhere in the epilogue. Most of the insns below would in any case
13509 need special notes to explain where r11 is in relation to the stack. */
9878760c 13510
9ebbca7d 13511void
a2369ed3 13512rs6000_emit_epilogue (int sibcall)
9ebbca7d
GK
13513{
13514 rs6000_stack_t *info;
13515 int restoring_FPRs_inline;
13516 int using_load_multiple;
13517 int using_mfcr_multiple;
13518 int use_backchain_to_restore_sp;
13519 int sp_offset = 0;
13520 rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
13521 rtx frame_reg_rtx = sp_reg_rtx;
0e67400a 13522 enum machine_mode reg_mode = Pmode;
327e5343 13523 int reg_size = TARGET_32BIT ? 4 : 8;
9ebbca7d
GK
13524 int i;
13525
c19de7aa
AH
13526 info = rs6000_stack_info ();
13527
13528 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
a3170dc6
AH
13529 {
13530 reg_mode = V2SImode;
13531 reg_size = 8;
13532 }
13533
9ebbca7d 13534 using_load_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
c19de7aa
AH
13535 && (!TARGET_SPE_ABI
13536 || info->spe_64bit_regs_used == 0)
9ebbca7d
GK
13537 && info->first_gp_reg_save < 31);
13538 restoring_FPRs_inline = (sibcall
83720594 13539 || current_function_calls_eh_return
9ebbca7d
GK
13540 || info->first_fp_reg_save == 64
13541 || FP_SAVE_INLINE (info->first_fp_reg_save));
13542 use_backchain_to_restore_sp = (frame_pointer_needed
13543 || current_function_calls_alloca
13544 || info->total_size > 32767);
13545 using_mfcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
13546 || rs6000_cpu == PROCESSOR_PPC603
13547 || rs6000_cpu == PROCESSOR_PPC750
13548 || optimize_size);
13549
d62294f5
FJ
13550 if (info->world_save_p)
13551 {
13552 int i, j;
13553 char rname[30];
13554 const char *alloc_rname;
13555 rtvec p;
13556
13557 /* eh_rest_world_r10 will return to the location saved in the LR
13558 stack slot (which is not likely to be our caller.)
13559 Input: R10 -- stack adjustment. Clobbers R0, R11, R12, R7, R8.
13560 rest_world is similar, except any R10 parameter is ignored.
13561 The exception-handling stuff that was here in 2.95 is no
13562 longer necessary. */
13563
13564 p = rtvec_alloc (9
13565 + 1
13566 + 32 - info->first_gp_reg_save
13567 + LAST_ALTIVEC_REGNO + 1 - info->first_altivec_reg_save
13568 + 63 + 1 - info->first_fp_reg_save);
13569
13570 strcpy (rname, (current_function_calls_eh_return) ?
13571 "*eh_rest_world_r10" : "*rest_world");
13572 alloc_rname = ggc_strdup (rname);
13573
13574 j = 0;
13575 RTVEC_ELT (p, j++) = gen_rtx_RETURN (VOIDmode);
13576 RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
13577 gen_rtx_REG (Pmode,
13578 LINK_REGISTER_REGNUM));
13579 RTVEC_ELT (p, j++)
13580 = gen_rtx_USE (VOIDmode, gen_rtx_SYMBOL_REF (Pmode, alloc_rname));
13581 /* The instruction pattern requires a clobber here;
13582 it is shared with the restVEC helper. */
13583 RTVEC_ELT (p, j++)
13584 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
13585
13586 {
13587 /* CR register traditionally saved as CR2. */
13588 rtx reg = gen_rtx_REG (reg_mode, CR2_REGNO);
13589 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13590 GEN_INT (info->cr_save_offset));
13591 rtx mem = gen_rtx_MEM (reg_mode, addr);
13592 set_mem_alias_set (mem, rs6000_sr_alias_set);
13593
13594 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
13595 }
13596
13597 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
13598 {
13599 rtx reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
13600 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13601 GEN_INT (info->gp_save_offset
13602 + reg_size * i));
13603 rtx mem = gen_rtx_MEM (reg_mode, addr);
13604 set_mem_alias_set (mem, rs6000_sr_alias_set);
13605
13606 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
13607 }
13608 for (i = 0; info->first_altivec_reg_save + i <= LAST_ALTIVEC_REGNO; i++)
13609 {
13610 rtx reg = gen_rtx_REG (V4SImode, info->first_altivec_reg_save + i);
13611 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13612 GEN_INT (info->altivec_save_offset
13613 + 16 * i));
13614 rtx mem = gen_rtx_MEM (V4SImode, addr);
13615 set_mem_alias_set (mem, rs6000_sr_alias_set);
13616
13617 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
13618 }
13619 for (i = 0; info->first_fp_reg_save + i <= 63; i++)
13620 {
13621 rtx reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
13622 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13623 GEN_INT (info->fp_save_offset
13624 + 8 * i));
13625 rtx mem = gen_rtx_MEM (DFmode, addr);
13626 set_mem_alias_set (mem, rs6000_sr_alias_set);
13627
13628 RTVEC_ELT (p, j++) = gen_rtx_SET (VOIDmode, reg, mem);
13629 }
13630 RTVEC_ELT (p, j++)
13631 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 0));
13632 RTVEC_ELT (p, j++)
13633 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 12));
13634 RTVEC_ELT (p, j++)
13635 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 7));
13636 RTVEC_ELT (p, j++)
13637 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 8));
13638 RTVEC_ELT (p, j++)
13639 = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, 10));
13640 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
13641
13642 return;
13643 }
13644
9ebbca7d
GK
13645 /* If we have a frame pointer, a call to alloca, or a large stack
13646 frame, restore the old stack pointer using the backchain. Otherwise,
13647 we know what size to update it with. */
13648 if (use_backchain_to_restore_sp)
bacbde18 13649 {
9ebbca7d
GK
13650 /* Under V.4, don't reset the stack pointer until after we're done
13651 loading the saved registers. */
f607bc57 13652 if (DEFAULT_ABI == ABI_V4)
9ebbca7d 13653 frame_reg_rtx = gen_rtx_REG (Pmode, 11);
4697a36c 13654
9ebbca7d
GK
13655 emit_move_insn (frame_reg_rtx,
13656 gen_rtx_MEM (Pmode, sp_reg_rtx));
13657
bacbde18 13658 }
9ebbca7d 13659 else if (info->push_p)
85638c0d 13660 {
fc4767bb
JJ
13661 if (DEFAULT_ABI == ABI_V4
13662 || current_function_calls_eh_return)
9ebbca7d
GK
13663 sp_offset = info->total_size;
13664 else
13665 {
13666 emit_insn (TARGET_32BIT
13667 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
13668 GEN_INT (info->total_size))
13669 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
13670 GEN_INT (info->total_size)));
13671 }
85638c0d 13672 }
9ebbca7d 13673
9aa86737
AH
13674 /* Restore AltiVec registers if needed. */
13675 if (TARGET_ALTIVEC_ABI && info->altivec_size != 0)
13676 {
13677 int i;
13678
13679 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
13680 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
13681 {
13682 rtx addr, areg, mem;
13683
13684 areg = gen_rtx_REG (Pmode, 0);
13685 emit_move_insn
13686 (areg, GEN_INT (info->altivec_save_offset
13687 + sp_offset
13688 + 16 * (i - info->first_altivec_reg_save)));
13689
13690 /* AltiVec addressing mode is [reg+reg]. */
13691 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
13692 mem = gen_rtx_MEM (V4SImode, addr);
13693 set_mem_alias_set (mem, rs6000_sr_alias_set);
13694
13695 emit_move_insn (gen_rtx_REG (V4SImode, i), mem);
13696 }
13697 }
13698
13699 /* Restore VRSAVE if needed. */
44688022 13700 if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
4d774ff8 13701 && info->vrsave_mask != 0)
9aa86737
AH
13702 {
13703 rtx addr, mem, reg;
13704
13705 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13706 GEN_INT (info->vrsave_save_offset + sp_offset));
13707 mem = gen_rtx_MEM (SImode, addr);
13708 set_mem_alias_set (mem, rs6000_sr_alias_set);
13709 reg = gen_rtx_REG (SImode, 12);
13710 emit_move_insn (reg, mem);
13711
13712 emit_insn (generate_set_vrsave (reg, info, 1));
13713 }
13714
9ebbca7d
GK
13715 /* Get the old lr if we saved it. */
13716 if (info->lr_save_p)
b6c9286a 13717 {
a3170dc6
AH
13718 rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
13719 info->lr_save_offset + sp_offset);
ba4828e0
RK
13720
13721 set_mem_alias_set (mem, rs6000_sr_alias_set);
b6c9286a 13722
9ebbca7d 13723 emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
b6c9286a 13724 }
9ebbca7d
GK
13725
13726 /* Get the old cr if we saved it. */
13727 if (info->cr_save_p)
13728 {
13729 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13730 GEN_INT (info->cr_save_offset + sp_offset));
13731 rtx mem = gen_rtx_MEM (SImode, addr);
ba4828e0
RK
13732
13733 set_mem_alias_set (mem, rs6000_sr_alias_set);
b6c9286a 13734
9ebbca7d
GK
13735 emit_move_insn (gen_rtx_REG (SImode, 12), mem);
13736 }
13737
13738 /* Set LR here to try to overlap restores below. */
4697a36c 13739 if (info->lr_save_p)
9ebbca7d
GK
13740 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM),
13741 gen_rtx_REG (Pmode, 0));
13742
83720594
RH
13743 /* Load exception handler data registers, if needed. */
13744 if (current_function_calls_eh_return)
13745 {
78e1b90d
DE
13746 unsigned int i, regno;
13747
fc4767bb
JJ
13748 if (TARGET_AIX)
13749 {
13750 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13751 GEN_INT (sp_offset + 5 * reg_size));
13752 rtx mem = gen_rtx_MEM (reg_mode, addr);
13753
13754 set_mem_alias_set (mem, rs6000_sr_alias_set);
13755
13756 emit_move_insn (gen_rtx_REG (reg_mode, 2), mem);
13757 }
13758
83720594
RH
13759 for (i = 0; ; ++i)
13760 {
a3170dc6 13761 rtx mem;
83720594
RH
13762
13763 regno = EH_RETURN_DATA_REGNO (i);
13764 if (regno == INVALID_REGNUM)
13765 break;
13766
a3170dc6
AH
13767 mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
13768 info->ehrd_offset + sp_offset
13769 + reg_size * (int) i);
ba4828e0 13770 set_mem_alias_set (mem, rs6000_sr_alias_set);
83720594
RH
13771
13772 emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
13773 }
13774 }
9ebbca7d
GK
13775
13776 /* Restore GPRs. This is done as a PARALLEL if we are using
13777 the load-multiple instructions. */
13778 if (using_load_multiple)
979721f8 13779 {
9ebbca7d
GK
13780 rtvec p;
13781 p = rtvec_alloc (32 - info->first_gp_reg_save);
13782 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
979721f8 13783 {
9ebbca7d
GK
13784 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13785 GEN_INT (info->gp_save_offset
13786 + sp_offset
13787 + reg_size * i));
13788 rtx mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0
RK
13789
13790 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
13791
13792 RTVEC_ELT (p, i) =
13793 gen_rtx_SET (VOIDmode,
13794 gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
13795 mem);
979721f8 13796 }
9ebbca7d 13797 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
979721f8 13798 }
9ebbca7d
GK
13799 else
13800 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
13801 if ((regs_ever_live[info->first_gp_reg_save+i]
b4db40bf
JJ
13802 && (! call_used_regs[info->first_gp_reg_save+i]
13803 || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
13804 && TARGET_TOC && TARGET_MINIMAL_TOC)))
1db02437 13805 || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
14f00213 13806 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
f607bc57 13807 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
9ebbca7d
GK
13808 {
13809 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13810 GEN_INT (info->gp_save_offset
13811 + sp_offset
13812 + reg_size * i));
13813 rtx mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0 13814
a3170dc6 13815 /* Restore 64-bit quantities for SPE. */
c19de7aa 13816 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
a3170dc6
AH
13817 {
13818 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
13819 rtx b;
13820
13821 if (!SPE_CONST_OFFSET_OK (offset))
13822 {
13823 b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
13824 emit_move_insn (b, GEN_INT (offset));
13825 }
13826 else
13827 b = GEN_INT (offset);
13828
13829 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
13830 mem = gen_rtx_MEM (V2SImode, addr);
13831 }
13832
ba4828e0 13833 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
13834
13835 emit_move_insn (gen_rtx_REG (reg_mode,
a3170dc6 13836 info->first_gp_reg_save + i), mem);
9ebbca7d 13837 }
9878760c 13838
9ebbca7d
GK
13839 /* Restore fpr's if we need to do it without calling a function. */
13840 if (restoring_FPRs_inline)
13841 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
13842 if ((regs_ever_live[info->first_fp_reg_save+i]
13843 && ! call_used_regs[info->first_fp_reg_save+i]))
13844 {
13845 rtx addr, mem;
13846 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
13847 GEN_INT (info->fp_save_offset
13848 + sp_offset
a4f6c312 13849 + 8 * i));
9ebbca7d 13850 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 13851 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
13852
13853 emit_move_insn (gen_rtx_REG (DFmode,
13854 info->first_fp_reg_save + i),
13855 mem);
13856 }
8d30c4ee 13857
9ebbca7d
GK
13858 /* If we saved cr, restore it here. Just those that were used. */
13859 if (info->cr_save_p)
979721f8 13860 {
9ebbca7d 13861 rtx r12_rtx = gen_rtx_REG (SImode, 12);
e35b9579 13862 int count = 0;
9ebbca7d
GK
13863
13864 if (using_mfcr_multiple)
979721f8 13865 {
9ebbca7d
GK
13866 for (i = 0; i < 8; i++)
13867 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
e35b9579 13868 count++;
9ebbca7d 13869 if (count == 0)
e35b9579
GK
13870 abort ();
13871 }
13872
13873 if (using_mfcr_multiple && count > 1)
13874 {
13875 rtvec p;
13876 int ndx;
9ebbca7d 13877
e35b9579 13878 p = rtvec_alloc (count);
9ebbca7d 13879
e35b9579 13880 ndx = 0;
9ebbca7d
GK
13881 for (i = 0; i < 8; i++)
13882 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
13883 {
13884 rtvec r = rtvec_alloc (2);
13885 RTVEC_ELT (r, 0) = r12_rtx;
13886 RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
e35b9579 13887 RTVEC_ELT (p, ndx) =
9ebbca7d 13888 gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
615158e2 13889 gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
e35b9579 13890 ndx++;
9ebbca7d
GK
13891 }
13892 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
e35b9579
GK
13893 if (ndx != count)
13894 abort ();
979721f8
MM
13895 }
13896 else
9ebbca7d
GK
13897 for (i = 0; i < 8; i++)
13898 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
979721f8 13899 {
9ebbca7d
GK
13900 emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
13901 CR0_REGNO+i),
13902 r12_rtx));
979721f8 13903 }
979721f8
MM
13904 }
13905
9ebbca7d
GK
13906 /* If this is V.4, unwind the stack pointer after all of the loads
13907 have been done. We need to emit a block here so that sched
13908 doesn't decide to move the sp change before the register restores
13909 (which may not have any obvious dependency on the stack). This
13910 doesn't hurt performance, because there is no scheduling that can
13911 be done after this point. */
fc4767bb
JJ
13912 if (DEFAULT_ABI == ABI_V4
13913 || current_function_calls_eh_return)
b6c9286a 13914 {
9ebbca7d
GK
13915 if (frame_reg_rtx != sp_reg_rtx)
13916 rs6000_emit_stack_tie ();
b6c9286a 13917
9ebbca7d 13918 if (use_backchain_to_restore_sp)
b6c9286a 13919 {
9ebbca7d 13920 emit_move_insn (sp_reg_rtx, frame_reg_rtx);
b6c9286a 13921 }
9ebbca7d 13922 else if (sp_offset != 0)
13f1623b 13923 {
5b71a4e7 13924 emit_insn (TARGET_32BIT
9ebbca7d
GK
13925 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
13926 GEN_INT (sp_offset))
13927 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
13928 GEN_INT (sp_offset)));
13f1623b 13929 }
9ebbca7d 13930 }
b6c9286a 13931
83720594
RH
13932 if (current_function_calls_eh_return)
13933 {
13934 rtx sa = EH_RETURN_STACKADJ_RTX;
5b71a4e7 13935 emit_insn (TARGET_32BIT
83720594
RH
13936 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx, sa)
13937 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx, sa));
13938 }
13939
9ebbca7d
GK
13940 if (!sibcall)
13941 {
13942 rtvec p;
13943 if (! restoring_FPRs_inline)
13944 p = rtvec_alloc (3 + 64 - info->first_fp_reg_save);
13945 else
13946 p = rtvec_alloc (2);
b6c9286a 13947
e35b9579
GK
13948 RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
13949 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
9ebbca7d
GK
13950 gen_rtx_REG (Pmode,
13951 LINK_REGISTER_REGNUM));
9ebbca7d
GK
13952
13953 /* If we have to restore more than two FP registers, branch to the
13954 restore function. It will return to our caller. */
13955 if (! restoring_FPRs_inline)
13956 {
13957 int i;
13958 char rname[30];
520a57c8 13959 const char *alloc_rname;
979721f8 13960
9ebbca7d
GK
13961 sprintf (rname, "%s%d%s", RESTORE_FP_PREFIX,
13962 info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX);
a8a05998 13963 alloc_rname = ggc_strdup (rname);
9ebbca7d
GK
13964 RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode,
13965 gen_rtx_SYMBOL_REF (Pmode,
13966 alloc_rname));
b6c9286a 13967
9ebbca7d
GK
13968 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
13969 {
13970 rtx addr, mem;
13971 addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
13972 GEN_INT (info->fp_save_offset + 8*i));
13973 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 13974 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
13975
13976 RTVEC_ELT (p, i+3) =
13977 gen_rtx_SET (VOIDmode,
13978 gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
13979 mem);
b6c9286a
MM
13980 }
13981 }
9ebbca7d
GK
13982
13983 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
3daf36a4 13984 }
9878760c
RK
13985}
13986
13987/* Write function epilogue. */
13988
08c148a8 13989static void
a2369ed3
DJ
13990rs6000_output_function_epilogue (FILE *file,
13991 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9878760c 13992{
4697a36c 13993 rs6000_stack_t *info = rs6000_stack_info ();
9878760c 13994
9ebbca7d 13995 if (! HAVE_epilogue)
9878760c 13996 {
9ebbca7d
GK
13997 rtx insn = get_last_insn ();
13998 /* If the last insn was a BARRIER, we don't have to write anything except
13999 the trace table. */
14000 if (GET_CODE (insn) == NOTE)
14001 insn = prev_nonnote_insn (insn);
14002 if (insn == 0 || GET_CODE (insn) != BARRIER)
4697a36c 14003 {
9ebbca7d
GK
14004 /* This is slightly ugly, but at least we don't have two
14005 copies of the epilogue-emitting code. */
14006 start_sequence ();
14007
14008 /* A NOTE_INSN_DELETED is supposed to be at the start
14009 and end of the "toplevel" insn chain. */
2e040219 14010 emit_note (NOTE_INSN_DELETED);
9ebbca7d 14011 rs6000_emit_epilogue (FALSE);
2e040219 14012 emit_note (NOTE_INSN_DELETED);
9ebbca7d 14013
a3c9585f 14014 /* Expand INSN_ADDRESSES so final() doesn't crash. */
178c3eff
DJ
14015 {
14016 rtx insn;
14017 unsigned addr = 0;
14018 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
14019 {
14020 INSN_ADDRESSES_NEW (insn, addr);
14021 addr += 4;
14022 }
14023 }
14024
9ebbca7d 14025 if (TARGET_DEBUG_STACK)
a4f6c312
SS
14026 debug_rtx_list (get_insns (), 100);
14027 final (get_insns (), file, FALSE, FALSE);
9ebbca7d 14028 end_sequence ();
4697a36c 14029 }
9878760c 14030 }
b4ac57ab 14031
efdba735
SH
14032#if TARGET_MACHO
14033 macho_branch_islands ();
0e5da0be
GK
14034 /* Mach-O doesn't support labels at the end of objects, so if
14035 it looks like we might want one, insert a NOP. */
14036 {
14037 rtx insn = get_last_insn ();
14038 while (insn
14039 && NOTE_P (insn)
14040 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED_LABEL)
14041 insn = PREV_INSN (insn);
14042 if (insn
14043 && (LABEL_P (insn)
14044 || (NOTE_P (insn)
14045 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL)))
14046 fputs ("\tnop\n", file);
14047 }
14048#endif
14049
9b30bae2 14050 /* Output a traceback table here. See /usr/include/sys/debug.h for info
314fc5a9
ILT
14051 on its format.
14052
14053 We don't output a traceback table if -finhibit-size-directive was
14054 used. The documentation for -finhibit-size-directive reads
14055 ``don't output a @code{.size} assembler directive, or anything
14056 else that would cause trouble if the function is split in the
14057 middle, and the two halves are placed at locations far apart in
14058 memory.'' The traceback table has this property, since it
14059 includes the offset from the start of the function to the
4d30c363
MM
14060 traceback table itself.
14061
14062 System V.4 Powerpc's (and the embedded ABI derived from it) use a
b6c9286a 14063 different traceback table. */
57ac7be9
AM
14064 if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
14065 && rs6000_traceback != traceback_none)
9b30bae2 14066 {
69c75916 14067 const char *fname = NULL;
3ac88239 14068 const char *language_string = lang_hooks.name;
6041bf2f 14069 int fixed_parms = 0, float_parms = 0, parm_info = 0;
314fc5a9 14070 int i;
57ac7be9
AM
14071 int optional_tbtab;
14072
14073 if (rs6000_traceback == traceback_full)
14074 optional_tbtab = 1;
14075 else if (rs6000_traceback == traceback_part)
14076 optional_tbtab = 0;
14077 else
14078 optional_tbtab = !optimize_size && !TARGET_ELF;
314fc5a9 14079
69c75916
AM
14080 if (optional_tbtab)
14081 {
14082 fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
14083 while (*fname == '.') /* V.4 encodes . in the name */
14084 fname++;
14085
14086 /* Need label immediately before tbtab, so we can compute
14087 its offset from the function start. */
14088 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
14089 ASM_OUTPUT_LABEL (file, fname);
14090 }
314fc5a9
ILT
14091
14092 /* The .tbtab pseudo-op can only be used for the first eight
14093 expressions, since it can't handle the possibly variable
14094 length fields that follow. However, if you omit the optional
14095 fields, the assembler outputs zeros for all optional fields
14096 anyways, giving each variable length field is minimum length
14097 (as defined in sys/debug.h). Thus we can not use the .tbtab
14098 pseudo-op at all. */
14099
14100 /* An all-zero word flags the start of the tbtab, for debuggers
14101 that have to find it by searching forward from the entry
14102 point or from the current pc. */
19d2d16f 14103 fputs ("\t.long 0\n", file);
314fc5a9
ILT
14104
14105 /* Tbtab format type. Use format type 0. */
19d2d16f 14106 fputs ("\t.byte 0,", file);
314fc5a9 14107
5fc921c1
DE
14108 /* Language type. Unfortunately, there does not seem to be any
14109 official way to discover the language being compiled, so we
14110 use language_string.
14111 C is 0. Fortran is 1. Pascal is 2. Ada is 3. C++ is 9.
14112 Java is 13. Objective-C is 14. */
14113 if (! strcmp (language_string, "GNU C"))
314fc5a9 14114 i = 0;
6de9cd9a
DN
14115 else if (! strcmp (language_string, "GNU F77")
14116 || ! strcmp (language_string, "GNU F95"))
314fc5a9 14117 i = 1;
8b83775b 14118 else if (! strcmp (language_string, "GNU Pascal"))
314fc5a9 14119 i = 2;
5fc921c1
DE
14120 else if (! strcmp (language_string, "GNU Ada"))
14121 i = 3;
314fc5a9
ILT
14122 else if (! strcmp (language_string, "GNU C++"))
14123 i = 9;
9517ead8
AG
14124 else if (! strcmp (language_string, "GNU Java"))
14125 i = 13;
5fc921c1
DE
14126 else if (! strcmp (language_string, "GNU Objective-C"))
14127 i = 14;
314fc5a9
ILT
14128 else
14129 abort ();
14130 fprintf (file, "%d,", i);
14131
14132 /* 8 single bit fields: global linkage (not set for C extern linkage,
14133 apparently a PL/I convention?), out-of-line epilogue/prologue, offset
14134 from start of procedure stored in tbtab, internal function, function
14135 has controlled storage, function has no toc, function uses fp,
14136 function logs/aborts fp operations. */
14137 /* Assume that fp operations are used if any fp reg must be saved. */
6041bf2f
DE
14138 fprintf (file, "%d,",
14139 (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
314fc5a9
ILT
14140
14141 /* 6 bitfields: function is interrupt handler, name present in
14142 proc table, function calls alloca, on condition directives
14143 (controls stack walks, 3 bits), saves condition reg, saves
14144 link reg. */
14145 /* The `function calls alloca' bit seems to be set whenever reg 31 is
14146 set up as a frame pointer, even when there is no alloca call. */
14147 fprintf (file, "%d,",
6041bf2f
DE
14148 ((optional_tbtab << 6)
14149 | ((optional_tbtab & frame_pointer_needed) << 5)
14150 | (info->cr_save_p << 1)
14151 | (info->lr_save_p)));
314fc5a9 14152
6041bf2f 14153 /* 3 bitfields: saves backchain, fixup code, number of fpr saved
314fc5a9
ILT
14154 (6 bits). */
14155 fprintf (file, "%d,",
4697a36c 14156 (info->push_p << 7) | (64 - info->first_fp_reg_save));
314fc5a9
ILT
14157
14158 /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits). */
14159 fprintf (file, "%d,", (32 - first_reg_to_save ()));
14160
6041bf2f
DE
14161 if (optional_tbtab)
14162 {
14163 /* Compute the parameter info from the function decl argument
14164 list. */
14165 tree decl;
14166 int next_parm_info_bit = 31;
314fc5a9 14167
6041bf2f
DE
14168 for (decl = DECL_ARGUMENTS (current_function_decl);
14169 decl; decl = TREE_CHAIN (decl))
14170 {
14171 rtx parameter = DECL_INCOMING_RTL (decl);
14172 enum machine_mode mode = GET_MODE (parameter);
314fc5a9 14173
6041bf2f
DE
14174 if (GET_CODE (parameter) == REG)
14175 {
14176 if (GET_MODE_CLASS (mode) == MODE_FLOAT)
14177 {
14178 int bits;
14179
14180 float_parms++;
14181
14182 if (mode == SFmode)
14183 bits = 0x2;
fcce224d 14184 else if (mode == DFmode || mode == TFmode)
6041bf2f
DE
14185 bits = 0x3;
14186 else
14187 abort ();
14188
14189 /* If only one bit will fit, don't or in this entry. */
14190 if (next_parm_info_bit > 0)
14191 parm_info |= (bits << (next_parm_info_bit - 1));
14192 next_parm_info_bit -= 2;
14193 }
14194 else
14195 {
14196 fixed_parms += ((GET_MODE_SIZE (mode)
14197 + (UNITS_PER_WORD - 1))
14198 / UNITS_PER_WORD);
14199 next_parm_info_bit -= 1;
14200 }
14201 }
14202 }
14203 }
314fc5a9
ILT
14204
14205 /* Number of fixed point parameters. */
14206 /* This is actually the number of words of fixed point parameters; thus
14207 an 8 byte struct counts as 2; and thus the maximum value is 8. */
14208 fprintf (file, "%d,", fixed_parms);
14209
14210 /* 2 bitfields: number of floating point parameters (7 bits), parameters
14211 all on stack. */
14212 /* This is actually the number of fp registers that hold parameters;
14213 and thus the maximum value is 13. */
14214 /* Set parameters on stack bit if parameters are not in their original
14215 registers, regardless of whether they are on the stack? Xlc
14216 seems to set the bit when not optimizing. */
14217 fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
14218
6041bf2f
DE
14219 if (! optional_tbtab)
14220 return;
14221
314fc5a9
ILT
14222 /* Optional fields follow. Some are variable length. */
14223
14224 /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
14225 11 double float. */
14226 /* There is an entry for each parameter in a register, in the order that
14227 they occur in the parameter list. Any intervening arguments on the
14228 stack are ignored. If the list overflows a long (max possible length
14229 34 bits) then completely leave off all elements that don't fit. */
14230 /* Only emit this long if there was at least one parameter. */
14231 if (fixed_parms || float_parms)
14232 fprintf (file, "\t.long %d\n", parm_info);
14233
14234 /* Offset from start of code to tb table. */
19d2d16f 14235 fputs ("\t.long ", file);
314fc5a9 14236 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
85b776df
AM
14237 if (TARGET_AIX)
14238 RS6000_OUTPUT_BASENAME (file, fname);
14239 else
14240 assemble_name (file, fname);
14241 putc ('-', file);
14242 rs6000_output_function_entry (file, fname);
19d2d16f 14243 putc ('\n', file);
314fc5a9
ILT
14244
14245 /* Interrupt handler mask. */
14246 /* Omit this long, since we never set the interrupt handler bit
14247 above. */
14248
14249 /* Number of CTL (controlled storage) anchors. */
14250 /* Omit this long, since the has_ctl bit is never set above. */
14251
14252 /* Displacement into stack of each CTL anchor. */
14253 /* Omit this list of longs, because there are no CTL anchors. */
14254
14255 /* Length of function name. */
69c75916
AM
14256 if (*fname == '*')
14257 ++fname;
296b8152 14258 fprintf (file, "\t.short %d\n", (int) strlen (fname));
314fc5a9
ILT
14259
14260 /* Function name. */
14261 assemble_string (fname, strlen (fname));
14262
14263 /* Register for alloca automatic storage; this is always reg 31.
14264 Only emit this if the alloca bit was set above. */
14265 if (frame_pointer_needed)
19d2d16f 14266 fputs ("\t.byte 31\n", file);
b1765bde
DE
14267
14268 fputs ("\t.align 2\n", file);
9b30bae2 14269 }
9878760c 14270}
17167fd8 14271\f
a4f6c312
SS
14272/* A C compound statement that outputs the assembler code for a thunk
14273 function, used to implement C++ virtual function calls with
14274 multiple inheritance. The thunk acts as a wrapper around a virtual
14275 function, adjusting the implicit object parameter before handing
14276 control off to the real function.
14277
14278 First, emit code to add the integer DELTA to the location that
14279 contains the incoming first argument. Assume that this argument
14280 contains a pointer, and is the one used to pass the `this' pointer
14281 in C++. This is the incoming argument *before* the function
14282 prologue, e.g. `%o0' on a sparc. The addition must preserve the
14283 values of all other incoming arguments.
17167fd8
MM
14284
14285 After the addition, emit code to jump to FUNCTION, which is a
a4f6c312
SS
14286 `FUNCTION_DECL'. This is a direct pure jump, not a call, and does
14287 not touch the return address. Hence returning from FUNCTION will
14288 return to whoever called the current `thunk'.
17167fd8 14289
a4f6c312
SS
14290 The effect must be as if FUNCTION had been called directly with the
14291 adjusted first argument. This macro is responsible for emitting
14292 all of the code for a thunk function; output_function_prologue()
14293 and output_function_epilogue() are not invoked.
17167fd8 14294
a4f6c312
SS
14295 The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already
14296 been extracted from it.) It might possibly be useful on some
14297 targets, but probably not.
17167fd8 14298
a4f6c312
SS
14299 If you do not define this macro, the target-independent code in the
14300 C++ frontend will generate a less efficient heavyweight thunk that
14301 calls FUNCTION instead of jumping to it. The generic approach does
14302 not support varargs. */
17167fd8 14303
3961e8fe 14304static void
a2369ed3
DJ
14305rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
14306 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
14307 tree function)
17167fd8 14308{
5b71a4e7 14309 rtx this, insn, funexp;
17167fd8 14310
5b71a4e7 14311 reload_completed = 1;
fe3ad572 14312 epilogue_completed = 1;
5b71a4e7 14313 no_new_pseudos = 1;
6429e3be 14314 reset_block_changes ();
56a7189a 14315
5b71a4e7 14316 /* Mark the end of the (empty) prologue. */
2e040219 14317 emit_note (NOTE_INSN_PROLOGUE_END);
17167fd8 14318
5b71a4e7
DE
14319 /* Find the "this" pointer. If the function returns a structure,
14320 the structure return pointer is in r3. */
61f71b34 14321 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
5b71a4e7 14322 this = gen_rtx_REG (Pmode, 4);
56a7189a 14323 else
5b71a4e7 14324 this = gen_rtx_REG (Pmode, 3);
17167fd8 14325
5b71a4e7
DE
14326 /* Apply the constant offset, if required. */
14327 if (delta)
14328 {
14329 rtx delta_rtx = GEN_INT (delta);
14330 emit_insn (TARGET_32BIT
14331 ? gen_addsi3 (this, this, delta_rtx)
14332 : gen_adddi3 (this, this, delta_rtx));
17167fd8
MM
14333 }
14334
5b71a4e7
DE
14335 /* Apply the offset from the vtable, if required. */
14336 if (vcall_offset)
17167fd8 14337 {
5b71a4e7
DE
14338 rtx vcall_offset_rtx = GEN_INT (vcall_offset);
14339 rtx tmp = gen_rtx_REG (Pmode, 12);
17167fd8 14340
5b71a4e7 14341 emit_move_insn (tmp, gen_rtx_MEM (Pmode, this));
eeff9307
JJ
14342 if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
14343 {
14344 emit_insn (TARGET_32BIT
14345 ? gen_addsi3 (tmp, tmp, vcall_offset_rtx)
14346 : gen_adddi3 (tmp, tmp, vcall_offset_rtx));
14347 emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
14348 }
14349 else
14350 {
14351 rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
14352
14353 emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
14354 }
5b71a4e7
DE
14355 emit_insn (TARGET_32BIT
14356 ? gen_addsi3 (this, this, tmp)
14357 : gen_adddi3 (this, this, tmp));
17167fd8
MM
14358 }
14359
5b71a4e7
DE
14360 /* Generate a tail call to the target function. */
14361 if (!TREE_USED (function))
14362 {
14363 assemble_external (function);
14364 TREE_USED (function) = 1;
14365 }
14366 funexp = XEXP (DECL_RTL (function), 0);
5b71a4e7 14367 funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
ee890fe2
SS
14368
14369#if TARGET_MACHO
ab82a49f 14370 if (MACHOPIC_INDIRECT)
5b71a4e7 14371 funexp = machopic_indirect_call_target (funexp);
ee890fe2 14372#endif
5b71a4e7
DE
14373
14374 /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
14375 generate sibcall RTL explicitly to avoid constraint abort. */
14376 insn = emit_call_insn (
14377 gen_rtx_PARALLEL (VOIDmode,
14378 gen_rtvec (4,
14379 gen_rtx_CALL (VOIDmode,
14380 funexp, const0_rtx),
14381 gen_rtx_USE (VOIDmode, const0_rtx),
14382 gen_rtx_USE (VOIDmode,
14383 gen_rtx_REG (SImode,
14384 LINK_REGISTER_REGNUM)),
14385 gen_rtx_RETURN (VOIDmode))));
14386 SIBLING_CALL_P (insn) = 1;
14387 emit_barrier ();
14388
14389 /* Run just enough of rest_of_compilation to get the insns emitted.
14390 There's not really enough bulk here to make other passes such as
14391 instruction scheduling worth while. Note that use_thunk calls
14392 assemble_start_function and assemble_end_function. */
14393 insn = get_insns ();
a2855205 14394 insn_locators_initialize ();
5b71a4e7
DE
14395 shorten_branches (insn);
14396 final_start_function (insn, file, 1);
14397 final (insn, file, 1, 0);
14398 final_end_function ();
14399
14400 reload_completed = 0;
fe3ad572 14401 epilogue_completed = 0;
5b71a4e7 14402 no_new_pseudos = 0;
9ebbca7d 14403}
9ebbca7d
GK
14404\f
14405/* A quick summary of the various types of 'constant-pool tables'
14406 under PowerPC:
14407
14408 Target Flags Name One table per
14409 AIX (none) AIX TOC object file
14410 AIX -mfull-toc AIX TOC object file
14411 AIX -mminimal-toc AIX minimal TOC translation unit
14412 SVR4/EABI (none) SVR4 SDATA object file
14413 SVR4/EABI -fpic SVR4 pic object file
14414 SVR4/EABI -fPIC SVR4 PIC translation unit
14415 SVR4/EABI -mrelocatable EABI TOC function
14416 SVR4/EABI -maix AIX TOC object file
14417 SVR4/EABI -maix -mminimal-toc
14418 AIX minimal TOC translation unit
14419
14420 Name Reg. Set by entries contains:
14421 made by addrs? fp? sum?
14422
14423 AIX TOC 2 crt0 as Y option option
14424 AIX minimal TOC 30 prolog gcc Y Y option
14425 SVR4 SDATA 13 crt0 gcc N Y N
14426 SVR4 pic 30 prolog ld Y not yet N
14427 SVR4 PIC 30 prolog gcc Y option option
14428 EABI TOC 30 prolog gcc Y option option
14429
14430*/
14431
9ebbca7d
GK
14432/* Hash functions for the hash table. */
14433
14434static unsigned
a2369ed3 14435rs6000_hash_constant (rtx k)
9ebbca7d 14436{
46b33600
RH
14437 enum rtx_code code = GET_CODE (k);
14438 enum machine_mode mode = GET_MODE (k);
14439 unsigned result = (code << 3) ^ mode;
14440 const char *format;
14441 int flen, fidx;
9ebbca7d 14442
46b33600
RH
14443 format = GET_RTX_FORMAT (code);
14444 flen = strlen (format);
14445 fidx = 0;
9ebbca7d 14446
46b33600
RH
14447 switch (code)
14448 {
14449 case LABEL_REF:
14450 return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
14451
14452 case CONST_DOUBLE:
14453 if (mode != VOIDmode)
14454 return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
14455 flen = 2;
14456 break;
14457
14458 case CODE_LABEL:
14459 fidx = 3;
14460 break;
14461
14462 default:
14463 break;
14464 }
9ebbca7d
GK
14465
14466 for (; fidx < flen; fidx++)
14467 switch (format[fidx])
14468 {
14469 case 's':
14470 {
14471 unsigned i, len;
14472 const char *str = XSTR (k, fidx);
14473 len = strlen (str);
14474 result = result * 613 + len;
14475 for (i = 0; i < len; i++)
14476 result = result * 613 + (unsigned) str[i];
17167fd8
MM
14477 break;
14478 }
9ebbca7d
GK
14479 case 'u':
14480 case 'e':
14481 result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
14482 break;
14483 case 'i':
14484 case 'n':
14485 result = result * 613 + (unsigned) XINT (k, fidx);
14486 break;
14487 case 'w':
14488 if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
14489 result = result * 613 + (unsigned) XWINT (k, fidx);
14490 else
14491 {
14492 size_t i;
14493 for (i = 0; i < sizeof(HOST_WIDE_INT)/sizeof(unsigned); i++)
14494 result = result * 613 + (unsigned) (XWINT (k, fidx)
14495 >> CHAR_BIT * i);
14496 }
14497 break;
09501938
DE
14498 case '0':
14499 break;
9ebbca7d 14500 default:
a4f6c312 14501 abort ();
9ebbca7d 14502 }
46b33600 14503
9ebbca7d
GK
14504 return result;
14505}
14506
14507static unsigned
a2369ed3 14508toc_hash_function (const void *hash_entry)
9ebbca7d 14509{
a9098fd0
GK
14510 const struct toc_hash_struct *thc =
14511 (const struct toc_hash_struct *) hash_entry;
14512 return rs6000_hash_constant (thc->key) ^ thc->key_mode;
9ebbca7d
GK
14513}
14514
14515/* Compare H1 and H2 for equivalence. */
14516
14517static int
a2369ed3 14518toc_hash_eq (const void *h1, const void *h2)
9ebbca7d
GK
14519{
14520 rtx r1 = ((const struct toc_hash_struct *) h1)->key;
14521 rtx r2 = ((const struct toc_hash_struct *) h2)->key;
14522
a9098fd0
GK
14523 if (((const struct toc_hash_struct *) h1)->key_mode
14524 != ((const struct toc_hash_struct *) h2)->key_mode)
14525 return 0;
14526
5692c7bc 14527 return rtx_equal_p (r1, r2);
9ebbca7d
GK
14528}
14529
28e510bd
MM
14530/* These are the names given by the C++ front-end to vtables, and
14531 vtable-like objects. Ideally, this logic should not be here;
14532 instead, there should be some programmatic way of inquiring as
14533 to whether or not an object is a vtable. */
14534
14535#define VTABLE_NAME_P(NAME) \
14536 (strncmp ("_vt.", name, strlen("_vt.")) == 0 \
14537 || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0 \
14538 || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0 \
26be75db 14539 || strncmp ("_ZTI", name, strlen ("_ZTI")) == 0 \
28e510bd
MM
14540 || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
14541
14542void
a2369ed3 14543rs6000_output_symbol_ref (FILE *file, rtx x)
28e510bd
MM
14544{
14545 /* Currently C++ toc references to vtables can be emitted before it
14546 is decided whether the vtable is public or private. If this is
14547 the case, then the linker will eventually complain that there is
14548 a reference to an unknown section. Thus, for vtables only,
14549 we emit the TOC reference to reference the symbol and not the
14550 section. */
14551 const char *name = XSTR (x, 0);
54ee9799
DE
14552
14553 if (VTABLE_NAME_P (name))
14554 {
14555 RS6000_OUTPUT_BASENAME (file, name);
14556 }
14557 else
14558 assemble_name (file, name);
28e510bd
MM
14559}
14560
a4f6c312
SS
14561/* Output a TOC entry. We derive the entry name from what is being
14562 written. */
9878760c
RK
14563
14564void
a2369ed3 14565output_toc (FILE *file, rtx x, int labelno, enum machine_mode mode)
9878760c
RK
14566{
14567 char buf[256];
3cce094d 14568 const char *name = buf;
ec940faa 14569 const char *real_name;
9878760c
RK
14570 rtx base = x;
14571 int offset = 0;
14572
4697a36c
MM
14573 if (TARGET_NO_TOC)
14574 abort ();
14575
9ebbca7d
GK
14576 /* When the linker won't eliminate them, don't output duplicate
14577 TOC entries (this happens on AIX if there is any kind of TOC,
17211ab5
GK
14578 and on SVR4 under -fPIC or -mrelocatable). Don't do this for
14579 CODE_LABELs. */
14580 if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
9ebbca7d
GK
14581 {
14582 struct toc_hash_struct *h;
14583 void * * found;
14584
17211ab5 14585 /* Create toc_hash_table. This can't be done at OVERRIDE_OPTIONS
39e3f58c 14586 time because GGC is not initialized at that point. */
17211ab5
GK
14587 if (toc_hash_table == NULL)
14588 toc_hash_table = htab_create_ggc (1021, toc_hash_function,
14589 toc_hash_eq, NULL);
14590
9ebbca7d
GK
14591 h = ggc_alloc (sizeof (*h));
14592 h->key = x;
a9098fd0 14593 h->key_mode = mode;
9ebbca7d
GK
14594 h->labelno = labelno;
14595
14596 found = htab_find_slot (toc_hash_table, h, 1);
14597 if (*found == NULL)
14598 *found = h;
14599 else /* This is indeed a duplicate.
14600 Set this label equal to that label. */
14601 {
14602 fputs ("\t.set ", file);
14603 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
14604 fprintf (file, "%d,", labelno);
14605 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
14606 fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
14607 found)->labelno));
14608 return;
14609 }
14610 }
14611
14612 /* If we're going to put a double constant in the TOC, make sure it's
14613 aligned properly when strict alignment is on. */
ff1720ed
RK
14614 if (GET_CODE (x) == CONST_DOUBLE
14615 && STRICT_ALIGNMENT
a9098fd0 14616 && GET_MODE_BITSIZE (mode) >= 64
ff1720ed
RK
14617 && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
14618 ASM_OUTPUT_ALIGN (file, 3);
14619 }
14620
4977bab6 14621 (*targetm.asm_out.internal_label) (file, "LC", labelno);
9878760c 14622
37c37a57
RK
14623 /* Handle FP constants specially. Note that if we have a minimal
14624 TOC, things we put here aren't actually in the TOC, so we can allow
14625 FP constants. */
fcce224d
DE
14626 if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == TFmode)
14627 {
14628 REAL_VALUE_TYPE rv;
14629 long k[4];
14630
14631 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
14632 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
14633
14634 if (TARGET_64BIT)
14635 {
14636 if (TARGET_MINIMAL_TOC)
14637 fputs (DOUBLE_INT_ASM_OP, file);
14638 else
14639 fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
14640 k[0] & 0xffffffff, k[1] & 0xffffffff,
14641 k[2] & 0xffffffff, k[3] & 0xffffffff);
14642 fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
14643 k[0] & 0xffffffff, k[1] & 0xffffffff,
14644 k[2] & 0xffffffff, k[3] & 0xffffffff);
14645 return;
14646 }
14647 else
14648 {
14649 if (TARGET_MINIMAL_TOC)
14650 fputs ("\t.long ", file);
14651 else
14652 fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
14653 k[0] & 0xffffffff, k[1] & 0xffffffff,
14654 k[2] & 0xffffffff, k[3] & 0xffffffff);
14655 fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
14656 k[0] & 0xffffffff, k[1] & 0xffffffff,
14657 k[2] & 0xffffffff, k[3] & 0xffffffff);
14658 return;
14659 }
14660 }
14661 else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
9878760c 14662 {
042259f2
DE
14663 REAL_VALUE_TYPE rv;
14664 long k[2];
0adc764e 14665
042259f2
DE
14666 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
14667 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
31bfaa0b 14668
13ded975
DE
14669 if (TARGET_64BIT)
14670 {
14671 if (TARGET_MINIMAL_TOC)
2bfcf297 14672 fputs (DOUBLE_INT_ASM_OP, file);
13ded975 14673 else
2f0552b6
AM
14674 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
14675 k[0] & 0xffffffff, k[1] & 0xffffffff);
14676 fprintf (file, "0x%lx%08lx\n",
14677 k[0] & 0xffffffff, k[1] & 0xffffffff);
13ded975
DE
14678 return;
14679 }
1875cc88 14680 else
13ded975
DE
14681 {
14682 if (TARGET_MINIMAL_TOC)
2bfcf297 14683 fputs ("\t.long ", file);
13ded975 14684 else
2f0552b6
AM
14685 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
14686 k[0] & 0xffffffff, k[1] & 0xffffffff);
14687 fprintf (file, "0x%lx,0x%lx\n",
14688 k[0] & 0xffffffff, k[1] & 0xffffffff);
13ded975
DE
14689 return;
14690 }
9878760c 14691 }
a9098fd0 14692 else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
9878760c 14693 {
042259f2
DE
14694 REAL_VALUE_TYPE rv;
14695 long l;
9878760c 14696
042259f2
DE
14697 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
14698 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
14699
31bfaa0b
DE
14700 if (TARGET_64BIT)
14701 {
14702 if (TARGET_MINIMAL_TOC)
2bfcf297 14703 fputs (DOUBLE_INT_ASM_OP, file);
31bfaa0b 14704 else
2f0552b6
AM
14705 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
14706 fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
31bfaa0b
DE
14707 return;
14708 }
042259f2 14709 else
31bfaa0b
DE
14710 {
14711 if (TARGET_MINIMAL_TOC)
2bfcf297 14712 fputs ("\t.long ", file);
31bfaa0b 14713 else
2f0552b6
AM
14714 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
14715 fprintf (file, "0x%lx\n", l & 0xffffffff);
31bfaa0b
DE
14716 return;
14717 }
042259f2 14718 }
f176e826 14719 else if (GET_MODE (x) == VOIDmode
a9098fd0 14720 && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
042259f2 14721 {
e2c953b6 14722 unsigned HOST_WIDE_INT low;
042259f2
DE
14723 HOST_WIDE_INT high;
14724
14725 if (GET_CODE (x) == CONST_DOUBLE)
14726 {
14727 low = CONST_DOUBLE_LOW (x);
14728 high = CONST_DOUBLE_HIGH (x);
14729 }
14730 else
14731#if HOST_BITS_PER_WIDE_INT == 32
14732 {
14733 low = INTVAL (x);
0858c623 14734 high = (low & 0x80000000) ? ~0 : 0;
042259f2
DE
14735 }
14736#else
14737 {
0858c623 14738 low = INTVAL (x) & 0xffffffff;
042259f2
DE
14739 high = (HOST_WIDE_INT) INTVAL (x) >> 32;
14740 }
14741#endif
9878760c 14742
a9098fd0
GK
14743 /* TOC entries are always Pmode-sized, but since this
14744 is a bigendian machine then if we're putting smaller
14745 integer constants in the TOC we have to pad them.
14746 (This is still a win over putting the constants in
14747 a separate constant pool, because then we'd have
02a4ec28
FS
14748 to have both a TOC entry _and_ the actual constant.)
14749
14750 For a 32-bit target, CONST_INT values are loaded and shifted
14751 entirely within `low' and can be stored in one TOC entry. */
14752
14753 if (TARGET_64BIT && POINTER_SIZE < GET_MODE_BITSIZE (mode))
a9098fd0 14754 abort ();/* It would be easy to make this work, but it doesn't now. */
02a4ec28
FS
14755
14756 if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
fb52d8de
AM
14757 {
14758#if HOST_BITS_PER_WIDE_INT == 32
14759 lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
14760 POINTER_SIZE, &low, &high, 0);
14761#else
14762 low |= high << 32;
14763 low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
14764 high = (HOST_WIDE_INT) low >> 32;
14765 low &= 0xffffffff;
14766#endif
14767 }
a9098fd0 14768
13ded975
DE
14769 if (TARGET_64BIT)
14770 {
14771 if (TARGET_MINIMAL_TOC)
2bfcf297 14772 fputs (DOUBLE_INT_ASM_OP, file);
13ded975 14773 else
2f0552b6
AM
14774 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
14775 (long) high & 0xffffffff, (long) low & 0xffffffff);
14776 fprintf (file, "0x%lx%08lx\n",
14777 (long) high & 0xffffffff, (long) low & 0xffffffff);
13ded975
DE
14778 return;
14779 }
1875cc88 14780 else
13ded975 14781 {
02a4ec28
FS
14782 if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
14783 {
14784 if (TARGET_MINIMAL_TOC)
2bfcf297 14785 fputs ("\t.long ", file);
02a4ec28 14786 else
2bfcf297 14787 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
2f0552b6
AM
14788 (long) high & 0xffffffff, (long) low & 0xffffffff);
14789 fprintf (file, "0x%lx,0x%lx\n",
14790 (long) high & 0xffffffff, (long) low & 0xffffffff);
02a4ec28 14791 }
13ded975 14792 else
02a4ec28
FS
14793 {
14794 if (TARGET_MINIMAL_TOC)
2bfcf297 14795 fputs ("\t.long ", file);
02a4ec28 14796 else
2f0552b6
AM
14797 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
14798 fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
02a4ec28 14799 }
13ded975
DE
14800 return;
14801 }
9878760c
RK
14802 }
14803
14804 if (GET_CODE (x) == CONST)
14805 {
2bfcf297
DB
14806 if (GET_CODE (XEXP (x, 0)) != PLUS)
14807 abort ();
14808
9878760c
RK
14809 base = XEXP (XEXP (x, 0), 0);
14810 offset = INTVAL (XEXP (XEXP (x, 0), 1));
14811 }
14812
14813 if (GET_CODE (base) == SYMBOL_REF)
14814 name = XSTR (base, 0);
14815 else if (GET_CODE (base) == LABEL_REF)
14816 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (XEXP (base, 0)));
14817 else if (GET_CODE (base) == CODE_LABEL)
14818 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
14819 else
14820 abort ();
14821
772c5265 14822 real_name = (*targetm.strip_name_encoding) (name);
1875cc88 14823 if (TARGET_MINIMAL_TOC)
2bfcf297 14824 fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
1875cc88
JW
14825 else
14826 {
b6c9286a 14827 fprintf (file, "\t.tc %s", real_name);
9878760c 14828
1875cc88
JW
14829 if (offset < 0)
14830 fprintf (file, ".N%d", - offset);
14831 else if (offset)
14832 fprintf (file, ".P%d", offset);
9878760c 14833
19d2d16f 14834 fputs ("[TC],", file);
1875cc88 14835 }
581bc4de
MM
14836
14837 /* Currently C++ toc references to vtables can be emitted before it
14838 is decided whether the vtable is public or private. If this is
14839 the case, then the linker will eventually complain that there is
14840 a TOC reference to an unknown section. Thus, for vtables only,
14841 we emit the TOC reference to reference the symbol and not the
14842 section. */
28e510bd 14843 if (VTABLE_NAME_P (name))
581bc4de 14844 {
54ee9799 14845 RS6000_OUTPUT_BASENAME (file, name);
581bc4de
MM
14846 if (offset < 0)
14847 fprintf (file, "%d", offset);
14848 else if (offset > 0)
14849 fprintf (file, "+%d", offset);
14850 }
14851 else
14852 output_addr_const (file, x);
19d2d16f 14853 putc ('\n', file);
9878760c
RK
14854}
14855\f
14856/* Output an assembler pseudo-op to write an ASCII string of N characters
14857 starting at P to FILE.
14858
14859 On the RS/6000, we have to do this using the .byte operation and
14860 write out special characters outside the quoted string.
14861 Also, the assembler is broken; very long strings are truncated,
a4f6c312 14862 so we must artificially break them up early. */
9878760c
RK
14863
14864void
a2369ed3 14865output_ascii (FILE *file, const char *p, int n)
9878760c
RK
14866{
14867 char c;
14868 int i, count_string;
d330fd93
KG
14869 const char *for_string = "\t.byte \"";
14870 const char *for_decimal = "\t.byte ";
14871 const char *to_close = NULL;
9878760c
RK
14872
14873 count_string = 0;
14874 for (i = 0; i < n; i++)
14875 {
14876 c = *p++;
14877 if (c >= ' ' && c < 0177)
14878 {
14879 if (for_string)
14880 fputs (for_string, file);
14881 putc (c, file);
14882
14883 /* Write two quotes to get one. */
14884 if (c == '"')
14885 {
14886 putc (c, file);
14887 ++count_string;
14888 }
14889
14890 for_string = NULL;
14891 for_decimal = "\"\n\t.byte ";
14892 to_close = "\"\n";
14893 ++count_string;
14894
14895 if (count_string >= 512)
14896 {
14897 fputs (to_close, file);
14898
14899 for_string = "\t.byte \"";
14900 for_decimal = "\t.byte ";
14901 to_close = NULL;
14902 count_string = 0;
14903 }
14904 }
14905 else
14906 {
14907 if (for_decimal)
14908 fputs (for_decimal, file);
14909 fprintf (file, "%d", c);
14910
14911 for_string = "\n\t.byte \"";
14912 for_decimal = ", ";
14913 to_close = "\n";
14914 count_string = 0;
14915 }
14916 }
14917
14918 /* Now close the string if we have written one. Then end the line. */
14919 if (to_close)
9ebbca7d 14920 fputs (to_close, file);
9878760c
RK
14921}
14922\f
14923/* Generate a unique section name for FILENAME for a section type
14924 represented by SECTION_DESC. Output goes into BUF.
14925
14926 SECTION_DESC can be any string, as long as it is different for each
14927 possible section type.
14928
14929 We name the section in the same manner as xlc. The name begins with an
14930 underscore followed by the filename (after stripping any leading directory
11e5fe42
RK
14931 names) with the last period replaced by the string SECTION_DESC. If
14932 FILENAME does not contain a period, SECTION_DESC is appended to the end of
14933 the name. */
9878760c
RK
14934
14935void
a2369ed3
DJ
14936rs6000_gen_section_name (char **buf, const char *filename,
14937 const char *section_desc)
9878760c 14938{
9ebbca7d 14939 const char *q, *after_last_slash, *last_period = 0;
9878760c
RK
14940 char *p;
14941 int len;
9878760c
RK
14942
14943 after_last_slash = filename;
14944 for (q = filename; *q; q++)
11e5fe42
RK
14945 {
14946 if (*q == '/')
14947 after_last_slash = q + 1;
14948 else if (*q == '.')
14949 last_period = q;
14950 }
9878760c 14951
11e5fe42 14952 len = strlen (after_last_slash) + strlen (section_desc) + 2;
6d9f628e 14953 *buf = (char *) xmalloc (len);
9878760c
RK
14954
14955 p = *buf;
14956 *p++ = '_';
14957
14958 for (q = after_last_slash; *q; q++)
14959 {
11e5fe42 14960 if (q == last_period)
9878760c
RK
14961 {
14962 strcpy (p, section_desc);
14963 p += strlen (section_desc);
e3981aab 14964 break;
9878760c
RK
14965 }
14966
e9a780ec 14967 else if (ISALNUM (*q))
9878760c
RK
14968 *p++ = *q;
14969 }
14970
11e5fe42 14971 if (last_period == 0)
9878760c
RK
14972 strcpy (p, section_desc);
14973 else
14974 *p = '\0';
14975}
e165f3f0 14976\f
a4f6c312 14977/* Emit profile function. */
411707f4 14978
411707f4 14979void
a2369ed3 14980output_profile_hook (int labelno ATTRIBUTE_UNUSED)
411707f4 14981{
ffcfcb5f
AM
14982 if (TARGET_PROFILE_KERNEL)
14983 return;
14984
8480e480
CC
14985 if (DEFAULT_ABI == ABI_AIX)
14986 {
9739c90c
JJ
14987#ifndef NO_PROFILE_COUNTERS
14988# define NO_PROFILE_COUNTERS 0
14989#endif
14990 if (NO_PROFILE_COUNTERS)
14991 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 0);
14992 else
14993 {
14994 char buf[30];
14995 const char *label_name;
14996 rtx fun;
411707f4 14997
9739c90c
JJ
14998 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
14999 label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
15000 fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
411707f4 15001
9739c90c
JJ
15002 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 1,
15003 fun, Pmode);
15004 }
8480e480 15005 }
ee890fe2
SS
15006 else if (DEFAULT_ABI == ABI_DARWIN)
15007 {
d5fa86ba 15008 const char *mcount_name = RS6000_MCOUNT;
ee890fe2
SS
15009 int caller_addr_regno = LINK_REGISTER_REGNUM;
15010
15011 /* Be conservative and always set this, at least for now. */
15012 current_function_uses_pic_offset_table = 1;
15013
15014#if TARGET_MACHO
15015 /* For PIC code, set up a stub and collect the caller's address
15016 from r0, which is where the prologue puts it. */
11abc112
MM
15017 if (MACHOPIC_INDIRECT
15018 && current_function_uses_pic_offset_table)
15019 caller_addr_regno = 0;
ee890fe2
SS
15020#endif
15021 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
15022 0, VOIDmode, 1,
15023 gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
15024 }
411707f4
CC
15025}
15026
a4f6c312 15027/* Write function profiler code. */
e165f3f0
RK
15028
15029void
a2369ed3 15030output_function_profiler (FILE *file, int labelno)
e165f3f0 15031{
3daf36a4 15032 char buf[100];
09eeeacb 15033 int save_lr = 8;
e165f3f0 15034
38c1f2d7 15035 switch (DEFAULT_ABI)
3daf36a4 15036 {
38c1f2d7
MM
15037 default:
15038 abort ();
15039
15040 case ABI_V4:
09eeeacb 15041 save_lr = 4;
09eeeacb
AM
15042 if (!TARGET_32BIT)
15043 {
15044 warning ("no profiling of 64-bit code for this ABI");
15045 return;
15046 }
ffcfcb5f 15047 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
38c1f2d7
MM
15048 fprintf (file, "\tmflr %s\n", reg_names[0]);
15049 if (flag_pic == 1)
15050 {
dfdfa60f 15051 fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
09eeeacb
AM
15052 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
15053 reg_names[0], save_lr, reg_names[1]);
17167fd8 15054 asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
dfdfa60f 15055 asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
38c1f2d7 15056 assemble_name (file, buf);
17167fd8 15057 asm_fprintf (file, "@got(%s)\n", reg_names[12]);
38c1f2d7 15058 }
9ebbca7d 15059 else if (flag_pic > 1)
38c1f2d7 15060 {
09eeeacb
AM
15061 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
15062 reg_names[0], save_lr, reg_names[1]);
9ebbca7d
GK
15063 /* Now, we need to get the address of the label. */
15064 fputs ("\tbl 1f\n\t.long ", file);
034e84c4 15065 assemble_name (file, buf);
9ebbca7d
GK
15066 fputs ("-.\n1:", file);
15067 asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
15068 asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
15069 reg_names[0], reg_names[11]);
15070 asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
15071 reg_names[0], reg_names[0], reg_names[11]);
38c1f2d7 15072 }
38c1f2d7
MM
15073 else
15074 {
17167fd8 15075 asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
38c1f2d7 15076 assemble_name (file, buf);
dfdfa60f 15077 fputs ("@ha\n", file);
09eeeacb
AM
15078 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
15079 reg_names[0], save_lr, reg_names[1]);
a260abc9 15080 asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
38c1f2d7 15081 assemble_name (file, buf);
17167fd8 15082 asm_fprintf (file, "@l(%s)\n", reg_names[12]);
38c1f2d7
MM
15083 }
15084
50d440bc 15085 /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH. */
3b6ce0af
DE
15086 fprintf (file, "\tbl %s%s\n",
15087 RS6000_MCOUNT, flag_pic ? "@plt" : "");
38c1f2d7
MM
15088 break;
15089
15090 case ABI_AIX:
ee890fe2 15091 case ABI_DARWIN:
ffcfcb5f
AM
15092 if (!TARGET_PROFILE_KERNEL)
15093 {
a3c9585f 15094 /* Don't do anything, done in output_profile_hook (). */
ffcfcb5f
AM
15095 }
15096 else
15097 {
15098 if (TARGET_32BIT)
15099 abort ();
15100
15101 asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
15102 asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
15103
6de9cd9a 15104 if (cfun->static_chain_decl != NULL)
ffcfcb5f
AM
15105 {
15106 asm_fprintf (file, "\tstd %s,24(%s)\n",
15107 reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
15108 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
15109 asm_fprintf (file, "\tld %s,24(%s)\n",
15110 reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
15111 }
15112 else
15113 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
15114 }
38c1f2d7
MM
15115 break;
15116 }
e165f3f0 15117}
a251ffd0 15118
b54cf83a 15119\f
b54cf83a
DE
15120/* Power4 load update and store update instructions are cracked into a
15121 load or store and an integer insn which are executed in the same cycle.
15122 Branches have their own dispatch slot which does not count against the
15123 GCC issue rate, but it changes the program flow so there are no other
15124 instructions to issue in this cycle. */
15125
15126static int
a2369ed3
DJ
15127rs6000_variable_issue (FILE *stream ATTRIBUTE_UNUSED,
15128 int verbose ATTRIBUTE_UNUSED,
15129 rtx insn, int more)
b54cf83a
DE
15130{
15131 if (GET_CODE (PATTERN (insn)) == USE
15132 || GET_CODE (PATTERN (insn)) == CLOBBER)
15133 return more;
15134
ec507f2d 15135 if (rs6000_sched_groups)
b54cf83a 15136 {
cbe26ab8
DN
15137 if (is_microcoded_insn (insn))
15138 return 0;
15139 else if (is_cracked_insn (insn))
15140 return more > 2 ? more - 2 : 0;
b54cf83a 15141 }
165b263e
DE
15142
15143 return more - 1;
b54cf83a
DE
15144}
15145
a251ffd0
TG
15146/* Adjust the cost of a scheduling dependency. Return the new cost of
15147 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
15148
c237e94a 15149static int
a2369ed3
DJ
15150rs6000_adjust_cost (rtx insn, rtx link, rtx dep_insn ATTRIBUTE_UNUSED,
15151 int cost)
a251ffd0
TG
15152{
15153 if (! recog_memoized (insn))
15154 return 0;
15155
15156 if (REG_NOTE_KIND (link) != 0)
15157 return 0;
15158
15159 if (REG_NOTE_KIND (link) == 0)
15160 {
ed947a96
DJ
15161 /* Data dependency; DEP_INSN writes a register that INSN reads
15162 some cycles later. */
15163 switch (get_attr_type (insn))
15164 {
15165 case TYPE_JMPREG:
309323c2 15166 /* Tell the first scheduling pass about the latency between
ed947a96
DJ
15167 a mtctr and bctr (and mtlr and br/blr). The first
15168 scheduling pass will not know about this latency since
15169 the mtctr instruction, which has the latency associated
15170 to it, will be generated by reload. */
309323c2 15171 return TARGET_POWER ? 5 : 4;
ed947a96
DJ
15172 case TYPE_BRANCH:
15173 /* Leave some extra cycles between a compare and its
15174 dependent branch, to inhibit expensive mispredicts. */
309323c2
DE
15175 if ((rs6000_cpu_attr == CPU_PPC603
15176 || rs6000_cpu_attr == CPU_PPC604
15177 || rs6000_cpu_attr == CPU_PPC604E
15178 || rs6000_cpu_attr == CPU_PPC620
15179 || rs6000_cpu_attr == CPU_PPC630
15180 || rs6000_cpu_attr == CPU_PPC750
15181 || rs6000_cpu_attr == CPU_PPC7400
15182 || rs6000_cpu_attr == CPU_PPC7450
ec507f2d
DE
15183 || rs6000_cpu_attr == CPU_POWER4
15184 || rs6000_cpu_attr == CPU_POWER5)
ed947a96
DJ
15185 && recog_memoized (dep_insn)
15186 && (INSN_CODE (dep_insn) >= 0)
b54cf83a
DE
15187 && (get_attr_type (dep_insn) == TYPE_CMP
15188 || get_attr_type (dep_insn) == TYPE_COMPARE
ed947a96 15189 || get_attr_type (dep_insn) == TYPE_DELAYED_COMPARE
9259f3b0
DE
15190 || get_attr_type (dep_insn) == TYPE_IMUL_COMPARE
15191 || get_attr_type (dep_insn) == TYPE_LMUL_COMPARE
ed947a96 15192 || get_attr_type (dep_insn) == TYPE_FPCOMPARE
b54cf83a
DE
15193 || get_attr_type (dep_insn) == TYPE_CR_LOGICAL
15194 || get_attr_type (dep_insn) == TYPE_DELAYED_CR))
ed947a96
DJ
15195 return cost + 2;
15196 default:
15197 break;
15198 }
a251ffd0
TG
15199 /* Fall out to return default cost. */
15200 }
15201
15202 return cost;
15203}
b6c9286a 15204
cbe26ab8 15205/* The function returns a true if INSN is microcoded.
839a4992 15206 Return false otherwise. */
cbe26ab8
DN
15207
15208static bool
15209is_microcoded_insn (rtx insn)
15210{
15211 if (!insn || !INSN_P (insn)
15212 || GET_CODE (PATTERN (insn)) == USE
15213 || GET_CODE (PATTERN (insn)) == CLOBBER)
15214 return false;
15215
ec507f2d 15216 if (rs6000_sched_groups)
cbe26ab8
DN
15217 {
15218 enum attr_type type = get_attr_type (insn);
15219 if (type == TYPE_LOAD_EXT_U
15220 || type == TYPE_LOAD_EXT_UX
15221 || type == TYPE_LOAD_UX
15222 || type == TYPE_STORE_UX
15223 || type == TYPE_MFCR)
15224 return true;
15225 }
15226
15227 return false;
15228}
15229
5c425df5 15230/* The function returns a nonzero value if INSN can be scheduled only
cbe26ab8
DN
15231 as the first insn in a dispatch group ("dispatch-slot restricted").
15232 In this case, the returned value indicates how many dispatch slots
15233 the insn occupies (at the beginning of the group).
79ae11c4
DN
15234 Return 0 otherwise. */
15235
cbe26ab8 15236static int
79ae11c4
DN
15237is_dispatch_slot_restricted (rtx insn)
15238{
15239 enum attr_type type;
15240
ec507f2d 15241 if (!rs6000_sched_groups)
79ae11c4
DN
15242 return 0;
15243
15244 if (!insn
15245 || insn == NULL_RTX
15246 || GET_CODE (insn) == NOTE
15247 || GET_CODE (PATTERN (insn)) == USE
15248 || GET_CODE (PATTERN (insn)) == CLOBBER)
15249 return 0;
15250
15251 type = get_attr_type (insn);
15252
ec507f2d
DE
15253 switch (type)
15254 {
15255 case TYPE_MFCR:
15256 case TYPE_MFCRF:
15257 case TYPE_MTCR:
15258 case TYPE_DELAYED_CR:
15259 case TYPE_CR_LOGICAL:
15260 case TYPE_MTJMPR:
15261 case TYPE_MFJMPR:
15262 return 1;
15263 case TYPE_IDIV:
15264 case TYPE_LDIV:
15265 return 2;
15266 default:
15267 if (rs6000_cpu == PROCESSOR_POWER5
15268 && is_cracked_insn (insn))
15269 return 2;
15270 return 0;
15271 }
79ae11c4
DN
15272}
15273
cbe26ab8
DN
15274/* The function returns true if INSN is cracked into 2 instructions
15275 by the processor (and therefore occupies 2 issue slots). */
15276
15277static bool
15278is_cracked_insn (rtx insn)
15279{
15280 if (!insn || !INSN_P (insn)
15281 || GET_CODE (PATTERN (insn)) == USE
15282 || GET_CODE (PATTERN (insn)) == CLOBBER)
15283 return false;
15284
ec507f2d 15285 if (rs6000_sched_groups)
cbe26ab8
DN
15286 {
15287 enum attr_type type = get_attr_type (insn);
15288 if (type == TYPE_LOAD_U || type == TYPE_STORE_U
15289 || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
15290 || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
15291 || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
15292 || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
15293 || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
15294 || type == TYPE_IDIV || type == TYPE_LDIV
15295 || type == TYPE_INSERT_WORD)
15296 return true;
15297 }
15298
15299 return false;
15300}
15301
15302/* The function returns true if INSN can be issued only from
a3c9585f 15303 the branch slot. */
cbe26ab8
DN
15304
15305static bool
15306is_branch_slot_insn (rtx insn)
15307{
15308 if (!insn || !INSN_P (insn)
15309 || GET_CODE (PATTERN (insn)) == USE
15310 || GET_CODE (PATTERN (insn)) == CLOBBER)
15311 return false;
15312
ec507f2d 15313 if (rs6000_sched_groups)
cbe26ab8
DN
15314 {
15315 enum attr_type type = get_attr_type (insn);
15316 if (type == TYPE_BRANCH || type == TYPE_JMPREG)
15317 return true;
15318 return false;
15319 }
15320
15321 return false;
15322}
79ae11c4 15323
a4f6c312 15324/* A C statement (sans semicolon) to update the integer scheduling
79ae11c4
DN
15325 priority INSN_PRIORITY (INSN). Increase the priority to execute the
15326 INSN earlier, reduce the priority to execute INSN later. Do not
a4f6c312
SS
15327 define this macro if you do not need to adjust the scheduling
15328 priorities of insns. */
bef84347 15329
c237e94a 15330static int
a2369ed3 15331rs6000_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
bef84347 15332{
a4f6c312
SS
15333 /* On machines (like the 750) which have asymmetric integer units,
15334 where one integer unit can do multiply and divides and the other
15335 can't, reduce the priority of multiply/divide so it is scheduled
15336 before other integer operations. */
bef84347
VM
15337
15338#if 0
2c3c49de 15339 if (! INSN_P (insn))
bef84347
VM
15340 return priority;
15341
15342 if (GET_CODE (PATTERN (insn)) == USE)
15343 return priority;
15344
15345 switch (rs6000_cpu_attr) {
15346 case CPU_PPC750:
15347 switch (get_attr_type (insn))
15348 {
15349 default:
15350 break;
15351
15352 case TYPE_IMUL:
15353 case TYPE_IDIV:
3cb999d8
DE
15354 fprintf (stderr, "priority was %#x (%d) before adjustment\n",
15355 priority, priority);
bef84347
VM
15356 if (priority >= 0 && priority < 0x01000000)
15357 priority >>= 3;
15358 break;
15359 }
15360 }
15361#endif
15362
79ae11c4
DN
15363 if (is_dispatch_slot_restricted (insn)
15364 && reload_completed
15365 && current_sched_info->sched_max_insns_priority
15366 && rs6000_sched_restricted_insns_priority)
15367 {
15368
15369 /* Prioritize insns that can be dispatched only in the first dispatch slot. */
15370 if (rs6000_sched_restricted_insns_priority == 1)
15371 /* Attach highest priority to insn. This means that in
15372 haifa-sched.c:ready_sort(), dispatch-slot restriction considerations
15373 precede 'priority' (critical path) considerations. */
15374 return current_sched_info->sched_max_insns_priority;
15375 else if (rs6000_sched_restricted_insns_priority == 2)
15376 /* Increase priority of insn by a minimal amount. This means that in
15377 haifa-sched.c:ready_sort(), only 'priority' (critical path) considerations
15378 precede dispatch-slot restriction considerations. */
15379 return (priority + 1);
15380 }
15381
bef84347
VM
15382 return priority;
15383}
15384
a4f6c312
SS
15385/* Return how many instructions the machine can issue per cycle. */
15386
c237e94a 15387static int
863d938c 15388rs6000_issue_rate (void)
b6c9286a 15389{
3317bab1
DE
15390 /* Use issue rate of 1 for first scheduling pass to decrease degradation. */
15391 if (!reload_completed)
15392 return 1;
15393
b6c9286a 15394 switch (rs6000_cpu_attr) {
3cb999d8
DE
15395 case CPU_RIOS1: /* ? */
15396 case CPU_RS64A:
15397 case CPU_PPC601: /* ? */
ed947a96 15398 case CPU_PPC7450:
3cb999d8 15399 return 3;
b54cf83a 15400 case CPU_PPC440:
b6c9286a 15401 case CPU_PPC603:
bef84347 15402 case CPU_PPC750:
ed947a96 15403 case CPU_PPC7400:
be12c2b0 15404 case CPU_PPC8540:
bef84347 15405 return 2;
3cb999d8 15406 case CPU_RIOS2:
b6c9286a 15407 case CPU_PPC604:
19684119 15408 case CPU_PPC604E:
b6c9286a 15409 case CPU_PPC620:
3cb999d8 15410 case CPU_PPC630:
b6c9286a 15411 return 4;
cbe26ab8 15412 case CPU_POWER4:
ec507f2d 15413 case CPU_POWER5:
cbe26ab8 15414 return 5;
b6c9286a
MM
15415 default:
15416 return 1;
15417 }
15418}
15419
be12c2b0
VM
15420/* Return how many instructions to look ahead for better insn
15421 scheduling. */
15422
15423static int
863d938c 15424rs6000_use_sched_lookahead (void)
be12c2b0
VM
15425{
15426 if (rs6000_cpu_attr == CPU_PPC8540)
15427 return 4;
15428 return 0;
15429}
15430
569fa502
DN
15431/* Determine is PAT refers to memory. */
15432
15433static bool
15434is_mem_ref (rtx pat)
15435{
15436 const char * fmt;
15437 int i, j;
15438 bool ret = false;
15439
15440 if (GET_CODE (pat) == MEM)
15441 return true;
15442
15443 /* Recursively process the pattern. */
15444 fmt = GET_RTX_FORMAT (GET_CODE (pat));
15445
15446 for (i = GET_RTX_LENGTH (GET_CODE (pat)) - 1; i >= 0 && !ret; i--)
15447 {
15448 if (fmt[i] == 'e')
15449 ret |= is_mem_ref (XEXP (pat, i));
15450 else if (fmt[i] == 'E')
15451 for (j = XVECLEN (pat, i) - 1; j >= 0; j--)
15452 ret |= is_mem_ref (XVECEXP (pat, i, j));
15453 }
15454
15455 return ret;
15456}
15457
15458/* Determine if PAT is a PATTERN of a load insn. */
15459
15460static bool
15461is_load_insn1 (rtx pat)
15462{
15463 if (!pat || pat == NULL_RTX)
15464 return false;
15465
15466 if (GET_CODE (pat) == SET)
15467 return is_mem_ref (SET_SRC (pat));
15468
15469 if (GET_CODE (pat) == PARALLEL)
15470 {
15471 int i;
15472
15473 for (i = 0; i < XVECLEN (pat, 0); i++)
15474 if (is_load_insn1 (XVECEXP (pat, 0, i)))
15475 return true;
15476 }
15477
15478 return false;
15479}
15480
15481/* Determine if INSN loads from memory. */
15482
15483static bool
15484is_load_insn (rtx insn)
15485{
15486 if (!insn || !INSN_P (insn))
15487 return false;
15488
15489 if (GET_CODE (insn) == CALL_INSN)
15490 return false;
15491
15492 return is_load_insn1 (PATTERN (insn));
15493}
15494
15495/* Determine if PAT is a PATTERN of a store insn. */
15496
15497static bool
15498is_store_insn1 (rtx pat)
15499{
15500 if (!pat || pat == NULL_RTX)
15501 return false;
15502
15503 if (GET_CODE (pat) == SET)
15504 return is_mem_ref (SET_DEST (pat));
15505
15506 if (GET_CODE (pat) == PARALLEL)
15507 {
15508 int i;
15509
15510 for (i = 0; i < XVECLEN (pat, 0); i++)
15511 if (is_store_insn1 (XVECEXP (pat, 0, i)))
15512 return true;
15513 }
15514
15515 return false;
15516}
15517
15518/* Determine if INSN stores to memory. */
15519
15520static bool
15521is_store_insn (rtx insn)
15522{
15523 if (!insn || !INSN_P (insn))
15524 return false;
15525
15526 return is_store_insn1 (PATTERN (insn));
15527}
15528
15529/* Returns whether the dependence between INSN and NEXT is considered
15530 costly by the given target. */
15531
15532static bool
15533rs6000_is_costly_dependence (rtx insn, rtx next, rtx link, int cost, int distance)
15534{
15535 /* If the flag is not enbled - no dependence is considered costly;
15536 allow all dependent insns in the same group.
15537 This is the most aggressive option. */
15538 if (rs6000_sched_costly_dep == no_dep_costly)
15539 return false;
15540
15541 /* If the flag is set to 1 - a dependence is always considered costly;
15542 do not allow dependent instructions in the same group.
15543 This is the most conservative option. */
15544 if (rs6000_sched_costly_dep == all_deps_costly)
15545 return true;
15546
15547 if (rs6000_sched_costly_dep == store_to_load_dep_costly
15548 && is_load_insn (next)
15549 && is_store_insn (insn))
15550 /* Prevent load after store in the same group. */
15551 return true;
15552
15553 if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
15554 && is_load_insn (next)
15555 && is_store_insn (insn)
15556 && (!link || (int) REG_NOTE_KIND (link) == 0))
15557 /* Prevent load after store in the same group if it is a true dependence. */
15558 return true;
15559
15560 /* The flag is set to X; dependences with latency >= X are considered costly,
15561 and will not be scheduled in the same group. */
15562 if (rs6000_sched_costly_dep <= max_dep_latency
15563 && ((cost - distance) >= (int)rs6000_sched_costly_dep))
15564 return true;
15565
15566 return false;
15567}
15568
cbe26ab8
DN
15569/* Return the next insn after INSN that is found before TAIL is reached,
15570 skipping any "non-active" insns - insns that will not actually occupy
15571 an issue slot. Return NULL_RTX if such an insn is not found. */
15572
15573static rtx
15574get_next_active_insn (rtx insn, rtx tail)
15575{
15576 rtx next_insn;
15577
15578 if (!insn || insn == tail)
15579 return NULL_RTX;
15580
15581 next_insn = NEXT_INSN (insn);
15582
15583 while (next_insn
15584 && next_insn != tail
15585 && (GET_CODE(next_insn) == NOTE
15586 || GET_CODE (PATTERN (next_insn)) == USE
15587 || GET_CODE (PATTERN (next_insn)) == CLOBBER))
15588 {
15589 next_insn = NEXT_INSN (next_insn);
15590 }
15591
15592 if (!next_insn || next_insn == tail)
15593 return NULL_RTX;
15594
15595 return next_insn;
15596}
15597
839a4992 15598/* Return whether the presence of INSN causes a dispatch group termination
cbe26ab8
DN
15599 of group WHICH_GROUP.
15600
15601 If WHICH_GROUP == current_group, this function will return true if INSN
15602 causes the termination of the current group (i.e, the dispatch group to
15603 which INSN belongs). This means that INSN will be the last insn in the
15604 group it belongs to.
15605
15606 If WHICH_GROUP == previous_group, this function will return true if INSN
15607 causes the termination of the previous group (i.e, the dispatch group that
15608 precedes the group to which INSN belongs). This means that INSN will be
15609 the first insn in the group it belongs to). */
15610
15611static bool
15612insn_terminates_group_p (rtx insn, enum group_termination which_group)
15613{
15614 enum attr_type type;
15615
15616 if (! insn)
15617 return false;
569fa502 15618
cbe26ab8
DN
15619 type = get_attr_type (insn);
15620
15621 if (is_microcoded_insn (insn))
15622 return true;
15623
15624 if (which_group == current_group)
15625 {
15626 if (is_branch_slot_insn (insn))
15627 return true;
15628 return false;
15629 }
15630 else if (which_group == previous_group)
15631 {
15632 if (is_dispatch_slot_restricted (insn))
15633 return true;
15634 return false;
15635 }
15636
15637 return false;
15638}
15639
839a4992 15640/* Return true if it is recommended to keep NEXT_INSN "far" (in a separate
cbe26ab8
DN
15641 dispatch group) from the insns in GROUP_INSNS. Return false otherwise. */
15642
15643static bool
15644is_costly_group (rtx *group_insns, rtx next_insn)
15645{
15646 int i;
15647 rtx link;
15648 int cost;
15649 int issue_rate = rs6000_issue_rate ();
15650
15651 for (i = 0; i < issue_rate; i++)
15652 {
15653 rtx insn = group_insns[i];
15654 if (!insn)
15655 continue;
15656 for (link = INSN_DEPEND (insn); link != 0; link = XEXP (link, 1))
15657 {
15658 rtx next = XEXP (link, 0);
15659 if (next == next_insn)
15660 {
15661 cost = insn_cost (insn, link, next_insn);
15662 if (rs6000_is_costly_dependence (insn, next_insn, link, cost, 0))
15663 return true;
15664 }
15665 }
15666 }
15667
15668 return false;
15669}
15670
15671/* Utility of the function redefine_groups.
15672 Check if it is too costly to schedule NEXT_INSN together with GROUP_INSNS
15673 in the same dispatch group. If so, insert nops before NEXT_INSN, in order
15674 to keep it "far" (in a separate group) from GROUP_INSNS, following
15675 one of the following schemes, depending on the value of the flag
15676 -minsert_sched_nops = X:
15677 (1) X == sched_finish_regroup_exact: insert exactly as many nops as needed
839a4992 15678 in order to force NEXT_INSN into a separate group.
cbe26ab8
DN
15679 (2) X < sched_finish_regroup_exact: insert exactly X nops.
15680 GROUP_END, CAN_ISSUE_MORE and GROUP_COUNT record the state after nop
15681 insertion (has a group just ended, how many vacant issue slots remain in the
15682 last group, and how many dispatch groups were encountered so far). */
15683
15684static int
15685force_new_group (int sched_verbose, FILE *dump, rtx *group_insns, rtx next_insn,
15686 bool *group_end, int can_issue_more, int *group_count)
15687{
15688 rtx nop;
15689 bool force;
15690 int issue_rate = rs6000_issue_rate ();
15691 bool end = *group_end;
15692 int i;
15693
15694 if (next_insn == NULL_RTX)
15695 return can_issue_more;
15696
15697 if (rs6000_sched_insert_nops > sched_finish_regroup_exact)
15698 return can_issue_more;
15699
15700 force = is_costly_group (group_insns, next_insn);
15701 if (!force)
15702 return can_issue_more;
15703
15704 if (sched_verbose > 6)
15705 fprintf (dump,"force: group count = %d, can_issue_more = %d\n",
15706 *group_count ,can_issue_more);
15707
15708 if (rs6000_sched_insert_nops == sched_finish_regroup_exact)
15709 {
15710 if (*group_end)
15711 can_issue_more = 0;
15712
15713 /* Since only a branch can be issued in the last issue_slot, it is
15714 sufficient to insert 'can_issue_more - 1' nops if next_insn is not
15715 a branch. If next_insn is a branch, we insert 'can_issue_more' nops;
15716 in this case the last nop will start a new group and the branch will be
15717 forced to the new group. */
15718 if (can_issue_more && !is_branch_slot_insn (next_insn))
15719 can_issue_more--;
15720
15721 while (can_issue_more > 0)
15722 {
15723 nop = gen_nop();
15724 emit_insn_before (nop, next_insn);
15725 can_issue_more--;
15726 }
15727
15728 *group_end = true;
15729 return 0;
15730 }
15731
15732 if (rs6000_sched_insert_nops < sched_finish_regroup_exact)
15733 {
15734 int n_nops = rs6000_sched_insert_nops;
15735
15736 /* Nops can't be issued from the branch slot, so the effective
15737 issue_rate for nops is 'issue_rate - 1'. */
15738 if (can_issue_more == 0)
15739 can_issue_more = issue_rate;
15740 can_issue_more--;
15741 if (can_issue_more == 0)
15742 {
15743 can_issue_more = issue_rate - 1;
15744 (*group_count)++;
15745 end = true;
15746 for (i = 0; i < issue_rate; i++)
15747 {
15748 group_insns[i] = 0;
15749 }
15750 }
15751
15752 while (n_nops > 0)
15753 {
15754 nop = gen_nop ();
15755 emit_insn_before (nop, next_insn);
15756 if (can_issue_more == issue_rate - 1) /* new group begins */
15757 end = false;
15758 can_issue_more--;
15759 if (can_issue_more == 0)
15760 {
15761 can_issue_more = issue_rate - 1;
15762 (*group_count)++;
15763 end = true;
15764 for (i = 0; i < issue_rate; i++)
15765 {
15766 group_insns[i] = 0;
15767 }
15768 }
15769 n_nops--;
15770 }
15771
15772 /* Scale back relative to 'issue_rate' (instead of 'issue_rate - 1'). */
15773 can_issue_more++;
15774
15775 *group_end = /* Is next_insn going to start a new group? */
15776 (end
15777 || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
15778 || (can_issue_more <= 2 && is_cracked_insn (next_insn))
15779 || (can_issue_more < issue_rate &&
15780 insn_terminates_group_p (next_insn, previous_group)));
15781 if (*group_end && end)
15782 (*group_count)--;
15783
15784 if (sched_verbose > 6)
15785 fprintf (dump, "done force: group count = %d, can_issue_more = %d\n",
15786 *group_count, can_issue_more);
15787 return can_issue_more;
15788 }
15789
15790 return can_issue_more;
15791}
15792
15793/* This function tries to synch the dispatch groups that the compiler "sees"
15794 with the dispatch groups that the processor dispatcher is expected to
15795 form in practice. It tries to achieve this synchronization by forcing the
15796 estimated processor grouping on the compiler (as opposed to the function
15797 'pad_goups' which tries to force the scheduler's grouping on the processor).
15798
15799 The function scans the insn sequence between PREV_HEAD_INSN and TAIL and
15800 examines the (estimated) dispatch groups that will be formed by the processor
15801 dispatcher. It marks these group boundaries to reflect the estimated
15802 processor grouping, overriding the grouping that the scheduler had marked.
15803 Depending on the value of the flag '-minsert-sched-nops' this function can
15804 force certain insns into separate groups or force a certain distance between
15805 them by inserting nops, for example, if there exists a "costly dependence"
15806 between the insns.
15807
15808 The function estimates the group boundaries that the processor will form as
15809 folllows: It keeps track of how many vacant issue slots are available after
15810 each insn. A subsequent insn will start a new group if one of the following
15811 4 cases applies:
15812 - no more vacant issue slots remain in the current dispatch group.
15813 - only the last issue slot, which is the branch slot, is vacant, but the next
15814 insn is not a branch.
15815 - only the last 2 or less issue slots, including the branch slot, are vacant,
15816 which means that a cracked insn (which occupies two issue slots) can't be
15817 issued in this group.
15818 - less than 'issue_rate' slots are vacant, and the next insn always needs to
15819 start a new group. */
15820
15821static int
15822redefine_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
15823{
15824 rtx insn, next_insn;
15825 int issue_rate;
15826 int can_issue_more;
15827 int slot, i;
15828 bool group_end;
15829 int group_count = 0;
15830 rtx *group_insns;
15831
15832 /* Initialize. */
15833 issue_rate = rs6000_issue_rate ();
15834 group_insns = alloca (issue_rate * sizeof (rtx));
15835 for (i = 0; i < issue_rate; i++)
15836 {
15837 group_insns[i] = 0;
15838 }
15839 can_issue_more = issue_rate;
15840 slot = 0;
15841 insn = get_next_active_insn (prev_head_insn, tail);
15842 group_end = false;
15843
15844 while (insn != NULL_RTX)
15845 {
15846 slot = (issue_rate - can_issue_more);
15847 group_insns[slot] = insn;
15848 can_issue_more =
15849 rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
15850 if (insn_terminates_group_p (insn, current_group))
15851 can_issue_more = 0;
15852
15853 next_insn = get_next_active_insn (insn, tail);
15854 if (next_insn == NULL_RTX)
15855 return group_count + 1;
15856
15857 group_end = /* Is next_insn going to start a new group? */
15858 (can_issue_more == 0
15859 || (can_issue_more == 1 && !is_branch_slot_insn (next_insn))
15860 || (can_issue_more <= 2 && is_cracked_insn (next_insn))
15861 || (can_issue_more < issue_rate &&
15862 insn_terminates_group_p (next_insn, previous_group)));
15863
15864 can_issue_more = force_new_group (sched_verbose, dump, group_insns,
15865 next_insn, &group_end, can_issue_more, &group_count);
15866
15867 if (group_end)
15868 {
15869 group_count++;
15870 can_issue_more = 0;
15871 for (i = 0; i < issue_rate; i++)
15872 {
15873 group_insns[i] = 0;
15874 }
15875 }
15876
15877 if (GET_MODE (next_insn) == TImode && can_issue_more)
15878 PUT_MODE(next_insn, VOIDmode);
15879 else if (!can_issue_more && GET_MODE (next_insn) != TImode)
15880 PUT_MODE (next_insn, TImode);
15881
15882 insn = next_insn;
15883 if (can_issue_more == 0)
15884 can_issue_more = issue_rate;
15885 } /* while */
15886
15887 return group_count;
15888}
15889
15890/* Scan the insn sequence between PREV_HEAD_INSN and TAIL and examine the
15891 dispatch group boundaries that the scheduler had marked. Pad with nops
15892 any dispatch groups which have vacant issue slots, in order to force the
15893 scheduler's grouping on the processor dispatcher. The function
15894 returns the number of dispatch groups found. */
15895
15896static int
15897pad_groups (FILE *dump, int sched_verbose, rtx prev_head_insn, rtx tail)
15898{
15899 rtx insn, next_insn;
15900 rtx nop;
15901 int issue_rate;
15902 int can_issue_more;
15903 int group_end;
15904 int group_count = 0;
15905
15906 /* Initialize issue_rate. */
15907 issue_rate = rs6000_issue_rate ();
15908 can_issue_more = issue_rate;
15909
15910 insn = get_next_active_insn (prev_head_insn, tail);
15911 next_insn = get_next_active_insn (insn, tail);
15912
15913 while (insn != NULL_RTX)
15914 {
15915 can_issue_more =
15916 rs6000_variable_issue (dump, sched_verbose, insn, can_issue_more);
15917
15918 group_end = (next_insn == NULL_RTX || GET_MODE (next_insn) == TImode);
15919
15920 if (next_insn == NULL_RTX)
15921 break;
15922
15923 if (group_end)
15924 {
15925 /* If the scheduler had marked group termination at this location
15926 (between insn and next_indn), and neither insn nor next_insn will
15927 force group termination, pad the group with nops to force group
15928 termination. */
15929 if (can_issue_more
15930 && (rs6000_sched_insert_nops == sched_finish_pad_groups)
15931 && !insn_terminates_group_p (insn, current_group)
15932 && !insn_terminates_group_p (next_insn, previous_group))
15933 {
15934 if (!is_branch_slot_insn(next_insn))
15935 can_issue_more--;
15936
15937 while (can_issue_more)
15938 {
15939 nop = gen_nop ();
15940 emit_insn_before (nop, next_insn);
15941 can_issue_more--;
15942 }
15943 }
15944
15945 can_issue_more = issue_rate;
15946 group_count++;
15947 }
15948
15949 insn = next_insn;
15950 next_insn = get_next_active_insn (insn, tail);
15951 }
15952
15953 return group_count;
15954}
15955
15956/* The following function is called at the end of scheduling BB.
15957 After reload, it inserts nops at insn group bundling. */
15958
15959static void
38f391a5 15960rs6000_sched_finish (FILE *dump, int sched_verbose)
cbe26ab8
DN
15961{
15962 int n_groups;
15963
15964 if (sched_verbose)
15965 fprintf (dump, "=== Finishing schedule.\n");
15966
ec507f2d 15967 if (reload_completed && rs6000_sched_groups)
cbe26ab8
DN
15968 {
15969 if (rs6000_sched_insert_nops == sched_finish_none)
15970 return;
15971
15972 if (rs6000_sched_insert_nops == sched_finish_pad_groups)
15973 n_groups = pad_groups (dump, sched_verbose,
15974 current_sched_info->prev_head,
15975 current_sched_info->next_tail);
15976 else
15977 n_groups = redefine_groups (dump, sched_verbose,
15978 current_sched_info->prev_head,
15979 current_sched_info->next_tail);
15980
15981 if (sched_verbose >= 6)
15982 {
15983 fprintf (dump, "ngroups = %d\n", n_groups);
15984 print_rtl (dump, current_sched_info->prev_head);
15985 fprintf (dump, "Done finish_sched\n");
15986 }
15987 }
15988}
b6c9286a 15989\f
b6c9286a
MM
15990/* Length in units of the trampoline for entering a nested function. */
15991
15992int
863d938c 15993rs6000_trampoline_size (void)
b6c9286a
MM
15994{
15995 int ret = 0;
15996
15997 switch (DEFAULT_ABI)
15998 {
15999 default:
16000 abort ();
16001
16002 case ABI_AIX:
8f802bfb 16003 ret = (TARGET_32BIT) ? 12 : 24;
b6c9286a
MM
16004 break;
16005
4dabc42d 16006 case ABI_DARWIN:
b6c9286a 16007 case ABI_V4:
03a7e1a5 16008 ret = (TARGET_32BIT) ? 40 : 48;
b6c9286a 16009 break;
b6c9286a
MM
16010 }
16011
16012 return ret;
16013}
16014
16015/* Emit RTL insns to initialize the variable parts of a trampoline.
16016 FNADDR is an RTX for the address of the function's pure code.
16017 CXT is an RTX for the static chain value for the function. */
16018
16019void
a2369ed3 16020rs6000_initialize_trampoline (rtx addr, rtx fnaddr, rtx cxt)
b6c9286a 16021{
ac2a93a1 16022 enum machine_mode pmode = Pmode;
8bd04c56
MM
16023 int regsize = (TARGET_32BIT) ? 4 : 8;
16024 rtx ctx_reg = force_reg (pmode, cxt);
b6c9286a
MM
16025
16026 switch (DEFAULT_ABI)
16027 {
16028 default:
16029 abort ();
16030
8bd04c56 16031/* Macros to shorten the code expansions below. */
39403d82 16032#define MEM_DEREF(addr) gen_rtx_MEM (pmode, memory_address (pmode, addr))
c5c76735
JL
16033#define MEM_PLUS(addr,offset) \
16034 gen_rtx_MEM (pmode, memory_address (pmode, plus_constant (addr, offset)))
7c59dc5d 16035
b6c9286a
MM
16036 /* Under AIX, just build the 3 word function descriptor */
16037 case ABI_AIX:
8bd04c56
MM
16038 {
16039 rtx fn_reg = gen_reg_rtx (pmode);
16040 rtx toc_reg = gen_reg_rtx (pmode);
16041 emit_move_insn (fn_reg, MEM_DEREF (fnaddr));
1cb18e3c 16042 emit_move_insn (toc_reg, MEM_PLUS (fnaddr, regsize));
8bd04c56
MM
16043 emit_move_insn (MEM_DEREF (addr), fn_reg);
16044 emit_move_insn (MEM_PLUS (addr, regsize), toc_reg);
16045 emit_move_insn (MEM_PLUS (addr, 2*regsize), ctx_reg);
16046 }
b6c9286a
MM
16047 break;
16048
4dabc42d
TC
16049 /* Under V.4/eabi/darwin, __trampoline_setup does the real work. */
16050 case ABI_DARWIN:
b6c9286a 16051 case ABI_V4:
39403d82 16052 emit_library_call (gen_rtx_SYMBOL_REF (SImode, "__trampoline_setup"),
eaf1bcf1
MM
16053 FALSE, VOIDmode, 4,
16054 addr, pmode,
16055 GEN_INT (rs6000_trampoline_size ()), SImode,
16056 fnaddr, pmode,
16057 ctx_reg, pmode);
b6c9286a 16058 break;
b6c9286a
MM
16059 }
16060
16061 return;
16062}
7509c759
MM
16063
16064\f
91d231cb 16065/* Table of valid machine attributes. */
a4f6c312 16066
91d231cb 16067const struct attribute_spec rs6000_attribute_table[] =
7509c759 16068{
91d231cb 16069 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
8bb418a3 16070 { "altivec", 1, 1, false, true, false, rs6000_handle_altivec_attribute },
a5c76ee6
ZW
16071 { "longcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
16072 { "shortcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
16073 { NULL, 0, 0, false, false, false, NULL }
91d231cb 16074};
7509c759 16075
8bb418a3
ZL
16076/* Handle the "altivec" attribute. The attribute may have
16077 arguments as follows:
16078
16079 __attribute__((altivec(vector__)))
16080 __attribute__((altivec(pixel__))) (always followed by 'unsigned short')
16081 __attribute__((altivec(bool__))) (always followed by 'unsigned')
16082
16083 and may appear more than once (e.g., 'vector bool char') in a
16084 given declaration. */
16085
16086static tree
16087rs6000_handle_altivec_attribute (tree *node, tree name, tree args,
16088 int flags ATTRIBUTE_UNUSED,
16089 bool *no_add_attrs)
16090{
16091 tree type = *node, result = NULL_TREE;
16092 enum machine_mode mode;
16093 int unsigned_p;
16094 char altivec_type
16095 = ((args && TREE_CODE (args) == TREE_LIST && TREE_VALUE (args)
16096 && TREE_CODE (TREE_VALUE (args)) == IDENTIFIER_NODE)
16097 ? *IDENTIFIER_POINTER (TREE_VALUE (args))
16098 : '?');
16099
16100 while (POINTER_TYPE_P (type)
16101 || TREE_CODE (type) == FUNCTION_TYPE
16102 || TREE_CODE (type) == METHOD_TYPE
16103 || TREE_CODE (type) == ARRAY_TYPE)
16104 type = TREE_TYPE (type);
16105
16106 mode = TYPE_MODE (type);
16107
16108 if (rs6000_warn_altivec_long
16109 && (type == long_unsigned_type_node || type == long_integer_type_node))
16110 warning ("use of 'long' in AltiVec types is deprecated; use 'int'");
16111
16112 switch (altivec_type)
16113 {
16114 case 'v':
8df83eae 16115 unsigned_p = TYPE_UNSIGNED (type);
8bb418a3
ZL
16116 switch (mode)
16117 {
16118 case SImode:
16119 result = (unsigned_p ? unsigned_V4SI_type_node : V4SI_type_node);
16120 break;
16121 case HImode:
16122 result = (unsigned_p ? unsigned_V8HI_type_node : V8HI_type_node);
16123 break;
16124 case QImode:
16125 result = (unsigned_p ? unsigned_V16QI_type_node : V16QI_type_node);
16126 break;
16127 case SFmode: result = V4SF_type_node; break;
16128 /* If the user says 'vector int bool', we may be handed the 'bool'
16129 attribute _before_ the 'vector' attribute, and so select the proper
16130 type in the 'b' case below. */
16131 case V4SImode: case V8HImode: case V16QImode: result = type;
16132 default: break;
16133 }
16134 break;
16135 case 'b':
16136 switch (mode)
16137 {
16138 case SImode: case V4SImode: result = bool_V4SI_type_node; break;
16139 case HImode: case V8HImode: result = bool_V8HI_type_node; break;
16140 case QImode: case V16QImode: result = bool_V16QI_type_node;
16141 default: break;
16142 }
16143 break;
16144 case 'p':
16145 switch (mode)
16146 {
16147 case V8HImode: result = pixel_V8HI_type_node;
16148 default: break;
16149 }
16150 default: break;
16151 }
16152
7958a2a6
FJ
16153 if (result && result != type && TYPE_READONLY (type))
16154 result = build_qualified_type (result, TYPE_QUAL_CONST);
16155
8bb418a3
ZL
16156 *no_add_attrs = true; /* No need to hang on to the attribute. */
16157
16158 if (!result)
16159 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
16160 else
16161 *node = reconstruct_complex_type (*node, result);
16162
16163 return NULL_TREE;
16164}
16165
f18eca82
ZL
16166/* AltiVec defines four built-in scalar types that serve as vector
16167 elements; we must teach the compiler how to mangle them. */
16168
16169static const char *
16170rs6000_mangle_fundamental_type (tree type)
16171{
16172 if (type == bool_char_type_node) return "U6__boolc";
16173 if (type == bool_short_type_node) return "U6__bools";
16174 if (type == pixel_type_node) return "u7__pixel";
16175 if (type == bool_int_type_node) return "U6__booli";
16176
16177 /* For all other types, use normal C++ mangling. */
16178 return NULL;
16179}
16180
a5c76ee6
ZW
16181/* Handle a "longcall" or "shortcall" attribute; arguments as in
16182 struct attribute_spec.handler. */
a4f6c312 16183
91d231cb 16184static tree
a2369ed3
DJ
16185rs6000_handle_longcall_attribute (tree *node, tree name,
16186 tree args ATTRIBUTE_UNUSED,
16187 int flags ATTRIBUTE_UNUSED,
16188 bool *no_add_attrs)
91d231cb
JM
16189{
16190 if (TREE_CODE (*node) != FUNCTION_TYPE
16191 && TREE_CODE (*node) != FIELD_DECL
16192 && TREE_CODE (*node) != TYPE_DECL)
16193 {
16194 warning ("`%s' attribute only applies to functions",
16195 IDENTIFIER_POINTER (name));
16196 *no_add_attrs = true;
16197 }
6a4cee5f 16198
91d231cb 16199 return NULL_TREE;
7509c759
MM
16200}
16201
a5c76ee6
ZW
16202/* Set longcall attributes on all functions declared when
16203 rs6000_default_long_calls is true. */
16204static void
a2369ed3 16205rs6000_set_default_type_attributes (tree type)
a5c76ee6
ZW
16206{
16207 if (rs6000_default_long_calls
16208 && (TREE_CODE (type) == FUNCTION_TYPE
16209 || TREE_CODE (type) == METHOD_TYPE))
16210 TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
16211 NULL_TREE,
16212 TYPE_ATTRIBUTES (type));
16213}
16214
3cb999d8
DE
16215/* Return a reference suitable for calling a function with the
16216 longcall attribute. */
a4f6c312 16217
6a4cee5f 16218struct rtx_def *
a2369ed3 16219rs6000_longcall_ref (rtx call_ref)
6a4cee5f 16220{
d330fd93 16221 const char *call_name;
6a4cee5f
MM
16222 tree node;
16223
16224 if (GET_CODE (call_ref) != SYMBOL_REF)
16225 return call_ref;
16226
16227 /* System V adds '.' to the internal name, so skip them. */
16228 call_name = XSTR (call_ref, 0);
16229 if (*call_name == '.')
16230 {
16231 while (*call_name == '.')
16232 call_name++;
16233
16234 node = get_identifier (call_name);
39403d82 16235 call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
6a4cee5f
MM
16236 }
16237
16238 return force_reg (Pmode, call_ref);
16239}
7509c759 16240\f
b64a1b53
RH
16241#ifdef USING_ELFOS_H
16242
7509c759
MM
16243/* A C statement or statements to switch to the appropriate section
16244 for output of RTX in mode MODE. You can assume that RTX is some
16245 kind of constant in RTL. The argument MODE is redundant except in
16246 the case of a `const_int' rtx. Select the section by calling
16247 `text_section' or one of the alternatives for other sections.
16248
16249 Do not define this macro if you put all constants in the read-only
16250 data section. */
16251
b64a1b53 16252static void
a2369ed3
DJ
16253rs6000_elf_select_rtx_section (enum machine_mode mode, rtx x,
16254 unsigned HOST_WIDE_INT align)
7509c759 16255{
a9098fd0 16256 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
7509c759 16257 toc_section ();
7509c759 16258 else
b64a1b53 16259 default_elf_select_rtx_section (mode, x, align);
7509c759
MM
16260}
16261
16262/* A C statement or statements to switch to the appropriate
16263 section for output of DECL. DECL is either a `VAR_DECL' node
16264 or a constant of some sort. RELOC indicates whether forming
16265 the initial value of DECL requires link-time relocations. */
16266
ae46c4e0 16267static void
a2369ed3
DJ
16268rs6000_elf_select_section (tree decl, int reloc,
16269 unsigned HOST_WIDE_INT align)
7509c759 16270{
f1384257
AM
16271 /* Pretend that we're always building for a shared library when
16272 ABI_AIX, because otherwise we end up with dynamic relocations
16273 in read-only sections. This happens for function pointers,
16274 references to vtables in typeinfo, and probably other cases. */
0e5dbd9b
DE
16275 default_elf_select_section_1 (decl, reloc, align,
16276 flag_pic || DEFAULT_ABI == ABI_AIX);
63019373
GK
16277}
16278
16279/* A C statement to build up a unique section name, expressed as a
16280 STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
16281 RELOC indicates whether the initial value of EXP requires
16282 link-time relocations. If you do not define this macro, GCC will use
16283 the symbol name prefixed by `.' as the section name. Note - this
f5143c46 16284 macro can now be called for uninitialized data items as well as
4912a07c 16285 initialized data and functions. */
63019373 16286
ae46c4e0 16287static void
a2369ed3 16288rs6000_elf_unique_section (tree decl, int reloc)
63019373 16289{
f1384257
AM
16290 /* As above, pretend that we're always building for a shared library
16291 when ABI_AIX, to avoid dynamic relocations in read-only sections. */
0e5dbd9b
DE
16292 default_unique_section_1 (decl, reloc,
16293 flag_pic || DEFAULT_ABI == ABI_AIX);
7509c759 16294}
d9407988 16295\f
d1908feb
JJ
16296/* For a SYMBOL_REF, set generic flags and then perform some
16297 target-specific processing.
16298
d1908feb
JJ
16299 When the AIX ABI is requested on a non-AIX system, replace the
16300 function name with the real name (with a leading .) rather than the
16301 function descriptor name. This saves a lot of overriding code to
16302 read the prefixes. */
d9407988 16303
fb49053f 16304static void
a2369ed3 16305rs6000_elf_encode_section_info (tree decl, rtx rtl, int first)
d9407988 16306{
d1908feb 16307 default_encode_section_info (decl, rtl, first);
b2003250 16308
d1908feb
JJ
16309 if (first
16310 && TREE_CODE (decl) == FUNCTION_DECL
16311 && !TARGET_AIX
16312 && DEFAULT_ABI == ABI_AIX)
d9407988 16313 {
c6a2438a 16314 rtx sym_ref = XEXP (rtl, 0);
d1908feb
JJ
16315 size_t len = strlen (XSTR (sym_ref, 0));
16316 char *str = alloca (len + 2);
16317 str[0] = '.';
16318 memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
16319 XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
d9407988 16320 }
d9407988
MM
16321}
16322
0e5dbd9b 16323static bool
a2369ed3 16324rs6000_elf_in_small_data_p (tree decl)
0e5dbd9b
DE
16325{
16326 if (rs6000_sdata == SDATA_NONE)
16327 return false;
16328
16329 if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
16330 {
16331 const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
16332 if (strcmp (section, ".sdata") == 0
16333 || strcmp (section, ".sdata2") == 0
20bfcd69
GK
16334 || strcmp (section, ".sbss") == 0
16335 || strcmp (section, ".sbss2") == 0
16336 || strcmp (section, ".PPC.EMB.sdata0") == 0
16337 || strcmp (section, ".PPC.EMB.sbss0") == 0)
0e5dbd9b
DE
16338 return true;
16339 }
16340 else
16341 {
16342 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
16343
16344 if (size > 0
307b599c 16345 && (unsigned HOST_WIDE_INT) size <= g_switch_value
20bfcd69
GK
16346 /* If it's not public, and we're not going to reference it there,
16347 there's no need to put it in the small data section. */
0e5dbd9b
DE
16348 && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
16349 return true;
16350 }
16351
16352 return false;
16353}
16354
b91da81f 16355#endif /* USING_ELFOS_H */
000034eb 16356
a6c2a102 16357\f
000034eb 16358/* Return a REG that occurs in ADDR with coefficient 1.
02441cd6
JL
16359 ADDR can be effectively incremented by incrementing REG.
16360
16361 r0 is special and we must not select it as an address
16362 register by this routine since our caller will try to
16363 increment the returned register via an "la" instruction. */
000034eb
DE
16364
16365struct rtx_def *
a2369ed3 16366find_addr_reg (rtx addr)
000034eb
DE
16367{
16368 while (GET_CODE (addr) == PLUS)
16369 {
02441cd6
JL
16370 if (GET_CODE (XEXP (addr, 0)) == REG
16371 && REGNO (XEXP (addr, 0)) != 0)
000034eb 16372 addr = XEXP (addr, 0);
02441cd6
JL
16373 else if (GET_CODE (XEXP (addr, 1)) == REG
16374 && REGNO (XEXP (addr, 1)) != 0)
000034eb
DE
16375 addr = XEXP (addr, 1);
16376 else if (CONSTANT_P (XEXP (addr, 0)))
16377 addr = XEXP (addr, 1);
16378 else if (CONSTANT_P (XEXP (addr, 1)))
16379 addr = XEXP (addr, 0);
16380 else
16381 abort ();
16382 }
02441cd6 16383 if (GET_CODE (addr) == REG && REGNO (addr) != 0)
000034eb
DE
16384 return addr;
16385 abort ();
16386}
16387
a6c2a102 16388void
a2369ed3 16389rs6000_fatal_bad_address (rtx op)
a6c2a102
DE
16390{
16391 fatal_insn ("bad address", op);
16392}
c8023011 16393
ee890fe2
SS
16394#if TARGET_MACHO
16395
16396#if 0
16397/* Returns 1 if OP is either a symbol reference or a sum of a symbol
16398 reference and a constant. */
16399
16400int
a2369ed3 16401symbolic_operand (rtx op)
ee890fe2
SS
16402{
16403 switch (GET_CODE (op))
16404 {
16405 case SYMBOL_REF:
16406 case LABEL_REF:
16407 return 1;
16408 case CONST:
16409 op = XEXP (op, 0);
16410 return (GET_CODE (op) == SYMBOL_REF ||
16411 (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
16412 || GET_CODE (XEXP (op, 0)) == LABEL_REF)
16413 && GET_CODE (XEXP (op, 1)) == CONST_INT);
16414 default:
16415 return 0;
16416 }
c8023011 16417}
ee890fe2
SS
16418#endif
16419
efdba735 16420#if TARGET_MACHO
ee890fe2 16421
efdba735 16422static tree branch_island_list = 0;
ee890fe2 16423
efdba735
SH
16424/* Remember to generate a branch island for far calls to the given
16425 function. */
ee890fe2 16426
efdba735
SH
16427static void
16428add_compiler_branch_island (tree label_name, tree function_name, int line_number)
ee890fe2 16429{
efdba735 16430 tree branch_island = build_tree_list (function_name, label_name);
4a90aeeb 16431 TREE_TYPE (branch_island) = build_int_cst (NULL_TREE, line_number, 0);
efdba735
SH
16432 TREE_CHAIN (branch_island) = branch_island_list;
16433 branch_island_list = branch_island;
ee890fe2
SS
16434}
16435
efdba735
SH
16436#define BRANCH_ISLAND_LABEL_NAME(BRANCH_ISLAND) TREE_VALUE (BRANCH_ISLAND)
16437#define BRANCH_ISLAND_FUNCTION_NAME(BRANCH_ISLAND) TREE_PURPOSE (BRANCH_ISLAND)
16438#define BRANCH_ISLAND_LINE_NUMBER(BRANCH_ISLAND) \
16439 TREE_INT_CST_LOW (TREE_TYPE (BRANCH_ISLAND))
ee890fe2 16440
efdba735
SH
16441/* Generate far-jump branch islands for everything on the
16442 branch_island_list. Invoked immediately after the last instruction
16443 of the epilogue has been emitted; the branch-islands must be
16444 appended to, and contiguous with, the function body. Mach-O stubs
16445 are generated in machopic_output_stub(). */
ee890fe2 16446
efdba735
SH
16447static void
16448macho_branch_islands (void)
16449{
16450 char tmp_buf[512];
16451 tree branch_island;
16452
16453 for (branch_island = branch_island_list;
16454 branch_island;
16455 branch_island = TREE_CHAIN (branch_island))
16456 {
16457 const char *label =
16458 IDENTIFIER_POINTER (BRANCH_ISLAND_LABEL_NAME (branch_island));
16459 const char *name =
11abc112 16460 IDENTIFIER_POINTER (BRANCH_ISLAND_FUNCTION_NAME (branch_island));
efdba735
SH
16461 char name_buf[512];
16462 /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF(). */
16463 if (name[0] == '*' || name[0] == '&')
16464 strcpy (name_buf, name+1);
16465 else
16466 {
16467 name_buf[0] = '_';
16468 strcpy (name_buf+1, name);
16469 }
16470 strcpy (tmp_buf, "\n");
16471 strcat (tmp_buf, label);
ee890fe2 16472#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
efdba735 16473 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
f7efd730 16474 fprintf (asm_out_file, "\t.stabd 68,0," HOST_WIDE_INT_PRINT_UNSIGNED "\n",
efdba735 16475 BRANCH_ISLAND_LINE_NUMBER(branch_island));
ee890fe2 16476#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
efdba735
SH
16477 if (flag_pic)
16478 {
16479 strcat (tmp_buf, ":\n\tmflr r0\n\tbcl 20,31,");
16480 strcat (tmp_buf, label);
16481 strcat (tmp_buf, "_pic\n");
16482 strcat (tmp_buf, label);
16483 strcat (tmp_buf, "_pic:\n\tmflr r11\n");
16484
16485 strcat (tmp_buf, "\taddis r11,r11,ha16(");
16486 strcat (tmp_buf, name_buf);
16487 strcat (tmp_buf, " - ");
16488 strcat (tmp_buf, label);
16489 strcat (tmp_buf, "_pic)\n");
16490
16491 strcat (tmp_buf, "\tmtlr r0\n");
16492
16493 strcat (tmp_buf, "\taddi r12,r11,lo16(");
16494 strcat (tmp_buf, name_buf);
16495 strcat (tmp_buf, " - ");
16496 strcat (tmp_buf, label);
16497 strcat (tmp_buf, "_pic)\n");
16498
16499 strcat (tmp_buf, "\tmtctr r12\n\tbctr\n");
16500 }
16501 else
16502 {
16503 strcat (tmp_buf, ":\nlis r12,hi16(");
16504 strcat (tmp_buf, name_buf);
16505 strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
16506 strcat (tmp_buf, name_buf);
16507 strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
16508 }
16509 output_asm_insn (tmp_buf, 0);
ee890fe2 16510#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
efdba735 16511 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
f7efd730 16512 fprintf(asm_out_file, "\t.stabd 68,0," HOST_WIDE_INT_PRINT_UNSIGNED "\n",
efdba735 16513 BRANCH_ISLAND_LINE_NUMBER (branch_island));
ee890fe2 16514#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
efdba735 16515 }
ee890fe2 16516
efdba735 16517 branch_island_list = 0;
ee890fe2
SS
16518}
16519
16520/* NO_PREVIOUS_DEF checks in the link list whether the function name is
16521 already there or not. */
16522
efdba735 16523static int
a2369ed3 16524no_previous_def (tree function_name)
ee890fe2 16525{
efdba735
SH
16526 tree branch_island;
16527 for (branch_island = branch_island_list;
16528 branch_island;
16529 branch_island = TREE_CHAIN (branch_island))
16530 if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
ee890fe2
SS
16531 return 0;
16532 return 1;
16533}
16534
16535/* GET_PREV_LABEL gets the label name from the previous definition of
16536 the function. */
16537
efdba735 16538static tree
a2369ed3 16539get_prev_label (tree function_name)
ee890fe2 16540{
efdba735
SH
16541 tree branch_island;
16542 for (branch_island = branch_island_list;
16543 branch_island;
16544 branch_island = TREE_CHAIN (branch_island))
16545 if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
16546 return BRANCH_ISLAND_LABEL_NAME (branch_island);
ee890fe2
SS
16547 return 0;
16548}
16549
16550/* INSN is either a function call or a millicode call. It may have an
16551 unconditional jump in its delay slot.
16552
16553 CALL_DEST is the routine we are calling. */
16554
16555char *
efdba735 16556output_call (rtx insn, rtx *operands, int dest_operand_number, int cookie_operand_number)
ee890fe2
SS
16557{
16558 static char buf[256];
efdba735
SH
16559 if (GET_CODE (operands[dest_operand_number]) == SYMBOL_REF
16560 && (INTVAL (operands[cookie_operand_number]) & CALL_LONG))
ee890fe2
SS
16561 {
16562 tree labelname;
efdba735 16563 tree funname = get_identifier (XSTR (operands[dest_operand_number], 0));
ee890fe2
SS
16564
16565 if (no_previous_def (funname))
16566 {
308c142a 16567 int line_number = 0;
ee890fe2
SS
16568 rtx label_rtx = gen_label_rtx ();
16569 char *label_buf, temp_buf[256];
16570 ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
16571 CODE_LABEL_NUMBER (label_rtx));
16572 label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
16573 labelname = get_identifier (label_buf);
16574 for (; insn && GET_CODE (insn) != NOTE; insn = PREV_INSN (insn));
16575 if (insn)
16576 line_number = NOTE_LINE_NUMBER (insn);
efdba735 16577 add_compiler_branch_island (labelname, funname, line_number);
ee890fe2
SS
16578 }
16579 else
16580 labelname = get_prev_label (funname);
16581
efdba735
SH
16582 /* "jbsr foo, L42" is Mach-O for "Link as 'bl foo' if a 'bl'
16583 instruction will reach 'foo', otherwise link as 'bl L42'".
16584 "L42" should be a 'branch island', that will do a far jump to
16585 'foo'. Branch islands are generated in
16586 macho_branch_islands(). */
ee890fe2 16587 sprintf (buf, "jbsr %%z%d,%.246s",
efdba735 16588 dest_operand_number, IDENTIFIER_POINTER (labelname));
ee890fe2
SS
16589 }
16590 else
efdba735
SH
16591 sprintf (buf, "bl %%z%d", dest_operand_number);
16592 return buf;
ee890fe2
SS
16593}
16594
efdba735 16595#endif /* TARGET_MACHO */
ee890fe2 16596
ee890fe2
SS
16597/* Generate PIC and indirect symbol stubs. */
16598
16599void
a2369ed3 16600machopic_output_stub (FILE *file, const char *symb, const char *stub)
ee890fe2
SS
16601{
16602 unsigned int length;
a4f6c312
SS
16603 char *symbol_name, *lazy_ptr_name;
16604 char *local_label_0;
ee890fe2
SS
16605 static int label = 0;
16606
df56a27f 16607 /* Lose our funky encoding stuff so it doesn't contaminate the stub. */
772c5265 16608 symb = (*targetm.strip_name_encoding) (symb);
df56a27f 16609
ee890fe2 16610
ee890fe2
SS
16611 length = strlen (symb);
16612 symbol_name = alloca (length + 32);
16613 GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
16614
16615 lazy_ptr_name = alloca (length + 32);
16616 GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
16617
ee890fe2 16618 if (flag_pic == 2)
d3c300d2 16619 machopic_picsymbol_stub1_section ();
ee890fe2 16620 else
d3c300d2 16621 machopic_symbol_stub1_section ();
ee890fe2
SS
16622
16623 if (flag_pic == 2)
16624 {
d974312d
DJ
16625 fprintf (file, "\t.align 5\n");
16626
16627 fprintf (file, "%s:\n", stub);
16628 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
16629
876455fa
AP
16630 label++;
16631 local_label_0 = alloca (sizeof("\"L0000000000$spb\""));
16632 sprintf (local_label_0, "\"L%011d$spb\"", label);
16633
ee890fe2
SS
16634 fprintf (file, "\tmflr r0\n");
16635 fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
16636 fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
16637 fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
16638 lazy_ptr_name, local_label_0);
16639 fprintf (file, "\tmtlr r0\n");
d3c300d2 16640 fprintf (file, "\tlwzu r12,lo16(%s-%s)(r11)\n",
ee890fe2
SS
16641 lazy_ptr_name, local_label_0);
16642 fprintf (file, "\tmtctr r12\n");
ee890fe2
SS
16643 fprintf (file, "\tbctr\n");
16644 }
16645 else
d974312d
DJ
16646 {
16647 fprintf (file, "\t.align 4\n");
16648
16649 fprintf (file, "%s:\n", stub);
16650 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
16651
16652 fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
16653 fprintf (file, "\tlwzu r12,lo16(%s)(r11)\n", lazy_ptr_name);
16654 fprintf (file, "\tmtctr r12\n");
16655 fprintf (file, "\tbctr\n");
16656 }
ee890fe2
SS
16657
16658 machopic_lazy_symbol_ptr_section ();
16659 fprintf (file, "%s:\n", lazy_ptr_name);
16660 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
49bd1d27
SS
16661 fprintf (file, "%sdyld_stub_binding_helper\n",
16662 (TARGET_64BIT ? DOUBLE_INT_ASM_OP : "\t.long\t"));
ee890fe2
SS
16663}
16664
16665/* Legitimize PIC addresses. If the address is already
16666 position-independent, we return ORIG. Newly generated
16667 position-independent addresses go into a reg. This is REG if non
16668 zero, otherwise we allocate register(s) as necessary. */
16669
c859cda6 16670#define SMALL_INT(X) ((unsigned) (INTVAL(X) + 0x8000) < 0x10000)
ee890fe2
SS
16671
16672rtx
a2369ed3
DJ
16673rs6000_machopic_legitimize_pic_address (rtx orig, enum machine_mode mode,
16674 rtx reg)
ee890fe2
SS
16675{
16676 rtx base, offset;
16677
16678 if (reg == NULL && ! reload_in_progress && ! reload_completed)
16679 reg = gen_reg_rtx (Pmode);
16680
16681 if (GET_CODE (orig) == CONST)
16682 {
16683 if (GET_CODE (XEXP (orig, 0)) == PLUS
16684 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
16685 return orig;
16686
16687 if (GET_CODE (XEXP (orig, 0)) == PLUS)
16688 {
2cf520bf 16689 /* Use a different reg for the intermediate value, as
a3c9585f 16690 it will be marked UNCHANGING. */
2cf520bf
GK
16691 rtx reg_temp = no_new_pseudos ? reg : gen_reg_rtx (Pmode);
16692
a4f6c312
SS
16693 base =
16694 rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
2cf520bf 16695 Pmode, reg_temp);
a4f6c312
SS
16696 offset =
16697 rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
16698 Pmode, reg);
ee890fe2
SS
16699 }
16700 else
16701 abort ();
16702
16703 if (GET_CODE (offset) == CONST_INT)
16704 {
16705 if (SMALL_INT (offset))
ed8908e7 16706 return plus_constant (base, INTVAL (offset));
ee890fe2
SS
16707 else if (! reload_in_progress && ! reload_completed)
16708 offset = force_reg (Pmode, offset);
16709 else
c859cda6
DJ
16710 {
16711 rtx mem = force_const_mem (Pmode, orig);
16712 return machopic_legitimize_pic_address (mem, Pmode, reg);
16713 }
ee890fe2 16714 }
f1c25d3b 16715 return gen_rtx_PLUS (Pmode, base, offset);
ee890fe2
SS
16716 }
16717
16718 /* Fall back on generic machopic code. */
16719 return machopic_legitimize_pic_address (orig, mode, reg);
16720}
16721
16722/* This is just a placeholder to make linking work without having to
16723 add this to the generic Darwin EXTRA_SECTIONS. If -mcall-aix is
16724 ever needed for Darwin (not too likely!) this would have to get a
16725 real definition. */
16726
16727void
863d938c 16728toc_section (void)
ee890fe2
SS
16729{
16730}
16731
16732#endif /* TARGET_MACHO */
7c262518
RH
16733
16734#if TARGET_ELF
16735static unsigned int
a2369ed3 16736rs6000_elf_section_type_flags (tree decl, const char *name, int reloc)
7c262518 16737{
1ff8f81a
AM
16738 return default_section_type_flags_1 (decl, name, reloc,
16739 flag_pic || DEFAULT_ABI == ABI_AIX);
7c262518 16740}
d9f6800d
RH
16741
16742/* Record an element in the table of global constructors. SYMBOL is
16743 a SYMBOL_REF of the function to be called; PRIORITY is a number
16744 between 0 and MAX_INIT_PRIORITY.
16745
16746 This differs from default_named_section_asm_out_constructor in
16747 that we have special handling for -mrelocatable. */
16748
16749static void
a2369ed3 16750rs6000_elf_asm_out_constructor (rtx symbol, int priority)
d9f6800d
RH
16751{
16752 const char *section = ".ctors";
16753 char buf[16];
16754
16755 if (priority != DEFAULT_INIT_PRIORITY)
16756 {
16757 sprintf (buf, ".ctors.%.5u",
16758 /* Invert the numbering so the linker puts us in the proper
16759 order; constructors are run from right to left, and the
16760 linker sorts in increasing order. */
16761 MAX_INIT_PRIORITY - priority);
16762 section = buf;
16763 }
16764
715bdd29
RH
16765 named_section_flags (section, SECTION_WRITE);
16766 assemble_align (POINTER_SIZE);
d9f6800d
RH
16767
16768 if (TARGET_RELOCATABLE)
16769 {
16770 fputs ("\t.long (", asm_out_file);
16771 output_addr_const (asm_out_file, symbol);
16772 fputs (")@fixup\n", asm_out_file);
16773 }
16774 else
c8af3574 16775 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
d9f6800d
RH
16776}
16777
16778static void
a2369ed3 16779rs6000_elf_asm_out_destructor (rtx symbol, int priority)
d9f6800d
RH
16780{
16781 const char *section = ".dtors";
16782 char buf[16];
16783
16784 if (priority != DEFAULT_INIT_PRIORITY)
16785 {
16786 sprintf (buf, ".dtors.%.5u",
16787 /* Invert the numbering so the linker puts us in the proper
16788 order; constructors are run from right to left, and the
16789 linker sorts in increasing order. */
16790 MAX_INIT_PRIORITY - priority);
16791 section = buf;
16792 }
16793
715bdd29
RH
16794 named_section_flags (section, SECTION_WRITE);
16795 assemble_align (POINTER_SIZE);
d9f6800d
RH
16796
16797 if (TARGET_RELOCATABLE)
16798 {
16799 fputs ("\t.long (", asm_out_file);
16800 output_addr_const (asm_out_file, symbol);
16801 fputs (")@fixup\n", asm_out_file);
16802 }
16803 else
c8af3574 16804 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
d9f6800d 16805}
9739c90c
JJ
16806
16807void
a2369ed3 16808rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
9739c90c
JJ
16809{
16810 if (TARGET_64BIT)
16811 {
16812 fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
16813 ASM_OUTPUT_LABEL (file, name);
16814 fputs (DOUBLE_INT_ASM_OP, file);
85b776df
AM
16815 rs6000_output_function_entry (file, name);
16816 fputs (",.TOC.@tocbase,0\n\t.previous\n", file);
16817 if (DOT_SYMBOLS)
9739c90c 16818 {
85b776df 16819 fputs ("\t.size\t", file);
9739c90c 16820 assemble_name (file, name);
85b776df
AM
16821 fputs (",24\n\t.type\t.", file);
16822 assemble_name (file, name);
16823 fputs (",@function\n", file);
16824 if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
16825 {
16826 fputs ("\t.globl\t.", file);
16827 assemble_name (file, name);
16828 putc ('\n', file);
16829 }
9739c90c 16830 }
85b776df
AM
16831 else
16832 ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
9739c90c 16833 ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
85b776df
AM
16834 rs6000_output_function_entry (file, name);
16835 fputs (":\n", file);
9739c90c
JJ
16836 return;
16837 }
16838
16839 if (TARGET_RELOCATABLE
16840 && (get_pool_size () != 0 || current_function_profile)
3c9eb5f4 16841 && uses_TOC ())
9739c90c
JJ
16842 {
16843 char buf[256];
16844
16845 (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
16846
16847 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
16848 fprintf (file, "\t.long ");
16849 assemble_name (file, buf);
16850 putc ('-', file);
16851 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
16852 assemble_name (file, buf);
16853 putc ('\n', file);
16854 }
16855
16856 ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
16857 ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
16858
16859 if (DEFAULT_ABI == ABI_AIX)
16860 {
16861 const char *desc_name, *orig_name;
16862
16863 orig_name = (*targetm.strip_name_encoding) (name);
16864 desc_name = orig_name;
16865 while (*desc_name == '.')
16866 desc_name++;
16867
16868 if (TREE_PUBLIC (decl))
16869 fprintf (file, "\t.globl %s\n", desc_name);
16870
16871 fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
16872 fprintf (file, "%s:\n", desc_name);
16873 fprintf (file, "\t.long %s\n", orig_name);
16874 fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
16875 if (DEFAULT_ABI == ABI_AIX)
16876 fputs ("\t.long 0\n", file);
16877 fprintf (file, "\t.previous\n");
16878 }
16879 ASM_OUTPUT_LABEL (file, name);
16880}
7c262518
RH
16881#endif
16882
cbaaba19 16883#if TARGET_XCOFF
7c262518 16884static void
a2369ed3 16885rs6000_xcoff_asm_globalize_label (FILE *stream, const char *name)
b275d088
DE
16886{
16887 fputs (GLOBAL_ASM_OP, stream);
16888 RS6000_OUTPUT_BASENAME (stream, name);
16889 putc ('\n', stream);
16890}
16891
16892static void
a2369ed3 16893rs6000_xcoff_asm_named_section (const char *name, unsigned int flags)
7c262518 16894{
0e5dbd9b
DE
16895 int smclass;
16896 static const char * const suffix[3] = { "PR", "RO", "RW" };
16897
16898 if (flags & SECTION_CODE)
16899 smclass = 0;
16900 else if (flags & SECTION_WRITE)
16901 smclass = 2;
16902 else
16903 smclass = 1;
16904
5b5198f7 16905 fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
0e5dbd9b 16906 (flags & SECTION_CODE) ? "." : "",
5b5198f7 16907 name, suffix[smclass], flags & SECTION_ENTSIZE);
7c262518 16908}
ae46c4e0
RH
16909
16910static void
a2369ed3
DJ
16911rs6000_xcoff_select_section (tree decl, int reloc,
16912 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
ae46c4e0 16913{
5add3202 16914 if (decl_readonly_section_1 (decl, reloc, 1))
ae46c4e0 16915 {
0e5dbd9b 16916 if (TREE_PUBLIC (decl))
ae46c4e0
RH
16917 read_only_data_section ();
16918 else
16919 read_only_private_data_section ();
16920 }
16921 else
16922 {
0e5dbd9b 16923 if (TREE_PUBLIC (decl))
ae46c4e0
RH
16924 data_section ();
16925 else
16926 private_data_section ();
16927 }
16928}
16929
16930static void
a2369ed3 16931rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
ae46c4e0
RH
16932{
16933 const char *name;
ae46c4e0 16934
5b5198f7
DE
16935 /* Use select_section for private and uninitialized data. */
16936 if (!TREE_PUBLIC (decl)
16937 || DECL_COMMON (decl)
0e5dbd9b
DE
16938 || DECL_INITIAL (decl) == NULL_TREE
16939 || DECL_INITIAL (decl) == error_mark_node
16940 || (flag_zero_initialized_in_bss
16941 && initializer_zerop (DECL_INITIAL (decl))))
16942 return;
16943
16944 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
16945 name = (*targetm.strip_name_encoding) (name);
16946 DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
ae46c4e0 16947}
b64a1b53 16948
fb49053f
RH
16949/* Select section for constant in constant pool.
16950
16951 On RS/6000, all constants are in the private read-only data area.
16952 However, if this is being placed in the TOC it must be output as a
16953 toc entry. */
16954
b64a1b53 16955static void
a2369ed3
DJ
16956rs6000_xcoff_select_rtx_section (enum machine_mode mode, rtx x,
16957 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
b64a1b53
RH
16958{
16959 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
16960 toc_section ();
16961 else
16962 read_only_private_data_section ();
16963}
772c5265
RH
16964
16965/* Remove any trailing [DS] or the like from the symbol name. */
16966
16967static const char *
a2369ed3 16968rs6000_xcoff_strip_name_encoding (const char *name)
772c5265
RH
16969{
16970 size_t len;
16971 if (*name == '*')
16972 name++;
16973 len = strlen (name);
16974 if (name[len - 1] == ']')
16975 return ggc_alloc_string (name, len - 4);
16976 else
16977 return name;
16978}
16979
5add3202
DE
16980/* Section attributes. AIX is always PIC. */
16981
16982static unsigned int
a2369ed3 16983rs6000_xcoff_section_type_flags (tree decl, const char *name, int reloc)
5add3202 16984{
5b5198f7
DE
16985 unsigned int align;
16986 unsigned int flags = default_section_type_flags_1 (decl, name, reloc, 1);
16987
16988 /* Align to at least UNIT size. */
16989 if (flags & SECTION_CODE)
16990 align = MIN_UNITS_PER_WORD;
16991 else
16992 /* Increase alignment of large objects if not already stricter. */
16993 align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
16994 int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
16995 ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
16996
16997 return flags | (exact_log2 (align) & SECTION_ENTSIZE);
5add3202 16998}
a5fe455b 16999
1bc7c5b6
ZW
17000/* Output at beginning of assembler file.
17001
17002 Initialize the section names for the RS/6000 at this point.
17003
17004 Specify filename, including full path, to assembler.
17005
17006 We want to go into the TOC section so at least one .toc will be emitted.
17007 Also, in order to output proper .bs/.es pairs, we need at least one static
17008 [RW] section emitted.
17009
17010 Finally, declare mcount when profiling to make the assembler happy. */
17011
17012static void
863d938c 17013rs6000_xcoff_file_start (void)
1bc7c5b6
ZW
17014{
17015 rs6000_gen_section_name (&xcoff_bss_section_name,
17016 main_input_filename, ".bss_");
17017 rs6000_gen_section_name (&xcoff_private_data_section_name,
17018 main_input_filename, ".rw_");
17019 rs6000_gen_section_name (&xcoff_read_only_section_name,
17020 main_input_filename, ".ro_");
17021
17022 fputs ("\t.file\t", asm_out_file);
17023 output_quoted_string (asm_out_file, main_input_filename);
17024 fputc ('\n', asm_out_file);
17025 toc_section ();
17026 if (write_symbols != NO_DEBUG)
17027 private_data_section ();
17028 text_section ();
17029 if (profile_flag)
17030 fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
17031 rs6000_file_start ();
17032}
17033
a5fe455b
ZW
17034/* Output at end of assembler file.
17035 On the RS/6000, referencing data should automatically pull in text. */
17036
17037static void
863d938c 17038rs6000_xcoff_file_end (void)
a5fe455b
ZW
17039{
17040 text_section ();
17041 fputs ("_section_.text:\n", asm_out_file);
17042 data_section ();
17043 fputs (TARGET_32BIT
17044 ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
17045 asm_out_file);
17046}
f1384257 17047#endif /* TARGET_XCOFF */
0e5dbd9b 17048
f1384257
AM
17049#if TARGET_MACHO
17050/* Cross-module name binding. Darwin does not support overriding
7f3d8013 17051 functions at dynamic-link time. */
0e5dbd9b 17052
2bcc50d0 17053static bool
a2369ed3 17054rs6000_binds_local_p (tree decl)
0e5dbd9b 17055{
f1384257 17056 return default_binds_local_p_1 (decl, 0);
0e5dbd9b 17057}
f1384257 17058#endif
34bb030a 17059
3c50106f
RH
17060/* Compute a (partial) cost for rtx X. Return true if the complete
17061 cost has been computed, and false if subexpressions should be
17062 scanned. In either case, *TOTAL contains the cost result. */
17063
17064static bool
a2369ed3
DJ
17065rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
17066 int *total)
3c50106f 17067{
f0517163
RS
17068 enum machine_mode mode = GET_MODE (x);
17069
3c50106f
RH
17070 switch (code)
17071 {
30a555d9 17072 /* On the RS/6000, if it is valid in the insn, it is free. */
3c50106f 17073 case CONST_INT:
066cd967
DE
17074 if (((outer_code == SET
17075 || outer_code == PLUS
17076 || outer_code == MINUS)
17077 && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
17078 || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')))
17079 || ((outer_code == IOR || outer_code == XOR)
17080 && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
17081 || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')))
627b6fe2
DJ
17082 || ((outer_code == DIV || outer_code == UDIV
17083 || outer_code == MOD || outer_code == UMOD)
17084 && exact_log2 (INTVAL (x)) >= 0)
066cd967
DE
17085 || (outer_code == AND
17086 && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
17087 || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')
d5861a7a 17088 || mask_operand (x, VOIDmode)))
066cd967
DE
17089 || outer_code == ASHIFT
17090 || outer_code == ASHIFTRT
17091 || outer_code == LSHIFTRT
17092 || outer_code == ROTATE
17093 || outer_code == ROTATERT
d5861a7a 17094 || outer_code == ZERO_EXTRACT
066cd967
DE
17095 || (outer_code == MULT
17096 && CONST_OK_FOR_LETTER_P (INTVAL (x), 'I'))
17097 || (outer_code == COMPARE
17098 && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
17099 || CONST_OK_FOR_LETTER_P (INTVAL (x), 'K'))))
17100 {
17101 *total = 0;
17102 return true;
17103 }
17104 else if ((outer_code == PLUS
17105 && reg_or_add_cint64_operand (x, VOIDmode))
17106 || (outer_code == MINUS
17107 && reg_or_sub_cint64_operand (x, VOIDmode))
17108 || ((outer_code == SET
17109 || outer_code == IOR
17110 || outer_code == XOR)
17111 && (INTVAL (x)
17112 & ~ (unsigned HOST_WIDE_INT) 0xffffffff) == 0))
17113 {
17114 *total = COSTS_N_INSNS (1);
17115 return true;
17116 }
17117 /* FALLTHRU */
17118
17119 case CONST_DOUBLE:
17120 if (mode == DImode
17121 && ((outer_code == AND
17122 && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
17123 || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')
d5861a7a 17124 || mask64_operand (x, DImode)))
066cd967
DE
17125 || ((outer_code == IOR || outer_code == XOR)
17126 && CONST_DOUBLE_HIGH (x) == 0
17127 && (CONST_DOUBLE_LOW (x)
17128 & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0)))
17129 {
17130 *total = 0;
17131 return true;
17132 }
17133 else if (mode == DImode
17134 && (outer_code == SET
17135 || outer_code == IOR
17136 || outer_code == XOR)
17137 && CONST_DOUBLE_HIGH (x) == 0)
17138 {
17139 *total = COSTS_N_INSNS (1);
17140 return true;
17141 }
17142 /* FALLTHRU */
17143
3c50106f 17144 case CONST:
066cd967 17145 case HIGH:
3c50106f 17146 case SYMBOL_REF:
066cd967
DE
17147 case MEM:
17148 /* When optimizing for size, MEM should be slightly more expensive
17149 than generating address, e.g., (plus (reg) (const)).
17150 L1 cache latecy is about two instructions. */
17151 *total = optimize_size ? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (2);
3c50106f
RH
17152 return true;
17153
30a555d9
DE
17154 case LABEL_REF:
17155 *total = 0;
17156 return true;
17157
3c50106f 17158 case PLUS:
f0517163 17159 if (mode == DFmode)
066cd967
DE
17160 {
17161 if (GET_CODE (XEXP (x, 0)) == MULT)
17162 {
17163 /* FNMA accounted in outer NEG. */
17164 if (outer_code == NEG)
17165 *total = rs6000_cost->dmul - rs6000_cost->fp;
17166 else
17167 *total = rs6000_cost->dmul;
17168 }
17169 else
17170 *total = rs6000_cost->fp;
17171 }
f0517163 17172 else if (mode == SFmode)
066cd967
DE
17173 {
17174 /* FNMA accounted in outer NEG. */
17175 if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
17176 *total = 0;
17177 else
17178 *total = rs6000_cost->fp;
17179 }
938bf747
RS
17180 else if (GET_CODE (XEXP (x, 0)) == MULT)
17181 {
17182 /* The rs6000 doesn't have shift-and-add instructions. */
17183 rs6000_rtx_costs (XEXP (x, 0), MULT, PLUS, total);
17184 *total += COSTS_N_INSNS (1);
17185 }
f0517163 17186 else
066cd967
DE
17187 *total = COSTS_N_INSNS (1);
17188 return false;
3c50106f 17189
52190329 17190 case MINUS:
f0517163 17191 if (mode == DFmode)
066cd967
DE
17192 {
17193 if (GET_CODE (XEXP (x, 0)) == MULT)
17194 {
17195 /* FNMA accounted in outer NEG. */
17196 if (outer_code == NEG)
17197 *total = 0;
17198 else
17199 *total = rs6000_cost->dmul;
17200 }
17201 else
17202 *total = rs6000_cost->fp;
17203 }
f0517163 17204 else if (mode == SFmode)
066cd967
DE
17205 {
17206 /* FNMA accounted in outer NEG. */
17207 if (outer_code == NEG && GET_CODE (XEXP (x, 0)) == MULT)
17208 *total = 0;
17209 else
17210 *total = rs6000_cost->fp;
17211 }
938bf747
RS
17212 else if (GET_CODE (XEXP (x, 0)) == MULT)
17213 {
17214 /* The rs6000 doesn't have shift-and-sub instructions. */
17215 rs6000_rtx_costs (XEXP (x, 0), MULT, MINUS, total);
17216 *total += COSTS_N_INSNS (1);
17217 }
f0517163
RS
17218 else
17219 *total = COSTS_N_INSNS (1);
066cd967 17220 return false;
3c50106f
RH
17221
17222 case MULT:
8b897cfa 17223 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
3c50106f 17224 {
8b897cfa
RS
17225 if (INTVAL (XEXP (x, 1)) >= -256
17226 && INTVAL (XEXP (x, 1)) <= 255)
06a67bdd 17227 *total = rs6000_cost->mulsi_const9;
8b897cfa 17228 else
06a67bdd 17229 *total = rs6000_cost->mulsi_const;
3c50106f 17230 }
066cd967
DE
17231 /* FMA accounted in outer PLUS/MINUS. */
17232 else if ((mode == DFmode || mode == SFmode)
17233 && (outer_code == PLUS || outer_code == MINUS))
17234 *total = 0;
f0517163 17235 else if (mode == DFmode)
06a67bdd 17236 *total = rs6000_cost->dmul;
f0517163 17237 else if (mode == SFmode)
06a67bdd 17238 *total = rs6000_cost->fp;
f0517163 17239 else if (mode == DImode)
06a67bdd 17240 *total = rs6000_cost->muldi;
8b897cfa 17241 else
06a67bdd 17242 *total = rs6000_cost->mulsi;
066cd967 17243 return false;
3c50106f
RH
17244
17245 case DIV:
17246 case MOD:
f0517163
RS
17247 if (FLOAT_MODE_P (mode))
17248 {
06a67bdd
RS
17249 *total = mode == DFmode ? rs6000_cost->ddiv
17250 : rs6000_cost->sdiv;
066cd967 17251 return false;
f0517163 17252 }
5efb1046 17253 /* FALLTHRU */
3c50106f
RH
17254
17255 case UDIV:
17256 case UMOD:
627b6fe2
DJ
17257 if (GET_CODE (XEXP (x, 1)) == CONST_INT
17258 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
17259 {
17260 if (code == DIV || code == MOD)
17261 /* Shift, addze */
17262 *total = COSTS_N_INSNS (2);
17263 else
17264 /* Shift */
17265 *total = COSTS_N_INSNS (1);
17266 }
17267 else
17268 {
17269 if (GET_MODE (XEXP (x, 1)) == DImode)
17270 *total = rs6000_cost->divdi;
17271 else
17272 *total = rs6000_cost->divsi;
17273 }
17274 /* Add in shift and subtract for MOD. */
17275 if (code == MOD || code == UMOD)
17276 *total += COSTS_N_INSNS (2);
066cd967 17277 return false;
3c50106f
RH
17278
17279 case FFS:
17280 *total = COSTS_N_INSNS (4);
066cd967 17281 return false;
3c50106f 17282
06a67bdd 17283 case NOT:
066cd967
DE
17284 if (outer_code == AND || outer_code == IOR || outer_code == XOR)
17285 {
17286 *total = 0;
17287 return false;
17288 }
17289 /* FALLTHRU */
17290
17291 case AND:
17292 case IOR:
17293 case XOR:
d5861a7a
DE
17294 case ZERO_EXTRACT:
17295 *total = COSTS_N_INSNS (1);
17296 return false;
17297
066cd967
DE
17298 case ASHIFT:
17299 case ASHIFTRT:
17300 case LSHIFTRT:
17301 case ROTATE:
17302 case ROTATERT:
d5861a7a 17303 /* Handle mul_highpart. */
066cd967
DE
17304 if (outer_code == TRUNCATE
17305 && GET_CODE (XEXP (x, 0)) == MULT)
17306 {
17307 if (mode == DImode)
17308 *total = rs6000_cost->muldi;
17309 else
17310 *total = rs6000_cost->mulsi;
17311 return true;
17312 }
d5861a7a
DE
17313 else if (outer_code == AND)
17314 *total = 0;
17315 else
17316 *total = COSTS_N_INSNS (1);
17317 return false;
17318
17319 case SIGN_EXTEND:
17320 case ZERO_EXTEND:
17321 if (GET_CODE (XEXP (x, 0)) == MEM)
17322 *total = 0;
17323 else
17324 *total = COSTS_N_INSNS (1);
066cd967 17325 return false;
06a67bdd 17326
066cd967
DE
17327 case COMPARE:
17328 case NEG:
17329 case ABS:
17330 if (!FLOAT_MODE_P (mode))
17331 {
17332 *total = COSTS_N_INSNS (1);
17333 return false;
17334 }
17335 /* FALLTHRU */
17336
17337 case FLOAT:
17338 case UNSIGNED_FLOAT:
17339 case FIX:
17340 case UNSIGNED_FIX:
17341 case FLOAT_EXTEND:
06a67bdd
RS
17342 case FLOAT_TRUNCATE:
17343 *total = rs6000_cost->fp;
066cd967 17344 return false;
06a67bdd
RS
17345
17346 case UNSPEC:
17347 switch (XINT (x, 1))
17348 {
17349 case UNSPEC_FRSP:
17350 *total = rs6000_cost->fp;
17351 return true;
17352
17353 default:
17354 break;
17355 }
17356 break;
17357
17358 case CALL:
17359 case IF_THEN_ELSE:
17360 if (optimize_size)
17361 {
17362 *total = COSTS_N_INSNS (1);
17363 return true;
17364 }
066cd967
DE
17365 else if (FLOAT_MODE_P (mode)
17366 && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT && TARGET_FPRS)
17367 {
17368 *total = rs6000_cost->fp;
17369 return false;
17370 }
17371
06a67bdd
RS
17372 break;
17373
3c50106f 17374 default:
06a67bdd 17375 break;
3c50106f 17376 }
06a67bdd
RS
17377
17378 return false;
3c50106f
RH
17379}
17380
34bb030a
DE
17381/* A C expression returning the cost of moving data from a register of class
17382 CLASS1 to one of CLASS2. */
17383
17384int
a2369ed3
DJ
17385rs6000_register_move_cost (enum machine_mode mode,
17386 enum reg_class from, enum reg_class to)
34bb030a
DE
17387{
17388 /* Moves from/to GENERAL_REGS. */
17389 if (reg_classes_intersect_p (to, GENERAL_REGS)
17390 || reg_classes_intersect_p (from, GENERAL_REGS))
17391 {
17392 if (! reg_classes_intersect_p (to, GENERAL_REGS))
17393 from = to;
17394
17395 if (from == FLOAT_REGS || from == ALTIVEC_REGS)
17396 return (rs6000_memory_move_cost (mode, from, 0)
17397 + rs6000_memory_move_cost (mode, GENERAL_REGS, 0));
17398
a3c9585f 17399/* It's more expensive to move CR_REGS than CR0_REGS because of the shift.... */
34bb030a
DE
17400 else if (from == CR_REGS)
17401 return 4;
17402
17403 else
17404/* A move will cost one instruction per GPR moved. */
17405 return 2 * HARD_REGNO_NREGS (0, mode);
17406 }
17407
17408/* Moving between two similar registers is just one instruction. */
17409 else if (reg_classes_intersect_p (to, from))
17410 return mode == TFmode ? 4 : 2;
17411
17412/* Everything else has to go through GENERAL_REGS. */
17413 else
17414 return (rs6000_register_move_cost (mode, GENERAL_REGS, to)
17415 + rs6000_register_move_cost (mode, from, GENERAL_REGS));
17416}
17417
17418/* A C expressions returning the cost of moving data of MODE from a register to
17419 or from memory. */
17420
17421int
a2369ed3
DJ
17422rs6000_memory_move_cost (enum machine_mode mode, enum reg_class class,
17423 int in ATTRIBUTE_UNUSED)
34bb030a
DE
17424{
17425 if (reg_classes_intersect_p (class, GENERAL_REGS))
17426 return 4 * HARD_REGNO_NREGS (0, mode);
17427 else if (reg_classes_intersect_p (class, FLOAT_REGS))
17428 return 4 * HARD_REGNO_NREGS (32, mode);
17429 else if (reg_classes_intersect_p (class, ALTIVEC_REGS))
17430 return 4 * HARD_REGNO_NREGS (FIRST_ALTIVEC_REGNO, mode);
17431 else
17432 return 4 + rs6000_register_move_cost (mode, class, GENERAL_REGS);
17433}
17434
ded9bf77
AH
17435/* Return an RTX representing where to find the function value of a
17436 function returning MODE. */
17437static rtx
17438rs6000_complex_function_value (enum machine_mode mode)
17439{
17440 unsigned int regno;
17441 rtx r1, r2;
17442 enum machine_mode inner = GET_MODE_INNER (mode);
fb7e4164 17443 unsigned int inner_bytes = GET_MODE_SIZE (inner);
ded9bf77 17444
4ed78545 17445 if (FLOAT_MODE_P (mode) && TARGET_HARD_FLOAT && TARGET_FPRS)
ded9bf77
AH
17446 regno = FP_ARG_RETURN;
17447 else
17448 {
17449 regno = GP_ARG_RETURN;
17450
17451 /* 32-bit is OK since it'll go in r3/r4. */
fb7e4164 17452 if (TARGET_32BIT && inner_bytes >= 4)
ded9bf77
AH
17453 return gen_rtx_REG (mode, regno);
17454 }
17455
fb7e4164
AM
17456 if (inner_bytes >= 8)
17457 return gen_rtx_REG (mode, regno);
17458
ded9bf77
AH
17459 r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
17460 const0_rtx);
17461 r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
fb7e4164 17462 GEN_INT (inner_bytes));
ded9bf77
AH
17463 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
17464}
17465
a6ebc39a
AH
17466/* Define how to find the value returned by a function.
17467 VALTYPE is the data type of the value (as a tree).
17468 If the precise function being called is known, FUNC is its FUNCTION_DECL;
17469 otherwise, FUNC is 0.
17470
17471 On the SPE, both FPs and vectors are returned in r3.
17472
17473 On RS/6000 an integer value is in r3 and a floating-point value is in
17474 fp1, unless -msoft-float. */
17475
17476rtx
17477rs6000_function_value (tree valtype, tree func ATTRIBUTE_UNUSED)
17478{
17479 enum machine_mode mode;
2a8fa26c 17480 unsigned int regno;
a6ebc39a 17481
0e67400a
FJ
17482 if (TARGET_32BIT && TARGET_POWERPC64 && TYPE_MODE (valtype) == DImode)
17483 {
17484 /* Long long return value need be split in -mpowerpc64, 32bit ABI. */
17485 return gen_rtx_PARALLEL (DImode,
17486 gen_rtvec (2,
17487 gen_rtx_EXPR_LIST (VOIDmode,
17488 gen_rtx_REG (SImode, GP_ARG_RETURN),
17489 const0_rtx),
17490 gen_rtx_EXPR_LIST (VOIDmode,
17491 gen_rtx_REG (SImode,
17492 GP_ARG_RETURN + 1),
17493 GEN_INT (4))));
17494 }
17495
a6ebc39a
AH
17496 if ((INTEGRAL_TYPE_P (valtype)
17497 && TYPE_PRECISION (valtype) < BITS_PER_WORD)
17498 || POINTER_TYPE_P (valtype))
b78d48dd 17499 mode = TARGET_32BIT ? SImode : DImode;
a6ebc39a
AH
17500 else
17501 mode = TYPE_MODE (valtype);
17502
4ed78545 17503 if (SCALAR_FLOAT_TYPE_P (valtype) && TARGET_HARD_FLOAT && TARGET_FPRS)
2a8fa26c 17504 regno = FP_ARG_RETURN;
ded9bf77 17505 else if (TREE_CODE (valtype) == COMPLEX_TYPE
42ba5130 17506 && targetm.calls.split_complex_arg)
ded9bf77 17507 return rs6000_complex_function_value (mode);
44688022 17508 else if (TREE_CODE (valtype) == VECTOR_TYPE
d0b2079e
FJ
17509 && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI
17510 && ALTIVEC_VECTOR_MODE(mode))
a6ebc39a
AH
17511 regno = ALTIVEC_ARG_RETURN;
17512 else
17513 regno = GP_ARG_RETURN;
17514
17515 return gen_rtx_REG (mode, regno);
17516}
17517
ded9bf77
AH
17518/* Define how to find the value returned by a library function
17519 assuming the value has mode MODE. */
17520rtx
17521rs6000_libcall_value (enum machine_mode mode)
17522{
17523 unsigned int regno;
17524
17525 if (GET_MODE_CLASS (mode) == MODE_FLOAT
17526 && TARGET_HARD_FLOAT && TARGET_FPRS)
17527 regno = FP_ARG_RETURN;
44688022
AM
17528 else if (ALTIVEC_VECTOR_MODE (mode)
17529 && TARGET_ALTIVEC && TARGET_ALTIVEC_ABI)
ded9bf77 17530 regno = ALTIVEC_ARG_RETURN;
42ba5130 17531 else if (COMPLEX_MODE_P (mode) && targetm.calls.split_complex_arg)
ded9bf77
AH
17532 return rs6000_complex_function_value (mode);
17533 else
17534 regno = GP_ARG_RETURN;
17535
17536 return gen_rtx_REG (mode, regno);
17537}
17538
d1d0c603
JJ
17539/* Define the offset between two registers, FROM to be eliminated and its
17540 replacement TO, at the start of a routine. */
17541HOST_WIDE_INT
17542rs6000_initial_elimination_offset (int from, int to)
17543{
17544 rs6000_stack_t *info = rs6000_stack_info ();
17545 HOST_WIDE_INT offset;
17546
17547 if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
17548 offset = info->push_p ? 0 : -info->total_size;
17549 else if (from == ARG_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
17550 offset = info->total_size;
17551 else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
17552 offset = info->push_p ? info->total_size : 0;
17553 else if (from == RS6000_PIC_OFFSET_TABLE_REGNUM)
17554 offset = 0;
17555 else
17556 abort ();
17557
17558 return offset;
17559}
17560
62e1dfcf
NC
17561/* Return true if TYPE is of type __ev64_opaque__. */
17562
c8e4f0e9 17563static bool
a2369ed3 17564is_ev64_opaque_type (tree type)
62e1dfcf 17565{
c8e4f0e9 17566 return (TARGET_SPE
2abe3e28
AH
17567 && (type == opaque_V2SI_type_node
17568 || type == opaque_V2SF_type_node
36252949 17569 || type == opaque_p_V2SI_type_node));
62e1dfcf
NC
17570}
17571
96714395 17572static rtx
a2369ed3 17573rs6000_dwarf_register_span (rtx reg)
96714395
AH
17574{
17575 unsigned regno;
17576
17577 if (!TARGET_SPE || !SPE_VECTOR_MODE (GET_MODE (reg)))
17578 return NULL_RTX;
17579
17580 regno = REGNO (reg);
17581
17582 /* The duality of the SPE register size wreaks all kinds of havoc.
17583 This is a way of distinguishing r0 in 32-bits from r0 in
17584 64-bits. */
17585 return
17586 gen_rtx_PARALLEL (VOIDmode,
3bd104d1
AH
17587 BYTES_BIG_ENDIAN
17588 ? gen_rtvec (2,
17589 gen_rtx_REG (SImode, regno + 1200),
17590 gen_rtx_REG (SImode, regno))
17591 : gen_rtvec (2,
17592 gen_rtx_REG (SImode, regno),
17593 gen_rtx_REG (SImode, regno + 1200)));
96714395
AH
17594}
17595
93c9d1ba
AM
17596/* Map internal gcc register numbers to DWARF2 register numbers. */
17597
17598unsigned int
17599rs6000_dbx_register_number (unsigned int regno)
17600{
17601 if (regno <= 63 || write_symbols != DWARF2_DEBUG)
17602 return regno;
17603 if (regno == MQ_REGNO)
17604 return 100;
17605 if (regno == LINK_REGISTER_REGNUM)
17606 return 108;
17607 if (regno == COUNT_REGISTER_REGNUM)
17608 return 109;
17609 if (CR_REGNO_P (regno))
17610 return regno - CR0_REGNO + 86;
17611 if (regno == XER_REGNO)
17612 return 101;
17613 if (ALTIVEC_REGNO_P (regno))
17614 return regno - FIRST_ALTIVEC_REGNO + 1124;
17615 if (regno == VRSAVE_REGNO)
17616 return 356;
17617 if (regno == VSCR_REGNO)
17618 return 67;
17619 if (regno == SPE_ACC_REGNO)
17620 return 99;
17621 if (regno == SPEFSCR_REGNO)
17622 return 612;
17623 /* SPE high reg number. We get these values of regno from
17624 rs6000_dwarf_register_span. */
17625 if (regno >= 1200 && regno < 1232)
17626 return regno;
17627
17628 abort ();
17629}
17630
93f90be6
FJ
17631/* target hook eh_return_filter_mode */
17632static enum machine_mode
17633rs6000_eh_return_filter_mode (void)
17634{
17635 return TARGET_32BIT ? SImode : word_mode;
17636}
17637
17211ab5 17638#include "gt-rs6000.h"