]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/rs6000/rs6000.c
2002-09-11 Michael Koch <konqueror@gmx.de>
[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,
95385cbb 3 2000, 2001, 2002 Free Software Foundation, Inc.
fab3bcc3 4 Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
9878760c
RK
5
6This file is part of GNU CC.
7
8GNU CC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2, or (at your option)
11any later version.
12
13GNU CC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GNU CC; see the file COPYING. If not, write to
c15c9075
RK
20the Free Software Foundation, 59 Temple Place - Suite 330,
21Boston, MA 02111-1307, USA. */
9878760c 22
956d6950 23#include "config.h"
c4d38ccb 24#include "system.h"
9878760c
RK
25#include "rtl.h"
26#include "regs.h"
27#include "hard-reg-set.h"
28#include "real.h"
29#include "insn-config.h"
30#include "conditions.h"
9878760c
RK
31#include "insn-attr.h"
32#include "flags.h"
33#include "recog.h"
9878760c 34#include "obstack.h"
9b30bae2 35#include "tree.h"
dfafc897 36#include "expr.h"
2fc1c679 37#include "optabs.h"
2a430ec1 38#include "except.h"
a7df97e6 39#include "function.h"
296b8152 40#include "output.h"
d5fa86ba 41#include "basic-block.h"
d0101753 42#include "integrate.h"
296b8152 43#include "toplev.h"
c8023011 44#include "ggc.h"
9ebbca7d
GK
45#include "hashtab.h"
46#include "tm_p.h"
672a6f42
NB
47#include "target.h"
48#include "target-def.h"
3ac88239 49#include "langhooks.h"
24ea750e 50#include "reload.h"
9b30bae2 51
7509c759
MM
52#ifndef TARGET_NO_PROTOTYPE
53#define TARGET_NO_PROTOTYPE 0
54#endif
55
9878760c
RK
56#define min(A,B) ((A) < (B) ? (A) : (B))
57#define max(A,B) ((A) > (B) ? (A) : (B))
58
5248c961
RK
59/* Target cpu type */
60
61enum processor_type rs6000_cpu;
8e3f41e7
MM
62struct rs6000_cpu_select rs6000_select[3] =
63{
815cdc52
MM
64 /* switch name, tune arch */
65 { (const char *)0, "--with-cpu=", 1, 1 },
66 { (const char *)0, "-mcpu=", 1, 1 },
67 { (const char *)0, "-mtune=", 1, 0 },
8e3f41e7 68};
5248c961 69
6fa3f289
ZW
70/* Size of long double */
71const char *rs6000_long_double_size_string;
72int rs6000_long_double_type_size;
73
74/* Whether -mabi=altivec has appeared */
75int rs6000_altivec_abi;
76
08b57fb3
AH
77/* Whether VRSAVE instructions should be generated. */
78int rs6000_altivec_vrsave;
79
80/* String from -mvrsave= option. */
81const char *rs6000_altivec_vrsave_string;
82
a3170dc6
AH
83/* Nonzero if we want SPE ABI extensions. */
84int rs6000_spe_abi;
85
86/* Whether isel instructions should be generated. */
87int rs6000_isel;
88
89/* Nonzero if we have FPRs. */
90int rs6000_fprs = 1;
91
92/* String from -misel=. */
93const char *rs6000_isel_string;
94
c764f757
RK
95/* Set to non-zero once AIX common-mode calls have been defined. */
96static int common_mode_defined;
c81bebd7 97
0e5dbd9b
DE
98/* Private copy of original value of flag_pic for ABI_AIX. */
99static int rs6000_flag_pic;
100
9878760c
RK
101/* Save information from a "cmpxx" operation until the branch or scc is
102 emitted. */
9878760c
RK
103rtx rs6000_compare_op0, rs6000_compare_op1;
104int rs6000_compare_fp_p;
874a0744 105
874a0744
MM
106/* Label number of label created for -mrelocatable, to call to so we can
107 get the address of the GOT section */
108int rs6000_pic_labelno;
c81bebd7 109
b91da81f 110#ifdef USING_ELFOS_H
c81bebd7 111/* Which abi to adhere to */
815cdc52 112const char *rs6000_abi_name = RS6000_ABI_NAME;
d9407988
MM
113
114/* Semantics of the small data area */
115enum rs6000_sdata_type rs6000_sdata = SDATA_DATA;
116
117/* Which small data model to use */
815cdc52 118const char *rs6000_sdata_name = (char *)0;
9ebbca7d
GK
119
120/* Counter for labels which are to be placed in .fixup. */
121int fixuplabelno = 0;
874a0744 122#endif
4697a36c 123
b6c9286a
MM
124/* ABI enumeration available for subtarget to use. */
125enum rs6000_abi rs6000_current_abi;
126
0ac081f6
AH
127/* ABI string from -mabi= option. */
128const char *rs6000_abi_string;
129
38c1f2d7 130/* Debug flags */
815cdc52 131const char *rs6000_debug_name;
38c1f2d7
MM
132int rs6000_debug_stack; /* debug stack applications */
133int rs6000_debug_arg; /* debug argument handling */
134
57ac7be9
AM
135const char *rs6000_traceback_name;
136static enum {
137 traceback_default = 0,
138 traceback_none,
139 traceback_part,
140 traceback_full
141} rs6000_traceback;
142
38c1f2d7
MM
143/* Flag to say the TOC is initialized */
144int toc_initialized;
9ebbca7d 145char toc_label_name[10];
38c1f2d7 146
9ebbca7d
GK
147/* Alias set for saves and restores from the rs6000 stack. */
148static int rs6000_sr_alias_set;
c8023011 149
a5c76ee6
ZW
150/* Call distance, overridden by -mlongcall and #pragma longcall(1).
151 The only place that looks at this is rs6000_set_default_type_attributes;
152 everywhere else should rely on the presence or absence of a longcall
153 attribute on the function declaration. */
154int rs6000_default_long_calls;
155const char *rs6000_longcall_switch;
156
a3170dc6
AH
157struct builtin_description
158{
159 /* mask is not const because we're going to alter it below. This
160 nonsense will go away when we rewrite the -march infrastructure
161 to give us more target flag bits. */
162 unsigned int mask;
163 const enum insn_code icode;
164 const char *const name;
165 const enum rs6000_builtins code;
166};
167
9ebbca7d
GK
168static void rs6000_add_gc_roots PARAMS ((void));
169static int num_insns_constant_wide PARAMS ((HOST_WIDE_INT));
170static rtx expand_block_move_mem PARAMS ((enum machine_mode, rtx, rtx));
39a10a29
GK
171static void validate_condition_mode
172 PARAMS ((enum rtx_code, enum machine_mode));
173static rtx rs6000_generate_compare PARAMS ((enum rtx_code));
e50f5f3d 174static void rs6000_maybe_dead PARAMS ((rtx));
9ebbca7d
GK
175static void rs6000_emit_stack_tie PARAMS ((void));
176static void rs6000_frame_related PARAMS ((rtx, rtx, HOST_WIDE_INT, rtx, rtx));
89e7058f
AH
177static void emit_frame_save PARAMS ((rtx, rtx, enum machine_mode,
178 unsigned int, int, int));
a3170dc6 179static rtx gen_frame_mem_offset PARAMS ((enum machine_mode, rtx, int));
9ebbca7d
GK
180static void rs6000_emit_allocate_stack PARAMS ((HOST_WIDE_INT, int));
181static unsigned rs6000_hash_constant PARAMS ((rtx));
182static unsigned toc_hash_function PARAMS ((const void *));
183static int toc_hash_eq PARAMS ((const void *, const void *));
2eba1afa 184static int toc_hash_mark_entry PARAMS ((void **, void *));
9ebbca7d
GK
185static void toc_hash_mark_table PARAMS ((void *));
186static int constant_pool_expr_1 PARAMS ((rtx, int *, int *));
e2500fed 187static struct machine_function * rs6000_init_machine_status PARAMS ((void));
301d03af 188static bool rs6000_assemble_integer PARAMS ((rtx, unsigned int, int));
5add3202 189#ifdef HAVE_GAS_HIDDEN
93638d7a 190static void rs6000_assemble_visibility PARAMS ((tree, const char *));
5add3202 191#endif
71f123ca 192static int rs6000_ra_ever_killed PARAMS ((void));
91d231cb
JM
193static tree rs6000_handle_longcall_attribute PARAMS ((tree *, tree, tree, int, bool *));
194const struct attribute_spec rs6000_attribute_table[];
a5c76ee6 195static void rs6000_set_default_type_attributes PARAMS ((tree));
08c148a8
NB
196static void rs6000_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
197static void rs6000_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
2bfcf297
DB
198static rtx rs6000_emit_set_long_const PARAMS ((rtx,
199 HOST_WIDE_INT, HOST_WIDE_INT));
7c262518
RH
200#if TARGET_ELF
201static unsigned int rs6000_elf_section_type_flags PARAMS ((tree, const char *,
202 int));
d9f6800d
RH
203static void rs6000_elf_asm_out_constructor PARAMS ((rtx, int));
204static void rs6000_elf_asm_out_destructor PARAMS ((rtx, int));
ae46c4e0
RH
205static void rs6000_elf_select_section PARAMS ((tree, int,
206 unsigned HOST_WIDE_INT));
207static void rs6000_elf_unique_section PARAMS ((tree, int));
b64a1b53
RH
208static void rs6000_elf_select_rtx_section PARAMS ((enum machine_mode, rtx,
209 unsigned HOST_WIDE_INT));
0e5dbd9b
DE
210static void rs6000_elf_encode_section_info PARAMS ((tree, int))
211 ATTRIBUTE_UNUSED;
772c5265 212static const char *rs6000_elf_strip_name_encoding PARAMS ((const char *));
0e5dbd9b 213static bool rs6000_elf_in_small_data_p PARAMS ((tree));
7c262518 214#endif
cbaaba19 215#if TARGET_XCOFF
b275d088
DE
216static void rs6000_xcoff_asm_globalize_label PARAMS ((FILE *, const char *));
217static void rs6000_xcoff_asm_named_section PARAMS ((const char *, unsigned int));
ae46c4e0
RH
218static void rs6000_xcoff_select_section PARAMS ((tree, int,
219 unsigned HOST_WIDE_INT));
220static void rs6000_xcoff_unique_section PARAMS ((tree, int));
b64a1b53
RH
221static void rs6000_xcoff_select_rtx_section PARAMS ((enum machine_mode, rtx,
222 unsigned HOST_WIDE_INT));
772c5265 223static const char * rs6000_xcoff_strip_name_encoding PARAMS ((const char *));
5add3202 224static unsigned int rs6000_xcoff_section_type_flags PARAMS ((tree, const char *, int));
7c262518 225#endif
fb49053f
RH
226static void rs6000_xcoff_encode_section_info PARAMS ((tree, int))
227 ATTRIBUTE_UNUSED;
2bcc50d0 228static bool rs6000_binds_local_p PARAMS ((tree));
c237e94a
ZW
229static int rs6000_adjust_cost PARAMS ((rtx, rtx, rtx, int));
230static int rs6000_adjust_priority PARAMS ((rtx, int));
231static int rs6000_issue_rate PARAMS ((void));
232
6fa3f289 233static void rs6000_init_builtins PARAMS ((void));
92898235
AH
234static rtx rs6000_expand_unop_builtin PARAMS ((enum insn_code, tree, rtx));
235static rtx rs6000_expand_binop_builtin PARAMS ((enum insn_code, tree, rtx));
236static rtx rs6000_expand_ternop_builtin PARAMS ((enum insn_code, tree, rtx));
0ac081f6 237static rtx rs6000_expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int));
92898235 238static void altivec_init_builtins PARAMS ((void));
a3170dc6
AH
239static void rs6000_common_init_builtins PARAMS ((void));
240
241static void enable_mask_for_builtins PARAMS ((struct builtin_description *,
242 int, enum rs6000_builtins,
243 enum rs6000_builtins));
244static void spe_init_builtins PARAMS ((void));
245static rtx spe_expand_builtin PARAMS ((tree, rtx, bool *));
246static rtx spe_expand_predicate_builtin PARAMS ((enum insn_code, tree, rtx));
247static rtx spe_expand_evsel_builtin PARAMS ((enum insn_code, tree, rtx));
248static int rs6000_emit_int_cmove PARAMS ((rtx, rtx, rtx, rtx));
249
92898235 250static rtx altivec_expand_builtin PARAMS ((tree, rtx, bool *));
3a9b8c7e
AH
251static rtx altivec_expand_ld_builtin PARAMS ((tree, rtx, bool *));
252static rtx altivec_expand_st_builtin PARAMS ((tree, rtx, bool *));
253static rtx altivec_expand_dst_builtin PARAMS ((tree, rtx, bool *));
100c4561 254static rtx altivec_expand_abs_builtin PARAMS ((enum insn_code, tree, rtx));
ae4b4a02 255static rtx altivec_expand_predicate_builtin PARAMS ((enum insn_code, const char *, tree, rtx));
6525c0e7 256static rtx altivec_expand_stv_builtin PARAMS ((enum insn_code, tree));
0ac081f6 257static void rs6000_parse_abi_options PARAMS ((void));
08b57fb3 258static void rs6000_parse_vrsave_option PARAMS ((void));
a3170dc6 259static void rs6000_parse_isel_option PARAMS ((void));
00b960c7
AH
260static int first_altivec_reg_to_save PARAMS ((void));
261static unsigned int compute_vrsave_mask PARAMS ((void));
262static void is_altivec_return_reg PARAMS ((rtx, void *));
9aa86737
AH
263static rtx generate_set_vrsave PARAMS ((rtx, rs6000_stack_t *, int));
264static void altivec_frame_fixup PARAMS ((rtx, rtx, HOST_WIDE_INT));
69ef87e2 265static int easy_vector_constant PARAMS ((rtx));
c81bebd7
MM
266\f
267/* Default register names. */
268char rs6000_reg_names[][8] =
269{
802a0058
MM
270 "0", "1", "2", "3", "4", "5", "6", "7",
271 "8", "9", "10", "11", "12", "13", "14", "15",
272 "16", "17", "18", "19", "20", "21", "22", "23",
273 "24", "25", "26", "27", "28", "29", "30", "31",
274 "0", "1", "2", "3", "4", "5", "6", "7",
275 "8", "9", "10", "11", "12", "13", "14", "15",
276 "16", "17", "18", "19", "20", "21", "22", "23",
277 "24", "25", "26", "27", "28", "29", "30", "31",
278 "mq", "lr", "ctr","ap",
279 "0", "1", "2", "3", "4", "5", "6", "7",
0ac081f6
AH
280 "xer",
281 /* AltiVec registers. */
0cd5e3a1
AH
282 "0", "1", "2", "3", "4", "5", "6", "7",
283 "8", "9", "10", "11", "12", "13", "14", "15",
284 "16", "17", "18", "19", "20", "21", "22", "23",
285 "24", "25", "26", "27", "28", "29", "30", "31",
0ac081f6 286 "vrsave"
c81bebd7
MM
287};
288
289#ifdef TARGET_REGNAMES
8b60264b 290static const char alt_reg_names[][8] =
c81bebd7 291{
802a0058
MM
292 "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7",
293 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
294 "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
295 "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
296 "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
297 "%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
298 "%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
299 "%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
300 "mq", "lr", "ctr", "ap",
301 "%cr0", "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
0ac081f6
AH
302 "xer",
303 /* AltiVec registers. */
304 "%v0", "%v1", "%v2", "%v3", "%v4", "%v5", "%v6", "%v7",
305 "%v8", "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
306 "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
307 "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
76a773f3 308 "vrsave"
c81bebd7
MM
309};
310#endif
9878760c 311\f
daf11973
MM
312#ifndef MASK_STRICT_ALIGN
313#define MASK_STRICT_ALIGN 0
314#endif
672a6f42
NB
315\f
316/* Initialize the GCC target structure. */
91d231cb
JM
317#undef TARGET_ATTRIBUTE_TABLE
318#define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
a5c76ee6
ZW
319#undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
320#define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
daf11973 321
301d03af
RS
322#undef TARGET_ASM_ALIGNED_DI_OP
323#define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
324
325/* Default unaligned ops are only provided for ELF. Find the ops needed
326 for non-ELF systems. */
327#ifndef OBJECT_FORMAT_ELF
cbaaba19 328#if TARGET_XCOFF
ae6c1efd 329/* For XCOFF. rs6000_assemble_integer will handle unaligned DIs on
301d03af
RS
330 64-bit targets. */
331#undef TARGET_ASM_UNALIGNED_HI_OP
332#define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
333#undef TARGET_ASM_UNALIGNED_SI_OP
334#define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
335#undef TARGET_ASM_UNALIGNED_DI_OP
336#define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
337#else
338/* For Darwin. */
339#undef TARGET_ASM_UNALIGNED_HI_OP
340#define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
341#undef TARGET_ASM_UNALIGNED_SI_OP
342#define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
343#endif
344#endif
345
346/* This hook deals with fixups for relocatable code and DI-mode objects
347 in 64-bit code. */
348#undef TARGET_ASM_INTEGER
349#define TARGET_ASM_INTEGER rs6000_assemble_integer
350
93638d7a
AM
351#ifdef HAVE_GAS_HIDDEN
352#undef TARGET_ASM_ASSEMBLE_VISIBILITY
353#define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
354#endif
355
08c148a8
NB
356#undef TARGET_ASM_FUNCTION_PROLOGUE
357#define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
358#undef TARGET_ASM_FUNCTION_EPILOGUE
359#define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
360
c237e94a
ZW
361#undef TARGET_SCHED_ISSUE_RATE
362#define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
363#undef TARGET_SCHED_ADJUST_COST
364#define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
365#undef TARGET_SCHED_ADJUST_PRIORITY
366#define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
367
0ac081f6
AH
368#undef TARGET_INIT_BUILTINS
369#define TARGET_INIT_BUILTINS rs6000_init_builtins
370
371#undef TARGET_EXPAND_BUILTIN
372#define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
373
0e5dbd9b
DE
374#undef TARGET_BINDS_LOCAL_P
375#define TARGET_BINDS_LOCAL_P rs6000_binds_local_p
376
00b960c7
AH
377/* The VRSAVE bitmask puts bit %v0 as the most significant bit. */
378#define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
379
f6897b10 380struct gcc_target targetm = TARGET_INITIALIZER;
672a6f42 381\f
5248c961
RK
382/* Override command line options. Mostly we process the processor
383 type and sometimes adjust other TARGET_ options. */
384
385void
8e3f41e7 386rs6000_override_options (default_cpu)
d330fd93 387 const char *default_cpu;
5248c961 388{
c4d38ccb 389 size_t i, j;
8e3f41e7 390 struct rs6000_cpu_select *ptr;
5248c961 391
85638c0d
RK
392 /* Simplify the entries below by making a mask for any POWER
393 variant and any PowerPC variant. */
394
938937d8 395#define POWER_MASKS (MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING)
68c49ffa
RK
396#define POWERPC_MASKS (MASK_POWERPC | MASK_PPC_GPOPT \
397 | MASK_PPC_GFXOPT | MASK_POWERPC64)
398#define POWERPC_OPT_MASKS (MASK_PPC_GPOPT | MASK_PPC_GFXOPT)
85638c0d 399
5248c961
RK
400 static struct ptt
401 {
8b60264b
KG
402 const char *const name; /* Canonical processor name. */
403 const enum processor_type processor; /* Processor type enum value. */
404 const int target_enable; /* Target flags to enable. */
405 const int target_disable; /* Target flags to disable. */
406 } const processor_target_table[]
cf27b467
MM
407 = {{"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS,
408 POWER_MASKS | POWERPC_MASKS},
db7f1e43 409 {"power", PROCESSOR_POWER,
938937d8 410 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43 411 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
8e3f41e7
MM
412 {"power2", PROCESSOR_POWER,
413 MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
414 POWERPC_MASKS | MASK_NEW_MNEMONICS},
c71791e0
DE
415 {"power3", PROCESSOR_PPC630,
416 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
417 POWER_MASKS | MASK_PPC_GPOPT},
309323c2
DE
418 {"power4", PROCESSOR_POWER4,
419 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
420 POWER_MASKS | MASK_PPC_GPOPT},
db7f1e43
RK
421 {"powerpc", PROCESSOR_POWERPC,
422 MASK_POWERPC | MASK_NEW_MNEMONICS,
68c49ffa 423 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
3cb999d8
DE
424 {"powerpc64", PROCESSOR_POWERPC64,
425 MASK_POWERPC | MASK_POWERPC64 | MASK_NEW_MNEMONICS,
426 POWER_MASKS | POWERPC_OPT_MASKS},
db7f1e43 427 {"rios", PROCESSOR_RIOS1,
938937d8 428 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
429 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
430 {"rios1", PROCESSOR_RIOS1,
938937d8 431 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
432 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
433 {"rsc", PROCESSOR_PPC601,
938937d8 434 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
435 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
436 {"rsc1", PROCESSOR_PPC601,
938937d8 437 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
438 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
439 {"rios2", PROCESSOR_RIOS2,
938937d8 440 MASK_POWER | MASK_MULTIPLE | MASK_STRING | MASK_POWER2,
db7f1e43 441 POWERPC_MASKS | MASK_NEW_MNEMONICS},
3cb999d8
DE
442 {"rs64a", PROCESSOR_RS64A,
443 MASK_POWERPC | MASK_NEW_MNEMONICS,
444 POWER_MASKS | POWERPC_OPT_MASKS},
a3a1dbf6
MM
445 {"401", PROCESSOR_PPC403,
446 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
447 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
49a0b204 448 {"403", PROCESSOR_PPC403,
daf11973 449 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS | MASK_STRICT_ALIGN,
49a0b204 450 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
d7a5e253
DE
451 {"405", PROCESSOR_PPC405,
452 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
453 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
cf27b467
MM
454 {"505", PROCESSOR_MPCCORE,
455 MASK_POWERPC | MASK_NEW_MNEMONICS,
456 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
5248c961 457 {"601", PROCESSOR_PPC601,
938937d8 458 MASK_POWER | MASK_POWERPC | MASK_NEW_MNEMONICS | MASK_MULTIPLE | MASK_STRING,
68c49ffa 459 MASK_POWER2 | POWERPC_OPT_MASKS | MASK_POWERPC64},
1ec26da6 460 {"602", PROCESSOR_PPC603,
cf27b467
MM
461 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
462 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
5248c961 463 {"603", PROCESSOR_PPC603,
68c49ffa
RK
464 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
465 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
b6c9286a
MM
466 {"603e", PROCESSOR_PPC603,
467 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
468 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
b5370a88 469 {"ec603e", PROCESSOR_PPC603,
a3a1dbf6
MM
470 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
471 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
5248c961 472 {"604", PROCESSOR_PPC604,
b6c9286a
MM
473 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
474 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
cac8ce95 475 {"604e", PROCESSOR_PPC604e,
07e6159a
MM
476 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
477 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
b6c9286a 478 {"620", PROCESSOR_PPC620,
68c49ffa 479 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
a260abc9 480 POWER_MASKS | MASK_PPC_GPOPT},
3cb999d8
DE
481 {"630", PROCESSOR_PPC630,
482 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
483 POWER_MASKS | MASK_PPC_GPOPT},
bef84347
VM
484 {"740", PROCESSOR_PPC750,
485 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
486 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
487 {"750", PROCESSOR_PPC750,
488 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
489 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
a4f6c312
SS
490 {"7400", PROCESSOR_PPC7400,
491 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
492 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
493 {"7450", PROCESSOR_PPC7450,
494 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
495 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
a3170dc6
AH
496 {"8540", PROCESSOR_PPC8540,
497 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
498 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
07e6159a
MM
499 {"801", PROCESSOR_MPCCORE,
500 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
501 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
cf27b467
MM
502 {"821", PROCESSOR_MPCCORE,
503 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
504 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
07e6159a
MM
505 {"823", PROCESSOR_MPCCORE,
506 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
507 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
cf27b467
MM
508 {"860", PROCESSOR_MPCCORE,
509 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
510 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64}};
5248c961 511
ca7558fc 512 const size_t ptt_size = ARRAY_SIZE (processor_target_table);
5248c961 513
a4f6c312
SS
514 /* Save current -mmultiple/-mno-multiple status. */
515 int multiple = TARGET_MULTIPLE;
516 /* Save current -mstring/-mno-string status. */
517 int string = TARGET_STRING;
8a61d227 518
a4f6c312 519 /* Identify the processor type. */
8e3f41e7 520 rs6000_select[0].string = default_cpu;
3cb999d8 521 rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
8e3f41e7 522
b6a1cbae 523 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
5248c961 524 {
8e3f41e7
MM
525 ptr = &rs6000_select[i];
526 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
5248c961 527 {
8e3f41e7
MM
528 for (j = 0; j < ptt_size; j++)
529 if (! strcmp (ptr->string, processor_target_table[j].name))
530 {
531 if (ptr->set_tune_p)
532 rs6000_cpu = processor_target_table[j].processor;
533
534 if (ptr->set_arch_p)
535 {
536 target_flags |= processor_target_table[j].target_enable;
537 target_flags &= ~processor_target_table[j].target_disable;
538 }
539 break;
540 }
541
4406229e 542 if (j == ptt_size)
8e3f41e7 543 error ("bad value (%s) for %s switch", ptr->string, ptr->name);
5248c961
RK
544 }
545 }
8a61d227 546
a3170dc6
AH
547 if (rs6000_cpu == PROCESSOR_PPC8540)
548 rs6000_isel = 1;
549
a4f6c312
SS
550 /* If we are optimizing big endian systems for space, use the store
551 multiple instructions. */
ef792183
MM
552 if (BYTES_BIG_ENDIAN && optimize_size)
553 target_flags |= MASK_MULTIPLE;
554
8a61d227
MM
555 /* If -mmultiple or -mno-multiple was explicitly used, don't
556 override with the processor default */
557 if (TARGET_MULTIPLE_SET)
558 target_flags = (target_flags & ~MASK_MULTIPLE) | multiple;
7e69e155 559
a4f6c312
SS
560 /* If -mstring or -mno-string was explicitly used, don't override
561 with the processor default. */
938937d8 562 if (TARGET_STRING_SET)
1f5515bf 563 target_flags = (target_flags & ~MASK_STRING) | string;
938937d8 564
a4f6c312
SS
565 /* Don't allow -mmultiple or -mstring on little endian systems
566 unless the cpu is a 750, because the hardware doesn't support the
567 instructions used in little endian mode, and causes an alignment
568 trap. The 750 does not cause an alignment trap (except when the
569 target is unaligned). */
bef84347 570
bfc79d3b 571 if (! BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
7e69e155
MM
572 {
573 if (TARGET_MULTIPLE)
574 {
575 target_flags &= ~MASK_MULTIPLE;
576 if (TARGET_MULTIPLE_SET)
577 warning ("-mmultiple is not supported on little endian systems");
578 }
579
580 if (TARGET_STRING)
581 {
582 target_flags &= ~MASK_STRING;
938937d8
MM
583 if (TARGET_STRING_SET)
584 warning ("-mstring is not supported on little endian systems");
7e69e155
MM
585 }
586 }
3933e0e1 587
ee2ca2a2 588 if (flag_pic != 0 && DEFAULT_ABI == ABI_AIX)
a260abc9 589 {
0e5dbd9b 590 rs6000_flag_pic = flag_pic;
ee2ca2a2 591 flag_pic = 0;
a260abc9
DE
592 }
593
2bfcf297 594#ifdef XCOFF_DEBUGGING_INFO
9861b0c9 595 if (flag_function_sections && (write_symbols != NO_DEBUG)
2bfcf297 596 && DEFAULT_ABI == ABI_AIX)
9861b0c9
DE
597 {
598 warning ("-ffunction-sections disabled on AIX when debugging");
599 flag_function_sections = 0;
600 }
601
602 if (flag_data_sections && (DEFAULT_ABI == ABI_AIX))
603 {
604 warning ("-fdata-sections not supported on AIX");
605 flag_data_sections = 0;
606 }
2bfcf297 607#endif
9861b0c9 608
c72bfda7
SS
609 /* For Darwin, always silently make -fpic and -fPIC identical. */
610 if (flag_pic == 1 && DEFAULT_ABI == ABI_DARWIN)
611 flag_pic = 2;
612
38c1f2d7
MM
613 /* Set debug flags */
614 if (rs6000_debug_name)
615 {
bfc79d3b 616 if (! strcmp (rs6000_debug_name, "all"))
38c1f2d7 617 rs6000_debug_stack = rs6000_debug_arg = 1;
bfc79d3b 618 else if (! strcmp (rs6000_debug_name, "stack"))
38c1f2d7 619 rs6000_debug_stack = 1;
bfc79d3b 620 else if (! strcmp (rs6000_debug_name, "arg"))
38c1f2d7
MM
621 rs6000_debug_arg = 1;
622 else
c725bd79 623 error ("unknown -mdebug-%s switch", rs6000_debug_name);
38c1f2d7
MM
624 }
625
57ac7be9
AM
626 if (rs6000_traceback_name)
627 {
628 if (! strncmp (rs6000_traceback_name, "full", 4))
629 rs6000_traceback = traceback_full;
630 else if (! strncmp (rs6000_traceback_name, "part", 4))
631 rs6000_traceback = traceback_part;
632 else if (! strncmp (rs6000_traceback_name, "no", 2))
633 rs6000_traceback = traceback_none;
634 else
635 error ("unknown -mtraceback arg `%s'; expecting `full', `partial' or `none'",
636 rs6000_traceback_name);
637 }
638
6fa3f289
ZW
639 /* Set size of long double */
640 rs6000_long_double_type_size = 64;
641 if (rs6000_long_double_size_string)
642 {
643 char *tail;
644 int size = strtol (rs6000_long_double_size_string, &tail, 10);
645 if (*tail != '\0' || (size != 64 && size != 128))
646 error ("Unknown switch -mlong-double-%s",
647 rs6000_long_double_size_string);
648 else
649 rs6000_long_double_type_size = size;
650 }
651
0ac081f6
AH
652 /* Handle -mabi= options. */
653 rs6000_parse_abi_options ();
654
08b57fb3
AH
655 /* Handle -mvrsave= option. */
656 rs6000_parse_vrsave_option ();
657
a3170dc6
AH
658 /* Handle -misel= option. */
659 rs6000_parse_isel_option ();
660
a7ae18e2
AH
661#ifdef SUBTARGET_OVERRIDE_OPTIONS
662 SUBTARGET_OVERRIDE_OPTIONS;
663#endif
664#ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
665 SUBSUBTARGET_OVERRIDE_OPTIONS;
666#endif
667
a5c76ee6
ZW
668 /* Handle -m(no-)longcall option. This is a bit of a cheap hack,
669 using TARGET_OPTIONS to handle a toggle switch, but we're out of
670 bits in target_flags so TARGET_SWITCHES cannot be used.
671 Assumption here is that rs6000_longcall_switch points into the
672 text of the complete option, rather than being a copy, so we can
673 scan back for the presence or absence of the no- modifier. */
674 if (rs6000_longcall_switch)
675 {
676 const char *base = rs6000_longcall_switch;
677 while (base[-1] != 'm') base--;
678
679 if (*rs6000_longcall_switch != '\0')
680 error ("invalid option `%s'", base);
681 rs6000_default_long_calls = (base[0] != 'n');
682 }
683
c81bebd7 684#ifdef TARGET_REGNAMES
a4f6c312
SS
685 /* If the user desires alternate register names, copy in the
686 alternate names now. */
c81bebd7 687 if (TARGET_REGNAMES)
4e135bdd 688 memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
c81bebd7
MM
689#endif
690
6fa3f289
ZW
691 /* Set TARGET_AIX_STRUCT_RET last, after the ABI is determined.
692 If -maix-struct-return or -msvr4-struct-return was explicitly
693 used, don't override with the ABI default. */
694 if (!(target_flags & MASK_AIX_STRUCT_RET_SET))
695 {
696 if (DEFAULT_ABI == ABI_V4 && !DRAFT_V4_STRUCT_RET)
697 target_flags = (target_flags & ~MASK_AIX_STRUCT_RET);
698 else
699 target_flags |= MASK_AIX_STRUCT_RET;
700 }
701
c8023011
MM
702 /* Register global variables with the garbage collector. */
703 rs6000_add_gc_roots ();
9ebbca7d
GK
704
705 /* Allocate an alias set for register saves & restores from stack. */
706 rs6000_sr_alias_set = new_alias_set ();
707
708 if (TARGET_TOC)
709 ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
71f123ca 710
301d03af
RS
711 /* We can only guarantee the availability of DI pseudo-ops when
712 assembling for 64-bit targets. */
ae6c1efd 713 if (!TARGET_64BIT)
301d03af
RS
714 {
715 targetm.asm_out.aligned_op.di = NULL;
716 targetm.asm_out.unaligned_op.di = NULL;
717 }
718
71f123ca
FS
719 /* Arrange to save and restore machine status around nested functions. */
720 init_machine_status = rs6000_init_machine_status;
5248c961 721}
5accd822 722
a3170dc6
AH
723/* Handle -misel= option. */
724static void
725rs6000_parse_isel_option ()
726{
727 if (rs6000_isel_string == 0)
728 return;
729 else if (! strcmp (rs6000_isel_string, "yes"))
730 rs6000_isel = 1;
731 else if (! strcmp (rs6000_isel_string, "no"))
732 rs6000_isel = 0;
733 else
734 error ("unknown -misel= option specified: '%s'",
735 rs6000_isel_string);
736}
737
08b57fb3
AH
738/* Handle -mvrsave= options. */
739static void
740rs6000_parse_vrsave_option ()
741{
742 /* Generate VRSAVE instructions by default. */
743 if (rs6000_altivec_vrsave_string == 0
744 || ! strcmp (rs6000_altivec_vrsave_string, "yes"))
745 rs6000_altivec_vrsave = 1;
746 else if (! strcmp (rs6000_altivec_vrsave_string, "no"))
747 rs6000_altivec_vrsave = 0;
748 else
749 error ("unknown -mvrsave= option specified: '%s'",
750 rs6000_altivec_vrsave_string);
751}
752
0ac081f6 753/* Handle -mabi= options. */
00b960c7
AH
754static void
755rs6000_parse_abi_options ()
0ac081f6
AH
756{
757 if (rs6000_abi_string == 0)
758 return;
759 else if (! strcmp (rs6000_abi_string, "altivec"))
6fa3f289 760 rs6000_altivec_abi = 1;
76a773f3
AH
761 else if (! strcmp (rs6000_abi_string, "no-altivec"))
762 rs6000_altivec_abi = 0;
a3170dc6
AH
763 else if (! strcmp (rs6000_abi_string, "spe"))
764 rs6000_spe_abi = 1;
765 else if (! strcmp (rs6000_abi_string, "no-spe"))
766 rs6000_spe_abi = 0;
0ac081f6 767 else
c725bd79 768 error ("unknown ABI specified: '%s'", rs6000_abi_string);
0ac081f6
AH
769}
770
5accd822
DE
771void
772optimization_options (level, size)
e2c953b6 773 int level ATTRIBUTE_UNUSED;
5accd822
DE
774 int size ATTRIBUTE_UNUSED;
775{
5accd822 776}
3cfa4909
MM
777\f
778/* Do anything needed at the start of the asm file. */
779
780void
781rs6000_file_start (file, default_cpu)
782 FILE *file;
d330fd93 783 const char *default_cpu;
3cfa4909 784{
c4d38ccb 785 size_t i;
3cfa4909 786 char buffer[80];
d330fd93 787 const char *start = buffer;
3cfa4909
MM
788 struct rs6000_cpu_select *ptr;
789
790 if (flag_verbose_asm)
791 {
792 sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
793 rs6000_select[0].string = default_cpu;
794
b6a1cbae 795 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
3cfa4909
MM
796 {
797 ptr = &rs6000_select[i];
798 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
799 {
800 fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
801 start = "";
802 }
803 }
804
b91da81f 805#ifdef USING_ELFOS_H
3cfa4909
MM
806 switch (rs6000_sdata)
807 {
808 case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
809 case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
810 case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
811 case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
812 }
813
814 if (rs6000_sdata && g_switch_value)
815 {
816 fprintf (file, "%s -G %d", start, g_switch_value);
817 start = "";
818 }
819#endif
820
821 if (*start == '\0')
949ea356 822 putc ('\n', file);
3cfa4909
MM
823 }
824}
5248c961 825\f
9878760c
RK
826/* Return non-zero if this function is known to have a null epilogue. */
827
828int
829direct_return ()
830{
4697a36c
MM
831 if (reload_completed)
832 {
833 rs6000_stack_t *info = rs6000_stack_info ();
834
835 if (info->first_gp_reg_save == 32
836 && info->first_fp_reg_save == 64
00b960c7 837 && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
c81fc13e
DE
838 && ! info->lr_save_p
839 && ! info->cr_save_p
00b960c7 840 && info->vrsave_mask == 0
c81fc13e 841 && ! info->push_p)
4697a36c
MM
842 return 1;
843 }
844
845 return 0;
9878760c
RK
846}
847
848/* Returns 1 always. */
849
850int
851any_operand (op, mode)
592696dd 852 rtx op ATTRIBUTE_UNUSED;
296b8152 853 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
854{
855 return 1;
856}
857
a4f6c312 858/* Returns 1 if op is the count register. */
38c1f2d7 859int
a4f6c312 860count_register_operand (op, mode)
592696dd 861 rtx op;
296b8152 862 enum machine_mode mode ATTRIBUTE_UNUSED;
b6c9286a
MM
863{
864 if (GET_CODE (op) != REG)
865 return 0;
866
867 if (REGNO (op) == COUNT_REGISTER_REGNUM)
868 return 1;
869
870 if (REGNO (op) > FIRST_PSEUDO_REGISTER)
871 return 1;
872
873 return 0;
874}
875
0ec4e2a8
AH
876/* Returns 1 if op is an altivec register. */
877int
878altivec_register_operand (op, mode)
879 rtx op;
880 enum machine_mode mode ATTRIBUTE_UNUSED;
881{
882
883 return (register_operand (op, mode)
884 && (GET_CODE (op) != REG
885 || REGNO (op) > FIRST_PSEUDO_REGISTER
886 || ALTIVEC_REGNO_P (REGNO (op))));
887}
888
38c1f2d7 889int
a4f6c312 890xer_operand (op, mode)
592696dd 891 rtx op;
296b8152 892 enum machine_mode mode ATTRIBUTE_UNUSED;
802a0058
MM
893{
894 if (GET_CODE (op) != REG)
895 return 0;
896
9ebbca7d 897 if (XER_REGNO_P (REGNO (op)))
802a0058
MM
898 return 1;
899
802a0058
MM
900 return 0;
901}
902
c859cda6 903/* Return 1 if OP is a signed 8-bit constant. Int multiplication
6f317ef3 904 by such constants completes more quickly. */
c859cda6
DJ
905
906int
907s8bit_cint_operand (op, mode)
908 rtx op;
909 enum machine_mode mode ATTRIBUTE_UNUSED;
910{
911 return ( GET_CODE (op) == CONST_INT
912 && (INTVAL (op) >= -128 && INTVAL (op) <= 127));
913}
914
9878760c
RK
915/* Return 1 if OP is a constant that can fit in a D field. */
916
917int
918short_cint_operand (op, mode)
592696dd 919 rtx op;
296b8152 920 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c 921{
5f59ecb7
DE
922 return (GET_CODE (op) == CONST_INT
923 && CONST_OK_FOR_LETTER_P (INTVAL (op), 'I'));
9878760c
RK
924}
925
5519a4f9 926/* Similar for an unsigned D field. */
9878760c
RK
927
928int
929u_short_cint_operand (op, mode)
592696dd 930 rtx op;
296b8152 931 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c 932{
19684119 933 return (GET_CODE (op) == CONST_INT
c1f11548 934 && CONST_OK_FOR_LETTER_P (INTVAL (op) & GET_MODE_MASK (mode), 'K'));
9878760c
RK
935}
936
dcfedcd0
RK
937/* Return 1 if OP is a CONST_INT that cannot fit in a signed D field. */
938
939int
940non_short_cint_operand (op, mode)
592696dd 941 rtx op;
296b8152 942 enum machine_mode mode ATTRIBUTE_UNUSED;
dcfedcd0
RK
943{
944 return (GET_CODE (op) == CONST_INT
a7653a2c 945 && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x8000) >= 0x10000);
dcfedcd0
RK
946}
947
2bfcf297
DB
948/* Returns 1 if OP is a CONST_INT that is a positive value
949 and an exact power of 2. */
950
951int
952exact_log2_cint_operand (op, mode)
592696dd 953 rtx op;
2bfcf297
DB
954 enum machine_mode mode ATTRIBUTE_UNUSED;
955{
956 return (GET_CODE (op) == CONST_INT
957 && INTVAL (op) > 0
958 && exact_log2 (INTVAL (op)) >= 0);
959}
960
9878760c
RK
961/* Returns 1 if OP is a register that is not special (i.e., not MQ,
962 ctr, or lr). */
963
964int
cd2b37d9 965gpc_reg_operand (op, mode)
592696dd 966 rtx op;
9878760c
RK
967 enum machine_mode mode;
968{
969 return (register_operand (op, mode)
802a0058 970 && (GET_CODE (op) != REG
9ebbca7d
GK
971 || (REGNO (op) >= ARG_POINTER_REGNUM
972 && !XER_REGNO_P (REGNO (op)))
973 || REGNO (op) < MQ_REGNO));
9878760c
RK
974}
975
976/* Returns 1 if OP is either a pseudo-register or a register denoting a
977 CR field. */
978
979int
980cc_reg_operand (op, mode)
592696dd 981 rtx op;
9878760c
RK
982 enum machine_mode mode;
983{
984 return (register_operand (op, mode)
985 && (GET_CODE (op) != REG
986 || REGNO (op) >= FIRST_PSEUDO_REGISTER
987 || CR_REGNO_P (REGNO (op))));
988}
989
815cdc52
MM
990/* Returns 1 if OP is either a pseudo-register or a register denoting a
991 CR field that isn't CR0. */
992
993int
994cc_reg_not_cr0_operand (op, mode)
592696dd 995 rtx op;
815cdc52
MM
996 enum machine_mode mode;
997{
998 return (register_operand (op, mode)
999 && (GET_CODE (op) != REG
1000 || REGNO (op) >= FIRST_PSEUDO_REGISTER
1001 || CR_REGNO_NOT_CR0_P (REGNO (op))));
1002}
1003
a4f6c312
SS
1004/* Returns 1 if OP is either a constant integer valid for a D-field or
1005 a non-special register. If a register, it must be in the proper
1006 mode unless MODE is VOIDmode. */
9878760c
RK
1007
1008int
1009reg_or_short_operand (op, mode)
592696dd 1010 rtx op;
9878760c
RK
1011 enum machine_mode mode;
1012{
f5a28898 1013 return short_cint_operand (op, mode) || gpc_reg_operand (op, mode);
9878760c
RK
1014}
1015
a4f6c312
SS
1016/* Similar, except check if the negation of the constant would be
1017 valid for a D-field. */
9878760c
RK
1018
1019int
1020reg_or_neg_short_operand (op, mode)
592696dd 1021 rtx op;
9878760c
RK
1022 enum machine_mode mode;
1023{
1024 if (GET_CODE (op) == CONST_INT)
1025 return CONST_OK_FOR_LETTER_P (INTVAL (op), 'P');
1026
cd2b37d9 1027 return gpc_reg_operand (op, mode);
9878760c
RK
1028}
1029
768070a0
TR
1030/* Returns 1 if OP is either a constant integer valid for a DS-field or
1031 a non-special register. If a register, it must be in the proper
1032 mode unless MODE is VOIDmode. */
1033
1034int
1035reg_or_aligned_short_operand (op, mode)
1036 rtx op;
1037 enum machine_mode mode;
1038{
1039 if (gpc_reg_operand (op, mode))
1040 return 1;
1041 else if (short_cint_operand (op, mode) && !(INTVAL (op) & 3))
1042 return 1;
1043
1044 return 0;
1045}
1046
1047
a4f6c312
SS
1048/* Return 1 if the operand is either a register or an integer whose
1049 high-order 16 bits are zero. */
9878760c
RK
1050
1051int
1052reg_or_u_short_operand (op, mode)
592696dd 1053 rtx op;
9878760c
RK
1054 enum machine_mode mode;
1055{
e675f625 1056 return u_short_cint_operand (op, mode) || gpc_reg_operand (op, mode);
9878760c
RK
1057}
1058
1059/* Return 1 is the operand is either a non-special register or ANY
1060 constant integer. */
1061
1062int
1063reg_or_cint_operand (op, mode)
592696dd 1064 rtx op;
9878760c
RK
1065 enum machine_mode mode;
1066{
a4f6c312 1067 return (GET_CODE (op) == CONST_INT || gpc_reg_operand (op, mode));
f6bf7de2
DE
1068}
1069
1070/* Return 1 is the operand is either a non-special register or ANY
1071 32-bit signed constant integer. */
1072
1073int
1074reg_or_arith_cint_operand (op, mode)
592696dd 1075 rtx op;
f6bf7de2
DE
1076 enum machine_mode mode;
1077{
a4f6c312
SS
1078 return (gpc_reg_operand (op, mode)
1079 || (GET_CODE (op) == CONST_INT
f6bf7de2 1080#if HOST_BITS_PER_WIDE_INT != 32
a4f6c312
SS
1081 && ((unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80000000)
1082 < (unsigned HOST_WIDE_INT) 0x100000000ll)
f6bf7de2 1083#endif
a4f6c312 1084 ));
9878760c
RK
1085}
1086
2bfcf297
DB
1087/* Return 1 is the operand is either a non-special register or a 32-bit
1088 signed constant integer valid for 64-bit addition. */
1089
1090int
1091reg_or_add_cint64_operand (op, mode)
592696dd 1092 rtx op;
2bfcf297
DB
1093 enum machine_mode mode;
1094{
a4f6c312
SS
1095 return (gpc_reg_operand (op, mode)
1096 || (GET_CODE (op) == CONST_INT
a65c591c 1097#if HOST_BITS_PER_WIDE_INT == 32
a4f6c312 1098 && INTVAL (op) < 0x7fff8000
a65c591c 1099#else
a4f6c312
SS
1100 && ((unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80008000)
1101 < 0x100000000ll)
2bfcf297 1102#endif
a4f6c312 1103 ));
2bfcf297
DB
1104}
1105
1106/* Return 1 is the operand is either a non-special register or a 32-bit
1107 signed constant integer valid for 64-bit subtraction. */
1108
1109int
1110reg_or_sub_cint64_operand (op, mode)
592696dd 1111 rtx op;
2bfcf297
DB
1112 enum machine_mode mode;
1113{
a4f6c312
SS
1114 return (gpc_reg_operand (op, mode)
1115 || (GET_CODE (op) == CONST_INT
a65c591c 1116#if HOST_BITS_PER_WIDE_INT == 32
a4f6c312 1117 && (- INTVAL (op)) < 0x7fff8000
a65c591c 1118#else
a4f6c312
SS
1119 && ((unsigned HOST_WIDE_INT) ((- INTVAL (op)) + 0x80008000)
1120 < 0x100000000ll)
2bfcf297 1121#endif
a4f6c312 1122 ));
2bfcf297
DB
1123}
1124
9ebbca7d
GK
1125/* Return 1 is the operand is either a non-special register or ANY
1126 32-bit unsigned constant integer. */
1127
1128int
1d328b19 1129reg_or_logical_cint_operand (op, mode)
592696dd 1130 rtx op;
9ebbca7d
GK
1131 enum machine_mode mode;
1132{
1d328b19
GK
1133 if (GET_CODE (op) == CONST_INT)
1134 {
1135 if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
1136 {
1137 if (GET_MODE_BITSIZE (mode) <= 32)
a4f6c312 1138 abort ();
1d328b19
GK
1139
1140 if (INTVAL (op) < 0)
1141 return 0;
1142 }
1143
1144 return ((INTVAL (op) & GET_MODE_MASK (mode)
0858c623 1145 & (~ (unsigned HOST_WIDE_INT) 0xffffffff)) == 0);
1d328b19
GK
1146 }
1147 else if (GET_CODE (op) == CONST_DOUBLE)
1148 {
1149 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
1150 || mode != DImode)
a4f6c312 1151 abort ();
1d328b19
GK
1152
1153 return CONST_DOUBLE_HIGH (op) == 0;
1154 }
1155 else
1156 return gpc_reg_operand (op, mode);
9ebbca7d
GK
1157}
1158
51d3e7d6 1159/* Return 1 if the operand is an operand that can be loaded via the GOT. */
766a866c
MM
1160
1161int
1162got_operand (op, mode)
592696dd 1163 rtx op;
296b8152 1164 enum machine_mode mode ATTRIBUTE_UNUSED;
766a866c
MM
1165{
1166 return (GET_CODE (op) == SYMBOL_REF
1167 || GET_CODE (op) == CONST
1168 || GET_CODE (op) == LABEL_REF);
1169}
1170
38c1f2d7
MM
1171/* Return 1 if the operand is a simple references that can be loaded via
1172 the GOT (labels involving addition aren't allowed). */
1173
1174int
1175got_no_const_operand (op, mode)
592696dd 1176 rtx op;
296b8152 1177 enum machine_mode mode ATTRIBUTE_UNUSED;
38c1f2d7
MM
1178{
1179 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF);
1180}
1181
4e74d8ec
MM
1182/* Return the number of instructions it takes to form a constant in an
1183 integer register. */
1184
1185static int
1186num_insns_constant_wide (value)
1187 HOST_WIDE_INT value;
1188{
1189 /* signed constant loadable with {cal|addi} */
5f59ecb7 1190 if (CONST_OK_FOR_LETTER_P (value, 'I'))
0865c631
GK
1191 return 1;
1192
4e74d8ec 1193 /* constant loadable with {cau|addis} */
5f59ecb7 1194 else if (CONST_OK_FOR_LETTER_P (value, 'L'))
4e74d8ec
MM
1195 return 1;
1196
5f59ecb7 1197#if HOST_BITS_PER_WIDE_INT == 64
c81fc13e 1198 else if (TARGET_POWERPC64)
4e74d8ec 1199 {
a65c591c
DE
1200 HOST_WIDE_INT low = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
1201 HOST_WIDE_INT high = value >> 31;
4e74d8ec 1202
a65c591c 1203 if (high == 0 || high == -1)
4e74d8ec
MM
1204 return 2;
1205
a65c591c 1206 high >>= 1;
4e74d8ec 1207
a65c591c 1208 if (low == 0)
4e74d8ec 1209 return num_insns_constant_wide (high) + 1;
4e74d8ec
MM
1210 else
1211 return (num_insns_constant_wide (high)
e396202a 1212 + num_insns_constant_wide (low) + 1);
4e74d8ec
MM
1213 }
1214#endif
1215
1216 else
1217 return 2;
1218}
1219
1220int
1221num_insns_constant (op, mode)
1222 rtx op;
1223 enum machine_mode mode;
1224{
4e74d8ec 1225 if (GET_CODE (op) == CONST_INT)
0d30d435
DE
1226 {
1227#if HOST_BITS_PER_WIDE_INT == 64
4e2c1c44
DE
1228 if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
1229 && mask64_operand (op, mode))
0d30d435
DE
1230 return 2;
1231 else
1232#endif
1233 return num_insns_constant_wide (INTVAL (op));
1234 }
4e74d8ec 1235
6fc48950
MM
1236 else if (GET_CODE (op) == CONST_DOUBLE && mode == SFmode)
1237 {
1238 long l;
1239 REAL_VALUE_TYPE rv;
1240
1241 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1242 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
e72247f4 1243 return num_insns_constant_wide ((HOST_WIDE_INT) l);
6fc48950
MM
1244 }
1245
47ad8c61 1246 else if (GET_CODE (op) == CONST_DOUBLE)
4e74d8ec 1247 {
47ad8c61
MM
1248 HOST_WIDE_INT low;
1249 HOST_WIDE_INT high;
1250 long l[2];
1251 REAL_VALUE_TYPE rv;
1252 int endian = (WORDS_BIG_ENDIAN == 0);
4e74d8ec 1253
47ad8c61
MM
1254 if (mode == VOIDmode || mode == DImode)
1255 {
1256 high = CONST_DOUBLE_HIGH (op);
1257 low = CONST_DOUBLE_LOW (op);
1258 }
1259 else
1260 {
1261 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1262 REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
1263 high = l[endian];
1264 low = l[1 - endian];
1265 }
4e74d8ec 1266
47ad8c61
MM
1267 if (TARGET_32BIT)
1268 return (num_insns_constant_wide (low)
1269 + num_insns_constant_wide (high));
4e74d8ec
MM
1270
1271 else
47ad8c61 1272 {
e72247f4 1273 if (high == 0 && low >= 0)
47ad8c61
MM
1274 return num_insns_constant_wide (low);
1275
e72247f4 1276 else if (high == -1 && low < 0)
47ad8c61
MM
1277 return num_insns_constant_wide (low);
1278
a260abc9
DE
1279 else if (mask64_operand (op, mode))
1280 return 2;
1281
47ad8c61
MM
1282 else if (low == 0)
1283 return num_insns_constant_wide (high) + 1;
1284
1285 else
1286 return (num_insns_constant_wide (high)
1287 + num_insns_constant_wide (low) + 1);
1288 }
4e74d8ec
MM
1289 }
1290
1291 else
1292 abort ();
1293}
1294
a4f6c312
SS
1295/* Return 1 if the operand is a CONST_DOUBLE and it can be put into a
1296 register with one instruction per word. We only do this if we can
1297 safely read CONST_DOUBLE_{LOW,HIGH}. */
9878760c
RK
1298
1299int
1300easy_fp_constant (op, mode)
592696dd
SS
1301 rtx op;
1302 enum machine_mode mode;
9878760c 1303{
9878760c
RK
1304 if (GET_CODE (op) != CONST_DOUBLE
1305 || GET_MODE (op) != mode
4e74d8ec 1306 || (GET_MODE_CLASS (mode) != MODE_FLOAT && mode != DImode))
9878760c
RK
1307 return 0;
1308
a4f6c312 1309 /* Consider all constants with -msoft-float to be easy. */
a3170dc6
AH
1310 if ((TARGET_SOFT_FLOAT || !TARGET_FPRS)
1311 && mode != DImode)
b6c9286a
MM
1312 return 1;
1313
a4f6c312 1314 /* If we are using V.4 style PIC, consider all constants to be hard. */
f607bc57 1315 if (flag_pic && DEFAULT_ABI == ABI_V4)
a7273471
MM
1316 return 0;
1317
5ae4759c 1318#ifdef TARGET_RELOCATABLE
a4f6c312
SS
1319 /* Similarly if we are using -mrelocatable, consider all constants
1320 to be hard. */
5ae4759c
MM
1321 if (TARGET_RELOCATABLE)
1322 return 0;
1323#endif
1324
042259f2
DE
1325 if (mode == DFmode)
1326 {
1327 long k[2];
1328 REAL_VALUE_TYPE rv;
1329
1330 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1331 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
9878760c 1332
a65c591c
DE
1333 return (num_insns_constant_wide ((HOST_WIDE_INT) k[0]) == 1
1334 && num_insns_constant_wide ((HOST_WIDE_INT) k[1]) == 1);
042259f2 1335 }
4e74d8ec
MM
1336
1337 else if (mode == SFmode)
042259f2
DE
1338 {
1339 long l;
1340 REAL_VALUE_TYPE rv;
1341
1342 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1343 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
9878760c 1344
4e74d8ec 1345 return num_insns_constant_wide (l) == 1;
042259f2 1346 }
4e74d8ec 1347
a260abc9 1348 else if (mode == DImode)
c81fc13e 1349 return ((TARGET_POWERPC64
a260abc9
DE
1350 && GET_CODE (op) == CONST_DOUBLE && CONST_DOUBLE_LOW (op) == 0)
1351 || (num_insns_constant (op, DImode) <= 2));
4e74d8ec 1352
a9098fd0
GK
1353 else if (mode == SImode)
1354 return 1;
4e74d8ec
MM
1355 else
1356 abort ();
9878760c 1357}
8f75773e 1358
69ef87e2
AH
1359/* Return 1 if the operand is a CONST_INT and can be put into a
1360 register with one instruction. */
1361
1362static int
1363easy_vector_constant (op)
1364 rtx op;
1365{
1366 rtx elt;
1367 int units, i;
1368
1369 if (GET_CODE (op) != CONST_VECTOR)
1370 return 0;
1371
1372 units = CONST_VECTOR_NUNITS (op);
1373
1374 /* We can generate 0 easily. Look for that. */
1375 for (i = 0; i < units; ++i)
1376 {
1377 elt = CONST_VECTOR_ELT (op, i);
1378
1379 /* We could probably simplify this by just checking for equality
1380 with CONST0_RTX for the current mode, but let's be safe
1381 instead. */
1382
98ef3137
JJ
1383 switch (GET_CODE (elt))
1384 {
1385 case CONST_INT:
1386 if (INTVAL (elt) != 0)
1387 return 0;
1388 break;
1389 case CONST_DOUBLE:
1390 if (CONST_DOUBLE_LOW (elt) != 0 || CONST_DOUBLE_HIGH (elt) != 0)
1391 return 0;
1392 break;
1393 default:
1394 return 0;
1395 }
69ef87e2
AH
1396 }
1397
1398 /* We could probably generate a few other constants trivially, but
1399 gcc doesn't generate them yet. FIXME later. */
98ef3137 1400 return 1;
69ef87e2
AH
1401}
1402
1403/* Return 1 if the operand is the constant 0. This works for scalars
1404 as well as vectors. */
1405int
1406zero_constant (op, mode)
1407 rtx op;
1408 enum machine_mode mode;
1409{
1410 return op == CONST0_RTX (mode);
1411}
1412
50a0b056
GK
1413/* Return 1 if the operand is 0.0. */
1414int
1415zero_fp_constant (op, mode)
592696dd
SS
1416 rtx op;
1417 enum machine_mode mode;
50a0b056
GK
1418{
1419 return GET_MODE_CLASS (mode) == MODE_FLOAT && op == CONST0_RTX (mode);
1420}
1421
a4f6c312
SS
1422/* Return 1 if the operand is in volatile memory. Note that during
1423 the RTL generation phase, memory_operand does not return TRUE for
b6c9286a
MM
1424 volatile memory references. So this function allows us to
1425 recognize volatile references where its safe. */
1426
1427int
1428volatile_mem_operand (op, mode)
592696dd 1429 rtx op;
b6c9286a
MM
1430 enum machine_mode mode;
1431{
1432 if (GET_CODE (op) != MEM)
1433 return 0;
1434
1435 if (!MEM_VOLATILE_P (op))
1436 return 0;
1437
1438 if (mode != GET_MODE (op))
1439 return 0;
1440
1441 if (reload_completed)
1442 return memory_operand (op, mode);
1443
1444 if (reload_in_progress)
1445 return strict_memory_address_p (mode, XEXP (op, 0));
1446
1447 return memory_address_p (mode, XEXP (op, 0));
1448}
1449
97f6e72f 1450/* Return 1 if the operand is an offsettable memory operand. */
914c2e77
RK
1451
1452int
97f6e72f 1453offsettable_mem_operand (op, mode)
592696dd 1454 rtx op;
914c2e77
RK
1455 enum machine_mode mode;
1456{
97f6e72f 1457 return ((GET_CODE (op) == MEM)
677a9668 1458 && offsettable_address_p (reload_completed || reload_in_progress,
97f6e72f 1459 mode, XEXP (op, 0)));
914c2e77
RK
1460}
1461
9878760c
RK
1462/* Return 1 if the operand is either an easy FP constant (see above) or
1463 memory. */
1464
1465int
1466mem_or_easy_const_operand (op, mode)
592696dd 1467 rtx op;
9878760c
RK
1468 enum machine_mode mode;
1469{
1470 return memory_operand (op, mode) || easy_fp_constant (op, mode);
1471}
1472
1473/* Return 1 if the operand is either a non-special register or an item
5f59ecb7 1474 that can be used as the operand of a `mode' add insn. */
9878760c
RK
1475
1476int
1477add_operand (op, mode)
592696dd 1478 rtx op;
9878760c
RK
1479 enum machine_mode mode;
1480{
2bfcf297 1481 if (GET_CODE (op) == CONST_INT)
e72247f4
DE
1482 return (CONST_OK_FOR_LETTER_P (INTVAL (op), 'I')
1483 || CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'));
2bfcf297
DB
1484
1485 return gpc_reg_operand (op, mode);
9878760c
RK
1486}
1487
dcfedcd0
RK
1488/* Return 1 if OP is a constant but not a valid add_operand. */
1489
1490int
1491non_add_cint_operand (op, mode)
592696dd 1492 rtx op;
296b8152 1493 enum machine_mode mode ATTRIBUTE_UNUSED;
dcfedcd0
RK
1494{
1495 return (GET_CODE (op) == CONST_INT
e72247f4
DE
1496 && !CONST_OK_FOR_LETTER_P (INTVAL (op), 'I')
1497 && !CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'));
dcfedcd0
RK
1498}
1499
9878760c
RK
1500/* Return 1 if the operand is a non-special register or a constant that
1501 can be used as the operand of an OR or XOR insn on the RS/6000. */
1502
1503int
1504logical_operand (op, mode)
592696dd 1505 rtx op;
9878760c
RK
1506 enum machine_mode mode;
1507{
40501e5f 1508 HOST_WIDE_INT opl, oph;
1d328b19 1509
dfbdccdb
GK
1510 if (gpc_reg_operand (op, mode))
1511 return 1;
1d328b19 1512
dfbdccdb 1513 if (GET_CODE (op) == CONST_INT)
40501e5f
AM
1514 {
1515 opl = INTVAL (op) & GET_MODE_MASK (mode);
1516
1517#if HOST_BITS_PER_WIDE_INT <= 32
1518 if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT && opl < 0)
1519 return 0;
1520#endif
1521 }
dfbdccdb
GK
1522 else if (GET_CODE (op) == CONST_DOUBLE)
1523 {
1d328b19 1524 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
40501e5f 1525 abort ();
1d328b19
GK
1526
1527 opl = CONST_DOUBLE_LOW (op);
1528 oph = CONST_DOUBLE_HIGH (op);
40501e5f 1529 if (oph != 0)
38886f37 1530 return 0;
dfbdccdb
GK
1531 }
1532 else
1533 return 0;
1d328b19 1534
40501e5f
AM
1535 return ((opl & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0
1536 || (opl & ~ (unsigned HOST_WIDE_INT) 0xffff0000) == 0);
9878760c
RK
1537}
1538
dcfedcd0 1539/* Return 1 if C is a constant that is not a logical operand (as
1d328b19 1540 above), but could be split into one. */
dcfedcd0
RK
1541
1542int
1543non_logical_cint_operand (op, mode)
592696dd 1544 rtx op;
5f59ecb7 1545 enum machine_mode mode;
dcfedcd0 1546{
dfbdccdb 1547 return ((GET_CODE (op) == CONST_INT || GET_CODE (op) == CONST_DOUBLE)
1d328b19
GK
1548 && ! logical_operand (op, mode)
1549 && reg_or_logical_cint_operand (op, mode));
dcfedcd0
RK
1550}
1551
19ba8161 1552/* Return 1 if C is a constant that can be encoded in a 32-bit mask on the
9878760c
RK
1553 RS/6000. It is if there are no more than two 1->0 or 0->1 transitions.
1554 Reject all ones and all zeros, since these should have been optimized
1555 away and confuse the making of MB and ME. */
1556
1557int
19ba8161 1558mask_operand (op, mode)
592696dd 1559 rtx op;
19ba8161 1560 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c 1561{
02071907 1562 HOST_WIDE_INT c, lsb;
9878760c 1563
19ba8161
DE
1564 if (GET_CODE (op) != CONST_INT)
1565 return 0;
1566
1567 c = INTVAL (op);
1568
57deb3a1
AM
1569 /* Fail in 64-bit mode if the mask wraps around because the upper
1570 32-bits of the mask will all be 1s, contrary to GCC's internal view. */
1571 if (TARGET_POWERPC64 && (c & 0x80000001) == 0x80000001)
1572 return 0;
1573
c5059423
AM
1574 /* We don't change the number of transitions by inverting,
1575 so make sure we start with the LS bit zero. */
1576 if (c & 1)
1577 c = ~c;
1578
1579 /* Reject all zeros or all ones. */
1580 if (c == 0)
9878760c
RK
1581 return 0;
1582
c5059423
AM
1583 /* Find the first transition. */
1584 lsb = c & -c;
1585
1586 /* Invert to look for a second transition. */
1587 c = ~c;
9878760c 1588
c5059423
AM
1589 /* Erase first transition. */
1590 c &= -lsb;
9878760c 1591
c5059423
AM
1592 /* Find the second transition (if any). */
1593 lsb = c & -c;
1594
1595 /* Match if all the bits above are 1's (or c is zero). */
1596 return c == -lsb;
9878760c
RK
1597}
1598
0ba1b2ff
AM
1599/* Return 1 for the PowerPC64 rlwinm corner case. */
1600
1601int
1602mask_operand_wrap (op, mode)
1603 rtx op;
1604 enum machine_mode mode ATTRIBUTE_UNUSED;
1605{
1606 HOST_WIDE_INT c, lsb;
1607
1608 if (GET_CODE (op) != CONST_INT)
1609 return 0;
1610
1611 c = INTVAL (op);
1612
1613 if ((c & 0x80000001) != 0x80000001)
1614 return 0;
1615
1616 c = ~c;
1617 if (c == 0)
1618 return 0;
1619
1620 lsb = c & -c;
1621 c = ~c;
1622 c &= -lsb;
1623 lsb = c & -c;
1624 return c == -lsb;
1625}
1626
a260abc9
DE
1627/* Return 1 if the operand is a constant that is a PowerPC64 mask.
1628 It is if there are no more than one 1->0 or 0->1 transitions.
0ba1b2ff
AM
1629 Reject all zeros, since zero should have been optimized away and
1630 confuses the making of MB and ME. */
9878760c
RK
1631
1632int
a260abc9 1633mask64_operand (op, mode)
592696dd 1634 rtx op;
0ba1b2ff 1635 enum machine_mode mode ATTRIBUTE_UNUSED;
a260abc9
DE
1636{
1637 if (GET_CODE (op) == CONST_INT)
1638 {
02071907 1639 HOST_WIDE_INT c, lsb;
a260abc9 1640
c5059423 1641 c = INTVAL (op);
a260abc9 1642
0ba1b2ff 1643 /* Reject all zeros. */
c5059423 1644 if (c == 0)
e2c953b6
DE
1645 return 0;
1646
0ba1b2ff
AM
1647 /* We don't change the number of transitions by inverting,
1648 so make sure we start with the LS bit zero. */
1649 if (c & 1)
1650 c = ~c;
1651
c5059423
AM
1652 /* Find the transition, and check that all bits above are 1's. */
1653 lsb = c & -c;
1654 return c == -lsb;
e2c953b6 1655 }
0ba1b2ff
AM
1656 return 0;
1657}
1658
1659/* Like mask64_operand, but allow up to three transitions. This
1660 predicate is used by insn patterns that generate two rldicl or
1661 rldicr machine insns. */
1662
1663int
1664mask64_2_operand (op, mode)
1665 rtx op;
1666 enum machine_mode mode ATTRIBUTE_UNUSED;
1667{
1668 if (GET_CODE (op) == CONST_INT)
a260abc9 1669 {
0ba1b2ff 1670 HOST_WIDE_INT c, lsb;
a260abc9 1671
0ba1b2ff 1672 c = INTVAL (op);
a260abc9 1673
0ba1b2ff
AM
1674 /* Disallow all zeros. */
1675 if (c == 0)
1676 return 0;
a260abc9 1677
0ba1b2ff
AM
1678 /* We don't change the number of transitions by inverting,
1679 so make sure we start with the LS bit zero. */
1680 if (c & 1)
1681 c = ~c;
a260abc9 1682
0ba1b2ff
AM
1683 /* Find the first transition. */
1684 lsb = c & -c;
a260abc9 1685
0ba1b2ff
AM
1686 /* Invert to look for a second transition. */
1687 c = ~c;
1688
1689 /* Erase first transition. */
1690 c &= -lsb;
1691
1692 /* Find the second transition. */
1693 lsb = c & -c;
1694
1695 /* Invert to look for a third transition. */
1696 c = ~c;
1697
1698 /* Erase second transition. */
1699 c &= -lsb;
1700
1701 /* Find the third transition (if any). */
1702 lsb = c & -c;
1703
1704 /* Match if all the bits above are 1's (or c is zero). */
1705 return c == -lsb;
1706 }
1707 return 0;
1708}
1709
1710/* Generates shifts and masks for a pair of rldicl or rldicr insns to
1711 implement ANDing by the mask IN. */
1712void
1713build_mask64_2_operands (in, out)
1714 rtx in;
1715 rtx *out;
1716{
1717#if HOST_BITS_PER_WIDE_INT >= 64
1718 unsigned HOST_WIDE_INT c, lsb, m1, m2;
1719 int shift;
1720
1721 if (GET_CODE (in) != CONST_INT)
1722 abort ();
1723
1724 c = INTVAL (in);
1725 if (c & 1)
1726 {
1727 /* Assume c initially something like 0x00fff000000fffff. The idea
1728 is to rotate the word so that the middle ^^^^^^ group of zeros
1729 is at the MS end and can be cleared with an rldicl mask. We then
1730 rotate back and clear off the MS ^^ group of zeros with a
1731 second rldicl. */
1732 c = ~c; /* c == 0xff000ffffff00000 */
1733 lsb = c & -c; /* lsb == 0x0000000000100000 */
1734 m1 = -lsb; /* m1 == 0xfffffffffff00000 */
1735 c = ~c; /* c == 0x00fff000000fffff */
1736 c &= -lsb; /* c == 0x00fff00000000000 */
1737 lsb = c & -c; /* lsb == 0x0000100000000000 */
1738 c = ~c; /* c == 0xff000fffffffffff */
1739 c &= -lsb; /* c == 0xff00000000000000 */
1740 shift = 0;
1741 while ((lsb >>= 1) != 0)
1742 shift++; /* shift == 44 on exit from loop */
1743 m1 <<= 64 - shift; /* m1 == 0xffffff0000000000 */
1744 m1 = ~m1; /* m1 == 0x000000ffffffffff */
1745 m2 = ~c; /* m2 == 0x00ffffffffffffff */
a260abc9
DE
1746 }
1747 else
0ba1b2ff
AM
1748 {
1749 /* Assume c initially something like 0xff000f0000000000. The idea
1750 is to rotate the word so that the ^^^ middle group of zeros
1751 is at the LS end and can be cleared with an rldicr mask. We then
1752 rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
1753 a second rldicr. */
1754 lsb = c & -c; /* lsb == 0x0000010000000000 */
1755 m2 = -lsb; /* m2 == 0xffffff0000000000 */
1756 c = ~c; /* c == 0x00fff0ffffffffff */
1757 c &= -lsb; /* c == 0x00fff00000000000 */
1758 lsb = c & -c; /* lsb == 0x0000100000000000 */
1759 c = ~c; /* c == 0xff000fffffffffff */
1760 c &= -lsb; /* c == 0xff00000000000000 */
1761 shift = 0;
1762 while ((lsb >>= 1) != 0)
1763 shift++; /* shift == 44 on exit from loop */
1764 m1 = ~c; /* m1 == 0x00ffffffffffffff */
1765 m1 >>= shift; /* m1 == 0x0000000000000fff */
1766 m1 = ~m1; /* m1 == 0xfffffffffffff000 */
1767 }
1768
1769 /* Note that when we only have two 0->1 and 1->0 transitions, one of the
1770 masks will be all 1's. We are guaranteed more than one transition. */
1771 out[0] = GEN_INT (64 - shift);
1772 out[1] = GEN_INT (m1);
1773 out[2] = GEN_INT (shift);
1774 out[3] = GEN_INT (m2);
1775#else
1776 abort ();
1777#endif
a260abc9
DE
1778}
1779
1780/* Return 1 if the operand is either a non-special register or a constant
1781 that can be used as the operand of a PowerPC64 logical AND insn. */
1782
1783int
1784and64_operand (op, mode)
592696dd 1785 rtx op;
9878760c
RK
1786 enum machine_mode mode;
1787{
a4f6c312 1788 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
52d3af72
DE
1789 return (gpc_reg_operand (op, mode) || mask64_operand (op, mode));
1790
1791 return (logical_operand (op, mode) || mask64_operand (op, mode));
9878760c
RK
1792}
1793
0ba1b2ff
AM
1794/* Like the above, but also match constants that can be implemented
1795 with two rldicl or rldicr insns. */
1796
1797int
1798and64_2_operand (op, mode)
1799 rtx op;
1800 enum machine_mode mode;
1801{
1802 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
1803 return gpc_reg_operand (op, mode) || mask64_2_operand (op, mode);
1804
1805 return logical_operand (op, mode) || mask64_2_operand (op, mode);
1806}
1807
a260abc9
DE
1808/* Return 1 if the operand is either a non-special register or a
1809 constant that can be used as the operand of an RS/6000 logical AND insn. */
dcfedcd0
RK
1810
1811int
a260abc9 1812and_operand (op, mode)
592696dd 1813 rtx op;
a260abc9 1814 enum machine_mode mode;
dcfedcd0 1815{
a4f6c312 1816 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
52d3af72
DE
1817 return (gpc_reg_operand (op, mode) || mask_operand (op, mode));
1818
1819 return (logical_operand (op, mode) || mask_operand (op, mode));
dcfedcd0
RK
1820}
1821
9878760c
RK
1822/* Return 1 if the operand is a general register or memory operand. */
1823
1824int
1825reg_or_mem_operand (op, mode)
592696dd
SS
1826 rtx op;
1827 enum machine_mode mode;
9878760c 1828{
b6c9286a
MM
1829 return (gpc_reg_operand (op, mode)
1830 || memory_operand (op, mode)
1831 || volatile_mem_operand (op, mode));
9878760c
RK
1832}
1833
a7a813f7 1834/* Return 1 if the operand is a general register or memory operand without
3cb999d8 1835 pre_inc or pre_dec which produces invalid form of PowerPC lwa
a7a813f7
RK
1836 instruction. */
1837
1838int
1839lwa_operand (op, mode)
592696dd
SS
1840 rtx op;
1841 enum machine_mode mode;
a7a813f7
RK
1842{
1843 rtx inner = op;
1844
1845 if (reload_completed && GET_CODE (inner) == SUBREG)
1846 inner = SUBREG_REG (inner);
1847
1848 return gpc_reg_operand (inner, mode)
1849 || (memory_operand (inner, mode)
1850 && GET_CODE (XEXP (inner, 0)) != PRE_INC
6a40a9d6
DE
1851 && GET_CODE (XEXP (inner, 0)) != PRE_DEC
1852 && (GET_CODE (XEXP (inner, 0)) != PLUS
e903c96a
DE
1853 || GET_CODE (XEXP (XEXP (inner, 0), 1)) != CONST_INT
1854 || INTVAL (XEXP (XEXP (inner, 0), 1)) % 4 == 0));
a7a813f7
RK
1855}
1856
cc4d5fec
JH
1857/* Return 1 if the operand, used inside a MEM, is a SYMBOL_REF. */
1858
1859int
1860symbol_ref_operand (op, mode)
1861 rtx op;
1862 enum machine_mode mode;
1863{
1864 if (mode != VOIDmode && GET_MODE (op) != mode)
1865 return 0;
1866
1867 return (GET_CODE (op) == SYMBOL_REF);
1868}
1869
9878760c 1870/* Return 1 if the operand, used inside a MEM, is a valid first argument
cc4d5fec 1871 to CALL. This is a SYMBOL_REF, a pseudo-register, LR or CTR. */
9878760c
RK
1872
1873int
1874call_operand (op, mode)
592696dd 1875 rtx op;
9878760c
RK
1876 enum machine_mode mode;
1877{
1878 if (mode != VOIDmode && GET_MODE (op) != mode)
1879 return 0;
1880
1881 return (GET_CODE (op) == SYMBOL_REF
cc4d5fec
JH
1882 || (GET_CODE (op) == REG
1883 && (REGNO (op) == LINK_REGISTER_REGNUM
1884 || REGNO (op) == COUNT_REGISTER_REGNUM
1885 || REGNO (op) >= FIRST_PSEUDO_REGISTER)));
9878760c
RK
1886}
1887
2af3d377 1888/* Return 1 if the operand is a SYMBOL_REF for a function known to be in
a4f6c312 1889 this file and the function is not weakly defined. */
2af3d377
RK
1890
1891int
1892current_file_function_operand (op, mode)
592696dd 1893 rtx op;
296b8152 1894 enum machine_mode mode ATTRIBUTE_UNUSED;
2af3d377
RK
1895{
1896 return (GET_CODE (op) == SYMBOL_REF
1897 && (SYMBOL_REF_FLAG (op)
8f1b829e 1898 || (op == XEXP (DECL_RTL (current_function_decl), 0)
c81fc13e 1899 && ! DECL_WEAK (current_function_decl))));
2af3d377
RK
1900}
1901
9878760c
RK
1902/* Return 1 if this operand is a valid input for a move insn. */
1903
1904int
1905input_operand (op, mode)
592696dd 1906 rtx op;
9878760c
RK
1907 enum machine_mode mode;
1908{
eb4e8003 1909 /* Memory is always valid. */
9878760c
RK
1910 if (memory_operand (op, mode))
1911 return 1;
1912
34792e82 1913 /* Only a tiny bit of handling for CONSTANT_P_RTX is necessary. */
01b4cf2b 1914 if (GET_CODE (op) == CONSTANT_P_RTX)
34792e82
JL
1915 return 1;
1916
eb4e8003
RK
1917 /* For floating-point, easy constants are valid. */
1918 if (GET_MODE_CLASS (mode) == MODE_FLOAT
1919 && CONSTANT_P (op)
1920 && easy_fp_constant (op, mode))
1921 return 1;
1922
4e74d8ec
MM
1923 /* Allow any integer constant. */
1924 if (GET_MODE_CLASS (mode) == MODE_INT
e675f625 1925 && (GET_CODE (op) == CONST_INT
e675f625 1926 || GET_CODE (op) == CONST_DOUBLE))
4e74d8ec
MM
1927 return 1;
1928
eb4e8003
RK
1929 /* For floating-point or multi-word mode, the only remaining valid type
1930 is a register. */
9878760c
RK
1931 if (GET_MODE_CLASS (mode) == MODE_FLOAT
1932 || GET_MODE_SIZE (mode) > UNITS_PER_WORD)
eb4e8003 1933 return register_operand (op, mode);
9878760c 1934
88fe15a1
RK
1935 /* The only cases left are integral modes one word or smaller (we
1936 do not get called for MODE_CC values). These can be in any
1937 register. */
1938 if (register_operand (op, mode))
a8b3aeda 1939 return 1;
88fe15a1 1940
84cf9dda 1941 /* A SYMBOL_REF referring to the TOC is valid. */
7fec4abd 1942 if (LEGITIMATE_CONSTANT_POOL_ADDRESS_P (op))
84cf9dda
RK
1943 return 1;
1944
9ebbca7d
GK
1945 /* A constant pool expression (relative to the TOC) is valid */
1946 if (TOC_RELATIVE_EXPR_P (op))
b6c9286a
MM
1947 return 1;
1948
88228c4b
MM
1949 /* V.4 allows SYMBOL_REFs and CONSTs that are in the small data region
1950 to be valid. */
f607bc57 1951 if (DEFAULT_ABI == ABI_V4
88228c4b
MM
1952 && (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST)
1953 && small_data_operand (op, Pmode))
1954 return 1;
1955
042259f2 1956 return 0;
9878760c 1957}
7509c759 1958
a4f6c312 1959/* Return 1 for an operand in small memory on V.4/eabi. */
7509c759
MM
1960
1961int
1962small_data_operand (op, mode)
296b8152
KG
1963 rtx op ATTRIBUTE_UNUSED;
1964 enum machine_mode mode ATTRIBUTE_UNUSED;
7509c759 1965{
38c1f2d7 1966#if TARGET_ELF
5f59ecb7 1967 rtx sym_ref;
7509c759 1968
d9407988 1969 if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
a54d04b7 1970 return 0;
a54d04b7 1971
f607bc57 1972 if (DEFAULT_ABI != ABI_V4)
7509c759
MM
1973 return 0;
1974
88228c4b
MM
1975 if (GET_CODE (op) == SYMBOL_REF)
1976 sym_ref = op;
1977
1978 else if (GET_CODE (op) != CONST
1979 || GET_CODE (XEXP (op, 0)) != PLUS
1980 || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
1981 || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
7509c759
MM
1982 return 0;
1983
88228c4b 1984 else
dbf55e53
MM
1985 {
1986 rtx sum = XEXP (op, 0);
1987 HOST_WIDE_INT summand;
1988
1989 /* We have to be careful here, because it is the referenced address
1990 that must be 32k from _SDA_BASE_, not just the symbol. */
1991 summand = INTVAL (XEXP (sum, 1));
1992 if (summand < 0 || summand > g_switch_value)
1993 return 0;
1994
1995 sym_ref = XEXP (sum, 0);
1996 }
88228c4b
MM
1997
1998 if (*XSTR (sym_ref, 0) != '@')
7509c759
MM
1999 return 0;
2000
2001 return 1;
d9407988
MM
2002
2003#else
2004 return 0;
2005#endif
7509c759 2006}
9ebbca7d
GK
2007\f
2008static int
2009constant_pool_expr_1 (op, have_sym, have_toc)
2010 rtx op;
2011 int *have_sym;
2012 int *have_toc;
2013{
2014 switch (GET_CODE(op))
2015 {
2016 case SYMBOL_REF:
a4f6c312
SS
2017 if (CONSTANT_POOL_ADDRESS_P (op))
2018 {
2019 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (op), Pmode))
2020 {
2021 *have_sym = 1;
2022 return 1;
2023 }
2024 else
2025 return 0;
2026 }
2027 else if (! strcmp (XSTR (op, 0), toc_label_name))
2028 {
2029 *have_toc = 1;
2030 return 1;
2031 }
2032 else
2033 return 0;
9ebbca7d
GK
2034 case PLUS:
2035 case MINUS:
c1f11548
DE
2036 return (constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc)
2037 && constant_pool_expr_1 (XEXP (op, 1), have_sym, have_toc));
9ebbca7d 2038 case CONST:
a4f6c312 2039 return constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc);
9ebbca7d 2040 case CONST_INT:
a4f6c312 2041 return 1;
9ebbca7d 2042 default:
a4f6c312 2043 return 0;
9ebbca7d
GK
2044 }
2045}
2046
2047int
2048constant_pool_expr_p (op)
2049 rtx op;
2050{
2051 int have_sym = 0;
2052 int have_toc = 0;
2053 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_sym;
2054}
2055
2056int
2057toc_relative_expr_p (op)
2058 rtx op;
2059{
2060 int have_sym = 0;
2061 int have_toc = 0;
2062 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_toc;
2063}
2064
2065/* Try machine-dependent ways of modifying an illegitimate address
2066 to be legitimate. If we find one, return the new, valid address.
2067 This is used from only one place: `memory_address' in explow.c.
2068
a4f6c312
SS
2069 OLDX is the address as it was before break_out_memory_refs was
2070 called. In some cases it is useful to look at this to decide what
2071 needs to be done.
9ebbca7d 2072
a4f6c312 2073 MODE is passed so that this function can use GO_IF_LEGITIMATE_ADDRESS.
9ebbca7d 2074
a4f6c312
SS
2075 It is always safe for this function to do nothing. It exists to
2076 recognize opportunities to optimize the output.
9ebbca7d
GK
2077
2078 On RS/6000, first check for the sum of a register with a constant
2079 integer that is out of range. If so, generate code to add the
2080 constant with the low-order 16 bits masked to the register and force
2081 this result into another register (this can be done with `cau').
2082 Then generate an address of REG+(CONST&0xffff), allowing for the
2083 possibility of bit 16 being a one.
2084
2085 Then check for the sum of a register and something not constant, try to
2086 load the other things into a register and return the sum. */
2087rtx
2088rs6000_legitimize_address (x, oldx, mode)
2089 rtx x;
2090 rtx oldx ATTRIBUTE_UNUSED;
2091 enum machine_mode mode;
0ac081f6 2092{
9ebbca7d
GK
2093 if (GET_CODE (x) == PLUS
2094 && GET_CODE (XEXP (x, 0)) == REG
2095 && GET_CODE (XEXP (x, 1)) == CONST_INT
2096 && (unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000) >= 0x10000)
2097 {
2098 HOST_WIDE_INT high_int, low_int;
2099 rtx sum;
a65c591c
DE
2100 low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
2101 high_int = INTVAL (XEXP (x, 1)) - low_int;
9ebbca7d
GK
2102 sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
2103 GEN_INT (high_int)), 0);
2104 return gen_rtx_PLUS (Pmode, sum, GEN_INT (low_int));
2105 }
2106 else if (GET_CODE (x) == PLUS
2107 && GET_CODE (XEXP (x, 0)) == REG
2108 && GET_CODE (XEXP (x, 1)) != CONST_INT
6ac7bf2c 2109 && GET_MODE_NUNITS (mode) == 1
a3170dc6
AH
2110 && ((TARGET_HARD_FLOAT && TARGET_FPRS)
2111 || TARGET_POWERPC64
2112 || mode != DFmode)
9ebbca7d
GK
2113 && (TARGET_POWERPC64 || mode != DImode)
2114 && mode != TImode)
2115 {
2116 return gen_rtx_PLUS (Pmode, XEXP (x, 0),
2117 force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
2118 }
0ac081f6
AH
2119 else if (ALTIVEC_VECTOR_MODE (mode))
2120 {
2121 rtx reg;
2122
2123 /* Make sure both operands are registers. */
2124 if (GET_CODE (x) == PLUS)
9f85ed45 2125 return gen_rtx_PLUS (Pmode, force_reg (Pmode, XEXP (x, 0)),
0ac081f6
AH
2126 force_reg (Pmode, XEXP (x, 1)));
2127
2128 reg = force_reg (Pmode, x);
2129 return reg;
2130 }
a3170dc6
AH
2131 else if (SPE_VECTOR_MODE (mode))
2132 {
2133 /* We accept [reg + reg] and [reg + OFFSET]. */
2134
2135 if (GET_CODE (x) == PLUS)
2136 {
2137 rtx op1 = XEXP (x, 0);
2138 rtx op2 = XEXP (x, 1);
2139
2140 op1 = force_reg (Pmode, op1);
2141
2142 if (GET_CODE (op2) != REG
2143 && (GET_CODE (op2) != CONST_INT
2144 || !SPE_CONST_OFFSET_OK (INTVAL (op2))))
2145 op2 = force_reg (Pmode, op2);
2146
2147 return gen_rtx_PLUS (Pmode, op1, op2);
2148 }
2149
2150 return force_reg (Pmode, x);
2151 }
9ebbca7d
GK
2152 else if (TARGET_ELF && TARGET_32BIT && TARGET_NO_TOC && ! flag_pic
2153 && GET_CODE (x) != CONST_INT
2154 && GET_CODE (x) != CONST_DOUBLE
2155 && CONSTANT_P (x)
6ac7bf2c
GK
2156 && GET_MODE_NUNITS (mode) == 1
2157 && (GET_MODE_BITSIZE (mode) <= 32
a3170dc6 2158 || ((TARGET_HARD_FLOAT && TARGET_FPRS) && mode == DFmode)))
9ebbca7d
GK
2159 {
2160 rtx reg = gen_reg_rtx (Pmode);
2161 emit_insn (gen_elf_high (reg, (x)));
2162 return gen_rtx_LO_SUM (Pmode, reg, (x));
2163 }
ee890fe2
SS
2164 else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
2165 && ! flag_pic
2166 && GET_CODE (x) != CONST_INT
2167 && GET_CODE (x) != CONST_DOUBLE
2168 && CONSTANT_P (x)
a3170dc6 2169 && ((TARGET_HARD_FLOAT && TARGET_FPRS) || mode != DFmode)
ee890fe2
SS
2170 && mode != DImode
2171 && mode != TImode)
2172 {
2173 rtx reg = gen_reg_rtx (Pmode);
2174 emit_insn (gen_macho_high (reg, (x)));
2175 return gen_rtx_LO_SUM (Pmode, reg, (x));
2176 }
9ebbca7d
GK
2177 else if (TARGET_TOC
2178 && CONSTANT_POOL_EXPR_P (x)
a9098fd0 2179 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
9ebbca7d
GK
2180 {
2181 return create_TOC_reference (x);
2182 }
2183 else
2184 return NULL_RTX;
2185}
258bfae2 2186
24ea750e
DJ
2187/* The convention appears to be to define this wherever it is used.
2188 With legitimize_reload_address now defined here, REG_MODE_OK_FOR_BASE_P
2189 is now used here. */
2190#ifndef REG_MODE_OK_FOR_BASE_P
2191#define REG_MODE_OK_FOR_BASE_P(REGNO, MODE) REG_OK_FOR_BASE_P (REGNO)
2192#endif
2193
2194/* Our implementation of LEGITIMIZE_RELOAD_ADDRESS. Returns a value to
2195 replace the input X, or the original X if no replacement is called for.
2196 The output parameter *WIN is 1 if the calling macro should goto WIN,
2197 0 if it should not.
2198
2199 For RS/6000, we wish to handle large displacements off a base
2200 register by splitting the addend across an addiu/addis and the mem insn.
2201 This cuts number of extra insns needed from 3 to 1.
2202
2203 On Darwin, we use this to generate code for floating point constants.
2204 A movsf_low is generated so we wind up with 2 instructions rather than 3.
2205 The Darwin code is inside #if TARGET_MACHO because only then is
2206 machopic_function_base_name() defined. */
2207rtx
2208rs6000_legitimize_reload_address (x, mode, opnum, type, ind_levels, win)
2209 rtx x;
2210 enum machine_mode mode;
2211 int opnum;
2212 int type;
2213 int ind_levels ATTRIBUTE_UNUSED;
2214 int *win;
2215{
2216 /* We must recognize output that we have already generated ourselves. */
2217 if (GET_CODE (x) == PLUS
2218 && GET_CODE (XEXP (x, 0)) == PLUS
2219 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
2220 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2221 && GET_CODE (XEXP (x, 1)) == CONST_INT)
2222 {
2223 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
2224 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
2225 opnum, (enum reload_type)type);
2226 *win = 1;
2227 return x;
2228 }
3deb2758 2229
24ea750e
DJ
2230#if TARGET_MACHO
2231 if (DEFAULT_ABI == ABI_DARWIN && flag_pic
2232 && GET_CODE (x) == LO_SUM
2233 && GET_CODE (XEXP (x, 0)) == PLUS
2234 && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
2235 && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
2236 && GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 0)) == CONST
2237 && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
2238 && GET_CODE (XEXP (XEXP (x, 1), 0)) == MINUS
2239 && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 0)) == SYMBOL_REF
2240 && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 1)) == SYMBOL_REF)
2241 {
2242 /* Result of previous invocation of this function on Darwin
6f317ef3 2243 floating point constant. */
24ea750e
DJ
2244 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
2245 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
2246 opnum, (enum reload_type)type);
2247 *win = 1;
2248 return x;
2249 }
2250#endif
2251 if (GET_CODE (x) == PLUS
2252 && GET_CODE (XEXP (x, 0)) == REG
2253 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
2254 && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
78c875e8 2255 && GET_CODE (XEXP (x, 1)) == CONST_INT
93638d7a 2256 && !SPE_VECTOR_MODE (mode)
78c875e8 2257 && !ALTIVEC_VECTOR_MODE (mode))
24ea750e
DJ
2258 {
2259 HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
2260 HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
2261 HOST_WIDE_INT high
2262 = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
2263
2264 /* Check for 32-bit overflow. */
2265 if (high + low != val)
2266 {
2267 *win = 0;
2268 return x;
2269 }
2270
2271 /* Reload the high part into a base reg; leave the low part
2272 in the mem directly. */
2273
2274 x = gen_rtx_PLUS (GET_MODE (x),
2275 gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
2276 GEN_INT (high)),
2277 GEN_INT (low));
2278
2279 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
2280 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
2281 opnum, (enum reload_type)type);
2282 *win = 1;
2283 return x;
2284 }
2285#if TARGET_MACHO
2286 if (GET_CODE (x) == SYMBOL_REF
2287 && DEFAULT_ABI == ABI_DARWIN
69ef87e2 2288 && !ALTIVEC_VECTOR_MODE (mode)
24ea750e
DJ
2289 && flag_pic)
2290 {
2291 /* Darwin load of floating point constant. */
2292 rtx offset = gen_rtx (CONST, Pmode,
2293 gen_rtx (MINUS, Pmode, x,
2294 gen_rtx (SYMBOL_REF, Pmode,
2295 machopic_function_base_name ())));
2296 x = gen_rtx (LO_SUM, GET_MODE (x),
2297 gen_rtx (PLUS, Pmode, pic_offset_table_rtx,
2298 gen_rtx (HIGH, Pmode, offset)), offset);
2299 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
2300 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
2301 opnum, (enum reload_type)type);
2302 *win = 1;
2303 return x;
2304 }
2305#endif
2306 if (TARGET_TOC
c1f11548
DE
2307 && CONSTANT_POOL_EXPR_P (x)
2308 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
24ea750e
DJ
2309 {
2310 (x) = create_TOC_reference (x);
2311 *win = 1;
2312 return x;
2313 }
2314 *win = 0;
2315 return x;
2316}
2317
258bfae2
FS
2318/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
2319 that is a valid memory address for an instruction.
2320 The MODE argument is the machine mode for the MEM expression
2321 that wants to use this address.
2322
2323 On the RS/6000, there are four valid address: a SYMBOL_REF that
2324 refers to a constant pool entry of an address (or the sum of it
2325 plus a constant), a short (16-bit signed) constant plus a register,
2326 the sum of two registers, or a register indirect, possibly with an
2327 auto-increment. For DFmode and DImode with an constant plus register,
2328 we must ensure that both words are addressable or PowerPC64 with offset
2329 word aligned.
2330
2331 For modes spanning multiple registers (DFmode in 32-bit GPRs,
2332 32-bit DImode, TImode), indexed addressing cannot be used because
2333 adjacent memory cells are accessed by adding word-sized offsets
2334 during assembly output. */
2335int
2336rs6000_legitimate_address (mode, x, reg_ok_strict)
2337 enum machine_mode mode;
2338 rtx x;
2339 int reg_ok_strict;
2340{
2341 if (LEGITIMATE_INDIRECT_ADDRESS_P (x, reg_ok_strict))
2342 return 1;
2343 if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
0d6d6892 2344 && !ALTIVEC_VECTOR_MODE (mode)
a3170dc6 2345 && !SPE_VECTOR_MODE (mode)
258bfae2
FS
2346 && TARGET_UPDATE
2347 && LEGITIMATE_INDIRECT_ADDRESS_P (XEXP (x, 0), reg_ok_strict))
2348 return 1;
2349 if (LEGITIMATE_SMALL_DATA_P (mode, x))
2350 return 1;
2351 if (LEGITIMATE_CONSTANT_POOL_ADDRESS_P (x))
2352 return 1;
2353 /* If not REG_OK_STRICT (before reload) let pass any stack offset. */
2354 if (! reg_ok_strict
2355 && GET_CODE (x) == PLUS
2356 && GET_CODE (XEXP (x, 0)) == REG
2357 && XEXP (x, 0) == virtual_stack_vars_rtx
2358 && GET_CODE (XEXP (x, 1)) == CONST_INT)
2359 return 1;
2360 if (LEGITIMATE_OFFSET_ADDRESS_P (mode, x, reg_ok_strict))
2361 return 1;
2362 if (mode != TImode
a3170dc6
AH
2363 && ((TARGET_HARD_FLOAT && TARGET_FPRS)
2364 || TARGET_POWERPC64
2365 || mode != DFmode)
258bfae2
FS
2366 && (TARGET_POWERPC64 || mode != DImode)
2367 && LEGITIMATE_INDEXED_ADDRESS_P (x, reg_ok_strict))
2368 return 1;
2369 if (LEGITIMATE_LO_SUM_ADDRESS_P (mode, x, reg_ok_strict))
2370 return 1;
2371 return 0;
2372}
fb4d4348 2373\f
a4f6c312
SS
2374/* Try to output insns to set TARGET equal to the constant C if it can
2375 be done in less than N insns. Do all computations in MODE.
2376 Returns the place where the output has been placed if it can be
2377 done and the insns have been emitted. If it would take more than N
2378 insns, zero is returned and no insns and emitted. */
2bfcf297
DB
2379
2380rtx
2381rs6000_emit_set_const (dest, mode, source, n)
2382 rtx dest, source;
2383 enum machine_mode mode;
2384 int n ATTRIBUTE_UNUSED;
2385{
af8cb5c5 2386 rtx result, insn, set;
2bfcf297
DB
2387 HOST_WIDE_INT c0, c1;
2388
af8cb5c5 2389 if (mode == QImode || mode == HImode)
2bfcf297
DB
2390 {
2391 if (dest == NULL)
2392 dest = gen_reg_rtx (mode);
2393 emit_insn (gen_rtx_SET (VOIDmode, dest, source));
2394 return dest;
2395 }
af8cb5c5 2396 else if (mode == SImode)
2bfcf297 2397 {
af8cb5c5
DE
2398 result = no_new_pseudos ? dest : gen_reg_rtx (SImode);
2399
2400 emit_insn (gen_rtx_SET (VOIDmode, result,
2401 GEN_INT (INTVAL (source)
2402 & (~ (HOST_WIDE_INT) 0xffff))));
2403 emit_insn (gen_rtx_SET (VOIDmode, dest,
2404 gen_rtx_IOR (SImode, result,
2405 GEN_INT (INTVAL (source) & 0xffff))));
2406 result = dest;
2bfcf297 2407 }
af8cb5c5 2408 else if (mode == DImode)
2bfcf297 2409 {
af8cb5c5
DE
2410 if (GET_CODE (source) == CONST_INT)
2411 {
2412 c0 = INTVAL (source);
2413 c1 = -(c0 < 0);
2414 }
2415 else if (GET_CODE (source) == CONST_DOUBLE)
2416 {
2bfcf297 2417#if HOST_BITS_PER_WIDE_INT >= 64
af8cb5c5
DE
2418 c0 = CONST_DOUBLE_LOW (source);
2419 c1 = -(c0 < 0);
2bfcf297 2420#else
af8cb5c5
DE
2421 c0 = CONST_DOUBLE_LOW (source);
2422 c1 = CONST_DOUBLE_HIGH (source);
2bfcf297 2423#endif
af8cb5c5
DE
2424 }
2425 else
2426 abort ();
2427
2428 result = rs6000_emit_set_long_const (dest, c0, c1);
2bfcf297
DB
2429 }
2430 else
a4f6c312 2431 abort ();
2bfcf297 2432
af8cb5c5
DE
2433 insn = get_last_insn ();
2434 set = single_set (insn);
2435 if (! CONSTANT_P (SET_SRC (set)))
2436 set_unique_reg_note (insn, REG_EQUAL, source);
2437
2438 return result;
2bfcf297
DB
2439}
2440
2441/* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
2442 fall back to a straight forward decomposition. We do this to avoid
2443 exponential run times encountered when looking for longer sequences
2444 with rs6000_emit_set_const. */
2445static rtx
2446rs6000_emit_set_long_const (dest, c1, c2)
2447 rtx dest;
2448 HOST_WIDE_INT c1, c2;
2449{
2450 if (!TARGET_POWERPC64)
2451 {
2452 rtx operand1, operand2;
2453
2454 operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
2455 DImode);
2456 operand2 = operand_subword_force (dest, WORDS_BIG_ENDIAN != 0,
2457 DImode);
2458 emit_move_insn (operand1, GEN_INT (c1));
2459 emit_move_insn (operand2, GEN_INT (c2));
2460 }
2461 else
2462 {
bc06712d 2463 HOST_WIDE_INT ud1, ud2, ud3, ud4;
252b88f7 2464
bc06712d
TR
2465 ud1 = c1 & 0xffff;
2466 ud2 = (c1 & 0xffff0000) >> 16;
2bfcf297 2467#if HOST_BITS_PER_WIDE_INT >= 64
bc06712d 2468 c2 = c1 >> 32;
2bfcf297 2469#endif
bc06712d
TR
2470 ud3 = c2 & 0xffff;
2471 ud4 = (c2 & 0xffff0000) >> 16;
2bfcf297 2472
bc06712d
TR
2473 if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
2474 || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
2bfcf297 2475 {
bc06712d
TR
2476 if (ud1 & 0x8000)
2477 emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) - 0x8000)));
2478 else
2479 emit_move_insn (dest, GEN_INT (ud1));
2bfcf297 2480 }
2bfcf297 2481
bc06712d
TR
2482 else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
2483 || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
252b88f7 2484 {
bc06712d
TR
2485 if (ud2 & 0x8000)
2486 emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
2487 - 0x80000000));
252b88f7 2488 else
bc06712d
TR
2489 emit_move_insn (dest, GEN_INT (ud2 << 16));
2490 if (ud1 != 0)
2491 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
252b88f7 2492 }
bc06712d
TR
2493 else if ((ud4 == 0xffff && (ud3 & 0x8000))
2494 || (ud4 == 0 && ! (ud3 & 0x8000)))
2495 {
2496 if (ud3 & 0x8000)
2497 emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
2498 - 0x80000000));
2499 else
2500 emit_move_insn (dest, GEN_INT (ud3 << 16));
2501
2502 if (ud2 != 0)
2503 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud2)));
2504 emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (16)));
2505 if (ud1 != 0)
2506 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
2507 }
2508 else
2509 {
2510 if (ud4 & 0x8000)
2511 emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
2512 - 0x80000000));
2513 else
2514 emit_move_insn (dest, GEN_INT (ud4 << 16));
2515
2516 if (ud3 != 0)
2517 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud3)));
2bfcf297 2518
bc06712d
TR
2519 emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (32)));
2520 if (ud2 != 0)
2521 emit_move_insn (dest, gen_rtx_IOR (DImode, dest,
2522 GEN_INT (ud2 << 16)));
2523 if (ud1 != 0)
2524 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
2525 }
2526 }
2bfcf297
DB
2527 return dest;
2528}
2529
fb4d4348
GK
2530/* Emit a move from SOURCE to DEST in mode MODE. */
2531void
2532rs6000_emit_move (dest, source, mode)
2533 rtx dest;
2534 rtx source;
2535 enum machine_mode mode;
2536{
2537 rtx operands[2];
2538 operands[0] = dest;
2539 operands[1] = source;
2540
2541 /* Sanity checks. Check that we get CONST_DOUBLE only when we should. */
2542 if (GET_CODE (operands[1]) == CONST_DOUBLE
2543 && ! FLOAT_MODE_P (mode)
2544 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
2545 {
2546 /* FIXME. This should never happen. */
2547 /* Since it seems that it does, do the safe thing and convert
2548 to a CONST_INT. */
2496c7bd 2549 operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
fb4d4348
GK
2550 }
2551 if (GET_CODE (operands[1]) == CONST_DOUBLE
2552 && ! FLOAT_MODE_P (mode)
2553 && ((CONST_DOUBLE_HIGH (operands[1]) == 0
2554 && CONST_DOUBLE_LOW (operands[1]) >= 0)
2555 || (CONST_DOUBLE_HIGH (operands[1]) == -1
2556 && CONST_DOUBLE_LOW (operands[1]) < 0)))
2557 abort ();
c9e8cb32
DD
2558
2559 /* Check if GCC is setting up a block move that will end up using FP
2560 registers as temporaries. We must make sure this is acceptable. */
2561 if (GET_CODE (operands[0]) == MEM
2562 && GET_CODE (operands[1]) == MEM
2563 && mode == DImode
41543739
GK
2564 && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
2565 || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
2566 && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
2567 ? 32 : MEM_ALIGN (operands[0])))
2568 || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
2569 ? 32
2570 : MEM_ALIGN (operands[1]))))
2571 && ! MEM_VOLATILE_P (operands [0])
2572 && ! MEM_VOLATILE_P (operands [1]))
c9e8cb32 2573 {
41543739
GK
2574 emit_move_insn (adjust_address (operands[0], SImode, 0),
2575 adjust_address (operands[1], SImode, 0));
2576 emit_move_insn (adjust_address (operands[0], SImode, 4),
2577 adjust_address (operands[1], SImode, 4));
c9e8cb32
DD
2578 return;
2579 }
fb4d4348
GK
2580
2581 if (! no_new_pseudos && GET_CODE (operands[0]) != REG)
2582 operands[1] = force_reg (mode, operands[1]);
a9098fd0 2583
a3170dc6
AH
2584 if (mode == SFmode && ! TARGET_POWERPC
2585 && TARGET_HARD_FLOAT && TARGET_FPRS
ffc14f31 2586 && GET_CODE (operands[0]) == MEM)
fb4d4348 2587 {
ffc14f31
GK
2588 int regnum;
2589
2590 if (reload_in_progress || reload_completed)
2591 regnum = true_regnum (operands[1]);
2592 else if (GET_CODE (operands[1]) == REG)
2593 regnum = REGNO (operands[1]);
2594 else
2595 regnum = -1;
fb4d4348
GK
2596
2597 /* If operands[1] is a register, on POWER it may have
2598 double-precision data in it, so truncate it to single
2599 precision. */
2600 if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
2601 {
2602 rtx newreg;
2603 newreg = (no_new_pseudos ? operands[1] : gen_reg_rtx (mode));
2604 emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
2605 operands[1] = newreg;
2606 }
2607 }
2608
a9098fd0
GK
2609 /* Handle the case where reload calls us with an invalid address;
2610 and the case of CONSTANT_P_RTX. */
16861f33 2611 if (!ALTIVEC_VECTOR_MODE (mode)
69ef87e2
AH
2612 && (! general_operand (operands[1], mode)
2613 || ! nonimmediate_operand (operands[0], mode)
2614 || GET_CODE (operands[1]) == CONSTANT_P_RTX))
fb4d4348
GK
2615 {
2616 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
2617 return;
2618 }
a9098fd0 2619
fb4d4348
GK
2620 /* FIXME: In the long term, this switch statement should go away
2621 and be replaced by a sequence of tests based on things like
2622 mode == Pmode. */
2623 switch (mode)
2624 {
2625 case HImode:
2626 case QImode:
2627 if (CONSTANT_P (operands[1])
2628 && GET_CODE (operands[1]) != CONST_INT)
a9098fd0 2629 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
2630 break;
2631
06f4e019 2632 case TFmode:
fb4d4348
GK
2633 case DFmode:
2634 case SFmode:
2635 if (CONSTANT_P (operands[1])
2636 && ! easy_fp_constant (operands[1], mode))
a9098fd0 2637 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
2638 break;
2639
0ac081f6
AH
2640 case V16QImode:
2641 case V8HImode:
2642 case V4SFmode:
2643 case V4SImode:
a3170dc6
AH
2644 case V4HImode:
2645 case V2SFmode:
2646 case V2SImode:
69ef87e2
AH
2647 if (CONSTANT_P (operands[1])
2648 && !easy_vector_constant (operands[1]))
0ac081f6
AH
2649 operands[1] = force_const_mem (mode, operands[1]);
2650 break;
2651
fb4d4348 2652 case SImode:
a9098fd0 2653 case DImode:
fb4d4348
GK
2654 /* Use default pattern for address of ELF small data */
2655 if (TARGET_ELF
a9098fd0 2656 && mode == Pmode
f607bc57 2657 && DEFAULT_ABI == ABI_V4
a9098fd0
GK
2658 && (GET_CODE (operands[1]) == SYMBOL_REF
2659 || GET_CODE (operands[1]) == CONST)
2660 && small_data_operand (operands[1], mode))
fb4d4348
GK
2661 {
2662 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
2663 return;
2664 }
2665
f607bc57 2666 if (DEFAULT_ABI == ABI_V4
a9098fd0
GK
2667 && mode == Pmode && mode == SImode
2668 && flag_pic == 1 && got_operand (operands[1], mode))
fb4d4348
GK
2669 {
2670 emit_insn (gen_movsi_got (operands[0], operands[1]));
2671 return;
2672 }
2673
ee890fe2
SS
2674 if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
2675 && TARGET_NO_TOC && ! flag_pic
a9098fd0 2676 && mode == Pmode
fb4d4348
GK
2677 && CONSTANT_P (operands[1])
2678 && GET_CODE (operands[1]) != HIGH
2679 && GET_CODE (operands[1]) != CONST_INT)
2680 {
a9098fd0 2681 rtx target = (no_new_pseudos ? operands[0] : gen_reg_rtx (mode));
fb4d4348
GK
2682
2683 /* If this is a function address on -mcall-aixdesc,
2684 convert it to the address of the descriptor. */
2685 if (DEFAULT_ABI == ABI_AIX
2686 && GET_CODE (operands[1]) == SYMBOL_REF
2687 && XSTR (operands[1], 0)[0] == '.')
2688 {
2689 const char *name = XSTR (operands[1], 0);
2690 rtx new_ref;
2691 while (*name == '.')
2692 name++;
2693 new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
2694 CONSTANT_POOL_ADDRESS_P (new_ref)
2695 = CONSTANT_POOL_ADDRESS_P (operands[1]);
2696 SYMBOL_REF_FLAG (new_ref) = SYMBOL_REF_FLAG (operands[1]);
2697 SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
2698 operands[1] = new_ref;
2699 }
7509c759 2700
ee890fe2
SS
2701 if (DEFAULT_ABI == ABI_DARWIN)
2702 {
2703 emit_insn (gen_macho_high (target, operands[1]));
2704 emit_insn (gen_macho_low (operands[0], target, operands[1]));
2705 return;
2706 }
2707
fb4d4348
GK
2708 emit_insn (gen_elf_high (target, operands[1]));
2709 emit_insn (gen_elf_low (operands[0], target, operands[1]));
2710 return;
2711 }
2712
a9098fd0
GK
2713 /* If this is a SYMBOL_REF that refers to a constant pool entry,
2714 and we have put it in the TOC, we just need to make a TOC-relative
2715 reference to it. */
2716 if (TARGET_TOC
2717 && GET_CODE (operands[1]) == SYMBOL_REF
2718 && CONSTANT_POOL_EXPR_P (operands[1])
2719 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
2720 get_pool_mode (operands[1])))
fb4d4348 2721 {
a9098fd0 2722 operands[1] = create_TOC_reference (operands[1]);
fb4d4348 2723 }
a9098fd0
GK
2724 else if (mode == Pmode
2725 && CONSTANT_P (operands[1])
38886f37
AO
2726 && ((GET_CODE (operands[1]) != CONST_INT
2727 && ! easy_fp_constant (operands[1], mode))
2728 || (GET_CODE (operands[1]) == CONST_INT
2729 && num_insns_constant (operands[1], mode) > 2)
2730 || (GET_CODE (operands[0]) == REG
2731 && FP_REGNO_P (REGNO (operands[0]))))
a9098fd0
GK
2732 && GET_CODE (operands[1]) != HIGH
2733 && ! LEGITIMATE_CONSTANT_POOL_ADDRESS_P (operands[1])
2734 && ! TOC_RELATIVE_EXPR_P (operands[1]))
fb4d4348
GK
2735 {
2736 /* Emit a USE operation so that the constant isn't deleted if
2737 expensive optimizations are turned on because nobody
2738 references it. This should only be done for operands that
2739 contain SYMBOL_REFs with CONSTANT_POOL_ADDRESS_P set.
2740 This should not be done for operands that contain LABEL_REFs.
2741 For now, we just handle the obvious case. */
2742 if (GET_CODE (operands[1]) != LABEL_REF)
2743 emit_insn (gen_rtx_USE (VOIDmode, operands[1]));
2744
c859cda6 2745#if TARGET_MACHO
ee890fe2
SS
2746 /* Darwin uses a special PIC legitimizer. */
2747 if (DEFAULT_ABI == ABI_DARWIN && flag_pic)
2748 {
ee890fe2
SS
2749 operands[1] =
2750 rs6000_machopic_legitimize_pic_address (operands[1], mode,
c859cda6
DJ
2751 operands[0]);
2752 if (operands[0] != operands[1])
2753 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
ee890fe2
SS
2754 return;
2755 }
c859cda6 2756#endif
ee890fe2 2757
fb4d4348
GK
2758 /* If we are to limit the number of things we put in the TOC and
2759 this is a symbol plus a constant we can add in one insn,
2760 just put the symbol in the TOC and add the constant. Don't do
2761 this if reload is in progress. */
2762 if (GET_CODE (operands[1]) == CONST
2763 && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
2764 && GET_CODE (XEXP (operands[1], 0)) == PLUS
a9098fd0 2765 && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
fb4d4348
GK
2766 && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
2767 || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
2768 && ! side_effects_p (operands[0]))
2769 {
a4f6c312
SS
2770 rtx sym =
2771 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
fb4d4348
GK
2772 rtx other = XEXP (XEXP (operands[1], 0), 1);
2773
a9098fd0
GK
2774 sym = force_reg (mode, sym);
2775 if (mode == SImode)
2776 emit_insn (gen_addsi3 (operands[0], sym, other));
2777 else
2778 emit_insn (gen_adddi3 (operands[0], sym, other));
fb4d4348
GK
2779 return;
2780 }
2781
a9098fd0 2782 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
2783
2784 if (TARGET_TOC
d34c5b80
DE
2785 && CONSTANT_POOL_EXPR_P (XEXP (operands[1], 0))
2786 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
2787 get_pool_constant (XEXP (operands[1], 0)),
2788 get_pool_mode (XEXP (operands[1], 0))))
a9098fd0 2789 {
ba4828e0
RK
2790 operands[1]
2791 = gen_rtx_MEM (mode,
2792 create_TOC_reference (XEXP (operands[1], 0)));
2793 set_mem_alias_set (operands[1], get_TOC_alias_set ());
fb4d4348 2794 RTX_UNCHANGING_P (operands[1]) = 1;
a9098fd0 2795 }
fb4d4348
GK
2796 }
2797 break;
a9098fd0 2798
fb4d4348
GK
2799 case TImode:
2800 if (GET_CODE (operands[0]) == MEM
2801 && GET_CODE (XEXP (operands[0], 0)) != REG
2802 && ! reload_in_progress)
792760b9
RK
2803 operands[0]
2804 = replace_equiv_address (operands[0],
2805 copy_addr_to_reg (XEXP (operands[0], 0)));
fb4d4348
GK
2806
2807 if (GET_CODE (operands[1]) == MEM
2808 && GET_CODE (XEXP (operands[1], 0)) != REG
2809 && ! reload_in_progress)
792760b9
RK
2810 operands[1]
2811 = replace_equiv_address (operands[1],
2812 copy_addr_to_reg (XEXP (operands[1], 0)));
fb4d4348
GK
2813 break;
2814
2815 default:
2816 abort ();
2817 }
2818
a9098fd0
GK
2819 /* Above, we may have called force_const_mem which may have returned
2820 an invalid address. If we can, fix this up; otherwise, reload will
2821 have to deal with it. */
2822 if (GET_CODE (operands[1]) == MEM
2823 && ! memory_address_p (mode, XEXP (operands[1], 0))
2824 && ! reload_in_progress)
f4ef873c 2825 operands[1] = adjust_address (operands[1], mode, 0);
a9098fd0 2826
fb4d4348 2827 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
02a4ec28 2828 return;
fb4d4348 2829}
4697a36c
MM
2830\f
2831/* Initialize a variable CUM of type CUMULATIVE_ARGS
2832 for a call to a function whose data type is FNTYPE.
2833 For a library call, FNTYPE is 0.
2834
2835 For incoming args we set the number of arguments in the prototype large
1c20ae99 2836 so we never return a PARALLEL. */
4697a36c
MM
2837
2838void
2839init_cumulative_args (cum, fntype, libname, incoming)
2840 CUMULATIVE_ARGS *cum;
2841 tree fntype;
296b8152 2842 rtx libname ATTRIBUTE_UNUSED;
4697a36c
MM
2843 int incoming;
2844{
2845 static CUMULATIVE_ARGS zero_cumulative;
2846
2847 *cum = zero_cumulative;
2848 cum->words = 0;
2849 cum->fregno = FP_ARG_MIN_REG;
0ac081f6 2850 cum->vregno = ALTIVEC_ARG_MIN_REG;
4697a36c 2851 cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
7509c759 2852 cum->call_cookie = CALL_NORMAL;
4cc833b7 2853 cum->sysv_gregno = GP_ARG_MIN_REG;
4697a36c
MM
2854
2855 if (incoming)
bd227acc 2856 cum->nargs_prototype = 1000; /* don't return a PARALLEL */
4697a36c
MM
2857
2858 else if (cum->prototype)
2859 cum->nargs_prototype = (list_length (TYPE_ARG_TYPES (fntype)) - 1
2860 + (TYPE_MODE (TREE_TYPE (fntype)) == BLKmode
2861 || RETURN_IN_MEMORY (TREE_TYPE (fntype))));
2862
2863 else
2864 cum->nargs_prototype = 0;
2865
2866 cum->orig_nargs = cum->nargs_prototype;
7509c759 2867
a5c76ee6
ZW
2868 /* Check for a longcall attribute. */
2869 if (fntype
2870 && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
2871 && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype)))
6a4cee5f
MM
2872 cum->call_cookie = CALL_LONG;
2873
4697a36c
MM
2874 if (TARGET_DEBUG_ARG)
2875 {
2876 fprintf (stderr, "\ninit_cumulative_args:");
2877 if (fntype)
2878 {
2879 tree ret_type = TREE_TYPE (fntype);
2880 fprintf (stderr, " ret code = %s,",
2881 tree_code_name[ (int)TREE_CODE (ret_type) ]);
2882 }
2883
6a4cee5f
MM
2884 if (cum->call_cookie & CALL_LONG)
2885 fprintf (stderr, " longcall,");
2886
4697a36c
MM
2887 fprintf (stderr, " proto = %d, nargs = %d\n",
2888 cum->prototype, cum->nargs_prototype);
2889 }
2890}
2891\f
c229cba9
DE
2892/* If defined, a C expression which determines whether, and in which
2893 direction, to pad out an argument with extra space. The value
2894 should be of type `enum direction': either `upward' to pad above
2895 the argument, `downward' to pad below, or `none' to inhibit
2896 padding.
2897
2898 For the AIX ABI structs are always stored left shifted in their
2899 argument slot. */
2900
9ebbca7d 2901enum direction
c229cba9
DE
2902function_arg_padding (mode, type)
2903 enum machine_mode mode;
2904 tree type;
2905{
c85f7c16 2906 if (type != 0 && AGGREGATE_TYPE_P (type))
9ebbca7d 2907 return upward;
c229cba9
DE
2908
2909 /* This is the default definition. */
2910 return (! BYTES_BIG_ENDIAN
9ebbca7d 2911 ? upward
c229cba9
DE
2912 : ((mode == BLKmode
2913 ? (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
2914 && int_size_in_bytes (type) < (PARM_BOUNDARY / BITS_PER_UNIT))
2915 : GET_MODE_BITSIZE (mode) < PARM_BOUNDARY)
9ebbca7d 2916 ? downward : upward));
c229cba9
DE
2917}
2918
b6c9286a
MM
2919/* If defined, a C expression that gives the alignment boundary, in bits,
2920 of an argument with the specified mode and type. If it is not defined,
2921 PARM_BOUNDARY is used for all arguments.
2922
2310f99a 2923 V.4 wants long longs to be double word aligned. */
b6c9286a
MM
2924
2925int
2926function_arg_boundary (mode, type)
2927 enum machine_mode mode;
9ebbca7d 2928 tree type ATTRIBUTE_UNUSED;
b6c9286a 2929{
f607bc57 2930 if (DEFAULT_ABI == ABI_V4 && (mode == DImode || mode == DFmode))
e1f83b4d 2931 return 64;
a3170dc6
AH
2932 else if (SPE_VECTOR_MODE (mode))
2933 return 64;
0ac081f6
AH
2934 else if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
2935 return 128;
9ebbca7d 2936 else
b6c9286a 2937 return PARM_BOUNDARY;
b6c9286a
MM
2938}
2939\f
4697a36c
MM
2940/* Update the data in CUM to advance over an argument
2941 of mode MODE and data type TYPE.
2942 (TYPE is null for libcalls where that information may not be available.) */
2943
2944void
2945function_arg_advance (cum, mode, type, named)
2946 CUMULATIVE_ARGS *cum;
2947 enum machine_mode mode;
2948 tree type;
2949 int named;
2950{
2951 cum->nargs_prototype--;
2952
0ac081f6
AH
2953 if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
2954 {
2955 if (cum->vregno <= ALTIVEC_ARG_MAX_REG && cum->nargs_prototype >= 0)
2956 cum->vregno++;
2957 else
2958 cum->words += RS6000_ARG_SIZE (mode, type);
2959 }
a4b0320c
AH
2960 else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
2961 && named && cum->sysv_gregno <= GP_ARG_MAX_REG)
2962 cum->sysv_gregno++;
f607bc57 2963 else if (DEFAULT_ABI == ABI_V4)
4697a36c 2964 {
a3170dc6 2965 if (TARGET_HARD_FLOAT && TARGET_FPRS
4cc833b7 2966 && (mode == SFmode || mode == DFmode))
4697a36c 2967 {
4cc833b7
RH
2968 if (cum->fregno <= FP_ARG_V4_MAX_REG)
2969 cum->fregno++;
2970 else
2971 {
2972 if (mode == DFmode)
2973 cum->words += cum->words & 1;
d34c5b80 2974 cum->words += RS6000_ARG_SIZE (mode, type);
4cc833b7 2975 }
4697a36c 2976 }
4cc833b7
RH
2977 else
2978 {
2979 int n_words;
2980 int gregno = cum->sysv_gregno;
2981
2982 /* Aggregates and IEEE quad get passed by reference. */
2983 if ((type && AGGREGATE_TYPE_P (type))
2984 || mode == TFmode)
2985 n_words = 1;
2986 else
d34c5b80 2987 n_words = RS6000_ARG_SIZE (mode, type);
4cc833b7 2988
a4b0320c 2989 /* Long long and SPE vectors are put in odd registers. */
4cc833b7
RH
2990 if (n_words == 2 && (gregno & 1) == 0)
2991 gregno += 1;
2992
a4b0320c
AH
2993 /* Long long and SPE vectors are not split between registers
2994 and stack. */
4cc833b7
RH
2995 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
2996 {
2997 /* Long long is aligned on the stack. */
2998 if (n_words == 2)
2999 cum->words += cum->words & 1;
3000 cum->words += n_words;
3001 }
4697a36c 3002
4cc833b7
RH
3003 /* Note: continuing to accumulate gregno past when we've started
3004 spilling to the stack indicates the fact that we've started
3005 spilling to the stack to expand_builtin_saveregs. */
3006 cum->sysv_gregno = gregno + n_words;
3007 }
4697a36c 3008
4cc833b7
RH
3009 if (TARGET_DEBUG_ARG)
3010 {
3011 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
3012 cum->words, cum->fregno);
3013 fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
3014 cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
3015 fprintf (stderr, "mode = %4s, named = %d\n",
3016 GET_MODE_NAME (mode), named);
3017 }
4697a36c
MM
3018 }
3019 else
4cc833b7
RH
3020 {
3021 int align = (TARGET_32BIT && (cum->words & 1) != 0
3022 && function_arg_boundary (mode, type) == 64) ? 1 : 0;
a4f6c312 3023
d34c5b80 3024 cum->words += align + RS6000_ARG_SIZE (mode, type);
4697a36c 3025
a3170dc6
AH
3026 if (GET_MODE_CLASS (mode) == MODE_FLOAT
3027 && TARGET_HARD_FLOAT && TARGET_FPRS)
d34c5b80 3028 cum->fregno++;
4cc833b7
RH
3029
3030 if (TARGET_DEBUG_ARG)
3031 {
3032 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
3033 cum->words, cum->fregno);
3034 fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
3035 cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
3036 fprintf (stderr, "named = %d, align = %d\n", named, align);
3037 }
3038 }
4697a36c
MM
3039}
3040\f
3041/* Determine where to put an argument to a function.
3042 Value is zero to push the argument on the stack,
3043 or a hard register in which to store the argument.
3044
3045 MODE is the argument's machine mode.
3046 TYPE is the data type of the argument (as a tree).
3047 This is null for libcalls where that information may
3048 not be available.
3049 CUM is a variable of type CUMULATIVE_ARGS which gives info about
3050 the preceding args and about the function being called.
3051 NAMED is nonzero if this argument is a named parameter
3052 (otherwise it is an extra parameter matching an ellipsis).
3053
3054 On RS/6000 the first eight words of non-FP are normally in registers
3055 and the rest are pushed. Under AIX, the first 13 FP args are in registers.
3056 Under V.4, the first 8 FP args are in registers.
3057
3058 If this is floating-point and no prototype is specified, we use
3059 both an FP and integer register (or possibly FP reg and stack). Library
3060 functions (when TYPE is zero) always have the proper types for args,
3061 so we can pass the FP value just in one register. emit_library_function
1c20ae99 3062 doesn't support PARALLEL anyway. */
4697a36c
MM
3063
3064struct rtx_def *
3065function_arg (cum, mode, type, named)
3066 CUMULATIVE_ARGS *cum;
3067 enum machine_mode mode;
3068 tree type;
20c29ebe 3069 int named;
4697a36c 3070{
4cc833b7 3071 enum rs6000_abi abi = DEFAULT_ABI;
4697a36c 3072
a4f6c312
SS
3073 /* Return a marker to indicate whether CR1 needs to set or clear the
3074 bit that V.4 uses to say fp args were passed in registers.
3075 Assume that we don't need the marker for software floating point,
3076 or compiler generated library calls. */
4697a36c
MM
3077 if (mode == VOIDmode)
3078 {
f607bc57 3079 if (abi == ABI_V4
7509c759 3080 && cum->nargs_prototype < 0
4697a36c 3081 && type && (cum->prototype || TARGET_NO_PROTOTYPE))
7509c759 3082 {
a3170dc6
AH
3083 /* For the SPE, we need to crxor CR6 always. */
3084 if (TARGET_SPE_ABI)
3085 return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
3086 else if (TARGET_HARD_FLOAT && TARGET_FPRS)
3087 return GEN_INT (cum->call_cookie
3088 | ((cum->fregno == FP_ARG_MIN_REG)
3089 ? CALL_V4_SET_FP_ARGS
3090 : CALL_V4_CLEAR_FP_ARGS));
7509c759 3091 }
4697a36c 3092
7509c759 3093 return GEN_INT (cum->call_cookie);
4697a36c
MM
3094 }
3095
0ac081f6
AH
3096 if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
3097 {
20c29ebe 3098 if (named && cum->vregno <= ALTIVEC_ARG_MAX_REG)
0ac081f6
AH
3099 return gen_rtx_REG (mode, cum->vregno);
3100 else
3101 return NULL;
3102 }
a4b0320c 3103 else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode) && named)
a3170dc6 3104 {
a4b0320c 3105 if (cum->sysv_gregno <= GP_ARG_MAX_REG)
a3170dc6
AH
3106 return gen_rtx_REG (mode, cum->sysv_gregno);
3107 else
3108 return NULL;
3109 }
f607bc57 3110 else if (abi == ABI_V4)
4697a36c 3111 {
a3170dc6 3112 if (TARGET_HARD_FLOAT && TARGET_FPRS
4cc833b7
RH
3113 && (mode == SFmode || mode == DFmode))
3114 {
3115 if (cum->fregno <= FP_ARG_V4_MAX_REG)
3116 return gen_rtx_REG (mode, cum->fregno);
3117 else
3118 return NULL;
3119 }
3120 else
3121 {
3122 int n_words;
3123 int gregno = cum->sysv_gregno;
3124
3125 /* Aggregates and IEEE quad get passed by reference. */
3126 if ((type && AGGREGATE_TYPE_P (type))
3127 || mode == TFmode)
3128 n_words = 1;
3129 else
d34c5b80 3130 n_words = RS6000_ARG_SIZE (mode, type);
4cc833b7 3131
a4b0320c 3132 /* Long long and SPE vectors are put in odd registers. */
4cc833b7
RH
3133 if (n_words == 2 && (gregno & 1) == 0)
3134 gregno += 1;
3135
a4b0320c
AH
3136 /* Long long and SPE vectors are not split between registers
3137 and stack. */
4cc833b7 3138 if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
a4b0320c
AH
3139 {
3140 /* SPE vectors in ... get split into 2 registers. */
3141 if (TARGET_SPE && TARGET_SPE_ABI
3142 && SPE_VECTOR_MODE (mode) && !named)
3143 {
3144 rtx r1, r2;
3145 enum machine_mode m = GET_MODE_INNER (mode);
3146
3147 r1 = gen_rtx_REG (m, gregno);
3148 r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
3149 r2 = gen_rtx_REG (m, gregno + 1);
3150 r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
3151 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
3152 }
3153 return gen_rtx_REG (mode, gregno);
3154 }
4cc833b7
RH
3155 else
3156 return NULL;
3157 }
4697a36c 3158 }
4cc833b7
RH
3159 else
3160 {
3161 int align = (TARGET_32BIT && (cum->words & 1) != 0
3162 && function_arg_boundary (mode, type) == 64) ? 1 : 0;
3163 int align_words = cum->words + align;
4697a36c 3164
4cc833b7
RH
3165 if (type && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
3166 return NULL_RTX;
3167
3168 if (USE_FP_FOR_ARG_P (*cum, mode, type))
3169 {
3170 if (! type
3171 || ((cum->nargs_prototype > 0)
3172 /* IBM AIX extended its linkage convention definition always
3173 to require FP args after register save area hole on the
3174 stack. */
3175 && (DEFAULT_ABI != ABI_AIX
3176 || ! TARGET_XL_CALL
3177 || (align_words < GP_ARG_NUM_REG))))
3178 return gen_rtx_REG (mode, cum->fregno);
3179
3180 return gen_rtx_PARALLEL (mode,
3181 gen_rtvec (2,
39403d82 3182 gen_rtx_EXPR_LIST (VOIDmode,
1c20ae99
JW
3183 ((align_words >= GP_ARG_NUM_REG)
3184 ? NULL_RTX
3185 : (align_words
d34c5b80 3186 + RS6000_ARG_SIZE (mode, type)
1c20ae99
JW
3187 > GP_ARG_NUM_REG
3188 /* If this is partially on the stack, then
3189 we only include the portion actually
3190 in registers here. */
39403d82 3191 ? gen_rtx_REG (SImode,
1c20ae99 3192 GP_ARG_MIN_REG + align_words)
39403d82 3193 : gen_rtx_REG (mode,
1c20ae99
JW
3194 GP_ARG_MIN_REG + align_words))),
3195 const0_rtx),
39403d82
DE
3196 gen_rtx_EXPR_LIST (VOIDmode,
3197 gen_rtx_REG (mode, cum->fregno),
1c20ae99 3198 const0_rtx)));
4cc833b7
RH
3199 }
3200 else if (align_words < GP_ARG_NUM_REG)
3201 return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
3202 else
3203 return NULL_RTX;
4697a36c 3204 }
4697a36c
MM
3205}
3206\f
3207/* For an arg passed partly in registers and partly in memory,
3208 this is the number of registers used.
3209 For args passed entirely in registers or entirely in memory, zero. */
3210
3211int
3212function_arg_partial_nregs (cum, mode, type, named)
3213 CUMULATIVE_ARGS *cum;
3214 enum machine_mode mode;
3215 tree type;
d34c5b80 3216 int named ATTRIBUTE_UNUSED;
4697a36c 3217{
f607bc57 3218 if (DEFAULT_ABI == ABI_V4)
4697a36c 3219 return 0;
4697a36c 3220
0ac081f6
AH
3221 if (USE_FP_FOR_ARG_P (*cum, mode, type)
3222 || USE_ALTIVEC_FOR_ARG_P (*cum, mode, type))
4697a36c
MM
3223 {
3224 if (cum->nargs_prototype >= 0)
3225 return 0;
3226 }
3227
3228 if (cum->words < GP_ARG_NUM_REG
d34c5b80 3229 && GP_ARG_NUM_REG < (cum->words + RS6000_ARG_SIZE (mode, type)))
4697a36c
MM
3230 {
3231 int ret = GP_ARG_NUM_REG - cum->words;
3232 if (ret && TARGET_DEBUG_ARG)
3233 fprintf (stderr, "function_arg_partial_nregs: %d\n", ret);
3234
3235 return ret;
3236 }
3237
3238 return 0;
3239}
3240\f
3241/* A C expression that indicates when an argument must be passed by
3242 reference. If nonzero for an argument, a copy of that argument is
3243 made in memory and a pointer to the argument is passed instead of
3244 the argument itself. The pointer is passed in whatever way is
3245 appropriate for passing a pointer to that type.
3246
3247 Under V.4, structures and unions are passed by reference. */
3248
3249int
3250function_arg_pass_by_reference (cum, mode, type, named)
296b8152
KG
3251 CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED;
3252 enum machine_mode mode ATTRIBUTE_UNUSED;
4697a36c 3253 tree type;
296b8152 3254 int named ATTRIBUTE_UNUSED;
4697a36c 3255{
f607bc57 3256 if (DEFAULT_ABI == ABI_V4
4cc833b7
RH
3257 && ((type && AGGREGATE_TYPE_P (type))
3258 || mode == TFmode))
4697a36c
MM
3259 {
3260 if (TARGET_DEBUG_ARG)
3261 fprintf (stderr, "function_arg_pass_by_reference: aggregate\n");
3262
3263 return 1;
3264 }
4697a36c
MM
3265
3266 return 0;
3267}
4697a36c
MM
3268\f
3269/* Perform any needed actions needed for a function that is receiving a
3270 variable number of arguments.
3271
3272 CUM is as above.
3273
3274 MODE and TYPE are the mode and type of the current parameter.
3275
3276 PRETEND_SIZE is a variable that should be set to the amount of stack
3277 that must be pushed by the prolog to pretend that our caller pushed
3278 it.
3279
3280 Normally, this macro will push all remaining incoming registers on the
3281 stack and set PRETEND_SIZE to the length of the registers pushed. */
3282
3283void
3284setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
3285 CUMULATIVE_ARGS *cum;
3286 enum machine_mode mode;
3287 tree type;
3288 int *pretend_size;
3289 int no_rtl;
3290
3291{
4cc833b7
RH
3292 CUMULATIVE_ARGS next_cum;
3293 int reg_size = TARGET_32BIT ? 4 : 8;
ca5adc63 3294 rtx save_area = NULL_RTX, mem;
dfafc897 3295 int first_reg_offset, set;
d34c5b80
DE
3296 tree fntype;
3297 int stdarg_p;
4697a36c 3298
d34c5b80
DE
3299 fntype = TREE_TYPE (current_function_decl);
3300 stdarg_p = (TYPE_ARG_TYPES (fntype) != 0
3301 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
3302 != void_type_node));
4cc833b7 3303
d34c5b80
DE
3304 /* For varargs, we do not want to skip the dummy va_dcl argument.
3305 For stdargs, we do want to skip the last named argument. */
3306 next_cum = *cum;
3307 if (stdarg_p)
3308 function_arg_advance (&next_cum, mode, type, 1);
4cc833b7 3309
f607bc57 3310 if (DEFAULT_ABI == ABI_V4)
d34c5b80 3311 {
4cc833b7 3312 /* Indicate to allocate space on the stack for varargs save area. */
00dba523 3313 cfun->machine->sysv_varargs_p = 1;
60e2d0ca 3314 if (! no_rtl)
2c4974b7 3315 save_area = plus_constant (virtual_stack_vars_rtx,
bd227acc 3316 - RS6000_VARARGS_SIZE);
4cc833b7
RH
3317
3318 first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
4697a36c 3319 }
60e2d0ca 3320 else
4697a36c 3321 {
d34c5b80 3322 first_reg_offset = next_cum.words;
4cc833b7 3323 save_area = virtual_incoming_args_rtx;
00dba523 3324 cfun->machine->sysv_varargs_p = 0;
4697a36c
MM
3325
3326 if (MUST_PASS_IN_STACK (mode, type))
d34c5b80 3327 first_reg_offset += RS6000_ARG_SIZE (TYPE_MODE (type), type);
4cc833b7 3328 }
4697a36c 3329
dfafc897 3330 set = get_varargs_alias_set ();
c81fc13e 3331 if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG)
4cc833b7 3332 {
dfafc897
FS
3333 mem = gen_rtx_MEM (BLKmode,
3334 plus_constant (save_area,
3335 first_reg_offset * reg_size)),
ba4828e0 3336 set_mem_alias_set (mem, set);
8ac61af7 3337 set_mem_align (mem, BITS_PER_WORD);
dfafc897 3338
4cc833b7 3339 move_block_from_reg
dfafc897 3340 (GP_ARG_MIN_REG + first_reg_offset, mem,
4cc833b7
RH
3341 GP_ARG_NUM_REG - first_reg_offset,
3342 (GP_ARG_NUM_REG - first_reg_offset) * UNITS_PER_WORD);
3343
3344 /* ??? Does ABI_V4 need this at all? */
4697a36c
MM
3345 *pretend_size = (GP_ARG_NUM_REG - first_reg_offset) * UNITS_PER_WORD;
3346 }
3347
4697a36c 3348 /* Save FP registers if needed. */
f607bc57 3349 if (DEFAULT_ABI == ABI_V4
a3170dc6
AH
3350 && TARGET_HARD_FLOAT && TARGET_FPRS
3351 && ! no_rtl
4cc833b7 3352 && next_cum.fregno <= FP_ARG_V4_MAX_REG)
4697a36c 3353 {
4cc833b7 3354 int fregno = next_cum.fregno;
9ebbca7d 3355 rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
4cc833b7
RH
3356 rtx lab = gen_label_rtx ();
3357 int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG) * 8);
4697a36c 3358
4cc833b7 3359 emit_jump_insn (gen_rtx_SET (VOIDmode,
4697a36c 3360 pc_rtx,
39403d82 3361 gen_rtx_IF_THEN_ELSE (VOIDmode,
4cc833b7
RH
3362 gen_rtx_NE (VOIDmode, cr1,
3363 const0_rtx),
39403d82 3364 gen_rtx_LABEL_REF (VOIDmode, lab),
4697a36c
MM
3365 pc_rtx)));
3366
4cc833b7
RH
3367 while (fregno <= FP_ARG_V4_MAX_REG)
3368 {
dfafc897 3369 mem = gen_rtx_MEM (DFmode, plus_constant (save_area, off));
ba4828e0 3370 set_mem_alias_set (mem, set);
dfafc897 3371 emit_move_insn (mem, gen_rtx_REG (DFmode, fregno));
4cc833b7
RH
3372 fregno++;
3373 off += 8;
4697a36c 3374 }
4cc833b7
RH
3375
3376 emit_label (lab);
4697a36c 3377 }
4697a36c 3378}
4697a36c 3379
dfafc897 3380/* Create the va_list data type. */
2c4974b7 3381
dfafc897
FS
3382tree
3383rs6000_build_va_list ()
3384{
bab45a51 3385 tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
4697a36c 3386
9ebbca7d
GK
3387 /* For AIX, prefer 'char *' because that's what the system
3388 header files like. */
f607bc57 3389 if (DEFAULT_ABI != ABI_V4)
9ebbca7d 3390 return build_pointer_type (char_type_node);
dfafc897 3391
f1e639b1 3392 record = (*lang_hooks.types.make_type) (RECORD_TYPE);
bab45a51 3393 type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
0f4fd75d 3394
9ebbca7d
GK
3395 f_gpr = build_decl (FIELD_DECL, get_identifier ("gpr"),
3396 unsigned_char_type_node);
3397 f_fpr = build_decl (FIELD_DECL, get_identifier ("fpr"),
3398 unsigned_char_type_node);
dfafc897
FS
3399 f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
3400 ptr_type_node);
3401 f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
3402 ptr_type_node);
3403
3404 DECL_FIELD_CONTEXT (f_gpr) = record;
3405 DECL_FIELD_CONTEXT (f_fpr) = record;
3406 DECL_FIELD_CONTEXT (f_ovf) = record;
3407 DECL_FIELD_CONTEXT (f_sav) = record;
3408
bab45a51
FS
3409 TREE_CHAIN (record) = type_decl;
3410 TYPE_NAME (record) = type_decl;
dfafc897
FS
3411 TYPE_FIELDS (record) = f_gpr;
3412 TREE_CHAIN (f_gpr) = f_fpr;
3413 TREE_CHAIN (f_fpr) = f_ovf;
3414 TREE_CHAIN (f_ovf) = f_sav;
3415
3416 layout_type (record);
3417
3418 /* The correct type is an array type of one element. */
3419 return build_array_type (record, build_index_type (size_zero_node));
3420}
3421
3422/* Implement va_start. */
3423
3424void
e5faf155 3425rs6000_va_start (valist, nextarg)
dfafc897
FS
3426 tree valist;
3427 rtx nextarg;
4697a36c 3428{
dfafc897
FS
3429 HOST_WIDE_INT words, n_gpr, n_fpr;
3430 tree f_gpr, f_fpr, f_ovf, f_sav;
3431 tree gpr, fpr, ovf, sav, t;
2c4974b7 3432
dfafc897 3433 /* Only SVR4 needs something special. */
f607bc57 3434 if (DEFAULT_ABI != ABI_V4)
dfafc897 3435 {
e5faf155 3436 std_expand_builtin_va_start (valist, nextarg);
dfafc897
FS
3437 return;
3438 }
3439
973a648b 3440 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
dfafc897
FS
3441 f_fpr = TREE_CHAIN (f_gpr);
3442 f_ovf = TREE_CHAIN (f_fpr);
3443 f_sav = TREE_CHAIN (f_ovf);
3444
8ebecc3b 3445 valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
dfafc897
FS
3446 gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr);
3447 fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr);
3448 ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf);
3449 sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav);
3450
3451 /* Count number of gp and fp argument registers used. */
4cc833b7 3452 words = current_function_args_info.words;
dfafc897
FS
3453 n_gpr = current_function_args_info.sysv_gregno - GP_ARG_MIN_REG;
3454 n_fpr = current_function_args_info.fregno - FP_ARG_MIN_REG;
3455
3456 if (TARGET_DEBUG_ARG)
78e1b90d
DE
3457 {
3458 fputs ("va_start: words = ", stderr);
3459 fprintf (stderr, HOST_WIDE_INT_PRINT_DEC, words);
3460 fputs (", n_gpr = ", stderr);
3461 fprintf (stderr, HOST_WIDE_INT_PRINT_DEC, n_gpr);
3462 fputs (", n_fpr = ", stderr);
3463 fprintf (stderr, HOST_WIDE_INT_PRINT_DEC, n_fpr);
3464 putc ('\n', stderr);
3465 }
dfafc897
FS
3466
3467 t = build (MODIFY_EXPR, TREE_TYPE (gpr), gpr, build_int_2 (n_gpr, 0));
3468 TREE_SIDE_EFFECTS (t) = 1;
3469 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3470
3471 t = build (MODIFY_EXPR, TREE_TYPE (fpr), fpr, build_int_2 (n_fpr, 0));
3472 TREE_SIDE_EFFECTS (t) = 1;
3473 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3474
3475 /* Find the overflow area. */
3476 t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
3477 if (words != 0)
3478 t = build (PLUS_EXPR, TREE_TYPE (ovf), t,
3479 build_int_2 (words * UNITS_PER_WORD, 0));
3480 t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
3481 TREE_SIDE_EFFECTS (t) = 1;
3482 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3483
3484 /* Find the register save area. */
3485 t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
3486 t = build (PLUS_EXPR, TREE_TYPE (sav), t,
3487 build_int_2 (-RS6000_VARARGS_SIZE, -1));
3488 t = build (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
3489 TREE_SIDE_EFFECTS (t) = 1;
3490 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3491}
3492
3493/* Implement va_arg. */
3494
3495rtx
3496rs6000_va_arg (valist, type)
3497 tree valist, type;
3498{
3499 tree f_gpr, f_fpr, f_ovf, f_sav;
3500 tree gpr, fpr, ovf, sav, reg, t, u;
3501 int indirect_p, size, rsize, n_reg, sav_ofs, sav_scale;
3502 rtx lab_false, lab_over, addr_rtx, r;
3503
f607bc57 3504 if (DEFAULT_ABI != ABI_V4)
2a55fd42 3505 return std_expand_builtin_va_arg (valist, type);
dfafc897 3506
973a648b 3507 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
dfafc897
FS
3508 f_fpr = TREE_CHAIN (f_gpr);
3509 f_ovf = TREE_CHAIN (f_fpr);
3510 f_sav = TREE_CHAIN (f_ovf);
3511
8ebecc3b 3512 valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
dfafc897
FS
3513 gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr);
3514 fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr);
3515 ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf);
3516 sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav);
3517
3518 size = int_size_in_bytes (type);
3519 rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4cc833b7 3520
dfafc897 3521 if (AGGREGATE_TYPE_P (type) || TYPE_MODE (type) == TFmode)
4cc833b7 3522 {
dfafc897
FS
3523 /* Aggregates and long doubles are passed by reference. */
3524 indirect_p = 1;
3525 reg = gpr;
3526 n_reg = 1;
3527 sav_ofs = 0;
3528 sav_scale = 4;
d3294cd9
FS
3529 size = UNITS_PER_WORD;
3530 rsize = 1;
dfafc897 3531 }
a3170dc6 3532 else if (FLOAT_TYPE_P (type) && TARGET_HARD_FLOAT && TARGET_FPRS)
dfafc897
FS
3533 {
3534 /* FP args go in FP registers, if present. */
3535 indirect_p = 0;
3536 reg = fpr;
3537 n_reg = 1;
3538 sav_ofs = 8*4;
3539 sav_scale = 8;
4cc833b7 3540 }
dfafc897
FS
3541 else
3542 {
3543 /* Otherwise into GP registers. */
3544 indirect_p = 0;
3545 reg = gpr;
3546 n_reg = rsize;
3547 sav_ofs = 0;
3548 sav_scale = 4;
3549 }
3550
a4f6c312 3551 /* Pull the value out of the saved registers ... */
dfafc897
FS
3552
3553 lab_false = gen_label_rtx ();
3554 lab_over = gen_label_rtx ();
3555 addr_rtx = gen_reg_rtx (Pmode);
3556
16861f33
AH
3557 /* AltiVec vectors never go in registers. */
3558 if (!TARGET_ALTIVEC || TREE_CODE (type) != VECTOR_TYPE)
2c4974b7 3559 {
41daaf0e
AH
3560 TREE_THIS_VOLATILE (reg) = 1;
3561 emit_cmp_and_jump_insns
3562 (expand_expr (reg, NULL_RTX, QImode, EXPAND_NORMAL),
3563 GEN_INT (8 - n_reg + 1), GE, const1_rtx, QImode, 1,
3564 lab_false);
dfafc897 3565
41daaf0e
AH
3566 /* Long long is aligned in the registers. */
3567 if (n_reg > 1)
3568 {
3569 u = build (BIT_AND_EXPR, TREE_TYPE (reg), reg,
3570 build_int_2 (n_reg - 1, 0));
3571 u = build (PLUS_EXPR, TREE_TYPE (reg), reg, u);
3572 u = build (MODIFY_EXPR, TREE_TYPE (reg), reg, u);
3573 TREE_SIDE_EFFECTS (u) = 1;
3574 expand_expr (u, const0_rtx, VOIDmode, EXPAND_NORMAL);
3575 }
2c4974b7 3576
41daaf0e
AH
3577 if (sav_ofs)
3578 t = build (PLUS_EXPR, ptr_type_node, sav, build_int_2 (sav_ofs, 0));
3579 else
3580 t = sav;
2c4974b7 3581
41daaf0e
AH
3582 u = build (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg,
3583 build_int_2 (n_reg, 0));
3584 TREE_SIDE_EFFECTS (u) = 1;
2c4974b7 3585
41daaf0e
AH
3586 u = build1 (CONVERT_EXPR, integer_type_node, u);
3587 TREE_SIDE_EFFECTS (u) = 1;
dfafc897 3588
41daaf0e
AH
3589 u = build (MULT_EXPR, integer_type_node, u, build_int_2 (sav_scale, 0));
3590 TREE_SIDE_EFFECTS (u) = 1;
dfafc897 3591
41daaf0e
AH
3592 t = build (PLUS_EXPR, ptr_type_node, t, u);
3593 TREE_SIDE_EFFECTS (t) = 1;
3594
3595 r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL);
3596 if (r != addr_rtx)
3597 emit_move_insn (addr_rtx, r);
3598
3599 emit_jump_insn (gen_jump (lab_over));
3600 emit_barrier ();
3601 }
dfafc897 3602
dfafc897
FS
3603 emit_label (lab_false);
3604
a4f6c312 3605 /* ... otherwise out of the overflow area. */
dfafc897 3606
41daaf0e
AH
3607 /* Make sure we don't find reg 7 for the next int arg.
3608
3609 All AltiVec vectors go in the overflow area. So in the AltiVec
3610 case we need to get the vectors from the overflow area, but
3611 remember where the GPRs and FPRs are. */
16861f33
AH
3612 if (n_reg > 1 && (TREE_CODE (type) != VECTOR_TYPE
3613 || !TARGET_ALTIVEC))
dfafc897
FS
3614 {
3615 t = build (MODIFY_EXPR, TREE_TYPE (reg), reg, build_int_2 (8, 0));
3616 TREE_SIDE_EFFECTS (t) = 1;
3617 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3618 }
3619
3620 /* Care for on-stack alignment if needed. */
3621 if (rsize <= 1)
3622 t = ovf;
3623 else
3624 {
41daaf0e
AH
3625 int align;
3626
16861f33
AH
3627 /* AltiVec vectors are 16 byte aligned. */
3628 if (TARGET_ALTIVEC && TREE_CODE (type) == VECTOR_TYPE)
41daaf0e
AH
3629 align = 15;
3630 else
3631 align = 7;
3632
3633 t = build (PLUS_EXPR, TREE_TYPE (ovf), ovf, build_int_2 (align, 0));
3634 t = build (BIT_AND_EXPR, TREE_TYPE (t), t, build_int_2 (-align-1, -1));
dfafc897
FS
3635 }
3636 t = save_expr (t);
3637
3638 r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL);
3639 if (r != addr_rtx)
3640 emit_move_insn (addr_rtx, r);
3641
3642 t = build (PLUS_EXPR, TREE_TYPE (t), t, build_int_2 (size, 0));
3643 t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
3644 TREE_SIDE_EFFECTS (t) = 1;
3645 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3646
3647 emit_label (lab_over);
3648
3649 if (indirect_p)
3650 {
3651 r = gen_rtx_MEM (Pmode, addr_rtx);
ba4828e0 3652 set_mem_alias_set (r, get_varargs_alias_set ());
dfafc897
FS
3653 emit_move_insn (addr_rtx, r);
3654 }
3655
3656 return addr_rtx;
4697a36c 3657}
0ac081f6
AH
3658
3659/* Builtins. */
3660
6a2dd09a
RS
3661#define def_builtin(MASK, NAME, TYPE, CODE) \
3662do { \
3663 if ((MASK) & target_flags) \
3664 builtin_function ((NAME), (TYPE), (CODE), BUILT_IN_MD, \
3665 NULL, NULL_TREE); \
0ac081f6
AH
3666} while (0)
3667
24408032
AH
3668/* Simple ternary operations: VECd = foo (VECa, VECb, VECc). */
3669
2212663f 3670static const struct builtin_description bdesc_3arg[] =
24408032
AH
3671{
3672 { MASK_ALTIVEC, CODE_FOR_altivec_vmaddfp, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
3673 { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
3674 { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
3675 { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
3676 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
3677 { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
3678 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
3679 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
3680 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
3681 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
3682 { MASK_ALTIVEC, CODE_FOR_altivec_vnmsubfp, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
3683 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
3684 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
3685 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
3686 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_16qi, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
3687 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
3688 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
3689 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
3690 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
3691 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
3692 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
3693 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
3694 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
3695};
2212663f 3696
95385cbb
AH
3697/* DST operations: void foo (void *, const int, const char). */
3698
3699static const struct builtin_description bdesc_dst[] =
3700{
3701 { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
3702 { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
3703 { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
3704 { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT }
3705};
3706
2212663f 3707/* Simple binary operations: VECc = foo (VECa, VECb). */
24408032 3708
a3170dc6 3709static struct builtin_description bdesc_2arg[] =
0ac081f6 3710{
f18c054f
DB
3711 { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
3712 { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
3713 { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
3714 { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
0ac081f6
AH
3715 { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
3716 { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
3717 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
3718 { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
3719 { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
3720 { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
3721 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
f18c054f 3722 { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
0ac081f6
AH
3723 { MASK_ALTIVEC, CODE_FOR_altivec_vandc, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
3724 { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
3725 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
3726 { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
3727 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
3728 { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
3729 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
617e0e1d
DB
3730 { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
3731 { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
0ac081f6
AH
3732 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
3733 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequb, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
3734 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequh, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
3735 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequw, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
3736 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpeqfp, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
3737 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgefp, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
3738 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtub, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
3739 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsb, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
3740 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuh, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
3741 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsh, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
3742 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuw, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
3743 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsw, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
3744 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtfp, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
617e0e1d
DB
3745 { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
3746 { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
f18c054f
DB
3747 { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
3748 { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
df966bff
AH
3749 { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
3750 { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
3751 { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
3752 { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
3753 { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
0ac081f6
AH
3754 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
3755 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
3756 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
3757 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
3758 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
3759 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
f18c054f
DB
3760 { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
3761 { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
3762 { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
3763 { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
3764 { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
3765 { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
3766 { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
0ac081f6
AH
3767 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
3768 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
3769 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
3770 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
3771 { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
3772 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
3773 { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
3774 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
3775 { MASK_ALTIVEC, CODE_FOR_altivec_vnor, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
f18c054f 3776 { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
0ac081f6
AH
3777 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
3778 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
3779 { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
3780 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhss, "__builtin_altivec_vpkuhss", ALTIVEC_BUILTIN_VPKUHSS },
3781 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
3782 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwss, "__builtin_altivec_vpkuwss", ALTIVEC_BUILTIN_VPKUWSS },
3783 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
3784 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
3785 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
3786 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
3787 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
3788 { MASK_ALTIVEC, CODE_FOR_altivec_vrlb, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
3789 { MASK_ALTIVEC, CODE_FOR_altivec_vrlh, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
3790 { MASK_ALTIVEC, CODE_FOR_altivec_vrlw, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
3791 { MASK_ALTIVEC, CODE_FOR_altivec_vslb, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
3792 { MASK_ALTIVEC, CODE_FOR_altivec_vslh, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
3793 { MASK_ALTIVEC, CODE_FOR_altivec_vslw, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
3794 { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
3795 { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
2212663f
DB
3796 { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
3797 { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
3798 { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
0ac081f6 3799 { MASK_ALTIVEC, CODE_FOR_altivec_vsrb, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
f18c054f
DB
3800 { MASK_ALTIVEC, CODE_FOR_altivec_vsrh, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
3801 { MASK_ALTIVEC, CODE_FOR_altivec_vsrw, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
0ac081f6
AH
3802 { MASK_ALTIVEC, CODE_FOR_altivec_vsrab, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
3803 { MASK_ALTIVEC, CODE_FOR_altivec_vsrah, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
3804 { MASK_ALTIVEC, CODE_FOR_altivec_vsraw, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
3805 { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
3806 { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
f18c054f
DB
3807 { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
3808 { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
3809 { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
3810 { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
0ac081f6
AH
3811 { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
3812 { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
3813 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
3814 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
3815 { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
3816 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
3817 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
3818 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
3819 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
3820 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
3821 { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
3822 { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
f18c054f 3823 { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
a3170dc6
AH
3824
3825 /* Place holder, leave as first spe builtin. */
3826 { 0, CODE_FOR_spe_evaddw, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
3827 { 0, CODE_FOR_spe_evand, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
3828 { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
3829 { 0, CODE_FOR_spe_evdivws, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
3830 { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
3831 { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
3832 { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
3833 { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
3834 { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
3835 { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
3836 { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
3837 { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
3838 { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
3839 { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
3840 { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
3841 { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
3842 { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
3843 { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
3844 { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
3845 { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
3846 { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
3847 { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
3848 { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
3849 { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
3850 { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
3851 { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
3852 { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
3853 { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
3854 { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
3855 { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
3856 { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
3857 { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
3858 { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
3859 { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
3860 { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
3861 { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
3862 { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
3863 { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
3864 { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
3865 { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
3866 { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
3867 { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
3868 { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
3869 { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
3870 { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
3871 { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
3872 { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
3873 { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
3874 { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
3875 { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
3876 { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
3877 { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
3878 { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
3879 { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
3880 { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
3881 { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
3882 { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
3883 { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
3884 { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
3885 { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
3886 { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
3887 { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
3888 { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
3889 { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
3890 { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
3891 { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
3892 { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
3893 { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
3894 { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
3895 { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
3896 { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
3897 { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
3898 { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
3899 { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
3900 { 0, CODE_FOR_spe_evmwlsmf, "__builtin_spe_evmwlsmf", SPE_BUILTIN_EVMWLSMF },
3901 { 0, CODE_FOR_spe_evmwlsmfa, "__builtin_spe_evmwlsmfa", SPE_BUILTIN_EVMWLSMFA },
3902 { 0, CODE_FOR_spe_evmwlsmfaaw, "__builtin_spe_evmwlsmfaaw", SPE_BUILTIN_EVMWLSMFAAW },
3903 { 0, CODE_FOR_spe_evmwlsmfanw, "__builtin_spe_evmwlsmfanw", SPE_BUILTIN_EVMWLSMFANW },
3904 { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
3905 { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
3906 { 0, CODE_FOR_spe_evmwlssf, "__builtin_spe_evmwlssf", SPE_BUILTIN_EVMWLSSF },
3907 { 0, CODE_FOR_spe_evmwlssfa, "__builtin_spe_evmwlssfa", SPE_BUILTIN_EVMWLSSFA },
3908 { 0, CODE_FOR_spe_evmwlssfaaw, "__builtin_spe_evmwlssfaaw", SPE_BUILTIN_EVMWLSSFAAW },
3909 { 0, CODE_FOR_spe_evmwlssfanw, "__builtin_spe_evmwlssfanw", SPE_BUILTIN_EVMWLSSFANW },
3910 { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
3911 { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
3912 { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
3913 { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
3914 { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
3915 { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
3916 { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
3917 { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
3918 { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
3919 { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
3920 { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
3921 { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
3922 { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
3923 { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
3924 { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
3925 { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
3926 { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
3927 { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
3928 { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
3929 { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
3930 { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
3931 { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
3932 { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
3933 { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
3934 { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
3935 { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
3936 { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
3937 { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
3938 { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
3939 { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
3940 { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
3941 { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
3942 { 0, CODE_FOR_spe_evsubfw, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
3943
3944 /* SPE binary operations expecting a 5-bit unsigned literal. */
3945 { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
3946
3947 { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
3948 { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
3949 { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
3950 { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
3951 { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
3952 { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
3953 { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
3954 { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
3955 { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
3956 { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
3957 { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
3958 { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
3959 { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
3960 { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
3961 { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
3962 { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
3963 { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
3964 { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
3965 { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
3966 { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
3967 { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
3968 { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
3969 { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
3970 { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
3971 { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
3972 { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
3973
3974 /* Place-holder. Leave as last binary SPE builtin. */
3975 { 0, CODE_FOR_spe_evxor, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR },
ae4b4a02
AH
3976};
3977
3978/* AltiVec predicates. */
3979
3980struct builtin_description_predicates
3981{
3982 const unsigned int mask;
3983 const enum insn_code icode;
3984 const char *opcode;
3985 const char *const name;
3986 const enum rs6000_builtins code;
3987};
3988
3989static const struct builtin_description_predicates bdesc_altivec_preds[] =
3990{
3991 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpbfp.", "__builtin_altivec_vcmpbfp_p", ALTIVEC_BUILTIN_VCMPBFP_P },
3992 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpeqfp.", "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
3993 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgefp.", "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
3994 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgtfp.", "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
3995 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpequw.", "__builtin_altivec_vcmpequw_p", ALTIVEC_BUILTIN_VCMPEQUW_P },
3996 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtsw.", "__builtin_altivec_vcmpgtsw_p", ALTIVEC_BUILTIN_VCMPGTSW_P },
3997 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtuw.", "__builtin_altivec_vcmpgtuw_p", ALTIVEC_BUILTIN_VCMPGTUW_P },
3998 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtuh.", "__builtin_altivec_vcmpgtuh_p", ALTIVEC_BUILTIN_VCMPGTUH_P },
3999 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtsh.", "__builtin_altivec_vcmpgtsh_p", ALTIVEC_BUILTIN_VCMPGTSH_P },
4000 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpequh.", "__builtin_altivec_vcmpequh_p", ALTIVEC_BUILTIN_VCMPEQUH_P },
4001 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpequb.", "__builtin_altivec_vcmpequb_p", ALTIVEC_BUILTIN_VCMPEQUB_P },
4002 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtsb.", "__builtin_altivec_vcmpgtsb_p", ALTIVEC_BUILTIN_VCMPGTSB_P },
4003 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtub.", "__builtin_altivec_vcmpgtub_p", ALTIVEC_BUILTIN_VCMPGTUB_P }
0ac081f6 4004};
24408032 4005
a3170dc6
AH
4006/* SPE predicates. */
4007static struct builtin_description bdesc_spe_predicates[] =
4008{
4009 /* Place-holder. Leave as first. */
4010 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
4011 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
4012 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
4013 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
4014 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
4015 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
4016 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
4017 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
4018 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
4019 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
4020 /* Place-holder. Leave as last. */
4021 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
4022};
4023
4024/* SPE evsel predicates. */
4025static struct builtin_description bdesc_spe_evsel[] =
4026{
4027 /* Place-holder. Leave as first. */
4028 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
4029 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
4030 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
4031 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
4032 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
4033 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
4034 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
4035 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
4036 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
4037 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
4038 /* Place-holder. Leave as last. */
4039 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
4040};
4041
100c4561
AH
4042/* ABS* opreations. */
4043
4044static const struct builtin_description bdesc_abs[] =
4045{
4046 { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
4047 { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
4048 { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
4049 { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
4050 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
4051 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
4052 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI }
4053};
4054
617e0e1d
DB
4055/* Simple unary operations: VECb = foo (unsigned literal) or VECb =
4056 foo (VECa). */
24408032 4057
a3170dc6 4058static struct builtin_description bdesc_1arg[] =
2212663f 4059{
617e0e1d
DB
4060 { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
4061 { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
4062 { MASK_ALTIVEC, CODE_FOR_altivec_vrefp, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
4063 { MASK_ALTIVEC, CODE_FOR_altivec_vrfim, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
4064 { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
4065 { MASK_ALTIVEC, CODE_FOR_altivec_vrfip, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
4066 { MASK_ALTIVEC, CODE_FOR_ftruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
4067 { MASK_ALTIVEC, CODE_FOR_altivec_vrsqrtefp, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
2212663f
DB
4068 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
4069 { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
4070 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
20e26713
AH
4071 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
4072 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
4073 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
4074 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
4075 { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
4076 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
a3170dc6
AH
4077
4078 /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
4079 end with SPE_BUILTIN_EVSUBFUSIAAW. */
4080 { 0, CODE_FOR_spe_evabs, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
4081 { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
4082 { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
4083 { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
4084 { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
4085 { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
4086 { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
4087 { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
4088 { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
4089 { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
4090 { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
4091 { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
4092 { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
4093 { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
4094 { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
4095 { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
4096 { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
4097 { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
4098 { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
4099 { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
4100 { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
4101 { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
4102 { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
4103 { 0, CODE_FOR_spe_evneg, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
4104 { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
4105 { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
4106 { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
4107 { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
4108 { 0, CODE_FOR_spe_evsplatfi, "__builtin_spe_evsplatfi", SPE_BUILTIN_EVSPLATFI },
4109 { 0, CODE_FOR_spe_evsplati, "__builtin_spe_evsplati", SPE_BUILTIN_EVSPLATI },
4110
4111 /* Place-holder. Leave as last unary SPE builtin. */
4112 { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
2212663f
DB
4113};
4114
4115static rtx
92898235 4116rs6000_expand_unop_builtin (icode, arglist, target)
2212663f
DB
4117 enum insn_code icode;
4118 tree arglist;
4119 rtx target;
4120{
4121 rtx pat;
4122 tree arg0 = TREE_VALUE (arglist);
4123 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4124 enum machine_mode tmode = insn_data[icode].operand[0].mode;
4125 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4126
0559cc77
DE
4127 if (icode == CODE_FOR_nothing)
4128 /* Builtin not supported on this processor. */
4129 return 0;
4130
20e26713
AH
4131 /* If we got invalid arguments bail out before generating bad rtl. */
4132 if (arg0 == error_mark_node)
9a171fcd 4133 return const0_rtx;
20e26713 4134
0559cc77
DE
4135 if (icode == CODE_FOR_altivec_vspltisb
4136 || icode == CODE_FOR_altivec_vspltish
4137 || icode == CODE_FOR_altivec_vspltisw
4138 || icode == CODE_FOR_spe_evsplatfi
4139 || icode == CODE_FOR_spe_evsplati)
b44140e7
AH
4140 {
4141 /* Only allow 5-bit *signed* literals. */
b44140e7
AH
4142 if (GET_CODE (op0) != CONST_INT
4143 || INTVAL (op0) > 0x1f
4144 || INTVAL (op0) < -0x1f)
4145 {
4146 error ("argument 1 must be a 5-bit signed literal");
9a171fcd 4147 return const0_rtx;
b44140e7 4148 }
b44140e7
AH
4149 }
4150
c62f2db5 4151 if (target == 0
2212663f
DB
4152 || GET_MODE (target) != tmode
4153 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4154 target = gen_reg_rtx (tmode);
4155
4156 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4157 op0 = copy_to_mode_reg (mode0, op0);
4158
4159 pat = GEN_FCN (icode) (target, op0);
4160 if (! pat)
4161 return 0;
4162 emit_insn (pat);
0ac081f6 4163
2212663f
DB
4164 return target;
4165}
ae4b4a02 4166
100c4561
AH
4167static rtx
4168altivec_expand_abs_builtin (icode, arglist, target)
4169 enum insn_code icode;
4170 tree arglist;
4171 rtx target;
4172{
4173 rtx pat, scratch1, scratch2;
4174 tree arg0 = TREE_VALUE (arglist);
4175 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4176 enum machine_mode tmode = insn_data[icode].operand[0].mode;
4177 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4178
4179 /* If we have invalid arguments, bail out before generating bad rtl. */
4180 if (arg0 == error_mark_node)
9a171fcd 4181 return const0_rtx;
100c4561
AH
4182
4183 if (target == 0
4184 || GET_MODE (target) != tmode
4185 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4186 target = gen_reg_rtx (tmode);
4187
4188 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4189 op0 = copy_to_mode_reg (mode0, op0);
4190
4191 scratch1 = gen_reg_rtx (mode0);
4192 scratch2 = gen_reg_rtx (mode0);
4193
4194 pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
4195 if (! pat)
4196 return 0;
4197 emit_insn (pat);
4198
4199 return target;
4200}
4201
0ac081f6 4202static rtx
92898235 4203rs6000_expand_binop_builtin (icode, arglist, target)
0ac081f6
AH
4204 enum insn_code icode;
4205 tree arglist;
4206 rtx target;
4207{
4208 rtx pat;
4209 tree arg0 = TREE_VALUE (arglist);
4210 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
4211 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4212 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4213 enum machine_mode tmode = insn_data[icode].operand[0].mode;
4214 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4215 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
4216
0559cc77
DE
4217 if (icode == CODE_FOR_nothing)
4218 /* Builtin not supported on this processor. */
4219 return 0;
4220
20e26713
AH
4221 /* If we got invalid arguments bail out before generating bad rtl. */
4222 if (arg0 == error_mark_node || arg1 == error_mark_node)
9a171fcd 4223 return const0_rtx;
20e26713 4224
0559cc77
DE
4225 if (icode == CODE_FOR_altivec_vcfux
4226 || icode == CODE_FOR_altivec_vcfsx
4227 || icode == CODE_FOR_altivec_vctsxs
4228 || icode == CODE_FOR_altivec_vctuxs
4229 || icode == CODE_FOR_altivec_vspltb
4230 || icode == CODE_FOR_altivec_vsplth
4231 || icode == CODE_FOR_altivec_vspltw
4232 || icode == CODE_FOR_spe_evaddiw
4233 || icode == CODE_FOR_spe_evldd
4234 || icode == CODE_FOR_spe_evldh
4235 || icode == CODE_FOR_spe_evldw
4236 || icode == CODE_FOR_spe_evlhhesplat
4237 || icode == CODE_FOR_spe_evlhhossplat
4238 || icode == CODE_FOR_spe_evlhhousplat
4239 || icode == CODE_FOR_spe_evlwhe
4240 || icode == CODE_FOR_spe_evlwhos
4241 || icode == CODE_FOR_spe_evlwhou
4242 || icode == CODE_FOR_spe_evlwhsplat
4243 || icode == CODE_FOR_spe_evlwwsplat
4244 || icode == CODE_FOR_spe_evrlwi
4245 || icode == CODE_FOR_spe_evslwi
4246 || icode == CODE_FOR_spe_evsrwis
4247 || icode == CODE_FOR_spe_evsrwiu)
b44140e7
AH
4248 {
4249 /* Only allow 5-bit unsigned literals. */
b44140e7
AH
4250 if (TREE_CODE (arg1) != INTEGER_CST
4251 || TREE_INT_CST_LOW (arg1) & ~0x1f)
4252 {
4253 error ("argument 2 must be a 5-bit unsigned literal");
9a171fcd 4254 return const0_rtx;
b44140e7 4255 }
b44140e7
AH
4256 }
4257
c62f2db5 4258 if (target == 0
0ac081f6
AH
4259 || GET_MODE (target) != tmode
4260 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4261 target = gen_reg_rtx (tmode);
4262
4263 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4264 op0 = copy_to_mode_reg (mode0, op0);
4265 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
4266 op1 = copy_to_mode_reg (mode1, op1);
4267
4268 pat = GEN_FCN (icode) (target, op0, op1);
4269 if (! pat)
4270 return 0;
4271 emit_insn (pat);
4272
4273 return target;
4274}
6525c0e7 4275
ae4b4a02
AH
4276static rtx
4277altivec_expand_predicate_builtin (icode, opcode, arglist, target)
4278 enum insn_code icode;
4279 const char *opcode;
4280 tree arglist;
4281 rtx target;
4282{
4283 rtx pat, scratch;
4284 tree cr6_form = TREE_VALUE (arglist);
4285 tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
4286 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
4287 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4288 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4289 enum machine_mode tmode = SImode;
4290 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4291 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
4292 int cr6_form_int;
4293
4294 if (TREE_CODE (cr6_form) != INTEGER_CST)
4295 {
4296 error ("argument 1 of __builtin_altivec_predicate must be a constant");
9a171fcd 4297 return const0_rtx;
ae4b4a02
AH
4298 }
4299 else
4300 cr6_form_int = TREE_INT_CST_LOW (cr6_form);
4301
4302 if (mode0 != mode1)
4303 abort ();
4304
4305 /* If we have invalid arguments, bail out before generating bad rtl. */
4306 if (arg0 == error_mark_node || arg1 == error_mark_node)
9a171fcd 4307 return const0_rtx;
ae4b4a02
AH
4308
4309 if (target == 0
4310 || GET_MODE (target) != tmode
4311 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4312 target = gen_reg_rtx (tmode);
4313
4314 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4315 op0 = copy_to_mode_reg (mode0, op0);
4316 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
4317 op1 = copy_to_mode_reg (mode1, op1);
4318
4319 scratch = gen_reg_rtx (mode0);
4320
4321 pat = GEN_FCN (icode) (scratch, op0, op1,
4322 gen_rtx (SYMBOL_REF, Pmode, opcode));
4323 if (! pat)
4324 return 0;
4325 emit_insn (pat);
4326
4327 /* The vec_any* and vec_all* predicates use the same opcodes for two
4328 different operations, but the bits in CR6 will be different
4329 depending on what information we want. So we have to play tricks
4330 with CR6 to get the right bits out.
4331
4332 If you think this is disgusting, look at the specs for the
4333 AltiVec predicates. */
4334
4335 switch (cr6_form_int)
4336 {
4337 case 0:
4338 emit_insn (gen_cr6_test_for_zero (target));
4339 break;
4340 case 1:
4341 emit_insn (gen_cr6_test_for_zero_reverse (target));
4342 break;
4343 case 2:
4344 emit_insn (gen_cr6_test_for_lt (target));
4345 break;
4346 case 3:
4347 emit_insn (gen_cr6_test_for_lt_reverse (target));
4348 break;
4349 default:
4350 error ("argument 1 of __builtin_altivec_predicate is out of range");
4351 break;
4352 }
4353
4354 return target;
4355}
4356
6525c0e7
AH
4357static rtx
4358altivec_expand_stv_builtin (icode, arglist)
4359 enum insn_code icode;
4360 tree arglist;
4361{
4362 tree arg0 = TREE_VALUE (arglist);
4363 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
4364 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
4365 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4366 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4367 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
4368 rtx pat;
4369 enum machine_mode mode0 = insn_data[icode].operand[0].mode;
4370 enum machine_mode mode1 = insn_data[icode].operand[1].mode;
4371 enum machine_mode mode2 = insn_data[icode].operand[2].mode;
4372
4373 /* Invalid arguments. Bail before doing anything stoopid! */
4374 if (arg0 == error_mark_node
4375 || arg1 == error_mark_node
4376 || arg2 == error_mark_node)
9a171fcd 4377 return const0_rtx;
6525c0e7
AH
4378
4379 if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
4380 op0 = copy_to_mode_reg (mode2, op0);
4381 if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
4382 op1 = copy_to_mode_reg (mode0, op1);
4383 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
4384 op2 = copy_to_mode_reg (mode1, op2);
4385
4386 pat = GEN_FCN (icode) (op1, op2, op0);
4387 if (pat)
4388 emit_insn (pat);
4389 return NULL_RTX;
4390}
4391
2212663f 4392static rtx
92898235 4393rs6000_expand_ternop_builtin (icode, arglist, target)
2212663f
DB
4394 enum insn_code icode;
4395 tree arglist;
4396 rtx target;
4397{
4398 rtx pat;
4399 tree arg0 = TREE_VALUE (arglist);
4400 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
4401 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
4402 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4403 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4404 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
4405 enum machine_mode tmode = insn_data[icode].operand[0].mode;
4406 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4407 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
4408 enum machine_mode mode2 = insn_data[icode].operand[3].mode;
0ac081f6 4409
774b5662
DE
4410 if (icode == CODE_FOR_nothing)
4411 /* Builtin not supported on this processor. */
4412 return 0;
4413
20e26713
AH
4414 /* If we got invalid arguments bail out before generating bad rtl. */
4415 if (arg0 == error_mark_node
4416 || arg1 == error_mark_node
4417 || arg2 == error_mark_node)
9a171fcd 4418 return const0_rtx;
20e26713 4419
774b5662
DE
4420 if (icode == CODE_FOR_altivec_vsldoi_4sf
4421 || icode == CODE_FOR_altivec_vsldoi_4si
4422 || icode == CODE_FOR_altivec_vsldoi_8hi
4423 || icode == CODE_FOR_altivec_vsldoi_16qi)
b44140e7
AH
4424 {
4425 /* Only allow 4-bit unsigned literals. */
b44140e7
AH
4426 if (TREE_CODE (arg2) != INTEGER_CST
4427 || TREE_INT_CST_LOW (arg2) & ~0xf)
4428 {
4429 error ("argument 3 must be a 4-bit unsigned literal");
e3277ffb 4430 return const0_rtx;
b44140e7 4431 }
b44140e7
AH
4432 }
4433
c62f2db5 4434 if (target == 0
2212663f
DB
4435 || GET_MODE (target) != tmode
4436 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4437 target = gen_reg_rtx (tmode);
4438
4439 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4440 op0 = copy_to_mode_reg (mode0, op0);
4441 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
4442 op1 = copy_to_mode_reg (mode1, op1);
4443 if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
4444 op2 = copy_to_mode_reg (mode2, op2);
4445
4446 pat = GEN_FCN (icode) (target, op0, op1, op2);
4447 if (! pat)
4448 return 0;
4449 emit_insn (pat);
4450
4451 return target;
4452}
92898235 4453
3a9b8c7e 4454/* Expand the lvx builtins. */
0ac081f6 4455static rtx
3a9b8c7e 4456altivec_expand_ld_builtin (exp, target, expandedp)
0ac081f6
AH
4457 tree exp;
4458 rtx target;
92898235 4459 bool *expandedp;
0ac081f6 4460{
0ac081f6
AH
4461 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4462 tree arglist = TREE_OPERAND (exp, 1);
0ac081f6 4463 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
3a9b8c7e
AH
4464 tree arg0;
4465 enum machine_mode tmode, mode0;
7c3abc73 4466 rtx pat, op0;
3a9b8c7e 4467 enum insn_code icode;
92898235 4468
0ac081f6
AH
4469 switch (fcode)
4470 {
f18c054f
DB
4471 case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
4472 icode = CODE_FOR_altivec_lvx_16qi;
3a9b8c7e 4473 break;
f18c054f
DB
4474 case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
4475 icode = CODE_FOR_altivec_lvx_8hi;
3a9b8c7e
AH
4476 break;
4477 case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
4478 icode = CODE_FOR_altivec_lvx_4si;
4479 break;
4480 case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
4481 icode = CODE_FOR_altivec_lvx_4sf;
4482 break;
4483 default:
4484 *expandedp = false;
4485 return NULL_RTX;
4486 }
0ac081f6 4487
3a9b8c7e 4488 *expandedp = true;
f18c054f 4489
3a9b8c7e
AH
4490 arg0 = TREE_VALUE (arglist);
4491 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4492 tmode = insn_data[icode].operand[0].mode;
4493 mode0 = insn_data[icode].operand[1].mode;
f18c054f 4494
3a9b8c7e
AH
4495 if (target == 0
4496 || GET_MODE (target) != tmode
4497 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4498 target = gen_reg_rtx (tmode);
24408032 4499
3a9b8c7e
AH
4500 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4501 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
f18c054f 4502
3a9b8c7e
AH
4503 pat = GEN_FCN (icode) (target, op0);
4504 if (! pat)
4505 return 0;
4506 emit_insn (pat);
4507 return target;
4508}
f18c054f 4509
3a9b8c7e
AH
4510/* Expand the stvx builtins. */
4511static rtx
4512altivec_expand_st_builtin (exp, target, expandedp)
4513 tree exp;
7c3abc73 4514 rtx target ATTRIBUTE_UNUSED;
3a9b8c7e
AH
4515 bool *expandedp;
4516{
4517 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4518 tree arglist = TREE_OPERAND (exp, 1);
4519 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
4520 tree arg0, arg1;
4521 enum machine_mode mode0, mode1;
7c3abc73 4522 rtx pat, op0, op1;
3a9b8c7e 4523 enum insn_code icode;
f18c054f 4524
3a9b8c7e
AH
4525 switch (fcode)
4526 {
4527 case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
4528 icode = CODE_FOR_altivec_stvx_16qi;
4529 break;
4530 case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
4531 icode = CODE_FOR_altivec_stvx_8hi;
4532 break;
4533 case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
4534 icode = CODE_FOR_altivec_stvx_4si;
4535 break;
4536 case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
4537 icode = CODE_FOR_altivec_stvx_4sf;
4538 break;
4539 default:
4540 *expandedp = false;
4541 return NULL_RTX;
4542 }
24408032 4543
3a9b8c7e
AH
4544 arg0 = TREE_VALUE (arglist);
4545 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
4546 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4547 op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4548 mode0 = insn_data[icode].operand[0].mode;
4549 mode1 = insn_data[icode].operand[1].mode;
f18c054f 4550
3a9b8c7e
AH
4551 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
4552 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
4553 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
4554 op1 = copy_to_mode_reg (mode1, op1);
f18c054f 4555
3a9b8c7e
AH
4556 pat = GEN_FCN (icode) (op0, op1);
4557 if (pat)
4558 emit_insn (pat);
f18c054f 4559
3a9b8c7e
AH
4560 *expandedp = true;
4561 return NULL_RTX;
4562}
f18c054f 4563
3a9b8c7e
AH
4564/* Expand the dst builtins. */
4565static rtx
4566altivec_expand_dst_builtin (exp, target, expandedp)
4567 tree exp;
7c3abc73 4568 rtx target ATTRIBUTE_UNUSED;
3a9b8c7e
AH
4569 bool *expandedp;
4570{
4571 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4572 tree arglist = TREE_OPERAND (exp, 1);
4573 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
4574 tree arg0, arg1, arg2;
4575 enum machine_mode mode0, mode1, mode2;
7c3abc73 4576 rtx pat, op0, op1, op2;
3a9b8c7e 4577 struct builtin_description *d;
a3170dc6 4578 size_t i;
f18c054f 4579
3a9b8c7e 4580 *expandedp = false;
f18c054f 4581
3a9b8c7e
AH
4582 /* Handle DST variants. */
4583 d = (struct builtin_description *) bdesc_dst;
4584 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
4585 if (d->code == fcode)
4586 {
4587 arg0 = TREE_VALUE (arglist);
4588 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
4589 arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
4590 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4591 op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4592 op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
4593 mode0 = insn_data[d->icode].operand[0].mode;
4594 mode1 = insn_data[d->icode].operand[1].mode;
4595 mode2 = insn_data[d->icode].operand[2].mode;
24408032 4596
3a9b8c7e
AH
4597 /* Invalid arguments, bail out before generating bad rtl. */
4598 if (arg0 == error_mark_node
4599 || arg1 == error_mark_node
4600 || arg2 == error_mark_node)
4601 return const0_rtx;
f18c054f 4602
3a9b8c7e
AH
4603 if (TREE_CODE (arg2) != INTEGER_CST
4604 || TREE_INT_CST_LOW (arg2) & ~0x3)
4605 {
4606 error ("argument to `%s' must be a 2-bit unsigned literal", d->name);
4607 return const0_rtx;
4608 }
f18c054f 4609
3a9b8c7e
AH
4610 if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
4611 op0 = copy_to_mode_reg (mode0, op0);
4612 if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
4613 op1 = copy_to_mode_reg (mode1, op1);
24408032 4614
3a9b8c7e
AH
4615 pat = GEN_FCN (d->icode) (op0, op1, op2);
4616 if (pat != 0)
4617 emit_insn (pat);
f18c054f 4618
3a9b8c7e
AH
4619 *expandedp = true;
4620 return NULL_RTX;
4621 }
f18c054f 4622
3a9b8c7e
AH
4623 return NULL_RTX;
4624}
24408032 4625
3a9b8c7e
AH
4626/* Expand the builtin in EXP and store the result in TARGET. Store
4627 true in *EXPANDEDP if we found a builtin to expand. */
4628static rtx
4629altivec_expand_builtin (exp, target, expandedp)
4630 tree exp;
4631 rtx target;
4632 bool *expandedp;
4633{
4634 struct builtin_description *d;
4635 struct builtin_description_predicates *dp;
4636 size_t i;
4637 enum insn_code icode;
4638 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4639 tree arglist = TREE_OPERAND (exp, 1);
7c3abc73
AH
4640 tree arg0;
4641 rtx op0, pat;
4642 enum machine_mode tmode, mode0;
3a9b8c7e 4643 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
0ac081f6 4644
3a9b8c7e
AH
4645 target = altivec_expand_ld_builtin (exp, target, expandedp);
4646 if (*expandedp)
4647 return target;
0ac081f6 4648
3a9b8c7e
AH
4649 target = altivec_expand_st_builtin (exp, target, expandedp);
4650 if (*expandedp)
4651 return target;
4652
4653 target = altivec_expand_dst_builtin (exp, target, expandedp);
4654 if (*expandedp)
4655 return target;
4656
4657 *expandedp = true;
95385cbb 4658
3a9b8c7e
AH
4659 switch (fcode)
4660 {
6525c0e7
AH
4661 case ALTIVEC_BUILTIN_STVX:
4662 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, arglist);
4663 case ALTIVEC_BUILTIN_STVEBX:
4664 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, arglist);
4665 case ALTIVEC_BUILTIN_STVEHX:
4666 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, arglist);
4667 case ALTIVEC_BUILTIN_STVEWX:
4668 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, arglist);
4669 case ALTIVEC_BUILTIN_STVXL:
4670 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, arglist);
3a9b8c7e 4671
95385cbb
AH
4672 case ALTIVEC_BUILTIN_MFVSCR:
4673 icode = CODE_FOR_altivec_mfvscr;
4674 tmode = insn_data[icode].operand[0].mode;
4675
4676 if (target == 0
4677 || GET_MODE (target) != tmode
4678 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4679 target = gen_reg_rtx (tmode);
4680
4681 pat = GEN_FCN (icode) (target);
0ac081f6
AH
4682 if (! pat)
4683 return 0;
4684 emit_insn (pat);
95385cbb
AH
4685 return target;
4686
4687 case ALTIVEC_BUILTIN_MTVSCR:
4688 icode = CODE_FOR_altivec_mtvscr;
4689 arg0 = TREE_VALUE (arglist);
4690 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4691 mode0 = insn_data[icode].operand[0].mode;
4692
4693 /* If we got invalid arguments bail out before generating bad rtl. */
4694 if (arg0 == error_mark_node)
9a171fcd 4695 return const0_rtx;
95385cbb
AH
4696
4697 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
4698 op0 = copy_to_mode_reg (mode0, op0);
4699
4700 pat = GEN_FCN (icode) (op0);
4701 if (pat)
4702 emit_insn (pat);
4703 return NULL_RTX;
3a9b8c7e 4704
95385cbb
AH
4705 case ALTIVEC_BUILTIN_DSSALL:
4706 emit_insn (gen_altivec_dssall ());
4707 return NULL_RTX;
4708
4709 case ALTIVEC_BUILTIN_DSS:
4710 icode = CODE_FOR_altivec_dss;
4711 arg0 = TREE_VALUE (arglist);
4712 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4713 mode0 = insn_data[icode].operand[0].mode;
4714
4715 /* If we got invalid arguments bail out before generating bad rtl. */
4716 if (arg0 == error_mark_node)
9a171fcd 4717 return const0_rtx;
95385cbb 4718
b44140e7
AH
4719 if (TREE_CODE (arg0) != INTEGER_CST
4720 || TREE_INT_CST_LOW (arg0) & ~0x3)
4721 {
4722 error ("argument to dss must be a 2-bit unsigned literal");
9a171fcd 4723 return const0_rtx;
b44140e7
AH
4724 }
4725
95385cbb
AH
4726 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
4727 op0 = copy_to_mode_reg (mode0, op0);
4728
4729 emit_insn (gen_altivec_dss (op0));
0ac081f6
AH
4730 return NULL_RTX;
4731 }
24408032 4732
100c4561
AH
4733 /* Expand abs* operations. */
4734 d = (struct builtin_description *) bdesc_abs;
ca7558fc 4735 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
100c4561
AH
4736 if (d->code == fcode)
4737 return altivec_expand_abs_builtin (d->icode, arglist, target);
4738
ae4b4a02
AH
4739 /* Expand the AltiVec predicates. */
4740 dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
ca7558fc 4741 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
ae4b4a02
AH
4742 if (dp->code == fcode)
4743 return altivec_expand_predicate_builtin (dp->icode, dp->opcode, arglist, target);
4744
6525c0e7
AH
4745 /* LV* are funky. We initialized them differently. */
4746 switch (fcode)
4747 {
4748 case ALTIVEC_BUILTIN_LVSL:
92898235 4749 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvsl,
6525c0e7
AH
4750 arglist, target);
4751 case ALTIVEC_BUILTIN_LVSR:
92898235
AH
4752 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvsr,
4753 arglist, target);
6525c0e7 4754 case ALTIVEC_BUILTIN_LVEBX:
92898235
AH
4755 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvebx,
4756 arglist, target);
6525c0e7 4757 case ALTIVEC_BUILTIN_LVEHX:
92898235
AH
4758 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvehx,
4759 arglist, target);
6525c0e7 4760 case ALTIVEC_BUILTIN_LVEWX:
92898235
AH
4761 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvewx,
4762 arglist, target);
6525c0e7 4763 case ALTIVEC_BUILTIN_LVXL:
92898235
AH
4764 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvxl,
4765 arglist, target);
6525c0e7 4766 case ALTIVEC_BUILTIN_LVX:
92898235
AH
4767 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvx,
4768 arglist, target);
6525c0e7
AH
4769 default:
4770 break;
4771 /* Fall through. */
4772 }
95385cbb 4773
92898235 4774 *expandedp = false;
0ac081f6
AH
4775 return NULL_RTX;
4776}
4777
a3170dc6
AH
4778/* Binops that need to be initialized manually, but can be expanded
4779 automagically by rs6000_expand_binop_builtin. */
4780static struct builtin_description bdesc_2arg_spe[] =
4781{
4782 { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
4783 { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
4784 { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
4785 { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
4786 { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
4787 { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
4788 { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
4789 { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
4790 { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
4791 { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
4792 { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
4793 { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
4794 { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
4795 { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
4796 { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
4797 { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
4798 { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
4799 { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
4800 { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
4801 { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
4802 { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
4803 { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
4804};
4805
4806/* Expand the builtin in EXP and store the result in TARGET. Store
4807 true in *EXPANDEDP if we found a builtin to expand.
4808
4809 This expands the SPE builtins that are not simple unary and binary
4810 operations. */
4811static rtx
4812spe_expand_builtin (exp, target, expandedp)
4813 tree exp;
4814 rtx target;
4815 bool *expandedp;
4816{
4817 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4818 tree arglist = TREE_OPERAND (exp, 1);
4819 tree arg1, arg0;
4820 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
4821 enum insn_code icode;
4822 enum machine_mode tmode, mode0;
4823 rtx pat, op0;
4824 struct builtin_description *d;
4825 size_t i;
4826
4827 *expandedp = true;
4828
4829 /* Syntax check for a 5-bit unsigned immediate. */
4830 switch (fcode)
4831 {
4832 case SPE_BUILTIN_EVSTDD:
4833 case SPE_BUILTIN_EVSTDH:
4834 case SPE_BUILTIN_EVSTDW:
4835 case SPE_BUILTIN_EVSTWHE:
4836 case SPE_BUILTIN_EVSTWHO:
4837 case SPE_BUILTIN_EVSTWWE:
4838 case SPE_BUILTIN_EVSTWWO:
4839 arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
4840 if (TREE_CODE (arg1) != INTEGER_CST
4841 || TREE_INT_CST_LOW (arg1) & ~0x1f)
4842 {
4843 error ("argument 2 must be a 5-bit unsigned literal");
4844 return const0_rtx;
4845 }
4846 break;
4847 default:
4848 break;
4849 }
4850
4851 d = (struct builtin_description *) bdesc_2arg_spe;
4852 for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
4853 if (d->code == fcode)
4854 return rs6000_expand_binop_builtin (d->icode, arglist, target);
4855
4856 d = (struct builtin_description *) bdesc_spe_predicates;
4857 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
4858 if (d->code == fcode)
4859 return spe_expand_predicate_builtin (d->icode, arglist, target);
4860
4861 d = (struct builtin_description *) bdesc_spe_evsel;
4862 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
4863 if (d->code == fcode)
4864 return spe_expand_evsel_builtin (d->icode, arglist, target);
4865
4866 switch (fcode)
4867 {
4868 case SPE_BUILTIN_EVSTDDX:
4869 return altivec_expand_stv_builtin (CODE_FOR_spe_evstddx, arglist);
4870 case SPE_BUILTIN_EVSTDHX:
4871 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdhx, arglist);
4872 case SPE_BUILTIN_EVSTDWX:
4873 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdwx, arglist);
4874 case SPE_BUILTIN_EVSTWHEX:
4875 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwhex, arglist);
4876 case SPE_BUILTIN_EVSTWHOX:
4877 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwhox, arglist);
4878 case SPE_BUILTIN_EVSTWWEX:
4879 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwwex, arglist);
4880 case SPE_BUILTIN_EVSTWWOX:
4881 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwwox, arglist);
4882 case SPE_BUILTIN_EVSTDD:
4883 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdd, arglist);
4884 case SPE_BUILTIN_EVSTDH:
4885 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdh, arglist);
4886 case SPE_BUILTIN_EVSTDW:
4887 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdw, arglist);
4888 case SPE_BUILTIN_EVSTWHE:
4889 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwhe, arglist);
4890 case SPE_BUILTIN_EVSTWHO:
4891 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwho, arglist);
4892 case SPE_BUILTIN_EVSTWWE:
4893 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwwe, arglist);
4894 case SPE_BUILTIN_EVSTWWO:
4895 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwwo, arglist);
4896 case SPE_BUILTIN_MFSPEFSCR:
4897 icode = CODE_FOR_spe_mfspefscr;
4898 tmode = insn_data[icode].operand[0].mode;
4899
4900 if (target == 0
4901 || GET_MODE (target) != tmode
4902 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4903 target = gen_reg_rtx (tmode);
4904
4905 pat = GEN_FCN (icode) (target);
4906 if (! pat)
4907 return 0;
4908 emit_insn (pat);
4909 return target;
4910 case SPE_BUILTIN_MTSPEFSCR:
4911 icode = CODE_FOR_spe_mtspefscr;
4912 arg0 = TREE_VALUE (arglist);
4913 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4914 mode0 = insn_data[icode].operand[0].mode;
4915
4916 if (arg0 == error_mark_node)
4917 return const0_rtx;
4918
4919 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
4920 op0 = copy_to_mode_reg (mode0, op0);
4921
4922 pat = GEN_FCN (icode) (op0);
4923 if (pat)
4924 emit_insn (pat);
4925 return NULL_RTX;
4926 default:
4927 break;
4928 }
4929
4930 *expandedp = false;
4931 return NULL_RTX;
4932}
4933
4934static rtx
4935spe_expand_predicate_builtin (icode, arglist, target)
4936 enum insn_code icode;
4937 tree arglist;
4938 rtx target;
4939{
4940 rtx pat, scratch, tmp;
4941 tree form = TREE_VALUE (arglist);
4942 tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
4943 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
4944 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4945 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4946 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4947 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
4948 int form_int;
4949 enum rtx_code code;
4950
4951 if (TREE_CODE (form) != INTEGER_CST)
4952 {
4953 error ("argument 1 of __builtin_spe_predicate must be a constant");
4954 return const0_rtx;
4955 }
4956 else
4957 form_int = TREE_INT_CST_LOW (form);
4958
4959 if (mode0 != mode1)
4960 abort ();
4961
4962 if (arg0 == error_mark_node || arg1 == error_mark_node)
4963 return const0_rtx;
4964
4965 if (target == 0
4966 || GET_MODE (target) != SImode
4967 || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
4968 target = gen_reg_rtx (SImode);
4969
4970 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4971 op0 = copy_to_mode_reg (mode0, op0);
4972 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
4973 op1 = copy_to_mode_reg (mode1, op1);
4974
4975 scratch = gen_reg_rtx (CCmode);
4976
4977 pat = GEN_FCN (icode) (scratch, op0, op1);
4978 if (! pat)
4979 return const0_rtx;
4980 emit_insn (pat);
4981
4982 /* There are 4 variants for each predicate: _any_, _all_, _upper_,
4983 _lower_. We use one compare, but look in different bits of the
4984 CR for each variant.
4985
4986 There are 2 elements in each SPE simd type (upper/lower). The CR
4987 bits are set as follows:
4988
4989 BIT0 | BIT 1 | BIT 2 | BIT 3
4990 U | L | (U | L) | (U & L)
4991
4992 So, for an "all" relationship, BIT 3 would be set.
4993 For an "any" relationship, BIT 2 would be set. Etc.
4994
4995 Following traditional nomenclature, these bits map to:
4996
4997 BIT0 | BIT 1 | BIT 2 | BIT 3
4998 LT | GT | EQ | OV
4999
5000 Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
5001 */
5002
5003 switch (form_int)
5004 {
5005 /* All variant. OV bit. */
5006 case 0:
5007 /* We need to get to the OV bit, which is the ORDERED bit. We
5008 could generate (ordered:SI (reg:CC xx) (const_int 0)), but
5009 that's ugly and will trigger a validate_condition_mode abort.
5010 So let's just use another pattern. */
5011 emit_insn (gen_move_from_CR_ov_bit (target, scratch));
5012 return target;
5013 /* Any variant. EQ bit. */
5014 case 1:
5015 code = EQ;
5016 break;
5017 /* Upper variant. LT bit. */
5018 case 2:
5019 code = LT;
5020 break;
5021 /* Lower variant. GT bit. */
5022 case 3:
5023 code = GT;
5024 break;
5025 default:
5026 error ("argument 1 of __builtin_spe_predicate is out of range");
5027 return const0_rtx;
5028 }
5029
5030 tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
5031 emit_move_insn (target, tmp);
5032
5033 return target;
5034}
5035
5036/* The evsel builtins look like this:
5037
5038 e = __builtin_spe_evsel_OP (a, b, c, d);
5039
5040 and work like this:
5041
5042 e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
5043 e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
5044*/
5045
5046static rtx
5047spe_expand_evsel_builtin (icode, arglist, target)
5048 enum insn_code icode;
5049 tree arglist;
5050 rtx target;
5051{
5052 rtx pat, scratch;
5053 tree arg0 = TREE_VALUE (arglist);
5054 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
5055 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
5056 tree arg3 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist))));
5057 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5058 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
5059 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
5060 rtx op3 = expand_expr (arg3, NULL_RTX, VOIDmode, 0);
5061 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
5062 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
5063
5064 if (mode0 != mode1)
5065 abort ();
5066
5067 if (arg0 == error_mark_node || arg1 == error_mark_node
5068 || arg2 == error_mark_node || arg3 == error_mark_node)
5069 return const0_rtx;
5070
5071 if (target == 0
5072 || GET_MODE (target) != mode0
5073 || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
5074 target = gen_reg_rtx (mode0);
5075
5076 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
5077 op0 = copy_to_mode_reg (mode0, op0);
5078 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
5079 op1 = copy_to_mode_reg (mode0, op1);
5080 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
5081 op2 = copy_to_mode_reg (mode0, op2);
5082 if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
5083 op3 = copy_to_mode_reg (mode0, op3);
5084
5085 /* Generate the compare. */
5086 scratch = gen_reg_rtx (CCmode);
5087 pat = GEN_FCN (icode) (scratch, op0, op1);
5088 if (! pat)
5089 return const0_rtx;
5090 emit_insn (pat);
5091
5092 if (mode0 == V2SImode)
5093 emit_insn (gen_spe_evsel (target, op2, op3, scratch));
5094 else
5095 emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
5096
5097 return target;
5098}
5099
0ac081f6
AH
5100/* Expand an expression EXP that calls a built-in function,
5101 with result going to TARGET if that's convenient
5102 (and in mode MODE if that's convenient).
5103 SUBTARGET may be used as the target for computing one of EXP's operands.
5104 IGNORE is nonzero if the value is to be ignored. */
5105
5106static rtx
5107rs6000_expand_builtin (exp, target, subtarget, mode, ignore)
5108 tree exp;
5109 rtx target;
00b960c7
AH
5110 rtx subtarget ATTRIBUTE_UNUSED;
5111 enum machine_mode mode ATTRIBUTE_UNUSED;
5112 int ignore ATTRIBUTE_UNUSED;
0ac081f6 5113{
92898235
AH
5114 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
5115 tree arglist = TREE_OPERAND (exp, 1);
5116 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
5117 struct builtin_description *d;
5118 size_t i;
5119 rtx ret;
5120 bool success;
5121
0ac081f6 5122 if (TARGET_ALTIVEC)
92898235
AH
5123 {
5124 ret = altivec_expand_builtin (exp, target, &success);
5125
a3170dc6
AH
5126 if (success)
5127 return ret;
5128 }
5129 if (TARGET_SPE)
5130 {
5131 ret = spe_expand_builtin (exp, target, &success);
5132
92898235
AH
5133 if (success)
5134 return ret;
5135 }
5136
0559cc77
DE
5137 if (TARGET_ALTIVEC || TARGET_SPE)
5138 {
5139 /* Handle simple unary operations. */
5140 d = (struct builtin_description *) bdesc_1arg;
5141 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
5142 if (d->code == fcode)
5143 return rs6000_expand_unop_builtin (d->icode, arglist, target);
5144
5145 /* Handle simple binary operations. */
5146 d = (struct builtin_description *) bdesc_2arg;
5147 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
5148 if (d->code == fcode)
5149 return rs6000_expand_binop_builtin (d->icode, arglist, target);
5150
5151 /* Handle simple ternary operations. */
5152 d = (struct builtin_description *) bdesc_3arg;
5153 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
5154 if (d->code == fcode)
5155 return rs6000_expand_ternop_builtin (d->icode, arglist, target);
5156 }
0ac081f6
AH
5157
5158 abort ();
92898235 5159 return NULL_RTX;
0ac081f6
AH
5160}
5161
5162static void
6fa3f289 5163rs6000_init_builtins ()
0ac081f6 5164{
a3170dc6
AH
5165 if (TARGET_SPE)
5166 spe_init_builtins ();
0ac081f6
AH
5167 if (TARGET_ALTIVEC)
5168 altivec_init_builtins ();
0559cc77
DE
5169 if (TARGET_ALTIVEC || TARGET_SPE)
5170 rs6000_common_init_builtins ();
0ac081f6
AH
5171}
5172
a3170dc6
AH
5173/* Search through a set of builtins and enable the mask bits.
5174 DESC is an array of builtins.
5175 SIZE is the totaly number of builtins.
5176 START is the builtin enum at which to start.
5177 END is the builtin enum at which to end. */
0ac081f6 5178static void
a3170dc6
AH
5179enable_mask_for_builtins (desc, size, start, end)
5180 struct builtin_description *desc;
5181 int size;
5182 enum rs6000_builtins start, end;
5183{
5184 int i;
5185
5186 for (i = 0; i < size; ++i)
5187 if (desc[i].code == start)
5188 break;
5189
5190 if (i == size)
5191 return;
5192
5193 for (; i < size; ++i)
5194 {
5195 /* Flip all the bits on. */
5196 desc[i].mask = target_flags;
5197 if (desc[i].code == end)
5198 break;
5199 }
5200}
5201
5202static void
b24c9d35 5203spe_init_builtins ()
0ac081f6 5204{
a3170dc6
AH
5205 tree endlink = void_list_node;
5206 tree puint_type_node = build_pointer_type (unsigned_type_node);
5207 tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
5208 tree pv2si_type_node = build_pointer_type (V2SI_type_node);
ae4b4a02 5209 struct builtin_description *d;
0ac081f6
AH
5210 size_t i;
5211
a3170dc6
AH
5212 tree v2si_ftype_4_v2si
5213 = build_function_type
5214 (V2SI_type_node,
5215 tree_cons (NULL_TREE, V2SI_type_node,
5216 tree_cons (NULL_TREE, V2SI_type_node,
5217 tree_cons (NULL_TREE, V2SI_type_node,
5218 tree_cons (NULL_TREE, V2SI_type_node,
5219 endlink)))));
5220
5221 tree v2sf_ftype_4_v2sf
5222 = build_function_type
5223 (V2SF_type_node,
5224 tree_cons (NULL_TREE, V2SF_type_node,
5225 tree_cons (NULL_TREE, V2SF_type_node,
5226 tree_cons (NULL_TREE, V2SF_type_node,
5227 tree_cons (NULL_TREE, V2SF_type_node,
5228 endlink)))));
5229
5230 tree int_ftype_int_v2si_v2si
5231 = build_function_type
5232 (integer_type_node,
5233 tree_cons (NULL_TREE, integer_type_node,
5234 tree_cons (NULL_TREE, V2SI_type_node,
5235 tree_cons (NULL_TREE, V2SI_type_node,
5236 endlink))));
5237
5238 tree int_ftype_int_v2sf_v2sf
5239 = build_function_type
5240 (integer_type_node,
5241 tree_cons (NULL_TREE, integer_type_node,
5242 tree_cons (NULL_TREE, V2SF_type_node,
5243 tree_cons (NULL_TREE, V2SF_type_node,
5244 endlink))));
5245
5246 tree void_ftype_v2si_puint_int
5247 = build_function_type (void_type_node,
5248 tree_cons (NULL_TREE, V2SI_type_node,
5249 tree_cons (NULL_TREE, puint_type_node,
5250 tree_cons (NULL_TREE,
5251 integer_type_node,
5252 endlink))));
5253
5254 tree void_ftype_v2si_puint_char
5255 = build_function_type (void_type_node,
5256 tree_cons (NULL_TREE, V2SI_type_node,
5257 tree_cons (NULL_TREE, puint_type_node,
5258 tree_cons (NULL_TREE,
5259 char_type_node,
5260 endlink))));
5261
5262 tree void_ftype_v2si_pv2si_int
5263 = build_function_type (void_type_node,
5264 tree_cons (NULL_TREE, V2SI_type_node,
5265 tree_cons (NULL_TREE, pv2si_type_node,
5266 tree_cons (NULL_TREE,
5267 integer_type_node,
5268 endlink))));
5269
5270 tree void_ftype_v2si_pv2si_char
5271 = build_function_type (void_type_node,
5272 tree_cons (NULL_TREE, V2SI_type_node,
5273 tree_cons (NULL_TREE, pv2si_type_node,
5274 tree_cons (NULL_TREE,
5275 char_type_node,
5276 endlink))));
5277
5278 tree void_ftype_int
5279 = build_function_type (void_type_node,
5280 tree_cons (NULL_TREE, integer_type_node, endlink));
5281
5282 tree int_ftype_void
5283 = build_function_type (integer_type_node,
5284 tree_cons (NULL_TREE, void_type_node, endlink));
5285
5286 tree v2si_ftype_pv2si_int
5287 = build_function_type (V2SI_type_node,
5288 tree_cons (NULL_TREE, pv2si_type_node,
5289 tree_cons (NULL_TREE, integer_type_node,
5290 endlink)));
5291
5292 tree v2si_ftype_puint_int
5293 = build_function_type (V2SI_type_node,
5294 tree_cons (NULL_TREE, puint_type_node,
5295 tree_cons (NULL_TREE, integer_type_node,
5296 endlink)));
5297
5298 tree v2si_ftype_pushort_int
5299 = build_function_type (V2SI_type_node,
5300 tree_cons (NULL_TREE, pushort_type_node,
5301 tree_cons (NULL_TREE, integer_type_node,
5302 endlink)));
5303
5304 /* The initialization of the simple binary and unary builtins is
5305 done in rs6000_common_init_builtins, but we have to enable the
5306 mask bits here manually because we have run out of `target_flags'
5307 bits. We really need to redesign this mask business. */
5308
5309 enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
5310 ARRAY_SIZE (bdesc_2arg),
5311 SPE_BUILTIN_EVADDW,
5312 SPE_BUILTIN_EVXOR);
5313 enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
5314 ARRAY_SIZE (bdesc_1arg),
5315 SPE_BUILTIN_EVABS,
5316 SPE_BUILTIN_EVSUBFUSIAAW);
5317 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
5318 ARRAY_SIZE (bdesc_spe_predicates),
5319 SPE_BUILTIN_EVCMPEQ,
5320 SPE_BUILTIN_EVFSTSTLT);
5321 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
5322 ARRAY_SIZE (bdesc_spe_evsel),
5323 SPE_BUILTIN_EVSEL_CMPGTS,
5324 SPE_BUILTIN_EVSEL_FSTSTEQ);
5325
5326 /* Initialize irregular SPE builtins. */
5327
5328 def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
5329 def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
5330 def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
5331 def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
5332 def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
5333 def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
5334 def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
5335 def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
5336 def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
5337 def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
5338 def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
5339 def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
5340 def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
5341 def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
5342 def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
5343 def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
5344
5345 /* Loads. */
5346 def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
5347 def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
5348 def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
5349 def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
5350 def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
5351 def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
5352 def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
5353 def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
5354 def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
5355 def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
5356 def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
5357 def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
5358 def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
5359 def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
5360 def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
5361 def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
5362 def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
5363 def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
5364 def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
5365 def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
5366 def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
5367 def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
5368
5369 /* Predicates. */
5370 d = (struct builtin_description *) bdesc_spe_predicates;
5371 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
5372 {
5373 tree type;
5374
5375 switch (insn_data[d->icode].operand[1].mode)
5376 {
5377 case V2SImode:
5378 type = int_ftype_int_v2si_v2si;
5379 break;
5380 case V2SFmode:
5381 type = int_ftype_int_v2sf_v2sf;
5382 break;
5383 default:
5384 abort ();
5385 }
5386
5387 def_builtin (d->mask, d->name, type, d->code);
5388 }
5389
5390 /* Evsel predicates. */
5391 d = (struct builtin_description *) bdesc_spe_evsel;
5392 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
5393 {
5394 tree type;
5395
5396 switch (insn_data[d->icode].operand[1].mode)
5397 {
5398 case V2SImode:
5399 type = v2si_ftype_4_v2si;
5400 break;
5401 case V2SFmode:
5402 type = v2sf_ftype_4_v2sf;
5403 break;
5404 default:
5405 abort ();
5406 }
5407
5408 def_builtin (d->mask, d->name, type, d->code);
5409 }
5410}
5411
5412static void
b24c9d35 5413altivec_init_builtins ()
a3170dc6
AH
5414{
5415 struct builtin_description *d;
5416 struct builtin_description_predicates *dp;
5417 size_t i;
5418 tree pfloat_type_node = build_pointer_type (float_type_node);
5419 tree pint_type_node = build_pointer_type (integer_type_node);
5420 tree pshort_type_node = build_pointer_type (short_integer_type_node);
5421 tree pchar_type_node = build_pointer_type (char_type_node);
5422
5423 tree pvoid_type_node = build_pointer_type (void_type_node);
5424
5425 tree int_ftype_int_v4si_v4si
5426 = build_function_type_list (integer_type_node,
5427 integer_type_node, V4SI_type_node,
5428 V4SI_type_node, NULL_TREE);
f18c054f 5429 tree v4sf_ftype_pfloat
b4de2f7d 5430 = build_function_type_list (V4SF_type_node, pfloat_type_node, NULL_TREE);
a3170dc6 5431 tree void_ftype_pfloat_v4sf
b4de2f7d 5432 = build_function_type_list (void_type_node,
a3170dc6
AH
5433 pfloat_type_node, V4SF_type_node, NULL_TREE);
5434 tree v4si_ftype_pint
5435 = build_function_type_list (V4SI_type_node, pint_type_node, NULL_TREE); tree void_ftype_pint_v4si
b4de2f7d
AH
5436 = build_function_type_list (void_type_node,
5437 pint_type_node, V4SI_type_node, NULL_TREE);
a3170dc6
AH
5438 tree v8hi_ftype_pshort
5439 = build_function_type_list (V8HI_type_node, pshort_type_node, NULL_TREE);
f18c054f 5440 tree void_ftype_pshort_v8hi
b4de2f7d
AH
5441 = build_function_type_list (void_type_node,
5442 pshort_type_node, V8HI_type_node, NULL_TREE);
a3170dc6
AH
5443 tree v16qi_ftype_pchar
5444 = build_function_type_list (V16QI_type_node, pchar_type_node, NULL_TREE);
f18c054f 5445 tree void_ftype_pchar_v16qi
b4de2f7d
AH
5446 = build_function_type_list (void_type_node,
5447 pchar_type_node, V16QI_type_node, NULL_TREE);
95385cbb 5448 tree void_ftype_v4si
b4de2f7d 5449 = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
a3170dc6
AH
5450 tree v8hi_ftype_void
5451 = build_function_type (V8HI_type_node, void_list_node);
5452 tree void_ftype_void
5453 = build_function_type (void_type_node, void_list_node);
5454 tree void_ftype_qi
5455 = build_function_type_list (void_type_node, char_type_node, NULL_TREE);
5456 tree v16qi_ftype_int_pvoid
5457 = build_function_type_list (V16QI_type_node,
5458 integer_type_node, pvoid_type_node, NULL_TREE);
5459 tree v8hi_ftype_int_pvoid
5460 = build_function_type_list (V8HI_type_node,
5461 integer_type_node, pvoid_type_node, NULL_TREE);
5462 tree v4si_ftype_int_pvoid
5463 = build_function_type_list (V4SI_type_node,
5464 integer_type_node, pvoid_type_node, NULL_TREE);
14b32f4e 5465 tree void_ftype_v4si_int_pvoid
b4de2f7d
AH
5466 = build_function_type_list (void_type_node,
5467 V4SI_type_node, integer_type_node,
5468 pvoid_type_node, NULL_TREE);
6525c0e7 5469 tree void_ftype_v16qi_int_pvoid
b4de2f7d
AH
5470 = build_function_type_list (void_type_node,
5471 V16QI_type_node, integer_type_node,
5472 pvoid_type_node, NULL_TREE);
6525c0e7 5473 tree void_ftype_v8hi_int_pvoid
b4de2f7d
AH
5474 = build_function_type_list (void_type_node,
5475 V8HI_type_node, integer_type_node,
5476 pvoid_type_node, NULL_TREE);
a3170dc6
AH
5477 tree int_ftype_int_v8hi_v8hi
5478 = build_function_type_list (integer_type_node,
5479 integer_type_node, V8HI_type_node,
5480 V8HI_type_node, NULL_TREE);
5481 tree int_ftype_int_v16qi_v16qi
5482 = build_function_type_list (integer_type_node,
5483 integer_type_node, V16QI_type_node,
5484 V16QI_type_node, NULL_TREE);
5485 tree int_ftype_int_v4sf_v4sf
5486 = build_function_type_list (integer_type_node,
5487 integer_type_node, V4SF_type_node,
5488 V4SF_type_node, NULL_TREE);
5489 tree v4si_ftype_v4si
5490 = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
5491 tree v8hi_ftype_v8hi
5492 = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
5493 tree v16qi_ftype_v16qi
5494 = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
5495 tree v4sf_ftype_v4sf
5496 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
5497 tree void_ftype_pvoid_int_char
5498 = build_function_type_list (void_type_node,
5499 pvoid_type_node, integer_type_node,
5500 char_type_node, NULL_TREE);
5501
5502 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4sf", v4sf_ftype_pfloat, ALTIVEC_BUILTIN_LD_INTERNAL_4sf);
5503 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4sf", void_ftype_pfloat_v4sf, ALTIVEC_BUILTIN_ST_INTERNAL_4sf);
5504 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4si", v4si_ftype_pint, ALTIVEC_BUILTIN_LD_INTERNAL_4si);
5505 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4si", void_ftype_pint_v4si, ALTIVEC_BUILTIN_ST_INTERNAL_4si);
5506 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_8hi", v8hi_ftype_pshort, ALTIVEC_BUILTIN_LD_INTERNAL_8hi);
5507 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_8hi", void_ftype_pshort_v8hi, ALTIVEC_BUILTIN_ST_INTERNAL_8hi);
5508 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_16qi", v16qi_ftype_pchar, ALTIVEC_BUILTIN_LD_INTERNAL_16qi);
5509 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_16qi", void_ftype_pchar_v16qi, ALTIVEC_BUILTIN_ST_INTERNAL_16qi);
5510 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
5511 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
5512 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
5513 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_qi, ALTIVEC_BUILTIN_DSS);
5514 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_int_pvoid, ALTIVEC_BUILTIN_LVSL);
5515 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_int_pvoid, ALTIVEC_BUILTIN_LVSR);
5516 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_int_pvoid, ALTIVEC_BUILTIN_LVEBX);
5517 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_int_pvoid, ALTIVEC_BUILTIN_LVEHX);
5518 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_int_pvoid, ALTIVEC_BUILTIN_LVEWX);
5519 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_int_pvoid, ALTIVEC_BUILTIN_LVXL);
5520 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_int_pvoid, ALTIVEC_BUILTIN_LVX);
5521 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_int_pvoid, ALTIVEC_BUILTIN_STVX);
5522 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_int_pvoid, ALTIVEC_BUILTIN_STVEWX);
5523 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_int_pvoid, ALTIVEC_BUILTIN_STVXL);
5524 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_int_pvoid, ALTIVEC_BUILTIN_STVEBX);
5525 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_int_pvoid, ALTIVEC_BUILTIN_STVEHX);
5526
5527 /* Add the DST variants. */
5528 d = (struct builtin_description *) bdesc_dst;
5529 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
5530 def_builtin (d->mask, d->name, void_ftype_pvoid_int_char, d->code);
5531
5532 /* Initialize the predicates. */
5533 dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
5534 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
5535 {
5536 enum machine_mode mode1;
5537 tree type;
5538
5539 mode1 = insn_data[dp->icode].operand[1].mode;
5540
5541 switch (mode1)
5542 {
5543 case V4SImode:
5544 type = int_ftype_int_v4si_v4si;
5545 break;
5546 case V8HImode:
5547 type = int_ftype_int_v8hi_v8hi;
5548 break;
5549 case V16QImode:
5550 type = int_ftype_int_v16qi_v16qi;
5551 break;
5552 case V4SFmode:
5553 type = int_ftype_int_v4sf_v4sf;
5554 break;
5555 default:
5556 abort ();
5557 }
5558
5559 def_builtin (dp->mask, dp->name, type, dp->code);
5560 }
5561
5562 /* Initialize the abs* operators. */
5563 d = (struct builtin_description *) bdesc_abs;
5564 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
5565 {
5566 enum machine_mode mode0;
5567 tree type;
5568
5569 mode0 = insn_data[d->icode].operand[0].mode;
5570
5571 switch (mode0)
5572 {
5573 case V4SImode:
5574 type = v4si_ftype_v4si;
5575 break;
5576 case V8HImode:
5577 type = v8hi_ftype_v8hi;
5578 break;
5579 case V16QImode:
5580 type = v16qi_ftype_v16qi;
5581 break;
5582 case V4SFmode:
5583 type = v4sf_ftype_v4sf;
5584 break;
5585 default:
5586 abort ();
5587 }
5588
5589 def_builtin (d->mask, d->name, type, d->code);
5590 }
5591}
5592
5593static void
b24c9d35 5594rs6000_common_init_builtins ()
a3170dc6
AH
5595{
5596 struct builtin_description *d;
5597 size_t i;
5598
5599 tree v4sf_ftype_v4sf_v4sf_v16qi
5600 = build_function_type_list (V4SF_type_node,
5601 V4SF_type_node, V4SF_type_node,
5602 V16QI_type_node, NULL_TREE);
5603 tree v4si_ftype_v4si_v4si_v16qi
5604 = build_function_type_list (V4SI_type_node,
5605 V4SI_type_node, V4SI_type_node,
5606 V16QI_type_node, NULL_TREE);
5607 tree v8hi_ftype_v8hi_v8hi_v16qi
5608 = build_function_type_list (V8HI_type_node,
5609 V8HI_type_node, V8HI_type_node,
5610 V16QI_type_node, NULL_TREE);
5611 tree v16qi_ftype_v16qi_v16qi_v16qi
5612 = build_function_type_list (V16QI_type_node,
5613 V16QI_type_node, V16QI_type_node,
5614 V16QI_type_node, NULL_TREE);
5615 tree v4si_ftype_char
5616 = build_function_type_list (V4SI_type_node, char_type_node, NULL_TREE);
5617 tree v8hi_ftype_char
5618 = build_function_type_list (V8HI_type_node, char_type_node, NULL_TREE);
5619 tree v16qi_ftype_char
5620 = build_function_type_list (V16QI_type_node, char_type_node, NULL_TREE);
5621 tree v8hi_ftype_v16qi
5622 = build_function_type_list (V8HI_type_node, V16QI_type_node, NULL_TREE);
5623 tree v4sf_ftype_v4sf
5624 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
5625
5626 tree v2si_ftype_v2si_v2si
5627 = build_function_type_list (V2SI_type_node,
5628 V2SI_type_node, V2SI_type_node, NULL_TREE);
5629
5630 tree v2sf_ftype_v2sf_v2sf
5631 = build_function_type_list (V2SF_type_node,
5632 V2SF_type_node, V2SF_type_node, NULL_TREE);
5633
5634 tree v2si_ftype_int_int
5635 = build_function_type_list (V2SI_type_node,
5636 integer_type_node, integer_type_node,
5637 NULL_TREE);
5638
5639 tree v2si_ftype_v2si
5640 = build_function_type_list (V2SI_type_node, V2SI_type_node, NULL_TREE);
5641
5642 tree v2sf_ftype_v2sf
5643 = build_function_type_list (V2SF_type_node,
5644 V2SF_type_node, NULL_TREE);
5645
5646 tree v2sf_ftype_v2si
5647 = build_function_type_list (V2SF_type_node,
5648 V2SI_type_node, NULL_TREE);
5649
5650 tree v2si_ftype_v2sf
5651 = build_function_type_list (V2SI_type_node,
5652 V2SF_type_node, NULL_TREE);
5653
5654 tree v2si_ftype_v2si_char
5655 = build_function_type_list (V2SI_type_node,
5656 V2SI_type_node, char_type_node, NULL_TREE);
5657
5658 tree v2si_ftype_int_char
5659 = build_function_type_list (V2SI_type_node,
5660 integer_type_node, char_type_node, NULL_TREE);
5661
5662 tree v2si_ftype_char
5663 = build_function_type_list (V2SI_type_node, char_type_node, NULL_TREE);
5664
5665 tree int_ftype_int_int
5666 = build_function_type_list (integer_type_node,
5667 integer_type_node, integer_type_node,
5668 NULL_TREE);
95385cbb 5669
0ac081f6 5670 tree v4si_ftype_v4si_v4si
b4de2f7d
AH
5671 = build_function_type_list (V4SI_type_node,
5672 V4SI_type_node, V4SI_type_node, NULL_TREE);
617e0e1d 5673 tree v4sf_ftype_v4si_char
b4de2f7d
AH
5674 = build_function_type_list (V4SF_type_node,
5675 V4SI_type_node, char_type_node, NULL_TREE);
617e0e1d 5676 tree v4si_ftype_v4sf_char
b4de2f7d
AH
5677 = build_function_type_list (V4SI_type_node,
5678 V4SF_type_node, char_type_node, NULL_TREE);
2212663f 5679 tree v4si_ftype_v4si_char
b4de2f7d
AH
5680 = build_function_type_list (V4SI_type_node,
5681 V4SI_type_node, char_type_node, NULL_TREE);
2212663f 5682 tree v8hi_ftype_v8hi_char
b4de2f7d
AH
5683 = build_function_type_list (V8HI_type_node,
5684 V8HI_type_node, char_type_node, NULL_TREE);
2212663f 5685 tree v16qi_ftype_v16qi_char
b4de2f7d
AH
5686 = build_function_type_list (V16QI_type_node,
5687 V16QI_type_node, char_type_node, NULL_TREE);
24408032 5688 tree v16qi_ftype_v16qi_v16qi_char
b4de2f7d
AH
5689 = build_function_type_list (V16QI_type_node,
5690 V16QI_type_node, V16QI_type_node,
5691 char_type_node, NULL_TREE);
24408032 5692 tree v8hi_ftype_v8hi_v8hi_char
b4de2f7d
AH
5693 = build_function_type_list (V8HI_type_node,
5694 V8HI_type_node, V8HI_type_node,
5695 char_type_node, NULL_TREE);
24408032 5696 tree v4si_ftype_v4si_v4si_char
b4de2f7d
AH
5697 = build_function_type_list (V4SI_type_node,
5698 V4SI_type_node, V4SI_type_node,
5699 char_type_node, NULL_TREE);
24408032 5700 tree v4sf_ftype_v4sf_v4sf_char
b4de2f7d
AH
5701 = build_function_type_list (V4SF_type_node,
5702 V4SF_type_node, V4SF_type_node,
5703 char_type_node, NULL_TREE);
0ac081f6 5704 tree v4sf_ftype_v4sf_v4sf
b4de2f7d
AH
5705 = build_function_type_list (V4SF_type_node,
5706 V4SF_type_node, V4SF_type_node, NULL_TREE);
617e0e1d 5707 tree v4sf_ftype_v4sf_v4sf_v4si
b4de2f7d
AH
5708 = build_function_type_list (V4SF_type_node,
5709 V4SF_type_node, V4SF_type_node,
5710 V4SI_type_node, NULL_TREE);
2212663f 5711 tree v4sf_ftype_v4sf_v4sf_v4sf
b4de2f7d
AH
5712 = build_function_type_list (V4SF_type_node,
5713 V4SF_type_node, V4SF_type_node,
5714 V4SF_type_node, NULL_TREE);
617e0e1d 5715 tree v4si_ftype_v4si_v4si_v4si
b4de2f7d
AH
5716 = build_function_type_list (V4SI_type_node,
5717 V4SI_type_node, V4SI_type_node,
5718 V4SI_type_node, NULL_TREE);
0ac081f6 5719 tree v8hi_ftype_v8hi_v8hi
b4de2f7d
AH
5720 = build_function_type_list (V8HI_type_node,
5721 V8HI_type_node, V8HI_type_node, NULL_TREE);
2212663f 5722 tree v8hi_ftype_v8hi_v8hi_v8hi
b4de2f7d
AH
5723 = build_function_type_list (V8HI_type_node,
5724 V8HI_type_node, V8HI_type_node,
5725 V8HI_type_node, NULL_TREE);
2212663f 5726 tree v4si_ftype_v8hi_v8hi_v4si
b4de2f7d
AH
5727 = build_function_type_list (V4SI_type_node,
5728 V8HI_type_node, V8HI_type_node,
5729 V4SI_type_node, NULL_TREE);
2212663f 5730 tree v4si_ftype_v16qi_v16qi_v4si
b4de2f7d
AH
5731 = build_function_type_list (V4SI_type_node,
5732 V16QI_type_node, V16QI_type_node,
5733 V4SI_type_node, NULL_TREE);
0ac081f6 5734 tree v16qi_ftype_v16qi_v16qi
b4de2f7d
AH
5735 = build_function_type_list (V16QI_type_node,
5736 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 5737 tree v4si_ftype_v4sf_v4sf
b4de2f7d
AH
5738 = build_function_type_list (V4SI_type_node,
5739 V4SF_type_node, V4SF_type_node, NULL_TREE);
0ac081f6 5740 tree v8hi_ftype_v16qi_v16qi
b4de2f7d
AH
5741 = build_function_type_list (V8HI_type_node,
5742 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 5743 tree v4si_ftype_v8hi_v8hi
b4de2f7d
AH
5744 = build_function_type_list (V4SI_type_node,
5745 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 5746 tree v8hi_ftype_v4si_v4si
b4de2f7d
AH
5747 = build_function_type_list (V8HI_type_node,
5748 V4SI_type_node, V4SI_type_node, NULL_TREE);
0ac081f6 5749 tree v16qi_ftype_v8hi_v8hi
b4de2f7d
AH
5750 = build_function_type_list (V16QI_type_node,
5751 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 5752 tree v4si_ftype_v16qi_v4si
b4de2f7d
AH
5753 = build_function_type_list (V4SI_type_node,
5754 V16QI_type_node, V4SI_type_node, NULL_TREE);
fa066a23 5755 tree v4si_ftype_v16qi_v16qi
b4de2f7d
AH
5756 = build_function_type_list (V4SI_type_node,
5757 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 5758 tree v4si_ftype_v8hi_v4si
b4de2f7d
AH
5759 = build_function_type_list (V4SI_type_node,
5760 V8HI_type_node, V4SI_type_node, NULL_TREE);
a3170dc6
AH
5761 tree v4si_ftype_v8hi
5762 = build_function_type_list (V4SI_type_node, V8HI_type_node, NULL_TREE);
5763 tree int_ftype_v4si_v4si
5764 = build_function_type_list (integer_type_node,
5765 V4SI_type_node, V4SI_type_node, NULL_TREE);
5766 tree int_ftype_v4sf_v4sf
5767 = build_function_type_list (integer_type_node,
5768 V4SF_type_node, V4SF_type_node, NULL_TREE);
5769 tree int_ftype_v16qi_v16qi
5770 = build_function_type_list (integer_type_node,
5771 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 5772 tree int_ftype_v8hi_v8hi
b4de2f7d
AH
5773 = build_function_type_list (integer_type_node,
5774 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 5775
6f317ef3 5776 /* Add the simple ternary operators. */
2212663f 5777 d = (struct builtin_description *) bdesc_3arg;
ca7558fc 5778 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
2212663f
DB
5779 {
5780
5781 enum machine_mode mode0, mode1, mode2, mode3;
5782 tree type;
5783
0559cc77 5784 if (d->name == 0 || d->icode == CODE_FOR_nothing)
2212663f
DB
5785 continue;
5786
5787 mode0 = insn_data[d->icode].operand[0].mode;
5788 mode1 = insn_data[d->icode].operand[1].mode;
5789 mode2 = insn_data[d->icode].operand[2].mode;
5790 mode3 = insn_data[d->icode].operand[3].mode;
5791
5792 /* When all four are of the same mode. */
5793 if (mode0 == mode1 && mode1 == mode2 && mode2 == mode3)
5794 {
5795 switch (mode0)
5796 {
617e0e1d
DB
5797 case V4SImode:
5798 type = v4si_ftype_v4si_v4si_v4si;
5799 break;
2212663f
DB
5800 case V4SFmode:
5801 type = v4sf_ftype_v4sf_v4sf_v4sf;
5802 break;
5803 case V8HImode:
5804 type = v8hi_ftype_v8hi_v8hi_v8hi;
5805 break;
5806 case V16QImode:
5807 type = v16qi_ftype_v16qi_v16qi_v16qi;
5808 break;
5809 default:
5810 abort();
5811 }
5812 }
5813 else if (mode0 == mode1 && mode1 == mode2 && mode3 == V16QImode)
5814 {
5815 switch (mode0)
5816 {
5817 case V4SImode:
5818 type = v4si_ftype_v4si_v4si_v16qi;
5819 break;
5820 case V4SFmode:
5821 type = v4sf_ftype_v4sf_v4sf_v16qi;
5822 break;
5823 case V8HImode:
5824 type = v8hi_ftype_v8hi_v8hi_v16qi;
5825 break;
5826 case V16QImode:
5827 type = v16qi_ftype_v16qi_v16qi_v16qi;
5828 break;
5829 default:
5830 abort();
5831 }
5832 }
5833 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode
5834 && mode3 == V4SImode)
24408032 5835 type = v4si_ftype_v16qi_v16qi_v4si;
2212663f
DB
5836 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode
5837 && mode3 == V4SImode)
24408032 5838 type = v4si_ftype_v8hi_v8hi_v4si;
617e0e1d
DB
5839 else if (mode0 == V4SFmode && mode1 == V4SFmode && mode2 == V4SFmode
5840 && mode3 == V4SImode)
24408032
AH
5841 type = v4sf_ftype_v4sf_v4sf_v4si;
5842
5843 /* vchar, vchar, vchar, 4 bit literal. */
5844 else if (mode0 == V16QImode && mode1 == mode0 && mode2 == mode0
5845 && mode3 == QImode)
5846 type = v16qi_ftype_v16qi_v16qi_char;
5847
5848 /* vshort, vshort, vshort, 4 bit literal. */
5849 else if (mode0 == V8HImode && mode1 == mode0 && mode2 == mode0
5850 && mode3 == QImode)
5851 type = v8hi_ftype_v8hi_v8hi_char;
5852
5853 /* vint, vint, vint, 4 bit literal. */
5854 else if (mode0 == V4SImode && mode1 == mode0 && mode2 == mode0
5855 && mode3 == QImode)
5856 type = v4si_ftype_v4si_v4si_char;
5857
5858 /* vfloat, vfloat, vfloat, 4 bit literal. */
5859 else if (mode0 == V4SFmode && mode1 == mode0 && mode2 == mode0
5860 && mode3 == QImode)
5861 type = v4sf_ftype_v4sf_v4sf_char;
5862
2212663f
DB
5863 else
5864 abort ();
5865
5866 def_builtin (d->mask, d->name, type, d->code);
5867 }
5868
0ac081f6 5869 /* Add the simple binary operators. */
00b960c7 5870 d = (struct builtin_description *) bdesc_2arg;
ca7558fc 5871 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
0ac081f6
AH
5872 {
5873 enum machine_mode mode0, mode1, mode2;
5874 tree type;
5875
0559cc77 5876 if (d->name == 0 || d->icode == CODE_FOR_nothing)
0ac081f6
AH
5877 continue;
5878
5879 mode0 = insn_data[d->icode].operand[0].mode;
5880 mode1 = insn_data[d->icode].operand[1].mode;
5881 mode2 = insn_data[d->icode].operand[2].mode;
5882
5883 /* When all three operands are of the same mode. */
5884 if (mode0 == mode1 && mode1 == mode2)
5885 {
5886 switch (mode0)
5887 {
5888 case V4SFmode:
5889 type = v4sf_ftype_v4sf_v4sf;
5890 break;
5891 case V4SImode:
5892 type = v4si_ftype_v4si_v4si;
5893 break;
5894 case V16QImode:
5895 type = v16qi_ftype_v16qi_v16qi;
5896 break;
5897 case V8HImode:
5898 type = v8hi_ftype_v8hi_v8hi;
5899 break;
a3170dc6
AH
5900 case V2SImode:
5901 type = v2si_ftype_v2si_v2si;
5902 break;
5903 case V2SFmode:
5904 type = v2sf_ftype_v2sf_v2sf;
5905 break;
5906 case SImode:
5907 type = int_ftype_int_int;
5908 break;
0ac081f6
AH
5909 default:
5910 abort ();
5911 }
5912 }
5913
5914 /* A few other combos we really don't want to do manually. */
5915
5916 /* vint, vfloat, vfloat. */
5917 else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == V4SFmode)
5918 type = v4si_ftype_v4sf_v4sf;
5919
5920 /* vshort, vchar, vchar. */
5921 else if (mode0 == V8HImode && mode1 == V16QImode && mode2 == V16QImode)
5922 type = v8hi_ftype_v16qi_v16qi;
5923
5924 /* vint, vshort, vshort. */
5925 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode)
5926 type = v4si_ftype_v8hi_v8hi;
5927
5928 /* vshort, vint, vint. */
5929 else if (mode0 == V8HImode && mode1 == V4SImode && mode2 == V4SImode)
5930 type = v8hi_ftype_v4si_v4si;
5931
5932 /* vchar, vshort, vshort. */
5933 else if (mode0 == V16QImode && mode1 == V8HImode && mode2 == V8HImode)
5934 type = v16qi_ftype_v8hi_v8hi;
5935
5936 /* vint, vchar, vint. */
5937 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V4SImode)
5938 type = v4si_ftype_v16qi_v4si;
5939
fa066a23
AH
5940 /* vint, vchar, vchar. */
5941 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode)
5942 type = v4si_ftype_v16qi_v16qi;
5943
0ac081f6
AH
5944 /* vint, vshort, vint. */
5945 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V4SImode)
5946 type = v4si_ftype_v8hi_v4si;
2212663f
DB
5947
5948 /* vint, vint, 5 bit literal. */
5949 else if (mode0 == V4SImode && mode1 == V4SImode && mode2 == QImode)
5950 type = v4si_ftype_v4si_char;
5951
5952 /* vshort, vshort, 5 bit literal. */
5953 else if (mode0 == V8HImode && mode1 == V8HImode && mode2 == QImode)
5954 type = v8hi_ftype_v8hi_char;
5955
5956 /* vchar, vchar, 5 bit literal. */
5957 else if (mode0 == V16QImode && mode1 == V16QImode && mode2 == QImode)
5958 type = v16qi_ftype_v16qi_char;
0ac081f6 5959
617e0e1d
DB
5960 /* vfloat, vint, 5 bit literal. */
5961 else if (mode0 == V4SFmode && mode1 == V4SImode && mode2 == QImode)
5962 type = v4sf_ftype_v4si_char;
5963
5964 /* vint, vfloat, 5 bit literal. */
5965 else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == QImode)
5966 type = v4si_ftype_v4sf_char;
5967
a3170dc6
AH
5968 else if (mode0 == V2SImode && mode1 == SImode && mode2 == SImode)
5969 type = v2si_ftype_int_int;
5970
5971 else if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
5972 type = v2si_ftype_v2si_char;
5973
5974 else if (mode0 == V2SImode && mode1 == SImode && mode2 == QImode)
5975 type = v2si_ftype_int_char;
5976
0ac081f6
AH
5977 /* int, x, x. */
5978 else if (mode0 == SImode)
5979 {
5980 switch (mode1)
5981 {
5982 case V4SImode:
5983 type = int_ftype_v4si_v4si;
5984 break;
5985 case V4SFmode:
5986 type = int_ftype_v4sf_v4sf;
5987 break;
5988 case V16QImode:
5989 type = int_ftype_v16qi_v16qi;
5990 break;
5991 case V8HImode:
5992 type = int_ftype_v8hi_v8hi;
5993 break;
5994 default:
5995 abort ();
5996 }
5997 }
5998
5999 else
6000 abort ();
6001
2212663f
DB
6002 def_builtin (d->mask, d->name, type, d->code);
6003 }
24408032 6004
2212663f
DB
6005 /* Add the simple unary operators. */
6006 d = (struct builtin_description *) bdesc_1arg;
ca7558fc 6007 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
2212663f
DB
6008 {
6009 enum machine_mode mode0, mode1;
6010 tree type;
6011
0559cc77 6012 if (d->name == 0 || d->icode == CODE_FOR_nothing)
2212663f
DB
6013 continue;
6014
6015 mode0 = insn_data[d->icode].operand[0].mode;
6016 mode1 = insn_data[d->icode].operand[1].mode;
6017
6018 if (mode0 == V4SImode && mode1 == QImode)
6019 type = v4si_ftype_char;
6020 else if (mode0 == V8HImode && mode1 == QImode)
6021 type = v8hi_ftype_char;
6022 else if (mode0 == V16QImode && mode1 == QImode)
6023 type = v16qi_ftype_char;
617e0e1d
DB
6024 else if (mode0 == V4SFmode && mode1 == V4SFmode)
6025 type = v4sf_ftype_v4sf;
20e26713
AH
6026 else if (mode0 == V8HImode && mode1 == V16QImode)
6027 type = v8hi_ftype_v16qi;
6028 else if (mode0 == V4SImode && mode1 == V8HImode)
6029 type = v4si_ftype_v8hi;
a3170dc6
AH
6030 else if (mode0 == V2SImode && mode1 == V2SImode)
6031 type = v2si_ftype_v2si;
6032 else if (mode0 == V2SFmode && mode1 == V2SFmode)
6033 type = v2sf_ftype_v2sf;
6034 else if (mode0 == V2SFmode && mode1 == V2SImode)
6035 type = v2sf_ftype_v2si;
6036 else if (mode0 == V2SImode && mode1 == V2SFmode)
6037 type = v2si_ftype_v2sf;
6038 else if (mode0 == V2SImode && mode1 == QImode)
6039 type = v2si_ftype_char;
2212663f
DB
6040 else
6041 abort ();
6042
0ac081f6
AH
6043 def_builtin (d->mask, d->name, type, d->code);
6044 }
6045}
6046
5b5040b9
RK
6047/* Generate a memory reference for expand_block_move, copying volatile,
6048 and other bits from an original memory reference. */
6049
6050static rtx
6051expand_block_move_mem (mode, addr, orig_mem)
6052 enum machine_mode mode;
6053 rtx addr;
6054 rtx orig_mem;
6055{
39403d82 6056 rtx mem = gen_rtx_MEM (mode, addr);
b6c9286a 6057
c6df88cb 6058 MEM_COPY_ATTRIBUTES (mem, orig_mem);
5b5040b9
RK
6059 return mem;
6060}
6061
7e69e155
MM
6062/* Expand a block move operation, and return 1 if successful. Return 0
6063 if we should let the compiler generate normal code.
6064
6065 operands[0] is the destination
6066 operands[1] is the source
6067 operands[2] is the length
6068 operands[3] is the alignment */
6069
3933e0e1
MM
6070#define MAX_MOVE_REG 4
6071
7e69e155
MM
6072int
6073expand_block_move (operands)
6074 rtx operands[];
6075{
b6c9286a
MM
6076 rtx orig_dest = operands[0];
6077 rtx orig_src = operands[1];
7e69e155 6078 rtx bytes_rtx = operands[2];
7e69e155 6079 rtx align_rtx = operands[3];
3933e0e1 6080 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
5ee95df6 6081 int align;
3933e0e1
MM
6082 int bytes;
6083 int offset;
6084 int num_reg;
6085 int i;
7e69e155
MM
6086 rtx src_reg;
6087 rtx dest_reg;
3933e0e1
MM
6088 rtx src_addr;
6089 rtx dest_addr;
7e69e155 6090 rtx tmp_reg;
3933e0e1 6091 rtx stores[MAX_MOVE_REG];
7e69e155
MM
6092 int move_bytes;
6093
3933e0e1 6094 /* If this is not a fixed size move, just call memcpy */
cc0d9ba8 6095 if (! constp)
3933e0e1
MM
6096 return 0;
6097
5ee95df6
FS
6098 /* If this is not a fixed size alignment, abort */
6099 if (GET_CODE (align_rtx) != CONST_INT)
6100 abort ();
6101 align = INTVAL (align_rtx);
6102
7e69e155 6103 /* Anything to move? */
3933e0e1
MM
6104 bytes = INTVAL (bytes_rtx);
6105 if (bytes <= 0)
7e69e155
MM
6106 return 1;
6107
ea9982a8 6108 /* store_one_arg depends on expand_block_move to handle at least the size of
6f317ef3 6109 reg_parm_stack_space. */
ea9982a8 6110 if (bytes > (TARGET_POWERPC64 ? 64 : 32))
7e69e155
MM
6111 return 0;
6112
6113 /* Move the address into scratch registers. */
b6c9286a
MM
6114 dest_reg = copy_addr_to_reg (XEXP (orig_dest, 0));
6115 src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
7e69e155 6116
3933e0e1 6117 if (TARGET_STRING) /* string instructions are available */
7e69e155 6118 {
3933e0e1 6119 for ( ; bytes > 0; bytes -= move_bytes)
7e69e155 6120 {
3933e0e1 6121 if (bytes > 24 /* move up to 32 bytes at a time */
cc0d9ba8
DE
6122 && ! fixed_regs[5]
6123 && ! fixed_regs[6]
6124 && ! fixed_regs[7]
6125 && ! fixed_regs[8]
6126 && ! fixed_regs[9]
6127 && ! fixed_regs[10]
6128 && ! fixed_regs[11]
6129 && ! fixed_regs[12])
3933e0e1
MM
6130 {
6131 move_bytes = (bytes > 32) ? 32 : bytes;
cc0d9ba8
DE
6132 emit_insn (gen_movstrsi_8reg (expand_block_move_mem (BLKmode,
6133 dest_reg,
6134 orig_dest),
6135 expand_block_move_mem (BLKmode,
6136 src_reg,
6137 orig_src),
6138 GEN_INT ((move_bytes == 32)
6139 ? 0 : move_bytes),
4c64a852 6140 align_rtx));
3933e0e1
MM
6141 }
6142 else if (bytes > 16 /* move up to 24 bytes at a time */
f9562f27
DE
6143 && ! fixed_regs[5]
6144 && ! fixed_regs[6]
cc0d9ba8
DE
6145 && ! fixed_regs[7]
6146 && ! fixed_regs[8]
6147 && ! fixed_regs[9]
f9562f27 6148 && ! fixed_regs[10])
3933e0e1
MM
6149 {
6150 move_bytes = (bytes > 24) ? 24 : bytes;
cc0d9ba8
DE
6151 emit_insn (gen_movstrsi_6reg (expand_block_move_mem (BLKmode,
6152 dest_reg,
6153 orig_dest),
6154 expand_block_move_mem (BLKmode,
6155 src_reg,
6156 orig_src),
3933e0e1 6157 GEN_INT (move_bytes),
4c64a852 6158 align_rtx));
3933e0e1
MM
6159 }
6160 else if (bytes > 8 /* move up to 16 bytes at a time */
f9562f27
DE
6161 && ! fixed_regs[5]
6162 && ! fixed_regs[6]
6163 && ! fixed_regs[7]
6164 && ! fixed_regs[8])
3933e0e1
MM
6165 {
6166 move_bytes = (bytes > 16) ? 16 : bytes;
cc0d9ba8
DE
6167 emit_insn (gen_movstrsi_4reg (expand_block_move_mem (BLKmode,
6168 dest_reg,
6169 orig_dest),
6170 expand_block_move_mem (BLKmode,
6171 src_reg,
6172 orig_src),
3933e0e1 6173 GEN_INT (move_bytes),
4c64a852 6174 align_rtx));
3933e0e1 6175 }
acad7ed3 6176 else if (bytes >= 8 && TARGET_POWERPC64
a4f6c312 6177 /* 64-bit loads and stores require word-aligned
82e41834 6178 displacements. */
a4f6c312 6179 && (align >= 8 || (! STRICT_ALIGNMENT && align >= 4)))
acad7ed3
DE
6180 {
6181 move_bytes = 8;
6182 tmp_reg = gen_reg_rtx (DImode);
6183 emit_move_insn (tmp_reg,
6184 expand_block_move_mem (DImode,
2eba1afa 6185 src_reg, orig_src));
acad7ed3 6186 emit_move_insn (expand_block_move_mem (DImode,
2eba1afa 6187 dest_reg, orig_dest),
acad7ed3
DE
6188 tmp_reg);
6189 }
09a625f7 6190 else if (bytes > 4 && !TARGET_POWERPC64)
3933e0e1
MM
6191 { /* move up to 8 bytes at a time */
6192 move_bytes = (bytes > 8) ? 8 : bytes;
cc0d9ba8
DE
6193 emit_insn (gen_movstrsi_2reg (expand_block_move_mem (BLKmode,
6194 dest_reg,
6195 orig_dest),
6196 expand_block_move_mem (BLKmode,
6197 src_reg,
6198 orig_src),
3933e0e1 6199 GEN_INT (move_bytes),
4c64a852 6200 align_rtx));
3933e0e1 6201 }
cc0d9ba8 6202 else if (bytes >= 4 && (align >= 4 || ! STRICT_ALIGNMENT))
3933e0e1
MM
6203 { /* move 4 bytes */
6204 move_bytes = 4;
6205 tmp_reg = gen_reg_rtx (SImode);
cc0d9ba8
DE
6206 emit_move_insn (tmp_reg,
6207 expand_block_move_mem (SImode,
6208 src_reg, orig_src));
6209 emit_move_insn (expand_block_move_mem (SImode,
6210 dest_reg, orig_dest),
6211 tmp_reg);
3933e0e1 6212 }
cc0d9ba8 6213 else if (bytes == 2 && (align >= 2 || ! STRICT_ALIGNMENT))
3933e0e1
MM
6214 { /* move 2 bytes */
6215 move_bytes = 2;
6216 tmp_reg = gen_reg_rtx (HImode);
cc0d9ba8
DE
6217 emit_move_insn (tmp_reg,
6218 expand_block_move_mem (HImode,
6219 src_reg, orig_src));
6220 emit_move_insn (expand_block_move_mem (HImode,
6221 dest_reg, orig_dest),
6222 tmp_reg);
3933e0e1
MM
6223 }
6224 else if (bytes == 1) /* move 1 byte */
6225 {
6226 move_bytes = 1;
6227 tmp_reg = gen_reg_rtx (QImode);
cc0d9ba8
DE
6228 emit_move_insn (tmp_reg,
6229 expand_block_move_mem (QImode,
6230 src_reg, orig_src));
6231 emit_move_insn (expand_block_move_mem (QImode,
6232 dest_reg, orig_dest),
6233 tmp_reg);
3933e0e1
MM
6234 }
6235 else
6236 { /* move up to 4 bytes at a time */
6237 move_bytes = (bytes > 4) ? 4 : bytes;
cc0d9ba8
DE
6238 emit_insn (gen_movstrsi_1reg (expand_block_move_mem (BLKmode,
6239 dest_reg,
6240 orig_dest),
6241 expand_block_move_mem (BLKmode,
6242 src_reg,
6243 orig_src),
3933e0e1 6244 GEN_INT (move_bytes),
4c64a852 6245 align_rtx));
3933e0e1 6246 }
4c64a852 6247
015892ee
RK
6248 if (bytes > move_bytes)
6249 {
cc0d9ba8
DE
6250 if (! TARGET_POWERPC64)
6251 {
6252 emit_insn (gen_addsi3 (src_reg, src_reg,
6253 GEN_INT (move_bytes)));
6254 emit_insn (gen_addsi3 (dest_reg, dest_reg,
6255 GEN_INT (move_bytes)));
6256 }
6257 else
6258 {
6259 emit_insn (gen_adddi3 (src_reg, src_reg,
6260 GEN_INT (move_bytes)));
6261 emit_insn (gen_adddi3 (dest_reg, dest_reg,
6262 GEN_INT (move_bytes)));
6263 }
015892ee 6264 }
4c64a852 6265 }
3933e0e1
MM
6266 }
6267
6268 else /* string instructions not available */
6269 {
6270 num_reg = offset = 0;
6271 for ( ; bytes > 0; (bytes -= move_bytes), (offset += move_bytes))
7e69e155 6272 {
3933e0e1
MM
6273 /* Calculate the correct offset for src/dest */
6274 if (offset == 0)
7e69e155 6275 {
3933e0e1
MM
6276 src_addr = src_reg;
6277 dest_addr = dest_reg;
6278 }
6279 else
6280 {
c5c76735
JL
6281 src_addr = plus_constant (src_reg, offset);
6282 dest_addr = plus_constant (dest_reg, offset);
3933e0e1
MM
6283 }
6284
cc0d9ba8
DE
6285 /* Generate the appropriate load and store, saving the stores
6286 for later. */
6287 if (bytes >= 8 && TARGET_POWERPC64
a4f6c312
SS
6288 /* 64-bit loads and stores require word-aligned
6289 displacements. */
cc0d9ba8 6290 && (align >= 8 || (! STRICT_ALIGNMENT && align >= 4)))
b6c9286a
MM
6291 {
6292 move_bytes = 8;
6293 tmp_reg = gen_reg_rtx (DImode);
cc0d9ba8
DE
6294 emit_insn (gen_movdi (tmp_reg,
6295 expand_block_move_mem (DImode,
6296 src_addr,
6297 orig_src)));
6298 stores[num_reg++] = gen_movdi (expand_block_move_mem (DImode,
6299 dest_addr,
6300 orig_dest),
6301 tmp_reg);
b6c9286a 6302 }
cc0d9ba8 6303 else if (bytes >= 4 && (align >= 4 || ! STRICT_ALIGNMENT))
3933e0e1
MM
6304 {
6305 move_bytes = 4;
6306 tmp_reg = gen_reg_rtx (SImode);
cc0d9ba8
DE
6307 emit_insn (gen_movsi (tmp_reg,
6308 expand_block_move_mem (SImode,
6309 src_addr,
6310 orig_src)));
6311 stores[num_reg++] = gen_movsi (expand_block_move_mem (SImode,
6312 dest_addr,
6313 orig_dest),
6314 tmp_reg);
3933e0e1 6315 }
cc0d9ba8 6316 else if (bytes >= 2 && (align >= 2 || ! STRICT_ALIGNMENT))
3933e0e1
MM
6317 {
6318 move_bytes = 2;
6319 tmp_reg = gen_reg_rtx (HImode);
c81fc13e 6320 emit_insn (gen_movhi (tmp_reg,
cc0d9ba8
DE
6321 expand_block_move_mem (HImode,
6322 src_addr,
6323 orig_src)));
6324 stores[num_reg++] = gen_movhi (expand_block_move_mem (HImode,
6325 dest_addr,
6326 orig_dest),
6327 tmp_reg);
3933e0e1
MM
6328 }
6329 else
6330 {
6331 move_bytes = 1;
6332 tmp_reg = gen_reg_rtx (QImode);
c81fc13e 6333 emit_insn (gen_movqi (tmp_reg,
cc0d9ba8
DE
6334 expand_block_move_mem (QImode,
6335 src_addr,
6336 orig_src)));
6337 stores[num_reg++] = gen_movqi (expand_block_move_mem (QImode,
6338 dest_addr,
6339 orig_dest),
a4f6c312 6340 tmp_reg);
3933e0e1
MM
6341 }
6342
6343 if (num_reg >= MAX_MOVE_REG)
6344 {
6345 for (i = 0; i < num_reg; i++)
6346 emit_insn (stores[i]);
6347 num_reg = 0;
7e69e155
MM
6348 }
6349 }
3933e0e1 6350
b6c9286a
MM
6351 for (i = 0; i < num_reg; i++)
6352 emit_insn (stores[i]);
7e69e155
MM
6353 }
6354
6355 return 1;
6356}
6357
9878760c
RK
6358\f
6359/* Return 1 if OP is a load multiple operation. It is known to be a
6360 PARALLEL and the first section will be tested. */
6361
6362int
6363load_multiple_operation (op, mode)
6364 rtx op;
296b8152 6365 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
6366{
6367 int count = XVECLEN (op, 0);
e2c953b6 6368 unsigned int dest_regno;
9878760c
RK
6369 rtx src_addr;
6370 int i;
6371
6372 /* Perform a quick check so we don't blow up below. */
6373 if (count <= 1
6374 || GET_CODE (XVECEXP (op, 0, 0)) != SET
6375 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
6376 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM)
6377 return 0;
6378
6379 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
6380 src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);
6381
6382 for (i = 1; i < count; i++)
6383 {
6384 rtx elt = XVECEXP (op, 0, i);
6385
6386 if (GET_CODE (elt) != SET
6387 || GET_CODE (SET_DEST (elt)) != REG
6388 || GET_MODE (SET_DEST (elt)) != SImode
6389 || REGNO (SET_DEST (elt)) != dest_regno + i
6390 || GET_CODE (SET_SRC (elt)) != MEM
6391 || GET_MODE (SET_SRC (elt)) != SImode
6392 || GET_CODE (XEXP (SET_SRC (elt), 0)) != PLUS
6393 || ! rtx_equal_p (XEXP (XEXP (SET_SRC (elt), 0), 0), src_addr)
6394 || GET_CODE (XEXP (XEXP (SET_SRC (elt), 0), 1)) != CONST_INT
6395 || INTVAL (XEXP (XEXP (SET_SRC (elt), 0), 1)) != i * 4)
6396 return 0;
6397 }
6398
6399 return 1;
6400}
6401
6402/* Similar, but tests for store multiple. Here, the second vector element
6403 is a CLOBBER. It will be tested later. */
6404
6405int
6406store_multiple_operation (op, mode)
6407 rtx op;
296b8152 6408 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
6409{
6410 int count = XVECLEN (op, 0) - 1;
e2c953b6 6411 unsigned int src_regno;
9878760c
RK
6412 rtx dest_addr;
6413 int i;
6414
6415 /* Perform a quick check so we don't blow up below. */
6416 if (count <= 1
6417 || GET_CODE (XVECEXP (op, 0, 0)) != SET
6418 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM
6419 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG)
6420 return 0;
6421
6422 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
6423 dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);
6424
6425 for (i = 1; i < count; i++)
6426 {
6427 rtx elt = XVECEXP (op, 0, i + 1);
6428
6429 if (GET_CODE (elt) != SET
6430 || GET_CODE (SET_SRC (elt)) != REG
6431 || GET_MODE (SET_SRC (elt)) != SImode
6432 || REGNO (SET_SRC (elt)) != src_regno + i
6433 || GET_CODE (SET_DEST (elt)) != MEM
6434 || GET_MODE (SET_DEST (elt)) != SImode
6435 || GET_CODE (XEXP (SET_DEST (elt), 0)) != PLUS
6436 || ! rtx_equal_p (XEXP (XEXP (SET_DEST (elt), 0), 0), dest_addr)
6437 || GET_CODE (XEXP (XEXP (SET_DEST (elt), 0), 1)) != CONST_INT
6438 || INTVAL (XEXP (XEXP (SET_DEST (elt), 0), 1)) != i * 4)
6439 return 0;
6440 }
6441
6442 return 1;
6443}
9ebbca7d 6444
00b960c7
AH
6445/* Return 1 for a parallel vrsave operation. */
6446
6447int
6448vrsave_operation (op, mode)
6449 rtx op;
6450 enum machine_mode mode ATTRIBUTE_UNUSED;
6451{
6452 int count = XVECLEN (op, 0);
6453 unsigned int dest_regno, src_regno;
6454 int i;
6455
6456 if (count <= 1
6457 || GET_CODE (XVECEXP (op, 0, 0)) != SET
6458 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
a004eb82 6459 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC_VOLATILE)
00b960c7
AH
6460 return 0;
6461
6462 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
6463 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
6464
6465 if (dest_regno != VRSAVE_REGNO
6466 && src_regno != VRSAVE_REGNO)
6467 return 0;
6468
6469 for (i = 1; i < count; i++)
6470 {
6471 rtx elt = XVECEXP (op, 0, i);
6472
9aa86737
AH
6473 if (GET_CODE (elt) != CLOBBER
6474 && GET_CODE (elt) != SET)
00b960c7
AH
6475 return 0;
6476 }
6477
6478 return 1;
6479}
6480
a4f6c312 6481/* Return 1 for an PARALLEL suitable for mtcrf. */
9ebbca7d
GK
6482
6483int
6484mtcrf_operation (op, mode)
6485 rtx op;
6486 enum machine_mode mode ATTRIBUTE_UNUSED;
6487{
6488 int count = XVECLEN (op, 0);
6489 int i;
9ebbca7d
GK
6490 rtx src_reg;
6491
6492 /* Perform a quick check so we don't blow up below. */
e35b9579
GK
6493 if (count < 1
6494 || GET_CODE (XVECEXP (op, 0, 0)) != SET
6495 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC
6496 || XVECLEN (SET_SRC (XVECEXP (op, 0, 0)), 0) != 2)
9ebbca7d 6497 return 0;
e35b9579 6498 src_reg = XVECEXP (SET_SRC (XVECEXP (op, 0, 0)), 0, 0);
9ebbca7d
GK
6499
6500 if (GET_CODE (src_reg) != REG
6501 || GET_MODE (src_reg) != SImode
6502 || ! INT_REGNO_P (REGNO (src_reg)))
6503 return 0;
6504
e35b9579 6505 for (i = 0; i < count; i++)
9ebbca7d
GK
6506 {
6507 rtx exp = XVECEXP (op, 0, i);
6508 rtx unspec;
6509 int maskval;
6510
6511 if (GET_CODE (exp) != SET
6512 || GET_CODE (SET_DEST (exp)) != REG
6513 || GET_MODE (SET_DEST (exp)) != CCmode
6514 || ! CR_REGNO_P (REGNO (SET_DEST (exp))))
6515 return 0;
6516 unspec = SET_SRC (exp);
6517 maskval = 1 << (MAX_CR_REGNO - REGNO (SET_DEST (exp)));
9ebbca7d
GK
6518
6519 if (GET_CODE (unspec) != UNSPEC
6520 || XINT (unspec, 1) != 20
6521 || XVECLEN (unspec, 0) != 2
6522 || XVECEXP (unspec, 0, 0) != src_reg
6523 || GET_CODE (XVECEXP (unspec, 0, 1)) != CONST_INT
6524 || INTVAL (XVECEXP (unspec, 0, 1)) != maskval)
6525 return 0;
6526 }
e35b9579 6527 return 1;
9ebbca7d
GK
6528}
6529
a4f6c312 6530/* Return 1 for an PARALLEL suitable for lmw. */
9ebbca7d
GK
6531
6532int
6533lmw_operation (op, mode)
6534 rtx op;
6535 enum machine_mode mode ATTRIBUTE_UNUSED;
6536{
6537 int count = XVECLEN (op, 0);
e2c953b6 6538 unsigned int dest_regno;
9ebbca7d 6539 rtx src_addr;
e2c953b6 6540 unsigned int base_regno;
9ebbca7d
GK
6541 HOST_WIDE_INT offset;
6542 int i;
6543
6544 /* Perform a quick check so we don't blow up below. */
6545 if (count <= 1
6546 || GET_CODE (XVECEXP (op, 0, 0)) != SET
6547 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
6548 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM)
6549 return 0;
6550
6551 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
6552 src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);
6553
6554 if (dest_regno > 31
e2c953b6 6555 || count != 32 - (int) dest_regno)
9ebbca7d
GK
6556 return 0;
6557
258bfae2 6558 if (LEGITIMATE_INDIRECT_ADDRESS_P (src_addr, 0))
9ebbca7d
GK
6559 {
6560 offset = 0;
6561 base_regno = REGNO (src_addr);
6562 if (base_regno == 0)
6563 return 0;
6564 }
258bfae2 6565 else if (LEGITIMATE_OFFSET_ADDRESS_P (SImode, src_addr, 0))
9ebbca7d
GK
6566 {
6567 offset = INTVAL (XEXP (src_addr, 1));
6568 base_regno = REGNO (XEXP (src_addr, 0));
6569 }
6570 else
6571 return 0;
6572
6573 for (i = 0; i < count; i++)
6574 {
6575 rtx elt = XVECEXP (op, 0, i);
6576 rtx newaddr;
6577 rtx addr_reg;
6578 HOST_WIDE_INT newoffset;
6579
6580 if (GET_CODE (elt) != SET
6581 || GET_CODE (SET_DEST (elt)) != REG
6582 || GET_MODE (SET_DEST (elt)) != SImode
6583 || REGNO (SET_DEST (elt)) != dest_regno + i
6584 || GET_CODE (SET_SRC (elt)) != MEM
6585 || GET_MODE (SET_SRC (elt)) != SImode)
6586 return 0;
6587 newaddr = XEXP (SET_SRC (elt), 0);
258bfae2 6588 if (LEGITIMATE_INDIRECT_ADDRESS_P (newaddr, 0))
9ebbca7d
GK
6589 {
6590 newoffset = 0;
6591 addr_reg = newaddr;
6592 }
258bfae2 6593 else if (LEGITIMATE_OFFSET_ADDRESS_P (SImode, newaddr, 0))
9ebbca7d
GK
6594 {
6595 addr_reg = XEXP (newaddr, 0);
6596 newoffset = INTVAL (XEXP (newaddr, 1));
6597 }
6598 else
6599 return 0;
6600 if (REGNO (addr_reg) != base_regno
6601 || newoffset != offset + 4 * i)
6602 return 0;
6603 }
6604
6605 return 1;
6606}
6607
a4f6c312 6608/* Return 1 for an PARALLEL suitable for stmw. */
9ebbca7d
GK
6609
6610int
6611stmw_operation (op, mode)
6612 rtx op;
6613 enum machine_mode mode ATTRIBUTE_UNUSED;
6614{
6615 int count = XVECLEN (op, 0);
e2c953b6 6616 unsigned int src_regno;
9ebbca7d 6617 rtx dest_addr;
e2c953b6 6618 unsigned int base_regno;
9ebbca7d
GK
6619 HOST_WIDE_INT offset;
6620 int i;
6621
6622 /* Perform a quick check so we don't blow up below. */
6623 if (count <= 1
6624 || GET_CODE (XVECEXP (op, 0, 0)) != SET
6625 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM
6626 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG)
6627 return 0;
6628
6629 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
6630 dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);
6631
6632 if (src_regno > 31
e2c953b6 6633 || count != 32 - (int) src_regno)
9ebbca7d
GK
6634 return 0;
6635
258bfae2 6636 if (LEGITIMATE_INDIRECT_ADDRESS_P (dest_addr, 0))
9ebbca7d
GK
6637 {
6638 offset = 0;
6639 base_regno = REGNO (dest_addr);
6640 if (base_regno == 0)
6641 return 0;
6642 }
258bfae2 6643 else if (LEGITIMATE_OFFSET_ADDRESS_P (SImode, dest_addr, 0))
9ebbca7d
GK
6644 {
6645 offset = INTVAL (XEXP (dest_addr, 1));
6646 base_regno = REGNO (XEXP (dest_addr, 0));
6647 }
6648 else
6649 return 0;
6650
6651 for (i = 0; i < count; i++)
6652 {
6653 rtx elt = XVECEXP (op, 0, i);
6654 rtx newaddr;
6655 rtx addr_reg;
6656 HOST_WIDE_INT newoffset;
6657
6658 if (GET_CODE (elt) != SET
6659 || GET_CODE (SET_SRC (elt)) != REG
6660 || GET_MODE (SET_SRC (elt)) != SImode
6661 || REGNO (SET_SRC (elt)) != src_regno + i
6662 || GET_CODE (SET_DEST (elt)) != MEM
6663 || GET_MODE (SET_DEST (elt)) != SImode)
6664 return 0;
6665 newaddr = XEXP (SET_DEST (elt), 0);
258bfae2 6666 if (LEGITIMATE_INDIRECT_ADDRESS_P (newaddr, 0))
9ebbca7d
GK
6667 {
6668 newoffset = 0;
6669 addr_reg = newaddr;
6670 }
258bfae2 6671 else if (LEGITIMATE_OFFSET_ADDRESS_P (SImode, newaddr, 0))
9ebbca7d
GK
6672 {
6673 addr_reg = XEXP (newaddr, 0);
6674 newoffset = INTVAL (XEXP (newaddr, 1));
6675 }
6676 else
6677 return 0;
6678 if (REGNO (addr_reg) != base_regno
6679 || newoffset != offset + 4 * i)
6680 return 0;
6681 }
6682
6683 return 1;
6684}
9878760c 6685\f
a4f6c312
SS
6686/* A validation routine: say whether CODE, a condition code, and MODE
6687 match. The other alternatives either don't make sense or should
6688 never be generated. */
39a10a29 6689
39a10a29
GK
6690static void
6691validate_condition_mode (code, mode)
6692 enum rtx_code code;
6693 enum machine_mode mode;
6694{
6695 if (GET_RTX_CLASS (code) != '<'
6696 || GET_MODE_CLASS (mode) != MODE_CC)
6697 abort ();
6698
6699 /* These don't make sense. */
6700 if ((code == GT || code == LT || code == GE || code == LE)
6701 && mode == CCUNSmode)
6702 abort ();
6703
6704 if ((code == GTU || code == LTU || code == GEU || code == LEU)
6705 && mode != CCUNSmode)
6706 abort ();
6707
6708 if (mode != CCFPmode
6709 && (code == ORDERED || code == UNORDERED
6710 || code == UNEQ || code == LTGT
6711 || code == UNGT || code == UNLT
6712 || code == UNGE || code == UNLE))
a4f6c312 6713 abort ();
39a10a29 6714
de6c5979 6715 /* These should never be generated except for
ad72b533 6716 flag_unsafe_math_optimizations and flag_finite_math_only. */
39a10a29 6717 if (mode == CCFPmode
de6c5979 6718 && ! flag_unsafe_math_optimizations
ad72b533 6719 && ! flag_finite_math_only
39a10a29
GK
6720 && (code == LE || code == GE
6721 || code == UNEQ || code == LTGT
6722 || code == UNGT || code == UNLT))
6723 abort ();
6724
6725 /* These are invalid; the information is not there. */
6726 if (mode == CCEQmode
6727 && code != EQ && code != NE)
6728 abort ();
6729}
6730
9878760c
RK
6731/* Return 1 if OP is a comparison operation that is valid for a branch insn.
6732 We only check the opcode against the mode of the CC value here. */
6733
6734int
6735branch_comparison_operator (op, mode)
592696dd 6736 rtx op;
296b8152 6737 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
6738{
6739 enum rtx_code code = GET_CODE (op);
6740 enum machine_mode cc_mode;
6741
6742 if (GET_RTX_CLASS (code) != '<')
6743 return 0;
6744
6745 cc_mode = GET_MODE (XEXP (op, 0));
6746 if (GET_MODE_CLASS (cc_mode) != MODE_CC)
6747 return 0;
6748
39a10a29 6749 validate_condition_mode (code, cc_mode);
9878760c 6750
39a10a29
GK
6751 return 1;
6752}
6753
6754/* Return 1 if OP is a comparison operation that is valid for a branch
6755 insn and which is true if the corresponding bit in the CC register
6756 is set. */
6757
6758int
6759branch_positive_comparison_operator (op, mode)
592696dd 6760 rtx op;
39a10a29
GK
6761 enum machine_mode mode;
6762{
6763 enum rtx_code code;
6764
6765 if (! branch_comparison_operator (op, mode))
9878760c
RK
6766 return 0;
6767
39a10a29
GK
6768 code = GET_CODE (op);
6769 return (code == EQ || code == LT || code == GT
a3170dc6 6770 || (TARGET_SPE && TARGET_HARD_FLOAT && !TARGET_FPRS && code == NE)
39a10a29
GK
6771 || code == LTU || code == GTU
6772 || code == UNORDERED);
9878760c
RK
6773}
6774
6775/* Return 1 if OP is a comparison operation that is valid for an scc insn.
6776 We check the opcode against the mode of the CC value and disallow EQ or
6777 NE comparisons for integers. */
6778
6779int
6780scc_comparison_operator (op, mode)
592696dd 6781 rtx op;
9878760c
RK
6782 enum machine_mode mode;
6783{
6784 enum rtx_code code = GET_CODE (op);
6785 enum machine_mode cc_mode;
6786
6787 if (GET_MODE (op) != mode && mode != VOIDmode)
6788 return 0;
6789
6790 if (GET_RTX_CLASS (code) != '<')
6791 return 0;
6792
6793 cc_mode = GET_MODE (XEXP (op, 0));
6794 if (GET_MODE_CLASS (cc_mode) != MODE_CC)
6795 return 0;
6796
39a10a29 6797 validate_condition_mode (code, cc_mode);
9878760c 6798
39a10a29 6799 if (code == NE && cc_mode != CCFPmode)
c5defebb
RK
6800 return 0;
6801
9878760c
RK
6802 return 1;
6803}
e0cd0770
JC
6804
6805int
6806trap_comparison_operator (op, mode)
6807 rtx op;
6808 enum machine_mode mode;
6809{
6810 if (mode != VOIDmode && mode != GET_MODE (op))
6811 return 0;
39a10a29 6812 return GET_RTX_CLASS (GET_CODE (op)) == '<';
e0cd0770 6813}
dfbdccdb
GK
6814
6815int
6816boolean_operator (op, mode)
6817 rtx op;
6818 enum machine_mode mode ATTRIBUTE_UNUSED;
6819{
6820 enum rtx_code code = GET_CODE (op);
6821 return (code == AND || code == IOR || code == XOR);
6822}
1d328b19
GK
6823
6824int
6825boolean_or_operator (op, mode)
6826 rtx op;
6827 enum machine_mode mode ATTRIBUTE_UNUSED;
6828{
6829 enum rtx_code code = GET_CODE (op);
6830 return (code == IOR || code == XOR);
6831}
50a0b056
GK
6832
6833int
6834min_max_operator (op, mode)
6835 rtx op;
6836 enum machine_mode mode ATTRIBUTE_UNUSED;
6837{
6838 enum rtx_code code = GET_CODE (op);
6839 return (code == SMIN || code == SMAX || code == UMIN || code == UMAX);
6840}
9878760c
RK
6841\f
6842/* Return 1 if ANDOP is a mask that has no bits on that are not in the
6843 mask required to convert the result of a rotate insn into a shift
b1765bde 6844 left insn of SHIFTOP bits. Both are known to be SImode CONST_INT. */
9878760c
RK
6845
6846int
6847includes_lshift_p (shiftop, andop)
592696dd
SS
6848 rtx shiftop;
6849 rtx andop;
9878760c 6850{
e2c953b6
DE
6851 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
6852
6853 shift_mask <<= INTVAL (shiftop);
9878760c 6854
b1765bde 6855 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
9878760c
RK
6856}
6857
6858/* Similar, but for right shift. */
6859
6860int
6861includes_rshift_p (shiftop, andop)
592696dd
SS
6862 rtx shiftop;
6863 rtx andop;
9878760c 6864{
a7653a2c 6865 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
9878760c
RK
6866
6867 shift_mask >>= INTVAL (shiftop);
6868
b1765bde 6869 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
e2c953b6
DE
6870}
6871
c5059423
AM
6872/* Return 1 if ANDOP is a mask suitable for use with an rldic insn
6873 to perform a left shift. It must have exactly SHIFTOP least
6874 signifigant 0's, then one or more 1's, then zero or more 0's. */
e2c953b6
DE
6875
6876int
c5059423 6877includes_rldic_lshift_p (shiftop, andop)
592696dd
SS
6878 rtx shiftop;
6879 rtx andop;
e2c953b6 6880{
c5059423
AM
6881 if (GET_CODE (andop) == CONST_INT)
6882 {
02071907 6883 HOST_WIDE_INT c, lsb, shift_mask;
e2c953b6 6884
c5059423 6885 c = INTVAL (andop);
02071907 6886 if (c == 0 || c == ~0)
c5059423 6887 return 0;
e2c953b6 6888
02071907 6889 shift_mask = ~0;
c5059423
AM
6890 shift_mask <<= INTVAL (shiftop);
6891
6892 /* Find the least signifigant one bit. */
6893 lsb = c & -c;
6894
6895 /* It must coincide with the LSB of the shift mask. */
6896 if (-lsb != shift_mask)
6897 return 0;
e2c953b6 6898
c5059423
AM
6899 /* Invert to look for the next transition (if any). */
6900 c = ~c;
6901
6902 /* Remove the low group of ones (originally low group of zeros). */
6903 c &= -lsb;
6904
6905 /* Again find the lsb, and check we have all 1's above. */
6906 lsb = c & -c;
6907 return c == -lsb;
6908 }
6909 else if (GET_CODE (andop) == CONST_DOUBLE
6910 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
6911 {
02071907
AM
6912 HOST_WIDE_INT low, high, lsb;
6913 HOST_WIDE_INT shift_mask_low, shift_mask_high;
c5059423
AM
6914
6915 low = CONST_DOUBLE_LOW (andop);
6916 if (HOST_BITS_PER_WIDE_INT < 64)
6917 high = CONST_DOUBLE_HIGH (andop);
6918
6919 if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
02071907 6920 || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
c5059423
AM
6921 return 0;
6922
6923 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
6924 {
02071907 6925 shift_mask_high = ~0;
c5059423
AM
6926 if (INTVAL (shiftop) > 32)
6927 shift_mask_high <<= INTVAL (shiftop) - 32;
6928
6929 lsb = high & -high;
6930
6931 if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
6932 return 0;
6933
6934 high = ~high;
6935 high &= -lsb;
6936
6937 lsb = high & -high;
6938 return high == -lsb;
6939 }
6940
02071907 6941 shift_mask_low = ~0;
c5059423
AM
6942 shift_mask_low <<= INTVAL (shiftop);
6943
6944 lsb = low & -low;
6945
6946 if (-lsb != shift_mask_low)
6947 return 0;
6948
6949 if (HOST_BITS_PER_WIDE_INT < 64)
6950 high = ~high;
6951 low = ~low;
6952 low &= -lsb;
6953
6954 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
6955 {
6956 lsb = high & -high;
6957 return high == -lsb;
6958 }
6959
6960 lsb = low & -low;
6961 return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
6962 }
6963 else
6964 return 0;
6965}
e2c953b6 6966
c5059423
AM
6967/* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
6968 to perform a left shift. It must have SHIFTOP or more least
6969 signifigant 0's, with the remainder of the word 1's. */
e2c953b6 6970
c5059423
AM
6971int
6972includes_rldicr_lshift_p (shiftop, andop)
592696dd
SS
6973 rtx shiftop;
6974 rtx andop;
c5059423 6975{
e2c953b6 6976 if (GET_CODE (andop) == CONST_INT)
c5059423 6977 {
02071907 6978 HOST_WIDE_INT c, lsb, shift_mask;
c5059423 6979
02071907 6980 shift_mask = ~0;
c5059423
AM
6981 shift_mask <<= INTVAL (shiftop);
6982 c = INTVAL (andop);
6983
6984 /* Find the least signifigant one bit. */
6985 lsb = c & -c;
6986
6987 /* It must be covered by the shift mask.
a4f6c312 6988 This test also rejects c == 0. */
c5059423
AM
6989 if ((lsb & shift_mask) == 0)
6990 return 0;
6991
6992 /* Check we have all 1's above the transition, and reject all 1's. */
6993 return c == -lsb && lsb != 1;
6994 }
6995 else if (GET_CODE (andop) == CONST_DOUBLE
6996 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
6997 {
02071907 6998 HOST_WIDE_INT low, lsb, shift_mask_low;
c5059423
AM
6999
7000 low = CONST_DOUBLE_LOW (andop);
7001
7002 if (HOST_BITS_PER_WIDE_INT < 64)
7003 {
02071907 7004 HOST_WIDE_INT high, shift_mask_high;
c5059423
AM
7005
7006 high = CONST_DOUBLE_HIGH (andop);
7007
7008 if (low == 0)
7009 {
02071907 7010 shift_mask_high = ~0;
c5059423
AM
7011 if (INTVAL (shiftop) > 32)
7012 shift_mask_high <<= INTVAL (shiftop) - 32;
7013
7014 lsb = high & -high;
7015
7016 if ((lsb & shift_mask_high) == 0)
7017 return 0;
7018
7019 return high == -lsb;
7020 }
7021 if (high != ~0)
7022 return 0;
7023 }
7024
02071907 7025 shift_mask_low = ~0;
c5059423
AM
7026 shift_mask_low <<= INTVAL (shiftop);
7027
7028 lsb = low & -low;
7029
7030 if ((lsb & shift_mask_low) == 0)
7031 return 0;
7032
7033 return low == -lsb && lsb != 1;
7034 }
e2c953b6 7035 else
c5059423 7036 return 0;
9878760c 7037}
35068b43
RK
7038
7039/* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
7040 for lfq and stfq insns.
7041
7042 Note reg1 and reg2 *must* be hard registers. To be sure we will
7043 abort if we are passed pseudo registers. */
7044
7045int
7046registers_ok_for_quad_peep (reg1, reg2)
7047 rtx reg1, reg2;
7048{
7049 /* We might have been passed a SUBREG. */
7050 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
7051 return 0;
7052
7053 return (REGNO (reg1) == REGNO (reg2) - 1);
7054}
7055
a4f6c312
SS
7056/* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
7057 addr1 and addr2 must be in consecutive memory locations
7058 (addr2 == addr1 + 8). */
35068b43
RK
7059
7060int
7061addrs_ok_for_quad_peep (addr1, addr2)
592696dd
SS
7062 rtx addr1;
7063 rtx addr2;
35068b43 7064{
e2c953b6 7065 unsigned int reg1;
35068b43
RK
7066 int offset1;
7067
7068 /* Extract an offset (if used) from the first addr. */
7069 if (GET_CODE (addr1) == PLUS)
7070 {
7071 /* If not a REG, return zero. */
7072 if (GET_CODE (XEXP (addr1, 0)) != REG)
7073 return 0;
7074 else
7075 {
7076 reg1 = REGNO (XEXP (addr1, 0));
7077 /* The offset must be constant! */
7078 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
7079 return 0;
7080 offset1 = INTVAL (XEXP (addr1, 1));
7081 }
7082 }
7083 else if (GET_CODE (addr1) != REG)
7084 return 0;
7085 else
7086 {
7087 reg1 = REGNO (addr1);
7088 /* This was a simple (mem (reg)) expression. Offset is 0. */
7089 offset1 = 0;
7090 }
7091
acad7ed3 7092 /* Make sure the second address is a (mem (plus (reg) (const_int))). */
35068b43
RK
7093 if (GET_CODE (addr2) != PLUS)
7094 return 0;
7095
7096 if (GET_CODE (XEXP (addr2, 0)) != REG
7097 || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
7098 return 0;
7099
7100 if (reg1 != REGNO (XEXP (addr2, 0)))
7101 return 0;
7102
7103 /* The offset for the second addr must be 8 more than the first addr. */
7104 if (INTVAL (XEXP (addr2, 1)) != offset1 + 8)
7105 return 0;
7106
7107 /* All the tests passed. addr1 and addr2 are valid for lfq or stfq
7108 instructions. */
7109 return 1;
7110}
9878760c
RK
7111\f
7112/* Return the register class of a scratch register needed to copy IN into
7113 or out of a register in CLASS in MODE. If it can be done directly,
7114 NO_REGS is returned. */
7115
7116enum reg_class
7117secondary_reload_class (class, mode, in)
7118 enum reg_class class;
296b8152 7119 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
7120 rtx in;
7121{
5accd822 7122 int regno;
9878760c 7123
46fad5b7
DJ
7124 if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN && flag_pic))
7125 {
7126 /* We cannot copy a symbolic operand directly into anything
7127 other than BASE_REGS for TARGET_ELF. So indicate that a
7128 register from BASE_REGS is needed as an intermediate
7129 register.
7130
7131 On Darwin, pic addresses require a load from memory, which
7132 needs a base register. */
7133 if (class != BASE_REGS
7134 && (GET_CODE (in) == SYMBOL_REF
7135 || GET_CODE (in) == HIGH
7136 || GET_CODE (in) == LABEL_REF
7137 || GET_CODE (in) == CONST))
7138 return BASE_REGS;
7139 }
e7b7998a 7140
5accd822
DE
7141 if (GET_CODE (in) == REG)
7142 {
7143 regno = REGNO (in);
7144 if (regno >= FIRST_PSEUDO_REGISTER)
7145 {
7146 regno = true_regnum (in);
7147 if (regno >= FIRST_PSEUDO_REGISTER)
7148 regno = -1;
7149 }
7150 }
7151 else if (GET_CODE (in) == SUBREG)
7152 {
7153 regno = true_regnum (in);
7154 if (regno >= FIRST_PSEUDO_REGISTER)
7155 regno = -1;
7156 }
7157 else
7158 regno = -1;
7159
9878760c
RK
7160 /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
7161 into anything. */
7162 if (class == GENERAL_REGS || class == BASE_REGS
7163 || (regno >= 0 && INT_REGNO_P (regno)))
7164 return NO_REGS;
7165
7166 /* Constants, memory, and FP registers can go into FP registers. */
7167 if ((regno == -1 || FP_REGNO_P (regno))
7168 && (class == FLOAT_REGS || class == NON_SPECIAL_REGS))
7169 return NO_REGS;
7170
0ac081f6
AH
7171 /* Memory, and AltiVec registers can go into AltiVec registers. */
7172 if ((regno == -1 || ALTIVEC_REGNO_P (regno))
7173 && class == ALTIVEC_REGS)
7174 return NO_REGS;
7175
9878760c
RK
7176 /* We can copy among the CR registers. */
7177 if ((class == CR_REGS || class == CR0_REGS)
7178 && regno >= 0 && CR_REGNO_P (regno))
7179 return NO_REGS;
7180
7181 /* Otherwise, we need GENERAL_REGS. */
7182 return GENERAL_REGS;
7183}
7184\f
7185/* Given a comparison operation, return the bit number in CCR to test. We
7186 know this is a valid comparison.
7187
7188 SCC_P is 1 if this is for an scc. That means that %D will have been
7189 used instead of %C, so the bits will be in different places.
7190
b4ac57ab 7191 Return -1 if OP isn't a valid comparison for some reason. */
9878760c
RK
7192
7193int
7194ccr_bit (op, scc_p)
592696dd 7195 rtx op;
9878760c
RK
7196 int scc_p;
7197{
7198 enum rtx_code code = GET_CODE (op);
7199 enum machine_mode cc_mode;
7200 int cc_regnum;
7201 int base_bit;
9ebbca7d 7202 rtx reg;
9878760c
RK
7203
7204 if (GET_RTX_CLASS (code) != '<')
7205 return -1;
7206
9ebbca7d
GK
7207 reg = XEXP (op, 0);
7208
7209 if (GET_CODE (reg) != REG
7210 || ! CR_REGNO_P (REGNO (reg)))
7211 abort ();
7212
7213 cc_mode = GET_MODE (reg);
7214 cc_regnum = REGNO (reg);
7215 base_bit = 4 * (cc_regnum - CR0_REGNO);
9878760c 7216
39a10a29 7217 validate_condition_mode (code, cc_mode);
c5defebb 7218
9878760c
RK
7219 switch (code)
7220 {
7221 case NE:
a3170dc6
AH
7222 if (TARGET_SPE && TARGET_HARD_FLOAT && cc_mode == CCFPmode)
7223 return base_bit + 1;
9878760c
RK
7224 return scc_p ? base_bit + 3 : base_bit + 2;
7225 case EQ:
a3170dc6
AH
7226 if (TARGET_SPE && TARGET_HARD_FLOAT && cc_mode == CCFPmode)
7227 return base_bit + 1;
9878760c 7228 return base_bit + 2;
1c882ea4 7229 case GT: case GTU: case UNLE:
9878760c 7230 return base_bit + 1;
1c882ea4 7231 case LT: case LTU: case UNGE:
9878760c 7232 return base_bit;
1c882ea4
GK
7233 case ORDERED: case UNORDERED:
7234 return base_bit + 3;
9878760c
RK
7235
7236 case GE: case GEU:
39a10a29 7237 /* If scc, we will have done a cror to put the bit in the
9878760c
RK
7238 unordered position. So test that bit. For integer, this is ! LT
7239 unless this is an scc insn. */
39a10a29 7240 return scc_p ? base_bit + 3 : base_bit;
9878760c
RK
7241
7242 case LE: case LEU:
39a10a29 7243 return scc_p ? base_bit + 3 : base_bit + 1;
1c882ea4 7244
9878760c
RK
7245 default:
7246 abort ();
7247 }
7248}
1ff7789b 7249\f
8d30c4ee 7250/* Return the GOT register. */
1ff7789b
MM
7251
7252struct rtx_def *
7253rs6000_got_register (value)
5f59ecb7 7254 rtx value ATTRIBUTE_UNUSED;
1ff7789b 7255{
a4f6c312
SS
7256 /* The second flow pass currently (June 1999) can't update
7257 regs_ever_live without disturbing other parts of the compiler, so
7258 update it here to make the prolog/epilogue code happy. */
1db02437
FS
7259 if (no_new_pseudos && ! regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM])
7260 regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
1ff7789b 7261
8d30c4ee 7262 current_function_uses_pic_offset_table = 1;
3cb999d8 7263
1ff7789b
MM
7264 return pic_offset_table_rtx;
7265}
a7df97e6 7266\f
e2500fed
GK
7267/* Function to init struct machine_function.
7268 This will be called, via a pointer variable,
7269 from push_function_context. */
a7df97e6 7270
e2500fed
GK
7271static struct machine_function *
7272rs6000_init_machine_status ()
a7df97e6 7273{
e2500fed 7274 return ggc_alloc_cleared (sizeof (machine_function));
a7df97e6 7275}
9878760c 7276\f
0ba1b2ff
AM
7277/* These macros test for integers and extract the low-order bits. */
7278#define INT_P(X) \
7279((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE) \
7280 && GET_MODE (X) == VOIDmode)
7281
7282#define INT_LOWPART(X) \
7283 (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
7284
7285int
7286extract_MB (op)
7287 rtx op;
7288{
7289 int i;
7290 unsigned long val = INT_LOWPART (op);
7291
7292 /* If the high bit is zero, the value is the first 1 bit we find
7293 from the left. */
7294 if ((val & 0x80000000) == 0)
7295 {
7296 if ((val & 0xffffffff) == 0)
7297 abort ();
7298
7299 i = 1;
7300 while (((val <<= 1) & 0x80000000) == 0)
7301 ++i;
7302 return i;
7303 }
7304
7305 /* If the high bit is set and the low bit is not, or the mask is all
7306 1's, the value is zero. */
7307 if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
7308 return 0;
7309
7310 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
7311 from the right. */
7312 i = 31;
7313 while (((val >>= 1) & 1) != 0)
7314 --i;
7315
7316 return i;
7317}
7318
7319int
7320extract_ME (op)
7321 rtx op;
7322{
7323 int i;
7324 unsigned long val = INT_LOWPART (op);
7325
7326 /* If the low bit is zero, the value is the first 1 bit we find from
7327 the right. */
7328 if ((val & 1) == 0)
7329 {
7330 if ((val & 0xffffffff) == 0)
7331 abort ();
7332
7333 i = 30;
7334 while (((val >>= 1) & 1) == 0)
7335 --i;
7336
7337 return i;
7338 }
7339
7340 /* If the low bit is set and the high bit is not, or the mask is all
7341 1's, the value is 31. */
7342 if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
7343 return 31;
7344
7345 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
7346 from the left. */
7347 i = 0;
7348 while (((val <<= 1) & 0x80000000) != 0)
7349 ++i;
7350
7351 return i;
7352}
7353
9878760c
RK
7354/* Print an operand. Recognize special options, documented below. */
7355
38c1f2d7 7356#if TARGET_ELF
d9407988 7357#define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
8fbd2dc7 7358#define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
ba5e43aa
MM
7359#else
7360#define SMALL_DATA_RELOC "sda21"
8fbd2dc7 7361#define SMALL_DATA_REG 0
ba5e43aa
MM
7362#endif
7363
9878760c
RK
7364void
7365print_operand (file, x, code)
7366 FILE *file;
7367 rtx x;
9ebbca7d 7368 int code;
9878760c
RK
7369{
7370 int i;
a260abc9 7371 HOST_WIDE_INT val;
0ba1b2ff 7372 unsigned HOST_WIDE_INT uval;
9878760c
RK
7373
7374 switch (code)
7375 {
a8b3aeda 7376 case '.':
a85d226b
RK
7377 /* Write out an instruction after the call which may be replaced
7378 with glue code by the loader. This depends on the AIX version. */
7379 asm_fprintf (file, RS6000_CALL_GLUE);
a8b3aeda
RK
7380 return;
7381
81eace42
GK
7382 /* %a is output_address. */
7383
9854d9ed
RK
7384 case 'A':
7385 /* If X is a constant integer whose low-order 5 bits are zero,
7386 write 'l'. Otherwise, write 'r'. This is a kludge to fix a bug
76229ac8 7387 in the AIX assembler where "sri" with a zero shift count
20e26713 7388 writes a trash instruction. */
9854d9ed 7389 if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
76229ac8 7390 putc ('l', file);
9854d9ed 7391 else
76229ac8 7392 putc ('r', file);
9854d9ed
RK
7393 return;
7394
7395 case 'b':
e2c953b6
DE
7396 /* If constant, low-order 16 bits of constant, unsigned.
7397 Otherwise, write normally. */
7398 if (INT_P (x))
7399 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
7400 else
7401 print_operand (file, x, 0);
cad12a8d
RK
7402 return;
7403
a260abc9
DE
7404 case 'B':
7405 /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
7406 for 64-bit mask direction. */
296b8152 7407 putc (((INT_LOWPART(x) & 1) == 0 ? 'r' : 'l'), file);
a238cd8b 7408 return;
a260abc9 7409
81eace42
GK
7410 /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
7411 output_operand. */
7412
9854d9ed 7413 case 'D':
39a10a29
GK
7414 /* There used to be a comment for 'C' reading "This is an
7415 optional cror needed for certain floating-point
7416 comparisons. Otherwise write nothing." */
7417
9854d9ed
RK
7418 /* Similar, except that this is for an scc, so we must be able to
7419 encode the test in a single bit that is one. We do the above
7420 for any LE, GE, GEU, or LEU and invert the bit for NE. */
7421 if (GET_CODE (x) == LE || GET_CODE (x) == GE
7422 || GET_CODE (x) == LEU || GET_CODE (x) == GEU)
7423 {
9ebbca7d 7424 int base_bit = 4 * (REGNO (XEXP (x, 0)) - CR0_REGNO);
9854d9ed
RK
7425
7426 fprintf (file, "cror %d,%d,%d\n\t", base_bit + 3,
7427 base_bit + 2,
7428 base_bit + (GET_CODE (x) == GE || GET_CODE (x) == GEU));
7429 }
7430
7431 else if (GET_CODE (x) == NE)
7432 {
9ebbca7d 7433 int base_bit = 4 * (REGNO (XEXP (x, 0)) - CR0_REGNO);
9854d9ed
RK
7434
7435 fprintf (file, "crnor %d,%d,%d\n\t", base_bit + 3,
7436 base_bit + 2, base_bit + 2);
7437 }
a3170dc6
AH
7438 else if (TARGET_SPE && TARGET_HARD_FLOAT
7439 && GET_CODE (x) == EQ
7440 && GET_MODE (XEXP (x, 0)) == CCFPmode)
7441 {
7442 int base_bit = 4 * (REGNO (XEXP (x, 0)) - CR0_REGNO);
7443
7444 fprintf (file, "crnor %d,%d,%d\n\t", base_bit + 1,
7445 base_bit + 1, base_bit + 1);
7446 }
9854d9ed
RK
7447 return;
7448
7449 case 'E':
39a10a29 7450 /* X is a CR register. Print the number of the EQ bit of the CR */
9854d9ed
RK
7451 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
7452 output_operand_lossage ("invalid %%E value");
78fbdbf7 7453 else
39a10a29 7454 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
a85d226b 7455 return;
9854d9ed
RK
7456
7457 case 'f':
7458 /* X is a CR register. Print the shift count needed to move it
7459 to the high-order four bits. */
7460 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
7461 output_operand_lossage ("invalid %%f value");
7462 else
9ebbca7d 7463 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
9854d9ed
RK
7464 return;
7465
7466 case 'F':
7467 /* Similar, but print the count for the rotate in the opposite
7468 direction. */
7469 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
7470 output_operand_lossage ("invalid %%F value");
7471 else
9ebbca7d 7472 fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
9854d9ed
RK
7473 return;
7474
7475 case 'G':
7476 /* X is a constant integer. If it is negative, print "m",
7477 otherwise print "z". This is to make a aze or ame insn. */
7478 if (GET_CODE (x) != CONST_INT)
7479 output_operand_lossage ("invalid %%G value");
7480 else if (INTVAL (x) >= 0)
76229ac8 7481 putc ('z', file);
9854d9ed 7482 else
76229ac8 7483 putc ('m', file);
9854d9ed 7484 return;
e2c953b6 7485
9878760c 7486 case 'h':
a4f6c312
SS
7487 /* If constant, output low-order five bits. Otherwise, write
7488 normally. */
9878760c 7489 if (INT_P (x))
5f59ecb7 7490 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
9878760c
RK
7491 else
7492 print_operand (file, x, 0);
7493 return;
7494
64305719 7495 case 'H':
a4f6c312
SS
7496 /* If constant, output low-order six bits. Otherwise, write
7497 normally. */
64305719 7498 if (INT_P (x))
5f59ecb7 7499 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
64305719
DE
7500 else
7501 print_operand (file, x, 0);
7502 return;
7503
9854d9ed
RK
7504 case 'I':
7505 /* Print `i' if this is a constant, else nothing. */
9878760c 7506 if (INT_P (x))
76229ac8 7507 putc ('i', file);
9878760c
RK
7508 return;
7509
9854d9ed
RK
7510 case 'j':
7511 /* Write the bit number in CCR for jump. */
7512 i = ccr_bit (x, 0);
7513 if (i == -1)
7514 output_operand_lossage ("invalid %%j code");
9878760c 7515 else
9854d9ed 7516 fprintf (file, "%d", i);
9878760c
RK
7517 return;
7518
9854d9ed
RK
7519 case 'J':
7520 /* Similar, but add one for shift count in rlinm for scc and pass
7521 scc flag to `ccr_bit'. */
7522 i = ccr_bit (x, 1);
7523 if (i == -1)
7524 output_operand_lossage ("invalid %%J code");
7525 else
a0466a68
RK
7526 /* If we want bit 31, write a shift count of zero, not 32. */
7527 fprintf (file, "%d", i == 31 ? 0 : i + 1);
9878760c
RK
7528 return;
7529
9854d9ed
RK
7530 case 'k':
7531 /* X must be a constant. Write the 1's complement of the
7532 constant. */
9878760c 7533 if (! INT_P (x))
9854d9ed 7534 output_operand_lossage ("invalid %%k value");
e2c953b6
DE
7535 else
7536 fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
9878760c
RK
7537 return;
7538
81eace42 7539 case 'K':
9ebbca7d
GK
7540 /* X must be a symbolic constant on ELF. Write an
7541 expression suitable for an 'addi' that adds in the low 16
7542 bits of the MEM. */
7543 if (GET_CODE (x) != CONST)
7544 {
7545 print_operand_address (file, x);
7546 fputs ("@l", file);
7547 }
7548 else
7549 {
7550 if (GET_CODE (XEXP (x, 0)) != PLUS
7551 || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
7552 && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
7553 || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
53cd5d6c 7554 output_operand_lossage ("invalid %%K value");
9ebbca7d
GK
7555 print_operand_address (file, XEXP (XEXP (x, 0), 0));
7556 fputs ("@l", file);
ed8d2920
MM
7557 /* For GNU as, there must be a non-alphanumeric character
7558 between 'l' and the number. The '-' is added by
7559 print_operand() already. */
7560 if (INTVAL (XEXP (XEXP (x, 0), 1)) >= 0)
7561 fputs ("+", file);
9ebbca7d
GK
7562 print_operand (file, XEXP (XEXP (x, 0), 1), 0);
7563 }
81eace42
GK
7564 return;
7565
7566 /* %l is output_asm_label. */
9ebbca7d 7567
9854d9ed
RK
7568 case 'L':
7569 /* Write second word of DImode or DFmode reference. Works on register
7570 or non-indexed memory only. */
7571 if (GET_CODE (x) == REG)
5ebfb2ba 7572 fprintf (file, "%s", reg_names[REGNO (x) + 1]);
9854d9ed
RK
7573 else if (GET_CODE (x) == MEM)
7574 {
7575 /* Handle possible auto-increment. Since it is pre-increment and
1427100a 7576 we have already done it, we can just use an offset of word. */
9854d9ed
RK
7577 if (GET_CODE (XEXP (x, 0)) == PRE_INC
7578 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
ed8908e7
RK
7579 output_address (plus_constant (XEXP (XEXP (x, 0), 0),
7580 UNITS_PER_WORD));
9854d9ed 7581 else
d7624dc0
RK
7582 output_address (XEXP (adjust_address_nv (x, SImode,
7583 UNITS_PER_WORD),
7584 0));
ed8908e7 7585
ba5e43aa 7586 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
7587 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
7588 reg_names[SMALL_DATA_REG]);
9854d9ed 7589 }
9878760c 7590 return;
9854d9ed 7591
9878760c
RK
7592 case 'm':
7593 /* MB value for a mask operand. */
b1765bde 7594 if (! mask_operand (x, SImode))
9878760c
RK
7595 output_operand_lossage ("invalid %%m value");
7596
0ba1b2ff 7597 fprintf (file, "%d", extract_MB (x));
9878760c
RK
7598 return;
7599
7600 case 'M':
7601 /* ME value for a mask operand. */
b1765bde 7602 if (! mask_operand (x, SImode))
a260abc9 7603 output_operand_lossage ("invalid %%M value");
9878760c 7604
0ba1b2ff 7605 fprintf (file, "%d", extract_ME (x));
9878760c
RK
7606 return;
7607
81eace42
GK
7608 /* %n outputs the negative of its operand. */
7609
9878760c
RK
7610 case 'N':
7611 /* Write the number of elements in the vector times 4. */
7612 if (GET_CODE (x) != PARALLEL)
7613 output_operand_lossage ("invalid %%N value");
e2c953b6
DE
7614 else
7615 fprintf (file, "%d", XVECLEN (x, 0) * 4);
9878760c
RK
7616 return;
7617
7618 case 'O':
7619 /* Similar, but subtract 1 first. */
7620 if (GET_CODE (x) != PARALLEL)
1427100a 7621 output_operand_lossage ("invalid %%O value");
e2c953b6
DE
7622 else
7623 fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
9878760c
RK
7624 return;
7625
9854d9ed
RK
7626 case 'p':
7627 /* X is a CONST_INT that is a power of two. Output the logarithm. */
7628 if (! INT_P (x)
2bfcf297 7629 || INT_LOWPART (x) < 0
9854d9ed
RK
7630 || (i = exact_log2 (INT_LOWPART (x))) < 0)
7631 output_operand_lossage ("invalid %%p value");
e2c953b6
DE
7632 else
7633 fprintf (file, "%d", i);
9854d9ed
RK
7634 return;
7635
9878760c
RK
7636 case 'P':
7637 /* The operand must be an indirect memory reference. The result
a4f6c312 7638 is the register number. */
9878760c
RK
7639 if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
7640 || REGNO (XEXP (x, 0)) >= 32)
7641 output_operand_lossage ("invalid %%P value");
e2c953b6
DE
7642 else
7643 fprintf (file, "%d", REGNO (XEXP (x, 0)));
9878760c
RK
7644 return;
7645
dfbdccdb
GK
7646 case 'q':
7647 /* This outputs the logical code corresponding to a boolean
7648 expression. The expression may have one or both operands
39a10a29
GK
7649 negated (if one, only the first one). For condition register
7650 logical operations, it will also treat the negated
7651 CR codes as NOTs, but not handle NOTs of them. */
dfbdccdb 7652 {
63bc1d05 7653 const char *const *t = 0;
dfbdccdb
GK
7654 const char *s;
7655 enum rtx_code code = GET_CODE (x);
7656 static const char * const tbl[3][3] = {
7657 { "and", "andc", "nor" },
7658 { "or", "orc", "nand" },
7659 { "xor", "eqv", "xor" } };
7660
7661 if (code == AND)
7662 t = tbl[0];
7663 else if (code == IOR)
7664 t = tbl[1];
7665 else if (code == XOR)
7666 t = tbl[2];
7667 else
7668 output_operand_lossage ("invalid %%q value");
7669
7670 if (GET_CODE (XEXP (x, 0)) != NOT)
7671 s = t[0];
7672 else
7673 {
7674 if (GET_CODE (XEXP (x, 1)) == NOT)
7675 s = t[2];
7676 else
7677 s = t[1];
7678 }
7679
7680 fputs (s, file);
7681 }
7682 return;
7683
9854d9ed
RK
7684 case 'R':
7685 /* X is a CR register. Print the mask for `mtcrf'. */
7686 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
7687 output_operand_lossage ("invalid %%R value");
7688 else
9ebbca7d 7689 fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
9878760c 7690 return;
9854d9ed
RK
7691
7692 case 's':
7693 /* Low 5 bits of 32 - value */
7694 if (! INT_P (x))
7695 output_operand_lossage ("invalid %%s value");
e2c953b6
DE
7696 else
7697 fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
9878760c 7698 return;
9854d9ed 7699
a260abc9 7700 case 'S':
0ba1b2ff 7701 /* PowerPC64 mask position. All 0's is excluded.
a260abc9
DE
7702 CONST_INT 32-bit mask is considered sign-extended so any
7703 transition must occur within the CONST_INT, not on the boundary. */
b1765bde 7704 if (! mask64_operand (x, DImode))
a260abc9
DE
7705 output_operand_lossage ("invalid %%S value");
7706
0ba1b2ff 7707 uval = INT_LOWPART (x);
a260abc9 7708
0ba1b2ff 7709 if (uval & 1) /* Clear Left */
a260abc9 7710 {
0ba1b2ff
AM
7711 uval &= ((unsigned HOST_WIDE_INT) 1 << 63 << 1) - 1;
7712 i = 64;
a260abc9 7713 }
0ba1b2ff 7714 else /* Clear Right */
a260abc9 7715 {
0ba1b2ff
AM
7716 uval = ~uval;
7717 uval &= ((unsigned HOST_WIDE_INT) 1 << 63 << 1) - 1;
7718 i = 63;
a260abc9 7719 }
0ba1b2ff
AM
7720 while (uval != 0)
7721 --i, uval >>= 1;
7722 if (i < 0)
7723 abort ();
7724 fprintf (file, "%d", i);
7725 return;
a260abc9 7726
a3170dc6
AH
7727 case 't':
7728 /* Like 'J' but get to the OVERFLOW/UNORDERED bit. */
7729 if (GET_CODE (x) != REG || GET_MODE (x) != CCmode)
7730 abort ();
7731
7732 /* Bit 3 is OV bit. */
7733 i = 4 * (REGNO (x) - CR0_REGNO) + 3;
7734
7735 /* If we want bit 31, write a shift count of zero, not 32. */
7736 fprintf (file, "%d", i == 31 ? 0 : i + 1);
7737 return;
7738
cccf3bdc
DE
7739 case 'T':
7740 /* Print the symbolic name of a branch target register. */
7741 if (GET_CODE (x) != REG || (REGNO (x) != LINK_REGISTER_REGNUM
7742 && REGNO (x) != COUNT_REGISTER_REGNUM))
7743 output_operand_lossage ("invalid %%T value");
e2c953b6 7744 else if (REGNO (x) == LINK_REGISTER_REGNUM)
cccf3bdc
DE
7745 fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
7746 else
7747 fputs ("ctr", file);
7748 return;
7749
9854d9ed 7750 case 'u':
802a0058 7751 /* High-order 16 bits of constant for use in unsigned operand. */
9854d9ed
RK
7752 if (! INT_P (x))
7753 output_operand_lossage ("invalid %%u value");
e2c953b6
DE
7754 else
7755 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
7756 (INT_LOWPART (x) >> 16) & 0xffff);
9878760c
RK
7757 return;
7758
802a0058
MM
7759 case 'v':
7760 /* High-order 16 bits of constant for use in signed operand. */
7761 if (! INT_P (x))
7762 output_operand_lossage ("invalid %%v value");
e2c953b6 7763 else
134c32f6
DE
7764 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
7765 (INT_LOWPART (x) >> 16) & 0xffff);
7766 return;
802a0058 7767
9854d9ed
RK
7768 case 'U':
7769 /* Print `u' if this has an auto-increment or auto-decrement. */
7770 if (GET_CODE (x) == MEM
7771 && (GET_CODE (XEXP (x, 0)) == PRE_INC
7772 || GET_CODE (XEXP (x, 0)) == PRE_DEC))
76229ac8 7773 putc ('u', file);
9854d9ed 7774 return;
9878760c 7775
e0cd0770
JC
7776 case 'V':
7777 /* Print the trap code for this operand. */
7778 switch (GET_CODE (x))
7779 {
7780 case EQ:
7781 fputs ("eq", file); /* 4 */
7782 break;
7783 case NE:
7784 fputs ("ne", file); /* 24 */
7785 break;
7786 case LT:
7787 fputs ("lt", file); /* 16 */
7788 break;
7789 case LE:
7790 fputs ("le", file); /* 20 */
7791 break;
7792 case GT:
7793 fputs ("gt", file); /* 8 */
7794 break;
7795 case GE:
7796 fputs ("ge", file); /* 12 */
7797 break;
7798 case LTU:
7799 fputs ("llt", file); /* 2 */
7800 break;
7801 case LEU:
7802 fputs ("lle", file); /* 6 */
7803 break;
7804 case GTU:
7805 fputs ("lgt", file); /* 1 */
7806 break;
7807 case GEU:
7808 fputs ("lge", file); /* 5 */
7809 break;
7810 default:
7811 abort ();
7812 }
7813 break;
7814
9854d9ed
RK
7815 case 'w':
7816 /* If constant, low-order 16 bits of constant, signed. Otherwise, write
7817 normally. */
7818 if (INT_P (x))
5f59ecb7
DE
7819 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
7820 ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
9854d9ed
RK
7821 else
7822 print_operand (file, x, 0);
9878760c
RK
7823 return;
7824
9854d9ed 7825 case 'W':
e2c953b6 7826 /* MB value for a PowerPC64 rldic operand. */
e2c953b6
DE
7827 val = (GET_CODE (x) == CONST_INT
7828 ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
7829
7830 if (val < 0)
7831 i = -1;
9854d9ed 7832 else
e2c953b6
DE
7833 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
7834 if ((val <<= 1) < 0)
7835 break;
7836
7837#if HOST_BITS_PER_WIDE_INT == 32
7838 if (GET_CODE (x) == CONST_INT && i >= 0)
7839 i += 32; /* zero-extend high-part was all 0's */
7840 else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
7841 {
7842 val = CONST_DOUBLE_LOW (x);
7843
7844 if (val == 0)
a4f6c312 7845 abort ();
e2c953b6
DE
7846 else if (val < 0)
7847 --i;
7848 else
7849 for ( ; i < 64; i++)
7850 if ((val <<= 1) < 0)
7851 break;
7852 }
7853#endif
7854
7855 fprintf (file, "%d", i + 1);
9854d9ed 7856 return;
9878760c 7857
9854d9ed
RK
7858 case 'X':
7859 if (GET_CODE (x) == MEM
258bfae2 7860 && LEGITIMATE_INDEXED_ADDRESS_P (XEXP (x, 0), 0))
76229ac8 7861 putc ('x', file);
9854d9ed 7862 return;
9878760c 7863
9854d9ed
RK
7864 case 'Y':
7865 /* Like 'L', for third word of TImode */
7866 if (GET_CODE (x) == REG)
5ebfb2ba 7867 fprintf (file, "%s", reg_names[REGNO (x) + 2]);
9854d9ed 7868 else if (GET_CODE (x) == MEM)
9878760c 7869 {
9854d9ed
RK
7870 if (GET_CODE (XEXP (x, 0)) == PRE_INC
7871 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
a54d04b7 7872 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
9854d9ed 7873 else
d7624dc0 7874 output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
ba5e43aa 7875 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
7876 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
7877 reg_names[SMALL_DATA_REG]);
9878760c
RK
7878 }
7879 return;
9854d9ed 7880
9878760c 7881 case 'z':
b4ac57ab
RS
7882 /* X is a SYMBOL_REF. Write out the name preceded by a
7883 period and without any trailing data in brackets. Used for function
4d30c363
MM
7884 names. If we are configured for System V (or the embedded ABI) on
7885 the PowerPC, do not emit the period, since those systems do not use
7886 TOCs and the like. */
9878760c
RK
7887 if (GET_CODE (x) != SYMBOL_REF)
7888 abort ();
7889
b6c9286a
MM
7890 if (XSTR (x, 0)[0] != '.')
7891 {
7892 switch (DEFAULT_ABI)
7893 {
7894 default:
7895 abort ();
7896
7897 case ABI_AIX:
7898 putc ('.', file);
7899 break;
7900
7901 case ABI_V4:
7902 case ABI_AIX_NODESC:
ee890fe2 7903 case ABI_DARWIN:
b6c9286a 7904 break;
b6c9286a
MM
7905 }
7906 }
54ee9799
DE
7907#if TARGET_AIX
7908 RS6000_OUTPUT_BASENAME (file, XSTR (x, 0));
7909#else
9ebbca7d 7910 assemble_name (file, XSTR (x, 0));
54ee9799 7911#endif
9878760c
RK
7912 return;
7913
9854d9ed
RK
7914 case 'Z':
7915 /* Like 'L', for last word of TImode. */
7916 if (GET_CODE (x) == REG)
5ebfb2ba 7917 fprintf (file, "%s", reg_names[REGNO (x) + 3]);
9854d9ed
RK
7918 else if (GET_CODE (x) == MEM)
7919 {
7920 if (GET_CODE (XEXP (x, 0)) == PRE_INC
7921 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
a54d04b7 7922 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
9854d9ed 7923 else
d7624dc0 7924 output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
ba5e43aa 7925 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
7926 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
7927 reg_names[SMALL_DATA_REG]);
9854d9ed 7928 }
5c23c401 7929 return;
0ac081f6 7930
a3170dc6 7931 /* Print AltiVec or SPE memory operand. */
0ac081f6
AH
7932 case 'y':
7933 {
7934 rtx tmp;
7935
7936 if (GET_CODE (x) != MEM)
7937 abort ();
7938
7939 tmp = XEXP (x, 0);
7940
a3170dc6
AH
7941 if (TARGET_SPE)
7942 {
7943 /* Handle [reg]. */
7944 if (GET_CODE (tmp) == REG)
7945 {
7946 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
7947 break;
7948 }
7949 /* Handle [reg+UIMM]. */
7950 else if (GET_CODE (tmp) == PLUS &&
7951 GET_CODE (XEXP (tmp, 1)) == CONST_INT)
7952 {
7953 int x;
7954
7955 if (GET_CODE (XEXP (tmp, 0)) != REG)
7956 abort ();
7957
7958 x = INTVAL (XEXP (tmp, 1));
7959 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
7960 break;
7961 }
7962
7963 /* Fall through. Must be [reg+reg]. */
7964 }
0ac081f6 7965 if (GET_CODE (tmp) == REG)
c62f2db5 7966 fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
0ac081f6
AH
7967 else if (GET_CODE (tmp) == PLUS && GET_CODE (XEXP (tmp, 1)) == REG)
7968 {
7969 if (REGNO (XEXP (tmp, 0)) == 0)
7970 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
7971 reg_names[ REGNO (XEXP (tmp, 0)) ]);
7972 else
7973 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
7974 reg_names[ REGNO (XEXP (tmp, 1)) ]);
7975 }
7976 else
7977 abort ();
7978 break;
7979 }
9854d9ed 7980
9878760c
RK
7981 case 0:
7982 if (GET_CODE (x) == REG)
7983 fprintf (file, "%s", reg_names[REGNO (x)]);
7984 else if (GET_CODE (x) == MEM)
7985 {
7986 /* We need to handle PRE_INC and PRE_DEC here, since we need to
7987 know the width from the mode. */
7988 if (GET_CODE (XEXP (x, 0)) == PRE_INC)
79ba6d34
MM
7989 fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
7990 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
9878760c 7991 else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
79ba6d34
MM
7992 fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
7993 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
9878760c 7994 else
a54d04b7 7995 output_address (XEXP (x, 0));
9878760c
RK
7996 }
7997 else
a54d04b7 7998 output_addr_const (file, x);
a85d226b 7999 return;
9878760c
RK
8000
8001 default:
8002 output_operand_lossage ("invalid %%xn code");
8003 }
8004}
8005\f
8006/* Print the address of an operand. */
8007
8008void
8009print_operand_address (file, x)
8010 FILE *file;
592696dd 8011 rtx x;
9878760c
RK
8012{
8013 if (GET_CODE (x) == REG)
4697a36c 8014 fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
9ebbca7d
GK
8015 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
8016 || GET_CODE (x) == LABEL_REF)
9878760c
RK
8017 {
8018 output_addr_const (file, x);
ba5e43aa 8019 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
8020 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
8021 reg_names[SMALL_DATA_REG]);
9ebbca7d 8022 else if (TARGET_TOC)
a4f6c312 8023 abort ();
9878760c
RK
8024 }
8025 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
8026 {
8027 if (REGNO (XEXP (x, 0)) == 0)
4697a36c
MM
8028 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
8029 reg_names[ REGNO (XEXP (x, 0)) ]);
9878760c 8030 else
4697a36c
MM
8031 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
8032 reg_names[ REGNO (XEXP (x, 1)) ]);
9878760c
RK
8033 }
8034 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
5f59ecb7
DE
8035 {
8036 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (XEXP (x, 1)));
8037 fprintf (file, "(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
8038 }
3cb999d8
DE
8039#if TARGET_ELF
8040 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
8041 && CONSTANT_P (XEXP (x, 1)))
4697a36c
MM
8042 {
8043 output_addr_const (file, XEXP (x, 1));
8044 fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
8045 }
c859cda6
DJ
8046#endif
8047#if TARGET_MACHO
8048 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
8049 && CONSTANT_P (XEXP (x, 1)))
8050 {
8051 fprintf (file, "lo16(");
8052 output_addr_const (file, XEXP (x, 1));
8053 fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
8054 }
3cb999d8 8055#endif
9ebbca7d
GK
8056 else if (LEGITIMATE_CONSTANT_POOL_ADDRESS_P (x))
8057 {
2bfcf297 8058 if (TARGET_AIX && (!TARGET_ELF || !TARGET_MINIMAL_TOC))
9ebbca7d 8059 {
2bfcf297
DB
8060 rtx contains_minus = XEXP (x, 1);
8061 rtx minus, symref;
8062 const char *name;
9ebbca7d
GK
8063
8064 /* Find the (minus (sym) (toc)) buried in X, and temporarily
a4f6c312 8065 turn it into (sym) for output_addr_const. */
9ebbca7d
GK
8066 while (GET_CODE (XEXP (contains_minus, 0)) != MINUS)
8067 contains_minus = XEXP (contains_minus, 0);
8068
2bfcf297
DB
8069 minus = XEXP (contains_minus, 0);
8070 symref = XEXP (minus, 0);
8071 XEXP (contains_minus, 0) = symref;
8072 if (TARGET_ELF)
8073 {
8074 char *newname;
8075
8076 name = XSTR (symref, 0);
8077 newname = alloca (strlen (name) + sizeof ("@toc"));
8078 strcpy (newname, name);
8079 strcat (newname, "@toc");
8080 XSTR (symref, 0) = newname;
8081 }
8082 output_addr_const (file, XEXP (x, 1));
8083 if (TARGET_ELF)
8084 XSTR (symref, 0) = name;
9ebbca7d
GK
8085 XEXP (contains_minus, 0) = minus;
8086 }
8087 else
8088 output_addr_const (file, XEXP (x, 1));
8089
8090 fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
8091 }
9878760c
RK
8092 else
8093 abort ();
8094}
8095\f
301d03af
RS
8096/* Target hook for assembling integer objects. The powerpc version has
8097 to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
8098 is defined. It also needs to handle DI-mode objects on 64-bit
8099 targets. */
8100
8101static bool
8102rs6000_assemble_integer (x, size, aligned_p)
8103 rtx x;
8104 unsigned int size;
8105 int aligned_p;
8106{
8107#ifdef RELOCATABLE_NEEDS_FIXUP
8108 /* Special handling for SI values. */
8109 if (size == 4 && aligned_p)
8110 {
8111 extern int in_toc_section PARAMS ((void));
8112 static int recurse = 0;
8113
8114 /* For -mrelocatable, we mark all addresses that need to be fixed up
8115 in the .fixup section. */
8116 if (TARGET_RELOCATABLE
8117 && !in_toc_section ()
8118 && !in_text_section ()
8119 && !recurse
8120 && GET_CODE (x) != CONST_INT
8121 && GET_CODE (x) != CONST_DOUBLE
8122 && CONSTANT_P (x))
8123 {
8124 char buf[256];
8125
8126 recurse = 1;
8127 ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
8128 fixuplabelno++;
8129 ASM_OUTPUT_LABEL (asm_out_file, buf);
8130 fprintf (asm_out_file, "\t.long\t(");
8131 output_addr_const (asm_out_file, x);
8132 fprintf (asm_out_file, ")@fixup\n");
8133 fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
8134 ASM_OUTPUT_ALIGN (asm_out_file, 2);
8135 fprintf (asm_out_file, "\t.long\t");
8136 assemble_name (asm_out_file, buf);
8137 fprintf (asm_out_file, "\n\t.previous\n");
8138 recurse = 0;
8139 return true;
8140 }
8141 /* Remove initial .'s to turn a -mcall-aixdesc function
8142 address into the address of the descriptor, not the function
8143 itself. */
8144 else if (GET_CODE (x) == SYMBOL_REF
8145 && XSTR (x, 0)[0] == '.'
8146 && DEFAULT_ABI == ABI_AIX)
8147 {
8148 const char *name = XSTR (x, 0);
8149 while (*name == '.')
8150 name++;
8151
8152 fprintf (asm_out_file, "\t.long\t%s\n", name);
8153 return true;
8154 }
8155 }
8156#endif /* RELOCATABLE_NEEDS_FIXUP */
8157 return default_assemble_integer (x, size, aligned_p);
8158}
93638d7a
AM
8159
8160#ifdef HAVE_GAS_HIDDEN
8161/* Emit an assembler directive to set symbol visibility for DECL to
8162 VISIBILITY_TYPE. */
8163
5add3202 8164static void
93638d7a
AM
8165rs6000_assemble_visibility (decl, visibility_type)
8166 tree decl;
8167 const char *visibility_type;
8168{
bd79540a 8169 default_assemble_visibility (decl, visibility_type);
93638d7a
AM
8170
8171 /* Functions need to have their entry point symbol visibility set as
8172 well as their descriptor symbol visibility. */
8173 if (DEFAULT_ABI == ABI_AIX && TREE_CODE (decl) == FUNCTION_DECL)
8174 {
8175 const char *name;
8176
8177 name = ((* targetm.strip_name_encoding)
8178 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
8179
8180 fprintf (asm_out_file, "\t.%s\t.%s\n", visibility_type, name);
8181 }
8182}
8183#endif
301d03af 8184\f
39a10a29
GK
8185enum rtx_code
8186rs6000_reverse_condition (mode, code)
8187 enum machine_mode mode;
8188 enum rtx_code code;
8189{
8190 /* Reversal of FP compares takes care -- an ordered compare
8191 becomes an unordered compare and vice versa. */
8192 if (mode == CCFPmode)
bab6226b 8193 return reverse_condition_maybe_unordered (code);
39a10a29 8194 else
bab6226b 8195 return reverse_condition (code);
39a10a29
GK
8196}
8197
39a10a29
GK
8198/* Generate a compare for CODE. Return a brand-new rtx that
8199 represents the result of the compare. */
a4f6c312 8200
39a10a29
GK
8201static rtx
8202rs6000_generate_compare (code)
8203 enum rtx_code code;
8204{
8205 enum machine_mode comp_mode;
8206 rtx compare_result;
8207
8208 if (rs6000_compare_fp_p)
8209 comp_mode = CCFPmode;
8210 else if (code == GTU || code == LTU
8211 || code == GEU || code == LEU)
8212 comp_mode = CCUNSmode;
8213 else
8214 comp_mode = CCmode;
8215
8216 /* First, the compare. */
8217 compare_result = gen_reg_rtx (comp_mode);
a3170dc6
AH
8218
8219 /* SPE FP compare instructions on the GPRs. Yuck! */
8220 if ((TARGET_SPE && TARGET_HARD_FLOAT) && rs6000_compare_fp_p)
8221 {
8222 rtx cmp, or1, or2, or_result, compare_result2;
8223
8224 switch (code)
8225 {
8226 case EQ:
8227 case UNEQ:
8228 case NE:
8229 case LTGT:
8230 cmp = flag_unsafe_math_optimizations
8231 ? gen_tstsfeq_gpr (compare_result, rs6000_compare_op0,
8232 rs6000_compare_op1)
8233 : gen_cmpsfeq_gpr (compare_result, rs6000_compare_op0,
8234 rs6000_compare_op1);
8235 break;
8236 case GT:
8237 case GTU:
8238 case UNGT:
8239 case UNGE:
8240 case GE:
8241 case GEU:
8242 cmp = flag_unsafe_math_optimizations
8243 ? gen_tstsfgt_gpr (compare_result, rs6000_compare_op0,
8244 rs6000_compare_op1)
8245 : gen_cmpsfgt_gpr (compare_result, rs6000_compare_op0,
8246 rs6000_compare_op1);
8247 break;
8248 case LT:
8249 case LTU:
8250 case UNLT:
8251 case UNLE:
8252 case LE:
8253 case LEU:
8254 cmp = flag_unsafe_math_optimizations
8255 ? gen_tstsflt_gpr (compare_result, rs6000_compare_op0,
8256 rs6000_compare_op1)
8257 : gen_cmpsflt_gpr (compare_result, rs6000_compare_op0,
8258 rs6000_compare_op1);
8259 break;
8260 default:
8261 abort ();
8262 }
8263
8264 /* Synthesize LE and GE from LT/GT || EQ. */
8265 if (code == LE || code == GE || code == LEU || code == GEU)
8266 {
8267 /* Synthesize GE/LE frome GT/LT || EQ. */
8268
8269 emit_insn (cmp);
8270
8271 switch (code)
8272 {
8273 case LE: code = LT; break;
8274 case GE: code = GT; break;
8275 case LEU: code = LT; break;
8276 case GEU: code = GT; break;
8277 default: abort ();
8278 }
8279
8280 or1 = gen_reg_rtx (SImode);
8281 or2 = gen_reg_rtx (SImode);
8282 or_result = gen_reg_rtx (CCEQmode);
8283 compare_result2 = gen_reg_rtx (CCFPmode);
8284
8285 /* Do the EQ. */
8286 cmp = flag_unsafe_math_optimizations
8287 ? gen_tstsfeq_gpr (compare_result2, rs6000_compare_op0,
8288 rs6000_compare_op1)
8289 : gen_cmpsfeq_gpr (compare_result2, rs6000_compare_op0,
8290 rs6000_compare_op1);
8291 emit_insn (cmp);
8292
8293 /* The MC8540 FP compare instructions set the CR bits
8294 differently than other PPC compare instructions. For
8295 that matter, there is no generic test instruction, but a
8296 testgt, testlt, and testeq. For a true condition, bit 2
8297 is set (x1xx) in the CR. Following the traditional CR
8298 values:
8299
8300 LT GT EQ OV
8301 bit3 bit2 bit1 bit0
8302
8303 ... bit 2 would be a GT CR alias, so later on we
8304 look in the GT bits for the branch instructins.
8305 However, we must be careful to emit correct RTL in
8306 the meantime, so optimizations don't get confused. */
8307
8308 or1 = gen_rtx (NE, SImode, compare_result, const0_rtx);
8309 or2 = gen_rtx (NE, SImode, compare_result2, const0_rtx);
8310
8311 /* OR them together. */
8312 cmp = gen_rtx_SET (VOIDmode, or_result,
8313 gen_rtx_COMPARE (CCEQmode,
8314 gen_rtx_IOR (SImode, or1, or2),
8315 const_true_rtx));
8316 compare_result = or_result;
8317 code = EQ;
8318 }
8319 else
8320 {
8321 /* We only care about 1 bit (x1xx), so map everything to NE to
8322 maintain rtl sanity. We'll get to the right bit (x1xx) at
8323 code output time. */
8324 if (code == NE || code == LTGT)
8325 /* Do the inverse here because we have no cmpne
8326 instruction. We use the cmpeq instruction and expect
8327 to get a 0 instead. */
8328 code = EQ;
8329 else
8330 code = NE;
8331 }
8332
8333 emit_insn (cmp);
8334 }
8335 else
8336 emit_insn (gen_rtx_SET (VOIDmode, compare_result,
8337 gen_rtx_COMPARE (comp_mode,
8338 rs6000_compare_op0,
8339 rs6000_compare_op1)));
39a10a29 8340
ca5adc63 8341 /* Some kinds of FP comparisons need an OR operation;
de6c5979 8342 except for flag_unsafe_math_optimizations we don't bother. */
39a10a29 8343 if (rs6000_compare_fp_p
de6c5979 8344 && ! flag_unsafe_math_optimizations
a3170dc6 8345 && ! (TARGET_HARD_FLOAT && TARGET_SPE)
39a10a29
GK
8346 && (code == LE || code == GE
8347 || code == UNEQ || code == LTGT
8348 || code == UNGT || code == UNLT))
8349 {
8350 enum rtx_code or1, or2;
8351 rtx or1_rtx, or2_rtx, compare2_rtx;
8352 rtx or_result = gen_reg_rtx (CCEQmode);
8353
8354 switch (code)
8355 {
8356 case LE: or1 = LT; or2 = EQ; break;
8357 case GE: or1 = GT; or2 = EQ; break;
8358 case UNEQ: or1 = UNORDERED; or2 = EQ; break;
8359 case LTGT: or1 = LT; or2 = GT; break;
8360 case UNGT: or1 = UNORDERED; or2 = GT; break;
8361 case UNLT: or1 = UNORDERED; or2 = LT; break;
8362 default: abort ();
8363 }
8364 validate_condition_mode (or1, comp_mode);
8365 validate_condition_mode (or2, comp_mode);
8366 or1_rtx = gen_rtx (or1, SImode, compare_result, const0_rtx);
8367 or2_rtx = gen_rtx (or2, SImode, compare_result, const0_rtx);
8368 compare2_rtx = gen_rtx_COMPARE (CCEQmode,
8369 gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
8370 const_true_rtx);
8371 emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
8372
8373 compare_result = or_result;
8374 code = EQ;
8375 }
8376
8377 validate_condition_mode (code, GET_MODE (compare_result));
8378
8379 return gen_rtx (code, VOIDmode, compare_result, const0_rtx);
8380}
8381
8382
8383/* Emit the RTL for an sCOND pattern. */
8384
8385void
8386rs6000_emit_sCOND (code, result)
8387 enum rtx_code code;
8388 rtx result;
8389{
8390 rtx condition_rtx;
8391 enum machine_mode op_mode;
8392
8393 condition_rtx = rs6000_generate_compare (code);
8394
8395 op_mode = GET_MODE (rs6000_compare_op0);
8396 if (op_mode == VOIDmode)
8397 op_mode = GET_MODE (rs6000_compare_op1);
8398
8399 if (TARGET_POWERPC64 && (op_mode == DImode || rs6000_compare_fp_p))
8400 {
8401 PUT_MODE (condition_rtx, DImode);
8402 convert_move (result, condition_rtx, 0);
8403 }
8404 else
8405 {
8406 PUT_MODE (condition_rtx, SImode);
8407 emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
8408 }
8409}
8410
39a10a29
GK
8411/* Emit a branch of kind CODE to location LOC. */
8412
8413void
8414rs6000_emit_cbranch (code, loc)
8415 enum rtx_code code;
8416 rtx loc;
8417{
8418 rtx condition_rtx, loc_ref;
8419
8420 condition_rtx = rs6000_generate_compare (code);
8421 loc_ref = gen_rtx_LABEL_REF (VOIDmode, loc);
8422 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
8423 gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
8424 loc_ref, pc_rtx)));
8425}
8426
12a4e8c5
GK
8427/* Return the string to output a conditional branch to LABEL, which is
8428 the operand number of the label, or -1 if the branch is really a
8429 conditional return.
8430
8431 OP is the conditional expression. XEXP (OP, 0) is assumed to be a
8432 condition code register and its mode specifies what kind of
8433 comparison we made.
8434
8435 REVERSED is non-zero if we should reverse the sense of the comparison.
8436
8437 INSN is the insn. */
8438
8439char *
8440output_cbranch (op, label, reversed, insn)
8441 rtx op;
8442 const char * label;
8443 int reversed;
8444 rtx insn;
8445{
8446 static char string[64];
8447 enum rtx_code code = GET_CODE (op);
8448 rtx cc_reg = XEXP (op, 0);
8449 enum machine_mode mode = GET_MODE (cc_reg);
8450 int cc_regno = REGNO (cc_reg) - CR0_REGNO;
39a10a29 8451 int need_longbranch = label != NULL && get_attr_length (insn) == 8;
12a4e8c5
GK
8452 int really_reversed = reversed ^ need_longbranch;
8453 char *s = string;
8454 const char *ccode;
8455 const char *pred;
8456 rtx note;
8457
39a10a29
GK
8458 validate_condition_mode (code, mode);
8459
8460 /* Work out which way this really branches. We could use
8461 reverse_condition_maybe_unordered here always but this
8462 makes the resulting assembler clearer. */
12a4e8c5 8463 if (really_reversed)
39a10a29 8464 code = rs6000_reverse_condition (mode, code);
12a4e8c5 8465
a3170dc6
AH
8466 if ((TARGET_SPE && TARGET_HARD_FLOAT) && mode == CCFPmode)
8467 {
8468 /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
8469 to the GT bit. */
8470 if (code == EQ)
8471 /* Opposite of GT. */
8472 code = UNLE;
8473 else if (code == NE)
8474 code = GT;
8475 else
8476 abort ();
8477 }
8478
39a10a29 8479 switch (code)
12a4e8c5
GK
8480 {
8481 /* Not all of these are actually distinct opcodes, but
8482 we distinguish them for clarity of the resulting assembler. */
50a0b056
GK
8483 case NE: case LTGT:
8484 ccode = "ne"; break;
8485 case EQ: case UNEQ:
8486 ccode = "eq"; break;
8487 case GE: case GEU:
8488 ccode = "ge"; break;
8489 case GT: case GTU: case UNGT:
8490 ccode = "gt"; break;
8491 case LE: case LEU:
8492 ccode = "le"; break;
8493 case LT: case LTU: case UNLT:
8494 ccode = "lt"; break;
12a4e8c5
GK
8495 case UNORDERED: ccode = "un"; break;
8496 case ORDERED: ccode = "nu"; break;
8497 case UNGE: ccode = "nl"; break;
8498 case UNLE: ccode = "ng"; break;
8499 default:
a4f6c312 8500 abort ();
12a4e8c5
GK
8501 }
8502
94a54f47
GK
8503 /* Maybe we have a guess as to how likely the branch is.
8504 The old mnemonics don't have a way to specify this information. */
f4857b9b 8505 pred = "";
12a4e8c5
GK
8506 note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
8507 if (note != NULL_RTX)
8508 {
8509 /* PROB is the difference from 50%. */
8510 int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
f4857b9b
AM
8511 bool always_hint = rs6000_cpu != PROCESSOR_POWER4;
8512
8513 /* Only hint for highly probable/improbable branches on newer
8514 cpus as static prediction overrides processor dynamic
8515 prediction. For older cpus we may as well always hint, but
8516 assume not taken for branches that are very close to 50% as a
8517 mispredicted taken branch is more expensive than a
8518 mispredicted not-taken branch. */
8519 if (always_hint
8520 || abs (prob) > REG_BR_PROB_BASE / 100 * 48)
8521 {
8522 if (abs (prob) > REG_BR_PROB_BASE / 20
8523 && ((prob > 0) ^ need_longbranch))
8524 pred = "+";
8525 else
8526 pred = "-";
8527 }
12a4e8c5 8528 }
12a4e8c5
GK
8529
8530 if (label == NULL)
94a54f47 8531 s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
12a4e8c5 8532 else
94a54f47 8533 s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
12a4e8c5 8534
37c67319
GK
8535 /* We need to escape any '%' characters in the reg_names string.
8536 Assume they'd only be the first character... */
8537 if (reg_names[cc_regno + CR0_REGNO][0] == '%')
8538 *s++ = '%';
94a54f47 8539 s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
12a4e8c5
GK
8540
8541 if (label != NULL)
8542 {
8543 /* If the branch distance was too far, we may have to use an
8544 unconditional branch to go the distance. */
8545 if (need_longbranch)
44518ddd 8546 s += sprintf (s, ",$+8\n\tb %s", label);
12a4e8c5
GK
8547 else
8548 s += sprintf (s, ",%s", label);
8549 }
8550
8551 return string;
8552}
50a0b056
GK
8553
8554/* Emit a conditional move: move TRUE_COND to DEST if OP of the
8555 operands of the last comparison is nonzero/true, FALSE_COND if it
8556 is zero/false. Return 0 if the hardware has no such operation. */
a4f6c312 8557
50a0b056
GK
8558int
8559rs6000_emit_cmove (dest, op, true_cond, false_cond)
8560 rtx dest;
8561 rtx op;
8562 rtx true_cond;
8563 rtx false_cond;
8564{
8565 enum rtx_code code = GET_CODE (op);
8566 rtx op0 = rs6000_compare_op0;
8567 rtx op1 = rs6000_compare_op1;
8568 REAL_VALUE_TYPE c1;
3148ad6d
DJ
8569 enum machine_mode compare_mode = GET_MODE (op0);
8570 enum machine_mode result_mode = GET_MODE (dest);
50a0b056
GK
8571 rtx temp;
8572
3148ad6d 8573 /* These modes should always match. */
a3170dc6
AH
8574 if (GET_MODE (op1) != compare_mode
8575 /* In the isel case however, we can use a compare immediate, so
8576 op1 may be a small constant. */
8577 && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
3148ad6d 8578 return 0;
178c3eff 8579 if (GET_MODE (true_cond) != result_mode)
3148ad6d 8580 return 0;
178c3eff 8581 if (GET_MODE (false_cond) != result_mode)
3148ad6d
DJ
8582 return 0;
8583
50a0b056
GK
8584 /* First, work out if the hardware can do this at all, or
8585 if it's too slow... */
50a0b056 8586 if (! rs6000_compare_fp_p)
a3170dc6
AH
8587 {
8588 if (TARGET_ISEL)
8589 return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
8590 return 0;
8591 }
50a0b056
GK
8592
8593 /* Eliminate half of the comparisons by switching operands, this
8594 makes the remaining code simpler. */
8595 if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
8596 || code == LTGT || code == LT)
8597 {
8598 code = reverse_condition_maybe_unordered (code);
8599 temp = true_cond;
8600 true_cond = false_cond;
8601 false_cond = temp;
8602 }
8603
8604 /* UNEQ and LTGT take four instructions for a comparison with zero,
8605 it'll probably be faster to use a branch here too. */
8606 if (code == UNEQ)
8607 return 0;
8608
8609 if (GET_CODE (op1) == CONST_DOUBLE)
8610 REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
8611
8612 /* We're going to try to implement comparions by performing
8613 a subtract, then comparing against zero. Unfortunately,
8614 Inf - Inf is NaN which is not zero, and so if we don't
27d30956 8615 know that the operand is finite and the comparison
50a0b056
GK
8616 would treat EQ different to UNORDERED, we can't do it. */
8617 if (! flag_unsafe_math_optimizations
8618 && code != GT && code != UNGE
8619 && (GET_CODE (op1) != CONST_DOUBLE || target_isinf (c1))
8620 /* Constructs of the form (a OP b ? a : b) are safe. */
8621 && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
8622 || (! rtx_equal_p (op0, true_cond)
8623 && ! rtx_equal_p (op1, true_cond))))
8624 return 0;
8625 /* At this point we know we can use fsel. */
8626
8627 /* Reduce the comparison to a comparison against zero. */
3148ad6d 8628 temp = gen_reg_rtx (compare_mode);
50a0b056 8629 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 8630 gen_rtx_MINUS (compare_mode, op0, op1)));
50a0b056 8631 op0 = temp;
3148ad6d 8632 op1 = CONST0_RTX (compare_mode);
50a0b056
GK
8633
8634 /* If we don't care about NaNs we can reduce some of the comparisons
8635 down to faster ones. */
8636 if (flag_unsafe_math_optimizations)
8637 switch (code)
8638 {
8639 case GT:
8640 code = LE;
8641 temp = true_cond;
8642 true_cond = false_cond;
8643 false_cond = temp;
8644 break;
8645 case UNGE:
8646 code = GE;
8647 break;
8648 case UNEQ:
8649 code = EQ;
8650 break;
8651 default:
8652 break;
8653 }
8654
8655 /* Now, reduce everything down to a GE. */
8656 switch (code)
8657 {
8658 case GE:
8659 break;
8660
8661 case LE:
3148ad6d
DJ
8662 temp = gen_reg_rtx (compare_mode);
8663 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
8664 op0 = temp;
8665 break;
8666
8667 case ORDERED:
3148ad6d
DJ
8668 temp = gen_reg_rtx (compare_mode);
8669 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
50a0b056
GK
8670 op0 = temp;
8671 break;
8672
8673 case EQ:
3148ad6d 8674 temp = gen_reg_rtx (compare_mode);
50a0b056 8675 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d
DJ
8676 gen_rtx_NEG (compare_mode,
8677 gen_rtx_ABS (compare_mode, op0))));
50a0b056
GK
8678 op0 = temp;
8679 break;
8680
8681 case UNGE:
3148ad6d 8682 temp = gen_reg_rtx (result_mode);
50a0b056 8683 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 8684 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
8685 gen_rtx_GE (VOIDmode,
8686 op0, op1),
8687 true_cond, false_cond)));
8688 false_cond = temp;
8689 true_cond = false_cond;
8690
3148ad6d
DJ
8691 temp = gen_reg_rtx (compare_mode);
8692 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
8693 op0 = temp;
8694 break;
8695
8696 case GT:
3148ad6d 8697 temp = gen_reg_rtx (result_mode);
50a0b056 8698 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 8699 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
8700 gen_rtx_GE (VOIDmode,
8701 op0, op1),
8702 true_cond, false_cond)));
8703 true_cond = temp;
8704 false_cond = true_cond;
8705
3148ad6d
DJ
8706 temp = gen_reg_rtx (compare_mode);
8707 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
8708 op0 = temp;
8709 break;
8710
8711 default:
8712 abort ();
8713 }
8714
8715 emit_insn (gen_rtx_SET (VOIDmode, dest,
3148ad6d 8716 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
8717 gen_rtx_GE (VOIDmode,
8718 op0, op1),
8719 true_cond, false_cond)));
8720 return 1;
8721}
8722
a3170dc6
AH
8723/* Same as above, but for ints (isel). */
8724
8725static int
8726rs6000_emit_int_cmove (dest, op, true_cond, false_cond)
8727 rtx dest;
8728 rtx op;
8729 rtx true_cond;
8730 rtx false_cond;
8731{
8732 rtx condition_rtx, cr;
8733
8734 /* All isel implementations thus far are 32-bits. */
8735 if (GET_MODE (rs6000_compare_op0) != SImode)
8736 return 0;
8737
8738 /* We still have to do the compare, because isel doesn't do a
8739 compare, it just looks at the CRx bits set by a previous compare
8740 instruction. */
8741 condition_rtx = rs6000_generate_compare (GET_CODE (op));
8742 cr = XEXP (condition_rtx, 0);
8743
8744 if (GET_MODE (cr) == CCmode)
8745 emit_insn (gen_isel_signed (dest, condition_rtx,
8746 true_cond, false_cond, cr));
8747 else
8748 emit_insn (gen_isel_unsigned (dest, condition_rtx,
8749 true_cond, false_cond, cr));
8750
8751 return 1;
8752}
8753
8754const char *
8755output_isel (operands)
8756 rtx *operands;
8757{
8758 enum rtx_code code;
8759
8760 code = GET_CODE (operands[1]);
8761 if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
8762 {
8763 PUT_CODE (operands[1], reverse_condition (code));
8764 return "isel %0,%3,%2,%j1";
8765 }
8766 else
8767 return "isel %0,%2,%3,%j1";
8768}
8769
50a0b056
GK
8770void
8771rs6000_emit_minmax (dest, code, op0, op1)
8772 rtx dest;
8773 enum rtx_code code;
8774 rtx op0;
8775 rtx op1;
8776{
8777 enum machine_mode mode = GET_MODE (op0);
5dc8d536 8778 enum rtx_code c;
50a0b056 8779 rtx target;
5dc8d536
AH
8780
8781 if (code == SMAX || code == SMIN)
8782 c = GE;
8783 else
8784 c = GEU;
8785
50a0b056 8786 if (code == SMAX || code == UMAX)
5dc8d536 8787 target = emit_conditional_move (dest, c, op0, op1, mode,
50a0b056
GK
8788 op0, op1, mode, 0);
8789 else
5dc8d536 8790 target = emit_conditional_move (dest, c, op0, op1, mode,
50a0b056
GK
8791 op1, op0, mode, 0);
8792 if (target == NULL_RTX)
8793 abort ();
8794 if (target != dest)
8795 emit_move_insn (dest, target);
8796}
12a4e8c5 8797\f
a4f6c312
SS
8798/* This page contains routines that are used to determine what the
8799 function prologue and epilogue code will do and write them out. */
9878760c 8800
a4f6c312
SS
8801/* Return the first fixed-point register that is required to be
8802 saved. 32 if none. */
9878760c
RK
8803
8804int
8805first_reg_to_save ()
8806{
8807 int first_reg;
8808
8809 /* Find lowest numbered live register. */
8810 for (first_reg = 13; first_reg <= 31; first_reg++)
a38d360d
GK
8811 if (regs_ever_live[first_reg]
8812 && (! call_used_regs[first_reg]
1db02437 8813 || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
f607bc57
ZW
8814 && ((DEFAULT_ABI == ABI_V4 && flag_pic == 1)
8815 || (DEFAULT_ABI == ABI_DARWIN && flag_pic)))))
9878760c
RK
8816 break;
8817
ee890fe2 8818#if TARGET_MACHO
93638d7a
AM
8819 if (flag_pic
8820 && current_function_uses_pic_offset_table
8821 && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
1db02437 8822 return RS6000_PIC_OFFSET_TABLE_REGNUM;
ee890fe2
SS
8823#endif
8824
9878760c
RK
8825 return first_reg;
8826}
8827
8828/* Similar, for FP regs. */
8829
8830int
8831first_fp_reg_to_save ()
8832{
8833 int first_reg;
8834
8835 /* Find lowest numbered live register. */
8836 for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
8837 if (regs_ever_live[first_reg])
8838 break;
8839
8840 return first_reg;
8841}
00b960c7
AH
8842
8843/* Similar, for AltiVec regs. */
8844
8845static int
8846first_altivec_reg_to_save ()
8847{
8848 int i;
8849
8850 /* Stack frame remains as is unless we are in AltiVec ABI. */
8851 if (! TARGET_ALTIVEC_ABI)
8852 return LAST_ALTIVEC_REGNO + 1;
8853
8854 /* Find lowest numbered live register. */
8855 for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
8856 if (regs_ever_live[i])
8857 break;
8858
8859 return i;
8860}
8861
8862/* Return a 32-bit mask of the AltiVec registers we need to set in
8863 VRSAVE. Bit n of the return value is 1 if Vn is live. The MSB in
8864 the 32-bit word is 0. */
8865
8866static unsigned int
8867compute_vrsave_mask ()
8868{
8869 unsigned int i, mask = 0;
8870
8871 /* First, find out if we use _any_ altivec registers. */
8872 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
8873 if (regs_ever_live[i])
8874 mask |= ALTIVEC_REG_BIT (i);
8875
8876 if (mask == 0)
8877 return mask;
8878
8879 /* Next, add all registers that are call-clobbered. We do this
8880 because post-reload register optimizers such as regrename_optimize
8881 may choose to use them. They never change the register class
8882 chosen by reload, so cannot create new uses of altivec registers
8883 if there were none before, so the early exit above is safe. */
8884 /* ??? Alternately, we could define HARD_REGNO_RENAME_OK to disallow
8885 altivec registers not saved in the mask, which might well make the
8886 adjustments below more effective in eliding the save/restore of
8887 VRSAVE in small functions. */
8888 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
8889 if (call_used_regs[i])
8890 mask |= ALTIVEC_REG_BIT (i);
8891
8892 /* Next, remove the argument registers from the set. These must
8893 be in the VRSAVE mask set by the caller, so we don't need to add
8894 them in again. More importantly, the mask we compute here is
8895 used to generate CLOBBERs in the set_vrsave insn, and we do not
8896 wish the argument registers to die. */
8897 for (i = cfun->args_info.vregno; i >= ALTIVEC_ARG_MIN_REG; --i)
8898 mask &= ~ALTIVEC_REG_BIT (i);
8899
8900 /* Similarly, remove the return value from the set. */
8901 {
8902 bool yes = false;
8903 diddle_return_value (is_altivec_return_reg, &yes);
8904 if (yes)
8905 mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
8906 }
8907
8908 return mask;
8909}
8910
8911static void
8912is_altivec_return_reg (reg, xyes)
8913 rtx reg;
8914 void *xyes;
8915{
8916 bool *yes = (bool *) xyes;
8917 if (REGNO (reg) == ALTIVEC_ARG_RETURN)
8918 *yes = true;
8919}
8920
4697a36c
MM
8921\f
8922/* Calculate the stack information for the current function. This is
8923 complicated by having two separate calling sequences, the AIX calling
8924 sequence and the V.4 calling sequence.
8925
592696dd 8926 AIX (and Darwin/Mac OS X) stack frames look like:
a260abc9 8927 32-bit 64-bit
4697a36c 8928 SP----> +---------------------------------------+
a260abc9 8929 | back chain to caller | 0 0
4697a36c 8930 +---------------------------------------+
a260abc9 8931 | saved CR | 4 8 (8-11)
4697a36c 8932 +---------------------------------------+
a260abc9 8933 | saved LR | 8 16
4697a36c 8934 +---------------------------------------+
a260abc9 8935 | reserved for compilers | 12 24
4697a36c 8936 +---------------------------------------+
a260abc9 8937 | reserved for binders | 16 32
4697a36c 8938 +---------------------------------------+
a260abc9 8939 | saved TOC pointer | 20 40
4697a36c 8940 +---------------------------------------+
a260abc9 8941 | Parameter save area (P) | 24 48
4697a36c 8942 +---------------------------------------+
a260abc9 8943 | Alloca space (A) | 24+P etc.
802a0058 8944 +---------------------------------------+
a7df97e6 8945 | Local variable space (L) | 24+P+A
4697a36c 8946 +---------------------------------------+
a7df97e6 8947 | Float/int conversion temporary (X) | 24+P+A+L
4697a36c 8948 +---------------------------------------+
00b960c7
AH
8949 | Save area for AltiVec registers (W) | 24+P+A+L+X
8950 +---------------------------------------+
8951 | AltiVec alignment padding (Y) | 24+P+A+L+X+W
8952 +---------------------------------------+
8953 | Save area for VRSAVE register (Z) | 24+P+A+L+X+W+Y
4697a36c 8954 +---------------------------------------+
00b960c7
AH
8955 | Save area for GP registers (G) | 24+P+A+X+L+X+W+Y+Z
8956 +---------------------------------------+
8957 | Save area for FP registers (F) | 24+P+A+X+L+X+W+Y+Z+G
4697a36c
MM
8958 +---------------------------------------+
8959 old SP->| back chain to caller's caller |
8960 +---------------------------------------+
8961
5376a30c
KR
8962 The required alignment for AIX configurations is two words (i.e., 8
8963 or 16 bytes).
8964
8965
4697a36c
MM
8966 V.4 stack frames look like:
8967
8968 SP----> +---------------------------------------+
8969 | back chain to caller | 0
8970 +---------------------------------------+
5eb387b8 8971 | caller's saved LR | 4
4697a36c
MM
8972 +---------------------------------------+
8973 | Parameter save area (P) | 8
8974 +---------------------------------------+
a7df97e6
MM
8975 | Alloca space (A) | 8+P
8976 +---------------------------------------+
8977 | Varargs save area (V) | 8+P+A
8978 +---------------------------------------+
8979 | Local variable space (L) | 8+P+A+V
8980 +---------------------------------------+
8981 | Float/int conversion temporary (X) | 8+P+A+V+L
4697a36c 8982 +---------------------------------------+
00b960c7
AH
8983 | Save area for AltiVec registers (W) | 8+P+A+V+L+X
8984 +---------------------------------------+
8985 | AltiVec alignment padding (Y) | 8+P+A+V+L+X+W
8986 +---------------------------------------+
8987 | Save area for VRSAVE register (Z) | 8+P+A+V+L+X+W+Y
8988 +---------------------------------------+
a3170dc6
AH
8989 | SPE: area for 64-bit GP registers |
8990 +---------------------------------------+
8991 | SPE alignment padding |
8992 +---------------------------------------+
00b960c7 8993 | saved CR (C) | 8+P+A+V+L+X+W+Y+Z
a7df97e6 8994 +---------------------------------------+
00b960c7 8995 | Save area for GP registers (G) | 8+P+A+V+L+X+W+Y+Z+C
a7df97e6 8996 +---------------------------------------+
00b960c7 8997 | Save area for FP registers (F) | 8+P+A+V+L+X+W+Y+Z+C+G
4697a36c
MM
8998 +---------------------------------------+
8999 old SP->| back chain to caller's caller |
9000 +---------------------------------------+
b6c9286a 9001
5376a30c
KR
9002 The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
9003 given. (But note below and in sysv4.h that we require only 8 and
9004 may round up the size of our stack frame anyways. The historical
9005 reason is early versions of powerpc-linux which didn't properly
9006 align the stack at program startup. A happy side-effect is that
9007 -mno-eabi libraries can be used with -meabi programs.)
9008
5376a30c
KR
9009 The EABI configuration defaults to the V.4 layout, unless
9010 -mcall-aix is used, in which case the AIX layout is used. However,
9011 the stack alignment requirements may differ. If -mno-eabi is not
9012 given, the required stack alignment is 8 bytes; if -mno-eabi is
9013 given, the required alignment is 16 bytes. (But see V.4 comment
9014 above.) */
4697a36c 9015
61b2fbe7
MM
9016#ifndef ABI_STACK_BOUNDARY
9017#define ABI_STACK_BOUNDARY STACK_BOUNDARY
9018#endif
9019
4697a36c
MM
9020rs6000_stack_t *
9021rs6000_stack_info ()
9022{
9023 static rs6000_stack_t info, zero_info;
9024 rs6000_stack_t *info_ptr = &info;
9ebbca7d 9025 int reg_size = TARGET_POWERPC64 ? 8 : 4;
24d304eb 9026 enum rs6000_abi abi;
83720594 9027 int ehrd_size;
b6c9286a 9028 int total_raw_size;
4697a36c 9029
a4f6c312 9030 /* Zero all fields portably. */
4697a36c
MM
9031 info = zero_info;
9032
a4f6c312 9033 /* Select which calling sequence. */
b6c9286a 9034 info_ptr->abi = abi = DEFAULT_ABI;
9878760c 9035
a4f6c312 9036 /* Calculate which registers need to be saved & save area size. */
4697a36c 9037 info_ptr->first_gp_reg_save = first_reg_to_save ();
1db02437 9038 /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
906fb125 9039 even if it currently looks like we won't. */
2bfcf297 9040 if (((TARGET_TOC && TARGET_MINIMAL_TOC)
f607bc57
ZW
9041 || (flag_pic == 1 && abi == ABI_V4)
9042 || (flag_pic && abi == ABI_DARWIN))
1db02437
FS
9043 && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
9044 info_ptr->gp_size = reg_size * (32 - RS6000_PIC_OFFSET_TABLE_REGNUM);
906fb125
GK
9045 else
9046 info_ptr->gp_size = reg_size * (32 - info_ptr->first_gp_reg_save);
4697a36c 9047
a3170dc6
AH
9048 /* For the SPE, we have an additional upper 32-bits on each GPR.
9049 Ideally we should save the entire 64-bits only when the upper
9050 half is used in SIMD instructions. Since we only record
9051 registers live (not the size they are used in), this proves
9052 difficult because we'd have to traverse the instruction chain at
9053 the right time, taking reload into account. This is a real pain,
9054 so we opt to save the GPRs in 64-bits always. Anyone overly
9055 concerned with frame size can fix this. ;-).
9056
9057 So... since we save all GPRs (except the SP) in 64-bits, the
9058 traditional GP save area will be empty. */
9059 if (TARGET_SPE_ABI)
9060 info_ptr->gp_size = 0;
9061
4697a36c
MM
9062 info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
9063 info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
9064
00b960c7
AH
9065 info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
9066 info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
9067 - info_ptr->first_altivec_reg_save);
9068
592696dd 9069 /* Does this function call anything? */
71f123ca
FS
9070 info_ptr->calls_p = (! current_function_is_leaf
9071 || cfun->machine->ra_needs_full_frame);
b6c9286a 9072
a4f6c312 9073 /* Determine if we need to save the link register. */
71f123ca 9074 if (rs6000_ra_ever_killed ()
70f4f91c 9075 || (DEFAULT_ABI == ABI_AIX && current_function_profile)
4697a36c
MM
9076#ifdef TARGET_RELOCATABLE
9077 || (TARGET_RELOCATABLE && (get_pool_size () != 0))
9078#endif
9079 || (info_ptr->first_fp_reg_save != 64
9080 && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save))
00b960c7 9081 || info_ptr->first_altivec_reg_save <= LAST_ALTIVEC_REGNO
24d304eb 9082 || (abi == ABI_V4 && current_function_calls_alloca)
a4f6c312
SS
9083 || (DEFAULT_ABI == ABI_DARWIN
9084 && flag_pic
9085 && current_function_uses_pic_offset_table)
4697a36c
MM
9086 || info_ptr->calls_p)
9087 {
9088 info_ptr->lr_save_p = 1;
9ebbca7d 9089 regs_ever_live[LINK_REGISTER_REGNUM] = 1;
4697a36c
MM
9090 }
9091
9ebbca7d
GK
9092 /* Determine if we need to save the condition code registers. */
9093 if (regs_ever_live[CR2_REGNO]
9094 || regs_ever_live[CR3_REGNO]
9095 || regs_ever_live[CR4_REGNO])
4697a36c
MM
9096 {
9097 info_ptr->cr_save_p = 1;
f607bc57 9098 if (abi == ABI_V4)
4697a36c
MM
9099 info_ptr->cr_size = reg_size;
9100 }
9101
83720594
RH
9102 /* If the current function calls __builtin_eh_return, then we need
9103 to allocate stack space for registers that will hold data for
9104 the exception handler. */
9105 if (current_function_calls_eh_return)
9106 {
9107 unsigned int i;
9108 for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
9109 continue;
a3170dc6
AH
9110
9111 /* SPE saves EH registers in 64-bits. */
9112 ehrd_size = i * (TARGET_SPE_ABI ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
83720594
RH
9113 }
9114 else
9115 ehrd_size = 0;
9116
592696dd 9117 /* Determine various sizes. */
4697a36c
MM
9118 info_ptr->reg_size = reg_size;
9119 info_ptr->fixed_size = RS6000_SAVE_AREA;
9120 info_ptr->varargs_size = RS6000_VARARGS_AREA;
189e03e3 9121 info_ptr->vars_size = RS6000_ALIGN (get_frame_size (), 8);
a4f6c312
SS
9122 info_ptr->parm_size = RS6000_ALIGN (current_function_outgoing_args_size,
9123 8);
00b960c7 9124
a3170dc6
AH
9125 if (TARGET_SPE_ABI)
9126 info_ptr->spe_gp_size = 8 * (32 - info_ptr->first_gp_reg_save);
9127 else
9128 info_ptr->spe_gp_size = 0;
9129
08b57fb3 9130 if (TARGET_ALTIVEC_ABI && TARGET_ALTIVEC_VRSAVE)
00b960c7
AH
9131 {
9132 info_ptr->vrsave_mask = compute_vrsave_mask ();
9133 info_ptr->vrsave_size = info_ptr->vrsave_mask ? 4 : 0;
9134 }
9135 else
9136 {
9137 info_ptr->vrsave_mask = 0;
9138 info_ptr->vrsave_size = 0;
9139 }
b6c9286a 9140
592696dd 9141 /* Calculate the offsets. */
24d304eb 9142 switch (abi)
4697a36c 9143 {
b6c9286a 9144 case ABI_NONE:
24d304eb 9145 default:
b6c9286a
MM
9146 abort ();
9147
9148 case ABI_AIX:
9149 case ABI_AIX_NODESC:
ee890fe2 9150 case ABI_DARWIN:
b6c9286a
MM
9151 info_ptr->fp_save_offset = - info_ptr->fp_size;
9152 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
00b960c7
AH
9153
9154 if (TARGET_ALTIVEC_ABI)
9155 {
9156 info_ptr->vrsave_save_offset
9157 = info_ptr->gp_save_offset - info_ptr->vrsave_size;
9158
9159 /* Align stack so vector save area is on a quadword boundary. */
9160 if (info_ptr->altivec_size != 0)
9161 info_ptr->altivec_padding_size
9162 = 16 - (-info_ptr->vrsave_save_offset % 16);
9163 else
9164 info_ptr->altivec_padding_size = 0;
9165
9166 info_ptr->altivec_save_offset
9167 = info_ptr->vrsave_save_offset
9168 - info_ptr->altivec_padding_size
9169 - info_ptr->altivec_size;
9170
9171 /* Adjust for AltiVec case. */
9172 info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
9173 }
9174 else
9175 info_ptr->ehrd_offset = info_ptr->gp_save_offset - ehrd_size;
a260abc9
DE
9176 info_ptr->cr_save_offset = reg_size; /* first word when 64-bit. */
9177 info_ptr->lr_save_offset = 2*reg_size;
24d304eb
RK
9178 break;
9179
9180 case ABI_V4:
b6c9286a
MM
9181 info_ptr->fp_save_offset = - info_ptr->fp_size;
9182 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
a7df97e6 9183 info_ptr->cr_save_offset = info_ptr->gp_save_offset - info_ptr->cr_size;
00b960c7 9184
a3170dc6
AH
9185 if (TARGET_SPE_ABI)
9186 {
9187 /* Align stack so SPE GPR save area is aligned on a
9188 double-word boundary. */
9189 if (info_ptr->spe_gp_size != 0)
9190 info_ptr->spe_padding_size
9191 = 8 - (-info_ptr->cr_save_offset % 8);
9192 else
9193 info_ptr->spe_padding_size = 0;
9194
9195 info_ptr->spe_gp_save_offset
9196 = info_ptr->cr_save_offset
9197 - info_ptr->spe_padding_size
9198 - info_ptr->spe_gp_size;
9199
9200 /* Adjust for SPE case. */
9201 info_ptr->toc_save_offset
9202 = info_ptr->spe_gp_save_offset - info_ptr->toc_size;
9203 }
9204 else if (TARGET_ALTIVEC_ABI)
00b960c7
AH
9205 {
9206 info_ptr->vrsave_save_offset
9207 = info_ptr->cr_save_offset - info_ptr->vrsave_size;
9208
9209 /* Align stack so vector save area is on a quadword boundary. */
9210 if (info_ptr->altivec_size != 0)
9211 info_ptr->altivec_padding_size
9212 = 16 - (-info_ptr->vrsave_save_offset % 16);
9213 else
9214 info_ptr->altivec_padding_size = 0;
9215
9216 info_ptr->altivec_save_offset
9217 = info_ptr->vrsave_save_offset
9218 - info_ptr->altivec_padding_size
9219 - info_ptr->altivec_size;
9220
9221 /* Adjust for AltiVec case. */
9222 info_ptr->toc_save_offset
9223 = info_ptr->altivec_save_offset - info_ptr->toc_size;
9224 }
9225 else
9226 info_ptr->toc_save_offset = info_ptr->cr_save_offset - info_ptr->toc_size;
83720594 9227 info_ptr->ehrd_offset = info_ptr->toc_save_offset - ehrd_size;
b6c9286a
MM
9228 info_ptr->lr_save_offset = reg_size;
9229 break;
4697a36c
MM
9230 }
9231
00b960c7
AH
9232 info_ptr->save_size = RS6000_ALIGN (info_ptr->fp_size
9233 + info_ptr->gp_size
9234 + info_ptr->altivec_size
9235 + info_ptr->altivec_padding_size
9236 + info_ptr->vrsave_size
a3170dc6
AH
9237 + info_ptr->spe_gp_size
9238 + info_ptr->spe_padding_size
00b960c7
AH
9239 + ehrd_size
9240 + info_ptr->cr_size
9241 + info_ptr->lr_size
9242 + info_ptr->vrsave_size
9243 + info_ptr->toc_size,
9244 (TARGET_ALTIVEC_ABI || ABI_DARWIN)
9245 ? 16 : 8);
9246
ff381587
MM
9247 total_raw_size = (info_ptr->vars_size
9248 + info_ptr->parm_size
ff381587
MM
9249 + info_ptr->save_size
9250 + info_ptr->varargs_size
9251 + info_ptr->fixed_size);
9252
a4f6c312
SS
9253 info_ptr->total_size =
9254 RS6000_ALIGN (total_raw_size, ABI_STACK_BOUNDARY / BITS_PER_UNIT);
ff381587
MM
9255
9256 /* Determine if we need to allocate any stack frame:
9257
a4f6c312
SS
9258 For AIX we need to push the stack if a frame pointer is needed
9259 (because the stack might be dynamically adjusted), if we are
9260 debugging, if we make calls, or if the sum of fp_save, gp_save,
9261 and local variables are more than the space needed to save all
9262 non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
9263 + 18*8 = 288 (GPR13 reserved).
ff381587 9264
a4f6c312
SS
9265 For V.4 we don't have the stack cushion that AIX uses, but assume
9266 that the debugger can handle stackless frames. */
ff381587
MM
9267
9268 if (info_ptr->calls_p)
9269 info_ptr->push_p = 1;
9270
f607bc57 9271 else if (abi == ABI_V4)
e72247f4 9272 info_ptr->push_p = total_raw_size > info_ptr->fixed_size;
ff381587
MM
9273
9274 else
9275 info_ptr->push_p = (frame_pointer_needed
ee890fe2 9276 || (abi != ABI_DARWIN && write_symbols != NO_DEBUG)
ff381587 9277 || ((total_raw_size - info_ptr->fixed_size)
bfc79d3b 9278 > (TARGET_32BIT ? 220 : 288)));
ff381587 9279
a4f6c312 9280 /* Zero offsets if we're not saving those registers. */
8dda1a21 9281 if (info_ptr->fp_size == 0)
4697a36c
MM
9282 info_ptr->fp_save_offset = 0;
9283
8dda1a21 9284 if (info_ptr->gp_size == 0)
4697a36c
MM
9285 info_ptr->gp_save_offset = 0;
9286
00b960c7
AH
9287 if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
9288 info_ptr->altivec_save_offset = 0;
9289
9290 if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
9291 info_ptr->vrsave_save_offset = 0;
9292
a3170dc6
AH
9293 if (! TARGET_SPE_ABI || info_ptr->spe_gp_size == 0)
9294 info_ptr->spe_gp_save_offset = 0;
9295
c81fc13e 9296 if (! info_ptr->lr_save_p)
4697a36c
MM
9297 info_ptr->lr_save_offset = 0;
9298
c81fc13e 9299 if (! info_ptr->cr_save_p)
4697a36c
MM
9300 info_ptr->cr_save_offset = 0;
9301
c81fc13e 9302 if (! info_ptr->toc_save_p)
b6c9286a
MM
9303 info_ptr->toc_save_offset = 0;
9304
4697a36c
MM
9305 return info_ptr;
9306}
9307
9308void
9309debug_stack_info (info)
9310 rs6000_stack_t *info;
9878760c 9311{
d330fd93 9312 const char *abi_string;
24d304eb 9313
c81fc13e 9314 if (! info)
4697a36c
MM
9315 info = rs6000_stack_info ();
9316
9317 fprintf (stderr, "\nStack information for function %s:\n",
9318 ((current_function_decl && DECL_NAME (current_function_decl))
9319 ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
9320 : "<unknown>"));
9321
24d304eb
RK
9322 switch (info->abi)
9323 {
b6c9286a
MM
9324 default: abi_string = "Unknown"; break;
9325 case ABI_NONE: abi_string = "NONE"; break;
f607bc57 9326 case ABI_AIX:
b6c9286a 9327 case ABI_AIX_NODESC: abi_string = "AIX"; break;
ee890fe2 9328 case ABI_DARWIN: abi_string = "Darwin"; break;
b6c9286a 9329 case ABI_V4: abi_string = "V.4"; break;
24d304eb
RK
9330 }
9331
9332 fprintf (stderr, "\tABI = %5s\n", abi_string);
9333
00b960c7
AH
9334 if (TARGET_ALTIVEC_ABI)
9335 fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
9336
a3170dc6
AH
9337 if (TARGET_SPE_ABI)
9338 fprintf (stderr, "\tSPE ABI extensions enabled.\n");
9339
4697a36c
MM
9340 if (info->first_gp_reg_save != 32)
9341 fprintf (stderr, "\tfirst_gp_reg_save = %5d\n", info->first_gp_reg_save);
9342
9343 if (info->first_fp_reg_save != 64)
9344 fprintf (stderr, "\tfirst_fp_reg_save = %5d\n", info->first_fp_reg_save);
9878760c 9345
00b960c7
AH
9346 if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
9347 fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
9348 info->first_altivec_reg_save);
9349
4697a36c
MM
9350 if (info->lr_save_p)
9351 fprintf (stderr, "\tlr_save_p = %5d\n", info->lr_save_p);
9878760c 9352
4697a36c
MM
9353 if (info->cr_save_p)
9354 fprintf (stderr, "\tcr_save_p = %5d\n", info->cr_save_p);
9355
b6c9286a
MM
9356 if (info->toc_save_p)
9357 fprintf (stderr, "\ttoc_save_p = %5d\n", info->toc_save_p);
9358
00b960c7
AH
9359 if (info->vrsave_mask)
9360 fprintf (stderr, "\tvrsave_mask = 0x%x\n", info->vrsave_mask);
9361
4697a36c
MM
9362 if (info->push_p)
9363 fprintf (stderr, "\tpush_p = %5d\n", info->push_p);
9364
9365 if (info->calls_p)
9366 fprintf (stderr, "\tcalls_p = %5d\n", info->calls_p);
9367
4697a36c
MM
9368 if (info->gp_save_offset)
9369 fprintf (stderr, "\tgp_save_offset = %5d\n", info->gp_save_offset);
9370
9371 if (info->fp_save_offset)
9372 fprintf (stderr, "\tfp_save_offset = %5d\n", info->fp_save_offset);
9373
00b960c7
AH
9374 if (info->altivec_save_offset)
9375 fprintf (stderr, "\taltivec_save_offset = %5d\n",
9376 info->altivec_save_offset);
9377
a3170dc6
AH
9378 if (info->spe_gp_save_offset)
9379 fprintf (stderr, "\tspe_gp_save_offset = %5d\n",
9380 info->spe_gp_save_offset);
9381
00b960c7
AH
9382 if (info->vrsave_save_offset)
9383 fprintf (stderr, "\tvrsave_save_offset = %5d\n",
9384 info->vrsave_save_offset);
9385
4697a36c
MM
9386 if (info->lr_save_offset)
9387 fprintf (stderr, "\tlr_save_offset = %5d\n", info->lr_save_offset);
9388
9389 if (info->cr_save_offset)
9390 fprintf (stderr, "\tcr_save_offset = %5d\n", info->cr_save_offset);
9391
b6c9286a
MM
9392 if (info->toc_save_offset)
9393 fprintf (stderr, "\ttoc_save_offset = %5d\n", info->toc_save_offset);
9394
4697a36c
MM
9395 if (info->varargs_save_offset)
9396 fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
9397
9398 if (info->total_size)
9399 fprintf (stderr, "\ttotal_size = %5d\n", info->total_size);
9400
9401 if (info->varargs_size)
9402 fprintf (stderr, "\tvarargs_size = %5d\n", info->varargs_size);
9403
9404 if (info->vars_size)
9405 fprintf (stderr, "\tvars_size = %5d\n", info->vars_size);
9406
9407 if (info->parm_size)
9408 fprintf (stderr, "\tparm_size = %5d\n", info->parm_size);
9409
9410 if (info->fixed_size)
9411 fprintf (stderr, "\tfixed_size = %5d\n", info->fixed_size);
9412
9413 if (info->gp_size)
9414 fprintf (stderr, "\tgp_size = %5d\n", info->gp_size);
9415
a3170dc6
AH
9416 if (info->spe_gp_size)
9417 fprintf (stderr, "\tspe_gp_size = %5d\n", info->spe_gp_size);
9418
4697a36c
MM
9419 if (info->fp_size)
9420 fprintf (stderr, "\tfp_size = %5d\n", info->fp_size);
9421
00b960c7
AH
9422 if (info->altivec_size)
9423 fprintf (stderr, "\taltivec_size = %5d\n", info->altivec_size);
9424
9425 if (info->vrsave_size)
9426 fprintf (stderr, "\tvrsave_size = %5d\n", info->vrsave_size);
9427
9428 if (info->altivec_padding_size)
9429 fprintf (stderr, "\taltivec_padding_size= %5d\n",
9430 info->altivec_padding_size);
9431
a3170dc6
AH
9432 if (info->spe_padding_size)
9433 fprintf (stderr, "\tspe_padding_size = %5d\n",
9434 info->spe_padding_size);
9435
a4f6c312 9436 if (info->lr_size)
ed947a96 9437 fprintf (stderr, "\tlr_size = %5d\n", info->lr_size);
b6c9286a 9438
4697a36c
MM
9439 if (info->cr_size)
9440 fprintf (stderr, "\tcr_size = %5d\n", info->cr_size);
9441
a4f6c312 9442 if (info->toc_size)
b6c9286a
MM
9443 fprintf (stderr, "\ttoc_size = %5d\n", info->toc_size);
9444
4697a36c
MM
9445 if (info->save_size)
9446 fprintf (stderr, "\tsave_size = %5d\n", info->save_size);
9447
9448 if (info->reg_size != 4)
9449 fprintf (stderr, "\treg_size = %5d\n", info->reg_size);
9450
9451 fprintf (stderr, "\n");
9878760c 9452}
71f123ca
FS
9453
9454rtx
9455rs6000_return_addr (count, frame)
9456 int count;
9457 rtx frame;
9458{
a4f6c312
SS
9459 /* Currently we don't optimize very well between prolog and body
9460 code and for PIC code the code can be actually quite bad, so
9461 don't try to be too clever here. */
f585a356 9462 if (count != 0 || flag_pic != 0)
71f123ca
FS
9463 {
9464 cfun->machine->ra_needs_full_frame = 1;
8ac61af7
RK
9465
9466 return
9467 gen_rtx_MEM
9468 (Pmode,
9469 memory_address
9470 (Pmode,
9471 plus_constant (copy_to_reg
9472 (gen_rtx_MEM (Pmode,
9473 memory_address (Pmode, frame))),
9474 RETURN_ADDRESS_OFFSET)));
71f123ca
FS
9475 }
9476
9e2f7ec7 9477 return get_hard_reg_initial_val (Pmode, LINK_REGISTER_REGNUM);
71f123ca
FS
9478}
9479
5e1bf043
DJ
9480/* Say whether a function is a candidate for sibcall handling or not.
9481 We do not allow indirect calls to be optimized into sibling calls.
9482 Also, we can't do it if there are any vector parameters; there's
9483 nowhere to put the VRsave code so it works; note that functions with
9484 vector parameters are required to have a prototype, so the argument
9485 type info must be available here. (The tail recursion case can work
9486 with vector parameters, but there's no way to distinguish here.) */
9487int
9488function_ok_for_sibcall (fndecl)
9489 tree fndecl;
9490{
9491 tree type;
9492 if (fndecl)
9493 {
9494 if (TARGET_ALTIVEC_VRSAVE)
9495 {
9496 for (type = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
9497 type; type = TREE_CHAIN (type))
9498 {
c15b529f 9499 if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
5e1bf043
DJ
9500 return 0;
9501 }
9502 }
9503 if (DEFAULT_ABI == ABI_DARWIN
2bcc50d0
AM
9504 || (*targetm.binds_local_p) (fndecl))
9505 {
9506 tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (fndecl));
9507
9508 if (!lookup_attribute ("longcall", attr_list)
9509 || lookup_attribute ("shortcall", attr_list))
9510 return 1;
9511 }
5e1bf043
DJ
9512 }
9513 return 0;
9514}
9515
9516/* function rewritten to handle sibcalls */
71f123ca
FS
9517static int
9518rs6000_ra_ever_killed ()
9519{
9520 rtx top;
5e1bf043
DJ
9521 rtx reg;
9522 rtx insn;
71f123ca
FS
9523
9524#ifdef ASM_OUTPUT_MI_THUNK
9525 if (current_function_is_thunk)
9526 return 0;
9527#endif
5e1bf043
DJ
9528 /* regs_ever_live has LR marked as used if any sibcalls
9529 are present. Which it is, but this should not force
9530 saving and restoring in the prologue/epilog. Likewise,
9531 reg_set_between_p thinks a sibcall clobbers LR, so
9532 that is inappropriate. */
9533 /* Also, the prologue can generate a store into LR that
9534 doesn't really count, like this:
9535 move LR->R0
9536 bcl to set PIC register
9537 move LR->R31
9538 move R0->LR
9539 When we're called from the epilog, we need to avoid counting
9540 this as a store; thus we ignore any insns with a REG_MAYBE_DEAD note. */
9541
71f123ca
FS
9542 push_topmost_sequence ();
9543 top = get_insns ();
9544 pop_topmost_sequence ();
5e1bf043 9545 reg = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
71f123ca 9546
5e1bf043
DJ
9547 for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
9548 {
9549 if (INSN_P (insn))
9550 {
9551 if (FIND_REG_INC_NOTE (insn, reg))
9552 return 1;
9553 else if (GET_CODE (insn) == CALL_INSN
c15b529f 9554 && !SIBLING_CALL_P (insn))
5e1bf043
DJ
9555 return 1;
9556 else if (set_of (reg, insn) != NULL_RTX
c15b529f 9557 && find_reg_note (insn, REG_MAYBE_DEAD, NULL_RTX) == 0)
5e1bf043
DJ
9558 return 1;
9559 }
9560 }
9561 return 0;
71f123ca 9562}
4697a36c 9563\f
8cd8f856
GK
9564/* Add a REG_MAYBE_DEAD note to the insn. */
9565static void
9566rs6000_maybe_dead (insn)
9567 rtx insn;
9568{
9569 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD,
9570 const0_rtx,
9571 REG_NOTES (insn));
9572}
9573
9ebbca7d 9574/* Emit instructions needed to load the TOC register.
c7ca610e 9575 This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
9ebbca7d 9576 a constant pool; or for SVR4 -fpic. */
c7ca610e
RK
9577
9578void
9ebbca7d
GK
9579rs6000_emit_load_toc_table (fromprolog)
9580 int fromprolog;
c7ca610e 9581{
9ebbca7d 9582 rtx dest;
1db02437 9583 dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
c7ca610e 9584
2bfcf297 9585 if (TARGET_ELF && DEFAULT_ABI != ABI_AIX)
c7ca610e 9586 {
f607bc57 9587 if (DEFAULT_ABI == ABI_V4 && flag_pic == 1)
38c1f2d7 9588 {
9ebbca7d
GK
9589 rtx temp = (fromprolog
9590 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
9591 : gen_reg_rtx (Pmode));
2bfcf297 9592 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_pic_si (temp)));
8cd8f856 9593 rs6000_maybe_dead (emit_move_insn (dest, temp));
38c1f2d7 9594 }
9ebbca7d
GK
9595 else if (flag_pic == 2)
9596 {
9597 char buf[30];
9598 rtx tempLR = (fromprolog
9599 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
9600 : gen_reg_rtx (Pmode));
9601 rtx temp0 = (fromprolog
9602 ? gen_rtx_REG (Pmode, 0)
9603 : gen_reg_rtx (Pmode));
9604 rtx symF;
9605
9606 /* possibly create the toc section */
9607 if (! toc_initialized)
9608 {
9609 toc_section ();
9610 function_section (current_function_decl);
9611 }
9612
9613 if (fromprolog)
9614 {
9615 rtx symL;
9616
9617 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
a8a05998 9618 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
38c1f2d7 9619
9ebbca7d 9620 ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
a8a05998 9621 symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
38c1f2d7 9622
8cd8f856
GK
9623 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1 (tempLR,
9624 symF)));
9625 rs6000_maybe_dead (emit_move_insn (dest, tempLR));
9626 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest,
9627 symL,
9628 symF)));
9ebbca7d
GK
9629 }
9630 else
9631 {
9632 rtx tocsym;
9633 static int reload_toc_labelno = 0;
9634
b999aaeb 9635 tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
38c1f2d7 9636
9ebbca7d 9637 ASM_GENERATE_INTERNAL_LABEL (buf, "LCG", reload_toc_labelno++);
a8a05998 9638 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9ebbca7d 9639
8cd8f856
GK
9640 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1b (tempLR,
9641 symF,
9642 tocsym)));
9643 rs6000_maybe_dead (emit_move_insn (dest, tempLR));
9644 rs6000_maybe_dead (emit_move_insn (temp0,
9645 gen_rtx_MEM (Pmode, dest)));
9ebbca7d 9646 }
8cd8f856 9647 rs6000_maybe_dead (emit_insn (gen_addsi3 (dest, temp0, dest)));
9ebbca7d
GK
9648 }
9649 else if (flag_pic == 0 && TARGET_MINIMAL_TOC)
9650 {
9651 /* This is for AIX code running in non-PIC ELF. */
9652 char buf[30];
9653 rtx realsym;
38c1f2d7 9654 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
a8a05998 9655 realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9ebbca7d 9656
8cd8f856
GK
9657 rs6000_maybe_dead (emit_insn (gen_elf_high (dest, realsym)));
9658 rs6000_maybe_dead (emit_insn (gen_elf_low (dest, dest, realsym)));
9ebbca7d
GK
9659 }
9660 else
a4f6c312 9661 abort ();
9ebbca7d
GK
9662 }
9663 else
9664 {
9665 if (TARGET_32BIT)
8cd8f856 9666 rs6000_maybe_dead (emit_insn (gen_load_toc_aix_si (dest)));
9ebbca7d 9667 else
8cd8f856 9668 rs6000_maybe_dead (emit_insn (gen_load_toc_aix_di (dest)));
9ebbca7d
GK
9669 }
9670}
9671
9672int
9673get_TOC_alias_set ()
9674{
9675 static int set = -1;
9676 if (set == -1)
9677 set = new_alias_set ();
9678 return set;
9679}
9680
9681/* This retuns nonzero if the current function uses the TOC. This is
9682 determined by the presence of (unspec ... 7), which is generated by
9683 the various load_toc_* patterns. */
a4f6c312 9684
9ebbca7d
GK
9685int
9686uses_TOC ()
9687{
9688 rtx insn;
38c1f2d7 9689
9ebbca7d 9690 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2c3c49de 9691 if (INSN_P (insn))
9ebbca7d
GK
9692 {
9693 rtx pat = PATTERN (insn);
9694 int i;
9695
8cd8f856 9696 if (GET_CODE (pat) == PARALLEL)
9ebbca7d
GK
9697 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
9698 if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == UNSPEC
9699 && XINT (XVECEXP (PATTERN (insn), 0, i), 1) == 7)
9700 return 1;
38c1f2d7 9701 }
9ebbca7d
GK
9702 return 0;
9703}
38c1f2d7 9704
9ebbca7d 9705rtx
a4f6c312 9706create_TOC_reference (symbol)
9ebbca7d
GK
9707 rtx symbol;
9708{
a8a05998
ZW
9709 return gen_rtx_PLUS (Pmode,
9710 gen_rtx_REG (Pmode, TOC_REGISTER),
9711 gen_rtx_CONST (Pmode,
9712 gen_rtx_MINUS (Pmode, symbol,
b999aaeb 9713 gen_rtx_SYMBOL_REF (Pmode, toc_label_name))));
9ebbca7d 9714}
38c1f2d7 9715
9ebbca7d
GK
9716#if TARGET_AIX
9717/* __throw will restore its own return address to be the same as the
9718 return address of the function that the throw is being made to.
9719 This is unfortunate, because we want to check the original
9720 return address to see if we need to restore the TOC.
9721 So we have to squirrel it away here.
9722 This is used only in compiling __throw and __rethrow.
c7ca610e 9723
9ebbca7d
GK
9724 Most of this code should be removed by CSE. */
9725static rtx insn_after_throw;
c7ca610e 9726
a4f6c312 9727/* This does the saving... */
9ebbca7d
GK
9728void
9729rs6000_aix_emit_builtin_unwind_init ()
9730{
9731 rtx mem;
9732 rtx stack_top = gen_reg_rtx (Pmode);
9733 rtx opcode_addr = gen_reg_rtx (Pmode);
9734
9735 insn_after_throw = gen_reg_rtx (SImode);
9736
9737 mem = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
9738 emit_move_insn (stack_top, mem);
9739
9740 mem = gen_rtx_MEM (Pmode,
9741 gen_rtx_PLUS (Pmode, stack_top,
9742 GEN_INT (2 * GET_MODE_SIZE (Pmode))));
9743 emit_move_insn (opcode_addr, mem);
9744 emit_move_insn (insn_after_throw, gen_rtx_MEM (SImode, opcode_addr));
c7ca610e
RK
9745}
9746
a4f6c312
SS
9747/* Emit insns to _restore_ the TOC register, at runtime (specifically
9748 in _eh.o). Only used on AIX.
9ebbca7d
GK
9749
9750 The idea is that on AIX, function calls look like this:
9751 bl somefunction-trampoline
9752 lwz r2,20(sp)
9753
a4f6c312 9754 and later,
9ebbca7d
GK
9755 somefunction-trampoline:
9756 stw r2,20(sp)
9757 ... load function address in the count register ...
9758 bctr
9759 or like this, if the linker determines that this is not a cross-module call
9760 and so the TOC need not be restored:
9761 bl somefunction
9762 nop
9763 or like this, if the compiler could determine that this is not a
9764 cross-module call:
9765 bl somefunction
9766 now, the tricky bit here is that register 2 is saved and restored
9767 by the _linker_, so we can't readily generate debugging information
9768 for it. So we need to go back up the call chain looking at the
9769 insns at return addresses to see which calls saved the TOC register
9770 and so see where it gets restored from.
9771
9772 Oh, and all this gets done in RTL inside the eh_epilogue pattern,
9773 just before the actual epilogue.
9774
9775 On the bright side, this incurs no space or time overhead unless an
9776 exception is thrown, except for the extra code in libgcc.a.
9777
9778 The parameter STACKSIZE is a register containing (at runtime)
9779 the amount to be popped off the stack in addition to the stack frame
9780 of this routine (which will be __throw or __rethrow, and so is
9781 guaranteed to have a stack frame). */
a4f6c312 9782
9ebbca7d
GK
9783void
9784rs6000_emit_eh_toc_restore (stacksize)
9785 rtx stacksize;
9786{
9787 rtx top_of_stack;
9788 rtx bottom_of_stack = gen_reg_rtx (Pmode);
9789 rtx tocompare = gen_reg_rtx (SImode);
9790 rtx opcode = gen_reg_rtx (SImode);
9791 rtx opcode_addr = gen_reg_rtx (Pmode);
9792 rtx mem;
9793 rtx loop_start = gen_label_rtx ();
9794 rtx no_toc_restore_needed = gen_label_rtx ();
9795 rtx loop_exit = gen_label_rtx ();
9796
9797 mem = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
ba4828e0 9798 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
9799 emit_move_insn (bottom_of_stack, mem);
9800
9801 top_of_stack = expand_binop (Pmode, add_optab,
9802 bottom_of_stack, stacksize,
9803 NULL_RTX, 1, OPTAB_WIDEN);
9804
2496c7bd
LB
9805 emit_move_insn (tocompare, gen_int_mode (TARGET_32BIT ? 0x80410014
9806 : 0xE8410028, SImode));
9ebbca7d
GK
9807
9808 if (insn_after_throw == NULL_RTX)
a4f6c312 9809 abort ();
9ebbca7d
GK
9810 emit_move_insn (opcode, insn_after_throw);
9811
6496a589 9812 emit_note (NULL, NOTE_INSN_LOOP_BEG);
9ebbca7d
GK
9813 emit_label (loop_start);
9814
9815 do_compare_rtx_and_jump (opcode, tocompare, NE, 1,
06f4e019 9816 SImode, NULL_RTX, NULL_RTX,
9ebbca7d
GK
9817 no_toc_restore_needed);
9818
9819 mem = gen_rtx_MEM (Pmode,
9820 gen_rtx_PLUS (Pmode, bottom_of_stack,
9821 GEN_INT (5 * GET_MODE_SIZE (Pmode))));
9822 emit_move_insn (gen_rtx_REG (Pmode, 2), mem);
9823
9824 emit_label (no_toc_restore_needed);
9825 do_compare_rtx_and_jump (top_of_stack, bottom_of_stack, EQ, 1,
06f4e019 9826 Pmode, NULL_RTX, NULL_RTX,
9ebbca7d
GK
9827 loop_exit);
9828
9829 mem = gen_rtx_MEM (Pmode, bottom_of_stack);
ba4828e0 9830 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
9831 emit_move_insn (bottom_of_stack, mem);
9832
9833 mem = gen_rtx_MEM (Pmode,
9834 gen_rtx_PLUS (Pmode, bottom_of_stack,
9835 GEN_INT (2 * GET_MODE_SIZE (Pmode))));
9836 emit_move_insn (opcode_addr, mem);
9837 emit_move_insn (opcode, gen_rtx_MEM (SImode, opcode_addr));
9838
6496a589 9839 emit_note (NULL, NOTE_INSN_LOOP_CONT);
9ebbca7d 9840 emit_jump (loop_start);
6496a589 9841 emit_note (NULL, NOTE_INSN_LOOP_END);
9ebbca7d
GK
9842 emit_label (loop_exit);
9843}
9844#endif /* TARGET_AIX */
38c1f2d7 9845\f
ba4828e0
RK
9846/* This ties together stack memory (MEM with an alias set of
9847 rs6000_sr_alias_set) and the change to the stack pointer. */
9848
9ebbca7d
GK
9849static void
9850rs6000_emit_stack_tie ()
9851{
ba4828e0
RK
9852 rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
9853
9854 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
9855 emit_insn (gen_stack_tie (mem));
9856}
38c1f2d7 9857
9ebbca7d
GK
9858/* Emit the correct code for allocating stack space, as insns.
9859 If COPY_R12, make sure a copy of the old frame is left in r12.
9860 The generated code may use hard register 0 as a temporary. */
9861
9862static void
9863rs6000_emit_allocate_stack (size, copy_r12)
9864 HOST_WIDE_INT size;
38c1f2d7
MM
9865 int copy_r12;
9866{
9ebbca7d
GK
9867 rtx insn;
9868 rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
9869 rtx tmp_reg = gen_rtx_REG (Pmode, 0);
9870 rtx todec = GEN_INT (-size);
a157febd
GK
9871
9872 if (current_function_limit_stack)
9873 {
9874 if (REG_P (stack_limit_rtx)
9875 && REGNO (stack_limit_rtx) > 1
9876 && REGNO (stack_limit_rtx) <= 31)
9877 {
9ebbca7d
GK
9878 emit_insn (Pmode == SImode
9879 ? gen_addsi3 (tmp_reg,
9880 stack_limit_rtx,
9881 GEN_INT (size))
9882 : gen_adddi3 (tmp_reg,
9883 stack_limit_rtx,
9884 GEN_INT (size)));
9885
9886 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
9887 const0_rtx));
a157febd
GK
9888 }
9889 else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
9ebbca7d 9890 && TARGET_32BIT
f607bc57 9891 && DEFAULT_ABI == ABI_V4)
a157febd 9892 {
9ebbca7d
GK
9893 rtx toload = gen_rtx_CONST (VOIDmode,
9894 gen_rtx_PLUS (Pmode,
9895 stack_limit_rtx,
9896 GEN_INT (size)));
9897
9898 emit_insn (gen_elf_high (tmp_reg, toload));
9899 emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
9900 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
9901 const0_rtx));
a157febd
GK
9902 }
9903 else
9904 warning ("stack limit expression is not supported");
9905 }
9906
9ebbca7d
GK
9907 if (copy_r12 || ! TARGET_UPDATE)
9908 emit_move_insn (gen_rtx_REG (Pmode, 12), stack_reg);
9909
38c1f2d7
MM
9910 if (TARGET_UPDATE)
9911 {
9ebbca7d 9912 if (size > 32767)
38c1f2d7 9913 {
9ebbca7d
GK
9914 /* Need a note here so that try_split doesn't get confused. */
9915 if (get_last_insn() == NULL_RTX)
9916 emit_note (0, NOTE_INSN_DELETED);
9917 insn = emit_move_insn (tmp_reg, todec);
9918 try_split (PATTERN (insn), insn, 0);
9919 todec = tmp_reg;
38c1f2d7 9920 }
9ebbca7d
GK
9921
9922 if (Pmode == SImode)
9923 insn = emit_insn (gen_movsi_update (stack_reg, stack_reg,
9924 todec, stack_reg));
9925 else
9926 insn = emit_insn (gen_movdi_update (stack_reg, stack_reg,
9927 todec, stack_reg));
38c1f2d7
MM
9928 }
9929 else
9930 {
9ebbca7d
GK
9931 if (Pmode == SImode)
9932 insn = emit_insn (gen_addsi3 (stack_reg, stack_reg, todec));
38c1f2d7 9933 else
9ebbca7d
GK
9934 insn = emit_insn (gen_adddi3 (stack_reg, stack_reg, todec));
9935 emit_move_insn (gen_rtx_MEM (Pmode, stack_reg),
9936 gen_rtx_REG (Pmode, 12));
9937 }
9938
9939 RTX_FRAME_RELATED_P (insn) = 1;
9940 REG_NOTES (insn) =
9941 gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
9942 gen_rtx_SET (VOIDmode, stack_reg,
9943 gen_rtx_PLUS (Pmode, stack_reg,
9944 GEN_INT (-size))),
9945 REG_NOTES (insn));
9946}
9947
9aa86737
AH
9948/* Add a RTX_FRAME_RELATED note so that dwarf2out_frame_debug_expr
9949 knows that:
9950
9951 (mem (plus (blah) (regXX)))
9952
9953 is really:
9954
9955 (mem (plus (blah) (const VALUE_OF_REGXX))). */
9956
9957static void
9958altivec_frame_fixup (insn, reg, val)
9959 rtx insn, reg;
9960 HOST_WIDE_INT val;
9961{
9962 rtx real;
9963
9964 real = copy_rtx (PATTERN (insn));
9965
9966 real = replace_rtx (real, reg, GEN_INT (val));
9967
9968 RTX_FRAME_RELATED_P (insn) = 1;
9969 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
9970 real,
9971 REG_NOTES (insn));
9972}
9973
a4f6c312
SS
9974/* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
9975 with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
9976 is not NULL. It would be nice if dwarf2out_frame_debug_expr could
9977 deduce these equivalences by itself so it wasn't necessary to hold
9978 its hand so much. */
9ebbca7d
GK
9979
9980static void
9981rs6000_frame_related (insn, reg, val, reg2, rreg)
9982 rtx insn;
9983 rtx reg;
9984 HOST_WIDE_INT val;
9985 rtx reg2;
9986 rtx rreg;
9987{
9988 rtx real, temp;
9989
e56c4463
JL
9990 /* copy_rtx will not make unique copies of registers, so we need to
9991 ensure we don't have unwanted sharing here. */
9992 if (reg == reg2)
9993 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
9994
9995 if (reg == rreg)
9996 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
9997
9ebbca7d
GK
9998 real = copy_rtx (PATTERN (insn));
9999
89e7058f
AH
10000 if (reg2 != NULL_RTX)
10001 real = replace_rtx (real, reg2, rreg);
10002
9ebbca7d
GK
10003 real = replace_rtx (real, reg,
10004 gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
10005 STACK_POINTER_REGNUM),
10006 GEN_INT (val)));
10007
10008 /* We expect that 'real' is either a SET or a PARALLEL containing
10009 SETs (and possibly other stuff). In a PARALLEL, all the SETs
10010 are important so they all have to be marked RTX_FRAME_RELATED_P. */
10011
10012 if (GET_CODE (real) == SET)
10013 {
10014 rtx set = real;
10015
10016 temp = simplify_rtx (SET_SRC (set));
10017 if (temp)
10018 SET_SRC (set) = temp;
10019 temp = simplify_rtx (SET_DEST (set));
10020 if (temp)
10021 SET_DEST (set) = temp;
10022 if (GET_CODE (SET_DEST (set)) == MEM)
38c1f2d7 10023 {
9ebbca7d
GK
10024 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
10025 if (temp)
10026 XEXP (SET_DEST (set), 0) = temp;
38c1f2d7 10027 }
38c1f2d7 10028 }
9ebbca7d
GK
10029 else if (GET_CODE (real) == PARALLEL)
10030 {
10031 int i;
10032 for (i = 0; i < XVECLEN (real, 0); i++)
10033 if (GET_CODE (XVECEXP (real, 0, i)) == SET)
10034 {
10035 rtx set = XVECEXP (real, 0, i);
10036
10037 temp = simplify_rtx (SET_SRC (set));
10038 if (temp)
10039 SET_SRC (set) = temp;
10040 temp = simplify_rtx (SET_DEST (set));
10041 if (temp)
10042 SET_DEST (set) = temp;
10043 if (GET_CODE (SET_DEST (set)) == MEM)
10044 {
10045 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
10046 if (temp)
10047 XEXP (SET_DEST (set), 0) = temp;
10048 }
10049 RTX_FRAME_RELATED_P (set) = 1;
10050 }
10051 }
10052 else
a4f6c312 10053 abort ();
9ebbca7d 10054
9ebbca7d
GK
10055 RTX_FRAME_RELATED_P (insn) = 1;
10056 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
10057 real,
10058 REG_NOTES (insn));
38c1f2d7
MM
10059}
10060
00b960c7
AH
10061/* Returns an insn that has a vrsave set operation with the
10062 appropriate CLOBBERs. */
10063
10064static rtx
9aa86737 10065generate_set_vrsave (reg, info, epiloguep)
00b960c7
AH
10066 rtx reg;
10067 rs6000_stack_t *info;
9aa86737 10068 int epiloguep;
00b960c7
AH
10069{
10070 int nclobs, i;
10071 rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
a004eb82 10072 rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
00b960c7 10073
a004eb82
AH
10074 clobs[0]
10075 = gen_rtx_SET (VOIDmode,
10076 vrsave,
10077 gen_rtx_UNSPEC_VOLATILE (SImode,
10078 gen_rtvec (2, reg, vrsave),
10079 30));
00b960c7
AH
10080
10081 nclobs = 1;
10082
9aa86737
AH
10083 /* We need to clobber the registers in the mask so the scheduler
10084 does not move sets to VRSAVE before sets of AltiVec registers.
10085
10086 However, if the function receives nonlocal gotos, reload will set
10087 all call saved registers live. We will end up with:
10088
10089 (set (reg 999) (mem))
10090 (parallel [ (set (reg vrsave) (unspec blah))
10091 (clobber (reg 999))])
10092
10093 The clobber will cause the store into reg 999 to be dead, and
10094 flow will attempt to delete an epilogue insn. In this case, we
10095 need an unspec use/set of the register. */
00b960c7
AH
10096
10097 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
10098 if (info->vrsave_mask != 0 && ALTIVEC_REG_BIT (i) != 0)
9aa86737
AH
10099 {
10100 if (!epiloguep || call_used_regs [i])
10101 clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
10102 gen_rtx_REG (V4SImode, i));
10103 else
10104 {
10105 rtx reg = gen_rtx_REG (V4SImode, i);
9aa86737
AH
10106
10107 clobs[nclobs++]
a004eb82
AH
10108 = gen_rtx_SET (VOIDmode,
10109 reg,
10110 gen_rtx_UNSPEC (V4SImode,
10111 gen_rtvec (1, reg), 27));
9aa86737
AH
10112 }
10113 }
00b960c7
AH
10114
10115 insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
10116
10117 for (i = 0; i < nclobs; ++i)
10118 XVECEXP (insn, 0, i) = clobs[i];
10119
10120 return insn;
10121}
10122
89e7058f
AH
10123/* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
10124 Save REGNO into [FRAME_REG + OFFSET] in mode MODE. */
10125
10126static void
10127emit_frame_save (frame_reg, frame_ptr, mode, regno, offset, total_size)
10128 rtx frame_reg;
10129 rtx frame_ptr;
10130 enum machine_mode mode;
10131 unsigned int regno;
10132 int offset;
10133 int total_size;
10134{
10135 rtx reg, offset_rtx, insn, mem, addr, int_rtx;
10136 rtx replacea, replaceb;
10137
10138 int_rtx = GEN_INT (offset);
10139
10140 /* Some cases that need register indexed addressing. */
10141 if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
a3170dc6
AH
10142 || (TARGET_SPE_ABI
10143 && SPE_VECTOR_MODE (mode)
10144 && !SPE_CONST_OFFSET_OK (offset)))
89e7058f
AH
10145 {
10146 /* Whomever calls us must make sure r11 is available in the
10147 flow path of instructions in the prologue. */
10148 offset_rtx = gen_rtx_REG (Pmode, 11);
10149 emit_move_insn (offset_rtx, int_rtx);
10150
10151 replacea = offset_rtx;
10152 replaceb = int_rtx;
10153 }
10154 else
10155 {
10156 offset_rtx = int_rtx;
10157 replacea = NULL_RTX;
10158 replaceb = NULL_RTX;
10159 }
10160
10161 reg = gen_rtx_REG (mode, regno);
10162 addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
10163 mem = gen_rtx_MEM (mode, addr);
10164 set_mem_alias_set (mem, rs6000_sr_alias_set);
10165
10166 insn = emit_move_insn (mem, reg);
10167
10168 rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
10169}
10170
a3170dc6
AH
10171/* Emit an offset memory reference suitable for a frame store, while
10172 converting to a valid addressing mode. */
10173
10174static rtx
10175gen_frame_mem_offset (mode, reg, offset)
10176 enum machine_mode mode;
10177 rtx reg;
10178 int offset;
10179{
10180 rtx int_rtx, offset_rtx;
10181
10182 int_rtx = GEN_INT (offset);
10183
10184 if (TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
10185 {
10186 offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
10187 emit_move_insn (offset_rtx, int_rtx);
10188 }
10189 else
10190 offset_rtx = int_rtx;
10191
10192 return gen_rtx_MEM (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
10193}
10194
9ebbca7d
GK
10195/* Emit function prologue as insns. */
10196
9878760c 10197void
83720594 10198rs6000_emit_prologue ()
9878760c 10199{
4697a36c 10200 rs6000_stack_t *info = rs6000_stack_info ();
9ebbca7d
GK
10201 enum machine_mode reg_mode = TARGET_POWERPC64 ? DImode : SImode;
10202 int reg_size = TARGET_POWERPC64 ? 8 : 4;
10203 rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
10204 rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
10205 rtx frame_reg_rtx = sp_reg_rtx;
10206 rtx cr_save_rtx = NULL;
10207 rtx insn;
10208 int saving_FPRs_inline;
10209 int using_store_multiple;
10210 HOST_WIDE_INT sp_offset = 0;
10211
a3170dc6
AH
10212 if (TARGET_SPE_ABI)
10213 {
10214 reg_mode = V2SImode;
10215 reg_size = 8;
10216 }
10217
9ebbca7d 10218 using_store_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
a3170dc6 10219 && !TARGET_SPE_ABI
9ebbca7d
GK
10220 && info->first_gp_reg_save < 31);
10221 saving_FPRs_inline = (info->first_fp_reg_save == 64
10222 || FP_SAVE_INLINE (info->first_fp_reg_save));
10223
10224 /* For V.4, update stack before we do any saving and set back pointer. */
f607bc57 10225 if (info->push_p && DEFAULT_ABI == ABI_V4)
9ebbca7d
GK
10226 {
10227 if (info->total_size < 32767)
10228 sp_offset = info->total_size;
10229 else
10230 frame_reg_rtx = frame_ptr_rtx;
10231 rs6000_emit_allocate_stack (info->total_size,
10232 (frame_reg_rtx != sp_reg_rtx
10233 && (info->cr_save_p
10234 || info->lr_save_p
10235 || info->first_fp_reg_save < 64
10236 || info->first_gp_reg_save < 32
10237 )));
10238 if (frame_reg_rtx != sp_reg_rtx)
10239 rs6000_emit_stack_tie ();
10240 }
10241
9aa86737
AH
10242 /* Save AltiVec registers if needed. */
10243 if (TARGET_ALTIVEC_ABI && info->altivec_size != 0)
10244 {
10245 int i;
10246
10247 /* There should be a non inline version of this, for when we
10248 are saving lots of vector registers. */
10249 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
10250 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
10251 {
10252 rtx areg, savereg, mem;
10253 int offset;
10254
10255 offset = info->altivec_save_offset + sp_offset
10256 + 16 * (i - info->first_altivec_reg_save);
10257
10258 savereg = gen_rtx_REG (V4SImode, i);
10259
10260 areg = gen_rtx_REG (Pmode, 0);
10261 emit_move_insn (areg, GEN_INT (offset));
10262
10263 /* AltiVec addressing mode is [reg+reg]. */
10264 mem = gen_rtx_MEM (V4SImode,
10265 gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
10266
10267 set_mem_alias_set (mem, rs6000_sr_alias_set);
10268
10269 insn = emit_move_insn (mem, savereg);
10270
10271 altivec_frame_fixup (insn, areg, offset);
10272 }
10273 }
10274
10275 /* VRSAVE is a bit vector representing which AltiVec registers
10276 are used. The OS uses this to determine which vector
10277 registers to save on a context switch. We need to save
10278 VRSAVE on the stack frame, add whatever AltiVec registers we
10279 used in this function, and do the corresponding magic in the
10280 epilogue. */
10281
10282 if (TARGET_ALTIVEC && info->vrsave_mask != 0)
10283 {
a004eb82 10284 rtx reg, mem, vrsave;
9aa86737
AH
10285 int offset;
10286
10287 /* Get VRSAVE onto a GPR. */
10288 reg = gen_rtx_REG (SImode, 12);
a004eb82 10289 vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
b188f760
AH
10290 if (TARGET_MACHO)
10291 emit_insn (gen_get_vrsave_internal (reg));
10292 else
10293 emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
9aa86737
AH
10294
10295 /* Save VRSAVE. */
10296 offset = info->vrsave_save_offset + sp_offset;
10297 mem
10298 = gen_rtx_MEM (SImode,
10299 gen_rtx_PLUS (Pmode, frame_reg_rtx, GEN_INT (offset)));
10300 set_mem_alias_set (mem, rs6000_sr_alias_set);
10301 insn = emit_move_insn (mem, reg);
10302
10303 /* Include the registers in the mask. */
10304 emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
10305
10306 insn = emit_insn (generate_set_vrsave (reg, info, 0));
10307 }
10308
9ebbca7d
GK
10309 /* If we use the link register, get it into r0. */
10310 if (info->lr_save_p)
71f123ca 10311 emit_move_insn (gen_rtx_REG (Pmode, 0),
9ebbca7d
GK
10312 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
10313
10314 /* If we need to save CR, put it into r12. */
10315 if (info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
10316 {
10317 cr_save_rtx = gen_rtx_REG (SImode, 12);
10318 emit_insn (gen_movesi_from_cr (cr_save_rtx));
10319 }
10320
a4f6c312
SS
10321 /* Do any required saving of fpr's. If only one or two to save, do
10322 it ourselves. Otherwise, call function. */
9ebbca7d
GK
10323 if (saving_FPRs_inline)
10324 {
10325 int i;
10326 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
10327 if ((regs_ever_live[info->first_fp_reg_save+i]
10328 && ! call_used_regs[info->first_fp_reg_save+i]))
89e7058f
AH
10329 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, DFmode,
10330 info->first_fp_reg_save + i,
10331 info->fp_save_offset + sp_offset + 8 * i,
10332 info->total_size);
9ebbca7d
GK
10333 }
10334 else if (info->first_fp_reg_save != 64)
10335 {
10336 int i;
10337 char rname[30];
520a57c8 10338 const char *alloc_rname;
9ebbca7d
GK
10339 rtvec p;
10340 p = rtvec_alloc (2 + 64 - info->first_fp_reg_save);
10341
10342 RTVEC_ELT (p, 0) = gen_rtx_CLOBBER (VOIDmode,
10343 gen_rtx_REG (Pmode,
10344 LINK_REGISTER_REGNUM));
10345 sprintf (rname, "%s%d%s", SAVE_FP_PREFIX,
10346 info->first_fp_reg_save - 32, SAVE_FP_SUFFIX);
a8a05998 10347 alloc_rname = ggc_strdup (rname);
9ebbca7d
GK
10348 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
10349 gen_rtx_SYMBOL_REF (Pmode,
10350 alloc_rname));
10351 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
10352 {
10353 rtx addr, reg, mem;
10354 reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
10355 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10356 GEN_INT (info->fp_save_offset
10357 + sp_offset + 8*i));
10358 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 10359 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10360
10361 RTVEC_ELT (p, i + 2) = gen_rtx_SET (VOIDmode, mem, reg);
10362 }
10363 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
10364 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
10365 NULL_RTX, NULL_RTX);
10366 }
b6c9286a 10367
9ebbca7d
GK
10368 /* Save GPRs. This is done as a PARALLEL if we are using
10369 the store-multiple instructions. */
10370 if (using_store_multiple)
b6c9286a 10371 {
308c142a 10372 rtvec p;
9ebbca7d
GK
10373 int i;
10374 p = rtvec_alloc (32 - info->first_gp_reg_save);
9ebbca7d
GK
10375 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
10376 {
10377 rtx addr, reg, mem;
10378 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
10379 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10380 GEN_INT (info->gp_save_offset
10381 + sp_offset
10382 + reg_size * i));
10383 mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0 10384 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10385
10386 RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
10387 }
10388 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
10389 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
10390 NULL_RTX, NULL_RTX);
b6c9286a
MM
10391 }
10392 else
10393 {
9ebbca7d
GK
10394 int i;
10395 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
10396 if ((regs_ever_live[info->first_gp_reg_save+i]
10397 && ! call_used_regs[info->first_gp_reg_save+i])
1db02437 10398 || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
f607bc57
ZW
10399 && ((DEFAULT_ABI == ABI_V4 && flag_pic == 1)
10400 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
a3170dc6
AH
10401 {
10402 rtx addr, reg, mem;
10403 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
10404
10405 if (TARGET_SPE_ABI)
10406 {
10407 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
10408 rtx b;
10409
10410 if (!SPE_CONST_OFFSET_OK (offset))
10411 {
10412 b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
10413 emit_move_insn (b, GEN_INT (offset));
10414 }
10415 else
10416 b = GEN_INT (offset);
10417
10418 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
10419 mem = gen_rtx_MEM (V2SImode, addr);
10420 set_mem_alias_set (mem, rs6000_sr_alias_set);
10421 insn = emit_move_insn (mem, reg);
10422
10423 if (GET_CODE (b) == CONST_INT)
10424 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
10425 NULL_RTX, NULL_RTX);
10426 else
10427 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
10428 b, GEN_INT (offset));
10429 }
10430 else
10431 {
10432 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10433 GEN_INT (info->gp_save_offset
10434 + sp_offset
10435 + reg_size * i));
10436 mem = gen_rtx_MEM (reg_mode, addr);
10437 set_mem_alias_set (mem, rs6000_sr_alias_set);
10438
10439 insn = emit_move_insn (mem, reg);
10440 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
10441 NULL_RTX, NULL_RTX);
10442 }
10443 }
9ebbca7d
GK
10444 }
10445
83720594
RH
10446 /* ??? There's no need to emit actual instructions here, but it's the
10447 easiest way to get the frame unwind information emitted. */
10448 if (current_function_calls_eh_return)
10449 {
78e1b90d
DE
10450 unsigned int i, regno;
10451
83720594
RH
10452 for (i = 0; ; ++i)
10453 {
83720594
RH
10454 regno = EH_RETURN_DATA_REGNO (i);
10455 if (regno == INVALID_REGNUM)
10456 break;
10457
89e7058f
AH
10458 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
10459 info->ehrd_offset + sp_offset
10460 + reg_size * (int) i,
10461 info->total_size);
83720594
RH
10462 }
10463 }
10464
9ebbca7d
GK
10465 /* Save lr if we used it. */
10466 if (info->lr_save_p)
10467 {
10468 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10469 GEN_INT (info->lr_save_offset + sp_offset));
10470 rtx reg = gen_rtx_REG (Pmode, 0);
10471 rtx mem = gen_rtx_MEM (Pmode, addr);
10472 /* This should not be of rs6000_sr_alias_set, because of
10473 __builtin_return_address. */
10474
10475 insn = emit_move_insn (mem, reg);
10476 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
10477 reg, gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
10478 }
10479
10480 /* Save CR if we use any that must be preserved. */
10481 if (info->cr_save_p)
10482 {
10483 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10484 GEN_INT (info->cr_save_offset + sp_offset));
10485 rtx mem = gen_rtx_MEM (SImode, addr);
ba4828e0
RK
10486
10487 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10488
10489 /* If r12 was used to hold the original sp, copy cr into r0 now
10490 that it's free. */
10491 if (REGNO (frame_reg_rtx) == 12)
10492 {
10493 cr_save_rtx = gen_rtx_REG (SImode, 0);
10494 emit_insn (gen_movesi_from_cr (cr_save_rtx));
10495 }
10496 insn = emit_move_insn (mem, cr_save_rtx);
10497
10498 /* Now, there's no way that dwarf2out_frame_debug_expr is going
10499 to understand '(unspec:SI [(reg:CC 68) ...] 19)'. But that's
10500 OK. All we have to do is specify that _one_ condition code
10501 register is saved in this stack slot. The thrower's epilogue
a1dc9455
FS
10502 will then restore all the call-saved registers.
10503 We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux. */
9ebbca7d 10504 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
a1dc9455 10505 cr_save_rtx, gen_rtx_REG (SImode, CR2_REGNO));
9ebbca7d
GK
10506 }
10507
10508 /* Update stack and set back pointer unless this is V.4,
10509 for which it was done previously. */
f607bc57 10510 if (info->push_p && DEFAULT_ABI != ABI_V4)
9ebbca7d
GK
10511 rs6000_emit_allocate_stack (info->total_size, FALSE);
10512
10513 /* Set frame pointer, if needed. */
10514 if (frame_pointer_needed)
10515 {
a3170dc6 10516 insn = emit_move_insn (gen_rtx_REG (Pmode, FRAME_POINTER_REGNUM),
9ebbca7d
GK
10517 sp_reg_rtx);
10518 RTX_FRAME_RELATED_P (insn) = 1;
b6c9286a 10519 }
9878760c 10520
1db02437 10521 /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up. */
9ebbca7d 10522 if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
f607bc57 10523 || (DEFAULT_ABI == ABI_V4 && flag_pic == 1
1db02437 10524 && regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM]))
9ebbca7d
GK
10525 {
10526 /* If emit_load_toc_table will use the link register, we need to save
10527 it. We use R11 for this purpose because emit_load_toc_table
10528 can use register 0. This allows us to use a plain 'blr' to return
10529 from the procedure more often. */
d5fa86ba
GK
10530 int save_LR_around_toc_setup = (TARGET_ELF && flag_pic != 0
10531 && ! info->lr_save_p
10532 && EXIT_BLOCK_PTR->pred != NULL);
9ebbca7d
GK
10533 if (save_LR_around_toc_setup)
10534 emit_move_insn (gen_rtx_REG (Pmode, 11),
10535 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
10536
10537 rs6000_emit_load_toc_table (TRUE);
10538
10539 if (save_LR_around_toc_setup)
10540 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM),
10541 gen_rtx_REG (Pmode, 11));
10542 }
ee890fe2
SS
10543
10544 if (DEFAULT_ABI == ABI_DARWIN
10545 && flag_pic && current_function_uses_pic_offset_table)
10546 {
10547 rtx dest = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
10548
10549 rs6000_maybe_dead (emit_insn (gen_load_macho_picbase (dest)));
10550
10551 rs6000_maybe_dead (
1db02437 10552 emit_move_insn (gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM),
ee890fe2
SS
10553 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)));
10554 }
9ebbca7d
GK
10555}
10556
9ebbca7d 10557/* Write function prologue. */
a4f6c312 10558
08c148a8
NB
10559static void
10560rs6000_output_function_prologue (file, size)
9ebbca7d 10561 FILE *file;
08c148a8 10562 HOST_WIDE_INT size ATTRIBUTE_UNUSED;
9ebbca7d
GK
10563{
10564 rs6000_stack_t *info = rs6000_stack_info ();
10565
4697a36c
MM
10566 if (TARGET_DEBUG_STACK)
10567 debug_stack_info (info);
9878760c 10568
a4f6c312
SS
10569 /* Write .extern for any function we will call to save and restore
10570 fp values. */
10571 if (info->first_fp_reg_save < 64
10572 && !FP_SAVE_INLINE (info->first_fp_reg_save))
4d30c363 10573 fprintf (file, "\t.extern %s%d%s\n\t.extern %s%d%s\n",
4697a36c 10574 SAVE_FP_PREFIX, info->first_fp_reg_save - 32, SAVE_FP_SUFFIX,
a4f6c312
SS
10575 RESTORE_FP_PREFIX, info->first_fp_reg_save - 32,
10576 RESTORE_FP_SUFFIX);
9878760c 10577
c764f757
RK
10578 /* Write .extern for AIX common mode routines, if needed. */
10579 if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
10580 {
f6709c70
JW
10581 fputs ("\t.extern __mulh\n", file);
10582 fputs ("\t.extern __mull\n", file);
10583 fputs ("\t.extern __divss\n", file);
10584 fputs ("\t.extern __divus\n", file);
10585 fputs ("\t.extern __quoss\n", file);
10586 fputs ("\t.extern __quous\n", file);
c764f757
RK
10587 common_mode_defined = 1;
10588 }
9878760c 10589
9ebbca7d 10590 if (! HAVE_prologue)
979721f8 10591 {
9ebbca7d 10592 start_sequence ();
9dda4cc8 10593
a4f6c312
SS
10594 /* A NOTE_INSN_DELETED is supposed to be at the start and end of
10595 the "toplevel" insn chain. */
9ebbca7d
GK
10596 emit_note (0, NOTE_INSN_DELETED);
10597 rs6000_emit_prologue ();
10598 emit_note (0, NOTE_INSN_DELETED);
178c3eff
DJ
10599
10600 /* Expand INSN_ADDRESSES so final() doesn't crash. */
10601 {
10602 rtx insn;
10603 unsigned addr = 0;
10604 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
10605 {
10606 INSN_ADDRESSES_NEW (insn, addr);
10607 addr += 4;
10608 }
10609 }
9dda4cc8 10610
9ebbca7d 10611 if (TARGET_DEBUG_STACK)
a4f6c312
SS
10612 debug_rtx_list (get_insns (), 100);
10613 final (get_insns (), file, FALSE, FALSE);
9ebbca7d 10614 end_sequence ();
979721f8
MM
10615 }
10616
9ebbca7d
GK
10617 rs6000_pic_labelno++;
10618}
10619
10620/* Emit function epilogue as insns.
9878760c 10621
9ebbca7d
GK
10622 At present, dwarf2out_frame_debug_expr doesn't understand
10623 register restores, so we don't bother setting RTX_FRAME_RELATED_P
10624 anywhere in the epilogue. Most of the insns below would in any case
10625 need special notes to explain where r11 is in relation to the stack. */
9878760c 10626
9ebbca7d 10627void
83720594 10628rs6000_emit_epilogue (sibcall)
9ebbca7d
GK
10629 int sibcall;
10630{
10631 rs6000_stack_t *info;
10632 int restoring_FPRs_inline;
10633 int using_load_multiple;
10634 int using_mfcr_multiple;
10635 int use_backchain_to_restore_sp;
10636 int sp_offset = 0;
10637 rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
10638 rtx frame_reg_rtx = sp_reg_rtx;
10639 enum machine_mode reg_mode = TARGET_POWERPC64 ? DImode : SImode;
10640 int reg_size = TARGET_POWERPC64 ? 8 : 4;
10641 int i;
10642
a3170dc6
AH
10643 if (TARGET_SPE_ABI)
10644 {
10645 reg_mode = V2SImode;
10646 reg_size = 8;
10647 }
10648
9ebbca7d
GK
10649 info = rs6000_stack_info ();
10650 using_load_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
a3170dc6 10651 && !TARGET_SPE_ABI
9ebbca7d
GK
10652 && info->first_gp_reg_save < 31);
10653 restoring_FPRs_inline = (sibcall
83720594 10654 || current_function_calls_eh_return
9ebbca7d
GK
10655 || info->first_fp_reg_save == 64
10656 || FP_SAVE_INLINE (info->first_fp_reg_save));
10657 use_backchain_to_restore_sp = (frame_pointer_needed
10658 || current_function_calls_alloca
10659 || info->total_size > 32767);
10660 using_mfcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
10661 || rs6000_cpu == PROCESSOR_PPC603
10662 || rs6000_cpu == PROCESSOR_PPC750
10663 || optimize_size);
10664
10665 /* If we have a frame pointer, a call to alloca, or a large stack
10666 frame, restore the old stack pointer using the backchain. Otherwise,
10667 we know what size to update it with. */
10668 if (use_backchain_to_restore_sp)
bacbde18 10669 {
9ebbca7d
GK
10670 /* Under V.4, don't reset the stack pointer until after we're done
10671 loading the saved registers. */
f607bc57 10672 if (DEFAULT_ABI == ABI_V4)
9ebbca7d 10673 frame_reg_rtx = gen_rtx_REG (Pmode, 11);
4697a36c 10674
9ebbca7d
GK
10675 emit_move_insn (frame_reg_rtx,
10676 gen_rtx_MEM (Pmode, sp_reg_rtx));
10677
bacbde18 10678 }
9ebbca7d 10679 else if (info->push_p)
85638c0d 10680 {
f607bc57 10681 if (DEFAULT_ABI == ABI_V4)
9ebbca7d
GK
10682 sp_offset = info->total_size;
10683 else
10684 {
10685 emit_insn (TARGET_32BIT
10686 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
10687 GEN_INT (info->total_size))
10688 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
10689 GEN_INT (info->total_size)));
10690 }
85638c0d 10691 }
9ebbca7d 10692
9aa86737
AH
10693 /* Restore AltiVec registers if needed. */
10694 if (TARGET_ALTIVEC_ABI && info->altivec_size != 0)
10695 {
10696 int i;
10697
10698 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
10699 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
10700 {
10701 rtx addr, areg, mem;
10702
10703 areg = gen_rtx_REG (Pmode, 0);
10704 emit_move_insn
10705 (areg, GEN_INT (info->altivec_save_offset
10706 + sp_offset
10707 + 16 * (i - info->first_altivec_reg_save)));
10708
10709 /* AltiVec addressing mode is [reg+reg]. */
10710 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
10711 mem = gen_rtx_MEM (V4SImode, addr);
10712 set_mem_alias_set (mem, rs6000_sr_alias_set);
10713
10714 emit_move_insn (gen_rtx_REG (V4SImode, i), mem);
10715 }
10716 }
10717
10718 /* Restore VRSAVE if needed. */
10719 if (TARGET_ALTIVEC_ABI && info->vrsave_mask != 0)
10720 {
10721 rtx addr, mem, reg;
10722
10723 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10724 GEN_INT (info->vrsave_save_offset + sp_offset));
10725 mem = gen_rtx_MEM (SImode, addr);
10726 set_mem_alias_set (mem, rs6000_sr_alias_set);
10727 reg = gen_rtx_REG (SImode, 12);
10728 emit_move_insn (reg, mem);
10729
10730 emit_insn (generate_set_vrsave (reg, info, 1));
10731 }
10732
9ebbca7d
GK
10733 /* Get the old lr if we saved it. */
10734 if (info->lr_save_p)
b6c9286a 10735 {
a3170dc6
AH
10736 rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
10737 info->lr_save_offset + sp_offset);
ba4828e0
RK
10738
10739 set_mem_alias_set (mem, rs6000_sr_alias_set);
b6c9286a 10740
9ebbca7d 10741 emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
b6c9286a 10742 }
9ebbca7d
GK
10743
10744 /* Get the old cr if we saved it. */
10745 if (info->cr_save_p)
10746 {
10747 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10748 GEN_INT (info->cr_save_offset + sp_offset));
10749 rtx mem = gen_rtx_MEM (SImode, addr);
ba4828e0
RK
10750
10751 set_mem_alias_set (mem, rs6000_sr_alias_set);
b6c9286a 10752
9ebbca7d
GK
10753 emit_move_insn (gen_rtx_REG (SImode, 12), mem);
10754 }
10755
10756 /* Set LR here to try to overlap restores below. */
4697a36c 10757 if (info->lr_save_p)
9ebbca7d
GK
10758 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM),
10759 gen_rtx_REG (Pmode, 0));
10760
83720594
RH
10761 /* Load exception handler data registers, if needed. */
10762 if (current_function_calls_eh_return)
10763 {
78e1b90d
DE
10764 unsigned int i, regno;
10765
83720594
RH
10766 for (i = 0; ; ++i)
10767 {
a3170dc6 10768 rtx mem;
83720594
RH
10769
10770 regno = EH_RETURN_DATA_REGNO (i);
10771 if (regno == INVALID_REGNUM)
10772 break;
10773
a3170dc6
AH
10774 mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
10775 info->ehrd_offset + sp_offset
10776 + reg_size * (int) i);
ba4828e0 10777 set_mem_alias_set (mem, rs6000_sr_alias_set);
83720594
RH
10778
10779 emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
10780 }
10781 }
9ebbca7d
GK
10782
10783 /* Restore GPRs. This is done as a PARALLEL if we are using
10784 the load-multiple instructions. */
10785 if (using_load_multiple)
979721f8 10786 {
9ebbca7d
GK
10787 rtvec p;
10788 p = rtvec_alloc (32 - info->first_gp_reg_save);
10789 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
979721f8 10790 {
9ebbca7d
GK
10791 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10792 GEN_INT (info->gp_save_offset
10793 + sp_offset
10794 + reg_size * i));
10795 rtx mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0
RK
10796
10797 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10798
10799 RTVEC_ELT (p, i) =
10800 gen_rtx_SET (VOIDmode,
10801 gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
10802 mem);
979721f8 10803 }
9ebbca7d 10804 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
979721f8 10805 }
9ebbca7d
GK
10806 else
10807 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
10808 if ((regs_ever_live[info->first_gp_reg_save+i]
10809 && ! call_used_regs[info->first_gp_reg_save+i])
1db02437 10810 || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
f607bc57
ZW
10811 && ((DEFAULT_ABI == ABI_V4 && flag_pic == 1)
10812 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
9ebbca7d
GK
10813 {
10814 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10815 GEN_INT (info->gp_save_offset
10816 + sp_offset
10817 + reg_size * i));
10818 rtx mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0 10819
a3170dc6
AH
10820 /* Restore 64-bit quantities for SPE. */
10821 if (TARGET_SPE_ABI)
10822 {
10823 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
10824 rtx b;
10825
10826 if (!SPE_CONST_OFFSET_OK (offset))
10827 {
10828 b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
10829 emit_move_insn (b, GEN_INT (offset));
10830 }
10831 else
10832 b = GEN_INT (offset);
10833
10834 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
10835 mem = gen_rtx_MEM (V2SImode, addr);
10836 }
10837
ba4828e0 10838 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10839
10840 emit_move_insn (gen_rtx_REG (reg_mode,
a3170dc6 10841 info->first_gp_reg_save + i), mem);
9ebbca7d 10842 }
9878760c 10843
9ebbca7d
GK
10844 /* Restore fpr's if we need to do it without calling a function. */
10845 if (restoring_FPRs_inline)
10846 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
10847 if ((regs_ever_live[info->first_fp_reg_save+i]
10848 && ! call_used_regs[info->first_fp_reg_save+i]))
10849 {
10850 rtx addr, mem;
10851 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10852 GEN_INT (info->fp_save_offset
10853 + sp_offset
a4f6c312 10854 + 8 * i));
9ebbca7d 10855 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 10856 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10857
10858 emit_move_insn (gen_rtx_REG (DFmode,
10859 info->first_fp_reg_save + i),
10860 mem);
10861 }
8d30c4ee 10862
9ebbca7d
GK
10863 /* If we saved cr, restore it here. Just those that were used. */
10864 if (info->cr_save_p)
979721f8 10865 {
9ebbca7d 10866 rtx r12_rtx = gen_rtx_REG (SImode, 12);
e35b9579 10867 int count = 0;
9ebbca7d
GK
10868
10869 if (using_mfcr_multiple)
979721f8 10870 {
9ebbca7d
GK
10871 for (i = 0; i < 8; i++)
10872 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
e35b9579 10873 count++;
9ebbca7d 10874 if (count == 0)
e35b9579
GK
10875 abort ();
10876 }
10877
10878 if (using_mfcr_multiple && count > 1)
10879 {
10880 rtvec p;
10881 int ndx;
9ebbca7d 10882
e35b9579 10883 p = rtvec_alloc (count);
9ebbca7d 10884
e35b9579 10885 ndx = 0;
9ebbca7d
GK
10886 for (i = 0; i < 8; i++)
10887 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
10888 {
10889 rtvec r = rtvec_alloc (2);
10890 RTVEC_ELT (r, 0) = r12_rtx;
10891 RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
e35b9579 10892 RTVEC_ELT (p, ndx) =
9ebbca7d
GK
10893 gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
10894 gen_rtx_UNSPEC (CCmode, r, 20));
e35b9579 10895 ndx++;
9ebbca7d
GK
10896 }
10897 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
e35b9579
GK
10898 if (ndx != count)
10899 abort ();
979721f8
MM
10900 }
10901 else
9ebbca7d
GK
10902 for (i = 0; i < 8; i++)
10903 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
979721f8 10904 {
9ebbca7d
GK
10905 emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
10906 CR0_REGNO+i),
10907 r12_rtx));
979721f8 10908 }
979721f8
MM
10909 }
10910
9ebbca7d
GK
10911 /* If this is V.4, unwind the stack pointer after all of the loads
10912 have been done. We need to emit a block here so that sched
10913 doesn't decide to move the sp change before the register restores
10914 (which may not have any obvious dependency on the stack). This
10915 doesn't hurt performance, because there is no scheduling that can
10916 be done after this point. */
f607bc57 10917 if (DEFAULT_ABI == ABI_V4)
b6c9286a 10918 {
9ebbca7d
GK
10919 if (frame_reg_rtx != sp_reg_rtx)
10920 rs6000_emit_stack_tie ();
b6c9286a 10921
9ebbca7d 10922 if (use_backchain_to_restore_sp)
b6c9286a 10923 {
9ebbca7d 10924 emit_move_insn (sp_reg_rtx, frame_reg_rtx);
b6c9286a 10925 }
9ebbca7d 10926 else if (sp_offset != 0)
13f1623b 10927 {
9ebbca7d
GK
10928 emit_insn (Pmode == SImode
10929 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
10930 GEN_INT (sp_offset))
10931 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
10932 GEN_INT (sp_offset)));
13f1623b 10933 }
9ebbca7d 10934 }
b6c9286a 10935
83720594
RH
10936 if (current_function_calls_eh_return)
10937 {
10938 rtx sa = EH_RETURN_STACKADJ_RTX;
10939 emit_insn (Pmode == SImode
10940 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx, sa)
10941 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx, sa));
10942 }
10943
9ebbca7d
GK
10944 if (!sibcall)
10945 {
10946 rtvec p;
10947 if (! restoring_FPRs_inline)
10948 p = rtvec_alloc (3 + 64 - info->first_fp_reg_save);
10949 else
10950 p = rtvec_alloc (2);
b6c9286a 10951
e35b9579
GK
10952 RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
10953 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
9ebbca7d
GK
10954 gen_rtx_REG (Pmode,
10955 LINK_REGISTER_REGNUM));
9ebbca7d
GK
10956
10957 /* If we have to restore more than two FP registers, branch to the
10958 restore function. It will return to our caller. */
10959 if (! restoring_FPRs_inline)
10960 {
10961 int i;
10962 char rname[30];
520a57c8 10963 const char *alloc_rname;
979721f8 10964
9ebbca7d
GK
10965 sprintf (rname, "%s%d%s", RESTORE_FP_PREFIX,
10966 info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX);
a8a05998 10967 alloc_rname = ggc_strdup (rname);
9ebbca7d
GK
10968 RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode,
10969 gen_rtx_SYMBOL_REF (Pmode,
10970 alloc_rname));
b6c9286a 10971
9ebbca7d
GK
10972 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
10973 {
10974 rtx addr, mem;
10975 addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
10976 GEN_INT (info->fp_save_offset + 8*i));
10977 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 10978 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10979
10980 RTVEC_ELT (p, i+3) =
10981 gen_rtx_SET (VOIDmode,
10982 gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
10983 mem);
b6c9286a
MM
10984 }
10985 }
9ebbca7d
GK
10986
10987 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
3daf36a4 10988 }
9878760c
RK
10989}
10990
10991/* Write function epilogue. */
10992
08c148a8
NB
10993static void
10994rs6000_output_function_epilogue (file, size)
9878760c 10995 FILE *file;
08c148a8 10996 HOST_WIDE_INT size ATTRIBUTE_UNUSED;
9878760c 10997{
4697a36c 10998 rs6000_stack_t *info = rs6000_stack_info ();
9878760c 10999
9ebbca7d 11000 if (! HAVE_epilogue)
9878760c 11001 {
9ebbca7d
GK
11002 rtx insn = get_last_insn ();
11003 /* If the last insn was a BARRIER, we don't have to write anything except
11004 the trace table. */
11005 if (GET_CODE (insn) == NOTE)
11006 insn = prev_nonnote_insn (insn);
11007 if (insn == 0 || GET_CODE (insn) != BARRIER)
4697a36c 11008 {
9ebbca7d
GK
11009 /* This is slightly ugly, but at least we don't have two
11010 copies of the epilogue-emitting code. */
11011 start_sequence ();
11012
11013 /* A NOTE_INSN_DELETED is supposed to be at the start
11014 and end of the "toplevel" insn chain. */
11015 emit_note (0, NOTE_INSN_DELETED);
11016 rs6000_emit_epilogue (FALSE);
11017 emit_note (0, NOTE_INSN_DELETED);
11018
178c3eff
DJ
11019 /* Expand INSN_ADDRESSES so final() doesn't crash. */
11020 {
11021 rtx insn;
11022 unsigned addr = 0;
11023 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
11024 {
11025 INSN_ADDRESSES_NEW (insn, addr);
11026 addr += 4;
11027 }
11028 }
11029
9ebbca7d 11030 if (TARGET_DEBUG_STACK)
a4f6c312
SS
11031 debug_rtx_list (get_insns (), 100);
11032 final (get_insns (), file, FALSE, FALSE);
9ebbca7d 11033 end_sequence ();
4697a36c 11034 }
9878760c 11035 }
b4ac57ab 11036
9b30bae2 11037 /* Output a traceback table here. See /usr/include/sys/debug.h for info
314fc5a9
ILT
11038 on its format.
11039
11040 We don't output a traceback table if -finhibit-size-directive was
11041 used. The documentation for -finhibit-size-directive reads
11042 ``don't output a @code{.size} assembler directive, or anything
11043 else that would cause trouble if the function is split in the
11044 middle, and the two halves are placed at locations far apart in
11045 memory.'' The traceback table has this property, since it
11046 includes the offset from the start of the function to the
4d30c363
MM
11047 traceback table itself.
11048
11049 System V.4 Powerpc's (and the embedded ABI derived from it) use a
b6c9286a 11050 different traceback table. */
57ac7be9
AM
11051 if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
11052 && rs6000_traceback != traceback_none)
9b30bae2 11053 {
3cce094d 11054 const char *fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
3ac88239 11055 const char *language_string = lang_hooks.name;
6041bf2f 11056 int fixed_parms = 0, float_parms = 0, parm_info = 0;
314fc5a9 11057 int i;
57ac7be9
AM
11058 int optional_tbtab;
11059
11060 if (rs6000_traceback == traceback_full)
11061 optional_tbtab = 1;
11062 else if (rs6000_traceback == traceback_part)
11063 optional_tbtab = 0;
11064 else
11065 optional_tbtab = !optimize_size && !TARGET_ELF;
314fc5a9 11066
b6c9286a
MM
11067 while (*fname == '.') /* V.4 encodes . in the name */
11068 fname++;
11069
314fc5a9
ILT
11070 /* Need label immediately before tbtab, so we can compute its offset
11071 from the function start. */
11072 if (*fname == '*')
11073 ++fname;
11074 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
11075 ASM_OUTPUT_LABEL (file, fname);
11076
11077 /* The .tbtab pseudo-op can only be used for the first eight
11078 expressions, since it can't handle the possibly variable
11079 length fields that follow. However, if you omit the optional
11080 fields, the assembler outputs zeros for all optional fields
11081 anyways, giving each variable length field is minimum length
11082 (as defined in sys/debug.h). Thus we can not use the .tbtab
11083 pseudo-op at all. */
11084
11085 /* An all-zero word flags the start of the tbtab, for debuggers
11086 that have to find it by searching forward from the entry
11087 point or from the current pc. */
19d2d16f 11088 fputs ("\t.long 0\n", file);
314fc5a9
ILT
11089
11090 /* Tbtab format type. Use format type 0. */
19d2d16f 11091 fputs ("\t.byte 0,", file);
314fc5a9
ILT
11092
11093 /* Language type. Unfortunately, there doesn't seem to be any
11094 official way to get this info, so we use language_string. C
11095 is 0. C++ is 9. No number defined for Obj-C, so use the
9517ead8 11096 value for C for now. There is no official value for Java,
6f573ff9 11097 although IBM appears to be using 13. There is no official value
f710504c 11098 for Chill, so we've chosen 44 pseudo-randomly. */
314fc5a9 11099 if (! strcmp (language_string, "GNU C")
e2c953b6 11100 || ! strcmp (language_string, "GNU Objective-C"))
314fc5a9
ILT
11101 i = 0;
11102 else if (! strcmp (language_string, "GNU F77"))
11103 i = 1;
11104 else if (! strcmp (language_string, "GNU Ada"))
11105 i = 3;
8b83775b 11106 else if (! strcmp (language_string, "GNU Pascal"))
314fc5a9
ILT
11107 i = 2;
11108 else if (! strcmp (language_string, "GNU C++"))
11109 i = 9;
9517ead8
AG
11110 else if (! strcmp (language_string, "GNU Java"))
11111 i = 13;
6f573ff9
JL
11112 else if (! strcmp (language_string, "GNU CHILL"))
11113 i = 44;
314fc5a9
ILT
11114 else
11115 abort ();
11116 fprintf (file, "%d,", i);
11117
11118 /* 8 single bit fields: global linkage (not set for C extern linkage,
11119 apparently a PL/I convention?), out-of-line epilogue/prologue, offset
11120 from start of procedure stored in tbtab, internal function, function
11121 has controlled storage, function has no toc, function uses fp,
11122 function logs/aborts fp operations. */
11123 /* Assume that fp operations are used if any fp reg must be saved. */
6041bf2f
DE
11124 fprintf (file, "%d,",
11125 (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
314fc5a9
ILT
11126
11127 /* 6 bitfields: function is interrupt handler, name present in
11128 proc table, function calls alloca, on condition directives
11129 (controls stack walks, 3 bits), saves condition reg, saves
11130 link reg. */
11131 /* The `function calls alloca' bit seems to be set whenever reg 31 is
11132 set up as a frame pointer, even when there is no alloca call. */
11133 fprintf (file, "%d,",
6041bf2f
DE
11134 ((optional_tbtab << 6)
11135 | ((optional_tbtab & frame_pointer_needed) << 5)
11136 | (info->cr_save_p << 1)
11137 | (info->lr_save_p)));
314fc5a9 11138
6041bf2f 11139 /* 3 bitfields: saves backchain, fixup code, number of fpr saved
314fc5a9
ILT
11140 (6 bits). */
11141 fprintf (file, "%d,",
4697a36c 11142 (info->push_p << 7) | (64 - info->first_fp_reg_save));
314fc5a9
ILT
11143
11144 /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits). */
11145 fprintf (file, "%d,", (32 - first_reg_to_save ()));
11146
6041bf2f
DE
11147 if (optional_tbtab)
11148 {
11149 /* Compute the parameter info from the function decl argument
11150 list. */
11151 tree decl;
11152 int next_parm_info_bit = 31;
314fc5a9 11153
6041bf2f
DE
11154 for (decl = DECL_ARGUMENTS (current_function_decl);
11155 decl; decl = TREE_CHAIN (decl))
11156 {
11157 rtx parameter = DECL_INCOMING_RTL (decl);
11158 enum machine_mode mode = GET_MODE (parameter);
314fc5a9 11159
6041bf2f
DE
11160 if (GET_CODE (parameter) == REG)
11161 {
11162 if (GET_MODE_CLASS (mode) == MODE_FLOAT)
11163 {
11164 int bits;
11165
11166 float_parms++;
11167
11168 if (mode == SFmode)
11169 bits = 0x2;
11170 else if (mode == DFmode)
11171 bits = 0x3;
11172 else
11173 abort ();
11174
11175 /* If only one bit will fit, don't or in this entry. */
11176 if (next_parm_info_bit > 0)
11177 parm_info |= (bits << (next_parm_info_bit - 1));
11178 next_parm_info_bit -= 2;
11179 }
11180 else
11181 {
11182 fixed_parms += ((GET_MODE_SIZE (mode)
11183 + (UNITS_PER_WORD - 1))
11184 / UNITS_PER_WORD);
11185 next_parm_info_bit -= 1;
11186 }
11187 }
11188 }
11189 }
314fc5a9
ILT
11190
11191 /* Number of fixed point parameters. */
11192 /* This is actually the number of words of fixed point parameters; thus
11193 an 8 byte struct counts as 2; and thus the maximum value is 8. */
11194 fprintf (file, "%d,", fixed_parms);
11195
11196 /* 2 bitfields: number of floating point parameters (7 bits), parameters
11197 all on stack. */
11198 /* This is actually the number of fp registers that hold parameters;
11199 and thus the maximum value is 13. */
11200 /* Set parameters on stack bit if parameters are not in their original
11201 registers, regardless of whether they are on the stack? Xlc
11202 seems to set the bit when not optimizing. */
11203 fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
11204
6041bf2f
DE
11205 if (! optional_tbtab)
11206 return;
11207
314fc5a9
ILT
11208 /* Optional fields follow. Some are variable length. */
11209
11210 /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
11211 11 double float. */
11212 /* There is an entry for each parameter in a register, in the order that
11213 they occur in the parameter list. Any intervening arguments on the
11214 stack are ignored. If the list overflows a long (max possible length
11215 34 bits) then completely leave off all elements that don't fit. */
11216 /* Only emit this long if there was at least one parameter. */
11217 if (fixed_parms || float_parms)
11218 fprintf (file, "\t.long %d\n", parm_info);
11219
11220 /* Offset from start of code to tb table. */
19d2d16f 11221 fputs ("\t.long ", file);
314fc5a9 11222 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
54ee9799
DE
11223#if TARGET_AIX
11224 RS6000_OUTPUT_BASENAME (file, fname);
11225#else
9ebbca7d 11226 assemble_name (file, fname);
54ee9799 11227#endif
19d2d16f 11228 fputs ("-.", file);
54ee9799
DE
11229#if TARGET_AIX
11230 RS6000_OUTPUT_BASENAME (file, fname);
11231#else
9ebbca7d 11232 assemble_name (file, fname);
54ee9799 11233#endif
19d2d16f 11234 putc ('\n', file);
314fc5a9
ILT
11235
11236 /* Interrupt handler mask. */
11237 /* Omit this long, since we never set the interrupt handler bit
11238 above. */
11239
11240 /* Number of CTL (controlled storage) anchors. */
11241 /* Omit this long, since the has_ctl bit is never set above. */
11242
11243 /* Displacement into stack of each CTL anchor. */
11244 /* Omit this list of longs, because there are no CTL anchors. */
11245
11246 /* Length of function name. */
296b8152 11247 fprintf (file, "\t.short %d\n", (int) strlen (fname));
314fc5a9
ILT
11248
11249 /* Function name. */
11250 assemble_string (fname, strlen (fname));
11251
11252 /* Register for alloca automatic storage; this is always reg 31.
11253 Only emit this if the alloca bit was set above. */
11254 if (frame_pointer_needed)
19d2d16f 11255 fputs ("\t.byte 31\n", file);
b1765bde
DE
11256
11257 fputs ("\t.align 2\n", file);
9b30bae2 11258 }
9878760c 11259}
17167fd8 11260\f
a4f6c312
SS
11261/* A C compound statement that outputs the assembler code for a thunk
11262 function, used to implement C++ virtual function calls with
11263 multiple inheritance. The thunk acts as a wrapper around a virtual
11264 function, adjusting the implicit object parameter before handing
11265 control off to the real function.
11266
11267 First, emit code to add the integer DELTA to the location that
11268 contains the incoming first argument. Assume that this argument
11269 contains a pointer, and is the one used to pass the `this' pointer
11270 in C++. This is the incoming argument *before* the function
11271 prologue, e.g. `%o0' on a sparc. The addition must preserve the
11272 values of all other incoming arguments.
17167fd8
MM
11273
11274 After the addition, emit code to jump to FUNCTION, which is a
a4f6c312
SS
11275 `FUNCTION_DECL'. This is a direct pure jump, not a call, and does
11276 not touch the return address. Hence returning from FUNCTION will
11277 return to whoever called the current `thunk'.
17167fd8 11278
a4f6c312
SS
11279 The effect must be as if FUNCTION had been called directly with the
11280 adjusted first argument. This macro is responsible for emitting
11281 all of the code for a thunk function; output_function_prologue()
11282 and output_function_epilogue() are not invoked.
17167fd8 11283
a4f6c312
SS
11284 The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already
11285 been extracted from it.) It might possibly be useful on some
11286 targets, but probably not.
17167fd8 11287
a4f6c312
SS
11288 If you do not define this macro, the target-independent code in the
11289 C++ frontend will generate a less efficient heavyweight thunk that
11290 calls FUNCTION instead of jumping to it. The generic approach does
11291 not support varargs. */
17167fd8
MM
11292
11293void
11294output_mi_thunk (file, thunk_fndecl, delta, function)
11295 FILE *file;
d330fd93 11296 tree thunk_fndecl ATTRIBUTE_UNUSED;
17167fd8
MM
11297 int delta;
11298 tree function;
11299{
a4f6c312
SS
11300 const char *this_reg =
11301 reg_names[ aggregate_value_p (TREE_TYPE (TREE_TYPE (function))) ? 4 : 3 ];
d330fd93 11302 const char *prefix;
3cce094d 11303 const char *fname;
d330fd93 11304 const char *r0 = reg_names[0];
d330fd93
KG
11305 const char *toc = reg_names[2];
11306 const char *schain = reg_names[11];
11307 const char *r12 = reg_names[12];
17167fd8
MM
11308 char buf[512];
11309 static int labelno = 0;
11310
a4f6c312 11311 /* Small constants that can be done by one add instruction. */
17167fd8
MM
11312 if (delta >= -32768 && delta <= 32767)
11313 {
22b4a3b0 11314 if (! TARGET_NEW_MNEMONICS)
17167fd8
MM
11315 fprintf (file, "\tcal %s,%d(%s)\n", this_reg, delta, this_reg);
11316 else
11317 fprintf (file, "\taddi %s,%s,%d\n", this_reg, this_reg, delta);
11318 }
11319
56a7189a
AM
11320 /* 64-bit constants. If "int" is 32 bits, we'll never hit this abort. */
11321 else if (TARGET_64BIT && (delta < -2147483647 - 1 || delta > 2147483647))
11322 abort ();
11323
a4f6c312 11324 /* Large constants that can be done by one addis instruction. */
56a7189a 11325 else if ((delta & 0xffff) == 0)
17167fd8
MM
11326 asm_fprintf (file, "\t{cau|addis} %s,%s,%d\n", this_reg, this_reg,
11327 delta >> 16);
11328
11329 /* 32-bit constants that can be done by an add and addis instruction. */
56a7189a 11330 else
17167fd8 11331 {
a4f6c312
SS
11332 /* Break into two pieces, propagating the sign bit from the low
11333 word to the upper word. */
56a7189a
AM
11334 int delta_low = ((delta & 0xffff) ^ 0x8000) - 0x8000;
11335 int delta_high = (delta - delta_low) >> 16;
17167fd8
MM
11336
11337 asm_fprintf (file, "\t{cau|addis} %s,%s,%d\n", this_reg, this_reg,
11338 delta_high);
11339
22b4a3b0 11340 if (! TARGET_NEW_MNEMONICS)
17167fd8
MM
11341 fprintf (file, "\tcal %s,%d(%s)\n", this_reg, delta_low, this_reg);
11342 else
11343 fprintf (file, "\taddi %s,%s,%d\n", this_reg, this_reg, delta_low);
11344 }
11345
17167fd8
MM
11346 /* Get the prefix in front of the names. */
11347 switch (DEFAULT_ABI)
11348 {
11349 default:
11350 abort ();
11351
11352 case ABI_AIX:
11353 prefix = ".";
11354 break;
11355
11356 case ABI_V4:
11357 case ABI_AIX_NODESC:
17167fd8
MM
11358 prefix = "";
11359 break;
17167fd8
MM
11360 }
11361
11362 /* If the function is compiled in this module, jump to it directly.
11363 Otherwise, load up its address and jump to it. */
11364
11365 fname = XSTR (XEXP (DECL_RTL (function), 0), 0);
42820a49 11366
9ebbca7d 11367 if (current_file_function_operand (XEXP (DECL_RTL (function), 0), VOIDmode)
a5c76ee6
ZW
11368 && (! lookup_attribute ("longcall",
11369 TYPE_ATTRIBUTES (TREE_TYPE (function)))
11370 || lookup_attribute ("shortcall",
11371 TYPE_ATTRIBUTES (TREE_TYPE (function)))))
11372
17167fd8
MM
11373 {
11374 fprintf (file, "\tb %s", prefix);
11375 assemble_name (file, fname);
22b4a3b0 11376 if (DEFAULT_ABI == ABI_V4 && flag_pic) fputs ("@local", file);
949ea356 11377 putc ('\n', file);
17167fd8
MM
11378 }
11379
11380 else
11381 {
11382 switch (DEFAULT_ABI)
11383 {
11384 default:
17167fd8
MM
11385 abort ();
11386
11387 case ABI_AIX:
11388 /* Set up a TOC entry for the function. */
11389 ASM_GENERATE_INTERNAL_LABEL (buf, "Lthunk", labelno);
11390 toc_section ();
11391 ASM_OUTPUT_INTERNAL_LABEL (file, "Lthunk", labelno);
11392 labelno++;
11393
fa9b5c6b
DE
11394 if (TARGET_MINIMAL_TOC)
11395 fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
11396 else
11397 {
11398 fputs ("\t.tc ", file);
11399 assemble_name (file, fname);
11400 fputs ("[TC],", file);
11401 }
11402 assemble_name (file, fname);
17167fd8 11403 putc ('\n', file);
b4d330e1
DE
11404 if (TARGET_ELF)
11405 function_section (current_function_decl);
11406 else
11407 text_section();
468e8dba
DE
11408 if (TARGET_MINIMAL_TOC)
11409 asm_fprintf (file, (TARGET_32BIT)
11410 ? "\t{l|lwz} %s,%s(%s)\n" : "\tld %s,%s(%s)\n", r12,
11411 TARGET_ELF ? ".LCTOC0@toc" : ".LCTOC..1", toc);
d2574c50 11412 asm_fprintf (file, (TARGET_32BIT) ? "\t{l|lwz} %s," : "\tld %s,", r12);
17167fd8 11413 assemble_name (file, buf);
468e8dba
DE
11414 if (TARGET_ELF && TARGET_MINIMAL_TOC)
11415 fputs ("-(.LCTOC1)", file);
11416 asm_fprintf (file, "(%s)\n", TARGET_MINIMAL_TOC ? r12 : toc);
17167fd8
MM
11417 asm_fprintf (file,
11418 (TARGET_32BIT) ? "\t{l|lwz} %s,0(%s)\n" : "\tld %s,0(%s)\n",
11419 r0, r12);
11420
11421 asm_fprintf (file,
11422 (TARGET_32BIT) ? "\t{l|lwz} %s,4(%s)\n" : "\tld %s,8(%s)\n",
11423 toc, r12);
11424
11425 asm_fprintf (file, "\tmtctr %s\n", r0);
11426 asm_fprintf (file,
11427 (TARGET_32BIT) ? "\t{l|lwz} %s,8(%s)\n" : "\tld %s,16(%s)\n",
11428 schain, r12);
11429
11430 asm_fprintf (file, "\tbctr\n");
11431 break;
11432
9ebbca7d 11433 case ABI_AIX_NODESC:
17167fd8 11434 case ABI_V4:
22b4a3b0
FS
11435 fprintf (file, "\tb %s", prefix);
11436 assemble_name (file, fname);
11437 if (flag_pic) fputs ("@plt", file);
949ea356 11438 putc ('\n', file);
22b4a3b0 11439 break;
ee890fe2
SS
11440
11441#if TARGET_MACHO
11442 case ABI_DARWIN:
11443 fprintf (file, "\tb %s", prefix);
11444 if (flag_pic && !machopic_name_defined_p (fname))
11445 assemble_name (file, machopic_stub_name (fname));
11446 else
11447 assemble_name (file, fname);
11448 putc ('\n', file);
11449 break;
11450#endif
9ebbca7d
GK
11451 }
11452 }
11453}
42820a49 11454
9ebbca7d
GK
11455\f
11456/* A quick summary of the various types of 'constant-pool tables'
11457 under PowerPC:
11458
11459 Target Flags Name One table per
11460 AIX (none) AIX TOC object file
11461 AIX -mfull-toc AIX TOC object file
11462 AIX -mminimal-toc AIX minimal TOC translation unit
11463 SVR4/EABI (none) SVR4 SDATA object file
11464 SVR4/EABI -fpic SVR4 pic object file
11465 SVR4/EABI -fPIC SVR4 PIC translation unit
11466 SVR4/EABI -mrelocatable EABI TOC function
11467 SVR4/EABI -maix AIX TOC object file
11468 SVR4/EABI -maix -mminimal-toc
11469 AIX minimal TOC translation unit
11470
11471 Name Reg. Set by entries contains:
11472 made by addrs? fp? sum?
11473
11474 AIX TOC 2 crt0 as Y option option
11475 AIX minimal TOC 30 prolog gcc Y Y option
11476 SVR4 SDATA 13 crt0 gcc N Y N
11477 SVR4 pic 30 prolog ld Y not yet N
11478 SVR4 PIC 30 prolog gcc Y option option
11479 EABI TOC 30 prolog gcc Y option option
11480
11481*/
11482
11483/* Hash table stuff for keeping track of TOC entries. */
11484
11485struct toc_hash_struct
11486{
11487 /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
11488 ASM_OUTPUT_SPECIAL_POOL_ENTRY_P. */
11489 rtx key;
a9098fd0 11490 enum machine_mode key_mode;
9ebbca7d
GK
11491 int labelno;
11492};
17167fd8 11493
9ebbca7d
GK
11494static htab_t toc_hash_table;
11495
11496/* Hash functions for the hash table. */
11497
11498static unsigned
11499rs6000_hash_constant (k)
11500 rtx k;
11501{
a9098fd0 11502 unsigned result = (GET_CODE (k) << 3) ^ GET_MODE (k);
9ebbca7d
GK
11503 const char *format = GET_RTX_FORMAT (GET_CODE (k));
11504 int flen = strlen (format);
11505 int fidx;
11506
11507 if (GET_CODE (k) == LABEL_REF)
b3a646eb 11508 return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
9ebbca7d 11509
5692c7bc 11510 if (GET_CODE (k) == CODE_LABEL)
9ebbca7d
GK
11511 fidx = 3;
11512 else
11513 fidx = 0;
11514
11515 for (; fidx < flen; fidx++)
11516 switch (format[fidx])
11517 {
11518 case 's':
11519 {
11520 unsigned i, len;
11521 const char *str = XSTR (k, fidx);
11522 len = strlen (str);
11523 result = result * 613 + len;
11524 for (i = 0; i < len; i++)
11525 result = result * 613 + (unsigned) str[i];
17167fd8
MM
11526 break;
11527 }
9ebbca7d
GK
11528 case 'u':
11529 case 'e':
11530 result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
11531 break;
11532 case 'i':
11533 case 'n':
11534 result = result * 613 + (unsigned) XINT (k, fidx);
11535 break;
11536 case 'w':
11537 if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
11538 result = result * 613 + (unsigned) XWINT (k, fidx);
11539 else
11540 {
11541 size_t i;
11542 for (i = 0; i < sizeof(HOST_WIDE_INT)/sizeof(unsigned); i++)
11543 result = result * 613 + (unsigned) (XWINT (k, fidx)
11544 >> CHAR_BIT * i);
11545 }
11546 break;
11547 default:
a4f6c312 11548 abort ();
9ebbca7d
GK
11549 }
11550 return result;
11551}
11552
11553static unsigned
11554toc_hash_function (hash_entry)
11555 const void * hash_entry;
11556{
a9098fd0
GK
11557 const struct toc_hash_struct *thc =
11558 (const struct toc_hash_struct *) hash_entry;
11559 return rs6000_hash_constant (thc->key) ^ thc->key_mode;
9ebbca7d
GK
11560}
11561
11562/* Compare H1 and H2 for equivalence. */
11563
11564static int
11565toc_hash_eq (h1, h2)
11566 const void * h1;
11567 const void * h2;
11568{
11569 rtx r1 = ((const struct toc_hash_struct *) h1)->key;
11570 rtx r2 = ((const struct toc_hash_struct *) h2)->key;
11571
a9098fd0
GK
11572 if (((const struct toc_hash_struct *) h1)->key_mode
11573 != ((const struct toc_hash_struct *) h2)->key_mode)
11574 return 0;
11575
5692c7bc 11576 return rtx_equal_p (r1, r2);
9ebbca7d
GK
11577}
11578
11579/* Mark the hash table-entry HASH_ENTRY. */
11580
11581static int
11582toc_hash_mark_entry (hash_slot, unused)
2eba1afa 11583 void ** hash_slot;
9ebbca7d
GK
11584 void * unused ATTRIBUTE_UNUSED;
11585{
11586 const struct toc_hash_struct * hash_entry =
11587 *(const struct toc_hash_struct **) hash_slot;
11588 rtx r = hash_entry->key;
11589 ggc_set_mark (hash_entry);
a4f6c312 11590 /* For CODE_LABELS, we don't want to drag in the whole insn chain... */
9ebbca7d
GK
11591 if (GET_CODE (r) == LABEL_REF)
11592 {
11593 ggc_set_mark (r);
11594 ggc_set_mark (XEXP (r, 0));
11595 }
11596 else
11597 ggc_mark_rtx (r);
11598 return 1;
11599}
11600
11601/* Mark all the elements of the TOC hash-table *HT. */
11602
11603static void
11604toc_hash_mark_table (vht)
11605 void *vht;
11606{
11607 htab_t *ht = vht;
11608
11609 htab_traverse (*ht, toc_hash_mark_entry, (void *)0);
17167fd8
MM
11610}
11611
28e510bd
MM
11612/* These are the names given by the C++ front-end to vtables, and
11613 vtable-like objects. Ideally, this logic should not be here;
11614 instead, there should be some programmatic way of inquiring as
11615 to whether or not an object is a vtable. */
11616
11617#define VTABLE_NAME_P(NAME) \
11618 (strncmp ("_vt.", name, strlen("_vt.")) == 0 \
11619 || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0 \
11620 || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0 \
11621 || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
11622
11623void
11624rs6000_output_symbol_ref (file, x)
11625 FILE *file;
11626 rtx x;
11627{
11628 /* Currently C++ toc references to vtables can be emitted before it
11629 is decided whether the vtable is public or private. If this is
11630 the case, then the linker will eventually complain that there is
11631 a reference to an unknown section. Thus, for vtables only,
11632 we emit the TOC reference to reference the symbol and not the
11633 section. */
11634 const char *name = XSTR (x, 0);
54ee9799
DE
11635
11636 if (VTABLE_NAME_P (name))
11637 {
11638 RS6000_OUTPUT_BASENAME (file, name);
11639 }
11640 else
11641 assemble_name (file, name);
28e510bd
MM
11642}
11643
a4f6c312
SS
11644/* Output a TOC entry. We derive the entry name from what is being
11645 written. */
9878760c
RK
11646
11647void
a9098fd0 11648output_toc (file, x, labelno, mode)
9878760c
RK
11649 FILE *file;
11650 rtx x;
11651 int labelno;
a9098fd0 11652 enum machine_mode mode;
9878760c
RK
11653{
11654 char buf[256];
3cce094d 11655 const char *name = buf;
ec940faa 11656 const char *real_name;
9878760c
RK
11657 rtx base = x;
11658 int offset = 0;
11659
4697a36c
MM
11660 if (TARGET_NO_TOC)
11661 abort ();
11662
9ebbca7d
GK
11663 /* When the linker won't eliminate them, don't output duplicate
11664 TOC entries (this happens on AIX if there is any kind of TOC,
1f8f4a0b
MM
11665 and on SVR4 under -fPIC or -mrelocatable). */
11666 if (TARGET_TOC)
9ebbca7d
GK
11667 {
11668 struct toc_hash_struct *h;
11669 void * * found;
11670
11671 h = ggc_alloc (sizeof (*h));
11672 h->key = x;
a9098fd0 11673 h->key_mode = mode;
9ebbca7d
GK
11674 h->labelno = labelno;
11675
11676 found = htab_find_slot (toc_hash_table, h, 1);
11677 if (*found == NULL)
11678 *found = h;
11679 else /* This is indeed a duplicate.
11680 Set this label equal to that label. */
11681 {
11682 fputs ("\t.set ", file);
11683 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
11684 fprintf (file, "%d,", labelno);
11685 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
11686 fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
11687 found)->labelno));
11688 return;
11689 }
11690 }
11691
11692 /* If we're going to put a double constant in the TOC, make sure it's
11693 aligned properly when strict alignment is on. */
ff1720ed
RK
11694 if (GET_CODE (x) == CONST_DOUBLE
11695 && STRICT_ALIGNMENT
a9098fd0 11696 && GET_MODE_BITSIZE (mode) >= 64
ff1720ed
RK
11697 && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
11698 ASM_OUTPUT_ALIGN (file, 3);
11699 }
11700
9ebbca7d 11701 ASM_OUTPUT_INTERNAL_LABEL (file, "LC", labelno);
9878760c 11702
37c37a57
RK
11703 /* Handle FP constants specially. Note that if we have a minimal
11704 TOC, things we put here aren't actually in the TOC, so we can allow
11705 FP constants. */
a9098fd0 11706 if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
9878760c 11707 {
042259f2
DE
11708 REAL_VALUE_TYPE rv;
11709 long k[2];
0adc764e 11710
042259f2
DE
11711 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
11712 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
31bfaa0b 11713
13ded975
DE
11714 if (TARGET_64BIT)
11715 {
11716 if (TARGET_MINIMAL_TOC)
2bfcf297 11717 fputs (DOUBLE_INT_ASM_OP, file);
13ded975 11718 else
2f0552b6
AM
11719 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
11720 k[0] & 0xffffffff, k[1] & 0xffffffff);
11721 fprintf (file, "0x%lx%08lx\n",
11722 k[0] & 0xffffffff, k[1] & 0xffffffff);
13ded975
DE
11723 return;
11724 }
1875cc88 11725 else
13ded975
DE
11726 {
11727 if (TARGET_MINIMAL_TOC)
2bfcf297 11728 fputs ("\t.long ", file);
13ded975 11729 else
2f0552b6
AM
11730 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
11731 k[0] & 0xffffffff, k[1] & 0xffffffff);
11732 fprintf (file, "0x%lx,0x%lx\n",
11733 k[0] & 0xffffffff, k[1] & 0xffffffff);
13ded975
DE
11734 return;
11735 }
9878760c 11736 }
a9098fd0 11737 else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
9878760c 11738 {
042259f2
DE
11739 REAL_VALUE_TYPE rv;
11740 long l;
9878760c 11741
042259f2
DE
11742 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
11743 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
11744
31bfaa0b
DE
11745 if (TARGET_64BIT)
11746 {
11747 if (TARGET_MINIMAL_TOC)
2bfcf297 11748 fputs (DOUBLE_INT_ASM_OP, file);
31bfaa0b 11749 else
2f0552b6
AM
11750 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
11751 fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
31bfaa0b
DE
11752 return;
11753 }
042259f2 11754 else
31bfaa0b
DE
11755 {
11756 if (TARGET_MINIMAL_TOC)
2bfcf297 11757 fputs ("\t.long ", file);
31bfaa0b 11758 else
2f0552b6
AM
11759 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
11760 fprintf (file, "0x%lx\n", l & 0xffffffff);
31bfaa0b
DE
11761 return;
11762 }
042259f2 11763 }
f176e826 11764 else if (GET_MODE (x) == VOIDmode
a9098fd0 11765 && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
042259f2 11766 {
e2c953b6 11767 unsigned HOST_WIDE_INT low;
042259f2
DE
11768 HOST_WIDE_INT high;
11769
11770 if (GET_CODE (x) == CONST_DOUBLE)
11771 {
11772 low = CONST_DOUBLE_LOW (x);
11773 high = CONST_DOUBLE_HIGH (x);
11774 }
11775 else
11776#if HOST_BITS_PER_WIDE_INT == 32
11777 {
11778 low = INTVAL (x);
0858c623 11779 high = (low & 0x80000000) ? ~0 : 0;
042259f2
DE
11780 }
11781#else
11782 {
0858c623 11783 low = INTVAL (x) & 0xffffffff;
042259f2
DE
11784 high = (HOST_WIDE_INT) INTVAL (x) >> 32;
11785 }
11786#endif
9878760c 11787
a9098fd0
GK
11788 /* TOC entries are always Pmode-sized, but since this
11789 is a bigendian machine then if we're putting smaller
11790 integer constants in the TOC we have to pad them.
11791 (This is still a win over putting the constants in
11792 a separate constant pool, because then we'd have
02a4ec28
FS
11793 to have both a TOC entry _and_ the actual constant.)
11794
11795 For a 32-bit target, CONST_INT values are loaded and shifted
11796 entirely within `low' and can be stored in one TOC entry. */
11797
11798 if (TARGET_64BIT && POINTER_SIZE < GET_MODE_BITSIZE (mode))
a9098fd0 11799 abort ();/* It would be easy to make this work, but it doesn't now. */
02a4ec28
FS
11800
11801 if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
fb52d8de
AM
11802 {
11803#if HOST_BITS_PER_WIDE_INT == 32
11804 lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
11805 POINTER_SIZE, &low, &high, 0);
11806#else
11807 low |= high << 32;
11808 low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
11809 high = (HOST_WIDE_INT) low >> 32;
11810 low &= 0xffffffff;
11811#endif
11812 }
a9098fd0 11813
13ded975
DE
11814 if (TARGET_64BIT)
11815 {
11816 if (TARGET_MINIMAL_TOC)
2bfcf297 11817 fputs (DOUBLE_INT_ASM_OP, file);
13ded975 11818 else
2f0552b6
AM
11819 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
11820 (long) high & 0xffffffff, (long) low & 0xffffffff);
11821 fprintf (file, "0x%lx%08lx\n",
11822 (long) high & 0xffffffff, (long) low & 0xffffffff);
13ded975
DE
11823 return;
11824 }
1875cc88 11825 else
13ded975 11826 {
02a4ec28
FS
11827 if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
11828 {
11829 if (TARGET_MINIMAL_TOC)
2bfcf297 11830 fputs ("\t.long ", file);
02a4ec28 11831 else
2bfcf297 11832 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
2f0552b6
AM
11833 (long) high & 0xffffffff, (long) low & 0xffffffff);
11834 fprintf (file, "0x%lx,0x%lx\n",
11835 (long) high & 0xffffffff, (long) low & 0xffffffff);
02a4ec28 11836 }
13ded975 11837 else
02a4ec28
FS
11838 {
11839 if (TARGET_MINIMAL_TOC)
2bfcf297 11840 fputs ("\t.long ", file);
02a4ec28 11841 else
2f0552b6
AM
11842 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
11843 fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
02a4ec28 11844 }
13ded975
DE
11845 return;
11846 }
9878760c
RK
11847 }
11848
11849 if (GET_CODE (x) == CONST)
11850 {
2bfcf297
DB
11851 if (GET_CODE (XEXP (x, 0)) != PLUS)
11852 abort ();
11853
9878760c
RK
11854 base = XEXP (XEXP (x, 0), 0);
11855 offset = INTVAL (XEXP (XEXP (x, 0), 1));
11856 }
11857
11858 if (GET_CODE (base) == SYMBOL_REF)
11859 name = XSTR (base, 0);
11860 else if (GET_CODE (base) == LABEL_REF)
11861 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (XEXP (base, 0)));
11862 else if (GET_CODE (base) == CODE_LABEL)
11863 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
11864 else
11865 abort ();
11866
772c5265 11867 real_name = (*targetm.strip_name_encoding) (name);
1875cc88 11868 if (TARGET_MINIMAL_TOC)
2bfcf297 11869 fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
1875cc88
JW
11870 else
11871 {
b6c9286a 11872 fprintf (file, "\t.tc %s", real_name);
9878760c 11873
1875cc88
JW
11874 if (offset < 0)
11875 fprintf (file, ".N%d", - offset);
11876 else if (offset)
11877 fprintf (file, ".P%d", offset);
9878760c 11878
19d2d16f 11879 fputs ("[TC],", file);
1875cc88 11880 }
581bc4de
MM
11881
11882 /* Currently C++ toc references to vtables can be emitted before it
11883 is decided whether the vtable is public or private. If this is
11884 the case, then the linker will eventually complain that there is
11885 a TOC reference to an unknown section. Thus, for vtables only,
11886 we emit the TOC reference to reference the symbol and not the
11887 section. */
28e510bd 11888 if (VTABLE_NAME_P (name))
581bc4de 11889 {
54ee9799 11890 RS6000_OUTPUT_BASENAME (file, name);
581bc4de
MM
11891 if (offset < 0)
11892 fprintf (file, "%d", offset);
11893 else if (offset > 0)
11894 fprintf (file, "+%d", offset);
11895 }
11896 else
11897 output_addr_const (file, x);
19d2d16f 11898 putc ('\n', file);
9878760c
RK
11899}
11900\f
11901/* Output an assembler pseudo-op to write an ASCII string of N characters
11902 starting at P to FILE.
11903
11904 On the RS/6000, we have to do this using the .byte operation and
11905 write out special characters outside the quoted string.
11906 Also, the assembler is broken; very long strings are truncated,
a4f6c312 11907 so we must artificially break them up early. */
9878760c
RK
11908
11909void
11910output_ascii (file, p, n)
11911 FILE *file;
d330fd93 11912 const char *p;
9878760c
RK
11913 int n;
11914{
11915 char c;
11916 int i, count_string;
d330fd93
KG
11917 const char *for_string = "\t.byte \"";
11918 const char *for_decimal = "\t.byte ";
11919 const char *to_close = NULL;
9878760c
RK
11920
11921 count_string = 0;
11922 for (i = 0; i < n; i++)
11923 {
11924 c = *p++;
11925 if (c >= ' ' && c < 0177)
11926 {
11927 if (for_string)
11928 fputs (for_string, file);
11929 putc (c, file);
11930
11931 /* Write two quotes to get one. */
11932 if (c == '"')
11933 {
11934 putc (c, file);
11935 ++count_string;
11936 }
11937
11938 for_string = NULL;
11939 for_decimal = "\"\n\t.byte ";
11940 to_close = "\"\n";
11941 ++count_string;
11942
11943 if (count_string >= 512)
11944 {
11945 fputs (to_close, file);
11946
11947 for_string = "\t.byte \"";
11948 for_decimal = "\t.byte ";
11949 to_close = NULL;
11950 count_string = 0;
11951 }
11952 }
11953 else
11954 {
11955 if (for_decimal)
11956 fputs (for_decimal, file);
11957 fprintf (file, "%d", c);
11958
11959 for_string = "\n\t.byte \"";
11960 for_decimal = ", ";
11961 to_close = "\n";
11962 count_string = 0;
11963 }
11964 }
11965
11966 /* Now close the string if we have written one. Then end the line. */
11967 if (to_close)
9ebbca7d 11968 fputs (to_close, file);
9878760c
RK
11969}
11970\f
11971/* Generate a unique section name for FILENAME for a section type
11972 represented by SECTION_DESC. Output goes into BUF.
11973
11974 SECTION_DESC can be any string, as long as it is different for each
11975 possible section type.
11976
11977 We name the section in the same manner as xlc. The name begins with an
11978 underscore followed by the filename (after stripping any leading directory
11e5fe42
RK
11979 names) with the last period replaced by the string SECTION_DESC. If
11980 FILENAME does not contain a period, SECTION_DESC is appended to the end of
11981 the name. */
9878760c
RK
11982
11983void
11984rs6000_gen_section_name (buf, filename, section_desc)
11985 char **buf;
9ebbca7d
GK
11986 const char *filename;
11987 const char *section_desc;
9878760c 11988{
9ebbca7d 11989 const char *q, *after_last_slash, *last_period = 0;
9878760c
RK
11990 char *p;
11991 int len;
9878760c
RK
11992
11993 after_last_slash = filename;
11994 for (q = filename; *q; q++)
11e5fe42
RK
11995 {
11996 if (*q == '/')
11997 after_last_slash = q + 1;
11998 else if (*q == '.')
11999 last_period = q;
12000 }
9878760c 12001
11e5fe42 12002 len = strlen (after_last_slash) + strlen (section_desc) + 2;
6d9f628e 12003 *buf = (char *) xmalloc (len);
9878760c
RK
12004
12005 p = *buf;
12006 *p++ = '_';
12007
12008 for (q = after_last_slash; *q; q++)
12009 {
11e5fe42 12010 if (q == last_period)
9878760c
RK
12011 {
12012 strcpy (p, section_desc);
12013 p += strlen (section_desc);
9878760c
RK
12014 }
12015
e9a780ec 12016 else if (ISALNUM (*q))
9878760c
RK
12017 *p++ = *q;
12018 }
12019
11e5fe42 12020 if (last_period == 0)
9878760c
RK
12021 strcpy (p, section_desc);
12022 else
12023 *p = '\0';
12024}
e165f3f0 12025\f
a4f6c312 12026/* Emit profile function. */
411707f4 12027
411707f4
CC
12028void
12029output_profile_hook (labelno)
57ac7be9 12030 int labelno ATTRIBUTE_UNUSED;
411707f4 12031{
8480e480
CC
12032 if (DEFAULT_ABI == ABI_AIX)
12033 {
57ac7be9
AM
12034#ifdef NO_PROFILE_COUNTERS
12035 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 0);
12036#else
8480e480 12037 char buf[30];
40501e5f 12038 const char *label_name;
8480e480 12039 rtx fun;
411707f4 12040
8480e480 12041 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
772c5265 12042 label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
8480e480 12043 fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
411707f4 12044
8480e480
CC
12045 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 1,
12046 fun, Pmode);
57ac7be9 12047#endif
8480e480 12048 }
ee890fe2
SS
12049 else if (DEFAULT_ABI == ABI_DARWIN)
12050 {
d5fa86ba 12051 const char *mcount_name = RS6000_MCOUNT;
ee890fe2
SS
12052 int caller_addr_regno = LINK_REGISTER_REGNUM;
12053
12054 /* Be conservative and always set this, at least for now. */
12055 current_function_uses_pic_offset_table = 1;
12056
12057#if TARGET_MACHO
12058 /* For PIC code, set up a stub and collect the caller's address
12059 from r0, which is where the prologue puts it. */
12060 if (flag_pic)
12061 {
12062 mcount_name = machopic_stub_name (mcount_name);
12063 if (current_function_uses_pic_offset_table)
12064 caller_addr_regno = 0;
12065 }
12066#endif
12067 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
12068 0, VOIDmode, 1,
12069 gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
12070 }
411707f4
CC
12071}
12072
a4f6c312 12073/* Write function profiler code. */
e165f3f0
RK
12074
12075void
12076output_function_profiler (file, labelno)
12077 FILE *file;
12078 int labelno;
12079{
3daf36a4 12080 char buf[100];
09eeeacb 12081 int save_lr = 8;
e165f3f0 12082
3daf36a4 12083 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
38c1f2d7 12084 switch (DEFAULT_ABI)
3daf36a4 12085 {
38c1f2d7
MM
12086 default:
12087 abort ();
12088
12089 case ABI_V4:
09eeeacb
AM
12090 save_lr = 4;
12091 /* Fall through. */
12092
38c1f2d7 12093 case ABI_AIX_NODESC:
09eeeacb
AM
12094 if (!TARGET_32BIT)
12095 {
12096 warning ("no profiling of 64-bit code for this ABI");
12097 return;
12098 }
38c1f2d7
MM
12099 fprintf (file, "\tmflr %s\n", reg_names[0]);
12100 if (flag_pic == 1)
12101 {
dfdfa60f 12102 fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
09eeeacb
AM
12103 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
12104 reg_names[0], save_lr, reg_names[1]);
17167fd8 12105 asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
dfdfa60f 12106 asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
38c1f2d7 12107 assemble_name (file, buf);
17167fd8 12108 asm_fprintf (file, "@got(%s)\n", reg_names[12]);
38c1f2d7 12109 }
9ebbca7d 12110 else if (flag_pic > 1)
38c1f2d7 12111 {
09eeeacb
AM
12112 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
12113 reg_names[0], save_lr, reg_names[1]);
9ebbca7d
GK
12114 /* Now, we need to get the address of the label. */
12115 fputs ("\tbl 1f\n\t.long ", file);
034e84c4 12116 assemble_name (file, buf);
9ebbca7d
GK
12117 fputs ("-.\n1:", file);
12118 asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
12119 asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
12120 reg_names[0], reg_names[11]);
12121 asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
12122 reg_names[0], reg_names[0], reg_names[11]);
38c1f2d7 12123 }
38c1f2d7
MM
12124 else
12125 {
17167fd8 12126 asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
38c1f2d7 12127 assemble_name (file, buf);
dfdfa60f 12128 fputs ("@ha\n", file);
09eeeacb
AM
12129 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
12130 reg_names[0], save_lr, reg_names[1]);
a260abc9 12131 asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
38c1f2d7 12132 assemble_name (file, buf);
17167fd8 12133 asm_fprintf (file, "@l(%s)\n", reg_names[12]);
38c1f2d7
MM
12134 }
12135
09eeeacb
AM
12136 if (current_function_needs_context && DEFAULT_ABI == ABI_AIX_NODESC)
12137 {
12138 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
12139 reg_names[STATIC_CHAIN_REGNUM],
12140 12, reg_names[1]);
12141 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
12142 asm_fprintf (file, "\t{l|lwz} %s,%d(%s)\n",
12143 reg_names[STATIC_CHAIN_REGNUM],
12144 12, reg_names[1]);
12145 }
12146 else
12147 /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH. */
12148 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
38c1f2d7
MM
12149 break;
12150
12151 case ABI_AIX:
ee890fe2 12152 case ABI_DARWIN:
a4f6c312 12153 /* Don't do anything, done in output_profile_hook (). */
38c1f2d7
MM
12154 break;
12155 }
e165f3f0 12156}
a251ffd0
TG
12157
12158/* Adjust the cost of a scheduling dependency. Return the new cost of
12159 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
12160
c237e94a 12161static int
a06faf84 12162rs6000_adjust_cost (insn, link, dep_insn, cost)
a251ffd0
TG
12163 rtx insn;
12164 rtx link;
296b8152 12165 rtx dep_insn ATTRIBUTE_UNUSED;
a251ffd0
TG
12166 int cost;
12167{
12168 if (! recog_memoized (insn))
12169 return 0;
12170
12171 if (REG_NOTE_KIND (link) != 0)
12172 return 0;
12173
12174 if (REG_NOTE_KIND (link) == 0)
12175 {
ed947a96
DJ
12176 /* Data dependency; DEP_INSN writes a register that INSN reads
12177 some cycles later. */
12178 switch (get_attr_type (insn))
12179 {
12180 case TYPE_JMPREG:
309323c2 12181 /* Tell the first scheduling pass about the latency between
ed947a96
DJ
12182 a mtctr and bctr (and mtlr and br/blr). The first
12183 scheduling pass will not know about this latency since
12184 the mtctr instruction, which has the latency associated
12185 to it, will be generated by reload. */
309323c2 12186 return TARGET_POWER ? 5 : 4;
ed947a96
DJ
12187 case TYPE_BRANCH:
12188 /* Leave some extra cycles between a compare and its
12189 dependent branch, to inhibit expensive mispredicts. */
309323c2
DE
12190 if ((rs6000_cpu_attr == CPU_PPC603
12191 || rs6000_cpu_attr == CPU_PPC604
12192 || rs6000_cpu_attr == CPU_PPC604E
12193 || rs6000_cpu_attr == CPU_PPC620
12194 || rs6000_cpu_attr == CPU_PPC630
12195 || rs6000_cpu_attr == CPU_PPC750
12196 || rs6000_cpu_attr == CPU_PPC7400
12197 || rs6000_cpu_attr == CPU_PPC7450
12198 || rs6000_cpu_attr == CPU_POWER4)
ed947a96
DJ
12199 && recog_memoized (dep_insn)
12200 && (INSN_CODE (dep_insn) >= 0)
12201 && (get_attr_type (dep_insn) == TYPE_COMPARE
12202 || get_attr_type (dep_insn) == TYPE_DELAYED_COMPARE
12203 || get_attr_type (dep_insn) == TYPE_FPCOMPARE
12204 || get_attr_type (dep_insn) == TYPE_CR_LOGICAL))
12205 return cost + 2;
12206 default:
12207 break;
12208 }
a251ffd0
TG
12209 /* Fall out to return default cost. */
12210 }
12211
12212 return cost;
12213}
b6c9286a 12214
a4f6c312
SS
12215/* A C statement (sans semicolon) to update the integer scheduling
12216 priority INSN_PRIORITY (INSN). Reduce the priority to execute the
12217 INSN earlier, increase the priority to execute INSN later. Do not
12218 define this macro if you do not need to adjust the scheduling
12219 priorities of insns. */
bef84347 12220
c237e94a 12221static int
bef84347 12222rs6000_adjust_priority (insn, priority)
d330fd93 12223 rtx insn ATTRIBUTE_UNUSED;
bef84347
VM
12224 int priority;
12225{
a4f6c312
SS
12226 /* On machines (like the 750) which have asymmetric integer units,
12227 where one integer unit can do multiply and divides and the other
12228 can't, reduce the priority of multiply/divide so it is scheduled
12229 before other integer operations. */
bef84347
VM
12230
12231#if 0
2c3c49de 12232 if (! INSN_P (insn))
bef84347
VM
12233 return priority;
12234
12235 if (GET_CODE (PATTERN (insn)) == USE)
12236 return priority;
12237
12238 switch (rs6000_cpu_attr) {
12239 case CPU_PPC750:
12240 switch (get_attr_type (insn))
12241 {
12242 default:
12243 break;
12244
12245 case TYPE_IMUL:
12246 case TYPE_IDIV:
3cb999d8
DE
12247 fprintf (stderr, "priority was %#x (%d) before adjustment\n",
12248 priority, priority);
bef84347
VM
12249 if (priority >= 0 && priority < 0x01000000)
12250 priority >>= 3;
12251 break;
12252 }
12253 }
12254#endif
12255
12256 return priority;
12257}
12258
a4f6c312
SS
12259/* Return how many instructions the machine can issue per cycle. */
12260
c237e94a
ZW
12261static int
12262rs6000_issue_rate ()
b6c9286a
MM
12263{
12264 switch (rs6000_cpu_attr) {
3cb999d8
DE
12265 case CPU_RIOS1: /* ? */
12266 case CPU_RS64A:
12267 case CPU_PPC601: /* ? */
ed947a96 12268 case CPU_PPC7450:
3cb999d8 12269 return 3;
b6c9286a 12270 case CPU_PPC603:
bef84347 12271 case CPU_PPC750:
ed947a96 12272 case CPU_PPC7400:
bef84347 12273 return 2;
3cb999d8 12274 case CPU_RIOS2:
b6c9286a 12275 case CPU_PPC604:
19684119 12276 case CPU_PPC604E:
b6c9286a 12277 case CPU_PPC620:
3cb999d8 12278 case CPU_PPC630:
309323c2 12279 case CPU_POWER4:
b6c9286a
MM
12280 return 4;
12281 default:
12282 return 1;
12283 }
12284}
12285
b6c9286a 12286\f
b6c9286a
MM
12287/* Length in units of the trampoline for entering a nested function. */
12288
12289int
12290rs6000_trampoline_size ()
12291{
12292 int ret = 0;
12293
12294 switch (DEFAULT_ABI)
12295 {
12296 default:
12297 abort ();
12298
12299 case ABI_AIX:
8f802bfb 12300 ret = (TARGET_32BIT) ? 12 : 24;
b6c9286a
MM
12301 break;
12302
4dabc42d 12303 case ABI_DARWIN:
b6c9286a
MM
12304 case ABI_V4:
12305 case ABI_AIX_NODESC:
03a7e1a5 12306 ret = (TARGET_32BIT) ? 40 : 48;
b6c9286a 12307 break;
b6c9286a
MM
12308 }
12309
12310 return ret;
12311}
12312
12313/* Emit RTL insns to initialize the variable parts of a trampoline.
12314 FNADDR is an RTX for the address of the function's pure code.
12315 CXT is an RTX for the static chain value for the function. */
12316
12317void
12318rs6000_initialize_trampoline (addr, fnaddr, cxt)
12319 rtx addr;
12320 rtx fnaddr;
12321 rtx cxt;
12322{
ac2a93a1 12323 enum machine_mode pmode = Pmode;
8bd04c56
MM
12324 int regsize = (TARGET_32BIT) ? 4 : 8;
12325 rtx ctx_reg = force_reg (pmode, cxt);
b6c9286a
MM
12326
12327 switch (DEFAULT_ABI)
12328 {
12329 default:
12330 abort ();
12331
8bd04c56 12332/* Macros to shorten the code expansions below. */
39403d82 12333#define MEM_DEREF(addr) gen_rtx_MEM (pmode, memory_address (pmode, addr))
c5c76735
JL
12334#define MEM_PLUS(addr,offset) \
12335 gen_rtx_MEM (pmode, memory_address (pmode, plus_constant (addr, offset)))
7c59dc5d 12336
b6c9286a
MM
12337 /* Under AIX, just build the 3 word function descriptor */
12338 case ABI_AIX:
8bd04c56
MM
12339 {
12340 rtx fn_reg = gen_reg_rtx (pmode);
12341 rtx toc_reg = gen_reg_rtx (pmode);
12342 emit_move_insn (fn_reg, MEM_DEREF (fnaddr));
1cb18e3c 12343 emit_move_insn (toc_reg, MEM_PLUS (fnaddr, regsize));
8bd04c56
MM
12344 emit_move_insn (MEM_DEREF (addr), fn_reg);
12345 emit_move_insn (MEM_PLUS (addr, regsize), toc_reg);
12346 emit_move_insn (MEM_PLUS (addr, 2*regsize), ctx_reg);
12347 }
b6c9286a
MM
12348 break;
12349
4dabc42d
TC
12350 /* Under V.4/eabi/darwin, __trampoline_setup does the real work. */
12351 case ABI_DARWIN:
b6c9286a
MM
12352 case ABI_V4:
12353 case ABI_AIX_NODESC:
39403d82 12354 emit_library_call (gen_rtx_SYMBOL_REF (SImode, "__trampoline_setup"),
eaf1bcf1
MM
12355 FALSE, VOIDmode, 4,
12356 addr, pmode,
12357 GEN_INT (rs6000_trampoline_size ()), SImode,
12358 fnaddr, pmode,
12359 ctx_reg, pmode);
b6c9286a 12360 break;
b6c9286a
MM
12361 }
12362
12363 return;
12364}
7509c759
MM
12365
12366\f
91d231cb 12367/* Table of valid machine attributes. */
a4f6c312 12368
91d231cb 12369const struct attribute_spec rs6000_attribute_table[] =
7509c759 12370{
91d231cb 12371 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
a5c76ee6
ZW
12372 { "longcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
12373 { "shortcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
12374 { NULL, 0, 0, false, false, false, NULL }
91d231cb 12375};
7509c759 12376
a5c76ee6
ZW
12377/* Handle a "longcall" or "shortcall" attribute; arguments as in
12378 struct attribute_spec.handler. */
a4f6c312 12379
91d231cb
JM
12380static tree
12381rs6000_handle_longcall_attribute (node, name, args, flags, no_add_attrs)
12382 tree *node;
12383 tree name;
12384 tree args ATTRIBUTE_UNUSED;
12385 int flags ATTRIBUTE_UNUSED;
12386 bool *no_add_attrs;
12387{
12388 if (TREE_CODE (*node) != FUNCTION_TYPE
12389 && TREE_CODE (*node) != FIELD_DECL
12390 && TREE_CODE (*node) != TYPE_DECL)
12391 {
12392 warning ("`%s' attribute only applies to functions",
12393 IDENTIFIER_POINTER (name));
12394 *no_add_attrs = true;
12395 }
6a4cee5f 12396
91d231cb 12397 return NULL_TREE;
7509c759
MM
12398}
12399
a5c76ee6
ZW
12400/* Set longcall attributes on all functions declared when
12401 rs6000_default_long_calls is true. */
12402static void
12403rs6000_set_default_type_attributes (type)
12404 tree type;
12405{
12406 if (rs6000_default_long_calls
12407 && (TREE_CODE (type) == FUNCTION_TYPE
12408 || TREE_CODE (type) == METHOD_TYPE))
12409 TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
12410 NULL_TREE,
12411 TYPE_ATTRIBUTES (type));
12412}
12413
3cb999d8
DE
12414/* Return a reference suitable for calling a function with the
12415 longcall attribute. */
a4f6c312 12416
6a4cee5f
MM
12417struct rtx_def *
12418rs6000_longcall_ref (call_ref)
12419 rtx call_ref;
12420{
d330fd93 12421 const char *call_name;
6a4cee5f
MM
12422 tree node;
12423
12424 if (GET_CODE (call_ref) != SYMBOL_REF)
12425 return call_ref;
12426
12427 /* System V adds '.' to the internal name, so skip them. */
12428 call_name = XSTR (call_ref, 0);
12429 if (*call_name == '.')
12430 {
12431 while (*call_name == '.')
12432 call_name++;
12433
12434 node = get_identifier (call_name);
39403d82 12435 call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
6a4cee5f
MM
12436 }
12437
12438 return force_reg (Pmode, call_ref);
12439}
12440
7509c759 12441\f
b64a1b53
RH
12442#ifdef USING_ELFOS_H
12443
7509c759
MM
12444/* A C statement or statements to switch to the appropriate section
12445 for output of RTX in mode MODE. You can assume that RTX is some
12446 kind of constant in RTL. The argument MODE is redundant except in
12447 the case of a `const_int' rtx. Select the section by calling
12448 `text_section' or one of the alternatives for other sections.
12449
12450 Do not define this macro if you put all constants in the read-only
12451 data section. */
12452
b64a1b53
RH
12453static void
12454rs6000_elf_select_rtx_section (mode, x, align)
a9098fd0 12455 enum machine_mode mode;
7509c759 12456 rtx x;
b64a1b53 12457 unsigned HOST_WIDE_INT align;
7509c759 12458{
a9098fd0 12459 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
7509c759 12460 toc_section ();
7509c759 12461 else
b64a1b53 12462 default_elf_select_rtx_section (mode, x, align);
7509c759
MM
12463}
12464
12465/* A C statement or statements to switch to the appropriate
12466 section for output of DECL. DECL is either a `VAR_DECL' node
12467 or a constant of some sort. RELOC indicates whether forming
12468 the initial value of DECL requires link-time relocations. */
12469
ae46c4e0
RH
12470static void
12471rs6000_elf_select_section (decl, reloc, align)
7509c759
MM
12472 tree decl;
12473 int reloc;
0e5dbd9b 12474 unsigned HOST_WIDE_INT align;
7509c759 12475{
0e5dbd9b
DE
12476 default_elf_select_section_1 (decl, reloc, align,
12477 flag_pic || DEFAULT_ABI == ABI_AIX);
63019373
GK
12478}
12479
12480/* A C statement to build up a unique section name, expressed as a
12481 STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
12482 RELOC indicates whether the initial value of EXP requires
12483 link-time relocations. If you do not define this macro, GCC will use
12484 the symbol name prefixed by `.' as the section name. Note - this
f5143c46 12485 macro can now be called for uninitialized data items as well as
63019373
GK
12486 initialised data and functions. */
12487
ae46c4e0
RH
12488static void
12489rs6000_elf_unique_section (decl, reloc)
63019373
GK
12490 tree decl;
12491 int reloc;
12492{
0e5dbd9b
DE
12493 default_unique_section_1 (decl, reloc,
12494 flag_pic || DEFAULT_ABI == ABI_AIX);
7509c759 12495}
d9407988
MM
12496
12497\f
d9407988
MM
12498/* If we are referencing a function that is static or is known to be
12499 in this file, make the SYMBOL_REF special. We can use this to indicate
12500 that we can branch to this function without emitting a no-op after the
9ebbca7d 12501 call. For real AIX calling sequences, we also replace the
d9407988
MM
12502 function name with the real name (1 or 2 leading .'s), rather than
12503 the function descriptor name. This saves a lot of overriding code
a260abc9 12504 to read the prefixes. */
d9407988 12505
fb49053f
RH
12506static void
12507rs6000_elf_encode_section_info (decl, first)
d9407988 12508 tree decl;
b2003250 12509 int first;
d9407988 12510{
b2003250
RH
12511 if (!first)
12512 return;
12513
d9407988
MM
12514 if (TREE_CODE (decl) == FUNCTION_DECL)
12515 {
12516 rtx sym_ref = XEXP (DECL_RTL (decl), 0);
8f1b829e 12517 if ((TREE_ASM_WRITTEN (decl) || ! TREE_PUBLIC (decl))
c81fc13e 12518 && ! DECL_WEAK (decl))
d9407988
MM
12519 SYMBOL_REF_FLAG (sym_ref) = 1;
12520
9ebbca7d 12521 if (DEFAULT_ABI == ABI_AIX)
d9407988 12522 {
ff669a6c
RH
12523 size_t len1 = (DEFAULT_ABI == ABI_AIX) ? 1 : 2;
12524 size_t len2 = strlen (XSTR (sym_ref, 0));
520a57c8 12525 char *str = alloca (len1 + len2 + 1);
ff669a6c
RH
12526 str[0] = '.';
12527 str[1] = '.';
12528 memcpy (str + len1, XSTR (sym_ref, 0), len2 + 1);
12529
520a57c8 12530 XSTR (sym_ref, 0) = ggc_alloc_string (str, len1 + len2);
d9407988
MM
12531 }
12532 }
12533 else if (rs6000_sdata != SDATA_NONE
f607bc57 12534 && DEFAULT_ABI == ABI_V4
d9407988
MM
12535 && TREE_CODE (decl) == VAR_DECL)
12536 {
12537 int size = int_size_in_bytes (TREE_TYPE (decl));
12538 tree section_name = DECL_SECTION_NAME (decl);
d330fd93 12539 const char *name = (char *)0;
d9407988
MM
12540 int len = 0;
12541
12542 if (section_name)
12543 {
12544 if (TREE_CODE (section_name) == STRING_CST)
12545 {
12546 name = TREE_STRING_POINTER (section_name);
12547 len = TREE_STRING_LENGTH (section_name);
12548 }
12549 else
12550 abort ();
12551 }
12552
12553 if ((size > 0 && size <= g_switch_value)
12554 || (name
5f59ecb7 12555 && ((len == sizeof (".sdata") - 1
3cb999d8 12556 && strcmp (name, ".sdata") == 0)
5f59ecb7 12557 || (len == sizeof (".sdata2") - 1
3cb999d8 12558 && strcmp (name, ".sdata2") == 0)
5f59ecb7 12559 || (len == sizeof (".sbss") - 1
3cb999d8 12560 && strcmp (name, ".sbss") == 0)
5f59ecb7 12561 || (len == sizeof (".sbss2") - 1
3cb999d8 12562 && strcmp (name, ".sbss2") == 0)
5f59ecb7 12563 || (len == sizeof (".PPC.EMB.sdata0") - 1
3cb999d8 12564 && strcmp (name, ".PPC.EMB.sdata0") == 0)
5f59ecb7 12565 || (len == sizeof (".PPC.EMB.sbss0") - 1
3cb999d8 12566 && strcmp (name, ".PPC.EMB.sbss0") == 0))))
d9407988
MM
12567 {
12568 rtx sym_ref = XEXP (DECL_RTL (decl), 0);
ff669a6c 12569 size_t len = strlen (XSTR (sym_ref, 0));
88c1e412 12570 char *str = alloca (len + 2);
ff669a6c 12571
ff669a6c
RH
12572 str[0] = '@';
12573 memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
88c1e412 12574 XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
d9407988
MM
12575 }
12576 }
12577}
12578
772c5265
RH
12579static const char *
12580rs6000_elf_strip_name_encoding (str)
12581 const char *str;
12582{
12583 while (*str == '*' || *str == '@')
12584 str++;
12585 return str;
12586}
12587
0e5dbd9b
DE
12588static bool
12589rs6000_elf_in_small_data_p (decl)
12590 tree decl;
12591{
12592 if (rs6000_sdata == SDATA_NONE)
12593 return false;
12594
12595 if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
12596 {
12597 const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
12598 if (strcmp (section, ".sdata") == 0
12599 || strcmp (section, ".sdata2") == 0
12600 || strcmp (section, ".sbss") == 0)
12601 return true;
12602 }
12603 else
12604 {
12605 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
12606
12607 if (size > 0
12608 && size <= g_switch_value
12609 && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
12610 return true;
12611 }
12612
12613 return false;
12614}
12615
b91da81f 12616#endif /* USING_ELFOS_H */
000034eb 12617
a6c2a102 12618\f
000034eb 12619/* Return a REG that occurs in ADDR with coefficient 1.
02441cd6
JL
12620 ADDR can be effectively incremented by incrementing REG.
12621
12622 r0 is special and we must not select it as an address
12623 register by this routine since our caller will try to
12624 increment the returned register via an "la" instruction. */
000034eb
DE
12625
12626struct rtx_def *
12627find_addr_reg (addr)
12628 rtx addr;
12629{
12630 while (GET_CODE (addr) == PLUS)
12631 {
02441cd6
JL
12632 if (GET_CODE (XEXP (addr, 0)) == REG
12633 && REGNO (XEXP (addr, 0)) != 0)
000034eb 12634 addr = XEXP (addr, 0);
02441cd6
JL
12635 else if (GET_CODE (XEXP (addr, 1)) == REG
12636 && REGNO (XEXP (addr, 1)) != 0)
000034eb
DE
12637 addr = XEXP (addr, 1);
12638 else if (CONSTANT_P (XEXP (addr, 0)))
12639 addr = XEXP (addr, 1);
12640 else if (CONSTANT_P (XEXP (addr, 1)))
12641 addr = XEXP (addr, 0);
12642 else
12643 abort ();
12644 }
02441cd6 12645 if (GET_CODE (addr) == REG && REGNO (addr) != 0)
000034eb
DE
12646 return addr;
12647 abort ();
12648}
12649
a6c2a102
DE
12650void
12651rs6000_fatal_bad_address (op)
12652 rtx op;
12653{
12654 fatal_insn ("bad address", op);
12655}
c8023011
MM
12656
12657/* Called to register all of our global variables with the garbage
12658 collector. */
12659
12660static void
12661rs6000_add_gc_roots ()
12662{
9ebbca7d
GK
12663 toc_hash_table = htab_create (1021, toc_hash_function, toc_hash_eq, NULL);
12664 ggc_add_root (&toc_hash_table, 1, sizeof (toc_hash_table),
12665 toc_hash_mark_table);
ee890fe2
SS
12666}
12667
12668#if TARGET_MACHO
12669
12670#if 0
12671/* Returns 1 if OP is either a symbol reference or a sum of a symbol
12672 reference and a constant. */
12673
12674int
12675symbolic_operand (op)
592696dd 12676 rtx op;
ee890fe2
SS
12677{
12678 switch (GET_CODE (op))
12679 {
12680 case SYMBOL_REF:
12681 case LABEL_REF:
12682 return 1;
12683 case CONST:
12684 op = XEXP (op, 0);
12685 return (GET_CODE (op) == SYMBOL_REF ||
12686 (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
12687 || GET_CODE (XEXP (op, 0)) == LABEL_REF)
12688 && GET_CODE (XEXP (op, 1)) == CONST_INT);
12689 default:
12690 return 0;
12691 }
c8023011 12692}
ee890fe2
SS
12693#endif
12694
12695#ifdef RS6000_LONG_BRANCH
12696
12697static tree stub_list = 0;
12698
12699/* ADD_COMPILER_STUB adds the compiler generated stub for handling
12700 procedure calls to the linked list. */
12701
12702void
12703add_compiler_stub (label_name, function_name, line_number)
12704 tree label_name;
12705 tree function_name;
12706 int line_number;
12707{
12708 tree stub = build_tree_list (function_name, label_name);
12709 TREE_TYPE (stub) = build_int_2 (line_number, 0);
12710 TREE_CHAIN (stub) = stub_list;
12711 stub_list = stub;
12712}
12713
12714#define STUB_LABEL_NAME(STUB) TREE_VALUE (STUB)
12715#define STUB_FUNCTION_NAME(STUB) TREE_PURPOSE (STUB)
12716#define STUB_LINE_NUMBER(STUB) TREE_INT_CST_LOW (TREE_TYPE (STUB))
12717
a4f6c312
SS
12718/* OUTPUT_COMPILER_STUB outputs the compiler generated stub for
12719 handling procedure calls from the linked list and initializes the
12720 linked list. */
ee890fe2 12721
a4f6c312
SS
12722void
12723output_compiler_stub ()
ee890fe2
SS
12724{
12725 char tmp_buf[256];
12726 char label_buf[256];
308c142a 12727 tree stub;
ee890fe2
SS
12728
12729 if (!flag_pic)
12730 for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
12731 {
12732 fprintf (asm_out_file,
12733 "%s:\n", IDENTIFIER_POINTER(STUB_LABEL_NAME(stub)));
12734
12735#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
12736 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
12737 fprintf (asm_out_file, "\t.stabd 68,0,%d\n", STUB_LINE_NUMBER(stub));
12738#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
12739
12740 if (IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub))[0] == '*')
12741 strcpy (label_buf,
12742 IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub))+1);
12743 else
12744 {
12745 label_buf[0] = '_';
12746 strcpy (label_buf+1,
12747 IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub)));
12748 }
12749
12750 strcpy (tmp_buf, "lis r12,hi16(");
12751 strcat (tmp_buf, label_buf);
12752 strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
12753 strcat (tmp_buf, label_buf);
12754 strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
12755 output_asm_insn (tmp_buf, 0);
12756
12757#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
12758 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
12759 fprintf(asm_out_file, "\t.stabd 68,0,%d\n", STUB_LINE_NUMBER (stub));
12760#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
12761 }
12762
12763 stub_list = 0;
12764}
12765
12766/* NO_PREVIOUS_DEF checks in the link list whether the function name is
12767 already there or not. */
12768
a4f6c312
SS
12769int
12770no_previous_def (function_name)
ee890fe2
SS
12771 tree function_name;
12772{
12773 tree stub;
12774 for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
12775 if (function_name == STUB_FUNCTION_NAME (stub))
12776 return 0;
12777 return 1;
12778}
12779
12780/* GET_PREV_LABEL gets the label name from the previous definition of
12781 the function. */
12782
a4f6c312
SS
12783tree
12784get_prev_label (function_name)
ee890fe2
SS
12785 tree function_name;
12786{
12787 tree stub;
12788 for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
12789 if (function_name == STUB_FUNCTION_NAME (stub))
12790 return STUB_LABEL_NAME (stub);
12791 return 0;
12792}
12793
12794/* INSN is either a function call or a millicode call. It may have an
12795 unconditional jump in its delay slot.
12796
12797 CALL_DEST is the routine we are calling. */
12798
12799char *
12800output_call (insn, call_dest, operand_number)
12801 rtx insn;
12802 rtx call_dest;
12803 int operand_number;
12804{
12805 static char buf[256];
12806 if (GET_CODE (call_dest) == SYMBOL_REF && TARGET_LONG_BRANCH && !flag_pic)
12807 {
12808 tree labelname;
12809 tree funname = get_identifier (XSTR (call_dest, 0));
12810
12811 if (no_previous_def (funname))
12812 {
308c142a 12813 int line_number = 0;
ee890fe2
SS
12814 rtx label_rtx = gen_label_rtx ();
12815 char *label_buf, temp_buf[256];
12816 ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
12817 CODE_LABEL_NUMBER (label_rtx));
12818 label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
12819 labelname = get_identifier (label_buf);
12820 for (; insn && GET_CODE (insn) != NOTE; insn = PREV_INSN (insn));
12821 if (insn)
12822 line_number = NOTE_LINE_NUMBER (insn);
12823 add_compiler_stub (labelname, funname, line_number);
12824 }
12825 else
12826 labelname = get_prev_label (funname);
12827
12828 sprintf (buf, "jbsr %%z%d,%.246s",
12829 operand_number, IDENTIFIER_POINTER (labelname));
12830 return buf;
12831 }
12832 else
12833 {
12834 sprintf (buf, "bl %%z%d", operand_number);
12835 return buf;
12836 }
12837}
12838
12839#endif /* RS6000_LONG_BRANCH */
12840
12841#define GEN_LOCAL_LABEL_FOR_SYMBOL(BUF,SYMBOL,LENGTH,N) \
12842 do { \
83182544 12843 const char *const symbol_ = (SYMBOL); \
ee890fe2
SS
12844 char *buffer_ = (BUF); \
12845 if (symbol_[0] == '"') \
12846 { \
12847 sprintf(buffer_, "\"L%d$%s", (N), symbol_+1); \
12848 } \
12849 else if (name_needs_quotes(symbol_)) \
12850 { \
12851 sprintf(buffer_, "\"L%d$%s\"", (N), symbol_); \
12852 } \
12853 else \
12854 { \
12855 sprintf(buffer_, "L%d$%s", (N), symbol_); \
12856 } \
12857 } while (0)
12858
12859
12860/* Generate PIC and indirect symbol stubs. */
12861
12862void
12863machopic_output_stub (file, symb, stub)
12864 FILE *file;
12865 const char *symb, *stub;
12866{
12867 unsigned int length;
a4f6c312
SS
12868 char *symbol_name, *lazy_ptr_name;
12869 char *local_label_0;
ee890fe2
SS
12870 static int label = 0;
12871
df56a27f 12872 /* Lose our funky encoding stuff so it doesn't contaminate the stub. */
772c5265 12873 symb = (*targetm.strip_name_encoding) (symb);
df56a27f 12874
ee890fe2
SS
12875 label += 1;
12876
ee890fe2
SS
12877 length = strlen (symb);
12878 symbol_name = alloca (length + 32);
12879 GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
12880
12881 lazy_ptr_name = alloca (length + 32);
12882 GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
12883
12884 local_label_0 = alloca (length + 32);
12885 GEN_LOCAL_LABEL_FOR_SYMBOL (local_label_0, symb, length, 0);
12886
ee890fe2
SS
12887 if (flag_pic == 2)
12888 machopic_picsymbol_stub_section ();
12889 else
12890 machopic_symbol_stub_section ();
12891
12892 fprintf (file, "%s:\n", stub);
12893 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
12894
12895 if (flag_pic == 2)
12896 {
12897 fprintf (file, "\tmflr r0\n");
12898 fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
12899 fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
12900 fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
12901 lazy_ptr_name, local_label_0);
12902 fprintf (file, "\tmtlr r0\n");
12903 fprintf (file, "\tlwz r12,lo16(%s-%s)(r11)\n",
12904 lazy_ptr_name, local_label_0);
12905 fprintf (file, "\tmtctr r12\n");
12906 fprintf (file, "\taddi r11,r11,lo16(%s-%s)\n",
12907 lazy_ptr_name, local_label_0);
12908 fprintf (file, "\tbctr\n");
12909 }
12910 else
12911 fprintf (file, "non-pure not supported\n");
12912
12913 machopic_lazy_symbol_ptr_section ();
12914 fprintf (file, "%s:\n", lazy_ptr_name);
12915 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
12916 fprintf (file, "\t.long dyld_stub_binding_helper\n");
12917}
12918
12919/* Legitimize PIC addresses. If the address is already
12920 position-independent, we return ORIG. Newly generated
12921 position-independent addresses go into a reg. This is REG if non
12922 zero, otherwise we allocate register(s) as necessary. */
12923
c859cda6 12924#define SMALL_INT(X) ((unsigned) (INTVAL(X) + 0x8000) < 0x10000)
ee890fe2
SS
12925
12926rtx
12927rs6000_machopic_legitimize_pic_address (orig, mode, reg)
12928 rtx orig;
12929 enum machine_mode mode;
12930 rtx reg;
12931{
12932 rtx base, offset;
12933
12934 if (reg == NULL && ! reload_in_progress && ! reload_completed)
12935 reg = gen_reg_rtx (Pmode);
12936
12937 if (GET_CODE (orig) == CONST)
12938 {
12939 if (GET_CODE (XEXP (orig, 0)) == PLUS
12940 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
12941 return orig;
12942
12943 if (GET_CODE (XEXP (orig, 0)) == PLUS)
12944 {
a4f6c312
SS
12945 base =
12946 rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
12947 Pmode, reg);
12948 offset =
12949 rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
12950 Pmode, reg);
ee890fe2
SS
12951 }
12952 else
12953 abort ();
12954
12955 if (GET_CODE (offset) == CONST_INT)
12956 {
12957 if (SMALL_INT (offset))
ed8908e7 12958 return plus_constant (base, INTVAL (offset));
ee890fe2
SS
12959 else if (! reload_in_progress && ! reload_completed)
12960 offset = force_reg (Pmode, offset);
12961 else
c859cda6
DJ
12962 {
12963 rtx mem = force_const_mem (Pmode, orig);
12964 return machopic_legitimize_pic_address (mem, Pmode, reg);
12965 }
ee890fe2
SS
12966 }
12967 return gen_rtx (PLUS, Pmode, base, offset);
12968 }
12969
12970 /* Fall back on generic machopic code. */
12971 return machopic_legitimize_pic_address (orig, mode, reg);
12972}
12973
12974/* This is just a placeholder to make linking work without having to
12975 add this to the generic Darwin EXTRA_SECTIONS. If -mcall-aix is
12976 ever needed for Darwin (not too likely!) this would have to get a
12977 real definition. */
12978
12979void
12980toc_section ()
12981{
12982}
12983
12984#endif /* TARGET_MACHO */
7c262518
RH
12985
12986#if TARGET_ELF
12987static unsigned int
12988rs6000_elf_section_type_flags (decl, name, reloc)
12989 tree decl;
12990 const char *name;
12991 int reloc;
12992{
5add3202
DE
12993 unsigned int flags
12994 = default_section_type_flags_1 (decl, name, reloc,
12995 flag_pic || DEFAULT_ABI == ABI_AIX);
7c262518 12996
270fc29b
RH
12997 if (TARGET_RELOCATABLE)
12998 flags |= SECTION_WRITE;
7c262518 12999
d0101753 13000 return flags;
7c262518 13001}
d9f6800d
RH
13002
13003/* Record an element in the table of global constructors. SYMBOL is
13004 a SYMBOL_REF of the function to be called; PRIORITY is a number
13005 between 0 and MAX_INIT_PRIORITY.
13006
13007 This differs from default_named_section_asm_out_constructor in
13008 that we have special handling for -mrelocatable. */
13009
13010static void
13011rs6000_elf_asm_out_constructor (symbol, priority)
13012 rtx symbol;
13013 int priority;
13014{
13015 const char *section = ".ctors";
13016 char buf[16];
13017
13018 if (priority != DEFAULT_INIT_PRIORITY)
13019 {
13020 sprintf (buf, ".ctors.%.5u",
13021 /* Invert the numbering so the linker puts us in the proper
13022 order; constructors are run from right to left, and the
13023 linker sorts in increasing order. */
13024 MAX_INIT_PRIORITY - priority);
13025 section = buf;
13026 }
13027
715bdd29
RH
13028 named_section_flags (section, SECTION_WRITE);
13029 assemble_align (POINTER_SIZE);
d9f6800d
RH
13030
13031 if (TARGET_RELOCATABLE)
13032 {
13033 fputs ("\t.long (", asm_out_file);
13034 output_addr_const (asm_out_file, symbol);
13035 fputs (")@fixup\n", asm_out_file);
13036 }
13037 else
c8af3574 13038 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
d9f6800d
RH
13039}
13040
13041static void
13042rs6000_elf_asm_out_destructor (symbol, priority)
13043 rtx symbol;
13044 int priority;
13045{
13046 const char *section = ".dtors";
13047 char buf[16];
13048
13049 if (priority != DEFAULT_INIT_PRIORITY)
13050 {
13051 sprintf (buf, ".dtors.%.5u",
13052 /* Invert the numbering so the linker puts us in the proper
13053 order; constructors are run from right to left, and the
13054 linker sorts in increasing order. */
13055 MAX_INIT_PRIORITY - priority);
13056 section = buf;
13057 }
13058
715bdd29
RH
13059 named_section_flags (section, SECTION_WRITE);
13060 assemble_align (POINTER_SIZE);
d9f6800d
RH
13061
13062 if (TARGET_RELOCATABLE)
13063 {
13064 fputs ("\t.long (", asm_out_file);
13065 output_addr_const (asm_out_file, symbol);
13066 fputs (")@fixup\n", asm_out_file);
13067 }
13068 else
c8af3574 13069 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
d9f6800d 13070}
7c262518
RH
13071#endif
13072
cbaaba19 13073#if TARGET_XCOFF
7c262518 13074static void
b275d088
DE
13075rs6000_xcoff_asm_globalize_label (stream, name)
13076 FILE *stream;
13077 const char *name;
13078{
13079 fputs (GLOBAL_ASM_OP, stream);
13080 RS6000_OUTPUT_BASENAME (stream, name);
13081 putc ('\n', stream);
13082}
13083
13084static void
13085rs6000_xcoff_asm_named_section (name, flags)
7c262518 13086 const char *name;
0e5dbd9b 13087 unsigned int flags;
7c262518 13088{
0e5dbd9b
DE
13089 int smclass;
13090 static const char * const suffix[3] = { "PR", "RO", "RW" };
13091
13092 if (flags & SECTION_CODE)
13093 smclass = 0;
13094 else if (flags & SECTION_WRITE)
13095 smclass = 2;
13096 else
13097 smclass = 1;
13098
13099 fprintf (asm_out_file, "\t.csect %s%s[%s]\n",
13100 (flags & SECTION_CODE) ? "." : "",
13101 name, suffix[smclass]);
7c262518 13102}
ae46c4e0
RH
13103
13104static void
0e5dbd9b
DE
13105rs6000_xcoff_select_section (decl, reloc, align)
13106 tree decl;
ae46c4e0
RH
13107 int reloc;
13108 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
13109{
5add3202 13110 if (decl_readonly_section_1 (decl, reloc, 1))
ae46c4e0 13111 {
0e5dbd9b 13112 if (TREE_PUBLIC (decl))
ae46c4e0
RH
13113 read_only_data_section ();
13114 else
13115 read_only_private_data_section ();
13116 }
13117 else
13118 {
0e5dbd9b 13119 if (TREE_PUBLIC (decl))
ae46c4e0
RH
13120 data_section ();
13121 else
13122 private_data_section ();
13123 }
13124}
13125
13126static void
13127rs6000_xcoff_unique_section (decl, reloc)
13128 tree decl;
772c5265 13129 int reloc ATTRIBUTE_UNUSED;
ae46c4e0
RH
13130{
13131 const char *name;
ae46c4e0 13132
0e5dbd9b
DE
13133 /* Use select_section for uninitialized data. */
13134 if (DECL_COMMON (decl)
13135 || DECL_INITIAL (decl) == NULL_TREE
13136 || DECL_INITIAL (decl) == error_mark_node
13137 || (flag_zero_initialized_in_bss
13138 && initializer_zerop (DECL_INITIAL (decl))))
13139 return;
13140
13141 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
13142 name = (*targetm.strip_name_encoding) (name);
13143 DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
ae46c4e0 13144}
b64a1b53 13145
fb49053f
RH
13146/* Select section for constant in constant pool.
13147
13148 On RS/6000, all constants are in the private read-only data area.
13149 However, if this is being placed in the TOC it must be output as a
13150 toc entry. */
13151
b64a1b53
RH
13152static void
13153rs6000_xcoff_select_rtx_section (mode, x, align)
13154 enum machine_mode mode;
13155 rtx x;
13156 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
13157{
13158 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
13159 toc_section ();
13160 else
13161 read_only_private_data_section ();
13162}
772c5265
RH
13163
13164/* Remove any trailing [DS] or the like from the symbol name. */
13165
13166static const char *
13167rs6000_xcoff_strip_name_encoding (name)
13168 const char *name;
13169{
13170 size_t len;
13171 if (*name == '*')
13172 name++;
13173 len = strlen (name);
13174 if (name[len - 1] == ']')
13175 return ggc_alloc_string (name, len - 4);
13176 else
13177 return name;
13178}
13179
5add3202
DE
13180/* Section attributes. AIX is always PIC. */
13181
13182static unsigned int
13183rs6000_xcoff_section_type_flags (decl, name, reloc)
13184 tree decl;
13185 const char *name;
13186 int reloc;
13187{
13188 return default_section_type_flags_1 (decl, name, reloc, 1);
13189}
13190
cbaaba19 13191#endif /* TARGET_XCOFF */
fb49053f 13192
0e5dbd9b 13193/* Note that this is also used for PPC64 Linux. */
fb49053f
RH
13194
13195static void
13196rs6000_xcoff_encode_section_info (decl, first)
13197 tree decl;
13198 int first ATTRIBUTE_UNUSED;
13199{
13200 if (TREE_CODE (decl) == FUNCTION_DECL
13201 && (TREE_ASM_WRITTEN (decl) || ! TREE_PUBLIC (decl))
13202 && ! DECL_WEAK (decl))
13203 SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1;
13204}
0e5dbd9b
DE
13205
13206/* Cross-module name binding. For AIX and PPC64 Linux, which always are
13207 PIC, use private copy of flag_pic. */
13208
2bcc50d0 13209static bool
0e5dbd9b
DE
13210rs6000_binds_local_p (decl)
13211 tree decl;
13212{
5add3202 13213 return default_binds_local_p_1 (decl, flag_pic || rs6000_flag_pic);
0e5dbd9b
DE
13214}
13215