]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/rs6000/rs6000.c
config.guess: Update to 2003-01-03 version.
[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,
d3c300d2 3 2000, 2001, 2002, 2003 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"
4977bab6
ZW
25#include "coretypes.h"
26#include "tm.h"
9878760c
RK
27#include "rtl.h"
28#include "regs.h"
29#include "hard-reg-set.h"
30#include "real.h"
31#include "insn-config.h"
32#include "conditions.h"
9878760c
RK
33#include "insn-attr.h"
34#include "flags.h"
35#include "recog.h"
9878760c 36#include "obstack.h"
9b30bae2 37#include "tree.h"
dfafc897 38#include "expr.h"
2fc1c679 39#include "optabs.h"
2a430ec1 40#include "except.h"
a7df97e6 41#include "function.h"
296b8152 42#include "output.h"
d5fa86ba 43#include "basic-block.h"
d0101753 44#include "integrate.h"
296b8152 45#include "toplev.h"
c8023011 46#include "ggc.h"
9ebbca7d
GK
47#include "hashtab.h"
48#include "tm_p.h"
672a6f42
NB
49#include "target.h"
50#include "target-def.h"
3ac88239 51#include "langhooks.h"
24ea750e 52#include "reload.h"
9b30bae2 53
7509c759
MM
54#ifndef TARGET_NO_PROTOTYPE
55#define TARGET_NO_PROTOTYPE 0
56#endif
57
9878760c
RK
58#define min(A,B) ((A) < (B) ? (A) : (B))
59#define max(A,B) ((A) > (B) ? (A) : (B))
60
5248c961
RK
61/* Target cpu type */
62
63enum processor_type rs6000_cpu;
8e3f41e7
MM
64struct rs6000_cpu_select rs6000_select[3] =
65{
815cdc52
MM
66 /* switch name, tune arch */
67 { (const char *)0, "--with-cpu=", 1, 1 },
68 { (const char *)0, "-mcpu=", 1, 1 },
69 { (const char *)0, "-mtune=", 1, 0 },
8e3f41e7 70};
5248c961 71
6fa3f289
ZW
72/* Size of long double */
73const char *rs6000_long_double_size_string;
74int rs6000_long_double_type_size;
75
76/* Whether -mabi=altivec has appeared */
77int rs6000_altivec_abi;
78
08b57fb3
AH
79/* Whether VRSAVE instructions should be generated. */
80int rs6000_altivec_vrsave;
81
82/* String from -mvrsave= option. */
83const char *rs6000_altivec_vrsave_string;
84
a3170dc6
AH
85/* Nonzero if we want SPE ABI extensions. */
86int rs6000_spe_abi;
87
88/* Whether isel instructions should be generated. */
89int rs6000_isel;
90
91/* Nonzero if we have FPRs. */
92int rs6000_fprs = 1;
93
94/* String from -misel=. */
95const char *rs6000_isel_string;
96
a0ab749a 97/* Set to nonzero once AIX common-mode calls have been defined. */
c764f757 98static int common_mode_defined;
c81bebd7 99
0e5dbd9b
DE
100/* Private copy of original value of flag_pic for ABI_AIX. */
101static int rs6000_flag_pic;
102
9878760c
RK
103/* Save information from a "cmpxx" operation until the branch or scc is
104 emitted. */
9878760c
RK
105rtx rs6000_compare_op0, rs6000_compare_op1;
106int rs6000_compare_fp_p;
874a0744 107
874a0744
MM
108/* Label number of label created for -mrelocatable, to call to so we can
109 get the address of the GOT section */
110int rs6000_pic_labelno;
c81bebd7 111
b91da81f 112#ifdef USING_ELFOS_H
c81bebd7 113/* Which abi to adhere to */
815cdc52 114const char *rs6000_abi_name = RS6000_ABI_NAME;
d9407988
MM
115
116/* Semantics of the small data area */
117enum rs6000_sdata_type rs6000_sdata = SDATA_DATA;
118
119/* Which small data model to use */
815cdc52 120const char *rs6000_sdata_name = (char *)0;
9ebbca7d
GK
121
122/* Counter for labels which are to be placed in .fixup. */
123int fixuplabelno = 0;
874a0744 124#endif
4697a36c 125
b6c9286a
MM
126/* ABI enumeration available for subtarget to use. */
127enum rs6000_abi rs6000_current_abi;
128
0ac081f6
AH
129/* ABI string from -mabi= option. */
130const char *rs6000_abi_string;
131
38c1f2d7 132/* Debug flags */
815cdc52 133const char *rs6000_debug_name;
38c1f2d7
MM
134int rs6000_debug_stack; /* debug stack applications */
135int rs6000_debug_arg; /* debug argument handling */
136
57ac7be9
AM
137const char *rs6000_traceback_name;
138static enum {
139 traceback_default = 0,
140 traceback_none,
141 traceback_part,
142 traceback_full
143} rs6000_traceback;
144
38c1f2d7
MM
145/* Flag to say the TOC is initialized */
146int toc_initialized;
9ebbca7d 147char toc_label_name[10];
38c1f2d7 148
9ebbca7d
GK
149/* Alias set for saves and restores from the rs6000 stack. */
150static int rs6000_sr_alias_set;
c8023011 151
a5c76ee6
ZW
152/* Call distance, overridden by -mlongcall and #pragma longcall(1).
153 The only place that looks at this is rs6000_set_default_type_attributes;
154 everywhere else should rely on the presence or absence of a longcall
155 attribute on the function declaration. */
156int rs6000_default_long_calls;
157const char *rs6000_longcall_switch;
158
a3170dc6
AH
159struct builtin_description
160{
161 /* mask is not const because we're going to alter it below. This
162 nonsense will go away when we rewrite the -march infrastructure
163 to give us more target flag bits. */
164 unsigned int mask;
165 const enum insn_code icode;
166 const char *const name;
167 const enum rs6000_builtins code;
168};
169
4977bab6 170static bool rs6000_function_ok_for_sibcall PARAMS ((tree, tree));
9ebbca7d
GK
171static void rs6000_add_gc_roots PARAMS ((void));
172static int num_insns_constant_wide PARAMS ((HOST_WIDE_INT));
39a10a29
GK
173static void validate_condition_mode
174 PARAMS ((enum rtx_code, enum machine_mode));
175static rtx rs6000_generate_compare PARAMS ((enum rtx_code));
e50f5f3d 176static void rs6000_maybe_dead PARAMS ((rtx));
9ebbca7d
GK
177static void rs6000_emit_stack_tie PARAMS ((void));
178static void rs6000_frame_related PARAMS ((rtx, rtx, HOST_WIDE_INT, rtx, rtx));
89e7058f
AH
179static void emit_frame_save PARAMS ((rtx, rtx, enum machine_mode,
180 unsigned int, int, int));
a3170dc6 181static rtx gen_frame_mem_offset PARAMS ((enum machine_mode, rtx, int));
9ebbca7d
GK
182static void rs6000_emit_allocate_stack PARAMS ((HOST_WIDE_INT, int));
183static unsigned rs6000_hash_constant PARAMS ((rtx));
184static unsigned toc_hash_function PARAMS ((const void *));
185static int toc_hash_eq PARAMS ((const void *, const void *));
2eba1afa 186static int toc_hash_mark_entry PARAMS ((void **, void *));
9ebbca7d
GK
187static void toc_hash_mark_table PARAMS ((void *));
188static int constant_pool_expr_1 PARAMS ((rtx, int *, int *));
e2500fed 189static struct machine_function * rs6000_init_machine_status PARAMS ((void));
301d03af 190static bool rs6000_assemble_integer PARAMS ((rtx, unsigned int, int));
5add3202 191#ifdef HAVE_GAS_HIDDEN
25fdb4dc 192static void rs6000_assemble_visibility PARAMS ((tree, int));
5add3202 193#endif
71f123ca 194static int rs6000_ra_ever_killed PARAMS ((void));
91d231cb
JM
195static tree rs6000_handle_longcall_attribute PARAMS ((tree *, tree, tree, int, bool *));
196const struct attribute_spec rs6000_attribute_table[];
a5c76ee6 197static void rs6000_set_default_type_attributes PARAMS ((tree));
08c148a8
NB
198static void rs6000_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
199static void rs6000_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
3961e8fe
RH
200static void rs6000_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT,
201 HOST_WIDE_INT, tree));
2bfcf297
DB
202static rtx rs6000_emit_set_long_const PARAMS ((rtx,
203 HOST_WIDE_INT, HOST_WIDE_INT));
7c262518
RH
204#if TARGET_ELF
205static unsigned int rs6000_elf_section_type_flags PARAMS ((tree, const char *,
206 int));
d9f6800d
RH
207static void rs6000_elf_asm_out_constructor PARAMS ((rtx, int));
208static void rs6000_elf_asm_out_destructor PARAMS ((rtx, int));
ae46c4e0
RH
209static void rs6000_elf_select_section PARAMS ((tree, int,
210 unsigned HOST_WIDE_INT));
211static void rs6000_elf_unique_section PARAMS ((tree, int));
b64a1b53
RH
212static void rs6000_elf_select_rtx_section PARAMS ((enum machine_mode, rtx,
213 unsigned HOST_WIDE_INT));
0e5dbd9b
DE
214static void rs6000_elf_encode_section_info PARAMS ((tree, int))
215 ATTRIBUTE_UNUSED;
772c5265 216static const char *rs6000_elf_strip_name_encoding PARAMS ((const char *));
0e5dbd9b 217static bool rs6000_elf_in_small_data_p PARAMS ((tree));
7c262518 218#endif
cbaaba19 219#if TARGET_XCOFF
b275d088
DE
220static void rs6000_xcoff_asm_globalize_label PARAMS ((FILE *, const char *));
221static void rs6000_xcoff_asm_named_section PARAMS ((const char *, unsigned int));
ae46c4e0
RH
222static void rs6000_xcoff_select_section PARAMS ((tree, int,
223 unsigned HOST_WIDE_INT));
224static void rs6000_xcoff_unique_section PARAMS ((tree, int));
b64a1b53
RH
225static void rs6000_xcoff_select_rtx_section PARAMS ((enum machine_mode, rtx,
226 unsigned HOST_WIDE_INT));
772c5265 227static const char * rs6000_xcoff_strip_name_encoding PARAMS ((const char *));
5add3202 228static unsigned int rs6000_xcoff_section_type_flags PARAMS ((tree, const char *, int));
7c262518 229#endif
fb49053f
RH
230static void rs6000_xcoff_encode_section_info PARAMS ((tree, int))
231 ATTRIBUTE_UNUSED;
2bcc50d0 232static bool rs6000_binds_local_p PARAMS ((tree));
c237e94a
ZW
233static int rs6000_adjust_cost PARAMS ((rtx, rtx, rtx, int));
234static int rs6000_adjust_priority PARAMS ((rtx, int));
235static int rs6000_issue_rate PARAMS ((void));
236
6fa3f289 237static void rs6000_init_builtins PARAMS ((void));
92898235
AH
238static rtx rs6000_expand_unop_builtin PARAMS ((enum insn_code, tree, rtx));
239static rtx rs6000_expand_binop_builtin PARAMS ((enum insn_code, tree, rtx));
240static rtx rs6000_expand_ternop_builtin PARAMS ((enum insn_code, tree, rtx));
0ac081f6 241static rtx rs6000_expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int));
92898235 242static void altivec_init_builtins PARAMS ((void));
a3170dc6
AH
243static void rs6000_common_init_builtins PARAMS ((void));
244
245static void enable_mask_for_builtins PARAMS ((struct builtin_description *,
246 int, enum rs6000_builtins,
247 enum rs6000_builtins));
248static void spe_init_builtins PARAMS ((void));
249static rtx spe_expand_builtin PARAMS ((tree, rtx, bool *));
250static rtx spe_expand_predicate_builtin PARAMS ((enum insn_code, tree, rtx));
251static rtx spe_expand_evsel_builtin PARAMS ((enum insn_code, tree, rtx));
252static int rs6000_emit_int_cmove PARAMS ((rtx, rtx, rtx, rtx));
253
92898235 254static rtx altivec_expand_builtin PARAMS ((tree, rtx, bool *));
3a9b8c7e
AH
255static rtx altivec_expand_ld_builtin PARAMS ((tree, rtx, bool *));
256static rtx altivec_expand_st_builtin PARAMS ((tree, rtx, bool *));
257static rtx altivec_expand_dst_builtin PARAMS ((tree, rtx, bool *));
100c4561 258static rtx altivec_expand_abs_builtin PARAMS ((enum insn_code, tree, rtx));
ae4b4a02 259static rtx altivec_expand_predicate_builtin PARAMS ((enum insn_code, const char *, tree, rtx));
6525c0e7 260static rtx altivec_expand_stv_builtin PARAMS ((enum insn_code, tree));
0ac081f6 261static void rs6000_parse_abi_options PARAMS ((void));
08b57fb3 262static void rs6000_parse_vrsave_option PARAMS ((void));
a3170dc6 263static void rs6000_parse_isel_option PARAMS ((void));
00b960c7
AH
264static int first_altivec_reg_to_save PARAMS ((void));
265static unsigned int compute_vrsave_mask PARAMS ((void));
266static void is_altivec_return_reg PARAMS ((rtx, void *));
9aa86737
AH
267static rtx generate_set_vrsave PARAMS ((rtx, rs6000_stack_t *, int));
268static void altivec_frame_fixup PARAMS ((rtx, rtx, HOST_WIDE_INT));
69ef87e2 269static int easy_vector_constant PARAMS ((rtx));
c81bebd7
MM
270\f
271/* Default register names. */
272char rs6000_reg_names[][8] =
273{
802a0058
MM
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 "0", "1", "2", "3", "4", "5", "6", "7",
279 "8", "9", "10", "11", "12", "13", "14", "15",
280 "16", "17", "18", "19", "20", "21", "22", "23",
281 "24", "25", "26", "27", "28", "29", "30", "31",
282 "mq", "lr", "ctr","ap",
283 "0", "1", "2", "3", "4", "5", "6", "7",
0ac081f6
AH
284 "xer",
285 /* AltiVec registers. */
0cd5e3a1
AH
286 "0", "1", "2", "3", "4", "5", "6", "7",
287 "8", "9", "10", "11", "12", "13", "14", "15",
288 "16", "17", "18", "19", "20", "21", "22", "23",
289 "24", "25", "26", "27", "28", "29", "30", "31",
59a4c851
AH
290 "vrsave", "vscr",
291 /* SPE registers. */
292 "spe_acc", "spefscr"
c81bebd7
MM
293};
294
295#ifdef TARGET_REGNAMES
8b60264b 296static const char alt_reg_names[][8] =
c81bebd7 297{
802a0058
MM
298 "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7",
299 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
300 "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
301 "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
302 "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
303 "%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
304 "%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
305 "%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
306 "mq", "lr", "ctr", "ap",
307 "%cr0", "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
0ac081f6 308 "xer",
59a4c851 309 /* AltiVec registers. */
0ac081f6 310 "%v0", "%v1", "%v2", "%v3", "%v4", "%v5", "%v6", "%v7",
59a4c851
AH
311 "%v8", "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
312 "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
313 "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
314 "vrsave", "vscr",
315 /* SPE registers. */
316 "spe_acc", "spefscr"
c81bebd7
MM
317};
318#endif
9878760c 319\f
daf11973
MM
320#ifndef MASK_STRICT_ALIGN
321#define MASK_STRICT_ALIGN 0
322#endif
3961e8fe
RH
323
324/* The VRSAVE bitmask puts bit %v0 as the most significant bit. */
325#define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
672a6f42
NB
326\f
327/* Initialize the GCC target structure. */
91d231cb
JM
328#undef TARGET_ATTRIBUTE_TABLE
329#define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
a5c76ee6
ZW
330#undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
331#define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
daf11973 332
301d03af
RS
333#undef TARGET_ASM_ALIGNED_DI_OP
334#define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
335
336/* Default unaligned ops are only provided for ELF. Find the ops needed
337 for non-ELF systems. */
338#ifndef OBJECT_FORMAT_ELF
cbaaba19 339#if TARGET_XCOFF
ae6c1efd 340/* For XCOFF. rs6000_assemble_integer will handle unaligned DIs on
301d03af
RS
341 64-bit targets. */
342#undef TARGET_ASM_UNALIGNED_HI_OP
343#define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
344#undef TARGET_ASM_UNALIGNED_SI_OP
345#define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
346#undef TARGET_ASM_UNALIGNED_DI_OP
347#define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
348#else
349/* For Darwin. */
350#undef TARGET_ASM_UNALIGNED_HI_OP
351#define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
352#undef TARGET_ASM_UNALIGNED_SI_OP
353#define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
354#endif
355#endif
356
357/* This hook deals with fixups for relocatable code and DI-mode objects
358 in 64-bit code. */
359#undef TARGET_ASM_INTEGER
360#define TARGET_ASM_INTEGER rs6000_assemble_integer
361
93638d7a
AM
362#ifdef HAVE_GAS_HIDDEN
363#undef TARGET_ASM_ASSEMBLE_VISIBILITY
364#define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
365#endif
366
08c148a8
NB
367#undef TARGET_ASM_FUNCTION_PROLOGUE
368#define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
369#undef TARGET_ASM_FUNCTION_EPILOGUE
370#define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
371
c237e94a
ZW
372#undef TARGET_SCHED_ISSUE_RATE
373#define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
374#undef TARGET_SCHED_ADJUST_COST
375#define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
376#undef TARGET_SCHED_ADJUST_PRIORITY
377#define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
378
0ac081f6
AH
379#undef TARGET_INIT_BUILTINS
380#define TARGET_INIT_BUILTINS rs6000_init_builtins
381
382#undef TARGET_EXPAND_BUILTIN
383#define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
384
0e5dbd9b
DE
385#undef TARGET_BINDS_LOCAL_P
386#define TARGET_BINDS_LOCAL_P rs6000_binds_local_p
387
3961e8fe
RH
388#undef TARGET_ASM_OUTPUT_MI_THUNK
389#define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
390
391/* ??? Should work everywhere, but ask dje@watson.ibm.com before
392 enabling for AIX. */
393#if TARGET_OBJECT_FORMAT != OBJECT_XCOFF
394#undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
395#define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
396#endif
00b960c7 397
4977bab6
ZW
398#undef TARGET_FUNCTION_OK_FOR_SIBCALL
399#define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
400
f6897b10 401struct gcc_target targetm = TARGET_INITIALIZER;
672a6f42 402\f
5248c961
RK
403/* Override command line options. Mostly we process the processor
404 type and sometimes adjust other TARGET_ options. */
405
406void
8e3f41e7 407rs6000_override_options (default_cpu)
d330fd93 408 const char *default_cpu;
5248c961 409{
c4d38ccb 410 size_t i, j;
8e3f41e7 411 struct rs6000_cpu_select *ptr;
5248c961 412
85638c0d
RK
413 /* Simplify the entries below by making a mask for any POWER
414 variant and any PowerPC variant. */
415
938937d8 416#define POWER_MASKS (MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING)
68c49ffa
RK
417#define POWERPC_MASKS (MASK_POWERPC | MASK_PPC_GPOPT \
418 | MASK_PPC_GFXOPT | MASK_POWERPC64)
419#define POWERPC_OPT_MASKS (MASK_PPC_GPOPT | MASK_PPC_GFXOPT)
85638c0d 420
5248c961
RK
421 static struct ptt
422 {
8b60264b
KG
423 const char *const name; /* Canonical processor name. */
424 const enum processor_type processor; /* Processor type enum value. */
425 const int target_enable; /* Target flags to enable. */
426 const int target_disable; /* Target flags to disable. */
427 } const processor_target_table[]
cf27b467
MM
428 = {{"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS,
429 POWER_MASKS | POWERPC_MASKS},
db7f1e43 430 {"power", PROCESSOR_POWER,
938937d8 431 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43 432 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
8e3f41e7
MM
433 {"power2", PROCESSOR_POWER,
434 MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
435 POWERPC_MASKS | MASK_NEW_MNEMONICS},
c71791e0
DE
436 {"power3", PROCESSOR_PPC630,
437 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
438 POWER_MASKS | MASK_PPC_GPOPT},
309323c2
DE
439 {"power4", PROCESSOR_POWER4,
440 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
441 POWER_MASKS | MASK_PPC_GPOPT},
db7f1e43
RK
442 {"powerpc", PROCESSOR_POWERPC,
443 MASK_POWERPC | MASK_NEW_MNEMONICS,
68c49ffa 444 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
3cb999d8
DE
445 {"powerpc64", PROCESSOR_POWERPC64,
446 MASK_POWERPC | MASK_POWERPC64 | MASK_NEW_MNEMONICS,
447 POWER_MASKS | POWERPC_OPT_MASKS},
db7f1e43 448 {"rios", PROCESSOR_RIOS1,
938937d8 449 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
450 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
451 {"rios1", PROCESSOR_RIOS1,
938937d8 452 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
453 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
454 {"rsc", PROCESSOR_PPC601,
938937d8 455 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
456 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
457 {"rsc1", PROCESSOR_PPC601,
938937d8 458 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
459 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
460 {"rios2", PROCESSOR_RIOS2,
938937d8 461 MASK_POWER | MASK_MULTIPLE | MASK_STRING | MASK_POWER2,
db7f1e43 462 POWERPC_MASKS | MASK_NEW_MNEMONICS},
3cb999d8
DE
463 {"rs64a", PROCESSOR_RS64A,
464 MASK_POWERPC | MASK_NEW_MNEMONICS,
465 POWER_MASKS | POWERPC_OPT_MASKS},
a3a1dbf6
MM
466 {"401", PROCESSOR_PPC403,
467 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
468 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
49a0b204 469 {"403", PROCESSOR_PPC403,
daf11973 470 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS | MASK_STRICT_ALIGN,
49a0b204 471 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
d7a5e253
DE
472 {"405", PROCESSOR_PPC405,
473 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
474 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
4977bab6
ZW
475 {"405f", PROCESSOR_PPC405,
476 MASK_POWERPC | MASK_NEW_MNEMONICS,
477 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
cf27b467
MM
478 {"505", PROCESSOR_MPCCORE,
479 MASK_POWERPC | MASK_NEW_MNEMONICS,
480 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
5248c961 481 {"601", PROCESSOR_PPC601,
938937d8 482 MASK_POWER | MASK_POWERPC | MASK_NEW_MNEMONICS | MASK_MULTIPLE | MASK_STRING,
68c49ffa 483 MASK_POWER2 | POWERPC_OPT_MASKS | MASK_POWERPC64},
1ec26da6 484 {"602", PROCESSOR_PPC603,
cf27b467
MM
485 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
486 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
5248c961 487 {"603", PROCESSOR_PPC603,
68c49ffa
RK
488 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
489 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
b6c9286a
MM
490 {"603e", PROCESSOR_PPC603,
491 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
492 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
b5370a88 493 {"ec603e", PROCESSOR_PPC603,
a3a1dbf6
MM
494 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
495 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
5248c961 496 {"604", PROCESSOR_PPC604,
b6c9286a
MM
497 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
498 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
cac8ce95 499 {"604e", PROCESSOR_PPC604e,
07e6159a
MM
500 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
501 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
b6c9286a 502 {"620", PROCESSOR_PPC620,
68c49ffa 503 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
a260abc9 504 POWER_MASKS | MASK_PPC_GPOPT},
3cb999d8
DE
505 {"630", PROCESSOR_PPC630,
506 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
507 POWER_MASKS | MASK_PPC_GPOPT},
bef84347
VM
508 {"740", PROCESSOR_PPC750,
509 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
510 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
511 {"750", PROCESSOR_PPC750,
512 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
513 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
a4f6c312
SS
514 {"7400", PROCESSOR_PPC7400,
515 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
516 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
517 {"7450", PROCESSOR_PPC7450,
518 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
519 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
a3170dc6
AH
520 {"8540", PROCESSOR_PPC8540,
521 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
522 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
07e6159a
MM
523 {"801", PROCESSOR_MPCCORE,
524 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
525 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
cf27b467
MM
526 {"821", PROCESSOR_MPCCORE,
527 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
528 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
07e6159a
MM
529 {"823", PROCESSOR_MPCCORE,
530 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
531 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
cf27b467
MM
532 {"860", PROCESSOR_MPCCORE,
533 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
534 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64}};
5248c961 535
ca7558fc 536 const size_t ptt_size = ARRAY_SIZE (processor_target_table);
5248c961 537
a4f6c312
SS
538 /* Save current -mmultiple/-mno-multiple status. */
539 int multiple = TARGET_MULTIPLE;
540 /* Save current -mstring/-mno-string status. */
541 int string = TARGET_STRING;
8a61d227 542
a4f6c312 543 /* Identify the processor type. */
8e3f41e7 544 rs6000_select[0].string = default_cpu;
3cb999d8 545 rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
8e3f41e7 546
b6a1cbae 547 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
5248c961 548 {
8e3f41e7
MM
549 ptr = &rs6000_select[i];
550 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
5248c961 551 {
8e3f41e7
MM
552 for (j = 0; j < ptt_size; j++)
553 if (! strcmp (ptr->string, processor_target_table[j].name))
554 {
555 if (ptr->set_tune_p)
556 rs6000_cpu = processor_target_table[j].processor;
557
558 if (ptr->set_arch_p)
559 {
560 target_flags |= processor_target_table[j].target_enable;
561 target_flags &= ~processor_target_table[j].target_disable;
562 }
563 break;
564 }
565
4406229e 566 if (j == ptt_size)
8e3f41e7 567 error ("bad value (%s) for %s switch", ptr->string, ptr->name);
5248c961
RK
568 }
569 }
8a61d227 570
a3170dc6
AH
571 if (rs6000_cpu == PROCESSOR_PPC8540)
572 rs6000_isel = 1;
573
dff9f1b6
DE
574 /* If we are optimizing big endian systems for space, use the load/store
575 multiple and string instructions. */
ef792183 576 if (BYTES_BIG_ENDIAN && optimize_size)
dff9f1b6 577 target_flags |= MASK_MULTIPLE | MASK_STRING;
ef792183 578
8a61d227
MM
579 /* If -mmultiple or -mno-multiple was explicitly used, don't
580 override with the processor default */
b21fb038 581 if ((target_flags_explicit & MASK_MULTIPLE) != 0)
8a61d227 582 target_flags = (target_flags & ~MASK_MULTIPLE) | multiple;
7e69e155 583
a4f6c312
SS
584 /* If -mstring or -mno-string was explicitly used, don't override
585 with the processor default. */
b21fb038 586 if ((target_flags_explicit & MASK_STRING) != 0)
1f5515bf 587 target_flags = (target_flags & ~MASK_STRING) | string;
938937d8 588
a4f6c312
SS
589 /* Don't allow -mmultiple or -mstring on little endian systems
590 unless the cpu is a 750, because the hardware doesn't support the
591 instructions used in little endian mode, and causes an alignment
592 trap. The 750 does not cause an alignment trap (except when the
593 target is unaligned). */
bef84347 594
b21fb038 595 if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
7e69e155
MM
596 {
597 if (TARGET_MULTIPLE)
598 {
599 target_flags &= ~MASK_MULTIPLE;
b21fb038 600 if ((target_flags_explicit & MASK_MULTIPLE) != 0)
7e69e155
MM
601 warning ("-mmultiple is not supported on little endian systems");
602 }
603
604 if (TARGET_STRING)
605 {
606 target_flags &= ~MASK_STRING;
b21fb038 607 if ((target_flags_explicit & MASK_STRING) != 0)
938937d8 608 warning ("-mstring is not supported on little endian systems");
7e69e155
MM
609 }
610 }
3933e0e1 611
ee2ca2a2 612 if (flag_pic != 0 && DEFAULT_ABI == ABI_AIX)
a260abc9 613 {
0e5dbd9b 614 rs6000_flag_pic = flag_pic;
ee2ca2a2 615 flag_pic = 0;
a260abc9
DE
616 }
617
c72bfda7
SS
618 /* For Darwin, always silently make -fpic and -fPIC identical. */
619 if (flag_pic == 1 && DEFAULT_ABI == ABI_DARWIN)
620 flag_pic = 2;
621
38c1f2d7
MM
622 /* Set debug flags */
623 if (rs6000_debug_name)
624 {
bfc79d3b 625 if (! strcmp (rs6000_debug_name, "all"))
38c1f2d7 626 rs6000_debug_stack = rs6000_debug_arg = 1;
bfc79d3b 627 else if (! strcmp (rs6000_debug_name, "stack"))
38c1f2d7 628 rs6000_debug_stack = 1;
bfc79d3b 629 else if (! strcmp (rs6000_debug_name, "arg"))
38c1f2d7
MM
630 rs6000_debug_arg = 1;
631 else
c725bd79 632 error ("unknown -mdebug-%s switch", rs6000_debug_name);
38c1f2d7
MM
633 }
634
57ac7be9
AM
635 if (rs6000_traceback_name)
636 {
637 if (! strncmp (rs6000_traceback_name, "full", 4))
638 rs6000_traceback = traceback_full;
639 else if (! strncmp (rs6000_traceback_name, "part", 4))
640 rs6000_traceback = traceback_part;
641 else if (! strncmp (rs6000_traceback_name, "no", 2))
642 rs6000_traceback = traceback_none;
643 else
644 error ("unknown -mtraceback arg `%s'; expecting `full', `partial' or `none'",
645 rs6000_traceback_name);
646 }
647
6fa3f289
ZW
648 /* Set size of long double */
649 rs6000_long_double_type_size = 64;
650 if (rs6000_long_double_size_string)
651 {
652 char *tail;
653 int size = strtol (rs6000_long_double_size_string, &tail, 10);
654 if (*tail != '\0' || (size != 64 && size != 128))
655 error ("Unknown switch -mlong-double-%s",
656 rs6000_long_double_size_string);
657 else
658 rs6000_long_double_type_size = size;
659 }
660
0ac081f6
AH
661 /* Handle -mabi= options. */
662 rs6000_parse_abi_options ();
663
08b57fb3
AH
664 /* Handle -mvrsave= option. */
665 rs6000_parse_vrsave_option ();
666
a3170dc6
AH
667 /* Handle -misel= option. */
668 rs6000_parse_isel_option ();
669
a7ae18e2
AH
670#ifdef SUBTARGET_OVERRIDE_OPTIONS
671 SUBTARGET_OVERRIDE_OPTIONS;
672#endif
673#ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
674 SUBSUBTARGET_OVERRIDE_OPTIONS;
675#endif
676
a5c76ee6
ZW
677 /* Handle -m(no-)longcall option. This is a bit of a cheap hack,
678 using TARGET_OPTIONS to handle a toggle switch, but we're out of
679 bits in target_flags so TARGET_SWITCHES cannot be used.
680 Assumption here is that rs6000_longcall_switch points into the
681 text of the complete option, rather than being a copy, so we can
682 scan back for the presence or absence of the no- modifier. */
683 if (rs6000_longcall_switch)
684 {
685 const char *base = rs6000_longcall_switch;
686 while (base[-1] != 'm') base--;
687
688 if (*rs6000_longcall_switch != '\0')
689 error ("invalid option `%s'", base);
690 rs6000_default_long_calls = (base[0] != 'n');
691 }
692
c81bebd7 693#ifdef TARGET_REGNAMES
a4f6c312
SS
694 /* If the user desires alternate register names, copy in the
695 alternate names now. */
c81bebd7 696 if (TARGET_REGNAMES)
4e135bdd 697 memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
c81bebd7
MM
698#endif
699
6fa3f289
ZW
700 /* Set TARGET_AIX_STRUCT_RET last, after the ABI is determined.
701 If -maix-struct-return or -msvr4-struct-return was explicitly
702 used, don't override with the ABI default. */
b21fb038 703 if ((target_flags_explicit & MASK_AIX_STRUCT_RET) == 0)
6fa3f289
ZW
704 {
705 if (DEFAULT_ABI == ABI_V4 && !DRAFT_V4_STRUCT_RET)
706 target_flags = (target_flags & ~MASK_AIX_STRUCT_RET);
707 else
708 target_flags |= MASK_AIX_STRUCT_RET;
709 }
710
fcce224d
DE
711 if (TARGET_LONG_DOUBLE_128
712 && (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN))
713 real_format_for_mode[TFmode - QFmode] = &ibm_extended_format;
714
c8023011
MM
715 /* Register global variables with the garbage collector. */
716 rs6000_add_gc_roots ();
9ebbca7d
GK
717
718 /* Allocate an alias set for register saves & restores from stack. */
719 rs6000_sr_alias_set = new_alias_set ();
720
721 if (TARGET_TOC)
722 ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
71f123ca 723
301d03af
RS
724 /* We can only guarantee the availability of DI pseudo-ops when
725 assembling for 64-bit targets. */
ae6c1efd 726 if (!TARGET_64BIT)
301d03af
RS
727 {
728 targetm.asm_out.aligned_op.di = NULL;
729 targetm.asm_out.unaligned_op.di = NULL;
730 }
731
71f123ca
FS
732 /* Arrange to save and restore machine status around nested functions. */
733 init_machine_status = rs6000_init_machine_status;
5248c961 734}
5accd822 735
a3170dc6
AH
736/* Handle -misel= option. */
737static void
738rs6000_parse_isel_option ()
739{
740 if (rs6000_isel_string == 0)
741 return;
742 else if (! strcmp (rs6000_isel_string, "yes"))
743 rs6000_isel = 1;
744 else if (! strcmp (rs6000_isel_string, "no"))
745 rs6000_isel = 0;
746 else
747 error ("unknown -misel= option specified: '%s'",
748 rs6000_isel_string);
749}
750
08b57fb3
AH
751/* Handle -mvrsave= options. */
752static void
753rs6000_parse_vrsave_option ()
754{
755 /* Generate VRSAVE instructions by default. */
756 if (rs6000_altivec_vrsave_string == 0
757 || ! strcmp (rs6000_altivec_vrsave_string, "yes"))
758 rs6000_altivec_vrsave = 1;
759 else if (! strcmp (rs6000_altivec_vrsave_string, "no"))
760 rs6000_altivec_vrsave = 0;
761 else
762 error ("unknown -mvrsave= option specified: '%s'",
763 rs6000_altivec_vrsave_string);
764}
765
0ac081f6 766/* Handle -mabi= options. */
00b960c7
AH
767static void
768rs6000_parse_abi_options ()
0ac081f6
AH
769{
770 if (rs6000_abi_string == 0)
771 return;
772 else if (! strcmp (rs6000_abi_string, "altivec"))
6fa3f289 773 rs6000_altivec_abi = 1;
76a773f3
AH
774 else if (! strcmp (rs6000_abi_string, "no-altivec"))
775 rs6000_altivec_abi = 0;
a3170dc6
AH
776 else if (! strcmp (rs6000_abi_string, "spe"))
777 rs6000_spe_abi = 1;
778 else if (! strcmp (rs6000_abi_string, "no-spe"))
779 rs6000_spe_abi = 0;
0ac081f6 780 else
c725bd79 781 error ("unknown ABI specified: '%s'", rs6000_abi_string);
0ac081f6
AH
782}
783
5accd822
DE
784void
785optimization_options (level, size)
e2c953b6 786 int level ATTRIBUTE_UNUSED;
5accd822
DE
787 int size ATTRIBUTE_UNUSED;
788{
5accd822 789}
3cfa4909
MM
790\f
791/* Do anything needed at the start of the asm file. */
792
793void
794rs6000_file_start (file, default_cpu)
795 FILE *file;
d330fd93 796 const char *default_cpu;
3cfa4909 797{
c4d38ccb 798 size_t i;
3cfa4909 799 char buffer[80];
d330fd93 800 const char *start = buffer;
3cfa4909
MM
801 struct rs6000_cpu_select *ptr;
802
803 if (flag_verbose_asm)
804 {
805 sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
806 rs6000_select[0].string = default_cpu;
807
b6a1cbae 808 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
3cfa4909
MM
809 {
810 ptr = &rs6000_select[i];
811 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
812 {
813 fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
814 start = "";
815 }
816 }
817
b91da81f 818#ifdef USING_ELFOS_H
3cfa4909
MM
819 switch (rs6000_sdata)
820 {
821 case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
822 case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
823 case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
824 case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
825 }
826
827 if (rs6000_sdata && g_switch_value)
828 {
829 fprintf (file, "%s -G %d", start, g_switch_value);
830 start = "";
831 }
832#endif
833
834 if (*start == '\0')
949ea356 835 putc ('\n', file);
3cfa4909
MM
836 }
837}
5248c961 838\f
a0ab749a 839/* Return nonzero if this function is known to have a null epilogue. */
9878760c
RK
840
841int
842direct_return ()
843{
4697a36c
MM
844 if (reload_completed)
845 {
846 rs6000_stack_t *info = rs6000_stack_info ();
847
848 if (info->first_gp_reg_save == 32
849 && info->first_fp_reg_save == 64
00b960c7 850 && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
c81fc13e
DE
851 && ! info->lr_save_p
852 && ! info->cr_save_p
00b960c7 853 && info->vrsave_mask == 0
c81fc13e 854 && ! info->push_p)
4697a36c
MM
855 return 1;
856 }
857
858 return 0;
9878760c
RK
859}
860
861/* Returns 1 always. */
862
863int
864any_operand (op, mode)
592696dd 865 rtx op ATTRIBUTE_UNUSED;
296b8152 866 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
867{
868 return 1;
869}
870
a4f6c312 871/* Returns 1 if op is the count register. */
38c1f2d7 872int
a4f6c312 873count_register_operand (op, mode)
592696dd 874 rtx op;
296b8152 875 enum machine_mode mode ATTRIBUTE_UNUSED;
b6c9286a
MM
876{
877 if (GET_CODE (op) != REG)
878 return 0;
879
880 if (REGNO (op) == COUNT_REGISTER_REGNUM)
881 return 1;
882
883 if (REGNO (op) > FIRST_PSEUDO_REGISTER)
884 return 1;
885
886 return 0;
887}
888
0ec4e2a8
AH
889/* Returns 1 if op is an altivec register. */
890int
891altivec_register_operand (op, mode)
892 rtx op;
893 enum machine_mode mode ATTRIBUTE_UNUSED;
894{
895
896 return (register_operand (op, mode)
897 && (GET_CODE (op) != REG
898 || REGNO (op) > FIRST_PSEUDO_REGISTER
899 || ALTIVEC_REGNO_P (REGNO (op))));
900}
901
38c1f2d7 902int
a4f6c312 903xer_operand (op, mode)
592696dd 904 rtx op;
296b8152 905 enum machine_mode mode ATTRIBUTE_UNUSED;
802a0058
MM
906{
907 if (GET_CODE (op) != REG)
908 return 0;
909
9ebbca7d 910 if (XER_REGNO_P (REGNO (op)))
802a0058
MM
911 return 1;
912
802a0058
MM
913 return 0;
914}
915
c859cda6 916/* Return 1 if OP is a signed 8-bit constant. Int multiplication
6f317ef3 917 by such constants completes more quickly. */
c859cda6
DJ
918
919int
920s8bit_cint_operand (op, mode)
921 rtx op;
922 enum machine_mode mode ATTRIBUTE_UNUSED;
923{
924 return ( GET_CODE (op) == CONST_INT
925 && (INTVAL (op) >= -128 && INTVAL (op) <= 127));
926}
927
9878760c
RK
928/* Return 1 if OP is a constant that can fit in a D field. */
929
930int
931short_cint_operand (op, mode)
592696dd 932 rtx op;
296b8152 933 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c 934{
5f59ecb7
DE
935 return (GET_CODE (op) == CONST_INT
936 && CONST_OK_FOR_LETTER_P (INTVAL (op), 'I'));
9878760c
RK
937}
938
5519a4f9 939/* Similar for an unsigned D field. */
9878760c
RK
940
941int
942u_short_cint_operand (op, mode)
592696dd 943 rtx op;
296b8152 944 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c 945{
19684119 946 return (GET_CODE (op) == CONST_INT
c1f11548 947 && CONST_OK_FOR_LETTER_P (INTVAL (op) & GET_MODE_MASK (mode), 'K'));
9878760c
RK
948}
949
dcfedcd0
RK
950/* Return 1 if OP is a CONST_INT that cannot fit in a signed D field. */
951
952int
953non_short_cint_operand (op, mode)
592696dd 954 rtx op;
296b8152 955 enum machine_mode mode ATTRIBUTE_UNUSED;
dcfedcd0
RK
956{
957 return (GET_CODE (op) == CONST_INT
a7653a2c 958 && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x8000) >= 0x10000);
dcfedcd0
RK
959}
960
2bfcf297
DB
961/* Returns 1 if OP is a CONST_INT that is a positive value
962 and an exact power of 2. */
963
964int
965exact_log2_cint_operand (op, mode)
592696dd 966 rtx op;
2bfcf297
DB
967 enum machine_mode mode ATTRIBUTE_UNUSED;
968{
969 return (GET_CODE (op) == CONST_INT
970 && INTVAL (op) > 0
971 && exact_log2 (INTVAL (op)) >= 0);
972}
973
9878760c
RK
974/* Returns 1 if OP is a register that is not special (i.e., not MQ,
975 ctr, or lr). */
976
977int
cd2b37d9 978gpc_reg_operand (op, mode)
592696dd 979 rtx op;
9878760c
RK
980 enum machine_mode mode;
981{
982 return (register_operand (op, mode)
802a0058 983 && (GET_CODE (op) != REG
9ebbca7d
GK
984 || (REGNO (op) >= ARG_POINTER_REGNUM
985 && !XER_REGNO_P (REGNO (op)))
986 || REGNO (op) < MQ_REGNO));
9878760c
RK
987}
988
989/* Returns 1 if OP is either a pseudo-register or a register denoting a
990 CR field. */
991
992int
993cc_reg_operand (op, mode)
592696dd 994 rtx op;
9878760c
RK
995 enum machine_mode mode;
996{
997 return (register_operand (op, mode)
998 && (GET_CODE (op) != REG
999 || REGNO (op) >= FIRST_PSEUDO_REGISTER
1000 || CR_REGNO_P (REGNO (op))));
1001}
1002
815cdc52
MM
1003/* Returns 1 if OP is either a pseudo-register or a register denoting a
1004 CR field that isn't CR0. */
1005
1006int
1007cc_reg_not_cr0_operand (op, mode)
592696dd 1008 rtx op;
815cdc52
MM
1009 enum machine_mode mode;
1010{
1011 return (register_operand (op, mode)
1012 && (GET_CODE (op) != REG
1013 || REGNO (op) >= FIRST_PSEUDO_REGISTER
1014 || CR_REGNO_NOT_CR0_P (REGNO (op))));
1015}
1016
a4f6c312
SS
1017/* Returns 1 if OP is either a constant integer valid for a D-field or
1018 a non-special register. If a register, it must be in the proper
1019 mode unless MODE is VOIDmode. */
9878760c
RK
1020
1021int
1022reg_or_short_operand (op, mode)
592696dd 1023 rtx op;
9878760c
RK
1024 enum machine_mode mode;
1025{
f5a28898 1026 return short_cint_operand (op, mode) || gpc_reg_operand (op, mode);
9878760c
RK
1027}
1028
a4f6c312
SS
1029/* Similar, except check if the negation of the constant would be
1030 valid for a D-field. */
9878760c
RK
1031
1032int
1033reg_or_neg_short_operand (op, mode)
592696dd 1034 rtx op;
9878760c
RK
1035 enum machine_mode mode;
1036{
1037 if (GET_CODE (op) == CONST_INT)
1038 return CONST_OK_FOR_LETTER_P (INTVAL (op), 'P');
1039
cd2b37d9 1040 return gpc_reg_operand (op, mode);
9878760c
RK
1041}
1042
768070a0
TR
1043/* Returns 1 if OP is either a constant integer valid for a DS-field or
1044 a non-special register. If a register, it must be in the proper
1045 mode unless MODE is VOIDmode. */
1046
1047int
1048reg_or_aligned_short_operand (op, mode)
1049 rtx op;
1050 enum machine_mode mode;
1051{
1052 if (gpc_reg_operand (op, mode))
1053 return 1;
1054 else if (short_cint_operand (op, mode) && !(INTVAL (op) & 3))
1055 return 1;
1056
1057 return 0;
1058}
1059
1060
a4f6c312
SS
1061/* Return 1 if the operand is either a register or an integer whose
1062 high-order 16 bits are zero. */
9878760c
RK
1063
1064int
1065reg_or_u_short_operand (op, mode)
592696dd 1066 rtx op;
9878760c
RK
1067 enum machine_mode mode;
1068{
e675f625 1069 return u_short_cint_operand (op, mode) || gpc_reg_operand (op, mode);
9878760c
RK
1070}
1071
1072/* Return 1 is the operand is either a non-special register or ANY
1073 constant integer. */
1074
1075int
1076reg_or_cint_operand (op, mode)
592696dd 1077 rtx op;
9878760c
RK
1078 enum machine_mode mode;
1079{
a4f6c312 1080 return (GET_CODE (op) == CONST_INT || gpc_reg_operand (op, mode));
f6bf7de2
DE
1081}
1082
1083/* Return 1 is the operand is either a non-special register or ANY
1084 32-bit signed constant integer. */
1085
1086int
1087reg_or_arith_cint_operand (op, mode)
592696dd 1088 rtx op;
f6bf7de2
DE
1089 enum machine_mode mode;
1090{
a4f6c312
SS
1091 return (gpc_reg_operand (op, mode)
1092 || (GET_CODE (op) == CONST_INT
f6bf7de2 1093#if HOST_BITS_PER_WIDE_INT != 32
a4f6c312
SS
1094 && ((unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80000000)
1095 < (unsigned HOST_WIDE_INT) 0x100000000ll)
f6bf7de2 1096#endif
a4f6c312 1097 ));
9878760c
RK
1098}
1099
2bfcf297
DB
1100/* Return 1 is the operand is either a non-special register or a 32-bit
1101 signed constant integer valid for 64-bit addition. */
1102
1103int
1104reg_or_add_cint64_operand (op, mode)
592696dd 1105 rtx op;
2bfcf297
DB
1106 enum machine_mode mode;
1107{
a4f6c312
SS
1108 return (gpc_reg_operand (op, mode)
1109 || (GET_CODE (op) == CONST_INT
a65c591c 1110#if HOST_BITS_PER_WIDE_INT == 32
a4f6c312 1111 && INTVAL (op) < 0x7fff8000
a65c591c 1112#else
a4f6c312
SS
1113 && ((unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80008000)
1114 < 0x100000000ll)
2bfcf297 1115#endif
a4f6c312 1116 ));
2bfcf297
DB
1117}
1118
1119/* Return 1 is the operand is either a non-special register or a 32-bit
1120 signed constant integer valid for 64-bit subtraction. */
1121
1122int
1123reg_or_sub_cint64_operand (op, mode)
592696dd 1124 rtx op;
2bfcf297
DB
1125 enum machine_mode mode;
1126{
a4f6c312
SS
1127 return (gpc_reg_operand (op, mode)
1128 || (GET_CODE (op) == CONST_INT
a65c591c 1129#if HOST_BITS_PER_WIDE_INT == 32
a4f6c312 1130 && (- INTVAL (op)) < 0x7fff8000
a65c591c 1131#else
a4f6c312
SS
1132 && ((unsigned HOST_WIDE_INT) ((- INTVAL (op)) + 0x80008000)
1133 < 0x100000000ll)
2bfcf297 1134#endif
a4f6c312 1135 ));
2bfcf297
DB
1136}
1137
9ebbca7d
GK
1138/* Return 1 is the operand is either a non-special register or ANY
1139 32-bit unsigned constant integer. */
1140
1141int
1d328b19 1142reg_or_logical_cint_operand (op, mode)
592696dd 1143 rtx op;
9ebbca7d
GK
1144 enum machine_mode mode;
1145{
1d328b19
GK
1146 if (GET_CODE (op) == CONST_INT)
1147 {
1148 if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
1149 {
1150 if (GET_MODE_BITSIZE (mode) <= 32)
a4f6c312 1151 abort ();
1d328b19
GK
1152
1153 if (INTVAL (op) < 0)
1154 return 0;
1155 }
1156
1157 return ((INTVAL (op) & GET_MODE_MASK (mode)
0858c623 1158 & (~ (unsigned HOST_WIDE_INT) 0xffffffff)) == 0);
1d328b19
GK
1159 }
1160 else if (GET_CODE (op) == CONST_DOUBLE)
1161 {
1162 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
1163 || mode != DImode)
a4f6c312 1164 abort ();
1d328b19
GK
1165
1166 return CONST_DOUBLE_HIGH (op) == 0;
1167 }
1168 else
1169 return gpc_reg_operand (op, mode);
9ebbca7d
GK
1170}
1171
51d3e7d6 1172/* Return 1 if the operand is an operand that can be loaded via the GOT. */
766a866c
MM
1173
1174int
1175got_operand (op, mode)
592696dd 1176 rtx op;
296b8152 1177 enum machine_mode mode ATTRIBUTE_UNUSED;
766a866c
MM
1178{
1179 return (GET_CODE (op) == SYMBOL_REF
1180 || GET_CODE (op) == CONST
1181 || GET_CODE (op) == LABEL_REF);
1182}
1183
38c1f2d7
MM
1184/* Return 1 if the operand is a simple references that can be loaded via
1185 the GOT (labels involving addition aren't allowed). */
1186
1187int
1188got_no_const_operand (op, mode)
592696dd 1189 rtx op;
296b8152 1190 enum machine_mode mode ATTRIBUTE_UNUSED;
38c1f2d7
MM
1191{
1192 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF);
1193}
1194
4e74d8ec
MM
1195/* Return the number of instructions it takes to form a constant in an
1196 integer register. */
1197
1198static int
1199num_insns_constant_wide (value)
1200 HOST_WIDE_INT value;
1201{
1202 /* signed constant loadable with {cal|addi} */
5f59ecb7 1203 if (CONST_OK_FOR_LETTER_P (value, 'I'))
0865c631
GK
1204 return 1;
1205
4e74d8ec 1206 /* constant loadable with {cau|addis} */
5f59ecb7 1207 else if (CONST_OK_FOR_LETTER_P (value, 'L'))
4e74d8ec
MM
1208 return 1;
1209
5f59ecb7 1210#if HOST_BITS_PER_WIDE_INT == 64
c81fc13e 1211 else if (TARGET_POWERPC64)
4e74d8ec 1212 {
a65c591c
DE
1213 HOST_WIDE_INT low = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
1214 HOST_WIDE_INT high = value >> 31;
4e74d8ec 1215
a65c591c 1216 if (high == 0 || high == -1)
4e74d8ec
MM
1217 return 2;
1218
a65c591c 1219 high >>= 1;
4e74d8ec 1220
a65c591c 1221 if (low == 0)
4e74d8ec 1222 return num_insns_constant_wide (high) + 1;
4e74d8ec
MM
1223 else
1224 return (num_insns_constant_wide (high)
e396202a 1225 + num_insns_constant_wide (low) + 1);
4e74d8ec
MM
1226 }
1227#endif
1228
1229 else
1230 return 2;
1231}
1232
1233int
1234num_insns_constant (op, mode)
1235 rtx op;
1236 enum machine_mode mode;
1237{
4e74d8ec 1238 if (GET_CODE (op) == CONST_INT)
0d30d435
DE
1239 {
1240#if HOST_BITS_PER_WIDE_INT == 64
4e2c1c44
DE
1241 if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
1242 && mask64_operand (op, mode))
0d30d435
DE
1243 return 2;
1244 else
1245#endif
1246 return num_insns_constant_wide (INTVAL (op));
1247 }
4e74d8ec 1248
6fc48950
MM
1249 else if (GET_CODE (op) == CONST_DOUBLE && mode == SFmode)
1250 {
1251 long l;
1252 REAL_VALUE_TYPE rv;
1253
1254 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1255 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
e72247f4 1256 return num_insns_constant_wide ((HOST_WIDE_INT) l);
6fc48950
MM
1257 }
1258
47ad8c61 1259 else if (GET_CODE (op) == CONST_DOUBLE)
4e74d8ec 1260 {
47ad8c61
MM
1261 HOST_WIDE_INT low;
1262 HOST_WIDE_INT high;
1263 long l[2];
1264 REAL_VALUE_TYPE rv;
1265 int endian = (WORDS_BIG_ENDIAN == 0);
4e74d8ec 1266
47ad8c61
MM
1267 if (mode == VOIDmode || mode == DImode)
1268 {
1269 high = CONST_DOUBLE_HIGH (op);
1270 low = CONST_DOUBLE_LOW (op);
1271 }
1272 else
1273 {
1274 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1275 REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
1276 high = l[endian];
1277 low = l[1 - endian];
1278 }
4e74d8ec 1279
47ad8c61
MM
1280 if (TARGET_32BIT)
1281 return (num_insns_constant_wide (low)
1282 + num_insns_constant_wide (high));
4e74d8ec
MM
1283
1284 else
47ad8c61 1285 {
e72247f4 1286 if (high == 0 && low >= 0)
47ad8c61
MM
1287 return num_insns_constant_wide (low);
1288
e72247f4 1289 else if (high == -1 && low < 0)
47ad8c61
MM
1290 return num_insns_constant_wide (low);
1291
a260abc9
DE
1292 else if (mask64_operand (op, mode))
1293 return 2;
1294
47ad8c61
MM
1295 else if (low == 0)
1296 return num_insns_constant_wide (high) + 1;
1297
1298 else
1299 return (num_insns_constant_wide (high)
1300 + num_insns_constant_wide (low) + 1);
1301 }
4e74d8ec
MM
1302 }
1303
1304 else
1305 abort ();
1306}
1307
a4f6c312
SS
1308/* Return 1 if the operand is a CONST_DOUBLE and it can be put into a
1309 register with one instruction per word. We only do this if we can
1310 safely read CONST_DOUBLE_{LOW,HIGH}. */
9878760c
RK
1311
1312int
1313easy_fp_constant (op, mode)
592696dd
SS
1314 rtx op;
1315 enum machine_mode mode;
9878760c 1316{
9878760c
RK
1317 if (GET_CODE (op) != CONST_DOUBLE
1318 || GET_MODE (op) != mode
4e74d8ec 1319 || (GET_MODE_CLASS (mode) != MODE_FLOAT && mode != DImode))
9878760c
RK
1320 return 0;
1321
a4f6c312 1322 /* Consider all constants with -msoft-float to be easy. */
a3170dc6
AH
1323 if ((TARGET_SOFT_FLOAT || !TARGET_FPRS)
1324 && mode != DImode)
b6c9286a
MM
1325 return 1;
1326
a4f6c312 1327 /* If we are using V.4 style PIC, consider all constants to be hard. */
f607bc57 1328 if (flag_pic && DEFAULT_ABI == ABI_V4)
a7273471
MM
1329 return 0;
1330
5ae4759c 1331#ifdef TARGET_RELOCATABLE
a4f6c312
SS
1332 /* Similarly if we are using -mrelocatable, consider all constants
1333 to be hard. */
5ae4759c
MM
1334 if (TARGET_RELOCATABLE)
1335 return 0;
1336#endif
1337
fcce224d
DE
1338 if (mode == TFmode)
1339 {
1340 long k[4];
1341 REAL_VALUE_TYPE rv;
1342
1343 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1344 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
1345
1346 return (num_insns_constant_wide ((HOST_WIDE_INT) k[0]) == 1
1347 && num_insns_constant_wide ((HOST_WIDE_INT) k[1]) == 1
1348 && num_insns_constant_wide ((HOST_WIDE_INT) k[2]) == 1
1349 && num_insns_constant_wide ((HOST_WIDE_INT) k[3]) == 1);
1350 }
1351
1352 else if (mode == DFmode)
042259f2
DE
1353 {
1354 long k[2];
1355 REAL_VALUE_TYPE rv;
1356
1357 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1358 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
9878760c 1359
a65c591c
DE
1360 return (num_insns_constant_wide ((HOST_WIDE_INT) k[0]) == 1
1361 && num_insns_constant_wide ((HOST_WIDE_INT) k[1]) == 1);
042259f2 1362 }
4e74d8ec
MM
1363
1364 else if (mode == SFmode)
042259f2
DE
1365 {
1366 long l;
1367 REAL_VALUE_TYPE rv;
1368
1369 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1370 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
9878760c 1371
4e74d8ec 1372 return num_insns_constant_wide (l) == 1;
042259f2 1373 }
4e74d8ec 1374
a260abc9 1375 else if (mode == DImode)
c81fc13e 1376 return ((TARGET_POWERPC64
a260abc9
DE
1377 && GET_CODE (op) == CONST_DOUBLE && CONST_DOUBLE_LOW (op) == 0)
1378 || (num_insns_constant (op, DImode) <= 2));
4e74d8ec 1379
a9098fd0
GK
1380 else if (mode == SImode)
1381 return 1;
4e74d8ec
MM
1382 else
1383 abort ();
9878760c 1384}
8f75773e 1385
69ef87e2
AH
1386/* Return 1 if the operand is a CONST_INT and can be put into a
1387 register with one instruction. */
1388
1389static int
1390easy_vector_constant (op)
1391 rtx op;
1392{
1393 rtx elt;
1394 int units, i;
1395
1396 if (GET_CODE (op) != CONST_VECTOR)
1397 return 0;
1398
1399 units = CONST_VECTOR_NUNITS (op);
1400
1401 /* We can generate 0 easily. Look for that. */
1402 for (i = 0; i < units; ++i)
1403 {
1404 elt = CONST_VECTOR_ELT (op, i);
1405
1406 /* We could probably simplify this by just checking for equality
1407 with CONST0_RTX for the current mode, but let's be safe
1408 instead. */
1409
98ef3137
JJ
1410 switch (GET_CODE (elt))
1411 {
1412 case CONST_INT:
1413 if (INTVAL (elt) != 0)
1414 return 0;
1415 break;
1416 case CONST_DOUBLE:
1417 if (CONST_DOUBLE_LOW (elt) != 0 || CONST_DOUBLE_HIGH (elt) != 0)
1418 return 0;
1419 break;
1420 default:
1421 return 0;
1422 }
69ef87e2
AH
1423 }
1424
1425 /* We could probably generate a few other constants trivially, but
1426 gcc doesn't generate them yet. FIXME later. */
98ef3137 1427 return 1;
69ef87e2
AH
1428}
1429
1430/* Return 1 if the operand is the constant 0. This works for scalars
1431 as well as vectors. */
1432int
1433zero_constant (op, mode)
1434 rtx op;
1435 enum machine_mode mode;
1436{
1437 return op == CONST0_RTX (mode);
1438}
1439
50a0b056
GK
1440/* Return 1 if the operand is 0.0. */
1441int
1442zero_fp_constant (op, mode)
592696dd
SS
1443 rtx op;
1444 enum machine_mode mode;
50a0b056
GK
1445{
1446 return GET_MODE_CLASS (mode) == MODE_FLOAT && op == CONST0_RTX (mode);
1447}
1448
a4f6c312
SS
1449/* Return 1 if the operand is in volatile memory. Note that during
1450 the RTL generation phase, memory_operand does not return TRUE for
b6c9286a
MM
1451 volatile memory references. So this function allows us to
1452 recognize volatile references where its safe. */
1453
1454int
1455volatile_mem_operand (op, mode)
592696dd 1456 rtx op;
b6c9286a
MM
1457 enum machine_mode mode;
1458{
1459 if (GET_CODE (op) != MEM)
1460 return 0;
1461
1462 if (!MEM_VOLATILE_P (op))
1463 return 0;
1464
1465 if (mode != GET_MODE (op))
1466 return 0;
1467
1468 if (reload_completed)
1469 return memory_operand (op, mode);
1470
1471 if (reload_in_progress)
1472 return strict_memory_address_p (mode, XEXP (op, 0));
1473
1474 return memory_address_p (mode, XEXP (op, 0));
1475}
1476
97f6e72f 1477/* Return 1 if the operand is an offsettable memory operand. */
914c2e77
RK
1478
1479int
97f6e72f 1480offsettable_mem_operand (op, mode)
592696dd 1481 rtx op;
914c2e77
RK
1482 enum machine_mode mode;
1483{
97f6e72f 1484 return ((GET_CODE (op) == MEM)
677a9668 1485 && offsettable_address_p (reload_completed || reload_in_progress,
97f6e72f 1486 mode, XEXP (op, 0)));
914c2e77
RK
1487}
1488
9878760c
RK
1489/* Return 1 if the operand is either an easy FP constant (see above) or
1490 memory. */
1491
1492int
1493mem_or_easy_const_operand (op, mode)
592696dd 1494 rtx op;
9878760c
RK
1495 enum machine_mode mode;
1496{
1497 return memory_operand (op, mode) || easy_fp_constant (op, mode);
1498}
1499
1500/* Return 1 if the operand is either a non-special register or an item
5f59ecb7 1501 that can be used as the operand of a `mode' add insn. */
9878760c
RK
1502
1503int
1504add_operand (op, mode)
592696dd 1505 rtx op;
9878760c
RK
1506 enum machine_mode mode;
1507{
2bfcf297 1508 if (GET_CODE (op) == CONST_INT)
e72247f4
DE
1509 return (CONST_OK_FOR_LETTER_P (INTVAL (op), 'I')
1510 || CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'));
2bfcf297
DB
1511
1512 return gpc_reg_operand (op, mode);
9878760c
RK
1513}
1514
dcfedcd0
RK
1515/* Return 1 if OP is a constant but not a valid add_operand. */
1516
1517int
1518non_add_cint_operand (op, mode)
592696dd 1519 rtx op;
296b8152 1520 enum machine_mode mode ATTRIBUTE_UNUSED;
dcfedcd0
RK
1521{
1522 return (GET_CODE (op) == CONST_INT
e72247f4
DE
1523 && !CONST_OK_FOR_LETTER_P (INTVAL (op), 'I')
1524 && !CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'));
dcfedcd0
RK
1525}
1526
9878760c
RK
1527/* Return 1 if the operand is a non-special register or a constant that
1528 can be used as the operand of an OR or XOR insn on the RS/6000. */
1529
1530int
1531logical_operand (op, mode)
592696dd 1532 rtx op;
9878760c
RK
1533 enum machine_mode mode;
1534{
40501e5f 1535 HOST_WIDE_INT opl, oph;
1d328b19 1536
dfbdccdb
GK
1537 if (gpc_reg_operand (op, mode))
1538 return 1;
1d328b19 1539
dfbdccdb 1540 if (GET_CODE (op) == CONST_INT)
40501e5f
AM
1541 {
1542 opl = INTVAL (op) & GET_MODE_MASK (mode);
1543
1544#if HOST_BITS_PER_WIDE_INT <= 32
1545 if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT && opl < 0)
1546 return 0;
1547#endif
1548 }
dfbdccdb
GK
1549 else if (GET_CODE (op) == CONST_DOUBLE)
1550 {
1d328b19 1551 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
40501e5f 1552 abort ();
1d328b19
GK
1553
1554 opl = CONST_DOUBLE_LOW (op);
1555 oph = CONST_DOUBLE_HIGH (op);
40501e5f 1556 if (oph != 0)
38886f37 1557 return 0;
dfbdccdb
GK
1558 }
1559 else
1560 return 0;
1d328b19 1561
40501e5f
AM
1562 return ((opl & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0
1563 || (opl & ~ (unsigned HOST_WIDE_INT) 0xffff0000) == 0);
9878760c
RK
1564}
1565
dcfedcd0 1566/* Return 1 if C is a constant that is not a logical operand (as
1d328b19 1567 above), but could be split into one. */
dcfedcd0
RK
1568
1569int
1570non_logical_cint_operand (op, mode)
592696dd 1571 rtx op;
5f59ecb7 1572 enum machine_mode mode;
dcfedcd0 1573{
dfbdccdb 1574 return ((GET_CODE (op) == CONST_INT || GET_CODE (op) == CONST_DOUBLE)
1d328b19
GK
1575 && ! logical_operand (op, mode)
1576 && reg_or_logical_cint_operand (op, mode));
dcfedcd0
RK
1577}
1578
19ba8161 1579/* Return 1 if C is a constant that can be encoded in a 32-bit mask on the
9878760c
RK
1580 RS/6000. It is if there are no more than two 1->0 or 0->1 transitions.
1581 Reject all ones and all zeros, since these should have been optimized
1582 away and confuse the making of MB and ME. */
1583
1584int
19ba8161 1585mask_operand (op, mode)
592696dd 1586 rtx op;
19ba8161 1587 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c 1588{
02071907 1589 HOST_WIDE_INT c, lsb;
9878760c 1590
19ba8161
DE
1591 if (GET_CODE (op) != CONST_INT)
1592 return 0;
1593
1594 c = INTVAL (op);
1595
57deb3a1
AM
1596 /* Fail in 64-bit mode if the mask wraps around because the upper
1597 32-bits of the mask will all be 1s, contrary to GCC's internal view. */
1598 if (TARGET_POWERPC64 && (c & 0x80000001) == 0x80000001)
1599 return 0;
1600
c5059423
AM
1601 /* We don't change the number of transitions by inverting,
1602 so make sure we start with the LS bit zero. */
1603 if (c & 1)
1604 c = ~c;
1605
1606 /* Reject all zeros or all ones. */
1607 if (c == 0)
9878760c
RK
1608 return 0;
1609
c5059423
AM
1610 /* Find the first transition. */
1611 lsb = c & -c;
1612
1613 /* Invert to look for a second transition. */
1614 c = ~c;
9878760c 1615
c5059423
AM
1616 /* Erase first transition. */
1617 c &= -lsb;
9878760c 1618
c5059423
AM
1619 /* Find the second transition (if any). */
1620 lsb = c & -c;
1621
1622 /* Match if all the bits above are 1's (or c is zero). */
1623 return c == -lsb;
9878760c
RK
1624}
1625
0ba1b2ff
AM
1626/* Return 1 for the PowerPC64 rlwinm corner case. */
1627
1628int
1629mask_operand_wrap (op, mode)
1630 rtx op;
1631 enum machine_mode mode ATTRIBUTE_UNUSED;
1632{
1633 HOST_WIDE_INT c, lsb;
1634
1635 if (GET_CODE (op) != CONST_INT)
1636 return 0;
1637
1638 c = INTVAL (op);
1639
1640 if ((c & 0x80000001) != 0x80000001)
1641 return 0;
1642
1643 c = ~c;
1644 if (c == 0)
1645 return 0;
1646
1647 lsb = c & -c;
1648 c = ~c;
1649 c &= -lsb;
1650 lsb = c & -c;
1651 return c == -lsb;
1652}
1653
a260abc9
DE
1654/* Return 1 if the operand is a constant that is a PowerPC64 mask.
1655 It is if there are no more than one 1->0 or 0->1 transitions.
0ba1b2ff
AM
1656 Reject all zeros, since zero should have been optimized away and
1657 confuses the making of MB and ME. */
9878760c
RK
1658
1659int
a260abc9 1660mask64_operand (op, mode)
592696dd 1661 rtx op;
0ba1b2ff 1662 enum machine_mode mode ATTRIBUTE_UNUSED;
a260abc9
DE
1663{
1664 if (GET_CODE (op) == CONST_INT)
1665 {
02071907 1666 HOST_WIDE_INT c, lsb;
a260abc9 1667
c5059423 1668 c = INTVAL (op);
a260abc9 1669
0ba1b2ff 1670 /* Reject all zeros. */
c5059423 1671 if (c == 0)
e2c953b6
DE
1672 return 0;
1673
0ba1b2ff
AM
1674 /* We don't change the number of transitions by inverting,
1675 so make sure we start with the LS bit zero. */
1676 if (c & 1)
1677 c = ~c;
1678
c5059423
AM
1679 /* Find the transition, and check that all bits above are 1's. */
1680 lsb = c & -c;
1681 return c == -lsb;
e2c953b6 1682 }
0ba1b2ff
AM
1683 return 0;
1684}
1685
1686/* Like mask64_operand, but allow up to three transitions. This
1687 predicate is used by insn patterns that generate two rldicl or
1688 rldicr machine insns. */
1689
1690int
1691mask64_2_operand (op, mode)
1692 rtx op;
1693 enum machine_mode mode ATTRIBUTE_UNUSED;
1694{
1695 if (GET_CODE (op) == CONST_INT)
a260abc9 1696 {
0ba1b2ff 1697 HOST_WIDE_INT c, lsb;
a260abc9 1698
0ba1b2ff 1699 c = INTVAL (op);
a260abc9 1700
0ba1b2ff
AM
1701 /* Disallow all zeros. */
1702 if (c == 0)
1703 return 0;
a260abc9 1704
0ba1b2ff
AM
1705 /* We don't change the number of transitions by inverting,
1706 so make sure we start with the LS bit zero. */
1707 if (c & 1)
1708 c = ~c;
a260abc9 1709
0ba1b2ff
AM
1710 /* Find the first transition. */
1711 lsb = c & -c;
a260abc9 1712
0ba1b2ff
AM
1713 /* Invert to look for a second transition. */
1714 c = ~c;
1715
1716 /* Erase first transition. */
1717 c &= -lsb;
1718
1719 /* Find the second transition. */
1720 lsb = c & -c;
1721
1722 /* Invert to look for a third transition. */
1723 c = ~c;
1724
1725 /* Erase second transition. */
1726 c &= -lsb;
1727
1728 /* Find the third transition (if any). */
1729 lsb = c & -c;
1730
1731 /* Match if all the bits above are 1's (or c is zero). */
1732 return c == -lsb;
1733 }
1734 return 0;
1735}
1736
1737/* Generates shifts and masks for a pair of rldicl or rldicr insns to
1738 implement ANDing by the mask IN. */
1739void
1740build_mask64_2_operands (in, out)
1741 rtx in;
1742 rtx *out;
1743{
1744#if HOST_BITS_PER_WIDE_INT >= 64
1745 unsigned HOST_WIDE_INT c, lsb, m1, m2;
1746 int shift;
1747
1748 if (GET_CODE (in) != CONST_INT)
1749 abort ();
1750
1751 c = INTVAL (in);
1752 if (c & 1)
1753 {
1754 /* Assume c initially something like 0x00fff000000fffff. The idea
1755 is to rotate the word so that the middle ^^^^^^ group of zeros
1756 is at the MS end and can be cleared with an rldicl mask. We then
1757 rotate back and clear off the MS ^^ group of zeros with a
1758 second rldicl. */
1759 c = ~c; /* c == 0xff000ffffff00000 */
1760 lsb = c & -c; /* lsb == 0x0000000000100000 */
1761 m1 = -lsb; /* m1 == 0xfffffffffff00000 */
1762 c = ~c; /* c == 0x00fff000000fffff */
1763 c &= -lsb; /* c == 0x00fff00000000000 */
1764 lsb = c & -c; /* lsb == 0x0000100000000000 */
1765 c = ~c; /* c == 0xff000fffffffffff */
1766 c &= -lsb; /* c == 0xff00000000000000 */
1767 shift = 0;
1768 while ((lsb >>= 1) != 0)
1769 shift++; /* shift == 44 on exit from loop */
1770 m1 <<= 64 - shift; /* m1 == 0xffffff0000000000 */
1771 m1 = ~m1; /* m1 == 0x000000ffffffffff */
1772 m2 = ~c; /* m2 == 0x00ffffffffffffff */
a260abc9
DE
1773 }
1774 else
0ba1b2ff
AM
1775 {
1776 /* Assume c initially something like 0xff000f0000000000. The idea
1777 is to rotate the word so that the ^^^ middle group of zeros
1778 is at the LS end and can be cleared with an rldicr mask. We then
1779 rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
1780 a second rldicr. */
1781 lsb = c & -c; /* lsb == 0x0000010000000000 */
1782 m2 = -lsb; /* m2 == 0xffffff0000000000 */
1783 c = ~c; /* c == 0x00fff0ffffffffff */
1784 c &= -lsb; /* c == 0x00fff00000000000 */
1785 lsb = c & -c; /* lsb == 0x0000100000000000 */
1786 c = ~c; /* c == 0xff000fffffffffff */
1787 c &= -lsb; /* c == 0xff00000000000000 */
1788 shift = 0;
1789 while ((lsb >>= 1) != 0)
1790 shift++; /* shift == 44 on exit from loop */
1791 m1 = ~c; /* m1 == 0x00ffffffffffffff */
1792 m1 >>= shift; /* m1 == 0x0000000000000fff */
1793 m1 = ~m1; /* m1 == 0xfffffffffffff000 */
1794 }
1795
1796 /* Note that when we only have two 0->1 and 1->0 transitions, one of the
1797 masks will be all 1's. We are guaranteed more than one transition. */
1798 out[0] = GEN_INT (64 - shift);
1799 out[1] = GEN_INT (m1);
1800 out[2] = GEN_INT (shift);
1801 out[3] = GEN_INT (m2);
1802#else
045572c7
GK
1803 (void)in;
1804 (void)out;
0ba1b2ff
AM
1805 abort ();
1806#endif
a260abc9
DE
1807}
1808
1809/* Return 1 if the operand is either a non-special register or a constant
1810 that can be used as the operand of a PowerPC64 logical AND insn. */
1811
1812int
1813and64_operand (op, mode)
592696dd 1814 rtx op;
9878760c
RK
1815 enum machine_mode mode;
1816{
a4f6c312 1817 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
52d3af72
DE
1818 return (gpc_reg_operand (op, mode) || mask64_operand (op, mode));
1819
1820 return (logical_operand (op, mode) || mask64_operand (op, mode));
9878760c
RK
1821}
1822
0ba1b2ff
AM
1823/* Like the above, but also match constants that can be implemented
1824 with two rldicl or rldicr insns. */
1825
1826int
1827and64_2_operand (op, mode)
1828 rtx op;
1829 enum machine_mode mode;
1830{
1831 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
1832 return gpc_reg_operand (op, mode) || mask64_2_operand (op, mode);
1833
1834 return logical_operand (op, mode) || mask64_2_operand (op, mode);
1835}
1836
a260abc9
DE
1837/* Return 1 if the operand is either a non-special register or a
1838 constant that can be used as the operand of an RS/6000 logical AND insn. */
dcfedcd0
RK
1839
1840int
a260abc9 1841and_operand (op, mode)
592696dd 1842 rtx op;
a260abc9 1843 enum machine_mode mode;
dcfedcd0 1844{
a4f6c312 1845 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
52d3af72
DE
1846 return (gpc_reg_operand (op, mode) || mask_operand (op, mode));
1847
1848 return (logical_operand (op, mode) || mask_operand (op, mode));
dcfedcd0
RK
1849}
1850
9878760c
RK
1851/* Return 1 if the operand is a general register or memory operand. */
1852
1853int
1854reg_or_mem_operand (op, mode)
592696dd
SS
1855 rtx op;
1856 enum machine_mode mode;
9878760c 1857{
b6c9286a
MM
1858 return (gpc_reg_operand (op, mode)
1859 || memory_operand (op, mode)
1860 || volatile_mem_operand (op, mode));
9878760c
RK
1861}
1862
a7a813f7 1863/* Return 1 if the operand is a general register or memory operand without
3cb999d8 1864 pre_inc or pre_dec which produces invalid form of PowerPC lwa
a7a813f7
RK
1865 instruction. */
1866
1867int
1868lwa_operand (op, mode)
592696dd
SS
1869 rtx op;
1870 enum machine_mode mode;
a7a813f7
RK
1871{
1872 rtx inner = op;
1873
1874 if (reload_completed && GET_CODE (inner) == SUBREG)
1875 inner = SUBREG_REG (inner);
1876
1877 return gpc_reg_operand (inner, mode)
1878 || (memory_operand (inner, mode)
1879 && GET_CODE (XEXP (inner, 0)) != PRE_INC
6a40a9d6
DE
1880 && GET_CODE (XEXP (inner, 0)) != PRE_DEC
1881 && (GET_CODE (XEXP (inner, 0)) != PLUS
e903c96a
DE
1882 || GET_CODE (XEXP (XEXP (inner, 0), 1)) != CONST_INT
1883 || INTVAL (XEXP (XEXP (inner, 0), 1)) % 4 == 0));
a7a813f7
RK
1884}
1885
cc4d5fec
JH
1886/* Return 1 if the operand, used inside a MEM, is a SYMBOL_REF. */
1887
1888int
1889symbol_ref_operand (op, mode)
1890 rtx op;
1891 enum machine_mode mode;
1892{
1893 if (mode != VOIDmode && GET_MODE (op) != mode)
1894 return 0;
1895
1896 return (GET_CODE (op) == SYMBOL_REF);
1897}
1898
9878760c 1899/* Return 1 if the operand, used inside a MEM, is a valid first argument
cc4d5fec 1900 to CALL. This is a SYMBOL_REF, a pseudo-register, LR or CTR. */
9878760c
RK
1901
1902int
1903call_operand (op, mode)
592696dd 1904 rtx op;
9878760c
RK
1905 enum machine_mode mode;
1906{
1907 if (mode != VOIDmode && GET_MODE (op) != mode)
1908 return 0;
1909
1910 return (GET_CODE (op) == SYMBOL_REF
cc4d5fec
JH
1911 || (GET_CODE (op) == REG
1912 && (REGNO (op) == LINK_REGISTER_REGNUM
1913 || REGNO (op) == COUNT_REGISTER_REGNUM
1914 || REGNO (op) >= FIRST_PSEUDO_REGISTER)));
9878760c
RK
1915}
1916
2af3d377 1917/* Return 1 if the operand is a SYMBOL_REF for a function known to be in
a4f6c312 1918 this file and the function is not weakly defined. */
2af3d377
RK
1919
1920int
1921current_file_function_operand (op, mode)
592696dd 1922 rtx op;
296b8152 1923 enum machine_mode mode ATTRIBUTE_UNUSED;
2af3d377
RK
1924{
1925 return (GET_CODE (op) == SYMBOL_REF
1926 && (SYMBOL_REF_FLAG (op)
8f1b829e 1927 || (op == XEXP (DECL_RTL (current_function_decl), 0)
c81fc13e 1928 && ! DECL_WEAK (current_function_decl))));
2af3d377
RK
1929}
1930
9878760c
RK
1931/* Return 1 if this operand is a valid input for a move insn. */
1932
1933int
1934input_operand (op, mode)
592696dd 1935 rtx op;
9878760c
RK
1936 enum machine_mode mode;
1937{
eb4e8003 1938 /* Memory is always valid. */
9878760c
RK
1939 if (memory_operand (op, mode))
1940 return 1;
1941
34792e82 1942 /* Only a tiny bit of handling for CONSTANT_P_RTX is necessary. */
01b4cf2b 1943 if (GET_CODE (op) == CONSTANT_P_RTX)
34792e82
JL
1944 return 1;
1945
eb4e8003
RK
1946 /* For floating-point, easy constants are valid. */
1947 if (GET_MODE_CLASS (mode) == MODE_FLOAT
1948 && CONSTANT_P (op)
1949 && easy_fp_constant (op, mode))
1950 return 1;
1951
4e74d8ec
MM
1952 /* Allow any integer constant. */
1953 if (GET_MODE_CLASS (mode) == MODE_INT
e675f625 1954 && (GET_CODE (op) == CONST_INT
e675f625 1955 || GET_CODE (op) == CONST_DOUBLE))
4e74d8ec
MM
1956 return 1;
1957
eb4e8003
RK
1958 /* For floating-point or multi-word mode, the only remaining valid type
1959 is a register. */
9878760c
RK
1960 if (GET_MODE_CLASS (mode) == MODE_FLOAT
1961 || GET_MODE_SIZE (mode) > UNITS_PER_WORD)
eb4e8003 1962 return register_operand (op, mode);
9878760c 1963
88fe15a1
RK
1964 /* The only cases left are integral modes one word or smaller (we
1965 do not get called for MODE_CC values). These can be in any
1966 register. */
1967 if (register_operand (op, mode))
a8b3aeda 1968 return 1;
88fe15a1 1969
84cf9dda 1970 /* A SYMBOL_REF referring to the TOC is valid. */
7fec4abd 1971 if (LEGITIMATE_CONSTANT_POOL_ADDRESS_P (op))
84cf9dda
RK
1972 return 1;
1973
9ebbca7d
GK
1974 /* A constant pool expression (relative to the TOC) is valid */
1975 if (TOC_RELATIVE_EXPR_P (op))
b6c9286a
MM
1976 return 1;
1977
88228c4b
MM
1978 /* V.4 allows SYMBOL_REFs and CONSTs that are in the small data region
1979 to be valid. */
f607bc57 1980 if (DEFAULT_ABI == ABI_V4
88228c4b
MM
1981 && (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST)
1982 && small_data_operand (op, Pmode))
1983 return 1;
1984
042259f2 1985 return 0;
9878760c 1986}
7509c759 1987
a4f6c312 1988/* Return 1 for an operand in small memory on V.4/eabi. */
7509c759
MM
1989
1990int
1991small_data_operand (op, mode)
296b8152
KG
1992 rtx op ATTRIBUTE_UNUSED;
1993 enum machine_mode mode ATTRIBUTE_UNUSED;
7509c759 1994{
38c1f2d7 1995#if TARGET_ELF
5f59ecb7 1996 rtx sym_ref;
7509c759 1997
d9407988 1998 if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
a54d04b7 1999 return 0;
a54d04b7 2000
f607bc57 2001 if (DEFAULT_ABI != ABI_V4)
7509c759
MM
2002 return 0;
2003
88228c4b
MM
2004 if (GET_CODE (op) == SYMBOL_REF)
2005 sym_ref = op;
2006
2007 else if (GET_CODE (op) != CONST
2008 || GET_CODE (XEXP (op, 0)) != PLUS
2009 || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
2010 || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
7509c759
MM
2011 return 0;
2012
88228c4b 2013 else
dbf55e53
MM
2014 {
2015 rtx sum = XEXP (op, 0);
2016 HOST_WIDE_INT summand;
2017
2018 /* We have to be careful here, because it is the referenced address
2019 that must be 32k from _SDA_BASE_, not just the symbol. */
2020 summand = INTVAL (XEXP (sum, 1));
2021 if (summand < 0 || summand > g_switch_value)
2022 return 0;
2023
2024 sym_ref = XEXP (sum, 0);
2025 }
88228c4b
MM
2026
2027 if (*XSTR (sym_ref, 0) != '@')
7509c759
MM
2028 return 0;
2029
2030 return 1;
d9407988
MM
2031
2032#else
2033 return 0;
2034#endif
7509c759 2035}
9ebbca7d
GK
2036\f
2037static int
2038constant_pool_expr_1 (op, have_sym, have_toc)
2039 rtx op;
2040 int *have_sym;
2041 int *have_toc;
2042{
2043 switch (GET_CODE(op))
2044 {
2045 case SYMBOL_REF:
a4f6c312
SS
2046 if (CONSTANT_POOL_ADDRESS_P (op))
2047 {
2048 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (op), Pmode))
2049 {
2050 *have_sym = 1;
2051 return 1;
2052 }
2053 else
2054 return 0;
2055 }
2056 else if (! strcmp (XSTR (op, 0), toc_label_name))
2057 {
2058 *have_toc = 1;
2059 return 1;
2060 }
2061 else
2062 return 0;
9ebbca7d
GK
2063 case PLUS:
2064 case MINUS:
c1f11548
DE
2065 return (constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc)
2066 && constant_pool_expr_1 (XEXP (op, 1), have_sym, have_toc));
9ebbca7d 2067 case CONST:
a4f6c312 2068 return constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc);
9ebbca7d 2069 case CONST_INT:
a4f6c312 2070 return 1;
9ebbca7d 2071 default:
a4f6c312 2072 return 0;
9ebbca7d
GK
2073 }
2074}
2075
2076int
2077constant_pool_expr_p (op)
2078 rtx op;
2079{
2080 int have_sym = 0;
2081 int have_toc = 0;
2082 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_sym;
2083}
2084
2085int
2086toc_relative_expr_p (op)
2087 rtx op;
2088{
2089 int have_sym = 0;
2090 int have_toc = 0;
2091 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_toc;
2092}
2093
2094/* Try machine-dependent ways of modifying an illegitimate address
2095 to be legitimate. If we find one, return the new, valid address.
2096 This is used from only one place: `memory_address' in explow.c.
2097
a4f6c312
SS
2098 OLDX is the address as it was before break_out_memory_refs was
2099 called. In some cases it is useful to look at this to decide what
2100 needs to be done.
9ebbca7d 2101
a4f6c312 2102 MODE is passed so that this function can use GO_IF_LEGITIMATE_ADDRESS.
9ebbca7d 2103
a4f6c312
SS
2104 It is always safe for this function to do nothing. It exists to
2105 recognize opportunities to optimize the output.
9ebbca7d
GK
2106
2107 On RS/6000, first check for the sum of a register with a constant
2108 integer that is out of range. If so, generate code to add the
2109 constant with the low-order 16 bits masked to the register and force
2110 this result into another register (this can be done with `cau').
2111 Then generate an address of REG+(CONST&0xffff), allowing for the
2112 possibility of bit 16 being a one.
2113
2114 Then check for the sum of a register and something not constant, try to
2115 load the other things into a register and return the sum. */
2116rtx
2117rs6000_legitimize_address (x, oldx, mode)
2118 rtx x;
2119 rtx oldx ATTRIBUTE_UNUSED;
2120 enum machine_mode mode;
0ac081f6 2121{
9ebbca7d
GK
2122 if (GET_CODE (x) == PLUS
2123 && GET_CODE (XEXP (x, 0)) == REG
2124 && GET_CODE (XEXP (x, 1)) == CONST_INT
2125 && (unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000) >= 0x10000)
2126 {
2127 HOST_WIDE_INT high_int, low_int;
2128 rtx sum;
a65c591c
DE
2129 low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
2130 high_int = INTVAL (XEXP (x, 1)) - low_int;
9ebbca7d
GK
2131 sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
2132 GEN_INT (high_int)), 0);
2133 return gen_rtx_PLUS (Pmode, sum, GEN_INT (low_int));
2134 }
2135 else if (GET_CODE (x) == PLUS
2136 && GET_CODE (XEXP (x, 0)) == REG
2137 && GET_CODE (XEXP (x, 1)) != CONST_INT
6ac7bf2c 2138 && GET_MODE_NUNITS (mode) == 1
a3170dc6
AH
2139 && ((TARGET_HARD_FLOAT && TARGET_FPRS)
2140 || TARGET_POWERPC64
fcce224d 2141 || (mode != DFmode && mode != TFmode))
9ebbca7d
GK
2142 && (TARGET_POWERPC64 || mode != DImode)
2143 && mode != TImode)
2144 {
2145 return gen_rtx_PLUS (Pmode, XEXP (x, 0),
2146 force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
2147 }
0ac081f6
AH
2148 else if (ALTIVEC_VECTOR_MODE (mode))
2149 {
2150 rtx reg;
2151
2152 /* Make sure both operands are registers. */
2153 if (GET_CODE (x) == PLUS)
9f85ed45 2154 return gen_rtx_PLUS (Pmode, force_reg (Pmode, XEXP (x, 0)),
0ac081f6
AH
2155 force_reg (Pmode, XEXP (x, 1)));
2156
2157 reg = force_reg (Pmode, x);
2158 return reg;
2159 }
a3170dc6
AH
2160 else if (SPE_VECTOR_MODE (mode))
2161 {
2162 /* We accept [reg + reg] and [reg + OFFSET]. */
2163
2164 if (GET_CODE (x) == PLUS)
2165 {
2166 rtx op1 = XEXP (x, 0);
2167 rtx op2 = XEXP (x, 1);
2168
2169 op1 = force_reg (Pmode, op1);
2170
2171 if (GET_CODE (op2) != REG
2172 && (GET_CODE (op2) != CONST_INT
2173 || !SPE_CONST_OFFSET_OK (INTVAL (op2))))
2174 op2 = force_reg (Pmode, op2);
2175
2176 return gen_rtx_PLUS (Pmode, op1, op2);
2177 }
2178
2179 return force_reg (Pmode, x);
2180 }
9ebbca7d
GK
2181 else if (TARGET_ELF && TARGET_32BIT && TARGET_NO_TOC && ! flag_pic
2182 && GET_CODE (x) != CONST_INT
2183 && GET_CODE (x) != CONST_DOUBLE
2184 && CONSTANT_P (x)
6ac7bf2c
GK
2185 && GET_MODE_NUNITS (mode) == 1
2186 && (GET_MODE_BITSIZE (mode) <= 32
a3170dc6 2187 || ((TARGET_HARD_FLOAT && TARGET_FPRS) && mode == DFmode)))
9ebbca7d
GK
2188 {
2189 rtx reg = gen_reg_rtx (Pmode);
2190 emit_insn (gen_elf_high (reg, (x)));
2191 return gen_rtx_LO_SUM (Pmode, reg, (x));
2192 }
ee890fe2
SS
2193 else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
2194 && ! flag_pic
2195 && GET_CODE (x) != CONST_INT
2196 && GET_CODE (x) != CONST_DOUBLE
2197 && CONSTANT_P (x)
a3170dc6 2198 && ((TARGET_HARD_FLOAT && TARGET_FPRS) || mode != DFmode)
ee890fe2
SS
2199 && mode != DImode
2200 && mode != TImode)
2201 {
2202 rtx reg = gen_reg_rtx (Pmode);
2203 emit_insn (gen_macho_high (reg, (x)));
2204 return gen_rtx_LO_SUM (Pmode, reg, (x));
2205 }
9ebbca7d
GK
2206 else if (TARGET_TOC
2207 && CONSTANT_POOL_EXPR_P (x)
a9098fd0 2208 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
9ebbca7d
GK
2209 {
2210 return create_TOC_reference (x);
2211 }
2212 else
2213 return NULL_RTX;
2214}
258bfae2 2215
24ea750e
DJ
2216/* The convention appears to be to define this wherever it is used.
2217 With legitimize_reload_address now defined here, REG_MODE_OK_FOR_BASE_P
2218 is now used here. */
2219#ifndef REG_MODE_OK_FOR_BASE_P
2220#define REG_MODE_OK_FOR_BASE_P(REGNO, MODE) REG_OK_FOR_BASE_P (REGNO)
2221#endif
2222
2223/* Our implementation of LEGITIMIZE_RELOAD_ADDRESS. Returns a value to
2224 replace the input X, or the original X if no replacement is called for.
2225 The output parameter *WIN is 1 if the calling macro should goto WIN,
2226 0 if it should not.
2227
2228 For RS/6000, we wish to handle large displacements off a base
2229 register by splitting the addend across an addiu/addis and the mem insn.
2230 This cuts number of extra insns needed from 3 to 1.
2231
2232 On Darwin, we use this to generate code for floating point constants.
2233 A movsf_low is generated so we wind up with 2 instructions rather than 3.
2234 The Darwin code is inside #if TARGET_MACHO because only then is
2235 machopic_function_base_name() defined. */
2236rtx
2237rs6000_legitimize_reload_address (x, mode, opnum, type, ind_levels, win)
2238 rtx x;
2239 enum machine_mode mode;
2240 int opnum;
2241 int type;
2242 int ind_levels ATTRIBUTE_UNUSED;
2243 int *win;
2244{
2245 /* We must recognize output that we have already generated ourselves. */
2246 if (GET_CODE (x) == PLUS
2247 && GET_CODE (XEXP (x, 0)) == PLUS
2248 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
2249 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2250 && GET_CODE (XEXP (x, 1)) == CONST_INT)
2251 {
2252 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
2253 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
2254 opnum, (enum reload_type)type);
2255 *win = 1;
2256 return x;
2257 }
3deb2758 2258
24ea750e
DJ
2259#if TARGET_MACHO
2260 if (DEFAULT_ABI == ABI_DARWIN && flag_pic
2261 && GET_CODE (x) == LO_SUM
2262 && GET_CODE (XEXP (x, 0)) == PLUS
2263 && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
2264 && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
2265 && GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 0)) == CONST
2266 && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
2267 && GET_CODE (XEXP (XEXP (x, 1), 0)) == MINUS
2268 && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 0)) == SYMBOL_REF
2269 && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 1)) == SYMBOL_REF)
2270 {
2271 /* Result of previous invocation of this function on Darwin
6f317ef3 2272 floating point constant. */
24ea750e
DJ
2273 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
2274 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
2275 opnum, (enum reload_type)type);
2276 *win = 1;
2277 return x;
2278 }
2279#endif
2280 if (GET_CODE (x) == PLUS
2281 && GET_CODE (XEXP (x, 0)) == REG
2282 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
2283 && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
78c875e8 2284 && GET_CODE (XEXP (x, 1)) == CONST_INT
93638d7a 2285 && !SPE_VECTOR_MODE (mode)
78c875e8 2286 && !ALTIVEC_VECTOR_MODE (mode))
24ea750e
DJ
2287 {
2288 HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
2289 HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
2290 HOST_WIDE_INT high
2291 = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
2292
2293 /* Check for 32-bit overflow. */
2294 if (high + low != val)
2295 {
2296 *win = 0;
2297 return x;
2298 }
2299
2300 /* Reload the high part into a base reg; leave the low part
2301 in the mem directly. */
2302
2303 x = gen_rtx_PLUS (GET_MODE (x),
2304 gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
2305 GEN_INT (high)),
2306 GEN_INT (low));
2307
2308 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
2309 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
2310 opnum, (enum reload_type)type);
2311 *win = 1;
2312 return x;
2313 }
2314#if TARGET_MACHO
2315 if (GET_CODE (x) == SYMBOL_REF
2316 && DEFAULT_ABI == ABI_DARWIN
69ef87e2 2317 && !ALTIVEC_VECTOR_MODE (mode)
24ea750e
DJ
2318 && flag_pic)
2319 {
2320 /* Darwin load of floating point constant. */
2321 rtx offset = gen_rtx (CONST, Pmode,
2322 gen_rtx (MINUS, Pmode, x,
2323 gen_rtx (SYMBOL_REF, Pmode,
2324 machopic_function_base_name ())));
2325 x = gen_rtx (LO_SUM, GET_MODE (x),
2326 gen_rtx (PLUS, Pmode, pic_offset_table_rtx,
2327 gen_rtx (HIGH, Pmode, offset)), offset);
2328 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
2329 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
2330 opnum, (enum reload_type)type);
2331 *win = 1;
2332 return x;
2333 }
2334#endif
2335 if (TARGET_TOC
c1f11548
DE
2336 && CONSTANT_POOL_EXPR_P (x)
2337 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
24ea750e
DJ
2338 {
2339 (x) = create_TOC_reference (x);
2340 *win = 1;
2341 return x;
2342 }
2343 *win = 0;
2344 return x;
2345}
2346
258bfae2
FS
2347/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
2348 that is a valid memory address for an instruction.
2349 The MODE argument is the machine mode for the MEM expression
2350 that wants to use this address.
2351
2352 On the RS/6000, there are four valid address: a SYMBOL_REF that
2353 refers to a constant pool entry of an address (or the sum of it
2354 plus a constant), a short (16-bit signed) constant plus a register,
2355 the sum of two registers, or a register indirect, possibly with an
5bdc5878 2356 auto-increment. For DFmode and DImode with a constant plus register,
258bfae2
FS
2357 we must ensure that both words are addressable or PowerPC64 with offset
2358 word aligned.
2359
2360 For modes spanning multiple registers (DFmode in 32-bit GPRs,
2361 32-bit DImode, TImode), indexed addressing cannot be used because
2362 adjacent memory cells are accessed by adding word-sized offsets
2363 during assembly output. */
2364int
2365rs6000_legitimate_address (mode, x, reg_ok_strict)
2366 enum machine_mode mode;
2367 rtx x;
2368 int reg_ok_strict;
2369{
2370 if (LEGITIMATE_INDIRECT_ADDRESS_P (x, reg_ok_strict))
2371 return 1;
2372 if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
0d6d6892 2373 && !ALTIVEC_VECTOR_MODE (mode)
a3170dc6 2374 && !SPE_VECTOR_MODE (mode)
258bfae2
FS
2375 && TARGET_UPDATE
2376 && LEGITIMATE_INDIRECT_ADDRESS_P (XEXP (x, 0), reg_ok_strict))
2377 return 1;
2378 if (LEGITIMATE_SMALL_DATA_P (mode, x))
2379 return 1;
2380 if (LEGITIMATE_CONSTANT_POOL_ADDRESS_P (x))
2381 return 1;
2382 /* If not REG_OK_STRICT (before reload) let pass any stack offset. */
2383 if (! reg_ok_strict
2384 && GET_CODE (x) == PLUS
2385 && GET_CODE (XEXP (x, 0)) == REG
2386 && XEXP (x, 0) == virtual_stack_vars_rtx
2387 && GET_CODE (XEXP (x, 1)) == CONST_INT)
2388 return 1;
2389 if (LEGITIMATE_OFFSET_ADDRESS_P (mode, x, reg_ok_strict))
2390 return 1;
2391 if (mode != TImode
a3170dc6
AH
2392 && ((TARGET_HARD_FLOAT && TARGET_FPRS)
2393 || TARGET_POWERPC64
fcce224d 2394 || (mode != DFmode && mode != TFmode))
258bfae2
FS
2395 && (TARGET_POWERPC64 || mode != DImode)
2396 && LEGITIMATE_INDEXED_ADDRESS_P (x, reg_ok_strict))
2397 return 1;
2398 if (LEGITIMATE_LO_SUM_ADDRESS_P (mode, x, reg_ok_strict))
2399 return 1;
2400 return 0;
2401}
fb4d4348 2402\f
a4f6c312
SS
2403/* Try to output insns to set TARGET equal to the constant C if it can
2404 be done in less than N insns. Do all computations in MODE.
2405 Returns the place where the output has been placed if it can be
2406 done and the insns have been emitted. If it would take more than N
2407 insns, zero is returned and no insns and emitted. */
2bfcf297
DB
2408
2409rtx
2410rs6000_emit_set_const (dest, mode, source, n)
2411 rtx dest, source;
2412 enum machine_mode mode;
2413 int n ATTRIBUTE_UNUSED;
2414{
af8cb5c5 2415 rtx result, insn, set;
2bfcf297
DB
2416 HOST_WIDE_INT c0, c1;
2417
af8cb5c5 2418 if (mode == QImode || mode == HImode)
2bfcf297
DB
2419 {
2420 if (dest == NULL)
2421 dest = gen_reg_rtx (mode);
2422 emit_insn (gen_rtx_SET (VOIDmode, dest, source));
2423 return dest;
2424 }
af8cb5c5 2425 else if (mode == SImode)
2bfcf297 2426 {
af8cb5c5
DE
2427 result = no_new_pseudos ? dest : gen_reg_rtx (SImode);
2428
2429 emit_insn (gen_rtx_SET (VOIDmode, result,
2430 GEN_INT (INTVAL (source)
2431 & (~ (HOST_WIDE_INT) 0xffff))));
2432 emit_insn (gen_rtx_SET (VOIDmode, dest,
2433 gen_rtx_IOR (SImode, result,
2434 GEN_INT (INTVAL (source) & 0xffff))));
2435 result = dest;
2bfcf297 2436 }
af8cb5c5 2437 else if (mode == DImode)
2bfcf297 2438 {
af8cb5c5
DE
2439 if (GET_CODE (source) == CONST_INT)
2440 {
2441 c0 = INTVAL (source);
2442 c1 = -(c0 < 0);
2443 }
2444 else if (GET_CODE (source) == CONST_DOUBLE)
2445 {
2bfcf297 2446#if HOST_BITS_PER_WIDE_INT >= 64
af8cb5c5
DE
2447 c0 = CONST_DOUBLE_LOW (source);
2448 c1 = -(c0 < 0);
2bfcf297 2449#else
af8cb5c5
DE
2450 c0 = CONST_DOUBLE_LOW (source);
2451 c1 = CONST_DOUBLE_HIGH (source);
2bfcf297 2452#endif
af8cb5c5
DE
2453 }
2454 else
2455 abort ();
2456
2457 result = rs6000_emit_set_long_const (dest, c0, c1);
2bfcf297
DB
2458 }
2459 else
a4f6c312 2460 abort ();
2bfcf297 2461
af8cb5c5
DE
2462 insn = get_last_insn ();
2463 set = single_set (insn);
2464 if (! CONSTANT_P (SET_SRC (set)))
2465 set_unique_reg_note (insn, REG_EQUAL, source);
2466
2467 return result;
2bfcf297
DB
2468}
2469
2470/* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
2471 fall back to a straight forward decomposition. We do this to avoid
2472 exponential run times encountered when looking for longer sequences
2473 with rs6000_emit_set_const. */
2474static rtx
2475rs6000_emit_set_long_const (dest, c1, c2)
2476 rtx dest;
2477 HOST_WIDE_INT c1, c2;
2478{
2479 if (!TARGET_POWERPC64)
2480 {
2481 rtx operand1, operand2;
2482
2483 operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
2484 DImode);
2485 operand2 = operand_subword_force (dest, WORDS_BIG_ENDIAN != 0,
2486 DImode);
2487 emit_move_insn (operand1, GEN_INT (c1));
2488 emit_move_insn (operand2, GEN_INT (c2));
2489 }
2490 else
2491 {
bc06712d 2492 HOST_WIDE_INT ud1, ud2, ud3, ud4;
252b88f7 2493
bc06712d
TR
2494 ud1 = c1 & 0xffff;
2495 ud2 = (c1 & 0xffff0000) >> 16;
2bfcf297 2496#if HOST_BITS_PER_WIDE_INT >= 64
bc06712d 2497 c2 = c1 >> 32;
2bfcf297 2498#endif
bc06712d
TR
2499 ud3 = c2 & 0xffff;
2500 ud4 = (c2 & 0xffff0000) >> 16;
2bfcf297 2501
bc06712d
TR
2502 if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
2503 || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
2bfcf297 2504 {
bc06712d
TR
2505 if (ud1 & 0x8000)
2506 emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) - 0x8000)));
2507 else
2508 emit_move_insn (dest, GEN_INT (ud1));
2bfcf297 2509 }
2bfcf297 2510
bc06712d
TR
2511 else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
2512 || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
252b88f7 2513 {
bc06712d
TR
2514 if (ud2 & 0x8000)
2515 emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
2516 - 0x80000000));
252b88f7 2517 else
bc06712d
TR
2518 emit_move_insn (dest, GEN_INT (ud2 << 16));
2519 if (ud1 != 0)
2520 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
252b88f7 2521 }
bc06712d
TR
2522 else if ((ud4 == 0xffff && (ud3 & 0x8000))
2523 || (ud4 == 0 && ! (ud3 & 0x8000)))
2524 {
2525 if (ud3 & 0x8000)
2526 emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
2527 - 0x80000000));
2528 else
2529 emit_move_insn (dest, GEN_INT (ud3 << 16));
2530
2531 if (ud2 != 0)
2532 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud2)));
2533 emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (16)));
2534 if (ud1 != 0)
2535 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
2536 }
2537 else
2538 {
2539 if (ud4 & 0x8000)
2540 emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
2541 - 0x80000000));
2542 else
2543 emit_move_insn (dest, GEN_INT (ud4 << 16));
2544
2545 if (ud3 != 0)
2546 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud3)));
2bfcf297 2547
bc06712d
TR
2548 emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (32)));
2549 if (ud2 != 0)
2550 emit_move_insn (dest, gen_rtx_IOR (DImode, dest,
2551 GEN_INT (ud2 << 16)));
2552 if (ud1 != 0)
2553 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
2554 }
2555 }
2bfcf297
DB
2556 return dest;
2557}
2558
fb4d4348
GK
2559/* Emit a move from SOURCE to DEST in mode MODE. */
2560void
2561rs6000_emit_move (dest, source, mode)
2562 rtx dest;
2563 rtx source;
2564 enum machine_mode mode;
2565{
2566 rtx operands[2];
2567 operands[0] = dest;
2568 operands[1] = source;
2569
2570 /* Sanity checks. Check that we get CONST_DOUBLE only when we should. */
2571 if (GET_CODE (operands[1]) == CONST_DOUBLE
2572 && ! FLOAT_MODE_P (mode)
2573 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
2574 {
2575 /* FIXME. This should never happen. */
2576 /* Since it seems that it does, do the safe thing and convert
2577 to a CONST_INT. */
2496c7bd 2578 operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
fb4d4348
GK
2579 }
2580 if (GET_CODE (operands[1]) == CONST_DOUBLE
2581 && ! FLOAT_MODE_P (mode)
2582 && ((CONST_DOUBLE_HIGH (operands[1]) == 0
2583 && CONST_DOUBLE_LOW (operands[1]) >= 0)
2584 || (CONST_DOUBLE_HIGH (operands[1]) == -1
2585 && CONST_DOUBLE_LOW (operands[1]) < 0)))
2586 abort ();
c9e8cb32
DD
2587
2588 /* Check if GCC is setting up a block move that will end up using FP
2589 registers as temporaries. We must make sure this is acceptable. */
2590 if (GET_CODE (operands[0]) == MEM
2591 && GET_CODE (operands[1]) == MEM
2592 && mode == DImode
41543739
GK
2593 && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
2594 || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
2595 && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
2596 ? 32 : MEM_ALIGN (operands[0])))
2597 || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
2598 ? 32
2599 : MEM_ALIGN (operands[1]))))
2600 && ! MEM_VOLATILE_P (operands [0])
2601 && ! MEM_VOLATILE_P (operands [1]))
c9e8cb32 2602 {
41543739
GK
2603 emit_move_insn (adjust_address (operands[0], SImode, 0),
2604 adjust_address (operands[1], SImode, 0));
2605 emit_move_insn (adjust_address (operands[0], SImode, 4),
2606 adjust_address (operands[1], SImode, 4));
c9e8cb32
DD
2607 return;
2608 }
fb4d4348 2609
67cef334
DE
2610 if (!no_new_pseudos)
2611 {
2612 if (GET_CODE (operands[1]) == MEM && optimize > 0
2613 && (mode == QImode || mode == HImode || mode == SImode)
2614 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (word_mode))
2615 {
2616 rtx reg = gen_reg_rtx (word_mode);
2617
2618 emit_insn (gen_rtx_SET (word_mode, reg,
2619 gen_rtx_ZERO_EXTEND (word_mode,
2620 operands[1])));
2621 operands[1] = gen_lowpart (mode, reg);
2622 }
2623 if (GET_CODE (operands[0]) != REG)
2624 operands[1] = force_reg (mode, operands[1]);
2625 }
a9098fd0 2626
a3170dc6
AH
2627 if (mode == SFmode && ! TARGET_POWERPC
2628 && TARGET_HARD_FLOAT && TARGET_FPRS
ffc14f31 2629 && GET_CODE (operands[0]) == MEM)
fb4d4348 2630 {
ffc14f31
GK
2631 int regnum;
2632
2633 if (reload_in_progress || reload_completed)
2634 regnum = true_regnum (operands[1]);
2635 else if (GET_CODE (operands[1]) == REG)
2636 regnum = REGNO (operands[1]);
2637 else
2638 regnum = -1;
fb4d4348
GK
2639
2640 /* If operands[1] is a register, on POWER it may have
2641 double-precision data in it, so truncate it to single
2642 precision. */
2643 if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
2644 {
2645 rtx newreg;
2646 newreg = (no_new_pseudos ? operands[1] : gen_reg_rtx (mode));
2647 emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
2648 operands[1] = newreg;
2649 }
2650 }
2651
a9098fd0
GK
2652 /* Handle the case where reload calls us with an invalid address;
2653 and the case of CONSTANT_P_RTX. */
16861f33 2654 if (!ALTIVEC_VECTOR_MODE (mode)
69ef87e2
AH
2655 && (! general_operand (operands[1], mode)
2656 || ! nonimmediate_operand (operands[0], mode)
2657 || GET_CODE (operands[1]) == CONSTANT_P_RTX))
fb4d4348
GK
2658 {
2659 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
2660 return;
2661 }
a9098fd0 2662
fb4d4348
GK
2663 /* FIXME: In the long term, this switch statement should go away
2664 and be replaced by a sequence of tests based on things like
2665 mode == Pmode. */
2666 switch (mode)
2667 {
2668 case HImode:
2669 case QImode:
2670 if (CONSTANT_P (operands[1])
2671 && GET_CODE (operands[1]) != CONST_INT)
a9098fd0 2672 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
2673 break;
2674
06f4e019 2675 case TFmode:
fb4d4348
GK
2676 case DFmode:
2677 case SFmode:
2678 if (CONSTANT_P (operands[1])
2679 && ! easy_fp_constant (operands[1], mode))
a9098fd0 2680 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
2681 break;
2682
0ac081f6
AH
2683 case V16QImode:
2684 case V8HImode:
2685 case V4SFmode:
2686 case V4SImode:
a3170dc6
AH
2687 case V4HImode:
2688 case V2SFmode:
2689 case V2SImode:
00a892b8 2690 case V1DImode:
69ef87e2
AH
2691 if (CONSTANT_P (operands[1])
2692 && !easy_vector_constant (operands[1]))
0ac081f6
AH
2693 operands[1] = force_const_mem (mode, operands[1]);
2694 break;
2695
fb4d4348 2696 case SImode:
a9098fd0 2697 case DImode:
fb4d4348
GK
2698 /* Use default pattern for address of ELF small data */
2699 if (TARGET_ELF
a9098fd0 2700 && mode == Pmode
f607bc57 2701 && DEFAULT_ABI == ABI_V4
a9098fd0
GK
2702 && (GET_CODE (operands[1]) == SYMBOL_REF
2703 || GET_CODE (operands[1]) == CONST)
2704 && small_data_operand (operands[1], mode))
fb4d4348
GK
2705 {
2706 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
2707 return;
2708 }
2709
f607bc57 2710 if (DEFAULT_ABI == ABI_V4
a9098fd0
GK
2711 && mode == Pmode && mode == SImode
2712 && flag_pic == 1 && got_operand (operands[1], mode))
fb4d4348
GK
2713 {
2714 emit_insn (gen_movsi_got (operands[0], operands[1]));
2715 return;
2716 }
2717
ee890fe2
SS
2718 if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
2719 && TARGET_NO_TOC && ! flag_pic
a9098fd0 2720 && mode == Pmode
fb4d4348
GK
2721 && CONSTANT_P (operands[1])
2722 && GET_CODE (operands[1]) != HIGH
2723 && GET_CODE (operands[1]) != CONST_INT)
2724 {
a9098fd0 2725 rtx target = (no_new_pseudos ? operands[0] : gen_reg_rtx (mode));
fb4d4348
GK
2726
2727 /* If this is a function address on -mcall-aixdesc,
2728 convert it to the address of the descriptor. */
2729 if (DEFAULT_ABI == ABI_AIX
2730 && GET_CODE (operands[1]) == SYMBOL_REF
2731 && XSTR (operands[1], 0)[0] == '.')
2732 {
2733 const char *name = XSTR (operands[1], 0);
2734 rtx new_ref;
2735 while (*name == '.')
2736 name++;
2737 new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
2738 CONSTANT_POOL_ADDRESS_P (new_ref)
2739 = CONSTANT_POOL_ADDRESS_P (operands[1]);
2740 SYMBOL_REF_FLAG (new_ref) = SYMBOL_REF_FLAG (operands[1]);
2741 SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
2742 operands[1] = new_ref;
2743 }
7509c759 2744
ee890fe2
SS
2745 if (DEFAULT_ABI == ABI_DARWIN)
2746 {
2747 emit_insn (gen_macho_high (target, operands[1]));
2748 emit_insn (gen_macho_low (operands[0], target, operands[1]));
2749 return;
2750 }
2751
fb4d4348
GK
2752 emit_insn (gen_elf_high (target, operands[1]));
2753 emit_insn (gen_elf_low (operands[0], target, operands[1]));
2754 return;
2755 }
2756
a9098fd0
GK
2757 /* If this is a SYMBOL_REF that refers to a constant pool entry,
2758 and we have put it in the TOC, we just need to make a TOC-relative
2759 reference to it. */
2760 if (TARGET_TOC
2761 && GET_CODE (operands[1]) == SYMBOL_REF
2762 && CONSTANT_POOL_EXPR_P (operands[1])
2763 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
2764 get_pool_mode (operands[1])))
fb4d4348 2765 {
a9098fd0 2766 operands[1] = create_TOC_reference (operands[1]);
fb4d4348 2767 }
a9098fd0
GK
2768 else if (mode == Pmode
2769 && CONSTANT_P (operands[1])
38886f37
AO
2770 && ((GET_CODE (operands[1]) != CONST_INT
2771 && ! easy_fp_constant (operands[1], mode))
2772 || (GET_CODE (operands[1]) == CONST_INT
2773 && num_insns_constant (operands[1], mode) > 2)
2774 || (GET_CODE (operands[0]) == REG
2775 && FP_REGNO_P (REGNO (operands[0]))))
a9098fd0
GK
2776 && GET_CODE (operands[1]) != HIGH
2777 && ! LEGITIMATE_CONSTANT_POOL_ADDRESS_P (operands[1])
2778 && ! TOC_RELATIVE_EXPR_P (operands[1]))
fb4d4348
GK
2779 {
2780 /* Emit a USE operation so that the constant isn't deleted if
2781 expensive optimizations are turned on because nobody
2782 references it. This should only be done for operands that
2783 contain SYMBOL_REFs with CONSTANT_POOL_ADDRESS_P set.
2784 This should not be done for operands that contain LABEL_REFs.
2785 For now, we just handle the obvious case. */
2786 if (GET_CODE (operands[1]) != LABEL_REF)
2787 emit_insn (gen_rtx_USE (VOIDmode, operands[1]));
2788
c859cda6 2789#if TARGET_MACHO
ee890fe2
SS
2790 /* Darwin uses a special PIC legitimizer. */
2791 if (DEFAULT_ABI == ABI_DARWIN && flag_pic)
2792 {
ee890fe2
SS
2793 operands[1] =
2794 rs6000_machopic_legitimize_pic_address (operands[1], mode,
c859cda6
DJ
2795 operands[0]);
2796 if (operands[0] != operands[1])
2797 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
ee890fe2
SS
2798 return;
2799 }
c859cda6 2800#endif
ee890fe2 2801
fb4d4348
GK
2802 /* If we are to limit the number of things we put in the TOC and
2803 this is a symbol plus a constant we can add in one insn,
2804 just put the symbol in the TOC and add the constant. Don't do
2805 this if reload is in progress. */
2806 if (GET_CODE (operands[1]) == CONST
2807 && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
2808 && GET_CODE (XEXP (operands[1], 0)) == PLUS
a9098fd0 2809 && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
fb4d4348
GK
2810 && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
2811 || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
2812 && ! side_effects_p (operands[0]))
2813 {
a4f6c312
SS
2814 rtx sym =
2815 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
fb4d4348
GK
2816 rtx other = XEXP (XEXP (operands[1], 0), 1);
2817
a9098fd0
GK
2818 sym = force_reg (mode, sym);
2819 if (mode == SImode)
2820 emit_insn (gen_addsi3 (operands[0], sym, other));
2821 else
2822 emit_insn (gen_adddi3 (operands[0], sym, other));
fb4d4348
GK
2823 return;
2824 }
2825
a9098fd0 2826 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
2827
2828 if (TARGET_TOC
d34c5b80
DE
2829 && CONSTANT_POOL_EXPR_P (XEXP (operands[1], 0))
2830 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
2831 get_pool_constant (XEXP (operands[1], 0)),
2832 get_pool_mode (XEXP (operands[1], 0))))
a9098fd0 2833 {
ba4828e0
RK
2834 operands[1]
2835 = gen_rtx_MEM (mode,
2836 create_TOC_reference (XEXP (operands[1], 0)));
2837 set_mem_alias_set (operands[1], get_TOC_alias_set ());
fb4d4348 2838 RTX_UNCHANGING_P (operands[1]) = 1;
a9098fd0 2839 }
fb4d4348
GK
2840 }
2841 break;
a9098fd0 2842
fb4d4348
GK
2843 case TImode:
2844 if (GET_CODE (operands[0]) == MEM
2845 && GET_CODE (XEXP (operands[0], 0)) != REG
2846 && ! reload_in_progress)
792760b9
RK
2847 operands[0]
2848 = replace_equiv_address (operands[0],
2849 copy_addr_to_reg (XEXP (operands[0], 0)));
fb4d4348
GK
2850
2851 if (GET_CODE (operands[1]) == MEM
2852 && GET_CODE (XEXP (operands[1], 0)) != REG
2853 && ! reload_in_progress)
792760b9
RK
2854 operands[1]
2855 = replace_equiv_address (operands[1],
2856 copy_addr_to_reg (XEXP (operands[1], 0)));
fb4d4348
GK
2857 break;
2858
2859 default:
2860 abort ();
2861 }
2862
a9098fd0
GK
2863 /* Above, we may have called force_const_mem which may have returned
2864 an invalid address. If we can, fix this up; otherwise, reload will
2865 have to deal with it. */
2866 if (GET_CODE (operands[1]) == MEM
2867 && ! memory_address_p (mode, XEXP (operands[1], 0))
2868 && ! reload_in_progress)
f4ef873c 2869 operands[1] = adjust_address (operands[1], mode, 0);
a9098fd0 2870
fb4d4348 2871 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
02a4ec28 2872 return;
fb4d4348 2873}
4697a36c
MM
2874\f
2875/* Initialize a variable CUM of type CUMULATIVE_ARGS
2876 for a call to a function whose data type is FNTYPE.
2877 For a library call, FNTYPE is 0.
2878
2879 For incoming args we set the number of arguments in the prototype large
1c20ae99 2880 so we never return a PARALLEL. */
4697a36c
MM
2881
2882void
2883init_cumulative_args (cum, fntype, libname, incoming)
2884 CUMULATIVE_ARGS *cum;
2885 tree fntype;
296b8152 2886 rtx libname ATTRIBUTE_UNUSED;
4697a36c
MM
2887 int incoming;
2888{
2889 static CUMULATIVE_ARGS zero_cumulative;
2890
2891 *cum = zero_cumulative;
2892 cum->words = 0;
2893 cum->fregno = FP_ARG_MIN_REG;
0ac081f6 2894 cum->vregno = ALTIVEC_ARG_MIN_REG;
4697a36c 2895 cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
7509c759 2896 cum->call_cookie = CALL_NORMAL;
4cc833b7 2897 cum->sysv_gregno = GP_ARG_MIN_REG;
4697a36c
MM
2898
2899 if (incoming)
bd227acc 2900 cum->nargs_prototype = 1000; /* don't return a PARALLEL */
4697a36c
MM
2901
2902 else if (cum->prototype)
2903 cum->nargs_prototype = (list_length (TYPE_ARG_TYPES (fntype)) - 1
2904 + (TYPE_MODE (TREE_TYPE (fntype)) == BLKmode
2905 || RETURN_IN_MEMORY (TREE_TYPE (fntype))));
2906
2907 else
2908 cum->nargs_prototype = 0;
2909
2910 cum->orig_nargs = cum->nargs_prototype;
7509c759 2911
a5c76ee6
ZW
2912 /* Check for a longcall attribute. */
2913 if (fntype
2914 && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
2915 && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype)))
6a4cee5f
MM
2916 cum->call_cookie = CALL_LONG;
2917
4697a36c
MM
2918 if (TARGET_DEBUG_ARG)
2919 {
2920 fprintf (stderr, "\ninit_cumulative_args:");
2921 if (fntype)
2922 {
2923 tree ret_type = TREE_TYPE (fntype);
2924 fprintf (stderr, " ret code = %s,",
2925 tree_code_name[ (int)TREE_CODE (ret_type) ]);
2926 }
2927
6a4cee5f
MM
2928 if (cum->call_cookie & CALL_LONG)
2929 fprintf (stderr, " longcall,");
2930
4697a36c
MM
2931 fprintf (stderr, " proto = %d, nargs = %d\n",
2932 cum->prototype, cum->nargs_prototype);
2933 }
2934}
2935\f
c229cba9
DE
2936/* If defined, a C expression which determines whether, and in which
2937 direction, to pad out an argument with extra space. The value
2938 should be of type `enum direction': either `upward' to pad above
2939 the argument, `downward' to pad below, or `none' to inhibit
2940 padding.
2941
2942 For the AIX ABI structs are always stored left shifted in their
2943 argument slot. */
2944
9ebbca7d 2945enum direction
c229cba9
DE
2946function_arg_padding (mode, type)
2947 enum machine_mode mode;
2948 tree type;
2949{
c85f7c16 2950 if (type != 0 && AGGREGATE_TYPE_P (type))
9ebbca7d 2951 return upward;
c229cba9
DE
2952
2953 /* This is the default definition. */
2954 return (! BYTES_BIG_ENDIAN
9ebbca7d 2955 ? upward
c229cba9
DE
2956 : ((mode == BLKmode
2957 ? (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
2958 && int_size_in_bytes (type) < (PARM_BOUNDARY / BITS_PER_UNIT))
2959 : GET_MODE_BITSIZE (mode) < PARM_BOUNDARY)
9ebbca7d 2960 ? downward : upward));
c229cba9
DE
2961}
2962
b6c9286a
MM
2963/* If defined, a C expression that gives the alignment boundary, in bits,
2964 of an argument with the specified mode and type. If it is not defined,
2965 PARM_BOUNDARY is used for all arguments.
2966
2310f99a 2967 V.4 wants long longs to be double word aligned. */
b6c9286a
MM
2968
2969int
2970function_arg_boundary (mode, type)
2971 enum machine_mode mode;
9ebbca7d 2972 tree type ATTRIBUTE_UNUSED;
b6c9286a 2973{
f607bc57 2974 if (DEFAULT_ABI == ABI_V4 && (mode == DImode || mode == DFmode))
e1f83b4d 2975 return 64;
a3170dc6
AH
2976 else if (SPE_VECTOR_MODE (mode))
2977 return 64;
0ac081f6
AH
2978 else if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
2979 return 128;
9ebbca7d 2980 else
b6c9286a 2981 return PARM_BOUNDARY;
b6c9286a
MM
2982}
2983\f
4697a36c
MM
2984/* Update the data in CUM to advance over an argument
2985 of mode MODE and data type TYPE.
2986 (TYPE is null for libcalls where that information may not be available.) */
2987
2988void
2989function_arg_advance (cum, mode, type, named)
2990 CUMULATIVE_ARGS *cum;
2991 enum machine_mode mode;
2992 tree type;
2993 int named;
2994{
2995 cum->nargs_prototype--;
2996
0ac081f6
AH
2997 if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
2998 {
2999 if (cum->vregno <= ALTIVEC_ARG_MAX_REG && cum->nargs_prototype >= 0)
3000 cum->vregno++;
3001 else
3002 cum->words += RS6000_ARG_SIZE (mode, type);
3003 }
a4b0320c
AH
3004 else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
3005 && named && cum->sysv_gregno <= GP_ARG_MAX_REG)
3006 cum->sysv_gregno++;
f607bc57 3007 else if (DEFAULT_ABI == ABI_V4)
4697a36c 3008 {
a3170dc6 3009 if (TARGET_HARD_FLOAT && TARGET_FPRS
4cc833b7 3010 && (mode == SFmode || mode == DFmode))
4697a36c 3011 {
4cc833b7
RH
3012 if (cum->fregno <= FP_ARG_V4_MAX_REG)
3013 cum->fregno++;
3014 else
3015 {
3016 if (mode == DFmode)
3017 cum->words += cum->words & 1;
d34c5b80 3018 cum->words += RS6000_ARG_SIZE (mode, type);
4cc833b7 3019 }
4697a36c 3020 }
4cc833b7
RH
3021 else
3022 {
3023 int n_words;
3024 int gregno = cum->sysv_gregno;
3025
3026 /* Aggregates and IEEE quad get passed by reference. */
3027 if ((type && AGGREGATE_TYPE_P (type))
3028 || mode == TFmode)
3029 n_words = 1;
3030 else
d34c5b80 3031 n_words = RS6000_ARG_SIZE (mode, type);
4cc833b7 3032
a4b0320c 3033 /* Long long and SPE vectors are put in odd registers. */
4cc833b7
RH
3034 if (n_words == 2 && (gregno & 1) == 0)
3035 gregno += 1;
3036
a4b0320c
AH
3037 /* Long long and SPE vectors are not split between registers
3038 and stack. */
4cc833b7
RH
3039 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
3040 {
3041 /* Long long is aligned on the stack. */
3042 if (n_words == 2)
3043 cum->words += cum->words & 1;
3044 cum->words += n_words;
3045 }
4697a36c 3046
4cc833b7
RH
3047 /* Note: continuing to accumulate gregno past when we've started
3048 spilling to the stack indicates the fact that we've started
3049 spilling to the stack to expand_builtin_saveregs. */
3050 cum->sysv_gregno = gregno + n_words;
3051 }
4697a36c 3052
4cc833b7
RH
3053 if (TARGET_DEBUG_ARG)
3054 {
3055 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
3056 cum->words, cum->fregno);
3057 fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
3058 cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
3059 fprintf (stderr, "mode = %4s, named = %d\n",
3060 GET_MODE_NAME (mode), named);
3061 }
4697a36c
MM
3062 }
3063 else
4cc833b7
RH
3064 {
3065 int align = (TARGET_32BIT && (cum->words & 1) != 0
3066 && function_arg_boundary (mode, type) == 64) ? 1 : 0;
a4f6c312 3067
d34c5b80 3068 cum->words += align + RS6000_ARG_SIZE (mode, type);
4697a36c 3069
a3170dc6
AH
3070 if (GET_MODE_CLASS (mode) == MODE_FLOAT
3071 && TARGET_HARD_FLOAT && TARGET_FPRS)
fcce224d 3072 cum->fregno += (mode == TFmode ? 2 : 1);
4cc833b7
RH
3073
3074 if (TARGET_DEBUG_ARG)
3075 {
3076 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
3077 cum->words, cum->fregno);
3078 fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
3079 cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
3080 fprintf (stderr, "named = %d, align = %d\n", named, align);
3081 }
3082 }
4697a36c
MM
3083}
3084\f
3085/* Determine where to put an argument to a function.
3086 Value is zero to push the argument on the stack,
3087 or a hard register in which to store the argument.
3088
3089 MODE is the argument's machine mode.
3090 TYPE is the data type of the argument (as a tree).
3091 This is null for libcalls where that information may
3092 not be available.
3093 CUM is a variable of type CUMULATIVE_ARGS which gives info about
3094 the preceding args and about the function being called.
3095 NAMED is nonzero if this argument is a named parameter
3096 (otherwise it is an extra parameter matching an ellipsis).
3097
3098 On RS/6000 the first eight words of non-FP are normally in registers
3099 and the rest are pushed. Under AIX, the first 13 FP args are in registers.
3100 Under V.4, the first 8 FP args are in registers.
3101
3102 If this is floating-point and no prototype is specified, we use
3103 both an FP and integer register (or possibly FP reg and stack). Library
3104 functions (when TYPE is zero) always have the proper types for args,
3105 so we can pass the FP value just in one register. emit_library_function
1c20ae99 3106 doesn't support PARALLEL anyway. */
4697a36c
MM
3107
3108struct rtx_def *
3109function_arg (cum, mode, type, named)
3110 CUMULATIVE_ARGS *cum;
3111 enum machine_mode mode;
3112 tree type;
20c29ebe 3113 int named;
4697a36c 3114{
4cc833b7 3115 enum rs6000_abi abi = DEFAULT_ABI;
4697a36c 3116
a4f6c312
SS
3117 /* Return a marker to indicate whether CR1 needs to set or clear the
3118 bit that V.4 uses to say fp args were passed in registers.
3119 Assume that we don't need the marker for software floating point,
3120 or compiler generated library calls. */
4697a36c
MM
3121 if (mode == VOIDmode)
3122 {
f607bc57 3123 if (abi == ABI_V4
7509c759 3124 && cum->nargs_prototype < 0
4697a36c 3125 && type && (cum->prototype || TARGET_NO_PROTOTYPE))
7509c759 3126 {
a3170dc6
AH
3127 /* For the SPE, we need to crxor CR6 always. */
3128 if (TARGET_SPE_ABI)
3129 return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
3130 else if (TARGET_HARD_FLOAT && TARGET_FPRS)
3131 return GEN_INT (cum->call_cookie
3132 | ((cum->fregno == FP_ARG_MIN_REG)
3133 ? CALL_V4_SET_FP_ARGS
3134 : CALL_V4_CLEAR_FP_ARGS));
7509c759 3135 }
4697a36c 3136
7509c759 3137 return GEN_INT (cum->call_cookie);
4697a36c
MM
3138 }
3139
0ac081f6
AH
3140 if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
3141 {
20c29ebe 3142 if (named && cum->vregno <= ALTIVEC_ARG_MAX_REG)
0ac081f6
AH
3143 return gen_rtx_REG (mode, cum->vregno);
3144 else
3145 return NULL;
3146 }
a4b0320c 3147 else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode) && named)
a3170dc6 3148 {
a4b0320c 3149 if (cum->sysv_gregno <= GP_ARG_MAX_REG)
a3170dc6
AH
3150 return gen_rtx_REG (mode, cum->sysv_gregno);
3151 else
3152 return NULL;
3153 }
f607bc57 3154 else if (abi == ABI_V4)
4697a36c 3155 {
a3170dc6 3156 if (TARGET_HARD_FLOAT && TARGET_FPRS
4cc833b7
RH
3157 && (mode == SFmode || mode == DFmode))
3158 {
3159 if (cum->fregno <= FP_ARG_V4_MAX_REG)
3160 return gen_rtx_REG (mode, cum->fregno);
3161 else
3162 return NULL;
3163 }
3164 else
3165 {
3166 int n_words;
3167 int gregno = cum->sysv_gregno;
3168
3169 /* Aggregates and IEEE quad get passed by reference. */
3170 if ((type && AGGREGATE_TYPE_P (type))
3171 || mode == TFmode)
3172 n_words = 1;
3173 else
d34c5b80 3174 n_words = RS6000_ARG_SIZE (mode, type);
4cc833b7 3175
a4b0320c 3176 /* Long long and SPE vectors are put in odd registers. */
4cc833b7
RH
3177 if (n_words == 2 && (gregno & 1) == 0)
3178 gregno += 1;
3179
a4b0320c
AH
3180 /* Long long and SPE vectors are not split between registers
3181 and stack. */
4cc833b7 3182 if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
a4b0320c
AH
3183 {
3184 /* SPE vectors in ... get split into 2 registers. */
3185 if (TARGET_SPE && TARGET_SPE_ABI
3186 && SPE_VECTOR_MODE (mode) && !named)
3187 {
3188 rtx r1, r2;
57de2c8f 3189 enum machine_mode m = SImode;
f9dd72da 3190
a4b0320c
AH
3191 r1 = gen_rtx_REG (m, gregno);
3192 r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
3193 r2 = gen_rtx_REG (m, gregno + 1);
3194 r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
3195 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
3196 }
3197 return gen_rtx_REG (mode, gregno);
3198 }
4cc833b7
RH
3199 else
3200 return NULL;
3201 }
4697a36c 3202 }
4cc833b7
RH
3203 else
3204 {
3205 int align = (TARGET_32BIT && (cum->words & 1) != 0
3206 && function_arg_boundary (mode, type) == 64) ? 1 : 0;
3207 int align_words = cum->words + align;
4697a36c 3208
4cc833b7
RH
3209 if (type && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
3210 return NULL_RTX;
3211
3212 if (USE_FP_FOR_ARG_P (*cum, mode, type))
3213 {
3214 if (! type
3215 || ((cum->nargs_prototype > 0)
3216 /* IBM AIX extended its linkage convention definition always
3217 to require FP args after register save area hole on the
3218 stack. */
3219 && (DEFAULT_ABI != ABI_AIX
3220 || ! TARGET_XL_CALL
3221 || (align_words < GP_ARG_NUM_REG))))
3222 return gen_rtx_REG (mode, cum->fregno);
3223
3224 return gen_rtx_PARALLEL (mode,
3225 gen_rtvec (2,
39403d82 3226 gen_rtx_EXPR_LIST (VOIDmode,
1c20ae99
JW
3227 ((align_words >= GP_ARG_NUM_REG)
3228 ? NULL_RTX
3229 : (align_words
d34c5b80 3230 + RS6000_ARG_SIZE (mode, type)
1c20ae99
JW
3231 > GP_ARG_NUM_REG
3232 /* If this is partially on the stack, then
3233 we only include the portion actually
3234 in registers here. */
39403d82 3235 ? gen_rtx_REG (SImode,
1c20ae99 3236 GP_ARG_MIN_REG + align_words)
39403d82 3237 : gen_rtx_REG (mode,
1c20ae99
JW
3238 GP_ARG_MIN_REG + align_words))),
3239 const0_rtx),
39403d82
DE
3240 gen_rtx_EXPR_LIST (VOIDmode,
3241 gen_rtx_REG (mode, cum->fregno),
1c20ae99 3242 const0_rtx)));
4cc833b7
RH
3243 }
3244 else if (align_words < GP_ARG_NUM_REG)
3245 return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
3246 else
3247 return NULL_RTX;
4697a36c 3248 }
4697a36c
MM
3249}
3250\f
3251/* For an arg passed partly in registers and partly in memory,
3252 this is the number of registers used.
3253 For args passed entirely in registers or entirely in memory, zero. */
3254
3255int
3256function_arg_partial_nregs (cum, mode, type, named)
3257 CUMULATIVE_ARGS *cum;
3258 enum machine_mode mode;
3259 tree type;
d34c5b80 3260 int named ATTRIBUTE_UNUSED;
4697a36c 3261{
f607bc57 3262 if (DEFAULT_ABI == ABI_V4)
4697a36c 3263 return 0;
4697a36c 3264
0ac081f6
AH
3265 if (USE_FP_FOR_ARG_P (*cum, mode, type)
3266 || USE_ALTIVEC_FOR_ARG_P (*cum, mode, type))
4697a36c
MM
3267 {
3268 if (cum->nargs_prototype >= 0)
3269 return 0;
3270 }
3271
3272 if (cum->words < GP_ARG_NUM_REG
d34c5b80 3273 && GP_ARG_NUM_REG < (cum->words + RS6000_ARG_SIZE (mode, type)))
4697a36c
MM
3274 {
3275 int ret = GP_ARG_NUM_REG - cum->words;
3276 if (ret && TARGET_DEBUG_ARG)
3277 fprintf (stderr, "function_arg_partial_nregs: %d\n", ret);
3278
3279 return ret;
3280 }
3281
3282 return 0;
3283}
3284\f
3285/* A C expression that indicates when an argument must be passed by
3286 reference. If nonzero for an argument, a copy of that argument is
3287 made in memory and a pointer to the argument is passed instead of
3288 the argument itself. The pointer is passed in whatever way is
3289 appropriate for passing a pointer to that type.
3290
3291 Under V.4, structures and unions are passed by reference. */
3292
3293int
3294function_arg_pass_by_reference (cum, mode, type, named)
296b8152
KG
3295 CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED;
3296 enum machine_mode mode ATTRIBUTE_UNUSED;
4697a36c 3297 tree type;
296b8152 3298 int named ATTRIBUTE_UNUSED;
4697a36c 3299{
f607bc57 3300 if (DEFAULT_ABI == ABI_V4
4cc833b7
RH
3301 && ((type && AGGREGATE_TYPE_P (type))
3302 || mode == TFmode))
4697a36c
MM
3303 {
3304 if (TARGET_DEBUG_ARG)
3305 fprintf (stderr, "function_arg_pass_by_reference: aggregate\n");
3306
3307 return 1;
3308 }
4697a36c
MM
3309
3310 return 0;
3311}
4697a36c
MM
3312\f
3313/* Perform any needed actions needed for a function that is receiving a
3314 variable number of arguments.
3315
3316 CUM is as above.
3317
3318 MODE and TYPE are the mode and type of the current parameter.
3319
3320 PRETEND_SIZE is a variable that should be set to the amount of stack
3321 that must be pushed by the prolog to pretend that our caller pushed
3322 it.
3323
3324 Normally, this macro will push all remaining incoming registers on the
3325 stack and set PRETEND_SIZE to the length of the registers pushed. */
3326
3327void
3328setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
3329 CUMULATIVE_ARGS *cum;
3330 enum machine_mode mode;
3331 tree type;
3332 int *pretend_size;
3333 int no_rtl;
3334
3335{
4cc833b7
RH
3336 CUMULATIVE_ARGS next_cum;
3337 int reg_size = TARGET_32BIT ? 4 : 8;
ca5adc63 3338 rtx save_area = NULL_RTX, mem;
dfafc897 3339 int first_reg_offset, set;
d34c5b80
DE
3340 tree fntype;
3341 int stdarg_p;
4697a36c 3342
d34c5b80
DE
3343 fntype = TREE_TYPE (current_function_decl);
3344 stdarg_p = (TYPE_ARG_TYPES (fntype) != 0
3345 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
3346 != void_type_node));
4cc833b7 3347
d34c5b80
DE
3348 /* For varargs, we do not want to skip the dummy va_dcl argument.
3349 For stdargs, we do want to skip the last named argument. */
3350 next_cum = *cum;
3351 if (stdarg_p)
3352 function_arg_advance (&next_cum, mode, type, 1);
4cc833b7 3353
f607bc57 3354 if (DEFAULT_ABI == ABI_V4)
d34c5b80 3355 {
4cc833b7 3356 /* Indicate to allocate space on the stack for varargs save area. */
00dba523 3357 cfun->machine->sysv_varargs_p = 1;
60e2d0ca 3358 if (! no_rtl)
2c4974b7 3359 save_area = plus_constant (virtual_stack_vars_rtx,
bd227acc 3360 - RS6000_VARARGS_SIZE);
4cc833b7
RH
3361
3362 first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
4697a36c 3363 }
60e2d0ca 3364 else
4697a36c 3365 {
d34c5b80 3366 first_reg_offset = next_cum.words;
4cc833b7 3367 save_area = virtual_incoming_args_rtx;
00dba523 3368 cfun->machine->sysv_varargs_p = 0;
4697a36c
MM
3369
3370 if (MUST_PASS_IN_STACK (mode, type))
d34c5b80 3371 first_reg_offset += RS6000_ARG_SIZE (TYPE_MODE (type), type);
4cc833b7 3372 }
4697a36c 3373
dfafc897 3374 set = get_varargs_alias_set ();
c81fc13e 3375 if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG)
4cc833b7 3376 {
dfafc897
FS
3377 mem = gen_rtx_MEM (BLKmode,
3378 plus_constant (save_area,
3379 first_reg_offset * reg_size)),
ba4828e0 3380 set_mem_alias_set (mem, set);
8ac61af7 3381 set_mem_align (mem, BITS_PER_WORD);
dfafc897 3382
4cc833b7 3383 move_block_from_reg
dfafc897 3384 (GP_ARG_MIN_REG + first_reg_offset, mem,
4cc833b7
RH
3385 GP_ARG_NUM_REG - first_reg_offset,
3386 (GP_ARG_NUM_REG - first_reg_offset) * UNITS_PER_WORD);
3387
3388 /* ??? Does ABI_V4 need this at all? */
4697a36c
MM
3389 *pretend_size = (GP_ARG_NUM_REG - first_reg_offset) * UNITS_PER_WORD;
3390 }
3391
4697a36c 3392 /* Save FP registers if needed. */
f607bc57 3393 if (DEFAULT_ABI == ABI_V4
a3170dc6
AH
3394 && TARGET_HARD_FLOAT && TARGET_FPRS
3395 && ! no_rtl
4cc833b7 3396 && next_cum.fregno <= FP_ARG_V4_MAX_REG)
4697a36c 3397 {
4cc833b7 3398 int fregno = next_cum.fregno;
9ebbca7d 3399 rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
4cc833b7
RH
3400 rtx lab = gen_label_rtx ();
3401 int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG) * 8);
4697a36c 3402
4cc833b7 3403 emit_jump_insn (gen_rtx_SET (VOIDmode,
4697a36c 3404 pc_rtx,
39403d82 3405 gen_rtx_IF_THEN_ELSE (VOIDmode,
4cc833b7
RH
3406 gen_rtx_NE (VOIDmode, cr1,
3407 const0_rtx),
39403d82 3408 gen_rtx_LABEL_REF (VOIDmode, lab),
4697a36c
MM
3409 pc_rtx)));
3410
4cc833b7
RH
3411 while (fregno <= FP_ARG_V4_MAX_REG)
3412 {
dfafc897 3413 mem = gen_rtx_MEM (DFmode, plus_constant (save_area, off));
ba4828e0 3414 set_mem_alias_set (mem, set);
dfafc897 3415 emit_move_insn (mem, gen_rtx_REG (DFmode, fregno));
4cc833b7
RH
3416 fregno++;
3417 off += 8;
4697a36c 3418 }
4cc833b7
RH
3419
3420 emit_label (lab);
4697a36c 3421 }
4697a36c 3422}
4697a36c 3423
dfafc897 3424/* Create the va_list data type. */
2c4974b7 3425
dfafc897
FS
3426tree
3427rs6000_build_va_list ()
3428{
bab45a51 3429 tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
4697a36c 3430
9ebbca7d
GK
3431 /* For AIX, prefer 'char *' because that's what the system
3432 header files like. */
f607bc57 3433 if (DEFAULT_ABI != ABI_V4)
9ebbca7d 3434 return build_pointer_type (char_type_node);
dfafc897 3435
f1e639b1 3436 record = (*lang_hooks.types.make_type) (RECORD_TYPE);
bab45a51 3437 type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
0f4fd75d 3438
9ebbca7d
GK
3439 f_gpr = build_decl (FIELD_DECL, get_identifier ("gpr"),
3440 unsigned_char_type_node);
3441 f_fpr = build_decl (FIELD_DECL, get_identifier ("fpr"),
3442 unsigned_char_type_node);
dfafc897
FS
3443 f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
3444 ptr_type_node);
3445 f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
3446 ptr_type_node);
3447
3448 DECL_FIELD_CONTEXT (f_gpr) = record;
3449 DECL_FIELD_CONTEXT (f_fpr) = record;
3450 DECL_FIELD_CONTEXT (f_ovf) = record;
3451 DECL_FIELD_CONTEXT (f_sav) = record;
3452
bab45a51
FS
3453 TREE_CHAIN (record) = type_decl;
3454 TYPE_NAME (record) = type_decl;
dfafc897
FS
3455 TYPE_FIELDS (record) = f_gpr;
3456 TREE_CHAIN (f_gpr) = f_fpr;
3457 TREE_CHAIN (f_fpr) = f_ovf;
3458 TREE_CHAIN (f_ovf) = f_sav;
3459
3460 layout_type (record);
3461
3462 /* The correct type is an array type of one element. */
3463 return build_array_type (record, build_index_type (size_zero_node));
3464}
3465
3466/* Implement va_start. */
3467
3468void
e5faf155 3469rs6000_va_start (valist, nextarg)
dfafc897
FS
3470 tree valist;
3471 rtx nextarg;
4697a36c 3472{
dfafc897
FS
3473 HOST_WIDE_INT words, n_gpr, n_fpr;
3474 tree f_gpr, f_fpr, f_ovf, f_sav;
3475 tree gpr, fpr, ovf, sav, t;
2c4974b7 3476
dfafc897 3477 /* Only SVR4 needs something special. */
f607bc57 3478 if (DEFAULT_ABI != ABI_V4)
dfafc897 3479 {
e5faf155 3480 std_expand_builtin_va_start (valist, nextarg);
dfafc897
FS
3481 return;
3482 }
3483
973a648b 3484 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
dfafc897
FS
3485 f_fpr = TREE_CHAIN (f_gpr);
3486 f_ovf = TREE_CHAIN (f_fpr);
3487 f_sav = TREE_CHAIN (f_ovf);
3488
8ebecc3b 3489 valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
dfafc897
FS
3490 gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr);
3491 fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr);
3492 ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf);
3493 sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav);
3494
3495 /* Count number of gp and fp argument registers used. */
4cc833b7 3496 words = current_function_args_info.words;
dfafc897
FS
3497 n_gpr = current_function_args_info.sysv_gregno - GP_ARG_MIN_REG;
3498 n_fpr = current_function_args_info.fregno - FP_ARG_MIN_REG;
3499
3500 if (TARGET_DEBUG_ARG)
78e1b90d
DE
3501 {
3502 fputs ("va_start: words = ", stderr);
3503 fprintf (stderr, HOST_WIDE_INT_PRINT_DEC, words);
3504 fputs (", n_gpr = ", stderr);
3505 fprintf (stderr, HOST_WIDE_INT_PRINT_DEC, n_gpr);
3506 fputs (", n_fpr = ", stderr);
3507 fprintf (stderr, HOST_WIDE_INT_PRINT_DEC, n_fpr);
3508 putc ('\n', stderr);
3509 }
dfafc897
FS
3510
3511 t = build (MODIFY_EXPR, TREE_TYPE (gpr), gpr, build_int_2 (n_gpr, 0));
3512 TREE_SIDE_EFFECTS (t) = 1;
3513 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3514
3515 t = build (MODIFY_EXPR, TREE_TYPE (fpr), fpr, build_int_2 (n_fpr, 0));
3516 TREE_SIDE_EFFECTS (t) = 1;
3517 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3518
3519 /* Find the overflow area. */
3520 t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
3521 if (words != 0)
3522 t = build (PLUS_EXPR, TREE_TYPE (ovf), t,
3523 build_int_2 (words * UNITS_PER_WORD, 0));
3524 t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
3525 TREE_SIDE_EFFECTS (t) = 1;
3526 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3527
3528 /* Find the register save area. */
3529 t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
3530 t = build (PLUS_EXPR, TREE_TYPE (sav), t,
3531 build_int_2 (-RS6000_VARARGS_SIZE, -1));
3532 t = build (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
3533 TREE_SIDE_EFFECTS (t) = 1;
3534 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3535}
3536
3537/* Implement va_arg. */
3538
3539rtx
3540rs6000_va_arg (valist, type)
3541 tree valist, type;
3542{
3543 tree f_gpr, f_fpr, f_ovf, f_sav;
3544 tree gpr, fpr, ovf, sav, reg, t, u;
3545 int indirect_p, size, rsize, n_reg, sav_ofs, sav_scale;
3546 rtx lab_false, lab_over, addr_rtx, r;
3547
f607bc57 3548 if (DEFAULT_ABI != ABI_V4)
2a55fd42 3549 return std_expand_builtin_va_arg (valist, type);
dfafc897 3550
973a648b 3551 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
dfafc897
FS
3552 f_fpr = TREE_CHAIN (f_gpr);
3553 f_ovf = TREE_CHAIN (f_fpr);
3554 f_sav = TREE_CHAIN (f_ovf);
3555
8ebecc3b 3556 valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
dfafc897
FS
3557 gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr);
3558 fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr);
3559 ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf);
3560 sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav);
3561
3562 size = int_size_in_bytes (type);
3563 rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4cc833b7 3564
dfafc897 3565 if (AGGREGATE_TYPE_P (type) || TYPE_MODE (type) == TFmode)
4cc833b7 3566 {
dfafc897
FS
3567 /* Aggregates and long doubles are passed by reference. */
3568 indirect_p = 1;
3569 reg = gpr;
3570 n_reg = 1;
3571 sav_ofs = 0;
3572 sav_scale = 4;
d3294cd9
FS
3573 size = UNITS_PER_WORD;
3574 rsize = 1;
dfafc897 3575 }
a3170dc6 3576 else if (FLOAT_TYPE_P (type) && TARGET_HARD_FLOAT && TARGET_FPRS)
dfafc897
FS
3577 {
3578 /* FP args go in FP registers, if present. */
3579 indirect_p = 0;
3580 reg = fpr;
3581 n_reg = 1;
3582 sav_ofs = 8*4;
3583 sav_scale = 8;
4cc833b7 3584 }
dfafc897
FS
3585 else
3586 {
3587 /* Otherwise into GP registers. */
3588 indirect_p = 0;
3589 reg = gpr;
3590 n_reg = rsize;
3591 sav_ofs = 0;
3592 sav_scale = 4;
3593 }
3594
a4f6c312 3595 /* Pull the value out of the saved registers ... */
dfafc897
FS
3596
3597 lab_false = gen_label_rtx ();
3598 lab_over = gen_label_rtx ();
3599 addr_rtx = gen_reg_rtx (Pmode);
3600
16861f33
AH
3601 /* AltiVec vectors never go in registers. */
3602 if (!TARGET_ALTIVEC || TREE_CODE (type) != VECTOR_TYPE)
2c4974b7 3603 {
41daaf0e
AH
3604 TREE_THIS_VOLATILE (reg) = 1;
3605 emit_cmp_and_jump_insns
3606 (expand_expr (reg, NULL_RTX, QImode, EXPAND_NORMAL),
3607 GEN_INT (8 - n_reg + 1), GE, const1_rtx, QImode, 1,
3608 lab_false);
dfafc897 3609
41daaf0e
AH
3610 /* Long long is aligned in the registers. */
3611 if (n_reg > 1)
3612 {
3613 u = build (BIT_AND_EXPR, TREE_TYPE (reg), reg,
3614 build_int_2 (n_reg - 1, 0));
3615 u = build (PLUS_EXPR, TREE_TYPE (reg), reg, u);
3616 u = build (MODIFY_EXPR, TREE_TYPE (reg), reg, u);
3617 TREE_SIDE_EFFECTS (u) = 1;
3618 expand_expr (u, const0_rtx, VOIDmode, EXPAND_NORMAL);
3619 }
2c4974b7 3620
41daaf0e
AH
3621 if (sav_ofs)
3622 t = build (PLUS_EXPR, ptr_type_node, sav, build_int_2 (sav_ofs, 0));
3623 else
3624 t = sav;
2c4974b7 3625
41daaf0e
AH
3626 u = build (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg,
3627 build_int_2 (n_reg, 0));
3628 TREE_SIDE_EFFECTS (u) = 1;
2c4974b7 3629
41daaf0e
AH
3630 u = build1 (CONVERT_EXPR, integer_type_node, u);
3631 TREE_SIDE_EFFECTS (u) = 1;
dfafc897 3632
41daaf0e
AH
3633 u = build (MULT_EXPR, integer_type_node, u, build_int_2 (sav_scale, 0));
3634 TREE_SIDE_EFFECTS (u) = 1;
dfafc897 3635
41daaf0e
AH
3636 t = build (PLUS_EXPR, ptr_type_node, t, u);
3637 TREE_SIDE_EFFECTS (t) = 1;
3638
3639 r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL);
3640 if (r != addr_rtx)
3641 emit_move_insn (addr_rtx, r);
3642
3643 emit_jump_insn (gen_jump (lab_over));
3644 emit_barrier ();
3645 }
dfafc897 3646
dfafc897
FS
3647 emit_label (lab_false);
3648
a4f6c312 3649 /* ... otherwise out of the overflow area. */
dfafc897 3650
41daaf0e
AH
3651 /* Make sure we don't find reg 7 for the next int arg.
3652
3653 All AltiVec vectors go in the overflow area. So in the AltiVec
3654 case we need to get the vectors from the overflow area, but
3655 remember where the GPRs and FPRs are. */
16861f33
AH
3656 if (n_reg > 1 && (TREE_CODE (type) != VECTOR_TYPE
3657 || !TARGET_ALTIVEC))
dfafc897
FS
3658 {
3659 t = build (MODIFY_EXPR, TREE_TYPE (reg), reg, build_int_2 (8, 0));
3660 TREE_SIDE_EFFECTS (t) = 1;
3661 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3662 }
3663
3664 /* Care for on-stack alignment if needed. */
3665 if (rsize <= 1)
3666 t = ovf;
3667 else
3668 {
41daaf0e
AH
3669 int align;
3670
16861f33
AH
3671 /* AltiVec vectors are 16 byte aligned. */
3672 if (TARGET_ALTIVEC && TREE_CODE (type) == VECTOR_TYPE)
41daaf0e
AH
3673 align = 15;
3674 else
3675 align = 7;
3676
3677 t = build (PLUS_EXPR, TREE_TYPE (ovf), ovf, build_int_2 (align, 0));
3678 t = build (BIT_AND_EXPR, TREE_TYPE (t), t, build_int_2 (-align-1, -1));
dfafc897
FS
3679 }
3680 t = save_expr (t);
3681
3682 r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL);
3683 if (r != addr_rtx)
3684 emit_move_insn (addr_rtx, r);
3685
3686 t = build (PLUS_EXPR, TREE_TYPE (t), t, build_int_2 (size, 0));
3687 t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
3688 TREE_SIDE_EFFECTS (t) = 1;
3689 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
3690
3691 emit_label (lab_over);
3692
3693 if (indirect_p)
3694 {
3695 r = gen_rtx_MEM (Pmode, addr_rtx);
ba4828e0 3696 set_mem_alias_set (r, get_varargs_alias_set ());
dfafc897
FS
3697 emit_move_insn (addr_rtx, r);
3698 }
3699
3700 return addr_rtx;
4697a36c 3701}
0ac081f6
AH
3702
3703/* Builtins. */
3704
6a2dd09a
RS
3705#define def_builtin(MASK, NAME, TYPE, CODE) \
3706do { \
3707 if ((MASK) & target_flags) \
3708 builtin_function ((NAME), (TYPE), (CODE), BUILT_IN_MD, \
3709 NULL, NULL_TREE); \
0ac081f6
AH
3710} while (0)
3711
24408032
AH
3712/* Simple ternary operations: VECd = foo (VECa, VECb, VECc). */
3713
2212663f 3714static const struct builtin_description bdesc_3arg[] =
24408032
AH
3715{
3716 { MASK_ALTIVEC, CODE_FOR_altivec_vmaddfp, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
3717 { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
3718 { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
3719 { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
3720 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
3721 { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
3722 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
3723 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
3724 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
3725 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
3726 { MASK_ALTIVEC, CODE_FOR_altivec_vnmsubfp, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
3727 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
3728 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
3729 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
3730 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_16qi, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
3731 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
3732 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
3733 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
3734 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
3735 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
3736 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
3737 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
3738 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
3739};
2212663f 3740
95385cbb
AH
3741/* DST operations: void foo (void *, const int, const char). */
3742
3743static const struct builtin_description bdesc_dst[] =
3744{
3745 { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
3746 { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
3747 { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
3748 { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT }
3749};
3750
2212663f 3751/* Simple binary operations: VECc = foo (VECa, VECb). */
24408032 3752
a3170dc6 3753static struct builtin_description bdesc_2arg[] =
0ac081f6 3754{
f18c054f
DB
3755 { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
3756 { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
3757 { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
3758 { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
0ac081f6
AH
3759 { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
3760 { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
3761 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
3762 { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
3763 { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
3764 { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
3765 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
f18c054f 3766 { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
0ac081f6
AH
3767 { MASK_ALTIVEC, CODE_FOR_altivec_vandc, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
3768 { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
3769 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
3770 { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
3771 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
3772 { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
3773 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
617e0e1d
DB
3774 { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
3775 { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
0ac081f6
AH
3776 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
3777 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequb, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
3778 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequh, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
3779 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequw, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
3780 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpeqfp, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
3781 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgefp, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
3782 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtub, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
3783 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsb, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
3784 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuh, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
3785 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsh, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
3786 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuw, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
3787 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsw, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
3788 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtfp, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
617e0e1d
DB
3789 { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
3790 { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
f18c054f
DB
3791 { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
3792 { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
df966bff
AH
3793 { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
3794 { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
3795 { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
3796 { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
3797 { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
0ac081f6
AH
3798 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
3799 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
3800 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
3801 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
3802 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
3803 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
f18c054f
DB
3804 { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
3805 { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
3806 { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
3807 { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
3808 { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
3809 { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
3810 { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
0ac081f6
AH
3811 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
3812 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
3813 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
3814 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
3815 { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
3816 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
3817 { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
3818 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
3819 { MASK_ALTIVEC, CODE_FOR_altivec_vnor, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
f18c054f 3820 { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
0ac081f6
AH
3821 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
3822 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
3823 { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
3824 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhss, "__builtin_altivec_vpkuhss", ALTIVEC_BUILTIN_VPKUHSS },
3825 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
3826 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwss, "__builtin_altivec_vpkuwss", ALTIVEC_BUILTIN_VPKUWSS },
3827 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
3828 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
3829 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
3830 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
3831 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
3832 { MASK_ALTIVEC, CODE_FOR_altivec_vrlb, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
3833 { MASK_ALTIVEC, CODE_FOR_altivec_vrlh, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
3834 { MASK_ALTIVEC, CODE_FOR_altivec_vrlw, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
3835 { MASK_ALTIVEC, CODE_FOR_altivec_vslb, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
3836 { MASK_ALTIVEC, CODE_FOR_altivec_vslh, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
3837 { MASK_ALTIVEC, CODE_FOR_altivec_vslw, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
3838 { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
3839 { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
2212663f
DB
3840 { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
3841 { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
3842 { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
0ac081f6 3843 { MASK_ALTIVEC, CODE_FOR_altivec_vsrb, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
f18c054f
DB
3844 { MASK_ALTIVEC, CODE_FOR_altivec_vsrh, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
3845 { MASK_ALTIVEC, CODE_FOR_altivec_vsrw, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
0ac081f6
AH
3846 { MASK_ALTIVEC, CODE_FOR_altivec_vsrab, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
3847 { MASK_ALTIVEC, CODE_FOR_altivec_vsrah, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
3848 { MASK_ALTIVEC, CODE_FOR_altivec_vsraw, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
3849 { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
3850 { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
f18c054f
DB
3851 { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
3852 { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
3853 { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
3854 { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
0ac081f6
AH
3855 { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
3856 { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
3857 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
3858 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
3859 { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
3860 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
3861 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
3862 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
3863 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
3864 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
3865 { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
3866 { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
f18c054f 3867 { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
a3170dc6
AH
3868
3869 /* Place holder, leave as first spe builtin. */
3870 { 0, CODE_FOR_spe_evaddw, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
3871 { 0, CODE_FOR_spe_evand, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
3872 { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
3873 { 0, CODE_FOR_spe_evdivws, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
3874 { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
3875 { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
3876 { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
3877 { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
3878 { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
3879 { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
3880 { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
3881 { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
3882 { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
3883 { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
3884 { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
3885 { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
3886 { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
3887 { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
3888 { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
3889 { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
3890 { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
3891 { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
3892 { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
3893 { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
3894 { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
3895 { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
3896 { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
3897 { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
3898 { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
3899 { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
3900 { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
3901 { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
3902 { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
3903 { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
3904 { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
3905 { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
3906 { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
3907 { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
3908 { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
3909 { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
3910 { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
3911 { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
3912 { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
3913 { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
3914 { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
3915 { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
3916 { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
3917 { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
3918 { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
3919 { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
3920 { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
3921 { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
3922 { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
3923 { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
3924 { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
3925 { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
3926 { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
3927 { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
3928 { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
3929 { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
3930 { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
3931 { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
3932 { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
3933 { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
3934 { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
3935 { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
3936 { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
3937 { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
3938 { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
3939 { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
3940 { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
3941 { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
3942 { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
3943 { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
a3170dc6
AH
3944 { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
3945 { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
a3170dc6
AH
3946 { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
3947 { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
3948 { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
3949 { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
3950 { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
3951 { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
3952 { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
3953 { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
3954 { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
3955 { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
3956 { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
3957 { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
3958 { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
3959 { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
3960 { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
3961 { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
3962 { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
3963 { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
3964 { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
3965 { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
3966 { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
3967 { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
3968 { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
3969 { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
3970 { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
3971 { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
3972 { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
3973 { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
3974 { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
3975 { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
3976 { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
3977 { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
3978 { 0, CODE_FOR_spe_evsubfw, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
3979
3980 /* SPE binary operations expecting a 5-bit unsigned literal. */
3981 { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
3982
3983 { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
3984 { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
3985 { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
3986 { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
3987 { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
3988 { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
3989 { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
3990 { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
3991 { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
3992 { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
3993 { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
3994 { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
3995 { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
3996 { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
3997 { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
3998 { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
3999 { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
4000 { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
4001 { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
4002 { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
4003 { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
4004 { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
4005 { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
4006 { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
4007 { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
4008 { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
4009
4010 /* Place-holder. Leave as last binary SPE builtin. */
4011 { 0, CODE_FOR_spe_evxor, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR },
ae4b4a02
AH
4012};
4013
4014/* AltiVec predicates. */
4015
4016struct builtin_description_predicates
4017{
4018 const unsigned int mask;
4019 const enum insn_code icode;
4020 const char *opcode;
4021 const char *const name;
4022 const enum rs6000_builtins code;
4023};
4024
4025static const struct builtin_description_predicates bdesc_altivec_preds[] =
4026{
4027 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpbfp.", "__builtin_altivec_vcmpbfp_p", ALTIVEC_BUILTIN_VCMPBFP_P },
4028 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpeqfp.", "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
4029 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgefp.", "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
4030 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgtfp.", "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
4031 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpequw.", "__builtin_altivec_vcmpequw_p", ALTIVEC_BUILTIN_VCMPEQUW_P },
4032 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtsw.", "__builtin_altivec_vcmpgtsw_p", ALTIVEC_BUILTIN_VCMPGTSW_P },
4033 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtuw.", "__builtin_altivec_vcmpgtuw_p", ALTIVEC_BUILTIN_VCMPGTUW_P },
4034 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtuh.", "__builtin_altivec_vcmpgtuh_p", ALTIVEC_BUILTIN_VCMPGTUH_P },
4035 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtsh.", "__builtin_altivec_vcmpgtsh_p", ALTIVEC_BUILTIN_VCMPGTSH_P },
4036 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpequh.", "__builtin_altivec_vcmpequh_p", ALTIVEC_BUILTIN_VCMPEQUH_P },
4037 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpequb.", "__builtin_altivec_vcmpequb_p", ALTIVEC_BUILTIN_VCMPEQUB_P },
4038 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtsb.", "__builtin_altivec_vcmpgtsb_p", ALTIVEC_BUILTIN_VCMPGTSB_P },
4039 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtub.", "__builtin_altivec_vcmpgtub_p", ALTIVEC_BUILTIN_VCMPGTUB_P }
0ac081f6 4040};
24408032 4041
a3170dc6
AH
4042/* SPE predicates. */
4043static struct builtin_description bdesc_spe_predicates[] =
4044{
4045 /* Place-holder. Leave as first. */
4046 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
4047 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
4048 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
4049 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
4050 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
4051 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
4052 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
4053 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
4054 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
4055 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
4056 /* Place-holder. Leave as last. */
4057 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
4058};
4059
4060/* SPE evsel predicates. */
4061static struct builtin_description bdesc_spe_evsel[] =
4062{
4063 /* Place-holder. Leave as first. */
4064 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
4065 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
4066 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
4067 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
4068 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
4069 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
4070 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
4071 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
4072 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
4073 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
4074 /* Place-holder. Leave as last. */
4075 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
4076};
4077
100c4561
AH
4078/* ABS* opreations. */
4079
4080static const struct builtin_description bdesc_abs[] =
4081{
4082 { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
4083 { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
4084 { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
4085 { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
4086 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
4087 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
4088 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI }
4089};
4090
617e0e1d
DB
4091/* Simple unary operations: VECb = foo (unsigned literal) or VECb =
4092 foo (VECa). */
24408032 4093
a3170dc6 4094static struct builtin_description bdesc_1arg[] =
2212663f 4095{
617e0e1d
DB
4096 { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
4097 { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
4098 { MASK_ALTIVEC, CODE_FOR_altivec_vrefp, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
4099 { MASK_ALTIVEC, CODE_FOR_altivec_vrfim, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
4100 { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
4101 { MASK_ALTIVEC, CODE_FOR_altivec_vrfip, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
4102 { MASK_ALTIVEC, CODE_FOR_ftruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
4103 { MASK_ALTIVEC, CODE_FOR_altivec_vrsqrtefp, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
2212663f
DB
4104 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
4105 { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
4106 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
20e26713
AH
4107 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
4108 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
4109 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
4110 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
4111 { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
4112 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
a3170dc6
AH
4113
4114 /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
4115 end with SPE_BUILTIN_EVSUBFUSIAAW. */
4116 { 0, CODE_FOR_spe_evabs, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
4117 { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
4118 { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
4119 { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
4120 { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
4121 { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
4122 { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
4123 { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
4124 { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
4125 { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
4126 { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
4127 { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
4128 { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
4129 { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
4130 { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
4131 { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
4132 { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
4133 { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
4134 { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
4135 { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
4136 { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
4137 { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
4138 { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
4139 { 0, CODE_FOR_spe_evneg, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
4140 { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
4141 { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
4142 { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
4143 { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
4144 { 0, CODE_FOR_spe_evsplatfi, "__builtin_spe_evsplatfi", SPE_BUILTIN_EVSPLATFI },
4145 { 0, CODE_FOR_spe_evsplati, "__builtin_spe_evsplati", SPE_BUILTIN_EVSPLATI },
4146
4147 /* Place-holder. Leave as last unary SPE builtin. */
4148 { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
2212663f
DB
4149};
4150
4151static rtx
92898235 4152rs6000_expand_unop_builtin (icode, arglist, target)
2212663f
DB
4153 enum insn_code icode;
4154 tree arglist;
4155 rtx target;
4156{
4157 rtx pat;
4158 tree arg0 = TREE_VALUE (arglist);
4159 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4160 enum machine_mode tmode = insn_data[icode].operand[0].mode;
4161 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4162
0559cc77
DE
4163 if (icode == CODE_FOR_nothing)
4164 /* Builtin not supported on this processor. */
4165 return 0;
4166
20e26713
AH
4167 /* If we got invalid arguments bail out before generating bad rtl. */
4168 if (arg0 == error_mark_node)
9a171fcd 4169 return const0_rtx;
20e26713 4170
0559cc77
DE
4171 if (icode == CODE_FOR_altivec_vspltisb
4172 || icode == CODE_FOR_altivec_vspltish
4173 || icode == CODE_FOR_altivec_vspltisw
4174 || icode == CODE_FOR_spe_evsplatfi
4175 || icode == CODE_FOR_spe_evsplati)
b44140e7
AH
4176 {
4177 /* Only allow 5-bit *signed* literals. */
b44140e7
AH
4178 if (GET_CODE (op0) != CONST_INT
4179 || INTVAL (op0) > 0x1f
4180 || INTVAL (op0) < -0x1f)
4181 {
4182 error ("argument 1 must be a 5-bit signed literal");
9a171fcd 4183 return const0_rtx;
b44140e7 4184 }
b44140e7
AH
4185 }
4186
c62f2db5 4187 if (target == 0
2212663f
DB
4188 || GET_MODE (target) != tmode
4189 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4190 target = gen_reg_rtx (tmode);
4191
4192 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4193 op0 = copy_to_mode_reg (mode0, op0);
4194
4195 pat = GEN_FCN (icode) (target, op0);
4196 if (! pat)
4197 return 0;
4198 emit_insn (pat);
0ac081f6 4199
2212663f
DB
4200 return target;
4201}
ae4b4a02 4202
100c4561
AH
4203static rtx
4204altivec_expand_abs_builtin (icode, arglist, target)
4205 enum insn_code icode;
4206 tree arglist;
4207 rtx target;
4208{
4209 rtx pat, scratch1, scratch2;
4210 tree arg0 = TREE_VALUE (arglist);
4211 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4212 enum machine_mode tmode = insn_data[icode].operand[0].mode;
4213 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4214
4215 /* If we have invalid arguments, bail out before generating bad rtl. */
4216 if (arg0 == error_mark_node)
9a171fcd 4217 return const0_rtx;
100c4561
AH
4218
4219 if (target == 0
4220 || GET_MODE (target) != tmode
4221 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4222 target = gen_reg_rtx (tmode);
4223
4224 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4225 op0 = copy_to_mode_reg (mode0, op0);
4226
4227 scratch1 = gen_reg_rtx (mode0);
4228 scratch2 = gen_reg_rtx (mode0);
4229
4230 pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
4231 if (! pat)
4232 return 0;
4233 emit_insn (pat);
4234
4235 return target;
4236}
4237
0ac081f6 4238static rtx
92898235 4239rs6000_expand_binop_builtin (icode, arglist, target)
0ac081f6
AH
4240 enum insn_code icode;
4241 tree arglist;
4242 rtx target;
4243{
4244 rtx pat;
4245 tree arg0 = TREE_VALUE (arglist);
4246 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
4247 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4248 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4249 enum machine_mode tmode = insn_data[icode].operand[0].mode;
4250 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4251 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
4252
0559cc77
DE
4253 if (icode == CODE_FOR_nothing)
4254 /* Builtin not supported on this processor. */
4255 return 0;
4256
20e26713
AH
4257 /* If we got invalid arguments bail out before generating bad rtl. */
4258 if (arg0 == error_mark_node || arg1 == error_mark_node)
9a171fcd 4259 return const0_rtx;
20e26713 4260
0559cc77
DE
4261 if (icode == CODE_FOR_altivec_vcfux
4262 || icode == CODE_FOR_altivec_vcfsx
4263 || icode == CODE_FOR_altivec_vctsxs
4264 || icode == CODE_FOR_altivec_vctuxs
4265 || icode == CODE_FOR_altivec_vspltb
4266 || icode == CODE_FOR_altivec_vsplth
4267 || icode == CODE_FOR_altivec_vspltw
4268 || icode == CODE_FOR_spe_evaddiw
4269 || icode == CODE_FOR_spe_evldd
4270 || icode == CODE_FOR_spe_evldh
4271 || icode == CODE_FOR_spe_evldw
4272 || icode == CODE_FOR_spe_evlhhesplat
4273 || icode == CODE_FOR_spe_evlhhossplat
4274 || icode == CODE_FOR_spe_evlhhousplat
4275 || icode == CODE_FOR_spe_evlwhe
4276 || icode == CODE_FOR_spe_evlwhos
4277 || icode == CODE_FOR_spe_evlwhou
4278 || icode == CODE_FOR_spe_evlwhsplat
4279 || icode == CODE_FOR_spe_evlwwsplat
4280 || icode == CODE_FOR_spe_evrlwi
4281 || icode == CODE_FOR_spe_evslwi
4282 || icode == CODE_FOR_spe_evsrwis
4283 || icode == CODE_FOR_spe_evsrwiu)
b44140e7
AH
4284 {
4285 /* Only allow 5-bit unsigned literals. */
b44140e7
AH
4286 if (TREE_CODE (arg1) != INTEGER_CST
4287 || TREE_INT_CST_LOW (arg1) & ~0x1f)
4288 {
4289 error ("argument 2 must be a 5-bit unsigned literal");
9a171fcd 4290 return const0_rtx;
b44140e7 4291 }
b44140e7
AH
4292 }
4293
c62f2db5 4294 if (target == 0
0ac081f6
AH
4295 || GET_MODE (target) != tmode
4296 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4297 target = gen_reg_rtx (tmode);
4298
4299 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4300 op0 = copy_to_mode_reg (mode0, op0);
4301 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
4302 op1 = copy_to_mode_reg (mode1, op1);
4303
4304 pat = GEN_FCN (icode) (target, op0, op1);
4305 if (! pat)
4306 return 0;
4307 emit_insn (pat);
4308
4309 return target;
4310}
6525c0e7 4311
ae4b4a02
AH
4312static rtx
4313altivec_expand_predicate_builtin (icode, opcode, arglist, target)
4314 enum insn_code icode;
4315 const char *opcode;
4316 tree arglist;
4317 rtx target;
4318{
4319 rtx pat, scratch;
4320 tree cr6_form = TREE_VALUE (arglist);
4321 tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
4322 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
4323 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4324 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4325 enum machine_mode tmode = SImode;
4326 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4327 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
4328 int cr6_form_int;
4329
4330 if (TREE_CODE (cr6_form) != INTEGER_CST)
4331 {
4332 error ("argument 1 of __builtin_altivec_predicate must be a constant");
9a171fcd 4333 return const0_rtx;
ae4b4a02
AH
4334 }
4335 else
4336 cr6_form_int = TREE_INT_CST_LOW (cr6_form);
4337
4338 if (mode0 != mode1)
4339 abort ();
4340
4341 /* If we have invalid arguments, bail out before generating bad rtl. */
4342 if (arg0 == error_mark_node || arg1 == error_mark_node)
9a171fcd 4343 return const0_rtx;
ae4b4a02
AH
4344
4345 if (target == 0
4346 || GET_MODE (target) != tmode
4347 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4348 target = gen_reg_rtx (tmode);
4349
4350 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4351 op0 = copy_to_mode_reg (mode0, op0);
4352 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
4353 op1 = copy_to_mode_reg (mode1, op1);
4354
4355 scratch = gen_reg_rtx (mode0);
4356
4357 pat = GEN_FCN (icode) (scratch, op0, op1,
4358 gen_rtx (SYMBOL_REF, Pmode, opcode));
4359 if (! pat)
4360 return 0;
4361 emit_insn (pat);
4362
4363 /* The vec_any* and vec_all* predicates use the same opcodes for two
4364 different operations, but the bits in CR6 will be different
4365 depending on what information we want. So we have to play tricks
4366 with CR6 to get the right bits out.
4367
4368 If you think this is disgusting, look at the specs for the
4369 AltiVec predicates. */
4370
4371 switch (cr6_form_int)
4372 {
4373 case 0:
4374 emit_insn (gen_cr6_test_for_zero (target));
4375 break;
4376 case 1:
4377 emit_insn (gen_cr6_test_for_zero_reverse (target));
4378 break;
4379 case 2:
4380 emit_insn (gen_cr6_test_for_lt (target));
4381 break;
4382 case 3:
4383 emit_insn (gen_cr6_test_for_lt_reverse (target));
4384 break;
4385 default:
4386 error ("argument 1 of __builtin_altivec_predicate is out of range");
4387 break;
4388 }
4389
4390 return target;
4391}
4392
6525c0e7
AH
4393static rtx
4394altivec_expand_stv_builtin (icode, arglist)
4395 enum insn_code icode;
4396 tree arglist;
4397{
4398 tree arg0 = TREE_VALUE (arglist);
4399 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
4400 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
4401 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4402 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4403 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
4404 rtx pat;
4405 enum machine_mode mode0 = insn_data[icode].operand[0].mode;
4406 enum machine_mode mode1 = insn_data[icode].operand[1].mode;
4407 enum machine_mode mode2 = insn_data[icode].operand[2].mode;
4408
4409 /* Invalid arguments. Bail before doing anything stoopid! */
4410 if (arg0 == error_mark_node
4411 || arg1 == error_mark_node
4412 || arg2 == error_mark_node)
9a171fcd 4413 return const0_rtx;
6525c0e7
AH
4414
4415 if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
4416 op0 = copy_to_mode_reg (mode2, op0);
4417 if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
4418 op1 = copy_to_mode_reg (mode0, op1);
4419 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
4420 op2 = copy_to_mode_reg (mode1, op2);
4421
4422 pat = GEN_FCN (icode) (op1, op2, op0);
4423 if (pat)
4424 emit_insn (pat);
4425 return NULL_RTX;
4426}
4427
2212663f 4428static rtx
92898235 4429rs6000_expand_ternop_builtin (icode, arglist, target)
2212663f
DB
4430 enum insn_code icode;
4431 tree arglist;
4432 rtx target;
4433{
4434 rtx pat;
4435 tree arg0 = TREE_VALUE (arglist);
4436 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
4437 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
4438 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4439 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4440 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
4441 enum machine_mode tmode = insn_data[icode].operand[0].mode;
4442 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4443 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
4444 enum machine_mode mode2 = insn_data[icode].operand[3].mode;
0ac081f6 4445
774b5662
DE
4446 if (icode == CODE_FOR_nothing)
4447 /* Builtin not supported on this processor. */
4448 return 0;
4449
20e26713
AH
4450 /* If we got invalid arguments bail out before generating bad rtl. */
4451 if (arg0 == error_mark_node
4452 || arg1 == error_mark_node
4453 || arg2 == error_mark_node)
9a171fcd 4454 return const0_rtx;
20e26713 4455
774b5662
DE
4456 if (icode == CODE_FOR_altivec_vsldoi_4sf
4457 || icode == CODE_FOR_altivec_vsldoi_4si
4458 || icode == CODE_FOR_altivec_vsldoi_8hi
4459 || icode == CODE_FOR_altivec_vsldoi_16qi)
b44140e7
AH
4460 {
4461 /* Only allow 4-bit unsigned literals. */
b44140e7
AH
4462 if (TREE_CODE (arg2) != INTEGER_CST
4463 || TREE_INT_CST_LOW (arg2) & ~0xf)
4464 {
4465 error ("argument 3 must be a 4-bit unsigned literal");
e3277ffb 4466 return const0_rtx;
b44140e7 4467 }
b44140e7
AH
4468 }
4469
c62f2db5 4470 if (target == 0
2212663f
DB
4471 || GET_MODE (target) != tmode
4472 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4473 target = gen_reg_rtx (tmode);
4474
4475 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4476 op0 = copy_to_mode_reg (mode0, op0);
4477 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
4478 op1 = copy_to_mode_reg (mode1, op1);
4479 if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
4480 op2 = copy_to_mode_reg (mode2, op2);
4481
4482 pat = GEN_FCN (icode) (target, op0, op1, op2);
4483 if (! pat)
4484 return 0;
4485 emit_insn (pat);
4486
4487 return target;
4488}
92898235 4489
3a9b8c7e 4490/* Expand the lvx builtins. */
0ac081f6 4491static rtx
3a9b8c7e 4492altivec_expand_ld_builtin (exp, target, expandedp)
0ac081f6
AH
4493 tree exp;
4494 rtx target;
92898235 4495 bool *expandedp;
0ac081f6 4496{
0ac081f6
AH
4497 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4498 tree arglist = TREE_OPERAND (exp, 1);
0ac081f6 4499 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
3a9b8c7e
AH
4500 tree arg0;
4501 enum machine_mode tmode, mode0;
7c3abc73 4502 rtx pat, op0;
3a9b8c7e 4503 enum insn_code icode;
92898235 4504
0ac081f6
AH
4505 switch (fcode)
4506 {
f18c054f
DB
4507 case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
4508 icode = CODE_FOR_altivec_lvx_16qi;
3a9b8c7e 4509 break;
f18c054f
DB
4510 case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
4511 icode = CODE_FOR_altivec_lvx_8hi;
3a9b8c7e
AH
4512 break;
4513 case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
4514 icode = CODE_FOR_altivec_lvx_4si;
4515 break;
4516 case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
4517 icode = CODE_FOR_altivec_lvx_4sf;
4518 break;
4519 default:
4520 *expandedp = false;
4521 return NULL_RTX;
4522 }
0ac081f6 4523
3a9b8c7e 4524 *expandedp = true;
f18c054f 4525
3a9b8c7e
AH
4526 arg0 = TREE_VALUE (arglist);
4527 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4528 tmode = insn_data[icode].operand[0].mode;
4529 mode0 = insn_data[icode].operand[1].mode;
f18c054f 4530
3a9b8c7e
AH
4531 if (target == 0
4532 || GET_MODE (target) != tmode
4533 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4534 target = gen_reg_rtx (tmode);
24408032 4535
3a9b8c7e
AH
4536 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
4537 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
f18c054f 4538
3a9b8c7e
AH
4539 pat = GEN_FCN (icode) (target, op0);
4540 if (! pat)
4541 return 0;
4542 emit_insn (pat);
4543 return target;
4544}
f18c054f 4545
3a9b8c7e
AH
4546/* Expand the stvx builtins. */
4547static rtx
4548altivec_expand_st_builtin (exp, target, expandedp)
4549 tree exp;
7c3abc73 4550 rtx target ATTRIBUTE_UNUSED;
3a9b8c7e
AH
4551 bool *expandedp;
4552{
4553 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4554 tree arglist = TREE_OPERAND (exp, 1);
4555 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
4556 tree arg0, arg1;
4557 enum machine_mode mode0, mode1;
7c3abc73 4558 rtx pat, op0, op1;
3a9b8c7e 4559 enum insn_code icode;
f18c054f 4560
3a9b8c7e
AH
4561 switch (fcode)
4562 {
4563 case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
4564 icode = CODE_FOR_altivec_stvx_16qi;
4565 break;
4566 case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
4567 icode = CODE_FOR_altivec_stvx_8hi;
4568 break;
4569 case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
4570 icode = CODE_FOR_altivec_stvx_4si;
4571 break;
4572 case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
4573 icode = CODE_FOR_altivec_stvx_4sf;
4574 break;
4575 default:
4576 *expandedp = false;
4577 return NULL_RTX;
4578 }
24408032 4579
3a9b8c7e
AH
4580 arg0 = TREE_VALUE (arglist);
4581 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
4582 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4583 op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4584 mode0 = insn_data[icode].operand[0].mode;
4585 mode1 = insn_data[icode].operand[1].mode;
f18c054f 4586
3a9b8c7e
AH
4587 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
4588 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
4589 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
4590 op1 = copy_to_mode_reg (mode1, op1);
f18c054f 4591
3a9b8c7e
AH
4592 pat = GEN_FCN (icode) (op0, op1);
4593 if (pat)
4594 emit_insn (pat);
f18c054f 4595
3a9b8c7e
AH
4596 *expandedp = true;
4597 return NULL_RTX;
4598}
f18c054f 4599
3a9b8c7e
AH
4600/* Expand the dst builtins. */
4601static rtx
4602altivec_expand_dst_builtin (exp, target, expandedp)
4603 tree exp;
7c3abc73 4604 rtx target ATTRIBUTE_UNUSED;
3a9b8c7e
AH
4605 bool *expandedp;
4606{
4607 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4608 tree arglist = TREE_OPERAND (exp, 1);
4609 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
4610 tree arg0, arg1, arg2;
4611 enum machine_mode mode0, mode1, mode2;
7c3abc73 4612 rtx pat, op0, op1, op2;
3a9b8c7e 4613 struct builtin_description *d;
a3170dc6 4614 size_t i;
f18c054f 4615
3a9b8c7e 4616 *expandedp = false;
f18c054f 4617
3a9b8c7e
AH
4618 /* Handle DST variants. */
4619 d = (struct builtin_description *) bdesc_dst;
4620 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
4621 if (d->code == fcode)
4622 {
4623 arg0 = TREE_VALUE (arglist);
4624 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
4625 arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
4626 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4627 op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4628 op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
4629 mode0 = insn_data[d->icode].operand[0].mode;
4630 mode1 = insn_data[d->icode].operand[1].mode;
4631 mode2 = insn_data[d->icode].operand[2].mode;
24408032 4632
3a9b8c7e
AH
4633 /* Invalid arguments, bail out before generating bad rtl. */
4634 if (arg0 == error_mark_node
4635 || arg1 == error_mark_node
4636 || arg2 == error_mark_node)
4637 return const0_rtx;
f18c054f 4638
3a9b8c7e
AH
4639 if (TREE_CODE (arg2) != INTEGER_CST
4640 || TREE_INT_CST_LOW (arg2) & ~0x3)
4641 {
4642 error ("argument to `%s' must be a 2-bit unsigned literal", d->name);
4643 return const0_rtx;
4644 }
f18c054f 4645
3a9b8c7e
AH
4646 if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
4647 op0 = copy_to_mode_reg (mode0, op0);
4648 if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
4649 op1 = copy_to_mode_reg (mode1, op1);
24408032 4650
3a9b8c7e
AH
4651 pat = GEN_FCN (d->icode) (op0, op1, op2);
4652 if (pat != 0)
4653 emit_insn (pat);
f18c054f 4654
3a9b8c7e
AH
4655 *expandedp = true;
4656 return NULL_RTX;
4657 }
f18c054f 4658
3a9b8c7e
AH
4659 return NULL_RTX;
4660}
24408032 4661
3a9b8c7e
AH
4662/* Expand the builtin in EXP and store the result in TARGET. Store
4663 true in *EXPANDEDP if we found a builtin to expand. */
4664static rtx
4665altivec_expand_builtin (exp, target, expandedp)
4666 tree exp;
4667 rtx target;
4668 bool *expandedp;
4669{
4670 struct builtin_description *d;
4671 struct builtin_description_predicates *dp;
4672 size_t i;
4673 enum insn_code icode;
4674 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4675 tree arglist = TREE_OPERAND (exp, 1);
7c3abc73
AH
4676 tree arg0;
4677 rtx op0, pat;
4678 enum machine_mode tmode, mode0;
3a9b8c7e 4679 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
0ac081f6 4680
3a9b8c7e
AH
4681 target = altivec_expand_ld_builtin (exp, target, expandedp);
4682 if (*expandedp)
4683 return target;
0ac081f6 4684
3a9b8c7e
AH
4685 target = altivec_expand_st_builtin (exp, target, expandedp);
4686 if (*expandedp)
4687 return target;
4688
4689 target = altivec_expand_dst_builtin (exp, target, expandedp);
4690 if (*expandedp)
4691 return target;
4692
4693 *expandedp = true;
95385cbb 4694
3a9b8c7e
AH
4695 switch (fcode)
4696 {
6525c0e7
AH
4697 case ALTIVEC_BUILTIN_STVX:
4698 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, arglist);
4699 case ALTIVEC_BUILTIN_STVEBX:
4700 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, arglist);
4701 case ALTIVEC_BUILTIN_STVEHX:
4702 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, arglist);
4703 case ALTIVEC_BUILTIN_STVEWX:
4704 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, arglist);
4705 case ALTIVEC_BUILTIN_STVXL:
4706 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, arglist);
3a9b8c7e 4707
95385cbb
AH
4708 case ALTIVEC_BUILTIN_MFVSCR:
4709 icode = CODE_FOR_altivec_mfvscr;
4710 tmode = insn_data[icode].operand[0].mode;
4711
4712 if (target == 0
4713 || GET_MODE (target) != tmode
4714 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4715 target = gen_reg_rtx (tmode);
4716
4717 pat = GEN_FCN (icode) (target);
0ac081f6
AH
4718 if (! pat)
4719 return 0;
4720 emit_insn (pat);
95385cbb
AH
4721 return target;
4722
4723 case ALTIVEC_BUILTIN_MTVSCR:
4724 icode = CODE_FOR_altivec_mtvscr;
4725 arg0 = TREE_VALUE (arglist);
4726 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4727 mode0 = insn_data[icode].operand[0].mode;
4728
4729 /* If we got invalid arguments bail out before generating bad rtl. */
4730 if (arg0 == error_mark_node)
9a171fcd 4731 return const0_rtx;
95385cbb
AH
4732
4733 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
4734 op0 = copy_to_mode_reg (mode0, op0);
4735
4736 pat = GEN_FCN (icode) (op0);
4737 if (pat)
4738 emit_insn (pat);
4739 return NULL_RTX;
3a9b8c7e 4740
95385cbb
AH
4741 case ALTIVEC_BUILTIN_DSSALL:
4742 emit_insn (gen_altivec_dssall ());
4743 return NULL_RTX;
4744
4745 case ALTIVEC_BUILTIN_DSS:
4746 icode = CODE_FOR_altivec_dss;
4747 arg0 = TREE_VALUE (arglist);
4748 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4749 mode0 = insn_data[icode].operand[0].mode;
4750
4751 /* If we got invalid arguments bail out before generating bad rtl. */
4752 if (arg0 == error_mark_node)
9a171fcd 4753 return const0_rtx;
95385cbb 4754
b44140e7
AH
4755 if (TREE_CODE (arg0) != INTEGER_CST
4756 || TREE_INT_CST_LOW (arg0) & ~0x3)
4757 {
4758 error ("argument to dss must be a 2-bit unsigned literal");
9a171fcd 4759 return const0_rtx;
b44140e7
AH
4760 }
4761
95385cbb
AH
4762 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
4763 op0 = copy_to_mode_reg (mode0, op0);
4764
4765 emit_insn (gen_altivec_dss (op0));
0ac081f6
AH
4766 return NULL_RTX;
4767 }
24408032 4768
100c4561
AH
4769 /* Expand abs* operations. */
4770 d = (struct builtin_description *) bdesc_abs;
ca7558fc 4771 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
100c4561
AH
4772 if (d->code == fcode)
4773 return altivec_expand_abs_builtin (d->icode, arglist, target);
4774
ae4b4a02
AH
4775 /* Expand the AltiVec predicates. */
4776 dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
ca7558fc 4777 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
ae4b4a02
AH
4778 if (dp->code == fcode)
4779 return altivec_expand_predicate_builtin (dp->icode, dp->opcode, arglist, target);
4780
6525c0e7
AH
4781 /* LV* are funky. We initialized them differently. */
4782 switch (fcode)
4783 {
4784 case ALTIVEC_BUILTIN_LVSL:
92898235 4785 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvsl,
6525c0e7
AH
4786 arglist, target);
4787 case ALTIVEC_BUILTIN_LVSR:
92898235
AH
4788 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvsr,
4789 arglist, target);
6525c0e7 4790 case ALTIVEC_BUILTIN_LVEBX:
92898235
AH
4791 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvebx,
4792 arglist, target);
6525c0e7 4793 case ALTIVEC_BUILTIN_LVEHX:
92898235
AH
4794 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvehx,
4795 arglist, target);
6525c0e7 4796 case ALTIVEC_BUILTIN_LVEWX:
92898235
AH
4797 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvewx,
4798 arglist, target);
6525c0e7 4799 case ALTIVEC_BUILTIN_LVXL:
92898235
AH
4800 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvxl,
4801 arglist, target);
6525c0e7 4802 case ALTIVEC_BUILTIN_LVX:
92898235
AH
4803 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvx,
4804 arglist, target);
6525c0e7
AH
4805 default:
4806 break;
4807 /* Fall through. */
4808 }
95385cbb 4809
92898235 4810 *expandedp = false;
0ac081f6
AH
4811 return NULL_RTX;
4812}
4813
a3170dc6
AH
4814/* Binops that need to be initialized manually, but can be expanded
4815 automagically by rs6000_expand_binop_builtin. */
4816static struct builtin_description bdesc_2arg_spe[] =
4817{
4818 { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
4819 { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
4820 { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
4821 { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
4822 { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
4823 { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
4824 { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
4825 { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
4826 { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
4827 { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
4828 { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
4829 { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
4830 { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
4831 { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
4832 { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
4833 { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
4834 { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
4835 { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
4836 { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
4837 { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
4838 { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
4839 { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
4840};
4841
4842/* Expand the builtin in EXP and store the result in TARGET. Store
4843 true in *EXPANDEDP if we found a builtin to expand.
4844
4845 This expands the SPE builtins that are not simple unary and binary
4846 operations. */
4847static rtx
4848spe_expand_builtin (exp, target, expandedp)
4849 tree exp;
4850 rtx target;
4851 bool *expandedp;
4852{
4853 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4854 tree arglist = TREE_OPERAND (exp, 1);
4855 tree arg1, arg0;
4856 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
4857 enum insn_code icode;
4858 enum machine_mode tmode, mode0;
4859 rtx pat, op0;
4860 struct builtin_description *d;
4861 size_t i;
4862
4863 *expandedp = true;
4864
4865 /* Syntax check for a 5-bit unsigned immediate. */
4866 switch (fcode)
4867 {
4868 case SPE_BUILTIN_EVSTDD:
4869 case SPE_BUILTIN_EVSTDH:
4870 case SPE_BUILTIN_EVSTDW:
4871 case SPE_BUILTIN_EVSTWHE:
4872 case SPE_BUILTIN_EVSTWHO:
4873 case SPE_BUILTIN_EVSTWWE:
4874 case SPE_BUILTIN_EVSTWWO:
4875 arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
4876 if (TREE_CODE (arg1) != INTEGER_CST
4877 || TREE_INT_CST_LOW (arg1) & ~0x1f)
4878 {
4879 error ("argument 2 must be a 5-bit unsigned literal");
4880 return const0_rtx;
4881 }
4882 break;
4883 default:
4884 break;
4885 }
4886
4887 d = (struct builtin_description *) bdesc_2arg_spe;
4888 for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
4889 if (d->code == fcode)
4890 return rs6000_expand_binop_builtin (d->icode, arglist, target);
4891
4892 d = (struct builtin_description *) bdesc_spe_predicates;
4893 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
4894 if (d->code == fcode)
4895 return spe_expand_predicate_builtin (d->icode, arglist, target);
4896
4897 d = (struct builtin_description *) bdesc_spe_evsel;
4898 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
4899 if (d->code == fcode)
4900 return spe_expand_evsel_builtin (d->icode, arglist, target);
4901
4902 switch (fcode)
4903 {
4904 case SPE_BUILTIN_EVSTDDX:
4905 return altivec_expand_stv_builtin (CODE_FOR_spe_evstddx, arglist);
4906 case SPE_BUILTIN_EVSTDHX:
4907 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdhx, arglist);
4908 case SPE_BUILTIN_EVSTDWX:
4909 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdwx, arglist);
4910 case SPE_BUILTIN_EVSTWHEX:
4911 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwhex, arglist);
4912 case SPE_BUILTIN_EVSTWHOX:
4913 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwhox, arglist);
4914 case SPE_BUILTIN_EVSTWWEX:
4915 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwwex, arglist);
4916 case SPE_BUILTIN_EVSTWWOX:
4917 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwwox, arglist);
4918 case SPE_BUILTIN_EVSTDD:
4919 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdd, arglist);
4920 case SPE_BUILTIN_EVSTDH:
4921 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdh, arglist);
4922 case SPE_BUILTIN_EVSTDW:
4923 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdw, arglist);
4924 case SPE_BUILTIN_EVSTWHE:
4925 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwhe, arglist);
4926 case SPE_BUILTIN_EVSTWHO:
4927 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwho, arglist);
4928 case SPE_BUILTIN_EVSTWWE:
4929 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwwe, arglist);
4930 case SPE_BUILTIN_EVSTWWO:
4931 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwwo, arglist);
4932 case SPE_BUILTIN_MFSPEFSCR:
4933 icode = CODE_FOR_spe_mfspefscr;
4934 tmode = insn_data[icode].operand[0].mode;
4935
4936 if (target == 0
4937 || GET_MODE (target) != tmode
4938 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
4939 target = gen_reg_rtx (tmode);
4940
4941 pat = GEN_FCN (icode) (target);
4942 if (! pat)
4943 return 0;
4944 emit_insn (pat);
4945 return target;
4946 case SPE_BUILTIN_MTSPEFSCR:
4947 icode = CODE_FOR_spe_mtspefscr;
4948 arg0 = TREE_VALUE (arglist);
4949 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4950 mode0 = insn_data[icode].operand[0].mode;
4951
4952 if (arg0 == error_mark_node)
4953 return const0_rtx;
4954
4955 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
4956 op0 = copy_to_mode_reg (mode0, op0);
4957
4958 pat = GEN_FCN (icode) (op0);
4959 if (pat)
4960 emit_insn (pat);
4961 return NULL_RTX;
4962 default:
4963 break;
4964 }
4965
4966 *expandedp = false;
4967 return NULL_RTX;
4968}
4969
4970static rtx
4971spe_expand_predicate_builtin (icode, arglist, target)
4972 enum insn_code icode;
4973 tree arglist;
4974 rtx target;
4975{
4976 rtx pat, scratch, tmp;
4977 tree form = TREE_VALUE (arglist);
4978 tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
4979 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
4980 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4981 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
4982 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4983 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
4984 int form_int;
4985 enum rtx_code code;
4986
4987 if (TREE_CODE (form) != INTEGER_CST)
4988 {
4989 error ("argument 1 of __builtin_spe_predicate must be a constant");
4990 return const0_rtx;
4991 }
4992 else
4993 form_int = TREE_INT_CST_LOW (form);
4994
4995 if (mode0 != mode1)
4996 abort ();
4997
4998 if (arg0 == error_mark_node || arg1 == error_mark_node)
4999 return const0_rtx;
5000
5001 if (target == 0
5002 || GET_MODE (target) != SImode
5003 || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
5004 target = gen_reg_rtx (SImode);
5005
5006 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
5007 op0 = copy_to_mode_reg (mode0, op0);
5008 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
5009 op1 = copy_to_mode_reg (mode1, op1);
5010
5011 scratch = gen_reg_rtx (CCmode);
5012
5013 pat = GEN_FCN (icode) (scratch, op0, op1);
5014 if (! pat)
5015 return const0_rtx;
5016 emit_insn (pat);
5017
5018 /* There are 4 variants for each predicate: _any_, _all_, _upper_,
5019 _lower_. We use one compare, but look in different bits of the
5020 CR for each variant.
5021
5022 There are 2 elements in each SPE simd type (upper/lower). The CR
5023 bits are set as follows:
5024
5025 BIT0 | BIT 1 | BIT 2 | BIT 3
5026 U | L | (U | L) | (U & L)
5027
5028 So, for an "all" relationship, BIT 3 would be set.
5029 For an "any" relationship, BIT 2 would be set. Etc.
5030
5031 Following traditional nomenclature, these bits map to:
5032
5033 BIT0 | BIT 1 | BIT 2 | BIT 3
5034 LT | GT | EQ | OV
5035
5036 Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
5037 */
5038
5039 switch (form_int)
5040 {
5041 /* All variant. OV bit. */
5042 case 0:
5043 /* We need to get to the OV bit, which is the ORDERED bit. We
5044 could generate (ordered:SI (reg:CC xx) (const_int 0)), but
5045 that's ugly and will trigger a validate_condition_mode abort.
5046 So let's just use another pattern. */
5047 emit_insn (gen_move_from_CR_ov_bit (target, scratch));
5048 return target;
5049 /* Any variant. EQ bit. */
5050 case 1:
5051 code = EQ;
5052 break;
5053 /* Upper variant. LT bit. */
5054 case 2:
5055 code = LT;
5056 break;
5057 /* Lower variant. GT bit. */
5058 case 3:
5059 code = GT;
5060 break;
5061 default:
5062 error ("argument 1 of __builtin_spe_predicate is out of range");
5063 return const0_rtx;
5064 }
5065
5066 tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
5067 emit_move_insn (target, tmp);
5068
5069 return target;
5070}
5071
5072/* The evsel builtins look like this:
5073
5074 e = __builtin_spe_evsel_OP (a, b, c, d);
5075
5076 and work like this:
5077
5078 e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
5079 e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
5080*/
5081
5082static rtx
5083spe_expand_evsel_builtin (icode, arglist, target)
5084 enum insn_code icode;
5085 tree arglist;
5086 rtx target;
5087{
5088 rtx pat, scratch;
5089 tree arg0 = TREE_VALUE (arglist);
5090 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
5091 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
5092 tree arg3 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist))));
5093 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5094 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
5095 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
5096 rtx op3 = expand_expr (arg3, NULL_RTX, VOIDmode, 0);
5097 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
5098 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
5099
5100 if (mode0 != mode1)
5101 abort ();
5102
5103 if (arg0 == error_mark_node || arg1 == error_mark_node
5104 || arg2 == error_mark_node || arg3 == error_mark_node)
5105 return const0_rtx;
5106
5107 if (target == 0
5108 || GET_MODE (target) != mode0
5109 || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
5110 target = gen_reg_rtx (mode0);
5111
5112 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
5113 op0 = copy_to_mode_reg (mode0, op0);
5114 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
5115 op1 = copy_to_mode_reg (mode0, op1);
5116 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
5117 op2 = copy_to_mode_reg (mode0, op2);
5118 if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
5119 op3 = copy_to_mode_reg (mode0, op3);
5120
5121 /* Generate the compare. */
5122 scratch = gen_reg_rtx (CCmode);
5123 pat = GEN_FCN (icode) (scratch, op0, op1);
5124 if (! pat)
5125 return const0_rtx;
5126 emit_insn (pat);
5127
5128 if (mode0 == V2SImode)
5129 emit_insn (gen_spe_evsel (target, op2, op3, scratch));
5130 else
5131 emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
5132
5133 return target;
5134}
5135
0ac081f6
AH
5136/* Expand an expression EXP that calls a built-in function,
5137 with result going to TARGET if that's convenient
5138 (and in mode MODE if that's convenient).
5139 SUBTARGET may be used as the target for computing one of EXP's operands.
5140 IGNORE is nonzero if the value is to be ignored. */
5141
5142static rtx
5143rs6000_expand_builtin (exp, target, subtarget, mode, ignore)
5144 tree exp;
5145 rtx target;
00b960c7
AH
5146 rtx subtarget ATTRIBUTE_UNUSED;
5147 enum machine_mode mode ATTRIBUTE_UNUSED;
5148 int ignore ATTRIBUTE_UNUSED;
0ac081f6 5149{
92898235
AH
5150 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
5151 tree arglist = TREE_OPERAND (exp, 1);
5152 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
5153 struct builtin_description *d;
5154 size_t i;
5155 rtx ret;
5156 bool success;
5157
0ac081f6 5158 if (TARGET_ALTIVEC)
92898235
AH
5159 {
5160 ret = altivec_expand_builtin (exp, target, &success);
5161
a3170dc6
AH
5162 if (success)
5163 return ret;
5164 }
5165 if (TARGET_SPE)
5166 {
5167 ret = spe_expand_builtin (exp, target, &success);
5168
92898235
AH
5169 if (success)
5170 return ret;
5171 }
5172
0559cc77
DE
5173 if (TARGET_ALTIVEC || TARGET_SPE)
5174 {
5175 /* Handle simple unary operations. */
5176 d = (struct builtin_description *) bdesc_1arg;
5177 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
5178 if (d->code == fcode)
5179 return rs6000_expand_unop_builtin (d->icode, arglist, target);
5180
5181 /* Handle simple binary operations. */
5182 d = (struct builtin_description *) bdesc_2arg;
5183 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
5184 if (d->code == fcode)
5185 return rs6000_expand_binop_builtin (d->icode, arglist, target);
5186
5187 /* Handle simple ternary operations. */
5188 d = (struct builtin_description *) bdesc_3arg;
5189 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
5190 if (d->code == fcode)
5191 return rs6000_expand_ternop_builtin (d->icode, arglist, target);
5192 }
0ac081f6
AH
5193
5194 abort ();
92898235 5195 return NULL_RTX;
0ac081f6
AH
5196}
5197
5198static void
6fa3f289 5199rs6000_init_builtins ()
0ac081f6 5200{
a3170dc6
AH
5201 if (TARGET_SPE)
5202 spe_init_builtins ();
0ac081f6
AH
5203 if (TARGET_ALTIVEC)
5204 altivec_init_builtins ();
0559cc77
DE
5205 if (TARGET_ALTIVEC || TARGET_SPE)
5206 rs6000_common_init_builtins ();
0ac081f6
AH
5207}
5208
a3170dc6
AH
5209/* Search through a set of builtins and enable the mask bits.
5210 DESC is an array of builtins.
5211 SIZE is the totaly number of builtins.
5212 START is the builtin enum at which to start.
5213 END is the builtin enum at which to end. */
0ac081f6 5214static void
a3170dc6
AH
5215enable_mask_for_builtins (desc, size, start, end)
5216 struct builtin_description *desc;
5217 int size;
5218 enum rs6000_builtins start, end;
5219{
5220 int i;
5221
5222 for (i = 0; i < size; ++i)
5223 if (desc[i].code == start)
5224 break;
5225
5226 if (i == size)
5227 return;
5228
5229 for (; i < size; ++i)
5230 {
5231 /* Flip all the bits on. */
5232 desc[i].mask = target_flags;
5233 if (desc[i].code == end)
5234 break;
5235 }
5236}
5237
5238static void
b24c9d35 5239spe_init_builtins ()
0ac081f6 5240{
a3170dc6
AH
5241 tree endlink = void_list_node;
5242 tree puint_type_node = build_pointer_type (unsigned_type_node);
5243 tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
5244 tree pv2si_type_node = build_pointer_type (V2SI_type_node);
ae4b4a02 5245 struct builtin_description *d;
0ac081f6
AH
5246 size_t i;
5247
a3170dc6
AH
5248 tree v2si_ftype_4_v2si
5249 = build_function_type
5250 (V2SI_type_node,
5251 tree_cons (NULL_TREE, V2SI_type_node,
5252 tree_cons (NULL_TREE, V2SI_type_node,
5253 tree_cons (NULL_TREE, V2SI_type_node,
5254 tree_cons (NULL_TREE, V2SI_type_node,
5255 endlink)))));
5256
5257 tree v2sf_ftype_4_v2sf
5258 = build_function_type
5259 (V2SF_type_node,
5260 tree_cons (NULL_TREE, V2SF_type_node,
5261 tree_cons (NULL_TREE, V2SF_type_node,
5262 tree_cons (NULL_TREE, V2SF_type_node,
5263 tree_cons (NULL_TREE, V2SF_type_node,
5264 endlink)))));
5265
5266 tree int_ftype_int_v2si_v2si
5267 = build_function_type
5268 (integer_type_node,
5269 tree_cons (NULL_TREE, integer_type_node,
5270 tree_cons (NULL_TREE, V2SI_type_node,
5271 tree_cons (NULL_TREE, V2SI_type_node,
5272 endlink))));
5273
5274 tree int_ftype_int_v2sf_v2sf
5275 = build_function_type
5276 (integer_type_node,
5277 tree_cons (NULL_TREE, integer_type_node,
5278 tree_cons (NULL_TREE, V2SF_type_node,
5279 tree_cons (NULL_TREE, V2SF_type_node,
5280 endlink))));
5281
5282 tree void_ftype_v2si_puint_int
5283 = build_function_type (void_type_node,
5284 tree_cons (NULL_TREE, V2SI_type_node,
5285 tree_cons (NULL_TREE, puint_type_node,
5286 tree_cons (NULL_TREE,
5287 integer_type_node,
5288 endlink))));
5289
5290 tree void_ftype_v2si_puint_char
5291 = build_function_type (void_type_node,
5292 tree_cons (NULL_TREE, V2SI_type_node,
5293 tree_cons (NULL_TREE, puint_type_node,
5294 tree_cons (NULL_TREE,
5295 char_type_node,
5296 endlink))));
5297
5298 tree void_ftype_v2si_pv2si_int
5299 = build_function_type (void_type_node,
5300 tree_cons (NULL_TREE, V2SI_type_node,
5301 tree_cons (NULL_TREE, pv2si_type_node,
5302 tree_cons (NULL_TREE,
5303 integer_type_node,
5304 endlink))));
5305
5306 tree void_ftype_v2si_pv2si_char
5307 = build_function_type (void_type_node,
5308 tree_cons (NULL_TREE, V2SI_type_node,
5309 tree_cons (NULL_TREE, pv2si_type_node,
5310 tree_cons (NULL_TREE,
5311 char_type_node,
5312 endlink))));
5313
5314 tree void_ftype_int
5315 = build_function_type (void_type_node,
5316 tree_cons (NULL_TREE, integer_type_node, endlink));
5317
5318 tree int_ftype_void
5319 = build_function_type (integer_type_node,
5320 tree_cons (NULL_TREE, void_type_node, endlink));
5321
5322 tree v2si_ftype_pv2si_int
5323 = build_function_type (V2SI_type_node,
5324 tree_cons (NULL_TREE, pv2si_type_node,
5325 tree_cons (NULL_TREE, integer_type_node,
5326 endlink)));
5327
5328 tree v2si_ftype_puint_int
5329 = build_function_type (V2SI_type_node,
5330 tree_cons (NULL_TREE, puint_type_node,
5331 tree_cons (NULL_TREE, integer_type_node,
5332 endlink)));
5333
5334 tree v2si_ftype_pushort_int
5335 = build_function_type (V2SI_type_node,
5336 tree_cons (NULL_TREE, pushort_type_node,
5337 tree_cons (NULL_TREE, integer_type_node,
5338 endlink)));
5339
5340 /* The initialization of the simple binary and unary builtins is
5341 done in rs6000_common_init_builtins, but we have to enable the
5342 mask bits here manually because we have run out of `target_flags'
5343 bits. We really need to redesign this mask business. */
5344
5345 enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
5346 ARRAY_SIZE (bdesc_2arg),
5347 SPE_BUILTIN_EVADDW,
5348 SPE_BUILTIN_EVXOR);
5349 enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
5350 ARRAY_SIZE (bdesc_1arg),
5351 SPE_BUILTIN_EVABS,
5352 SPE_BUILTIN_EVSUBFUSIAAW);
5353 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
5354 ARRAY_SIZE (bdesc_spe_predicates),
5355 SPE_BUILTIN_EVCMPEQ,
5356 SPE_BUILTIN_EVFSTSTLT);
5357 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
5358 ARRAY_SIZE (bdesc_spe_evsel),
5359 SPE_BUILTIN_EVSEL_CMPGTS,
5360 SPE_BUILTIN_EVSEL_FSTSTEQ);
5361
5362 /* Initialize irregular SPE builtins. */
5363
5364 def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
5365 def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
5366 def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
5367 def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
5368 def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
5369 def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
5370 def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
5371 def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
5372 def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
5373 def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
5374 def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
5375 def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
5376 def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
5377 def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
5378 def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
5379 def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
5380
5381 /* Loads. */
5382 def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
5383 def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
5384 def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
5385 def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
5386 def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
5387 def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
5388 def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
5389 def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
5390 def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
5391 def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
5392 def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
5393 def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
5394 def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
5395 def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
5396 def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
5397 def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
5398 def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
5399 def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
5400 def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
5401 def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
5402 def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
5403 def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
5404
5405 /* Predicates. */
5406 d = (struct builtin_description *) bdesc_spe_predicates;
5407 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
5408 {
5409 tree type;
5410
5411 switch (insn_data[d->icode].operand[1].mode)
5412 {
5413 case V2SImode:
5414 type = int_ftype_int_v2si_v2si;
5415 break;
5416 case V2SFmode:
5417 type = int_ftype_int_v2sf_v2sf;
5418 break;
5419 default:
5420 abort ();
5421 }
5422
5423 def_builtin (d->mask, d->name, type, d->code);
5424 }
5425
5426 /* Evsel predicates. */
5427 d = (struct builtin_description *) bdesc_spe_evsel;
5428 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
5429 {
5430 tree type;
5431
5432 switch (insn_data[d->icode].operand[1].mode)
5433 {
5434 case V2SImode:
5435 type = v2si_ftype_4_v2si;
5436 break;
5437 case V2SFmode:
5438 type = v2sf_ftype_4_v2sf;
5439 break;
5440 default:
5441 abort ();
5442 }
5443
5444 def_builtin (d->mask, d->name, type, d->code);
5445 }
5446}
5447
5448static void
b24c9d35 5449altivec_init_builtins ()
a3170dc6
AH
5450{
5451 struct builtin_description *d;
5452 struct builtin_description_predicates *dp;
5453 size_t i;
5454 tree pfloat_type_node = build_pointer_type (float_type_node);
5455 tree pint_type_node = build_pointer_type (integer_type_node);
5456 tree pshort_type_node = build_pointer_type (short_integer_type_node);
5457 tree pchar_type_node = build_pointer_type (char_type_node);
5458
5459 tree pvoid_type_node = build_pointer_type (void_type_node);
5460
0dbc3651
ZW
5461 tree pcfloat_type_node = build_pointer_type (build_qualified_type (float_type_node, TYPE_QUAL_CONST));
5462 tree pcint_type_node = build_pointer_type (build_qualified_type (integer_type_node, TYPE_QUAL_CONST));
5463 tree pcshort_type_node = build_pointer_type (build_qualified_type (short_integer_type_node, TYPE_QUAL_CONST));
5464 tree pcchar_type_node = build_pointer_type (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
5465
5466 tree pcvoid_type_node = build_pointer_type (build_qualified_type (void_type_node, TYPE_QUAL_CONST));
5467
a3170dc6
AH
5468 tree int_ftype_int_v4si_v4si
5469 = build_function_type_list (integer_type_node,
5470 integer_type_node, V4SI_type_node,
5471 V4SI_type_node, NULL_TREE);
0dbc3651
ZW
5472 tree v4sf_ftype_pcfloat
5473 = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
a3170dc6 5474 tree void_ftype_pfloat_v4sf
b4de2f7d 5475 = build_function_type_list (void_type_node,
a3170dc6 5476 pfloat_type_node, V4SF_type_node, NULL_TREE);
0dbc3651
ZW
5477 tree v4si_ftype_pcint
5478 = build_function_type_list (V4SI_type_node, pcint_type_node, NULL_TREE);
5479 tree void_ftype_pint_v4si
b4de2f7d
AH
5480 = build_function_type_list (void_type_node,
5481 pint_type_node, V4SI_type_node, NULL_TREE);
0dbc3651
ZW
5482 tree v8hi_ftype_pcshort
5483 = build_function_type_list (V8HI_type_node, pcshort_type_node, NULL_TREE);
f18c054f 5484 tree void_ftype_pshort_v8hi
b4de2f7d
AH
5485 = build_function_type_list (void_type_node,
5486 pshort_type_node, V8HI_type_node, NULL_TREE);
0dbc3651
ZW
5487 tree v16qi_ftype_pcchar
5488 = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
f18c054f 5489 tree void_ftype_pchar_v16qi
b4de2f7d
AH
5490 = build_function_type_list (void_type_node,
5491 pchar_type_node, V16QI_type_node, NULL_TREE);
95385cbb 5492 tree void_ftype_v4si
b4de2f7d 5493 = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
a3170dc6
AH
5494 tree v8hi_ftype_void
5495 = build_function_type (V8HI_type_node, void_list_node);
5496 tree void_ftype_void
5497 = build_function_type (void_type_node, void_list_node);
5498 tree void_ftype_qi
5499 = build_function_type_list (void_type_node, char_type_node, NULL_TREE);
0dbc3651
ZW
5500
5501 tree v16qi_ftype_int_pcvoid
a3170dc6 5502 = build_function_type_list (V16QI_type_node,
0dbc3651
ZW
5503 integer_type_node, pcvoid_type_node, NULL_TREE);
5504 tree v8hi_ftype_int_pcvoid
a3170dc6 5505 = build_function_type_list (V8HI_type_node,
0dbc3651
ZW
5506 integer_type_node, pcvoid_type_node, NULL_TREE);
5507 tree v4si_ftype_int_pcvoid
a3170dc6 5508 = build_function_type_list (V4SI_type_node,
0dbc3651
ZW
5509 integer_type_node, pcvoid_type_node, NULL_TREE);
5510
14b32f4e 5511 tree void_ftype_v4si_int_pvoid
b4de2f7d
AH
5512 = build_function_type_list (void_type_node,
5513 V4SI_type_node, integer_type_node,
5514 pvoid_type_node, NULL_TREE);
6525c0e7 5515 tree void_ftype_v16qi_int_pvoid
b4de2f7d
AH
5516 = build_function_type_list (void_type_node,
5517 V16QI_type_node, integer_type_node,
5518 pvoid_type_node, NULL_TREE);
6525c0e7 5519 tree void_ftype_v8hi_int_pvoid
b4de2f7d
AH
5520 = build_function_type_list (void_type_node,
5521 V8HI_type_node, integer_type_node,
5522 pvoid_type_node, NULL_TREE);
a3170dc6
AH
5523 tree int_ftype_int_v8hi_v8hi
5524 = build_function_type_list (integer_type_node,
5525 integer_type_node, V8HI_type_node,
5526 V8HI_type_node, NULL_TREE);
5527 tree int_ftype_int_v16qi_v16qi
5528 = build_function_type_list (integer_type_node,
5529 integer_type_node, V16QI_type_node,
5530 V16QI_type_node, NULL_TREE);
5531 tree int_ftype_int_v4sf_v4sf
5532 = build_function_type_list (integer_type_node,
5533 integer_type_node, V4SF_type_node,
5534 V4SF_type_node, NULL_TREE);
5535 tree v4si_ftype_v4si
5536 = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
5537 tree v8hi_ftype_v8hi
5538 = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
5539 tree v16qi_ftype_v16qi
5540 = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
5541 tree v4sf_ftype_v4sf
5542 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
0dbc3651 5543 tree void_ftype_pcvoid_int_char
a3170dc6 5544 = build_function_type_list (void_type_node,
0dbc3651 5545 pcvoid_type_node, integer_type_node,
a3170dc6 5546 char_type_node, NULL_TREE);
0dbc3651
ZW
5547
5548 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4sf", v4sf_ftype_pcfloat,
5549 ALTIVEC_BUILTIN_LD_INTERNAL_4sf);
5550 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4sf", void_ftype_pfloat_v4sf,
5551 ALTIVEC_BUILTIN_ST_INTERNAL_4sf);
5552 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4si", v4si_ftype_pcint,
5553 ALTIVEC_BUILTIN_LD_INTERNAL_4si);
5554 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4si", void_ftype_pint_v4si,
5555 ALTIVEC_BUILTIN_ST_INTERNAL_4si);
5556 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_8hi", v8hi_ftype_pcshort,
5557 ALTIVEC_BUILTIN_LD_INTERNAL_8hi);
5558 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_8hi", void_ftype_pshort_v8hi,
5559 ALTIVEC_BUILTIN_ST_INTERNAL_8hi);
5560 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_16qi", v16qi_ftype_pcchar,
5561 ALTIVEC_BUILTIN_LD_INTERNAL_16qi);
5562 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_16qi", void_ftype_pchar_v16qi,
5563 ALTIVEC_BUILTIN_ST_INTERNAL_16qi);
a3170dc6
AH
5564 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
5565 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
5566 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
5567 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_qi, ALTIVEC_BUILTIN_DSS);
0dbc3651
ZW
5568 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVSL);
5569 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVSR);
5570 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVEBX);
5571 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVEHX);
5572 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVEWX);
5573 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVXL);
5574 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVX);
a3170dc6
AH
5575 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_int_pvoid, ALTIVEC_BUILTIN_STVX);
5576 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_int_pvoid, ALTIVEC_BUILTIN_STVEWX);
5577 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_int_pvoid, ALTIVEC_BUILTIN_STVXL);
5578 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_int_pvoid, ALTIVEC_BUILTIN_STVEBX);
5579 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_int_pvoid, ALTIVEC_BUILTIN_STVEHX);
5580
5581 /* Add the DST variants. */
5582 d = (struct builtin_description *) bdesc_dst;
5583 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
0dbc3651 5584 def_builtin (d->mask, d->name, void_ftype_pcvoid_int_char, d->code);
a3170dc6
AH
5585
5586 /* Initialize the predicates. */
5587 dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
5588 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
5589 {
5590 enum machine_mode mode1;
5591 tree type;
5592
5593 mode1 = insn_data[dp->icode].operand[1].mode;
5594
5595 switch (mode1)
5596 {
5597 case V4SImode:
5598 type = int_ftype_int_v4si_v4si;
5599 break;
5600 case V8HImode:
5601 type = int_ftype_int_v8hi_v8hi;
5602 break;
5603 case V16QImode:
5604 type = int_ftype_int_v16qi_v16qi;
5605 break;
5606 case V4SFmode:
5607 type = int_ftype_int_v4sf_v4sf;
5608 break;
5609 default:
5610 abort ();
5611 }
5612
5613 def_builtin (dp->mask, dp->name, type, dp->code);
5614 }
5615
5616 /* Initialize the abs* operators. */
5617 d = (struct builtin_description *) bdesc_abs;
5618 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
5619 {
5620 enum machine_mode mode0;
5621 tree type;
5622
5623 mode0 = insn_data[d->icode].operand[0].mode;
5624
5625 switch (mode0)
5626 {
5627 case V4SImode:
5628 type = v4si_ftype_v4si;
5629 break;
5630 case V8HImode:
5631 type = v8hi_ftype_v8hi;
5632 break;
5633 case V16QImode:
5634 type = v16qi_ftype_v16qi;
5635 break;
5636 case V4SFmode:
5637 type = v4sf_ftype_v4sf;
5638 break;
5639 default:
5640 abort ();
5641 }
5642
5643 def_builtin (d->mask, d->name, type, d->code);
5644 }
5645}
5646
5647static void
b24c9d35 5648rs6000_common_init_builtins ()
a3170dc6
AH
5649{
5650 struct builtin_description *d;
5651 size_t i;
5652
5653 tree v4sf_ftype_v4sf_v4sf_v16qi
5654 = build_function_type_list (V4SF_type_node,
5655 V4SF_type_node, V4SF_type_node,
5656 V16QI_type_node, NULL_TREE);
5657 tree v4si_ftype_v4si_v4si_v16qi
5658 = build_function_type_list (V4SI_type_node,
5659 V4SI_type_node, V4SI_type_node,
5660 V16QI_type_node, NULL_TREE);
5661 tree v8hi_ftype_v8hi_v8hi_v16qi
5662 = build_function_type_list (V8HI_type_node,
5663 V8HI_type_node, V8HI_type_node,
5664 V16QI_type_node, NULL_TREE);
5665 tree v16qi_ftype_v16qi_v16qi_v16qi
5666 = build_function_type_list (V16QI_type_node,
5667 V16QI_type_node, V16QI_type_node,
5668 V16QI_type_node, NULL_TREE);
5669 tree v4si_ftype_char
5670 = build_function_type_list (V4SI_type_node, char_type_node, NULL_TREE);
5671 tree v8hi_ftype_char
5672 = build_function_type_list (V8HI_type_node, char_type_node, NULL_TREE);
5673 tree v16qi_ftype_char
5674 = build_function_type_list (V16QI_type_node, char_type_node, NULL_TREE);
5675 tree v8hi_ftype_v16qi
5676 = build_function_type_list (V8HI_type_node, V16QI_type_node, NULL_TREE);
5677 tree v4sf_ftype_v4sf
5678 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
5679
5680 tree v2si_ftype_v2si_v2si
5681 = build_function_type_list (V2SI_type_node,
5682 V2SI_type_node, V2SI_type_node, NULL_TREE);
5683
5684 tree v2sf_ftype_v2sf_v2sf
5685 = build_function_type_list (V2SF_type_node,
5686 V2SF_type_node, V2SF_type_node, NULL_TREE);
5687
5688 tree v2si_ftype_int_int
5689 = build_function_type_list (V2SI_type_node,
5690 integer_type_node, integer_type_node,
5691 NULL_TREE);
5692
5693 tree v2si_ftype_v2si
5694 = build_function_type_list (V2SI_type_node, V2SI_type_node, NULL_TREE);
5695
5696 tree v2sf_ftype_v2sf
5697 = build_function_type_list (V2SF_type_node,
5698 V2SF_type_node, NULL_TREE);
5699
5700 tree v2sf_ftype_v2si
5701 = build_function_type_list (V2SF_type_node,
5702 V2SI_type_node, NULL_TREE);
5703
5704 tree v2si_ftype_v2sf
5705 = build_function_type_list (V2SI_type_node,
5706 V2SF_type_node, NULL_TREE);
5707
5708 tree v2si_ftype_v2si_char
5709 = build_function_type_list (V2SI_type_node,
5710 V2SI_type_node, char_type_node, NULL_TREE);
5711
5712 tree v2si_ftype_int_char
5713 = build_function_type_list (V2SI_type_node,
5714 integer_type_node, char_type_node, NULL_TREE);
5715
5716 tree v2si_ftype_char
5717 = build_function_type_list (V2SI_type_node, char_type_node, NULL_TREE);
5718
5719 tree int_ftype_int_int
5720 = build_function_type_list (integer_type_node,
5721 integer_type_node, integer_type_node,
5722 NULL_TREE);
95385cbb 5723
0ac081f6 5724 tree v4si_ftype_v4si_v4si
b4de2f7d
AH
5725 = build_function_type_list (V4SI_type_node,
5726 V4SI_type_node, V4SI_type_node, NULL_TREE);
617e0e1d 5727 tree v4sf_ftype_v4si_char
b4de2f7d
AH
5728 = build_function_type_list (V4SF_type_node,
5729 V4SI_type_node, char_type_node, NULL_TREE);
617e0e1d 5730 tree v4si_ftype_v4sf_char
b4de2f7d
AH
5731 = build_function_type_list (V4SI_type_node,
5732 V4SF_type_node, char_type_node, NULL_TREE);
2212663f 5733 tree v4si_ftype_v4si_char
b4de2f7d
AH
5734 = build_function_type_list (V4SI_type_node,
5735 V4SI_type_node, char_type_node, NULL_TREE);
2212663f 5736 tree v8hi_ftype_v8hi_char
b4de2f7d
AH
5737 = build_function_type_list (V8HI_type_node,
5738 V8HI_type_node, char_type_node, NULL_TREE);
2212663f 5739 tree v16qi_ftype_v16qi_char
b4de2f7d
AH
5740 = build_function_type_list (V16QI_type_node,
5741 V16QI_type_node, char_type_node, NULL_TREE);
24408032 5742 tree v16qi_ftype_v16qi_v16qi_char
b4de2f7d
AH
5743 = build_function_type_list (V16QI_type_node,
5744 V16QI_type_node, V16QI_type_node,
5745 char_type_node, NULL_TREE);
24408032 5746 tree v8hi_ftype_v8hi_v8hi_char
b4de2f7d
AH
5747 = build_function_type_list (V8HI_type_node,
5748 V8HI_type_node, V8HI_type_node,
5749 char_type_node, NULL_TREE);
24408032 5750 tree v4si_ftype_v4si_v4si_char
b4de2f7d
AH
5751 = build_function_type_list (V4SI_type_node,
5752 V4SI_type_node, V4SI_type_node,
5753 char_type_node, NULL_TREE);
24408032 5754 tree v4sf_ftype_v4sf_v4sf_char
b4de2f7d
AH
5755 = build_function_type_list (V4SF_type_node,
5756 V4SF_type_node, V4SF_type_node,
5757 char_type_node, NULL_TREE);
0ac081f6 5758 tree v4sf_ftype_v4sf_v4sf
b4de2f7d
AH
5759 = build_function_type_list (V4SF_type_node,
5760 V4SF_type_node, V4SF_type_node, NULL_TREE);
617e0e1d 5761 tree v4sf_ftype_v4sf_v4sf_v4si
b4de2f7d
AH
5762 = build_function_type_list (V4SF_type_node,
5763 V4SF_type_node, V4SF_type_node,
5764 V4SI_type_node, NULL_TREE);
2212663f 5765 tree v4sf_ftype_v4sf_v4sf_v4sf
b4de2f7d
AH
5766 = build_function_type_list (V4SF_type_node,
5767 V4SF_type_node, V4SF_type_node,
5768 V4SF_type_node, NULL_TREE);
617e0e1d 5769 tree v4si_ftype_v4si_v4si_v4si
b4de2f7d
AH
5770 = build_function_type_list (V4SI_type_node,
5771 V4SI_type_node, V4SI_type_node,
5772 V4SI_type_node, NULL_TREE);
0ac081f6 5773 tree v8hi_ftype_v8hi_v8hi
b4de2f7d
AH
5774 = build_function_type_list (V8HI_type_node,
5775 V8HI_type_node, V8HI_type_node, NULL_TREE);
2212663f 5776 tree v8hi_ftype_v8hi_v8hi_v8hi
b4de2f7d
AH
5777 = build_function_type_list (V8HI_type_node,
5778 V8HI_type_node, V8HI_type_node,
5779 V8HI_type_node, NULL_TREE);
2212663f 5780 tree v4si_ftype_v8hi_v8hi_v4si
b4de2f7d
AH
5781 = build_function_type_list (V4SI_type_node,
5782 V8HI_type_node, V8HI_type_node,
5783 V4SI_type_node, NULL_TREE);
2212663f 5784 tree v4si_ftype_v16qi_v16qi_v4si
b4de2f7d
AH
5785 = build_function_type_list (V4SI_type_node,
5786 V16QI_type_node, V16QI_type_node,
5787 V4SI_type_node, NULL_TREE);
0ac081f6 5788 tree v16qi_ftype_v16qi_v16qi
b4de2f7d
AH
5789 = build_function_type_list (V16QI_type_node,
5790 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 5791 tree v4si_ftype_v4sf_v4sf
b4de2f7d
AH
5792 = build_function_type_list (V4SI_type_node,
5793 V4SF_type_node, V4SF_type_node, NULL_TREE);
0ac081f6 5794 tree v8hi_ftype_v16qi_v16qi
b4de2f7d
AH
5795 = build_function_type_list (V8HI_type_node,
5796 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 5797 tree v4si_ftype_v8hi_v8hi
b4de2f7d
AH
5798 = build_function_type_list (V4SI_type_node,
5799 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 5800 tree v8hi_ftype_v4si_v4si
b4de2f7d
AH
5801 = build_function_type_list (V8HI_type_node,
5802 V4SI_type_node, V4SI_type_node, NULL_TREE);
0ac081f6 5803 tree v16qi_ftype_v8hi_v8hi
b4de2f7d
AH
5804 = build_function_type_list (V16QI_type_node,
5805 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 5806 tree v4si_ftype_v16qi_v4si
b4de2f7d
AH
5807 = build_function_type_list (V4SI_type_node,
5808 V16QI_type_node, V4SI_type_node, NULL_TREE);
fa066a23 5809 tree v4si_ftype_v16qi_v16qi
b4de2f7d
AH
5810 = build_function_type_list (V4SI_type_node,
5811 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 5812 tree v4si_ftype_v8hi_v4si
b4de2f7d
AH
5813 = build_function_type_list (V4SI_type_node,
5814 V8HI_type_node, V4SI_type_node, NULL_TREE);
a3170dc6
AH
5815 tree v4si_ftype_v8hi
5816 = build_function_type_list (V4SI_type_node, V8HI_type_node, NULL_TREE);
5817 tree int_ftype_v4si_v4si
5818 = build_function_type_list (integer_type_node,
5819 V4SI_type_node, V4SI_type_node, NULL_TREE);
5820 tree int_ftype_v4sf_v4sf
5821 = build_function_type_list (integer_type_node,
5822 V4SF_type_node, V4SF_type_node, NULL_TREE);
5823 tree int_ftype_v16qi_v16qi
5824 = build_function_type_list (integer_type_node,
5825 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 5826 tree int_ftype_v8hi_v8hi
b4de2f7d
AH
5827 = build_function_type_list (integer_type_node,
5828 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 5829
6f317ef3 5830 /* Add the simple ternary operators. */
2212663f 5831 d = (struct builtin_description *) bdesc_3arg;
ca7558fc 5832 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
2212663f
DB
5833 {
5834
5835 enum machine_mode mode0, mode1, mode2, mode3;
5836 tree type;
5837
0559cc77 5838 if (d->name == 0 || d->icode == CODE_FOR_nothing)
2212663f
DB
5839 continue;
5840
5841 mode0 = insn_data[d->icode].operand[0].mode;
5842 mode1 = insn_data[d->icode].operand[1].mode;
5843 mode2 = insn_data[d->icode].operand[2].mode;
5844 mode3 = insn_data[d->icode].operand[3].mode;
5845
5846 /* When all four are of the same mode. */
5847 if (mode0 == mode1 && mode1 == mode2 && mode2 == mode3)
5848 {
5849 switch (mode0)
5850 {
617e0e1d
DB
5851 case V4SImode:
5852 type = v4si_ftype_v4si_v4si_v4si;
5853 break;
2212663f
DB
5854 case V4SFmode:
5855 type = v4sf_ftype_v4sf_v4sf_v4sf;
5856 break;
5857 case V8HImode:
5858 type = v8hi_ftype_v8hi_v8hi_v8hi;
5859 break;
5860 case V16QImode:
5861 type = v16qi_ftype_v16qi_v16qi_v16qi;
5862 break;
5863 default:
5864 abort();
5865 }
5866 }
5867 else if (mode0 == mode1 && mode1 == mode2 && mode3 == V16QImode)
5868 {
5869 switch (mode0)
5870 {
5871 case V4SImode:
5872 type = v4si_ftype_v4si_v4si_v16qi;
5873 break;
5874 case V4SFmode:
5875 type = v4sf_ftype_v4sf_v4sf_v16qi;
5876 break;
5877 case V8HImode:
5878 type = v8hi_ftype_v8hi_v8hi_v16qi;
5879 break;
5880 case V16QImode:
5881 type = v16qi_ftype_v16qi_v16qi_v16qi;
5882 break;
5883 default:
5884 abort();
5885 }
5886 }
5887 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode
5888 && mode3 == V4SImode)
24408032 5889 type = v4si_ftype_v16qi_v16qi_v4si;
2212663f
DB
5890 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode
5891 && mode3 == V4SImode)
24408032 5892 type = v4si_ftype_v8hi_v8hi_v4si;
617e0e1d
DB
5893 else if (mode0 == V4SFmode && mode1 == V4SFmode && mode2 == V4SFmode
5894 && mode3 == V4SImode)
24408032
AH
5895 type = v4sf_ftype_v4sf_v4sf_v4si;
5896
5897 /* vchar, vchar, vchar, 4 bit literal. */
5898 else if (mode0 == V16QImode && mode1 == mode0 && mode2 == mode0
5899 && mode3 == QImode)
5900 type = v16qi_ftype_v16qi_v16qi_char;
5901
5902 /* vshort, vshort, vshort, 4 bit literal. */
5903 else if (mode0 == V8HImode && mode1 == mode0 && mode2 == mode0
5904 && mode3 == QImode)
5905 type = v8hi_ftype_v8hi_v8hi_char;
5906
5907 /* vint, vint, vint, 4 bit literal. */
5908 else if (mode0 == V4SImode && mode1 == mode0 && mode2 == mode0
5909 && mode3 == QImode)
5910 type = v4si_ftype_v4si_v4si_char;
5911
5912 /* vfloat, vfloat, vfloat, 4 bit literal. */
5913 else if (mode0 == V4SFmode && mode1 == mode0 && mode2 == mode0
5914 && mode3 == QImode)
5915 type = v4sf_ftype_v4sf_v4sf_char;
5916
2212663f
DB
5917 else
5918 abort ();
5919
5920 def_builtin (d->mask, d->name, type, d->code);
5921 }
5922
0ac081f6 5923 /* Add the simple binary operators. */
00b960c7 5924 d = (struct builtin_description *) bdesc_2arg;
ca7558fc 5925 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
0ac081f6
AH
5926 {
5927 enum machine_mode mode0, mode1, mode2;
5928 tree type;
5929
0559cc77 5930 if (d->name == 0 || d->icode == CODE_FOR_nothing)
0ac081f6
AH
5931 continue;
5932
5933 mode0 = insn_data[d->icode].operand[0].mode;
5934 mode1 = insn_data[d->icode].operand[1].mode;
5935 mode2 = insn_data[d->icode].operand[2].mode;
5936
5937 /* When all three operands are of the same mode. */
5938 if (mode0 == mode1 && mode1 == mode2)
5939 {
5940 switch (mode0)
5941 {
5942 case V4SFmode:
5943 type = v4sf_ftype_v4sf_v4sf;
5944 break;
5945 case V4SImode:
5946 type = v4si_ftype_v4si_v4si;
5947 break;
5948 case V16QImode:
5949 type = v16qi_ftype_v16qi_v16qi;
5950 break;
5951 case V8HImode:
5952 type = v8hi_ftype_v8hi_v8hi;
5953 break;
a3170dc6
AH
5954 case V2SImode:
5955 type = v2si_ftype_v2si_v2si;
5956 break;
5957 case V2SFmode:
5958 type = v2sf_ftype_v2sf_v2sf;
5959 break;
5960 case SImode:
5961 type = int_ftype_int_int;
5962 break;
0ac081f6
AH
5963 default:
5964 abort ();
5965 }
5966 }
5967
5968 /* A few other combos we really don't want to do manually. */
5969
5970 /* vint, vfloat, vfloat. */
5971 else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == V4SFmode)
5972 type = v4si_ftype_v4sf_v4sf;
5973
5974 /* vshort, vchar, vchar. */
5975 else if (mode0 == V8HImode && mode1 == V16QImode && mode2 == V16QImode)
5976 type = v8hi_ftype_v16qi_v16qi;
5977
5978 /* vint, vshort, vshort. */
5979 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode)
5980 type = v4si_ftype_v8hi_v8hi;
5981
5982 /* vshort, vint, vint. */
5983 else if (mode0 == V8HImode && mode1 == V4SImode && mode2 == V4SImode)
5984 type = v8hi_ftype_v4si_v4si;
5985
5986 /* vchar, vshort, vshort. */
5987 else if (mode0 == V16QImode && mode1 == V8HImode && mode2 == V8HImode)
5988 type = v16qi_ftype_v8hi_v8hi;
5989
5990 /* vint, vchar, vint. */
5991 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V4SImode)
5992 type = v4si_ftype_v16qi_v4si;
5993
fa066a23
AH
5994 /* vint, vchar, vchar. */
5995 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode)
5996 type = v4si_ftype_v16qi_v16qi;
5997
0ac081f6
AH
5998 /* vint, vshort, vint. */
5999 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V4SImode)
6000 type = v4si_ftype_v8hi_v4si;
2212663f
DB
6001
6002 /* vint, vint, 5 bit literal. */
6003 else if (mode0 == V4SImode && mode1 == V4SImode && mode2 == QImode)
6004 type = v4si_ftype_v4si_char;
6005
6006 /* vshort, vshort, 5 bit literal. */
6007 else if (mode0 == V8HImode && mode1 == V8HImode && mode2 == QImode)
6008 type = v8hi_ftype_v8hi_char;
6009
6010 /* vchar, vchar, 5 bit literal. */
6011 else if (mode0 == V16QImode && mode1 == V16QImode && mode2 == QImode)
6012 type = v16qi_ftype_v16qi_char;
0ac081f6 6013
617e0e1d
DB
6014 /* vfloat, vint, 5 bit literal. */
6015 else if (mode0 == V4SFmode && mode1 == V4SImode && mode2 == QImode)
6016 type = v4sf_ftype_v4si_char;
6017
6018 /* vint, vfloat, 5 bit literal. */
6019 else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == QImode)
6020 type = v4si_ftype_v4sf_char;
6021
a3170dc6
AH
6022 else if (mode0 == V2SImode && mode1 == SImode && mode2 == SImode)
6023 type = v2si_ftype_int_int;
6024
6025 else if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
6026 type = v2si_ftype_v2si_char;
6027
6028 else if (mode0 == V2SImode && mode1 == SImode && mode2 == QImode)
6029 type = v2si_ftype_int_char;
6030
0ac081f6
AH
6031 /* int, x, x. */
6032 else if (mode0 == SImode)
6033 {
6034 switch (mode1)
6035 {
6036 case V4SImode:
6037 type = int_ftype_v4si_v4si;
6038 break;
6039 case V4SFmode:
6040 type = int_ftype_v4sf_v4sf;
6041 break;
6042 case V16QImode:
6043 type = int_ftype_v16qi_v16qi;
6044 break;
6045 case V8HImode:
6046 type = int_ftype_v8hi_v8hi;
6047 break;
6048 default:
6049 abort ();
6050 }
6051 }
6052
6053 else
6054 abort ();
6055
2212663f
DB
6056 def_builtin (d->mask, d->name, type, d->code);
6057 }
24408032 6058
2212663f
DB
6059 /* Add the simple unary operators. */
6060 d = (struct builtin_description *) bdesc_1arg;
ca7558fc 6061 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
2212663f
DB
6062 {
6063 enum machine_mode mode0, mode1;
6064 tree type;
6065
0559cc77 6066 if (d->name == 0 || d->icode == CODE_FOR_nothing)
2212663f
DB
6067 continue;
6068
6069 mode0 = insn_data[d->icode].operand[0].mode;
6070 mode1 = insn_data[d->icode].operand[1].mode;
6071
6072 if (mode0 == V4SImode && mode1 == QImode)
6073 type = v4si_ftype_char;
6074 else if (mode0 == V8HImode && mode1 == QImode)
6075 type = v8hi_ftype_char;
6076 else if (mode0 == V16QImode && mode1 == QImode)
6077 type = v16qi_ftype_char;
617e0e1d
DB
6078 else if (mode0 == V4SFmode && mode1 == V4SFmode)
6079 type = v4sf_ftype_v4sf;
20e26713
AH
6080 else if (mode0 == V8HImode && mode1 == V16QImode)
6081 type = v8hi_ftype_v16qi;
6082 else if (mode0 == V4SImode && mode1 == V8HImode)
6083 type = v4si_ftype_v8hi;
a3170dc6
AH
6084 else if (mode0 == V2SImode && mode1 == V2SImode)
6085 type = v2si_ftype_v2si;
6086 else if (mode0 == V2SFmode && mode1 == V2SFmode)
6087 type = v2sf_ftype_v2sf;
6088 else if (mode0 == V2SFmode && mode1 == V2SImode)
6089 type = v2sf_ftype_v2si;
6090 else if (mode0 == V2SImode && mode1 == V2SFmode)
6091 type = v2si_ftype_v2sf;
6092 else if (mode0 == V2SImode && mode1 == QImode)
6093 type = v2si_ftype_char;
2212663f
DB
6094 else
6095 abort ();
6096
0ac081f6
AH
6097 def_builtin (d->mask, d->name, type, d->code);
6098 }
6099}
6100
35aff10b 6101\f
7e69e155
MM
6102/* Expand a block move operation, and return 1 if successful. Return 0
6103 if we should let the compiler generate normal code.
6104
6105 operands[0] is the destination
6106 operands[1] is the source
6107 operands[2] is the length
6108 operands[3] is the alignment */
6109
3933e0e1
MM
6110#define MAX_MOVE_REG 4
6111
7e69e155
MM
6112int
6113expand_block_move (operands)
6114 rtx operands[];
6115{
b6c9286a
MM
6116 rtx orig_dest = operands[0];
6117 rtx orig_src = operands[1];
7e69e155 6118 rtx bytes_rtx = operands[2];
7e69e155 6119 rtx align_rtx = operands[3];
3933e0e1 6120 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
5ee95df6 6121 int align;
3933e0e1
MM
6122 int bytes;
6123 int offset;
7e69e155
MM
6124 int move_bytes;
6125
3933e0e1 6126 /* If this is not a fixed size move, just call memcpy */
cc0d9ba8 6127 if (! constp)
3933e0e1
MM
6128 return 0;
6129
5ee95df6
FS
6130 /* If this is not a fixed size alignment, abort */
6131 if (GET_CODE (align_rtx) != CONST_INT)
6132 abort ();
6133 align = INTVAL (align_rtx);
6134
7e69e155 6135 /* Anything to move? */
3933e0e1
MM
6136 bytes = INTVAL (bytes_rtx);
6137 if (bytes <= 0)
7e69e155
MM
6138 return 1;
6139
ea9982a8 6140 /* store_one_arg depends on expand_block_move to handle at least the size of
6f317ef3 6141 reg_parm_stack_space. */
ea9982a8 6142 if (bytes > (TARGET_POWERPC64 ? 64 : 32))
7e69e155
MM
6143 return 0;
6144
3933e0e1 6145 if (TARGET_STRING) /* string instructions are available */
7e69e155 6146 {
35aff10b 6147 for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
7e69e155 6148 {
35aff10b
AM
6149 union {
6150 rtx (*movstrsi) PARAMS ((rtx, rtx, rtx, rtx));
6151 rtx (*mov) PARAMS ((rtx, rtx));
6152 } gen_func;
6153 enum machine_mode mode = BLKmode;
6154 rtx src, dest;
6155
3933e0e1 6156 if (bytes > 24 /* move up to 32 bytes at a time */
cc0d9ba8
DE
6157 && ! fixed_regs[5]
6158 && ! fixed_regs[6]
6159 && ! fixed_regs[7]
6160 && ! fixed_regs[8]
6161 && ! fixed_regs[9]
6162 && ! fixed_regs[10]
6163 && ! fixed_regs[11]
6164 && ! fixed_regs[12])
3933e0e1
MM
6165 {
6166 move_bytes = (bytes > 32) ? 32 : bytes;
35aff10b 6167 gen_func.movstrsi = gen_movstrsi_8reg;
3933e0e1
MM
6168 }
6169 else if (bytes > 16 /* move up to 24 bytes at a time */
f9562f27
DE
6170 && ! fixed_regs[5]
6171 && ! fixed_regs[6]
cc0d9ba8
DE
6172 && ! fixed_regs[7]
6173 && ! fixed_regs[8]
6174 && ! fixed_regs[9]
f9562f27 6175 && ! fixed_regs[10])
3933e0e1
MM
6176 {
6177 move_bytes = (bytes > 24) ? 24 : bytes;
35aff10b 6178 gen_func.movstrsi = gen_movstrsi_6reg;
3933e0e1
MM
6179 }
6180 else if (bytes > 8 /* move up to 16 bytes at a time */
f9562f27
DE
6181 && ! fixed_regs[5]
6182 && ! fixed_regs[6]
6183 && ! fixed_regs[7]
6184 && ! fixed_regs[8])
3933e0e1
MM
6185 {
6186 move_bytes = (bytes > 16) ? 16 : bytes;
35aff10b 6187 gen_func.movstrsi = gen_movstrsi_4reg;
3933e0e1 6188 }
acad7ed3 6189 else if (bytes >= 8 && TARGET_POWERPC64
a4f6c312 6190 /* 64-bit loads and stores require word-aligned
82e41834 6191 displacements. */
a4f6c312 6192 && (align >= 8 || (! STRICT_ALIGNMENT && align >= 4)))
acad7ed3
DE
6193 {
6194 move_bytes = 8;
35aff10b
AM
6195 mode = DImode;
6196 gen_func.mov = gen_movdi;
acad7ed3 6197 }
09a625f7 6198 else if (bytes > 4 && !TARGET_POWERPC64)
3933e0e1
MM
6199 { /* move up to 8 bytes at a time */
6200 move_bytes = (bytes > 8) ? 8 : bytes;
35aff10b 6201 gen_func.movstrsi = gen_movstrsi_2reg;
3933e0e1 6202 }
cc0d9ba8 6203 else if (bytes >= 4 && (align >= 4 || ! STRICT_ALIGNMENT))
3933e0e1
MM
6204 { /* move 4 bytes */
6205 move_bytes = 4;
35aff10b
AM
6206 mode = SImode;
6207 gen_func.mov = gen_movsi;
3933e0e1 6208 }
cc0d9ba8 6209 else if (bytes == 2 && (align >= 2 || ! STRICT_ALIGNMENT))
3933e0e1
MM
6210 { /* move 2 bytes */
6211 move_bytes = 2;
35aff10b
AM
6212 mode = HImode;
6213 gen_func.mov = gen_movhi;
3933e0e1
MM
6214 }
6215 else if (bytes == 1) /* move 1 byte */
6216 {
6217 move_bytes = 1;
35aff10b
AM
6218 mode = QImode;
6219 gen_func.mov = gen_movqi;
3933e0e1
MM
6220 }
6221 else
6222 { /* move up to 4 bytes at a time */
6223 move_bytes = (bytes > 4) ? 4 : bytes;
35aff10b 6224 gen_func.movstrsi = gen_movstrsi_1reg;
3933e0e1 6225 }
4c64a852 6226
35aff10b
AM
6227 src = adjust_address (orig_src, mode, offset);
6228 dest = adjust_address (orig_dest, mode, offset);
6229
6230 if (mode == BLKmode)
015892ee 6231 {
35aff10b
AM
6232 /* Move the address into scratch registers. The movstrsi
6233 patterns require zero offset. */
6234 if (!REG_P (XEXP (src, 0)))
cc0d9ba8 6235 {
35aff10b
AM
6236 rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
6237 src = replace_equiv_address (src, src_reg);
cc0d9ba8 6238 }
35aff10b
AM
6239 set_mem_size (src, GEN_INT (move_bytes));
6240
6241 if (!REG_P (XEXP (dest, 0)))
cc0d9ba8 6242 {
35aff10b
AM
6243 rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
6244 dest = replace_equiv_address (dest, dest_reg);
cc0d9ba8 6245 }
35aff10b
AM
6246 set_mem_size (dest, GEN_INT (move_bytes));
6247
6248 emit_insn ((*gen_func.movstrsi) (dest, src,
6249 GEN_INT (move_bytes & 31),
6250 align_rtx));
6251 }
6252 else
6253 {
6254 rtx tmp_reg = gen_reg_rtx (mode);
6255
6256 emit_insn ((*gen_func.mov) (tmp_reg, src));
6257 emit_insn ((*gen_func.mov) (dest, tmp_reg));
015892ee 6258 }
4c64a852 6259 }
3933e0e1
MM
6260 }
6261
6262 else /* string instructions not available */
6263 {
35aff10b
AM
6264 rtx stores[MAX_MOVE_REG];
6265 int num_reg = 0;
6266 int i;
6267
6268 for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
7e69e155 6269 {
35aff10b
AM
6270 rtx (*gen_mov_func) PARAMS ((rtx, rtx));
6271 enum machine_mode mode;
6272 rtx src, dest, tmp_reg;
3933e0e1 6273
cc0d9ba8
DE
6274 /* Generate the appropriate load and store, saving the stores
6275 for later. */
6276 if (bytes >= 8 && TARGET_POWERPC64
a4f6c312
SS
6277 /* 64-bit loads and stores require word-aligned
6278 displacements. */
cc0d9ba8 6279 && (align >= 8 || (! STRICT_ALIGNMENT && align >= 4)))
b6c9286a
MM
6280 {
6281 move_bytes = 8;
35aff10b
AM
6282 mode = DImode;
6283 gen_mov_func = gen_movdi;
b6c9286a 6284 }
cc0d9ba8 6285 else if (bytes >= 4 && (align >= 4 || ! STRICT_ALIGNMENT))
3933e0e1
MM
6286 {
6287 move_bytes = 4;
35aff10b
AM
6288 mode = SImode;
6289 gen_mov_func = gen_movsi;
3933e0e1 6290 }
cc0d9ba8 6291 else if (bytes >= 2 && (align >= 2 || ! STRICT_ALIGNMENT))
3933e0e1
MM
6292 {
6293 move_bytes = 2;
35aff10b
AM
6294 mode = HImode;
6295 gen_mov_func = gen_movhi;
3933e0e1
MM
6296 }
6297 else
6298 {
6299 move_bytes = 1;
35aff10b
AM
6300 mode = QImode;
6301 gen_mov_func = gen_movqi;
3933e0e1
MM
6302 }
6303
35aff10b
AM
6304 src = adjust_address (orig_src, mode, offset);
6305 dest = adjust_address (orig_dest, mode, offset);
6306 tmp_reg = gen_reg_rtx (mode);
6307
6308 emit_insn ((*gen_mov_func) (tmp_reg, src));
6309 stores[num_reg++] = (*gen_mov_func) (dest, tmp_reg);
6310
3933e0e1
MM
6311 if (num_reg >= MAX_MOVE_REG)
6312 {
6313 for (i = 0; i < num_reg; i++)
6314 emit_insn (stores[i]);
6315 num_reg = 0;
7e69e155
MM
6316 }
6317 }
3933e0e1 6318
b6c9286a
MM
6319 for (i = 0; i < num_reg; i++)
6320 emit_insn (stores[i]);
7e69e155
MM
6321 }
6322
6323 return 1;
6324}
6325
9878760c
RK
6326\f
6327/* Return 1 if OP is a load multiple operation. It is known to be a
6328 PARALLEL and the first section will be tested. */
6329
6330int
6331load_multiple_operation (op, mode)
6332 rtx op;
296b8152 6333 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
6334{
6335 int count = XVECLEN (op, 0);
e2c953b6 6336 unsigned int dest_regno;
9878760c
RK
6337 rtx src_addr;
6338 int i;
6339
6340 /* Perform a quick check so we don't blow up below. */
6341 if (count <= 1
6342 || GET_CODE (XVECEXP (op, 0, 0)) != SET
6343 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
6344 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM)
6345 return 0;
6346
6347 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
6348 src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);
6349
6350 for (i = 1; i < count; i++)
6351 {
6352 rtx elt = XVECEXP (op, 0, i);
6353
6354 if (GET_CODE (elt) != SET
6355 || GET_CODE (SET_DEST (elt)) != REG
6356 || GET_MODE (SET_DEST (elt)) != SImode
6357 || REGNO (SET_DEST (elt)) != dest_regno + i
6358 || GET_CODE (SET_SRC (elt)) != MEM
6359 || GET_MODE (SET_SRC (elt)) != SImode
6360 || GET_CODE (XEXP (SET_SRC (elt), 0)) != PLUS
6361 || ! rtx_equal_p (XEXP (XEXP (SET_SRC (elt), 0), 0), src_addr)
6362 || GET_CODE (XEXP (XEXP (SET_SRC (elt), 0), 1)) != CONST_INT
6363 || INTVAL (XEXP (XEXP (SET_SRC (elt), 0), 1)) != i * 4)
6364 return 0;
6365 }
6366
6367 return 1;
6368}
6369
6370/* Similar, but tests for store multiple. Here, the second vector element
6371 is a CLOBBER. It will be tested later. */
6372
6373int
6374store_multiple_operation (op, mode)
6375 rtx op;
296b8152 6376 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
6377{
6378 int count = XVECLEN (op, 0) - 1;
e2c953b6 6379 unsigned int src_regno;
9878760c
RK
6380 rtx dest_addr;
6381 int i;
6382
6383 /* Perform a quick check so we don't blow up below. */
6384 if (count <= 1
6385 || GET_CODE (XVECEXP (op, 0, 0)) != SET
6386 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM
6387 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG)
6388 return 0;
6389
6390 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
6391 dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);
6392
6393 for (i = 1; i < count; i++)
6394 {
6395 rtx elt = XVECEXP (op, 0, i + 1);
6396
6397 if (GET_CODE (elt) != SET
6398 || GET_CODE (SET_SRC (elt)) != REG
6399 || GET_MODE (SET_SRC (elt)) != SImode
6400 || REGNO (SET_SRC (elt)) != src_regno + i
6401 || GET_CODE (SET_DEST (elt)) != MEM
6402 || GET_MODE (SET_DEST (elt)) != SImode
6403 || GET_CODE (XEXP (SET_DEST (elt), 0)) != PLUS
6404 || ! rtx_equal_p (XEXP (XEXP (SET_DEST (elt), 0), 0), dest_addr)
6405 || GET_CODE (XEXP (XEXP (SET_DEST (elt), 0), 1)) != CONST_INT
6406 || INTVAL (XEXP (XEXP (SET_DEST (elt), 0), 1)) != i * 4)
6407 return 0;
6408 }
6409
6410 return 1;
6411}
9ebbca7d 6412
9caa3eb2
DE
6413/* Return a string to perform a load_multiple operation.
6414 operands[0] is the vector.
6415 operands[1] is the source address.
6416 operands[2] is the first destination register. */
6417
6418const char *
6419rs6000_output_load_multiple (operands)
ebe637e3 6420 rtx operands[3];
9caa3eb2
DE
6421{
6422 /* We have to handle the case where the pseudo used to contain the address
6423 is assigned to one of the output registers. */
6424 int i, j;
6425 int words = XVECLEN (operands[0], 0);
6426 rtx xop[10];
6427
6428 if (XVECLEN (operands[0], 0) == 1)
6429 return "{l|lwz} %2,0(%1)";
6430
6431 for (i = 0; i < words; i++)
6432 if (refers_to_regno_p (REGNO (operands[2]) + i,
6433 REGNO (operands[2]) + i + 1, operands[1], 0))
6434 {
6435 if (i == words-1)
6436 {
6437 xop[0] = GEN_INT (4 * (words-1));
6438 xop[1] = operands[1];
6439 xop[2] = operands[2];
6440 output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
6441 return "";
6442 }
6443 else if (i == 0)
6444 {
6445 xop[0] = GEN_INT (4 * (words-1));
6446 xop[1] = operands[1];
6447 xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
6448 output_asm_insn ("{cal %1,4(%1)|addi %1,%1,4}\n\t{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,-4(%1)", xop);
6449 return "";
6450 }
6451 else
6452 {
6453 for (j = 0; j < words; j++)
6454 if (j != i)
6455 {
6456 xop[0] = GEN_INT (j * 4);
6457 xop[1] = operands[1];
6458 xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
6459 output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
6460 }
6461 xop[0] = GEN_INT (i * 4);
6462 xop[1] = operands[1];
6463 output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
6464 return "";
6465 }
6466 }
6467
6468 return "{lsi|lswi} %2,%1,%N0";
6469}
6470
00b960c7
AH
6471/* Return 1 for a parallel vrsave operation. */
6472
6473int
6474vrsave_operation (op, mode)
6475 rtx op;
6476 enum machine_mode mode ATTRIBUTE_UNUSED;
6477{
6478 int count = XVECLEN (op, 0);
6479 unsigned int dest_regno, src_regno;
6480 int i;
6481
6482 if (count <= 1
6483 || GET_CODE (XVECEXP (op, 0, 0)) != SET
6484 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
a004eb82 6485 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC_VOLATILE)
00b960c7
AH
6486 return 0;
6487
6488 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
6489 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
6490
6491 if (dest_regno != VRSAVE_REGNO
6492 && src_regno != VRSAVE_REGNO)
6493 return 0;
6494
6495 for (i = 1; i < count; i++)
6496 {
6497 rtx elt = XVECEXP (op, 0, i);
6498
9aa86737
AH
6499 if (GET_CODE (elt) != CLOBBER
6500 && GET_CODE (elt) != SET)
00b960c7
AH
6501 return 0;
6502 }
6503
6504 return 1;
6505}
6506
a4f6c312 6507/* Return 1 for an PARALLEL suitable for mtcrf. */
9ebbca7d
GK
6508
6509int
6510mtcrf_operation (op, mode)
6511 rtx op;
6512 enum machine_mode mode ATTRIBUTE_UNUSED;
6513{
6514 int count = XVECLEN (op, 0);
6515 int i;
9ebbca7d
GK
6516 rtx src_reg;
6517
6518 /* Perform a quick check so we don't blow up below. */
e35b9579
GK
6519 if (count < 1
6520 || GET_CODE (XVECEXP (op, 0, 0)) != SET
6521 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC
6522 || XVECLEN (SET_SRC (XVECEXP (op, 0, 0)), 0) != 2)
9ebbca7d 6523 return 0;
e35b9579 6524 src_reg = XVECEXP (SET_SRC (XVECEXP (op, 0, 0)), 0, 0);
9ebbca7d
GK
6525
6526 if (GET_CODE (src_reg) != REG
6527 || GET_MODE (src_reg) != SImode
6528 || ! INT_REGNO_P (REGNO (src_reg)))
6529 return 0;
6530
e35b9579 6531 for (i = 0; i < count; i++)
9ebbca7d
GK
6532 {
6533 rtx exp = XVECEXP (op, 0, i);
6534 rtx unspec;
6535 int maskval;
6536
6537 if (GET_CODE (exp) != SET
6538 || GET_CODE (SET_DEST (exp)) != REG
6539 || GET_MODE (SET_DEST (exp)) != CCmode
6540 || ! CR_REGNO_P (REGNO (SET_DEST (exp))))
6541 return 0;
6542 unspec = SET_SRC (exp);
6543 maskval = 1 << (MAX_CR_REGNO - REGNO (SET_DEST (exp)));
9ebbca7d
GK
6544
6545 if (GET_CODE (unspec) != UNSPEC
6546 || XINT (unspec, 1) != 20
6547 || XVECLEN (unspec, 0) != 2
6548 || XVECEXP (unspec, 0, 0) != src_reg
6549 || GET_CODE (XVECEXP (unspec, 0, 1)) != CONST_INT
6550 || INTVAL (XVECEXP (unspec, 0, 1)) != maskval)
6551 return 0;
6552 }
e35b9579 6553 return 1;
9ebbca7d
GK
6554}
6555
a4f6c312 6556/* Return 1 for an PARALLEL suitable for lmw. */
9ebbca7d
GK
6557
6558int
6559lmw_operation (op, mode)
6560 rtx op;
6561 enum machine_mode mode ATTRIBUTE_UNUSED;
6562{
6563 int count = XVECLEN (op, 0);
e2c953b6 6564 unsigned int dest_regno;
9ebbca7d 6565 rtx src_addr;
e2c953b6 6566 unsigned int base_regno;
9ebbca7d
GK
6567 HOST_WIDE_INT offset;
6568 int i;
6569
6570 /* Perform a quick check so we don't blow up below. */
6571 if (count <= 1
6572 || GET_CODE (XVECEXP (op, 0, 0)) != SET
6573 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
6574 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM)
6575 return 0;
6576
6577 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
6578 src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);
6579
6580 if (dest_regno > 31
e2c953b6 6581 || count != 32 - (int) dest_regno)
9ebbca7d
GK
6582 return 0;
6583
258bfae2 6584 if (LEGITIMATE_INDIRECT_ADDRESS_P (src_addr, 0))
9ebbca7d
GK
6585 {
6586 offset = 0;
6587 base_regno = REGNO (src_addr);
6588 if (base_regno == 0)
6589 return 0;
6590 }
258bfae2 6591 else if (LEGITIMATE_OFFSET_ADDRESS_P (SImode, src_addr, 0))
9ebbca7d
GK
6592 {
6593 offset = INTVAL (XEXP (src_addr, 1));
6594 base_regno = REGNO (XEXP (src_addr, 0));
6595 }
6596 else
6597 return 0;
6598
6599 for (i = 0; i < count; i++)
6600 {
6601 rtx elt = XVECEXP (op, 0, i);
6602 rtx newaddr;
6603 rtx addr_reg;
6604 HOST_WIDE_INT newoffset;
6605
6606 if (GET_CODE (elt) != SET
6607 || GET_CODE (SET_DEST (elt)) != REG
6608 || GET_MODE (SET_DEST (elt)) != SImode
6609 || REGNO (SET_DEST (elt)) != dest_regno + i
6610 || GET_CODE (SET_SRC (elt)) != MEM
6611 || GET_MODE (SET_SRC (elt)) != SImode)
6612 return 0;
6613 newaddr = XEXP (SET_SRC (elt), 0);
258bfae2 6614 if (LEGITIMATE_INDIRECT_ADDRESS_P (newaddr, 0))
9ebbca7d
GK
6615 {
6616 newoffset = 0;
6617 addr_reg = newaddr;
6618 }
258bfae2 6619 else if (LEGITIMATE_OFFSET_ADDRESS_P (SImode, newaddr, 0))
9ebbca7d
GK
6620 {
6621 addr_reg = XEXP (newaddr, 0);
6622 newoffset = INTVAL (XEXP (newaddr, 1));
6623 }
6624 else
6625 return 0;
6626 if (REGNO (addr_reg) != base_regno
6627 || newoffset != offset + 4 * i)
6628 return 0;
6629 }
6630
6631 return 1;
6632}
6633
a4f6c312 6634/* Return 1 for an PARALLEL suitable for stmw. */
9ebbca7d
GK
6635
6636int
6637stmw_operation (op, mode)
6638 rtx op;
6639 enum machine_mode mode ATTRIBUTE_UNUSED;
6640{
6641 int count = XVECLEN (op, 0);
e2c953b6 6642 unsigned int src_regno;
9ebbca7d 6643 rtx dest_addr;
e2c953b6 6644 unsigned int base_regno;
9ebbca7d
GK
6645 HOST_WIDE_INT offset;
6646 int i;
6647
6648 /* Perform a quick check so we don't blow up below. */
6649 if (count <= 1
6650 || GET_CODE (XVECEXP (op, 0, 0)) != SET
6651 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM
6652 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG)
6653 return 0;
6654
6655 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
6656 dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);
6657
6658 if (src_regno > 31
e2c953b6 6659 || count != 32 - (int) src_regno)
9ebbca7d
GK
6660 return 0;
6661
258bfae2 6662 if (LEGITIMATE_INDIRECT_ADDRESS_P (dest_addr, 0))
9ebbca7d
GK
6663 {
6664 offset = 0;
6665 base_regno = REGNO (dest_addr);
6666 if (base_regno == 0)
6667 return 0;
6668 }
258bfae2 6669 else if (LEGITIMATE_OFFSET_ADDRESS_P (SImode, dest_addr, 0))
9ebbca7d
GK
6670 {
6671 offset = INTVAL (XEXP (dest_addr, 1));
6672 base_regno = REGNO (XEXP (dest_addr, 0));
6673 }
6674 else
6675 return 0;
6676
6677 for (i = 0; i < count; i++)
6678 {
6679 rtx elt = XVECEXP (op, 0, i);
6680 rtx newaddr;
6681 rtx addr_reg;
6682 HOST_WIDE_INT newoffset;
6683
6684 if (GET_CODE (elt) != SET
6685 || GET_CODE (SET_SRC (elt)) != REG
6686 || GET_MODE (SET_SRC (elt)) != SImode
6687 || REGNO (SET_SRC (elt)) != src_regno + i
6688 || GET_CODE (SET_DEST (elt)) != MEM
6689 || GET_MODE (SET_DEST (elt)) != SImode)
6690 return 0;
6691 newaddr = XEXP (SET_DEST (elt), 0);
258bfae2 6692 if (LEGITIMATE_INDIRECT_ADDRESS_P (newaddr, 0))
9ebbca7d
GK
6693 {
6694 newoffset = 0;
6695 addr_reg = newaddr;
6696 }
258bfae2 6697 else if (LEGITIMATE_OFFSET_ADDRESS_P (SImode, newaddr, 0))
9ebbca7d
GK
6698 {
6699 addr_reg = XEXP (newaddr, 0);
6700 newoffset = INTVAL (XEXP (newaddr, 1));
6701 }
6702 else
6703 return 0;
6704 if (REGNO (addr_reg) != base_regno
6705 || newoffset != offset + 4 * i)
6706 return 0;
6707 }
6708
6709 return 1;
6710}
9878760c 6711\f
a4f6c312
SS
6712/* A validation routine: say whether CODE, a condition code, and MODE
6713 match. The other alternatives either don't make sense or should
6714 never be generated. */
39a10a29 6715
39a10a29
GK
6716static void
6717validate_condition_mode (code, mode)
6718 enum rtx_code code;
6719 enum machine_mode mode;
6720{
6721 if (GET_RTX_CLASS (code) != '<'
6722 || GET_MODE_CLASS (mode) != MODE_CC)
6723 abort ();
6724
6725 /* These don't make sense. */
6726 if ((code == GT || code == LT || code == GE || code == LE)
6727 && mode == CCUNSmode)
6728 abort ();
6729
6730 if ((code == GTU || code == LTU || code == GEU || code == LEU)
6731 && mode != CCUNSmode)
6732 abort ();
6733
6734 if (mode != CCFPmode
6735 && (code == ORDERED || code == UNORDERED
6736 || code == UNEQ || code == LTGT
6737 || code == UNGT || code == UNLT
6738 || code == UNGE || code == UNLE))
a4f6c312 6739 abort ();
39a10a29 6740
de6c5979 6741 /* These should never be generated except for
ad72b533 6742 flag_unsafe_math_optimizations and flag_finite_math_only. */
39a10a29 6743 if (mode == CCFPmode
de6c5979 6744 && ! flag_unsafe_math_optimizations
ad72b533 6745 && ! flag_finite_math_only
39a10a29
GK
6746 && (code == LE || code == GE
6747 || code == UNEQ || code == LTGT
6748 || code == UNGT || code == UNLT))
6749 abort ();
6750
6751 /* These are invalid; the information is not there. */
6752 if (mode == CCEQmode
6753 && code != EQ && code != NE)
6754 abort ();
6755}
6756
9878760c
RK
6757/* Return 1 if OP is a comparison operation that is valid for a branch insn.
6758 We only check the opcode against the mode of the CC value here. */
6759
6760int
6761branch_comparison_operator (op, mode)
592696dd 6762 rtx op;
296b8152 6763 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
6764{
6765 enum rtx_code code = GET_CODE (op);
6766 enum machine_mode cc_mode;
6767
6768 if (GET_RTX_CLASS (code) != '<')
6769 return 0;
6770
6771 cc_mode = GET_MODE (XEXP (op, 0));
6772 if (GET_MODE_CLASS (cc_mode) != MODE_CC)
6773 return 0;
6774
39a10a29 6775 validate_condition_mode (code, cc_mode);
9878760c 6776
39a10a29
GK
6777 return 1;
6778}
6779
6780/* Return 1 if OP is a comparison operation that is valid for a branch
6781 insn and which is true if the corresponding bit in the CC register
6782 is set. */
6783
6784int
6785branch_positive_comparison_operator (op, mode)
592696dd 6786 rtx op;
39a10a29
GK
6787 enum machine_mode mode;
6788{
6789 enum rtx_code code;
6790
6791 if (! branch_comparison_operator (op, mode))
9878760c
RK
6792 return 0;
6793
39a10a29
GK
6794 code = GET_CODE (op);
6795 return (code == EQ || code == LT || code == GT
a3170dc6 6796 || (TARGET_SPE && TARGET_HARD_FLOAT && !TARGET_FPRS && code == NE)
39a10a29
GK
6797 || code == LTU || code == GTU
6798 || code == UNORDERED);
9878760c
RK
6799}
6800
6801/* Return 1 if OP is a comparison operation that is valid for an scc insn.
6802 We check the opcode against the mode of the CC value and disallow EQ or
6803 NE comparisons for integers. */
6804
6805int
6806scc_comparison_operator (op, mode)
592696dd 6807 rtx op;
9878760c
RK
6808 enum machine_mode mode;
6809{
6810 enum rtx_code code = GET_CODE (op);
6811 enum machine_mode cc_mode;
6812
6813 if (GET_MODE (op) != mode && mode != VOIDmode)
6814 return 0;
6815
6816 if (GET_RTX_CLASS (code) != '<')
6817 return 0;
6818
6819 cc_mode = GET_MODE (XEXP (op, 0));
6820 if (GET_MODE_CLASS (cc_mode) != MODE_CC)
6821 return 0;
6822
39a10a29 6823 validate_condition_mode (code, cc_mode);
9878760c 6824
39a10a29 6825 if (code == NE && cc_mode != CCFPmode)
c5defebb
RK
6826 return 0;
6827
9878760c
RK
6828 return 1;
6829}
e0cd0770
JC
6830
6831int
6832trap_comparison_operator (op, mode)
6833 rtx op;
6834 enum machine_mode mode;
6835{
6836 if (mode != VOIDmode && mode != GET_MODE (op))
6837 return 0;
39a10a29 6838 return GET_RTX_CLASS (GET_CODE (op)) == '<';
e0cd0770 6839}
dfbdccdb
GK
6840
6841int
6842boolean_operator (op, mode)
6843 rtx op;
6844 enum machine_mode mode ATTRIBUTE_UNUSED;
6845{
6846 enum rtx_code code = GET_CODE (op);
6847 return (code == AND || code == IOR || code == XOR);
6848}
1d328b19
GK
6849
6850int
6851boolean_or_operator (op, mode)
6852 rtx op;
6853 enum machine_mode mode ATTRIBUTE_UNUSED;
6854{
6855 enum rtx_code code = GET_CODE (op);
6856 return (code == IOR || code == XOR);
6857}
50a0b056
GK
6858
6859int
6860min_max_operator (op, mode)
6861 rtx op;
6862 enum machine_mode mode ATTRIBUTE_UNUSED;
6863{
6864 enum rtx_code code = GET_CODE (op);
6865 return (code == SMIN || code == SMAX || code == UMIN || code == UMAX);
6866}
9878760c
RK
6867\f
6868/* Return 1 if ANDOP is a mask that has no bits on that are not in the
6869 mask required to convert the result of a rotate insn into a shift
b1765bde 6870 left insn of SHIFTOP bits. Both are known to be SImode CONST_INT. */
9878760c
RK
6871
6872int
6873includes_lshift_p (shiftop, andop)
592696dd
SS
6874 rtx shiftop;
6875 rtx andop;
9878760c 6876{
e2c953b6
DE
6877 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
6878
6879 shift_mask <<= INTVAL (shiftop);
9878760c 6880
b1765bde 6881 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
9878760c
RK
6882}
6883
6884/* Similar, but for right shift. */
6885
6886int
6887includes_rshift_p (shiftop, andop)
592696dd
SS
6888 rtx shiftop;
6889 rtx andop;
9878760c 6890{
a7653a2c 6891 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
9878760c
RK
6892
6893 shift_mask >>= INTVAL (shiftop);
6894
b1765bde 6895 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
e2c953b6
DE
6896}
6897
c5059423
AM
6898/* Return 1 if ANDOP is a mask suitable for use with an rldic insn
6899 to perform a left shift. It must have exactly SHIFTOP least
6900 signifigant 0's, then one or more 1's, then zero or more 0's. */
e2c953b6
DE
6901
6902int
c5059423 6903includes_rldic_lshift_p (shiftop, andop)
592696dd
SS
6904 rtx shiftop;
6905 rtx andop;
e2c953b6 6906{
c5059423
AM
6907 if (GET_CODE (andop) == CONST_INT)
6908 {
02071907 6909 HOST_WIDE_INT c, lsb, shift_mask;
e2c953b6 6910
c5059423 6911 c = INTVAL (andop);
02071907 6912 if (c == 0 || c == ~0)
c5059423 6913 return 0;
e2c953b6 6914
02071907 6915 shift_mask = ~0;
c5059423
AM
6916 shift_mask <<= INTVAL (shiftop);
6917
6918 /* Find the least signifigant one bit. */
6919 lsb = c & -c;
6920
6921 /* It must coincide with the LSB of the shift mask. */
6922 if (-lsb != shift_mask)
6923 return 0;
e2c953b6 6924
c5059423
AM
6925 /* Invert to look for the next transition (if any). */
6926 c = ~c;
6927
6928 /* Remove the low group of ones (originally low group of zeros). */
6929 c &= -lsb;
6930
6931 /* Again find the lsb, and check we have all 1's above. */
6932 lsb = c & -c;
6933 return c == -lsb;
6934 }
6935 else if (GET_CODE (andop) == CONST_DOUBLE
6936 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
6937 {
02071907
AM
6938 HOST_WIDE_INT low, high, lsb;
6939 HOST_WIDE_INT shift_mask_low, shift_mask_high;
c5059423
AM
6940
6941 low = CONST_DOUBLE_LOW (andop);
6942 if (HOST_BITS_PER_WIDE_INT < 64)
6943 high = CONST_DOUBLE_HIGH (andop);
6944
6945 if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
02071907 6946 || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
c5059423
AM
6947 return 0;
6948
6949 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
6950 {
02071907 6951 shift_mask_high = ~0;
c5059423
AM
6952 if (INTVAL (shiftop) > 32)
6953 shift_mask_high <<= INTVAL (shiftop) - 32;
6954
6955 lsb = high & -high;
6956
6957 if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
6958 return 0;
6959
6960 high = ~high;
6961 high &= -lsb;
6962
6963 lsb = high & -high;
6964 return high == -lsb;
6965 }
6966
02071907 6967 shift_mask_low = ~0;
c5059423
AM
6968 shift_mask_low <<= INTVAL (shiftop);
6969
6970 lsb = low & -low;
6971
6972 if (-lsb != shift_mask_low)
6973 return 0;
6974
6975 if (HOST_BITS_PER_WIDE_INT < 64)
6976 high = ~high;
6977 low = ~low;
6978 low &= -lsb;
6979
6980 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
6981 {
6982 lsb = high & -high;
6983 return high == -lsb;
6984 }
6985
6986 lsb = low & -low;
6987 return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
6988 }
6989 else
6990 return 0;
6991}
e2c953b6 6992
c5059423
AM
6993/* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
6994 to perform a left shift. It must have SHIFTOP or more least
6995 signifigant 0's, with the remainder of the word 1's. */
e2c953b6 6996
c5059423
AM
6997int
6998includes_rldicr_lshift_p (shiftop, andop)
592696dd
SS
6999 rtx shiftop;
7000 rtx andop;
c5059423 7001{
e2c953b6 7002 if (GET_CODE (andop) == CONST_INT)
c5059423 7003 {
02071907 7004 HOST_WIDE_INT c, lsb, shift_mask;
c5059423 7005
02071907 7006 shift_mask = ~0;
c5059423
AM
7007 shift_mask <<= INTVAL (shiftop);
7008 c = INTVAL (andop);
7009
7010 /* Find the least signifigant one bit. */
7011 lsb = c & -c;
7012
7013 /* It must be covered by the shift mask.
a4f6c312 7014 This test also rejects c == 0. */
c5059423
AM
7015 if ((lsb & shift_mask) == 0)
7016 return 0;
7017
7018 /* Check we have all 1's above the transition, and reject all 1's. */
7019 return c == -lsb && lsb != 1;
7020 }
7021 else if (GET_CODE (andop) == CONST_DOUBLE
7022 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
7023 {
02071907 7024 HOST_WIDE_INT low, lsb, shift_mask_low;
c5059423
AM
7025
7026 low = CONST_DOUBLE_LOW (andop);
7027
7028 if (HOST_BITS_PER_WIDE_INT < 64)
7029 {
02071907 7030 HOST_WIDE_INT high, shift_mask_high;
c5059423
AM
7031
7032 high = CONST_DOUBLE_HIGH (andop);
7033
7034 if (low == 0)
7035 {
02071907 7036 shift_mask_high = ~0;
c5059423
AM
7037 if (INTVAL (shiftop) > 32)
7038 shift_mask_high <<= INTVAL (shiftop) - 32;
7039
7040 lsb = high & -high;
7041
7042 if ((lsb & shift_mask_high) == 0)
7043 return 0;
7044
7045 return high == -lsb;
7046 }
7047 if (high != ~0)
7048 return 0;
7049 }
7050
02071907 7051 shift_mask_low = ~0;
c5059423
AM
7052 shift_mask_low <<= INTVAL (shiftop);
7053
7054 lsb = low & -low;
7055
7056 if ((lsb & shift_mask_low) == 0)
7057 return 0;
7058
7059 return low == -lsb && lsb != 1;
7060 }
e2c953b6 7061 else
c5059423 7062 return 0;
9878760c 7063}
35068b43
RK
7064
7065/* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
7066 for lfq and stfq insns.
7067
7068 Note reg1 and reg2 *must* be hard registers. To be sure we will
7069 abort if we are passed pseudo registers. */
7070
7071int
7072registers_ok_for_quad_peep (reg1, reg2)
7073 rtx reg1, reg2;
7074{
7075 /* We might have been passed a SUBREG. */
7076 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
7077 return 0;
7078
7079 return (REGNO (reg1) == REGNO (reg2) - 1);
7080}
7081
a4f6c312
SS
7082/* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
7083 addr1 and addr2 must be in consecutive memory locations
7084 (addr2 == addr1 + 8). */
35068b43
RK
7085
7086int
7087addrs_ok_for_quad_peep (addr1, addr2)
592696dd
SS
7088 rtx addr1;
7089 rtx addr2;
35068b43 7090{
e2c953b6 7091 unsigned int reg1;
35068b43
RK
7092 int offset1;
7093
7094 /* Extract an offset (if used) from the first addr. */
7095 if (GET_CODE (addr1) == PLUS)
7096 {
7097 /* If not a REG, return zero. */
7098 if (GET_CODE (XEXP (addr1, 0)) != REG)
7099 return 0;
7100 else
7101 {
7102 reg1 = REGNO (XEXP (addr1, 0));
7103 /* The offset must be constant! */
7104 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
7105 return 0;
7106 offset1 = INTVAL (XEXP (addr1, 1));
7107 }
7108 }
7109 else if (GET_CODE (addr1) != REG)
7110 return 0;
7111 else
7112 {
7113 reg1 = REGNO (addr1);
7114 /* This was a simple (mem (reg)) expression. Offset is 0. */
7115 offset1 = 0;
7116 }
7117
acad7ed3 7118 /* Make sure the second address is a (mem (plus (reg) (const_int))). */
35068b43
RK
7119 if (GET_CODE (addr2) != PLUS)
7120 return 0;
7121
7122 if (GET_CODE (XEXP (addr2, 0)) != REG
7123 || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
7124 return 0;
7125
7126 if (reg1 != REGNO (XEXP (addr2, 0)))
7127 return 0;
7128
7129 /* The offset for the second addr must be 8 more than the first addr. */
7130 if (INTVAL (XEXP (addr2, 1)) != offset1 + 8)
7131 return 0;
7132
7133 /* All the tests passed. addr1 and addr2 are valid for lfq or stfq
7134 instructions. */
7135 return 1;
7136}
9878760c
RK
7137\f
7138/* Return the register class of a scratch register needed to copy IN into
7139 or out of a register in CLASS in MODE. If it can be done directly,
7140 NO_REGS is returned. */
7141
7142enum reg_class
7143secondary_reload_class (class, mode, in)
7144 enum reg_class class;
296b8152 7145 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
7146 rtx in;
7147{
5accd822 7148 int regno;
9878760c 7149
46fad5b7
DJ
7150 if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN && flag_pic))
7151 {
7152 /* We cannot copy a symbolic operand directly into anything
7153 other than BASE_REGS for TARGET_ELF. So indicate that a
7154 register from BASE_REGS is needed as an intermediate
7155 register.
7156
7157 On Darwin, pic addresses require a load from memory, which
7158 needs a base register. */
7159 if (class != BASE_REGS
7160 && (GET_CODE (in) == SYMBOL_REF
7161 || GET_CODE (in) == HIGH
7162 || GET_CODE (in) == LABEL_REF
7163 || GET_CODE (in) == CONST))
7164 return BASE_REGS;
7165 }
e7b7998a 7166
5accd822
DE
7167 if (GET_CODE (in) == REG)
7168 {
7169 regno = REGNO (in);
7170 if (regno >= FIRST_PSEUDO_REGISTER)
7171 {
7172 regno = true_regnum (in);
7173 if (regno >= FIRST_PSEUDO_REGISTER)
7174 regno = -1;
7175 }
7176 }
7177 else if (GET_CODE (in) == SUBREG)
7178 {
7179 regno = true_regnum (in);
7180 if (regno >= FIRST_PSEUDO_REGISTER)
7181 regno = -1;
7182 }
7183 else
7184 regno = -1;
7185
9878760c
RK
7186 /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
7187 into anything. */
7188 if (class == GENERAL_REGS || class == BASE_REGS
7189 || (regno >= 0 && INT_REGNO_P (regno)))
7190 return NO_REGS;
7191
7192 /* Constants, memory, and FP registers can go into FP registers. */
7193 if ((regno == -1 || FP_REGNO_P (regno))
7194 && (class == FLOAT_REGS || class == NON_SPECIAL_REGS))
7195 return NO_REGS;
7196
0ac081f6
AH
7197 /* Memory, and AltiVec registers can go into AltiVec registers. */
7198 if ((regno == -1 || ALTIVEC_REGNO_P (regno))
7199 && class == ALTIVEC_REGS)
7200 return NO_REGS;
7201
9878760c
RK
7202 /* We can copy among the CR registers. */
7203 if ((class == CR_REGS || class == CR0_REGS)
7204 && regno >= 0 && CR_REGNO_P (regno))
7205 return NO_REGS;
7206
7207 /* Otherwise, we need GENERAL_REGS. */
7208 return GENERAL_REGS;
7209}
7210\f
7211/* Given a comparison operation, return the bit number in CCR to test. We
7212 know this is a valid comparison.
7213
7214 SCC_P is 1 if this is for an scc. That means that %D will have been
7215 used instead of %C, so the bits will be in different places.
7216
b4ac57ab 7217 Return -1 if OP isn't a valid comparison for some reason. */
9878760c
RK
7218
7219int
7220ccr_bit (op, scc_p)
592696dd 7221 rtx op;
9878760c
RK
7222 int scc_p;
7223{
7224 enum rtx_code code = GET_CODE (op);
7225 enum machine_mode cc_mode;
7226 int cc_regnum;
7227 int base_bit;
9ebbca7d 7228 rtx reg;
9878760c
RK
7229
7230 if (GET_RTX_CLASS (code) != '<')
7231 return -1;
7232
9ebbca7d
GK
7233 reg = XEXP (op, 0);
7234
7235 if (GET_CODE (reg) != REG
7236 || ! CR_REGNO_P (REGNO (reg)))
7237 abort ();
7238
7239 cc_mode = GET_MODE (reg);
7240 cc_regnum = REGNO (reg);
7241 base_bit = 4 * (cc_regnum - CR0_REGNO);
9878760c 7242
39a10a29 7243 validate_condition_mode (code, cc_mode);
c5defebb 7244
9878760c
RK
7245 switch (code)
7246 {
7247 case NE:
a3170dc6
AH
7248 if (TARGET_SPE && TARGET_HARD_FLOAT && cc_mode == CCFPmode)
7249 return base_bit + 1;
9878760c
RK
7250 return scc_p ? base_bit + 3 : base_bit + 2;
7251 case EQ:
a3170dc6
AH
7252 if (TARGET_SPE && TARGET_HARD_FLOAT && cc_mode == CCFPmode)
7253 return base_bit + 1;
9878760c 7254 return base_bit + 2;
1c882ea4 7255 case GT: case GTU: case UNLE:
9878760c 7256 return base_bit + 1;
1c882ea4 7257 case LT: case LTU: case UNGE:
9878760c 7258 return base_bit;
1c882ea4
GK
7259 case ORDERED: case UNORDERED:
7260 return base_bit + 3;
9878760c
RK
7261
7262 case GE: case GEU:
39a10a29 7263 /* If scc, we will have done a cror to put the bit in the
9878760c
RK
7264 unordered position. So test that bit. For integer, this is ! LT
7265 unless this is an scc insn. */
39a10a29 7266 return scc_p ? base_bit + 3 : base_bit;
9878760c
RK
7267
7268 case LE: case LEU:
39a10a29 7269 return scc_p ? base_bit + 3 : base_bit + 1;
1c882ea4 7270
9878760c
RK
7271 default:
7272 abort ();
7273 }
7274}
1ff7789b 7275\f
8d30c4ee 7276/* Return the GOT register. */
1ff7789b
MM
7277
7278struct rtx_def *
7279rs6000_got_register (value)
5f59ecb7 7280 rtx value ATTRIBUTE_UNUSED;
1ff7789b 7281{
a4f6c312
SS
7282 /* The second flow pass currently (June 1999) can't update
7283 regs_ever_live without disturbing other parts of the compiler, so
7284 update it here to make the prolog/epilogue code happy. */
1db02437
FS
7285 if (no_new_pseudos && ! regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM])
7286 regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
1ff7789b 7287
8d30c4ee 7288 current_function_uses_pic_offset_table = 1;
3cb999d8 7289
1ff7789b
MM
7290 return pic_offset_table_rtx;
7291}
a7df97e6 7292\f
e2500fed
GK
7293/* Function to init struct machine_function.
7294 This will be called, via a pointer variable,
7295 from push_function_context. */
a7df97e6 7296
e2500fed
GK
7297static struct machine_function *
7298rs6000_init_machine_status ()
a7df97e6 7299{
e2500fed 7300 return ggc_alloc_cleared (sizeof (machine_function));
a7df97e6 7301}
9878760c 7302\f
0ba1b2ff
AM
7303/* These macros test for integers and extract the low-order bits. */
7304#define INT_P(X) \
7305((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE) \
7306 && GET_MODE (X) == VOIDmode)
7307
7308#define INT_LOWPART(X) \
7309 (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
7310
7311int
7312extract_MB (op)
7313 rtx op;
7314{
7315 int i;
7316 unsigned long val = INT_LOWPART (op);
7317
7318 /* If the high bit is zero, the value is the first 1 bit we find
7319 from the left. */
7320 if ((val & 0x80000000) == 0)
7321 {
7322 if ((val & 0xffffffff) == 0)
7323 abort ();
7324
7325 i = 1;
7326 while (((val <<= 1) & 0x80000000) == 0)
7327 ++i;
7328 return i;
7329 }
7330
7331 /* If the high bit is set and the low bit is not, or the mask is all
7332 1's, the value is zero. */
7333 if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
7334 return 0;
7335
7336 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
7337 from the right. */
7338 i = 31;
7339 while (((val >>= 1) & 1) != 0)
7340 --i;
7341
7342 return i;
7343}
7344
7345int
7346extract_ME (op)
7347 rtx op;
7348{
7349 int i;
7350 unsigned long val = INT_LOWPART (op);
7351
7352 /* If the low bit is zero, the value is the first 1 bit we find from
7353 the right. */
7354 if ((val & 1) == 0)
7355 {
7356 if ((val & 0xffffffff) == 0)
7357 abort ();
7358
7359 i = 30;
7360 while (((val >>= 1) & 1) == 0)
7361 --i;
7362
7363 return i;
7364 }
7365
7366 /* If the low bit is set and the high bit is not, or the mask is all
7367 1's, the value is 31. */
7368 if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
7369 return 31;
7370
7371 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
7372 from the left. */
7373 i = 0;
7374 while (((val <<= 1) & 0x80000000) != 0)
7375 ++i;
7376
7377 return i;
7378}
7379
9878760c
RK
7380/* Print an operand. Recognize special options, documented below. */
7381
38c1f2d7 7382#if TARGET_ELF
d9407988 7383#define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
8fbd2dc7 7384#define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
ba5e43aa
MM
7385#else
7386#define SMALL_DATA_RELOC "sda21"
8fbd2dc7 7387#define SMALL_DATA_REG 0
ba5e43aa
MM
7388#endif
7389
9878760c
RK
7390void
7391print_operand (file, x, code)
7392 FILE *file;
7393 rtx x;
9ebbca7d 7394 int code;
9878760c
RK
7395{
7396 int i;
a260abc9 7397 HOST_WIDE_INT val;
0ba1b2ff 7398 unsigned HOST_WIDE_INT uval;
9878760c
RK
7399
7400 switch (code)
7401 {
a8b3aeda 7402 case '.':
a85d226b
RK
7403 /* Write out an instruction after the call which may be replaced
7404 with glue code by the loader. This depends on the AIX version. */
7405 asm_fprintf (file, RS6000_CALL_GLUE);
a8b3aeda
RK
7406 return;
7407
81eace42
GK
7408 /* %a is output_address. */
7409
9854d9ed
RK
7410 case 'A':
7411 /* If X is a constant integer whose low-order 5 bits are zero,
7412 write 'l'. Otherwise, write 'r'. This is a kludge to fix a bug
76229ac8 7413 in the AIX assembler where "sri" with a zero shift count
20e26713 7414 writes a trash instruction. */
9854d9ed 7415 if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
76229ac8 7416 putc ('l', file);
9854d9ed 7417 else
76229ac8 7418 putc ('r', file);
9854d9ed
RK
7419 return;
7420
7421 case 'b':
e2c953b6
DE
7422 /* If constant, low-order 16 bits of constant, unsigned.
7423 Otherwise, write normally. */
7424 if (INT_P (x))
7425 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
7426 else
7427 print_operand (file, x, 0);
cad12a8d
RK
7428 return;
7429
a260abc9
DE
7430 case 'B':
7431 /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
7432 for 64-bit mask direction. */
296b8152 7433 putc (((INT_LOWPART(x) & 1) == 0 ? 'r' : 'l'), file);
a238cd8b 7434 return;
a260abc9 7435
81eace42
GK
7436 /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
7437 output_operand. */
7438
9854d9ed 7439 case 'D':
39a10a29
GK
7440 /* There used to be a comment for 'C' reading "This is an
7441 optional cror needed for certain floating-point
7442 comparisons. Otherwise write nothing." */
7443
9854d9ed
RK
7444 /* Similar, except that this is for an scc, so we must be able to
7445 encode the test in a single bit that is one. We do the above
7446 for any LE, GE, GEU, or LEU and invert the bit for NE. */
7447 if (GET_CODE (x) == LE || GET_CODE (x) == GE
7448 || GET_CODE (x) == LEU || GET_CODE (x) == GEU)
7449 {
9ebbca7d 7450 int base_bit = 4 * (REGNO (XEXP (x, 0)) - CR0_REGNO);
9854d9ed
RK
7451
7452 fprintf (file, "cror %d,%d,%d\n\t", base_bit + 3,
7453 base_bit + 2,
7454 base_bit + (GET_CODE (x) == GE || GET_CODE (x) == GEU));
7455 }
7456
7457 else if (GET_CODE (x) == NE)
7458 {
9ebbca7d 7459 int base_bit = 4 * (REGNO (XEXP (x, 0)) - CR0_REGNO);
9854d9ed
RK
7460
7461 fprintf (file, "crnor %d,%d,%d\n\t", base_bit + 3,
7462 base_bit + 2, base_bit + 2);
7463 }
a3170dc6
AH
7464 else if (TARGET_SPE && TARGET_HARD_FLOAT
7465 && GET_CODE (x) == EQ
7466 && GET_MODE (XEXP (x, 0)) == CCFPmode)
7467 {
7468 int base_bit = 4 * (REGNO (XEXP (x, 0)) - CR0_REGNO);
7469
7470 fprintf (file, "crnor %d,%d,%d\n\t", base_bit + 1,
7471 base_bit + 1, base_bit + 1);
7472 }
9854d9ed
RK
7473 return;
7474
7475 case 'E':
39a10a29 7476 /* X is a CR register. Print the number of the EQ bit of the CR */
9854d9ed
RK
7477 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
7478 output_operand_lossage ("invalid %%E value");
78fbdbf7 7479 else
39a10a29 7480 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
a85d226b 7481 return;
9854d9ed
RK
7482
7483 case 'f':
7484 /* X is a CR register. Print the shift count needed to move it
7485 to the high-order four bits. */
7486 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
7487 output_operand_lossage ("invalid %%f value");
7488 else
9ebbca7d 7489 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
9854d9ed
RK
7490 return;
7491
7492 case 'F':
7493 /* Similar, but print the count for the rotate in the opposite
7494 direction. */
7495 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
7496 output_operand_lossage ("invalid %%F value");
7497 else
9ebbca7d 7498 fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
9854d9ed
RK
7499 return;
7500
7501 case 'G':
7502 /* X is a constant integer. If it is negative, print "m",
43aa4e05 7503 otherwise print "z". This is to make an aze or ame insn. */
9854d9ed
RK
7504 if (GET_CODE (x) != CONST_INT)
7505 output_operand_lossage ("invalid %%G value");
7506 else if (INTVAL (x) >= 0)
76229ac8 7507 putc ('z', file);
9854d9ed 7508 else
76229ac8 7509 putc ('m', file);
9854d9ed 7510 return;
e2c953b6 7511
9878760c 7512 case 'h':
a4f6c312
SS
7513 /* If constant, output low-order five bits. Otherwise, write
7514 normally. */
9878760c 7515 if (INT_P (x))
5f59ecb7 7516 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
9878760c
RK
7517 else
7518 print_operand (file, x, 0);
7519 return;
7520
64305719 7521 case 'H':
a4f6c312
SS
7522 /* If constant, output low-order six bits. Otherwise, write
7523 normally. */
64305719 7524 if (INT_P (x))
5f59ecb7 7525 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
64305719
DE
7526 else
7527 print_operand (file, x, 0);
7528 return;
7529
9854d9ed
RK
7530 case 'I':
7531 /* Print `i' if this is a constant, else nothing. */
9878760c 7532 if (INT_P (x))
76229ac8 7533 putc ('i', file);
9878760c
RK
7534 return;
7535
9854d9ed
RK
7536 case 'j':
7537 /* Write the bit number in CCR for jump. */
7538 i = ccr_bit (x, 0);
7539 if (i == -1)
7540 output_operand_lossage ("invalid %%j code");
9878760c 7541 else
9854d9ed 7542 fprintf (file, "%d", i);
9878760c
RK
7543 return;
7544
9854d9ed
RK
7545 case 'J':
7546 /* Similar, but add one for shift count in rlinm for scc and pass
7547 scc flag to `ccr_bit'. */
7548 i = ccr_bit (x, 1);
7549 if (i == -1)
7550 output_operand_lossage ("invalid %%J code");
7551 else
a0466a68
RK
7552 /* If we want bit 31, write a shift count of zero, not 32. */
7553 fprintf (file, "%d", i == 31 ? 0 : i + 1);
9878760c
RK
7554 return;
7555
9854d9ed
RK
7556 case 'k':
7557 /* X must be a constant. Write the 1's complement of the
7558 constant. */
9878760c 7559 if (! INT_P (x))
9854d9ed 7560 output_operand_lossage ("invalid %%k value");
e2c953b6
DE
7561 else
7562 fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
9878760c
RK
7563 return;
7564
81eace42 7565 case 'K':
9ebbca7d
GK
7566 /* X must be a symbolic constant on ELF. Write an
7567 expression suitable for an 'addi' that adds in the low 16
7568 bits of the MEM. */
7569 if (GET_CODE (x) != CONST)
7570 {
7571 print_operand_address (file, x);
7572 fputs ("@l", file);
7573 }
7574 else
7575 {
7576 if (GET_CODE (XEXP (x, 0)) != PLUS
7577 || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
7578 && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
7579 || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
53cd5d6c 7580 output_operand_lossage ("invalid %%K value");
9ebbca7d
GK
7581 print_operand_address (file, XEXP (XEXP (x, 0), 0));
7582 fputs ("@l", file);
ed8d2920
MM
7583 /* For GNU as, there must be a non-alphanumeric character
7584 between 'l' and the number. The '-' is added by
7585 print_operand() already. */
7586 if (INTVAL (XEXP (XEXP (x, 0), 1)) >= 0)
7587 fputs ("+", file);
9ebbca7d
GK
7588 print_operand (file, XEXP (XEXP (x, 0), 1), 0);
7589 }
81eace42
GK
7590 return;
7591
7592 /* %l is output_asm_label. */
9ebbca7d 7593
9854d9ed
RK
7594 case 'L':
7595 /* Write second word of DImode or DFmode reference. Works on register
7596 or non-indexed memory only. */
7597 if (GET_CODE (x) == REG)
5ebfb2ba 7598 fprintf (file, "%s", reg_names[REGNO (x) + 1]);
9854d9ed
RK
7599 else if (GET_CODE (x) == MEM)
7600 {
7601 /* Handle possible auto-increment. Since it is pre-increment and
1427100a 7602 we have already done it, we can just use an offset of word. */
9854d9ed
RK
7603 if (GET_CODE (XEXP (x, 0)) == PRE_INC
7604 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
ed8908e7
RK
7605 output_address (plus_constant (XEXP (XEXP (x, 0), 0),
7606 UNITS_PER_WORD));
9854d9ed 7607 else
d7624dc0
RK
7608 output_address (XEXP (adjust_address_nv (x, SImode,
7609 UNITS_PER_WORD),
7610 0));
ed8908e7 7611
ba5e43aa 7612 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
7613 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
7614 reg_names[SMALL_DATA_REG]);
9854d9ed 7615 }
9878760c 7616 return;
9854d9ed 7617
9878760c
RK
7618 case 'm':
7619 /* MB value for a mask operand. */
b1765bde 7620 if (! mask_operand (x, SImode))
9878760c
RK
7621 output_operand_lossage ("invalid %%m value");
7622
0ba1b2ff 7623 fprintf (file, "%d", extract_MB (x));
9878760c
RK
7624 return;
7625
7626 case 'M':
7627 /* ME value for a mask operand. */
b1765bde 7628 if (! mask_operand (x, SImode))
a260abc9 7629 output_operand_lossage ("invalid %%M value");
9878760c 7630
0ba1b2ff 7631 fprintf (file, "%d", extract_ME (x));
9878760c
RK
7632 return;
7633
81eace42
GK
7634 /* %n outputs the negative of its operand. */
7635
9878760c
RK
7636 case 'N':
7637 /* Write the number of elements in the vector times 4. */
7638 if (GET_CODE (x) != PARALLEL)
7639 output_operand_lossage ("invalid %%N value");
e2c953b6
DE
7640 else
7641 fprintf (file, "%d", XVECLEN (x, 0) * 4);
9878760c
RK
7642 return;
7643
7644 case 'O':
7645 /* Similar, but subtract 1 first. */
7646 if (GET_CODE (x) != PARALLEL)
1427100a 7647 output_operand_lossage ("invalid %%O value");
e2c953b6
DE
7648 else
7649 fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
9878760c
RK
7650 return;
7651
9854d9ed
RK
7652 case 'p':
7653 /* X is a CONST_INT that is a power of two. Output the logarithm. */
7654 if (! INT_P (x)
2bfcf297 7655 || INT_LOWPART (x) < 0
9854d9ed
RK
7656 || (i = exact_log2 (INT_LOWPART (x))) < 0)
7657 output_operand_lossage ("invalid %%p value");
e2c953b6
DE
7658 else
7659 fprintf (file, "%d", i);
9854d9ed
RK
7660 return;
7661
9878760c
RK
7662 case 'P':
7663 /* The operand must be an indirect memory reference. The result
a4f6c312 7664 is the register number. */
9878760c
RK
7665 if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
7666 || REGNO (XEXP (x, 0)) >= 32)
7667 output_operand_lossage ("invalid %%P value");
e2c953b6
DE
7668 else
7669 fprintf (file, "%d", REGNO (XEXP (x, 0)));
9878760c
RK
7670 return;
7671
dfbdccdb
GK
7672 case 'q':
7673 /* This outputs the logical code corresponding to a boolean
7674 expression. The expression may have one or both operands
39a10a29
GK
7675 negated (if one, only the first one). For condition register
7676 logical operations, it will also treat the negated
7677 CR codes as NOTs, but not handle NOTs of them. */
dfbdccdb 7678 {
63bc1d05 7679 const char *const *t = 0;
dfbdccdb
GK
7680 const char *s;
7681 enum rtx_code code = GET_CODE (x);
7682 static const char * const tbl[3][3] = {
7683 { "and", "andc", "nor" },
7684 { "or", "orc", "nand" },
7685 { "xor", "eqv", "xor" } };
7686
7687 if (code == AND)
7688 t = tbl[0];
7689 else if (code == IOR)
7690 t = tbl[1];
7691 else if (code == XOR)
7692 t = tbl[2];
7693 else
7694 output_operand_lossage ("invalid %%q value");
7695
7696 if (GET_CODE (XEXP (x, 0)) != NOT)
7697 s = t[0];
7698 else
7699 {
7700 if (GET_CODE (XEXP (x, 1)) == NOT)
7701 s = t[2];
7702 else
7703 s = t[1];
7704 }
7705
7706 fputs (s, file);
7707 }
7708 return;
7709
9854d9ed
RK
7710 case 'R':
7711 /* X is a CR register. Print the mask for `mtcrf'. */
7712 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
7713 output_operand_lossage ("invalid %%R value");
7714 else
9ebbca7d 7715 fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
9878760c 7716 return;
9854d9ed
RK
7717
7718 case 's':
7719 /* Low 5 bits of 32 - value */
7720 if (! INT_P (x))
7721 output_operand_lossage ("invalid %%s value");
e2c953b6
DE
7722 else
7723 fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
9878760c 7724 return;
9854d9ed 7725
a260abc9 7726 case 'S':
0ba1b2ff 7727 /* PowerPC64 mask position. All 0's is excluded.
a260abc9
DE
7728 CONST_INT 32-bit mask is considered sign-extended so any
7729 transition must occur within the CONST_INT, not on the boundary. */
b1765bde 7730 if (! mask64_operand (x, DImode))
a260abc9
DE
7731 output_operand_lossage ("invalid %%S value");
7732
0ba1b2ff 7733 uval = INT_LOWPART (x);
a260abc9 7734
0ba1b2ff 7735 if (uval & 1) /* Clear Left */
a260abc9 7736 {
0ba1b2ff
AM
7737 uval &= ((unsigned HOST_WIDE_INT) 1 << 63 << 1) - 1;
7738 i = 64;
a260abc9 7739 }
0ba1b2ff 7740 else /* Clear Right */
a260abc9 7741 {
0ba1b2ff
AM
7742 uval = ~uval;
7743 uval &= ((unsigned HOST_WIDE_INT) 1 << 63 << 1) - 1;
7744 i = 63;
a260abc9 7745 }
0ba1b2ff
AM
7746 while (uval != 0)
7747 --i, uval >>= 1;
7748 if (i < 0)
7749 abort ();
7750 fprintf (file, "%d", i);
7751 return;
a260abc9 7752
a3170dc6
AH
7753 case 't':
7754 /* Like 'J' but get to the OVERFLOW/UNORDERED bit. */
7755 if (GET_CODE (x) != REG || GET_MODE (x) != CCmode)
7756 abort ();
7757
7758 /* Bit 3 is OV bit. */
7759 i = 4 * (REGNO (x) - CR0_REGNO) + 3;
7760
7761 /* If we want bit 31, write a shift count of zero, not 32. */
7762 fprintf (file, "%d", i == 31 ? 0 : i + 1);
7763 return;
7764
cccf3bdc
DE
7765 case 'T':
7766 /* Print the symbolic name of a branch target register. */
7767 if (GET_CODE (x) != REG || (REGNO (x) != LINK_REGISTER_REGNUM
7768 && REGNO (x) != COUNT_REGISTER_REGNUM))
7769 output_operand_lossage ("invalid %%T value");
e2c953b6 7770 else if (REGNO (x) == LINK_REGISTER_REGNUM)
cccf3bdc
DE
7771 fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
7772 else
7773 fputs ("ctr", file);
7774 return;
7775
9854d9ed 7776 case 'u':
802a0058 7777 /* High-order 16 bits of constant for use in unsigned operand. */
9854d9ed
RK
7778 if (! INT_P (x))
7779 output_operand_lossage ("invalid %%u value");
e2c953b6
DE
7780 else
7781 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
7782 (INT_LOWPART (x) >> 16) & 0xffff);
9878760c
RK
7783 return;
7784
802a0058
MM
7785 case 'v':
7786 /* High-order 16 bits of constant for use in signed operand. */
7787 if (! INT_P (x))
7788 output_operand_lossage ("invalid %%v value");
e2c953b6 7789 else
134c32f6
DE
7790 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
7791 (INT_LOWPART (x) >> 16) & 0xffff);
7792 return;
802a0058 7793
9854d9ed
RK
7794 case 'U':
7795 /* Print `u' if this has an auto-increment or auto-decrement. */
7796 if (GET_CODE (x) == MEM
7797 && (GET_CODE (XEXP (x, 0)) == PRE_INC
7798 || GET_CODE (XEXP (x, 0)) == PRE_DEC))
76229ac8 7799 putc ('u', file);
9854d9ed 7800 return;
9878760c 7801
e0cd0770
JC
7802 case 'V':
7803 /* Print the trap code for this operand. */
7804 switch (GET_CODE (x))
7805 {
7806 case EQ:
7807 fputs ("eq", file); /* 4 */
7808 break;
7809 case NE:
7810 fputs ("ne", file); /* 24 */
7811 break;
7812 case LT:
7813 fputs ("lt", file); /* 16 */
7814 break;
7815 case LE:
7816 fputs ("le", file); /* 20 */
7817 break;
7818 case GT:
7819 fputs ("gt", file); /* 8 */
7820 break;
7821 case GE:
7822 fputs ("ge", file); /* 12 */
7823 break;
7824 case LTU:
7825 fputs ("llt", file); /* 2 */
7826 break;
7827 case LEU:
7828 fputs ("lle", file); /* 6 */
7829 break;
7830 case GTU:
7831 fputs ("lgt", file); /* 1 */
7832 break;
7833 case GEU:
7834 fputs ("lge", file); /* 5 */
7835 break;
7836 default:
7837 abort ();
7838 }
7839 break;
7840
9854d9ed
RK
7841 case 'w':
7842 /* If constant, low-order 16 bits of constant, signed. Otherwise, write
7843 normally. */
7844 if (INT_P (x))
5f59ecb7
DE
7845 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
7846 ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
9854d9ed
RK
7847 else
7848 print_operand (file, x, 0);
9878760c
RK
7849 return;
7850
9854d9ed 7851 case 'W':
e2c953b6 7852 /* MB value for a PowerPC64 rldic operand. */
e2c953b6
DE
7853 val = (GET_CODE (x) == CONST_INT
7854 ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
7855
7856 if (val < 0)
7857 i = -1;
9854d9ed 7858 else
e2c953b6
DE
7859 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
7860 if ((val <<= 1) < 0)
7861 break;
7862
7863#if HOST_BITS_PER_WIDE_INT == 32
7864 if (GET_CODE (x) == CONST_INT && i >= 0)
7865 i += 32; /* zero-extend high-part was all 0's */
7866 else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
7867 {
7868 val = CONST_DOUBLE_LOW (x);
7869
7870 if (val == 0)
a4f6c312 7871 abort ();
e2c953b6
DE
7872 else if (val < 0)
7873 --i;
7874 else
7875 for ( ; i < 64; i++)
7876 if ((val <<= 1) < 0)
7877 break;
7878 }
7879#endif
7880
7881 fprintf (file, "%d", i + 1);
9854d9ed 7882 return;
9878760c 7883
9854d9ed
RK
7884 case 'X':
7885 if (GET_CODE (x) == MEM
258bfae2 7886 && LEGITIMATE_INDEXED_ADDRESS_P (XEXP (x, 0), 0))
76229ac8 7887 putc ('x', file);
9854d9ed 7888 return;
9878760c 7889
9854d9ed
RK
7890 case 'Y':
7891 /* Like 'L', for third word of TImode */
7892 if (GET_CODE (x) == REG)
5ebfb2ba 7893 fprintf (file, "%s", reg_names[REGNO (x) + 2]);
9854d9ed 7894 else if (GET_CODE (x) == MEM)
9878760c 7895 {
9854d9ed
RK
7896 if (GET_CODE (XEXP (x, 0)) == PRE_INC
7897 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
a54d04b7 7898 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
9854d9ed 7899 else
d7624dc0 7900 output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
ba5e43aa 7901 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
7902 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
7903 reg_names[SMALL_DATA_REG]);
9878760c
RK
7904 }
7905 return;
9854d9ed 7906
9878760c 7907 case 'z':
b4ac57ab
RS
7908 /* X is a SYMBOL_REF. Write out the name preceded by a
7909 period and without any trailing data in brackets. Used for function
4d30c363
MM
7910 names. If we are configured for System V (or the embedded ABI) on
7911 the PowerPC, do not emit the period, since those systems do not use
7912 TOCs and the like. */
9878760c
RK
7913 if (GET_CODE (x) != SYMBOL_REF)
7914 abort ();
7915
b6c9286a
MM
7916 if (XSTR (x, 0)[0] != '.')
7917 {
7918 switch (DEFAULT_ABI)
7919 {
7920 default:
7921 abort ();
7922
7923 case ABI_AIX:
7924 putc ('.', file);
7925 break;
7926
7927 case ABI_V4:
7928 case ABI_AIX_NODESC:
ee890fe2 7929 case ABI_DARWIN:
b6c9286a 7930 break;
b6c9286a
MM
7931 }
7932 }
54ee9799
DE
7933#if TARGET_AIX
7934 RS6000_OUTPUT_BASENAME (file, XSTR (x, 0));
7935#else
9ebbca7d 7936 assemble_name (file, XSTR (x, 0));
54ee9799 7937#endif
9878760c
RK
7938 return;
7939
9854d9ed
RK
7940 case 'Z':
7941 /* Like 'L', for last word of TImode. */
7942 if (GET_CODE (x) == REG)
5ebfb2ba 7943 fprintf (file, "%s", reg_names[REGNO (x) + 3]);
9854d9ed
RK
7944 else if (GET_CODE (x) == MEM)
7945 {
7946 if (GET_CODE (XEXP (x, 0)) == PRE_INC
7947 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
a54d04b7 7948 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
9854d9ed 7949 else
d7624dc0 7950 output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
ba5e43aa 7951 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
7952 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
7953 reg_names[SMALL_DATA_REG]);
9854d9ed 7954 }
5c23c401 7955 return;
0ac081f6 7956
a3170dc6 7957 /* Print AltiVec or SPE memory operand. */
0ac081f6
AH
7958 case 'y':
7959 {
7960 rtx tmp;
7961
7962 if (GET_CODE (x) != MEM)
7963 abort ();
7964
7965 tmp = XEXP (x, 0);
7966
a3170dc6
AH
7967 if (TARGET_SPE)
7968 {
7969 /* Handle [reg]. */
7970 if (GET_CODE (tmp) == REG)
7971 {
7972 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
7973 break;
7974 }
7975 /* Handle [reg+UIMM]. */
7976 else if (GET_CODE (tmp) == PLUS &&
7977 GET_CODE (XEXP (tmp, 1)) == CONST_INT)
7978 {
7979 int x;
7980
7981 if (GET_CODE (XEXP (tmp, 0)) != REG)
7982 abort ();
7983
7984 x = INTVAL (XEXP (tmp, 1));
7985 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
7986 break;
7987 }
7988
7989 /* Fall through. Must be [reg+reg]. */
7990 }
0ac081f6 7991 if (GET_CODE (tmp) == REG)
c62f2db5 7992 fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
0ac081f6
AH
7993 else if (GET_CODE (tmp) == PLUS && GET_CODE (XEXP (tmp, 1)) == REG)
7994 {
7995 if (REGNO (XEXP (tmp, 0)) == 0)
7996 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
7997 reg_names[ REGNO (XEXP (tmp, 0)) ]);
7998 else
7999 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
8000 reg_names[ REGNO (XEXP (tmp, 1)) ]);
8001 }
8002 else
8003 abort ();
8004 break;
8005 }
9854d9ed 8006
9878760c
RK
8007 case 0:
8008 if (GET_CODE (x) == REG)
8009 fprintf (file, "%s", reg_names[REGNO (x)]);
8010 else if (GET_CODE (x) == MEM)
8011 {
8012 /* We need to handle PRE_INC and PRE_DEC here, since we need to
8013 know the width from the mode. */
8014 if (GET_CODE (XEXP (x, 0)) == PRE_INC)
79ba6d34
MM
8015 fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
8016 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
9878760c 8017 else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
79ba6d34
MM
8018 fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
8019 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
9878760c 8020 else
a54d04b7 8021 output_address (XEXP (x, 0));
9878760c
RK
8022 }
8023 else
a54d04b7 8024 output_addr_const (file, x);
a85d226b 8025 return;
9878760c
RK
8026
8027 default:
8028 output_operand_lossage ("invalid %%xn code");
8029 }
8030}
8031\f
8032/* Print the address of an operand. */
8033
8034void
8035print_operand_address (file, x)
8036 FILE *file;
592696dd 8037 rtx x;
9878760c
RK
8038{
8039 if (GET_CODE (x) == REG)
4697a36c 8040 fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
9ebbca7d
GK
8041 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
8042 || GET_CODE (x) == LABEL_REF)
9878760c
RK
8043 {
8044 output_addr_const (file, x);
ba5e43aa 8045 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
8046 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
8047 reg_names[SMALL_DATA_REG]);
9ebbca7d 8048 else if (TARGET_TOC)
a4f6c312 8049 abort ();
9878760c
RK
8050 }
8051 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
8052 {
8053 if (REGNO (XEXP (x, 0)) == 0)
4697a36c
MM
8054 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
8055 reg_names[ REGNO (XEXP (x, 0)) ]);
9878760c 8056 else
4697a36c
MM
8057 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
8058 reg_names[ REGNO (XEXP (x, 1)) ]);
9878760c
RK
8059 }
8060 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
5f59ecb7
DE
8061 {
8062 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (XEXP (x, 1)));
8063 fprintf (file, "(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
8064 }
3cb999d8
DE
8065#if TARGET_ELF
8066 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
8067 && CONSTANT_P (XEXP (x, 1)))
4697a36c
MM
8068 {
8069 output_addr_const (file, XEXP (x, 1));
8070 fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
8071 }
c859cda6
DJ
8072#endif
8073#if TARGET_MACHO
8074 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
8075 && CONSTANT_P (XEXP (x, 1)))
8076 {
8077 fprintf (file, "lo16(");
8078 output_addr_const (file, XEXP (x, 1));
8079 fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
8080 }
3cb999d8 8081#endif
9ebbca7d
GK
8082 else if (LEGITIMATE_CONSTANT_POOL_ADDRESS_P (x))
8083 {
2bfcf297 8084 if (TARGET_AIX && (!TARGET_ELF || !TARGET_MINIMAL_TOC))
9ebbca7d 8085 {
2bfcf297
DB
8086 rtx contains_minus = XEXP (x, 1);
8087 rtx minus, symref;
8088 const char *name;
9ebbca7d
GK
8089
8090 /* Find the (minus (sym) (toc)) buried in X, and temporarily
a4f6c312 8091 turn it into (sym) for output_addr_const. */
9ebbca7d
GK
8092 while (GET_CODE (XEXP (contains_minus, 0)) != MINUS)
8093 contains_minus = XEXP (contains_minus, 0);
8094
2bfcf297
DB
8095 minus = XEXP (contains_minus, 0);
8096 symref = XEXP (minus, 0);
8097 XEXP (contains_minus, 0) = symref;
8098 if (TARGET_ELF)
8099 {
8100 char *newname;
8101
8102 name = XSTR (symref, 0);
8103 newname = alloca (strlen (name) + sizeof ("@toc"));
8104 strcpy (newname, name);
8105 strcat (newname, "@toc");
8106 XSTR (symref, 0) = newname;
8107 }
8108 output_addr_const (file, XEXP (x, 1));
8109 if (TARGET_ELF)
8110 XSTR (symref, 0) = name;
9ebbca7d
GK
8111 XEXP (contains_minus, 0) = minus;
8112 }
8113 else
8114 output_addr_const (file, XEXP (x, 1));
8115
8116 fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
8117 }
9878760c
RK
8118 else
8119 abort ();
8120}
8121\f
88cad84b 8122/* Target hook for assembling integer objects. The PowerPC version has
301d03af
RS
8123 to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
8124 is defined. It also needs to handle DI-mode objects on 64-bit
8125 targets. */
8126
8127static bool
8128rs6000_assemble_integer (x, size, aligned_p)
8129 rtx x;
8130 unsigned int size;
8131 int aligned_p;
8132{
8133#ifdef RELOCATABLE_NEEDS_FIXUP
8134 /* Special handling for SI values. */
8135 if (size == 4 && aligned_p)
8136 {
8137 extern int in_toc_section PARAMS ((void));
8138 static int recurse = 0;
8139
8140 /* For -mrelocatable, we mark all addresses that need to be fixed up
8141 in the .fixup section. */
8142 if (TARGET_RELOCATABLE
8143 && !in_toc_section ()
8144 && !in_text_section ()
8145 && !recurse
8146 && GET_CODE (x) != CONST_INT
8147 && GET_CODE (x) != CONST_DOUBLE
8148 && CONSTANT_P (x))
8149 {
8150 char buf[256];
8151
8152 recurse = 1;
8153 ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
8154 fixuplabelno++;
8155 ASM_OUTPUT_LABEL (asm_out_file, buf);
8156 fprintf (asm_out_file, "\t.long\t(");
8157 output_addr_const (asm_out_file, x);
8158 fprintf (asm_out_file, ")@fixup\n");
8159 fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
8160 ASM_OUTPUT_ALIGN (asm_out_file, 2);
8161 fprintf (asm_out_file, "\t.long\t");
8162 assemble_name (asm_out_file, buf);
8163 fprintf (asm_out_file, "\n\t.previous\n");
8164 recurse = 0;
8165 return true;
8166 }
8167 /* Remove initial .'s to turn a -mcall-aixdesc function
8168 address into the address of the descriptor, not the function
8169 itself. */
8170 else if (GET_CODE (x) == SYMBOL_REF
8171 && XSTR (x, 0)[0] == '.'
8172 && DEFAULT_ABI == ABI_AIX)
8173 {
8174 const char *name = XSTR (x, 0);
8175 while (*name == '.')
8176 name++;
8177
8178 fprintf (asm_out_file, "\t.long\t%s\n", name);
8179 return true;
8180 }
8181 }
8182#endif /* RELOCATABLE_NEEDS_FIXUP */
8183 return default_assemble_integer (x, size, aligned_p);
8184}
93638d7a
AM
8185
8186#ifdef HAVE_GAS_HIDDEN
8187/* Emit an assembler directive to set symbol visibility for DECL to
8188 VISIBILITY_TYPE. */
8189
5add3202 8190static void
25fdb4dc 8191rs6000_assemble_visibility (decl, vis)
93638d7a 8192 tree decl;
25fdb4dc 8193 int vis;
93638d7a 8194{
93638d7a
AM
8195 /* Functions need to have their entry point symbol visibility set as
8196 well as their descriptor symbol visibility. */
8197 if (DEFAULT_ABI == ABI_AIX && TREE_CODE (decl) == FUNCTION_DECL)
8198 {
25fdb4dc
RH
8199 static const char * const visibility_types[] = {
8200 NULL, "internal", "hidden", "protected"
8201 };
8202
8203 const char *name, *type;
93638d7a
AM
8204
8205 name = ((* targetm.strip_name_encoding)
8206 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
25fdb4dc 8207 type = visibility_types[vis];
93638d7a 8208
25fdb4dc
RH
8209 fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
8210 fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
93638d7a 8211 }
25fdb4dc
RH
8212 else
8213 default_assemble_visibility (decl, vis);
93638d7a
AM
8214}
8215#endif
301d03af 8216\f
39a10a29
GK
8217enum rtx_code
8218rs6000_reverse_condition (mode, code)
8219 enum machine_mode mode;
8220 enum rtx_code code;
8221{
8222 /* Reversal of FP compares takes care -- an ordered compare
8223 becomes an unordered compare and vice versa. */
de40e1df 8224 if (mode == CCFPmode && !flag_unsafe_math_optimizations)
bab6226b 8225 return reverse_condition_maybe_unordered (code);
39a10a29 8226 else
bab6226b 8227 return reverse_condition (code);
39a10a29
GK
8228}
8229
39a10a29
GK
8230/* Generate a compare for CODE. Return a brand-new rtx that
8231 represents the result of the compare. */
a4f6c312 8232
39a10a29
GK
8233static rtx
8234rs6000_generate_compare (code)
8235 enum rtx_code code;
8236{
8237 enum machine_mode comp_mode;
8238 rtx compare_result;
8239
8240 if (rs6000_compare_fp_p)
8241 comp_mode = CCFPmode;
8242 else if (code == GTU || code == LTU
8243 || code == GEU || code == LEU)
8244 comp_mode = CCUNSmode;
8245 else
8246 comp_mode = CCmode;
8247
8248 /* First, the compare. */
8249 compare_result = gen_reg_rtx (comp_mode);
a3170dc6
AH
8250
8251 /* SPE FP compare instructions on the GPRs. Yuck! */
8252 if ((TARGET_SPE && TARGET_HARD_FLOAT) && rs6000_compare_fp_p)
8253 {
8254 rtx cmp, or1, or2, or_result, compare_result2;
8255
8256 switch (code)
8257 {
8258 case EQ:
8259 case UNEQ:
8260 case NE:
8261 case LTGT:
8262 cmp = flag_unsafe_math_optimizations
8263 ? gen_tstsfeq_gpr (compare_result, rs6000_compare_op0,
8264 rs6000_compare_op1)
8265 : gen_cmpsfeq_gpr (compare_result, rs6000_compare_op0,
8266 rs6000_compare_op1);
8267 break;
8268 case GT:
8269 case GTU:
8270 case UNGT:
8271 case UNGE:
8272 case GE:
8273 case GEU:
8274 cmp = flag_unsafe_math_optimizations
8275 ? gen_tstsfgt_gpr (compare_result, rs6000_compare_op0,
8276 rs6000_compare_op1)
8277 : gen_cmpsfgt_gpr (compare_result, rs6000_compare_op0,
8278 rs6000_compare_op1);
8279 break;
8280 case LT:
8281 case LTU:
8282 case UNLT:
8283 case UNLE:
8284 case LE:
8285 case LEU:
8286 cmp = flag_unsafe_math_optimizations
8287 ? gen_tstsflt_gpr (compare_result, rs6000_compare_op0,
8288 rs6000_compare_op1)
8289 : gen_cmpsflt_gpr (compare_result, rs6000_compare_op0,
8290 rs6000_compare_op1);
8291 break;
8292 default:
8293 abort ();
8294 }
8295
8296 /* Synthesize LE and GE from LT/GT || EQ. */
8297 if (code == LE || code == GE || code == LEU || code == GEU)
8298 {
8299 /* Synthesize GE/LE frome GT/LT || EQ. */
8300
8301 emit_insn (cmp);
8302
8303 switch (code)
8304 {
8305 case LE: code = LT; break;
8306 case GE: code = GT; break;
8307 case LEU: code = LT; break;
8308 case GEU: code = GT; break;
8309 default: abort ();
8310 }
8311
8312 or1 = gen_reg_rtx (SImode);
8313 or2 = gen_reg_rtx (SImode);
8314 or_result = gen_reg_rtx (CCEQmode);
8315 compare_result2 = gen_reg_rtx (CCFPmode);
8316
8317 /* Do the EQ. */
8318 cmp = flag_unsafe_math_optimizations
8319 ? gen_tstsfeq_gpr (compare_result2, rs6000_compare_op0,
8320 rs6000_compare_op1)
8321 : gen_cmpsfeq_gpr (compare_result2, rs6000_compare_op0,
8322 rs6000_compare_op1);
8323 emit_insn (cmp);
8324
8325 /* The MC8540 FP compare instructions set the CR bits
8326 differently than other PPC compare instructions. For
8327 that matter, there is no generic test instruction, but a
8328 testgt, testlt, and testeq. For a true condition, bit 2
8329 is set (x1xx) in the CR. Following the traditional CR
8330 values:
8331
8332 LT GT EQ OV
8333 bit3 bit2 bit1 bit0
8334
8335 ... bit 2 would be a GT CR alias, so later on we
8336 look in the GT bits for the branch instructins.
8337 However, we must be careful to emit correct RTL in
8338 the meantime, so optimizations don't get confused. */
8339
8340 or1 = gen_rtx (NE, SImode, compare_result, const0_rtx);
8341 or2 = gen_rtx (NE, SImode, compare_result2, const0_rtx);
8342
8343 /* OR them together. */
8344 cmp = gen_rtx_SET (VOIDmode, or_result,
8345 gen_rtx_COMPARE (CCEQmode,
8346 gen_rtx_IOR (SImode, or1, or2),
8347 const_true_rtx));
8348 compare_result = or_result;
8349 code = EQ;
8350 }
8351 else
8352 {
8353 /* We only care about 1 bit (x1xx), so map everything to NE to
8354 maintain rtl sanity. We'll get to the right bit (x1xx) at
8355 code output time. */
8356 if (code == NE || code == LTGT)
8357 /* Do the inverse here because we have no cmpne
8358 instruction. We use the cmpeq instruction and expect
8359 to get a 0 instead. */
8360 code = EQ;
8361 else
8362 code = NE;
8363 }
8364
8365 emit_insn (cmp);
8366 }
8367 else
8368 emit_insn (gen_rtx_SET (VOIDmode, compare_result,
8369 gen_rtx_COMPARE (comp_mode,
8370 rs6000_compare_op0,
8371 rs6000_compare_op1)));
39a10a29 8372
ca5adc63 8373 /* Some kinds of FP comparisons need an OR operation;
de6c5979 8374 except for flag_unsafe_math_optimizations we don't bother. */
39a10a29 8375 if (rs6000_compare_fp_p
de6c5979 8376 && ! flag_unsafe_math_optimizations
a3170dc6 8377 && ! (TARGET_HARD_FLOAT && TARGET_SPE)
39a10a29
GK
8378 && (code == LE || code == GE
8379 || code == UNEQ || code == LTGT
8380 || code == UNGT || code == UNLT))
8381 {
8382 enum rtx_code or1, or2;
8383 rtx or1_rtx, or2_rtx, compare2_rtx;
8384 rtx or_result = gen_reg_rtx (CCEQmode);
8385
8386 switch (code)
8387 {
8388 case LE: or1 = LT; or2 = EQ; break;
8389 case GE: or1 = GT; or2 = EQ; break;
8390 case UNEQ: or1 = UNORDERED; or2 = EQ; break;
8391 case LTGT: or1 = LT; or2 = GT; break;
8392 case UNGT: or1 = UNORDERED; or2 = GT; break;
8393 case UNLT: or1 = UNORDERED; or2 = LT; break;
8394 default: abort ();
8395 }
8396 validate_condition_mode (or1, comp_mode);
8397 validate_condition_mode (or2, comp_mode);
8398 or1_rtx = gen_rtx (or1, SImode, compare_result, const0_rtx);
8399 or2_rtx = gen_rtx (or2, SImode, compare_result, const0_rtx);
8400 compare2_rtx = gen_rtx_COMPARE (CCEQmode,
8401 gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
8402 const_true_rtx);
8403 emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
8404
8405 compare_result = or_result;
8406 code = EQ;
8407 }
8408
8409 validate_condition_mode (code, GET_MODE (compare_result));
8410
8411 return gen_rtx (code, VOIDmode, compare_result, const0_rtx);
8412}
8413
8414
8415/* Emit the RTL for an sCOND pattern. */
8416
8417void
8418rs6000_emit_sCOND (code, result)
8419 enum rtx_code code;
8420 rtx result;
8421{
8422 rtx condition_rtx;
8423 enum machine_mode op_mode;
8424
8425 condition_rtx = rs6000_generate_compare (code);
8426
8427 op_mode = GET_MODE (rs6000_compare_op0);
8428 if (op_mode == VOIDmode)
8429 op_mode = GET_MODE (rs6000_compare_op1);
8430
8431 if (TARGET_POWERPC64 && (op_mode == DImode || rs6000_compare_fp_p))
8432 {
8433 PUT_MODE (condition_rtx, DImode);
8434 convert_move (result, condition_rtx, 0);
8435 }
8436 else
8437 {
8438 PUT_MODE (condition_rtx, SImode);
8439 emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
8440 }
8441}
8442
39a10a29
GK
8443/* Emit a branch of kind CODE to location LOC. */
8444
8445void
8446rs6000_emit_cbranch (code, loc)
8447 enum rtx_code code;
8448 rtx loc;
8449{
8450 rtx condition_rtx, loc_ref;
8451
8452 condition_rtx = rs6000_generate_compare (code);
8453 loc_ref = gen_rtx_LABEL_REF (VOIDmode, loc);
8454 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
8455 gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
8456 loc_ref, pc_rtx)));
8457}
8458
12a4e8c5
GK
8459/* Return the string to output a conditional branch to LABEL, which is
8460 the operand number of the label, or -1 if the branch is really a
8461 conditional return.
8462
8463 OP is the conditional expression. XEXP (OP, 0) is assumed to be a
8464 condition code register and its mode specifies what kind of
8465 comparison we made.
8466
a0ab749a 8467 REVERSED is nonzero if we should reverse the sense of the comparison.
12a4e8c5
GK
8468
8469 INSN is the insn. */
8470
8471char *
8472output_cbranch (op, label, reversed, insn)
8473 rtx op;
8474 const char * label;
8475 int reversed;
8476 rtx insn;
8477{
8478 static char string[64];
8479 enum rtx_code code = GET_CODE (op);
8480 rtx cc_reg = XEXP (op, 0);
8481 enum machine_mode mode = GET_MODE (cc_reg);
8482 int cc_regno = REGNO (cc_reg) - CR0_REGNO;
39a10a29 8483 int need_longbranch = label != NULL && get_attr_length (insn) == 8;
12a4e8c5
GK
8484 int really_reversed = reversed ^ need_longbranch;
8485 char *s = string;
8486 const char *ccode;
8487 const char *pred;
8488 rtx note;
8489
39a10a29
GK
8490 validate_condition_mode (code, mode);
8491
8492 /* Work out which way this really branches. We could use
8493 reverse_condition_maybe_unordered here always but this
8494 makes the resulting assembler clearer. */
12a4e8c5 8495 if (really_reversed)
de40e1df
DJ
8496 {
8497 /* Reversal of FP compares takes care -- an ordered compare
8498 becomes an unordered compare and vice versa. */
8499 if (mode == CCFPmode)
8500 code = reverse_condition_maybe_unordered (code);
8501 else
8502 code = reverse_condition (code);
8503 }
12a4e8c5 8504
a3170dc6
AH
8505 if ((TARGET_SPE && TARGET_HARD_FLOAT) && mode == CCFPmode)
8506 {
8507 /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
8508 to the GT bit. */
8509 if (code == EQ)
8510 /* Opposite of GT. */
8511 code = UNLE;
8512 else if (code == NE)
8513 code = GT;
8514 else
8515 abort ();
8516 }
8517
39a10a29 8518 switch (code)
12a4e8c5
GK
8519 {
8520 /* Not all of these are actually distinct opcodes, but
8521 we distinguish them for clarity of the resulting assembler. */
50a0b056
GK
8522 case NE: case LTGT:
8523 ccode = "ne"; break;
8524 case EQ: case UNEQ:
8525 ccode = "eq"; break;
8526 case GE: case GEU:
8527 ccode = "ge"; break;
8528 case GT: case GTU: case UNGT:
8529 ccode = "gt"; break;
8530 case LE: case LEU:
8531 ccode = "le"; break;
8532 case LT: case LTU: case UNLT:
8533 ccode = "lt"; break;
12a4e8c5
GK
8534 case UNORDERED: ccode = "un"; break;
8535 case ORDERED: ccode = "nu"; break;
8536 case UNGE: ccode = "nl"; break;
8537 case UNLE: ccode = "ng"; break;
8538 default:
a4f6c312 8539 abort ();
12a4e8c5
GK
8540 }
8541
94a54f47
GK
8542 /* Maybe we have a guess as to how likely the branch is.
8543 The old mnemonics don't have a way to specify this information. */
f4857b9b 8544 pred = "";
12a4e8c5
GK
8545 note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
8546 if (note != NULL_RTX)
8547 {
8548 /* PROB is the difference from 50%. */
8549 int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
f4857b9b
AM
8550 bool always_hint = rs6000_cpu != PROCESSOR_POWER4;
8551
8552 /* Only hint for highly probable/improbable branches on newer
8553 cpus as static prediction overrides processor dynamic
8554 prediction. For older cpus we may as well always hint, but
8555 assume not taken for branches that are very close to 50% as a
8556 mispredicted taken branch is more expensive than a
8557 mispredicted not-taken branch. */
8558 if (always_hint
8559 || abs (prob) > REG_BR_PROB_BASE / 100 * 48)
8560 {
8561 if (abs (prob) > REG_BR_PROB_BASE / 20
8562 && ((prob > 0) ^ need_longbranch))
8563 pred = "+";
8564 else
8565 pred = "-";
8566 }
12a4e8c5 8567 }
12a4e8c5
GK
8568
8569 if (label == NULL)
94a54f47 8570 s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
12a4e8c5 8571 else
94a54f47 8572 s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
12a4e8c5 8573
37c67319
GK
8574 /* We need to escape any '%' characters in the reg_names string.
8575 Assume they'd only be the first character... */
8576 if (reg_names[cc_regno + CR0_REGNO][0] == '%')
8577 *s++ = '%';
94a54f47 8578 s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
12a4e8c5
GK
8579
8580 if (label != NULL)
8581 {
8582 /* If the branch distance was too far, we may have to use an
8583 unconditional branch to go the distance. */
8584 if (need_longbranch)
44518ddd 8585 s += sprintf (s, ",$+8\n\tb %s", label);
12a4e8c5
GK
8586 else
8587 s += sprintf (s, ",%s", label);
8588 }
8589
8590 return string;
8591}
50a0b056
GK
8592
8593/* Emit a conditional move: move TRUE_COND to DEST if OP of the
8594 operands of the last comparison is nonzero/true, FALSE_COND if it
8595 is zero/false. Return 0 if the hardware has no such operation. */
a4f6c312 8596
50a0b056
GK
8597int
8598rs6000_emit_cmove (dest, op, true_cond, false_cond)
8599 rtx dest;
8600 rtx op;
8601 rtx true_cond;
8602 rtx false_cond;
8603{
8604 enum rtx_code code = GET_CODE (op);
8605 rtx op0 = rs6000_compare_op0;
8606 rtx op1 = rs6000_compare_op1;
8607 REAL_VALUE_TYPE c1;
3148ad6d
DJ
8608 enum machine_mode compare_mode = GET_MODE (op0);
8609 enum machine_mode result_mode = GET_MODE (dest);
50a0b056
GK
8610 rtx temp;
8611
3148ad6d 8612 /* These modes should always match. */
a3170dc6
AH
8613 if (GET_MODE (op1) != compare_mode
8614 /* In the isel case however, we can use a compare immediate, so
8615 op1 may be a small constant. */
8616 && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
3148ad6d 8617 return 0;
178c3eff 8618 if (GET_MODE (true_cond) != result_mode)
3148ad6d 8619 return 0;
178c3eff 8620 if (GET_MODE (false_cond) != result_mode)
3148ad6d
DJ
8621 return 0;
8622
50a0b056
GK
8623 /* First, work out if the hardware can do this at all, or
8624 if it's too slow... */
50a0b056 8625 if (! rs6000_compare_fp_p)
a3170dc6
AH
8626 {
8627 if (TARGET_ISEL)
8628 return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
8629 return 0;
8630 }
50a0b056
GK
8631
8632 /* Eliminate half of the comparisons by switching operands, this
8633 makes the remaining code simpler. */
8634 if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
8635 || code == LTGT || code == LT)
8636 {
8637 code = reverse_condition_maybe_unordered (code);
8638 temp = true_cond;
8639 true_cond = false_cond;
8640 false_cond = temp;
8641 }
8642
8643 /* UNEQ and LTGT take four instructions for a comparison with zero,
8644 it'll probably be faster to use a branch here too. */
8645 if (code == UNEQ)
8646 return 0;
8647
8648 if (GET_CODE (op1) == CONST_DOUBLE)
8649 REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
8650
8651 /* We're going to try to implement comparions by performing
8652 a subtract, then comparing against zero. Unfortunately,
8653 Inf - Inf is NaN which is not zero, and so if we don't
27d30956 8654 know that the operand is finite and the comparison
50a0b056
GK
8655 would treat EQ different to UNORDERED, we can't do it. */
8656 if (! flag_unsafe_math_optimizations
8657 && code != GT && code != UNGE
045572c7 8658 && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
50a0b056
GK
8659 /* Constructs of the form (a OP b ? a : b) are safe. */
8660 && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
8661 || (! rtx_equal_p (op0, true_cond)
8662 && ! rtx_equal_p (op1, true_cond))))
8663 return 0;
8664 /* At this point we know we can use fsel. */
8665
8666 /* Reduce the comparison to a comparison against zero. */
3148ad6d 8667 temp = gen_reg_rtx (compare_mode);
50a0b056 8668 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 8669 gen_rtx_MINUS (compare_mode, op0, op1)));
50a0b056 8670 op0 = temp;
3148ad6d 8671 op1 = CONST0_RTX (compare_mode);
50a0b056
GK
8672
8673 /* If we don't care about NaNs we can reduce some of the comparisons
8674 down to faster ones. */
8675 if (flag_unsafe_math_optimizations)
8676 switch (code)
8677 {
8678 case GT:
8679 code = LE;
8680 temp = true_cond;
8681 true_cond = false_cond;
8682 false_cond = temp;
8683 break;
8684 case UNGE:
8685 code = GE;
8686 break;
8687 case UNEQ:
8688 code = EQ;
8689 break;
8690 default:
8691 break;
8692 }
8693
8694 /* Now, reduce everything down to a GE. */
8695 switch (code)
8696 {
8697 case GE:
8698 break;
8699
8700 case LE:
3148ad6d
DJ
8701 temp = gen_reg_rtx (compare_mode);
8702 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
8703 op0 = temp;
8704 break;
8705
8706 case ORDERED:
3148ad6d
DJ
8707 temp = gen_reg_rtx (compare_mode);
8708 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
50a0b056
GK
8709 op0 = temp;
8710 break;
8711
8712 case EQ:
3148ad6d 8713 temp = gen_reg_rtx (compare_mode);
50a0b056 8714 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d
DJ
8715 gen_rtx_NEG (compare_mode,
8716 gen_rtx_ABS (compare_mode, op0))));
50a0b056
GK
8717 op0 = temp;
8718 break;
8719
8720 case UNGE:
3148ad6d 8721 temp = gen_reg_rtx (result_mode);
50a0b056 8722 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 8723 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
8724 gen_rtx_GE (VOIDmode,
8725 op0, op1),
8726 true_cond, false_cond)));
8727 false_cond = temp;
8728 true_cond = false_cond;
8729
3148ad6d
DJ
8730 temp = gen_reg_rtx (compare_mode);
8731 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
8732 op0 = temp;
8733 break;
8734
8735 case GT:
3148ad6d 8736 temp = gen_reg_rtx (result_mode);
50a0b056 8737 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 8738 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
8739 gen_rtx_GE (VOIDmode,
8740 op0, op1),
8741 true_cond, false_cond)));
8742 true_cond = temp;
8743 false_cond = true_cond;
8744
3148ad6d
DJ
8745 temp = gen_reg_rtx (compare_mode);
8746 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
8747 op0 = temp;
8748 break;
8749
8750 default:
8751 abort ();
8752 }
8753
8754 emit_insn (gen_rtx_SET (VOIDmode, dest,
3148ad6d 8755 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
8756 gen_rtx_GE (VOIDmode,
8757 op0, op1),
8758 true_cond, false_cond)));
8759 return 1;
8760}
8761
a3170dc6
AH
8762/* Same as above, but for ints (isel). */
8763
8764static int
8765rs6000_emit_int_cmove (dest, op, true_cond, false_cond)
8766 rtx dest;
8767 rtx op;
8768 rtx true_cond;
8769 rtx false_cond;
8770{
8771 rtx condition_rtx, cr;
8772
8773 /* All isel implementations thus far are 32-bits. */
8774 if (GET_MODE (rs6000_compare_op0) != SImode)
8775 return 0;
8776
8777 /* We still have to do the compare, because isel doesn't do a
8778 compare, it just looks at the CRx bits set by a previous compare
8779 instruction. */
8780 condition_rtx = rs6000_generate_compare (GET_CODE (op));
8781 cr = XEXP (condition_rtx, 0);
8782
8783 if (GET_MODE (cr) == CCmode)
8784 emit_insn (gen_isel_signed (dest, condition_rtx,
8785 true_cond, false_cond, cr));
8786 else
8787 emit_insn (gen_isel_unsigned (dest, condition_rtx,
8788 true_cond, false_cond, cr));
8789
8790 return 1;
8791}
8792
8793const char *
8794output_isel (operands)
8795 rtx *operands;
8796{
8797 enum rtx_code code;
8798
8799 code = GET_CODE (operands[1]);
8800 if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
8801 {
8802 PUT_CODE (operands[1], reverse_condition (code));
8803 return "isel %0,%3,%2,%j1";
8804 }
8805 else
8806 return "isel %0,%2,%3,%j1";
8807}
8808
50a0b056
GK
8809void
8810rs6000_emit_minmax (dest, code, op0, op1)
8811 rtx dest;
8812 enum rtx_code code;
8813 rtx op0;
8814 rtx op1;
8815{
8816 enum machine_mode mode = GET_MODE (op0);
5dc8d536 8817 enum rtx_code c;
50a0b056 8818 rtx target;
5dc8d536
AH
8819
8820 if (code == SMAX || code == SMIN)
8821 c = GE;
8822 else
8823 c = GEU;
8824
50a0b056 8825 if (code == SMAX || code == UMAX)
5dc8d536 8826 target = emit_conditional_move (dest, c, op0, op1, mode,
50a0b056
GK
8827 op0, op1, mode, 0);
8828 else
5dc8d536 8829 target = emit_conditional_move (dest, c, op0, op1, mode,
50a0b056
GK
8830 op1, op0, mode, 0);
8831 if (target == NULL_RTX)
8832 abort ();
8833 if (target != dest)
8834 emit_move_insn (dest, target);
8835}
12a4e8c5 8836\f
a4f6c312
SS
8837/* This page contains routines that are used to determine what the
8838 function prologue and epilogue code will do and write them out. */
9878760c 8839
a4f6c312
SS
8840/* Return the first fixed-point register that is required to be
8841 saved. 32 if none. */
9878760c
RK
8842
8843int
8844first_reg_to_save ()
8845{
8846 int first_reg;
8847
8848 /* Find lowest numbered live register. */
8849 for (first_reg = 13; first_reg <= 31; first_reg++)
a38d360d
GK
8850 if (regs_ever_live[first_reg]
8851 && (! call_used_regs[first_reg]
1db02437 8852 || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
f607bc57
ZW
8853 && ((DEFAULT_ABI == ABI_V4 && flag_pic == 1)
8854 || (DEFAULT_ABI == ABI_DARWIN && flag_pic)))))
9878760c
RK
8855 break;
8856
ee890fe2 8857#if TARGET_MACHO
93638d7a
AM
8858 if (flag_pic
8859 && current_function_uses_pic_offset_table
8860 && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
1db02437 8861 return RS6000_PIC_OFFSET_TABLE_REGNUM;
ee890fe2
SS
8862#endif
8863
9878760c
RK
8864 return first_reg;
8865}
8866
8867/* Similar, for FP regs. */
8868
8869int
8870first_fp_reg_to_save ()
8871{
8872 int first_reg;
8873
8874 /* Find lowest numbered live register. */
8875 for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
8876 if (regs_ever_live[first_reg])
8877 break;
8878
8879 return first_reg;
8880}
00b960c7
AH
8881
8882/* Similar, for AltiVec regs. */
8883
8884static int
8885first_altivec_reg_to_save ()
8886{
8887 int i;
8888
8889 /* Stack frame remains as is unless we are in AltiVec ABI. */
8890 if (! TARGET_ALTIVEC_ABI)
8891 return LAST_ALTIVEC_REGNO + 1;
8892
8893 /* Find lowest numbered live register. */
8894 for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
8895 if (regs_ever_live[i])
8896 break;
8897
8898 return i;
8899}
8900
8901/* Return a 32-bit mask of the AltiVec registers we need to set in
8902 VRSAVE. Bit n of the return value is 1 if Vn is live. The MSB in
8903 the 32-bit word is 0. */
8904
8905static unsigned int
8906compute_vrsave_mask ()
8907{
8908 unsigned int i, mask = 0;
8909
8910 /* First, find out if we use _any_ altivec registers. */
8911 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
8912 if (regs_ever_live[i])
8913 mask |= ALTIVEC_REG_BIT (i);
8914
8915 if (mask == 0)
8916 return mask;
8917
8918 /* Next, add all registers that are call-clobbered. We do this
8919 because post-reload register optimizers such as regrename_optimize
8920 may choose to use them. They never change the register class
8921 chosen by reload, so cannot create new uses of altivec registers
8922 if there were none before, so the early exit above is safe. */
8923 /* ??? Alternately, we could define HARD_REGNO_RENAME_OK to disallow
8924 altivec registers not saved in the mask, which might well make the
8925 adjustments below more effective in eliding the save/restore of
8926 VRSAVE in small functions. */
8927 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
8928 if (call_used_regs[i])
8929 mask |= ALTIVEC_REG_BIT (i);
8930
8931 /* Next, remove the argument registers from the set. These must
8932 be in the VRSAVE mask set by the caller, so we don't need to add
8933 them in again. More importantly, the mask we compute here is
8934 used to generate CLOBBERs in the set_vrsave insn, and we do not
8935 wish the argument registers to die. */
8936 for (i = cfun->args_info.vregno; i >= ALTIVEC_ARG_MIN_REG; --i)
8937 mask &= ~ALTIVEC_REG_BIT (i);
8938
8939 /* Similarly, remove the return value from the set. */
8940 {
8941 bool yes = false;
8942 diddle_return_value (is_altivec_return_reg, &yes);
8943 if (yes)
8944 mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
8945 }
8946
8947 return mask;
8948}
8949
8950static void
8951is_altivec_return_reg (reg, xyes)
8952 rtx reg;
8953 void *xyes;
8954{
8955 bool *yes = (bool *) xyes;
8956 if (REGNO (reg) == ALTIVEC_ARG_RETURN)
8957 *yes = true;
8958}
8959
4697a36c
MM
8960\f
8961/* Calculate the stack information for the current function. This is
8962 complicated by having two separate calling sequences, the AIX calling
8963 sequence and the V.4 calling sequence.
8964
592696dd 8965 AIX (and Darwin/Mac OS X) stack frames look like:
a260abc9 8966 32-bit 64-bit
4697a36c 8967 SP----> +---------------------------------------+
a260abc9 8968 | back chain to caller | 0 0
4697a36c 8969 +---------------------------------------+
a260abc9 8970 | saved CR | 4 8 (8-11)
4697a36c 8971 +---------------------------------------+
a260abc9 8972 | saved LR | 8 16
4697a36c 8973 +---------------------------------------+
a260abc9 8974 | reserved for compilers | 12 24
4697a36c 8975 +---------------------------------------+
a260abc9 8976 | reserved for binders | 16 32
4697a36c 8977 +---------------------------------------+
a260abc9 8978 | saved TOC pointer | 20 40
4697a36c 8979 +---------------------------------------+
a260abc9 8980 | Parameter save area (P) | 24 48
4697a36c 8981 +---------------------------------------+
a260abc9 8982 | Alloca space (A) | 24+P etc.
802a0058 8983 +---------------------------------------+
a7df97e6 8984 | Local variable space (L) | 24+P+A
4697a36c 8985 +---------------------------------------+
a7df97e6 8986 | Float/int conversion temporary (X) | 24+P+A+L
4697a36c 8987 +---------------------------------------+
00b960c7
AH
8988 | Save area for AltiVec registers (W) | 24+P+A+L+X
8989 +---------------------------------------+
8990 | AltiVec alignment padding (Y) | 24+P+A+L+X+W
8991 +---------------------------------------+
8992 | Save area for VRSAVE register (Z) | 24+P+A+L+X+W+Y
4697a36c 8993 +---------------------------------------+
00b960c7
AH
8994 | Save area for GP registers (G) | 24+P+A+X+L+X+W+Y+Z
8995 +---------------------------------------+
8996 | Save area for FP registers (F) | 24+P+A+X+L+X+W+Y+Z+G
4697a36c
MM
8997 +---------------------------------------+
8998 old SP->| back chain to caller's caller |
8999 +---------------------------------------+
9000
5376a30c
KR
9001 The required alignment for AIX configurations is two words (i.e., 8
9002 or 16 bytes).
9003
9004
4697a36c
MM
9005 V.4 stack frames look like:
9006
9007 SP----> +---------------------------------------+
9008 | back chain to caller | 0
9009 +---------------------------------------+
5eb387b8 9010 | caller's saved LR | 4
4697a36c
MM
9011 +---------------------------------------+
9012 | Parameter save area (P) | 8
9013 +---------------------------------------+
a7df97e6
MM
9014 | Alloca space (A) | 8+P
9015 +---------------------------------------+
9016 | Varargs save area (V) | 8+P+A
9017 +---------------------------------------+
9018 | Local variable space (L) | 8+P+A+V
9019 +---------------------------------------+
9020 | Float/int conversion temporary (X) | 8+P+A+V+L
4697a36c 9021 +---------------------------------------+
00b960c7
AH
9022 | Save area for AltiVec registers (W) | 8+P+A+V+L+X
9023 +---------------------------------------+
9024 | AltiVec alignment padding (Y) | 8+P+A+V+L+X+W
9025 +---------------------------------------+
9026 | Save area for VRSAVE register (Z) | 8+P+A+V+L+X+W+Y
9027 +---------------------------------------+
a3170dc6
AH
9028 | SPE: area for 64-bit GP registers |
9029 +---------------------------------------+
9030 | SPE alignment padding |
9031 +---------------------------------------+
00b960c7 9032 | saved CR (C) | 8+P+A+V+L+X+W+Y+Z
a7df97e6 9033 +---------------------------------------+
00b960c7 9034 | Save area for GP registers (G) | 8+P+A+V+L+X+W+Y+Z+C
a7df97e6 9035 +---------------------------------------+
00b960c7 9036 | Save area for FP registers (F) | 8+P+A+V+L+X+W+Y+Z+C+G
4697a36c
MM
9037 +---------------------------------------+
9038 old SP->| back chain to caller's caller |
9039 +---------------------------------------+
b6c9286a 9040
5376a30c
KR
9041 The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
9042 given. (But note below and in sysv4.h that we require only 8 and
9043 may round up the size of our stack frame anyways. The historical
9044 reason is early versions of powerpc-linux which didn't properly
9045 align the stack at program startup. A happy side-effect is that
9046 -mno-eabi libraries can be used with -meabi programs.)
9047
5376a30c
KR
9048 The EABI configuration defaults to the V.4 layout, unless
9049 -mcall-aix is used, in which case the AIX layout is used. However,
9050 the stack alignment requirements may differ. If -mno-eabi is not
9051 given, the required stack alignment is 8 bytes; if -mno-eabi is
9052 given, the required alignment is 16 bytes. (But see V.4 comment
9053 above.) */
4697a36c 9054
61b2fbe7
MM
9055#ifndef ABI_STACK_BOUNDARY
9056#define ABI_STACK_BOUNDARY STACK_BOUNDARY
9057#endif
9058
4697a36c
MM
9059rs6000_stack_t *
9060rs6000_stack_info ()
9061{
9062 static rs6000_stack_t info, zero_info;
9063 rs6000_stack_t *info_ptr = &info;
9ebbca7d 9064 int reg_size = TARGET_POWERPC64 ? 8 : 4;
24d304eb 9065 enum rs6000_abi abi;
83720594 9066 int ehrd_size;
b6c9286a 9067 int total_raw_size;
4697a36c 9068
a4f6c312 9069 /* Zero all fields portably. */
4697a36c
MM
9070 info = zero_info;
9071
a4f6c312 9072 /* Select which calling sequence. */
b6c9286a 9073 info_ptr->abi = abi = DEFAULT_ABI;
9878760c 9074
a4f6c312 9075 /* Calculate which registers need to be saved & save area size. */
4697a36c 9076 info_ptr->first_gp_reg_save = first_reg_to_save ();
1db02437 9077 /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
906fb125 9078 even if it currently looks like we won't. */
2bfcf297 9079 if (((TARGET_TOC && TARGET_MINIMAL_TOC)
f607bc57
ZW
9080 || (flag_pic == 1 && abi == ABI_V4)
9081 || (flag_pic && abi == ABI_DARWIN))
1db02437
FS
9082 && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
9083 info_ptr->gp_size = reg_size * (32 - RS6000_PIC_OFFSET_TABLE_REGNUM);
906fb125
GK
9084 else
9085 info_ptr->gp_size = reg_size * (32 - info_ptr->first_gp_reg_save);
4697a36c 9086
a3170dc6
AH
9087 /* For the SPE, we have an additional upper 32-bits on each GPR.
9088 Ideally we should save the entire 64-bits only when the upper
9089 half is used in SIMD instructions. Since we only record
9090 registers live (not the size they are used in), this proves
9091 difficult because we'd have to traverse the instruction chain at
9092 the right time, taking reload into account. This is a real pain,
9093 so we opt to save the GPRs in 64-bits always. Anyone overly
9094 concerned with frame size can fix this. ;-).
9095
9096 So... since we save all GPRs (except the SP) in 64-bits, the
9097 traditional GP save area will be empty. */
9098 if (TARGET_SPE_ABI)
9099 info_ptr->gp_size = 0;
9100
4697a36c
MM
9101 info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
9102 info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
9103
00b960c7
AH
9104 info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
9105 info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
9106 - info_ptr->first_altivec_reg_save);
9107
592696dd 9108 /* Does this function call anything? */
71f123ca
FS
9109 info_ptr->calls_p = (! current_function_is_leaf
9110 || cfun->machine->ra_needs_full_frame);
b6c9286a 9111
a4f6c312 9112 /* Determine if we need to save the link register. */
71f123ca 9113 if (rs6000_ra_ever_killed ()
70f4f91c 9114 || (DEFAULT_ABI == ABI_AIX && current_function_profile)
4697a36c
MM
9115#ifdef TARGET_RELOCATABLE
9116 || (TARGET_RELOCATABLE && (get_pool_size () != 0))
9117#endif
9118 || (info_ptr->first_fp_reg_save != 64
9119 && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save))
00b960c7 9120 || info_ptr->first_altivec_reg_save <= LAST_ALTIVEC_REGNO
24d304eb 9121 || (abi == ABI_V4 && current_function_calls_alloca)
a4f6c312
SS
9122 || (DEFAULT_ABI == ABI_DARWIN
9123 && flag_pic
9124 && current_function_uses_pic_offset_table)
4697a36c
MM
9125 || info_ptr->calls_p)
9126 {
9127 info_ptr->lr_save_p = 1;
9ebbca7d 9128 regs_ever_live[LINK_REGISTER_REGNUM] = 1;
4697a36c
MM
9129 }
9130
9ebbca7d
GK
9131 /* Determine if we need to save the condition code registers. */
9132 if (regs_ever_live[CR2_REGNO]
9133 || regs_ever_live[CR3_REGNO]
9134 || regs_ever_live[CR4_REGNO])
4697a36c
MM
9135 {
9136 info_ptr->cr_save_p = 1;
f607bc57 9137 if (abi == ABI_V4)
4697a36c
MM
9138 info_ptr->cr_size = reg_size;
9139 }
9140
83720594
RH
9141 /* If the current function calls __builtin_eh_return, then we need
9142 to allocate stack space for registers that will hold data for
9143 the exception handler. */
9144 if (current_function_calls_eh_return)
9145 {
9146 unsigned int i;
9147 for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
9148 continue;
a3170dc6
AH
9149
9150 /* SPE saves EH registers in 64-bits. */
9151 ehrd_size = i * (TARGET_SPE_ABI ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
83720594
RH
9152 }
9153 else
9154 ehrd_size = 0;
9155
592696dd 9156 /* Determine various sizes. */
4697a36c
MM
9157 info_ptr->reg_size = reg_size;
9158 info_ptr->fixed_size = RS6000_SAVE_AREA;
9159 info_ptr->varargs_size = RS6000_VARARGS_AREA;
189e03e3 9160 info_ptr->vars_size = RS6000_ALIGN (get_frame_size (), 8);
a4f6c312
SS
9161 info_ptr->parm_size = RS6000_ALIGN (current_function_outgoing_args_size,
9162 8);
00b960c7 9163
a3170dc6
AH
9164 if (TARGET_SPE_ABI)
9165 info_ptr->spe_gp_size = 8 * (32 - info_ptr->first_gp_reg_save);
9166 else
9167 info_ptr->spe_gp_size = 0;
9168
08b57fb3 9169 if (TARGET_ALTIVEC_ABI && TARGET_ALTIVEC_VRSAVE)
00b960c7
AH
9170 {
9171 info_ptr->vrsave_mask = compute_vrsave_mask ();
9172 info_ptr->vrsave_size = info_ptr->vrsave_mask ? 4 : 0;
9173 }
9174 else
9175 {
9176 info_ptr->vrsave_mask = 0;
9177 info_ptr->vrsave_size = 0;
9178 }
b6c9286a 9179
592696dd 9180 /* Calculate the offsets. */
24d304eb 9181 switch (abi)
4697a36c 9182 {
b6c9286a 9183 case ABI_NONE:
24d304eb 9184 default:
b6c9286a
MM
9185 abort ();
9186
9187 case ABI_AIX:
9188 case ABI_AIX_NODESC:
ee890fe2 9189 case ABI_DARWIN:
b6c9286a
MM
9190 info_ptr->fp_save_offset = - info_ptr->fp_size;
9191 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
00b960c7
AH
9192
9193 if (TARGET_ALTIVEC_ABI)
9194 {
9195 info_ptr->vrsave_save_offset
9196 = info_ptr->gp_save_offset - info_ptr->vrsave_size;
9197
9198 /* Align stack so vector save area is on a quadword boundary. */
9199 if (info_ptr->altivec_size != 0)
9200 info_ptr->altivec_padding_size
9201 = 16 - (-info_ptr->vrsave_save_offset % 16);
9202 else
9203 info_ptr->altivec_padding_size = 0;
9204
9205 info_ptr->altivec_save_offset
9206 = info_ptr->vrsave_save_offset
9207 - info_ptr->altivec_padding_size
9208 - info_ptr->altivec_size;
9209
9210 /* Adjust for AltiVec case. */
9211 info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
9212 }
9213 else
9214 info_ptr->ehrd_offset = info_ptr->gp_save_offset - ehrd_size;
a260abc9
DE
9215 info_ptr->cr_save_offset = reg_size; /* first word when 64-bit. */
9216 info_ptr->lr_save_offset = 2*reg_size;
24d304eb
RK
9217 break;
9218
9219 case ABI_V4:
b6c9286a
MM
9220 info_ptr->fp_save_offset = - info_ptr->fp_size;
9221 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
a7df97e6 9222 info_ptr->cr_save_offset = info_ptr->gp_save_offset - info_ptr->cr_size;
00b960c7 9223
a3170dc6
AH
9224 if (TARGET_SPE_ABI)
9225 {
9226 /* Align stack so SPE GPR save area is aligned on a
9227 double-word boundary. */
9228 if (info_ptr->spe_gp_size != 0)
9229 info_ptr->spe_padding_size
9230 = 8 - (-info_ptr->cr_save_offset % 8);
9231 else
9232 info_ptr->spe_padding_size = 0;
9233
9234 info_ptr->spe_gp_save_offset
9235 = info_ptr->cr_save_offset
9236 - info_ptr->spe_padding_size
9237 - info_ptr->spe_gp_size;
9238
9239 /* Adjust for SPE case. */
9240 info_ptr->toc_save_offset
9241 = info_ptr->spe_gp_save_offset - info_ptr->toc_size;
9242 }
9243 else if (TARGET_ALTIVEC_ABI)
00b960c7
AH
9244 {
9245 info_ptr->vrsave_save_offset
9246 = info_ptr->cr_save_offset - info_ptr->vrsave_size;
9247
9248 /* Align stack so vector save area is on a quadword boundary. */
9249 if (info_ptr->altivec_size != 0)
9250 info_ptr->altivec_padding_size
9251 = 16 - (-info_ptr->vrsave_save_offset % 16);
9252 else
9253 info_ptr->altivec_padding_size = 0;
9254
9255 info_ptr->altivec_save_offset
9256 = info_ptr->vrsave_save_offset
9257 - info_ptr->altivec_padding_size
9258 - info_ptr->altivec_size;
9259
9260 /* Adjust for AltiVec case. */
9261 info_ptr->toc_save_offset
9262 = info_ptr->altivec_save_offset - info_ptr->toc_size;
9263 }
9264 else
9265 info_ptr->toc_save_offset = info_ptr->cr_save_offset - info_ptr->toc_size;
83720594 9266 info_ptr->ehrd_offset = info_ptr->toc_save_offset - ehrd_size;
b6c9286a
MM
9267 info_ptr->lr_save_offset = reg_size;
9268 break;
4697a36c
MM
9269 }
9270
00b960c7
AH
9271 info_ptr->save_size = RS6000_ALIGN (info_ptr->fp_size
9272 + info_ptr->gp_size
9273 + info_ptr->altivec_size
9274 + info_ptr->altivec_padding_size
9275 + info_ptr->vrsave_size
a3170dc6
AH
9276 + info_ptr->spe_gp_size
9277 + info_ptr->spe_padding_size
00b960c7
AH
9278 + ehrd_size
9279 + info_ptr->cr_size
9280 + info_ptr->lr_size
9281 + info_ptr->vrsave_size
9282 + info_ptr->toc_size,
9283 (TARGET_ALTIVEC_ABI || ABI_DARWIN)
9284 ? 16 : 8);
9285
ff381587
MM
9286 total_raw_size = (info_ptr->vars_size
9287 + info_ptr->parm_size
ff381587
MM
9288 + info_ptr->save_size
9289 + info_ptr->varargs_size
9290 + info_ptr->fixed_size);
9291
a4f6c312
SS
9292 info_ptr->total_size =
9293 RS6000_ALIGN (total_raw_size, ABI_STACK_BOUNDARY / BITS_PER_UNIT);
ff381587
MM
9294
9295 /* Determine if we need to allocate any stack frame:
9296
a4f6c312
SS
9297 For AIX we need to push the stack if a frame pointer is needed
9298 (because the stack might be dynamically adjusted), if we are
9299 debugging, if we make calls, or if the sum of fp_save, gp_save,
9300 and local variables are more than the space needed to save all
9301 non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
9302 + 18*8 = 288 (GPR13 reserved).
ff381587 9303
a4f6c312
SS
9304 For V.4 we don't have the stack cushion that AIX uses, but assume
9305 that the debugger can handle stackless frames. */
ff381587
MM
9306
9307 if (info_ptr->calls_p)
9308 info_ptr->push_p = 1;
9309
f607bc57 9310 else if (abi == ABI_V4)
e72247f4 9311 info_ptr->push_p = total_raw_size > info_ptr->fixed_size;
ff381587
MM
9312
9313 else
9314 info_ptr->push_p = (frame_pointer_needed
ee890fe2 9315 || (abi != ABI_DARWIN && write_symbols != NO_DEBUG)
ff381587 9316 || ((total_raw_size - info_ptr->fixed_size)
bfc79d3b 9317 > (TARGET_32BIT ? 220 : 288)));
ff381587 9318
a4f6c312 9319 /* Zero offsets if we're not saving those registers. */
8dda1a21 9320 if (info_ptr->fp_size == 0)
4697a36c
MM
9321 info_ptr->fp_save_offset = 0;
9322
8dda1a21 9323 if (info_ptr->gp_size == 0)
4697a36c
MM
9324 info_ptr->gp_save_offset = 0;
9325
00b960c7
AH
9326 if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
9327 info_ptr->altivec_save_offset = 0;
9328
9329 if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
9330 info_ptr->vrsave_save_offset = 0;
9331
a3170dc6
AH
9332 if (! TARGET_SPE_ABI || info_ptr->spe_gp_size == 0)
9333 info_ptr->spe_gp_save_offset = 0;
9334
c81fc13e 9335 if (! info_ptr->lr_save_p)
4697a36c
MM
9336 info_ptr->lr_save_offset = 0;
9337
c81fc13e 9338 if (! info_ptr->cr_save_p)
4697a36c
MM
9339 info_ptr->cr_save_offset = 0;
9340
c81fc13e 9341 if (! info_ptr->toc_save_p)
b6c9286a
MM
9342 info_ptr->toc_save_offset = 0;
9343
4697a36c
MM
9344 return info_ptr;
9345}
9346
9347void
9348debug_stack_info (info)
9349 rs6000_stack_t *info;
9878760c 9350{
d330fd93 9351 const char *abi_string;
24d304eb 9352
c81fc13e 9353 if (! info)
4697a36c
MM
9354 info = rs6000_stack_info ();
9355
9356 fprintf (stderr, "\nStack information for function %s:\n",
9357 ((current_function_decl && DECL_NAME (current_function_decl))
9358 ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
9359 : "<unknown>"));
9360
24d304eb
RK
9361 switch (info->abi)
9362 {
b6c9286a
MM
9363 default: abi_string = "Unknown"; break;
9364 case ABI_NONE: abi_string = "NONE"; break;
f607bc57 9365 case ABI_AIX:
b6c9286a 9366 case ABI_AIX_NODESC: abi_string = "AIX"; break;
ee890fe2 9367 case ABI_DARWIN: abi_string = "Darwin"; break;
b6c9286a 9368 case ABI_V4: abi_string = "V.4"; break;
24d304eb
RK
9369 }
9370
9371 fprintf (stderr, "\tABI = %5s\n", abi_string);
9372
00b960c7
AH
9373 if (TARGET_ALTIVEC_ABI)
9374 fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
9375
a3170dc6
AH
9376 if (TARGET_SPE_ABI)
9377 fprintf (stderr, "\tSPE ABI extensions enabled.\n");
9378
4697a36c
MM
9379 if (info->first_gp_reg_save != 32)
9380 fprintf (stderr, "\tfirst_gp_reg_save = %5d\n", info->first_gp_reg_save);
9381
9382 if (info->first_fp_reg_save != 64)
9383 fprintf (stderr, "\tfirst_fp_reg_save = %5d\n", info->first_fp_reg_save);
9878760c 9384
00b960c7
AH
9385 if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
9386 fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
9387 info->first_altivec_reg_save);
9388
4697a36c
MM
9389 if (info->lr_save_p)
9390 fprintf (stderr, "\tlr_save_p = %5d\n", info->lr_save_p);
9878760c 9391
4697a36c
MM
9392 if (info->cr_save_p)
9393 fprintf (stderr, "\tcr_save_p = %5d\n", info->cr_save_p);
9394
b6c9286a
MM
9395 if (info->toc_save_p)
9396 fprintf (stderr, "\ttoc_save_p = %5d\n", info->toc_save_p);
9397
00b960c7
AH
9398 if (info->vrsave_mask)
9399 fprintf (stderr, "\tvrsave_mask = 0x%x\n", info->vrsave_mask);
9400
4697a36c
MM
9401 if (info->push_p)
9402 fprintf (stderr, "\tpush_p = %5d\n", info->push_p);
9403
9404 if (info->calls_p)
9405 fprintf (stderr, "\tcalls_p = %5d\n", info->calls_p);
9406
4697a36c
MM
9407 if (info->gp_save_offset)
9408 fprintf (stderr, "\tgp_save_offset = %5d\n", info->gp_save_offset);
9409
9410 if (info->fp_save_offset)
9411 fprintf (stderr, "\tfp_save_offset = %5d\n", info->fp_save_offset);
9412
00b960c7
AH
9413 if (info->altivec_save_offset)
9414 fprintf (stderr, "\taltivec_save_offset = %5d\n",
9415 info->altivec_save_offset);
9416
a3170dc6
AH
9417 if (info->spe_gp_save_offset)
9418 fprintf (stderr, "\tspe_gp_save_offset = %5d\n",
9419 info->spe_gp_save_offset);
9420
00b960c7
AH
9421 if (info->vrsave_save_offset)
9422 fprintf (stderr, "\tvrsave_save_offset = %5d\n",
9423 info->vrsave_save_offset);
9424
4697a36c
MM
9425 if (info->lr_save_offset)
9426 fprintf (stderr, "\tlr_save_offset = %5d\n", info->lr_save_offset);
9427
9428 if (info->cr_save_offset)
9429 fprintf (stderr, "\tcr_save_offset = %5d\n", info->cr_save_offset);
9430
b6c9286a
MM
9431 if (info->toc_save_offset)
9432 fprintf (stderr, "\ttoc_save_offset = %5d\n", info->toc_save_offset);
9433
4697a36c
MM
9434 if (info->varargs_save_offset)
9435 fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
9436
9437 if (info->total_size)
9438 fprintf (stderr, "\ttotal_size = %5d\n", info->total_size);
9439
9440 if (info->varargs_size)
9441 fprintf (stderr, "\tvarargs_size = %5d\n", info->varargs_size);
9442
9443 if (info->vars_size)
9444 fprintf (stderr, "\tvars_size = %5d\n", info->vars_size);
9445
9446 if (info->parm_size)
9447 fprintf (stderr, "\tparm_size = %5d\n", info->parm_size);
9448
9449 if (info->fixed_size)
9450 fprintf (stderr, "\tfixed_size = %5d\n", info->fixed_size);
9451
9452 if (info->gp_size)
9453 fprintf (stderr, "\tgp_size = %5d\n", info->gp_size);
9454
a3170dc6
AH
9455 if (info->spe_gp_size)
9456 fprintf (stderr, "\tspe_gp_size = %5d\n", info->spe_gp_size);
9457
4697a36c
MM
9458 if (info->fp_size)
9459 fprintf (stderr, "\tfp_size = %5d\n", info->fp_size);
9460
00b960c7
AH
9461 if (info->altivec_size)
9462 fprintf (stderr, "\taltivec_size = %5d\n", info->altivec_size);
9463
9464 if (info->vrsave_size)
9465 fprintf (stderr, "\tvrsave_size = %5d\n", info->vrsave_size);
9466
9467 if (info->altivec_padding_size)
9468 fprintf (stderr, "\taltivec_padding_size= %5d\n",
9469 info->altivec_padding_size);
9470
a3170dc6
AH
9471 if (info->spe_padding_size)
9472 fprintf (stderr, "\tspe_padding_size = %5d\n",
9473 info->spe_padding_size);
9474
a4f6c312 9475 if (info->lr_size)
ed947a96 9476 fprintf (stderr, "\tlr_size = %5d\n", info->lr_size);
b6c9286a 9477
4697a36c
MM
9478 if (info->cr_size)
9479 fprintf (stderr, "\tcr_size = %5d\n", info->cr_size);
9480
a4f6c312 9481 if (info->toc_size)
b6c9286a
MM
9482 fprintf (stderr, "\ttoc_size = %5d\n", info->toc_size);
9483
4697a36c
MM
9484 if (info->save_size)
9485 fprintf (stderr, "\tsave_size = %5d\n", info->save_size);
9486
9487 if (info->reg_size != 4)
9488 fprintf (stderr, "\treg_size = %5d\n", info->reg_size);
9489
9490 fprintf (stderr, "\n");
9878760c 9491}
71f123ca
FS
9492
9493rtx
9494rs6000_return_addr (count, frame)
9495 int count;
9496 rtx frame;
9497{
a4f6c312
SS
9498 /* Currently we don't optimize very well between prolog and body
9499 code and for PIC code the code can be actually quite bad, so
9500 don't try to be too clever here. */
f585a356 9501 if (count != 0 || flag_pic != 0)
71f123ca
FS
9502 {
9503 cfun->machine->ra_needs_full_frame = 1;
8ac61af7
RK
9504
9505 return
9506 gen_rtx_MEM
9507 (Pmode,
9508 memory_address
9509 (Pmode,
9510 plus_constant (copy_to_reg
9511 (gen_rtx_MEM (Pmode,
9512 memory_address (Pmode, frame))),
9513 RETURN_ADDRESS_OFFSET)));
71f123ca
FS
9514 }
9515
9e2f7ec7 9516 return get_hard_reg_initial_val (Pmode, LINK_REGISTER_REGNUM);
71f123ca
FS
9517}
9518
5e1bf043
DJ
9519/* Say whether a function is a candidate for sibcall handling or not.
9520 We do not allow indirect calls to be optimized into sibling calls.
9521 Also, we can't do it if there are any vector parameters; there's
9522 nowhere to put the VRsave code so it works; note that functions with
9523 vector parameters are required to have a prototype, so the argument
9524 type info must be available here. (The tail recursion case can work
9525 with vector parameters, but there's no way to distinguish here.) */
4977bab6
ZW
9526static bool
9527rs6000_function_ok_for_sibcall (decl, exp)
9528 tree decl;
9529 tree exp ATTRIBUTE_UNUSED;
5e1bf043
DJ
9530{
9531 tree type;
4977bab6 9532 if (decl)
5e1bf043
DJ
9533 {
9534 if (TARGET_ALTIVEC_VRSAVE)
9535 {
4977bab6 9536 for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
5e1bf043
DJ
9537 type; type = TREE_CHAIN (type))
9538 {
c15b529f 9539 if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
4977bab6 9540 return false;
5e1bf043
DJ
9541 }
9542 }
9543 if (DEFAULT_ABI == ABI_DARWIN
4977bab6 9544 || (*targetm.binds_local_p) (decl))
2bcc50d0 9545 {
4977bab6 9546 tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
2bcc50d0
AM
9547
9548 if (!lookup_attribute ("longcall", attr_list)
9549 || lookup_attribute ("shortcall", attr_list))
4977bab6 9550 return true;
2bcc50d0 9551 }
5e1bf043 9552 }
4977bab6 9553 return false;
5e1bf043
DJ
9554}
9555
71f123ca
FS
9556static int
9557rs6000_ra_ever_killed ()
9558{
9559 rtx top;
5e1bf043
DJ
9560 rtx reg;
9561 rtx insn;
71f123ca 9562
3961e8fe
RH
9563 /* Irritatingly, there are two kinds of thunks -- those created with
9564 TARGET_ASM_OUTPUT_MI_THUNK and those with DECL_THUNK_P that go
9565 through the regular part of the compiler. This is a very hacky
9566 way to tell them apart. */
9567 if (current_function_is_thunk && !no_new_pseudos)
71f123ca 9568 return 0;
eb0424da 9569
36f7e964
AH
9570 /* regs_ever_live has LR marked as used if any sibcalls are present,
9571 but this should not force saving and restoring in the
9572 pro/epilogue. Likewise, reg_set_between_p thinks a sibcall
9573 clobbers LR, so that is inappropriate. */
9574
5e1bf043
DJ
9575 /* Also, the prologue can generate a store into LR that
9576 doesn't really count, like this:
36f7e964 9577
5e1bf043
DJ
9578 move LR->R0
9579 bcl to set PIC register
9580 move LR->R31
9581 move R0->LR
36f7e964
AH
9582
9583 When we're called from the epilogue, we need to avoid counting
9584 this as a store. */
5e1bf043 9585
71f123ca
FS
9586 push_topmost_sequence ();
9587 top = get_insns ();
9588 pop_topmost_sequence ();
5e1bf043 9589 reg = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
71f123ca 9590
5e1bf043
DJ
9591 for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
9592 {
9593 if (INSN_P (insn))
9594 {
9595 if (FIND_REG_INC_NOTE (insn, reg))
9596 return 1;
9597 else if (GET_CODE (insn) == CALL_INSN
c15b529f 9598 && !SIBLING_CALL_P (insn))
5e1bf043 9599 return 1;
36f7e964
AH
9600 else if (set_of (reg, insn) != NULL_RTX
9601 && !prologue_epilogue_contains (insn))
5e1bf043
DJ
9602 return 1;
9603 }
9604 }
9605 return 0;
71f123ca 9606}
4697a36c 9607\f
8cd8f856
GK
9608/* Add a REG_MAYBE_DEAD note to the insn. */
9609static void
9610rs6000_maybe_dead (insn)
9611 rtx insn;
9612{
9613 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD,
9614 const0_rtx,
9615 REG_NOTES (insn));
9616}
9617
9ebbca7d 9618/* Emit instructions needed to load the TOC register.
c7ca610e 9619 This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
9ebbca7d 9620 a constant pool; or for SVR4 -fpic. */
c7ca610e
RK
9621
9622void
9ebbca7d
GK
9623rs6000_emit_load_toc_table (fromprolog)
9624 int fromprolog;
c7ca610e 9625{
9ebbca7d 9626 rtx dest;
1db02437 9627 dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
c7ca610e 9628
20b71b17
AM
9629 if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
9630 {
9631 rtx temp = (fromprolog
9632 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
9633 : gen_reg_rtx (Pmode));
9634 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_pic_si (temp)));
9635 rs6000_maybe_dead (emit_move_insn (dest, temp));
9636 }
9637 else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
9638 {
9639 char buf[30];
9640 rtx tempLR = (fromprolog
9641 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
9642 : gen_reg_rtx (Pmode));
9643 rtx temp0 = (fromprolog
9644 ? gen_rtx_REG (Pmode, 0)
9645 : gen_reg_rtx (Pmode));
9646 rtx symF;
9647
9648 /* possibly create the toc section */
9649 if (! toc_initialized)
38c1f2d7 9650 {
20b71b17
AM
9651 toc_section ();
9652 function_section (current_function_decl);
38c1f2d7 9653 }
9ebbca7d 9654
20b71b17
AM
9655 if (fromprolog)
9656 {
9657 rtx symL;
38c1f2d7 9658
20b71b17
AM
9659 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
9660 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9ebbca7d 9661
20b71b17
AM
9662 ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
9663 symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9664
9665 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1 (tempLR,
9666 symF)));
9667 rs6000_maybe_dead (emit_move_insn (dest, tempLR));
9668 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest,
9669 symL,
9670 symF)));
9ebbca7d
GK
9671 }
9672 else
20b71b17
AM
9673 {
9674 rtx tocsym;
9675 static int reload_toc_labelno = 0;
9676
9677 tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
9678
9679 ASM_GENERATE_INTERNAL_LABEL (buf, "LCG", reload_toc_labelno++);
9680 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9681
9682 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1b (tempLR,
9683 symF,
9684 tocsym)));
9685 rs6000_maybe_dead (emit_move_insn (dest, tempLR));
9686 rs6000_maybe_dead (emit_move_insn (temp0,
9687 gen_rtx_MEM (Pmode, dest)));
9688 }
9689 rs6000_maybe_dead (emit_insn (gen_addsi3 (dest, temp0, dest)));
9ebbca7d 9690 }
20b71b17
AM
9691 else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
9692 {
9693 /* This is for AIX code running in non-PIC ELF32. */
9694 char buf[30];
9695 rtx realsym;
9696 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
9697 realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9698
9699 rs6000_maybe_dead (emit_insn (gen_elf_high (dest, realsym)));
9700 rs6000_maybe_dead (emit_insn (gen_elf_low (dest, dest, realsym)));
9701 }
9702 else if (DEFAULT_ABI == ABI_AIX)
9ebbca7d
GK
9703 {
9704 if (TARGET_32BIT)
20b71b17 9705 rs6000_maybe_dead (emit_insn (gen_load_toc_aix_si (dest)));
9ebbca7d 9706 else
20b71b17 9707 rs6000_maybe_dead (emit_insn (gen_load_toc_aix_di (dest)));
9ebbca7d 9708 }
20b71b17
AM
9709 else
9710 abort ();
9ebbca7d
GK
9711}
9712
9713int
9714get_TOC_alias_set ()
9715{
9716 static int set = -1;
9717 if (set == -1)
9718 set = new_alias_set ();
9719 return set;
9720}
9721
9722/* This retuns nonzero if the current function uses the TOC. This is
9723 determined by the presence of (unspec ... 7), which is generated by
9724 the various load_toc_* patterns. */
a4f6c312 9725
9ebbca7d
GK
9726int
9727uses_TOC ()
9728{
9729 rtx insn;
38c1f2d7 9730
9ebbca7d 9731 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2c3c49de 9732 if (INSN_P (insn))
9ebbca7d
GK
9733 {
9734 rtx pat = PATTERN (insn);
9735 int i;
9736
8cd8f856 9737 if (GET_CODE (pat) == PARALLEL)
9ebbca7d
GK
9738 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
9739 if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == UNSPEC
9740 && XINT (XVECEXP (PATTERN (insn), 0, i), 1) == 7)
9741 return 1;
38c1f2d7 9742 }
9ebbca7d
GK
9743 return 0;
9744}
38c1f2d7 9745
9ebbca7d 9746rtx
a4f6c312 9747create_TOC_reference (symbol)
9ebbca7d
GK
9748 rtx symbol;
9749{
a8a05998
ZW
9750 return gen_rtx_PLUS (Pmode,
9751 gen_rtx_REG (Pmode, TOC_REGISTER),
9752 gen_rtx_CONST (Pmode,
9753 gen_rtx_MINUS (Pmode, symbol,
b999aaeb 9754 gen_rtx_SYMBOL_REF (Pmode, toc_label_name))));
9ebbca7d 9755}
38c1f2d7 9756
9ebbca7d
GK
9757#if TARGET_AIX
9758/* __throw will restore its own return address to be the same as the
9759 return address of the function that the throw is being made to.
9760 This is unfortunate, because we want to check the original
9761 return address to see if we need to restore the TOC.
9762 So we have to squirrel it away here.
9763 This is used only in compiling __throw and __rethrow.
c7ca610e 9764
9ebbca7d
GK
9765 Most of this code should be removed by CSE. */
9766static rtx insn_after_throw;
c7ca610e 9767
a4f6c312 9768/* This does the saving... */
9ebbca7d
GK
9769void
9770rs6000_aix_emit_builtin_unwind_init ()
9771{
9772 rtx mem;
9773 rtx stack_top = gen_reg_rtx (Pmode);
9774 rtx opcode_addr = gen_reg_rtx (Pmode);
9775
9776 insn_after_throw = gen_reg_rtx (SImode);
9777
9778 mem = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
9779 emit_move_insn (stack_top, mem);
9780
9781 mem = gen_rtx_MEM (Pmode,
9782 gen_rtx_PLUS (Pmode, stack_top,
9783 GEN_INT (2 * GET_MODE_SIZE (Pmode))));
9784 emit_move_insn (opcode_addr, mem);
9785 emit_move_insn (insn_after_throw, gen_rtx_MEM (SImode, opcode_addr));
c7ca610e
RK
9786}
9787
a4f6c312
SS
9788/* Emit insns to _restore_ the TOC register, at runtime (specifically
9789 in _eh.o). Only used on AIX.
9ebbca7d
GK
9790
9791 The idea is that on AIX, function calls look like this:
9792 bl somefunction-trampoline
9793 lwz r2,20(sp)
9794
a4f6c312 9795 and later,
9ebbca7d
GK
9796 somefunction-trampoline:
9797 stw r2,20(sp)
9798 ... load function address in the count register ...
9799 bctr
9800 or like this, if the linker determines that this is not a cross-module call
9801 and so the TOC need not be restored:
9802 bl somefunction
9803 nop
9804 or like this, if the compiler could determine that this is not a
9805 cross-module call:
9806 bl somefunction
9807 now, the tricky bit here is that register 2 is saved and restored
9808 by the _linker_, so we can't readily generate debugging information
9809 for it. So we need to go back up the call chain looking at the
9810 insns at return addresses to see which calls saved the TOC register
9811 and so see where it gets restored from.
9812
9813 Oh, and all this gets done in RTL inside the eh_epilogue pattern,
9814 just before the actual epilogue.
9815
9816 On the bright side, this incurs no space or time overhead unless an
9817 exception is thrown, except for the extra code in libgcc.a.
9818
9819 The parameter STACKSIZE is a register containing (at runtime)
9820 the amount to be popped off the stack in addition to the stack frame
9821 of this routine (which will be __throw or __rethrow, and so is
9822 guaranteed to have a stack frame). */
a4f6c312 9823
9ebbca7d
GK
9824void
9825rs6000_emit_eh_toc_restore (stacksize)
9826 rtx stacksize;
9827{
9828 rtx top_of_stack;
9829 rtx bottom_of_stack = gen_reg_rtx (Pmode);
9830 rtx tocompare = gen_reg_rtx (SImode);
9831 rtx opcode = gen_reg_rtx (SImode);
9832 rtx opcode_addr = gen_reg_rtx (Pmode);
9833 rtx mem;
9834 rtx loop_start = gen_label_rtx ();
9835 rtx no_toc_restore_needed = gen_label_rtx ();
9836 rtx loop_exit = gen_label_rtx ();
9837
9838 mem = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
ba4828e0 9839 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
9840 emit_move_insn (bottom_of_stack, mem);
9841
9842 top_of_stack = expand_binop (Pmode, add_optab,
9843 bottom_of_stack, stacksize,
9844 NULL_RTX, 1, OPTAB_WIDEN);
9845
2496c7bd
LB
9846 emit_move_insn (tocompare, gen_int_mode (TARGET_32BIT ? 0x80410014
9847 : 0xE8410028, SImode));
9ebbca7d
GK
9848
9849 if (insn_after_throw == NULL_RTX)
a4f6c312 9850 abort ();
9ebbca7d
GK
9851 emit_move_insn (opcode, insn_after_throw);
9852
6496a589 9853 emit_note (NULL, NOTE_INSN_LOOP_BEG);
9ebbca7d
GK
9854 emit_label (loop_start);
9855
9856 do_compare_rtx_and_jump (opcode, tocompare, NE, 1,
06f4e019 9857 SImode, NULL_RTX, NULL_RTX,
9ebbca7d
GK
9858 no_toc_restore_needed);
9859
9860 mem = gen_rtx_MEM (Pmode,
9861 gen_rtx_PLUS (Pmode, bottom_of_stack,
9862 GEN_INT (5 * GET_MODE_SIZE (Pmode))));
9863 emit_move_insn (gen_rtx_REG (Pmode, 2), mem);
9864
9865 emit_label (no_toc_restore_needed);
9866 do_compare_rtx_and_jump (top_of_stack, bottom_of_stack, EQ, 1,
06f4e019 9867 Pmode, NULL_RTX, NULL_RTX,
9ebbca7d
GK
9868 loop_exit);
9869
9870 mem = gen_rtx_MEM (Pmode, bottom_of_stack);
ba4828e0 9871 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
9872 emit_move_insn (bottom_of_stack, mem);
9873
9874 mem = gen_rtx_MEM (Pmode,
9875 gen_rtx_PLUS (Pmode, bottom_of_stack,
9876 GEN_INT (2 * GET_MODE_SIZE (Pmode))));
9877 emit_move_insn (opcode_addr, mem);
9878 emit_move_insn (opcode, gen_rtx_MEM (SImode, opcode_addr));
9879
6496a589 9880 emit_note (NULL, NOTE_INSN_LOOP_CONT);
9ebbca7d 9881 emit_jump (loop_start);
6496a589 9882 emit_note (NULL, NOTE_INSN_LOOP_END);
9ebbca7d
GK
9883 emit_label (loop_exit);
9884}
9885#endif /* TARGET_AIX */
38c1f2d7 9886\f
ba4828e0
RK
9887/* This ties together stack memory (MEM with an alias set of
9888 rs6000_sr_alias_set) and the change to the stack pointer. */
9889
9ebbca7d
GK
9890static void
9891rs6000_emit_stack_tie ()
9892{
ba4828e0
RK
9893 rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
9894
9895 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
9896 emit_insn (gen_stack_tie (mem));
9897}
38c1f2d7 9898
9ebbca7d
GK
9899/* Emit the correct code for allocating stack space, as insns.
9900 If COPY_R12, make sure a copy of the old frame is left in r12.
9901 The generated code may use hard register 0 as a temporary. */
9902
9903static void
9904rs6000_emit_allocate_stack (size, copy_r12)
9905 HOST_WIDE_INT size;
38c1f2d7
MM
9906 int copy_r12;
9907{
9ebbca7d
GK
9908 rtx insn;
9909 rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
9910 rtx tmp_reg = gen_rtx_REG (Pmode, 0);
9911 rtx todec = GEN_INT (-size);
a157febd
GK
9912
9913 if (current_function_limit_stack)
9914 {
9915 if (REG_P (stack_limit_rtx)
9916 && REGNO (stack_limit_rtx) > 1
9917 && REGNO (stack_limit_rtx) <= 31)
9918 {
9ebbca7d
GK
9919 emit_insn (Pmode == SImode
9920 ? gen_addsi3 (tmp_reg,
9921 stack_limit_rtx,
9922 GEN_INT (size))
9923 : gen_adddi3 (tmp_reg,
9924 stack_limit_rtx,
9925 GEN_INT (size)));
9926
9927 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
9928 const0_rtx));
a157febd
GK
9929 }
9930 else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
9ebbca7d 9931 && TARGET_32BIT
f607bc57 9932 && DEFAULT_ABI == ABI_V4)
a157febd 9933 {
9ebbca7d
GK
9934 rtx toload = gen_rtx_CONST (VOIDmode,
9935 gen_rtx_PLUS (Pmode,
9936 stack_limit_rtx,
9937 GEN_INT (size)));
9938
9939 emit_insn (gen_elf_high (tmp_reg, toload));
9940 emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
9941 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
9942 const0_rtx));
a157febd
GK
9943 }
9944 else
9945 warning ("stack limit expression is not supported");
9946 }
9947
9ebbca7d
GK
9948 if (copy_r12 || ! TARGET_UPDATE)
9949 emit_move_insn (gen_rtx_REG (Pmode, 12), stack_reg);
9950
38c1f2d7
MM
9951 if (TARGET_UPDATE)
9952 {
9ebbca7d 9953 if (size > 32767)
38c1f2d7 9954 {
9ebbca7d
GK
9955 /* Need a note here so that try_split doesn't get confused. */
9956 if (get_last_insn() == NULL_RTX)
9957 emit_note (0, NOTE_INSN_DELETED);
9958 insn = emit_move_insn (tmp_reg, todec);
9959 try_split (PATTERN (insn), insn, 0);
9960 todec = tmp_reg;
38c1f2d7 9961 }
9ebbca7d
GK
9962
9963 if (Pmode == SImode)
9964 insn = emit_insn (gen_movsi_update (stack_reg, stack_reg,
9965 todec, stack_reg));
9966 else
9967 insn = emit_insn (gen_movdi_update (stack_reg, stack_reg,
9968 todec, stack_reg));
38c1f2d7
MM
9969 }
9970 else
9971 {
9ebbca7d
GK
9972 if (Pmode == SImode)
9973 insn = emit_insn (gen_addsi3 (stack_reg, stack_reg, todec));
38c1f2d7 9974 else
9ebbca7d
GK
9975 insn = emit_insn (gen_adddi3 (stack_reg, stack_reg, todec));
9976 emit_move_insn (gen_rtx_MEM (Pmode, stack_reg),
9977 gen_rtx_REG (Pmode, 12));
9978 }
9979
9980 RTX_FRAME_RELATED_P (insn) = 1;
9981 REG_NOTES (insn) =
9982 gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
9983 gen_rtx_SET (VOIDmode, stack_reg,
9984 gen_rtx_PLUS (Pmode, stack_reg,
9985 GEN_INT (-size))),
9986 REG_NOTES (insn));
9987}
9988
9aa86737
AH
9989/* Add a RTX_FRAME_RELATED note so that dwarf2out_frame_debug_expr
9990 knows that:
9991
9992 (mem (plus (blah) (regXX)))
9993
9994 is really:
9995
9996 (mem (plus (blah) (const VALUE_OF_REGXX))). */
9997
9998static void
9999altivec_frame_fixup (insn, reg, val)
10000 rtx insn, reg;
10001 HOST_WIDE_INT val;
10002{
10003 rtx real;
10004
10005 real = copy_rtx (PATTERN (insn));
10006
10007 real = replace_rtx (real, reg, GEN_INT (val));
10008
10009 RTX_FRAME_RELATED_P (insn) = 1;
10010 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
10011 real,
10012 REG_NOTES (insn));
10013}
10014
a4f6c312
SS
10015/* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
10016 with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
10017 is not NULL. It would be nice if dwarf2out_frame_debug_expr could
10018 deduce these equivalences by itself so it wasn't necessary to hold
10019 its hand so much. */
9ebbca7d
GK
10020
10021static void
10022rs6000_frame_related (insn, reg, val, reg2, rreg)
10023 rtx insn;
10024 rtx reg;
10025 HOST_WIDE_INT val;
10026 rtx reg2;
10027 rtx rreg;
10028{
10029 rtx real, temp;
10030
e56c4463
JL
10031 /* copy_rtx will not make unique copies of registers, so we need to
10032 ensure we don't have unwanted sharing here. */
10033 if (reg == reg2)
10034 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
10035
10036 if (reg == rreg)
10037 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
10038
9ebbca7d
GK
10039 real = copy_rtx (PATTERN (insn));
10040
89e7058f
AH
10041 if (reg2 != NULL_RTX)
10042 real = replace_rtx (real, reg2, rreg);
10043
9ebbca7d
GK
10044 real = replace_rtx (real, reg,
10045 gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
10046 STACK_POINTER_REGNUM),
10047 GEN_INT (val)));
10048
10049 /* We expect that 'real' is either a SET or a PARALLEL containing
10050 SETs (and possibly other stuff). In a PARALLEL, all the SETs
10051 are important so they all have to be marked RTX_FRAME_RELATED_P. */
10052
10053 if (GET_CODE (real) == SET)
10054 {
10055 rtx set = real;
10056
10057 temp = simplify_rtx (SET_SRC (set));
10058 if (temp)
10059 SET_SRC (set) = temp;
10060 temp = simplify_rtx (SET_DEST (set));
10061 if (temp)
10062 SET_DEST (set) = temp;
10063 if (GET_CODE (SET_DEST (set)) == MEM)
38c1f2d7 10064 {
9ebbca7d
GK
10065 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
10066 if (temp)
10067 XEXP (SET_DEST (set), 0) = temp;
38c1f2d7 10068 }
38c1f2d7 10069 }
9ebbca7d
GK
10070 else if (GET_CODE (real) == PARALLEL)
10071 {
10072 int i;
10073 for (i = 0; i < XVECLEN (real, 0); i++)
10074 if (GET_CODE (XVECEXP (real, 0, i)) == SET)
10075 {
10076 rtx set = XVECEXP (real, 0, i);
10077
10078 temp = simplify_rtx (SET_SRC (set));
10079 if (temp)
10080 SET_SRC (set) = temp;
10081 temp = simplify_rtx (SET_DEST (set));
10082 if (temp)
10083 SET_DEST (set) = temp;
10084 if (GET_CODE (SET_DEST (set)) == MEM)
10085 {
10086 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
10087 if (temp)
10088 XEXP (SET_DEST (set), 0) = temp;
10089 }
10090 RTX_FRAME_RELATED_P (set) = 1;
10091 }
10092 }
10093 else
a4f6c312 10094 abort ();
9ebbca7d 10095
9ebbca7d
GK
10096 RTX_FRAME_RELATED_P (insn) = 1;
10097 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
10098 real,
10099 REG_NOTES (insn));
38c1f2d7
MM
10100}
10101
00b960c7
AH
10102/* Returns an insn that has a vrsave set operation with the
10103 appropriate CLOBBERs. */
10104
10105static rtx
9aa86737 10106generate_set_vrsave (reg, info, epiloguep)
00b960c7
AH
10107 rtx reg;
10108 rs6000_stack_t *info;
9aa86737 10109 int epiloguep;
00b960c7
AH
10110{
10111 int nclobs, i;
10112 rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
a004eb82 10113 rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
00b960c7 10114
a004eb82
AH
10115 clobs[0]
10116 = gen_rtx_SET (VOIDmode,
10117 vrsave,
10118 gen_rtx_UNSPEC_VOLATILE (SImode,
10119 gen_rtvec (2, reg, vrsave),
10120 30));
00b960c7
AH
10121
10122 nclobs = 1;
10123
9aa86737
AH
10124 /* We need to clobber the registers in the mask so the scheduler
10125 does not move sets to VRSAVE before sets of AltiVec registers.
10126
10127 However, if the function receives nonlocal gotos, reload will set
10128 all call saved registers live. We will end up with:
10129
10130 (set (reg 999) (mem))
10131 (parallel [ (set (reg vrsave) (unspec blah))
10132 (clobber (reg 999))])
10133
10134 The clobber will cause the store into reg 999 to be dead, and
10135 flow will attempt to delete an epilogue insn. In this case, we
10136 need an unspec use/set of the register. */
00b960c7
AH
10137
10138 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
10139 if (info->vrsave_mask != 0 && ALTIVEC_REG_BIT (i) != 0)
9aa86737
AH
10140 {
10141 if (!epiloguep || call_used_regs [i])
10142 clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
10143 gen_rtx_REG (V4SImode, i));
10144 else
10145 {
10146 rtx reg = gen_rtx_REG (V4SImode, i);
9aa86737
AH
10147
10148 clobs[nclobs++]
a004eb82
AH
10149 = gen_rtx_SET (VOIDmode,
10150 reg,
10151 gen_rtx_UNSPEC (V4SImode,
10152 gen_rtvec (1, reg), 27));
9aa86737
AH
10153 }
10154 }
00b960c7
AH
10155
10156 insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
10157
10158 for (i = 0; i < nclobs; ++i)
10159 XVECEXP (insn, 0, i) = clobs[i];
10160
10161 return insn;
10162}
10163
89e7058f
AH
10164/* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
10165 Save REGNO into [FRAME_REG + OFFSET] in mode MODE. */
10166
10167static void
10168emit_frame_save (frame_reg, frame_ptr, mode, regno, offset, total_size)
10169 rtx frame_reg;
10170 rtx frame_ptr;
10171 enum machine_mode mode;
10172 unsigned int regno;
10173 int offset;
10174 int total_size;
10175{
10176 rtx reg, offset_rtx, insn, mem, addr, int_rtx;
10177 rtx replacea, replaceb;
10178
10179 int_rtx = GEN_INT (offset);
10180
10181 /* Some cases that need register indexed addressing. */
10182 if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
a3170dc6
AH
10183 || (TARGET_SPE_ABI
10184 && SPE_VECTOR_MODE (mode)
10185 && !SPE_CONST_OFFSET_OK (offset)))
89e7058f
AH
10186 {
10187 /* Whomever calls us must make sure r11 is available in the
10188 flow path of instructions in the prologue. */
10189 offset_rtx = gen_rtx_REG (Pmode, 11);
10190 emit_move_insn (offset_rtx, int_rtx);
10191
10192 replacea = offset_rtx;
10193 replaceb = int_rtx;
10194 }
10195 else
10196 {
10197 offset_rtx = int_rtx;
10198 replacea = NULL_RTX;
10199 replaceb = NULL_RTX;
10200 }
10201
10202 reg = gen_rtx_REG (mode, regno);
10203 addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
10204 mem = gen_rtx_MEM (mode, addr);
10205 set_mem_alias_set (mem, rs6000_sr_alias_set);
10206
10207 insn = emit_move_insn (mem, reg);
10208
10209 rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
10210}
10211
a3170dc6
AH
10212/* Emit an offset memory reference suitable for a frame store, while
10213 converting to a valid addressing mode. */
10214
10215static rtx
10216gen_frame_mem_offset (mode, reg, offset)
10217 enum machine_mode mode;
10218 rtx reg;
10219 int offset;
10220{
10221 rtx int_rtx, offset_rtx;
10222
10223 int_rtx = GEN_INT (offset);
10224
10225 if (TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
10226 {
10227 offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
10228 emit_move_insn (offset_rtx, int_rtx);
10229 }
10230 else
10231 offset_rtx = int_rtx;
10232
10233 return gen_rtx_MEM (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
10234}
10235
9ebbca7d
GK
10236/* Emit function prologue as insns. */
10237
9878760c 10238void
83720594 10239rs6000_emit_prologue ()
9878760c 10240{
4697a36c 10241 rs6000_stack_t *info = rs6000_stack_info ();
9ebbca7d
GK
10242 enum machine_mode reg_mode = TARGET_POWERPC64 ? DImode : SImode;
10243 int reg_size = TARGET_POWERPC64 ? 8 : 4;
10244 rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
10245 rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
10246 rtx frame_reg_rtx = sp_reg_rtx;
10247 rtx cr_save_rtx = NULL;
10248 rtx insn;
10249 int saving_FPRs_inline;
10250 int using_store_multiple;
10251 HOST_WIDE_INT sp_offset = 0;
10252
a3170dc6
AH
10253 if (TARGET_SPE_ABI)
10254 {
10255 reg_mode = V2SImode;
10256 reg_size = 8;
10257 }
10258
9ebbca7d 10259 using_store_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
a3170dc6 10260 && !TARGET_SPE_ABI
9ebbca7d
GK
10261 && info->first_gp_reg_save < 31);
10262 saving_FPRs_inline = (info->first_fp_reg_save == 64
10263 || FP_SAVE_INLINE (info->first_fp_reg_save));
10264
10265 /* For V.4, update stack before we do any saving and set back pointer. */
f607bc57 10266 if (info->push_p && DEFAULT_ABI == ABI_V4)
9ebbca7d
GK
10267 {
10268 if (info->total_size < 32767)
10269 sp_offset = info->total_size;
10270 else
10271 frame_reg_rtx = frame_ptr_rtx;
10272 rs6000_emit_allocate_stack (info->total_size,
10273 (frame_reg_rtx != sp_reg_rtx
10274 && (info->cr_save_p
10275 || info->lr_save_p
10276 || info->first_fp_reg_save < 64
10277 || info->first_gp_reg_save < 32
10278 )));
10279 if (frame_reg_rtx != sp_reg_rtx)
10280 rs6000_emit_stack_tie ();
10281 }
10282
9aa86737
AH
10283 /* Save AltiVec registers if needed. */
10284 if (TARGET_ALTIVEC_ABI && info->altivec_size != 0)
10285 {
10286 int i;
10287
10288 /* There should be a non inline version of this, for when we
10289 are saving lots of vector registers. */
10290 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
10291 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
10292 {
10293 rtx areg, savereg, mem;
10294 int offset;
10295
10296 offset = info->altivec_save_offset + sp_offset
10297 + 16 * (i - info->first_altivec_reg_save);
10298
10299 savereg = gen_rtx_REG (V4SImode, i);
10300
10301 areg = gen_rtx_REG (Pmode, 0);
10302 emit_move_insn (areg, GEN_INT (offset));
10303
10304 /* AltiVec addressing mode is [reg+reg]. */
10305 mem = gen_rtx_MEM (V4SImode,
10306 gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
10307
10308 set_mem_alias_set (mem, rs6000_sr_alias_set);
10309
10310 insn = emit_move_insn (mem, savereg);
10311
10312 altivec_frame_fixup (insn, areg, offset);
10313 }
10314 }
10315
10316 /* VRSAVE is a bit vector representing which AltiVec registers
10317 are used. The OS uses this to determine which vector
10318 registers to save on a context switch. We need to save
10319 VRSAVE on the stack frame, add whatever AltiVec registers we
10320 used in this function, and do the corresponding magic in the
10321 epilogue. */
10322
10323 if (TARGET_ALTIVEC && info->vrsave_mask != 0)
10324 {
a004eb82 10325 rtx reg, mem, vrsave;
9aa86737
AH
10326 int offset;
10327
10328 /* Get VRSAVE onto a GPR. */
10329 reg = gen_rtx_REG (SImode, 12);
a004eb82 10330 vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
b188f760
AH
10331 if (TARGET_MACHO)
10332 emit_insn (gen_get_vrsave_internal (reg));
10333 else
10334 emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
9aa86737
AH
10335
10336 /* Save VRSAVE. */
10337 offset = info->vrsave_save_offset + sp_offset;
10338 mem
10339 = gen_rtx_MEM (SImode,
10340 gen_rtx_PLUS (Pmode, frame_reg_rtx, GEN_INT (offset)));
10341 set_mem_alias_set (mem, rs6000_sr_alias_set);
10342 insn = emit_move_insn (mem, reg);
10343
10344 /* Include the registers in the mask. */
10345 emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
10346
10347 insn = emit_insn (generate_set_vrsave (reg, info, 0));
10348 }
10349
9ebbca7d
GK
10350 /* If we use the link register, get it into r0. */
10351 if (info->lr_save_p)
71f123ca 10352 emit_move_insn (gen_rtx_REG (Pmode, 0),
9ebbca7d
GK
10353 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
10354
10355 /* If we need to save CR, put it into r12. */
10356 if (info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
10357 {
10358 cr_save_rtx = gen_rtx_REG (SImode, 12);
10359 emit_insn (gen_movesi_from_cr (cr_save_rtx));
10360 }
10361
a4f6c312
SS
10362 /* Do any required saving of fpr's. If only one or two to save, do
10363 it ourselves. Otherwise, call function. */
9ebbca7d
GK
10364 if (saving_FPRs_inline)
10365 {
10366 int i;
10367 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
10368 if ((regs_ever_live[info->first_fp_reg_save+i]
10369 && ! call_used_regs[info->first_fp_reg_save+i]))
89e7058f
AH
10370 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, DFmode,
10371 info->first_fp_reg_save + i,
10372 info->fp_save_offset + sp_offset + 8 * i,
10373 info->total_size);
9ebbca7d
GK
10374 }
10375 else if (info->first_fp_reg_save != 64)
10376 {
10377 int i;
10378 char rname[30];
520a57c8 10379 const char *alloc_rname;
9ebbca7d
GK
10380 rtvec p;
10381 p = rtvec_alloc (2 + 64 - info->first_fp_reg_save);
10382
10383 RTVEC_ELT (p, 0) = gen_rtx_CLOBBER (VOIDmode,
10384 gen_rtx_REG (Pmode,
10385 LINK_REGISTER_REGNUM));
10386 sprintf (rname, "%s%d%s", SAVE_FP_PREFIX,
10387 info->first_fp_reg_save - 32, SAVE_FP_SUFFIX);
a8a05998 10388 alloc_rname = ggc_strdup (rname);
9ebbca7d
GK
10389 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
10390 gen_rtx_SYMBOL_REF (Pmode,
10391 alloc_rname));
10392 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
10393 {
10394 rtx addr, reg, mem;
10395 reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
10396 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10397 GEN_INT (info->fp_save_offset
10398 + sp_offset + 8*i));
10399 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 10400 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10401
10402 RTVEC_ELT (p, i + 2) = gen_rtx_SET (VOIDmode, mem, reg);
10403 }
10404 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
10405 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
10406 NULL_RTX, NULL_RTX);
10407 }
b6c9286a 10408
9ebbca7d
GK
10409 /* Save GPRs. This is done as a PARALLEL if we are using
10410 the store-multiple instructions. */
10411 if (using_store_multiple)
b6c9286a 10412 {
308c142a 10413 rtvec p;
9ebbca7d
GK
10414 int i;
10415 p = rtvec_alloc (32 - info->first_gp_reg_save);
9ebbca7d
GK
10416 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
10417 {
10418 rtx addr, reg, mem;
10419 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
10420 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10421 GEN_INT (info->gp_save_offset
10422 + sp_offset
10423 + reg_size * i));
10424 mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0 10425 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10426
10427 RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
10428 }
10429 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
10430 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
10431 NULL_RTX, NULL_RTX);
b6c9286a
MM
10432 }
10433 else
10434 {
9ebbca7d
GK
10435 int i;
10436 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
10437 if ((regs_ever_live[info->first_gp_reg_save+i]
10438 && ! call_used_regs[info->first_gp_reg_save+i])
1db02437 10439 || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
f607bc57
ZW
10440 && ((DEFAULT_ABI == ABI_V4 && flag_pic == 1)
10441 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
a3170dc6
AH
10442 {
10443 rtx addr, reg, mem;
10444 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
10445
10446 if (TARGET_SPE_ABI)
10447 {
10448 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
10449 rtx b;
10450
10451 if (!SPE_CONST_OFFSET_OK (offset))
10452 {
10453 b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
10454 emit_move_insn (b, GEN_INT (offset));
10455 }
10456 else
10457 b = GEN_INT (offset);
10458
10459 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
10460 mem = gen_rtx_MEM (V2SImode, addr);
10461 set_mem_alias_set (mem, rs6000_sr_alias_set);
10462 insn = emit_move_insn (mem, reg);
10463
10464 if (GET_CODE (b) == CONST_INT)
10465 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
10466 NULL_RTX, NULL_RTX);
10467 else
10468 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
10469 b, GEN_INT (offset));
10470 }
10471 else
10472 {
10473 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10474 GEN_INT (info->gp_save_offset
10475 + sp_offset
10476 + reg_size * i));
10477 mem = gen_rtx_MEM (reg_mode, addr);
10478 set_mem_alias_set (mem, rs6000_sr_alias_set);
10479
10480 insn = emit_move_insn (mem, reg);
10481 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
10482 NULL_RTX, NULL_RTX);
10483 }
10484 }
9ebbca7d
GK
10485 }
10486
83720594
RH
10487 /* ??? There's no need to emit actual instructions here, but it's the
10488 easiest way to get the frame unwind information emitted. */
10489 if (current_function_calls_eh_return)
10490 {
78e1b90d
DE
10491 unsigned int i, regno;
10492
83720594
RH
10493 for (i = 0; ; ++i)
10494 {
83720594
RH
10495 regno = EH_RETURN_DATA_REGNO (i);
10496 if (regno == INVALID_REGNUM)
10497 break;
10498
89e7058f
AH
10499 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
10500 info->ehrd_offset + sp_offset
10501 + reg_size * (int) i,
10502 info->total_size);
83720594
RH
10503 }
10504 }
10505
9ebbca7d
GK
10506 /* Save lr if we used it. */
10507 if (info->lr_save_p)
10508 {
10509 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10510 GEN_INT (info->lr_save_offset + sp_offset));
10511 rtx reg = gen_rtx_REG (Pmode, 0);
10512 rtx mem = gen_rtx_MEM (Pmode, addr);
10513 /* This should not be of rs6000_sr_alias_set, because of
10514 __builtin_return_address. */
10515
10516 insn = emit_move_insn (mem, reg);
10517 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
10518 reg, gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
10519 }
10520
10521 /* Save CR if we use any that must be preserved. */
10522 if (info->cr_save_p)
10523 {
10524 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10525 GEN_INT (info->cr_save_offset + sp_offset));
10526 rtx mem = gen_rtx_MEM (SImode, addr);
ba4828e0
RK
10527
10528 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10529
10530 /* If r12 was used to hold the original sp, copy cr into r0 now
10531 that it's free. */
10532 if (REGNO (frame_reg_rtx) == 12)
10533 {
10534 cr_save_rtx = gen_rtx_REG (SImode, 0);
10535 emit_insn (gen_movesi_from_cr (cr_save_rtx));
10536 }
10537 insn = emit_move_insn (mem, cr_save_rtx);
10538
10539 /* Now, there's no way that dwarf2out_frame_debug_expr is going
10540 to understand '(unspec:SI [(reg:CC 68) ...] 19)'. But that's
10541 OK. All we have to do is specify that _one_ condition code
10542 register is saved in this stack slot. The thrower's epilogue
a1dc9455
FS
10543 will then restore all the call-saved registers.
10544 We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux. */
9ebbca7d 10545 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
a1dc9455 10546 cr_save_rtx, gen_rtx_REG (SImode, CR2_REGNO));
9ebbca7d
GK
10547 }
10548
10549 /* Update stack and set back pointer unless this is V.4,
10550 for which it was done previously. */
f607bc57 10551 if (info->push_p && DEFAULT_ABI != ABI_V4)
9ebbca7d
GK
10552 rs6000_emit_allocate_stack (info->total_size, FALSE);
10553
10554 /* Set frame pointer, if needed. */
10555 if (frame_pointer_needed)
10556 {
a3170dc6 10557 insn = emit_move_insn (gen_rtx_REG (Pmode, FRAME_POINTER_REGNUM),
9ebbca7d
GK
10558 sp_reg_rtx);
10559 RTX_FRAME_RELATED_P (insn) = 1;
b6c9286a 10560 }
9878760c 10561
1db02437 10562 /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up. */
9ebbca7d 10563 if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
f607bc57 10564 || (DEFAULT_ABI == ABI_V4 && flag_pic == 1
1db02437 10565 && regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM]))
9ebbca7d
GK
10566 {
10567 /* If emit_load_toc_table will use the link register, we need to save
10568 it. We use R11 for this purpose because emit_load_toc_table
10569 can use register 0. This allows us to use a plain 'blr' to return
10570 from the procedure more often. */
d5fa86ba
GK
10571 int save_LR_around_toc_setup = (TARGET_ELF && flag_pic != 0
10572 && ! info->lr_save_p
10573 && EXIT_BLOCK_PTR->pred != NULL);
9ebbca7d
GK
10574 if (save_LR_around_toc_setup)
10575 emit_move_insn (gen_rtx_REG (Pmode, 11),
10576 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
10577
10578 rs6000_emit_load_toc_table (TRUE);
10579
10580 if (save_LR_around_toc_setup)
10581 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM),
10582 gen_rtx_REG (Pmode, 11));
10583 }
ee890fe2 10584
fcce224d 10585#if TARGET_MACHO
ee890fe2
SS
10586 if (DEFAULT_ABI == ABI_DARWIN
10587 && flag_pic && current_function_uses_pic_offset_table)
10588 {
10589 rtx dest = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
f51eee6a
GK
10590 char *picbase = machopic_function_base_name ();
10591 rtx src = gen_rtx_SYMBOL_REF (Pmode, ggc_alloc_string (picbase, -1));
ee890fe2 10592
f51eee6a 10593 rs6000_maybe_dead (emit_insn (gen_load_macho_picbase (dest, src)));
ee890fe2
SS
10594
10595 rs6000_maybe_dead (
1db02437 10596 emit_move_insn (gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM),
ee890fe2
SS
10597 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)));
10598 }
fcce224d 10599#endif
9ebbca7d
GK
10600}
10601
9ebbca7d 10602/* Write function prologue. */
a4f6c312 10603
08c148a8
NB
10604static void
10605rs6000_output_function_prologue (file, size)
9ebbca7d 10606 FILE *file;
08c148a8 10607 HOST_WIDE_INT size ATTRIBUTE_UNUSED;
9ebbca7d
GK
10608{
10609 rs6000_stack_t *info = rs6000_stack_info ();
10610
4697a36c
MM
10611 if (TARGET_DEBUG_STACK)
10612 debug_stack_info (info);
9878760c 10613
a4f6c312
SS
10614 /* Write .extern for any function we will call to save and restore
10615 fp values. */
10616 if (info->first_fp_reg_save < 64
10617 && !FP_SAVE_INLINE (info->first_fp_reg_save))
4d30c363 10618 fprintf (file, "\t.extern %s%d%s\n\t.extern %s%d%s\n",
4697a36c 10619 SAVE_FP_PREFIX, info->first_fp_reg_save - 32, SAVE_FP_SUFFIX,
a4f6c312
SS
10620 RESTORE_FP_PREFIX, info->first_fp_reg_save - 32,
10621 RESTORE_FP_SUFFIX);
9878760c 10622
c764f757
RK
10623 /* Write .extern for AIX common mode routines, if needed. */
10624 if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
10625 {
f6709c70
JW
10626 fputs ("\t.extern __mulh\n", file);
10627 fputs ("\t.extern __mull\n", file);
10628 fputs ("\t.extern __divss\n", file);
10629 fputs ("\t.extern __divus\n", file);
10630 fputs ("\t.extern __quoss\n", file);
10631 fputs ("\t.extern __quous\n", file);
c764f757
RK
10632 common_mode_defined = 1;
10633 }
9878760c 10634
9ebbca7d 10635 if (! HAVE_prologue)
979721f8 10636 {
9ebbca7d 10637 start_sequence ();
9dda4cc8 10638
a4f6c312
SS
10639 /* A NOTE_INSN_DELETED is supposed to be at the start and end of
10640 the "toplevel" insn chain. */
9ebbca7d
GK
10641 emit_note (0, NOTE_INSN_DELETED);
10642 rs6000_emit_prologue ();
10643 emit_note (0, NOTE_INSN_DELETED);
178c3eff
DJ
10644
10645 /* Expand INSN_ADDRESSES so final() doesn't crash. */
10646 {
10647 rtx insn;
10648 unsigned addr = 0;
10649 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
10650 {
10651 INSN_ADDRESSES_NEW (insn, addr);
10652 addr += 4;
10653 }
10654 }
9dda4cc8 10655
9ebbca7d 10656 if (TARGET_DEBUG_STACK)
a4f6c312
SS
10657 debug_rtx_list (get_insns (), 100);
10658 final (get_insns (), file, FALSE, FALSE);
9ebbca7d 10659 end_sequence ();
979721f8
MM
10660 }
10661
9ebbca7d
GK
10662 rs6000_pic_labelno++;
10663}
10664
10665/* Emit function epilogue as insns.
9878760c 10666
9ebbca7d
GK
10667 At present, dwarf2out_frame_debug_expr doesn't understand
10668 register restores, so we don't bother setting RTX_FRAME_RELATED_P
10669 anywhere in the epilogue. Most of the insns below would in any case
10670 need special notes to explain where r11 is in relation to the stack. */
9878760c 10671
9ebbca7d 10672void
83720594 10673rs6000_emit_epilogue (sibcall)
9ebbca7d
GK
10674 int sibcall;
10675{
10676 rs6000_stack_t *info;
10677 int restoring_FPRs_inline;
10678 int using_load_multiple;
10679 int using_mfcr_multiple;
10680 int use_backchain_to_restore_sp;
10681 int sp_offset = 0;
10682 rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
10683 rtx frame_reg_rtx = sp_reg_rtx;
10684 enum machine_mode reg_mode = TARGET_POWERPC64 ? DImode : SImode;
10685 int reg_size = TARGET_POWERPC64 ? 8 : 4;
10686 int i;
10687
a3170dc6
AH
10688 if (TARGET_SPE_ABI)
10689 {
10690 reg_mode = V2SImode;
10691 reg_size = 8;
10692 }
10693
9ebbca7d
GK
10694 info = rs6000_stack_info ();
10695 using_load_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
a3170dc6 10696 && !TARGET_SPE_ABI
9ebbca7d
GK
10697 && info->first_gp_reg_save < 31);
10698 restoring_FPRs_inline = (sibcall
83720594 10699 || current_function_calls_eh_return
9ebbca7d
GK
10700 || info->first_fp_reg_save == 64
10701 || FP_SAVE_INLINE (info->first_fp_reg_save));
10702 use_backchain_to_restore_sp = (frame_pointer_needed
10703 || current_function_calls_alloca
10704 || info->total_size > 32767);
10705 using_mfcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
10706 || rs6000_cpu == PROCESSOR_PPC603
10707 || rs6000_cpu == PROCESSOR_PPC750
10708 || optimize_size);
10709
10710 /* If we have a frame pointer, a call to alloca, or a large stack
10711 frame, restore the old stack pointer using the backchain. Otherwise,
10712 we know what size to update it with. */
10713 if (use_backchain_to_restore_sp)
bacbde18 10714 {
9ebbca7d
GK
10715 /* Under V.4, don't reset the stack pointer until after we're done
10716 loading the saved registers. */
f607bc57 10717 if (DEFAULT_ABI == ABI_V4)
9ebbca7d 10718 frame_reg_rtx = gen_rtx_REG (Pmode, 11);
4697a36c 10719
9ebbca7d
GK
10720 emit_move_insn (frame_reg_rtx,
10721 gen_rtx_MEM (Pmode, sp_reg_rtx));
10722
bacbde18 10723 }
9ebbca7d 10724 else if (info->push_p)
85638c0d 10725 {
f607bc57 10726 if (DEFAULT_ABI == ABI_V4)
9ebbca7d
GK
10727 sp_offset = info->total_size;
10728 else
10729 {
10730 emit_insn (TARGET_32BIT
10731 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
10732 GEN_INT (info->total_size))
10733 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
10734 GEN_INT (info->total_size)));
10735 }
85638c0d 10736 }
9ebbca7d 10737
9aa86737
AH
10738 /* Restore AltiVec registers if needed. */
10739 if (TARGET_ALTIVEC_ABI && info->altivec_size != 0)
10740 {
10741 int i;
10742
10743 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
10744 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
10745 {
10746 rtx addr, areg, mem;
10747
10748 areg = gen_rtx_REG (Pmode, 0);
10749 emit_move_insn
10750 (areg, GEN_INT (info->altivec_save_offset
10751 + sp_offset
10752 + 16 * (i - info->first_altivec_reg_save)));
10753
10754 /* AltiVec addressing mode is [reg+reg]. */
10755 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
10756 mem = gen_rtx_MEM (V4SImode, addr);
10757 set_mem_alias_set (mem, rs6000_sr_alias_set);
10758
10759 emit_move_insn (gen_rtx_REG (V4SImode, i), mem);
10760 }
10761 }
10762
10763 /* Restore VRSAVE if needed. */
10764 if (TARGET_ALTIVEC_ABI && info->vrsave_mask != 0)
10765 {
10766 rtx addr, mem, reg;
10767
10768 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10769 GEN_INT (info->vrsave_save_offset + sp_offset));
10770 mem = gen_rtx_MEM (SImode, addr);
10771 set_mem_alias_set (mem, rs6000_sr_alias_set);
10772 reg = gen_rtx_REG (SImode, 12);
10773 emit_move_insn (reg, mem);
10774
10775 emit_insn (generate_set_vrsave (reg, info, 1));
10776 }
10777
9ebbca7d
GK
10778 /* Get the old lr if we saved it. */
10779 if (info->lr_save_p)
b6c9286a 10780 {
a3170dc6
AH
10781 rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
10782 info->lr_save_offset + sp_offset);
ba4828e0
RK
10783
10784 set_mem_alias_set (mem, rs6000_sr_alias_set);
b6c9286a 10785
9ebbca7d 10786 emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
b6c9286a 10787 }
9ebbca7d
GK
10788
10789 /* Get the old cr if we saved it. */
10790 if (info->cr_save_p)
10791 {
10792 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10793 GEN_INT (info->cr_save_offset + sp_offset));
10794 rtx mem = gen_rtx_MEM (SImode, addr);
ba4828e0
RK
10795
10796 set_mem_alias_set (mem, rs6000_sr_alias_set);
b6c9286a 10797
9ebbca7d
GK
10798 emit_move_insn (gen_rtx_REG (SImode, 12), mem);
10799 }
10800
10801 /* Set LR here to try to overlap restores below. */
4697a36c 10802 if (info->lr_save_p)
9ebbca7d
GK
10803 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM),
10804 gen_rtx_REG (Pmode, 0));
10805
83720594
RH
10806 /* Load exception handler data registers, if needed. */
10807 if (current_function_calls_eh_return)
10808 {
78e1b90d
DE
10809 unsigned int i, regno;
10810
83720594
RH
10811 for (i = 0; ; ++i)
10812 {
a3170dc6 10813 rtx mem;
83720594
RH
10814
10815 regno = EH_RETURN_DATA_REGNO (i);
10816 if (regno == INVALID_REGNUM)
10817 break;
10818
a3170dc6
AH
10819 mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
10820 info->ehrd_offset + sp_offset
10821 + reg_size * (int) i);
ba4828e0 10822 set_mem_alias_set (mem, rs6000_sr_alias_set);
83720594
RH
10823
10824 emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
10825 }
10826 }
9ebbca7d
GK
10827
10828 /* Restore GPRs. This is done as a PARALLEL if we are using
10829 the load-multiple instructions. */
10830 if (using_load_multiple)
979721f8 10831 {
9ebbca7d
GK
10832 rtvec p;
10833 p = rtvec_alloc (32 - info->first_gp_reg_save);
10834 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
979721f8 10835 {
9ebbca7d
GK
10836 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10837 GEN_INT (info->gp_save_offset
10838 + sp_offset
10839 + reg_size * i));
10840 rtx mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0
RK
10841
10842 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10843
10844 RTVEC_ELT (p, i) =
10845 gen_rtx_SET (VOIDmode,
10846 gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
10847 mem);
979721f8 10848 }
9ebbca7d 10849 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
979721f8 10850 }
9ebbca7d
GK
10851 else
10852 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
10853 if ((regs_ever_live[info->first_gp_reg_save+i]
10854 && ! call_used_regs[info->first_gp_reg_save+i])
1db02437 10855 || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
f607bc57
ZW
10856 && ((DEFAULT_ABI == ABI_V4 && flag_pic == 1)
10857 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
9ebbca7d
GK
10858 {
10859 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10860 GEN_INT (info->gp_save_offset
10861 + sp_offset
10862 + reg_size * i));
10863 rtx mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0 10864
a3170dc6
AH
10865 /* Restore 64-bit quantities for SPE. */
10866 if (TARGET_SPE_ABI)
10867 {
10868 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
10869 rtx b;
10870
10871 if (!SPE_CONST_OFFSET_OK (offset))
10872 {
10873 b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
10874 emit_move_insn (b, GEN_INT (offset));
10875 }
10876 else
10877 b = GEN_INT (offset);
10878
10879 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
10880 mem = gen_rtx_MEM (V2SImode, addr);
10881 }
10882
ba4828e0 10883 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10884
10885 emit_move_insn (gen_rtx_REG (reg_mode,
a3170dc6 10886 info->first_gp_reg_save + i), mem);
9ebbca7d 10887 }
9878760c 10888
9ebbca7d
GK
10889 /* Restore fpr's if we need to do it without calling a function. */
10890 if (restoring_FPRs_inline)
10891 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
10892 if ((regs_ever_live[info->first_fp_reg_save+i]
10893 && ! call_used_regs[info->first_fp_reg_save+i]))
10894 {
10895 rtx addr, mem;
10896 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
10897 GEN_INT (info->fp_save_offset
10898 + sp_offset
a4f6c312 10899 + 8 * i));
9ebbca7d 10900 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 10901 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10902
10903 emit_move_insn (gen_rtx_REG (DFmode,
10904 info->first_fp_reg_save + i),
10905 mem);
10906 }
8d30c4ee 10907
9ebbca7d
GK
10908 /* If we saved cr, restore it here. Just those that were used. */
10909 if (info->cr_save_p)
979721f8 10910 {
9ebbca7d 10911 rtx r12_rtx = gen_rtx_REG (SImode, 12);
e35b9579 10912 int count = 0;
9ebbca7d
GK
10913
10914 if (using_mfcr_multiple)
979721f8 10915 {
9ebbca7d
GK
10916 for (i = 0; i < 8; i++)
10917 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
e35b9579 10918 count++;
9ebbca7d 10919 if (count == 0)
e35b9579
GK
10920 abort ();
10921 }
10922
10923 if (using_mfcr_multiple && count > 1)
10924 {
10925 rtvec p;
10926 int ndx;
9ebbca7d 10927
e35b9579 10928 p = rtvec_alloc (count);
9ebbca7d 10929
e35b9579 10930 ndx = 0;
9ebbca7d
GK
10931 for (i = 0; i < 8; i++)
10932 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
10933 {
10934 rtvec r = rtvec_alloc (2);
10935 RTVEC_ELT (r, 0) = r12_rtx;
10936 RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
e35b9579 10937 RTVEC_ELT (p, ndx) =
9ebbca7d
GK
10938 gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
10939 gen_rtx_UNSPEC (CCmode, r, 20));
e35b9579 10940 ndx++;
9ebbca7d
GK
10941 }
10942 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
e35b9579
GK
10943 if (ndx != count)
10944 abort ();
979721f8
MM
10945 }
10946 else
9ebbca7d
GK
10947 for (i = 0; i < 8; i++)
10948 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
979721f8 10949 {
9ebbca7d
GK
10950 emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
10951 CR0_REGNO+i),
10952 r12_rtx));
979721f8 10953 }
979721f8
MM
10954 }
10955
9ebbca7d
GK
10956 /* If this is V.4, unwind the stack pointer after all of the loads
10957 have been done. We need to emit a block here so that sched
10958 doesn't decide to move the sp change before the register restores
10959 (which may not have any obvious dependency on the stack). This
10960 doesn't hurt performance, because there is no scheduling that can
10961 be done after this point. */
f607bc57 10962 if (DEFAULT_ABI == ABI_V4)
b6c9286a 10963 {
9ebbca7d
GK
10964 if (frame_reg_rtx != sp_reg_rtx)
10965 rs6000_emit_stack_tie ();
b6c9286a 10966
9ebbca7d 10967 if (use_backchain_to_restore_sp)
b6c9286a 10968 {
9ebbca7d 10969 emit_move_insn (sp_reg_rtx, frame_reg_rtx);
b6c9286a 10970 }
9ebbca7d 10971 else if (sp_offset != 0)
13f1623b 10972 {
9ebbca7d
GK
10973 emit_insn (Pmode == SImode
10974 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
10975 GEN_INT (sp_offset))
10976 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
10977 GEN_INT (sp_offset)));
13f1623b 10978 }
9ebbca7d 10979 }
b6c9286a 10980
83720594
RH
10981 if (current_function_calls_eh_return)
10982 {
10983 rtx sa = EH_RETURN_STACKADJ_RTX;
10984 emit_insn (Pmode == SImode
10985 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx, sa)
10986 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx, sa));
10987 }
10988
9ebbca7d
GK
10989 if (!sibcall)
10990 {
10991 rtvec p;
10992 if (! restoring_FPRs_inline)
10993 p = rtvec_alloc (3 + 64 - info->first_fp_reg_save);
10994 else
10995 p = rtvec_alloc (2);
b6c9286a 10996
e35b9579
GK
10997 RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
10998 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
9ebbca7d
GK
10999 gen_rtx_REG (Pmode,
11000 LINK_REGISTER_REGNUM));
9ebbca7d
GK
11001
11002 /* If we have to restore more than two FP registers, branch to the
11003 restore function. It will return to our caller. */
11004 if (! restoring_FPRs_inline)
11005 {
11006 int i;
11007 char rname[30];
520a57c8 11008 const char *alloc_rname;
979721f8 11009
9ebbca7d
GK
11010 sprintf (rname, "%s%d%s", RESTORE_FP_PREFIX,
11011 info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX);
a8a05998 11012 alloc_rname = ggc_strdup (rname);
9ebbca7d
GK
11013 RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode,
11014 gen_rtx_SYMBOL_REF (Pmode,
11015 alloc_rname));
b6c9286a 11016
9ebbca7d
GK
11017 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
11018 {
11019 rtx addr, mem;
11020 addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
11021 GEN_INT (info->fp_save_offset + 8*i));
11022 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 11023 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
11024
11025 RTVEC_ELT (p, i+3) =
11026 gen_rtx_SET (VOIDmode,
11027 gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
11028 mem);
b6c9286a
MM
11029 }
11030 }
9ebbca7d
GK
11031
11032 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
3daf36a4 11033 }
9878760c
RK
11034}
11035
11036/* Write function epilogue. */
11037
08c148a8
NB
11038static void
11039rs6000_output_function_epilogue (file, size)
9878760c 11040 FILE *file;
08c148a8 11041 HOST_WIDE_INT size ATTRIBUTE_UNUSED;
9878760c 11042{
4697a36c 11043 rs6000_stack_t *info = rs6000_stack_info ();
9878760c 11044
9ebbca7d 11045 if (! HAVE_epilogue)
9878760c 11046 {
9ebbca7d
GK
11047 rtx insn = get_last_insn ();
11048 /* If the last insn was a BARRIER, we don't have to write anything except
11049 the trace table. */
11050 if (GET_CODE (insn) == NOTE)
11051 insn = prev_nonnote_insn (insn);
11052 if (insn == 0 || GET_CODE (insn) != BARRIER)
4697a36c 11053 {
9ebbca7d
GK
11054 /* This is slightly ugly, but at least we don't have two
11055 copies of the epilogue-emitting code. */
11056 start_sequence ();
11057
11058 /* A NOTE_INSN_DELETED is supposed to be at the start
11059 and end of the "toplevel" insn chain. */
11060 emit_note (0, NOTE_INSN_DELETED);
11061 rs6000_emit_epilogue (FALSE);
11062 emit_note (0, NOTE_INSN_DELETED);
11063
178c3eff
DJ
11064 /* Expand INSN_ADDRESSES so final() doesn't crash. */
11065 {
11066 rtx insn;
11067 unsigned addr = 0;
11068 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
11069 {
11070 INSN_ADDRESSES_NEW (insn, addr);
11071 addr += 4;
11072 }
11073 }
11074
9ebbca7d 11075 if (TARGET_DEBUG_STACK)
a4f6c312
SS
11076 debug_rtx_list (get_insns (), 100);
11077 final (get_insns (), file, FALSE, FALSE);
9ebbca7d 11078 end_sequence ();
4697a36c 11079 }
9878760c 11080 }
b4ac57ab 11081
9b30bae2 11082 /* Output a traceback table here. See /usr/include/sys/debug.h for info
314fc5a9
ILT
11083 on its format.
11084
11085 We don't output a traceback table if -finhibit-size-directive was
11086 used. The documentation for -finhibit-size-directive reads
11087 ``don't output a @code{.size} assembler directive, or anything
11088 else that would cause trouble if the function is split in the
11089 middle, and the two halves are placed at locations far apart in
11090 memory.'' The traceback table has this property, since it
11091 includes the offset from the start of the function to the
4d30c363
MM
11092 traceback table itself.
11093
11094 System V.4 Powerpc's (and the embedded ABI derived from it) use a
b6c9286a 11095 different traceback table. */
57ac7be9
AM
11096 if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
11097 && rs6000_traceback != traceback_none)
9b30bae2 11098 {
69c75916 11099 const char *fname = NULL;
3ac88239 11100 const char *language_string = lang_hooks.name;
6041bf2f 11101 int fixed_parms = 0, float_parms = 0, parm_info = 0;
314fc5a9 11102 int i;
57ac7be9
AM
11103 int optional_tbtab;
11104
11105 if (rs6000_traceback == traceback_full)
11106 optional_tbtab = 1;
11107 else if (rs6000_traceback == traceback_part)
11108 optional_tbtab = 0;
11109 else
11110 optional_tbtab = !optimize_size && !TARGET_ELF;
314fc5a9 11111
69c75916
AM
11112 if (optional_tbtab)
11113 {
11114 fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
11115 while (*fname == '.') /* V.4 encodes . in the name */
11116 fname++;
11117
11118 /* Need label immediately before tbtab, so we can compute
11119 its offset from the function start. */
11120 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
11121 ASM_OUTPUT_LABEL (file, fname);
11122 }
314fc5a9
ILT
11123
11124 /* The .tbtab pseudo-op can only be used for the first eight
11125 expressions, since it can't handle the possibly variable
11126 length fields that follow. However, if you omit the optional
11127 fields, the assembler outputs zeros for all optional fields
11128 anyways, giving each variable length field is minimum length
11129 (as defined in sys/debug.h). Thus we can not use the .tbtab
11130 pseudo-op at all. */
11131
11132 /* An all-zero word flags the start of the tbtab, for debuggers
11133 that have to find it by searching forward from the entry
11134 point or from the current pc. */
19d2d16f 11135 fputs ("\t.long 0\n", file);
314fc5a9
ILT
11136
11137 /* Tbtab format type. Use format type 0. */
19d2d16f 11138 fputs ("\t.byte 0,", file);
314fc5a9
ILT
11139
11140 /* Language type. Unfortunately, there doesn't seem to be any
11141 official way to get this info, so we use language_string. C
11142 is 0. C++ is 9. No number defined for Obj-C, so use the
9517ead8 11143 value for C for now. There is no official value for Java,
6f573ff9 11144 although IBM appears to be using 13. There is no official value
f710504c 11145 for Chill, so we've chosen 44 pseudo-randomly. */
314fc5a9 11146 if (! strcmp (language_string, "GNU C")
e2c953b6 11147 || ! strcmp (language_string, "GNU Objective-C"))
314fc5a9
ILT
11148 i = 0;
11149 else if (! strcmp (language_string, "GNU F77"))
11150 i = 1;
11151 else if (! strcmp (language_string, "GNU Ada"))
11152 i = 3;
8b83775b 11153 else if (! strcmp (language_string, "GNU Pascal"))
314fc5a9
ILT
11154 i = 2;
11155 else if (! strcmp (language_string, "GNU C++"))
11156 i = 9;
9517ead8
AG
11157 else if (! strcmp (language_string, "GNU Java"))
11158 i = 13;
6f573ff9
JL
11159 else if (! strcmp (language_string, "GNU CHILL"))
11160 i = 44;
314fc5a9
ILT
11161 else
11162 abort ();
11163 fprintf (file, "%d,", i);
11164
11165 /* 8 single bit fields: global linkage (not set for C extern linkage,
11166 apparently a PL/I convention?), out-of-line epilogue/prologue, offset
11167 from start of procedure stored in tbtab, internal function, function
11168 has controlled storage, function has no toc, function uses fp,
11169 function logs/aborts fp operations. */
11170 /* Assume that fp operations are used if any fp reg must be saved. */
6041bf2f
DE
11171 fprintf (file, "%d,",
11172 (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
314fc5a9
ILT
11173
11174 /* 6 bitfields: function is interrupt handler, name present in
11175 proc table, function calls alloca, on condition directives
11176 (controls stack walks, 3 bits), saves condition reg, saves
11177 link reg. */
11178 /* The `function calls alloca' bit seems to be set whenever reg 31 is
11179 set up as a frame pointer, even when there is no alloca call. */
11180 fprintf (file, "%d,",
6041bf2f
DE
11181 ((optional_tbtab << 6)
11182 | ((optional_tbtab & frame_pointer_needed) << 5)
11183 | (info->cr_save_p << 1)
11184 | (info->lr_save_p)));
314fc5a9 11185
6041bf2f 11186 /* 3 bitfields: saves backchain, fixup code, number of fpr saved
314fc5a9
ILT
11187 (6 bits). */
11188 fprintf (file, "%d,",
4697a36c 11189 (info->push_p << 7) | (64 - info->first_fp_reg_save));
314fc5a9
ILT
11190
11191 /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits). */
11192 fprintf (file, "%d,", (32 - first_reg_to_save ()));
11193
6041bf2f
DE
11194 if (optional_tbtab)
11195 {
11196 /* Compute the parameter info from the function decl argument
11197 list. */
11198 tree decl;
11199 int next_parm_info_bit = 31;
314fc5a9 11200
6041bf2f
DE
11201 for (decl = DECL_ARGUMENTS (current_function_decl);
11202 decl; decl = TREE_CHAIN (decl))
11203 {
11204 rtx parameter = DECL_INCOMING_RTL (decl);
11205 enum machine_mode mode = GET_MODE (parameter);
314fc5a9 11206
6041bf2f
DE
11207 if (GET_CODE (parameter) == REG)
11208 {
11209 if (GET_MODE_CLASS (mode) == MODE_FLOAT)
11210 {
11211 int bits;
11212
11213 float_parms++;
11214
11215 if (mode == SFmode)
11216 bits = 0x2;
fcce224d 11217 else if (mode == DFmode || mode == TFmode)
6041bf2f
DE
11218 bits = 0x3;
11219 else
11220 abort ();
11221
11222 /* If only one bit will fit, don't or in this entry. */
11223 if (next_parm_info_bit > 0)
11224 parm_info |= (bits << (next_parm_info_bit - 1));
11225 next_parm_info_bit -= 2;
11226 }
11227 else
11228 {
11229 fixed_parms += ((GET_MODE_SIZE (mode)
11230 + (UNITS_PER_WORD - 1))
11231 / UNITS_PER_WORD);
11232 next_parm_info_bit -= 1;
11233 }
11234 }
11235 }
11236 }
314fc5a9
ILT
11237
11238 /* Number of fixed point parameters. */
11239 /* This is actually the number of words of fixed point parameters; thus
11240 an 8 byte struct counts as 2; and thus the maximum value is 8. */
11241 fprintf (file, "%d,", fixed_parms);
11242
11243 /* 2 bitfields: number of floating point parameters (7 bits), parameters
11244 all on stack. */
11245 /* This is actually the number of fp registers that hold parameters;
11246 and thus the maximum value is 13. */
11247 /* Set parameters on stack bit if parameters are not in their original
11248 registers, regardless of whether they are on the stack? Xlc
11249 seems to set the bit when not optimizing. */
11250 fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
11251
6041bf2f
DE
11252 if (! optional_tbtab)
11253 return;
11254
314fc5a9
ILT
11255 /* Optional fields follow. Some are variable length. */
11256
11257 /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
11258 11 double float. */
11259 /* There is an entry for each parameter in a register, in the order that
11260 they occur in the parameter list. Any intervening arguments on the
11261 stack are ignored. If the list overflows a long (max possible length
11262 34 bits) then completely leave off all elements that don't fit. */
11263 /* Only emit this long if there was at least one parameter. */
11264 if (fixed_parms || float_parms)
11265 fprintf (file, "\t.long %d\n", parm_info);
11266
11267 /* Offset from start of code to tb table. */
19d2d16f 11268 fputs ("\t.long ", file);
314fc5a9 11269 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
54ee9799
DE
11270#if TARGET_AIX
11271 RS6000_OUTPUT_BASENAME (file, fname);
11272#else
9ebbca7d 11273 assemble_name (file, fname);
54ee9799 11274#endif
19d2d16f 11275 fputs ("-.", file);
54ee9799
DE
11276#if TARGET_AIX
11277 RS6000_OUTPUT_BASENAME (file, fname);
11278#else
9ebbca7d 11279 assemble_name (file, fname);
54ee9799 11280#endif
19d2d16f 11281 putc ('\n', file);
314fc5a9
ILT
11282
11283 /* Interrupt handler mask. */
11284 /* Omit this long, since we never set the interrupt handler bit
11285 above. */
11286
11287 /* Number of CTL (controlled storage) anchors. */
11288 /* Omit this long, since the has_ctl bit is never set above. */
11289
11290 /* Displacement into stack of each CTL anchor. */
11291 /* Omit this list of longs, because there are no CTL anchors. */
11292
11293 /* Length of function name. */
69c75916
AM
11294 if (*fname == '*')
11295 ++fname;
296b8152 11296 fprintf (file, "\t.short %d\n", (int) strlen (fname));
314fc5a9
ILT
11297
11298 /* Function name. */
11299 assemble_string (fname, strlen (fname));
11300
11301 /* Register for alloca automatic storage; this is always reg 31.
11302 Only emit this if the alloca bit was set above. */
11303 if (frame_pointer_needed)
19d2d16f 11304 fputs ("\t.byte 31\n", file);
b1765bde
DE
11305
11306 fputs ("\t.align 2\n", file);
9b30bae2 11307 }
9878760c 11308}
17167fd8 11309\f
a4f6c312
SS
11310/* A C compound statement that outputs the assembler code for a thunk
11311 function, used to implement C++ virtual function calls with
11312 multiple inheritance. The thunk acts as a wrapper around a virtual
11313 function, adjusting the implicit object parameter before handing
11314 control off to the real function.
11315
11316 First, emit code to add the integer DELTA to the location that
11317 contains the incoming first argument. Assume that this argument
11318 contains a pointer, and is the one used to pass the `this' pointer
11319 in C++. This is the incoming argument *before* the function
11320 prologue, e.g. `%o0' on a sparc. The addition must preserve the
11321 values of all other incoming arguments.
17167fd8
MM
11322
11323 After the addition, emit code to jump to FUNCTION, which is a
a4f6c312
SS
11324 `FUNCTION_DECL'. This is a direct pure jump, not a call, and does
11325 not touch the return address. Hence returning from FUNCTION will
11326 return to whoever called the current `thunk'.
17167fd8 11327
a4f6c312
SS
11328 The effect must be as if FUNCTION had been called directly with the
11329 adjusted first argument. This macro is responsible for emitting
11330 all of the code for a thunk function; output_function_prologue()
11331 and output_function_epilogue() are not invoked.
17167fd8 11332
a4f6c312
SS
11333 The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already
11334 been extracted from it.) It might possibly be useful on some
11335 targets, but probably not.
17167fd8 11336
a4f6c312
SS
11337 If you do not define this macro, the target-independent code in the
11338 C++ frontend will generate a less efficient heavyweight thunk that
11339 calls FUNCTION instead of jumping to it. The generic approach does
11340 not support varargs. */
17167fd8 11341
3961e8fe
RH
11342static void
11343rs6000_output_mi_thunk (file, thunk_fndecl, delta, vcall_offset, function)
17167fd8 11344 FILE *file;
d330fd93 11345 tree thunk_fndecl ATTRIBUTE_UNUSED;
eb0424da 11346 HOST_WIDE_INT delta;
3961e8fe 11347 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED;
17167fd8
MM
11348 tree function;
11349{
a4f6c312
SS
11350 const char *this_reg =
11351 reg_names[ aggregate_value_p (TREE_TYPE (TREE_TYPE (function))) ? 4 : 3 ];
d330fd93 11352 const char *prefix;
3cce094d 11353 const char *fname;
d330fd93 11354 const char *r0 = reg_names[0];
d330fd93
KG
11355 const char *toc = reg_names[2];
11356 const char *schain = reg_names[11];
11357 const char *r12 = reg_names[12];
17167fd8
MM
11358 char buf[512];
11359 static int labelno = 0;
11360
a4f6c312 11361 /* Small constants that can be done by one add instruction. */
17167fd8
MM
11362 if (delta >= -32768 && delta <= 32767)
11363 {
22b4a3b0 11364 if (! TARGET_NEW_MNEMONICS)
eb0424da 11365 fprintf (file, "\tcal %s,%d(%s)\n", this_reg, (int) delta, this_reg);
17167fd8 11366 else
eb0424da 11367 fprintf (file, "\taddi %s,%s,%d\n", this_reg, this_reg, (int) delta);
17167fd8
MM
11368 }
11369
56a7189a
AM
11370 /* 64-bit constants. If "int" is 32 bits, we'll never hit this abort. */
11371 else if (TARGET_64BIT && (delta < -2147483647 - 1 || delta > 2147483647))
11372 abort ();
11373
a4f6c312 11374 /* Large constants that can be done by one addis instruction. */
56a7189a 11375 else if ((delta & 0xffff) == 0)
17167fd8 11376 asm_fprintf (file, "\t{cau|addis} %s,%s,%d\n", this_reg, this_reg,
eb0424da 11377 (int) (delta >> 16));
17167fd8
MM
11378
11379 /* 32-bit constants that can be done by an add and addis instruction. */
56a7189a 11380 else
17167fd8 11381 {
a4f6c312
SS
11382 /* Break into two pieces, propagating the sign bit from the low
11383 word to the upper word. */
56a7189a
AM
11384 int delta_low = ((delta & 0xffff) ^ 0x8000) - 0x8000;
11385 int delta_high = (delta - delta_low) >> 16;
17167fd8
MM
11386
11387 asm_fprintf (file, "\t{cau|addis} %s,%s,%d\n", this_reg, this_reg,
11388 delta_high);
11389
22b4a3b0 11390 if (! TARGET_NEW_MNEMONICS)
17167fd8
MM
11391 fprintf (file, "\tcal %s,%d(%s)\n", this_reg, delta_low, this_reg);
11392 else
11393 fprintf (file, "\taddi %s,%s,%d\n", this_reg, this_reg, delta_low);
11394 }
11395
17167fd8
MM
11396 /* Get the prefix in front of the names. */
11397 switch (DEFAULT_ABI)
11398 {
11399 default:
11400 abort ();
11401
11402 case ABI_AIX:
11403 prefix = ".";
11404 break;
11405
11406 case ABI_V4:
11407 case ABI_AIX_NODESC:
2d173d20 11408 case ABI_DARWIN:
17167fd8
MM
11409 prefix = "";
11410 break;
17167fd8
MM
11411 }
11412
11413 /* If the function is compiled in this module, jump to it directly.
11414 Otherwise, load up its address and jump to it. */
11415
11416 fname = XSTR (XEXP (DECL_RTL (function), 0), 0);
42820a49 11417
9ebbca7d 11418 if (current_file_function_operand (XEXP (DECL_RTL (function), 0), VOIDmode)
a5c76ee6
ZW
11419 && (! lookup_attribute ("longcall",
11420 TYPE_ATTRIBUTES (TREE_TYPE (function)))
11421 || lookup_attribute ("shortcall",
11422 TYPE_ATTRIBUTES (TREE_TYPE (function)))))
17167fd8
MM
11423 {
11424 fprintf (file, "\tb %s", prefix);
11425 assemble_name (file, fname);
22b4a3b0 11426 if (DEFAULT_ABI == ABI_V4 && flag_pic) fputs ("@local", file);
949ea356 11427 putc ('\n', file);
17167fd8
MM
11428 }
11429
11430 else
11431 {
11432 switch (DEFAULT_ABI)
11433 {
11434 default:
17167fd8
MM
11435 abort ();
11436
11437 case ABI_AIX:
11438 /* Set up a TOC entry for the function. */
11439 ASM_GENERATE_INTERNAL_LABEL (buf, "Lthunk", labelno);
11440 toc_section ();
4977bab6 11441 (*targetm.asm_out.internal_label) (file, "Lthunk", labelno);
17167fd8
MM
11442 labelno++;
11443
fa9b5c6b
DE
11444 if (TARGET_MINIMAL_TOC)
11445 fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
11446 else
11447 {
11448 fputs ("\t.tc ", file);
11449 assemble_name (file, fname);
11450 fputs ("[TC],", file);
11451 }
11452 assemble_name (file, fname);
17167fd8 11453 putc ('\n', file);
3961e8fe 11454 function_section (current_function_decl);
468e8dba
DE
11455 if (TARGET_MINIMAL_TOC)
11456 asm_fprintf (file, (TARGET_32BIT)
11457 ? "\t{l|lwz} %s,%s(%s)\n" : "\tld %s,%s(%s)\n", r12,
11458 TARGET_ELF ? ".LCTOC0@toc" : ".LCTOC..1", toc);
d2574c50 11459 asm_fprintf (file, (TARGET_32BIT) ? "\t{l|lwz} %s," : "\tld %s,", r12);
17167fd8 11460 assemble_name (file, buf);
468e8dba
DE
11461 if (TARGET_ELF && TARGET_MINIMAL_TOC)
11462 fputs ("-(.LCTOC1)", file);
11463 asm_fprintf (file, "(%s)\n", TARGET_MINIMAL_TOC ? r12 : toc);
17167fd8
MM
11464 asm_fprintf (file,
11465 (TARGET_32BIT) ? "\t{l|lwz} %s,0(%s)\n" : "\tld %s,0(%s)\n",
11466 r0, r12);
11467
11468 asm_fprintf (file,
11469 (TARGET_32BIT) ? "\t{l|lwz} %s,4(%s)\n" : "\tld %s,8(%s)\n",
11470 toc, r12);
11471
11472 asm_fprintf (file, "\tmtctr %s\n", r0);
11473 asm_fprintf (file,
11474 (TARGET_32BIT) ? "\t{l|lwz} %s,8(%s)\n" : "\tld %s,16(%s)\n",
11475 schain, r12);
11476
11477 asm_fprintf (file, "\tbctr\n");
11478 break;
11479
9ebbca7d 11480 case ABI_AIX_NODESC:
17167fd8 11481 case ABI_V4:
22b4a3b0
FS
11482 fprintf (file, "\tb %s", prefix);
11483 assemble_name (file, fname);
11484 if (flag_pic) fputs ("@plt", file);
949ea356 11485 putc ('\n', file);
22b4a3b0 11486 break;
ee890fe2
SS
11487
11488#if TARGET_MACHO
11489 case ABI_DARWIN:
11490 fprintf (file, "\tb %s", prefix);
11491 if (flag_pic && !machopic_name_defined_p (fname))
11492 assemble_name (file, machopic_stub_name (fname));
11493 else
11494 assemble_name (file, fname);
11495 putc ('\n', file);
11496 break;
11497#endif
9ebbca7d
GK
11498 }
11499 }
11500}
9ebbca7d
GK
11501\f
11502/* A quick summary of the various types of 'constant-pool tables'
11503 under PowerPC:
11504
11505 Target Flags Name One table per
11506 AIX (none) AIX TOC object file
11507 AIX -mfull-toc AIX TOC object file
11508 AIX -mminimal-toc AIX minimal TOC translation unit
11509 SVR4/EABI (none) SVR4 SDATA object file
11510 SVR4/EABI -fpic SVR4 pic object file
11511 SVR4/EABI -fPIC SVR4 PIC translation unit
11512 SVR4/EABI -mrelocatable EABI TOC function
11513 SVR4/EABI -maix AIX TOC object file
11514 SVR4/EABI -maix -mminimal-toc
11515 AIX minimal TOC translation unit
11516
11517 Name Reg. Set by entries contains:
11518 made by addrs? fp? sum?
11519
11520 AIX TOC 2 crt0 as Y option option
11521 AIX minimal TOC 30 prolog gcc Y Y option
11522 SVR4 SDATA 13 crt0 gcc N Y N
11523 SVR4 pic 30 prolog ld Y not yet N
11524 SVR4 PIC 30 prolog gcc Y option option
11525 EABI TOC 30 prolog gcc Y option option
11526
11527*/
11528
11529/* Hash table stuff for keeping track of TOC entries. */
11530
11531struct toc_hash_struct
11532{
11533 /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
11534 ASM_OUTPUT_SPECIAL_POOL_ENTRY_P. */
11535 rtx key;
a9098fd0 11536 enum machine_mode key_mode;
9ebbca7d
GK
11537 int labelno;
11538};
17167fd8 11539
9ebbca7d
GK
11540static htab_t toc_hash_table;
11541
11542/* Hash functions for the hash table. */
11543
11544static unsigned
11545rs6000_hash_constant (k)
11546 rtx k;
11547{
46b33600
RH
11548 enum rtx_code code = GET_CODE (k);
11549 enum machine_mode mode = GET_MODE (k);
11550 unsigned result = (code << 3) ^ mode;
11551 const char *format;
11552 int flen, fidx;
9ebbca7d 11553
46b33600
RH
11554 format = GET_RTX_FORMAT (code);
11555 flen = strlen (format);
11556 fidx = 0;
9ebbca7d 11557
46b33600
RH
11558 switch (code)
11559 {
11560 case LABEL_REF:
11561 return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
11562
11563 case CONST_DOUBLE:
11564 if (mode != VOIDmode)
11565 return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
11566 flen = 2;
11567 break;
11568
11569 case CODE_LABEL:
11570 fidx = 3;
11571 break;
11572
11573 default:
11574 break;
11575 }
9ebbca7d
GK
11576
11577 for (; fidx < flen; fidx++)
11578 switch (format[fidx])
11579 {
11580 case 's':
11581 {
11582 unsigned i, len;
11583 const char *str = XSTR (k, fidx);
11584 len = strlen (str);
11585 result = result * 613 + len;
11586 for (i = 0; i < len; i++)
11587 result = result * 613 + (unsigned) str[i];
17167fd8
MM
11588 break;
11589 }
9ebbca7d
GK
11590 case 'u':
11591 case 'e':
11592 result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
11593 break;
11594 case 'i':
11595 case 'n':
11596 result = result * 613 + (unsigned) XINT (k, fidx);
11597 break;
11598 case 'w':
11599 if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
11600 result = result * 613 + (unsigned) XWINT (k, fidx);
11601 else
11602 {
11603 size_t i;
11604 for (i = 0; i < sizeof(HOST_WIDE_INT)/sizeof(unsigned); i++)
11605 result = result * 613 + (unsigned) (XWINT (k, fidx)
11606 >> CHAR_BIT * i);
11607 }
11608 break;
11609 default:
a4f6c312 11610 abort ();
9ebbca7d 11611 }
46b33600 11612
9ebbca7d
GK
11613 return result;
11614}
11615
11616static unsigned
11617toc_hash_function (hash_entry)
11618 const void * hash_entry;
11619{
a9098fd0
GK
11620 const struct toc_hash_struct *thc =
11621 (const struct toc_hash_struct *) hash_entry;
11622 return rs6000_hash_constant (thc->key) ^ thc->key_mode;
9ebbca7d
GK
11623}
11624
11625/* Compare H1 and H2 for equivalence. */
11626
11627static int
11628toc_hash_eq (h1, h2)
11629 const void * h1;
11630 const void * h2;
11631{
11632 rtx r1 = ((const struct toc_hash_struct *) h1)->key;
11633 rtx r2 = ((const struct toc_hash_struct *) h2)->key;
11634
a9098fd0
GK
11635 if (((const struct toc_hash_struct *) h1)->key_mode
11636 != ((const struct toc_hash_struct *) h2)->key_mode)
11637 return 0;
11638
5692c7bc 11639 return rtx_equal_p (r1, r2);
9ebbca7d
GK
11640}
11641
11642/* Mark the hash table-entry HASH_ENTRY. */
11643
11644static int
11645toc_hash_mark_entry (hash_slot, unused)
2eba1afa 11646 void ** hash_slot;
9ebbca7d
GK
11647 void * unused ATTRIBUTE_UNUSED;
11648{
11649 const struct toc_hash_struct * hash_entry =
11650 *(const struct toc_hash_struct **) hash_slot;
11651 rtx r = hash_entry->key;
11652 ggc_set_mark (hash_entry);
a4f6c312 11653 /* For CODE_LABELS, we don't want to drag in the whole insn chain... */
9ebbca7d
GK
11654 if (GET_CODE (r) == LABEL_REF)
11655 {
11656 ggc_set_mark (r);
11657 ggc_set_mark (XEXP (r, 0));
11658 }
11659 else
11660 ggc_mark_rtx (r);
11661 return 1;
11662}
11663
11664/* Mark all the elements of the TOC hash-table *HT. */
11665
11666static void
11667toc_hash_mark_table (vht)
11668 void *vht;
11669{
11670 htab_t *ht = vht;
11671
11672 htab_traverse (*ht, toc_hash_mark_entry, (void *)0);
17167fd8
MM
11673}
11674
28e510bd
MM
11675/* These are the names given by the C++ front-end to vtables, and
11676 vtable-like objects. Ideally, this logic should not be here;
11677 instead, there should be some programmatic way of inquiring as
11678 to whether or not an object is a vtable. */
11679
11680#define VTABLE_NAME_P(NAME) \
11681 (strncmp ("_vt.", name, strlen("_vt.")) == 0 \
11682 || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0 \
11683 || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0 \
11684 || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
11685
11686void
11687rs6000_output_symbol_ref (file, x)
11688 FILE *file;
11689 rtx x;
11690{
11691 /* Currently C++ toc references to vtables can be emitted before it
11692 is decided whether the vtable is public or private. If this is
11693 the case, then the linker will eventually complain that there is
11694 a reference to an unknown section. Thus, for vtables only,
11695 we emit the TOC reference to reference the symbol and not the
11696 section. */
11697 const char *name = XSTR (x, 0);
54ee9799
DE
11698
11699 if (VTABLE_NAME_P (name))
11700 {
11701 RS6000_OUTPUT_BASENAME (file, name);
11702 }
11703 else
11704 assemble_name (file, name);
28e510bd
MM
11705}
11706
a4f6c312
SS
11707/* Output a TOC entry. We derive the entry name from what is being
11708 written. */
9878760c
RK
11709
11710void
a9098fd0 11711output_toc (file, x, labelno, mode)
9878760c
RK
11712 FILE *file;
11713 rtx x;
11714 int labelno;
a9098fd0 11715 enum machine_mode mode;
9878760c
RK
11716{
11717 char buf[256];
3cce094d 11718 const char *name = buf;
ec940faa 11719 const char *real_name;
9878760c
RK
11720 rtx base = x;
11721 int offset = 0;
11722
4697a36c
MM
11723 if (TARGET_NO_TOC)
11724 abort ();
11725
9ebbca7d
GK
11726 /* When the linker won't eliminate them, don't output duplicate
11727 TOC entries (this happens on AIX if there is any kind of TOC,
1f8f4a0b
MM
11728 and on SVR4 under -fPIC or -mrelocatable). */
11729 if (TARGET_TOC)
9ebbca7d
GK
11730 {
11731 struct toc_hash_struct *h;
11732 void * * found;
11733
11734 h = ggc_alloc (sizeof (*h));
11735 h->key = x;
a9098fd0 11736 h->key_mode = mode;
9ebbca7d
GK
11737 h->labelno = labelno;
11738
11739 found = htab_find_slot (toc_hash_table, h, 1);
11740 if (*found == NULL)
11741 *found = h;
11742 else /* This is indeed a duplicate.
11743 Set this label equal to that label. */
11744 {
11745 fputs ("\t.set ", file);
11746 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
11747 fprintf (file, "%d,", labelno);
11748 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
11749 fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
11750 found)->labelno));
11751 return;
11752 }
11753 }
11754
11755 /* If we're going to put a double constant in the TOC, make sure it's
11756 aligned properly when strict alignment is on. */
ff1720ed
RK
11757 if (GET_CODE (x) == CONST_DOUBLE
11758 && STRICT_ALIGNMENT
a9098fd0 11759 && GET_MODE_BITSIZE (mode) >= 64
ff1720ed
RK
11760 && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
11761 ASM_OUTPUT_ALIGN (file, 3);
11762 }
11763
4977bab6 11764 (*targetm.asm_out.internal_label) (file, "LC", labelno);
9878760c 11765
37c37a57
RK
11766 /* Handle FP constants specially. Note that if we have a minimal
11767 TOC, things we put here aren't actually in the TOC, so we can allow
11768 FP constants. */
fcce224d
DE
11769 if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == TFmode)
11770 {
11771 REAL_VALUE_TYPE rv;
11772 long k[4];
11773
11774 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
11775 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
11776
11777 if (TARGET_64BIT)
11778 {
11779 if (TARGET_MINIMAL_TOC)
11780 fputs (DOUBLE_INT_ASM_OP, file);
11781 else
11782 fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
11783 k[0] & 0xffffffff, k[1] & 0xffffffff,
11784 k[2] & 0xffffffff, k[3] & 0xffffffff);
11785 fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
11786 k[0] & 0xffffffff, k[1] & 0xffffffff,
11787 k[2] & 0xffffffff, k[3] & 0xffffffff);
11788 return;
11789 }
11790 else
11791 {
11792 if (TARGET_MINIMAL_TOC)
11793 fputs ("\t.long ", file);
11794 else
11795 fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
11796 k[0] & 0xffffffff, k[1] & 0xffffffff,
11797 k[2] & 0xffffffff, k[3] & 0xffffffff);
11798 fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
11799 k[0] & 0xffffffff, k[1] & 0xffffffff,
11800 k[2] & 0xffffffff, k[3] & 0xffffffff);
11801 return;
11802 }
11803 }
11804 else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
9878760c 11805 {
042259f2
DE
11806 REAL_VALUE_TYPE rv;
11807 long k[2];
0adc764e 11808
042259f2
DE
11809 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
11810 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
31bfaa0b 11811
13ded975
DE
11812 if (TARGET_64BIT)
11813 {
11814 if (TARGET_MINIMAL_TOC)
2bfcf297 11815 fputs (DOUBLE_INT_ASM_OP, file);
13ded975 11816 else
2f0552b6
AM
11817 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
11818 k[0] & 0xffffffff, k[1] & 0xffffffff);
11819 fprintf (file, "0x%lx%08lx\n",
11820 k[0] & 0xffffffff, k[1] & 0xffffffff);
13ded975
DE
11821 return;
11822 }
1875cc88 11823 else
13ded975
DE
11824 {
11825 if (TARGET_MINIMAL_TOC)
2bfcf297 11826 fputs ("\t.long ", file);
13ded975 11827 else
2f0552b6
AM
11828 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
11829 k[0] & 0xffffffff, k[1] & 0xffffffff);
11830 fprintf (file, "0x%lx,0x%lx\n",
11831 k[0] & 0xffffffff, k[1] & 0xffffffff);
13ded975
DE
11832 return;
11833 }
9878760c 11834 }
a9098fd0 11835 else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
9878760c 11836 {
042259f2
DE
11837 REAL_VALUE_TYPE rv;
11838 long l;
9878760c 11839
042259f2
DE
11840 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
11841 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
11842
31bfaa0b
DE
11843 if (TARGET_64BIT)
11844 {
11845 if (TARGET_MINIMAL_TOC)
2bfcf297 11846 fputs (DOUBLE_INT_ASM_OP, file);
31bfaa0b 11847 else
2f0552b6
AM
11848 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
11849 fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
31bfaa0b
DE
11850 return;
11851 }
042259f2 11852 else
31bfaa0b
DE
11853 {
11854 if (TARGET_MINIMAL_TOC)
2bfcf297 11855 fputs ("\t.long ", file);
31bfaa0b 11856 else
2f0552b6
AM
11857 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
11858 fprintf (file, "0x%lx\n", l & 0xffffffff);
31bfaa0b
DE
11859 return;
11860 }
042259f2 11861 }
f176e826 11862 else if (GET_MODE (x) == VOIDmode
a9098fd0 11863 && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
042259f2 11864 {
e2c953b6 11865 unsigned HOST_WIDE_INT low;
042259f2
DE
11866 HOST_WIDE_INT high;
11867
11868 if (GET_CODE (x) == CONST_DOUBLE)
11869 {
11870 low = CONST_DOUBLE_LOW (x);
11871 high = CONST_DOUBLE_HIGH (x);
11872 }
11873 else
11874#if HOST_BITS_PER_WIDE_INT == 32
11875 {
11876 low = INTVAL (x);
0858c623 11877 high = (low & 0x80000000) ? ~0 : 0;
042259f2
DE
11878 }
11879#else
11880 {
0858c623 11881 low = INTVAL (x) & 0xffffffff;
042259f2
DE
11882 high = (HOST_WIDE_INT) INTVAL (x) >> 32;
11883 }
11884#endif
9878760c 11885
a9098fd0
GK
11886 /* TOC entries are always Pmode-sized, but since this
11887 is a bigendian machine then if we're putting smaller
11888 integer constants in the TOC we have to pad them.
11889 (This is still a win over putting the constants in
11890 a separate constant pool, because then we'd have
02a4ec28
FS
11891 to have both a TOC entry _and_ the actual constant.)
11892
11893 For a 32-bit target, CONST_INT values are loaded and shifted
11894 entirely within `low' and can be stored in one TOC entry. */
11895
11896 if (TARGET_64BIT && POINTER_SIZE < GET_MODE_BITSIZE (mode))
a9098fd0 11897 abort ();/* It would be easy to make this work, but it doesn't now. */
02a4ec28
FS
11898
11899 if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
fb52d8de
AM
11900 {
11901#if HOST_BITS_PER_WIDE_INT == 32
11902 lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
11903 POINTER_SIZE, &low, &high, 0);
11904#else
11905 low |= high << 32;
11906 low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
11907 high = (HOST_WIDE_INT) low >> 32;
11908 low &= 0xffffffff;
11909#endif
11910 }
a9098fd0 11911
13ded975
DE
11912 if (TARGET_64BIT)
11913 {
11914 if (TARGET_MINIMAL_TOC)
2bfcf297 11915 fputs (DOUBLE_INT_ASM_OP, file);
13ded975 11916 else
2f0552b6
AM
11917 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
11918 (long) high & 0xffffffff, (long) low & 0xffffffff);
11919 fprintf (file, "0x%lx%08lx\n",
11920 (long) high & 0xffffffff, (long) low & 0xffffffff);
13ded975
DE
11921 return;
11922 }
1875cc88 11923 else
13ded975 11924 {
02a4ec28
FS
11925 if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
11926 {
11927 if (TARGET_MINIMAL_TOC)
2bfcf297 11928 fputs ("\t.long ", file);
02a4ec28 11929 else
2bfcf297 11930 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
2f0552b6
AM
11931 (long) high & 0xffffffff, (long) low & 0xffffffff);
11932 fprintf (file, "0x%lx,0x%lx\n",
11933 (long) high & 0xffffffff, (long) low & 0xffffffff);
02a4ec28 11934 }
13ded975 11935 else
02a4ec28
FS
11936 {
11937 if (TARGET_MINIMAL_TOC)
2bfcf297 11938 fputs ("\t.long ", file);
02a4ec28 11939 else
2f0552b6
AM
11940 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
11941 fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
02a4ec28 11942 }
13ded975
DE
11943 return;
11944 }
9878760c
RK
11945 }
11946
11947 if (GET_CODE (x) == CONST)
11948 {
2bfcf297
DB
11949 if (GET_CODE (XEXP (x, 0)) != PLUS)
11950 abort ();
11951
9878760c
RK
11952 base = XEXP (XEXP (x, 0), 0);
11953 offset = INTVAL (XEXP (XEXP (x, 0), 1));
11954 }
11955
11956 if (GET_CODE (base) == SYMBOL_REF)
11957 name = XSTR (base, 0);
11958 else if (GET_CODE (base) == LABEL_REF)
11959 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (XEXP (base, 0)));
11960 else if (GET_CODE (base) == CODE_LABEL)
11961 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
11962 else
11963 abort ();
11964
772c5265 11965 real_name = (*targetm.strip_name_encoding) (name);
1875cc88 11966 if (TARGET_MINIMAL_TOC)
2bfcf297 11967 fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
1875cc88
JW
11968 else
11969 {
b6c9286a 11970 fprintf (file, "\t.tc %s", real_name);
9878760c 11971
1875cc88
JW
11972 if (offset < 0)
11973 fprintf (file, ".N%d", - offset);
11974 else if (offset)
11975 fprintf (file, ".P%d", offset);
9878760c 11976
19d2d16f 11977 fputs ("[TC],", file);
1875cc88 11978 }
581bc4de
MM
11979
11980 /* Currently C++ toc references to vtables can be emitted before it
11981 is decided whether the vtable is public or private. If this is
11982 the case, then the linker will eventually complain that there is
11983 a TOC reference to an unknown section. Thus, for vtables only,
11984 we emit the TOC reference to reference the symbol and not the
11985 section. */
28e510bd 11986 if (VTABLE_NAME_P (name))
581bc4de 11987 {
54ee9799 11988 RS6000_OUTPUT_BASENAME (file, name);
581bc4de
MM
11989 if (offset < 0)
11990 fprintf (file, "%d", offset);
11991 else if (offset > 0)
11992 fprintf (file, "+%d", offset);
11993 }
11994 else
11995 output_addr_const (file, x);
19d2d16f 11996 putc ('\n', file);
9878760c
RK
11997}
11998\f
11999/* Output an assembler pseudo-op to write an ASCII string of N characters
12000 starting at P to FILE.
12001
12002 On the RS/6000, we have to do this using the .byte operation and
12003 write out special characters outside the quoted string.
12004 Also, the assembler is broken; very long strings are truncated,
a4f6c312 12005 so we must artificially break them up early. */
9878760c
RK
12006
12007void
12008output_ascii (file, p, n)
12009 FILE *file;
d330fd93 12010 const char *p;
9878760c
RK
12011 int n;
12012{
12013 char c;
12014 int i, count_string;
d330fd93
KG
12015 const char *for_string = "\t.byte \"";
12016 const char *for_decimal = "\t.byte ";
12017 const char *to_close = NULL;
9878760c
RK
12018
12019 count_string = 0;
12020 for (i = 0; i < n; i++)
12021 {
12022 c = *p++;
12023 if (c >= ' ' && c < 0177)
12024 {
12025 if (for_string)
12026 fputs (for_string, file);
12027 putc (c, file);
12028
12029 /* Write two quotes to get one. */
12030 if (c == '"')
12031 {
12032 putc (c, file);
12033 ++count_string;
12034 }
12035
12036 for_string = NULL;
12037 for_decimal = "\"\n\t.byte ";
12038 to_close = "\"\n";
12039 ++count_string;
12040
12041 if (count_string >= 512)
12042 {
12043 fputs (to_close, file);
12044
12045 for_string = "\t.byte \"";
12046 for_decimal = "\t.byte ";
12047 to_close = NULL;
12048 count_string = 0;
12049 }
12050 }
12051 else
12052 {
12053 if (for_decimal)
12054 fputs (for_decimal, file);
12055 fprintf (file, "%d", c);
12056
12057 for_string = "\n\t.byte \"";
12058 for_decimal = ", ";
12059 to_close = "\n";
12060 count_string = 0;
12061 }
12062 }
12063
12064 /* Now close the string if we have written one. Then end the line. */
12065 if (to_close)
9ebbca7d 12066 fputs (to_close, file);
9878760c
RK
12067}
12068\f
12069/* Generate a unique section name for FILENAME for a section type
12070 represented by SECTION_DESC. Output goes into BUF.
12071
12072 SECTION_DESC can be any string, as long as it is different for each
12073 possible section type.
12074
12075 We name the section in the same manner as xlc. The name begins with an
12076 underscore followed by the filename (after stripping any leading directory
11e5fe42
RK
12077 names) with the last period replaced by the string SECTION_DESC. If
12078 FILENAME does not contain a period, SECTION_DESC is appended to the end of
12079 the name. */
9878760c
RK
12080
12081void
12082rs6000_gen_section_name (buf, filename, section_desc)
12083 char **buf;
9ebbca7d
GK
12084 const char *filename;
12085 const char *section_desc;
9878760c 12086{
9ebbca7d 12087 const char *q, *after_last_slash, *last_period = 0;
9878760c
RK
12088 char *p;
12089 int len;
9878760c
RK
12090
12091 after_last_slash = filename;
12092 for (q = filename; *q; q++)
11e5fe42
RK
12093 {
12094 if (*q == '/')
12095 after_last_slash = q + 1;
12096 else if (*q == '.')
12097 last_period = q;
12098 }
9878760c 12099
11e5fe42 12100 len = strlen (after_last_slash) + strlen (section_desc) + 2;
6d9f628e 12101 *buf = (char *) xmalloc (len);
9878760c
RK
12102
12103 p = *buf;
12104 *p++ = '_';
12105
12106 for (q = after_last_slash; *q; q++)
12107 {
11e5fe42 12108 if (q == last_period)
9878760c
RK
12109 {
12110 strcpy (p, section_desc);
12111 p += strlen (section_desc);
9878760c
RK
12112 }
12113
e9a780ec 12114 else if (ISALNUM (*q))
9878760c
RK
12115 *p++ = *q;
12116 }
12117
11e5fe42 12118 if (last_period == 0)
9878760c
RK
12119 strcpy (p, section_desc);
12120 else
12121 *p = '\0';
12122}
e165f3f0 12123\f
a4f6c312 12124/* Emit profile function. */
411707f4 12125
411707f4
CC
12126void
12127output_profile_hook (labelno)
57ac7be9 12128 int labelno ATTRIBUTE_UNUSED;
411707f4 12129{
8480e480
CC
12130 if (DEFAULT_ABI == ABI_AIX)
12131 {
57ac7be9
AM
12132#ifdef NO_PROFILE_COUNTERS
12133 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 0);
12134#else
8480e480 12135 char buf[30];
40501e5f 12136 const char *label_name;
8480e480 12137 rtx fun;
411707f4 12138
8480e480 12139 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
772c5265 12140 label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
8480e480 12141 fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
411707f4 12142
8480e480
CC
12143 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 1,
12144 fun, Pmode);
57ac7be9 12145#endif
8480e480 12146 }
ee890fe2
SS
12147 else if (DEFAULT_ABI == ABI_DARWIN)
12148 {
d5fa86ba 12149 const char *mcount_name = RS6000_MCOUNT;
ee890fe2
SS
12150 int caller_addr_regno = LINK_REGISTER_REGNUM;
12151
12152 /* Be conservative and always set this, at least for now. */
12153 current_function_uses_pic_offset_table = 1;
12154
12155#if TARGET_MACHO
12156 /* For PIC code, set up a stub and collect the caller's address
12157 from r0, which is where the prologue puts it. */
12158 if (flag_pic)
12159 {
12160 mcount_name = machopic_stub_name (mcount_name);
12161 if (current_function_uses_pic_offset_table)
12162 caller_addr_regno = 0;
12163 }
12164#endif
12165 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
12166 0, VOIDmode, 1,
12167 gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
12168 }
411707f4
CC
12169}
12170
a4f6c312 12171/* Write function profiler code. */
e165f3f0
RK
12172
12173void
12174output_function_profiler (file, labelno)
12175 FILE *file;
12176 int labelno;
12177{
3daf36a4 12178 char buf[100];
09eeeacb 12179 int save_lr = 8;
e165f3f0 12180
3daf36a4 12181 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
38c1f2d7 12182 switch (DEFAULT_ABI)
3daf36a4 12183 {
38c1f2d7
MM
12184 default:
12185 abort ();
12186
12187 case ABI_V4:
09eeeacb
AM
12188 save_lr = 4;
12189 /* Fall through. */
12190
38c1f2d7 12191 case ABI_AIX_NODESC:
09eeeacb
AM
12192 if (!TARGET_32BIT)
12193 {
12194 warning ("no profiling of 64-bit code for this ABI");
12195 return;
12196 }
38c1f2d7
MM
12197 fprintf (file, "\tmflr %s\n", reg_names[0]);
12198 if (flag_pic == 1)
12199 {
dfdfa60f 12200 fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
09eeeacb
AM
12201 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
12202 reg_names[0], save_lr, reg_names[1]);
17167fd8 12203 asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
dfdfa60f 12204 asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
38c1f2d7 12205 assemble_name (file, buf);
17167fd8 12206 asm_fprintf (file, "@got(%s)\n", reg_names[12]);
38c1f2d7 12207 }
9ebbca7d 12208 else if (flag_pic > 1)
38c1f2d7 12209 {
09eeeacb
AM
12210 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
12211 reg_names[0], save_lr, reg_names[1]);
9ebbca7d
GK
12212 /* Now, we need to get the address of the label. */
12213 fputs ("\tbl 1f\n\t.long ", file);
034e84c4 12214 assemble_name (file, buf);
9ebbca7d
GK
12215 fputs ("-.\n1:", file);
12216 asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
12217 asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
12218 reg_names[0], reg_names[11]);
12219 asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
12220 reg_names[0], reg_names[0], reg_names[11]);
38c1f2d7 12221 }
38c1f2d7
MM
12222 else
12223 {
17167fd8 12224 asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
38c1f2d7 12225 assemble_name (file, buf);
dfdfa60f 12226 fputs ("@ha\n", file);
09eeeacb
AM
12227 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
12228 reg_names[0], save_lr, reg_names[1]);
a260abc9 12229 asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
38c1f2d7 12230 assemble_name (file, buf);
17167fd8 12231 asm_fprintf (file, "@l(%s)\n", reg_names[12]);
38c1f2d7
MM
12232 }
12233
09eeeacb
AM
12234 if (current_function_needs_context && DEFAULT_ABI == ABI_AIX_NODESC)
12235 {
12236 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
12237 reg_names[STATIC_CHAIN_REGNUM],
12238 12, reg_names[1]);
12239 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
12240 asm_fprintf (file, "\t{l|lwz} %s,%d(%s)\n",
12241 reg_names[STATIC_CHAIN_REGNUM],
12242 12, reg_names[1]);
12243 }
12244 else
12245 /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH. */
12246 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
38c1f2d7
MM
12247 break;
12248
12249 case ABI_AIX:
ee890fe2 12250 case ABI_DARWIN:
a4f6c312 12251 /* Don't do anything, done in output_profile_hook (). */
38c1f2d7
MM
12252 break;
12253 }
e165f3f0 12254}
a251ffd0
TG
12255
12256/* Adjust the cost of a scheduling dependency. Return the new cost of
12257 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
12258
c237e94a 12259static int
a06faf84 12260rs6000_adjust_cost (insn, link, dep_insn, cost)
a251ffd0
TG
12261 rtx insn;
12262 rtx link;
296b8152 12263 rtx dep_insn ATTRIBUTE_UNUSED;
a251ffd0
TG
12264 int cost;
12265{
12266 if (! recog_memoized (insn))
12267 return 0;
12268
12269 if (REG_NOTE_KIND (link) != 0)
12270 return 0;
12271
12272 if (REG_NOTE_KIND (link) == 0)
12273 {
ed947a96
DJ
12274 /* Data dependency; DEP_INSN writes a register that INSN reads
12275 some cycles later. */
12276 switch (get_attr_type (insn))
12277 {
12278 case TYPE_JMPREG:
309323c2 12279 /* Tell the first scheduling pass about the latency between
ed947a96
DJ
12280 a mtctr and bctr (and mtlr and br/blr). The first
12281 scheduling pass will not know about this latency since
12282 the mtctr instruction, which has the latency associated
12283 to it, will be generated by reload. */
309323c2 12284 return TARGET_POWER ? 5 : 4;
ed947a96
DJ
12285 case TYPE_BRANCH:
12286 /* Leave some extra cycles between a compare and its
12287 dependent branch, to inhibit expensive mispredicts. */
309323c2
DE
12288 if ((rs6000_cpu_attr == CPU_PPC603
12289 || rs6000_cpu_attr == CPU_PPC604
12290 || rs6000_cpu_attr == CPU_PPC604E
12291 || rs6000_cpu_attr == CPU_PPC620
12292 || rs6000_cpu_attr == CPU_PPC630
12293 || rs6000_cpu_attr == CPU_PPC750
12294 || rs6000_cpu_attr == CPU_PPC7400
12295 || rs6000_cpu_attr == CPU_PPC7450
12296 || rs6000_cpu_attr == CPU_POWER4)
ed947a96
DJ
12297 && recog_memoized (dep_insn)
12298 && (INSN_CODE (dep_insn) >= 0)
12299 && (get_attr_type (dep_insn) == TYPE_COMPARE
12300 || get_attr_type (dep_insn) == TYPE_DELAYED_COMPARE
12301 || get_attr_type (dep_insn) == TYPE_FPCOMPARE
12302 || get_attr_type (dep_insn) == TYPE_CR_LOGICAL))
12303 return cost + 2;
12304 default:
12305 break;
12306 }
a251ffd0
TG
12307 /* Fall out to return default cost. */
12308 }
12309
12310 return cost;
12311}
b6c9286a 12312
a4f6c312
SS
12313/* A C statement (sans semicolon) to update the integer scheduling
12314 priority INSN_PRIORITY (INSN). Reduce the priority to execute the
12315 INSN earlier, increase the priority to execute INSN later. Do not
12316 define this macro if you do not need to adjust the scheduling
12317 priorities of insns. */
bef84347 12318
c237e94a 12319static int
bef84347 12320rs6000_adjust_priority (insn, priority)
d330fd93 12321 rtx insn ATTRIBUTE_UNUSED;
bef84347
VM
12322 int priority;
12323{
a4f6c312
SS
12324 /* On machines (like the 750) which have asymmetric integer units,
12325 where one integer unit can do multiply and divides and the other
12326 can't, reduce the priority of multiply/divide so it is scheduled
12327 before other integer operations. */
bef84347
VM
12328
12329#if 0
2c3c49de 12330 if (! INSN_P (insn))
bef84347
VM
12331 return priority;
12332
12333 if (GET_CODE (PATTERN (insn)) == USE)
12334 return priority;
12335
12336 switch (rs6000_cpu_attr) {
12337 case CPU_PPC750:
12338 switch (get_attr_type (insn))
12339 {
12340 default:
12341 break;
12342
12343 case TYPE_IMUL:
12344 case TYPE_IDIV:
3cb999d8
DE
12345 fprintf (stderr, "priority was %#x (%d) before adjustment\n",
12346 priority, priority);
bef84347
VM
12347 if (priority >= 0 && priority < 0x01000000)
12348 priority >>= 3;
12349 break;
12350 }
12351 }
12352#endif
12353
12354 return priority;
12355}
12356
a4f6c312
SS
12357/* Return how many instructions the machine can issue per cycle. */
12358
c237e94a
ZW
12359static int
12360rs6000_issue_rate ()
b6c9286a
MM
12361{
12362 switch (rs6000_cpu_attr) {
3cb999d8
DE
12363 case CPU_RIOS1: /* ? */
12364 case CPU_RS64A:
12365 case CPU_PPC601: /* ? */
ed947a96 12366 case CPU_PPC7450:
3cb999d8 12367 return 3;
b6c9286a 12368 case CPU_PPC603:
bef84347 12369 case CPU_PPC750:
ed947a96 12370 case CPU_PPC7400:
bef84347 12371 return 2;
3cb999d8 12372 case CPU_RIOS2:
b6c9286a 12373 case CPU_PPC604:
19684119 12374 case CPU_PPC604E:
b6c9286a 12375 case CPU_PPC620:
3cb999d8 12376 case CPU_PPC630:
309323c2 12377 case CPU_POWER4:
b6c9286a
MM
12378 return 4;
12379 default:
12380 return 1;
12381 }
12382}
12383
b6c9286a 12384\f
b6c9286a
MM
12385/* Length in units of the trampoline for entering a nested function. */
12386
12387int
12388rs6000_trampoline_size ()
12389{
12390 int ret = 0;
12391
12392 switch (DEFAULT_ABI)
12393 {
12394 default:
12395 abort ();
12396
12397 case ABI_AIX:
8f802bfb 12398 ret = (TARGET_32BIT) ? 12 : 24;
b6c9286a
MM
12399 break;
12400
4dabc42d 12401 case ABI_DARWIN:
b6c9286a
MM
12402 case ABI_V4:
12403 case ABI_AIX_NODESC:
03a7e1a5 12404 ret = (TARGET_32BIT) ? 40 : 48;
b6c9286a 12405 break;
b6c9286a
MM
12406 }
12407
12408 return ret;
12409}
12410
12411/* Emit RTL insns to initialize the variable parts of a trampoline.
12412 FNADDR is an RTX for the address of the function's pure code.
12413 CXT is an RTX for the static chain value for the function. */
12414
12415void
12416rs6000_initialize_trampoline (addr, fnaddr, cxt)
12417 rtx addr;
12418 rtx fnaddr;
12419 rtx cxt;
12420{
ac2a93a1 12421 enum machine_mode pmode = Pmode;
8bd04c56
MM
12422 int regsize = (TARGET_32BIT) ? 4 : 8;
12423 rtx ctx_reg = force_reg (pmode, cxt);
b6c9286a
MM
12424
12425 switch (DEFAULT_ABI)
12426 {
12427 default:
12428 abort ();
12429
8bd04c56 12430/* Macros to shorten the code expansions below. */
39403d82 12431#define MEM_DEREF(addr) gen_rtx_MEM (pmode, memory_address (pmode, addr))
c5c76735
JL
12432#define MEM_PLUS(addr,offset) \
12433 gen_rtx_MEM (pmode, memory_address (pmode, plus_constant (addr, offset)))
7c59dc5d 12434
b6c9286a
MM
12435 /* Under AIX, just build the 3 word function descriptor */
12436 case ABI_AIX:
8bd04c56
MM
12437 {
12438 rtx fn_reg = gen_reg_rtx (pmode);
12439 rtx toc_reg = gen_reg_rtx (pmode);
12440 emit_move_insn (fn_reg, MEM_DEREF (fnaddr));
1cb18e3c 12441 emit_move_insn (toc_reg, MEM_PLUS (fnaddr, regsize));
8bd04c56
MM
12442 emit_move_insn (MEM_DEREF (addr), fn_reg);
12443 emit_move_insn (MEM_PLUS (addr, regsize), toc_reg);
12444 emit_move_insn (MEM_PLUS (addr, 2*regsize), ctx_reg);
12445 }
b6c9286a
MM
12446 break;
12447
4dabc42d
TC
12448 /* Under V.4/eabi/darwin, __trampoline_setup does the real work. */
12449 case ABI_DARWIN:
b6c9286a
MM
12450 case ABI_V4:
12451 case ABI_AIX_NODESC:
39403d82 12452 emit_library_call (gen_rtx_SYMBOL_REF (SImode, "__trampoline_setup"),
eaf1bcf1
MM
12453 FALSE, VOIDmode, 4,
12454 addr, pmode,
12455 GEN_INT (rs6000_trampoline_size ()), SImode,
12456 fnaddr, pmode,
12457 ctx_reg, pmode);
b6c9286a 12458 break;
b6c9286a
MM
12459 }
12460
12461 return;
12462}
7509c759
MM
12463
12464\f
91d231cb 12465/* Table of valid machine attributes. */
a4f6c312 12466
91d231cb 12467const struct attribute_spec rs6000_attribute_table[] =
7509c759 12468{
91d231cb 12469 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
a5c76ee6
ZW
12470 { "longcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
12471 { "shortcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
12472 { NULL, 0, 0, false, false, false, NULL }
91d231cb 12473};
7509c759 12474
a5c76ee6
ZW
12475/* Handle a "longcall" or "shortcall" attribute; arguments as in
12476 struct attribute_spec.handler. */
a4f6c312 12477
91d231cb
JM
12478static tree
12479rs6000_handle_longcall_attribute (node, name, args, flags, no_add_attrs)
12480 tree *node;
12481 tree name;
12482 tree args ATTRIBUTE_UNUSED;
12483 int flags ATTRIBUTE_UNUSED;
12484 bool *no_add_attrs;
12485{
12486 if (TREE_CODE (*node) != FUNCTION_TYPE
12487 && TREE_CODE (*node) != FIELD_DECL
12488 && TREE_CODE (*node) != TYPE_DECL)
12489 {
12490 warning ("`%s' attribute only applies to functions",
12491 IDENTIFIER_POINTER (name));
12492 *no_add_attrs = true;
12493 }
6a4cee5f 12494
91d231cb 12495 return NULL_TREE;
7509c759
MM
12496}
12497
a5c76ee6
ZW
12498/* Set longcall attributes on all functions declared when
12499 rs6000_default_long_calls is true. */
12500static void
12501rs6000_set_default_type_attributes (type)
12502 tree type;
12503{
12504 if (rs6000_default_long_calls
12505 && (TREE_CODE (type) == FUNCTION_TYPE
12506 || TREE_CODE (type) == METHOD_TYPE))
12507 TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
12508 NULL_TREE,
12509 TYPE_ATTRIBUTES (type));
12510}
12511
3cb999d8
DE
12512/* Return a reference suitable for calling a function with the
12513 longcall attribute. */
a4f6c312 12514
6a4cee5f
MM
12515struct rtx_def *
12516rs6000_longcall_ref (call_ref)
12517 rtx call_ref;
12518{
d330fd93 12519 const char *call_name;
6a4cee5f
MM
12520 tree node;
12521
12522 if (GET_CODE (call_ref) != SYMBOL_REF)
12523 return call_ref;
12524
12525 /* System V adds '.' to the internal name, so skip them. */
12526 call_name = XSTR (call_ref, 0);
12527 if (*call_name == '.')
12528 {
12529 while (*call_name == '.')
12530 call_name++;
12531
12532 node = get_identifier (call_name);
39403d82 12533 call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
6a4cee5f
MM
12534 }
12535
12536 return force_reg (Pmode, call_ref);
12537}
12538
7509c759 12539\f
b64a1b53
RH
12540#ifdef USING_ELFOS_H
12541
7509c759
MM
12542/* A C statement or statements to switch to the appropriate section
12543 for output of RTX in mode MODE. You can assume that RTX is some
12544 kind of constant in RTL. The argument MODE is redundant except in
12545 the case of a `const_int' rtx. Select the section by calling
12546 `text_section' or one of the alternatives for other sections.
12547
12548 Do not define this macro if you put all constants in the read-only
12549 data section. */
12550
b64a1b53
RH
12551static void
12552rs6000_elf_select_rtx_section (mode, x, align)
a9098fd0 12553 enum machine_mode mode;
7509c759 12554 rtx x;
b64a1b53 12555 unsigned HOST_WIDE_INT align;
7509c759 12556{
a9098fd0 12557 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
7509c759 12558 toc_section ();
7509c759 12559 else
b64a1b53 12560 default_elf_select_rtx_section (mode, x, align);
7509c759
MM
12561}
12562
12563/* A C statement or statements to switch to the appropriate
12564 section for output of DECL. DECL is either a `VAR_DECL' node
12565 or a constant of some sort. RELOC indicates whether forming
12566 the initial value of DECL requires link-time relocations. */
12567
ae46c4e0
RH
12568static void
12569rs6000_elf_select_section (decl, reloc, align)
7509c759
MM
12570 tree decl;
12571 int reloc;
0e5dbd9b 12572 unsigned HOST_WIDE_INT align;
7509c759 12573{
0e5dbd9b
DE
12574 default_elf_select_section_1 (decl, reloc, align,
12575 flag_pic || DEFAULT_ABI == ABI_AIX);
63019373
GK
12576}
12577
12578/* A C statement to build up a unique section name, expressed as a
12579 STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
12580 RELOC indicates whether the initial value of EXP requires
12581 link-time relocations. If you do not define this macro, GCC will use
12582 the symbol name prefixed by `.' as the section name. Note - this
f5143c46 12583 macro can now be called for uninitialized data items as well as
4912a07c 12584 initialized data and functions. */
63019373 12585
ae46c4e0
RH
12586static void
12587rs6000_elf_unique_section (decl, reloc)
63019373
GK
12588 tree decl;
12589 int reloc;
12590{
0e5dbd9b
DE
12591 default_unique_section_1 (decl, reloc,
12592 flag_pic || DEFAULT_ABI == ABI_AIX);
7509c759 12593}
d9407988
MM
12594
12595\f
d9407988
MM
12596/* If we are referencing a function that is static or is known to be
12597 in this file, make the SYMBOL_REF special. We can use this to indicate
12598 that we can branch to this function without emitting a no-op after the
9ebbca7d 12599 call. For real AIX calling sequences, we also replace the
d9407988
MM
12600 function name with the real name (1 or 2 leading .'s), rather than
12601 the function descriptor name. This saves a lot of overriding code
a260abc9 12602 to read the prefixes. */
d9407988 12603
fb49053f
RH
12604static void
12605rs6000_elf_encode_section_info (decl, first)
d9407988 12606 tree decl;
b2003250 12607 int first;
d9407988 12608{
b2003250
RH
12609 if (!first)
12610 return;
12611
d9407988
MM
12612 if (TREE_CODE (decl) == FUNCTION_DECL)
12613 {
12614 rtx sym_ref = XEXP (DECL_RTL (decl), 0);
b629ba0c 12615 if ((*targetm.binds_local_p) (decl))
d9407988
MM
12616 SYMBOL_REF_FLAG (sym_ref) = 1;
12617
9ebbca7d 12618 if (DEFAULT_ABI == ABI_AIX)
d9407988 12619 {
ff669a6c
RH
12620 size_t len1 = (DEFAULT_ABI == ABI_AIX) ? 1 : 2;
12621 size_t len2 = strlen (XSTR (sym_ref, 0));
520a57c8 12622 char *str = alloca (len1 + len2 + 1);
ff669a6c
RH
12623 str[0] = '.';
12624 str[1] = '.';
12625 memcpy (str + len1, XSTR (sym_ref, 0), len2 + 1);
12626
520a57c8 12627 XSTR (sym_ref, 0) = ggc_alloc_string (str, len1 + len2);
d9407988
MM
12628 }
12629 }
12630 else if (rs6000_sdata != SDATA_NONE
f607bc57 12631 && DEFAULT_ABI == ABI_V4
d9407988
MM
12632 && TREE_CODE (decl) == VAR_DECL)
12633 {
12634 int size = int_size_in_bytes (TREE_TYPE (decl));
12635 tree section_name = DECL_SECTION_NAME (decl);
d330fd93 12636 const char *name = (char *)0;
d9407988
MM
12637 int len = 0;
12638
12639 if (section_name)
12640 {
12641 if (TREE_CODE (section_name) == STRING_CST)
12642 {
12643 name = TREE_STRING_POINTER (section_name);
12644 len = TREE_STRING_LENGTH (section_name);
12645 }
12646 else
12647 abort ();
12648 }
12649
12650 if ((size > 0 && size <= g_switch_value)
12651 || (name
5f59ecb7 12652 && ((len == sizeof (".sdata") - 1
3cb999d8 12653 && strcmp (name, ".sdata") == 0)
5f59ecb7 12654 || (len == sizeof (".sdata2") - 1
3cb999d8 12655 && strcmp (name, ".sdata2") == 0)
5f59ecb7 12656 || (len == sizeof (".sbss") - 1
3cb999d8 12657 && strcmp (name, ".sbss") == 0)
5f59ecb7 12658 || (len == sizeof (".sbss2") - 1
3cb999d8 12659 && strcmp (name, ".sbss2") == 0)
5f59ecb7 12660 || (len == sizeof (".PPC.EMB.sdata0") - 1
3cb999d8 12661 && strcmp (name, ".PPC.EMB.sdata0") == 0)
5f59ecb7 12662 || (len == sizeof (".PPC.EMB.sbss0") - 1
3cb999d8 12663 && strcmp (name, ".PPC.EMB.sbss0") == 0))))
d9407988
MM
12664 {
12665 rtx sym_ref = XEXP (DECL_RTL (decl), 0);
ff669a6c 12666 size_t len = strlen (XSTR (sym_ref, 0));
88c1e412 12667 char *str = alloca (len + 2);
ff669a6c 12668
ff669a6c
RH
12669 str[0] = '@';
12670 memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
88c1e412 12671 XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
d9407988
MM
12672 }
12673 }
12674}
12675
772c5265
RH
12676static const char *
12677rs6000_elf_strip_name_encoding (str)
12678 const char *str;
12679{
12680 while (*str == '*' || *str == '@')
12681 str++;
12682 return str;
12683}
12684
0e5dbd9b
DE
12685static bool
12686rs6000_elf_in_small_data_p (decl)
12687 tree decl;
12688{
12689 if (rs6000_sdata == SDATA_NONE)
12690 return false;
12691
12692 if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
12693 {
12694 const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
12695 if (strcmp (section, ".sdata") == 0
12696 || strcmp (section, ".sdata2") == 0
12697 || strcmp (section, ".sbss") == 0)
12698 return true;
12699 }
12700 else
12701 {
12702 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
12703
12704 if (size > 0
12705 && size <= g_switch_value
12706 && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
12707 return true;
12708 }
12709
12710 return false;
12711}
12712
b91da81f 12713#endif /* USING_ELFOS_H */
000034eb 12714
a6c2a102 12715\f
000034eb 12716/* Return a REG that occurs in ADDR with coefficient 1.
02441cd6
JL
12717 ADDR can be effectively incremented by incrementing REG.
12718
12719 r0 is special and we must not select it as an address
12720 register by this routine since our caller will try to
12721 increment the returned register via an "la" instruction. */
000034eb
DE
12722
12723struct rtx_def *
12724find_addr_reg (addr)
12725 rtx addr;
12726{
12727 while (GET_CODE (addr) == PLUS)
12728 {
02441cd6
JL
12729 if (GET_CODE (XEXP (addr, 0)) == REG
12730 && REGNO (XEXP (addr, 0)) != 0)
000034eb 12731 addr = XEXP (addr, 0);
02441cd6
JL
12732 else if (GET_CODE (XEXP (addr, 1)) == REG
12733 && REGNO (XEXP (addr, 1)) != 0)
000034eb
DE
12734 addr = XEXP (addr, 1);
12735 else if (CONSTANT_P (XEXP (addr, 0)))
12736 addr = XEXP (addr, 1);
12737 else if (CONSTANT_P (XEXP (addr, 1)))
12738 addr = XEXP (addr, 0);
12739 else
12740 abort ();
12741 }
02441cd6 12742 if (GET_CODE (addr) == REG && REGNO (addr) != 0)
000034eb
DE
12743 return addr;
12744 abort ();
12745}
12746
a6c2a102
DE
12747void
12748rs6000_fatal_bad_address (op)
12749 rtx op;
12750{
12751 fatal_insn ("bad address", op);
12752}
c8023011
MM
12753
12754/* Called to register all of our global variables with the garbage
12755 collector. */
12756
12757static void
12758rs6000_add_gc_roots ()
12759{
9ebbca7d
GK
12760 toc_hash_table = htab_create (1021, toc_hash_function, toc_hash_eq, NULL);
12761 ggc_add_root (&toc_hash_table, 1, sizeof (toc_hash_table),
12762 toc_hash_mark_table);
ee890fe2
SS
12763}
12764
12765#if TARGET_MACHO
12766
12767#if 0
12768/* Returns 1 if OP is either a symbol reference or a sum of a symbol
12769 reference and a constant. */
12770
12771int
12772symbolic_operand (op)
592696dd 12773 rtx op;
ee890fe2
SS
12774{
12775 switch (GET_CODE (op))
12776 {
12777 case SYMBOL_REF:
12778 case LABEL_REF:
12779 return 1;
12780 case CONST:
12781 op = XEXP (op, 0);
12782 return (GET_CODE (op) == SYMBOL_REF ||
12783 (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
12784 || GET_CODE (XEXP (op, 0)) == LABEL_REF)
12785 && GET_CODE (XEXP (op, 1)) == CONST_INT);
12786 default:
12787 return 0;
12788 }
c8023011 12789}
ee890fe2
SS
12790#endif
12791
12792#ifdef RS6000_LONG_BRANCH
12793
12794static tree stub_list = 0;
12795
12796/* ADD_COMPILER_STUB adds the compiler generated stub for handling
12797 procedure calls to the linked list. */
12798
12799void
12800add_compiler_stub (label_name, function_name, line_number)
12801 tree label_name;
12802 tree function_name;
12803 int line_number;
12804{
12805 tree stub = build_tree_list (function_name, label_name);
12806 TREE_TYPE (stub) = build_int_2 (line_number, 0);
12807 TREE_CHAIN (stub) = stub_list;
12808 stub_list = stub;
12809}
12810
12811#define STUB_LABEL_NAME(STUB) TREE_VALUE (STUB)
12812#define STUB_FUNCTION_NAME(STUB) TREE_PURPOSE (STUB)
12813#define STUB_LINE_NUMBER(STUB) TREE_INT_CST_LOW (TREE_TYPE (STUB))
12814
a4f6c312
SS
12815/* OUTPUT_COMPILER_STUB outputs the compiler generated stub for
12816 handling procedure calls from the linked list and initializes the
12817 linked list. */
ee890fe2 12818
a4f6c312
SS
12819void
12820output_compiler_stub ()
ee890fe2
SS
12821{
12822 char tmp_buf[256];
12823 char label_buf[256];
308c142a 12824 tree stub;
ee890fe2
SS
12825
12826 if (!flag_pic)
12827 for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
12828 {
12829 fprintf (asm_out_file,
12830 "%s:\n", IDENTIFIER_POINTER(STUB_LABEL_NAME(stub)));
12831
12832#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
12833 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
12834 fprintf (asm_out_file, "\t.stabd 68,0,%d\n", STUB_LINE_NUMBER(stub));
12835#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
12836
12837 if (IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub))[0] == '*')
12838 strcpy (label_buf,
12839 IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub))+1);
12840 else
12841 {
12842 label_buf[0] = '_';
12843 strcpy (label_buf+1,
12844 IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub)));
12845 }
12846
12847 strcpy (tmp_buf, "lis r12,hi16(");
12848 strcat (tmp_buf, label_buf);
12849 strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
12850 strcat (tmp_buf, label_buf);
12851 strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
12852 output_asm_insn (tmp_buf, 0);
12853
12854#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
12855 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
12856 fprintf(asm_out_file, "\t.stabd 68,0,%d\n", STUB_LINE_NUMBER (stub));
12857#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
12858 }
12859
12860 stub_list = 0;
12861}
12862
12863/* NO_PREVIOUS_DEF checks in the link list whether the function name is
12864 already there or not. */
12865
a4f6c312
SS
12866int
12867no_previous_def (function_name)
ee890fe2
SS
12868 tree function_name;
12869{
12870 tree stub;
12871 for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
12872 if (function_name == STUB_FUNCTION_NAME (stub))
12873 return 0;
12874 return 1;
12875}
12876
12877/* GET_PREV_LABEL gets the label name from the previous definition of
12878 the function. */
12879
a4f6c312
SS
12880tree
12881get_prev_label (function_name)
ee890fe2
SS
12882 tree function_name;
12883{
12884 tree stub;
12885 for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
12886 if (function_name == STUB_FUNCTION_NAME (stub))
12887 return STUB_LABEL_NAME (stub);
12888 return 0;
12889}
12890
12891/* INSN is either a function call or a millicode call. It may have an
12892 unconditional jump in its delay slot.
12893
12894 CALL_DEST is the routine we are calling. */
12895
12896char *
12897output_call (insn, call_dest, operand_number)
12898 rtx insn;
12899 rtx call_dest;
12900 int operand_number;
12901{
12902 static char buf[256];
12903 if (GET_CODE (call_dest) == SYMBOL_REF && TARGET_LONG_BRANCH && !flag_pic)
12904 {
12905 tree labelname;
12906 tree funname = get_identifier (XSTR (call_dest, 0));
12907
12908 if (no_previous_def (funname))
12909 {
308c142a 12910 int line_number = 0;
ee890fe2
SS
12911 rtx label_rtx = gen_label_rtx ();
12912 char *label_buf, temp_buf[256];
12913 ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
12914 CODE_LABEL_NUMBER (label_rtx));
12915 label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
12916 labelname = get_identifier (label_buf);
12917 for (; insn && GET_CODE (insn) != NOTE; insn = PREV_INSN (insn));
12918 if (insn)
12919 line_number = NOTE_LINE_NUMBER (insn);
12920 add_compiler_stub (labelname, funname, line_number);
12921 }
12922 else
12923 labelname = get_prev_label (funname);
12924
12925 sprintf (buf, "jbsr %%z%d,%.246s",
12926 operand_number, IDENTIFIER_POINTER (labelname));
12927 return buf;
12928 }
12929 else
12930 {
12931 sprintf (buf, "bl %%z%d", operand_number);
12932 return buf;
12933 }
12934}
12935
12936#endif /* RS6000_LONG_BRANCH */
12937
12938#define GEN_LOCAL_LABEL_FOR_SYMBOL(BUF,SYMBOL,LENGTH,N) \
12939 do { \
83182544 12940 const char *const symbol_ = (SYMBOL); \
ee890fe2
SS
12941 char *buffer_ = (BUF); \
12942 if (symbol_[0] == '"') \
12943 { \
12944 sprintf(buffer_, "\"L%d$%s", (N), symbol_+1); \
12945 } \
12946 else if (name_needs_quotes(symbol_)) \
12947 { \
12948 sprintf(buffer_, "\"L%d$%s\"", (N), symbol_); \
12949 } \
12950 else \
12951 { \
12952 sprintf(buffer_, "L%d$%s", (N), symbol_); \
12953 } \
12954 } while (0)
12955
12956
12957/* Generate PIC and indirect symbol stubs. */
12958
12959void
12960machopic_output_stub (file, symb, stub)
12961 FILE *file;
12962 const char *symb, *stub;
12963{
12964 unsigned int length;
a4f6c312
SS
12965 char *symbol_name, *lazy_ptr_name;
12966 char *local_label_0;
ee890fe2
SS
12967 static int label = 0;
12968
df56a27f 12969 /* Lose our funky encoding stuff so it doesn't contaminate the stub. */
772c5265 12970 symb = (*targetm.strip_name_encoding) (symb);
df56a27f 12971
ee890fe2
SS
12972 label += 1;
12973
ee890fe2
SS
12974 length = strlen (symb);
12975 symbol_name = alloca (length + 32);
12976 GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
12977
12978 lazy_ptr_name = alloca (length + 32);
12979 GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
12980
12981 local_label_0 = alloca (length + 32);
12982 GEN_LOCAL_LABEL_FOR_SYMBOL (local_label_0, symb, length, 0);
12983
ee890fe2 12984 if (flag_pic == 2)
d3c300d2 12985 machopic_picsymbol_stub1_section ();
ee890fe2 12986 else
d3c300d2
DJ
12987 machopic_symbol_stub1_section ();
12988 fprintf (file, "\t.align 2\n");
ee890fe2
SS
12989
12990 fprintf (file, "%s:\n", stub);
12991 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
12992
12993 if (flag_pic == 2)
12994 {
12995 fprintf (file, "\tmflr r0\n");
12996 fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
12997 fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
12998 fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
12999 lazy_ptr_name, local_label_0);
13000 fprintf (file, "\tmtlr r0\n");
d3c300d2 13001 fprintf (file, "\tlwzu r12,lo16(%s-%s)(r11)\n",
ee890fe2
SS
13002 lazy_ptr_name, local_label_0);
13003 fprintf (file, "\tmtctr r12\n");
ee890fe2
SS
13004 fprintf (file, "\tbctr\n");
13005 }
13006 else
13007 fprintf (file, "non-pure not supported\n");
13008
13009 machopic_lazy_symbol_ptr_section ();
13010 fprintf (file, "%s:\n", lazy_ptr_name);
13011 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
13012 fprintf (file, "\t.long dyld_stub_binding_helper\n");
13013}
13014
13015/* Legitimize PIC addresses. If the address is already
13016 position-independent, we return ORIG. Newly generated
13017 position-independent addresses go into a reg. This is REG if non
13018 zero, otherwise we allocate register(s) as necessary. */
13019
c859cda6 13020#define SMALL_INT(X) ((unsigned) (INTVAL(X) + 0x8000) < 0x10000)
ee890fe2
SS
13021
13022rtx
13023rs6000_machopic_legitimize_pic_address (orig, mode, reg)
13024 rtx orig;
13025 enum machine_mode mode;
13026 rtx reg;
13027{
13028 rtx base, offset;
13029
13030 if (reg == NULL && ! reload_in_progress && ! reload_completed)
13031 reg = gen_reg_rtx (Pmode);
13032
13033 if (GET_CODE (orig) == CONST)
13034 {
13035 if (GET_CODE (XEXP (orig, 0)) == PLUS
13036 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
13037 return orig;
13038
13039 if (GET_CODE (XEXP (orig, 0)) == PLUS)
13040 {
a4f6c312
SS
13041 base =
13042 rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
13043 Pmode, reg);
13044 offset =
13045 rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
13046 Pmode, reg);
ee890fe2
SS
13047 }
13048 else
13049 abort ();
13050
13051 if (GET_CODE (offset) == CONST_INT)
13052 {
13053 if (SMALL_INT (offset))
ed8908e7 13054 return plus_constant (base, INTVAL (offset));
ee890fe2
SS
13055 else if (! reload_in_progress && ! reload_completed)
13056 offset = force_reg (Pmode, offset);
13057 else
c859cda6
DJ
13058 {
13059 rtx mem = force_const_mem (Pmode, orig);
13060 return machopic_legitimize_pic_address (mem, Pmode, reg);
13061 }
ee890fe2
SS
13062 }
13063 return gen_rtx (PLUS, Pmode, base, offset);
13064 }
13065
13066 /* Fall back on generic machopic code. */
13067 return machopic_legitimize_pic_address (orig, mode, reg);
13068}
13069
13070/* This is just a placeholder to make linking work without having to
13071 add this to the generic Darwin EXTRA_SECTIONS. If -mcall-aix is
13072 ever needed for Darwin (not too likely!) this would have to get a
13073 real definition. */
13074
13075void
13076toc_section ()
13077{
13078}
13079
13080#endif /* TARGET_MACHO */
7c262518
RH
13081
13082#if TARGET_ELF
13083static unsigned int
13084rs6000_elf_section_type_flags (decl, name, reloc)
13085 tree decl;
13086 const char *name;
13087 int reloc;
13088{
5add3202
DE
13089 unsigned int flags
13090 = default_section_type_flags_1 (decl, name, reloc,
13091 flag_pic || DEFAULT_ABI == ABI_AIX);
7c262518 13092
270fc29b
RH
13093 if (TARGET_RELOCATABLE)
13094 flags |= SECTION_WRITE;
7c262518 13095
d0101753 13096 return flags;
7c262518 13097}
d9f6800d
RH
13098
13099/* Record an element in the table of global constructors. SYMBOL is
13100 a SYMBOL_REF of the function to be called; PRIORITY is a number
13101 between 0 and MAX_INIT_PRIORITY.
13102
13103 This differs from default_named_section_asm_out_constructor in
13104 that we have special handling for -mrelocatable. */
13105
13106static void
13107rs6000_elf_asm_out_constructor (symbol, priority)
13108 rtx symbol;
13109 int priority;
13110{
13111 const char *section = ".ctors";
13112 char buf[16];
13113
13114 if (priority != DEFAULT_INIT_PRIORITY)
13115 {
13116 sprintf (buf, ".ctors.%.5u",
13117 /* Invert the numbering so the linker puts us in the proper
13118 order; constructors are run from right to left, and the
13119 linker sorts in increasing order. */
13120 MAX_INIT_PRIORITY - priority);
13121 section = buf;
13122 }
13123
715bdd29
RH
13124 named_section_flags (section, SECTION_WRITE);
13125 assemble_align (POINTER_SIZE);
d9f6800d
RH
13126
13127 if (TARGET_RELOCATABLE)
13128 {
13129 fputs ("\t.long (", asm_out_file);
13130 output_addr_const (asm_out_file, symbol);
13131 fputs (")@fixup\n", asm_out_file);
13132 }
13133 else
c8af3574 13134 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
d9f6800d
RH
13135}
13136
13137static void
13138rs6000_elf_asm_out_destructor (symbol, priority)
13139 rtx symbol;
13140 int priority;
13141{
13142 const char *section = ".dtors";
13143 char buf[16];
13144
13145 if (priority != DEFAULT_INIT_PRIORITY)
13146 {
13147 sprintf (buf, ".dtors.%.5u",
13148 /* Invert the numbering so the linker puts us in the proper
13149 order; constructors are run from right to left, and the
13150 linker sorts in increasing order. */
13151 MAX_INIT_PRIORITY - priority);
13152 section = buf;
13153 }
13154
715bdd29
RH
13155 named_section_flags (section, SECTION_WRITE);
13156 assemble_align (POINTER_SIZE);
d9f6800d
RH
13157
13158 if (TARGET_RELOCATABLE)
13159 {
13160 fputs ("\t.long (", asm_out_file);
13161 output_addr_const (asm_out_file, symbol);
13162 fputs (")@fixup\n", asm_out_file);
13163 }
13164 else
c8af3574 13165 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
d9f6800d 13166}
7c262518
RH
13167#endif
13168
cbaaba19 13169#if TARGET_XCOFF
7c262518 13170static void
b275d088
DE
13171rs6000_xcoff_asm_globalize_label (stream, name)
13172 FILE *stream;
13173 const char *name;
13174{
13175 fputs (GLOBAL_ASM_OP, stream);
13176 RS6000_OUTPUT_BASENAME (stream, name);
13177 putc ('\n', stream);
13178}
13179
13180static void
13181rs6000_xcoff_asm_named_section (name, flags)
7c262518 13182 const char *name;
0e5dbd9b 13183 unsigned int flags;
7c262518 13184{
0e5dbd9b
DE
13185 int smclass;
13186 static const char * const suffix[3] = { "PR", "RO", "RW" };
13187
13188 if (flags & SECTION_CODE)
13189 smclass = 0;
13190 else if (flags & SECTION_WRITE)
13191 smclass = 2;
13192 else
13193 smclass = 1;
13194
5b5198f7 13195 fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
0e5dbd9b 13196 (flags & SECTION_CODE) ? "." : "",
5b5198f7 13197 name, suffix[smclass], flags & SECTION_ENTSIZE);
7c262518 13198}
ae46c4e0
RH
13199
13200static void
0e5dbd9b
DE
13201rs6000_xcoff_select_section (decl, reloc, align)
13202 tree decl;
ae46c4e0
RH
13203 int reloc;
13204 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
13205{
5add3202 13206 if (decl_readonly_section_1 (decl, reloc, 1))
ae46c4e0 13207 {
0e5dbd9b 13208 if (TREE_PUBLIC (decl))
ae46c4e0
RH
13209 read_only_data_section ();
13210 else
13211 read_only_private_data_section ();
13212 }
13213 else
13214 {
0e5dbd9b 13215 if (TREE_PUBLIC (decl))
ae46c4e0
RH
13216 data_section ();
13217 else
13218 private_data_section ();
13219 }
13220}
13221
13222static void
13223rs6000_xcoff_unique_section (decl, reloc)
13224 tree decl;
772c5265 13225 int reloc ATTRIBUTE_UNUSED;
ae46c4e0
RH
13226{
13227 const char *name;
ae46c4e0 13228
5b5198f7
DE
13229 /* Use select_section for private and uninitialized data. */
13230 if (!TREE_PUBLIC (decl)
13231 || DECL_COMMON (decl)
0e5dbd9b
DE
13232 || DECL_INITIAL (decl) == NULL_TREE
13233 || DECL_INITIAL (decl) == error_mark_node
13234 || (flag_zero_initialized_in_bss
13235 && initializer_zerop (DECL_INITIAL (decl))))
13236 return;
13237
13238 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
13239 name = (*targetm.strip_name_encoding) (name);
13240 DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
ae46c4e0 13241}
b64a1b53 13242
fb49053f
RH
13243/* Select section for constant in constant pool.
13244
13245 On RS/6000, all constants are in the private read-only data area.
13246 However, if this is being placed in the TOC it must be output as a
13247 toc entry. */
13248
b64a1b53
RH
13249static void
13250rs6000_xcoff_select_rtx_section (mode, x, align)
13251 enum machine_mode mode;
13252 rtx x;
13253 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
13254{
13255 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
13256 toc_section ();
13257 else
13258 read_only_private_data_section ();
13259}
772c5265
RH
13260
13261/* Remove any trailing [DS] or the like from the symbol name. */
13262
13263static const char *
13264rs6000_xcoff_strip_name_encoding (name)
13265 const char *name;
13266{
13267 size_t len;
13268 if (*name == '*')
13269 name++;
13270 len = strlen (name);
13271 if (name[len - 1] == ']')
13272 return ggc_alloc_string (name, len - 4);
13273 else
13274 return name;
13275}
13276
5add3202
DE
13277/* Section attributes. AIX is always PIC. */
13278
13279static unsigned int
13280rs6000_xcoff_section_type_flags (decl, name, reloc)
13281 tree decl;
13282 const char *name;
13283 int reloc;
13284{
5b5198f7
DE
13285 unsigned int align;
13286 unsigned int flags = default_section_type_flags_1 (decl, name, reloc, 1);
13287
13288 /* Align to at least UNIT size. */
13289 if (flags & SECTION_CODE)
13290 align = MIN_UNITS_PER_WORD;
13291 else
13292 /* Increase alignment of large objects if not already stricter. */
13293 align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
13294 int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
13295 ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
13296
13297 return flags | (exact_log2 (align) & SECTION_ENTSIZE);
5add3202
DE
13298}
13299
cbaaba19 13300#endif /* TARGET_XCOFF */
fb49053f 13301
0e5dbd9b 13302/* Note that this is also used for PPC64 Linux. */
fb49053f
RH
13303
13304static void
13305rs6000_xcoff_encode_section_info (decl, first)
13306 tree decl;
13307 int first ATTRIBUTE_UNUSED;
13308{
13309 if (TREE_CODE (decl) == FUNCTION_DECL
b629ba0c 13310 && (*targetm.binds_local_p) (decl))
fb49053f
RH
13311 SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1;
13312}
0e5dbd9b
DE
13313
13314/* Cross-module name binding. For AIX and PPC64 Linux, which always are
13315 PIC, use private copy of flag_pic. */
13316
2bcc50d0 13317static bool
0e5dbd9b
DE
13318rs6000_binds_local_p (decl)
13319 tree decl;
13320{
5add3202 13321 return default_binds_local_p_1 (decl, flag_pic || rs6000_flag_pic);
0e5dbd9b 13322}
34bb030a
DE
13323
13324/* A C expression returning the cost of moving data from a register of class
13325 CLASS1 to one of CLASS2. */
13326
13327int
13328rs6000_register_move_cost (mode, from, to)
13329 enum machine_mode mode;
13330 enum reg_class from, to;
13331{
13332 /* Moves from/to GENERAL_REGS. */
13333 if (reg_classes_intersect_p (to, GENERAL_REGS)
13334 || reg_classes_intersect_p (from, GENERAL_REGS))
13335 {
13336 if (! reg_classes_intersect_p (to, GENERAL_REGS))
13337 from = to;
13338
13339 if (from == FLOAT_REGS || from == ALTIVEC_REGS)
13340 return (rs6000_memory_move_cost (mode, from, 0)
13341 + rs6000_memory_move_cost (mode, GENERAL_REGS, 0));
13342
13343/* It's more expensive to move CR_REGS than CR0_REGS because of the shift...*/
13344 else if (from == CR_REGS)
13345 return 4;
13346
13347 else
13348/* A move will cost one instruction per GPR moved. */
13349 return 2 * HARD_REGNO_NREGS (0, mode);
13350 }
13351
13352/* Moving between two similar registers is just one instruction. */
13353 else if (reg_classes_intersect_p (to, from))
13354 return mode == TFmode ? 4 : 2;
13355
13356/* Everything else has to go through GENERAL_REGS. */
13357 else
13358 return (rs6000_register_move_cost (mode, GENERAL_REGS, to)
13359 + rs6000_register_move_cost (mode, from, GENERAL_REGS));
13360}
13361
13362/* A C expressions returning the cost of moving data of MODE from a register to
13363 or from memory. */
13364
13365int
13366rs6000_memory_move_cost (mode, class, in)
13367 enum machine_mode mode;
13368 enum reg_class class;
13369 int in ATTRIBUTE_UNUSED;
13370{
13371 if (reg_classes_intersect_p (class, GENERAL_REGS))
13372 return 4 * HARD_REGNO_NREGS (0, mode);
13373 else if (reg_classes_intersect_p (class, FLOAT_REGS))
13374 return 4 * HARD_REGNO_NREGS (32, mode);
13375 else if (reg_classes_intersect_p (class, ALTIVEC_REGS))
13376 return 4 * HARD_REGNO_NREGS (FIRST_ALTIVEC_REGNO, mode);
13377 else
13378 return 4 + rs6000_register_move_cost (mode, class, GENERAL_REGS);
13379}
13380