]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/rs6000/rs6000.c
cp-tree.h (build_scoped_method_call): Remove.
[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 5
5de601cf 6 This file is part of GCC.
9878760c 7
5de601cf
NC
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published
10 by the Free Software Foundation; either version 2, or (at your
11 option) any later version.
9878760c 12
5de601cf
NC
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
9878760c 17
5de601cf
NC
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the
20 Free Software Foundation, 59 Temple Place - Suite 330, Boston,
21 MA 02111-1307, USA. */
9878760c 22
956d6950 23#include "config.h"
c4d38ccb 24#include "system.h"
4977bab6
ZW
25#include "coretypes.h"
26#include "tm.h"
9878760c
RK
27#include "rtl.h"
28#include "regs.h"
29#include "hard-reg-set.h"
30#include "real.h"
31#include "insn-config.h"
32#include "conditions.h"
9878760c
RK
33#include "insn-attr.h"
34#include "flags.h"
35#include "recog.h"
9878760c 36#include "obstack.h"
9b30bae2 37#include "tree.h"
dfafc897 38#include "expr.h"
2fc1c679 39#include "optabs.h"
2a430ec1 40#include "except.h"
a7df97e6 41#include "function.h"
296b8152 42#include "output.h"
d5fa86ba 43#include "basic-block.h"
d0101753 44#include "integrate.h"
296b8152 45#include "toplev.h"
c8023011 46#include "ggc.h"
9ebbca7d
GK
47#include "hashtab.h"
48#include "tm_p.h"
672a6f42
NB
49#include "target.h"
50#include "target-def.h"
3ac88239 51#include "langhooks.h"
24ea750e 52#include "reload.h"
117dca74 53#include "cfglayout.h"
1bc7c5b6
ZW
54#if TARGET_XCOFF
55#include "xcoffout.h" /* get declarations of xcoff_*_section_name */
56#endif
9b30bae2 57
7509c759
MM
58#ifndef TARGET_NO_PROTOTYPE
59#define TARGET_NO_PROTOTYPE 0
60#endif
61
d744e06e
AH
62#define EASY_VECTOR_15(n, x, y) ((n) >= -16 && (n) <= 15 \
63 && easy_vector_same (x, y))
64
65#define EASY_VECTOR_15_ADD_SELF(n, x, y) ((n) >= 0x10 && (n) <= 0x1e \
66 && !((n) & 1) \
67 && easy_vector_same (x, y))
68
9878760c
RK
69#define min(A,B) ((A) < (B) ? (A) : (B))
70#define max(A,B) ((A) > (B) ? (A) : (B))
71
5248c961
RK
72/* Target cpu type */
73
74enum processor_type rs6000_cpu;
8e3f41e7
MM
75struct rs6000_cpu_select rs6000_select[3] =
76{
815cdc52
MM
77 /* switch name, tune arch */
78 { (const char *)0, "--with-cpu=", 1, 1 },
79 { (const char *)0, "-mcpu=", 1, 1 },
80 { (const char *)0, "-mtune=", 1, 0 },
8e3f41e7 81};
5248c961 82
6fa3f289
ZW
83/* Size of long double */
84const char *rs6000_long_double_size_string;
85int rs6000_long_double_type_size;
86
87/* Whether -mabi=altivec has appeared */
88int rs6000_altivec_abi;
89
08b57fb3
AH
90/* Whether VRSAVE instructions should be generated. */
91int rs6000_altivec_vrsave;
92
93/* String from -mvrsave= option. */
94const char *rs6000_altivec_vrsave_string;
95
a3170dc6
AH
96/* Nonzero if we want SPE ABI extensions. */
97int rs6000_spe_abi;
98
99/* Whether isel instructions should be generated. */
100int rs6000_isel;
101
993f19a8
AH
102/* Whether SPE simd instructions should be generated. */
103int rs6000_spe;
104
5da702b1
AH
105/* Nonzero if floating point operations are done in the GPRs. */
106int rs6000_float_gprs = 0;
107
108/* String from -mfloat-gprs=. */
109const char *rs6000_float_gprs_string;
a3170dc6
AH
110
111/* String from -misel=. */
112const char *rs6000_isel_string;
113
993f19a8
AH
114/* String from -mspe=. */
115const char *rs6000_spe_string;
116
a0ab749a 117/* Set to nonzero once AIX common-mode calls have been defined. */
bbfb86aa 118static GTY(()) int common_mode_defined;
c81bebd7 119
9878760c
RK
120/* Save information from a "cmpxx" operation until the branch or scc is
121 emitted. */
9878760c
RK
122rtx rs6000_compare_op0, rs6000_compare_op1;
123int rs6000_compare_fp_p;
874a0744 124
874a0744
MM
125/* Label number of label created for -mrelocatable, to call to so we can
126 get the address of the GOT section */
127int rs6000_pic_labelno;
c81bebd7 128
b91da81f 129#ifdef USING_ELFOS_H
c81bebd7 130/* Which abi to adhere to */
9739c90c 131const char *rs6000_abi_name;
d9407988
MM
132
133/* Semantics of the small data area */
134enum rs6000_sdata_type rs6000_sdata = SDATA_DATA;
135
136/* Which small data model to use */
815cdc52 137const char *rs6000_sdata_name = (char *)0;
9ebbca7d
GK
138
139/* Counter for labels which are to be placed in .fixup. */
140int fixuplabelno = 0;
874a0744 141#endif
4697a36c 142
c4501e62
JJ
143/* Bit size of immediate TLS offsets and string from which it is decoded. */
144int rs6000_tls_size = 32;
145const char *rs6000_tls_size_string;
146
b6c9286a
MM
147/* ABI enumeration available for subtarget to use. */
148enum rs6000_abi rs6000_current_abi;
149
0ac081f6
AH
150/* ABI string from -mabi= option. */
151const char *rs6000_abi_string;
152
38c1f2d7 153/* Debug flags */
815cdc52 154const char *rs6000_debug_name;
38c1f2d7
MM
155int rs6000_debug_stack; /* debug stack applications */
156int rs6000_debug_arg; /* debug argument handling */
157
6035d635 158/* Opaque types. */
2abe3e28 159static GTY(()) tree opaque_V2SI_type_node;
2abe3e28 160static GTY(()) tree opaque_V2SF_type_node;
6035d635 161static GTY(()) tree opaque_p_V2SI_type_node;
2abe3e28 162
57ac7be9
AM
163const char *rs6000_traceback_name;
164static enum {
165 traceback_default = 0,
166 traceback_none,
167 traceback_part,
168 traceback_full
169} rs6000_traceback;
170
38c1f2d7
MM
171/* Flag to say the TOC is initialized */
172int toc_initialized;
9ebbca7d 173char toc_label_name[10];
38c1f2d7 174
9ebbca7d
GK
175/* Alias set for saves and restores from the rs6000 stack. */
176static int rs6000_sr_alias_set;
c8023011 177
a5c76ee6
ZW
178/* Call distance, overridden by -mlongcall and #pragma longcall(1).
179 The only place that looks at this is rs6000_set_default_type_attributes;
180 everywhere else should rely on the presence or absence of a longcall
181 attribute on the function declaration. */
182int rs6000_default_long_calls;
183const char *rs6000_longcall_switch;
184
025d9908
KH
185/* Control alignment for fields within structures. */
186/* String from -malign-XXXXX. */
187const char *rs6000_alignment_string;
188int rs6000_alignment_flags;
189
a3170dc6
AH
190struct builtin_description
191{
192 /* mask is not const because we're going to alter it below. This
193 nonsense will go away when we rewrite the -march infrastructure
194 to give us more target flag bits. */
195 unsigned int mask;
196 const enum insn_code icode;
197 const char *const name;
198 const enum rs6000_builtins code;
199};
200
4977bab6 201static bool rs6000_function_ok_for_sibcall PARAMS ((tree, tree));
9ebbca7d 202static int num_insns_constant_wide PARAMS ((HOST_WIDE_INT));
39a10a29
GK
203static void validate_condition_mode
204 PARAMS ((enum rtx_code, enum machine_mode));
205static rtx rs6000_generate_compare PARAMS ((enum rtx_code));
e50f5f3d 206static void rs6000_maybe_dead PARAMS ((rtx));
9ebbca7d
GK
207static void rs6000_emit_stack_tie PARAMS ((void));
208static void rs6000_frame_related PARAMS ((rtx, rtx, HOST_WIDE_INT, rtx, rtx));
c19de7aa
AH
209static rtx spe_synthesize_frame_save PARAMS ((rtx));
210static bool spe_func_has_64bit_regs_p PARAMS ((void));
89e7058f
AH
211static void emit_frame_save PARAMS ((rtx, rtx, enum machine_mode,
212 unsigned int, int, int));
a3170dc6 213static rtx gen_frame_mem_offset PARAMS ((enum machine_mode, rtx, int));
9ebbca7d
GK
214static void rs6000_emit_allocate_stack PARAMS ((HOST_WIDE_INT, int));
215static unsigned rs6000_hash_constant PARAMS ((rtx));
216static unsigned toc_hash_function PARAMS ((const void *));
217static int toc_hash_eq PARAMS ((const void *, const void *));
9ebbca7d 218static int constant_pool_expr_1 PARAMS ((rtx, int *, int *));
4d588c14
RH
219static bool constant_pool_expr_p PARAMS ((rtx));
220static bool toc_relative_expr_p PARAMS ((rtx));
221static bool legitimate_small_data_p PARAMS ((enum machine_mode, rtx));
222static bool legitimate_offset_address_p PARAMS ((enum machine_mode, rtx, int));
223static bool legitimate_indexed_address_p PARAMS ((rtx, int));
224static bool legitimate_indirect_address_p PARAMS ((rtx, int));
225static bool legitimate_lo_sum_address_p PARAMS ((enum machine_mode, rtx, int));
e2500fed 226static struct machine_function * rs6000_init_machine_status PARAMS ((void));
301d03af 227static bool rs6000_assemble_integer PARAMS ((rtx, unsigned int, int));
5add3202 228#ifdef HAVE_GAS_HIDDEN
25fdb4dc 229static void rs6000_assemble_visibility PARAMS ((tree, int));
5add3202 230#endif
71f123ca 231static int rs6000_ra_ever_killed PARAMS ((void));
91d231cb 232static tree rs6000_handle_longcall_attribute PARAMS ((tree *, tree, tree, int, bool *));
b86fe7b4 233extern const struct attribute_spec rs6000_attribute_table[];
a5c76ee6 234static void rs6000_set_default_type_attributes PARAMS ((tree));
08c148a8
NB
235static void rs6000_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
236static void rs6000_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
3961e8fe
RH
237static void rs6000_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT,
238 HOST_WIDE_INT, tree));
2bfcf297
DB
239static rtx rs6000_emit_set_long_const PARAMS ((rtx,
240 HOST_WIDE_INT, HOST_WIDE_INT));
1bc7c5b6 241static void rs6000_file_start PARAMS ((void));
7c262518
RH
242#if TARGET_ELF
243static unsigned int rs6000_elf_section_type_flags PARAMS ((tree, const char *,
244 int));
d9f6800d
RH
245static void rs6000_elf_asm_out_constructor PARAMS ((rtx, int));
246static void rs6000_elf_asm_out_destructor PARAMS ((rtx, int));
ae46c4e0 247static void rs6000_elf_select_section PARAMS ((tree, int,
5b71a4e7 248 unsigned HOST_WIDE_INT));
ae46c4e0 249static void rs6000_elf_unique_section PARAMS ((tree, int));
b64a1b53
RH
250static void rs6000_elf_select_rtx_section PARAMS ((enum machine_mode, rtx,
251 unsigned HOST_WIDE_INT));
c6a2438a 252static void rs6000_elf_encode_section_info PARAMS ((tree, rtx, int))
0e5dbd9b 253 ATTRIBUTE_UNUSED;
0e5dbd9b 254static bool rs6000_elf_in_small_data_p PARAMS ((tree));
7c262518 255#endif
cbaaba19 256#if TARGET_XCOFF
b275d088
DE
257static void rs6000_xcoff_asm_globalize_label PARAMS ((FILE *, const char *));
258static void rs6000_xcoff_asm_named_section PARAMS ((const char *, unsigned int));
ae46c4e0
RH
259static void rs6000_xcoff_select_section PARAMS ((tree, int,
260 unsigned HOST_WIDE_INT));
261static void rs6000_xcoff_unique_section PARAMS ((tree, int));
b64a1b53
RH
262static void rs6000_xcoff_select_rtx_section PARAMS ((enum machine_mode, rtx,
263 unsigned HOST_WIDE_INT));
772c5265 264static const char * rs6000_xcoff_strip_name_encoding PARAMS ((const char *));
5add3202 265static unsigned int rs6000_xcoff_section_type_flags PARAMS ((tree, const char *, int));
1bc7c5b6 266static void rs6000_xcoff_file_start PARAMS ((void));
a5fe455b 267static void rs6000_xcoff_file_end PARAMS ((void));
f1384257
AM
268#endif
269#if TARGET_MACHO
2bcc50d0 270static bool rs6000_binds_local_p PARAMS ((tree));
f1384257 271#endif
b54cf83a 272static int rs6000_use_dfa_pipeline_interface PARAMS ((void));
b54cf83a 273static int rs6000_variable_issue PARAMS ((FILE *, int, rtx, int));
3c50106f 274static bool rs6000_rtx_costs PARAMS ((rtx, int, int, int *));
c237e94a
ZW
275static int rs6000_adjust_cost PARAMS ((rtx, rtx, rtx, int));
276static int rs6000_adjust_priority PARAMS ((rtx, int));
277static int rs6000_issue_rate PARAMS ((void));
be12c2b0 278static int rs6000_use_sched_lookahead PARAMS ((void));
c237e94a 279
6fa3f289 280static void rs6000_init_builtins PARAMS ((void));
92898235
AH
281static rtx rs6000_expand_unop_builtin PARAMS ((enum insn_code, tree, rtx));
282static rtx rs6000_expand_binop_builtin PARAMS ((enum insn_code, tree, rtx));
283static rtx rs6000_expand_ternop_builtin PARAMS ((enum insn_code, tree, rtx));
0ac081f6 284static rtx rs6000_expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int));
92898235 285static void altivec_init_builtins PARAMS ((void));
a3170dc6
AH
286static void rs6000_common_init_builtins PARAMS ((void));
287
288static void enable_mask_for_builtins PARAMS ((struct builtin_description *,
289 int, enum rs6000_builtins,
290 enum rs6000_builtins));
291static void spe_init_builtins PARAMS ((void));
292static rtx spe_expand_builtin PARAMS ((tree, rtx, bool *));
293static rtx spe_expand_predicate_builtin PARAMS ((enum insn_code, tree, rtx));
294static rtx spe_expand_evsel_builtin PARAMS ((enum insn_code, tree, rtx));
295static int rs6000_emit_int_cmove PARAMS ((rtx, rtx, rtx, rtx));
296
92898235 297static rtx altivec_expand_builtin PARAMS ((tree, rtx, bool *));
3a9b8c7e
AH
298static rtx altivec_expand_ld_builtin PARAMS ((tree, rtx, bool *));
299static rtx altivec_expand_st_builtin PARAMS ((tree, rtx, bool *));
300static rtx altivec_expand_dst_builtin PARAMS ((tree, rtx, bool *));
100c4561 301static rtx altivec_expand_abs_builtin PARAMS ((enum insn_code, tree, rtx));
ae4b4a02 302static rtx altivec_expand_predicate_builtin PARAMS ((enum insn_code, const char *, tree, rtx));
6525c0e7 303static rtx altivec_expand_stv_builtin PARAMS ((enum insn_code, tree));
0ac081f6 304static void rs6000_parse_abi_options PARAMS ((void));
025d9908 305static void rs6000_parse_alignment_option PARAMS ((void));
c4501e62 306static void rs6000_parse_tls_size_option PARAMS ((void));
5da702b1 307static void rs6000_parse_yes_no_option (const char *, const char *, int *);
00b960c7
AH
308static int first_altivec_reg_to_save PARAMS ((void));
309static unsigned int compute_vrsave_mask PARAMS ((void));
310static void is_altivec_return_reg PARAMS ((rtx, void *));
9aa86737 311static rtx generate_set_vrsave PARAMS ((rtx, rs6000_stack_t *, int));
d744e06e
AH
312int easy_vector_constant PARAMS ((rtx, enum machine_mode));
313static int easy_vector_same PARAMS ((rtx, enum machine_mode));
c8e4f0e9 314static bool is_ev64_opaque_type PARAMS ((tree));
96714395 315static rtx rs6000_dwarf_register_span PARAMS ((rtx));
c4501e62
JJ
316static rtx rs6000_legitimize_tls_address PARAMS ((rtx, enum tls_model));
317static rtx rs6000_tls_get_addr PARAMS ((void));
318static rtx rs6000_got_sym PARAMS ((void));
319static inline int rs6000_tls_symbol_ref_1 PARAMS ((rtx *, void *));
320static const char *rs6000_get_some_local_dynamic_name PARAMS ((void));
321static int rs6000_get_some_local_dynamic_name_1 PARAMS ((rtx *, void *));
ded9bf77 322static rtx rs6000_complex_function_value (enum machine_mode);
a6c9bed4 323static rtx rs6000_spe_function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree);
17211ab5
GK
324
325/* Hash table stuff for keeping track of TOC entries. */
326
327struct toc_hash_struct GTY(())
328{
329 /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
330 ASM_OUTPUT_SPECIAL_POOL_ENTRY_P. */
331 rtx key;
332 enum machine_mode key_mode;
333 int labelno;
334};
335
336static GTY ((param_is (struct toc_hash_struct))) htab_t toc_hash_table;
c81bebd7
MM
337\f
338/* Default register names. */
339char rs6000_reg_names[][8] =
340{
802a0058
MM
341 "0", "1", "2", "3", "4", "5", "6", "7",
342 "8", "9", "10", "11", "12", "13", "14", "15",
343 "16", "17", "18", "19", "20", "21", "22", "23",
344 "24", "25", "26", "27", "28", "29", "30", "31",
345 "0", "1", "2", "3", "4", "5", "6", "7",
346 "8", "9", "10", "11", "12", "13", "14", "15",
347 "16", "17", "18", "19", "20", "21", "22", "23",
348 "24", "25", "26", "27", "28", "29", "30", "31",
349 "mq", "lr", "ctr","ap",
350 "0", "1", "2", "3", "4", "5", "6", "7",
0ac081f6
AH
351 "xer",
352 /* AltiVec registers. */
0cd5e3a1
AH
353 "0", "1", "2", "3", "4", "5", "6", "7",
354 "8", "9", "10", "11", "12", "13", "14", "15",
355 "16", "17", "18", "19", "20", "21", "22", "23",
356 "24", "25", "26", "27", "28", "29", "30", "31",
59a4c851
AH
357 "vrsave", "vscr",
358 /* SPE registers. */
359 "spe_acc", "spefscr"
c81bebd7
MM
360};
361
362#ifdef TARGET_REGNAMES
8b60264b 363static const char alt_reg_names[][8] =
c81bebd7 364{
802a0058
MM
365 "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7",
366 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
367 "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
368 "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
369 "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
370 "%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
371 "%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
372 "%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
373 "mq", "lr", "ctr", "ap",
374 "%cr0", "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
0ac081f6 375 "xer",
59a4c851 376 /* AltiVec registers. */
0ac081f6 377 "%v0", "%v1", "%v2", "%v3", "%v4", "%v5", "%v6", "%v7",
59a4c851
AH
378 "%v8", "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
379 "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
380 "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
381 "vrsave", "vscr",
382 /* SPE registers. */
383 "spe_acc", "spefscr"
c81bebd7
MM
384};
385#endif
9878760c 386\f
daf11973
MM
387#ifndef MASK_STRICT_ALIGN
388#define MASK_STRICT_ALIGN 0
389#endif
ffcfcb5f
AM
390#ifndef TARGET_PROFILE_KERNEL
391#define TARGET_PROFILE_KERNEL 0
392#endif
3961e8fe
RH
393
394/* The VRSAVE bitmask puts bit %v0 as the most significant bit. */
395#define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
c4501e62
JJ
396
397/* Return 1 for a symbol ref for a thread-local storage symbol. */
398#define RS6000_SYMBOL_REF_TLS_P(RTX) \
399 (GET_CODE (RTX) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (RTX) != 0)
672a6f42
NB
400\f
401/* Initialize the GCC target structure. */
91d231cb
JM
402#undef TARGET_ATTRIBUTE_TABLE
403#define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table
a5c76ee6
ZW
404#undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
405#define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes
daf11973 406
301d03af
RS
407#undef TARGET_ASM_ALIGNED_DI_OP
408#define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP
409
410/* Default unaligned ops are only provided for ELF. Find the ops needed
411 for non-ELF systems. */
412#ifndef OBJECT_FORMAT_ELF
cbaaba19 413#if TARGET_XCOFF
ae6c1efd 414/* For XCOFF. rs6000_assemble_integer will handle unaligned DIs on
301d03af
RS
415 64-bit targets. */
416#undef TARGET_ASM_UNALIGNED_HI_OP
417#define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"
418#undef TARGET_ASM_UNALIGNED_SI_OP
419#define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"
420#undef TARGET_ASM_UNALIGNED_DI_OP
421#define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"
422#else
423/* For Darwin. */
424#undef TARGET_ASM_UNALIGNED_HI_OP
425#define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
426#undef TARGET_ASM_UNALIGNED_SI_OP
427#define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
428#endif
429#endif
430
431/* This hook deals with fixups for relocatable code and DI-mode objects
432 in 64-bit code. */
433#undef TARGET_ASM_INTEGER
434#define TARGET_ASM_INTEGER rs6000_assemble_integer
435
93638d7a
AM
436#ifdef HAVE_GAS_HIDDEN
437#undef TARGET_ASM_ASSEMBLE_VISIBILITY
438#define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
439#endif
440
c4501e62
JJ
441#undef TARGET_HAVE_TLS
442#define TARGET_HAVE_TLS HAVE_AS_TLS
443
444#undef TARGET_CANNOT_FORCE_CONST_MEM
445#define TARGET_CANNOT_FORCE_CONST_MEM rs6000_tls_referenced_p
446
08c148a8
NB
447#undef TARGET_ASM_FUNCTION_PROLOGUE
448#define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
449#undef TARGET_ASM_FUNCTION_EPILOGUE
450#define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
451
b54cf83a
DE
452#undef TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE
453#define TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE rs6000_use_dfa_pipeline_interface
b54cf83a
DE
454#undef TARGET_SCHED_VARIABLE_ISSUE
455#define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue
456
c237e94a
ZW
457#undef TARGET_SCHED_ISSUE_RATE
458#define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
459#undef TARGET_SCHED_ADJUST_COST
460#define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost
461#undef TARGET_SCHED_ADJUST_PRIORITY
462#define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority
463
be12c2b0
VM
464#undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
465#define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead
466
0ac081f6
AH
467#undef TARGET_INIT_BUILTINS
468#define TARGET_INIT_BUILTINS rs6000_init_builtins
469
470#undef TARGET_EXPAND_BUILTIN
471#define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
472
f1384257 473#if TARGET_MACHO
0e5dbd9b
DE
474#undef TARGET_BINDS_LOCAL_P
475#define TARGET_BINDS_LOCAL_P rs6000_binds_local_p
f1384257 476#endif
0e5dbd9b 477
3961e8fe
RH
478#undef TARGET_ASM_OUTPUT_MI_THUNK
479#define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk
480
3961e8fe 481#undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
5b71a4e7 482#define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_tree_hwi_hwi_tree_true
00b960c7 483
4977bab6
ZW
484#undef TARGET_FUNCTION_OK_FOR_SIBCALL
485#define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
486
3c50106f
RH
487#undef TARGET_RTX_COSTS
488#define TARGET_RTX_COSTS rs6000_rtx_costs
dcefdf67
RH
489#undef TARGET_ADDRESS_COST
490#define TARGET_ADDRESS_COST hook_int_rtx_0
3c50106f 491
c8e4f0e9
AH
492#undef TARGET_VECTOR_OPAQUE_P
493#define TARGET_VECTOR_OPAQUE_P is_ev64_opaque_type
62e1dfcf 494
96714395
AH
495#undef TARGET_DWARF_REGISTER_SPAN
496#define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
497
f6897b10 498struct gcc_target targetm = TARGET_INITIALIZER;
672a6f42 499\f
5248c961
RK
500/* Override command line options. Mostly we process the processor
501 type and sometimes adjust other TARGET_ options. */
502
503void
8e3f41e7 504rs6000_override_options (default_cpu)
d330fd93 505 const char *default_cpu;
5248c961 506{
c4d38ccb 507 size_t i, j;
8e3f41e7 508 struct rs6000_cpu_select *ptr;
5248c961 509
85638c0d
RK
510 /* Simplify the entries below by making a mask for any POWER
511 variant and any PowerPC variant. */
512
938937d8 513#define POWER_MASKS (MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING)
68c49ffa
RK
514#define POWERPC_MASKS (MASK_POWERPC | MASK_PPC_GPOPT \
515 | MASK_PPC_GFXOPT | MASK_POWERPC64)
516#define POWERPC_OPT_MASKS (MASK_PPC_GPOPT | MASK_PPC_GFXOPT)
85638c0d 517
5248c961
RK
518 static struct ptt
519 {
8b60264b
KG
520 const char *const name; /* Canonical processor name. */
521 const enum processor_type processor; /* Processor type enum value. */
522 const int target_enable; /* Target flags to enable. */
523 const int target_disable; /* Target flags to disable. */
524 } const processor_target_table[]
cf27b467
MM
525 = {{"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS,
526 POWER_MASKS | POWERPC_MASKS},
db7f1e43 527 {"power", PROCESSOR_POWER,
938937d8 528 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43 529 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
8e3f41e7
MM
530 {"power2", PROCESSOR_POWER,
531 MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
532 POWERPC_MASKS | MASK_NEW_MNEMONICS},
c71791e0
DE
533 {"power3", PROCESSOR_PPC630,
534 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
d7b53ca4 535 POWER_MASKS},
309323c2 536 {"power4", PROCESSOR_POWER4,
7f3d8013 537 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
a12f8290 538 POWER_MASKS},
db7f1e43
RK
539 {"powerpc", PROCESSOR_POWERPC,
540 MASK_POWERPC | MASK_NEW_MNEMONICS,
68c49ffa 541 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
3cb999d8
DE
542 {"powerpc64", PROCESSOR_POWERPC64,
543 MASK_POWERPC | MASK_POWERPC64 | MASK_NEW_MNEMONICS,
544 POWER_MASKS | POWERPC_OPT_MASKS},
db7f1e43 545 {"rios", PROCESSOR_RIOS1,
938937d8 546 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
547 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
548 {"rios1", PROCESSOR_RIOS1,
938937d8 549 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
550 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
551 {"rsc", PROCESSOR_PPC601,
938937d8 552 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
553 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
554 {"rsc1", PROCESSOR_PPC601,
938937d8 555 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
556 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
557 {"rios2", PROCESSOR_RIOS2,
938937d8 558 MASK_POWER | MASK_MULTIPLE | MASK_STRING | MASK_POWER2,
db7f1e43 559 POWERPC_MASKS | MASK_NEW_MNEMONICS},
3cb999d8
DE
560 {"rs64a", PROCESSOR_RS64A,
561 MASK_POWERPC | MASK_NEW_MNEMONICS,
562 POWER_MASKS | POWERPC_OPT_MASKS},
a3a1dbf6
MM
563 {"401", PROCESSOR_PPC403,
564 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
565 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
49a0b204 566 {"403", PROCESSOR_PPC403,
daf11973 567 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS | MASK_STRICT_ALIGN,
49a0b204 568 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
d7a5e253
DE
569 {"405", PROCESSOR_PPC405,
570 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
571 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
02ca7595
DE
572 {"405fp", PROCESSOR_PPC405,
573 MASK_POWERPC | MASK_NEW_MNEMONICS,
574 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
575 {"440", PROCESSOR_PPC440,
576 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
577 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
578 {"440fp", PROCESSOR_PPC440,
4977bab6
ZW
579 MASK_POWERPC | MASK_NEW_MNEMONICS,
580 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
cf27b467
MM
581 {"505", PROCESSOR_MPCCORE,
582 MASK_POWERPC | MASK_NEW_MNEMONICS,
583 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
5248c961 584 {"601", PROCESSOR_PPC601,
938937d8 585 MASK_POWER | MASK_POWERPC | MASK_NEW_MNEMONICS | MASK_MULTIPLE | MASK_STRING,
68c49ffa 586 MASK_POWER2 | POWERPC_OPT_MASKS | MASK_POWERPC64},
1ec26da6 587 {"602", PROCESSOR_PPC603,
cf27b467
MM
588 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
589 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
5248c961 590 {"603", PROCESSOR_PPC603,
68c49ffa
RK
591 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
592 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
b6c9286a
MM
593 {"603e", PROCESSOR_PPC603,
594 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
595 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
b5370a88 596 {"ec603e", PROCESSOR_PPC603,
a3a1dbf6
MM
597 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
598 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
5248c961 599 {"604", PROCESSOR_PPC604,
b6c9286a
MM
600 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
601 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
cac8ce95 602 {"604e", PROCESSOR_PPC604e,
07e6159a
MM
603 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
604 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
b6c9286a 605 {"620", PROCESSOR_PPC620,
68c49ffa 606 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
d7b53ca4 607 POWER_MASKS},
3cb999d8
DE
608 {"630", PROCESSOR_PPC630,
609 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
d7b53ca4 610 POWER_MASKS},
bef84347
VM
611 {"740", PROCESSOR_PPC750,
612 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
613 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
614 {"750", PROCESSOR_PPC750,
615 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
616 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
a4f6c312
SS
617 {"7400", PROCESSOR_PPC7400,
618 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
619 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
620 {"7450", PROCESSOR_PPC7450,
621 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
622 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
a3170dc6
AH
623 {"8540", PROCESSOR_PPC8540,
624 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
625 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
07e6159a
MM
626 {"801", PROCESSOR_MPCCORE,
627 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
628 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
cf27b467
MM
629 {"821", PROCESSOR_MPCCORE,
630 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
631 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
07e6159a
MM
632 {"823", PROCESSOR_MPCCORE,
633 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
634 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
cf27b467
MM
635 {"860", PROCESSOR_MPCCORE,
636 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
7177e720
DE
637 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
638 {"970", PROCESSOR_POWER4,
639 MASK_POWERPC | POWERPC_OPT_MASKS | MASK_NEW_MNEMONICS,
640 POWER_MASKS}};
5248c961 641
ca7558fc 642 const size_t ptt_size = ARRAY_SIZE (processor_target_table);
5248c961 643
a4f6c312
SS
644 /* Save current -mmultiple/-mno-multiple status. */
645 int multiple = TARGET_MULTIPLE;
646 /* Save current -mstring/-mno-string status. */
647 int string = TARGET_STRING;
8a61d227 648
a4f6c312 649 /* Identify the processor type. */
8e3f41e7 650 rs6000_select[0].string = default_cpu;
3cb999d8 651 rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
8e3f41e7 652
b6a1cbae 653 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
5248c961 654 {
8e3f41e7
MM
655 ptr = &rs6000_select[i];
656 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
5248c961 657 {
8e3f41e7
MM
658 for (j = 0; j < ptt_size; j++)
659 if (! strcmp (ptr->string, processor_target_table[j].name))
660 {
661 if (ptr->set_tune_p)
662 rs6000_cpu = processor_target_table[j].processor;
663
664 if (ptr->set_arch_p)
665 {
666 target_flags |= processor_target_table[j].target_enable;
667 target_flags &= ~processor_target_table[j].target_disable;
668 }
669 break;
670 }
671
4406229e 672 if (j == ptt_size)
8e3f41e7 673 error ("bad value (%s) for %s switch", ptr->string, ptr->name);
5248c961
RK
674 }
675 }
8a61d227 676
993f19a8 677 if (TARGET_E500)
a3170dc6
AH
678 rs6000_isel = 1;
679
dff9f1b6
DE
680 /* If we are optimizing big endian systems for space, use the load/store
681 multiple and string instructions. */
ef792183 682 if (BYTES_BIG_ENDIAN && optimize_size)
dff9f1b6 683 target_flags |= MASK_MULTIPLE | MASK_STRING;
ef792183 684
8a61d227
MM
685 /* If -mmultiple or -mno-multiple was explicitly used, don't
686 override with the processor default */
b21fb038 687 if ((target_flags_explicit & MASK_MULTIPLE) != 0)
8a61d227 688 target_flags = (target_flags & ~MASK_MULTIPLE) | multiple;
7e69e155 689
a4f6c312
SS
690 /* If -mstring or -mno-string was explicitly used, don't override
691 with the processor default. */
b21fb038 692 if ((target_flags_explicit & MASK_STRING) != 0)
1f5515bf 693 target_flags = (target_flags & ~MASK_STRING) | string;
938937d8 694
a4f6c312
SS
695 /* Don't allow -mmultiple or -mstring on little endian systems
696 unless the cpu is a 750, because the hardware doesn't support the
697 instructions used in little endian mode, and causes an alignment
698 trap. The 750 does not cause an alignment trap (except when the
699 target is unaligned). */
bef84347 700
b21fb038 701 if (!BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
7e69e155
MM
702 {
703 if (TARGET_MULTIPLE)
704 {
705 target_flags &= ~MASK_MULTIPLE;
b21fb038 706 if ((target_flags_explicit & MASK_MULTIPLE) != 0)
7e69e155
MM
707 warning ("-mmultiple is not supported on little endian systems");
708 }
709
710 if (TARGET_STRING)
711 {
712 target_flags &= ~MASK_STRING;
b21fb038 713 if ((target_flags_explicit & MASK_STRING) != 0)
938937d8 714 warning ("-mstring is not supported on little endian systems");
7e69e155
MM
715 }
716 }
3933e0e1 717
38c1f2d7
MM
718 /* Set debug flags */
719 if (rs6000_debug_name)
720 {
bfc79d3b 721 if (! strcmp (rs6000_debug_name, "all"))
38c1f2d7 722 rs6000_debug_stack = rs6000_debug_arg = 1;
bfc79d3b 723 else if (! strcmp (rs6000_debug_name, "stack"))
38c1f2d7 724 rs6000_debug_stack = 1;
bfc79d3b 725 else if (! strcmp (rs6000_debug_name, "arg"))
38c1f2d7
MM
726 rs6000_debug_arg = 1;
727 else
c725bd79 728 error ("unknown -mdebug-%s switch", rs6000_debug_name);
38c1f2d7
MM
729 }
730
57ac7be9
AM
731 if (rs6000_traceback_name)
732 {
733 if (! strncmp (rs6000_traceback_name, "full", 4))
734 rs6000_traceback = traceback_full;
735 else if (! strncmp (rs6000_traceback_name, "part", 4))
736 rs6000_traceback = traceback_part;
737 else if (! strncmp (rs6000_traceback_name, "no", 2))
738 rs6000_traceback = traceback_none;
739 else
740 error ("unknown -mtraceback arg `%s'; expecting `full', `partial' or `none'",
741 rs6000_traceback_name);
742 }
743
6fa3f289
ZW
744 /* Set size of long double */
745 rs6000_long_double_type_size = 64;
746 if (rs6000_long_double_size_string)
747 {
748 char *tail;
749 int size = strtol (rs6000_long_double_size_string, &tail, 10);
750 if (*tail != '\0' || (size != 64 && size != 128))
751 error ("Unknown switch -mlong-double-%s",
752 rs6000_long_double_size_string);
753 else
754 rs6000_long_double_type_size = size;
755 }
756
0ac081f6
AH
757 /* Handle -mabi= options. */
758 rs6000_parse_abi_options ();
759
025d9908
KH
760 /* Handle -malign-XXXXX option. */
761 rs6000_parse_alignment_option ();
762
5da702b1
AH
763 /* Handle generic -mFOO=YES/NO options. */
764 rs6000_parse_yes_no_option ("vrsave", rs6000_altivec_vrsave_string,
765 &rs6000_altivec_vrsave);
766 rs6000_parse_yes_no_option ("isel", rs6000_isel_string,
767 &rs6000_isel);
768 rs6000_parse_yes_no_option ("spe", rs6000_spe_string, &rs6000_spe);
769 rs6000_parse_yes_no_option ("float-gprs", rs6000_float_gprs_string,
770 &rs6000_float_gprs);
993f19a8 771
c4501e62
JJ
772 /* Handle -mtls-size option. */
773 rs6000_parse_tls_size_option ();
774
a7ae18e2
AH
775#ifdef SUBTARGET_OVERRIDE_OPTIONS
776 SUBTARGET_OVERRIDE_OPTIONS;
777#endif
778#ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
779 SUBSUBTARGET_OVERRIDE_OPTIONS;
780#endif
781
5da702b1
AH
782 if (TARGET_E500)
783 {
784 /* The e500 does not have string instructions, and we set
785 MASK_STRING above when optimizing for size. */
786 if ((target_flags & MASK_STRING) != 0)
787 target_flags = target_flags & ~MASK_STRING;
b6e59a3a
AH
788
789 /* No SPE means 64-bit long doubles, even if an E500. */
790 if (rs6000_spe_string != 0
791 && !strcmp (rs6000_spe_string, "no"))
792 rs6000_long_double_type_size = 64;
5da702b1
AH
793 }
794 else if (rs6000_select[1].string != NULL)
795 {
796 /* For the powerpc-eabispe configuration, we set all these by
797 default, so let's unset them if we manually set another
798 CPU that is not the E500. */
799 if (rs6000_abi_string == 0)
800 rs6000_spe_abi = 0;
801 if (rs6000_spe_string == 0)
802 rs6000_spe = 0;
803 if (rs6000_float_gprs_string == 0)
804 rs6000_float_gprs = 0;
805 if (rs6000_isel_string == 0)
806 rs6000_isel = 0;
b6e59a3a
AH
807 if (rs6000_long_double_size_string == 0)
808 rs6000_long_double_type_size = 64;
5da702b1 809 }
b5044283 810
a5c76ee6
ZW
811 /* Handle -m(no-)longcall option. This is a bit of a cheap hack,
812 using TARGET_OPTIONS to handle a toggle switch, but we're out of
813 bits in target_flags so TARGET_SWITCHES cannot be used.
814 Assumption here is that rs6000_longcall_switch points into the
815 text of the complete option, rather than being a copy, so we can
816 scan back for the presence or absence of the no- modifier. */
817 if (rs6000_longcall_switch)
818 {
819 const char *base = rs6000_longcall_switch;
820 while (base[-1] != 'm') base--;
821
822 if (*rs6000_longcall_switch != '\0')
823 error ("invalid option `%s'", base);
824 rs6000_default_long_calls = (base[0] != 'n');
825 }
826
c81bebd7 827#ifdef TARGET_REGNAMES
a4f6c312
SS
828 /* If the user desires alternate register names, copy in the
829 alternate names now. */
c81bebd7 830 if (TARGET_REGNAMES)
4e135bdd 831 memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
c81bebd7
MM
832#endif
833
6fa3f289
ZW
834 /* Set TARGET_AIX_STRUCT_RET last, after the ABI is determined.
835 If -maix-struct-return or -msvr4-struct-return was explicitly
836 used, don't override with the ABI default. */
b21fb038 837 if ((target_flags_explicit & MASK_AIX_STRUCT_RET) == 0)
6fa3f289
ZW
838 {
839 if (DEFAULT_ABI == ABI_V4 && !DRAFT_V4_STRUCT_RET)
840 target_flags = (target_flags & ~MASK_AIX_STRUCT_RET);
841 else
842 target_flags |= MASK_AIX_STRUCT_RET;
843 }
844
fcce224d
DE
845 if (TARGET_LONG_DOUBLE_128
846 && (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN))
847 real_format_for_mode[TFmode - QFmode] = &ibm_extended_format;
848
9ebbca7d
GK
849 /* Allocate an alias set for register saves & restores from stack. */
850 rs6000_sr_alias_set = new_alias_set ();
851
852 if (TARGET_TOC)
853 ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
71f123ca 854
301d03af
RS
855 /* We can only guarantee the availability of DI pseudo-ops when
856 assembling for 64-bit targets. */
ae6c1efd 857 if (!TARGET_64BIT)
301d03af
RS
858 {
859 targetm.asm_out.aligned_op.di = NULL;
860 targetm.asm_out.unaligned_op.di = NULL;
861 }
862
2792d578
DE
863 /* Set maximum branch target alignment at two instructions, eight bytes. */
864 align_jumps_max_skip = 8;
865 align_loops_max_skip = 8;
866
71f123ca
FS
867 /* Arrange to save and restore machine status around nested functions. */
868 init_machine_status = rs6000_init_machine_status;
5248c961 869}
5accd822 870
5da702b1
AH
871/* Handle generic options of the form -mfoo=yes/no.
872 NAME is the option name.
873 VALUE is the option value.
874 FLAG is the pointer to the flag where to store a 1 or 0, depending on
875 whether the option value is 'yes' or 'no' respectively. */
993f19a8 876static void
5da702b1 877rs6000_parse_yes_no_option (const char *name, const char *value, int *flag)
993f19a8 878{
5da702b1 879 if (value == 0)
993f19a8 880 return;
5da702b1
AH
881 else if (!strcmp (value, "yes"))
882 *flag = 1;
883 else if (!strcmp (value, "no"))
884 *flag = 0;
08b57fb3 885 else
5da702b1 886 error ("unknown -m%s= option specified: '%s'", name, value);
08b57fb3
AH
887}
888
0ac081f6 889/* Handle -mabi= options. */
00b960c7
AH
890static void
891rs6000_parse_abi_options ()
0ac081f6
AH
892{
893 if (rs6000_abi_string == 0)
894 return;
895 else if (! strcmp (rs6000_abi_string, "altivec"))
6fa3f289 896 rs6000_altivec_abi = 1;
76a773f3
AH
897 else if (! strcmp (rs6000_abi_string, "no-altivec"))
898 rs6000_altivec_abi = 0;
a3170dc6 899 else if (! strcmp (rs6000_abi_string, "spe"))
01f4962d
NS
900 {
901 rs6000_spe_abi = 1;
902 if (!TARGET_SPE_ABI)
903 error ("not configured for ABI: '%s'", rs6000_abi_string);
904 }
905
a3170dc6
AH
906 else if (! strcmp (rs6000_abi_string, "no-spe"))
907 rs6000_spe_abi = 0;
0ac081f6 908 else
c725bd79 909 error ("unknown ABI specified: '%s'", rs6000_abi_string);
0ac081f6
AH
910}
911
025d9908
KH
912/* Handle -malign-XXXXXX options. */
913static void
914rs6000_parse_alignment_option ()
915{
916 if (rs6000_alignment_string == 0
917 || ! strcmp (rs6000_alignment_string, "power"))
918 rs6000_alignment_flags = MASK_ALIGN_POWER;
919 else if (! strcmp (rs6000_alignment_string, "natural"))
920 rs6000_alignment_flags = MASK_ALIGN_NATURAL;
921 else
922 error ("unknown -malign-XXXXX option specified: '%s'",
923 rs6000_alignment_string);
924}
925
c4501e62
JJ
926/* Validate and record the size specified with the -mtls-size option. */
927
928static void
929rs6000_parse_tls_size_option ()
930{
931 if (rs6000_tls_size_string == 0)
932 return;
933 else if (strcmp (rs6000_tls_size_string, "16") == 0)
934 rs6000_tls_size = 16;
935 else if (strcmp (rs6000_tls_size_string, "32") == 0)
936 rs6000_tls_size = 32;
937 else if (strcmp (rs6000_tls_size_string, "64") == 0)
938 rs6000_tls_size = 64;
939 else
940 error ("bad value `%s' for -mtls-size switch", rs6000_tls_size_string);
941}
942
5accd822
DE
943void
944optimization_options (level, size)
e2c953b6 945 int level ATTRIBUTE_UNUSED;
5accd822
DE
946 int size ATTRIBUTE_UNUSED;
947{
5accd822 948}
3cfa4909
MM
949\f
950/* Do anything needed at the start of the asm file. */
951
1bc7c5b6
ZW
952static void
953rs6000_file_start ()
3cfa4909 954{
c4d38ccb 955 size_t i;
3cfa4909 956 char buffer[80];
d330fd93 957 const char *start = buffer;
3cfa4909 958 struct rs6000_cpu_select *ptr;
1bc7c5b6
ZW
959 const char *default_cpu = TARGET_CPU_DEFAULT;
960 FILE *file = asm_out_file;
961
962 default_file_start ();
963
964#ifdef TARGET_BI_ARCH
965 if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
966 default_cpu = 0;
967#endif
3cfa4909
MM
968
969 if (flag_verbose_asm)
970 {
971 sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
972 rs6000_select[0].string = default_cpu;
973
b6a1cbae 974 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
3cfa4909
MM
975 {
976 ptr = &rs6000_select[i];
977 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
978 {
979 fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
980 start = "";
981 }
982 }
983
b91da81f 984#ifdef USING_ELFOS_H
3cfa4909
MM
985 switch (rs6000_sdata)
986 {
987 case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
988 case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
989 case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
990 case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
991 }
992
993 if (rs6000_sdata && g_switch_value)
994 {
307b599c
MK
995 fprintf (file, "%s -G " HOST_WIDE_INT_PRINT_UNSIGNED, start,
996 g_switch_value);
3cfa4909
MM
997 start = "";
998 }
999#endif
1000
1001 if (*start == '\0')
949ea356 1002 putc ('\n', file);
3cfa4909
MM
1003 }
1004}
5248c961 1005\f
a0ab749a 1006/* Return nonzero if this function is known to have a null epilogue. */
9878760c
RK
1007
1008int
1009direct_return ()
1010{
4697a36c
MM
1011 if (reload_completed)
1012 {
1013 rs6000_stack_t *info = rs6000_stack_info ();
1014
1015 if (info->first_gp_reg_save == 32
1016 && info->first_fp_reg_save == 64
00b960c7 1017 && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1
c81fc13e
DE
1018 && ! info->lr_save_p
1019 && ! info->cr_save_p
00b960c7 1020 && info->vrsave_mask == 0
c81fc13e 1021 && ! info->push_p)
4697a36c
MM
1022 return 1;
1023 }
1024
1025 return 0;
9878760c
RK
1026}
1027
1028/* Returns 1 always. */
1029
1030int
1031any_operand (op, mode)
592696dd 1032 rtx op ATTRIBUTE_UNUSED;
296b8152 1033 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
1034{
1035 return 1;
1036}
1037
a4f6c312 1038/* Returns 1 if op is the count register. */
38c1f2d7 1039int
a4f6c312 1040count_register_operand (op, mode)
592696dd 1041 rtx op;
296b8152 1042 enum machine_mode mode ATTRIBUTE_UNUSED;
b6c9286a
MM
1043{
1044 if (GET_CODE (op) != REG)
1045 return 0;
1046
1047 if (REGNO (op) == COUNT_REGISTER_REGNUM)
1048 return 1;
1049
1050 if (REGNO (op) > FIRST_PSEUDO_REGISTER)
1051 return 1;
1052
1053 return 0;
1054}
1055
0ec4e2a8
AH
1056/* Returns 1 if op is an altivec register. */
1057int
1058altivec_register_operand (op, mode)
1059 rtx op;
1060 enum machine_mode mode ATTRIBUTE_UNUSED;
1061{
1062
1063 return (register_operand (op, mode)
1064 && (GET_CODE (op) != REG
1065 || REGNO (op) > FIRST_PSEUDO_REGISTER
1066 || ALTIVEC_REGNO_P (REGNO (op))));
1067}
1068
38c1f2d7 1069int
a4f6c312 1070xer_operand (op, mode)
592696dd 1071 rtx op;
296b8152 1072 enum machine_mode mode ATTRIBUTE_UNUSED;
802a0058
MM
1073{
1074 if (GET_CODE (op) != REG)
1075 return 0;
1076
9ebbca7d 1077 if (XER_REGNO_P (REGNO (op)))
802a0058
MM
1078 return 1;
1079
802a0058
MM
1080 return 0;
1081}
1082
c859cda6 1083/* Return 1 if OP is a signed 8-bit constant. Int multiplication
6f317ef3 1084 by such constants completes more quickly. */
c859cda6
DJ
1085
1086int
1087s8bit_cint_operand (op, mode)
1088 rtx op;
1089 enum machine_mode mode ATTRIBUTE_UNUSED;
1090{
1091 return ( GET_CODE (op) == CONST_INT
1092 && (INTVAL (op) >= -128 && INTVAL (op) <= 127));
1093}
1094
9878760c
RK
1095/* Return 1 if OP is a constant that can fit in a D field. */
1096
1097int
1098short_cint_operand (op, mode)
592696dd 1099 rtx op;
296b8152 1100 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c 1101{
5f59ecb7
DE
1102 return (GET_CODE (op) == CONST_INT
1103 && CONST_OK_FOR_LETTER_P (INTVAL (op), 'I'));
9878760c
RK
1104}
1105
5519a4f9 1106/* Similar for an unsigned D field. */
9878760c
RK
1107
1108int
1109u_short_cint_operand (op, mode)
592696dd 1110 rtx op;
296b8152 1111 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c 1112{
19684119 1113 return (GET_CODE (op) == CONST_INT
c1f11548 1114 && CONST_OK_FOR_LETTER_P (INTVAL (op) & GET_MODE_MASK (mode), 'K'));
9878760c
RK
1115}
1116
dcfedcd0
RK
1117/* Return 1 if OP is a CONST_INT that cannot fit in a signed D field. */
1118
1119int
1120non_short_cint_operand (op, mode)
592696dd 1121 rtx op;
296b8152 1122 enum machine_mode mode ATTRIBUTE_UNUSED;
dcfedcd0
RK
1123{
1124 return (GET_CODE (op) == CONST_INT
a7653a2c 1125 && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x8000) >= 0x10000);
dcfedcd0
RK
1126}
1127
2bfcf297
DB
1128/* Returns 1 if OP is a CONST_INT that is a positive value
1129 and an exact power of 2. */
1130
1131int
1132exact_log2_cint_operand (op, mode)
592696dd 1133 rtx op;
2bfcf297
DB
1134 enum machine_mode mode ATTRIBUTE_UNUSED;
1135{
1136 return (GET_CODE (op) == CONST_INT
1137 && INTVAL (op) > 0
1138 && exact_log2 (INTVAL (op)) >= 0);
1139}
1140
9878760c
RK
1141/* Returns 1 if OP is a register that is not special (i.e., not MQ,
1142 ctr, or lr). */
1143
1144int
cd2b37d9 1145gpc_reg_operand (op, mode)
592696dd 1146 rtx op;
9878760c
RK
1147 enum machine_mode mode;
1148{
1149 return (register_operand (op, mode)
802a0058 1150 && (GET_CODE (op) != REG
9ebbca7d
GK
1151 || (REGNO (op) >= ARG_POINTER_REGNUM
1152 && !XER_REGNO_P (REGNO (op)))
1153 || REGNO (op) < MQ_REGNO));
9878760c
RK
1154}
1155
1156/* Returns 1 if OP is either a pseudo-register or a register denoting a
1157 CR field. */
1158
1159int
1160cc_reg_operand (op, mode)
592696dd 1161 rtx op;
9878760c
RK
1162 enum machine_mode mode;
1163{
1164 return (register_operand (op, mode)
1165 && (GET_CODE (op) != REG
1166 || REGNO (op) >= FIRST_PSEUDO_REGISTER
1167 || CR_REGNO_P (REGNO (op))));
1168}
1169
815cdc52
MM
1170/* Returns 1 if OP is either a pseudo-register or a register denoting a
1171 CR field that isn't CR0. */
1172
1173int
1174cc_reg_not_cr0_operand (op, mode)
592696dd 1175 rtx op;
815cdc52
MM
1176 enum machine_mode mode;
1177{
1178 return (register_operand (op, mode)
1179 && (GET_CODE (op) != REG
1180 || REGNO (op) >= FIRST_PSEUDO_REGISTER
1181 || CR_REGNO_NOT_CR0_P (REGNO (op))));
1182}
1183
a4f6c312
SS
1184/* Returns 1 if OP is either a constant integer valid for a D-field or
1185 a non-special register. If a register, it must be in the proper
1186 mode unless MODE is VOIDmode. */
9878760c
RK
1187
1188int
1189reg_or_short_operand (op, mode)
592696dd 1190 rtx op;
9878760c
RK
1191 enum machine_mode mode;
1192{
f5a28898 1193 return short_cint_operand (op, mode) || gpc_reg_operand (op, mode);
9878760c
RK
1194}
1195
a4f6c312
SS
1196/* Similar, except check if the negation of the constant would be
1197 valid for a D-field. */
9878760c
RK
1198
1199int
1200reg_or_neg_short_operand (op, mode)
592696dd 1201 rtx op;
9878760c
RK
1202 enum machine_mode mode;
1203{
1204 if (GET_CODE (op) == CONST_INT)
1205 return CONST_OK_FOR_LETTER_P (INTVAL (op), 'P');
1206
cd2b37d9 1207 return gpc_reg_operand (op, mode);
9878760c
RK
1208}
1209
768070a0
TR
1210/* Returns 1 if OP is either a constant integer valid for a DS-field or
1211 a non-special register. If a register, it must be in the proper
1212 mode unless MODE is VOIDmode. */
1213
1214int
1215reg_or_aligned_short_operand (op, mode)
1216 rtx op;
1217 enum machine_mode mode;
1218{
1219 if (gpc_reg_operand (op, mode))
1220 return 1;
1221 else if (short_cint_operand (op, mode) && !(INTVAL (op) & 3))
1222 return 1;
1223
1224 return 0;
1225}
1226
1227
a4f6c312
SS
1228/* Return 1 if the operand is either a register or an integer whose
1229 high-order 16 bits are zero. */
9878760c
RK
1230
1231int
1232reg_or_u_short_operand (op, mode)
592696dd 1233 rtx op;
9878760c
RK
1234 enum machine_mode mode;
1235{
e675f625 1236 return u_short_cint_operand (op, mode) || gpc_reg_operand (op, mode);
9878760c
RK
1237}
1238
1239/* Return 1 is the operand is either a non-special register or ANY
1240 constant integer. */
1241
1242int
1243reg_or_cint_operand (op, mode)
592696dd 1244 rtx op;
9878760c
RK
1245 enum machine_mode mode;
1246{
a4f6c312 1247 return (GET_CODE (op) == CONST_INT || gpc_reg_operand (op, mode));
f6bf7de2
DE
1248}
1249
1250/* Return 1 is the operand is either a non-special register or ANY
1251 32-bit signed constant integer. */
1252
1253int
1254reg_or_arith_cint_operand (op, mode)
592696dd 1255 rtx op;
f6bf7de2
DE
1256 enum machine_mode mode;
1257{
a4f6c312
SS
1258 return (gpc_reg_operand (op, mode)
1259 || (GET_CODE (op) == CONST_INT
f6bf7de2 1260#if HOST_BITS_PER_WIDE_INT != 32
a4f6c312
SS
1261 && ((unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80000000)
1262 < (unsigned HOST_WIDE_INT) 0x100000000ll)
f6bf7de2 1263#endif
a4f6c312 1264 ));
9878760c
RK
1265}
1266
2bfcf297
DB
1267/* Return 1 is the operand is either a non-special register or a 32-bit
1268 signed constant integer valid for 64-bit addition. */
1269
1270int
1271reg_or_add_cint64_operand (op, mode)
592696dd 1272 rtx op;
2bfcf297
DB
1273 enum machine_mode mode;
1274{
a4f6c312
SS
1275 return (gpc_reg_operand (op, mode)
1276 || (GET_CODE (op) == CONST_INT
a65c591c 1277#if HOST_BITS_PER_WIDE_INT == 32
a4f6c312 1278 && INTVAL (op) < 0x7fff8000
a65c591c 1279#else
a4f6c312
SS
1280 && ((unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80008000)
1281 < 0x100000000ll)
2bfcf297 1282#endif
a4f6c312 1283 ));
2bfcf297
DB
1284}
1285
1286/* Return 1 is the operand is either a non-special register or a 32-bit
1287 signed constant integer valid for 64-bit subtraction. */
1288
1289int
1290reg_or_sub_cint64_operand (op, mode)
592696dd 1291 rtx op;
2bfcf297
DB
1292 enum machine_mode mode;
1293{
a4f6c312
SS
1294 return (gpc_reg_operand (op, mode)
1295 || (GET_CODE (op) == CONST_INT
a65c591c 1296#if HOST_BITS_PER_WIDE_INT == 32
a4f6c312 1297 && (- INTVAL (op)) < 0x7fff8000
a65c591c 1298#else
a4f6c312
SS
1299 && ((unsigned HOST_WIDE_INT) ((- INTVAL (op)) + 0x80008000)
1300 < 0x100000000ll)
2bfcf297 1301#endif
a4f6c312 1302 ));
2bfcf297
DB
1303}
1304
9ebbca7d
GK
1305/* Return 1 is the operand is either a non-special register or ANY
1306 32-bit unsigned constant integer. */
1307
1308int
1d328b19 1309reg_or_logical_cint_operand (op, mode)
592696dd 1310 rtx op;
9ebbca7d
GK
1311 enum machine_mode mode;
1312{
1d328b19
GK
1313 if (GET_CODE (op) == CONST_INT)
1314 {
1315 if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
1316 {
1317 if (GET_MODE_BITSIZE (mode) <= 32)
a4f6c312 1318 abort ();
1d328b19
GK
1319
1320 if (INTVAL (op) < 0)
1321 return 0;
1322 }
1323
1324 return ((INTVAL (op) & GET_MODE_MASK (mode)
0858c623 1325 & (~ (unsigned HOST_WIDE_INT) 0xffffffff)) == 0);
1d328b19
GK
1326 }
1327 else if (GET_CODE (op) == CONST_DOUBLE)
1328 {
1329 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
1330 || mode != DImode)
a4f6c312 1331 abort ();
1d328b19
GK
1332
1333 return CONST_DOUBLE_HIGH (op) == 0;
1334 }
1335 else
1336 return gpc_reg_operand (op, mode);
9ebbca7d
GK
1337}
1338
51d3e7d6 1339/* Return 1 if the operand is an operand that can be loaded via the GOT. */
766a866c
MM
1340
1341int
1342got_operand (op, mode)
592696dd 1343 rtx op;
296b8152 1344 enum machine_mode mode ATTRIBUTE_UNUSED;
766a866c
MM
1345{
1346 return (GET_CODE (op) == SYMBOL_REF
1347 || GET_CODE (op) == CONST
1348 || GET_CODE (op) == LABEL_REF);
1349}
1350
38c1f2d7
MM
1351/* Return 1 if the operand is a simple references that can be loaded via
1352 the GOT (labels involving addition aren't allowed). */
1353
1354int
1355got_no_const_operand (op, mode)
592696dd 1356 rtx op;
296b8152 1357 enum machine_mode mode ATTRIBUTE_UNUSED;
38c1f2d7
MM
1358{
1359 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF);
1360}
1361
4e74d8ec
MM
1362/* Return the number of instructions it takes to form a constant in an
1363 integer register. */
1364
1365static int
1366num_insns_constant_wide (value)
1367 HOST_WIDE_INT value;
1368{
1369 /* signed constant loadable with {cal|addi} */
5f59ecb7 1370 if (CONST_OK_FOR_LETTER_P (value, 'I'))
0865c631
GK
1371 return 1;
1372
4e74d8ec 1373 /* constant loadable with {cau|addis} */
5f59ecb7 1374 else if (CONST_OK_FOR_LETTER_P (value, 'L'))
4e74d8ec
MM
1375 return 1;
1376
5f59ecb7 1377#if HOST_BITS_PER_WIDE_INT == 64
c81fc13e 1378 else if (TARGET_POWERPC64)
4e74d8ec 1379 {
a65c591c
DE
1380 HOST_WIDE_INT low = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
1381 HOST_WIDE_INT high = value >> 31;
4e74d8ec 1382
a65c591c 1383 if (high == 0 || high == -1)
4e74d8ec
MM
1384 return 2;
1385
a65c591c 1386 high >>= 1;
4e74d8ec 1387
a65c591c 1388 if (low == 0)
4e74d8ec 1389 return num_insns_constant_wide (high) + 1;
4e74d8ec
MM
1390 else
1391 return (num_insns_constant_wide (high)
e396202a 1392 + num_insns_constant_wide (low) + 1);
4e74d8ec
MM
1393 }
1394#endif
1395
1396 else
1397 return 2;
1398}
1399
1400int
1401num_insns_constant (op, mode)
1402 rtx op;
1403 enum machine_mode mode;
1404{
4e74d8ec 1405 if (GET_CODE (op) == CONST_INT)
0d30d435
DE
1406 {
1407#if HOST_BITS_PER_WIDE_INT == 64
4e2c1c44
DE
1408 if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
1409 && mask64_operand (op, mode))
0d30d435
DE
1410 return 2;
1411 else
1412#endif
1413 return num_insns_constant_wide (INTVAL (op));
1414 }
4e74d8ec 1415
6fc48950
MM
1416 else if (GET_CODE (op) == CONST_DOUBLE && mode == SFmode)
1417 {
1418 long l;
1419 REAL_VALUE_TYPE rv;
1420
1421 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1422 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
e72247f4 1423 return num_insns_constant_wide ((HOST_WIDE_INT) l);
6fc48950
MM
1424 }
1425
47ad8c61 1426 else if (GET_CODE (op) == CONST_DOUBLE)
4e74d8ec 1427 {
47ad8c61
MM
1428 HOST_WIDE_INT low;
1429 HOST_WIDE_INT high;
1430 long l[2];
1431 REAL_VALUE_TYPE rv;
1432 int endian = (WORDS_BIG_ENDIAN == 0);
4e74d8ec 1433
47ad8c61
MM
1434 if (mode == VOIDmode || mode == DImode)
1435 {
1436 high = CONST_DOUBLE_HIGH (op);
1437 low = CONST_DOUBLE_LOW (op);
1438 }
1439 else
1440 {
1441 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1442 REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
1443 high = l[endian];
1444 low = l[1 - endian];
1445 }
4e74d8ec 1446
47ad8c61
MM
1447 if (TARGET_32BIT)
1448 return (num_insns_constant_wide (low)
1449 + num_insns_constant_wide (high));
4e74d8ec
MM
1450
1451 else
47ad8c61 1452 {
e72247f4 1453 if (high == 0 && low >= 0)
47ad8c61
MM
1454 return num_insns_constant_wide (low);
1455
e72247f4 1456 else if (high == -1 && low < 0)
47ad8c61
MM
1457 return num_insns_constant_wide (low);
1458
a260abc9
DE
1459 else if (mask64_operand (op, mode))
1460 return 2;
1461
47ad8c61
MM
1462 else if (low == 0)
1463 return num_insns_constant_wide (high) + 1;
1464
1465 else
1466 return (num_insns_constant_wide (high)
1467 + num_insns_constant_wide (low) + 1);
1468 }
4e74d8ec
MM
1469 }
1470
1471 else
1472 abort ();
1473}
1474
a4f6c312
SS
1475/* Return 1 if the operand is a CONST_DOUBLE and it can be put into a
1476 register with one instruction per word. We only do this if we can
1477 safely read CONST_DOUBLE_{LOW,HIGH}. */
9878760c
RK
1478
1479int
1480easy_fp_constant (op, mode)
592696dd
SS
1481 rtx op;
1482 enum machine_mode mode;
9878760c 1483{
9878760c
RK
1484 if (GET_CODE (op) != CONST_DOUBLE
1485 || GET_MODE (op) != mode
4e74d8ec 1486 || (GET_MODE_CLASS (mode) != MODE_FLOAT && mode != DImode))
9878760c
RK
1487 return 0;
1488
a4f6c312 1489 /* Consider all constants with -msoft-float to be easy. */
a3170dc6
AH
1490 if ((TARGET_SOFT_FLOAT || !TARGET_FPRS)
1491 && mode != DImode)
b6c9286a
MM
1492 return 1;
1493
a4f6c312 1494 /* If we are using V.4 style PIC, consider all constants to be hard. */
f607bc57 1495 if (flag_pic && DEFAULT_ABI == ABI_V4)
a7273471
MM
1496 return 0;
1497
5ae4759c 1498#ifdef TARGET_RELOCATABLE
a4f6c312
SS
1499 /* Similarly if we are using -mrelocatable, consider all constants
1500 to be hard. */
5ae4759c
MM
1501 if (TARGET_RELOCATABLE)
1502 return 0;
1503#endif
1504
fcce224d
DE
1505 if (mode == TFmode)
1506 {
1507 long k[4];
1508 REAL_VALUE_TYPE rv;
1509
1510 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1511 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
1512
1513 return (num_insns_constant_wide ((HOST_WIDE_INT) k[0]) == 1
1514 && num_insns_constant_wide ((HOST_WIDE_INT) k[1]) == 1
1515 && num_insns_constant_wide ((HOST_WIDE_INT) k[2]) == 1
1516 && num_insns_constant_wide ((HOST_WIDE_INT) k[3]) == 1);
1517 }
1518
1519 else if (mode == DFmode)
042259f2
DE
1520 {
1521 long k[2];
1522 REAL_VALUE_TYPE rv;
1523
1524 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1525 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
9878760c 1526
a65c591c
DE
1527 return (num_insns_constant_wide ((HOST_WIDE_INT) k[0]) == 1
1528 && num_insns_constant_wide ((HOST_WIDE_INT) k[1]) == 1);
042259f2 1529 }
4e74d8ec
MM
1530
1531 else if (mode == SFmode)
042259f2
DE
1532 {
1533 long l;
1534 REAL_VALUE_TYPE rv;
1535
1536 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1537 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
9878760c 1538
4e74d8ec 1539 return num_insns_constant_wide (l) == 1;
042259f2 1540 }
4e74d8ec 1541
a260abc9 1542 else if (mode == DImode)
c81fc13e 1543 return ((TARGET_POWERPC64
a260abc9
DE
1544 && GET_CODE (op) == CONST_DOUBLE && CONST_DOUBLE_LOW (op) == 0)
1545 || (num_insns_constant (op, DImode) <= 2));
4e74d8ec 1546
a9098fd0
GK
1547 else if (mode == SImode)
1548 return 1;
4e74d8ec
MM
1549 else
1550 abort ();
9878760c 1551}
8f75773e 1552
72ac76be 1553/* Return nonzero if all elements of a vector have the same value. */
69ef87e2
AH
1554
1555static int
d744e06e
AH
1556easy_vector_same (op, mode)
1557 rtx op;
1558 enum machine_mode mode ATTRIBUTE_UNUSED;
1559{
1560 int units, i, cst;
1561
1562 units = CONST_VECTOR_NUNITS (op);
1563
1564 cst = INTVAL (CONST_VECTOR_ELT (op, 0));
1565 for (i = 1; i < units; ++i)
1566 if (INTVAL (CONST_VECTOR_ELT (op, i)) != cst)
1567 break;
1568 if (i == units)
1569 return 1;
1570 return 0;
1571}
1572
1573/* Return 1 if the operand is a CONST_INT and can be put into a
1574 register without using memory. */
1575
1576int
1577easy_vector_constant (op, mode)
69ef87e2 1578 rtx op;
d744e06e 1579 enum machine_mode mode;
69ef87e2 1580{
d744e06e 1581 int cst, cst2;
69ef87e2 1582
d744e06e
AH
1583 if (GET_CODE (op) != CONST_VECTOR
1584 || (!TARGET_ALTIVEC
1585 && !TARGET_SPE))
69ef87e2
AH
1586 return 0;
1587
d744e06e
AH
1588 if (zero_constant (op, mode)
1589 && ((TARGET_ALTIVEC && ALTIVEC_VECTOR_MODE (mode))
1590 || (TARGET_SPE && SPE_VECTOR_MODE (mode))))
1591 return 1;
69ef87e2 1592
d744e06e
AH
1593 if (GET_MODE_CLASS (mode) != MODE_VECTOR_INT)
1594 return 0;
1595
f5119d10
AH
1596 if (TARGET_SPE && mode == V1DImode)
1597 return 0;
1598
d744e06e
AH
1599 cst = INTVAL (CONST_VECTOR_ELT (op, 0));
1600 cst2 = INTVAL (CONST_VECTOR_ELT (op, 1));
1601
1602 /* Limit SPE vectors to 15 bits signed. These we can generate with:
1603 li r0, CONSTANT1
1604 evmergelo r0, r0, r0
1605 li r0, CONSTANT2
1606
1607 I don't know how efficient it would be to allow bigger constants,
1608 considering we'll have an extra 'ori' for every 'li'. I doubt 5
1609 instructions is better than a 64-bit memory load, but I don't
1610 have the e500 timing specs. */
1611 if (TARGET_SPE && mode == V2SImode
1612 && cst >= -0x7fff && cst <= 0x7fff
f5119d10 1613 && cst2 >= -0x7fff && cst2 <= 0x7fff)
d744e06e
AH
1614 return 1;
1615
1616 if (TARGET_ALTIVEC && EASY_VECTOR_15 (cst, op, mode))
1617 return 1;
1618
1619 if (TARGET_ALTIVEC && EASY_VECTOR_15_ADD_SELF (cst, op, mode))
1620 return 1;
1621
1622 return 0;
1623}
1624
1625/* Same as easy_vector_constant but only for EASY_VECTOR_15_ADD_SELF. */
1626
1627int
1628easy_vector_constant_add_self (op, mode)
1629 rtx op;
1630 enum machine_mode mode;
1631{
1632 int cst;
1633
1634 if (!easy_vector_constant (op, mode))
1635 return 0;
1636
1637 cst = INTVAL (CONST_VECTOR_ELT (op, 0));
1638
1639 return TARGET_ALTIVEC && EASY_VECTOR_15_ADD_SELF (cst, op, mode);
1640}
1641
1642const char *
1643output_vec_const_move (operands)
1644 rtx *operands;
1645{
1646 int cst, cst2;
1647 enum machine_mode mode;
1648 rtx dest, vec;
1649
1650 dest = operands[0];
1651 vec = operands[1];
69ef87e2 1652
d744e06e
AH
1653 cst = INTVAL (CONST_VECTOR_ELT (vec, 0));
1654 cst2 = INTVAL (CONST_VECTOR_ELT (vec, 1));
1655 mode = GET_MODE (dest);
69ef87e2 1656
d744e06e
AH
1657 if (TARGET_ALTIVEC)
1658 {
1659 if (zero_constant (vec, mode))
1660 return "vxor %0,%0,%0";
1661 else if (EASY_VECTOR_15 (cst, vec, mode))
98ef3137 1662 {
d744e06e
AH
1663 operands[1] = GEN_INT (cst);
1664 switch (mode)
1665 {
1666 case V4SImode:
1667 return "vspltisw %0,%1";
1668 case V8HImode:
1669 return "vspltish %0,%1";
1670 case V16QImode:
1671 return "vspltisb %0,%1";
1672 default:
1673 abort ();
1674 }
98ef3137 1675 }
d744e06e
AH
1676 else if (EASY_VECTOR_15_ADD_SELF (cst, vec, mode))
1677 return "#";
1678 else
1679 abort ();
69ef87e2
AH
1680 }
1681
d744e06e
AH
1682 if (TARGET_SPE)
1683 {
1684 /* Vector constant 0 is handled as a splitter of V2SI, and in the
1685 pattern of V1DI, V4HI, and V2SF.
1686
c1207243 1687 FIXME: We should probably return # and add post reload
d744e06e
AH
1688 splitters for these, but this way is so easy ;-).
1689 */
1690 operands[1] = GEN_INT (cst);
1691 operands[2] = GEN_INT (cst2);
1692 if (cst == cst2)
1693 return "li %0,%1\n\tevmergelo %0,%0,%0";
1694 else
1695 return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
1696 }
1697
1698 abort ();
69ef87e2
AH
1699}
1700
1701/* Return 1 if the operand is the constant 0. This works for scalars
1702 as well as vectors. */
1703int
1704zero_constant (op, mode)
1705 rtx op;
1706 enum machine_mode mode;
1707{
1708 return op == CONST0_RTX (mode);
1709}
1710
50a0b056
GK
1711/* Return 1 if the operand is 0.0. */
1712int
1713zero_fp_constant (op, mode)
592696dd
SS
1714 rtx op;
1715 enum machine_mode mode;
50a0b056
GK
1716{
1717 return GET_MODE_CLASS (mode) == MODE_FLOAT && op == CONST0_RTX (mode);
1718}
1719
a4f6c312
SS
1720/* Return 1 if the operand is in volatile memory. Note that during
1721 the RTL generation phase, memory_operand does not return TRUE for
b6c9286a
MM
1722 volatile memory references. So this function allows us to
1723 recognize volatile references where its safe. */
1724
1725int
1726volatile_mem_operand (op, mode)
592696dd 1727 rtx op;
b6c9286a
MM
1728 enum machine_mode mode;
1729{
1730 if (GET_CODE (op) != MEM)
1731 return 0;
1732
1733 if (!MEM_VOLATILE_P (op))
1734 return 0;
1735
1736 if (mode != GET_MODE (op))
1737 return 0;
1738
1739 if (reload_completed)
1740 return memory_operand (op, mode);
1741
1742 if (reload_in_progress)
1743 return strict_memory_address_p (mode, XEXP (op, 0));
1744
1745 return memory_address_p (mode, XEXP (op, 0));
1746}
1747
97f6e72f 1748/* Return 1 if the operand is an offsettable memory operand. */
914c2e77
RK
1749
1750int
97f6e72f 1751offsettable_mem_operand (op, mode)
592696dd 1752 rtx op;
914c2e77
RK
1753 enum machine_mode mode;
1754{
97f6e72f 1755 return ((GET_CODE (op) == MEM)
677a9668 1756 && offsettable_address_p (reload_completed || reload_in_progress,
97f6e72f 1757 mode, XEXP (op, 0)));
914c2e77
RK
1758}
1759
9878760c
RK
1760/* Return 1 if the operand is either an easy FP constant (see above) or
1761 memory. */
1762
1763int
1764mem_or_easy_const_operand (op, mode)
592696dd 1765 rtx op;
9878760c
RK
1766 enum machine_mode mode;
1767{
1768 return memory_operand (op, mode) || easy_fp_constant (op, mode);
1769}
1770
1771/* Return 1 if the operand is either a non-special register or an item
5f59ecb7 1772 that can be used as the operand of a `mode' add insn. */
9878760c
RK
1773
1774int
1775add_operand (op, mode)
592696dd 1776 rtx op;
9878760c
RK
1777 enum machine_mode mode;
1778{
2bfcf297 1779 if (GET_CODE (op) == CONST_INT)
e72247f4
DE
1780 return (CONST_OK_FOR_LETTER_P (INTVAL (op), 'I')
1781 || CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'));
2bfcf297
DB
1782
1783 return gpc_reg_operand (op, mode);
9878760c
RK
1784}
1785
dcfedcd0
RK
1786/* Return 1 if OP is a constant but not a valid add_operand. */
1787
1788int
1789non_add_cint_operand (op, mode)
592696dd 1790 rtx op;
296b8152 1791 enum machine_mode mode ATTRIBUTE_UNUSED;
dcfedcd0
RK
1792{
1793 return (GET_CODE (op) == CONST_INT
e72247f4
DE
1794 && !CONST_OK_FOR_LETTER_P (INTVAL (op), 'I')
1795 && !CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'));
dcfedcd0
RK
1796}
1797
9878760c
RK
1798/* Return 1 if the operand is a non-special register or a constant that
1799 can be used as the operand of an OR or XOR insn on the RS/6000. */
1800
1801int
1802logical_operand (op, mode)
592696dd 1803 rtx op;
9878760c
RK
1804 enum machine_mode mode;
1805{
40501e5f 1806 HOST_WIDE_INT opl, oph;
1d328b19 1807
dfbdccdb
GK
1808 if (gpc_reg_operand (op, mode))
1809 return 1;
1d328b19 1810
dfbdccdb 1811 if (GET_CODE (op) == CONST_INT)
40501e5f
AM
1812 {
1813 opl = INTVAL (op) & GET_MODE_MASK (mode);
1814
1815#if HOST_BITS_PER_WIDE_INT <= 32
1816 if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT && opl < 0)
1817 return 0;
1818#endif
1819 }
dfbdccdb
GK
1820 else if (GET_CODE (op) == CONST_DOUBLE)
1821 {
1d328b19 1822 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
40501e5f 1823 abort ();
1d328b19
GK
1824
1825 opl = CONST_DOUBLE_LOW (op);
1826 oph = CONST_DOUBLE_HIGH (op);
40501e5f 1827 if (oph != 0)
38886f37 1828 return 0;
dfbdccdb
GK
1829 }
1830 else
1831 return 0;
1d328b19 1832
40501e5f
AM
1833 return ((opl & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0
1834 || (opl & ~ (unsigned HOST_WIDE_INT) 0xffff0000) == 0);
9878760c
RK
1835}
1836
dcfedcd0 1837/* Return 1 if C is a constant that is not a logical operand (as
1d328b19 1838 above), but could be split into one. */
dcfedcd0
RK
1839
1840int
1841non_logical_cint_operand (op, mode)
592696dd 1842 rtx op;
5f59ecb7 1843 enum machine_mode mode;
dcfedcd0 1844{
dfbdccdb 1845 return ((GET_CODE (op) == CONST_INT || GET_CODE (op) == CONST_DOUBLE)
1d328b19
GK
1846 && ! logical_operand (op, mode)
1847 && reg_or_logical_cint_operand (op, mode));
dcfedcd0
RK
1848}
1849
19ba8161 1850/* Return 1 if C is a constant that can be encoded in a 32-bit mask on the
9878760c
RK
1851 RS/6000. It is if there are no more than two 1->0 or 0->1 transitions.
1852 Reject all ones and all zeros, since these should have been optimized
1853 away and confuse the making of MB and ME. */
1854
1855int
19ba8161 1856mask_operand (op, mode)
592696dd 1857 rtx op;
19ba8161 1858 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c 1859{
02071907 1860 HOST_WIDE_INT c, lsb;
9878760c 1861
19ba8161
DE
1862 if (GET_CODE (op) != CONST_INT)
1863 return 0;
1864
1865 c = INTVAL (op);
1866
57deb3a1
AM
1867 /* Fail in 64-bit mode if the mask wraps around because the upper
1868 32-bits of the mask will all be 1s, contrary to GCC's internal view. */
1869 if (TARGET_POWERPC64 && (c & 0x80000001) == 0x80000001)
1870 return 0;
1871
c5059423
AM
1872 /* We don't change the number of transitions by inverting,
1873 so make sure we start with the LS bit zero. */
1874 if (c & 1)
1875 c = ~c;
1876
1877 /* Reject all zeros or all ones. */
1878 if (c == 0)
9878760c
RK
1879 return 0;
1880
c5059423
AM
1881 /* Find the first transition. */
1882 lsb = c & -c;
1883
1884 /* Invert to look for a second transition. */
1885 c = ~c;
9878760c 1886
c5059423
AM
1887 /* Erase first transition. */
1888 c &= -lsb;
9878760c 1889
c5059423
AM
1890 /* Find the second transition (if any). */
1891 lsb = c & -c;
1892
1893 /* Match if all the bits above are 1's (or c is zero). */
1894 return c == -lsb;
9878760c
RK
1895}
1896
0ba1b2ff
AM
1897/* Return 1 for the PowerPC64 rlwinm corner case. */
1898
1899int
1900mask_operand_wrap (op, mode)
1901 rtx op;
1902 enum machine_mode mode ATTRIBUTE_UNUSED;
1903{
1904 HOST_WIDE_INT c, lsb;
1905
1906 if (GET_CODE (op) != CONST_INT)
1907 return 0;
1908
1909 c = INTVAL (op);
1910
1911 if ((c & 0x80000001) != 0x80000001)
1912 return 0;
1913
1914 c = ~c;
1915 if (c == 0)
1916 return 0;
1917
1918 lsb = c & -c;
1919 c = ~c;
1920 c &= -lsb;
1921 lsb = c & -c;
1922 return c == -lsb;
1923}
1924
a260abc9
DE
1925/* Return 1 if the operand is a constant that is a PowerPC64 mask.
1926 It is if there are no more than one 1->0 or 0->1 transitions.
0ba1b2ff
AM
1927 Reject all zeros, since zero should have been optimized away and
1928 confuses the making of MB and ME. */
9878760c
RK
1929
1930int
a260abc9 1931mask64_operand (op, mode)
592696dd 1932 rtx op;
0ba1b2ff 1933 enum machine_mode mode ATTRIBUTE_UNUSED;
a260abc9
DE
1934{
1935 if (GET_CODE (op) == CONST_INT)
1936 {
02071907 1937 HOST_WIDE_INT c, lsb;
a260abc9 1938
c5059423 1939 c = INTVAL (op);
a260abc9 1940
0ba1b2ff 1941 /* Reject all zeros. */
c5059423 1942 if (c == 0)
e2c953b6
DE
1943 return 0;
1944
0ba1b2ff
AM
1945 /* We don't change the number of transitions by inverting,
1946 so make sure we start with the LS bit zero. */
1947 if (c & 1)
1948 c = ~c;
1949
c5059423
AM
1950 /* Find the transition, and check that all bits above are 1's. */
1951 lsb = c & -c;
e3981aab
DE
1952
1953 /* Match if all the bits above are 1's (or c is zero). */
c5059423 1954 return c == -lsb;
e2c953b6 1955 }
0ba1b2ff
AM
1956 return 0;
1957}
1958
1959/* Like mask64_operand, but allow up to three transitions. This
1960 predicate is used by insn patterns that generate two rldicl or
1961 rldicr machine insns. */
1962
1963int
1964mask64_2_operand (op, mode)
1965 rtx op;
1966 enum machine_mode mode ATTRIBUTE_UNUSED;
1967{
1968 if (GET_CODE (op) == CONST_INT)
a260abc9 1969 {
0ba1b2ff 1970 HOST_WIDE_INT c, lsb;
a260abc9 1971
0ba1b2ff 1972 c = INTVAL (op);
a260abc9 1973
0ba1b2ff
AM
1974 /* Disallow all zeros. */
1975 if (c == 0)
1976 return 0;
a260abc9 1977
0ba1b2ff
AM
1978 /* We don't change the number of transitions by inverting,
1979 so make sure we start with the LS bit zero. */
1980 if (c & 1)
1981 c = ~c;
a260abc9 1982
0ba1b2ff
AM
1983 /* Find the first transition. */
1984 lsb = c & -c;
a260abc9 1985
0ba1b2ff
AM
1986 /* Invert to look for a second transition. */
1987 c = ~c;
1988
1989 /* Erase first transition. */
1990 c &= -lsb;
1991
1992 /* Find the second transition. */
1993 lsb = c & -c;
1994
1995 /* Invert to look for a third transition. */
1996 c = ~c;
1997
1998 /* Erase second transition. */
1999 c &= -lsb;
2000
2001 /* Find the third transition (if any). */
2002 lsb = c & -c;
2003
2004 /* Match if all the bits above are 1's (or c is zero). */
2005 return c == -lsb;
2006 }
2007 return 0;
2008}
2009
2010/* Generates shifts and masks for a pair of rldicl or rldicr insns to
2011 implement ANDing by the mask IN. */
2012void
2013build_mask64_2_operands (in, out)
2014 rtx in;
2015 rtx *out;
2016{
2017#if HOST_BITS_PER_WIDE_INT >= 64
2018 unsigned HOST_WIDE_INT c, lsb, m1, m2;
2019 int shift;
2020
2021 if (GET_CODE (in) != CONST_INT)
2022 abort ();
2023
2024 c = INTVAL (in);
2025 if (c & 1)
2026 {
2027 /* Assume c initially something like 0x00fff000000fffff. The idea
2028 is to rotate the word so that the middle ^^^^^^ group of zeros
2029 is at the MS end and can be cleared with an rldicl mask. We then
2030 rotate back and clear off the MS ^^ group of zeros with a
2031 second rldicl. */
2032 c = ~c; /* c == 0xff000ffffff00000 */
2033 lsb = c & -c; /* lsb == 0x0000000000100000 */
2034 m1 = -lsb; /* m1 == 0xfffffffffff00000 */
2035 c = ~c; /* c == 0x00fff000000fffff */
2036 c &= -lsb; /* c == 0x00fff00000000000 */
2037 lsb = c & -c; /* lsb == 0x0000100000000000 */
2038 c = ~c; /* c == 0xff000fffffffffff */
2039 c &= -lsb; /* c == 0xff00000000000000 */
2040 shift = 0;
2041 while ((lsb >>= 1) != 0)
2042 shift++; /* shift == 44 on exit from loop */
2043 m1 <<= 64 - shift; /* m1 == 0xffffff0000000000 */
2044 m1 = ~m1; /* m1 == 0x000000ffffffffff */
2045 m2 = ~c; /* m2 == 0x00ffffffffffffff */
a260abc9
DE
2046 }
2047 else
0ba1b2ff
AM
2048 {
2049 /* Assume c initially something like 0xff000f0000000000. The idea
2050 is to rotate the word so that the ^^^ middle group of zeros
2051 is at the LS end and can be cleared with an rldicr mask. We then
2052 rotate back and clear off the LS group of ^^^^^^^^^^ zeros with
2053 a second rldicr. */
2054 lsb = c & -c; /* lsb == 0x0000010000000000 */
2055 m2 = -lsb; /* m2 == 0xffffff0000000000 */
2056 c = ~c; /* c == 0x00fff0ffffffffff */
2057 c &= -lsb; /* c == 0x00fff00000000000 */
2058 lsb = c & -c; /* lsb == 0x0000100000000000 */
2059 c = ~c; /* c == 0xff000fffffffffff */
2060 c &= -lsb; /* c == 0xff00000000000000 */
2061 shift = 0;
2062 while ((lsb >>= 1) != 0)
2063 shift++; /* shift == 44 on exit from loop */
2064 m1 = ~c; /* m1 == 0x00ffffffffffffff */
2065 m1 >>= shift; /* m1 == 0x0000000000000fff */
2066 m1 = ~m1; /* m1 == 0xfffffffffffff000 */
2067 }
2068
2069 /* Note that when we only have two 0->1 and 1->0 transitions, one of the
2070 masks will be all 1's. We are guaranteed more than one transition. */
2071 out[0] = GEN_INT (64 - shift);
2072 out[1] = GEN_INT (m1);
2073 out[2] = GEN_INT (shift);
2074 out[3] = GEN_INT (m2);
2075#else
045572c7
GK
2076 (void)in;
2077 (void)out;
0ba1b2ff
AM
2078 abort ();
2079#endif
a260abc9
DE
2080}
2081
2082/* Return 1 if the operand is either a non-special register or a constant
2083 that can be used as the operand of a PowerPC64 logical AND insn. */
2084
2085int
2086and64_operand (op, mode)
592696dd 2087 rtx op;
9878760c
RK
2088 enum machine_mode mode;
2089{
a4f6c312 2090 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
52d3af72
DE
2091 return (gpc_reg_operand (op, mode) || mask64_operand (op, mode));
2092
2093 return (logical_operand (op, mode) || mask64_operand (op, mode));
9878760c
RK
2094}
2095
0ba1b2ff
AM
2096/* Like the above, but also match constants that can be implemented
2097 with two rldicl or rldicr insns. */
2098
2099int
2100and64_2_operand (op, mode)
2101 rtx op;
2102 enum machine_mode mode;
2103{
2104 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
2105 return gpc_reg_operand (op, mode) || mask64_2_operand (op, mode);
2106
2107 return logical_operand (op, mode) || mask64_2_operand (op, mode);
2108}
2109
a260abc9
DE
2110/* Return 1 if the operand is either a non-special register or a
2111 constant that can be used as the operand of an RS/6000 logical AND insn. */
dcfedcd0
RK
2112
2113int
a260abc9 2114and_operand (op, mode)
592696dd 2115 rtx op;
a260abc9 2116 enum machine_mode mode;
dcfedcd0 2117{
a4f6c312 2118 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
52d3af72
DE
2119 return (gpc_reg_operand (op, mode) || mask_operand (op, mode));
2120
2121 return (logical_operand (op, mode) || mask_operand (op, mode));
dcfedcd0
RK
2122}
2123
9878760c
RK
2124/* Return 1 if the operand is a general register or memory operand. */
2125
2126int
2127reg_or_mem_operand (op, mode)
592696dd
SS
2128 rtx op;
2129 enum machine_mode mode;
9878760c 2130{
b6c9286a
MM
2131 return (gpc_reg_operand (op, mode)
2132 || memory_operand (op, mode)
2133 || volatile_mem_operand (op, mode));
9878760c
RK
2134}
2135
a7a813f7 2136/* Return 1 if the operand is a general register or memory operand without
3cb999d8 2137 pre_inc or pre_dec which produces invalid form of PowerPC lwa
a7a813f7
RK
2138 instruction. */
2139
2140int
2141lwa_operand (op, mode)
592696dd
SS
2142 rtx op;
2143 enum machine_mode mode;
a7a813f7
RK
2144{
2145 rtx inner = op;
2146
2147 if (reload_completed && GET_CODE (inner) == SUBREG)
2148 inner = SUBREG_REG (inner);
2149
2150 return gpc_reg_operand (inner, mode)
2151 || (memory_operand (inner, mode)
2152 && GET_CODE (XEXP (inner, 0)) != PRE_INC
6a40a9d6
DE
2153 && GET_CODE (XEXP (inner, 0)) != PRE_DEC
2154 && (GET_CODE (XEXP (inner, 0)) != PLUS
e903c96a
DE
2155 || GET_CODE (XEXP (XEXP (inner, 0), 1)) != CONST_INT
2156 || INTVAL (XEXP (XEXP (inner, 0), 1)) % 4 == 0));
a7a813f7
RK
2157}
2158
cc4d5fec
JH
2159/* Return 1 if the operand, used inside a MEM, is a SYMBOL_REF. */
2160
2161int
2162symbol_ref_operand (op, mode)
2163 rtx op;
2164 enum machine_mode mode;
2165{
2166 if (mode != VOIDmode && GET_MODE (op) != mode)
2167 return 0;
2168
473f51b6
DE
2169 return (GET_CODE (op) == SYMBOL_REF
2170 && (DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op)));
cc4d5fec
JH
2171}
2172
9878760c 2173/* Return 1 if the operand, used inside a MEM, is a valid first argument
cc4d5fec 2174 to CALL. This is a SYMBOL_REF, a pseudo-register, LR or CTR. */
9878760c
RK
2175
2176int
2177call_operand (op, mode)
592696dd 2178 rtx op;
9878760c
RK
2179 enum machine_mode mode;
2180{
2181 if (mode != VOIDmode && GET_MODE (op) != mode)
2182 return 0;
2183
2184 return (GET_CODE (op) == SYMBOL_REF
cc4d5fec
JH
2185 || (GET_CODE (op) == REG
2186 && (REGNO (op) == LINK_REGISTER_REGNUM
2187 || REGNO (op) == COUNT_REGISTER_REGNUM
2188 || REGNO (op) >= FIRST_PSEUDO_REGISTER)));
9878760c
RK
2189}
2190
2af3d377 2191/* Return 1 if the operand is a SYMBOL_REF for a function known to be in
d1908feb 2192 this file. */
2af3d377
RK
2193
2194int
2195current_file_function_operand (op, mode)
592696dd 2196 rtx op;
296b8152 2197 enum machine_mode mode ATTRIBUTE_UNUSED;
2af3d377 2198{
473f51b6
DE
2199 return (GET_CODE (op) == SYMBOL_REF
2200 && (DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op))
2201 && (SYMBOL_REF_LOCAL_P (op)
2202 || (op == XEXP (DECL_RTL (current_function_decl), 0))));
2af3d377
RK
2203}
2204
9878760c
RK
2205/* Return 1 if this operand is a valid input for a move insn. */
2206
2207int
2208input_operand (op, mode)
592696dd 2209 rtx op;
9878760c
RK
2210 enum machine_mode mode;
2211{
eb4e8003 2212 /* Memory is always valid. */
9878760c
RK
2213 if (memory_operand (op, mode))
2214 return 1;
2215
34792e82 2216 /* Only a tiny bit of handling for CONSTANT_P_RTX is necessary. */
01b4cf2b 2217 if (GET_CODE (op) == CONSTANT_P_RTX)
34792e82
JL
2218 return 1;
2219
eb4e8003
RK
2220 /* For floating-point, easy constants are valid. */
2221 if (GET_MODE_CLASS (mode) == MODE_FLOAT
2222 && CONSTANT_P (op)
2223 && easy_fp_constant (op, mode))
2224 return 1;
2225
4e74d8ec
MM
2226 /* Allow any integer constant. */
2227 if (GET_MODE_CLASS (mode) == MODE_INT
e675f625 2228 && (GET_CODE (op) == CONST_INT
e675f625 2229 || GET_CODE (op) == CONST_DOUBLE))
4e74d8ec
MM
2230 return 1;
2231
d744e06e
AH
2232 /* Allow easy vector constants. */
2233 if (GET_CODE (op) == CONST_VECTOR
2234 && easy_vector_constant (op, mode))
2235 return 1;
2236
eb4e8003
RK
2237 /* For floating-point or multi-word mode, the only remaining valid type
2238 is a register. */
9878760c
RK
2239 if (GET_MODE_CLASS (mode) == MODE_FLOAT
2240 || GET_MODE_SIZE (mode) > UNITS_PER_WORD)
eb4e8003 2241 return register_operand (op, mode);
9878760c 2242
88fe15a1
RK
2243 /* The only cases left are integral modes one word or smaller (we
2244 do not get called for MODE_CC values). These can be in any
2245 register. */
2246 if (register_operand (op, mode))
a8b3aeda 2247 return 1;
88fe15a1 2248
84cf9dda 2249 /* A SYMBOL_REF referring to the TOC is valid. */
4d588c14 2250 if (legitimate_constant_pool_address_p (op))
84cf9dda
RK
2251 return 1;
2252
9ebbca7d 2253 /* A constant pool expression (relative to the TOC) is valid */
4d588c14 2254 if (toc_relative_expr_p (op))
b6c9286a
MM
2255 return 1;
2256
88228c4b
MM
2257 /* V.4 allows SYMBOL_REFs and CONSTs that are in the small data region
2258 to be valid. */
f607bc57 2259 if (DEFAULT_ABI == ABI_V4
88228c4b
MM
2260 && (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST)
2261 && small_data_operand (op, Pmode))
2262 return 1;
2263
042259f2 2264 return 0;
9878760c 2265}
7509c759 2266
a4f6c312 2267/* Return 1 for an operand in small memory on V.4/eabi. */
7509c759
MM
2268
2269int
2270small_data_operand (op, mode)
296b8152
KG
2271 rtx op ATTRIBUTE_UNUSED;
2272 enum machine_mode mode ATTRIBUTE_UNUSED;
7509c759 2273{
38c1f2d7 2274#if TARGET_ELF
5f59ecb7 2275 rtx sym_ref;
7509c759 2276
d9407988 2277 if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
a54d04b7 2278 return 0;
a54d04b7 2279
f607bc57 2280 if (DEFAULT_ABI != ABI_V4)
7509c759
MM
2281 return 0;
2282
88228c4b
MM
2283 if (GET_CODE (op) == SYMBOL_REF)
2284 sym_ref = op;
2285
2286 else if (GET_CODE (op) != CONST
2287 || GET_CODE (XEXP (op, 0)) != PLUS
2288 || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
2289 || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
7509c759
MM
2290 return 0;
2291
88228c4b 2292 else
dbf55e53
MM
2293 {
2294 rtx sum = XEXP (op, 0);
2295 HOST_WIDE_INT summand;
2296
2297 /* We have to be careful here, because it is the referenced address
2298 that must be 32k from _SDA_BASE_, not just the symbol. */
2299 summand = INTVAL (XEXP (sum, 1));
307b599c 2300 if (summand < 0 || (unsigned HOST_WIDE_INT) summand > g_switch_value)
dbf55e53
MM
2301 return 0;
2302
2303 sym_ref = XEXP (sum, 0);
2304 }
88228c4b 2305
20bfcd69 2306 return SYMBOL_REF_SMALL_P (sym_ref);
d9407988
MM
2307#else
2308 return 0;
2309#endif
7509c759 2310}
46c07df8
HP
2311
2312/* Return 1 for all valid move insn operand combination involving altivec
2313 vectors in gprs. */
2314
2315int
2316altivec_in_gprs_p (rtx op0, rtx op1)
2317{
2318 if (REG_P (op0) && REGNO_REG_CLASS (REGNO (op0)) == GENERAL_REGS)
2319 return 1;
2320
2321 if (REG_P (op1) && REGNO_REG_CLASS (REGNO (op1)) == GENERAL_REGS)
2322 return 1;
2323 return 0;
2324}
2325
9ebbca7d 2326\f
4d588c14
RH
2327/* Subroutines of rs6000_legitimize_address and rs6000_legitimate_address. */
2328
9ebbca7d
GK
2329static int
2330constant_pool_expr_1 (op, have_sym, have_toc)
2331 rtx op;
2332 int *have_sym;
2333 int *have_toc;
2334{
2335 switch (GET_CODE(op))
2336 {
2337 case SYMBOL_REF:
c4501e62
JJ
2338 if (RS6000_SYMBOL_REF_TLS_P (op))
2339 return 0;
2340 else if (CONSTANT_POOL_ADDRESS_P (op))
a4f6c312
SS
2341 {
2342 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (op), Pmode))
2343 {
2344 *have_sym = 1;
2345 return 1;
2346 }
2347 else
2348 return 0;
2349 }
2350 else if (! strcmp (XSTR (op, 0), toc_label_name))
2351 {
2352 *have_toc = 1;
2353 return 1;
2354 }
2355 else
2356 return 0;
9ebbca7d
GK
2357 case PLUS:
2358 case MINUS:
c1f11548
DE
2359 return (constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc)
2360 && constant_pool_expr_1 (XEXP (op, 1), have_sym, have_toc));
9ebbca7d 2361 case CONST:
a4f6c312 2362 return constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc);
9ebbca7d 2363 case CONST_INT:
a4f6c312 2364 return 1;
9ebbca7d 2365 default:
a4f6c312 2366 return 0;
9ebbca7d
GK
2367 }
2368}
2369
4d588c14 2370static bool
9ebbca7d
GK
2371constant_pool_expr_p (op)
2372 rtx op;
2373{
2374 int have_sym = 0;
2375 int have_toc = 0;
2376 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_sym;
2377}
2378
4d588c14 2379static bool
9ebbca7d
GK
2380toc_relative_expr_p (op)
2381 rtx op;
2382{
4d588c14
RH
2383 int have_sym = 0;
2384 int have_toc = 0;
2385 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_toc;
2386}
2387
2388/* SPE offset addressing is limited to 5-bits worth of double words. */
2389#define SPE_CONST_OFFSET_OK(x) (((x) & ~0xf8) == 0)
2390
2391bool
2392legitimate_constant_pool_address_p (x)
2393 rtx x;
2394{
2395 return (TARGET_TOC
2396 && GET_CODE (x) == PLUS
2397 && GET_CODE (XEXP (x, 0)) == REG
2398 && (TARGET_MINIMAL_TOC || REGNO (XEXP (x, 0)) == TOC_REGISTER)
2399 && constant_pool_expr_p (XEXP (x, 1)));
2400}
2401
2402static bool
2403legitimate_small_data_p (mode, x)
2404 enum machine_mode mode;
2405 rtx x;
2406{
2407 return (DEFAULT_ABI == ABI_V4
2408 && !flag_pic && !TARGET_TOC
2409 && (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
2410 && small_data_operand (x, mode));
2411}
2412
2413static bool
2414legitimate_offset_address_p (mode, x, strict)
2415 enum machine_mode mode;
2416 rtx x;
2417 int strict;
2418{
2419 unsigned HOST_WIDE_INT offset, extra;
2420
2421 if (GET_CODE (x) != PLUS)
2422 return false;
2423 if (GET_CODE (XEXP (x, 0)) != REG)
2424 return false;
2425 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
2426 return false;
2427 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
2428 return false;
2429
2430 offset = INTVAL (XEXP (x, 1));
2431 extra = 0;
2432 switch (mode)
2433 {
2434 case V16QImode:
2435 case V8HImode:
2436 case V4SFmode:
2437 case V4SImode:
2438 /* AltiVec vector modes. Only reg+reg addressing is valid here,
2439 which leaves the only valid constant offset of zero, which by
2440 canonicalization rules is also invalid. */
2441 return false;
2442
2443 case V4HImode:
2444 case V2SImode:
2445 case V1DImode:
2446 case V2SFmode:
2447 /* SPE vector modes. */
2448 return SPE_CONST_OFFSET_OK (offset);
2449
2450 case DFmode:
2451 case DImode:
2452 if (TARGET_32BIT)
2453 extra = 4;
2454 else if (offset & 3)
2455 return false;
2456 break;
2457
2458 case TFmode:
2459 case TImode:
2460 if (TARGET_32BIT)
2461 extra = 12;
2462 else if (offset & 3)
2463 return false;
2464 else
2465 extra = 8;
2466 break;
2467
2468 default:
2469 break;
2470 }
2471
2472 return (offset + extra >= offset) && (offset + extra + 0x8000 < 0x10000);
2473}
2474
2475static bool
2476legitimate_indexed_address_p (x, strict)
2477 rtx x;
2478 int strict;
2479{
2480 rtx op0, op1;
2481
2482 if (GET_CODE (x) != PLUS)
2483 return false;
2484 op0 = XEXP (x, 0);
2485 op1 = XEXP (x, 1);
2486
2487 if (!REG_P (op0) || !REG_P (op1))
2488 return false;
2489
2490 return ((INT_REG_OK_FOR_BASE_P (op0, strict)
2491 && INT_REG_OK_FOR_INDEX_P (op1, strict))
2492 || (INT_REG_OK_FOR_BASE_P (op1, strict)
2493 && INT_REG_OK_FOR_INDEX_P (op0, strict)));
9ebbca7d
GK
2494}
2495
4d588c14
RH
2496static inline bool
2497legitimate_indirect_address_p (x, strict)
2498 rtx x;
2499 int strict;
2500{
2501 return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict);
2502}
2503
2504static bool
2505legitimate_lo_sum_address_p (mode, x, strict)
2506 enum machine_mode mode;
2507 rtx x;
2508 int strict;
2509{
2510 if (GET_CODE (x) != LO_SUM)
2511 return false;
2512 if (GET_CODE (XEXP (x, 0)) != REG)
2513 return false;
2514 if (!INT_REG_OK_FOR_BASE_P (XEXP (x, 0), strict))
2515 return false;
2516 x = XEXP (x, 1);
2517
2518 if (TARGET_ELF)
2519 {
2520 if (DEFAULT_ABI != ABI_AIX && flag_pic)
2521 return false;
2522 if (TARGET_TOC)
2523 return false;
2524 if (GET_MODE_NUNITS (mode) != 1)
2525 return false;
2526 if (GET_MODE_BITSIZE (mode) > 32
2527 && !(TARGET_HARD_FLOAT && TARGET_FPRS && mode == DFmode))
2528 return false;
2529
2530 return CONSTANT_P (x);
2531 }
2532
2533 return false;
2534}
2535
2536
9ebbca7d
GK
2537/* Try machine-dependent ways of modifying an illegitimate address
2538 to be legitimate. If we find one, return the new, valid address.
2539 This is used from only one place: `memory_address' in explow.c.
2540
a4f6c312
SS
2541 OLDX is the address as it was before break_out_memory_refs was
2542 called. In some cases it is useful to look at this to decide what
2543 needs to be done.
9ebbca7d 2544
a4f6c312 2545 MODE is passed so that this function can use GO_IF_LEGITIMATE_ADDRESS.
9ebbca7d 2546
a4f6c312
SS
2547 It is always safe for this function to do nothing. It exists to
2548 recognize opportunities to optimize the output.
9ebbca7d
GK
2549
2550 On RS/6000, first check for the sum of a register with a constant
2551 integer that is out of range. If so, generate code to add the
2552 constant with the low-order 16 bits masked to the register and force
2553 this result into another register (this can be done with `cau').
2554 Then generate an address of REG+(CONST&0xffff), allowing for the
2555 possibility of bit 16 being a one.
2556
2557 Then check for the sum of a register and something not constant, try to
2558 load the other things into a register and return the sum. */
4d588c14 2559
9ebbca7d
GK
2560rtx
2561rs6000_legitimize_address (x, oldx, mode)
2562 rtx x;
2563 rtx oldx ATTRIBUTE_UNUSED;
2564 enum machine_mode mode;
0ac081f6 2565{
c4501e62
JJ
2566 if (GET_CODE (x) == SYMBOL_REF)
2567 {
2568 enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
2569 if (model != 0)
2570 return rs6000_legitimize_tls_address (x, model);
2571 }
2572
9ebbca7d
GK
2573 if (GET_CODE (x) == PLUS
2574 && GET_CODE (XEXP (x, 0)) == REG
2575 && GET_CODE (XEXP (x, 1)) == CONST_INT
2576 && (unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000) >= 0x10000)
2577 {
2578 HOST_WIDE_INT high_int, low_int;
2579 rtx sum;
a65c591c
DE
2580 low_int = ((INTVAL (XEXP (x, 1)) & 0xffff) ^ 0x8000) - 0x8000;
2581 high_int = INTVAL (XEXP (x, 1)) - low_int;
9ebbca7d
GK
2582 sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
2583 GEN_INT (high_int)), 0);
2584 return gen_rtx_PLUS (Pmode, sum, GEN_INT (low_int));
2585 }
2586 else if (GET_CODE (x) == PLUS
2587 && GET_CODE (XEXP (x, 0)) == REG
2588 && GET_CODE (XEXP (x, 1)) != CONST_INT
6ac7bf2c 2589 && GET_MODE_NUNITS (mode) == 1
a3170dc6
AH
2590 && ((TARGET_HARD_FLOAT && TARGET_FPRS)
2591 || TARGET_POWERPC64
fcce224d 2592 || (mode != DFmode && mode != TFmode))
9ebbca7d
GK
2593 && (TARGET_POWERPC64 || mode != DImode)
2594 && mode != TImode)
2595 {
2596 return gen_rtx_PLUS (Pmode, XEXP (x, 0),
2597 force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
2598 }
0ac081f6
AH
2599 else if (ALTIVEC_VECTOR_MODE (mode))
2600 {
2601 rtx reg;
2602
2603 /* Make sure both operands are registers. */
2604 if (GET_CODE (x) == PLUS)
9f85ed45 2605 return gen_rtx_PLUS (Pmode, force_reg (Pmode, XEXP (x, 0)),
0ac081f6
AH
2606 force_reg (Pmode, XEXP (x, 1)));
2607
2608 reg = force_reg (Pmode, x);
2609 return reg;
2610 }
a3170dc6
AH
2611 else if (SPE_VECTOR_MODE (mode))
2612 {
2613 /* We accept [reg + reg] and [reg + OFFSET]. */
2614
2615 if (GET_CODE (x) == PLUS)
2616 {
2617 rtx op1 = XEXP (x, 0);
2618 rtx op2 = XEXP (x, 1);
2619
2620 op1 = force_reg (Pmode, op1);
2621
2622 if (GET_CODE (op2) != REG
2623 && (GET_CODE (op2) != CONST_INT
2624 || !SPE_CONST_OFFSET_OK (INTVAL (op2))))
2625 op2 = force_reg (Pmode, op2);
2626
2627 return gen_rtx_PLUS (Pmode, op1, op2);
2628 }
2629
2630 return force_reg (Pmode, x);
2631 }
f1384257
AM
2632 else if (TARGET_ELF
2633 && TARGET_32BIT
2634 && TARGET_NO_TOC
2635 && ! flag_pic
9ebbca7d
GK
2636 && GET_CODE (x) != CONST_INT
2637 && GET_CODE (x) != CONST_DOUBLE
2638 && CONSTANT_P (x)
6ac7bf2c
GK
2639 && GET_MODE_NUNITS (mode) == 1
2640 && (GET_MODE_BITSIZE (mode) <= 32
a3170dc6 2641 || ((TARGET_HARD_FLOAT && TARGET_FPRS) && mode == DFmode)))
9ebbca7d
GK
2642 {
2643 rtx reg = gen_reg_rtx (Pmode);
2644 emit_insn (gen_elf_high (reg, (x)));
2645 return gen_rtx_LO_SUM (Pmode, reg, (x));
2646 }
ee890fe2
SS
2647 else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
2648 && ! flag_pic
ab82a49f
AP
2649#if TARGET_MACHO
2650 && ! MACHO_DYNAMIC_NO_PIC_P
2651#endif
ee890fe2
SS
2652 && GET_CODE (x) != CONST_INT
2653 && GET_CODE (x) != CONST_DOUBLE
2654 && CONSTANT_P (x)
a3170dc6 2655 && ((TARGET_HARD_FLOAT && TARGET_FPRS) || mode != DFmode)
ee890fe2
SS
2656 && mode != DImode
2657 && mode != TImode)
2658 {
2659 rtx reg = gen_reg_rtx (Pmode);
2660 emit_insn (gen_macho_high (reg, (x)));
2661 return gen_rtx_LO_SUM (Pmode, reg, (x));
2662 }
9ebbca7d 2663 else if (TARGET_TOC
4d588c14 2664 && constant_pool_expr_p (x)
a9098fd0 2665 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
9ebbca7d
GK
2666 {
2667 return create_TOC_reference (x);
2668 }
2669 else
2670 return NULL_RTX;
2671}
258bfae2 2672
c4501e62
JJ
2673/* Construct the SYMBOL_REF for the tls_get_addr function. */
2674
2675static GTY(()) rtx rs6000_tls_symbol;
2676static rtx
2677rs6000_tls_get_addr ()
2678{
2679 if (!rs6000_tls_symbol)
2680 rs6000_tls_symbol = init_one_libfunc ("__tls_get_addr");
2681
2682 return rs6000_tls_symbol;
2683}
2684
2685/* Construct the SYMBOL_REF for TLS GOT references. */
2686
2687static GTY(()) rtx rs6000_got_symbol;
2688static rtx
2689rs6000_got_sym ()
2690{
2691 if (!rs6000_got_symbol)
2692 {
2693 rs6000_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
2694 SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_LOCAL;
2695 SYMBOL_REF_FLAGS (rs6000_got_symbol) |= SYMBOL_FLAG_EXTERNAL;
2696 }
2697
2698 return rs6000_got_symbol;
2699}
2700
2701/* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
2702 this (thread-local) address. */
2703
2704static rtx
2705rs6000_legitimize_tls_address (addr, model)
2706 rtx addr;
2707 enum tls_model model;
2708{
2709 rtx dest, insn;
2710
2711 dest = gen_reg_rtx (Pmode);
2712 if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 16)
2713 {
2714 rtx tlsreg;
2715
2716 if (TARGET_64BIT)
2717 {
2718 tlsreg = gen_rtx_REG (Pmode, 13);
2719 insn = gen_tls_tprel_64 (dest, tlsreg, addr);
2720 }
2721 else
2722 {
2723 tlsreg = gen_rtx_REG (Pmode, 2);
2724 insn = gen_tls_tprel_32 (dest, tlsreg, addr);
2725 }
2726 emit_insn (insn);
2727 }
2728 else if (model == TLS_MODEL_LOCAL_EXEC && rs6000_tls_size == 32)
2729 {
2730 rtx tlsreg, tmp;
2731
2732 tmp = gen_reg_rtx (Pmode);
2733 if (TARGET_64BIT)
2734 {
2735 tlsreg = gen_rtx_REG (Pmode, 13);
2736 insn = gen_tls_tprel_ha_64 (tmp, tlsreg, addr);
2737 }
2738 else
2739 {
2740 tlsreg = gen_rtx_REG (Pmode, 2);
2741 insn = gen_tls_tprel_ha_32 (tmp, tlsreg, addr);
2742 }
2743 emit_insn (insn);
2744 if (TARGET_64BIT)
2745 insn = gen_tls_tprel_lo_64 (dest, tmp, addr);
2746 else
2747 insn = gen_tls_tprel_lo_32 (dest, tmp, addr);
2748 emit_insn (insn);
2749 }
2750 else
2751 {
2752 rtx r3, got, tga, tmp1, tmp2, eqv;
2753
2754 if (TARGET_64BIT)
2755 got = gen_rtx_REG (Pmode, TOC_REGISTER);
2756 else
2757 {
2758 if (flag_pic == 1)
2759 got = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
2760 else
2761 {
2762 rtx gsym = rs6000_got_sym ();
2763 got = gen_reg_rtx (Pmode);
2764 if (flag_pic == 0)
2765 rs6000_emit_move (got, gsym, Pmode);
2766 else
2767 {
2768 char buf[30];
2769 static int tls_got_labelno = 0;
2770 rtx tempLR, lab, tmp3, mem;
2771 rtx first, last;
2772
2773 ASM_GENERATE_INTERNAL_LABEL (buf, "LTLS", tls_got_labelno++);
2774 lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
2775 tempLR = gen_reg_rtx (Pmode);
2776 tmp1 = gen_reg_rtx (Pmode);
2777 tmp2 = gen_reg_rtx (Pmode);
2778 tmp3 = gen_reg_rtx (Pmode);
2779 mem = gen_rtx_MEM (Pmode, tmp1);
2780 RTX_UNCHANGING_P (mem) = 1;
2781
2782 first = emit_insn (gen_load_toc_v4_PIC_1b (tempLR, lab,
2783 gsym));
2784 emit_move_insn (tmp1, tempLR);
2785 emit_move_insn (tmp2, mem);
2786 emit_insn (gen_addsi3 (tmp3, tmp1, tmp2));
2787 last = emit_move_insn (got, tmp3);
2788 REG_NOTES (last) = gen_rtx_EXPR_LIST (REG_EQUAL, gsym,
2789 REG_NOTES (last));
2790 REG_NOTES (first) = gen_rtx_INSN_LIST (REG_LIBCALL, last,
2791 REG_NOTES (first));
2792 REG_NOTES (last) = gen_rtx_INSN_LIST (REG_RETVAL, first,
2793 REG_NOTES (last));
2794 }
2795 }
2796 }
2797
2798 if (model == TLS_MODEL_GLOBAL_DYNAMIC)
2799 {
2800 r3 = gen_rtx_REG (Pmode, 3);
2801 if (TARGET_64BIT)
2802 insn = gen_tls_gd_64 (r3, got, addr);
2803 else
2804 insn = gen_tls_gd_32 (r3, got, addr);
2805 start_sequence ();
2806 emit_insn (insn);
2807 tga = gen_rtx_MEM (Pmode, rs6000_tls_get_addr ());
2808 insn = gen_call_value (r3, tga, const0_rtx, const0_rtx);
2809 insn = emit_call_insn (insn);
2810 CONST_OR_PURE_CALL_P (insn) = 1;
2811 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
2812 insn = get_insns ();
2813 end_sequence ();
2814 emit_libcall_block (insn, dest, r3, addr);
2815 }
2816 else if (model == TLS_MODEL_LOCAL_DYNAMIC)
2817 {
2818 r3 = gen_rtx_REG (Pmode, 3);
2819 if (TARGET_64BIT)
2820 insn = gen_tls_ld_64 (r3, got);
2821 else
2822 insn = gen_tls_ld_32 (r3, got);
2823 start_sequence ();
2824 emit_insn (insn);
2825 tga = gen_rtx_MEM (Pmode, rs6000_tls_get_addr ());
2826 insn = gen_call_value (r3, tga, const0_rtx, const0_rtx);
2827 insn = emit_call_insn (insn);
2828 CONST_OR_PURE_CALL_P (insn) = 1;
2829 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), r3);
2830 insn = get_insns ();
2831 end_sequence ();
2832 tmp1 = gen_reg_rtx (Pmode);
2833 eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
2834 UNSPEC_TLSLD);
2835 emit_libcall_block (insn, tmp1, r3, eqv);
2836 if (rs6000_tls_size == 16)
2837 {
2838 if (TARGET_64BIT)
2839 insn = gen_tls_dtprel_64 (dest, tmp1, addr);
2840 else
2841 insn = gen_tls_dtprel_32 (dest, tmp1, addr);
2842 }
2843 else if (rs6000_tls_size == 32)
2844 {
2845 tmp2 = gen_reg_rtx (Pmode);
2846 if (TARGET_64BIT)
2847 insn = gen_tls_dtprel_ha_64 (tmp2, tmp1, addr);
2848 else
2849 insn = gen_tls_dtprel_ha_32 (tmp2, tmp1, addr);
2850 emit_insn (insn);
2851 if (TARGET_64BIT)
2852 insn = gen_tls_dtprel_lo_64 (dest, tmp2, addr);
2853 else
2854 insn = gen_tls_dtprel_lo_32 (dest, tmp2, addr);
2855 }
2856 else
2857 {
2858 tmp2 = gen_reg_rtx (Pmode);
2859 if (TARGET_64BIT)
2860 insn = gen_tls_got_dtprel_64 (tmp2, got, addr);
2861 else
2862 insn = gen_tls_got_dtprel_32 (tmp2, got, addr);
2863 emit_insn (insn);
2864 insn = gen_rtx_SET (Pmode, dest,
2865 gen_rtx_PLUS (Pmode, tmp2, tmp1));
2866 }
2867 emit_insn (insn);
2868 }
2869 else
2870 {
2871 /* IE, or 64 bit offset LE. */
2872 tmp2 = gen_reg_rtx (Pmode);
2873 if (TARGET_64BIT)
2874 insn = gen_tls_got_tprel_64 (tmp2, got, addr);
2875 else
2876 insn = gen_tls_got_tprel_32 (tmp2, got, addr);
2877 emit_insn (insn);
2878 if (TARGET_64BIT)
2879 insn = gen_tls_tls_64 (dest, tmp2, addr);
2880 else
2881 insn = gen_tls_tls_32 (dest, tmp2, addr);
2882 emit_insn (insn);
2883 }
2884 }
2885
2886 return dest;
2887}
2888
2889/* Return 1 if X is a SYMBOL_REF for a TLS symbol. This is used in
2890 instruction definitions. */
2891
2892int
2893rs6000_tls_symbol_ref (x, mode)
2894 rtx x;
2895 enum machine_mode mode ATTRIBUTE_UNUSED;
2896{
2897 return RS6000_SYMBOL_REF_TLS_P (x);
2898}
2899
2900/* Return 1 if X contains a thread-local symbol. */
2901
2902bool
2903rs6000_tls_referenced_p (x)
2904 rtx x;
2905{
2906 return for_each_rtx (&x, &rs6000_tls_symbol_ref_1, 0);
2907}
2908
2909/* Return 1 if *X is a thread-local symbol. This is the same as
2910 rs6000_tls_symbol_ref except for the type of the unused argument. */
2911
2912static inline int
2913rs6000_tls_symbol_ref_1 (x, data)
2914 rtx *x;
2915 void *data ATTRIBUTE_UNUSED;
2916{
2917 return RS6000_SYMBOL_REF_TLS_P (*x);
2918}
2919
24ea750e
DJ
2920/* The convention appears to be to define this wherever it is used.
2921 With legitimize_reload_address now defined here, REG_MODE_OK_FOR_BASE_P
2922 is now used here. */
2923#ifndef REG_MODE_OK_FOR_BASE_P
2924#define REG_MODE_OK_FOR_BASE_P(REGNO, MODE) REG_OK_FOR_BASE_P (REGNO)
2925#endif
2926
2927/* Our implementation of LEGITIMIZE_RELOAD_ADDRESS. Returns a value to
2928 replace the input X, or the original X if no replacement is called for.
2929 The output parameter *WIN is 1 if the calling macro should goto WIN,
2930 0 if it should not.
2931
2932 For RS/6000, we wish to handle large displacements off a base
2933 register by splitting the addend across an addiu/addis and the mem insn.
2934 This cuts number of extra insns needed from 3 to 1.
2935
2936 On Darwin, we use this to generate code for floating point constants.
2937 A movsf_low is generated so we wind up with 2 instructions rather than 3.
2938 The Darwin code is inside #if TARGET_MACHO because only then is
2939 machopic_function_base_name() defined. */
2940rtx
2941rs6000_legitimize_reload_address (x, mode, opnum, type, ind_levels, win)
2942 rtx x;
2943 enum machine_mode mode;
2944 int opnum;
2945 int type;
2946 int ind_levels ATTRIBUTE_UNUSED;
2947 int *win;
2948{
2949 /* We must recognize output that we have already generated ourselves. */
2950 if (GET_CODE (x) == PLUS
2951 && GET_CODE (XEXP (x, 0)) == PLUS
2952 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
2953 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2954 && GET_CODE (XEXP (x, 1)) == CONST_INT)
2955 {
2956 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
2957 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
2958 opnum, (enum reload_type)type);
2959 *win = 1;
2960 return x;
2961 }
3deb2758 2962
24ea750e
DJ
2963#if TARGET_MACHO
2964 if (DEFAULT_ABI == ABI_DARWIN && flag_pic
2965 && GET_CODE (x) == LO_SUM
2966 && GET_CODE (XEXP (x, 0)) == PLUS
2967 && XEXP (XEXP (x, 0), 0) == pic_offset_table_rtx
2968 && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
2969 && GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 0)) == CONST
2970 && XEXP (XEXP (XEXP (x, 0), 1), 0) == XEXP (x, 1)
2971 && GET_CODE (XEXP (XEXP (x, 1), 0)) == MINUS
2972 && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 0)) == SYMBOL_REF
2973 && GET_CODE (XEXP (XEXP (XEXP (x, 1), 0), 1)) == SYMBOL_REF)
2974 {
2975 /* Result of previous invocation of this function on Darwin
6f317ef3 2976 floating point constant. */
24ea750e
DJ
2977 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
2978 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
2979 opnum, (enum reload_type)type);
2980 *win = 1;
2981 return x;
2982 }
2983#endif
2984 if (GET_CODE (x) == PLUS
2985 && GET_CODE (XEXP (x, 0)) == REG
2986 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
2987 && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
78c875e8 2988 && GET_CODE (XEXP (x, 1)) == CONST_INT
93638d7a 2989 && !SPE_VECTOR_MODE (mode)
78c875e8 2990 && !ALTIVEC_VECTOR_MODE (mode))
24ea750e
DJ
2991 {
2992 HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
2993 HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
2994 HOST_WIDE_INT high
2995 = (((val - low) & 0xffffffff) ^ 0x80000000) - 0x80000000;
2996
2997 /* Check for 32-bit overflow. */
2998 if (high + low != val)
2999 {
3000 *win = 0;
3001 return x;
3002 }
3003
3004 /* Reload the high part into a base reg; leave the low part
3005 in the mem directly. */
3006
3007 x = gen_rtx_PLUS (GET_MODE (x),
3008 gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
3009 GEN_INT (high)),
3010 GEN_INT (low));
3011
3012 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3013 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3014 opnum, (enum reload_type)type);
3015 *win = 1;
3016 return x;
3017 }
3018#if TARGET_MACHO
3019 if (GET_CODE (x) == SYMBOL_REF
3020 && DEFAULT_ABI == ABI_DARWIN
69ef87e2 3021 && !ALTIVEC_VECTOR_MODE (mode)
24ea750e
DJ
3022 && flag_pic)
3023 {
3024 /* Darwin load of floating point constant. */
3025 rtx offset = gen_rtx (CONST, Pmode,
3026 gen_rtx (MINUS, Pmode, x,
3027 gen_rtx (SYMBOL_REF, Pmode,
3028 machopic_function_base_name ())));
3029 x = gen_rtx (LO_SUM, GET_MODE (x),
3030 gen_rtx (PLUS, Pmode, pic_offset_table_rtx,
3031 gen_rtx (HIGH, Pmode, offset)), offset);
3032 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3033 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
3034 opnum, (enum reload_type)type);
3035 *win = 1;
3036 return x;
3037 }
ab82a49f
AP
3038 if (GET_CODE (x) == SYMBOL_REF
3039 && DEFAULT_ABI == ABI_DARWIN
3040 && !ALTIVEC_VECTOR_MODE (mode)
3041 && MACHO_DYNAMIC_NO_PIC_P)
3042 {
3043 /* Darwin load of floating point constant. */
3044 x = gen_rtx (LO_SUM, GET_MODE (x),
3045 gen_rtx (HIGH, Pmode, x), x);
3046 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3047 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
3048 opnum, (enum reload_type)type);
3049 *win = 1;
3050 return x;
3051 }
24ea750e
DJ
3052#endif
3053 if (TARGET_TOC
4d588c14 3054 && constant_pool_expr_p (x)
c1f11548 3055 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
24ea750e
DJ
3056 {
3057 (x) = create_TOC_reference (x);
3058 *win = 1;
3059 return x;
3060 }
3061 *win = 0;
3062 return x;
3063}
3064
258bfae2
FS
3065/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
3066 that is a valid memory address for an instruction.
3067 The MODE argument is the machine mode for the MEM expression
3068 that wants to use this address.
3069
3070 On the RS/6000, there are four valid address: a SYMBOL_REF that
3071 refers to a constant pool entry of an address (or the sum of it
3072 plus a constant), a short (16-bit signed) constant plus a register,
3073 the sum of two registers, or a register indirect, possibly with an
5bdc5878 3074 auto-increment. For DFmode and DImode with a constant plus register,
258bfae2
FS
3075 we must ensure that both words are addressable or PowerPC64 with offset
3076 word aligned.
3077
3078 For modes spanning multiple registers (DFmode in 32-bit GPRs,
3079 32-bit DImode, TImode), indexed addressing cannot be used because
3080 adjacent memory cells are accessed by adding word-sized offsets
3081 during assembly output. */
3082int
3083rs6000_legitimate_address (mode, x, reg_ok_strict)
3084 enum machine_mode mode;
3085 rtx x;
3086 int reg_ok_strict;
3087{
c4501e62
JJ
3088 if (RS6000_SYMBOL_REF_TLS_P (x))
3089 return 0;
4d588c14 3090 if (legitimate_indirect_address_p (x, reg_ok_strict))
258bfae2
FS
3091 return 1;
3092 if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
0d6d6892 3093 && !ALTIVEC_VECTOR_MODE (mode)
a3170dc6 3094 && !SPE_VECTOR_MODE (mode)
258bfae2 3095 && TARGET_UPDATE
4d588c14 3096 && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict))
258bfae2 3097 return 1;
4d588c14 3098 if (legitimate_small_data_p (mode, x))
258bfae2 3099 return 1;
4d588c14 3100 if (legitimate_constant_pool_address_p (x))
258bfae2
FS
3101 return 1;
3102 /* If not REG_OK_STRICT (before reload) let pass any stack offset. */
3103 if (! reg_ok_strict
3104 && GET_CODE (x) == PLUS
3105 && GET_CODE (XEXP (x, 0)) == REG
3106 && XEXP (x, 0) == virtual_stack_vars_rtx
3107 && GET_CODE (XEXP (x, 1)) == CONST_INT)
3108 return 1;
4d588c14 3109 if (legitimate_offset_address_p (mode, x, reg_ok_strict))
258bfae2
FS
3110 return 1;
3111 if (mode != TImode
a3170dc6
AH
3112 && ((TARGET_HARD_FLOAT && TARGET_FPRS)
3113 || TARGET_POWERPC64
fcce224d 3114 || (mode != DFmode && mode != TFmode))
258bfae2 3115 && (TARGET_POWERPC64 || mode != DImode)
4d588c14 3116 && legitimate_indexed_address_p (x, reg_ok_strict))
258bfae2 3117 return 1;
4d588c14 3118 if (legitimate_lo_sum_address_p (mode, x, reg_ok_strict))
258bfae2
FS
3119 return 1;
3120 return 0;
3121}
4d588c14
RH
3122
3123/* Go to LABEL if ADDR (a legitimate address expression)
3124 has an effect that depends on the machine mode it is used for.
3125
3126 On the RS/6000 this is true of all integral offsets (since AltiVec
3127 modes don't allow them) or is a pre-increment or decrement.
3128
3129 ??? Except that due to conceptual problems in offsettable_address_p
3130 we can't really report the problems of integral offsets. So leave
3131 this assuming that the adjustable offset must be valid for the
3132 sub-words of a TFmode operand, which is what we had before. */
3133
3134bool
3135rs6000_mode_dependent_address (addr)
3136 rtx addr;
3137{
3138 switch (GET_CODE (addr))
3139 {
3140 case PLUS:
3141 if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
3142 {
3143 unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
3144 return val + 12 + 0x8000 >= 0x10000;
3145 }
3146 break;
3147
3148 case LO_SUM:
3149 return true;
3150
3151 case PRE_INC:
3152 case PRE_DEC:
3153 return TARGET_UPDATE;
3154
3155 default:
3156 break;
3157 }
3158
3159 return false;
3160}
fb4d4348 3161\f
a4f6c312
SS
3162/* Try to output insns to set TARGET equal to the constant C if it can
3163 be done in less than N insns. Do all computations in MODE.
3164 Returns the place where the output has been placed if it can be
3165 done and the insns have been emitted. If it would take more than N
3166 insns, zero is returned and no insns and emitted. */
2bfcf297
DB
3167
3168rtx
3169rs6000_emit_set_const (dest, mode, source, n)
3170 rtx dest, source;
3171 enum machine_mode mode;
3172 int n ATTRIBUTE_UNUSED;
3173{
af8cb5c5 3174 rtx result, insn, set;
2bfcf297
DB
3175 HOST_WIDE_INT c0, c1;
3176
af8cb5c5 3177 if (mode == QImode || mode == HImode)
2bfcf297
DB
3178 {
3179 if (dest == NULL)
3180 dest = gen_reg_rtx (mode);
3181 emit_insn (gen_rtx_SET (VOIDmode, dest, source));
3182 return dest;
3183 }
af8cb5c5 3184 else if (mode == SImode)
2bfcf297 3185 {
af8cb5c5
DE
3186 result = no_new_pseudos ? dest : gen_reg_rtx (SImode);
3187
3188 emit_insn (gen_rtx_SET (VOIDmode, result,
3189 GEN_INT (INTVAL (source)
3190 & (~ (HOST_WIDE_INT) 0xffff))));
3191 emit_insn (gen_rtx_SET (VOIDmode, dest,
3192 gen_rtx_IOR (SImode, result,
3193 GEN_INT (INTVAL (source) & 0xffff))));
3194 result = dest;
2bfcf297 3195 }
af8cb5c5 3196 else if (mode == DImode)
2bfcf297 3197 {
af8cb5c5
DE
3198 if (GET_CODE (source) == CONST_INT)
3199 {
3200 c0 = INTVAL (source);
3201 c1 = -(c0 < 0);
3202 }
3203 else if (GET_CODE (source) == CONST_DOUBLE)
3204 {
2bfcf297 3205#if HOST_BITS_PER_WIDE_INT >= 64
af8cb5c5
DE
3206 c0 = CONST_DOUBLE_LOW (source);
3207 c1 = -(c0 < 0);
2bfcf297 3208#else
af8cb5c5
DE
3209 c0 = CONST_DOUBLE_LOW (source);
3210 c1 = CONST_DOUBLE_HIGH (source);
2bfcf297 3211#endif
af8cb5c5
DE
3212 }
3213 else
3214 abort ();
3215
3216 result = rs6000_emit_set_long_const (dest, c0, c1);
2bfcf297
DB
3217 }
3218 else
a4f6c312 3219 abort ();
2bfcf297 3220
af8cb5c5
DE
3221 insn = get_last_insn ();
3222 set = single_set (insn);
3223 if (! CONSTANT_P (SET_SRC (set)))
3224 set_unique_reg_note (insn, REG_EQUAL, source);
3225
3226 return result;
2bfcf297
DB
3227}
3228
3229/* Having failed to find a 3 insn sequence in rs6000_emit_set_const,
3230 fall back to a straight forward decomposition. We do this to avoid
3231 exponential run times encountered when looking for longer sequences
3232 with rs6000_emit_set_const. */
3233static rtx
3234rs6000_emit_set_long_const (dest, c1, c2)
3235 rtx dest;
3236 HOST_WIDE_INT c1, c2;
3237{
3238 if (!TARGET_POWERPC64)
3239 {
3240 rtx operand1, operand2;
3241
3242 operand1 = operand_subword_force (dest, WORDS_BIG_ENDIAN == 0,
3243 DImode);
3244 operand2 = operand_subword_force (dest, WORDS_BIG_ENDIAN != 0,
3245 DImode);
3246 emit_move_insn (operand1, GEN_INT (c1));
3247 emit_move_insn (operand2, GEN_INT (c2));
3248 }
3249 else
3250 {
bc06712d 3251 HOST_WIDE_INT ud1, ud2, ud3, ud4;
252b88f7 3252
bc06712d
TR
3253 ud1 = c1 & 0xffff;
3254 ud2 = (c1 & 0xffff0000) >> 16;
2bfcf297 3255#if HOST_BITS_PER_WIDE_INT >= 64
bc06712d 3256 c2 = c1 >> 32;
2bfcf297 3257#endif
bc06712d
TR
3258 ud3 = c2 & 0xffff;
3259 ud4 = (c2 & 0xffff0000) >> 16;
2bfcf297 3260
bc06712d
TR
3261 if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
3262 || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
2bfcf297 3263 {
bc06712d
TR
3264 if (ud1 & 0x8000)
3265 emit_move_insn (dest, GEN_INT (((ud1 ^ 0x8000) - 0x8000)));
3266 else
3267 emit_move_insn (dest, GEN_INT (ud1));
2bfcf297 3268 }
2bfcf297 3269
bc06712d
TR
3270 else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
3271 || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
252b88f7 3272 {
bc06712d
TR
3273 if (ud2 & 0x8000)
3274 emit_move_insn (dest, GEN_INT (((ud2 << 16) ^ 0x80000000)
3275 - 0x80000000));
252b88f7 3276 else
bc06712d
TR
3277 emit_move_insn (dest, GEN_INT (ud2 << 16));
3278 if (ud1 != 0)
3279 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
252b88f7 3280 }
bc06712d
TR
3281 else if ((ud4 == 0xffff && (ud3 & 0x8000))
3282 || (ud4 == 0 && ! (ud3 & 0x8000)))
3283 {
3284 if (ud3 & 0x8000)
3285 emit_move_insn (dest, GEN_INT (((ud3 << 16) ^ 0x80000000)
3286 - 0x80000000));
3287 else
3288 emit_move_insn (dest, GEN_INT (ud3 << 16));
3289
3290 if (ud2 != 0)
3291 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud2)));
3292 emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (16)));
3293 if (ud1 != 0)
3294 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
3295 }
3296 else
3297 {
3298 if (ud4 & 0x8000)
3299 emit_move_insn (dest, GEN_INT (((ud4 << 16) ^ 0x80000000)
3300 - 0x80000000));
3301 else
3302 emit_move_insn (dest, GEN_INT (ud4 << 16));
3303
3304 if (ud3 != 0)
3305 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud3)));
2bfcf297 3306
bc06712d
TR
3307 emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (32)));
3308 if (ud2 != 0)
3309 emit_move_insn (dest, gen_rtx_IOR (DImode, dest,
3310 GEN_INT (ud2 << 16)));
3311 if (ud1 != 0)
3312 emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
3313 }
3314 }
2bfcf297
DB
3315 return dest;
3316}
3317
fb4d4348
GK
3318/* Emit a move from SOURCE to DEST in mode MODE. */
3319void
3320rs6000_emit_move (dest, source, mode)
3321 rtx dest;
3322 rtx source;
3323 enum machine_mode mode;
3324{
3325 rtx operands[2];
3326 operands[0] = dest;
3327 operands[1] = source;
3328
3329 /* Sanity checks. Check that we get CONST_DOUBLE only when we should. */
3330 if (GET_CODE (operands[1]) == CONST_DOUBLE
3331 && ! FLOAT_MODE_P (mode)
3332 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
3333 {
3334 /* FIXME. This should never happen. */
3335 /* Since it seems that it does, do the safe thing and convert
3336 to a CONST_INT. */
2496c7bd 3337 operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), mode);
fb4d4348
GK
3338 }
3339 if (GET_CODE (operands[1]) == CONST_DOUBLE
3340 && ! FLOAT_MODE_P (mode)
3341 && ((CONST_DOUBLE_HIGH (operands[1]) == 0
3342 && CONST_DOUBLE_LOW (operands[1]) >= 0)
3343 || (CONST_DOUBLE_HIGH (operands[1]) == -1
3344 && CONST_DOUBLE_LOW (operands[1]) < 0)))
3345 abort ();
c9e8cb32
DD
3346
3347 /* Check if GCC is setting up a block move that will end up using FP
3348 registers as temporaries. We must make sure this is acceptable. */
3349 if (GET_CODE (operands[0]) == MEM
3350 && GET_CODE (operands[1]) == MEM
3351 && mode == DImode
41543739
GK
3352 && (SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[0]))
3353 || SLOW_UNALIGNED_ACCESS (DImode, MEM_ALIGN (operands[1])))
3354 && ! (SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[0]) > 32
3355 ? 32 : MEM_ALIGN (operands[0])))
3356 || SLOW_UNALIGNED_ACCESS (SImode, (MEM_ALIGN (operands[1]) > 32
3357 ? 32
3358 : MEM_ALIGN (operands[1]))))
3359 && ! MEM_VOLATILE_P (operands [0])
3360 && ! MEM_VOLATILE_P (operands [1]))
c9e8cb32 3361 {
41543739
GK
3362 emit_move_insn (adjust_address (operands[0], SImode, 0),
3363 adjust_address (operands[1], SImode, 0));
3364 emit_move_insn (adjust_address (operands[0], SImode, 4),
3365 adjust_address (operands[1], SImode, 4));
c9e8cb32
DD
3366 return;
3367 }
fb4d4348 3368
67cef334
DE
3369 if (!no_new_pseudos)
3370 {
3371 if (GET_CODE (operands[1]) == MEM && optimize > 0
3372 && (mode == QImode || mode == HImode || mode == SImode)
3373 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (word_mode))
3374 {
3375 rtx reg = gen_reg_rtx (word_mode);
3376
3377 emit_insn (gen_rtx_SET (word_mode, reg,
3378 gen_rtx_ZERO_EXTEND (word_mode,
3379 operands[1])));
3380 operands[1] = gen_lowpart (mode, reg);
3381 }
3382 if (GET_CODE (operands[0]) != REG)
3383 operands[1] = force_reg (mode, operands[1]);
3384 }
a9098fd0 3385
a3170dc6
AH
3386 if (mode == SFmode && ! TARGET_POWERPC
3387 && TARGET_HARD_FLOAT && TARGET_FPRS
ffc14f31 3388 && GET_CODE (operands[0]) == MEM)
fb4d4348 3389 {
ffc14f31
GK
3390 int regnum;
3391
3392 if (reload_in_progress || reload_completed)
3393 regnum = true_regnum (operands[1]);
3394 else if (GET_CODE (operands[1]) == REG)
3395 regnum = REGNO (operands[1]);
3396 else
3397 regnum = -1;
fb4d4348
GK
3398
3399 /* If operands[1] is a register, on POWER it may have
3400 double-precision data in it, so truncate it to single
3401 precision. */
3402 if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
3403 {
3404 rtx newreg;
3405 newreg = (no_new_pseudos ? operands[1] : gen_reg_rtx (mode));
3406 emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
3407 operands[1] = newreg;
3408 }
3409 }
3410
c4501e62
JJ
3411 /* Recognize the case where operand[1] is a reference to thread-local
3412 data and load its address to a register. */
3413 if (GET_CODE (operands[1]) == SYMBOL_REF)
3414 {
3415 enum tls_model model = SYMBOL_REF_TLS_MODEL (operands[1]);
3416 if (model != 0)
3417 operands[1] = rs6000_legitimize_tls_address (operands[1], model);
3418 }
3419
8f4e6caf
RH
3420 /* Handle the case where reload calls us with an invalid address. */
3421 if (reload_in_progress && mode == Pmode
69ef87e2 3422 && (! general_operand (operands[1], mode)
8f4e6caf
RH
3423 || ! nonimmediate_operand (operands[0], mode)))
3424 goto emit_set;
3425
3426 /* Handle the case of CONSTANT_P_RTX. */
3427 if (GET_CODE (operands[1]) == CONSTANT_P_RTX)
3428 goto emit_set;
a9098fd0 3429
fb4d4348
GK
3430 /* FIXME: In the long term, this switch statement should go away
3431 and be replaced by a sequence of tests based on things like
3432 mode == Pmode. */
3433 switch (mode)
3434 {
3435 case HImode:
3436 case QImode:
3437 if (CONSTANT_P (operands[1])
3438 && GET_CODE (operands[1]) != CONST_INT)
a9098fd0 3439 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
3440 break;
3441
06f4e019 3442 case TFmode:
fb4d4348
GK
3443 case DFmode:
3444 case SFmode:
3445 if (CONSTANT_P (operands[1])
3446 && ! easy_fp_constant (operands[1], mode))
a9098fd0 3447 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
3448 break;
3449
0ac081f6
AH
3450 case V16QImode:
3451 case V8HImode:
3452 case V4SFmode:
3453 case V4SImode:
a3170dc6
AH
3454 case V4HImode:
3455 case V2SFmode:
3456 case V2SImode:
00a892b8 3457 case V1DImode:
69ef87e2 3458 if (CONSTANT_P (operands[1])
d744e06e 3459 && !easy_vector_constant (operands[1], mode))
0ac081f6
AH
3460 operands[1] = force_const_mem (mode, operands[1]);
3461 break;
3462
fb4d4348 3463 case SImode:
a9098fd0 3464 case DImode:
fb4d4348
GK
3465 /* Use default pattern for address of ELF small data */
3466 if (TARGET_ELF
a9098fd0 3467 && mode == Pmode
f607bc57 3468 && DEFAULT_ABI == ABI_V4
a9098fd0
GK
3469 && (GET_CODE (operands[1]) == SYMBOL_REF
3470 || GET_CODE (operands[1]) == CONST)
3471 && small_data_operand (operands[1], mode))
fb4d4348
GK
3472 {
3473 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
3474 return;
3475 }
3476
f607bc57 3477 if (DEFAULT_ABI == ABI_V4
a9098fd0
GK
3478 && mode == Pmode && mode == SImode
3479 && flag_pic == 1 && got_operand (operands[1], mode))
fb4d4348
GK
3480 {
3481 emit_insn (gen_movsi_got (operands[0], operands[1]));
3482 return;
3483 }
3484
ee890fe2 3485 if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
f1384257
AM
3486 && TARGET_NO_TOC
3487 && ! flag_pic
a9098fd0 3488 && mode == Pmode
fb4d4348
GK
3489 && CONSTANT_P (operands[1])
3490 && GET_CODE (operands[1]) != HIGH
3491 && GET_CODE (operands[1]) != CONST_INT)
3492 {
a9098fd0 3493 rtx target = (no_new_pseudos ? operands[0] : gen_reg_rtx (mode));
fb4d4348
GK
3494
3495 /* If this is a function address on -mcall-aixdesc,
3496 convert it to the address of the descriptor. */
3497 if (DEFAULT_ABI == ABI_AIX
3498 && GET_CODE (operands[1]) == SYMBOL_REF
3499 && XSTR (operands[1], 0)[0] == '.')
3500 {
3501 const char *name = XSTR (operands[1], 0);
3502 rtx new_ref;
3503 while (*name == '.')
3504 name++;
3505 new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
3506 CONSTANT_POOL_ADDRESS_P (new_ref)
3507 = CONSTANT_POOL_ADDRESS_P (operands[1]);
d1908feb 3508 SYMBOL_REF_FLAGS (new_ref) = SYMBOL_REF_FLAGS (operands[1]);
fb4d4348 3509 SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
d1908feb 3510 SYMBOL_REF_DECL (new_ref) = SYMBOL_REF_DECL (operands[1]);
fb4d4348
GK
3511 operands[1] = new_ref;
3512 }
7509c759 3513
ee890fe2
SS
3514 if (DEFAULT_ABI == ABI_DARWIN)
3515 {
ab82a49f
AP
3516#if TARGET_MACHO
3517 if (MACHO_DYNAMIC_NO_PIC_P)
3518 {
3519 /* Take care of any required data indirection. */
3520 operands[1] = rs6000_machopic_legitimize_pic_address (
3521 operands[1], mode, operands[0]);
3522 if (operands[0] != operands[1])
3523 emit_insn (gen_rtx_SET (VOIDmode,
3524 operands[0], operands[1]));
3525 return;
3526 }
3527#endif
ee890fe2
SS
3528 emit_insn (gen_macho_high (target, operands[1]));
3529 emit_insn (gen_macho_low (operands[0], target, operands[1]));
3530 return;
3531 }
3532
fb4d4348
GK
3533 emit_insn (gen_elf_high (target, operands[1]));
3534 emit_insn (gen_elf_low (operands[0], target, operands[1]));
3535 return;
3536 }
3537
a9098fd0
GK
3538 /* If this is a SYMBOL_REF that refers to a constant pool entry,
3539 and we have put it in the TOC, we just need to make a TOC-relative
3540 reference to it. */
3541 if (TARGET_TOC
3542 && GET_CODE (operands[1]) == SYMBOL_REF
4d588c14 3543 && constant_pool_expr_p (operands[1])
a9098fd0
GK
3544 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
3545 get_pool_mode (operands[1])))
fb4d4348 3546 {
a9098fd0 3547 operands[1] = create_TOC_reference (operands[1]);
fb4d4348 3548 }
a9098fd0
GK
3549 else if (mode == Pmode
3550 && CONSTANT_P (operands[1])
38886f37
AO
3551 && ((GET_CODE (operands[1]) != CONST_INT
3552 && ! easy_fp_constant (operands[1], mode))
3553 || (GET_CODE (operands[1]) == CONST_INT
3554 && num_insns_constant (operands[1], mode) > 2)
3555 || (GET_CODE (operands[0]) == REG
3556 && FP_REGNO_P (REGNO (operands[0]))))
a9098fd0 3557 && GET_CODE (operands[1]) != HIGH
4d588c14
RH
3558 && ! legitimate_constant_pool_address_p (operands[1])
3559 && ! toc_relative_expr_p (operands[1]))
fb4d4348
GK
3560 {
3561 /* Emit a USE operation so that the constant isn't deleted if
3562 expensive optimizations are turned on because nobody
3563 references it. This should only be done for operands that
3564 contain SYMBOL_REFs with CONSTANT_POOL_ADDRESS_P set.
3565 This should not be done for operands that contain LABEL_REFs.
3566 For now, we just handle the obvious case. */
3567 if (GET_CODE (operands[1]) != LABEL_REF)
3568 emit_insn (gen_rtx_USE (VOIDmode, operands[1]));
3569
c859cda6 3570#if TARGET_MACHO
ee890fe2 3571 /* Darwin uses a special PIC legitimizer. */
ab82a49f 3572 if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
ee890fe2 3573 {
ee890fe2
SS
3574 operands[1] =
3575 rs6000_machopic_legitimize_pic_address (operands[1], mode,
c859cda6
DJ
3576 operands[0]);
3577 if (operands[0] != operands[1])
3578 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
ee890fe2
SS
3579 return;
3580 }
c859cda6 3581#endif
ee890fe2 3582
fb4d4348
GK
3583 /* If we are to limit the number of things we put in the TOC and
3584 this is a symbol plus a constant we can add in one insn,
3585 just put the symbol in the TOC and add the constant. Don't do
3586 this if reload is in progress. */
3587 if (GET_CODE (operands[1]) == CONST
3588 && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
3589 && GET_CODE (XEXP (operands[1], 0)) == PLUS
a9098fd0 3590 && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
fb4d4348
GK
3591 && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
3592 || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
3593 && ! side_effects_p (operands[0]))
3594 {
a4f6c312
SS
3595 rtx sym =
3596 force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
fb4d4348
GK
3597 rtx other = XEXP (XEXP (operands[1], 0), 1);
3598
a9098fd0
GK
3599 sym = force_reg (mode, sym);
3600 if (mode == SImode)
3601 emit_insn (gen_addsi3 (operands[0], sym, other));
3602 else
3603 emit_insn (gen_adddi3 (operands[0], sym, other));
fb4d4348
GK
3604 return;
3605 }
3606
a9098fd0 3607 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
3608
3609 if (TARGET_TOC
4d588c14 3610 && constant_pool_expr_p (XEXP (operands[1], 0))
d34c5b80
DE
3611 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
3612 get_pool_constant (XEXP (operands[1], 0)),
3613 get_pool_mode (XEXP (operands[1], 0))))
a9098fd0 3614 {
ba4828e0
RK
3615 operands[1]
3616 = gen_rtx_MEM (mode,
3617 create_TOC_reference (XEXP (operands[1], 0)));
3618 set_mem_alias_set (operands[1], get_TOC_alias_set ());
fb4d4348 3619 RTX_UNCHANGING_P (operands[1]) = 1;
a9098fd0 3620 }
fb4d4348
GK
3621 }
3622 break;
a9098fd0 3623
fb4d4348
GK
3624 case TImode:
3625 if (GET_CODE (operands[0]) == MEM
3626 && GET_CODE (XEXP (operands[0], 0)) != REG
3627 && ! reload_in_progress)
792760b9
RK
3628 operands[0]
3629 = replace_equiv_address (operands[0],
3630 copy_addr_to_reg (XEXP (operands[0], 0)));
fb4d4348
GK
3631
3632 if (GET_CODE (operands[1]) == MEM
3633 && GET_CODE (XEXP (operands[1], 0)) != REG
3634 && ! reload_in_progress)
792760b9
RK
3635 operands[1]
3636 = replace_equiv_address (operands[1],
3637 copy_addr_to_reg (XEXP (operands[1], 0)));
27dc0551
DE
3638 if (TARGET_POWER)
3639 {
3640 emit_insn (gen_rtx_PARALLEL (VOIDmode,
3641 gen_rtvec (2,
3642 gen_rtx_SET (VOIDmode,
3643 operands[0], operands[1]),
3644 gen_rtx_CLOBBER (VOIDmode,
3645 gen_rtx_SCRATCH (SImode)))));
3646 return;
3647 }
fb4d4348
GK
3648 break;
3649
3650 default:
3651 abort ();
3652 }
3653
a9098fd0
GK
3654 /* Above, we may have called force_const_mem which may have returned
3655 an invalid address. If we can, fix this up; otherwise, reload will
3656 have to deal with it. */
8f4e6caf
RH
3657 if (GET_CODE (operands[1]) == MEM && ! reload_in_progress)
3658 operands[1] = validize_mem (operands[1]);
a9098fd0 3659
8f4e6caf 3660 emit_set:
fb4d4348
GK
3661 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
3662}
4697a36c
MM
3663\f
3664/* Initialize a variable CUM of type CUMULATIVE_ARGS
3665 for a call to a function whose data type is FNTYPE.
3666 For a library call, FNTYPE is 0.
3667
3668 For incoming args we set the number of arguments in the prototype large
1c20ae99 3669 so we never return a PARALLEL. */
4697a36c
MM
3670
3671void
b9599e46 3672init_cumulative_args (cum, fntype, libname, incoming, libcall)
4697a36c
MM
3673 CUMULATIVE_ARGS *cum;
3674 tree fntype;
296b8152 3675 rtx libname ATTRIBUTE_UNUSED;
4697a36c 3676 int incoming;
b9599e46 3677 int libcall;
4697a36c
MM
3678{
3679 static CUMULATIVE_ARGS zero_cumulative;
3680
3681 *cum = zero_cumulative;
3682 cum->words = 0;
3683 cum->fregno = FP_ARG_MIN_REG;
0ac081f6 3684 cum->vregno = ALTIVEC_ARG_MIN_REG;
4697a36c 3685 cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
ddcc8263
DE
3686 cum->call_cookie = ((DEFAULT_ABI == ABI_V4 && libcall)
3687 ? CALL_LIBCALL : CALL_NORMAL);
4cc833b7 3688 cum->sysv_gregno = GP_ARG_MIN_REG;
a6c9bed4
AH
3689 cum->stdarg = fntype
3690 && (TYPE_ARG_TYPES (fntype) != 0
3691 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
3692 != void_type_node));
4697a36c
MM
3693
3694 if (incoming)
bd227acc 3695 cum->nargs_prototype = 1000; /* don't return a PARALLEL */
4697a36c
MM
3696
3697 else if (cum->prototype)
3698 cum->nargs_prototype = (list_length (TYPE_ARG_TYPES (fntype)) - 1
3699 + (TYPE_MODE (TREE_TYPE (fntype)) == BLKmode
3700 || RETURN_IN_MEMORY (TREE_TYPE (fntype))));
3701
3702 else
3703 cum->nargs_prototype = 0;
3704
3705 cum->orig_nargs = cum->nargs_prototype;
7509c759 3706
a5c76ee6
ZW
3707 /* Check for a longcall attribute. */
3708 if (fntype
3709 && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
3710 && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype)))
6a4cee5f
MM
3711 cum->call_cookie = CALL_LONG;
3712
4697a36c
MM
3713 if (TARGET_DEBUG_ARG)
3714 {
3715 fprintf (stderr, "\ninit_cumulative_args:");
3716 if (fntype)
3717 {
3718 tree ret_type = TREE_TYPE (fntype);
3719 fprintf (stderr, " ret code = %s,",
3720 tree_code_name[ (int)TREE_CODE (ret_type) ]);
3721 }
3722
6a4cee5f
MM
3723 if (cum->call_cookie & CALL_LONG)
3724 fprintf (stderr, " longcall,");
3725
4697a36c
MM
3726 fprintf (stderr, " proto = %d, nargs = %d\n",
3727 cum->prototype, cum->nargs_prototype);
3728 }
3729}
3730\f
c229cba9
DE
3731/* If defined, a C expression which determines whether, and in which
3732 direction, to pad out an argument with extra space. The value
3733 should be of type `enum direction': either `upward' to pad above
3734 the argument, `downward' to pad below, or `none' to inhibit
3735 padding.
3736
3737 For the AIX ABI structs are always stored left shifted in their
3738 argument slot. */
3739
9ebbca7d 3740enum direction
c229cba9
DE
3741function_arg_padding (mode, type)
3742 enum machine_mode mode;
3743 tree type;
3744{
c85f7c16 3745 if (type != 0 && AGGREGATE_TYPE_P (type))
9ebbca7d 3746 return upward;
c229cba9
DE
3747
3748 /* This is the default definition. */
3749 return (! BYTES_BIG_ENDIAN
02ca7595
DE
3750 ? upward
3751 : ((mode == BLKmode
3752 ? (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
3753 && int_size_in_bytes (type) < (PARM_BOUNDARY / BITS_PER_UNIT))
3754 : GET_MODE_BITSIZE (mode) < PARM_BOUNDARY)
3755 ? downward : upward));
c229cba9
DE
3756}
3757
b6c9286a
MM
3758/* If defined, a C expression that gives the alignment boundary, in bits,
3759 of an argument with the specified mode and type. If it is not defined,
3760 PARM_BOUNDARY is used for all arguments.
3761
2310f99a 3762 V.4 wants long longs to be double word aligned. */
b6c9286a
MM
3763
3764int
3765function_arg_boundary (mode, type)
3766 enum machine_mode mode;
9ebbca7d 3767 tree type ATTRIBUTE_UNUSED;
b6c9286a 3768{
f607bc57 3769 if (DEFAULT_ABI == ABI_V4 && (mode == DImode || mode == DFmode))
e1f83b4d 3770 return 64;
a3170dc6
AH
3771 else if (SPE_VECTOR_MODE (mode))
3772 return 64;
0ac081f6
AH
3773 else if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
3774 return 128;
9ebbca7d 3775 else
b6c9286a 3776 return PARM_BOUNDARY;
b6c9286a
MM
3777}
3778\f
4697a36c
MM
3779/* Update the data in CUM to advance over an argument
3780 of mode MODE and data type TYPE.
3781 (TYPE is null for libcalls where that information may not be available.) */
3782
3783void
3784function_arg_advance (cum, mode, type, named)
3785 CUMULATIVE_ARGS *cum;
3786 enum machine_mode mode;
3787 tree type;
3788 int named;
3789{
3790 cum->nargs_prototype--;
3791
0ac081f6
AH
3792 if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
3793 {
3794 if (cum->vregno <= ALTIVEC_ARG_MAX_REG && cum->nargs_prototype >= 0)
3795 cum->vregno++;
3796 else
3797 cum->words += RS6000_ARG_SIZE (mode, type);
3798 }
a4b0320c 3799 else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode)
a6c9bed4
AH
3800 && !cum->stdarg
3801 && cum->sysv_gregno <= GP_ARG_MAX_REG)
a4b0320c 3802 cum->sysv_gregno++;
f607bc57 3803 else if (DEFAULT_ABI == ABI_V4)
4697a36c 3804 {
a3170dc6 3805 if (TARGET_HARD_FLOAT && TARGET_FPRS
4cc833b7 3806 && (mode == SFmode || mode == DFmode))
4697a36c 3807 {
4cc833b7
RH
3808 if (cum->fregno <= FP_ARG_V4_MAX_REG)
3809 cum->fregno++;
3810 else
3811 {
3812 if (mode == DFmode)
3813 cum->words += cum->words & 1;
d34c5b80 3814 cum->words += RS6000_ARG_SIZE (mode, type);
4cc833b7 3815 }
4697a36c 3816 }
4cc833b7
RH
3817 else
3818 {
3819 int n_words;
3820 int gregno = cum->sysv_gregno;
3821
3822 /* Aggregates and IEEE quad get passed by reference. */
3823 if ((type && AGGREGATE_TYPE_P (type))
3824 || mode == TFmode)
3825 n_words = 1;
3826 else
d34c5b80 3827 n_words = RS6000_ARG_SIZE (mode, type);
4cc833b7 3828
a4b0320c 3829 /* Long long and SPE vectors are put in odd registers. */
4cc833b7
RH
3830 if (n_words == 2 && (gregno & 1) == 0)
3831 gregno += 1;
3832
a4b0320c
AH
3833 /* Long long and SPE vectors are not split between registers
3834 and stack. */
4cc833b7
RH
3835 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
3836 {
3837 /* Long long is aligned on the stack. */
3838 if (n_words == 2)
3839 cum->words += cum->words & 1;
3840 cum->words += n_words;
3841 }
4697a36c 3842
4cc833b7
RH
3843 /* Note: continuing to accumulate gregno past when we've started
3844 spilling to the stack indicates the fact that we've started
3845 spilling to the stack to expand_builtin_saveregs. */
3846 cum->sysv_gregno = gregno + n_words;
3847 }
4697a36c 3848
4cc833b7
RH
3849 if (TARGET_DEBUG_ARG)
3850 {
3851 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
3852 cum->words, cum->fregno);
3853 fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
3854 cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
3855 fprintf (stderr, "mode = %4s, named = %d\n",
3856 GET_MODE_NAME (mode), named);
3857 }
4697a36c
MM
3858 }
3859 else
4cc833b7
RH
3860 {
3861 int align = (TARGET_32BIT && (cum->words & 1) != 0
3862 && function_arg_boundary (mode, type) == 64) ? 1 : 0;
a4f6c312 3863
d34c5b80 3864 cum->words += align + RS6000_ARG_SIZE (mode, type);
4697a36c 3865
a3170dc6
AH
3866 if (GET_MODE_CLASS (mode) == MODE_FLOAT
3867 && TARGET_HARD_FLOAT && TARGET_FPRS)
fcce224d 3868 cum->fregno += (mode == TFmode ? 2 : 1);
4cc833b7
RH
3869
3870 if (TARGET_DEBUG_ARG)
3871 {
3872 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
3873 cum->words, cum->fregno);
3874 fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
3875 cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
3876 fprintf (stderr, "named = %d, align = %d\n", named, align);
3877 }
3878 }
4697a36c 3879}
a6c9bed4
AH
3880
3881/* Determine where to put a SIMD argument on the SPE. */
3882static rtx
3883rs6000_spe_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type)
3884{
3885 if (cum->stdarg)
3886 {
3887 int gregno = cum->sysv_gregno;
3888 int n_words = RS6000_ARG_SIZE (mode, type);
3889
3890 /* SPE vectors are put in odd registers. */
3891 if (n_words == 2 && (gregno & 1) == 0)
3892 gregno += 1;
3893
3894 if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
3895 {
3896 rtx r1, r2;
3897 enum machine_mode m = SImode;
3898
3899 r1 = gen_rtx_REG (m, gregno);
3900 r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
3901 r2 = gen_rtx_REG (m, gregno + 1);
3902 r2 = gen_rtx_EXPR_LIST (m, r2, GEN_INT (4));
3903 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
3904 }
3905 else
3906 return NULL;
3907 }
3908 else
3909 {
3910 if (cum->sysv_gregno <= GP_ARG_MAX_REG)
3911 return gen_rtx_REG (mode, cum->sysv_gregno);
3912 else
3913 return NULL;
3914 }
3915}
3916
4697a36c
MM
3917/* Determine where to put an argument to a function.
3918 Value is zero to push the argument on the stack,
3919 or a hard register in which to store the argument.
3920
3921 MODE is the argument's machine mode.
3922 TYPE is the data type of the argument (as a tree).
3923 This is null for libcalls where that information may
3924 not be available.
3925 CUM is a variable of type CUMULATIVE_ARGS which gives info about
3926 the preceding args and about the function being called.
3927 NAMED is nonzero if this argument is a named parameter
3928 (otherwise it is an extra parameter matching an ellipsis).
3929
3930 On RS/6000 the first eight words of non-FP are normally in registers
3931 and the rest are pushed. Under AIX, the first 13 FP args are in registers.
3932 Under V.4, the first 8 FP args are in registers.
3933
3934 If this is floating-point and no prototype is specified, we use
3935 both an FP and integer register (or possibly FP reg and stack). Library
b9599e46 3936 functions (when CALL_LIBCALL is set) always have the proper types for args,
4697a36c 3937 so we can pass the FP value just in one register. emit_library_function
1c20ae99 3938 doesn't support PARALLEL anyway. */
4697a36c
MM
3939
3940struct rtx_def *
3941function_arg (cum, mode, type, named)
3942 CUMULATIVE_ARGS *cum;
3943 enum machine_mode mode;
3944 tree type;
20c29ebe 3945 int named;
4697a36c 3946{
4cc833b7 3947 enum rs6000_abi abi = DEFAULT_ABI;
4697a36c 3948
a4f6c312
SS
3949 /* Return a marker to indicate whether CR1 needs to set or clear the
3950 bit that V.4 uses to say fp args were passed in registers.
3951 Assume that we don't need the marker for software floating point,
3952 or compiler generated library calls. */
4697a36c
MM
3953 if (mode == VOIDmode)
3954 {
f607bc57 3955 if (abi == ABI_V4
7509c759 3956 && cum->nargs_prototype < 0
b9599e46
FS
3957 && (cum->call_cookie & CALL_LIBCALL) == 0
3958 && (cum->prototype || TARGET_NO_PROTOTYPE))
7509c759 3959 {
a3170dc6
AH
3960 /* For the SPE, we need to crxor CR6 always. */
3961 if (TARGET_SPE_ABI)
3962 return GEN_INT (cum->call_cookie | CALL_V4_SET_FP_ARGS);
3963 else if (TARGET_HARD_FLOAT && TARGET_FPRS)
3964 return GEN_INT (cum->call_cookie
3965 | ((cum->fregno == FP_ARG_MIN_REG)
3966 ? CALL_V4_SET_FP_ARGS
3967 : CALL_V4_CLEAR_FP_ARGS));
7509c759 3968 }
4697a36c 3969
7509c759 3970 return GEN_INT (cum->call_cookie);
4697a36c
MM
3971 }
3972
0ac081f6
AH
3973 if (TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
3974 {
20c29ebe 3975 if (named && cum->vregno <= ALTIVEC_ARG_MAX_REG)
0ac081f6
AH
3976 return gen_rtx_REG (mode, cum->vregno);
3977 else
3978 return NULL;
3979 }
a6c9bed4
AH
3980 else if (TARGET_SPE_ABI && TARGET_SPE && SPE_VECTOR_MODE (mode))
3981 return rs6000_spe_function_arg (cum, mode, type);
f607bc57 3982 else if (abi == ABI_V4)
4697a36c 3983 {
a3170dc6 3984 if (TARGET_HARD_FLOAT && TARGET_FPRS
4cc833b7
RH
3985 && (mode == SFmode || mode == DFmode))
3986 {
3987 if (cum->fregno <= FP_ARG_V4_MAX_REG)
3988 return gen_rtx_REG (mode, cum->fregno);
3989 else
3990 return NULL;
3991 }
3992 else
3993 {
3994 int n_words;
3995 int gregno = cum->sysv_gregno;
3996
3997 /* Aggregates and IEEE quad get passed by reference. */
3998 if ((type && AGGREGATE_TYPE_P (type))
3999 || mode == TFmode)
4000 n_words = 1;
4001 else
d34c5b80 4002 n_words = RS6000_ARG_SIZE (mode, type);
4cc833b7 4003
a4b0320c 4004 /* Long long and SPE vectors are put in odd registers. */
4cc833b7
RH
4005 if (n_words == 2 && (gregno & 1) == 0)
4006 gregno += 1;
4007
a6c9bed4 4008 /* Long long do not split between registers and stack. */
4cc833b7 4009 if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
a6c9bed4 4010 return gen_rtx_REG (mode, gregno);
4cc833b7
RH
4011 else
4012 return NULL;
4013 }
4697a36c 4014 }
4cc833b7
RH
4015 else
4016 {
4017 int align = (TARGET_32BIT && (cum->words & 1) != 0
4018 && function_arg_boundary (mode, type) == 64) ? 1 : 0;
4019 int align_words = cum->words + align;
4697a36c 4020
4cc833b7
RH
4021 if (type && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
4022 return NULL_RTX;
4023
4024 if (USE_FP_FOR_ARG_P (*cum, mode, type))
4025 {
4026 if (! type
4027 || ((cum->nargs_prototype > 0)
4028 /* IBM AIX extended its linkage convention definition always
4029 to require FP args after register save area hole on the
4030 stack. */
4031 && (DEFAULT_ABI != ABI_AIX
4032 || ! TARGET_XL_CALL
4033 || (align_words < GP_ARG_NUM_REG))))
4034 return gen_rtx_REG (mode, cum->fregno);
4035
4036 return gen_rtx_PARALLEL (mode,
4037 gen_rtvec (2,
39403d82 4038 gen_rtx_EXPR_LIST (VOIDmode,
1c20ae99
JW
4039 ((align_words >= GP_ARG_NUM_REG)
4040 ? NULL_RTX
4041 : (align_words
d34c5b80 4042 + RS6000_ARG_SIZE (mode, type)
1c20ae99
JW
4043 > GP_ARG_NUM_REG
4044 /* If this is partially on the stack, then
4045 we only include the portion actually
4046 in registers here. */
39403d82 4047 ? gen_rtx_REG (SImode,
1c20ae99 4048 GP_ARG_MIN_REG + align_words)
39403d82 4049 : gen_rtx_REG (mode,
1c20ae99
JW
4050 GP_ARG_MIN_REG + align_words))),
4051 const0_rtx),
39403d82
DE
4052 gen_rtx_EXPR_LIST (VOIDmode,
4053 gen_rtx_REG (mode, cum->fregno),
1c20ae99 4054 const0_rtx)));
4cc833b7
RH
4055 }
4056 else if (align_words < GP_ARG_NUM_REG)
4057 return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
4058 else
4059 return NULL_RTX;
4697a36c 4060 }
4697a36c
MM
4061}
4062\f
4063/* For an arg passed partly in registers and partly in memory,
4064 this is the number of registers used.
4065 For args passed entirely in registers or entirely in memory, zero. */
4066
4067int
4068function_arg_partial_nregs (cum, mode, type, named)
4069 CUMULATIVE_ARGS *cum;
4070 enum machine_mode mode;
4071 tree type;
d34c5b80 4072 int named ATTRIBUTE_UNUSED;
4697a36c 4073{
f607bc57 4074 if (DEFAULT_ABI == ABI_V4)
4697a36c 4075 return 0;
4697a36c 4076
0ac081f6
AH
4077 if (USE_FP_FOR_ARG_P (*cum, mode, type)
4078 || USE_ALTIVEC_FOR_ARG_P (*cum, mode, type))
4697a36c
MM
4079 {
4080 if (cum->nargs_prototype >= 0)
4081 return 0;
4082 }
4083
4084 if (cum->words < GP_ARG_NUM_REG
d34c5b80 4085 && GP_ARG_NUM_REG < (cum->words + RS6000_ARG_SIZE (mode, type)))
4697a36c
MM
4086 {
4087 int ret = GP_ARG_NUM_REG - cum->words;
4088 if (ret && TARGET_DEBUG_ARG)
4089 fprintf (stderr, "function_arg_partial_nregs: %d\n", ret);
4090
4091 return ret;
4092 }
4093
4094 return 0;
4095}
4096\f
4097/* A C expression that indicates when an argument must be passed by
4098 reference. If nonzero for an argument, a copy of that argument is
4099 made in memory and a pointer to the argument is passed instead of
4100 the argument itself. The pointer is passed in whatever way is
4101 appropriate for passing a pointer to that type.
4102
c8c99a68
DE
4103 Under V.4, structures and unions are passed by reference.
4104
4105 As an extension to all ABIs, variable sized types are passed by
4106 reference. */
4697a36c
MM
4107
4108int
4109function_arg_pass_by_reference (cum, mode, type, named)
296b8152
KG
4110 CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED;
4111 enum machine_mode mode ATTRIBUTE_UNUSED;
4697a36c 4112 tree type;
296b8152 4113 int named ATTRIBUTE_UNUSED;
4697a36c 4114{
f607bc57 4115 if (DEFAULT_ABI == ABI_V4
4cc833b7
RH
4116 && ((type && AGGREGATE_TYPE_P (type))
4117 || mode == TFmode))
4697a36c
MM
4118 {
4119 if (TARGET_DEBUG_ARG)
4120 fprintf (stderr, "function_arg_pass_by_reference: aggregate\n");
4121
4122 return 1;
4123 }
c8c99a68 4124 return type && int_size_in_bytes (type) <= 0;
4697a36c 4125}
4697a36c
MM
4126\f
4127/* Perform any needed actions needed for a function that is receiving a
4128 variable number of arguments.
4129
4130 CUM is as above.
4131
4132 MODE and TYPE are the mode and type of the current parameter.
4133
4134 PRETEND_SIZE is a variable that should be set to the amount of stack
4135 that must be pushed by the prolog to pretend that our caller pushed
4136 it.
4137
4138 Normally, this macro will push all remaining incoming registers on the
4139 stack and set PRETEND_SIZE to the length of the registers pushed. */
4140
4141void
4142setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
4143 CUMULATIVE_ARGS *cum;
4144 enum machine_mode mode;
4145 tree type;
de62b72c 4146 int *pretend_size ATTRIBUTE_UNUSED;
4697a36c
MM
4147 int no_rtl;
4148
4149{
4cc833b7
RH
4150 CUMULATIVE_ARGS next_cum;
4151 int reg_size = TARGET_32BIT ? 4 : 8;
ca5adc63 4152 rtx save_area = NULL_RTX, mem;
dfafc897 4153 int first_reg_offset, set;
d34c5b80
DE
4154 tree fntype;
4155 int stdarg_p;
4697a36c 4156
d34c5b80
DE
4157 fntype = TREE_TYPE (current_function_decl);
4158 stdarg_p = (TYPE_ARG_TYPES (fntype) != 0
4159 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
4160 != void_type_node));
4cc833b7 4161
d34c5b80
DE
4162 /* For varargs, we do not want to skip the dummy va_dcl argument.
4163 For stdargs, we do want to skip the last named argument. */
4164 next_cum = *cum;
4165 if (stdarg_p)
4166 function_arg_advance (&next_cum, mode, type, 1);
4cc833b7 4167
f607bc57 4168 if (DEFAULT_ABI == ABI_V4)
d34c5b80 4169 {
4cc833b7 4170 /* Indicate to allocate space on the stack for varargs save area. */
00dba523 4171 cfun->machine->sysv_varargs_p = 1;
60e2d0ca 4172 if (! no_rtl)
2c4974b7 4173 save_area = plus_constant (virtual_stack_vars_rtx,
bd227acc 4174 - RS6000_VARARGS_SIZE);
4cc833b7
RH
4175
4176 first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
4697a36c 4177 }
60e2d0ca 4178 else
4697a36c 4179 {
d34c5b80 4180 first_reg_offset = next_cum.words;
4cc833b7 4181 save_area = virtual_incoming_args_rtx;
00dba523 4182 cfun->machine->sysv_varargs_p = 0;
4697a36c
MM
4183
4184 if (MUST_PASS_IN_STACK (mode, type))
d34c5b80 4185 first_reg_offset += RS6000_ARG_SIZE (TYPE_MODE (type), type);
4cc833b7 4186 }
4697a36c 4187
dfafc897 4188 set = get_varargs_alias_set ();
c81fc13e 4189 if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG)
4cc833b7 4190 {
dfafc897
FS
4191 mem = gen_rtx_MEM (BLKmode,
4192 plus_constant (save_area,
4193 first_reg_offset * reg_size)),
ba4828e0 4194 set_mem_alias_set (mem, set);
8ac61af7 4195 set_mem_align (mem, BITS_PER_WORD);
dfafc897 4196
c6b97fac
AM
4197 move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem,
4198 GP_ARG_NUM_REG - first_reg_offset);
4697a36c
MM
4199 }
4200
4697a36c 4201 /* Save FP registers if needed. */
f607bc57 4202 if (DEFAULT_ABI == ABI_V4
a3170dc6
AH
4203 && TARGET_HARD_FLOAT && TARGET_FPRS
4204 && ! no_rtl
4cc833b7 4205 && next_cum.fregno <= FP_ARG_V4_MAX_REG)
4697a36c 4206 {
4cc833b7 4207 int fregno = next_cum.fregno;
9ebbca7d 4208 rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
4cc833b7
RH
4209 rtx lab = gen_label_rtx ();
4210 int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG) * 8);
4697a36c 4211
4cc833b7 4212 emit_jump_insn (gen_rtx_SET (VOIDmode,
4697a36c 4213 pc_rtx,
39403d82 4214 gen_rtx_IF_THEN_ELSE (VOIDmode,
4cc833b7
RH
4215 gen_rtx_NE (VOIDmode, cr1,
4216 const0_rtx),
39403d82 4217 gen_rtx_LABEL_REF (VOIDmode, lab),
4697a36c
MM
4218 pc_rtx)));
4219
4cc833b7
RH
4220 while (fregno <= FP_ARG_V4_MAX_REG)
4221 {
dfafc897 4222 mem = gen_rtx_MEM (DFmode, plus_constant (save_area, off));
ba4828e0 4223 set_mem_alias_set (mem, set);
dfafc897 4224 emit_move_insn (mem, gen_rtx_REG (DFmode, fregno));
4cc833b7
RH
4225 fregno++;
4226 off += 8;
4697a36c 4227 }
4cc833b7
RH
4228
4229 emit_label (lab);
4697a36c 4230 }
4697a36c 4231}
4697a36c 4232
dfafc897 4233/* Create the va_list data type. */
2c4974b7 4234
dfafc897
FS
4235tree
4236rs6000_build_va_list ()
4237{
64c2816f 4238 tree f_gpr, f_fpr, f_res, f_ovf, f_sav, record, type_decl;
4697a36c 4239
9ebbca7d
GK
4240 /* For AIX, prefer 'char *' because that's what the system
4241 header files like. */
f607bc57 4242 if (DEFAULT_ABI != ABI_V4)
9ebbca7d 4243 return build_pointer_type (char_type_node);
dfafc897 4244
f1e639b1 4245 record = (*lang_hooks.types.make_type) (RECORD_TYPE);
bab45a51 4246 type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
0f4fd75d 4247
9ebbca7d
GK
4248 f_gpr = build_decl (FIELD_DECL, get_identifier ("gpr"),
4249 unsigned_char_type_node);
4250 f_fpr = build_decl (FIELD_DECL, get_identifier ("fpr"),
4251 unsigned_char_type_node);
64c2816f
DT
4252 /* Give the two bytes of padding a name, so that -Wpadded won't warn on
4253 every user file. */
4254 f_res = build_decl (FIELD_DECL, get_identifier ("reserved"),
4255 short_unsigned_type_node);
dfafc897
FS
4256 f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
4257 ptr_type_node);
4258 f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
4259 ptr_type_node);
4260
4261 DECL_FIELD_CONTEXT (f_gpr) = record;
4262 DECL_FIELD_CONTEXT (f_fpr) = record;
64c2816f 4263 DECL_FIELD_CONTEXT (f_res) = record;
dfafc897
FS
4264 DECL_FIELD_CONTEXT (f_ovf) = record;
4265 DECL_FIELD_CONTEXT (f_sav) = record;
4266
bab45a51
FS
4267 TREE_CHAIN (record) = type_decl;
4268 TYPE_NAME (record) = type_decl;
dfafc897
FS
4269 TYPE_FIELDS (record) = f_gpr;
4270 TREE_CHAIN (f_gpr) = f_fpr;
64c2816f
DT
4271 TREE_CHAIN (f_fpr) = f_res;
4272 TREE_CHAIN (f_res) = f_ovf;
dfafc897
FS
4273 TREE_CHAIN (f_ovf) = f_sav;
4274
4275 layout_type (record);
4276
4277 /* The correct type is an array type of one element. */
4278 return build_array_type (record, build_index_type (size_zero_node));
4279}
4280
4281/* Implement va_start. */
4282
4283void
e5faf155 4284rs6000_va_start (valist, nextarg)
dfafc897
FS
4285 tree valist;
4286 rtx nextarg;
4697a36c 4287{
dfafc897 4288 HOST_WIDE_INT words, n_gpr, n_fpr;
c566f9bd 4289 tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
dfafc897 4290 tree gpr, fpr, ovf, sav, t;
2c4974b7 4291
dfafc897 4292 /* Only SVR4 needs something special. */
f607bc57 4293 if (DEFAULT_ABI != ABI_V4)
dfafc897 4294 {
e5faf155 4295 std_expand_builtin_va_start (valist, nextarg);
dfafc897
FS
4296 return;
4297 }
4298
973a648b 4299 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
dfafc897 4300 f_fpr = TREE_CHAIN (f_gpr);
c566f9bd
DT
4301 f_res = TREE_CHAIN (f_fpr);
4302 f_ovf = TREE_CHAIN (f_res);
dfafc897
FS
4303 f_sav = TREE_CHAIN (f_ovf);
4304
8ebecc3b 4305 valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
dfafc897
FS
4306 gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr);
4307 fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr);
4308 ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf);
4309 sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav);
4310
4311 /* Count number of gp and fp argument registers used. */
4cc833b7 4312 words = current_function_args_info.words;
dfafc897
FS
4313 n_gpr = current_function_args_info.sysv_gregno - GP_ARG_MIN_REG;
4314 n_fpr = current_function_args_info.fregno - FP_ARG_MIN_REG;
4315
4316 if (TARGET_DEBUG_ARG)
4a0a75dd
KG
4317 fprintf (stderr, "va_start: words = "HOST_WIDE_INT_PRINT_DEC", n_gpr = "
4318 HOST_WIDE_INT_PRINT_DEC", n_fpr = "HOST_WIDE_INT_PRINT_DEC"\n",
4319 words, n_gpr, n_fpr);
dfafc897
FS
4320
4321 t = build (MODIFY_EXPR, TREE_TYPE (gpr), gpr, build_int_2 (n_gpr, 0));
4322 TREE_SIDE_EFFECTS (t) = 1;
4323 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4324
4325 t = build (MODIFY_EXPR, TREE_TYPE (fpr), fpr, build_int_2 (n_fpr, 0));
4326 TREE_SIDE_EFFECTS (t) = 1;
4327 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4328
4329 /* Find the overflow area. */
4330 t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
4331 if (words != 0)
4332 t = build (PLUS_EXPR, TREE_TYPE (ovf), t,
4333 build_int_2 (words * UNITS_PER_WORD, 0));
4334 t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
4335 TREE_SIDE_EFFECTS (t) = 1;
4336 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4337
4338 /* Find the register save area. */
4339 t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
4340 t = build (PLUS_EXPR, TREE_TYPE (sav), t,
4341 build_int_2 (-RS6000_VARARGS_SIZE, -1));
4342 t = build (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
4343 TREE_SIDE_EFFECTS (t) = 1;
4344 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4345}
4346
4347/* Implement va_arg. */
4348
4349rtx
4350rs6000_va_arg (valist, type)
4351 tree valist, type;
4352{
c566f9bd 4353 tree f_gpr, f_fpr, f_res, f_ovf, f_sav;
dfafc897
FS
4354 tree gpr, fpr, ovf, sav, reg, t, u;
4355 int indirect_p, size, rsize, n_reg, sav_ofs, sav_scale;
4356 rtx lab_false, lab_over, addr_rtx, r;
4357
f607bc57 4358 if (DEFAULT_ABI != ABI_V4)
c8c99a68
DE
4359 {
4360 /* Variable sized types are passed by reference. */
4361 if (int_size_in_bytes (type) <= 0)
4362 {
4363 u = build_pointer_type (type);
4364
4365 /* Args grow upward. */
4366 t = build (POSTINCREMENT_EXPR, TREE_TYPE (valist), valist,
4367 build_int_2 (POINTER_SIZE / BITS_PER_UNIT, 0));
4368 TREE_SIDE_EFFECTS (t) = 1;
4369
4370 t = build1 (NOP_EXPR, build_pointer_type (u), t);
4371 TREE_SIDE_EFFECTS (t) = 1;
4372
4373 t = build1 (INDIRECT_REF, u, t);
4374 TREE_SIDE_EFFECTS (t) = 1;
4375
4376 return expand_expr (t, NULL_RTX, VOIDmode, EXPAND_NORMAL);
4377 }
4378 else
4379 return std_expand_builtin_va_arg (valist, type);
4380 }
dfafc897 4381
973a648b 4382 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
dfafc897 4383 f_fpr = TREE_CHAIN (f_gpr);
c566f9bd
DT
4384 f_res = TREE_CHAIN (f_fpr);
4385 f_ovf = TREE_CHAIN (f_res);
dfafc897
FS
4386 f_sav = TREE_CHAIN (f_ovf);
4387
8ebecc3b 4388 valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
dfafc897
FS
4389 gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr);
4390 fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr);
4391 ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf);
4392 sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav);
4393
4394 size = int_size_in_bytes (type);
4395 rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4cc833b7 4396
dfafc897 4397 if (AGGREGATE_TYPE_P (type) || TYPE_MODE (type) == TFmode)
4cc833b7 4398 {
dfafc897
FS
4399 /* Aggregates and long doubles are passed by reference. */
4400 indirect_p = 1;
4401 reg = gpr;
4402 n_reg = 1;
4403 sav_ofs = 0;
4404 sav_scale = 4;
d3294cd9
FS
4405 size = UNITS_PER_WORD;
4406 rsize = 1;
dfafc897 4407 }
a3170dc6 4408 else if (FLOAT_TYPE_P (type) && TARGET_HARD_FLOAT && TARGET_FPRS)
dfafc897
FS
4409 {
4410 /* FP args go in FP registers, if present. */
4411 indirect_p = 0;
4412 reg = fpr;
4413 n_reg = 1;
4414 sav_ofs = 8*4;
4415 sav_scale = 8;
4cc833b7 4416 }
dfafc897
FS
4417 else
4418 {
4419 /* Otherwise into GP registers. */
4420 indirect_p = 0;
4421 reg = gpr;
4422 n_reg = rsize;
4423 sav_ofs = 0;
4424 sav_scale = 4;
4425 }
4426
a4f6c312 4427 /* Pull the value out of the saved registers ... */
dfafc897
FS
4428
4429 lab_false = gen_label_rtx ();
4430 lab_over = gen_label_rtx ();
4431 addr_rtx = gen_reg_rtx (Pmode);
4432
16861f33
AH
4433 /* AltiVec vectors never go in registers. */
4434 if (!TARGET_ALTIVEC || TREE_CODE (type) != VECTOR_TYPE)
2c4974b7 4435 {
41daaf0e
AH
4436 TREE_THIS_VOLATILE (reg) = 1;
4437 emit_cmp_and_jump_insns
4438 (expand_expr (reg, NULL_RTX, QImode, EXPAND_NORMAL),
4439 GEN_INT (8 - n_reg + 1), GE, const1_rtx, QImode, 1,
4440 lab_false);
dfafc897 4441
41daaf0e
AH
4442 /* Long long is aligned in the registers. */
4443 if (n_reg > 1)
4444 {
4445 u = build (BIT_AND_EXPR, TREE_TYPE (reg), reg,
4446 build_int_2 (n_reg - 1, 0));
4447 u = build (PLUS_EXPR, TREE_TYPE (reg), reg, u);
4448 u = build (MODIFY_EXPR, TREE_TYPE (reg), reg, u);
4449 TREE_SIDE_EFFECTS (u) = 1;
4450 expand_expr (u, const0_rtx, VOIDmode, EXPAND_NORMAL);
4451 }
2c4974b7 4452
41daaf0e
AH
4453 if (sav_ofs)
4454 t = build (PLUS_EXPR, ptr_type_node, sav, build_int_2 (sav_ofs, 0));
4455 else
4456 t = sav;
2c4974b7 4457
41daaf0e
AH
4458 u = build (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg,
4459 build_int_2 (n_reg, 0));
4460 TREE_SIDE_EFFECTS (u) = 1;
2c4974b7 4461
41daaf0e
AH
4462 u = build1 (CONVERT_EXPR, integer_type_node, u);
4463 TREE_SIDE_EFFECTS (u) = 1;
dfafc897 4464
41daaf0e
AH
4465 u = build (MULT_EXPR, integer_type_node, u, build_int_2 (sav_scale, 0));
4466 TREE_SIDE_EFFECTS (u) = 1;
dfafc897 4467
41daaf0e
AH
4468 t = build (PLUS_EXPR, ptr_type_node, t, u);
4469 TREE_SIDE_EFFECTS (t) = 1;
4470
4471 r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL);
4472 if (r != addr_rtx)
4473 emit_move_insn (addr_rtx, r);
4474
4475 emit_jump_insn (gen_jump (lab_over));
4476 emit_barrier ();
4477 }
dfafc897 4478
dfafc897
FS
4479 emit_label (lab_false);
4480
a4f6c312 4481 /* ... otherwise out of the overflow area. */
dfafc897 4482
41daaf0e
AH
4483 /* Make sure we don't find reg 7 for the next int arg.
4484
4485 All AltiVec vectors go in the overflow area. So in the AltiVec
4486 case we need to get the vectors from the overflow area, but
4487 remember where the GPRs and FPRs are. */
16861f33
AH
4488 if (n_reg > 1 && (TREE_CODE (type) != VECTOR_TYPE
4489 || !TARGET_ALTIVEC))
dfafc897
FS
4490 {
4491 t = build (MODIFY_EXPR, TREE_TYPE (reg), reg, build_int_2 (8, 0));
4492 TREE_SIDE_EFFECTS (t) = 1;
4493 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4494 }
4495
4496 /* Care for on-stack alignment if needed. */
4497 if (rsize <= 1)
4498 t = ovf;
4499 else
4500 {
41daaf0e
AH
4501 int align;
4502
16861f33
AH
4503 /* AltiVec vectors are 16 byte aligned. */
4504 if (TARGET_ALTIVEC && TREE_CODE (type) == VECTOR_TYPE)
41daaf0e
AH
4505 align = 15;
4506 else
4507 align = 7;
4508
4509 t = build (PLUS_EXPR, TREE_TYPE (ovf), ovf, build_int_2 (align, 0));
4510 t = build (BIT_AND_EXPR, TREE_TYPE (t), t, build_int_2 (-align-1, -1));
dfafc897
FS
4511 }
4512 t = save_expr (t);
4513
4514 r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL);
4515 if (r != addr_rtx)
4516 emit_move_insn (addr_rtx, r);
4517
4518 t = build (PLUS_EXPR, TREE_TYPE (t), t, build_int_2 (size, 0));
4519 t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
4520 TREE_SIDE_EFFECTS (t) = 1;
4521 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4522
4523 emit_label (lab_over);
4524
4525 if (indirect_p)
4526 {
4527 r = gen_rtx_MEM (Pmode, addr_rtx);
ba4828e0 4528 set_mem_alias_set (r, get_varargs_alias_set ());
dfafc897
FS
4529 emit_move_insn (addr_rtx, r);
4530 }
4531
4532 return addr_rtx;
4697a36c 4533}
0ac081f6
AH
4534
4535/* Builtins. */
4536
6a2dd09a
RS
4537#define def_builtin(MASK, NAME, TYPE, CODE) \
4538do { \
4539 if ((MASK) & target_flags) \
4540 builtin_function ((NAME), (TYPE), (CODE), BUILT_IN_MD, \
4541 NULL, NULL_TREE); \
0ac081f6
AH
4542} while (0)
4543
24408032
AH
4544/* Simple ternary operations: VECd = foo (VECa, VECb, VECc). */
4545
2212663f 4546static const struct builtin_description bdesc_3arg[] =
24408032
AH
4547{
4548 { MASK_ALTIVEC, CODE_FOR_altivec_vmaddfp, "__builtin_altivec_vmaddfp", ALTIVEC_BUILTIN_VMADDFP },
4549 { MASK_ALTIVEC, CODE_FOR_altivec_vmhaddshs, "__builtin_altivec_vmhaddshs", ALTIVEC_BUILTIN_VMHADDSHS },
4550 { MASK_ALTIVEC, CODE_FOR_altivec_vmhraddshs, "__builtin_altivec_vmhraddshs", ALTIVEC_BUILTIN_VMHRADDSHS },
4551 { MASK_ALTIVEC, CODE_FOR_altivec_vmladduhm, "__builtin_altivec_vmladduhm", ALTIVEC_BUILTIN_VMLADDUHM},
4552 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumubm, "__builtin_altivec_vmsumubm", ALTIVEC_BUILTIN_VMSUMUBM },
4553 { MASK_ALTIVEC, CODE_FOR_altivec_vmsummbm, "__builtin_altivec_vmsummbm", ALTIVEC_BUILTIN_VMSUMMBM },
4554 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhm, "__builtin_altivec_vmsumuhm", ALTIVEC_BUILTIN_VMSUMUHM },
4555 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshm, "__builtin_altivec_vmsumshm", ALTIVEC_BUILTIN_VMSUMSHM },
4556 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumuhs, "__builtin_altivec_vmsumuhs", ALTIVEC_BUILTIN_VMSUMUHS },
4557 { MASK_ALTIVEC, CODE_FOR_altivec_vmsumshs, "__builtin_altivec_vmsumshs", ALTIVEC_BUILTIN_VMSUMSHS },
4558 { MASK_ALTIVEC, CODE_FOR_altivec_vnmsubfp, "__builtin_altivec_vnmsubfp", ALTIVEC_BUILTIN_VNMSUBFP },
4559 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_4sf, "__builtin_altivec_vperm_4sf", ALTIVEC_BUILTIN_VPERM_4SF },
4560 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_4si, "__builtin_altivec_vperm_4si", ALTIVEC_BUILTIN_VPERM_4SI },
4561 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_8hi, "__builtin_altivec_vperm_8hi", ALTIVEC_BUILTIN_VPERM_8HI },
4562 { MASK_ALTIVEC, CODE_FOR_altivec_vperm_16qi, "__builtin_altivec_vperm_16qi", ALTIVEC_BUILTIN_VPERM_16QI },
4563 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_4sf, "__builtin_altivec_vsel_4sf", ALTIVEC_BUILTIN_VSEL_4SF },
4564 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_4si, "__builtin_altivec_vsel_4si", ALTIVEC_BUILTIN_VSEL_4SI },
4565 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_8hi, "__builtin_altivec_vsel_8hi", ALTIVEC_BUILTIN_VSEL_8HI },
4566 { MASK_ALTIVEC, CODE_FOR_altivec_vsel_16qi, "__builtin_altivec_vsel_16qi", ALTIVEC_BUILTIN_VSEL_16QI },
4567 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_16qi, "__builtin_altivec_vsldoi_16qi", ALTIVEC_BUILTIN_VSLDOI_16QI },
4568 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_8hi, "__builtin_altivec_vsldoi_8hi", ALTIVEC_BUILTIN_VSLDOI_8HI },
4569 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_4si, "__builtin_altivec_vsldoi_4si", ALTIVEC_BUILTIN_VSLDOI_4SI },
4570 { MASK_ALTIVEC, CODE_FOR_altivec_vsldoi_4sf, "__builtin_altivec_vsldoi_4sf", ALTIVEC_BUILTIN_VSLDOI_4SF },
4571};
2212663f 4572
95385cbb
AH
4573/* DST operations: void foo (void *, const int, const char). */
4574
4575static const struct builtin_description bdesc_dst[] =
4576{
4577 { MASK_ALTIVEC, CODE_FOR_altivec_dst, "__builtin_altivec_dst", ALTIVEC_BUILTIN_DST },
4578 { MASK_ALTIVEC, CODE_FOR_altivec_dstt, "__builtin_altivec_dstt", ALTIVEC_BUILTIN_DSTT },
4579 { MASK_ALTIVEC, CODE_FOR_altivec_dstst, "__builtin_altivec_dstst", ALTIVEC_BUILTIN_DSTST },
4580 { MASK_ALTIVEC, CODE_FOR_altivec_dststt, "__builtin_altivec_dststt", ALTIVEC_BUILTIN_DSTSTT }
4581};
4582
2212663f 4583/* Simple binary operations: VECc = foo (VECa, VECb). */
24408032 4584
a3170dc6 4585static struct builtin_description bdesc_2arg[] =
0ac081f6 4586{
f18c054f
DB
4587 { MASK_ALTIVEC, CODE_FOR_addv16qi3, "__builtin_altivec_vaddubm", ALTIVEC_BUILTIN_VADDUBM },
4588 { MASK_ALTIVEC, CODE_FOR_addv8hi3, "__builtin_altivec_vadduhm", ALTIVEC_BUILTIN_VADDUHM },
4589 { MASK_ALTIVEC, CODE_FOR_addv4si3, "__builtin_altivec_vadduwm", ALTIVEC_BUILTIN_VADDUWM },
4590 { MASK_ALTIVEC, CODE_FOR_addv4sf3, "__builtin_altivec_vaddfp", ALTIVEC_BUILTIN_VADDFP },
0ac081f6
AH
4591 { MASK_ALTIVEC, CODE_FOR_altivec_vaddcuw, "__builtin_altivec_vaddcuw", ALTIVEC_BUILTIN_VADDCUW },
4592 { MASK_ALTIVEC, CODE_FOR_altivec_vaddubs, "__builtin_altivec_vaddubs", ALTIVEC_BUILTIN_VADDUBS },
4593 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsbs, "__builtin_altivec_vaddsbs", ALTIVEC_BUILTIN_VADDSBS },
4594 { MASK_ALTIVEC, CODE_FOR_altivec_vadduhs, "__builtin_altivec_vadduhs", ALTIVEC_BUILTIN_VADDUHS },
4595 { MASK_ALTIVEC, CODE_FOR_altivec_vaddshs, "__builtin_altivec_vaddshs", ALTIVEC_BUILTIN_VADDSHS },
4596 { MASK_ALTIVEC, CODE_FOR_altivec_vadduws, "__builtin_altivec_vadduws", ALTIVEC_BUILTIN_VADDUWS },
4597 { MASK_ALTIVEC, CODE_FOR_altivec_vaddsws, "__builtin_altivec_vaddsws", ALTIVEC_BUILTIN_VADDSWS },
f18c054f 4598 { MASK_ALTIVEC, CODE_FOR_andv4si3, "__builtin_altivec_vand", ALTIVEC_BUILTIN_VAND },
0ac081f6
AH
4599 { MASK_ALTIVEC, CODE_FOR_altivec_vandc, "__builtin_altivec_vandc", ALTIVEC_BUILTIN_VANDC },
4600 { MASK_ALTIVEC, CODE_FOR_altivec_vavgub, "__builtin_altivec_vavgub", ALTIVEC_BUILTIN_VAVGUB },
4601 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsb, "__builtin_altivec_vavgsb", ALTIVEC_BUILTIN_VAVGSB },
4602 { MASK_ALTIVEC, CODE_FOR_altivec_vavguh, "__builtin_altivec_vavguh", ALTIVEC_BUILTIN_VAVGUH },
4603 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsh, "__builtin_altivec_vavgsh", ALTIVEC_BUILTIN_VAVGSH },
4604 { MASK_ALTIVEC, CODE_FOR_altivec_vavguw, "__builtin_altivec_vavguw", ALTIVEC_BUILTIN_VAVGUW },
4605 { MASK_ALTIVEC, CODE_FOR_altivec_vavgsw, "__builtin_altivec_vavgsw", ALTIVEC_BUILTIN_VAVGSW },
617e0e1d
DB
4606 { MASK_ALTIVEC, CODE_FOR_altivec_vcfux, "__builtin_altivec_vcfux", ALTIVEC_BUILTIN_VCFUX },
4607 { MASK_ALTIVEC, CODE_FOR_altivec_vcfsx, "__builtin_altivec_vcfsx", ALTIVEC_BUILTIN_VCFSX },
0ac081f6
AH
4608 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp, "__builtin_altivec_vcmpbfp", ALTIVEC_BUILTIN_VCMPBFP },
4609 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequb, "__builtin_altivec_vcmpequb", ALTIVEC_BUILTIN_VCMPEQUB },
4610 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequh, "__builtin_altivec_vcmpequh", ALTIVEC_BUILTIN_VCMPEQUH },
4611 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequw, "__builtin_altivec_vcmpequw", ALTIVEC_BUILTIN_VCMPEQUW },
4612 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpeqfp, "__builtin_altivec_vcmpeqfp", ALTIVEC_BUILTIN_VCMPEQFP },
4613 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgefp, "__builtin_altivec_vcmpgefp", ALTIVEC_BUILTIN_VCMPGEFP },
4614 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtub, "__builtin_altivec_vcmpgtub", ALTIVEC_BUILTIN_VCMPGTUB },
4615 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsb, "__builtin_altivec_vcmpgtsb", ALTIVEC_BUILTIN_VCMPGTSB },
4616 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuh, "__builtin_altivec_vcmpgtuh", ALTIVEC_BUILTIN_VCMPGTUH },
4617 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsh, "__builtin_altivec_vcmpgtsh", ALTIVEC_BUILTIN_VCMPGTSH },
4618 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuw, "__builtin_altivec_vcmpgtuw", ALTIVEC_BUILTIN_VCMPGTUW },
4619 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsw, "__builtin_altivec_vcmpgtsw", ALTIVEC_BUILTIN_VCMPGTSW },
4620 { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtfp, "__builtin_altivec_vcmpgtfp", ALTIVEC_BUILTIN_VCMPGTFP },
617e0e1d
DB
4621 { MASK_ALTIVEC, CODE_FOR_altivec_vctsxs, "__builtin_altivec_vctsxs", ALTIVEC_BUILTIN_VCTSXS },
4622 { MASK_ALTIVEC, CODE_FOR_altivec_vctuxs, "__builtin_altivec_vctuxs", ALTIVEC_BUILTIN_VCTUXS },
f18c054f
DB
4623 { MASK_ALTIVEC, CODE_FOR_umaxv16qi3, "__builtin_altivec_vmaxub", ALTIVEC_BUILTIN_VMAXUB },
4624 { MASK_ALTIVEC, CODE_FOR_smaxv16qi3, "__builtin_altivec_vmaxsb", ALTIVEC_BUILTIN_VMAXSB },
df966bff
AH
4625 { MASK_ALTIVEC, CODE_FOR_umaxv8hi3, "__builtin_altivec_vmaxuh", ALTIVEC_BUILTIN_VMAXUH },
4626 { MASK_ALTIVEC, CODE_FOR_smaxv8hi3, "__builtin_altivec_vmaxsh", ALTIVEC_BUILTIN_VMAXSH },
4627 { MASK_ALTIVEC, CODE_FOR_umaxv4si3, "__builtin_altivec_vmaxuw", ALTIVEC_BUILTIN_VMAXUW },
4628 { MASK_ALTIVEC, CODE_FOR_smaxv4si3, "__builtin_altivec_vmaxsw", ALTIVEC_BUILTIN_VMAXSW },
4629 { MASK_ALTIVEC, CODE_FOR_smaxv4sf3, "__builtin_altivec_vmaxfp", ALTIVEC_BUILTIN_VMAXFP },
0ac081f6
AH
4630 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghb, "__builtin_altivec_vmrghb", ALTIVEC_BUILTIN_VMRGHB },
4631 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghh, "__builtin_altivec_vmrghh", ALTIVEC_BUILTIN_VMRGHH },
4632 { MASK_ALTIVEC, CODE_FOR_altivec_vmrghw, "__builtin_altivec_vmrghw", ALTIVEC_BUILTIN_VMRGHW },
4633 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglb, "__builtin_altivec_vmrglb", ALTIVEC_BUILTIN_VMRGLB },
4634 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglh, "__builtin_altivec_vmrglh", ALTIVEC_BUILTIN_VMRGLH },
4635 { MASK_ALTIVEC, CODE_FOR_altivec_vmrglw, "__builtin_altivec_vmrglw", ALTIVEC_BUILTIN_VMRGLW },
f18c054f
DB
4636 { MASK_ALTIVEC, CODE_FOR_uminv16qi3, "__builtin_altivec_vminub", ALTIVEC_BUILTIN_VMINUB },
4637 { MASK_ALTIVEC, CODE_FOR_sminv16qi3, "__builtin_altivec_vminsb", ALTIVEC_BUILTIN_VMINSB },
4638 { MASK_ALTIVEC, CODE_FOR_uminv8hi3, "__builtin_altivec_vminuh", ALTIVEC_BUILTIN_VMINUH },
4639 { MASK_ALTIVEC, CODE_FOR_sminv8hi3, "__builtin_altivec_vminsh", ALTIVEC_BUILTIN_VMINSH },
4640 { MASK_ALTIVEC, CODE_FOR_uminv4si3, "__builtin_altivec_vminuw", ALTIVEC_BUILTIN_VMINUW },
4641 { MASK_ALTIVEC, CODE_FOR_sminv4si3, "__builtin_altivec_vminsw", ALTIVEC_BUILTIN_VMINSW },
4642 { MASK_ALTIVEC, CODE_FOR_sminv4sf3, "__builtin_altivec_vminfp", ALTIVEC_BUILTIN_VMINFP },
0ac081f6
AH
4643 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleub, "__builtin_altivec_vmuleub", ALTIVEC_BUILTIN_VMULEUB },
4644 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesb, "__builtin_altivec_vmulesb", ALTIVEC_BUILTIN_VMULESB },
4645 { MASK_ALTIVEC, CODE_FOR_altivec_vmuleuh, "__builtin_altivec_vmuleuh", ALTIVEC_BUILTIN_VMULEUH },
4646 { MASK_ALTIVEC, CODE_FOR_altivec_vmulesh, "__builtin_altivec_vmulesh", ALTIVEC_BUILTIN_VMULESH },
4647 { MASK_ALTIVEC, CODE_FOR_altivec_vmuloub, "__builtin_altivec_vmuloub", ALTIVEC_BUILTIN_VMULOUB },
4648 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosb, "__builtin_altivec_vmulosb", ALTIVEC_BUILTIN_VMULOSB },
4649 { MASK_ALTIVEC, CODE_FOR_altivec_vmulouh, "__builtin_altivec_vmulouh", ALTIVEC_BUILTIN_VMULOUH },
4650 { MASK_ALTIVEC, CODE_FOR_altivec_vmulosh, "__builtin_altivec_vmulosh", ALTIVEC_BUILTIN_VMULOSH },
4651 { MASK_ALTIVEC, CODE_FOR_altivec_vnor, "__builtin_altivec_vnor", ALTIVEC_BUILTIN_VNOR },
f18c054f 4652 { MASK_ALTIVEC, CODE_FOR_iorv4si3, "__builtin_altivec_vor", ALTIVEC_BUILTIN_VOR },
0ac081f6
AH
4653 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhum, "__builtin_altivec_vpkuhum", ALTIVEC_BUILTIN_VPKUHUM },
4654 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwum, "__builtin_altivec_vpkuwum", ALTIVEC_BUILTIN_VPKUWUM },
4655 { MASK_ALTIVEC, CODE_FOR_altivec_vpkpx, "__builtin_altivec_vpkpx", ALTIVEC_BUILTIN_VPKPX },
4656 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhss, "__builtin_altivec_vpkuhss", ALTIVEC_BUILTIN_VPKUHSS },
4657 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshss, "__builtin_altivec_vpkshss", ALTIVEC_BUILTIN_VPKSHSS },
4658 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwss, "__builtin_altivec_vpkuwss", ALTIVEC_BUILTIN_VPKUWSS },
4659 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswss, "__builtin_altivec_vpkswss", ALTIVEC_BUILTIN_VPKSWSS },
4660 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuhus, "__builtin_altivec_vpkuhus", ALTIVEC_BUILTIN_VPKUHUS },
4661 { MASK_ALTIVEC, CODE_FOR_altivec_vpkshus, "__builtin_altivec_vpkshus", ALTIVEC_BUILTIN_VPKSHUS },
4662 { MASK_ALTIVEC, CODE_FOR_altivec_vpkuwus, "__builtin_altivec_vpkuwus", ALTIVEC_BUILTIN_VPKUWUS },
4663 { MASK_ALTIVEC, CODE_FOR_altivec_vpkswus, "__builtin_altivec_vpkswus", ALTIVEC_BUILTIN_VPKSWUS },
4664 { MASK_ALTIVEC, CODE_FOR_altivec_vrlb, "__builtin_altivec_vrlb", ALTIVEC_BUILTIN_VRLB },
4665 { MASK_ALTIVEC, CODE_FOR_altivec_vrlh, "__builtin_altivec_vrlh", ALTIVEC_BUILTIN_VRLH },
4666 { MASK_ALTIVEC, CODE_FOR_altivec_vrlw, "__builtin_altivec_vrlw", ALTIVEC_BUILTIN_VRLW },
4667 { MASK_ALTIVEC, CODE_FOR_altivec_vslb, "__builtin_altivec_vslb", ALTIVEC_BUILTIN_VSLB },
4668 { MASK_ALTIVEC, CODE_FOR_altivec_vslh, "__builtin_altivec_vslh", ALTIVEC_BUILTIN_VSLH },
4669 { MASK_ALTIVEC, CODE_FOR_altivec_vslw, "__builtin_altivec_vslw", ALTIVEC_BUILTIN_VSLW },
4670 { MASK_ALTIVEC, CODE_FOR_altivec_vsl, "__builtin_altivec_vsl", ALTIVEC_BUILTIN_VSL },
4671 { MASK_ALTIVEC, CODE_FOR_altivec_vslo, "__builtin_altivec_vslo", ALTIVEC_BUILTIN_VSLO },
2212663f
DB
4672 { MASK_ALTIVEC, CODE_FOR_altivec_vspltb, "__builtin_altivec_vspltb", ALTIVEC_BUILTIN_VSPLTB },
4673 { MASK_ALTIVEC, CODE_FOR_altivec_vsplth, "__builtin_altivec_vsplth", ALTIVEC_BUILTIN_VSPLTH },
4674 { MASK_ALTIVEC, CODE_FOR_altivec_vspltw, "__builtin_altivec_vspltw", ALTIVEC_BUILTIN_VSPLTW },
0ac081f6 4675 { MASK_ALTIVEC, CODE_FOR_altivec_vsrb, "__builtin_altivec_vsrb", ALTIVEC_BUILTIN_VSRB },
f18c054f
DB
4676 { MASK_ALTIVEC, CODE_FOR_altivec_vsrh, "__builtin_altivec_vsrh", ALTIVEC_BUILTIN_VSRH },
4677 { MASK_ALTIVEC, CODE_FOR_altivec_vsrw, "__builtin_altivec_vsrw", ALTIVEC_BUILTIN_VSRW },
0ac081f6
AH
4678 { MASK_ALTIVEC, CODE_FOR_altivec_vsrab, "__builtin_altivec_vsrab", ALTIVEC_BUILTIN_VSRAB },
4679 { MASK_ALTIVEC, CODE_FOR_altivec_vsrah, "__builtin_altivec_vsrah", ALTIVEC_BUILTIN_VSRAH },
4680 { MASK_ALTIVEC, CODE_FOR_altivec_vsraw, "__builtin_altivec_vsraw", ALTIVEC_BUILTIN_VSRAW },
4681 { MASK_ALTIVEC, CODE_FOR_altivec_vsr, "__builtin_altivec_vsr", ALTIVEC_BUILTIN_VSR },
4682 { MASK_ALTIVEC, CODE_FOR_altivec_vsro, "__builtin_altivec_vsro", ALTIVEC_BUILTIN_VSRO },
f18c054f
DB
4683 { MASK_ALTIVEC, CODE_FOR_subv16qi3, "__builtin_altivec_vsububm", ALTIVEC_BUILTIN_VSUBUBM },
4684 { MASK_ALTIVEC, CODE_FOR_subv8hi3, "__builtin_altivec_vsubuhm", ALTIVEC_BUILTIN_VSUBUHM },
4685 { MASK_ALTIVEC, CODE_FOR_subv4si3, "__builtin_altivec_vsubuwm", ALTIVEC_BUILTIN_VSUBUWM },
4686 { MASK_ALTIVEC, CODE_FOR_subv4sf3, "__builtin_altivec_vsubfp", ALTIVEC_BUILTIN_VSUBFP },
0ac081f6
AH
4687 { MASK_ALTIVEC, CODE_FOR_altivec_vsubcuw, "__builtin_altivec_vsubcuw", ALTIVEC_BUILTIN_VSUBCUW },
4688 { MASK_ALTIVEC, CODE_FOR_altivec_vsububs, "__builtin_altivec_vsububs", ALTIVEC_BUILTIN_VSUBUBS },
4689 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsbs, "__builtin_altivec_vsubsbs", ALTIVEC_BUILTIN_VSUBSBS },
4690 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuhs, "__builtin_altivec_vsubuhs", ALTIVEC_BUILTIN_VSUBUHS },
4691 { MASK_ALTIVEC, CODE_FOR_altivec_vsubshs, "__builtin_altivec_vsubshs", ALTIVEC_BUILTIN_VSUBSHS },
4692 { MASK_ALTIVEC, CODE_FOR_altivec_vsubuws, "__builtin_altivec_vsubuws", ALTIVEC_BUILTIN_VSUBUWS },
4693 { MASK_ALTIVEC, CODE_FOR_altivec_vsubsws, "__builtin_altivec_vsubsws", ALTIVEC_BUILTIN_VSUBSWS },
4694 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4ubs, "__builtin_altivec_vsum4ubs", ALTIVEC_BUILTIN_VSUM4UBS },
4695 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4sbs, "__builtin_altivec_vsum4sbs", ALTIVEC_BUILTIN_VSUM4SBS },
4696 { MASK_ALTIVEC, CODE_FOR_altivec_vsum4shs, "__builtin_altivec_vsum4shs", ALTIVEC_BUILTIN_VSUM4SHS },
4697 { MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
4698 { MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
f18c054f 4699 { MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
a3170dc6
AH
4700
4701 /* Place holder, leave as first spe builtin. */
4702 { 0, CODE_FOR_spe_evaddw, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
4703 { 0, CODE_FOR_spe_evand, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
4704 { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
4705 { 0, CODE_FOR_spe_evdivws, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
4706 { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
4707 { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
4708 { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
4709 { 0, CODE_FOR_spe_evfsdiv, "__builtin_spe_evfsdiv", SPE_BUILTIN_EVFSDIV },
4710 { 0, CODE_FOR_spe_evfsmul, "__builtin_spe_evfsmul", SPE_BUILTIN_EVFSMUL },
4711 { 0, CODE_FOR_spe_evfssub, "__builtin_spe_evfssub", SPE_BUILTIN_EVFSSUB },
4712 { 0, CODE_FOR_spe_evmergehi, "__builtin_spe_evmergehi", SPE_BUILTIN_EVMERGEHI },
4713 { 0, CODE_FOR_spe_evmergehilo, "__builtin_spe_evmergehilo", SPE_BUILTIN_EVMERGEHILO },
4714 { 0, CODE_FOR_spe_evmergelo, "__builtin_spe_evmergelo", SPE_BUILTIN_EVMERGELO },
4715 { 0, CODE_FOR_spe_evmergelohi, "__builtin_spe_evmergelohi", SPE_BUILTIN_EVMERGELOHI },
4716 { 0, CODE_FOR_spe_evmhegsmfaa, "__builtin_spe_evmhegsmfaa", SPE_BUILTIN_EVMHEGSMFAA },
4717 { 0, CODE_FOR_spe_evmhegsmfan, "__builtin_spe_evmhegsmfan", SPE_BUILTIN_EVMHEGSMFAN },
4718 { 0, CODE_FOR_spe_evmhegsmiaa, "__builtin_spe_evmhegsmiaa", SPE_BUILTIN_EVMHEGSMIAA },
4719 { 0, CODE_FOR_spe_evmhegsmian, "__builtin_spe_evmhegsmian", SPE_BUILTIN_EVMHEGSMIAN },
4720 { 0, CODE_FOR_spe_evmhegumiaa, "__builtin_spe_evmhegumiaa", SPE_BUILTIN_EVMHEGUMIAA },
4721 { 0, CODE_FOR_spe_evmhegumian, "__builtin_spe_evmhegumian", SPE_BUILTIN_EVMHEGUMIAN },
4722 { 0, CODE_FOR_spe_evmhesmf, "__builtin_spe_evmhesmf", SPE_BUILTIN_EVMHESMF },
4723 { 0, CODE_FOR_spe_evmhesmfa, "__builtin_spe_evmhesmfa", SPE_BUILTIN_EVMHESMFA },
4724 { 0, CODE_FOR_spe_evmhesmfaaw, "__builtin_spe_evmhesmfaaw", SPE_BUILTIN_EVMHESMFAAW },
4725 { 0, CODE_FOR_spe_evmhesmfanw, "__builtin_spe_evmhesmfanw", SPE_BUILTIN_EVMHESMFANW },
4726 { 0, CODE_FOR_spe_evmhesmi, "__builtin_spe_evmhesmi", SPE_BUILTIN_EVMHESMI },
4727 { 0, CODE_FOR_spe_evmhesmia, "__builtin_spe_evmhesmia", SPE_BUILTIN_EVMHESMIA },
4728 { 0, CODE_FOR_spe_evmhesmiaaw, "__builtin_spe_evmhesmiaaw", SPE_BUILTIN_EVMHESMIAAW },
4729 { 0, CODE_FOR_spe_evmhesmianw, "__builtin_spe_evmhesmianw", SPE_BUILTIN_EVMHESMIANW },
4730 { 0, CODE_FOR_spe_evmhessf, "__builtin_spe_evmhessf", SPE_BUILTIN_EVMHESSF },
4731 { 0, CODE_FOR_spe_evmhessfa, "__builtin_spe_evmhessfa", SPE_BUILTIN_EVMHESSFA },
4732 { 0, CODE_FOR_spe_evmhessfaaw, "__builtin_spe_evmhessfaaw", SPE_BUILTIN_EVMHESSFAAW },
4733 { 0, CODE_FOR_spe_evmhessfanw, "__builtin_spe_evmhessfanw", SPE_BUILTIN_EVMHESSFANW },
4734 { 0, CODE_FOR_spe_evmhessiaaw, "__builtin_spe_evmhessiaaw", SPE_BUILTIN_EVMHESSIAAW },
4735 { 0, CODE_FOR_spe_evmhessianw, "__builtin_spe_evmhessianw", SPE_BUILTIN_EVMHESSIANW },
4736 { 0, CODE_FOR_spe_evmheumi, "__builtin_spe_evmheumi", SPE_BUILTIN_EVMHEUMI },
4737 { 0, CODE_FOR_spe_evmheumia, "__builtin_spe_evmheumia", SPE_BUILTIN_EVMHEUMIA },
4738 { 0, CODE_FOR_spe_evmheumiaaw, "__builtin_spe_evmheumiaaw", SPE_BUILTIN_EVMHEUMIAAW },
4739 { 0, CODE_FOR_spe_evmheumianw, "__builtin_spe_evmheumianw", SPE_BUILTIN_EVMHEUMIANW },
4740 { 0, CODE_FOR_spe_evmheusiaaw, "__builtin_spe_evmheusiaaw", SPE_BUILTIN_EVMHEUSIAAW },
4741 { 0, CODE_FOR_spe_evmheusianw, "__builtin_spe_evmheusianw", SPE_BUILTIN_EVMHEUSIANW },
4742 { 0, CODE_FOR_spe_evmhogsmfaa, "__builtin_spe_evmhogsmfaa", SPE_BUILTIN_EVMHOGSMFAA },
4743 { 0, CODE_FOR_spe_evmhogsmfan, "__builtin_spe_evmhogsmfan", SPE_BUILTIN_EVMHOGSMFAN },
4744 { 0, CODE_FOR_spe_evmhogsmiaa, "__builtin_spe_evmhogsmiaa", SPE_BUILTIN_EVMHOGSMIAA },
4745 { 0, CODE_FOR_spe_evmhogsmian, "__builtin_spe_evmhogsmian", SPE_BUILTIN_EVMHOGSMIAN },
4746 { 0, CODE_FOR_spe_evmhogumiaa, "__builtin_spe_evmhogumiaa", SPE_BUILTIN_EVMHOGUMIAA },
4747 { 0, CODE_FOR_spe_evmhogumian, "__builtin_spe_evmhogumian", SPE_BUILTIN_EVMHOGUMIAN },
4748 { 0, CODE_FOR_spe_evmhosmf, "__builtin_spe_evmhosmf", SPE_BUILTIN_EVMHOSMF },
4749 { 0, CODE_FOR_spe_evmhosmfa, "__builtin_spe_evmhosmfa", SPE_BUILTIN_EVMHOSMFA },
4750 { 0, CODE_FOR_spe_evmhosmfaaw, "__builtin_spe_evmhosmfaaw", SPE_BUILTIN_EVMHOSMFAAW },
4751 { 0, CODE_FOR_spe_evmhosmfanw, "__builtin_spe_evmhosmfanw", SPE_BUILTIN_EVMHOSMFANW },
4752 { 0, CODE_FOR_spe_evmhosmi, "__builtin_spe_evmhosmi", SPE_BUILTIN_EVMHOSMI },
4753 { 0, CODE_FOR_spe_evmhosmia, "__builtin_spe_evmhosmia", SPE_BUILTIN_EVMHOSMIA },
4754 { 0, CODE_FOR_spe_evmhosmiaaw, "__builtin_spe_evmhosmiaaw", SPE_BUILTIN_EVMHOSMIAAW },
4755 { 0, CODE_FOR_spe_evmhosmianw, "__builtin_spe_evmhosmianw", SPE_BUILTIN_EVMHOSMIANW },
4756 { 0, CODE_FOR_spe_evmhossf, "__builtin_spe_evmhossf", SPE_BUILTIN_EVMHOSSF },
4757 { 0, CODE_FOR_spe_evmhossfa, "__builtin_spe_evmhossfa", SPE_BUILTIN_EVMHOSSFA },
4758 { 0, CODE_FOR_spe_evmhossfaaw, "__builtin_spe_evmhossfaaw", SPE_BUILTIN_EVMHOSSFAAW },
4759 { 0, CODE_FOR_spe_evmhossfanw, "__builtin_spe_evmhossfanw", SPE_BUILTIN_EVMHOSSFANW },
4760 { 0, CODE_FOR_spe_evmhossiaaw, "__builtin_spe_evmhossiaaw", SPE_BUILTIN_EVMHOSSIAAW },
4761 { 0, CODE_FOR_spe_evmhossianw, "__builtin_spe_evmhossianw", SPE_BUILTIN_EVMHOSSIANW },
4762 { 0, CODE_FOR_spe_evmhoumi, "__builtin_spe_evmhoumi", SPE_BUILTIN_EVMHOUMI },
4763 { 0, CODE_FOR_spe_evmhoumia, "__builtin_spe_evmhoumia", SPE_BUILTIN_EVMHOUMIA },
4764 { 0, CODE_FOR_spe_evmhoumiaaw, "__builtin_spe_evmhoumiaaw", SPE_BUILTIN_EVMHOUMIAAW },
4765 { 0, CODE_FOR_spe_evmhoumianw, "__builtin_spe_evmhoumianw", SPE_BUILTIN_EVMHOUMIANW },
4766 { 0, CODE_FOR_spe_evmhousiaaw, "__builtin_spe_evmhousiaaw", SPE_BUILTIN_EVMHOUSIAAW },
4767 { 0, CODE_FOR_spe_evmhousianw, "__builtin_spe_evmhousianw", SPE_BUILTIN_EVMHOUSIANW },
4768 { 0, CODE_FOR_spe_evmwhsmf, "__builtin_spe_evmwhsmf", SPE_BUILTIN_EVMWHSMF },
4769 { 0, CODE_FOR_spe_evmwhsmfa, "__builtin_spe_evmwhsmfa", SPE_BUILTIN_EVMWHSMFA },
4770 { 0, CODE_FOR_spe_evmwhsmi, "__builtin_spe_evmwhsmi", SPE_BUILTIN_EVMWHSMI },
4771 { 0, CODE_FOR_spe_evmwhsmia, "__builtin_spe_evmwhsmia", SPE_BUILTIN_EVMWHSMIA },
4772 { 0, CODE_FOR_spe_evmwhssf, "__builtin_spe_evmwhssf", SPE_BUILTIN_EVMWHSSF },
4773 { 0, CODE_FOR_spe_evmwhssfa, "__builtin_spe_evmwhssfa", SPE_BUILTIN_EVMWHSSFA },
4774 { 0, CODE_FOR_spe_evmwhumi, "__builtin_spe_evmwhumi", SPE_BUILTIN_EVMWHUMI },
4775 { 0, CODE_FOR_spe_evmwhumia, "__builtin_spe_evmwhumia", SPE_BUILTIN_EVMWHUMIA },
a3170dc6
AH
4776 { 0, CODE_FOR_spe_evmwlsmiaaw, "__builtin_spe_evmwlsmiaaw", SPE_BUILTIN_EVMWLSMIAAW },
4777 { 0, CODE_FOR_spe_evmwlsmianw, "__builtin_spe_evmwlsmianw", SPE_BUILTIN_EVMWLSMIANW },
a3170dc6
AH
4778 { 0, CODE_FOR_spe_evmwlssiaaw, "__builtin_spe_evmwlssiaaw", SPE_BUILTIN_EVMWLSSIAAW },
4779 { 0, CODE_FOR_spe_evmwlssianw, "__builtin_spe_evmwlssianw", SPE_BUILTIN_EVMWLSSIANW },
4780 { 0, CODE_FOR_spe_evmwlumi, "__builtin_spe_evmwlumi", SPE_BUILTIN_EVMWLUMI },
4781 { 0, CODE_FOR_spe_evmwlumia, "__builtin_spe_evmwlumia", SPE_BUILTIN_EVMWLUMIA },
4782 { 0, CODE_FOR_spe_evmwlumiaaw, "__builtin_spe_evmwlumiaaw", SPE_BUILTIN_EVMWLUMIAAW },
4783 { 0, CODE_FOR_spe_evmwlumianw, "__builtin_spe_evmwlumianw", SPE_BUILTIN_EVMWLUMIANW },
4784 { 0, CODE_FOR_spe_evmwlusiaaw, "__builtin_spe_evmwlusiaaw", SPE_BUILTIN_EVMWLUSIAAW },
4785 { 0, CODE_FOR_spe_evmwlusianw, "__builtin_spe_evmwlusianw", SPE_BUILTIN_EVMWLUSIANW },
4786 { 0, CODE_FOR_spe_evmwsmf, "__builtin_spe_evmwsmf", SPE_BUILTIN_EVMWSMF },
4787 { 0, CODE_FOR_spe_evmwsmfa, "__builtin_spe_evmwsmfa", SPE_BUILTIN_EVMWSMFA },
4788 { 0, CODE_FOR_spe_evmwsmfaa, "__builtin_spe_evmwsmfaa", SPE_BUILTIN_EVMWSMFAA },
4789 { 0, CODE_FOR_spe_evmwsmfan, "__builtin_spe_evmwsmfan", SPE_BUILTIN_EVMWSMFAN },
4790 { 0, CODE_FOR_spe_evmwsmi, "__builtin_spe_evmwsmi", SPE_BUILTIN_EVMWSMI },
4791 { 0, CODE_FOR_spe_evmwsmia, "__builtin_spe_evmwsmia", SPE_BUILTIN_EVMWSMIA },
4792 { 0, CODE_FOR_spe_evmwsmiaa, "__builtin_spe_evmwsmiaa", SPE_BUILTIN_EVMWSMIAA },
4793 { 0, CODE_FOR_spe_evmwsmian, "__builtin_spe_evmwsmian", SPE_BUILTIN_EVMWSMIAN },
4794 { 0, CODE_FOR_spe_evmwssf, "__builtin_spe_evmwssf", SPE_BUILTIN_EVMWSSF },
4795 { 0, CODE_FOR_spe_evmwssfa, "__builtin_spe_evmwssfa", SPE_BUILTIN_EVMWSSFA },
4796 { 0, CODE_FOR_spe_evmwssfaa, "__builtin_spe_evmwssfaa", SPE_BUILTIN_EVMWSSFAA },
4797 { 0, CODE_FOR_spe_evmwssfan, "__builtin_spe_evmwssfan", SPE_BUILTIN_EVMWSSFAN },
4798 { 0, CODE_FOR_spe_evmwumi, "__builtin_spe_evmwumi", SPE_BUILTIN_EVMWUMI },
4799 { 0, CODE_FOR_spe_evmwumia, "__builtin_spe_evmwumia", SPE_BUILTIN_EVMWUMIA },
4800 { 0, CODE_FOR_spe_evmwumiaa, "__builtin_spe_evmwumiaa", SPE_BUILTIN_EVMWUMIAA },
4801 { 0, CODE_FOR_spe_evmwumian, "__builtin_spe_evmwumian", SPE_BUILTIN_EVMWUMIAN },
4802 { 0, CODE_FOR_spe_evnand, "__builtin_spe_evnand", SPE_BUILTIN_EVNAND },
4803 { 0, CODE_FOR_spe_evnor, "__builtin_spe_evnor", SPE_BUILTIN_EVNOR },
4804 { 0, CODE_FOR_spe_evor, "__builtin_spe_evor", SPE_BUILTIN_EVOR },
4805 { 0, CODE_FOR_spe_evorc, "__builtin_spe_evorc", SPE_BUILTIN_EVORC },
4806 { 0, CODE_FOR_spe_evrlw, "__builtin_spe_evrlw", SPE_BUILTIN_EVRLW },
4807 { 0, CODE_FOR_spe_evslw, "__builtin_spe_evslw", SPE_BUILTIN_EVSLW },
4808 { 0, CODE_FOR_spe_evsrws, "__builtin_spe_evsrws", SPE_BUILTIN_EVSRWS },
4809 { 0, CODE_FOR_spe_evsrwu, "__builtin_spe_evsrwu", SPE_BUILTIN_EVSRWU },
4810 { 0, CODE_FOR_spe_evsubfw, "__builtin_spe_evsubfw", SPE_BUILTIN_EVSUBFW },
4811
4812 /* SPE binary operations expecting a 5-bit unsigned literal. */
4813 { 0, CODE_FOR_spe_evaddiw, "__builtin_spe_evaddiw", SPE_BUILTIN_EVADDIW },
4814
4815 { 0, CODE_FOR_spe_evrlwi, "__builtin_spe_evrlwi", SPE_BUILTIN_EVRLWI },
4816 { 0, CODE_FOR_spe_evslwi, "__builtin_spe_evslwi", SPE_BUILTIN_EVSLWI },
4817 { 0, CODE_FOR_spe_evsrwis, "__builtin_spe_evsrwis", SPE_BUILTIN_EVSRWIS },
4818 { 0, CODE_FOR_spe_evsrwiu, "__builtin_spe_evsrwiu", SPE_BUILTIN_EVSRWIU },
4819 { 0, CODE_FOR_spe_evsubifw, "__builtin_spe_evsubifw", SPE_BUILTIN_EVSUBIFW },
4820 { 0, CODE_FOR_spe_evmwhssfaa, "__builtin_spe_evmwhssfaa", SPE_BUILTIN_EVMWHSSFAA },
4821 { 0, CODE_FOR_spe_evmwhssmaa, "__builtin_spe_evmwhssmaa", SPE_BUILTIN_EVMWHSSMAA },
4822 { 0, CODE_FOR_spe_evmwhsmfaa, "__builtin_spe_evmwhsmfaa", SPE_BUILTIN_EVMWHSMFAA },
4823 { 0, CODE_FOR_spe_evmwhsmiaa, "__builtin_spe_evmwhsmiaa", SPE_BUILTIN_EVMWHSMIAA },
4824 { 0, CODE_FOR_spe_evmwhusiaa, "__builtin_spe_evmwhusiaa", SPE_BUILTIN_EVMWHUSIAA },
4825 { 0, CODE_FOR_spe_evmwhumiaa, "__builtin_spe_evmwhumiaa", SPE_BUILTIN_EVMWHUMIAA },
4826 { 0, CODE_FOR_spe_evmwhssfan, "__builtin_spe_evmwhssfan", SPE_BUILTIN_EVMWHSSFAN },
4827 { 0, CODE_FOR_spe_evmwhssian, "__builtin_spe_evmwhssian", SPE_BUILTIN_EVMWHSSIAN },
4828 { 0, CODE_FOR_spe_evmwhsmfan, "__builtin_spe_evmwhsmfan", SPE_BUILTIN_EVMWHSMFAN },
4829 { 0, CODE_FOR_spe_evmwhsmian, "__builtin_spe_evmwhsmian", SPE_BUILTIN_EVMWHSMIAN },
4830 { 0, CODE_FOR_spe_evmwhusian, "__builtin_spe_evmwhusian", SPE_BUILTIN_EVMWHUSIAN },
4831 { 0, CODE_FOR_spe_evmwhumian, "__builtin_spe_evmwhumian", SPE_BUILTIN_EVMWHUMIAN },
4832 { 0, CODE_FOR_spe_evmwhgssfaa, "__builtin_spe_evmwhgssfaa", SPE_BUILTIN_EVMWHGSSFAA },
4833 { 0, CODE_FOR_spe_evmwhgsmfaa, "__builtin_spe_evmwhgsmfaa", SPE_BUILTIN_EVMWHGSMFAA },
4834 { 0, CODE_FOR_spe_evmwhgsmiaa, "__builtin_spe_evmwhgsmiaa", SPE_BUILTIN_EVMWHGSMIAA },
4835 { 0, CODE_FOR_spe_evmwhgumiaa, "__builtin_spe_evmwhgumiaa", SPE_BUILTIN_EVMWHGUMIAA },
4836 { 0, CODE_FOR_spe_evmwhgssfan, "__builtin_spe_evmwhgssfan", SPE_BUILTIN_EVMWHGSSFAN },
4837 { 0, CODE_FOR_spe_evmwhgsmfan, "__builtin_spe_evmwhgsmfan", SPE_BUILTIN_EVMWHGSMFAN },
4838 { 0, CODE_FOR_spe_evmwhgsmian, "__builtin_spe_evmwhgsmian", SPE_BUILTIN_EVMWHGSMIAN },
4839 { 0, CODE_FOR_spe_evmwhgumian, "__builtin_spe_evmwhgumian", SPE_BUILTIN_EVMWHGUMIAN },
4840 { 0, CODE_FOR_spe_brinc, "__builtin_spe_brinc", SPE_BUILTIN_BRINC },
4841
4842 /* Place-holder. Leave as last binary SPE builtin. */
17edbda5 4843 { 0, CODE_FOR_xorv2si3, "__builtin_spe_evxor", SPE_BUILTIN_EVXOR },
ae4b4a02
AH
4844};
4845
4846/* AltiVec predicates. */
4847
4848struct builtin_description_predicates
4849{
4850 const unsigned int mask;
4851 const enum insn_code icode;
4852 const char *opcode;
4853 const char *const name;
4854 const enum rs6000_builtins code;
4855};
4856
4857static const struct builtin_description_predicates bdesc_altivec_preds[] =
4858{
4859 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpbfp.", "__builtin_altivec_vcmpbfp_p", ALTIVEC_BUILTIN_VCMPBFP_P },
4860 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpeqfp.", "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
4861 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgefp.", "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
4862 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgtfp.", "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
4863 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpequw.", "__builtin_altivec_vcmpequw_p", ALTIVEC_BUILTIN_VCMPEQUW_P },
4864 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtsw.", "__builtin_altivec_vcmpgtsw_p", ALTIVEC_BUILTIN_VCMPGTSW_P },
4865 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtuw.", "__builtin_altivec_vcmpgtuw_p", ALTIVEC_BUILTIN_VCMPGTUW_P },
4866 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtuh.", "__builtin_altivec_vcmpgtuh_p", ALTIVEC_BUILTIN_VCMPGTUH_P },
4867 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtsh.", "__builtin_altivec_vcmpgtsh_p", ALTIVEC_BUILTIN_VCMPGTSH_P },
4868 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpequh.", "__builtin_altivec_vcmpequh_p", ALTIVEC_BUILTIN_VCMPEQUH_P },
4869 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpequb.", "__builtin_altivec_vcmpequb_p", ALTIVEC_BUILTIN_VCMPEQUB_P },
4870 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtsb.", "__builtin_altivec_vcmpgtsb_p", ALTIVEC_BUILTIN_VCMPGTSB_P },
4871 { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtub.", "__builtin_altivec_vcmpgtub_p", ALTIVEC_BUILTIN_VCMPGTUB_P }
0ac081f6 4872};
24408032 4873
a3170dc6
AH
4874/* SPE predicates. */
4875static struct builtin_description bdesc_spe_predicates[] =
4876{
4877 /* Place-holder. Leave as first. */
4878 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evcmpeq", SPE_BUILTIN_EVCMPEQ },
4879 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evcmpgts", SPE_BUILTIN_EVCMPGTS },
4880 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evcmpgtu", SPE_BUILTIN_EVCMPGTU },
4881 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evcmplts", SPE_BUILTIN_EVCMPLTS },
4882 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evcmpltu", SPE_BUILTIN_EVCMPLTU },
4883 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evfscmpeq", SPE_BUILTIN_EVFSCMPEQ },
4884 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evfscmpgt", SPE_BUILTIN_EVFSCMPGT },
4885 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evfscmplt", SPE_BUILTIN_EVFSCMPLT },
4886 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evfststeq", SPE_BUILTIN_EVFSTSTEQ },
4887 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evfststgt", SPE_BUILTIN_EVFSTSTGT },
4888 /* Place-holder. Leave as last. */
4889 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evfststlt", SPE_BUILTIN_EVFSTSTLT },
4890};
4891
4892/* SPE evsel predicates. */
4893static struct builtin_description bdesc_spe_evsel[] =
4894{
4895 /* Place-holder. Leave as first. */
4896 { 0, CODE_FOR_spe_evcmpgts, "__builtin_spe_evsel_gts", SPE_BUILTIN_EVSEL_CMPGTS },
4897 { 0, CODE_FOR_spe_evcmpgtu, "__builtin_spe_evsel_gtu", SPE_BUILTIN_EVSEL_CMPGTU },
4898 { 0, CODE_FOR_spe_evcmplts, "__builtin_spe_evsel_lts", SPE_BUILTIN_EVSEL_CMPLTS },
4899 { 0, CODE_FOR_spe_evcmpltu, "__builtin_spe_evsel_ltu", SPE_BUILTIN_EVSEL_CMPLTU },
4900 { 0, CODE_FOR_spe_evcmpeq, "__builtin_spe_evsel_eq", SPE_BUILTIN_EVSEL_CMPEQ },
4901 { 0, CODE_FOR_spe_evfscmpgt, "__builtin_spe_evsel_fsgt", SPE_BUILTIN_EVSEL_FSCMPGT },
4902 { 0, CODE_FOR_spe_evfscmplt, "__builtin_spe_evsel_fslt", SPE_BUILTIN_EVSEL_FSCMPLT },
4903 { 0, CODE_FOR_spe_evfscmpeq, "__builtin_spe_evsel_fseq", SPE_BUILTIN_EVSEL_FSCMPEQ },
4904 { 0, CODE_FOR_spe_evfststgt, "__builtin_spe_evsel_fststgt", SPE_BUILTIN_EVSEL_FSTSTGT },
4905 { 0, CODE_FOR_spe_evfststlt, "__builtin_spe_evsel_fststlt", SPE_BUILTIN_EVSEL_FSTSTLT },
4906 /* Place-holder. Leave as last. */
4907 { 0, CODE_FOR_spe_evfststeq, "__builtin_spe_evsel_fststeq", SPE_BUILTIN_EVSEL_FSTSTEQ },
4908};
4909
b6d08ca1 4910/* ABS* operations. */
100c4561
AH
4911
4912static const struct builtin_description bdesc_abs[] =
4913{
4914 { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
4915 { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
4916 { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
4917 { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
4918 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
4919 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
4920 { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI }
4921};
4922
617e0e1d
DB
4923/* Simple unary operations: VECb = foo (unsigned literal) or VECb =
4924 foo (VECa). */
24408032 4925
a3170dc6 4926static struct builtin_description bdesc_1arg[] =
2212663f 4927{
617e0e1d
DB
4928 { MASK_ALTIVEC, CODE_FOR_altivec_vexptefp, "__builtin_altivec_vexptefp", ALTIVEC_BUILTIN_VEXPTEFP },
4929 { MASK_ALTIVEC, CODE_FOR_altivec_vlogefp, "__builtin_altivec_vlogefp", ALTIVEC_BUILTIN_VLOGEFP },
4930 { MASK_ALTIVEC, CODE_FOR_altivec_vrefp, "__builtin_altivec_vrefp", ALTIVEC_BUILTIN_VREFP },
4931 { MASK_ALTIVEC, CODE_FOR_altivec_vrfim, "__builtin_altivec_vrfim", ALTIVEC_BUILTIN_VRFIM },
4932 { MASK_ALTIVEC, CODE_FOR_altivec_vrfin, "__builtin_altivec_vrfin", ALTIVEC_BUILTIN_VRFIN },
4933 { MASK_ALTIVEC, CODE_FOR_altivec_vrfip, "__builtin_altivec_vrfip", ALTIVEC_BUILTIN_VRFIP },
4934 { MASK_ALTIVEC, CODE_FOR_ftruncv4sf2, "__builtin_altivec_vrfiz", ALTIVEC_BUILTIN_VRFIZ },
4935 { MASK_ALTIVEC, CODE_FOR_altivec_vrsqrtefp, "__builtin_altivec_vrsqrtefp", ALTIVEC_BUILTIN_VRSQRTEFP },
2212663f
DB
4936 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisb, "__builtin_altivec_vspltisb", ALTIVEC_BUILTIN_VSPLTISB },
4937 { MASK_ALTIVEC, CODE_FOR_altivec_vspltish, "__builtin_altivec_vspltish", ALTIVEC_BUILTIN_VSPLTISH },
4938 { MASK_ALTIVEC, CODE_FOR_altivec_vspltisw, "__builtin_altivec_vspltisw", ALTIVEC_BUILTIN_VSPLTISW },
20e26713
AH
4939 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsb, "__builtin_altivec_vupkhsb", ALTIVEC_BUILTIN_VUPKHSB },
4940 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhpx, "__builtin_altivec_vupkhpx", ALTIVEC_BUILTIN_VUPKHPX },
4941 { MASK_ALTIVEC, CODE_FOR_altivec_vupkhsh, "__builtin_altivec_vupkhsh", ALTIVEC_BUILTIN_VUPKHSH },
4942 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsb, "__builtin_altivec_vupklsb", ALTIVEC_BUILTIN_VUPKLSB },
4943 { MASK_ALTIVEC, CODE_FOR_altivec_vupklpx, "__builtin_altivec_vupklpx", ALTIVEC_BUILTIN_VUPKLPX },
4944 { MASK_ALTIVEC, CODE_FOR_altivec_vupklsh, "__builtin_altivec_vupklsh", ALTIVEC_BUILTIN_VUPKLSH },
a3170dc6
AH
4945
4946 /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
4947 end with SPE_BUILTIN_EVSUBFUSIAAW. */
4948 { 0, CODE_FOR_spe_evabs, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
4949 { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
4950 { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
4951 { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
4952 { 0, CODE_FOR_spe_evaddusiaaw, "__builtin_spe_evaddusiaaw", SPE_BUILTIN_EVADDUSIAAW },
4953 { 0, CODE_FOR_spe_evcntlsw, "__builtin_spe_evcntlsw", SPE_BUILTIN_EVCNTLSW },
4954 { 0, CODE_FOR_spe_evcntlzw, "__builtin_spe_evcntlzw", SPE_BUILTIN_EVCNTLZW },
4955 { 0, CODE_FOR_spe_evextsb, "__builtin_spe_evextsb", SPE_BUILTIN_EVEXTSB },
4956 { 0, CODE_FOR_spe_evextsh, "__builtin_spe_evextsh", SPE_BUILTIN_EVEXTSH },
4957 { 0, CODE_FOR_spe_evfsabs, "__builtin_spe_evfsabs", SPE_BUILTIN_EVFSABS },
4958 { 0, CODE_FOR_spe_evfscfsf, "__builtin_spe_evfscfsf", SPE_BUILTIN_EVFSCFSF },
4959 { 0, CODE_FOR_spe_evfscfsi, "__builtin_spe_evfscfsi", SPE_BUILTIN_EVFSCFSI },
4960 { 0, CODE_FOR_spe_evfscfuf, "__builtin_spe_evfscfuf", SPE_BUILTIN_EVFSCFUF },
4961 { 0, CODE_FOR_spe_evfscfui, "__builtin_spe_evfscfui", SPE_BUILTIN_EVFSCFUI },
4962 { 0, CODE_FOR_spe_evfsctsf, "__builtin_spe_evfsctsf", SPE_BUILTIN_EVFSCTSF },
4963 { 0, CODE_FOR_spe_evfsctsi, "__builtin_spe_evfsctsi", SPE_BUILTIN_EVFSCTSI },
4964 { 0, CODE_FOR_spe_evfsctsiz, "__builtin_spe_evfsctsiz", SPE_BUILTIN_EVFSCTSIZ },
4965 { 0, CODE_FOR_spe_evfsctuf, "__builtin_spe_evfsctuf", SPE_BUILTIN_EVFSCTUF },
4966 { 0, CODE_FOR_spe_evfsctui, "__builtin_spe_evfsctui", SPE_BUILTIN_EVFSCTUI },
4967 { 0, CODE_FOR_spe_evfsctuiz, "__builtin_spe_evfsctuiz", SPE_BUILTIN_EVFSCTUIZ },
4968 { 0, CODE_FOR_spe_evfsnabs, "__builtin_spe_evfsnabs", SPE_BUILTIN_EVFSNABS },
4969 { 0, CODE_FOR_spe_evfsneg, "__builtin_spe_evfsneg", SPE_BUILTIN_EVFSNEG },
4970 { 0, CODE_FOR_spe_evmra, "__builtin_spe_evmra", SPE_BUILTIN_EVMRA },
4971 { 0, CODE_FOR_spe_evneg, "__builtin_spe_evneg", SPE_BUILTIN_EVNEG },
4972 { 0, CODE_FOR_spe_evrndw, "__builtin_spe_evrndw", SPE_BUILTIN_EVRNDW },
4973 { 0, CODE_FOR_spe_evsubfsmiaaw, "__builtin_spe_evsubfsmiaaw", SPE_BUILTIN_EVSUBFSMIAAW },
4974 { 0, CODE_FOR_spe_evsubfssiaaw, "__builtin_spe_evsubfssiaaw", SPE_BUILTIN_EVSUBFSSIAAW },
4975 { 0, CODE_FOR_spe_evsubfumiaaw, "__builtin_spe_evsubfumiaaw", SPE_BUILTIN_EVSUBFUMIAAW },
4976 { 0, CODE_FOR_spe_evsplatfi, "__builtin_spe_evsplatfi", SPE_BUILTIN_EVSPLATFI },
4977 { 0, CODE_FOR_spe_evsplati, "__builtin_spe_evsplati", SPE_BUILTIN_EVSPLATI },
4978
4979 /* Place-holder. Leave as last unary SPE builtin. */
4980 { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
2212663f
DB
4981};
4982
4983static rtx
92898235 4984rs6000_expand_unop_builtin (icode, arglist, target)
2212663f
DB
4985 enum insn_code icode;
4986 tree arglist;
4987 rtx target;
4988{
4989 rtx pat;
4990 tree arg0 = TREE_VALUE (arglist);
4991 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
4992 enum machine_mode tmode = insn_data[icode].operand[0].mode;
4993 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
4994
0559cc77
DE
4995 if (icode == CODE_FOR_nothing)
4996 /* Builtin not supported on this processor. */
4997 return 0;
4998
20e26713
AH
4999 /* If we got invalid arguments bail out before generating bad rtl. */
5000 if (arg0 == error_mark_node)
9a171fcd 5001 return const0_rtx;
20e26713 5002
0559cc77
DE
5003 if (icode == CODE_FOR_altivec_vspltisb
5004 || icode == CODE_FOR_altivec_vspltish
5005 || icode == CODE_FOR_altivec_vspltisw
5006 || icode == CODE_FOR_spe_evsplatfi
5007 || icode == CODE_FOR_spe_evsplati)
b44140e7
AH
5008 {
5009 /* Only allow 5-bit *signed* literals. */
b44140e7
AH
5010 if (GET_CODE (op0) != CONST_INT
5011 || INTVAL (op0) > 0x1f
5012 || INTVAL (op0) < -0x1f)
5013 {
5014 error ("argument 1 must be a 5-bit signed literal");
9a171fcd 5015 return const0_rtx;
b44140e7 5016 }
b44140e7
AH
5017 }
5018
c62f2db5 5019 if (target == 0
2212663f
DB
5020 || GET_MODE (target) != tmode
5021 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
5022 target = gen_reg_rtx (tmode);
5023
5024 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
5025 op0 = copy_to_mode_reg (mode0, op0);
5026
5027 pat = GEN_FCN (icode) (target, op0);
5028 if (! pat)
5029 return 0;
5030 emit_insn (pat);
0ac081f6 5031
2212663f
DB
5032 return target;
5033}
ae4b4a02 5034
100c4561
AH
5035static rtx
5036altivec_expand_abs_builtin (icode, arglist, target)
5037 enum insn_code icode;
5038 tree arglist;
5039 rtx target;
5040{
5041 rtx pat, scratch1, scratch2;
5042 tree arg0 = TREE_VALUE (arglist);
5043 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5044 enum machine_mode tmode = insn_data[icode].operand[0].mode;
5045 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
5046
5047 /* If we have invalid arguments, bail out before generating bad rtl. */
5048 if (arg0 == error_mark_node)
9a171fcd 5049 return const0_rtx;
100c4561
AH
5050
5051 if (target == 0
5052 || GET_MODE (target) != tmode
5053 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
5054 target = gen_reg_rtx (tmode);
5055
5056 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
5057 op0 = copy_to_mode_reg (mode0, op0);
5058
5059 scratch1 = gen_reg_rtx (mode0);
5060 scratch2 = gen_reg_rtx (mode0);
5061
5062 pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
5063 if (! pat)
5064 return 0;
5065 emit_insn (pat);
5066
5067 return target;
5068}
5069
0ac081f6 5070static rtx
92898235 5071rs6000_expand_binop_builtin (icode, arglist, target)
0ac081f6
AH
5072 enum insn_code icode;
5073 tree arglist;
5074 rtx target;
5075{
5076 rtx pat;
5077 tree arg0 = TREE_VALUE (arglist);
5078 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
5079 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5080 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
5081 enum machine_mode tmode = insn_data[icode].operand[0].mode;
5082 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
5083 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
5084
0559cc77
DE
5085 if (icode == CODE_FOR_nothing)
5086 /* Builtin not supported on this processor. */
5087 return 0;
5088
20e26713
AH
5089 /* If we got invalid arguments bail out before generating bad rtl. */
5090 if (arg0 == error_mark_node || arg1 == error_mark_node)
9a171fcd 5091 return const0_rtx;
20e26713 5092
0559cc77
DE
5093 if (icode == CODE_FOR_altivec_vcfux
5094 || icode == CODE_FOR_altivec_vcfsx
5095 || icode == CODE_FOR_altivec_vctsxs
5096 || icode == CODE_FOR_altivec_vctuxs
5097 || icode == CODE_FOR_altivec_vspltb
5098 || icode == CODE_FOR_altivec_vsplth
5099 || icode == CODE_FOR_altivec_vspltw
5100 || icode == CODE_FOR_spe_evaddiw
5101 || icode == CODE_FOR_spe_evldd
5102 || icode == CODE_FOR_spe_evldh
5103 || icode == CODE_FOR_spe_evldw
5104 || icode == CODE_FOR_spe_evlhhesplat
5105 || icode == CODE_FOR_spe_evlhhossplat
5106 || icode == CODE_FOR_spe_evlhhousplat
5107 || icode == CODE_FOR_spe_evlwhe
5108 || icode == CODE_FOR_spe_evlwhos
5109 || icode == CODE_FOR_spe_evlwhou
5110 || icode == CODE_FOR_spe_evlwhsplat
5111 || icode == CODE_FOR_spe_evlwwsplat
5112 || icode == CODE_FOR_spe_evrlwi
5113 || icode == CODE_FOR_spe_evslwi
5114 || icode == CODE_FOR_spe_evsrwis
f5119d10 5115 || icode == CODE_FOR_spe_evsubifw
0559cc77 5116 || icode == CODE_FOR_spe_evsrwiu)
b44140e7
AH
5117 {
5118 /* Only allow 5-bit unsigned literals. */
b44140e7
AH
5119 if (TREE_CODE (arg1) != INTEGER_CST
5120 || TREE_INT_CST_LOW (arg1) & ~0x1f)
5121 {
5122 error ("argument 2 must be a 5-bit unsigned literal");
9a171fcd 5123 return const0_rtx;
b44140e7 5124 }
b44140e7
AH
5125 }
5126
c62f2db5 5127 if (target == 0
0ac081f6
AH
5128 || GET_MODE (target) != tmode
5129 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
5130 target = gen_reg_rtx (tmode);
5131
5132 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
5133 op0 = copy_to_mode_reg (mode0, op0);
5134 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
5135 op1 = copy_to_mode_reg (mode1, op1);
5136
5137 pat = GEN_FCN (icode) (target, op0, op1);
5138 if (! pat)
5139 return 0;
5140 emit_insn (pat);
5141
5142 return target;
5143}
6525c0e7 5144
ae4b4a02
AH
5145static rtx
5146altivec_expand_predicate_builtin (icode, opcode, arglist, target)
5147 enum insn_code icode;
5148 const char *opcode;
5149 tree arglist;
5150 rtx target;
5151{
5152 rtx pat, scratch;
5153 tree cr6_form = TREE_VALUE (arglist);
5154 tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
5155 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
5156 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5157 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
5158 enum machine_mode tmode = SImode;
5159 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
5160 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
5161 int cr6_form_int;
5162
5163 if (TREE_CODE (cr6_form) != INTEGER_CST)
5164 {
5165 error ("argument 1 of __builtin_altivec_predicate must be a constant");
9a171fcd 5166 return const0_rtx;
ae4b4a02
AH
5167 }
5168 else
5169 cr6_form_int = TREE_INT_CST_LOW (cr6_form);
5170
5171 if (mode0 != mode1)
5172 abort ();
5173
5174 /* If we have invalid arguments, bail out before generating bad rtl. */
5175 if (arg0 == error_mark_node || arg1 == error_mark_node)
9a171fcd 5176 return const0_rtx;
ae4b4a02
AH
5177
5178 if (target == 0
5179 || GET_MODE (target) != tmode
5180 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
5181 target = gen_reg_rtx (tmode);
5182
5183 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
5184 op0 = copy_to_mode_reg (mode0, op0);
5185 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
5186 op1 = copy_to_mode_reg (mode1, op1);
5187
5188 scratch = gen_reg_rtx (mode0);
5189
5190 pat = GEN_FCN (icode) (scratch, op0, op1,
5191 gen_rtx (SYMBOL_REF, Pmode, opcode));
5192 if (! pat)
5193 return 0;
5194 emit_insn (pat);
5195
5196 /* The vec_any* and vec_all* predicates use the same opcodes for two
5197 different operations, but the bits in CR6 will be different
5198 depending on what information we want. So we have to play tricks
5199 with CR6 to get the right bits out.
5200
5201 If you think this is disgusting, look at the specs for the
5202 AltiVec predicates. */
5203
5204 switch (cr6_form_int)
5205 {
5206 case 0:
5207 emit_insn (gen_cr6_test_for_zero (target));
5208 break;
5209 case 1:
5210 emit_insn (gen_cr6_test_for_zero_reverse (target));
5211 break;
5212 case 2:
5213 emit_insn (gen_cr6_test_for_lt (target));
5214 break;
5215 case 3:
5216 emit_insn (gen_cr6_test_for_lt_reverse (target));
5217 break;
5218 default:
5219 error ("argument 1 of __builtin_altivec_predicate is out of range");
5220 break;
5221 }
5222
5223 return target;
5224}
5225
6525c0e7
AH
5226static rtx
5227altivec_expand_stv_builtin (icode, arglist)
5228 enum insn_code icode;
5229 tree arglist;
5230{
5231 tree arg0 = TREE_VALUE (arglist);
5232 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
5233 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
5234 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5235 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
5236 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
5237 rtx pat;
5238 enum machine_mode mode0 = insn_data[icode].operand[0].mode;
5239 enum machine_mode mode1 = insn_data[icode].operand[1].mode;
5240 enum machine_mode mode2 = insn_data[icode].operand[2].mode;
5241
5242 /* Invalid arguments. Bail before doing anything stoopid! */
5243 if (arg0 == error_mark_node
5244 || arg1 == error_mark_node
5245 || arg2 == error_mark_node)
9a171fcd 5246 return const0_rtx;
6525c0e7
AH
5247
5248 if (! (*insn_data[icode].operand[2].predicate) (op0, mode2))
5249 op0 = copy_to_mode_reg (mode2, op0);
5250 if (! (*insn_data[icode].operand[0].predicate) (op1, mode0))
5251 op1 = copy_to_mode_reg (mode0, op1);
5252 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
5253 op2 = copy_to_mode_reg (mode1, op2);
5254
5255 pat = GEN_FCN (icode) (op1, op2, op0);
5256 if (pat)
5257 emit_insn (pat);
5258 return NULL_RTX;
5259}
5260
2212663f 5261static rtx
92898235 5262rs6000_expand_ternop_builtin (icode, arglist, target)
2212663f
DB
5263 enum insn_code icode;
5264 tree arglist;
5265 rtx target;
5266{
5267 rtx pat;
5268 tree arg0 = TREE_VALUE (arglist);
5269 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
5270 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
5271 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5272 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
5273 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
5274 enum machine_mode tmode = insn_data[icode].operand[0].mode;
5275 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
5276 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
5277 enum machine_mode mode2 = insn_data[icode].operand[3].mode;
0ac081f6 5278
774b5662
DE
5279 if (icode == CODE_FOR_nothing)
5280 /* Builtin not supported on this processor. */
5281 return 0;
5282
20e26713
AH
5283 /* If we got invalid arguments bail out before generating bad rtl. */
5284 if (arg0 == error_mark_node
5285 || arg1 == error_mark_node
5286 || arg2 == error_mark_node)
9a171fcd 5287 return const0_rtx;
20e26713 5288
774b5662
DE
5289 if (icode == CODE_FOR_altivec_vsldoi_4sf
5290 || icode == CODE_FOR_altivec_vsldoi_4si
5291 || icode == CODE_FOR_altivec_vsldoi_8hi
5292 || icode == CODE_FOR_altivec_vsldoi_16qi)
b44140e7
AH
5293 {
5294 /* Only allow 4-bit unsigned literals. */
b44140e7
AH
5295 if (TREE_CODE (arg2) != INTEGER_CST
5296 || TREE_INT_CST_LOW (arg2) & ~0xf)
5297 {
5298 error ("argument 3 must be a 4-bit unsigned literal");
e3277ffb 5299 return const0_rtx;
b44140e7 5300 }
b44140e7
AH
5301 }
5302
c62f2db5 5303 if (target == 0
2212663f
DB
5304 || GET_MODE (target) != tmode
5305 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
5306 target = gen_reg_rtx (tmode);
5307
5308 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
5309 op0 = copy_to_mode_reg (mode0, op0);
5310 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
5311 op1 = copy_to_mode_reg (mode1, op1);
5312 if (! (*insn_data[icode].operand[3].predicate) (op2, mode2))
5313 op2 = copy_to_mode_reg (mode2, op2);
5314
5315 pat = GEN_FCN (icode) (target, op0, op1, op2);
5316 if (! pat)
5317 return 0;
5318 emit_insn (pat);
5319
5320 return target;
5321}
92898235 5322
3a9b8c7e 5323/* Expand the lvx builtins. */
0ac081f6 5324static rtx
3a9b8c7e 5325altivec_expand_ld_builtin (exp, target, expandedp)
0ac081f6
AH
5326 tree exp;
5327 rtx target;
92898235 5328 bool *expandedp;
0ac081f6 5329{
0ac081f6
AH
5330 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
5331 tree arglist = TREE_OPERAND (exp, 1);
0ac081f6 5332 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
3a9b8c7e
AH
5333 tree arg0;
5334 enum machine_mode tmode, mode0;
7c3abc73 5335 rtx pat, op0;
3a9b8c7e 5336 enum insn_code icode;
92898235 5337
0ac081f6
AH
5338 switch (fcode)
5339 {
f18c054f
DB
5340 case ALTIVEC_BUILTIN_LD_INTERNAL_16qi:
5341 icode = CODE_FOR_altivec_lvx_16qi;
3a9b8c7e 5342 break;
f18c054f
DB
5343 case ALTIVEC_BUILTIN_LD_INTERNAL_8hi:
5344 icode = CODE_FOR_altivec_lvx_8hi;
3a9b8c7e
AH
5345 break;
5346 case ALTIVEC_BUILTIN_LD_INTERNAL_4si:
5347 icode = CODE_FOR_altivec_lvx_4si;
5348 break;
5349 case ALTIVEC_BUILTIN_LD_INTERNAL_4sf:
5350 icode = CODE_FOR_altivec_lvx_4sf;
5351 break;
5352 default:
5353 *expandedp = false;
5354 return NULL_RTX;
5355 }
0ac081f6 5356
3a9b8c7e 5357 *expandedp = true;
f18c054f 5358
3a9b8c7e
AH
5359 arg0 = TREE_VALUE (arglist);
5360 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5361 tmode = insn_data[icode].operand[0].mode;
5362 mode0 = insn_data[icode].operand[1].mode;
f18c054f 5363
3a9b8c7e
AH
5364 if (target == 0
5365 || GET_MODE (target) != tmode
5366 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
5367 target = gen_reg_rtx (tmode);
24408032 5368
3a9b8c7e
AH
5369 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
5370 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
f18c054f 5371
3a9b8c7e
AH
5372 pat = GEN_FCN (icode) (target, op0);
5373 if (! pat)
5374 return 0;
5375 emit_insn (pat);
5376 return target;
5377}
f18c054f 5378
3a9b8c7e
AH
5379/* Expand the stvx builtins. */
5380static rtx
5381altivec_expand_st_builtin (exp, target, expandedp)
5382 tree exp;
7c3abc73 5383 rtx target ATTRIBUTE_UNUSED;
3a9b8c7e
AH
5384 bool *expandedp;
5385{
5386 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
5387 tree arglist = TREE_OPERAND (exp, 1);
5388 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
5389 tree arg0, arg1;
5390 enum machine_mode mode0, mode1;
7c3abc73 5391 rtx pat, op0, op1;
3a9b8c7e 5392 enum insn_code icode;
f18c054f 5393
3a9b8c7e
AH
5394 switch (fcode)
5395 {
5396 case ALTIVEC_BUILTIN_ST_INTERNAL_16qi:
5397 icode = CODE_FOR_altivec_stvx_16qi;
5398 break;
5399 case ALTIVEC_BUILTIN_ST_INTERNAL_8hi:
5400 icode = CODE_FOR_altivec_stvx_8hi;
5401 break;
5402 case ALTIVEC_BUILTIN_ST_INTERNAL_4si:
5403 icode = CODE_FOR_altivec_stvx_4si;
5404 break;
5405 case ALTIVEC_BUILTIN_ST_INTERNAL_4sf:
5406 icode = CODE_FOR_altivec_stvx_4sf;
5407 break;
5408 default:
5409 *expandedp = false;
5410 return NULL_RTX;
5411 }
24408032 5412
3a9b8c7e
AH
5413 arg0 = TREE_VALUE (arglist);
5414 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
5415 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5416 op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
5417 mode0 = insn_data[icode].operand[0].mode;
5418 mode1 = insn_data[icode].operand[1].mode;
f18c054f 5419
3a9b8c7e
AH
5420 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
5421 op0 = gen_rtx_MEM (mode0, copy_to_mode_reg (Pmode, op0));
5422 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
5423 op1 = copy_to_mode_reg (mode1, op1);
f18c054f 5424
3a9b8c7e
AH
5425 pat = GEN_FCN (icode) (op0, op1);
5426 if (pat)
5427 emit_insn (pat);
f18c054f 5428
3a9b8c7e
AH
5429 *expandedp = true;
5430 return NULL_RTX;
5431}
f18c054f 5432
3a9b8c7e
AH
5433/* Expand the dst builtins. */
5434static rtx
5435altivec_expand_dst_builtin (exp, target, expandedp)
5436 tree exp;
7c3abc73 5437 rtx target ATTRIBUTE_UNUSED;
3a9b8c7e
AH
5438 bool *expandedp;
5439{
5440 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
5441 tree arglist = TREE_OPERAND (exp, 1);
5442 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
5443 tree arg0, arg1, arg2;
5444 enum machine_mode mode0, mode1, mode2;
7c3abc73 5445 rtx pat, op0, op1, op2;
3a9b8c7e 5446 struct builtin_description *d;
a3170dc6 5447 size_t i;
f18c054f 5448
3a9b8c7e 5449 *expandedp = false;
f18c054f 5450
3a9b8c7e
AH
5451 /* Handle DST variants. */
5452 d = (struct builtin_description *) bdesc_dst;
5453 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
5454 if (d->code == fcode)
5455 {
5456 arg0 = TREE_VALUE (arglist);
5457 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
5458 arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
5459 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5460 op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
5461 op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
5462 mode0 = insn_data[d->icode].operand[0].mode;
5463 mode1 = insn_data[d->icode].operand[1].mode;
5464 mode2 = insn_data[d->icode].operand[2].mode;
24408032 5465
3a9b8c7e
AH
5466 /* Invalid arguments, bail out before generating bad rtl. */
5467 if (arg0 == error_mark_node
5468 || arg1 == error_mark_node
5469 || arg2 == error_mark_node)
5470 return const0_rtx;
f18c054f 5471
3a9b8c7e
AH
5472 if (TREE_CODE (arg2) != INTEGER_CST
5473 || TREE_INT_CST_LOW (arg2) & ~0x3)
5474 {
5475 error ("argument to `%s' must be a 2-bit unsigned literal", d->name);
5476 return const0_rtx;
5477 }
f18c054f 5478
3a9b8c7e
AH
5479 if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
5480 op0 = copy_to_mode_reg (mode0, op0);
5481 if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
5482 op1 = copy_to_mode_reg (mode1, op1);
24408032 5483
3a9b8c7e
AH
5484 pat = GEN_FCN (d->icode) (op0, op1, op2);
5485 if (pat != 0)
5486 emit_insn (pat);
f18c054f 5487
3a9b8c7e
AH
5488 *expandedp = true;
5489 return NULL_RTX;
5490 }
f18c054f 5491
3a9b8c7e
AH
5492 return NULL_RTX;
5493}
24408032 5494
3a9b8c7e
AH
5495/* Expand the builtin in EXP and store the result in TARGET. Store
5496 true in *EXPANDEDP if we found a builtin to expand. */
5497static rtx
5498altivec_expand_builtin (exp, target, expandedp)
5499 tree exp;
5500 rtx target;
5501 bool *expandedp;
5502{
5503 struct builtin_description *d;
5504 struct builtin_description_predicates *dp;
5505 size_t i;
5506 enum insn_code icode;
5507 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
5508 tree arglist = TREE_OPERAND (exp, 1);
7c3abc73
AH
5509 tree arg0;
5510 rtx op0, pat;
5511 enum machine_mode tmode, mode0;
3a9b8c7e 5512 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
0ac081f6 5513
3a9b8c7e
AH
5514 target = altivec_expand_ld_builtin (exp, target, expandedp);
5515 if (*expandedp)
5516 return target;
0ac081f6 5517
3a9b8c7e
AH
5518 target = altivec_expand_st_builtin (exp, target, expandedp);
5519 if (*expandedp)
5520 return target;
5521
5522 target = altivec_expand_dst_builtin (exp, target, expandedp);
5523 if (*expandedp)
5524 return target;
5525
5526 *expandedp = true;
95385cbb 5527
3a9b8c7e
AH
5528 switch (fcode)
5529 {
6525c0e7
AH
5530 case ALTIVEC_BUILTIN_STVX:
5531 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvx, arglist);
5532 case ALTIVEC_BUILTIN_STVEBX:
5533 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvebx, arglist);
5534 case ALTIVEC_BUILTIN_STVEHX:
5535 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvehx, arglist);
5536 case ALTIVEC_BUILTIN_STVEWX:
5537 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvewx, arglist);
5538 case ALTIVEC_BUILTIN_STVXL:
5539 return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, arglist);
3a9b8c7e 5540
95385cbb
AH
5541 case ALTIVEC_BUILTIN_MFVSCR:
5542 icode = CODE_FOR_altivec_mfvscr;
5543 tmode = insn_data[icode].operand[0].mode;
5544
5545 if (target == 0
5546 || GET_MODE (target) != tmode
5547 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
5548 target = gen_reg_rtx (tmode);
5549
5550 pat = GEN_FCN (icode) (target);
0ac081f6
AH
5551 if (! pat)
5552 return 0;
5553 emit_insn (pat);
95385cbb
AH
5554 return target;
5555
5556 case ALTIVEC_BUILTIN_MTVSCR:
5557 icode = CODE_FOR_altivec_mtvscr;
5558 arg0 = TREE_VALUE (arglist);
5559 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5560 mode0 = insn_data[icode].operand[0].mode;
5561
5562 /* If we got invalid arguments bail out before generating bad rtl. */
5563 if (arg0 == error_mark_node)
9a171fcd 5564 return const0_rtx;
95385cbb
AH
5565
5566 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
5567 op0 = copy_to_mode_reg (mode0, op0);
5568
5569 pat = GEN_FCN (icode) (op0);
5570 if (pat)
5571 emit_insn (pat);
5572 return NULL_RTX;
3a9b8c7e 5573
95385cbb
AH
5574 case ALTIVEC_BUILTIN_DSSALL:
5575 emit_insn (gen_altivec_dssall ());
5576 return NULL_RTX;
5577
5578 case ALTIVEC_BUILTIN_DSS:
5579 icode = CODE_FOR_altivec_dss;
5580 arg0 = TREE_VALUE (arglist);
5581 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5582 mode0 = insn_data[icode].operand[0].mode;
5583
5584 /* If we got invalid arguments bail out before generating bad rtl. */
5585 if (arg0 == error_mark_node)
9a171fcd 5586 return const0_rtx;
95385cbb 5587
b44140e7
AH
5588 if (TREE_CODE (arg0) != INTEGER_CST
5589 || TREE_INT_CST_LOW (arg0) & ~0x3)
5590 {
5591 error ("argument to dss must be a 2-bit unsigned literal");
9a171fcd 5592 return const0_rtx;
b44140e7
AH
5593 }
5594
95385cbb
AH
5595 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
5596 op0 = copy_to_mode_reg (mode0, op0);
5597
5598 emit_insn (gen_altivec_dss (op0));
0ac081f6
AH
5599 return NULL_RTX;
5600 }
24408032 5601
100c4561
AH
5602 /* Expand abs* operations. */
5603 d = (struct builtin_description *) bdesc_abs;
ca7558fc 5604 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
100c4561
AH
5605 if (d->code == fcode)
5606 return altivec_expand_abs_builtin (d->icode, arglist, target);
5607
ae4b4a02
AH
5608 /* Expand the AltiVec predicates. */
5609 dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
ca7558fc 5610 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
ae4b4a02
AH
5611 if (dp->code == fcode)
5612 return altivec_expand_predicate_builtin (dp->icode, dp->opcode, arglist, target);
5613
6525c0e7
AH
5614 /* LV* are funky. We initialized them differently. */
5615 switch (fcode)
5616 {
5617 case ALTIVEC_BUILTIN_LVSL:
92898235 5618 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvsl,
6525c0e7
AH
5619 arglist, target);
5620 case ALTIVEC_BUILTIN_LVSR:
92898235
AH
5621 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvsr,
5622 arglist, target);
6525c0e7 5623 case ALTIVEC_BUILTIN_LVEBX:
92898235
AH
5624 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvebx,
5625 arglist, target);
6525c0e7 5626 case ALTIVEC_BUILTIN_LVEHX:
92898235
AH
5627 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvehx,
5628 arglist, target);
6525c0e7 5629 case ALTIVEC_BUILTIN_LVEWX:
92898235
AH
5630 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvewx,
5631 arglist, target);
6525c0e7 5632 case ALTIVEC_BUILTIN_LVXL:
92898235
AH
5633 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvxl,
5634 arglist, target);
6525c0e7 5635 case ALTIVEC_BUILTIN_LVX:
92898235
AH
5636 return rs6000_expand_binop_builtin (CODE_FOR_altivec_lvx,
5637 arglist, target);
6525c0e7
AH
5638 default:
5639 break;
5640 /* Fall through. */
5641 }
95385cbb 5642
92898235 5643 *expandedp = false;
0ac081f6
AH
5644 return NULL_RTX;
5645}
5646
a3170dc6
AH
5647/* Binops that need to be initialized manually, but can be expanded
5648 automagically by rs6000_expand_binop_builtin. */
5649static struct builtin_description bdesc_2arg_spe[] =
5650{
5651 { 0, CODE_FOR_spe_evlddx, "__builtin_spe_evlddx", SPE_BUILTIN_EVLDDX },
5652 { 0, CODE_FOR_spe_evldwx, "__builtin_spe_evldwx", SPE_BUILTIN_EVLDWX },
5653 { 0, CODE_FOR_spe_evldhx, "__builtin_spe_evldhx", SPE_BUILTIN_EVLDHX },
5654 { 0, CODE_FOR_spe_evlwhex, "__builtin_spe_evlwhex", SPE_BUILTIN_EVLWHEX },
5655 { 0, CODE_FOR_spe_evlwhoux, "__builtin_spe_evlwhoux", SPE_BUILTIN_EVLWHOUX },
5656 { 0, CODE_FOR_spe_evlwhosx, "__builtin_spe_evlwhosx", SPE_BUILTIN_EVLWHOSX },
5657 { 0, CODE_FOR_spe_evlwwsplatx, "__builtin_spe_evlwwsplatx", SPE_BUILTIN_EVLWWSPLATX },
5658 { 0, CODE_FOR_spe_evlwhsplatx, "__builtin_spe_evlwhsplatx", SPE_BUILTIN_EVLWHSPLATX },
5659 { 0, CODE_FOR_spe_evlhhesplatx, "__builtin_spe_evlhhesplatx", SPE_BUILTIN_EVLHHESPLATX },
5660 { 0, CODE_FOR_spe_evlhhousplatx, "__builtin_spe_evlhhousplatx", SPE_BUILTIN_EVLHHOUSPLATX },
5661 { 0, CODE_FOR_spe_evlhhossplatx, "__builtin_spe_evlhhossplatx", SPE_BUILTIN_EVLHHOSSPLATX },
5662 { 0, CODE_FOR_spe_evldd, "__builtin_spe_evldd", SPE_BUILTIN_EVLDD },
5663 { 0, CODE_FOR_spe_evldw, "__builtin_spe_evldw", SPE_BUILTIN_EVLDW },
5664 { 0, CODE_FOR_spe_evldh, "__builtin_spe_evldh", SPE_BUILTIN_EVLDH },
5665 { 0, CODE_FOR_spe_evlwhe, "__builtin_spe_evlwhe", SPE_BUILTIN_EVLWHE },
5666 { 0, CODE_FOR_spe_evlwhou, "__builtin_spe_evlwhou", SPE_BUILTIN_EVLWHOU },
5667 { 0, CODE_FOR_spe_evlwhos, "__builtin_spe_evlwhos", SPE_BUILTIN_EVLWHOS },
5668 { 0, CODE_FOR_spe_evlwwsplat, "__builtin_spe_evlwwsplat", SPE_BUILTIN_EVLWWSPLAT },
5669 { 0, CODE_FOR_spe_evlwhsplat, "__builtin_spe_evlwhsplat", SPE_BUILTIN_EVLWHSPLAT },
5670 { 0, CODE_FOR_spe_evlhhesplat, "__builtin_spe_evlhhesplat", SPE_BUILTIN_EVLHHESPLAT },
5671 { 0, CODE_FOR_spe_evlhhousplat, "__builtin_spe_evlhhousplat", SPE_BUILTIN_EVLHHOUSPLAT },
5672 { 0, CODE_FOR_spe_evlhhossplat, "__builtin_spe_evlhhossplat", SPE_BUILTIN_EVLHHOSSPLAT }
5673};
5674
5675/* Expand the builtin in EXP and store the result in TARGET. Store
5676 true in *EXPANDEDP if we found a builtin to expand.
5677
5678 This expands the SPE builtins that are not simple unary and binary
5679 operations. */
5680static rtx
5681spe_expand_builtin (exp, target, expandedp)
5682 tree exp;
5683 rtx target;
5684 bool *expandedp;
5685{
5686 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
5687 tree arglist = TREE_OPERAND (exp, 1);
5688 tree arg1, arg0;
5689 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
5690 enum insn_code icode;
5691 enum machine_mode tmode, mode0;
5692 rtx pat, op0;
5693 struct builtin_description *d;
5694 size_t i;
5695
5696 *expandedp = true;
5697
5698 /* Syntax check for a 5-bit unsigned immediate. */
5699 switch (fcode)
5700 {
5701 case SPE_BUILTIN_EVSTDD:
5702 case SPE_BUILTIN_EVSTDH:
5703 case SPE_BUILTIN_EVSTDW:
5704 case SPE_BUILTIN_EVSTWHE:
5705 case SPE_BUILTIN_EVSTWHO:
5706 case SPE_BUILTIN_EVSTWWE:
5707 case SPE_BUILTIN_EVSTWWO:
5708 arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
5709 if (TREE_CODE (arg1) != INTEGER_CST
5710 || TREE_INT_CST_LOW (arg1) & ~0x1f)
5711 {
5712 error ("argument 2 must be a 5-bit unsigned literal");
5713 return const0_rtx;
5714 }
5715 break;
5716 default:
5717 break;
5718 }
5719
5720 d = (struct builtin_description *) bdesc_2arg_spe;
5721 for (i = 0; i < ARRAY_SIZE (bdesc_2arg_spe); ++i, ++d)
5722 if (d->code == fcode)
5723 return rs6000_expand_binop_builtin (d->icode, arglist, target);
5724
5725 d = (struct builtin_description *) bdesc_spe_predicates;
5726 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, ++d)
5727 if (d->code == fcode)
5728 return spe_expand_predicate_builtin (d->icode, arglist, target);
5729
5730 d = (struct builtin_description *) bdesc_spe_evsel;
5731 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, ++d)
5732 if (d->code == fcode)
5733 return spe_expand_evsel_builtin (d->icode, arglist, target);
5734
5735 switch (fcode)
5736 {
5737 case SPE_BUILTIN_EVSTDDX:
5738 return altivec_expand_stv_builtin (CODE_FOR_spe_evstddx, arglist);
5739 case SPE_BUILTIN_EVSTDHX:
5740 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdhx, arglist);
5741 case SPE_BUILTIN_EVSTDWX:
5742 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdwx, arglist);
5743 case SPE_BUILTIN_EVSTWHEX:
5744 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwhex, arglist);
5745 case SPE_BUILTIN_EVSTWHOX:
5746 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwhox, arglist);
5747 case SPE_BUILTIN_EVSTWWEX:
5748 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwwex, arglist);
5749 case SPE_BUILTIN_EVSTWWOX:
5750 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwwox, arglist);
5751 case SPE_BUILTIN_EVSTDD:
5752 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdd, arglist);
5753 case SPE_BUILTIN_EVSTDH:
5754 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdh, arglist);
5755 case SPE_BUILTIN_EVSTDW:
5756 return altivec_expand_stv_builtin (CODE_FOR_spe_evstdw, arglist);
5757 case SPE_BUILTIN_EVSTWHE:
5758 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwhe, arglist);
5759 case SPE_BUILTIN_EVSTWHO:
5760 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwho, arglist);
5761 case SPE_BUILTIN_EVSTWWE:
5762 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwwe, arglist);
5763 case SPE_BUILTIN_EVSTWWO:
5764 return altivec_expand_stv_builtin (CODE_FOR_spe_evstwwo, arglist);
5765 case SPE_BUILTIN_MFSPEFSCR:
5766 icode = CODE_FOR_spe_mfspefscr;
5767 tmode = insn_data[icode].operand[0].mode;
5768
5769 if (target == 0
5770 || GET_MODE (target) != tmode
5771 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
5772 target = gen_reg_rtx (tmode);
5773
5774 pat = GEN_FCN (icode) (target);
5775 if (! pat)
5776 return 0;
5777 emit_insn (pat);
5778 return target;
5779 case SPE_BUILTIN_MTSPEFSCR:
5780 icode = CODE_FOR_spe_mtspefscr;
5781 arg0 = TREE_VALUE (arglist);
5782 op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5783 mode0 = insn_data[icode].operand[0].mode;
5784
5785 if (arg0 == error_mark_node)
5786 return const0_rtx;
5787
5788 if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
5789 op0 = copy_to_mode_reg (mode0, op0);
5790
5791 pat = GEN_FCN (icode) (op0);
5792 if (pat)
5793 emit_insn (pat);
5794 return NULL_RTX;
5795 default:
5796 break;
5797 }
5798
5799 *expandedp = false;
5800 return NULL_RTX;
5801}
5802
5803static rtx
5804spe_expand_predicate_builtin (icode, arglist, target)
5805 enum insn_code icode;
5806 tree arglist;
5807 rtx target;
5808{
5809 rtx pat, scratch, tmp;
5810 tree form = TREE_VALUE (arglist);
5811 tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
5812 tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
5813 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5814 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
5815 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
5816 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
5817 int form_int;
5818 enum rtx_code code;
5819
5820 if (TREE_CODE (form) != INTEGER_CST)
5821 {
5822 error ("argument 1 of __builtin_spe_predicate must be a constant");
5823 return const0_rtx;
5824 }
5825 else
5826 form_int = TREE_INT_CST_LOW (form);
5827
5828 if (mode0 != mode1)
5829 abort ();
5830
5831 if (arg0 == error_mark_node || arg1 == error_mark_node)
5832 return const0_rtx;
5833
5834 if (target == 0
5835 || GET_MODE (target) != SImode
5836 || ! (*insn_data[icode].operand[0].predicate) (target, SImode))
5837 target = gen_reg_rtx (SImode);
5838
5839 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
5840 op0 = copy_to_mode_reg (mode0, op0);
5841 if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
5842 op1 = copy_to_mode_reg (mode1, op1);
5843
5844 scratch = gen_reg_rtx (CCmode);
5845
5846 pat = GEN_FCN (icode) (scratch, op0, op1);
5847 if (! pat)
5848 return const0_rtx;
5849 emit_insn (pat);
5850
5851 /* There are 4 variants for each predicate: _any_, _all_, _upper_,
5852 _lower_. We use one compare, but look in different bits of the
5853 CR for each variant.
5854
5855 There are 2 elements in each SPE simd type (upper/lower). The CR
5856 bits are set as follows:
5857
5858 BIT0 | BIT 1 | BIT 2 | BIT 3
5859 U | L | (U | L) | (U & L)
5860
5861 So, for an "all" relationship, BIT 3 would be set.
5862 For an "any" relationship, BIT 2 would be set. Etc.
5863
5864 Following traditional nomenclature, these bits map to:
5865
5866 BIT0 | BIT 1 | BIT 2 | BIT 3
5867 LT | GT | EQ | OV
5868
5869 Later, we will generate rtl to look in the LT/EQ/EQ/OV bits.
5870 */
5871
5872 switch (form_int)
5873 {
5874 /* All variant. OV bit. */
5875 case 0:
5876 /* We need to get to the OV bit, which is the ORDERED bit. We
5877 could generate (ordered:SI (reg:CC xx) (const_int 0)), but
5878 that's ugly and will trigger a validate_condition_mode abort.
5879 So let's just use another pattern. */
5880 emit_insn (gen_move_from_CR_ov_bit (target, scratch));
5881 return target;
5882 /* Any variant. EQ bit. */
5883 case 1:
5884 code = EQ;
5885 break;
5886 /* Upper variant. LT bit. */
5887 case 2:
5888 code = LT;
5889 break;
5890 /* Lower variant. GT bit. */
5891 case 3:
5892 code = GT;
5893 break;
5894 default:
5895 error ("argument 1 of __builtin_spe_predicate is out of range");
5896 return const0_rtx;
5897 }
5898
5899 tmp = gen_rtx_fmt_ee (code, SImode, scratch, const0_rtx);
5900 emit_move_insn (target, tmp);
5901
5902 return target;
5903}
5904
5905/* The evsel builtins look like this:
5906
5907 e = __builtin_spe_evsel_OP (a, b, c, d);
5908
5909 and work like this:
5910
5911 e[upper] = a[upper] *OP* b[upper] ? c[upper] : d[upper];
5912 e[lower] = a[lower] *OP* b[lower] ? c[lower] : d[lower];
5913*/
5914
5915static rtx
5916spe_expand_evsel_builtin (icode, arglist, target)
5917 enum insn_code icode;
5918 tree arglist;
5919 rtx target;
5920{
5921 rtx pat, scratch;
5922 tree arg0 = TREE_VALUE (arglist);
5923 tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
5924 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
5925 tree arg3 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist))));
5926 rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
5927 rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
5928 rtx op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0);
5929 rtx op3 = expand_expr (arg3, NULL_RTX, VOIDmode, 0);
5930 enum machine_mode mode0 = insn_data[icode].operand[1].mode;
5931 enum machine_mode mode1 = insn_data[icode].operand[2].mode;
5932
5933 if (mode0 != mode1)
5934 abort ();
5935
5936 if (arg0 == error_mark_node || arg1 == error_mark_node
5937 || arg2 == error_mark_node || arg3 == error_mark_node)
5938 return const0_rtx;
5939
5940 if (target == 0
5941 || GET_MODE (target) != mode0
5942 || ! (*insn_data[icode].operand[0].predicate) (target, mode0))
5943 target = gen_reg_rtx (mode0);
5944
5945 if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
5946 op0 = copy_to_mode_reg (mode0, op0);
5947 if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
5948 op1 = copy_to_mode_reg (mode0, op1);
5949 if (! (*insn_data[icode].operand[1].predicate) (op2, mode1))
5950 op2 = copy_to_mode_reg (mode0, op2);
5951 if (! (*insn_data[icode].operand[1].predicate) (op3, mode1))
5952 op3 = copy_to_mode_reg (mode0, op3);
5953
5954 /* Generate the compare. */
5955 scratch = gen_reg_rtx (CCmode);
5956 pat = GEN_FCN (icode) (scratch, op0, op1);
5957 if (! pat)
5958 return const0_rtx;
5959 emit_insn (pat);
5960
5961 if (mode0 == V2SImode)
5962 emit_insn (gen_spe_evsel (target, op2, op3, scratch));
5963 else
5964 emit_insn (gen_spe_evsel_fs (target, op2, op3, scratch));
5965
5966 return target;
5967}
5968
0ac081f6
AH
5969/* Expand an expression EXP that calls a built-in function,
5970 with result going to TARGET if that's convenient
5971 (and in mode MODE if that's convenient).
5972 SUBTARGET may be used as the target for computing one of EXP's operands.
5973 IGNORE is nonzero if the value is to be ignored. */
5974
5975static rtx
5976rs6000_expand_builtin (exp, target, subtarget, mode, ignore)
5977 tree exp;
5978 rtx target;
00b960c7
AH
5979 rtx subtarget ATTRIBUTE_UNUSED;
5980 enum machine_mode mode ATTRIBUTE_UNUSED;
5981 int ignore ATTRIBUTE_UNUSED;
0ac081f6 5982{
92898235
AH
5983 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
5984 tree arglist = TREE_OPERAND (exp, 1);
5985 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
5986 struct builtin_description *d;
5987 size_t i;
5988 rtx ret;
5989 bool success;
5990
0ac081f6 5991 if (TARGET_ALTIVEC)
92898235
AH
5992 {
5993 ret = altivec_expand_builtin (exp, target, &success);
5994
a3170dc6
AH
5995 if (success)
5996 return ret;
5997 }
5998 if (TARGET_SPE)
5999 {
6000 ret = spe_expand_builtin (exp, target, &success);
6001
92898235
AH
6002 if (success)
6003 return ret;
6004 }
6005
0559cc77
DE
6006 if (TARGET_ALTIVEC || TARGET_SPE)
6007 {
6008 /* Handle simple unary operations. */
6009 d = (struct builtin_description *) bdesc_1arg;
6010 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
6011 if (d->code == fcode)
6012 return rs6000_expand_unop_builtin (d->icode, arglist, target);
6013
6014 /* Handle simple binary operations. */
6015 d = (struct builtin_description *) bdesc_2arg;
6016 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
6017 if (d->code == fcode)
6018 return rs6000_expand_binop_builtin (d->icode, arglist, target);
6019
6020 /* Handle simple ternary operations. */
6021 d = (struct builtin_description *) bdesc_3arg;
6022 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
6023 if (d->code == fcode)
6024 return rs6000_expand_ternop_builtin (d->icode, arglist, target);
6025 }
0ac081f6
AH
6026
6027 abort ();
92898235 6028 return NULL_RTX;
0ac081f6
AH
6029}
6030
6031static void
6fa3f289 6032rs6000_init_builtins ()
0ac081f6 6033{
3fdaa45a
AH
6034 opaque_V2SI_type_node = copy_node (V2SI_type_node);
6035 opaque_V2SF_type_node = copy_node (V2SF_type_node);
6035d635 6036 opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
3fdaa45a 6037
a3170dc6 6038 if (TARGET_SPE)
3fdaa45a 6039 spe_init_builtins ();
0ac081f6
AH
6040 if (TARGET_ALTIVEC)
6041 altivec_init_builtins ();
0559cc77
DE
6042 if (TARGET_ALTIVEC || TARGET_SPE)
6043 rs6000_common_init_builtins ();
0ac081f6
AH
6044}
6045
a3170dc6
AH
6046/* Search through a set of builtins and enable the mask bits.
6047 DESC is an array of builtins.
b6d08ca1 6048 SIZE is the total number of builtins.
a3170dc6
AH
6049 START is the builtin enum at which to start.
6050 END is the builtin enum at which to end. */
0ac081f6 6051static void
a3170dc6
AH
6052enable_mask_for_builtins (desc, size, start, end)
6053 struct builtin_description *desc;
6054 int size;
6055 enum rs6000_builtins start, end;
6056{
6057 int i;
6058
6059 for (i = 0; i < size; ++i)
6060 if (desc[i].code == start)
6061 break;
6062
6063 if (i == size)
6064 return;
6065
6066 for (; i < size; ++i)
6067 {
6068 /* Flip all the bits on. */
6069 desc[i].mask = target_flags;
6070 if (desc[i].code == end)
6071 break;
6072 }
6073}
6074
6075static void
b24c9d35 6076spe_init_builtins ()
0ac081f6 6077{
a3170dc6
AH
6078 tree endlink = void_list_node;
6079 tree puint_type_node = build_pointer_type (unsigned_type_node);
6080 tree pushort_type_node = build_pointer_type (short_unsigned_type_node);
ae4b4a02 6081 struct builtin_description *d;
0ac081f6
AH
6082 size_t i;
6083
a3170dc6
AH
6084 tree v2si_ftype_4_v2si
6085 = build_function_type
3fdaa45a
AH
6086 (opaque_V2SI_type_node,
6087 tree_cons (NULL_TREE, opaque_V2SI_type_node,
6088 tree_cons (NULL_TREE, opaque_V2SI_type_node,
6089 tree_cons (NULL_TREE, opaque_V2SI_type_node,
6090 tree_cons (NULL_TREE, opaque_V2SI_type_node,
a3170dc6
AH
6091 endlink)))));
6092
6093 tree v2sf_ftype_4_v2sf
6094 = build_function_type
3fdaa45a
AH
6095 (opaque_V2SF_type_node,
6096 tree_cons (NULL_TREE, opaque_V2SF_type_node,
6097 tree_cons (NULL_TREE, opaque_V2SF_type_node,
6098 tree_cons (NULL_TREE, opaque_V2SF_type_node,
6099 tree_cons (NULL_TREE, opaque_V2SF_type_node,
a3170dc6
AH
6100 endlink)))));
6101
6102 tree int_ftype_int_v2si_v2si
6103 = build_function_type
6104 (integer_type_node,
6105 tree_cons (NULL_TREE, integer_type_node,
3fdaa45a
AH
6106 tree_cons (NULL_TREE, opaque_V2SI_type_node,
6107 tree_cons (NULL_TREE, opaque_V2SI_type_node,
a3170dc6
AH
6108 endlink))));
6109
6110 tree int_ftype_int_v2sf_v2sf
6111 = build_function_type
6112 (integer_type_node,
6113 tree_cons (NULL_TREE, integer_type_node,
3fdaa45a
AH
6114 tree_cons (NULL_TREE, opaque_V2SF_type_node,
6115 tree_cons (NULL_TREE, opaque_V2SF_type_node,
a3170dc6
AH
6116 endlink))));
6117
6118 tree void_ftype_v2si_puint_int
6119 = build_function_type (void_type_node,
3fdaa45a 6120 tree_cons (NULL_TREE, opaque_V2SI_type_node,
a3170dc6
AH
6121 tree_cons (NULL_TREE, puint_type_node,
6122 tree_cons (NULL_TREE,
6123 integer_type_node,
6124 endlink))));
6125
6126 tree void_ftype_v2si_puint_char
6127 = build_function_type (void_type_node,
3fdaa45a 6128 tree_cons (NULL_TREE, opaque_V2SI_type_node,
a3170dc6
AH
6129 tree_cons (NULL_TREE, puint_type_node,
6130 tree_cons (NULL_TREE,
6131 char_type_node,
6132 endlink))));
6133
6134 tree void_ftype_v2si_pv2si_int
6135 = build_function_type (void_type_node,
3fdaa45a 6136 tree_cons (NULL_TREE, opaque_V2SI_type_node,
6035d635 6137 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
a3170dc6
AH
6138 tree_cons (NULL_TREE,
6139 integer_type_node,
6140 endlink))));
6141
6142 tree void_ftype_v2si_pv2si_char
6143 = build_function_type (void_type_node,
3fdaa45a 6144 tree_cons (NULL_TREE, opaque_V2SI_type_node,
6035d635 6145 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
a3170dc6
AH
6146 tree_cons (NULL_TREE,
6147 char_type_node,
6148 endlink))));
6149
6150 tree void_ftype_int
6151 = build_function_type (void_type_node,
6152 tree_cons (NULL_TREE, integer_type_node, endlink));
6153
6154 tree int_ftype_void
36e8d515 6155 = build_function_type (integer_type_node, endlink);
a3170dc6
AH
6156
6157 tree v2si_ftype_pv2si_int
3fdaa45a 6158 = build_function_type (opaque_V2SI_type_node,
6035d635 6159 tree_cons (NULL_TREE, opaque_p_V2SI_type_node,
a3170dc6
AH
6160 tree_cons (NULL_TREE, integer_type_node,
6161 endlink)));
6162
6163 tree v2si_ftype_puint_int
3fdaa45a 6164 = build_function_type (opaque_V2SI_type_node,
a3170dc6
AH
6165 tree_cons (NULL_TREE, puint_type_node,
6166 tree_cons (NULL_TREE, integer_type_node,
6167 endlink)));
6168
6169 tree v2si_ftype_pushort_int
3fdaa45a 6170 = build_function_type (opaque_V2SI_type_node,
a3170dc6
AH
6171 tree_cons (NULL_TREE, pushort_type_node,
6172 tree_cons (NULL_TREE, integer_type_node,
6173 endlink)));
6174
6175 /* The initialization of the simple binary and unary builtins is
6176 done in rs6000_common_init_builtins, but we have to enable the
6177 mask bits here manually because we have run out of `target_flags'
6178 bits. We really need to redesign this mask business. */
6179
6180 enable_mask_for_builtins ((struct builtin_description *) bdesc_2arg,
6181 ARRAY_SIZE (bdesc_2arg),
6182 SPE_BUILTIN_EVADDW,
6183 SPE_BUILTIN_EVXOR);
6184 enable_mask_for_builtins ((struct builtin_description *) bdesc_1arg,
6185 ARRAY_SIZE (bdesc_1arg),
6186 SPE_BUILTIN_EVABS,
6187 SPE_BUILTIN_EVSUBFUSIAAW);
6188 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_predicates,
6189 ARRAY_SIZE (bdesc_spe_predicates),
6190 SPE_BUILTIN_EVCMPEQ,
6191 SPE_BUILTIN_EVFSTSTLT);
6192 enable_mask_for_builtins ((struct builtin_description *) bdesc_spe_evsel,
6193 ARRAY_SIZE (bdesc_spe_evsel),
6194 SPE_BUILTIN_EVSEL_CMPGTS,
6195 SPE_BUILTIN_EVSEL_FSTSTEQ);
6196
6197 /* Initialize irregular SPE builtins. */
6198
6199 def_builtin (target_flags, "__builtin_spe_mtspefscr", void_ftype_int, SPE_BUILTIN_MTSPEFSCR);
6200 def_builtin (target_flags, "__builtin_spe_mfspefscr", int_ftype_void, SPE_BUILTIN_MFSPEFSCR);
6201 def_builtin (target_flags, "__builtin_spe_evstddx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDDX);
6202 def_builtin (target_flags, "__builtin_spe_evstdhx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDHX);
6203 def_builtin (target_flags, "__builtin_spe_evstdwx", void_ftype_v2si_pv2si_int, SPE_BUILTIN_EVSTDWX);
6204 def_builtin (target_flags, "__builtin_spe_evstwhex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHEX);
6205 def_builtin (target_flags, "__builtin_spe_evstwhox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWHOX);
6206 def_builtin (target_flags, "__builtin_spe_evstwwex", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWEX);
6207 def_builtin (target_flags, "__builtin_spe_evstwwox", void_ftype_v2si_puint_int, SPE_BUILTIN_EVSTWWOX);
6208 def_builtin (target_flags, "__builtin_spe_evstdd", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDD);
6209 def_builtin (target_flags, "__builtin_spe_evstdh", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDH);
6210 def_builtin (target_flags, "__builtin_spe_evstdw", void_ftype_v2si_pv2si_char, SPE_BUILTIN_EVSTDW);
6211 def_builtin (target_flags, "__builtin_spe_evstwhe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHE);
6212 def_builtin (target_flags, "__builtin_spe_evstwho", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWHO);
6213 def_builtin (target_flags, "__builtin_spe_evstwwe", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWE);
6214 def_builtin (target_flags, "__builtin_spe_evstwwo", void_ftype_v2si_puint_char, SPE_BUILTIN_EVSTWWO);
6215
6216 /* Loads. */
6217 def_builtin (target_flags, "__builtin_spe_evlddx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDDX);
6218 def_builtin (target_flags, "__builtin_spe_evldwx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDWX);
6219 def_builtin (target_flags, "__builtin_spe_evldhx", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDHX);
6220 def_builtin (target_flags, "__builtin_spe_evlwhex", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHEX);
6221 def_builtin (target_flags, "__builtin_spe_evlwhoux", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOUX);
6222 def_builtin (target_flags, "__builtin_spe_evlwhosx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOSX);
6223 def_builtin (target_flags, "__builtin_spe_evlwwsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLATX);
6224 def_builtin (target_flags, "__builtin_spe_evlwhsplatx", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLATX);
6225 def_builtin (target_flags, "__builtin_spe_evlhhesplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLATX);
6226 def_builtin (target_flags, "__builtin_spe_evlhhousplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLATX);
6227 def_builtin (target_flags, "__builtin_spe_evlhhossplatx", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLATX);
6228 def_builtin (target_flags, "__builtin_spe_evldd", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDD);
6229 def_builtin (target_flags, "__builtin_spe_evldw", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDW);
6230 def_builtin (target_flags, "__builtin_spe_evldh", v2si_ftype_pv2si_int, SPE_BUILTIN_EVLDH);
6231 def_builtin (target_flags, "__builtin_spe_evlhhesplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHESPLAT);
6232 def_builtin (target_flags, "__builtin_spe_evlhhossplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOSSPLAT);
6233 def_builtin (target_flags, "__builtin_spe_evlhhousplat", v2si_ftype_pushort_int, SPE_BUILTIN_EVLHHOUSPLAT);
6234 def_builtin (target_flags, "__builtin_spe_evlwhe", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHE);
6235 def_builtin (target_flags, "__builtin_spe_evlwhos", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOS);
6236 def_builtin (target_flags, "__builtin_spe_evlwhou", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHOU);
6237 def_builtin (target_flags, "__builtin_spe_evlwhsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWHSPLAT);
6238 def_builtin (target_flags, "__builtin_spe_evlwwsplat", v2si_ftype_puint_int, SPE_BUILTIN_EVLWWSPLAT);
6239
6240 /* Predicates. */
6241 d = (struct builtin_description *) bdesc_spe_predicates;
6242 for (i = 0; i < ARRAY_SIZE (bdesc_spe_predicates); ++i, d++)
6243 {
6244 tree type;
6245
6246 switch (insn_data[d->icode].operand[1].mode)
6247 {
6248 case V2SImode:
6249 type = int_ftype_int_v2si_v2si;
6250 break;
6251 case V2SFmode:
6252 type = int_ftype_int_v2sf_v2sf;
6253 break;
6254 default:
6255 abort ();
6256 }
6257
6258 def_builtin (d->mask, d->name, type, d->code);
6259 }
6260
6261 /* Evsel predicates. */
6262 d = (struct builtin_description *) bdesc_spe_evsel;
6263 for (i = 0; i < ARRAY_SIZE (bdesc_spe_evsel); ++i, d++)
6264 {
6265 tree type;
6266
6267 switch (insn_data[d->icode].operand[1].mode)
6268 {
6269 case V2SImode:
6270 type = v2si_ftype_4_v2si;
6271 break;
6272 case V2SFmode:
6273 type = v2sf_ftype_4_v2sf;
6274 break;
6275 default:
6276 abort ();
6277 }
6278
6279 def_builtin (d->mask, d->name, type, d->code);
6280 }
6281}
6282
6283static void
b24c9d35 6284altivec_init_builtins ()
a3170dc6
AH
6285{
6286 struct builtin_description *d;
6287 struct builtin_description_predicates *dp;
6288 size_t i;
6289 tree pfloat_type_node = build_pointer_type (float_type_node);
6290 tree pint_type_node = build_pointer_type (integer_type_node);
6291 tree pshort_type_node = build_pointer_type (short_integer_type_node);
6292 tree pchar_type_node = build_pointer_type (char_type_node);
6293
6294 tree pvoid_type_node = build_pointer_type (void_type_node);
6295
0dbc3651
ZW
6296 tree pcfloat_type_node = build_pointer_type (build_qualified_type (float_type_node, TYPE_QUAL_CONST));
6297 tree pcint_type_node = build_pointer_type (build_qualified_type (integer_type_node, TYPE_QUAL_CONST));
6298 tree pcshort_type_node = build_pointer_type (build_qualified_type (short_integer_type_node, TYPE_QUAL_CONST));
6299 tree pcchar_type_node = build_pointer_type (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
6300
6301 tree pcvoid_type_node = build_pointer_type (build_qualified_type (void_type_node, TYPE_QUAL_CONST));
6302
a3170dc6
AH
6303 tree int_ftype_int_v4si_v4si
6304 = build_function_type_list (integer_type_node,
6305 integer_type_node, V4SI_type_node,
6306 V4SI_type_node, NULL_TREE);
0dbc3651
ZW
6307 tree v4sf_ftype_pcfloat
6308 = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
a3170dc6 6309 tree void_ftype_pfloat_v4sf
b4de2f7d 6310 = build_function_type_list (void_type_node,
a3170dc6 6311 pfloat_type_node, V4SF_type_node, NULL_TREE);
0dbc3651
ZW
6312 tree v4si_ftype_pcint
6313 = build_function_type_list (V4SI_type_node, pcint_type_node, NULL_TREE);
6314 tree void_ftype_pint_v4si
b4de2f7d
AH
6315 = build_function_type_list (void_type_node,
6316 pint_type_node, V4SI_type_node, NULL_TREE);
0dbc3651
ZW
6317 tree v8hi_ftype_pcshort
6318 = build_function_type_list (V8HI_type_node, pcshort_type_node, NULL_TREE);
f18c054f 6319 tree void_ftype_pshort_v8hi
b4de2f7d
AH
6320 = build_function_type_list (void_type_node,
6321 pshort_type_node, V8HI_type_node, NULL_TREE);
0dbc3651
ZW
6322 tree v16qi_ftype_pcchar
6323 = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
f18c054f 6324 tree void_ftype_pchar_v16qi
b4de2f7d
AH
6325 = build_function_type_list (void_type_node,
6326 pchar_type_node, V16QI_type_node, NULL_TREE);
95385cbb 6327 tree void_ftype_v4si
b4de2f7d 6328 = build_function_type_list (void_type_node, V4SI_type_node, NULL_TREE);
a3170dc6
AH
6329 tree v8hi_ftype_void
6330 = build_function_type (V8HI_type_node, void_list_node);
6331 tree void_ftype_void
6332 = build_function_type (void_type_node, void_list_node);
6333 tree void_ftype_qi
6334 = build_function_type_list (void_type_node, char_type_node, NULL_TREE);
0dbc3651
ZW
6335
6336 tree v16qi_ftype_int_pcvoid
a3170dc6 6337 = build_function_type_list (V16QI_type_node,
0dbc3651
ZW
6338 integer_type_node, pcvoid_type_node, NULL_TREE);
6339 tree v8hi_ftype_int_pcvoid
a3170dc6 6340 = build_function_type_list (V8HI_type_node,
0dbc3651
ZW
6341 integer_type_node, pcvoid_type_node, NULL_TREE);
6342 tree v4si_ftype_int_pcvoid
a3170dc6 6343 = build_function_type_list (V4SI_type_node,
0dbc3651
ZW
6344 integer_type_node, pcvoid_type_node, NULL_TREE);
6345
14b32f4e 6346 tree void_ftype_v4si_int_pvoid
b4de2f7d
AH
6347 = build_function_type_list (void_type_node,
6348 V4SI_type_node, integer_type_node,
6349 pvoid_type_node, NULL_TREE);
6525c0e7 6350 tree void_ftype_v16qi_int_pvoid
b4de2f7d
AH
6351 = build_function_type_list (void_type_node,
6352 V16QI_type_node, integer_type_node,
6353 pvoid_type_node, NULL_TREE);
6525c0e7 6354 tree void_ftype_v8hi_int_pvoid
b4de2f7d
AH
6355 = build_function_type_list (void_type_node,
6356 V8HI_type_node, integer_type_node,
6357 pvoid_type_node, NULL_TREE);
a3170dc6
AH
6358 tree int_ftype_int_v8hi_v8hi
6359 = build_function_type_list (integer_type_node,
6360 integer_type_node, V8HI_type_node,
6361 V8HI_type_node, NULL_TREE);
6362 tree int_ftype_int_v16qi_v16qi
6363 = build_function_type_list (integer_type_node,
6364 integer_type_node, V16QI_type_node,
6365 V16QI_type_node, NULL_TREE);
6366 tree int_ftype_int_v4sf_v4sf
6367 = build_function_type_list (integer_type_node,
6368 integer_type_node, V4SF_type_node,
6369 V4SF_type_node, NULL_TREE);
6370 tree v4si_ftype_v4si
6371 = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
6372 tree v8hi_ftype_v8hi
6373 = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
6374 tree v16qi_ftype_v16qi
6375 = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
6376 tree v4sf_ftype_v4sf
6377 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
0dbc3651 6378 tree void_ftype_pcvoid_int_char
a3170dc6 6379 = build_function_type_list (void_type_node,
0dbc3651 6380 pcvoid_type_node, integer_type_node,
a3170dc6 6381 char_type_node, NULL_TREE);
0dbc3651
ZW
6382
6383 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4sf", v4sf_ftype_pcfloat,
6384 ALTIVEC_BUILTIN_LD_INTERNAL_4sf);
6385 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4sf", void_ftype_pfloat_v4sf,
6386 ALTIVEC_BUILTIN_ST_INTERNAL_4sf);
6387 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_4si", v4si_ftype_pcint,
6388 ALTIVEC_BUILTIN_LD_INTERNAL_4si);
6389 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_4si", void_ftype_pint_v4si,
6390 ALTIVEC_BUILTIN_ST_INTERNAL_4si);
6391 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_8hi", v8hi_ftype_pcshort,
6392 ALTIVEC_BUILTIN_LD_INTERNAL_8hi);
6393 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_8hi", void_ftype_pshort_v8hi,
6394 ALTIVEC_BUILTIN_ST_INTERNAL_8hi);
6395 def_builtin (MASK_ALTIVEC, "__builtin_altivec_ld_internal_16qi", v16qi_ftype_pcchar,
6396 ALTIVEC_BUILTIN_LD_INTERNAL_16qi);
6397 def_builtin (MASK_ALTIVEC, "__builtin_altivec_st_internal_16qi", void_ftype_pchar_v16qi,
6398 ALTIVEC_BUILTIN_ST_INTERNAL_16qi);
a3170dc6
AH
6399 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mtvscr", void_ftype_v4si, ALTIVEC_BUILTIN_MTVSCR);
6400 def_builtin (MASK_ALTIVEC, "__builtin_altivec_mfvscr", v8hi_ftype_void, ALTIVEC_BUILTIN_MFVSCR);
6401 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dssall", void_ftype_void, ALTIVEC_BUILTIN_DSSALL);
6402 def_builtin (MASK_ALTIVEC, "__builtin_altivec_dss", void_ftype_qi, ALTIVEC_BUILTIN_DSS);
0dbc3651
ZW
6403 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsl", v16qi_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVSL);
6404 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvsr", v16qi_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVSR);
6405 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvebx", v16qi_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVEBX);
6406 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvehx", v8hi_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVEHX);
6407 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvewx", v4si_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVEWX);
6408 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvxl", v4si_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVXL);
6409 def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvx", v4si_ftype_int_pcvoid, ALTIVEC_BUILTIN_LVX);
a3170dc6
AH
6410 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvx", void_ftype_v4si_int_pvoid, ALTIVEC_BUILTIN_STVX);
6411 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_int_pvoid, ALTIVEC_BUILTIN_STVEWX);
6412 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_int_pvoid, ALTIVEC_BUILTIN_STVXL);
6413 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvebx", void_ftype_v16qi_int_pvoid, ALTIVEC_BUILTIN_STVEBX);
6414 def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_int_pvoid, ALTIVEC_BUILTIN_STVEHX);
6415
6416 /* Add the DST variants. */
6417 d = (struct builtin_description *) bdesc_dst;
6418 for (i = 0; i < ARRAY_SIZE (bdesc_dst); i++, d++)
0dbc3651 6419 def_builtin (d->mask, d->name, void_ftype_pcvoid_int_char, d->code);
a3170dc6
AH
6420
6421 /* Initialize the predicates. */
6422 dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
6423 for (i = 0; i < ARRAY_SIZE (bdesc_altivec_preds); i++, dp++)
6424 {
6425 enum machine_mode mode1;
6426 tree type;
6427
6428 mode1 = insn_data[dp->icode].operand[1].mode;
6429
6430 switch (mode1)
6431 {
6432 case V4SImode:
6433 type = int_ftype_int_v4si_v4si;
6434 break;
6435 case V8HImode:
6436 type = int_ftype_int_v8hi_v8hi;
6437 break;
6438 case V16QImode:
6439 type = int_ftype_int_v16qi_v16qi;
6440 break;
6441 case V4SFmode:
6442 type = int_ftype_int_v4sf_v4sf;
6443 break;
6444 default:
6445 abort ();
6446 }
6447
6448 def_builtin (dp->mask, dp->name, type, dp->code);
6449 }
6450
6451 /* Initialize the abs* operators. */
6452 d = (struct builtin_description *) bdesc_abs;
6453 for (i = 0; i < ARRAY_SIZE (bdesc_abs); i++, d++)
6454 {
6455 enum machine_mode mode0;
6456 tree type;
6457
6458 mode0 = insn_data[d->icode].operand[0].mode;
6459
6460 switch (mode0)
6461 {
6462 case V4SImode:
6463 type = v4si_ftype_v4si;
6464 break;
6465 case V8HImode:
6466 type = v8hi_ftype_v8hi;
6467 break;
6468 case V16QImode:
6469 type = v16qi_ftype_v16qi;
6470 break;
6471 case V4SFmode:
6472 type = v4sf_ftype_v4sf;
6473 break;
6474 default:
6475 abort ();
6476 }
6477
6478 def_builtin (d->mask, d->name, type, d->code);
6479 }
6480}
6481
6482static void
b24c9d35 6483rs6000_common_init_builtins ()
a3170dc6
AH
6484{
6485 struct builtin_description *d;
6486 size_t i;
6487
6488 tree v4sf_ftype_v4sf_v4sf_v16qi
6489 = build_function_type_list (V4SF_type_node,
6490 V4SF_type_node, V4SF_type_node,
6491 V16QI_type_node, NULL_TREE);
6492 tree v4si_ftype_v4si_v4si_v16qi
6493 = build_function_type_list (V4SI_type_node,
6494 V4SI_type_node, V4SI_type_node,
6495 V16QI_type_node, NULL_TREE);
6496 tree v8hi_ftype_v8hi_v8hi_v16qi
6497 = build_function_type_list (V8HI_type_node,
6498 V8HI_type_node, V8HI_type_node,
6499 V16QI_type_node, NULL_TREE);
6500 tree v16qi_ftype_v16qi_v16qi_v16qi
6501 = build_function_type_list (V16QI_type_node,
6502 V16QI_type_node, V16QI_type_node,
6503 V16QI_type_node, NULL_TREE);
6504 tree v4si_ftype_char
6505 = build_function_type_list (V4SI_type_node, char_type_node, NULL_TREE);
6506 tree v8hi_ftype_char
6507 = build_function_type_list (V8HI_type_node, char_type_node, NULL_TREE);
6508 tree v16qi_ftype_char
6509 = build_function_type_list (V16QI_type_node, char_type_node, NULL_TREE);
6510 tree v8hi_ftype_v16qi
6511 = build_function_type_list (V8HI_type_node, V16QI_type_node, NULL_TREE);
6512 tree v4sf_ftype_v4sf
6513 = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
6514
6515 tree v2si_ftype_v2si_v2si
2abe3e28
AH
6516 = build_function_type_list (opaque_V2SI_type_node,
6517 opaque_V2SI_type_node,
6518 opaque_V2SI_type_node, NULL_TREE);
a3170dc6
AH
6519
6520 tree v2sf_ftype_v2sf_v2sf
2abe3e28
AH
6521 = build_function_type_list (opaque_V2SF_type_node,
6522 opaque_V2SF_type_node,
6523 opaque_V2SF_type_node, NULL_TREE);
a3170dc6
AH
6524
6525 tree v2si_ftype_int_int
2abe3e28 6526 = build_function_type_list (opaque_V2SI_type_node,
a3170dc6
AH
6527 integer_type_node, integer_type_node,
6528 NULL_TREE);
6529
6530 tree v2si_ftype_v2si
2abe3e28
AH
6531 = build_function_type_list (opaque_V2SI_type_node,
6532 opaque_V2SI_type_node, NULL_TREE);
a3170dc6
AH
6533
6534 tree v2sf_ftype_v2sf
2abe3e28
AH
6535 = build_function_type_list (opaque_V2SF_type_node,
6536 opaque_V2SF_type_node, NULL_TREE);
a3170dc6
AH
6537
6538 tree v2sf_ftype_v2si
2abe3e28
AH
6539 = build_function_type_list (opaque_V2SF_type_node,
6540 opaque_V2SI_type_node, NULL_TREE);
a3170dc6
AH
6541
6542 tree v2si_ftype_v2sf
2abe3e28
AH
6543 = build_function_type_list (opaque_V2SI_type_node,
6544 opaque_V2SF_type_node, NULL_TREE);
a3170dc6
AH
6545
6546 tree v2si_ftype_v2si_char
2abe3e28
AH
6547 = build_function_type_list (opaque_V2SI_type_node,
6548 opaque_V2SI_type_node,
6549 char_type_node, NULL_TREE);
a3170dc6
AH
6550
6551 tree v2si_ftype_int_char
2abe3e28 6552 = build_function_type_list (opaque_V2SI_type_node,
a3170dc6
AH
6553 integer_type_node, char_type_node, NULL_TREE);
6554
6555 tree v2si_ftype_char
2abe3e28
AH
6556 = build_function_type_list (opaque_V2SI_type_node,
6557 char_type_node, NULL_TREE);
a3170dc6
AH
6558
6559 tree int_ftype_int_int
6560 = build_function_type_list (integer_type_node,
6561 integer_type_node, integer_type_node,
6562 NULL_TREE);
95385cbb 6563
0ac081f6 6564 tree v4si_ftype_v4si_v4si
b4de2f7d
AH
6565 = build_function_type_list (V4SI_type_node,
6566 V4SI_type_node, V4SI_type_node, NULL_TREE);
617e0e1d 6567 tree v4sf_ftype_v4si_char
b4de2f7d
AH
6568 = build_function_type_list (V4SF_type_node,
6569 V4SI_type_node, char_type_node, NULL_TREE);
617e0e1d 6570 tree v4si_ftype_v4sf_char
b4de2f7d
AH
6571 = build_function_type_list (V4SI_type_node,
6572 V4SF_type_node, char_type_node, NULL_TREE);
2212663f 6573 tree v4si_ftype_v4si_char
b4de2f7d
AH
6574 = build_function_type_list (V4SI_type_node,
6575 V4SI_type_node, char_type_node, NULL_TREE);
2212663f 6576 tree v8hi_ftype_v8hi_char
b4de2f7d
AH
6577 = build_function_type_list (V8HI_type_node,
6578 V8HI_type_node, char_type_node, NULL_TREE);
2212663f 6579 tree v16qi_ftype_v16qi_char
b4de2f7d
AH
6580 = build_function_type_list (V16QI_type_node,
6581 V16QI_type_node, char_type_node, NULL_TREE);
24408032 6582 tree v16qi_ftype_v16qi_v16qi_char
b4de2f7d
AH
6583 = build_function_type_list (V16QI_type_node,
6584 V16QI_type_node, V16QI_type_node,
6585 char_type_node, NULL_TREE);
24408032 6586 tree v8hi_ftype_v8hi_v8hi_char
b4de2f7d
AH
6587 = build_function_type_list (V8HI_type_node,
6588 V8HI_type_node, V8HI_type_node,
6589 char_type_node, NULL_TREE);
24408032 6590 tree v4si_ftype_v4si_v4si_char
b4de2f7d
AH
6591 = build_function_type_list (V4SI_type_node,
6592 V4SI_type_node, V4SI_type_node,
6593 char_type_node, NULL_TREE);
24408032 6594 tree v4sf_ftype_v4sf_v4sf_char
b4de2f7d
AH
6595 = build_function_type_list (V4SF_type_node,
6596 V4SF_type_node, V4SF_type_node,
6597 char_type_node, NULL_TREE);
0ac081f6 6598 tree v4sf_ftype_v4sf_v4sf
b4de2f7d
AH
6599 = build_function_type_list (V4SF_type_node,
6600 V4SF_type_node, V4SF_type_node, NULL_TREE);
617e0e1d 6601 tree v4sf_ftype_v4sf_v4sf_v4si
b4de2f7d
AH
6602 = build_function_type_list (V4SF_type_node,
6603 V4SF_type_node, V4SF_type_node,
6604 V4SI_type_node, NULL_TREE);
2212663f 6605 tree v4sf_ftype_v4sf_v4sf_v4sf
b4de2f7d
AH
6606 = build_function_type_list (V4SF_type_node,
6607 V4SF_type_node, V4SF_type_node,
6608 V4SF_type_node, NULL_TREE);
617e0e1d 6609 tree v4si_ftype_v4si_v4si_v4si
b4de2f7d
AH
6610 = build_function_type_list (V4SI_type_node,
6611 V4SI_type_node, V4SI_type_node,
6612 V4SI_type_node, NULL_TREE);
0ac081f6 6613 tree v8hi_ftype_v8hi_v8hi
b4de2f7d
AH
6614 = build_function_type_list (V8HI_type_node,
6615 V8HI_type_node, V8HI_type_node, NULL_TREE);
2212663f 6616 tree v8hi_ftype_v8hi_v8hi_v8hi
b4de2f7d
AH
6617 = build_function_type_list (V8HI_type_node,
6618 V8HI_type_node, V8HI_type_node,
6619 V8HI_type_node, NULL_TREE);
2212663f 6620 tree v4si_ftype_v8hi_v8hi_v4si
b4de2f7d
AH
6621 = build_function_type_list (V4SI_type_node,
6622 V8HI_type_node, V8HI_type_node,
6623 V4SI_type_node, NULL_TREE);
2212663f 6624 tree v4si_ftype_v16qi_v16qi_v4si
b4de2f7d
AH
6625 = build_function_type_list (V4SI_type_node,
6626 V16QI_type_node, V16QI_type_node,
6627 V4SI_type_node, NULL_TREE);
0ac081f6 6628 tree v16qi_ftype_v16qi_v16qi
b4de2f7d
AH
6629 = build_function_type_list (V16QI_type_node,
6630 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 6631 tree v4si_ftype_v4sf_v4sf
b4de2f7d
AH
6632 = build_function_type_list (V4SI_type_node,
6633 V4SF_type_node, V4SF_type_node, NULL_TREE);
0ac081f6 6634 tree v8hi_ftype_v16qi_v16qi
b4de2f7d
AH
6635 = build_function_type_list (V8HI_type_node,
6636 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 6637 tree v4si_ftype_v8hi_v8hi
b4de2f7d
AH
6638 = build_function_type_list (V4SI_type_node,
6639 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 6640 tree v8hi_ftype_v4si_v4si
b4de2f7d
AH
6641 = build_function_type_list (V8HI_type_node,
6642 V4SI_type_node, V4SI_type_node, NULL_TREE);
0ac081f6 6643 tree v16qi_ftype_v8hi_v8hi
b4de2f7d
AH
6644 = build_function_type_list (V16QI_type_node,
6645 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 6646 tree v4si_ftype_v16qi_v4si
b4de2f7d
AH
6647 = build_function_type_list (V4SI_type_node,
6648 V16QI_type_node, V4SI_type_node, NULL_TREE);
fa066a23 6649 tree v4si_ftype_v16qi_v16qi
b4de2f7d
AH
6650 = build_function_type_list (V4SI_type_node,
6651 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 6652 tree v4si_ftype_v8hi_v4si
b4de2f7d
AH
6653 = build_function_type_list (V4SI_type_node,
6654 V8HI_type_node, V4SI_type_node, NULL_TREE);
a3170dc6
AH
6655 tree v4si_ftype_v8hi
6656 = build_function_type_list (V4SI_type_node, V8HI_type_node, NULL_TREE);
6657 tree int_ftype_v4si_v4si
6658 = build_function_type_list (integer_type_node,
6659 V4SI_type_node, V4SI_type_node, NULL_TREE);
6660 tree int_ftype_v4sf_v4sf
6661 = build_function_type_list (integer_type_node,
6662 V4SF_type_node, V4SF_type_node, NULL_TREE);
6663 tree int_ftype_v16qi_v16qi
6664 = build_function_type_list (integer_type_node,
6665 V16QI_type_node, V16QI_type_node, NULL_TREE);
0ac081f6 6666 tree int_ftype_v8hi_v8hi
b4de2f7d
AH
6667 = build_function_type_list (integer_type_node,
6668 V8HI_type_node, V8HI_type_node, NULL_TREE);
0ac081f6 6669
6f317ef3 6670 /* Add the simple ternary operators. */
2212663f 6671 d = (struct builtin_description *) bdesc_3arg;
ca7558fc 6672 for (i = 0; i < ARRAY_SIZE (bdesc_3arg); i++, d++)
2212663f
DB
6673 {
6674
6675 enum machine_mode mode0, mode1, mode2, mode3;
6676 tree type;
6677
0559cc77 6678 if (d->name == 0 || d->icode == CODE_FOR_nothing)
2212663f
DB
6679 continue;
6680
6681 mode0 = insn_data[d->icode].operand[0].mode;
6682 mode1 = insn_data[d->icode].operand[1].mode;
6683 mode2 = insn_data[d->icode].operand[2].mode;
6684 mode3 = insn_data[d->icode].operand[3].mode;
6685
6686 /* When all four are of the same mode. */
6687 if (mode0 == mode1 && mode1 == mode2 && mode2 == mode3)
6688 {
6689 switch (mode0)
6690 {
617e0e1d
DB
6691 case V4SImode:
6692 type = v4si_ftype_v4si_v4si_v4si;
6693 break;
2212663f
DB
6694 case V4SFmode:
6695 type = v4sf_ftype_v4sf_v4sf_v4sf;
6696 break;
6697 case V8HImode:
6698 type = v8hi_ftype_v8hi_v8hi_v8hi;
6699 break;
6700 case V16QImode:
6701 type = v16qi_ftype_v16qi_v16qi_v16qi;
6702 break;
6703 default:
6704 abort();
6705 }
6706 }
6707 else if (mode0 == mode1 && mode1 == mode2 && mode3 == V16QImode)
6708 {
6709 switch (mode0)
6710 {
6711 case V4SImode:
6712 type = v4si_ftype_v4si_v4si_v16qi;
6713 break;
6714 case V4SFmode:
6715 type = v4sf_ftype_v4sf_v4sf_v16qi;
6716 break;
6717 case V8HImode:
6718 type = v8hi_ftype_v8hi_v8hi_v16qi;
6719 break;
6720 case V16QImode:
6721 type = v16qi_ftype_v16qi_v16qi_v16qi;
6722 break;
6723 default:
6724 abort();
6725 }
6726 }
6727 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode
6728 && mode3 == V4SImode)
24408032 6729 type = v4si_ftype_v16qi_v16qi_v4si;
2212663f
DB
6730 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode
6731 && mode3 == V4SImode)
24408032 6732 type = v4si_ftype_v8hi_v8hi_v4si;
617e0e1d
DB
6733 else if (mode0 == V4SFmode && mode1 == V4SFmode && mode2 == V4SFmode
6734 && mode3 == V4SImode)
24408032
AH
6735 type = v4sf_ftype_v4sf_v4sf_v4si;
6736
6737 /* vchar, vchar, vchar, 4 bit literal. */
6738 else if (mode0 == V16QImode && mode1 == mode0 && mode2 == mode0
6739 && mode3 == QImode)
6740 type = v16qi_ftype_v16qi_v16qi_char;
6741
6742 /* vshort, vshort, vshort, 4 bit literal. */
6743 else if (mode0 == V8HImode && mode1 == mode0 && mode2 == mode0
6744 && mode3 == QImode)
6745 type = v8hi_ftype_v8hi_v8hi_char;
6746
6747 /* vint, vint, vint, 4 bit literal. */
6748 else if (mode0 == V4SImode && mode1 == mode0 && mode2 == mode0
6749 && mode3 == QImode)
6750 type = v4si_ftype_v4si_v4si_char;
6751
6752 /* vfloat, vfloat, vfloat, 4 bit literal. */
6753 else if (mode0 == V4SFmode && mode1 == mode0 && mode2 == mode0
6754 && mode3 == QImode)
6755 type = v4sf_ftype_v4sf_v4sf_char;
6756
2212663f
DB
6757 else
6758 abort ();
6759
6760 def_builtin (d->mask, d->name, type, d->code);
6761 }
6762
0ac081f6 6763 /* Add the simple binary operators. */
00b960c7 6764 d = (struct builtin_description *) bdesc_2arg;
ca7558fc 6765 for (i = 0; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
0ac081f6
AH
6766 {
6767 enum machine_mode mode0, mode1, mode2;
6768 tree type;
6769
0559cc77 6770 if (d->name == 0 || d->icode == CODE_FOR_nothing)
0ac081f6
AH
6771 continue;
6772
6773 mode0 = insn_data[d->icode].operand[0].mode;
6774 mode1 = insn_data[d->icode].operand[1].mode;
6775 mode2 = insn_data[d->icode].operand[2].mode;
6776
6777 /* When all three operands are of the same mode. */
6778 if (mode0 == mode1 && mode1 == mode2)
6779 {
6780 switch (mode0)
6781 {
6782 case V4SFmode:
6783 type = v4sf_ftype_v4sf_v4sf;
6784 break;
6785 case V4SImode:
6786 type = v4si_ftype_v4si_v4si;
6787 break;
6788 case V16QImode:
6789 type = v16qi_ftype_v16qi_v16qi;
6790 break;
6791 case V8HImode:
6792 type = v8hi_ftype_v8hi_v8hi;
6793 break;
a3170dc6
AH
6794 case V2SImode:
6795 type = v2si_ftype_v2si_v2si;
6796 break;
6797 case V2SFmode:
6798 type = v2sf_ftype_v2sf_v2sf;
6799 break;
6800 case SImode:
6801 type = int_ftype_int_int;
6802 break;
0ac081f6
AH
6803 default:
6804 abort ();
6805 }
6806 }
6807
6808 /* A few other combos we really don't want to do manually. */
6809
6810 /* vint, vfloat, vfloat. */
6811 else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == V4SFmode)
6812 type = v4si_ftype_v4sf_v4sf;
6813
6814 /* vshort, vchar, vchar. */
6815 else if (mode0 == V8HImode && mode1 == V16QImode && mode2 == V16QImode)
6816 type = v8hi_ftype_v16qi_v16qi;
6817
6818 /* vint, vshort, vshort. */
6819 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V8HImode)
6820 type = v4si_ftype_v8hi_v8hi;
6821
6822 /* vshort, vint, vint. */
6823 else if (mode0 == V8HImode && mode1 == V4SImode && mode2 == V4SImode)
6824 type = v8hi_ftype_v4si_v4si;
6825
6826 /* vchar, vshort, vshort. */
6827 else if (mode0 == V16QImode && mode1 == V8HImode && mode2 == V8HImode)
6828 type = v16qi_ftype_v8hi_v8hi;
6829
6830 /* vint, vchar, vint. */
6831 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V4SImode)
6832 type = v4si_ftype_v16qi_v4si;
6833
fa066a23
AH
6834 /* vint, vchar, vchar. */
6835 else if (mode0 == V4SImode && mode1 == V16QImode && mode2 == V16QImode)
6836 type = v4si_ftype_v16qi_v16qi;
6837
0ac081f6
AH
6838 /* vint, vshort, vint. */
6839 else if (mode0 == V4SImode && mode1 == V8HImode && mode2 == V4SImode)
6840 type = v4si_ftype_v8hi_v4si;
2212663f
DB
6841
6842 /* vint, vint, 5 bit literal. */
6843 else if (mode0 == V4SImode && mode1 == V4SImode && mode2 == QImode)
6844 type = v4si_ftype_v4si_char;
6845
6846 /* vshort, vshort, 5 bit literal. */
6847 else if (mode0 == V8HImode && mode1 == V8HImode && mode2 == QImode)
6848 type = v8hi_ftype_v8hi_char;
6849
6850 /* vchar, vchar, 5 bit literal. */
6851 else if (mode0 == V16QImode && mode1 == V16QImode && mode2 == QImode)
6852 type = v16qi_ftype_v16qi_char;
0ac081f6 6853
617e0e1d
DB
6854 /* vfloat, vint, 5 bit literal. */
6855 else if (mode0 == V4SFmode && mode1 == V4SImode && mode2 == QImode)
6856 type = v4sf_ftype_v4si_char;
6857
6858 /* vint, vfloat, 5 bit literal. */
6859 else if (mode0 == V4SImode && mode1 == V4SFmode && mode2 == QImode)
6860 type = v4si_ftype_v4sf_char;
6861
a3170dc6
AH
6862 else if (mode0 == V2SImode && mode1 == SImode && mode2 == SImode)
6863 type = v2si_ftype_int_int;
6864
6865 else if (mode0 == V2SImode && mode1 == V2SImode && mode2 == QImode)
6866 type = v2si_ftype_v2si_char;
6867
6868 else if (mode0 == V2SImode && mode1 == SImode && mode2 == QImode)
6869 type = v2si_ftype_int_char;
6870
0ac081f6
AH
6871 /* int, x, x. */
6872 else if (mode0 == SImode)
6873 {
6874 switch (mode1)
6875 {
6876 case V4SImode:
6877 type = int_ftype_v4si_v4si;
6878 break;
6879 case V4SFmode:
6880 type = int_ftype_v4sf_v4sf;
6881 break;
6882 case V16QImode:
6883 type = int_ftype_v16qi_v16qi;
6884 break;
6885 case V8HImode:
6886 type = int_ftype_v8hi_v8hi;
6887 break;
6888 default:
6889 abort ();
6890 }
6891 }
6892
6893 else
6894 abort ();
6895
2212663f
DB
6896 def_builtin (d->mask, d->name, type, d->code);
6897 }
24408032 6898
2212663f
DB
6899 /* Add the simple unary operators. */
6900 d = (struct builtin_description *) bdesc_1arg;
ca7558fc 6901 for (i = 0; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
2212663f
DB
6902 {
6903 enum machine_mode mode0, mode1;
6904 tree type;
6905
0559cc77 6906 if (d->name == 0 || d->icode == CODE_FOR_nothing)
2212663f
DB
6907 continue;
6908
6909 mode0 = insn_data[d->icode].operand[0].mode;
6910 mode1 = insn_data[d->icode].operand[1].mode;
6911
6912 if (mode0 == V4SImode && mode1 == QImode)
6913 type = v4si_ftype_char;
6914 else if (mode0 == V8HImode && mode1 == QImode)
6915 type = v8hi_ftype_char;
6916 else if (mode0 == V16QImode && mode1 == QImode)
6917 type = v16qi_ftype_char;
617e0e1d
DB
6918 else if (mode0 == V4SFmode && mode1 == V4SFmode)
6919 type = v4sf_ftype_v4sf;
20e26713
AH
6920 else if (mode0 == V8HImode && mode1 == V16QImode)
6921 type = v8hi_ftype_v16qi;
6922 else if (mode0 == V4SImode && mode1 == V8HImode)
6923 type = v4si_ftype_v8hi;
a3170dc6
AH
6924 else if (mode0 == V2SImode && mode1 == V2SImode)
6925 type = v2si_ftype_v2si;
6926 else if (mode0 == V2SFmode && mode1 == V2SFmode)
6927 type = v2sf_ftype_v2sf;
6928 else if (mode0 == V2SFmode && mode1 == V2SImode)
6929 type = v2sf_ftype_v2si;
6930 else if (mode0 == V2SImode && mode1 == V2SFmode)
6931 type = v2si_ftype_v2sf;
6932 else if (mode0 == V2SImode && mode1 == QImode)
6933 type = v2si_ftype_char;
2212663f
DB
6934 else
6935 abort ();
6936
0ac081f6
AH
6937 def_builtin (d->mask, d->name, type, d->code);
6938 }
6939}
6940
35aff10b 6941\f
7e69e155
MM
6942/* Expand a block move operation, and return 1 if successful. Return 0
6943 if we should let the compiler generate normal code.
6944
6945 operands[0] is the destination
6946 operands[1] is the source
6947 operands[2] is the length
6948 operands[3] is the alignment */
6949
3933e0e1
MM
6950#define MAX_MOVE_REG 4
6951
7e69e155
MM
6952int
6953expand_block_move (operands)
6954 rtx operands[];
6955{
b6c9286a
MM
6956 rtx orig_dest = operands[0];
6957 rtx orig_src = operands[1];
7e69e155 6958 rtx bytes_rtx = operands[2];
7e69e155 6959 rtx align_rtx = operands[3];
3933e0e1 6960 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
5ee95df6 6961 int align;
3933e0e1
MM
6962 int bytes;
6963 int offset;
7e69e155 6964 int move_bytes;
cabfd258
GK
6965 rtx stores[MAX_MOVE_REG];
6966 int num_reg = 0;
7e69e155 6967
3933e0e1 6968 /* If this is not a fixed size move, just call memcpy */
cc0d9ba8 6969 if (! constp)
3933e0e1
MM
6970 return 0;
6971
5ee95df6
FS
6972 /* If this is not a fixed size alignment, abort */
6973 if (GET_CODE (align_rtx) != CONST_INT)
6974 abort ();
6975 align = INTVAL (align_rtx);
6976
7e69e155 6977 /* Anything to move? */
3933e0e1
MM
6978 bytes = INTVAL (bytes_rtx);
6979 if (bytes <= 0)
7e69e155
MM
6980 return 1;
6981
ea9982a8 6982 /* store_one_arg depends on expand_block_move to handle at least the size of
6f317ef3 6983 reg_parm_stack_space. */
ea9982a8 6984 if (bytes > (TARGET_POWERPC64 ? 64 : 32))
7e69e155
MM
6985 return 0;
6986
cabfd258 6987 for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
7e69e155 6988 {
cabfd258
GK
6989 union {
6990 rtx (*movstrsi) PARAMS ((rtx, rtx, rtx, rtx));
6991 rtx (*mov) PARAMS ((rtx, rtx));
6992 } gen_func;
6993 enum machine_mode mode = BLKmode;
6994 rtx src, dest;
6995
6996 if (TARGET_STRING
6997 && bytes > 24 /* move up to 32 bytes at a time */
6998 && ! fixed_regs[5]
6999 && ! fixed_regs[6]
7000 && ! fixed_regs[7]
7001 && ! fixed_regs[8]
7002 && ! fixed_regs[9]
7003 && ! fixed_regs[10]
7004 && ! fixed_regs[11]
7005 && ! fixed_regs[12])
7e69e155 7006 {
cabfd258
GK
7007 move_bytes = (bytes > 32) ? 32 : bytes;
7008 gen_func.movstrsi = gen_movstrsi_8reg;
7009 }
7010 else if (TARGET_STRING
7011 && bytes > 16 /* move up to 24 bytes at a time */
7012 && ! fixed_regs[5]
7013 && ! fixed_regs[6]
7014 && ! fixed_regs[7]
7015 && ! fixed_regs[8]
7016 && ! fixed_regs[9]
7017 && ! fixed_regs[10])
7018 {
7019 move_bytes = (bytes > 24) ? 24 : bytes;
7020 gen_func.movstrsi = gen_movstrsi_6reg;
7021 }
7022 else if (TARGET_STRING
7023 && bytes > 8 /* move up to 16 bytes at a time */
7024 && ! fixed_regs[5]
7025 && ! fixed_regs[6]
7026 && ! fixed_regs[7]
7027 && ! fixed_regs[8])
7028 {
7029 move_bytes = (bytes > 16) ? 16 : bytes;
7030 gen_func.movstrsi = gen_movstrsi_4reg;
7031 }
7032 else if (bytes >= 8 && TARGET_POWERPC64
7033 /* 64-bit loads and stores require word-aligned
7034 displacements. */
7035 && (align >= 8 || (! STRICT_ALIGNMENT && align >= 4)))
7036 {
7037 move_bytes = 8;
7038 mode = DImode;
7039 gen_func.mov = gen_movdi;
7040 }
7041 else if (TARGET_STRING && bytes > 4 && !TARGET_POWERPC64)
7042 { /* move up to 8 bytes at a time */
7043 move_bytes = (bytes > 8) ? 8 : bytes;
7044 gen_func.movstrsi = gen_movstrsi_2reg;
7045 }
7046 else if (bytes >= 4 && (align >= 4 || ! STRICT_ALIGNMENT))
7047 { /* move 4 bytes */
7048 move_bytes = 4;
7049 mode = SImode;
7050 gen_func.mov = gen_movsi;
7051 }
7052 else if (bytes == 2 && (align >= 2 || ! STRICT_ALIGNMENT))
7053 { /* move 2 bytes */
7054 move_bytes = 2;
7055 mode = HImode;
7056 gen_func.mov = gen_movhi;
7057 }
7058 else if (TARGET_STRING && bytes > 1)
7059 { /* move up to 4 bytes at a time */
7060 move_bytes = (bytes > 4) ? 4 : bytes;
7061 gen_func.movstrsi = gen_movstrsi_1reg;
7062 }
7063 else /* move 1 byte at a time */
7064 {
7065 move_bytes = 1;
7066 mode = QImode;
7067 gen_func.mov = gen_movqi;
7068 }
7069
7070 src = adjust_address (orig_src, mode, offset);
7071 dest = adjust_address (orig_dest, mode, offset);
7072
7073 if (mode != BLKmode)
7074 {
7075 rtx tmp_reg = gen_reg_rtx (mode);
7076
7077 emit_insn ((*gen_func.mov) (tmp_reg, src));
7078 stores[num_reg++] = (*gen_func.mov) (dest, tmp_reg);
4c64a852 7079 }
3933e0e1 7080
cabfd258
GK
7081 if (mode == BLKmode || num_reg >= MAX_MOVE_REG || bytes == move_bytes)
7082 {
7083 int i;
7084 for (i = 0; i < num_reg; i++)
7085 emit_insn (stores[i]);
7086 num_reg = 0;
7087 }
35aff10b 7088
cabfd258 7089 if (mode == BLKmode)
7e69e155 7090 {
cabfd258
GK
7091 /* Move the address into scratch registers. The movstrsi
7092 patterns require zero offset. */
7093 if (!REG_P (XEXP (src, 0)))
b6c9286a 7094 {
cabfd258
GK
7095 rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
7096 src = replace_equiv_address (src, src_reg);
b6c9286a 7097 }
cabfd258
GK
7098 set_mem_size (src, GEN_INT (move_bytes));
7099
7100 if (!REG_P (XEXP (dest, 0)))
3933e0e1 7101 {
cabfd258
GK
7102 rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
7103 dest = replace_equiv_address (dest, dest_reg);
7e69e155 7104 }
cabfd258
GK
7105 set_mem_size (dest, GEN_INT (move_bytes));
7106
7107 emit_insn ((*gen_func.movstrsi) (dest, src,
7108 GEN_INT (move_bytes & 31),
7109 align_rtx));
7e69e155 7110 }
7e69e155
MM
7111 }
7112
7113 return 1;
7114}
7115
9878760c
RK
7116\f
7117/* Return 1 if OP is a load multiple operation. It is known to be a
7118 PARALLEL and the first section will be tested. */
7119
7120int
7121load_multiple_operation (op, mode)
7122 rtx op;
296b8152 7123 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
7124{
7125 int count = XVECLEN (op, 0);
e2c953b6 7126 unsigned int dest_regno;
9878760c
RK
7127 rtx src_addr;
7128 int i;
7129
7130 /* Perform a quick check so we don't blow up below. */
7131 if (count <= 1
7132 || GET_CODE (XVECEXP (op, 0, 0)) != SET
7133 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
7134 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM)
7135 return 0;
7136
7137 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
7138 src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);
7139
7140 for (i = 1; i < count; i++)
7141 {
7142 rtx elt = XVECEXP (op, 0, i);
7143
7144 if (GET_CODE (elt) != SET
7145 || GET_CODE (SET_DEST (elt)) != REG
7146 || GET_MODE (SET_DEST (elt)) != SImode
7147 || REGNO (SET_DEST (elt)) != dest_regno + i
7148 || GET_CODE (SET_SRC (elt)) != MEM
7149 || GET_MODE (SET_SRC (elt)) != SImode
7150 || GET_CODE (XEXP (SET_SRC (elt), 0)) != PLUS
7151 || ! rtx_equal_p (XEXP (XEXP (SET_SRC (elt), 0), 0), src_addr)
7152 || GET_CODE (XEXP (XEXP (SET_SRC (elt), 0), 1)) != CONST_INT
7153 || INTVAL (XEXP (XEXP (SET_SRC (elt), 0), 1)) != i * 4)
7154 return 0;
7155 }
7156
7157 return 1;
7158}
7159
7160/* Similar, but tests for store multiple. Here, the second vector element
7161 is a CLOBBER. It will be tested later. */
7162
7163int
7164store_multiple_operation (op, mode)
7165 rtx op;
296b8152 7166 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
7167{
7168 int count = XVECLEN (op, 0) - 1;
e2c953b6 7169 unsigned int src_regno;
9878760c
RK
7170 rtx dest_addr;
7171 int i;
7172
7173 /* Perform a quick check so we don't blow up below. */
7174 if (count <= 1
7175 || GET_CODE (XVECEXP (op, 0, 0)) != SET
7176 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM
7177 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG)
7178 return 0;
7179
7180 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
7181 dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);
7182
7183 for (i = 1; i < count; i++)
7184 {
7185 rtx elt = XVECEXP (op, 0, i + 1);
7186
7187 if (GET_CODE (elt) != SET
7188 || GET_CODE (SET_SRC (elt)) != REG
7189 || GET_MODE (SET_SRC (elt)) != SImode
7190 || REGNO (SET_SRC (elt)) != src_regno + i
7191 || GET_CODE (SET_DEST (elt)) != MEM
7192 || GET_MODE (SET_DEST (elt)) != SImode
7193 || GET_CODE (XEXP (SET_DEST (elt), 0)) != PLUS
7194 || ! rtx_equal_p (XEXP (XEXP (SET_DEST (elt), 0), 0), dest_addr)
7195 || GET_CODE (XEXP (XEXP (SET_DEST (elt), 0), 1)) != CONST_INT
7196 || INTVAL (XEXP (XEXP (SET_DEST (elt), 0), 1)) != i * 4)
7197 return 0;
7198 }
7199
7200 return 1;
7201}
9ebbca7d 7202
9caa3eb2
DE
7203/* Return a string to perform a load_multiple operation.
7204 operands[0] is the vector.
7205 operands[1] is the source address.
7206 operands[2] is the first destination register. */
7207
7208const char *
7209rs6000_output_load_multiple (operands)
ebe637e3 7210 rtx operands[3];
9caa3eb2
DE
7211{
7212 /* We have to handle the case where the pseudo used to contain the address
7213 is assigned to one of the output registers. */
7214 int i, j;
7215 int words = XVECLEN (operands[0], 0);
7216 rtx xop[10];
7217
7218 if (XVECLEN (operands[0], 0) == 1)
7219 return "{l|lwz} %2,0(%1)";
7220
7221 for (i = 0; i < words; i++)
7222 if (refers_to_regno_p (REGNO (operands[2]) + i,
7223 REGNO (operands[2]) + i + 1, operands[1], 0))
7224 {
7225 if (i == words-1)
7226 {
7227 xop[0] = GEN_INT (4 * (words-1));
7228 xop[1] = operands[1];
7229 xop[2] = operands[2];
7230 output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop);
7231 return "";
7232 }
7233 else if (i == 0)
7234 {
7235 xop[0] = GEN_INT (4 * (words-1));
7236 xop[1] = operands[1];
7237 xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
7238 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);
7239 return "";
7240 }
7241 else
7242 {
7243 for (j = 0; j < words; j++)
7244 if (j != i)
7245 {
7246 xop[0] = GEN_INT (j * 4);
7247 xop[1] = operands[1];
7248 xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j);
7249 output_asm_insn ("{l|lwz} %2,%0(%1)", xop);
7250 }
7251 xop[0] = GEN_INT (i * 4);
7252 xop[1] = operands[1];
7253 output_asm_insn ("{l|lwz} %1,%0(%1)", xop);
7254 return "";
7255 }
7256 }
7257
7258 return "{lsi|lswi} %2,%1,%N0";
7259}
7260
00b960c7
AH
7261/* Return 1 for a parallel vrsave operation. */
7262
7263int
7264vrsave_operation (op, mode)
7265 rtx op;
7266 enum machine_mode mode ATTRIBUTE_UNUSED;
7267{
7268 int count = XVECLEN (op, 0);
7269 unsigned int dest_regno, src_regno;
7270 int i;
7271
7272 if (count <= 1
7273 || GET_CODE (XVECEXP (op, 0, 0)) != SET
7274 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
a004eb82 7275 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC_VOLATILE)
00b960c7
AH
7276 return 0;
7277
7278 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
7279 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
7280
7281 if (dest_regno != VRSAVE_REGNO
7282 && src_regno != VRSAVE_REGNO)
7283 return 0;
7284
7285 for (i = 1; i < count; i++)
7286 {
7287 rtx elt = XVECEXP (op, 0, i);
7288
9aa86737
AH
7289 if (GET_CODE (elt) != CLOBBER
7290 && GET_CODE (elt) != SET)
00b960c7
AH
7291 return 0;
7292 }
7293
7294 return 1;
7295}
7296
a4f6c312 7297/* Return 1 for an PARALLEL suitable for mtcrf. */
9ebbca7d
GK
7298
7299int
7300mtcrf_operation (op, mode)
7301 rtx op;
7302 enum machine_mode mode ATTRIBUTE_UNUSED;
7303{
7304 int count = XVECLEN (op, 0);
7305 int i;
9ebbca7d
GK
7306 rtx src_reg;
7307
7308 /* Perform a quick check so we don't blow up below. */
e35b9579
GK
7309 if (count < 1
7310 || GET_CODE (XVECEXP (op, 0, 0)) != SET
7311 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC
7312 || XVECLEN (SET_SRC (XVECEXP (op, 0, 0)), 0) != 2)
9ebbca7d 7313 return 0;
e35b9579 7314 src_reg = XVECEXP (SET_SRC (XVECEXP (op, 0, 0)), 0, 0);
9ebbca7d
GK
7315
7316 if (GET_CODE (src_reg) != REG
7317 || GET_MODE (src_reg) != SImode
7318 || ! INT_REGNO_P (REGNO (src_reg)))
7319 return 0;
7320
e35b9579 7321 for (i = 0; i < count; i++)
9ebbca7d
GK
7322 {
7323 rtx exp = XVECEXP (op, 0, i);
7324 rtx unspec;
7325 int maskval;
7326
7327 if (GET_CODE (exp) != SET
7328 || GET_CODE (SET_DEST (exp)) != REG
7329 || GET_MODE (SET_DEST (exp)) != CCmode
7330 || ! CR_REGNO_P (REGNO (SET_DEST (exp))))
7331 return 0;
7332 unspec = SET_SRC (exp);
7333 maskval = 1 << (MAX_CR_REGNO - REGNO (SET_DEST (exp)));
9ebbca7d
GK
7334
7335 if (GET_CODE (unspec) != UNSPEC
615158e2 7336 || XINT (unspec, 1) != UNSPEC_MOVESI_TO_CR
9ebbca7d
GK
7337 || XVECLEN (unspec, 0) != 2
7338 || XVECEXP (unspec, 0, 0) != src_reg
7339 || GET_CODE (XVECEXP (unspec, 0, 1)) != CONST_INT
7340 || INTVAL (XVECEXP (unspec, 0, 1)) != maskval)
7341 return 0;
7342 }
e35b9579 7343 return 1;
9ebbca7d
GK
7344}
7345
a4f6c312 7346/* Return 1 for an PARALLEL suitable for lmw. */
9ebbca7d
GK
7347
7348int
7349lmw_operation (op, mode)
7350 rtx op;
7351 enum machine_mode mode ATTRIBUTE_UNUSED;
7352{
7353 int count = XVECLEN (op, 0);
e2c953b6 7354 unsigned int dest_regno;
9ebbca7d 7355 rtx src_addr;
e2c953b6 7356 unsigned int base_regno;
9ebbca7d
GK
7357 HOST_WIDE_INT offset;
7358 int i;
7359
7360 /* Perform a quick check so we don't blow up below. */
7361 if (count <= 1
7362 || GET_CODE (XVECEXP (op, 0, 0)) != SET
7363 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
7364 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM)
7365 return 0;
7366
7367 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
7368 src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);
7369
7370 if (dest_regno > 31
e2c953b6 7371 || count != 32 - (int) dest_regno)
9ebbca7d
GK
7372 return 0;
7373
4d588c14 7374 if (legitimate_indirect_address_p (src_addr, 0))
9ebbca7d
GK
7375 {
7376 offset = 0;
7377 base_regno = REGNO (src_addr);
7378 if (base_regno == 0)
7379 return 0;
7380 }
4d588c14 7381 else if (legitimate_offset_address_p (SImode, src_addr, 0))
9ebbca7d
GK
7382 {
7383 offset = INTVAL (XEXP (src_addr, 1));
7384 base_regno = REGNO (XEXP (src_addr, 0));
7385 }
7386 else
7387 return 0;
7388
7389 for (i = 0; i < count; i++)
7390 {
7391 rtx elt = XVECEXP (op, 0, i);
7392 rtx newaddr;
7393 rtx addr_reg;
7394 HOST_WIDE_INT newoffset;
7395
7396 if (GET_CODE (elt) != SET
7397 || GET_CODE (SET_DEST (elt)) != REG
7398 || GET_MODE (SET_DEST (elt)) != SImode
7399 || REGNO (SET_DEST (elt)) != dest_regno + i
7400 || GET_CODE (SET_SRC (elt)) != MEM
7401 || GET_MODE (SET_SRC (elt)) != SImode)
7402 return 0;
7403 newaddr = XEXP (SET_SRC (elt), 0);
4d588c14 7404 if (legitimate_indirect_address_p (newaddr, 0))
9ebbca7d
GK
7405 {
7406 newoffset = 0;
7407 addr_reg = newaddr;
7408 }
4d588c14 7409 else if (legitimate_offset_address_p (SImode, newaddr, 0))
9ebbca7d
GK
7410 {
7411 addr_reg = XEXP (newaddr, 0);
7412 newoffset = INTVAL (XEXP (newaddr, 1));
7413 }
7414 else
7415 return 0;
7416 if (REGNO (addr_reg) != base_regno
7417 || newoffset != offset + 4 * i)
7418 return 0;
7419 }
7420
7421 return 1;
7422}
7423
a4f6c312 7424/* Return 1 for an PARALLEL suitable for stmw. */
9ebbca7d
GK
7425
7426int
7427stmw_operation (op, mode)
7428 rtx op;
7429 enum machine_mode mode ATTRIBUTE_UNUSED;
7430{
7431 int count = XVECLEN (op, 0);
e2c953b6 7432 unsigned int src_regno;
9ebbca7d 7433 rtx dest_addr;
e2c953b6 7434 unsigned int base_regno;
9ebbca7d
GK
7435 HOST_WIDE_INT offset;
7436 int i;
7437
7438 /* Perform a quick check so we don't blow up below. */
7439 if (count <= 1
7440 || GET_CODE (XVECEXP (op, 0, 0)) != SET
7441 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM
7442 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG)
7443 return 0;
7444
7445 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
7446 dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);
7447
7448 if (src_regno > 31
e2c953b6 7449 || count != 32 - (int) src_regno)
9ebbca7d
GK
7450 return 0;
7451
4d588c14 7452 if (legitimate_indirect_address_p (dest_addr, 0))
9ebbca7d
GK
7453 {
7454 offset = 0;
7455 base_regno = REGNO (dest_addr);
7456 if (base_regno == 0)
7457 return 0;
7458 }
4d588c14 7459 else if (legitimate_offset_address_p (SImode, dest_addr, 0))
9ebbca7d
GK
7460 {
7461 offset = INTVAL (XEXP (dest_addr, 1));
7462 base_regno = REGNO (XEXP (dest_addr, 0));
7463 }
7464 else
7465 return 0;
7466
7467 for (i = 0; i < count; i++)
7468 {
7469 rtx elt = XVECEXP (op, 0, i);
7470 rtx newaddr;
7471 rtx addr_reg;
7472 HOST_WIDE_INT newoffset;
7473
7474 if (GET_CODE (elt) != SET
7475 || GET_CODE (SET_SRC (elt)) != REG
7476 || GET_MODE (SET_SRC (elt)) != SImode
7477 || REGNO (SET_SRC (elt)) != src_regno + i
7478 || GET_CODE (SET_DEST (elt)) != MEM
7479 || GET_MODE (SET_DEST (elt)) != SImode)
7480 return 0;
7481 newaddr = XEXP (SET_DEST (elt), 0);
4d588c14 7482 if (legitimate_indirect_address_p (newaddr, 0))
9ebbca7d
GK
7483 {
7484 newoffset = 0;
7485 addr_reg = newaddr;
7486 }
4d588c14 7487 else if (legitimate_offset_address_p (SImode, newaddr, 0))
9ebbca7d
GK
7488 {
7489 addr_reg = XEXP (newaddr, 0);
7490 newoffset = INTVAL (XEXP (newaddr, 1));
7491 }
7492 else
7493 return 0;
7494 if (REGNO (addr_reg) != base_regno
7495 || newoffset != offset + 4 * i)
7496 return 0;
7497 }
7498
7499 return 1;
7500}
9878760c 7501\f
a4f6c312
SS
7502/* A validation routine: say whether CODE, a condition code, and MODE
7503 match. The other alternatives either don't make sense or should
7504 never be generated. */
39a10a29 7505
39a10a29
GK
7506static void
7507validate_condition_mode (code, mode)
7508 enum rtx_code code;
7509 enum machine_mode mode;
7510{
7511 if (GET_RTX_CLASS (code) != '<'
7512 || GET_MODE_CLASS (mode) != MODE_CC)
7513 abort ();
7514
7515 /* These don't make sense. */
7516 if ((code == GT || code == LT || code == GE || code == LE)
7517 && mode == CCUNSmode)
7518 abort ();
7519
7520 if ((code == GTU || code == LTU || code == GEU || code == LEU)
7521 && mode != CCUNSmode)
7522 abort ();
7523
7524 if (mode != CCFPmode
7525 && (code == ORDERED || code == UNORDERED
7526 || code == UNEQ || code == LTGT
7527 || code == UNGT || code == UNLT
7528 || code == UNGE || code == UNLE))
a4f6c312 7529 abort ();
39a10a29 7530
de6c5979 7531 /* These should never be generated except for
bc9ec0e0 7532 flag_finite_math_only. */
39a10a29 7533 if (mode == CCFPmode
ad72b533 7534 && ! flag_finite_math_only
39a10a29
GK
7535 && (code == LE || code == GE
7536 || code == UNEQ || code == LTGT
7537 || code == UNGT || code == UNLT))
7538 abort ();
7539
7540 /* These are invalid; the information is not there. */
7541 if (mode == CCEQmode
7542 && code != EQ && code != NE)
7543 abort ();
7544}
7545
9878760c
RK
7546/* Return 1 if OP is a comparison operation that is valid for a branch insn.
7547 We only check the opcode against the mode of the CC value here. */
7548
7549int
7550branch_comparison_operator (op, mode)
592696dd 7551 rtx op;
296b8152 7552 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
7553{
7554 enum rtx_code code = GET_CODE (op);
7555 enum machine_mode cc_mode;
7556
7557 if (GET_RTX_CLASS (code) != '<')
7558 return 0;
7559
7560 cc_mode = GET_MODE (XEXP (op, 0));
7561 if (GET_MODE_CLASS (cc_mode) != MODE_CC)
7562 return 0;
7563
39a10a29 7564 validate_condition_mode (code, cc_mode);
9878760c 7565
39a10a29
GK
7566 return 1;
7567}
7568
7569/* Return 1 if OP is a comparison operation that is valid for a branch
7570 insn and which is true if the corresponding bit in the CC register
7571 is set. */
7572
7573int
7574branch_positive_comparison_operator (op, mode)
592696dd 7575 rtx op;
39a10a29
GK
7576 enum machine_mode mode;
7577{
7578 enum rtx_code code;
7579
7580 if (! branch_comparison_operator (op, mode))
9878760c
RK
7581 return 0;
7582
39a10a29
GK
7583 code = GET_CODE (op);
7584 return (code == EQ || code == LT || code == GT
993f19a8 7585 || (TARGET_E500 && TARGET_HARD_FLOAT && !TARGET_FPRS && code == NE)
39a10a29
GK
7586 || code == LTU || code == GTU
7587 || code == UNORDERED);
9878760c
RK
7588}
7589
b7053a3f
GK
7590/* Return 1 if OP is a comparison operation that is valid for an scc
7591 insn: it must be a positive comparison. */
9878760c
RK
7592
7593int
7594scc_comparison_operator (op, mode)
592696dd 7595 rtx op;
9878760c
RK
7596 enum machine_mode mode;
7597{
b7053a3f 7598 return branch_positive_comparison_operator (op, mode);
9878760c 7599}
e0cd0770
JC
7600
7601int
7602trap_comparison_operator (op, mode)
7603 rtx op;
7604 enum machine_mode mode;
7605{
7606 if (mode != VOIDmode && mode != GET_MODE (op))
7607 return 0;
39a10a29 7608 return GET_RTX_CLASS (GET_CODE (op)) == '<';
e0cd0770 7609}
dfbdccdb
GK
7610
7611int
7612boolean_operator (op, mode)
7613 rtx op;
7614 enum machine_mode mode ATTRIBUTE_UNUSED;
7615{
7616 enum rtx_code code = GET_CODE (op);
7617 return (code == AND || code == IOR || code == XOR);
7618}
1d328b19
GK
7619
7620int
7621boolean_or_operator (op, mode)
7622 rtx op;
7623 enum machine_mode mode ATTRIBUTE_UNUSED;
7624{
7625 enum rtx_code code = GET_CODE (op);
7626 return (code == IOR || code == XOR);
7627}
50a0b056
GK
7628
7629int
7630min_max_operator (op, mode)
7631 rtx op;
7632 enum machine_mode mode ATTRIBUTE_UNUSED;
7633{
7634 enum rtx_code code = GET_CODE (op);
7635 return (code == SMIN || code == SMAX || code == UMIN || code == UMAX);
7636}
9878760c
RK
7637\f
7638/* Return 1 if ANDOP is a mask that has no bits on that are not in the
7639 mask required to convert the result of a rotate insn into a shift
b1765bde 7640 left insn of SHIFTOP bits. Both are known to be SImode CONST_INT. */
9878760c
RK
7641
7642int
7643includes_lshift_p (shiftop, andop)
592696dd
SS
7644 rtx shiftop;
7645 rtx andop;
9878760c 7646{
e2c953b6
DE
7647 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
7648
7649 shift_mask <<= INTVAL (shiftop);
9878760c 7650
b1765bde 7651 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
9878760c
RK
7652}
7653
7654/* Similar, but for right shift. */
7655
7656int
7657includes_rshift_p (shiftop, andop)
592696dd
SS
7658 rtx shiftop;
7659 rtx andop;
9878760c 7660{
a7653a2c 7661 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
9878760c
RK
7662
7663 shift_mask >>= INTVAL (shiftop);
7664
b1765bde 7665 return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
e2c953b6
DE
7666}
7667
c5059423
AM
7668/* Return 1 if ANDOP is a mask suitable for use with an rldic insn
7669 to perform a left shift. It must have exactly SHIFTOP least
b6d08ca1 7670 significant 0's, then one or more 1's, then zero or more 0's. */
e2c953b6
DE
7671
7672int
c5059423 7673includes_rldic_lshift_p (shiftop, andop)
592696dd
SS
7674 rtx shiftop;
7675 rtx andop;
e2c953b6 7676{
c5059423
AM
7677 if (GET_CODE (andop) == CONST_INT)
7678 {
02071907 7679 HOST_WIDE_INT c, lsb, shift_mask;
e2c953b6 7680
c5059423 7681 c = INTVAL (andop);
02071907 7682 if (c == 0 || c == ~0)
c5059423 7683 return 0;
e2c953b6 7684
02071907 7685 shift_mask = ~0;
c5059423
AM
7686 shift_mask <<= INTVAL (shiftop);
7687
b6d08ca1 7688 /* Find the least significant one bit. */
c5059423
AM
7689 lsb = c & -c;
7690
7691 /* It must coincide with the LSB of the shift mask. */
7692 if (-lsb != shift_mask)
7693 return 0;
e2c953b6 7694
c5059423
AM
7695 /* Invert to look for the next transition (if any). */
7696 c = ~c;
7697
7698 /* Remove the low group of ones (originally low group of zeros). */
7699 c &= -lsb;
7700
7701 /* Again find the lsb, and check we have all 1's above. */
7702 lsb = c & -c;
7703 return c == -lsb;
7704 }
7705 else if (GET_CODE (andop) == CONST_DOUBLE
7706 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
7707 {
02071907
AM
7708 HOST_WIDE_INT low, high, lsb;
7709 HOST_WIDE_INT shift_mask_low, shift_mask_high;
c5059423
AM
7710
7711 low = CONST_DOUBLE_LOW (andop);
7712 if (HOST_BITS_PER_WIDE_INT < 64)
7713 high = CONST_DOUBLE_HIGH (andop);
7714
7715 if ((low == 0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == 0))
02071907 7716 || (low == ~0 && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0)))
c5059423
AM
7717 return 0;
7718
7719 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
7720 {
02071907 7721 shift_mask_high = ~0;
c5059423
AM
7722 if (INTVAL (shiftop) > 32)
7723 shift_mask_high <<= INTVAL (shiftop) - 32;
7724
7725 lsb = high & -high;
7726
7727 if (-lsb != shift_mask_high || INTVAL (shiftop) < 32)
7728 return 0;
7729
7730 high = ~high;
7731 high &= -lsb;
7732
7733 lsb = high & -high;
7734 return high == -lsb;
7735 }
7736
02071907 7737 shift_mask_low = ~0;
c5059423
AM
7738 shift_mask_low <<= INTVAL (shiftop);
7739
7740 lsb = low & -low;
7741
7742 if (-lsb != shift_mask_low)
7743 return 0;
7744
7745 if (HOST_BITS_PER_WIDE_INT < 64)
7746 high = ~high;
7747 low = ~low;
7748 low &= -lsb;
7749
7750 if (HOST_BITS_PER_WIDE_INT < 64 && low == 0)
7751 {
7752 lsb = high & -high;
7753 return high == -lsb;
7754 }
7755
7756 lsb = low & -low;
7757 return low == -lsb && (HOST_BITS_PER_WIDE_INT >= 64 || high == ~0);
7758 }
7759 else
7760 return 0;
7761}
e2c953b6 7762
c5059423
AM
7763/* Return 1 if ANDOP is a mask suitable for use with an rldicr insn
7764 to perform a left shift. It must have SHIFTOP or more least
c1207243 7765 significant 0's, with the remainder of the word 1's. */
e2c953b6 7766
c5059423
AM
7767int
7768includes_rldicr_lshift_p (shiftop, andop)
592696dd
SS
7769 rtx shiftop;
7770 rtx andop;
c5059423 7771{
e2c953b6 7772 if (GET_CODE (andop) == CONST_INT)
c5059423 7773 {
02071907 7774 HOST_WIDE_INT c, lsb, shift_mask;
c5059423 7775
02071907 7776 shift_mask = ~0;
c5059423
AM
7777 shift_mask <<= INTVAL (shiftop);
7778 c = INTVAL (andop);
7779
c1207243 7780 /* Find the least significant one bit. */
c5059423
AM
7781 lsb = c & -c;
7782
7783 /* It must be covered by the shift mask.
a4f6c312 7784 This test also rejects c == 0. */
c5059423
AM
7785 if ((lsb & shift_mask) == 0)
7786 return 0;
7787
7788 /* Check we have all 1's above the transition, and reject all 1's. */
7789 return c == -lsb && lsb != 1;
7790 }
7791 else if (GET_CODE (andop) == CONST_DOUBLE
7792 && (GET_MODE (andop) == VOIDmode || GET_MODE (andop) == DImode))
7793 {
02071907 7794 HOST_WIDE_INT low, lsb, shift_mask_low;
c5059423
AM
7795
7796 low = CONST_DOUBLE_LOW (andop);
7797
7798 if (HOST_BITS_PER_WIDE_INT < 64)
7799 {
02071907 7800 HOST_WIDE_INT high, shift_mask_high;
c5059423
AM
7801
7802 high = CONST_DOUBLE_HIGH (andop);
7803
7804 if (low == 0)
7805 {
02071907 7806 shift_mask_high = ~0;
c5059423
AM
7807 if (INTVAL (shiftop) > 32)
7808 shift_mask_high <<= INTVAL (shiftop) - 32;
7809
7810 lsb = high & -high;
7811
7812 if ((lsb & shift_mask_high) == 0)
7813 return 0;
7814
7815 return high == -lsb;
7816 }
7817 if (high != ~0)
7818 return 0;
7819 }
7820
02071907 7821 shift_mask_low = ~0;
c5059423
AM
7822 shift_mask_low <<= INTVAL (shiftop);
7823
7824 lsb = low & -low;
7825
7826 if ((lsb & shift_mask_low) == 0)
7827 return 0;
7828
7829 return low == -lsb && lsb != 1;
7830 }
e2c953b6 7831 else
c5059423 7832 return 0;
9878760c 7833}
35068b43
RK
7834
7835/* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
7836 for lfq and stfq insns.
7837
7838 Note reg1 and reg2 *must* be hard registers. To be sure we will
7839 abort if we are passed pseudo registers. */
7840
7841int
7842registers_ok_for_quad_peep (reg1, reg2)
7843 rtx reg1, reg2;
7844{
7845 /* We might have been passed a SUBREG. */
7846 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
7847 return 0;
7848
7849 return (REGNO (reg1) == REGNO (reg2) - 1);
7850}
7851
a4f6c312
SS
7852/* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn.
7853 addr1 and addr2 must be in consecutive memory locations
7854 (addr2 == addr1 + 8). */
35068b43
RK
7855
7856int
7857addrs_ok_for_quad_peep (addr1, addr2)
592696dd
SS
7858 rtx addr1;
7859 rtx addr2;
35068b43 7860{
e2c953b6 7861 unsigned int reg1;
35068b43
RK
7862 int offset1;
7863
7864 /* Extract an offset (if used) from the first addr. */
7865 if (GET_CODE (addr1) == PLUS)
7866 {
7867 /* If not a REG, return zero. */
7868 if (GET_CODE (XEXP (addr1, 0)) != REG)
7869 return 0;
7870 else
7871 {
7872 reg1 = REGNO (XEXP (addr1, 0));
7873 /* The offset must be constant! */
7874 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
7875 return 0;
7876 offset1 = INTVAL (XEXP (addr1, 1));
7877 }
7878 }
7879 else if (GET_CODE (addr1) != REG)
7880 return 0;
7881 else
7882 {
7883 reg1 = REGNO (addr1);
7884 /* This was a simple (mem (reg)) expression. Offset is 0. */
7885 offset1 = 0;
7886 }
7887
984e25ac
DE
7888/* Make sure the second address is a (mem (plus (reg) (const_int)))
7889 or if it is (mem (reg)) then make sure that offset1 is -8 and the same
7890 register as addr1. */
7891 if (offset1 == -8 && GET_CODE (addr2) == REG && reg1 == REGNO (addr2))
7892 return 1;
35068b43
RK
7893 if (GET_CODE (addr2) != PLUS)
7894 return 0;
7895
7896 if (GET_CODE (XEXP (addr2, 0)) != REG
7897 || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
7898 return 0;
7899
7900 if (reg1 != REGNO (XEXP (addr2, 0)))
7901 return 0;
7902
7903 /* The offset for the second addr must be 8 more than the first addr. */
7904 if (INTVAL (XEXP (addr2, 1)) != offset1 + 8)
7905 return 0;
7906
7907 /* All the tests passed. addr1 and addr2 are valid for lfq or stfq
7908 instructions. */
7909 return 1;
7910}
9878760c
RK
7911\f
7912/* Return the register class of a scratch register needed to copy IN into
7913 or out of a register in CLASS in MODE. If it can be done directly,
7914 NO_REGS is returned. */
7915
7916enum reg_class
7917secondary_reload_class (class, mode, in)
7918 enum reg_class class;
296b8152 7919 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
7920 rtx in;
7921{
5accd822 7922 int regno;
9878760c 7923
ab82a49f
AP
7924 if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
7925#if TARGET_MACHO
7926 && MACHOPIC_INDIRECT
7927#endif
7928 ))
46fad5b7
DJ
7929 {
7930 /* We cannot copy a symbolic operand directly into anything
7931 other than BASE_REGS for TARGET_ELF. So indicate that a
7932 register from BASE_REGS is needed as an intermediate
7933 register.
7934
7935 On Darwin, pic addresses require a load from memory, which
7936 needs a base register. */
7937 if (class != BASE_REGS
7938 && (GET_CODE (in) == SYMBOL_REF
7939 || GET_CODE (in) == HIGH
7940 || GET_CODE (in) == LABEL_REF
7941 || GET_CODE (in) == CONST))
7942 return BASE_REGS;
7943 }
e7b7998a 7944
5accd822
DE
7945 if (GET_CODE (in) == REG)
7946 {
7947 regno = REGNO (in);
7948 if (regno >= FIRST_PSEUDO_REGISTER)
7949 {
7950 regno = true_regnum (in);
7951 if (regno >= FIRST_PSEUDO_REGISTER)
7952 regno = -1;
7953 }
7954 }
7955 else if (GET_CODE (in) == SUBREG)
7956 {
7957 regno = true_regnum (in);
7958 if (regno >= FIRST_PSEUDO_REGISTER)
7959 regno = -1;
7960 }
7961 else
7962 regno = -1;
7963
9878760c
RK
7964 /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
7965 into anything. */
7966 if (class == GENERAL_REGS || class == BASE_REGS
7967 || (regno >= 0 && INT_REGNO_P (regno)))
7968 return NO_REGS;
7969
7970 /* Constants, memory, and FP registers can go into FP registers. */
7971 if ((regno == -1 || FP_REGNO_P (regno))
7972 && (class == FLOAT_REGS || class == NON_SPECIAL_REGS))
7973 return NO_REGS;
7974
0ac081f6
AH
7975 /* Memory, and AltiVec registers can go into AltiVec registers. */
7976 if ((regno == -1 || ALTIVEC_REGNO_P (regno))
7977 && class == ALTIVEC_REGS)
7978 return NO_REGS;
7979
9878760c
RK
7980 /* We can copy among the CR registers. */
7981 if ((class == CR_REGS || class == CR0_REGS)
7982 && regno >= 0 && CR_REGNO_P (regno))
7983 return NO_REGS;
7984
7985 /* Otherwise, we need GENERAL_REGS. */
7986 return GENERAL_REGS;
7987}
7988\f
7989/* Given a comparison operation, return the bit number in CCR to test. We
7990 know this is a valid comparison.
7991
7992 SCC_P is 1 if this is for an scc. That means that %D will have been
7993 used instead of %C, so the bits will be in different places.
7994
b4ac57ab 7995 Return -1 if OP isn't a valid comparison for some reason. */
9878760c
RK
7996
7997int
7998ccr_bit (op, scc_p)
592696dd 7999 rtx op;
9878760c
RK
8000 int scc_p;
8001{
8002 enum rtx_code code = GET_CODE (op);
8003 enum machine_mode cc_mode;
8004 int cc_regnum;
8005 int base_bit;
9ebbca7d 8006 rtx reg;
9878760c
RK
8007
8008 if (GET_RTX_CLASS (code) != '<')
8009 return -1;
8010
9ebbca7d
GK
8011 reg = XEXP (op, 0);
8012
8013 if (GET_CODE (reg) != REG
8014 || ! CR_REGNO_P (REGNO (reg)))
8015 abort ();
8016
8017 cc_mode = GET_MODE (reg);
8018 cc_regnum = REGNO (reg);
8019 base_bit = 4 * (cc_regnum - CR0_REGNO);
9878760c 8020
39a10a29 8021 validate_condition_mode (code, cc_mode);
c5defebb 8022
b7053a3f
GK
8023 /* When generating a sCOND operation, only positive conditions are
8024 allowed. */
8025 if (scc_p && code != EQ && code != GT && code != LT && code != UNORDERED
8026 && code != GTU && code != LTU)
8027 abort ();
8028
9878760c
RK
8029 switch (code)
8030 {
8031 case NE:
993f19a8
AH
8032 if (TARGET_E500 && !TARGET_FPRS
8033 && TARGET_HARD_FLOAT && cc_mode == CCFPmode)
a3170dc6 8034 return base_bit + 1;
9878760c
RK
8035 return scc_p ? base_bit + 3 : base_bit + 2;
8036 case EQ:
993f19a8
AH
8037 if (TARGET_E500 && !TARGET_FPRS
8038 && TARGET_HARD_FLOAT && cc_mode == CCFPmode)
a3170dc6 8039 return base_bit + 1;
9878760c 8040 return base_bit + 2;
1c882ea4 8041 case GT: case GTU: case UNLE:
9878760c 8042 return base_bit + 1;
1c882ea4 8043 case LT: case LTU: case UNGE:
9878760c 8044 return base_bit;
1c882ea4
GK
8045 case ORDERED: case UNORDERED:
8046 return base_bit + 3;
9878760c
RK
8047
8048 case GE: case GEU:
39a10a29 8049 /* If scc, we will have done a cror to put the bit in the
9878760c
RK
8050 unordered position. So test that bit. For integer, this is ! LT
8051 unless this is an scc insn. */
39a10a29 8052 return scc_p ? base_bit + 3 : base_bit;
9878760c
RK
8053
8054 case LE: case LEU:
39a10a29 8055 return scc_p ? base_bit + 3 : base_bit + 1;
1c882ea4 8056
9878760c
RK
8057 default:
8058 abort ();
8059 }
8060}
1ff7789b 8061\f
8d30c4ee 8062/* Return the GOT register. */
1ff7789b
MM
8063
8064struct rtx_def *
8065rs6000_got_register (value)
5f59ecb7 8066 rtx value ATTRIBUTE_UNUSED;
1ff7789b 8067{
a4f6c312
SS
8068 /* The second flow pass currently (June 1999) can't update
8069 regs_ever_live without disturbing other parts of the compiler, so
8070 update it here to make the prolog/epilogue code happy. */
1db02437
FS
8071 if (no_new_pseudos && ! regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM])
8072 regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
1ff7789b 8073
8d30c4ee 8074 current_function_uses_pic_offset_table = 1;
3cb999d8 8075
1ff7789b
MM
8076 return pic_offset_table_rtx;
8077}
a7df97e6 8078\f
e2500fed
GK
8079/* Function to init struct machine_function.
8080 This will be called, via a pointer variable,
8081 from push_function_context. */
a7df97e6 8082
e2500fed
GK
8083static struct machine_function *
8084rs6000_init_machine_status ()
a7df97e6 8085{
e2500fed 8086 return ggc_alloc_cleared (sizeof (machine_function));
a7df97e6 8087}
9878760c 8088\f
0ba1b2ff
AM
8089/* These macros test for integers and extract the low-order bits. */
8090#define INT_P(X) \
8091((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE) \
8092 && GET_MODE (X) == VOIDmode)
8093
8094#define INT_LOWPART(X) \
8095 (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
8096
8097int
8098extract_MB (op)
8099 rtx op;
8100{
8101 int i;
8102 unsigned long val = INT_LOWPART (op);
8103
8104 /* If the high bit is zero, the value is the first 1 bit we find
8105 from the left. */
8106 if ((val & 0x80000000) == 0)
8107 {
8108 if ((val & 0xffffffff) == 0)
8109 abort ();
8110
8111 i = 1;
8112 while (((val <<= 1) & 0x80000000) == 0)
8113 ++i;
8114 return i;
8115 }
8116
8117 /* If the high bit is set and the low bit is not, or the mask is all
8118 1's, the value is zero. */
8119 if ((val & 1) == 0 || (val & 0xffffffff) == 0xffffffff)
8120 return 0;
8121
8122 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
8123 from the right. */
8124 i = 31;
8125 while (((val >>= 1) & 1) != 0)
8126 --i;
8127
8128 return i;
8129}
8130
8131int
8132extract_ME (op)
8133 rtx op;
8134{
8135 int i;
8136 unsigned long val = INT_LOWPART (op);
8137
8138 /* If the low bit is zero, the value is the first 1 bit we find from
8139 the right. */
8140 if ((val & 1) == 0)
8141 {
8142 if ((val & 0xffffffff) == 0)
8143 abort ();
8144
8145 i = 30;
8146 while (((val >>= 1) & 1) == 0)
8147 --i;
8148
8149 return i;
8150 }
8151
8152 /* If the low bit is set and the high bit is not, or the mask is all
8153 1's, the value is 31. */
8154 if ((val & 0x80000000) == 0 || (val & 0xffffffff) == 0xffffffff)
8155 return 31;
8156
8157 /* Otherwise we have a wrap-around mask. Look for the first 0 bit
8158 from the left. */
8159 i = 0;
8160 while (((val <<= 1) & 0x80000000) != 0)
8161 ++i;
8162
8163 return i;
8164}
8165
c4501e62
JJ
8166/* Locate some local-dynamic symbol still in use by this function
8167 so that we can print its name in some tls_ld pattern. */
8168
8169static const char *
8170rs6000_get_some_local_dynamic_name ()
8171{
8172 rtx insn;
8173
8174 if (cfun->machine->some_ld_name)
8175 return cfun->machine->some_ld_name;
8176
8177 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
8178 if (INSN_P (insn)
8179 && for_each_rtx (&PATTERN (insn),
8180 rs6000_get_some_local_dynamic_name_1, 0))
8181 return cfun->machine->some_ld_name;
8182
8183 abort ();
8184}
8185
8186/* Helper function for rs6000_get_some_local_dynamic_name. */
8187
8188static int
8189rs6000_get_some_local_dynamic_name_1 (px, data)
8190 rtx *px;
8191 void *data ATTRIBUTE_UNUSED;
8192{
8193 rtx x = *px;
8194
8195 if (GET_CODE (x) == SYMBOL_REF)
8196 {
8197 const char *str = XSTR (x, 0);
8198 if (SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
8199 {
8200 cfun->machine->some_ld_name = str;
8201 return 1;
8202 }
8203 }
8204
8205 return 0;
8206}
8207
9878760c
RK
8208/* Print an operand. Recognize special options, documented below. */
8209
38c1f2d7 8210#if TARGET_ELF
d9407988 8211#define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
8fbd2dc7 8212#define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
ba5e43aa
MM
8213#else
8214#define SMALL_DATA_RELOC "sda21"
8fbd2dc7 8215#define SMALL_DATA_REG 0
ba5e43aa
MM
8216#endif
8217
9878760c
RK
8218void
8219print_operand (file, x, code)
8220 FILE *file;
8221 rtx x;
9ebbca7d 8222 int code;
9878760c
RK
8223{
8224 int i;
a260abc9 8225 HOST_WIDE_INT val;
0ba1b2ff 8226 unsigned HOST_WIDE_INT uval;
9878760c
RK
8227
8228 switch (code)
8229 {
a8b3aeda 8230 case '.':
a85d226b
RK
8231 /* Write out an instruction after the call which may be replaced
8232 with glue code by the loader. This depends on the AIX version. */
8233 asm_fprintf (file, RS6000_CALL_GLUE);
a8b3aeda
RK
8234 return;
8235
81eace42
GK
8236 /* %a is output_address. */
8237
9854d9ed
RK
8238 case 'A':
8239 /* If X is a constant integer whose low-order 5 bits are zero,
8240 write 'l'. Otherwise, write 'r'. This is a kludge to fix a bug
76229ac8 8241 in the AIX assembler where "sri" with a zero shift count
20e26713 8242 writes a trash instruction. */
9854d9ed 8243 if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
76229ac8 8244 putc ('l', file);
9854d9ed 8245 else
76229ac8 8246 putc ('r', file);
9854d9ed
RK
8247 return;
8248
8249 case 'b':
e2c953b6
DE
8250 /* If constant, low-order 16 bits of constant, unsigned.
8251 Otherwise, write normally. */
8252 if (INT_P (x))
8253 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
8254 else
8255 print_operand (file, x, 0);
cad12a8d
RK
8256 return;
8257
a260abc9
DE
8258 case 'B':
8259 /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
8260 for 64-bit mask direction. */
296b8152 8261 putc (((INT_LOWPART(x) & 1) == 0 ? 'r' : 'l'), file);
a238cd8b 8262 return;
a260abc9 8263
81eace42
GK
8264 /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
8265 output_operand. */
8266
9854d9ed 8267 case 'E':
39a10a29 8268 /* X is a CR register. Print the number of the EQ bit of the CR */
9854d9ed
RK
8269 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
8270 output_operand_lossage ("invalid %%E value");
78fbdbf7 8271 else
39a10a29 8272 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
a85d226b 8273 return;
9854d9ed
RK
8274
8275 case 'f':
8276 /* X is a CR register. Print the shift count needed to move it
8277 to the high-order four bits. */
8278 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
8279 output_operand_lossage ("invalid %%f value");
8280 else
9ebbca7d 8281 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
9854d9ed
RK
8282 return;
8283
8284 case 'F':
8285 /* Similar, but print the count for the rotate in the opposite
8286 direction. */
8287 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
8288 output_operand_lossage ("invalid %%F value");
8289 else
9ebbca7d 8290 fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
9854d9ed
RK
8291 return;
8292
8293 case 'G':
8294 /* X is a constant integer. If it is negative, print "m",
43aa4e05 8295 otherwise print "z". This is to make an aze or ame insn. */
9854d9ed
RK
8296 if (GET_CODE (x) != CONST_INT)
8297 output_operand_lossage ("invalid %%G value");
8298 else if (INTVAL (x) >= 0)
76229ac8 8299 putc ('z', file);
9854d9ed 8300 else
76229ac8 8301 putc ('m', file);
9854d9ed 8302 return;
e2c953b6 8303
9878760c 8304 case 'h':
a4f6c312
SS
8305 /* If constant, output low-order five bits. Otherwise, write
8306 normally. */
9878760c 8307 if (INT_P (x))
5f59ecb7 8308 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
9878760c
RK
8309 else
8310 print_operand (file, x, 0);
8311 return;
8312
64305719 8313 case 'H':
a4f6c312
SS
8314 /* If constant, output low-order six bits. Otherwise, write
8315 normally. */
64305719 8316 if (INT_P (x))
5f59ecb7 8317 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
64305719
DE
8318 else
8319 print_operand (file, x, 0);
8320 return;
8321
9854d9ed
RK
8322 case 'I':
8323 /* Print `i' if this is a constant, else nothing. */
9878760c 8324 if (INT_P (x))
76229ac8 8325 putc ('i', file);
9878760c
RK
8326 return;
8327
9854d9ed
RK
8328 case 'j':
8329 /* Write the bit number in CCR for jump. */
8330 i = ccr_bit (x, 0);
8331 if (i == -1)
8332 output_operand_lossage ("invalid %%j code");
9878760c 8333 else
9854d9ed 8334 fprintf (file, "%d", i);
9878760c
RK
8335 return;
8336
9854d9ed
RK
8337 case 'J':
8338 /* Similar, but add one for shift count in rlinm for scc and pass
8339 scc flag to `ccr_bit'. */
8340 i = ccr_bit (x, 1);
8341 if (i == -1)
8342 output_operand_lossage ("invalid %%J code");
8343 else
a0466a68
RK
8344 /* If we want bit 31, write a shift count of zero, not 32. */
8345 fprintf (file, "%d", i == 31 ? 0 : i + 1);
9878760c
RK
8346 return;
8347
9854d9ed
RK
8348 case 'k':
8349 /* X must be a constant. Write the 1's complement of the
8350 constant. */
9878760c 8351 if (! INT_P (x))
9854d9ed 8352 output_operand_lossage ("invalid %%k value");
e2c953b6
DE
8353 else
8354 fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
9878760c
RK
8355 return;
8356
81eace42 8357 case 'K':
9ebbca7d
GK
8358 /* X must be a symbolic constant on ELF. Write an
8359 expression suitable for an 'addi' that adds in the low 16
8360 bits of the MEM. */
8361 if (GET_CODE (x) != CONST)
8362 {
8363 print_operand_address (file, x);
8364 fputs ("@l", file);
8365 }
8366 else
8367 {
8368 if (GET_CODE (XEXP (x, 0)) != PLUS
8369 || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
8370 && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
8371 || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
53cd5d6c 8372 output_operand_lossage ("invalid %%K value");
9ebbca7d
GK
8373 print_operand_address (file, XEXP (XEXP (x, 0), 0));
8374 fputs ("@l", file);
ed8d2920
MM
8375 /* For GNU as, there must be a non-alphanumeric character
8376 between 'l' and the number. The '-' is added by
8377 print_operand() already. */
8378 if (INTVAL (XEXP (XEXP (x, 0), 1)) >= 0)
8379 fputs ("+", file);
9ebbca7d
GK
8380 print_operand (file, XEXP (XEXP (x, 0), 1), 0);
8381 }
81eace42
GK
8382 return;
8383
8384 /* %l is output_asm_label. */
9ebbca7d 8385
9854d9ed
RK
8386 case 'L':
8387 /* Write second word of DImode or DFmode reference. Works on register
8388 or non-indexed memory only. */
8389 if (GET_CODE (x) == REG)
5ebfb2ba 8390 fprintf (file, "%s", reg_names[REGNO (x) + 1]);
9854d9ed
RK
8391 else if (GET_CODE (x) == MEM)
8392 {
8393 /* Handle possible auto-increment. Since it is pre-increment and
1427100a 8394 we have already done it, we can just use an offset of word. */
9854d9ed
RK
8395 if (GET_CODE (XEXP (x, 0)) == PRE_INC
8396 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
ed8908e7
RK
8397 output_address (plus_constant (XEXP (XEXP (x, 0), 0),
8398 UNITS_PER_WORD));
9854d9ed 8399 else
d7624dc0
RK
8400 output_address (XEXP (adjust_address_nv (x, SImode,
8401 UNITS_PER_WORD),
8402 0));
ed8908e7 8403
ba5e43aa 8404 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
8405 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
8406 reg_names[SMALL_DATA_REG]);
9854d9ed 8407 }
9878760c 8408 return;
9854d9ed 8409
9878760c
RK
8410 case 'm':
8411 /* MB value for a mask operand. */
b1765bde 8412 if (! mask_operand (x, SImode))
9878760c
RK
8413 output_operand_lossage ("invalid %%m value");
8414
0ba1b2ff 8415 fprintf (file, "%d", extract_MB (x));
9878760c
RK
8416 return;
8417
8418 case 'M':
8419 /* ME value for a mask operand. */
b1765bde 8420 if (! mask_operand (x, SImode))
a260abc9 8421 output_operand_lossage ("invalid %%M value");
9878760c 8422
0ba1b2ff 8423 fprintf (file, "%d", extract_ME (x));
9878760c
RK
8424 return;
8425
81eace42
GK
8426 /* %n outputs the negative of its operand. */
8427
9878760c
RK
8428 case 'N':
8429 /* Write the number of elements in the vector times 4. */
8430 if (GET_CODE (x) != PARALLEL)
8431 output_operand_lossage ("invalid %%N value");
e2c953b6
DE
8432 else
8433 fprintf (file, "%d", XVECLEN (x, 0) * 4);
9878760c
RK
8434 return;
8435
8436 case 'O':
8437 /* Similar, but subtract 1 first. */
8438 if (GET_CODE (x) != PARALLEL)
1427100a 8439 output_operand_lossage ("invalid %%O value");
e2c953b6
DE
8440 else
8441 fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
9878760c
RK
8442 return;
8443
9854d9ed
RK
8444 case 'p':
8445 /* X is a CONST_INT that is a power of two. Output the logarithm. */
8446 if (! INT_P (x)
2bfcf297 8447 || INT_LOWPART (x) < 0
9854d9ed
RK
8448 || (i = exact_log2 (INT_LOWPART (x))) < 0)
8449 output_operand_lossage ("invalid %%p value");
e2c953b6
DE
8450 else
8451 fprintf (file, "%d", i);
9854d9ed
RK
8452 return;
8453
9878760c
RK
8454 case 'P':
8455 /* The operand must be an indirect memory reference. The result
a4f6c312 8456 is the register number. */
9878760c
RK
8457 if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
8458 || REGNO (XEXP (x, 0)) >= 32)
8459 output_operand_lossage ("invalid %%P value");
e2c953b6
DE
8460 else
8461 fprintf (file, "%d", REGNO (XEXP (x, 0)));
9878760c
RK
8462 return;
8463
dfbdccdb
GK
8464 case 'q':
8465 /* This outputs the logical code corresponding to a boolean
8466 expression. The expression may have one or both operands
39a10a29
GK
8467 negated (if one, only the first one). For condition register
8468 logical operations, it will also treat the negated
8469 CR codes as NOTs, but not handle NOTs of them. */
dfbdccdb 8470 {
63bc1d05 8471 const char *const *t = 0;
dfbdccdb
GK
8472 const char *s;
8473 enum rtx_code code = GET_CODE (x);
8474 static const char * const tbl[3][3] = {
8475 { "and", "andc", "nor" },
8476 { "or", "orc", "nand" },
8477 { "xor", "eqv", "xor" } };
8478
8479 if (code == AND)
8480 t = tbl[0];
8481 else if (code == IOR)
8482 t = tbl[1];
8483 else if (code == XOR)
8484 t = tbl[2];
8485 else
8486 output_operand_lossage ("invalid %%q value");
8487
8488 if (GET_CODE (XEXP (x, 0)) != NOT)
8489 s = t[0];
8490 else
8491 {
8492 if (GET_CODE (XEXP (x, 1)) == NOT)
8493 s = t[2];
8494 else
8495 s = t[1];
8496 }
8497
8498 fputs (s, file);
8499 }
8500 return;
8501
9854d9ed
RK
8502 case 'R':
8503 /* X is a CR register. Print the mask for `mtcrf'. */
8504 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
8505 output_operand_lossage ("invalid %%R value");
8506 else
9ebbca7d 8507 fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
9878760c 8508 return;
9854d9ed
RK
8509
8510 case 's':
8511 /* Low 5 bits of 32 - value */
8512 if (! INT_P (x))
8513 output_operand_lossage ("invalid %%s value");
e2c953b6
DE
8514 else
8515 fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
9878760c 8516 return;
9854d9ed 8517
a260abc9 8518 case 'S':
0ba1b2ff 8519 /* PowerPC64 mask position. All 0's is excluded.
a260abc9
DE
8520 CONST_INT 32-bit mask is considered sign-extended so any
8521 transition must occur within the CONST_INT, not on the boundary. */
b1765bde 8522 if (! mask64_operand (x, DImode))
a260abc9
DE
8523 output_operand_lossage ("invalid %%S value");
8524
0ba1b2ff 8525 uval = INT_LOWPART (x);
a260abc9 8526
0ba1b2ff 8527 if (uval & 1) /* Clear Left */
a260abc9 8528 {
f099d360
GK
8529#if HOST_BITS_PER_WIDE_INT > 64
8530 uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
8531#endif
0ba1b2ff 8532 i = 64;
a260abc9 8533 }
0ba1b2ff 8534 else /* Clear Right */
a260abc9 8535 {
0ba1b2ff 8536 uval = ~uval;
f099d360
GK
8537#if HOST_BITS_PER_WIDE_INT > 64
8538 uval &= ((unsigned HOST_WIDE_INT) 1 << 64) - 1;
8539#endif
0ba1b2ff 8540 i = 63;
a260abc9 8541 }
0ba1b2ff
AM
8542 while (uval != 0)
8543 --i, uval >>= 1;
8544 if (i < 0)
8545 abort ();
8546 fprintf (file, "%d", i);
8547 return;
a260abc9 8548
a3170dc6
AH
8549 case 't':
8550 /* Like 'J' but get to the OVERFLOW/UNORDERED bit. */
8551 if (GET_CODE (x) != REG || GET_MODE (x) != CCmode)
8552 abort ();
8553
8554 /* Bit 3 is OV bit. */
8555 i = 4 * (REGNO (x) - CR0_REGNO) + 3;
8556
8557 /* If we want bit 31, write a shift count of zero, not 32. */
8558 fprintf (file, "%d", i == 31 ? 0 : i + 1);
8559 return;
8560
cccf3bdc
DE
8561 case 'T':
8562 /* Print the symbolic name of a branch target register. */
8563 if (GET_CODE (x) != REG || (REGNO (x) != LINK_REGISTER_REGNUM
8564 && REGNO (x) != COUNT_REGISTER_REGNUM))
8565 output_operand_lossage ("invalid %%T value");
e2c953b6 8566 else if (REGNO (x) == LINK_REGISTER_REGNUM)
cccf3bdc
DE
8567 fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
8568 else
8569 fputs ("ctr", file);
8570 return;
8571
9854d9ed 8572 case 'u':
802a0058 8573 /* High-order 16 bits of constant for use in unsigned operand. */
9854d9ed
RK
8574 if (! INT_P (x))
8575 output_operand_lossage ("invalid %%u value");
e2c953b6
DE
8576 else
8577 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
8578 (INT_LOWPART (x) >> 16) & 0xffff);
9878760c
RK
8579 return;
8580
802a0058
MM
8581 case 'v':
8582 /* High-order 16 bits of constant for use in signed operand. */
8583 if (! INT_P (x))
8584 output_operand_lossage ("invalid %%v value");
e2c953b6 8585 else
134c32f6
DE
8586 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
8587 (INT_LOWPART (x) >> 16) & 0xffff);
8588 return;
802a0058 8589
9854d9ed
RK
8590 case 'U':
8591 /* Print `u' if this has an auto-increment or auto-decrement. */
8592 if (GET_CODE (x) == MEM
8593 && (GET_CODE (XEXP (x, 0)) == PRE_INC
8594 || GET_CODE (XEXP (x, 0)) == PRE_DEC))
76229ac8 8595 putc ('u', file);
9854d9ed 8596 return;
9878760c 8597
e0cd0770
JC
8598 case 'V':
8599 /* Print the trap code for this operand. */
8600 switch (GET_CODE (x))
8601 {
8602 case EQ:
8603 fputs ("eq", file); /* 4 */
8604 break;
8605 case NE:
8606 fputs ("ne", file); /* 24 */
8607 break;
8608 case LT:
8609 fputs ("lt", file); /* 16 */
8610 break;
8611 case LE:
8612 fputs ("le", file); /* 20 */
8613 break;
8614 case GT:
8615 fputs ("gt", file); /* 8 */
8616 break;
8617 case GE:
8618 fputs ("ge", file); /* 12 */
8619 break;
8620 case LTU:
8621 fputs ("llt", file); /* 2 */
8622 break;
8623 case LEU:
8624 fputs ("lle", file); /* 6 */
8625 break;
8626 case GTU:
8627 fputs ("lgt", file); /* 1 */
8628 break;
8629 case GEU:
8630 fputs ("lge", file); /* 5 */
8631 break;
8632 default:
8633 abort ();
8634 }
8635 break;
8636
9854d9ed
RK
8637 case 'w':
8638 /* If constant, low-order 16 bits of constant, signed. Otherwise, write
8639 normally. */
8640 if (INT_P (x))
5f59ecb7
DE
8641 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
8642 ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
9854d9ed
RK
8643 else
8644 print_operand (file, x, 0);
9878760c
RK
8645 return;
8646
9854d9ed 8647 case 'W':
e2c953b6 8648 /* MB value for a PowerPC64 rldic operand. */
e2c953b6
DE
8649 val = (GET_CODE (x) == CONST_INT
8650 ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
8651
8652 if (val < 0)
8653 i = -1;
9854d9ed 8654 else
e2c953b6
DE
8655 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
8656 if ((val <<= 1) < 0)
8657 break;
8658
8659#if HOST_BITS_PER_WIDE_INT == 32
8660 if (GET_CODE (x) == CONST_INT && i >= 0)
8661 i += 32; /* zero-extend high-part was all 0's */
8662 else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
8663 {
8664 val = CONST_DOUBLE_LOW (x);
8665
8666 if (val == 0)
a4f6c312 8667 abort ();
e2c953b6
DE
8668 else if (val < 0)
8669 --i;
8670 else
8671 for ( ; i < 64; i++)
8672 if ((val <<= 1) < 0)
8673 break;
8674 }
8675#endif
8676
8677 fprintf (file, "%d", i + 1);
9854d9ed 8678 return;
9878760c 8679
9854d9ed
RK
8680 case 'X':
8681 if (GET_CODE (x) == MEM
4d588c14 8682 && legitimate_indexed_address_p (XEXP (x, 0), 0))
76229ac8 8683 putc ('x', file);
9854d9ed 8684 return;
9878760c 8685
9854d9ed
RK
8686 case 'Y':
8687 /* Like 'L', for third word of TImode */
8688 if (GET_CODE (x) == REG)
5ebfb2ba 8689 fprintf (file, "%s", reg_names[REGNO (x) + 2]);
9854d9ed 8690 else if (GET_CODE (x) == MEM)
9878760c 8691 {
9854d9ed
RK
8692 if (GET_CODE (XEXP (x, 0)) == PRE_INC
8693 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
a54d04b7 8694 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
9854d9ed 8695 else
d7624dc0 8696 output_address (XEXP (adjust_address_nv (x, SImode, 8), 0));
ba5e43aa 8697 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
8698 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
8699 reg_names[SMALL_DATA_REG]);
9878760c
RK
8700 }
8701 return;
9854d9ed 8702
9878760c 8703 case 'z':
b4ac57ab
RS
8704 /* X is a SYMBOL_REF. Write out the name preceded by a
8705 period and without any trailing data in brackets. Used for function
4d30c363
MM
8706 names. If we are configured for System V (or the embedded ABI) on
8707 the PowerPC, do not emit the period, since those systems do not use
8708 TOCs and the like. */
9878760c
RK
8709 if (GET_CODE (x) != SYMBOL_REF)
8710 abort ();
8711
b6c9286a
MM
8712 if (XSTR (x, 0)[0] != '.')
8713 {
8714 switch (DEFAULT_ABI)
8715 {
8716 default:
8717 abort ();
8718
8719 case ABI_AIX:
8720 putc ('.', file);
8721 break;
8722
8723 case ABI_V4:
ee890fe2 8724 case ABI_DARWIN:
b6c9286a 8725 break;
b6c9286a
MM
8726 }
8727 }
9739c90c
JJ
8728 if (TARGET_AIX)
8729 RS6000_OUTPUT_BASENAME (file, XSTR (x, 0));
8730 else
8731 assemble_name (file, XSTR (x, 0));
9878760c
RK
8732 return;
8733
9854d9ed
RK
8734 case 'Z':
8735 /* Like 'L', for last word of TImode. */
8736 if (GET_CODE (x) == REG)
5ebfb2ba 8737 fprintf (file, "%s", reg_names[REGNO (x) + 3]);
9854d9ed
RK
8738 else if (GET_CODE (x) == MEM)
8739 {
8740 if (GET_CODE (XEXP (x, 0)) == PRE_INC
8741 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
a54d04b7 8742 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
9854d9ed 8743 else
d7624dc0 8744 output_address (XEXP (adjust_address_nv (x, SImode, 12), 0));
ba5e43aa 8745 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
8746 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
8747 reg_names[SMALL_DATA_REG]);
9854d9ed 8748 }
5c23c401 8749 return;
0ac081f6 8750
a3170dc6 8751 /* Print AltiVec or SPE memory operand. */
0ac081f6
AH
8752 case 'y':
8753 {
8754 rtx tmp;
8755
8756 if (GET_CODE (x) != MEM)
8757 abort ();
8758
8759 tmp = XEXP (x, 0);
8760
993f19a8 8761 if (TARGET_E500)
a3170dc6
AH
8762 {
8763 /* Handle [reg]. */
8764 if (GET_CODE (tmp) == REG)
8765 {
8766 fprintf (file, "0(%s)", reg_names[REGNO (tmp)]);
8767 break;
8768 }
8769 /* Handle [reg+UIMM]. */
8770 else if (GET_CODE (tmp) == PLUS &&
8771 GET_CODE (XEXP (tmp, 1)) == CONST_INT)
8772 {
8773 int x;
8774
8775 if (GET_CODE (XEXP (tmp, 0)) != REG)
8776 abort ();
8777
8778 x = INTVAL (XEXP (tmp, 1));
8779 fprintf (file, "%d(%s)", x, reg_names[REGNO (XEXP (tmp, 0))]);
8780 break;
8781 }
8782
8783 /* Fall through. Must be [reg+reg]. */
8784 }
0ac081f6 8785 if (GET_CODE (tmp) == REG)
c62f2db5 8786 fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
0ac081f6
AH
8787 else if (GET_CODE (tmp) == PLUS && GET_CODE (XEXP (tmp, 1)) == REG)
8788 {
8789 if (REGNO (XEXP (tmp, 0)) == 0)
8790 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 1)) ],
8791 reg_names[ REGNO (XEXP (tmp, 0)) ]);
8792 else
8793 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (tmp, 0)) ],
8794 reg_names[ REGNO (XEXP (tmp, 1)) ]);
8795 }
8796 else
8797 abort ();
8798 break;
8799 }
9854d9ed 8800
9878760c
RK
8801 case 0:
8802 if (GET_CODE (x) == REG)
8803 fprintf (file, "%s", reg_names[REGNO (x)]);
8804 else if (GET_CODE (x) == MEM)
8805 {
8806 /* We need to handle PRE_INC and PRE_DEC here, since we need to
8807 know the width from the mode. */
8808 if (GET_CODE (XEXP (x, 0)) == PRE_INC)
79ba6d34
MM
8809 fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
8810 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
9878760c 8811 else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
79ba6d34
MM
8812 fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
8813 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
9878760c 8814 else
a54d04b7 8815 output_address (XEXP (x, 0));
9878760c
RK
8816 }
8817 else
a54d04b7 8818 output_addr_const (file, x);
a85d226b 8819 return;
9878760c 8820
c4501e62
JJ
8821 case '&':
8822 assemble_name (file, rs6000_get_some_local_dynamic_name ());
8823 return;
8824
9878760c
RK
8825 default:
8826 output_operand_lossage ("invalid %%xn code");
8827 }
8828}
8829\f
8830/* Print the address of an operand. */
8831
8832void
8833print_operand_address (file, x)
8834 FILE *file;
592696dd 8835 rtx x;
9878760c
RK
8836{
8837 if (GET_CODE (x) == REG)
4697a36c 8838 fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
9ebbca7d
GK
8839 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
8840 || GET_CODE (x) == LABEL_REF)
9878760c
RK
8841 {
8842 output_addr_const (file, x);
ba5e43aa 8843 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
8844 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
8845 reg_names[SMALL_DATA_REG]);
9ebbca7d 8846 else if (TARGET_TOC)
a4f6c312 8847 abort ();
9878760c
RK
8848 }
8849 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
8850 {
8851 if (REGNO (XEXP (x, 0)) == 0)
4697a36c
MM
8852 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
8853 reg_names[ REGNO (XEXP (x, 0)) ]);
9878760c 8854 else
4697a36c
MM
8855 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
8856 reg_names[ REGNO (XEXP (x, 1)) ]);
9878760c
RK
8857 }
8858 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
4a0a75dd
KG
8859 fprintf (file, HOST_WIDE_INT_PRINT_DEC "(%s)",
8860 INTVAL (XEXP (x, 1)), reg_names[ REGNO (XEXP (x, 0)) ]);
3cb999d8
DE
8861#if TARGET_ELF
8862 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
8863 && CONSTANT_P (XEXP (x, 1)))
4697a36c
MM
8864 {
8865 output_addr_const (file, XEXP (x, 1));
8866 fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
8867 }
c859cda6
DJ
8868#endif
8869#if TARGET_MACHO
8870 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
8871 && CONSTANT_P (XEXP (x, 1)))
8872 {
8873 fprintf (file, "lo16(");
8874 output_addr_const (file, XEXP (x, 1));
8875 fprintf (file, ")(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
8876 }
3cb999d8 8877#endif
4d588c14 8878 else if (legitimate_constant_pool_address_p (x))
9ebbca7d 8879 {
2bfcf297 8880 if (TARGET_AIX && (!TARGET_ELF || !TARGET_MINIMAL_TOC))
9ebbca7d 8881 {
2bfcf297
DB
8882 rtx contains_minus = XEXP (x, 1);
8883 rtx minus, symref;
8884 const char *name;
9ebbca7d
GK
8885
8886 /* Find the (minus (sym) (toc)) buried in X, and temporarily
a4f6c312 8887 turn it into (sym) for output_addr_const. */
9ebbca7d
GK
8888 while (GET_CODE (XEXP (contains_minus, 0)) != MINUS)
8889 contains_minus = XEXP (contains_minus, 0);
8890
2bfcf297
DB
8891 minus = XEXP (contains_minus, 0);
8892 symref = XEXP (minus, 0);
8893 XEXP (contains_minus, 0) = symref;
8894 if (TARGET_ELF)
8895 {
8896 char *newname;
8897
8898 name = XSTR (symref, 0);
8899 newname = alloca (strlen (name) + sizeof ("@toc"));
8900 strcpy (newname, name);
8901 strcat (newname, "@toc");
8902 XSTR (symref, 0) = newname;
8903 }
8904 output_addr_const (file, XEXP (x, 1));
8905 if (TARGET_ELF)
8906 XSTR (symref, 0) = name;
9ebbca7d
GK
8907 XEXP (contains_minus, 0) = minus;
8908 }
8909 else
8910 output_addr_const (file, XEXP (x, 1));
8911
8912 fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
8913 }
9878760c
RK
8914 else
8915 abort ();
8916}
8917\f
88cad84b 8918/* Target hook for assembling integer objects. The PowerPC version has
301d03af
RS
8919 to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
8920 is defined. It also needs to handle DI-mode objects on 64-bit
8921 targets. */
8922
8923static bool
8924rs6000_assemble_integer (x, size, aligned_p)
8925 rtx x;
8926 unsigned int size;
8927 int aligned_p;
8928{
8929#ifdef RELOCATABLE_NEEDS_FIXUP
8930 /* Special handling for SI values. */
8931 if (size == 4 && aligned_p)
8932 {
8933 extern int in_toc_section PARAMS ((void));
8934 static int recurse = 0;
8935
8936 /* For -mrelocatable, we mark all addresses that need to be fixed up
8937 in the .fixup section. */
8938 if (TARGET_RELOCATABLE
8939 && !in_toc_section ()
8940 && !in_text_section ()
8941 && !recurse
8942 && GET_CODE (x) != CONST_INT
8943 && GET_CODE (x) != CONST_DOUBLE
8944 && CONSTANT_P (x))
8945 {
8946 char buf[256];
8947
8948 recurse = 1;
8949 ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);
8950 fixuplabelno++;
8951 ASM_OUTPUT_LABEL (asm_out_file, buf);
8952 fprintf (asm_out_file, "\t.long\t(");
8953 output_addr_const (asm_out_file, x);
8954 fprintf (asm_out_file, ")@fixup\n");
8955 fprintf (asm_out_file, "\t.section\t\".fixup\",\"aw\"\n");
8956 ASM_OUTPUT_ALIGN (asm_out_file, 2);
8957 fprintf (asm_out_file, "\t.long\t");
8958 assemble_name (asm_out_file, buf);
8959 fprintf (asm_out_file, "\n\t.previous\n");
8960 recurse = 0;
8961 return true;
8962 }
8963 /* Remove initial .'s to turn a -mcall-aixdesc function
8964 address into the address of the descriptor, not the function
8965 itself. */
8966 else if (GET_CODE (x) == SYMBOL_REF
8967 && XSTR (x, 0)[0] == '.'
8968 && DEFAULT_ABI == ABI_AIX)
8969 {
8970 const char *name = XSTR (x, 0);
8971 while (*name == '.')
8972 name++;
8973
8974 fprintf (asm_out_file, "\t.long\t%s\n", name);
8975 return true;
8976 }
8977 }
8978#endif /* RELOCATABLE_NEEDS_FIXUP */
8979 return default_assemble_integer (x, size, aligned_p);
8980}
93638d7a
AM
8981
8982#ifdef HAVE_GAS_HIDDEN
8983/* Emit an assembler directive to set symbol visibility for DECL to
8984 VISIBILITY_TYPE. */
8985
5add3202 8986static void
25fdb4dc 8987rs6000_assemble_visibility (decl, vis)
93638d7a 8988 tree decl;
25fdb4dc 8989 int vis;
93638d7a 8990{
93638d7a
AM
8991 /* Functions need to have their entry point symbol visibility set as
8992 well as their descriptor symbol visibility. */
8993 if (DEFAULT_ABI == ABI_AIX && TREE_CODE (decl) == FUNCTION_DECL)
8994 {
25fdb4dc
RH
8995 static const char * const visibility_types[] = {
8996 NULL, "internal", "hidden", "protected"
8997 };
8998
8999 const char *name, *type;
93638d7a
AM
9000
9001 name = ((* targetm.strip_name_encoding)
9002 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
25fdb4dc 9003 type = visibility_types[vis];
93638d7a 9004
25fdb4dc
RH
9005 fprintf (asm_out_file, "\t.%s\t%s\n", type, name);
9006 fprintf (asm_out_file, "\t.%s\t.%s\n", type, name);
93638d7a 9007 }
25fdb4dc
RH
9008 else
9009 default_assemble_visibility (decl, vis);
93638d7a
AM
9010}
9011#endif
301d03af 9012\f
39a10a29
GK
9013enum rtx_code
9014rs6000_reverse_condition (mode, code)
9015 enum machine_mode mode;
9016 enum rtx_code code;
9017{
9018 /* Reversal of FP compares takes care -- an ordered compare
9019 becomes an unordered compare and vice versa. */
bc9ec0e0
GK
9020 if (mode == CCFPmode
9021 && (!flag_finite_math_only
9022 || code == UNLT || code == UNLE || code == UNGT || code == UNGE
9023 || code == UNEQ || code == LTGT))
bab6226b 9024 return reverse_condition_maybe_unordered (code);
39a10a29 9025 else
bab6226b 9026 return reverse_condition (code);
39a10a29
GK
9027}
9028
39a10a29
GK
9029/* Generate a compare for CODE. Return a brand-new rtx that
9030 represents the result of the compare. */
a4f6c312 9031
39a10a29
GK
9032static rtx
9033rs6000_generate_compare (code)
9034 enum rtx_code code;
9035{
9036 enum machine_mode comp_mode;
9037 rtx compare_result;
9038
9039 if (rs6000_compare_fp_p)
9040 comp_mode = CCFPmode;
9041 else if (code == GTU || code == LTU
9042 || code == GEU || code == LEU)
9043 comp_mode = CCUNSmode;
9044 else
9045 comp_mode = CCmode;
9046
9047 /* First, the compare. */
9048 compare_result = gen_reg_rtx (comp_mode);
a3170dc6
AH
9049
9050 /* SPE FP compare instructions on the GPRs. Yuck! */
993f19a8
AH
9051 if ((TARGET_E500 && !TARGET_FPRS && TARGET_HARD_FLOAT)
9052 && rs6000_compare_fp_p)
a3170dc6
AH
9053 {
9054 rtx cmp, or1, or2, or_result, compare_result2;
9055
9056 switch (code)
9057 {
9058 case EQ:
9059 case UNEQ:
9060 case NE:
9061 case LTGT:
bc9ec0e0 9062 cmp = flag_finite_math_only
a3170dc6
AH
9063 ? gen_tstsfeq_gpr (compare_result, rs6000_compare_op0,
9064 rs6000_compare_op1)
9065 : gen_cmpsfeq_gpr (compare_result, rs6000_compare_op0,
9066 rs6000_compare_op1);
9067 break;
9068 case GT:
9069 case GTU:
9070 case UNGT:
9071 case UNGE:
9072 case GE:
9073 case GEU:
bc9ec0e0 9074 cmp = flag_finite_math_only
a3170dc6
AH
9075 ? gen_tstsfgt_gpr (compare_result, rs6000_compare_op0,
9076 rs6000_compare_op1)
9077 : gen_cmpsfgt_gpr (compare_result, rs6000_compare_op0,
9078 rs6000_compare_op1);
9079 break;
9080 case LT:
9081 case LTU:
9082 case UNLT:
9083 case UNLE:
9084 case LE:
9085 case LEU:
bc9ec0e0 9086 cmp = flag_finite_math_only
a3170dc6
AH
9087 ? gen_tstsflt_gpr (compare_result, rs6000_compare_op0,
9088 rs6000_compare_op1)
9089 : gen_cmpsflt_gpr (compare_result, rs6000_compare_op0,
9090 rs6000_compare_op1);
9091 break;
9092 default:
9093 abort ();
9094 }
9095
9096 /* Synthesize LE and GE from LT/GT || EQ. */
9097 if (code == LE || code == GE || code == LEU || code == GEU)
9098 {
9099 /* Synthesize GE/LE frome GT/LT || EQ. */
9100
9101 emit_insn (cmp);
9102
9103 switch (code)
9104 {
9105 case LE: code = LT; break;
9106 case GE: code = GT; break;
9107 case LEU: code = LT; break;
9108 case GEU: code = GT; break;
9109 default: abort ();
9110 }
9111
9112 or1 = gen_reg_rtx (SImode);
9113 or2 = gen_reg_rtx (SImode);
9114 or_result = gen_reg_rtx (CCEQmode);
9115 compare_result2 = gen_reg_rtx (CCFPmode);
9116
9117 /* Do the EQ. */
bc9ec0e0 9118 cmp = flag_finite_math_only
a3170dc6
AH
9119 ? gen_tstsfeq_gpr (compare_result2, rs6000_compare_op0,
9120 rs6000_compare_op1)
9121 : gen_cmpsfeq_gpr (compare_result2, rs6000_compare_op0,
9122 rs6000_compare_op1);
9123 emit_insn (cmp);
9124
9125 /* The MC8540 FP compare instructions set the CR bits
9126 differently than other PPC compare instructions. For
9127 that matter, there is no generic test instruction, but a
9128 testgt, testlt, and testeq. For a true condition, bit 2
9129 is set (x1xx) in the CR. Following the traditional CR
9130 values:
9131
9132 LT GT EQ OV
9133 bit3 bit2 bit1 bit0
9134
9135 ... bit 2 would be a GT CR alias, so later on we
b6d08ca1 9136 look in the GT bits for the branch instructions.
a3170dc6
AH
9137 However, we must be careful to emit correct RTL in
9138 the meantime, so optimizations don't get confused. */
9139
9140 or1 = gen_rtx (NE, SImode, compare_result, const0_rtx);
9141 or2 = gen_rtx (NE, SImode, compare_result2, const0_rtx);
9142
9143 /* OR them together. */
9144 cmp = gen_rtx_SET (VOIDmode, or_result,
9145 gen_rtx_COMPARE (CCEQmode,
9146 gen_rtx_IOR (SImode, or1, or2),
9147 const_true_rtx));
9148 compare_result = or_result;
9149 code = EQ;
9150 }
9151 else
9152 {
9153 /* We only care about 1 bit (x1xx), so map everything to NE to
9154 maintain rtl sanity. We'll get to the right bit (x1xx) at
9155 code output time. */
9156 if (code == NE || code == LTGT)
9157 /* Do the inverse here because we have no cmpne
9158 instruction. We use the cmpeq instruction and expect
9159 to get a 0 instead. */
9160 code = EQ;
9161 else
9162 code = NE;
9163 }
9164
9165 emit_insn (cmp);
9166 }
9167 else
9168 emit_insn (gen_rtx_SET (VOIDmode, compare_result,
9169 gen_rtx_COMPARE (comp_mode,
9170 rs6000_compare_op0,
9171 rs6000_compare_op1)));
39a10a29 9172
ca5adc63 9173 /* Some kinds of FP comparisons need an OR operation;
bc9ec0e0 9174 under flag_finite_math_only we don't bother. */
39a10a29 9175 if (rs6000_compare_fp_p
bc9ec0e0 9176 && ! flag_finite_math_only
993f19a8 9177 && ! (TARGET_HARD_FLOAT && TARGET_E500 && !TARGET_FPRS)
39a10a29
GK
9178 && (code == LE || code == GE
9179 || code == UNEQ || code == LTGT
9180 || code == UNGT || code == UNLT))
9181 {
9182 enum rtx_code or1, or2;
9183 rtx or1_rtx, or2_rtx, compare2_rtx;
9184 rtx or_result = gen_reg_rtx (CCEQmode);
9185
9186 switch (code)
9187 {
9188 case LE: or1 = LT; or2 = EQ; break;
9189 case GE: or1 = GT; or2 = EQ; break;
9190 case UNEQ: or1 = UNORDERED; or2 = EQ; break;
9191 case LTGT: or1 = LT; or2 = GT; break;
9192 case UNGT: or1 = UNORDERED; or2 = GT; break;
9193 case UNLT: or1 = UNORDERED; or2 = LT; break;
9194 default: abort ();
9195 }
9196 validate_condition_mode (or1, comp_mode);
9197 validate_condition_mode (or2, comp_mode);
9198 or1_rtx = gen_rtx (or1, SImode, compare_result, const0_rtx);
9199 or2_rtx = gen_rtx (or2, SImode, compare_result, const0_rtx);
9200 compare2_rtx = gen_rtx_COMPARE (CCEQmode,
9201 gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
9202 const_true_rtx);
9203 emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
9204
9205 compare_result = or_result;
9206 code = EQ;
9207 }
9208
9209 validate_condition_mode (code, GET_MODE (compare_result));
9210
9211 return gen_rtx (code, VOIDmode, compare_result, const0_rtx);
9212}
9213
9214
9215/* Emit the RTL for an sCOND pattern. */
9216
9217void
9218rs6000_emit_sCOND (code, result)
9219 enum rtx_code code;
9220 rtx result;
9221{
9222 rtx condition_rtx;
9223 enum machine_mode op_mode;
b7053a3f 9224 enum rtx_code cond_code;
39a10a29
GK
9225
9226 condition_rtx = rs6000_generate_compare (code);
b7053a3f
GK
9227 cond_code = GET_CODE (condition_rtx);
9228
9229 if (cond_code == NE
9230 || cond_code == GE || cond_code == LE
9231 || cond_code == GEU || cond_code == LEU
9232 || cond_code == ORDERED || cond_code == UNGE || cond_code == UNLE)
9233 {
9234 rtx not_result = gen_reg_rtx (CCEQmode);
9235 rtx not_op, rev_cond_rtx;
9236 enum machine_mode cc_mode;
9237
9238 cc_mode = GET_MODE (XEXP (condition_rtx, 0));
9239
9240 rev_cond_rtx = gen_rtx (rs6000_reverse_condition (cc_mode, cond_code),
9241 SImode, XEXP (condition_rtx, 0), const0_rtx);
9242 not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
9243 emit_insn (gen_rtx_SET (VOIDmode, not_result, not_op));
9244 condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
9245 }
39a10a29
GK
9246
9247 op_mode = GET_MODE (rs6000_compare_op0);
9248 if (op_mode == VOIDmode)
9249 op_mode = GET_MODE (rs6000_compare_op1);
9250
9251 if (TARGET_POWERPC64 && (op_mode == DImode || rs6000_compare_fp_p))
9252 {
9253 PUT_MODE (condition_rtx, DImode);
9254 convert_move (result, condition_rtx, 0);
9255 }
9256 else
9257 {
9258 PUT_MODE (condition_rtx, SImode);
9259 emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
9260 }
9261}
9262
39a10a29
GK
9263/* Emit a branch of kind CODE to location LOC. */
9264
9265void
9266rs6000_emit_cbranch (code, loc)
9267 enum rtx_code code;
9268 rtx loc;
9269{
9270 rtx condition_rtx, loc_ref;
9271
9272 condition_rtx = rs6000_generate_compare (code);
9273 loc_ref = gen_rtx_LABEL_REF (VOIDmode, loc);
9274 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
9275 gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
9276 loc_ref, pc_rtx)));
9277}
9278
12a4e8c5
GK
9279/* Return the string to output a conditional branch to LABEL, which is
9280 the operand number of the label, or -1 if the branch is really a
9281 conditional return.
9282
9283 OP is the conditional expression. XEXP (OP, 0) is assumed to be a
9284 condition code register and its mode specifies what kind of
9285 comparison we made.
9286
a0ab749a 9287 REVERSED is nonzero if we should reverse the sense of the comparison.
12a4e8c5
GK
9288
9289 INSN is the insn. */
9290
9291char *
9292output_cbranch (op, label, reversed, insn)
9293 rtx op;
9294 const char * label;
9295 int reversed;
9296 rtx insn;
9297{
9298 static char string[64];
9299 enum rtx_code code = GET_CODE (op);
9300 rtx cc_reg = XEXP (op, 0);
9301 enum machine_mode mode = GET_MODE (cc_reg);
9302 int cc_regno = REGNO (cc_reg) - CR0_REGNO;
39a10a29 9303 int need_longbranch = label != NULL && get_attr_length (insn) == 8;
12a4e8c5
GK
9304 int really_reversed = reversed ^ need_longbranch;
9305 char *s = string;
9306 const char *ccode;
9307 const char *pred;
9308 rtx note;
9309
39a10a29
GK
9310 validate_condition_mode (code, mode);
9311
9312 /* Work out which way this really branches. We could use
9313 reverse_condition_maybe_unordered here always but this
9314 makes the resulting assembler clearer. */
12a4e8c5 9315 if (really_reversed)
de40e1df
DJ
9316 {
9317 /* Reversal of FP compares takes care -- an ordered compare
9318 becomes an unordered compare and vice versa. */
9319 if (mode == CCFPmode)
9320 code = reverse_condition_maybe_unordered (code);
9321 else
9322 code = reverse_condition (code);
9323 }
12a4e8c5 9324
993f19a8 9325 if ((TARGET_E500 && !TARGET_FPRS && TARGET_HARD_FLOAT) && mode == CCFPmode)
a3170dc6
AH
9326 {
9327 /* The efscmp/tst* instructions twiddle bit 2, which maps nicely
9328 to the GT bit. */
9329 if (code == EQ)
9330 /* Opposite of GT. */
9331 code = UNLE;
9332 else if (code == NE)
9333 code = GT;
9334 else
9335 abort ();
9336 }
9337
39a10a29 9338 switch (code)
12a4e8c5
GK
9339 {
9340 /* Not all of these are actually distinct opcodes, but
9341 we distinguish them for clarity of the resulting assembler. */
50a0b056
GK
9342 case NE: case LTGT:
9343 ccode = "ne"; break;
9344 case EQ: case UNEQ:
9345 ccode = "eq"; break;
9346 case GE: case GEU:
9347 ccode = "ge"; break;
9348 case GT: case GTU: case UNGT:
9349 ccode = "gt"; break;
9350 case LE: case LEU:
9351 ccode = "le"; break;
9352 case LT: case LTU: case UNLT:
9353 ccode = "lt"; break;
12a4e8c5
GK
9354 case UNORDERED: ccode = "un"; break;
9355 case ORDERED: ccode = "nu"; break;
9356 case UNGE: ccode = "nl"; break;
9357 case UNLE: ccode = "ng"; break;
9358 default:
a4f6c312 9359 abort ();
12a4e8c5
GK
9360 }
9361
94a54f47
GK
9362 /* Maybe we have a guess as to how likely the branch is.
9363 The old mnemonics don't have a way to specify this information. */
f4857b9b 9364 pred = "";
12a4e8c5
GK
9365 note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
9366 if (note != NULL_RTX)
9367 {
9368 /* PROB is the difference from 50%. */
9369 int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
f4857b9b
AM
9370 bool always_hint = rs6000_cpu != PROCESSOR_POWER4;
9371
9372 /* Only hint for highly probable/improbable branches on newer
9373 cpus as static prediction overrides processor dynamic
9374 prediction. For older cpus we may as well always hint, but
9375 assume not taken for branches that are very close to 50% as a
9376 mispredicted taken branch is more expensive than a
9377 mispredicted not-taken branch. */
9378 if (always_hint
9379 || abs (prob) > REG_BR_PROB_BASE / 100 * 48)
9380 {
9381 if (abs (prob) > REG_BR_PROB_BASE / 20
9382 && ((prob > 0) ^ need_longbranch))
7f3d8013 9383 pred = "+";
f4857b9b
AM
9384 else
9385 pred = "-";
9386 }
12a4e8c5 9387 }
12a4e8c5
GK
9388
9389 if (label == NULL)
94a54f47 9390 s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
12a4e8c5 9391 else
94a54f47 9392 s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
12a4e8c5 9393
37c67319
GK
9394 /* We need to escape any '%' characters in the reg_names string.
9395 Assume they'd only be the first character... */
9396 if (reg_names[cc_regno + CR0_REGNO][0] == '%')
9397 *s++ = '%';
94a54f47 9398 s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
12a4e8c5
GK
9399
9400 if (label != NULL)
9401 {
9402 /* If the branch distance was too far, we may have to use an
9403 unconditional branch to go the distance. */
9404 if (need_longbranch)
44518ddd 9405 s += sprintf (s, ",$+8\n\tb %s", label);
12a4e8c5
GK
9406 else
9407 s += sprintf (s, ",%s", label);
9408 }
9409
9410 return string;
9411}
50a0b056
GK
9412
9413/* Emit a conditional move: move TRUE_COND to DEST if OP of the
9414 operands of the last comparison is nonzero/true, FALSE_COND if it
9415 is zero/false. Return 0 if the hardware has no such operation. */
a4f6c312 9416
50a0b056
GK
9417int
9418rs6000_emit_cmove (dest, op, true_cond, false_cond)
9419 rtx dest;
9420 rtx op;
9421 rtx true_cond;
9422 rtx false_cond;
9423{
9424 enum rtx_code code = GET_CODE (op);
9425 rtx op0 = rs6000_compare_op0;
9426 rtx op1 = rs6000_compare_op1;
9427 REAL_VALUE_TYPE c1;
3148ad6d
DJ
9428 enum machine_mode compare_mode = GET_MODE (op0);
9429 enum machine_mode result_mode = GET_MODE (dest);
50a0b056
GK
9430 rtx temp;
9431
3148ad6d 9432 /* These modes should always match. */
a3170dc6
AH
9433 if (GET_MODE (op1) != compare_mode
9434 /* In the isel case however, we can use a compare immediate, so
9435 op1 may be a small constant. */
9436 && (!TARGET_ISEL || !short_cint_operand (op1, VOIDmode)))
3148ad6d 9437 return 0;
178c3eff 9438 if (GET_MODE (true_cond) != result_mode)
3148ad6d 9439 return 0;
178c3eff 9440 if (GET_MODE (false_cond) != result_mode)
3148ad6d
DJ
9441 return 0;
9442
50a0b056
GK
9443 /* First, work out if the hardware can do this at all, or
9444 if it's too slow... */
50a0b056 9445 if (! rs6000_compare_fp_p)
a3170dc6
AH
9446 {
9447 if (TARGET_ISEL)
9448 return rs6000_emit_int_cmove (dest, op, true_cond, false_cond);
9449 return 0;
9450 }
50a0b056
GK
9451
9452 /* Eliminate half of the comparisons by switching operands, this
9453 makes the remaining code simpler. */
9454 if (code == UNLT || code == UNGT || code == UNORDERED || code == NE
bc9ec0e0 9455 || code == LTGT || code == LT || code == UNLE)
50a0b056
GK
9456 {
9457 code = reverse_condition_maybe_unordered (code);
9458 temp = true_cond;
9459 true_cond = false_cond;
9460 false_cond = temp;
9461 }
9462
9463 /* UNEQ and LTGT take four instructions for a comparison with zero,
9464 it'll probably be faster to use a branch here too. */
bc9ec0e0 9465 if (code == UNEQ && HONOR_NANS (compare_mode))
50a0b056
GK
9466 return 0;
9467
9468 if (GET_CODE (op1) == CONST_DOUBLE)
9469 REAL_VALUE_FROM_CONST_DOUBLE (c1, op1);
9470
b6d08ca1 9471 /* We're going to try to implement comparisons by performing
50a0b056
GK
9472 a subtract, then comparing against zero. Unfortunately,
9473 Inf - Inf is NaN which is not zero, and so if we don't
27d30956 9474 know that the operand is finite and the comparison
50a0b056 9475 would treat EQ different to UNORDERED, we can't do it. */
bc9ec0e0 9476 if (HONOR_INFINITIES (compare_mode)
50a0b056 9477 && code != GT && code != UNGE
045572c7 9478 && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
50a0b056
GK
9479 /* Constructs of the form (a OP b ? a : b) are safe. */
9480 && ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
9481 || (! rtx_equal_p (op0, true_cond)
9482 && ! rtx_equal_p (op1, true_cond))))
9483 return 0;
9484 /* At this point we know we can use fsel. */
9485
9486 /* Reduce the comparison to a comparison against zero. */
3148ad6d 9487 temp = gen_reg_rtx (compare_mode);
50a0b056 9488 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 9489 gen_rtx_MINUS (compare_mode, op0, op1)));
50a0b056 9490 op0 = temp;
3148ad6d 9491 op1 = CONST0_RTX (compare_mode);
50a0b056
GK
9492
9493 /* If we don't care about NaNs we can reduce some of the comparisons
9494 down to faster ones. */
bc9ec0e0 9495 if (! HONOR_NANS (compare_mode))
50a0b056
GK
9496 switch (code)
9497 {
9498 case GT:
9499 code = LE;
9500 temp = true_cond;
9501 true_cond = false_cond;
9502 false_cond = temp;
9503 break;
9504 case UNGE:
9505 code = GE;
9506 break;
9507 case UNEQ:
9508 code = EQ;
9509 break;
9510 default:
9511 break;
9512 }
9513
9514 /* Now, reduce everything down to a GE. */
9515 switch (code)
9516 {
9517 case GE:
9518 break;
9519
9520 case LE:
3148ad6d
DJ
9521 temp = gen_reg_rtx (compare_mode);
9522 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
9523 op0 = temp;
9524 break;
9525
9526 case ORDERED:
3148ad6d
DJ
9527 temp = gen_reg_rtx (compare_mode);
9528 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
50a0b056
GK
9529 op0 = temp;
9530 break;
9531
9532 case EQ:
3148ad6d 9533 temp = gen_reg_rtx (compare_mode);
50a0b056 9534 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d
DJ
9535 gen_rtx_NEG (compare_mode,
9536 gen_rtx_ABS (compare_mode, op0))));
50a0b056
GK
9537 op0 = temp;
9538 break;
9539
9540 case UNGE:
bc9ec0e0 9541 /* a UNGE 0 <-> (a GE 0 || -a UNLT 0) */
3148ad6d 9542 temp = gen_reg_rtx (result_mode);
50a0b056 9543 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 9544 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
9545 gen_rtx_GE (VOIDmode,
9546 op0, op1),
9547 true_cond, false_cond)));
bc9ec0e0
GK
9548 false_cond = true_cond;
9549 true_cond = temp;
50a0b056 9550
3148ad6d
DJ
9551 temp = gen_reg_rtx (compare_mode);
9552 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
9553 op0 = temp;
9554 break;
9555
9556 case GT:
bc9ec0e0 9557 /* a GT 0 <-> (a GE 0 && -a UNLT 0) */
3148ad6d 9558 temp = gen_reg_rtx (result_mode);
50a0b056 9559 emit_insn (gen_rtx_SET (VOIDmode, temp,
3148ad6d 9560 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
9561 gen_rtx_GE (VOIDmode,
9562 op0, op1),
9563 true_cond, false_cond)));
bc9ec0e0
GK
9564 true_cond = false_cond;
9565 false_cond = temp;
50a0b056 9566
3148ad6d
DJ
9567 temp = gen_reg_rtx (compare_mode);
9568 emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
50a0b056
GK
9569 op0 = temp;
9570 break;
9571
9572 default:
9573 abort ();
9574 }
9575
9576 emit_insn (gen_rtx_SET (VOIDmode, dest,
3148ad6d 9577 gen_rtx_IF_THEN_ELSE (result_mode,
50a0b056
GK
9578 gen_rtx_GE (VOIDmode,
9579 op0, op1),
9580 true_cond, false_cond)));
9581 return 1;
9582}
9583
a3170dc6
AH
9584/* Same as above, but for ints (isel). */
9585
9586static int
9587rs6000_emit_int_cmove (dest, op, true_cond, false_cond)
9588 rtx dest;
9589 rtx op;
9590 rtx true_cond;
9591 rtx false_cond;
9592{
9593 rtx condition_rtx, cr;
9594
9595 /* All isel implementations thus far are 32-bits. */
9596 if (GET_MODE (rs6000_compare_op0) != SImode)
9597 return 0;
9598
9599 /* We still have to do the compare, because isel doesn't do a
9600 compare, it just looks at the CRx bits set by a previous compare
9601 instruction. */
9602 condition_rtx = rs6000_generate_compare (GET_CODE (op));
9603 cr = XEXP (condition_rtx, 0);
9604
9605 if (GET_MODE (cr) == CCmode)
9606 emit_insn (gen_isel_signed (dest, condition_rtx,
9607 true_cond, false_cond, cr));
9608 else
9609 emit_insn (gen_isel_unsigned (dest, condition_rtx,
9610 true_cond, false_cond, cr));
9611
9612 return 1;
9613}
9614
9615const char *
9616output_isel (operands)
9617 rtx *operands;
9618{
9619 enum rtx_code code;
9620
9621 code = GET_CODE (operands[1]);
9622 if (code == GE || code == GEU || code == LE || code == LEU || code == NE)
9623 {
9624 PUT_CODE (operands[1], reverse_condition (code));
9625 return "isel %0,%3,%2,%j1";
9626 }
9627 else
9628 return "isel %0,%2,%3,%j1";
9629}
9630
50a0b056
GK
9631void
9632rs6000_emit_minmax (dest, code, op0, op1)
9633 rtx dest;
9634 enum rtx_code code;
9635 rtx op0;
9636 rtx op1;
9637{
9638 enum machine_mode mode = GET_MODE (op0);
5dc8d536 9639 enum rtx_code c;
50a0b056 9640 rtx target;
5dc8d536
AH
9641
9642 if (code == SMAX || code == SMIN)
9643 c = GE;
9644 else
9645 c = GEU;
9646
50a0b056 9647 if (code == SMAX || code == UMAX)
5dc8d536 9648 target = emit_conditional_move (dest, c, op0, op1, mode,
50a0b056
GK
9649 op0, op1, mode, 0);
9650 else
5dc8d536 9651 target = emit_conditional_move (dest, c, op0, op1, mode,
50a0b056
GK
9652 op1, op0, mode, 0);
9653 if (target == NULL_RTX)
9654 abort ();
9655 if (target != dest)
9656 emit_move_insn (dest, target);
9657}
46c07df8
HP
9658
9659/* Called by altivec splitter.
9660 Input:
9661 operands[0] : Destination of move
9662 operands[1] : Source of move
9663 noperands : Size of operands vector
9664 Output:
9665 operands[2-5] ([2-3] in 64 bit) : Destination slots
9666 operands[6-9] ([4-5] in 64 bit) : Source slots
9667
9668 Splits the move of operands[1] to operands[0].
9669 This is done, if GPRs are one of the operands. In this case
9670 a sequence of simple move insns has to be issued. The sequence of these
9671 move insns has to be done in correct order to avoid early clobber of the
9672 base register or destructive overlap of registers.
9673*/
9674
9675void
9676rs6000_split_altivec_in_gprs (rtx *operands)
9677{
9678 int nregs, reg, i, j;
9679 enum machine_mode mode;
9680
9681 /* Calculate number to move (2/4 for 32/64 bit mode). */
9682
9683 reg = REG_P (operands[0]) ? REGNO (operands[0]) : REGNO (operands[1]);
9684 mode = GET_MODE (operands[0]);
9685 nregs = HARD_REGNO_NREGS (reg, mode);
9686
9687 if (REG_P (operands[1])
9688 && REG_P (operands[0])
9689 && (REGNO (operands[1]) < REGNO (operands[0])))
9690 {
9691 /* Move register range backwards, if we have destructive overlap. */
9692
9693 j = nregs;
9694 for (i = 0; i < nregs; i++)
9695 {
9696 j--;
9697 operands[i + 2] = operand_subword (operands[0], j, 0, mode);
9698 operands[i + 2 + nregs] =
9699 operand_subword (operands[1], j, 0, mode);
9700 }
9701 }
9702 else
9703 {
9704 j = -1;
9705
9706 if (GET_CODE (operands[1]) == MEM)
9707 {
9708 rtx breg;
9709 /* We have offsettable addresses only. If we use one of the
9710 registers to address memory, we have change that register last. */
9711 breg = GET_CODE (XEXP (operands[1], 0)) == PLUS ?
9712 XEXP (XEXP (operands[1], 0), 0) :
9713 XEXP (operands[1], 0);
9714
9715 if (REGNO (breg) >= REGNO (operands[0])
9716 && REGNO (breg) < REGNO (operands[0]) + nregs)
9717 j = REGNO (breg) - REGNO (operands[0]);
9718 }
9719
9720 for (i = 0; i < nregs; i++)
9721 {
9722 /* Calculate index to next subword. */
9723 j++;
9724 if (j == nregs)
9725 j = 0;
9726
9727 operands[i + 2] = operand_subword (operands[0], j, 0, mode);
9728 operands[i + 2 + nregs] =
9729 operand_subword (operands[1], j, 0, mode);
9730
9731 }
9732 }
9733}
9734
12a4e8c5 9735\f
a4f6c312
SS
9736/* This page contains routines that are used to determine what the
9737 function prologue and epilogue code will do and write them out. */
9878760c 9738
a4f6c312
SS
9739/* Return the first fixed-point register that is required to be
9740 saved. 32 if none. */
9878760c
RK
9741
9742int
9743first_reg_to_save ()
9744{
9745 int first_reg;
9746
9747 /* Find lowest numbered live register. */
9748 for (first_reg = 13; first_reg <= 31; first_reg++)
a38d360d
GK
9749 if (regs_ever_live[first_reg]
9750 && (! call_used_regs[first_reg]
1db02437 9751 || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
14f00213 9752 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
f607bc57 9753 || (DEFAULT_ABI == ABI_DARWIN && flag_pic)))))
9878760c
RK
9754 break;
9755
ee890fe2 9756#if TARGET_MACHO
93638d7a
AM
9757 if (flag_pic
9758 && current_function_uses_pic_offset_table
9759 && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
1db02437 9760 return RS6000_PIC_OFFSET_TABLE_REGNUM;
ee890fe2
SS
9761#endif
9762
9878760c
RK
9763 return first_reg;
9764}
9765
9766/* Similar, for FP regs. */
9767
9768int
9769first_fp_reg_to_save ()
9770{
9771 int first_reg;
9772
9773 /* Find lowest numbered live register. */
9774 for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
9775 if (regs_ever_live[first_reg])
9776 break;
9777
9778 return first_reg;
9779}
00b960c7
AH
9780
9781/* Similar, for AltiVec regs. */
9782
9783static int
9784first_altivec_reg_to_save ()
9785{
9786 int i;
9787
9788 /* Stack frame remains as is unless we are in AltiVec ABI. */
9789 if (! TARGET_ALTIVEC_ABI)
9790 return LAST_ALTIVEC_REGNO + 1;
9791
9792 /* Find lowest numbered live register. */
9793 for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
9794 if (regs_ever_live[i])
9795 break;
9796
9797 return i;
9798}
9799
9800/* Return a 32-bit mask of the AltiVec registers we need to set in
9801 VRSAVE. Bit n of the return value is 1 if Vn is live. The MSB in
9802 the 32-bit word is 0. */
9803
9804static unsigned int
9805compute_vrsave_mask ()
9806{
9807 unsigned int i, mask = 0;
9808
9809 /* First, find out if we use _any_ altivec registers. */
9810 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
9811 if (regs_ever_live[i])
9812 mask |= ALTIVEC_REG_BIT (i);
9813
9814 if (mask == 0)
9815 return mask;
9816
00b960c7
AH
9817 /* Next, remove the argument registers from the set. These must
9818 be in the VRSAVE mask set by the caller, so we don't need to add
9819 them in again. More importantly, the mask we compute here is
9820 used to generate CLOBBERs in the set_vrsave insn, and we do not
9821 wish the argument registers to die. */
9822 for (i = cfun->args_info.vregno; i >= ALTIVEC_ARG_MIN_REG; --i)
9823 mask &= ~ALTIVEC_REG_BIT (i);
9824
9825 /* Similarly, remove the return value from the set. */
9826 {
9827 bool yes = false;
9828 diddle_return_value (is_altivec_return_reg, &yes);
9829 if (yes)
9830 mask &= ~ALTIVEC_REG_BIT (ALTIVEC_ARG_RETURN);
9831 }
9832
9833 return mask;
9834}
9835
9836static void
9837is_altivec_return_reg (reg, xyes)
9838 rtx reg;
9839 void *xyes;
9840{
9841 bool *yes = (bool *) xyes;
9842 if (REGNO (reg) == ALTIVEC_ARG_RETURN)
9843 *yes = true;
9844}
9845
4697a36c
MM
9846\f
9847/* Calculate the stack information for the current function. This is
9848 complicated by having two separate calling sequences, the AIX calling
9849 sequence and the V.4 calling sequence.
9850
592696dd 9851 AIX (and Darwin/Mac OS X) stack frames look like:
a260abc9 9852 32-bit 64-bit
4697a36c 9853 SP----> +---------------------------------------+
a260abc9 9854 | back chain to caller | 0 0
4697a36c 9855 +---------------------------------------+
a260abc9 9856 | saved CR | 4 8 (8-11)
4697a36c 9857 +---------------------------------------+
a260abc9 9858 | saved LR | 8 16
4697a36c 9859 +---------------------------------------+
a260abc9 9860 | reserved for compilers | 12 24
4697a36c 9861 +---------------------------------------+
a260abc9 9862 | reserved for binders | 16 32
4697a36c 9863 +---------------------------------------+
a260abc9 9864 | saved TOC pointer | 20 40
4697a36c 9865 +---------------------------------------+
a260abc9 9866 | Parameter save area (P) | 24 48
4697a36c 9867 +---------------------------------------+
a260abc9 9868 | Alloca space (A) | 24+P etc.
802a0058 9869 +---------------------------------------+
a7df97e6 9870 | Local variable space (L) | 24+P+A
4697a36c 9871 +---------------------------------------+
a7df97e6 9872 | Float/int conversion temporary (X) | 24+P+A+L
4697a36c 9873 +---------------------------------------+
00b960c7
AH
9874 | Save area for AltiVec registers (W) | 24+P+A+L+X
9875 +---------------------------------------+
9876 | AltiVec alignment padding (Y) | 24+P+A+L+X+W
9877 +---------------------------------------+
9878 | Save area for VRSAVE register (Z) | 24+P+A+L+X+W+Y
4697a36c 9879 +---------------------------------------+
00b960c7
AH
9880 | Save area for GP registers (G) | 24+P+A+X+L+X+W+Y+Z
9881 +---------------------------------------+
9882 | Save area for FP registers (F) | 24+P+A+X+L+X+W+Y+Z+G
4697a36c
MM
9883 +---------------------------------------+
9884 old SP->| back chain to caller's caller |
9885 +---------------------------------------+
9886
5376a30c
KR
9887 The required alignment for AIX configurations is two words (i.e., 8
9888 or 16 bytes).
9889
9890
4697a36c
MM
9891 V.4 stack frames look like:
9892
9893 SP----> +---------------------------------------+
9894 | back chain to caller | 0
9895 +---------------------------------------+
5eb387b8 9896 | caller's saved LR | 4
4697a36c
MM
9897 +---------------------------------------+
9898 | Parameter save area (P) | 8
9899 +---------------------------------------+
a7df97e6
MM
9900 | Alloca space (A) | 8+P
9901 +---------------------------------------+
9902 | Varargs save area (V) | 8+P+A
9903 +---------------------------------------+
9904 | Local variable space (L) | 8+P+A+V
9905 +---------------------------------------+
9906 | Float/int conversion temporary (X) | 8+P+A+V+L
4697a36c 9907 +---------------------------------------+
00b960c7
AH
9908 | Save area for AltiVec registers (W) | 8+P+A+V+L+X
9909 +---------------------------------------+
9910 | AltiVec alignment padding (Y) | 8+P+A+V+L+X+W
9911 +---------------------------------------+
9912 | Save area for VRSAVE register (Z) | 8+P+A+V+L+X+W+Y
9913 +---------------------------------------+
a3170dc6
AH
9914 | SPE: area for 64-bit GP registers |
9915 +---------------------------------------+
9916 | SPE alignment padding |
9917 +---------------------------------------+
00b960c7 9918 | saved CR (C) | 8+P+A+V+L+X+W+Y+Z
a7df97e6 9919 +---------------------------------------+
00b960c7 9920 | Save area for GP registers (G) | 8+P+A+V+L+X+W+Y+Z+C
a7df97e6 9921 +---------------------------------------+
00b960c7 9922 | Save area for FP registers (F) | 8+P+A+V+L+X+W+Y+Z+C+G
4697a36c
MM
9923 +---------------------------------------+
9924 old SP->| back chain to caller's caller |
9925 +---------------------------------------+
b6c9286a 9926
5376a30c
KR
9927 The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
9928 given. (But note below and in sysv4.h that we require only 8 and
9929 may round up the size of our stack frame anyways. The historical
9930 reason is early versions of powerpc-linux which didn't properly
9931 align the stack at program startup. A happy side-effect is that
9932 -mno-eabi libraries can be used with -meabi programs.)
9933
50d440bc 9934 The EABI configuration defaults to the V.4 layout. However,
5376a30c
KR
9935 the stack alignment requirements may differ. If -mno-eabi is not
9936 given, the required stack alignment is 8 bytes; if -mno-eabi is
9937 given, the required alignment is 16 bytes. (But see V.4 comment
9938 above.) */
4697a36c 9939
61b2fbe7
MM
9940#ifndef ABI_STACK_BOUNDARY
9941#define ABI_STACK_BOUNDARY STACK_BOUNDARY
9942#endif
9943
4697a36c
MM
9944rs6000_stack_t *
9945rs6000_stack_info ()
9946{
9947 static rs6000_stack_t info, zero_info;
9948 rs6000_stack_t *info_ptr = &info;
9ebbca7d 9949 int reg_size = TARGET_POWERPC64 ? 8 : 4;
83720594 9950 int ehrd_size;
b6c9286a 9951 int total_raw_size;
4697a36c 9952
a4f6c312 9953 /* Zero all fields portably. */
4697a36c
MM
9954 info = zero_info;
9955
c19de7aa
AH
9956 if (TARGET_SPE)
9957 {
9958 /* Cache value so we don't rescan instruction chain over and over. */
9b7b447f
AH
9959 if (cfun->machine->insn_chain_scanned_p == 0)
9960 {
9961 cfun->machine->insn_chain_scanned_p = 1;
9962 info_ptr->spe_64bit_regs_used = (int) spe_func_has_64bit_regs_p ();
9963 }
c19de7aa
AH
9964 }
9965
a4f6c312 9966 /* Select which calling sequence. */
178274da 9967 info_ptr->abi = DEFAULT_ABI;
9878760c 9968
a4f6c312 9969 /* Calculate which registers need to be saved & save area size. */
4697a36c 9970 info_ptr->first_gp_reg_save = first_reg_to_save ();
1db02437 9971 /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
906fb125 9972 even if it currently looks like we won't. */
2bfcf297 9973 if (((TARGET_TOC && TARGET_MINIMAL_TOC)
178274da
AM
9974 || (flag_pic == 1 && DEFAULT_ABI == ABI_V4)
9975 || (flag_pic && DEFAULT_ABI == ABI_DARWIN))
1db02437
FS
9976 && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
9977 info_ptr->gp_size = reg_size * (32 - RS6000_PIC_OFFSET_TABLE_REGNUM);
906fb125
GK
9978 else
9979 info_ptr->gp_size = reg_size * (32 - info_ptr->first_gp_reg_save);
4697a36c 9980
a3170dc6
AH
9981 /* For the SPE, we have an additional upper 32-bits on each GPR.
9982 Ideally we should save the entire 64-bits only when the upper
9983 half is used in SIMD instructions. Since we only record
9984 registers live (not the size they are used in), this proves
9985 difficult because we'd have to traverse the instruction chain at
9986 the right time, taking reload into account. This is a real pain,
c19de7aa
AH
9987 so we opt to save the GPRs in 64-bits always if but one register
9988 gets used in 64-bits. Otherwise, all the registers in the frame
9989 get saved in 32-bits.
a3170dc6 9990
c19de7aa 9991 So... since when we save all GPRs (except the SP) in 64-bits, the
a3170dc6 9992 traditional GP save area will be empty. */
c19de7aa 9993 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
a3170dc6
AH
9994 info_ptr->gp_size = 0;
9995
4697a36c
MM
9996 info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
9997 info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
9998
00b960c7
AH
9999 info_ptr->first_altivec_reg_save = first_altivec_reg_to_save ();
10000 info_ptr->altivec_size = 16 * (LAST_ALTIVEC_REGNO + 1
10001 - info_ptr->first_altivec_reg_save);
10002
592696dd 10003 /* Does this function call anything? */
71f123ca
FS
10004 info_ptr->calls_p = (! current_function_is_leaf
10005 || cfun->machine->ra_needs_full_frame);
b6c9286a 10006
a4f6c312 10007 /* Determine if we need to save the link register. */
71f123ca 10008 if (rs6000_ra_ever_killed ()
ffcfcb5f
AM
10009 || (DEFAULT_ABI == ABI_AIX
10010 && current_function_profile
10011 && !TARGET_PROFILE_KERNEL)
4697a36c
MM
10012#ifdef TARGET_RELOCATABLE
10013 || (TARGET_RELOCATABLE && (get_pool_size () != 0))
10014#endif
10015 || (info_ptr->first_fp_reg_save != 64
10016 && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save))
00b960c7 10017 || info_ptr->first_altivec_reg_save <= LAST_ALTIVEC_REGNO
178274da 10018 || (DEFAULT_ABI == ABI_V4 && current_function_calls_alloca)
a4f6c312
SS
10019 || (DEFAULT_ABI == ABI_DARWIN
10020 && flag_pic
10021 && current_function_uses_pic_offset_table)
4697a36c
MM
10022 || info_ptr->calls_p)
10023 {
10024 info_ptr->lr_save_p = 1;
9ebbca7d 10025 regs_ever_live[LINK_REGISTER_REGNUM] = 1;
4697a36c
MM
10026 }
10027
9ebbca7d
GK
10028 /* Determine if we need to save the condition code registers. */
10029 if (regs_ever_live[CR2_REGNO]
10030 || regs_ever_live[CR3_REGNO]
10031 || regs_ever_live[CR4_REGNO])
4697a36c
MM
10032 {
10033 info_ptr->cr_save_p = 1;
178274da 10034 if (DEFAULT_ABI == ABI_V4)
4697a36c
MM
10035 info_ptr->cr_size = reg_size;
10036 }
10037
83720594
RH
10038 /* If the current function calls __builtin_eh_return, then we need
10039 to allocate stack space for registers that will hold data for
10040 the exception handler. */
10041 if (current_function_calls_eh_return)
10042 {
10043 unsigned int i;
10044 for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
10045 continue;
a3170dc6
AH
10046
10047 /* SPE saves EH registers in 64-bits. */
c19de7aa
AH
10048 ehrd_size = i * (TARGET_SPE_ABI
10049 && info_ptr->spe_64bit_regs_used != 0
10050 ? UNITS_PER_SPE_WORD : UNITS_PER_WORD);
83720594
RH
10051 }
10052 else
10053 ehrd_size = 0;
10054
592696dd 10055 /* Determine various sizes. */
4697a36c
MM
10056 info_ptr->reg_size = reg_size;
10057 info_ptr->fixed_size = RS6000_SAVE_AREA;
10058 info_ptr->varargs_size = RS6000_VARARGS_AREA;
189e03e3 10059 info_ptr->vars_size = RS6000_ALIGN (get_frame_size (), 8);
a4f6c312
SS
10060 info_ptr->parm_size = RS6000_ALIGN (current_function_outgoing_args_size,
10061 8);
00b960c7 10062
c19de7aa 10063 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
a3170dc6
AH
10064 info_ptr->spe_gp_size = 8 * (32 - info_ptr->first_gp_reg_save);
10065 else
10066 info_ptr->spe_gp_size = 0;
10067
08b57fb3 10068 if (TARGET_ALTIVEC_ABI && TARGET_ALTIVEC_VRSAVE)
00b960c7
AH
10069 {
10070 info_ptr->vrsave_mask = compute_vrsave_mask ();
10071 info_ptr->vrsave_size = info_ptr->vrsave_mask ? 4 : 0;
10072 }
10073 else
10074 {
10075 info_ptr->vrsave_mask = 0;
10076 info_ptr->vrsave_size = 0;
10077 }
b6c9286a 10078
592696dd 10079 /* Calculate the offsets. */
178274da 10080 switch (DEFAULT_ABI)
4697a36c 10081 {
b6c9286a 10082 case ABI_NONE:
24d304eb 10083 default:
b6c9286a
MM
10084 abort ();
10085
10086 case ABI_AIX:
ee890fe2 10087 case ABI_DARWIN:
b6c9286a
MM
10088 info_ptr->fp_save_offset = - info_ptr->fp_size;
10089 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
00b960c7
AH
10090
10091 if (TARGET_ALTIVEC_ABI)
10092 {
10093 info_ptr->vrsave_save_offset
10094 = info_ptr->gp_save_offset - info_ptr->vrsave_size;
10095
10096 /* Align stack so vector save area is on a quadword boundary. */
10097 if (info_ptr->altivec_size != 0)
10098 info_ptr->altivec_padding_size
10099 = 16 - (-info_ptr->vrsave_save_offset % 16);
10100 else
10101 info_ptr->altivec_padding_size = 0;
10102
10103 info_ptr->altivec_save_offset
10104 = info_ptr->vrsave_save_offset
10105 - info_ptr->altivec_padding_size
10106 - info_ptr->altivec_size;
10107
10108 /* Adjust for AltiVec case. */
10109 info_ptr->ehrd_offset = info_ptr->altivec_save_offset - ehrd_size;
10110 }
10111 else
10112 info_ptr->ehrd_offset = info_ptr->gp_save_offset - ehrd_size;
a260abc9
DE
10113 info_ptr->cr_save_offset = reg_size; /* first word when 64-bit. */
10114 info_ptr->lr_save_offset = 2*reg_size;
24d304eb
RK
10115 break;
10116
10117 case ABI_V4:
b6c9286a
MM
10118 info_ptr->fp_save_offset = - info_ptr->fp_size;
10119 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
a7df97e6 10120 info_ptr->cr_save_offset = info_ptr->gp_save_offset - info_ptr->cr_size;
00b960c7 10121
c19de7aa 10122 if (TARGET_SPE_ABI && info_ptr->spe_64bit_regs_used != 0)
a3170dc6
AH
10123 {
10124 /* Align stack so SPE GPR save area is aligned on a
10125 double-word boundary. */
10126 if (info_ptr->spe_gp_size != 0)
10127 info_ptr->spe_padding_size
10128 = 8 - (-info_ptr->cr_save_offset % 8);
10129 else
10130 info_ptr->spe_padding_size = 0;
10131
10132 info_ptr->spe_gp_save_offset
10133 = info_ptr->cr_save_offset
10134 - info_ptr->spe_padding_size
10135 - info_ptr->spe_gp_size;
10136
10137 /* Adjust for SPE case. */
10138 info_ptr->toc_save_offset
10139 = info_ptr->spe_gp_save_offset - info_ptr->toc_size;
10140 }
10141 else if (TARGET_ALTIVEC_ABI)
00b960c7
AH
10142 {
10143 info_ptr->vrsave_save_offset
10144 = info_ptr->cr_save_offset - info_ptr->vrsave_size;
10145
10146 /* Align stack so vector save area is on a quadword boundary. */
10147 if (info_ptr->altivec_size != 0)
10148 info_ptr->altivec_padding_size
10149 = 16 - (-info_ptr->vrsave_save_offset % 16);
10150 else
10151 info_ptr->altivec_padding_size = 0;
10152
10153 info_ptr->altivec_save_offset
10154 = info_ptr->vrsave_save_offset
10155 - info_ptr->altivec_padding_size
10156 - info_ptr->altivec_size;
10157
10158 /* Adjust for AltiVec case. */
10159 info_ptr->toc_save_offset
10160 = info_ptr->altivec_save_offset - info_ptr->toc_size;
10161 }
10162 else
10163 info_ptr->toc_save_offset = info_ptr->cr_save_offset - info_ptr->toc_size;
83720594 10164 info_ptr->ehrd_offset = info_ptr->toc_save_offset - ehrd_size;
b6c9286a
MM
10165 info_ptr->lr_save_offset = reg_size;
10166 break;
4697a36c
MM
10167 }
10168
00b960c7
AH
10169 info_ptr->save_size = RS6000_ALIGN (info_ptr->fp_size
10170 + info_ptr->gp_size
10171 + info_ptr->altivec_size
10172 + info_ptr->altivec_padding_size
a3170dc6
AH
10173 + info_ptr->spe_gp_size
10174 + info_ptr->spe_padding_size
00b960c7
AH
10175 + ehrd_size
10176 + info_ptr->cr_size
10177 + info_ptr->lr_size
10178 + info_ptr->vrsave_size
10179 + info_ptr->toc_size,
10180 (TARGET_ALTIVEC_ABI || ABI_DARWIN)
10181 ? 16 : 8);
10182
ff381587
MM
10183 total_raw_size = (info_ptr->vars_size
10184 + info_ptr->parm_size
ff381587
MM
10185 + info_ptr->save_size
10186 + info_ptr->varargs_size
10187 + info_ptr->fixed_size);
10188
a4f6c312
SS
10189 info_ptr->total_size =
10190 RS6000_ALIGN (total_raw_size, ABI_STACK_BOUNDARY / BITS_PER_UNIT);
ff381587
MM
10191
10192 /* Determine if we need to allocate any stack frame:
10193
a4f6c312
SS
10194 For AIX we need to push the stack if a frame pointer is needed
10195 (because the stack might be dynamically adjusted), if we are
10196 debugging, if we make calls, or if the sum of fp_save, gp_save,
10197 and local variables are more than the space needed to save all
10198 non-volatile registers: 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8
10199 + 18*8 = 288 (GPR13 reserved).
ff381587 10200
a4f6c312
SS
10201 For V.4 we don't have the stack cushion that AIX uses, but assume
10202 that the debugger can handle stackless frames. */
ff381587
MM
10203
10204 if (info_ptr->calls_p)
10205 info_ptr->push_p = 1;
10206
178274da 10207 else if (DEFAULT_ABI == ABI_V4)
e72247f4 10208 info_ptr->push_p = total_raw_size > info_ptr->fixed_size;
ff381587 10209
178274da
AM
10210 else if (frame_pointer_needed)
10211 info_ptr->push_p = 1;
10212
10213 else if (TARGET_XCOFF && write_symbols != NO_DEBUG)
10214 info_ptr->push_p = 1;
10215
ff381587 10216 else
178274da
AM
10217 info_ptr->push_p
10218 = total_raw_size - info_ptr->fixed_size > (TARGET_32BIT ? 220 : 288);
ff381587 10219
a4f6c312 10220 /* Zero offsets if we're not saving those registers. */
8dda1a21 10221 if (info_ptr->fp_size == 0)
4697a36c
MM
10222 info_ptr->fp_save_offset = 0;
10223
8dda1a21 10224 if (info_ptr->gp_size == 0)
4697a36c
MM
10225 info_ptr->gp_save_offset = 0;
10226
00b960c7
AH
10227 if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0)
10228 info_ptr->altivec_save_offset = 0;
10229
10230 if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0)
10231 info_ptr->vrsave_save_offset = 0;
10232
c19de7aa
AH
10233 if (! TARGET_SPE_ABI
10234 || info_ptr->spe_64bit_regs_used == 0
10235 || info_ptr->spe_gp_size == 0)
a3170dc6
AH
10236 info_ptr->spe_gp_save_offset = 0;
10237
c81fc13e 10238 if (! info_ptr->lr_save_p)
4697a36c
MM
10239 info_ptr->lr_save_offset = 0;
10240
c81fc13e 10241 if (! info_ptr->cr_save_p)
4697a36c
MM
10242 info_ptr->cr_save_offset = 0;
10243
c81fc13e 10244 if (! info_ptr->toc_save_p)
b6c9286a
MM
10245 info_ptr->toc_save_offset = 0;
10246
4697a36c
MM
10247 return info_ptr;
10248}
10249
c19de7aa
AH
10250/* Return true if the current function uses any GPRs in 64-bit SIMD
10251 mode. */
10252
10253static bool
10254spe_func_has_64bit_regs_p ()
10255{
10256 rtx insns, insn;
10257
10258 /* Functions that save and restore all the call-saved registers will
10259 need to save/restore the registers in 64-bits. */
10260 if (current_function_calls_eh_return
10261 || current_function_calls_setjmp
10262 || current_function_has_nonlocal_goto)
10263 return true;
10264
10265 insns = get_insns ();
10266
10267 for (insn = NEXT_INSN (insns); insn != NULL_RTX; insn = NEXT_INSN (insn))
10268 {
10269 if (INSN_P (insn))
10270 {
10271 rtx i;
10272
10273 i = PATTERN (insn);
10274 if (GET_CODE (i) == SET
10275 && SPE_VECTOR_MODE (GET_MODE (SET_SRC (i))))
10276 return true;
10277 }
10278 }
10279
10280 return false;
10281}
10282
4697a36c
MM
10283void
10284debug_stack_info (info)
10285 rs6000_stack_t *info;
9878760c 10286{
d330fd93 10287 const char *abi_string;
24d304eb 10288
c81fc13e 10289 if (! info)
4697a36c
MM
10290 info = rs6000_stack_info ();
10291
10292 fprintf (stderr, "\nStack information for function %s:\n",
10293 ((current_function_decl && DECL_NAME (current_function_decl))
10294 ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
10295 : "<unknown>"));
10296
24d304eb
RK
10297 switch (info->abi)
10298 {
b6c9286a
MM
10299 default: abi_string = "Unknown"; break;
10300 case ABI_NONE: abi_string = "NONE"; break;
50d440bc 10301 case ABI_AIX: abi_string = "AIX"; break;
ee890fe2 10302 case ABI_DARWIN: abi_string = "Darwin"; break;
b6c9286a 10303 case ABI_V4: abi_string = "V.4"; break;
24d304eb
RK
10304 }
10305
10306 fprintf (stderr, "\tABI = %5s\n", abi_string);
10307
00b960c7
AH
10308 if (TARGET_ALTIVEC_ABI)
10309 fprintf (stderr, "\tALTIVEC ABI extensions enabled.\n");
10310
a3170dc6
AH
10311 if (TARGET_SPE_ABI)
10312 fprintf (stderr, "\tSPE ABI extensions enabled.\n");
10313
4697a36c
MM
10314 if (info->first_gp_reg_save != 32)
10315 fprintf (stderr, "\tfirst_gp_reg_save = %5d\n", info->first_gp_reg_save);
10316
10317 if (info->first_fp_reg_save != 64)
10318 fprintf (stderr, "\tfirst_fp_reg_save = %5d\n", info->first_fp_reg_save);
9878760c 10319
00b960c7
AH
10320 if (info->first_altivec_reg_save <= LAST_ALTIVEC_REGNO)
10321 fprintf (stderr, "\tfirst_altivec_reg_save = %5d\n",
10322 info->first_altivec_reg_save);
10323
4697a36c
MM
10324 if (info->lr_save_p)
10325 fprintf (stderr, "\tlr_save_p = %5d\n", info->lr_save_p);
9878760c 10326
4697a36c
MM
10327 if (info->cr_save_p)
10328 fprintf (stderr, "\tcr_save_p = %5d\n", info->cr_save_p);
10329
b6c9286a
MM
10330 if (info->toc_save_p)
10331 fprintf (stderr, "\ttoc_save_p = %5d\n", info->toc_save_p);
10332
00b960c7
AH
10333 if (info->vrsave_mask)
10334 fprintf (stderr, "\tvrsave_mask = 0x%x\n", info->vrsave_mask);
10335
4697a36c
MM
10336 if (info->push_p)
10337 fprintf (stderr, "\tpush_p = %5d\n", info->push_p);
10338
10339 if (info->calls_p)
10340 fprintf (stderr, "\tcalls_p = %5d\n", info->calls_p);
10341
4697a36c
MM
10342 if (info->gp_save_offset)
10343 fprintf (stderr, "\tgp_save_offset = %5d\n", info->gp_save_offset);
10344
10345 if (info->fp_save_offset)
10346 fprintf (stderr, "\tfp_save_offset = %5d\n", info->fp_save_offset);
10347
00b960c7
AH
10348 if (info->altivec_save_offset)
10349 fprintf (stderr, "\taltivec_save_offset = %5d\n",
10350 info->altivec_save_offset);
10351
a3170dc6
AH
10352 if (info->spe_gp_save_offset)
10353 fprintf (stderr, "\tspe_gp_save_offset = %5d\n",
10354 info->spe_gp_save_offset);
10355
00b960c7
AH
10356 if (info->vrsave_save_offset)
10357 fprintf (stderr, "\tvrsave_save_offset = %5d\n",
10358 info->vrsave_save_offset);
10359
4697a36c
MM
10360 if (info->lr_save_offset)
10361 fprintf (stderr, "\tlr_save_offset = %5d\n", info->lr_save_offset);
10362
10363 if (info->cr_save_offset)
10364 fprintf (stderr, "\tcr_save_offset = %5d\n", info->cr_save_offset);
10365
b6c9286a
MM
10366 if (info->toc_save_offset)
10367 fprintf (stderr, "\ttoc_save_offset = %5d\n", info->toc_save_offset);
10368
4697a36c
MM
10369 if (info->varargs_save_offset)
10370 fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
10371
10372 if (info->total_size)
10373 fprintf (stderr, "\ttotal_size = %5d\n", info->total_size);
10374
10375 if (info->varargs_size)
10376 fprintf (stderr, "\tvarargs_size = %5d\n", info->varargs_size);
10377
10378 if (info->vars_size)
10379 fprintf (stderr, "\tvars_size = %5d\n", info->vars_size);
10380
10381 if (info->parm_size)
10382 fprintf (stderr, "\tparm_size = %5d\n", info->parm_size);
10383
10384 if (info->fixed_size)
10385 fprintf (stderr, "\tfixed_size = %5d\n", info->fixed_size);
10386
10387 if (info->gp_size)
10388 fprintf (stderr, "\tgp_size = %5d\n", info->gp_size);
10389
a3170dc6
AH
10390 if (info->spe_gp_size)
10391 fprintf (stderr, "\tspe_gp_size = %5d\n", info->spe_gp_size);
10392
4697a36c
MM
10393 if (info->fp_size)
10394 fprintf (stderr, "\tfp_size = %5d\n", info->fp_size);
10395
00b960c7
AH
10396 if (info->altivec_size)
10397 fprintf (stderr, "\taltivec_size = %5d\n", info->altivec_size);
10398
10399 if (info->vrsave_size)
10400 fprintf (stderr, "\tvrsave_size = %5d\n", info->vrsave_size);
10401
10402 if (info->altivec_padding_size)
10403 fprintf (stderr, "\taltivec_padding_size= %5d\n",
10404 info->altivec_padding_size);
10405
a3170dc6
AH
10406 if (info->spe_padding_size)
10407 fprintf (stderr, "\tspe_padding_size = %5d\n",
10408 info->spe_padding_size);
10409
a4f6c312 10410 if (info->lr_size)
ed947a96 10411 fprintf (stderr, "\tlr_size = %5d\n", info->lr_size);
b6c9286a 10412
4697a36c
MM
10413 if (info->cr_size)
10414 fprintf (stderr, "\tcr_size = %5d\n", info->cr_size);
10415
a4f6c312 10416 if (info->toc_size)
b6c9286a
MM
10417 fprintf (stderr, "\ttoc_size = %5d\n", info->toc_size);
10418
4697a36c
MM
10419 if (info->save_size)
10420 fprintf (stderr, "\tsave_size = %5d\n", info->save_size);
10421
10422 if (info->reg_size != 4)
10423 fprintf (stderr, "\treg_size = %5d\n", info->reg_size);
10424
10425 fprintf (stderr, "\n");
9878760c 10426}
71f123ca
FS
10427
10428rtx
10429rs6000_return_addr (count, frame)
10430 int count;
10431 rtx frame;
10432{
a4f6c312
SS
10433 /* Currently we don't optimize very well between prolog and body
10434 code and for PIC code the code can be actually quite bad, so
10435 don't try to be too clever here. */
f1384257 10436 if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
71f123ca
FS
10437 {
10438 cfun->machine->ra_needs_full_frame = 1;
8ac61af7
RK
10439
10440 return
10441 gen_rtx_MEM
10442 (Pmode,
10443 memory_address
10444 (Pmode,
10445 plus_constant (copy_to_reg
10446 (gen_rtx_MEM (Pmode,
10447 memory_address (Pmode, frame))),
10448 RETURN_ADDRESS_OFFSET)));
71f123ca
FS
10449 }
10450
9e2f7ec7 10451 return get_hard_reg_initial_val (Pmode, LINK_REGISTER_REGNUM);
71f123ca
FS
10452}
10453
5e1bf043
DJ
10454/* Say whether a function is a candidate for sibcall handling or not.
10455 We do not allow indirect calls to be optimized into sibling calls.
10456 Also, we can't do it if there are any vector parameters; there's
10457 nowhere to put the VRsave code so it works; note that functions with
10458 vector parameters are required to have a prototype, so the argument
10459 type info must be available here. (The tail recursion case can work
10460 with vector parameters, but there's no way to distinguish here.) */
4977bab6
ZW
10461static bool
10462rs6000_function_ok_for_sibcall (decl, exp)
10463 tree decl;
10464 tree exp ATTRIBUTE_UNUSED;
5e1bf043
DJ
10465{
10466 tree type;
4977bab6 10467 if (decl)
5e1bf043
DJ
10468 {
10469 if (TARGET_ALTIVEC_VRSAVE)
10470 {
4977bab6 10471 for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
5e1bf043
DJ
10472 type; type = TREE_CHAIN (type))
10473 {
c15b529f 10474 if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
4977bab6 10475 return false;
5e1bf043
DJ
10476 }
10477 }
10478 if (DEFAULT_ABI == ABI_DARWIN
4977bab6 10479 || (*targetm.binds_local_p) (decl))
2bcc50d0 10480 {
4977bab6 10481 tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
2bcc50d0
AM
10482
10483 if (!lookup_attribute ("longcall", attr_list)
10484 || lookup_attribute ("shortcall", attr_list))
4977bab6 10485 return true;
2bcc50d0 10486 }
5e1bf043 10487 }
4977bab6 10488 return false;
5e1bf043
DJ
10489}
10490
71f123ca
FS
10491static int
10492rs6000_ra_ever_killed ()
10493{
10494 rtx top;
5e1bf043
DJ
10495 rtx reg;
10496 rtx insn;
71f123ca 10497
3961e8fe
RH
10498 /* Irritatingly, there are two kinds of thunks -- those created with
10499 TARGET_ASM_OUTPUT_MI_THUNK and those with DECL_THUNK_P that go
10500 through the regular part of the compiler. This is a very hacky
10501 way to tell them apart. */
10502 if (current_function_is_thunk && !no_new_pseudos)
71f123ca 10503 return 0;
eb0424da 10504
36f7e964
AH
10505 /* regs_ever_live has LR marked as used if any sibcalls are present,
10506 but this should not force saving and restoring in the
10507 pro/epilogue. Likewise, reg_set_between_p thinks a sibcall
10508 clobbers LR, so that is inappropriate. */
10509
5e1bf043
DJ
10510 /* Also, the prologue can generate a store into LR that
10511 doesn't really count, like this:
36f7e964 10512
5e1bf043
DJ
10513 move LR->R0
10514 bcl to set PIC register
10515 move LR->R31
10516 move R0->LR
36f7e964
AH
10517
10518 When we're called from the epilogue, we need to avoid counting
10519 this as a store. */
5e1bf043 10520
71f123ca
FS
10521 push_topmost_sequence ();
10522 top = get_insns ();
10523 pop_topmost_sequence ();
5e1bf043 10524 reg = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
71f123ca 10525
5e1bf043
DJ
10526 for (insn = NEXT_INSN (top); insn != NULL_RTX; insn = NEXT_INSN (insn))
10527 {
10528 if (INSN_P (insn))
10529 {
10530 if (FIND_REG_INC_NOTE (insn, reg))
10531 return 1;
10532 else if (GET_CODE (insn) == CALL_INSN
c15b529f 10533 && !SIBLING_CALL_P (insn))
5e1bf043 10534 return 1;
36f7e964
AH
10535 else if (set_of (reg, insn) != NULL_RTX
10536 && !prologue_epilogue_contains (insn))
5e1bf043
DJ
10537 return 1;
10538 }
10539 }
10540 return 0;
71f123ca 10541}
4697a36c 10542\f
8cd8f856
GK
10543/* Add a REG_MAYBE_DEAD note to the insn. */
10544static void
10545rs6000_maybe_dead (insn)
10546 rtx insn;
10547{
10548 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD,
10549 const0_rtx,
10550 REG_NOTES (insn));
10551}
10552
9ebbca7d 10553/* Emit instructions needed to load the TOC register.
c7ca610e 10554 This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
9ebbca7d 10555 a constant pool; or for SVR4 -fpic. */
c7ca610e
RK
10556
10557void
9ebbca7d
GK
10558rs6000_emit_load_toc_table (fromprolog)
10559 int fromprolog;
c7ca610e 10560{
027fbf43 10561 rtx dest, insn;
1db02437 10562 dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
c7ca610e 10563
20b71b17
AM
10564 if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
10565 {
10566 rtx temp = (fromprolog
10567 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
10568 : gen_reg_rtx (Pmode));
027fbf43
JJ
10569 insn = emit_insn (gen_load_toc_v4_pic_si (temp));
10570 if (fromprolog)
10571 rs6000_maybe_dead (insn);
10572 insn = emit_move_insn (dest, temp);
10573 if (fromprolog)
10574 rs6000_maybe_dead (insn);
20b71b17
AM
10575 }
10576 else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
10577 {
10578 char buf[30];
10579 rtx tempLR = (fromprolog
10580 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
10581 : gen_reg_rtx (Pmode));
10582 rtx temp0 = (fromprolog
10583 ? gen_rtx_REG (Pmode, 0)
10584 : gen_reg_rtx (Pmode));
10585 rtx symF;
10586
10587 /* possibly create the toc section */
10588 if (! toc_initialized)
38c1f2d7 10589 {
20b71b17
AM
10590 toc_section ();
10591 function_section (current_function_decl);
38c1f2d7 10592 }
9ebbca7d 10593
20b71b17
AM
10594 if (fromprolog)
10595 {
10596 rtx symL;
38c1f2d7 10597
20b71b17
AM
10598 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
10599 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9ebbca7d 10600
20b71b17
AM
10601 ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
10602 symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
10603
10604 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1 (tempLR,
10605 symF)));
10606 rs6000_maybe_dead (emit_move_insn (dest, tempLR));
10607 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest,
10608 symL,
10609 symF)));
9ebbca7d
GK
10610 }
10611 else
20b71b17
AM
10612 {
10613 rtx tocsym;
10614 static int reload_toc_labelno = 0;
10615
10616 tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
10617
10618 ASM_GENERATE_INTERNAL_LABEL (buf, "LCG", reload_toc_labelno++);
10619 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
10620
027fbf43
JJ
10621 emit_insn (gen_load_toc_v4_PIC_1b (tempLR, symF, tocsym));
10622 emit_move_insn (dest, tempLR);
10623 emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
20b71b17 10624 }
027fbf43
JJ
10625 insn = emit_insn (gen_addsi3 (dest, temp0, dest));
10626 if (fromprolog)
10627 rs6000_maybe_dead (insn);
9ebbca7d 10628 }
20b71b17
AM
10629 else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
10630 {
10631 /* This is for AIX code running in non-PIC ELF32. */
10632 char buf[30];
10633 rtx realsym;
10634 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
10635 realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
10636
027fbf43
JJ
10637 insn = emit_insn (gen_elf_high (dest, realsym));
10638 if (fromprolog)
10639 rs6000_maybe_dead (insn);
10640 insn = emit_insn (gen_elf_low (dest, dest, realsym));
10641 if (fromprolog)
10642 rs6000_maybe_dead (insn);
20b71b17
AM
10643 }
10644 else if (DEFAULT_ABI == ABI_AIX)
9ebbca7d
GK
10645 {
10646 if (TARGET_32BIT)
027fbf43 10647 insn = emit_insn (gen_load_toc_aix_si (dest));
9ebbca7d 10648 else
027fbf43
JJ
10649 insn = emit_insn (gen_load_toc_aix_di (dest));
10650 if (fromprolog)
10651 rs6000_maybe_dead (insn);
9ebbca7d 10652 }
20b71b17
AM
10653 else
10654 abort ();
9ebbca7d
GK
10655}
10656
10657int
10658get_TOC_alias_set ()
10659{
10660 static int set = -1;
10661 if (set == -1)
10662 set = new_alias_set ();
10663 return set;
10664}
10665
c1207243 10666/* This returns nonzero if the current function uses the TOC. This is
c4501e62
JJ
10667 determined by the presence of (unspec ... UNSPEC_TOC) or
10668 use (unspec ... UNSPEC_TOC), which are generated by the various
10669 load_toc_* patterns. */
a4f6c312 10670
9ebbca7d
GK
10671int
10672uses_TOC ()
10673{
c4501e62 10674 rtx insn;
38c1f2d7 10675
c4501e62
JJ
10676 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
10677 if (INSN_P (insn))
10678 {
10679 rtx pat = PATTERN (insn);
10680 int i;
9ebbca7d 10681
c4501e62
JJ
10682 if (GET_CODE (pat) == PARALLEL)
10683 for (i = 0; i < XVECLEN (pat, 0); i++)
10684 {
10685 rtx sub = XVECEXP (pat, 0, i);
10686 if (GET_CODE (sub) == USE)
10687 {
10688 sub = XEXP (sub, 0);
10689 if (GET_CODE (sub) == UNSPEC
10690 && XINT (sub, 1) == UNSPEC_TOC)
10691 return 1;
10692 }
10693 }
10694 }
10695 return 0;
9ebbca7d 10696}
38c1f2d7 10697
9ebbca7d 10698rtx
a4f6c312 10699create_TOC_reference (symbol)
9ebbca7d
GK
10700 rtx symbol;
10701{
a8a05998
ZW
10702 return gen_rtx_PLUS (Pmode,
10703 gen_rtx_REG (Pmode, TOC_REGISTER),
10704 gen_rtx_CONST (Pmode,
10705 gen_rtx_MINUS (Pmode, symbol,
b999aaeb 10706 gen_rtx_SYMBOL_REF (Pmode, toc_label_name))));
9ebbca7d 10707}
38c1f2d7 10708
9ebbca7d
GK
10709/* __throw will restore its own return address to be the same as the
10710 return address of the function that the throw is being made to.
10711 This is unfortunate, because we want to check the original
10712 return address to see if we need to restore the TOC.
10713 So we have to squirrel it away here.
10714 This is used only in compiling __throw and __rethrow.
c7ca610e 10715
9ebbca7d
GK
10716 Most of this code should be removed by CSE. */
10717static rtx insn_after_throw;
c7ca610e 10718
a4f6c312 10719/* This does the saving... */
9ebbca7d
GK
10720void
10721rs6000_aix_emit_builtin_unwind_init ()
10722{
10723 rtx mem;
10724 rtx stack_top = gen_reg_rtx (Pmode);
10725 rtx opcode_addr = gen_reg_rtx (Pmode);
10726
10727 insn_after_throw = gen_reg_rtx (SImode);
10728
10729 mem = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
10730 emit_move_insn (stack_top, mem);
10731
10732 mem = gen_rtx_MEM (Pmode,
10733 gen_rtx_PLUS (Pmode, stack_top,
10734 GEN_INT (2 * GET_MODE_SIZE (Pmode))));
10735 emit_move_insn (opcode_addr, mem);
10736 emit_move_insn (insn_after_throw, gen_rtx_MEM (SImode, opcode_addr));
c7ca610e
RK
10737}
10738
a4f6c312
SS
10739/* Emit insns to _restore_ the TOC register, at runtime (specifically
10740 in _eh.o). Only used on AIX.
9ebbca7d
GK
10741
10742 The idea is that on AIX, function calls look like this:
10743 bl somefunction-trampoline
10744 lwz r2,20(sp)
10745
a4f6c312 10746 and later,
9ebbca7d
GK
10747 somefunction-trampoline:
10748 stw r2,20(sp)
10749 ... load function address in the count register ...
10750 bctr
10751 or like this, if the linker determines that this is not a cross-module call
10752 and so the TOC need not be restored:
10753 bl somefunction
10754 nop
10755 or like this, if the compiler could determine that this is not a
10756 cross-module call:
10757 bl somefunction
10758 now, the tricky bit here is that register 2 is saved and restored
10759 by the _linker_, so we can't readily generate debugging information
10760 for it. So we need to go back up the call chain looking at the
10761 insns at return addresses to see which calls saved the TOC register
10762 and so see where it gets restored from.
10763
10764 Oh, and all this gets done in RTL inside the eh_epilogue pattern,
10765 just before the actual epilogue.
10766
10767 On the bright side, this incurs no space or time overhead unless an
10768 exception is thrown, except for the extra code in libgcc.a.
10769
10770 The parameter STACKSIZE is a register containing (at runtime)
10771 the amount to be popped off the stack in addition to the stack frame
10772 of this routine (which will be __throw or __rethrow, and so is
10773 guaranteed to have a stack frame). */
a4f6c312 10774
9ebbca7d
GK
10775void
10776rs6000_emit_eh_toc_restore (stacksize)
10777 rtx stacksize;
10778{
10779 rtx top_of_stack;
10780 rtx bottom_of_stack = gen_reg_rtx (Pmode);
10781 rtx tocompare = gen_reg_rtx (SImode);
10782 rtx opcode = gen_reg_rtx (SImode);
10783 rtx opcode_addr = gen_reg_rtx (Pmode);
10784 rtx mem;
10785 rtx loop_start = gen_label_rtx ();
10786 rtx no_toc_restore_needed = gen_label_rtx ();
10787 rtx loop_exit = gen_label_rtx ();
10788
10789 mem = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
ba4828e0 10790 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10791 emit_move_insn (bottom_of_stack, mem);
10792
10793 top_of_stack = expand_binop (Pmode, add_optab,
10794 bottom_of_stack, stacksize,
10795 NULL_RTX, 1, OPTAB_WIDEN);
10796
2496c7bd
LB
10797 emit_move_insn (tocompare, gen_int_mode (TARGET_32BIT ? 0x80410014
10798 : 0xE8410028, SImode));
9ebbca7d
GK
10799
10800 if (insn_after_throw == NULL_RTX)
a4f6c312 10801 abort ();
9ebbca7d
GK
10802 emit_move_insn (opcode, insn_after_throw);
10803
2e040219 10804 emit_note (NOTE_INSN_LOOP_BEG);
9ebbca7d
GK
10805 emit_label (loop_start);
10806
10807 do_compare_rtx_and_jump (opcode, tocompare, NE, 1,
06f4e019 10808 SImode, NULL_RTX, NULL_RTX,
9ebbca7d
GK
10809 no_toc_restore_needed);
10810
10811 mem = gen_rtx_MEM (Pmode,
10812 gen_rtx_PLUS (Pmode, bottom_of_stack,
10813 GEN_INT (5 * GET_MODE_SIZE (Pmode))));
10814 emit_move_insn (gen_rtx_REG (Pmode, 2), mem);
10815
10816 emit_label (no_toc_restore_needed);
10817 do_compare_rtx_and_jump (top_of_stack, bottom_of_stack, EQ, 1,
06f4e019 10818 Pmode, NULL_RTX, NULL_RTX,
9ebbca7d
GK
10819 loop_exit);
10820
10821 mem = gen_rtx_MEM (Pmode, bottom_of_stack);
ba4828e0 10822 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10823 emit_move_insn (bottom_of_stack, mem);
10824
10825 mem = gen_rtx_MEM (Pmode,
10826 gen_rtx_PLUS (Pmode, bottom_of_stack,
10827 GEN_INT (2 * GET_MODE_SIZE (Pmode))));
10828 emit_move_insn (opcode_addr, mem);
10829 emit_move_insn (opcode, gen_rtx_MEM (SImode, opcode_addr));
10830
2e040219 10831 emit_note (NOTE_INSN_LOOP_CONT);
9ebbca7d 10832 emit_jump (loop_start);
2e040219 10833 emit_note (NOTE_INSN_LOOP_END);
9ebbca7d
GK
10834 emit_label (loop_exit);
10835}
38c1f2d7 10836\f
ba4828e0
RK
10837/* This ties together stack memory (MEM with an alias set of
10838 rs6000_sr_alias_set) and the change to the stack pointer. */
10839
9ebbca7d
GK
10840static void
10841rs6000_emit_stack_tie ()
10842{
ba4828e0
RK
10843 rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
10844
10845 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
10846 emit_insn (gen_stack_tie (mem));
10847}
38c1f2d7 10848
9ebbca7d
GK
10849/* Emit the correct code for allocating stack space, as insns.
10850 If COPY_R12, make sure a copy of the old frame is left in r12.
10851 The generated code may use hard register 0 as a temporary. */
10852
10853static void
10854rs6000_emit_allocate_stack (size, copy_r12)
10855 HOST_WIDE_INT size;
38c1f2d7
MM
10856 int copy_r12;
10857{
9ebbca7d
GK
10858 rtx insn;
10859 rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
10860 rtx tmp_reg = gen_rtx_REG (Pmode, 0);
10861 rtx todec = GEN_INT (-size);
a157febd
GK
10862
10863 if (current_function_limit_stack)
10864 {
10865 if (REG_P (stack_limit_rtx)
10866 && REGNO (stack_limit_rtx) > 1
10867 && REGNO (stack_limit_rtx) <= 31)
10868 {
5b71a4e7 10869 emit_insn (TARGET_32BIT
9ebbca7d
GK
10870 ? gen_addsi3 (tmp_reg,
10871 stack_limit_rtx,
10872 GEN_INT (size))
10873 : gen_adddi3 (tmp_reg,
10874 stack_limit_rtx,
10875 GEN_INT (size)));
5b71a4e7 10876
9ebbca7d
GK
10877 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
10878 const0_rtx));
a157febd
GK
10879 }
10880 else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
9ebbca7d 10881 && TARGET_32BIT
f607bc57 10882 && DEFAULT_ABI == ABI_V4)
a157febd 10883 {
9ebbca7d
GK
10884 rtx toload = gen_rtx_CONST (VOIDmode,
10885 gen_rtx_PLUS (Pmode,
10886 stack_limit_rtx,
10887 GEN_INT (size)));
5b71a4e7 10888
9ebbca7d
GK
10889 emit_insn (gen_elf_high (tmp_reg, toload));
10890 emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
10891 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
10892 const0_rtx));
a157febd
GK
10893 }
10894 else
10895 warning ("stack limit expression is not supported");
10896 }
10897
9ebbca7d
GK
10898 if (copy_r12 || ! TARGET_UPDATE)
10899 emit_move_insn (gen_rtx_REG (Pmode, 12), stack_reg);
10900
38c1f2d7
MM
10901 if (TARGET_UPDATE)
10902 {
9ebbca7d 10903 if (size > 32767)
38c1f2d7 10904 {
9ebbca7d
GK
10905 /* Need a note here so that try_split doesn't get confused. */
10906 if (get_last_insn() == NULL_RTX)
2e040219 10907 emit_note (NOTE_INSN_DELETED);
9ebbca7d
GK
10908 insn = emit_move_insn (tmp_reg, todec);
10909 try_split (PATTERN (insn), insn, 0);
10910 todec = tmp_reg;
38c1f2d7 10911 }
5b71a4e7
DE
10912
10913 insn = emit_insn (TARGET_32BIT
10914 ? gen_movsi_update (stack_reg, stack_reg,
10915 todec, stack_reg)
10916 : gen_movdi_update (stack_reg, stack_reg,
9ebbca7d 10917 todec, stack_reg));
38c1f2d7
MM
10918 }
10919 else
10920 {
5b71a4e7
DE
10921 insn = emit_insn (TARGET_32BIT
10922 ? gen_addsi3 (stack_reg, stack_reg, todec)
10923 : gen_adddi3 (stack_reg, stack_reg, todec));
9ebbca7d
GK
10924 emit_move_insn (gen_rtx_MEM (Pmode, stack_reg),
10925 gen_rtx_REG (Pmode, 12));
10926 }
5b71a4e7 10927
9ebbca7d
GK
10928 RTX_FRAME_RELATED_P (insn) = 1;
10929 REG_NOTES (insn) =
10930 gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
10931 gen_rtx_SET (VOIDmode, stack_reg,
10932 gen_rtx_PLUS (Pmode, stack_reg,
10933 GEN_INT (-size))),
10934 REG_NOTES (insn));
10935}
10936
a4f6c312
SS
10937/* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced
10938 with (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2
10939 is not NULL. It would be nice if dwarf2out_frame_debug_expr could
10940 deduce these equivalences by itself so it wasn't necessary to hold
10941 its hand so much. */
9ebbca7d
GK
10942
10943static void
10944rs6000_frame_related (insn, reg, val, reg2, rreg)
10945 rtx insn;
10946 rtx reg;
10947 HOST_WIDE_INT val;
10948 rtx reg2;
10949 rtx rreg;
10950{
10951 rtx real, temp;
10952
e56c4463
JL
10953 /* copy_rtx will not make unique copies of registers, so we need to
10954 ensure we don't have unwanted sharing here. */
10955 if (reg == reg2)
10956 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
10957
10958 if (reg == rreg)
10959 reg = gen_raw_REG (GET_MODE (reg), REGNO (reg));
10960
9ebbca7d
GK
10961 real = copy_rtx (PATTERN (insn));
10962
89e7058f
AH
10963 if (reg2 != NULL_RTX)
10964 real = replace_rtx (real, reg2, rreg);
10965
9ebbca7d
GK
10966 real = replace_rtx (real, reg,
10967 gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
10968 STACK_POINTER_REGNUM),
10969 GEN_INT (val)));
10970
10971 /* We expect that 'real' is either a SET or a PARALLEL containing
10972 SETs (and possibly other stuff). In a PARALLEL, all the SETs
10973 are important so they all have to be marked RTX_FRAME_RELATED_P. */
10974
10975 if (GET_CODE (real) == SET)
10976 {
10977 rtx set = real;
10978
10979 temp = simplify_rtx (SET_SRC (set));
10980 if (temp)
10981 SET_SRC (set) = temp;
10982 temp = simplify_rtx (SET_DEST (set));
10983 if (temp)
10984 SET_DEST (set) = temp;
10985 if (GET_CODE (SET_DEST (set)) == MEM)
38c1f2d7 10986 {
9ebbca7d
GK
10987 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
10988 if (temp)
10989 XEXP (SET_DEST (set), 0) = temp;
38c1f2d7 10990 }
38c1f2d7 10991 }
9ebbca7d
GK
10992 else if (GET_CODE (real) == PARALLEL)
10993 {
10994 int i;
10995 for (i = 0; i < XVECLEN (real, 0); i++)
10996 if (GET_CODE (XVECEXP (real, 0, i)) == SET)
10997 {
10998 rtx set = XVECEXP (real, 0, i);
10999
11000 temp = simplify_rtx (SET_SRC (set));
11001 if (temp)
11002 SET_SRC (set) = temp;
11003 temp = simplify_rtx (SET_DEST (set));
11004 if (temp)
11005 SET_DEST (set) = temp;
11006 if (GET_CODE (SET_DEST (set)) == MEM)
11007 {
11008 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
11009 if (temp)
11010 XEXP (SET_DEST (set), 0) = temp;
11011 }
11012 RTX_FRAME_RELATED_P (set) = 1;
11013 }
11014 }
11015 else
a4f6c312 11016 abort ();
c19de7aa
AH
11017
11018 if (TARGET_SPE)
11019 real = spe_synthesize_frame_save (real);
11020
9ebbca7d
GK
11021 RTX_FRAME_RELATED_P (insn) = 1;
11022 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
11023 real,
11024 REG_NOTES (insn));
38c1f2d7
MM
11025}
11026
c19de7aa
AH
11027/* Given an SPE frame note, return a PARALLEL of SETs with the
11028 original note, plus a synthetic register save. */
11029
11030static rtx
11031spe_synthesize_frame_save (real)
11032 rtx real;
11033{
11034 rtx synth, offset, reg, real2;
11035
11036 if (GET_CODE (real) != SET
11037 || GET_MODE (SET_SRC (real)) != V2SImode)
11038 return real;
11039
11040 /* For the SPE, registers saved in 64-bits, get a PARALLEL for their
11041 frame related note. The parallel contains a set of the register
41f3a930 11042 being saved, and another set to a synthetic register (n+1200).
c19de7aa
AH
11043 This is so we can differentiate between 64-bit and 32-bit saves.
11044 Words cannot describe this nastiness. */
11045
11046 if (GET_CODE (SET_DEST (real)) != MEM
11047 || GET_CODE (XEXP (SET_DEST (real), 0)) != PLUS
11048 || GET_CODE (SET_SRC (real)) != REG)
11049 abort ();
11050
11051 /* Transform:
11052 (set (mem (plus (reg x) (const y)))
11053 (reg z))
11054 into:
11055 (set (mem (plus (reg x) (const y+4)))
41f3a930 11056 (reg z+1200))
c19de7aa
AH
11057 */
11058
11059 real2 = copy_rtx (real);
11060 PUT_MODE (SET_DEST (real2), SImode);
11061 reg = SET_SRC (real2);
11062 real2 = replace_rtx (real2, reg, gen_rtx_REG (SImode, REGNO (reg)));
11063 synth = copy_rtx (real2);
11064
11065 if (BYTES_BIG_ENDIAN)
11066 {
11067 offset = XEXP (XEXP (SET_DEST (real2), 0), 1);
11068 real2 = replace_rtx (real2, offset, GEN_INT (INTVAL (offset) + 4));
11069 }
11070
11071 reg = SET_SRC (synth);
41f3a930 11072
c19de7aa 11073 synth = replace_rtx (synth, reg,
41f3a930 11074 gen_rtx_REG (SImode, REGNO (reg) + 1200));
c19de7aa
AH
11075
11076 offset = XEXP (XEXP (SET_DEST (synth), 0), 1);
11077 synth = replace_rtx (synth, offset,
11078 GEN_INT (INTVAL (offset)
11079 + (BYTES_BIG_ENDIAN ? 0 : 4)));
11080
11081 RTX_FRAME_RELATED_P (synth) = 1;
11082 RTX_FRAME_RELATED_P (real2) = 1;
11083 if (BYTES_BIG_ENDIAN)
11084 real = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, synth, real2));
11085 else
11086 real = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, real2, synth));
11087
11088 return real;
11089}
11090
00b960c7
AH
11091/* Returns an insn that has a vrsave set operation with the
11092 appropriate CLOBBERs. */
11093
11094static rtx
9aa86737 11095generate_set_vrsave (reg, info, epiloguep)
00b960c7
AH
11096 rtx reg;
11097 rs6000_stack_t *info;
9aa86737 11098 int epiloguep;
00b960c7
AH
11099{
11100 int nclobs, i;
11101 rtx insn, clobs[TOTAL_ALTIVEC_REGS + 1];
a004eb82 11102 rtx vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
00b960c7 11103
a004eb82
AH
11104 clobs[0]
11105 = gen_rtx_SET (VOIDmode,
11106 vrsave,
11107 gen_rtx_UNSPEC_VOLATILE (SImode,
11108 gen_rtvec (2, reg, vrsave),
11109 30));
00b960c7
AH
11110
11111 nclobs = 1;
11112
9aa86737
AH
11113 /* We need to clobber the registers in the mask so the scheduler
11114 does not move sets to VRSAVE before sets of AltiVec registers.
11115
11116 However, if the function receives nonlocal gotos, reload will set
11117 all call saved registers live. We will end up with:
11118
11119 (set (reg 999) (mem))
11120 (parallel [ (set (reg vrsave) (unspec blah))
11121 (clobber (reg 999))])
11122
11123 The clobber will cause the store into reg 999 to be dead, and
11124 flow will attempt to delete an epilogue insn. In this case, we
11125 need an unspec use/set of the register. */
00b960c7
AH
11126
11127 for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i)
11128 if (info->vrsave_mask != 0 && ALTIVEC_REG_BIT (i) != 0)
9aa86737
AH
11129 {
11130 if (!epiloguep || call_used_regs [i])
11131 clobs[nclobs++] = gen_rtx_CLOBBER (VOIDmode,
11132 gen_rtx_REG (V4SImode, i));
11133 else
11134 {
11135 rtx reg = gen_rtx_REG (V4SImode, i);
9aa86737
AH
11136
11137 clobs[nclobs++]
a004eb82
AH
11138 = gen_rtx_SET (VOIDmode,
11139 reg,
11140 gen_rtx_UNSPEC (V4SImode,
11141 gen_rtvec (1, reg), 27));
9aa86737
AH
11142 }
11143 }
00b960c7
AH
11144
11145 insn = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nclobs));
11146
11147 for (i = 0; i < nclobs; ++i)
11148 XVECEXP (insn, 0, i) = clobs[i];
11149
11150 return insn;
11151}
11152
89e7058f
AH
11153/* Save a register into the frame, and emit RTX_FRAME_RELATED_P notes.
11154 Save REGNO into [FRAME_REG + OFFSET] in mode MODE. */
11155
11156static void
11157emit_frame_save (frame_reg, frame_ptr, mode, regno, offset, total_size)
11158 rtx frame_reg;
11159 rtx frame_ptr;
11160 enum machine_mode mode;
11161 unsigned int regno;
11162 int offset;
11163 int total_size;
11164{
11165 rtx reg, offset_rtx, insn, mem, addr, int_rtx;
11166 rtx replacea, replaceb;
11167
11168 int_rtx = GEN_INT (offset);
11169
11170 /* Some cases that need register indexed addressing. */
11171 if ((TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (mode))
a3170dc6
AH
11172 || (TARGET_SPE_ABI
11173 && SPE_VECTOR_MODE (mode)
11174 && !SPE_CONST_OFFSET_OK (offset)))
89e7058f
AH
11175 {
11176 /* Whomever calls us must make sure r11 is available in the
11177 flow path of instructions in the prologue. */
11178 offset_rtx = gen_rtx_REG (Pmode, 11);
11179 emit_move_insn (offset_rtx, int_rtx);
11180
11181 replacea = offset_rtx;
11182 replaceb = int_rtx;
11183 }
11184 else
11185 {
11186 offset_rtx = int_rtx;
11187 replacea = NULL_RTX;
11188 replaceb = NULL_RTX;
11189 }
11190
11191 reg = gen_rtx_REG (mode, regno);
11192 addr = gen_rtx_PLUS (Pmode, frame_reg, offset_rtx);
11193 mem = gen_rtx_MEM (mode, addr);
11194 set_mem_alias_set (mem, rs6000_sr_alias_set);
11195
11196 insn = emit_move_insn (mem, reg);
11197
11198 rs6000_frame_related (insn, frame_ptr, total_size, replacea, replaceb);
11199}
11200
a3170dc6
AH
11201/* Emit an offset memory reference suitable for a frame store, while
11202 converting to a valid addressing mode. */
11203
11204static rtx
11205gen_frame_mem_offset (mode, reg, offset)
11206 enum machine_mode mode;
11207 rtx reg;
11208 int offset;
11209{
11210 rtx int_rtx, offset_rtx;
11211
11212 int_rtx = GEN_INT (offset);
11213
11214 if (TARGET_SPE_ABI && SPE_VECTOR_MODE (mode))
11215 {
11216 offset_rtx = gen_rtx_REG (Pmode, FIXED_SCRATCH);
11217 emit_move_insn (offset_rtx, int_rtx);
11218 }
11219 else
11220 offset_rtx = int_rtx;
11221
11222 return gen_rtx_MEM (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
11223}
11224
9ebbca7d
GK
11225/* Emit function prologue as insns. */
11226
9878760c 11227void
83720594 11228rs6000_emit_prologue ()
9878760c 11229{
4697a36c 11230 rs6000_stack_t *info = rs6000_stack_info ();
9ebbca7d
GK
11231 enum machine_mode reg_mode = TARGET_POWERPC64 ? DImode : SImode;
11232 int reg_size = TARGET_POWERPC64 ? 8 : 4;
11233 rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
11234 rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
11235 rtx frame_reg_rtx = sp_reg_rtx;
11236 rtx cr_save_rtx = NULL;
11237 rtx insn;
11238 int saving_FPRs_inline;
11239 int using_store_multiple;
11240 HOST_WIDE_INT sp_offset = 0;
11241
c19de7aa 11242 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
a3170dc6
AH
11243 {
11244 reg_mode = V2SImode;
11245 reg_size = 8;
11246 }
11247
9ebbca7d 11248 using_store_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
c19de7aa
AH
11249 && (!TARGET_SPE_ABI
11250 || info->spe_64bit_regs_used == 0)
9ebbca7d
GK
11251 && info->first_gp_reg_save < 31);
11252 saving_FPRs_inline = (info->first_fp_reg_save == 64
11253 || FP_SAVE_INLINE (info->first_fp_reg_save));
11254
11255 /* For V.4, update stack before we do any saving and set back pointer. */
f607bc57 11256 if (info->push_p && DEFAULT_ABI == ABI_V4)
9ebbca7d
GK
11257 {
11258 if (info->total_size < 32767)
11259 sp_offset = info->total_size;
11260 else
11261 frame_reg_rtx = frame_ptr_rtx;
11262 rs6000_emit_allocate_stack (info->total_size,
11263 (frame_reg_rtx != sp_reg_rtx
11264 && (info->cr_save_p
11265 || info->lr_save_p
11266 || info->first_fp_reg_save < 64
11267 || info->first_gp_reg_save < 32
11268 )));
11269 if (frame_reg_rtx != sp_reg_rtx)
11270 rs6000_emit_stack_tie ();
11271 }
11272
9aa86737
AH
11273 /* Save AltiVec registers if needed. */
11274 if (TARGET_ALTIVEC_ABI && info->altivec_size != 0)
11275 {
11276 int i;
11277
11278 /* There should be a non inline version of this, for when we
11279 are saving lots of vector registers. */
11280 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
11281 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
11282 {
11283 rtx areg, savereg, mem;
11284 int offset;
11285
11286 offset = info->altivec_save_offset + sp_offset
11287 + 16 * (i - info->first_altivec_reg_save);
11288
11289 savereg = gen_rtx_REG (V4SImode, i);
11290
11291 areg = gen_rtx_REG (Pmode, 0);
11292 emit_move_insn (areg, GEN_INT (offset));
11293
11294 /* AltiVec addressing mode is [reg+reg]. */
11295 mem = gen_rtx_MEM (V4SImode,
11296 gen_rtx_PLUS (Pmode, frame_reg_rtx, areg));
11297
11298 set_mem_alias_set (mem, rs6000_sr_alias_set);
11299
11300 insn = emit_move_insn (mem, savereg);
11301
5c242421
SB
11302 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
11303 areg, GEN_INT (offset));
9aa86737
AH
11304 }
11305 }
11306
11307 /* VRSAVE is a bit vector representing which AltiVec registers
11308 are used. The OS uses this to determine which vector
11309 registers to save on a context switch. We need to save
11310 VRSAVE on the stack frame, add whatever AltiVec registers we
11311 used in this function, and do the corresponding magic in the
11312 epilogue. */
11313
11314 if (TARGET_ALTIVEC && info->vrsave_mask != 0)
11315 {
a004eb82 11316 rtx reg, mem, vrsave;
9aa86737
AH
11317 int offset;
11318
11319 /* Get VRSAVE onto a GPR. */
11320 reg = gen_rtx_REG (SImode, 12);
a004eb82 11321 vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
b188f760
AH
11322 if (TARGET_MACHO)
11323 emit_insn (gen_get_vrsave_internal (reg));
11324 else
11325 emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
9aa86737
AH
11326
11327 /* Save VRSAVE. */
11328 offset = info->vrsave_save_offset + sp_offset;
11329 mem
11330 = gen_rtx_MEM (SImode,
11331 gen_rtx_PLUS (Pmode, frame_reg_rtx, GEN_INT (offset)));
11332 set_mem_alias_set (mem, rs6000_sr_alias_set);
11333 insn = emit_move_insn (mem, reg);
11334
11335 /* Include the registers in the mask. */
11336 emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));
11337
11338 insn = emit_insn (generate_set_vrsave (reg, info, 0));
11339 }
11340
9ebbca7d
GK
11341 /* If we use the link register, get it into r0. */
11342 if (info->lr_save_p)
71f123ca 11343 emit_move_insn (gen_rtx_REG (Pmode, 0),
9ebbca7d
GK
11344 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
11345
11346 /* If we need to save CR, put it into r12. */
11347 if (info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
11348 {
11349 cr_save_rtx = gen_rtx_REG (SImode, 12);
11350 emit_insn (gen_movesi_from_cr (cr_save_rtx));
11351 }
11352
a4f6c312
SS
11353 /* Do any required saving of fpr's. If only one or two to save, do
11354 it ourselves. Otherwise, call function. */
9ebbca7d
GK
11355 if (saving_FPRs_inline)
11356 {
11357 int i;
11358 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
11359 if ((regs_ever_live[info->first_fp_reg_save+i]
11360 && ! call_used_regs[info->first_fp_reg_save+i]))
89e7058f
AH
11361 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, DFmode,
11362 info->first_fp_reg_save + i,
11363 info->fp_save_offset + sp_offset + 8 * i,
11364 info->total_size);
9ebbca7d
GK
11365 }
11366 else if (info->first_fp_reg_save != 64)
11367 {
11368 int i;
11369 char rname[30];
520a57c8 11370 const char *alloc_rname;
9ebbca7d
GK
11371 rtvec p;
11372 p = rtvec_alloc (2 + 64 - info->first_fp_reg_save);
11373
11374 RTVEC_ELT (p, 0) = gen_rtx_CLOBBER (VOIDmode,
11375 gen_rtx_REG (Pmode,
11376 LINK_REGISTER_REGNUM));
11377 sprintf (rname, "%s%d%s", SAVE_FP_PREFIX,
11378 info->first_fp_reg_save - 32, SAVE_FP_SUFFIX);
a8a05998 11379 alloc_rname = ggc_strdup (rname);
9ebbca7d
GK
11380 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
11381 gen_rtx_SYMBOL_REF (Pmode,
11382 alloc_rname));
11383 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
11384 {
11385 rtx addr, reg, mem;
11386 reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
11387 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
11388 GEN_INT (info->fp_save_offset
11389 + sp_offset + 8*i));
11390 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 11391 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
11392
11393 RTVEC_ELT (p, i + 2) = gen_rtx_SET (VOIDmode, mem, reg);
11394 }
11395 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
11396 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
11397 NULL_RTX, NULL_RTX);
11398 }
b6c9286a 11399
9ebbca7d
GK
11400 /* Save GPRs. This is done as a PARALLEL if we are using
11401 the store-multiple instructions. */
11402 if (using_store_multiple)
b6c9286a 11403 {
308c142a 11404 rtvec p;
9ebbca7d
GK
11405 int i;
11406 p = rtvec_alloc (32 - info->first_gp_reg_save);
9ebbca7d
GK
11407 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
11408 {
11409 rtx addr, reg, mem;
11410 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
11411 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
11412 GEN_INT (info->gp_save_offset
11413 + sp_offset
11414 + reg_size * i));
11415 mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0 11416 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
11417
11418 RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
11419 }
11420 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
11421 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
11422 NULL_RTX, NULL_RTX);
b6c9286a
MM
11423 }
11424 else
11425 {
9ebbca7d
GK
11426 int i;
11427 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
11428 if ((regs_ever_live[info->first_gp_reg_save+i]
11429 && ! call_used_regs[info->first_gp_reg_save+i])
1db02437 11430 || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
14f00213 11431 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
f607bc57 11432 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
a3170dc6
AH
11433 {
11434 rtx addr, reg, mem;
11435 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
11436
c19de7aa 11437 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
a3170dc6
AH
11438 {
11439 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
11440 rtx b;
11441
11442 if (!SPE_CONST_OFFSET_OK (offset))
11443 {
11444 b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
11445 emit_move_insn (b, GEN_INT (offset));
11446 }
11447 else
11448 b = GEN_INT (offset);
11449
11450 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
11451 mem = gen_rtx_MEM (V2SImode, addr);
11452 set_mem_alias_set (mem, rs6000_sr_alias_set);
11453 insn = emit_move_insn (mem, reg);
11454
11455 if (GET_CODE (b) == CONST_INT)
11456 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
11457 NULL_RTX, NULL_RTX);
11458 else
11459 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
11460 b, GEN_INT (offset));
11461 }
11462 else
11463 {
11464 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
11465 GEN_INT (info->gp_save_offset
11466 + sp_offset
11467 + reg_size * i));
11468 mem = gen_rtx_MEM (reg_mode, addr);
11469 set_mem_alias_set (mem, rs6000_sr_alias_set);
11470
11471 insn = emit_move_insn (mem, reg);
11472 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
11473 NULL_RTX, NULL_RTX);
11474 }
11475 }
9ebbca7d
GK
11476 }
11477
83720594
RH
11478 /* ??? There's no need to emit actual instructions here, but it's the
11479 easiest way to get the frame unwind information emitted. */
11480 if (current_function_calls_eh_return)
11481 {
78e1b90d
DE
11482 unsigned int i, regno;
11483
83720594
RH
11484 for (i = 0; ; ++i)
11485 {
83720594
RH
11486 regno = EH_RETURN_DATA_REGNO (i);
11487 if (regno == INVALID_REGNUM)
11488 break;
11489
89e7058f
AH
11490 emit_frame_save (frame_reg_rtx, frame_ptr_rtx, reg_mode, regno,
11491 info->ehrd_offset + sp_offset
11492 + reg_size * (int) i,
11493 info->total_size);
83720594
RH
11494 }
11495 }
11496
9ebbca7d
GK
11497 /* Save lr if we used it. */
11498 if (info->lr_save_p)
11499 {
11500 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
11501 GEN_INT (info->lr_save_offset + sp_offset));
11502 rtx reg = gen_rtx_REG (Pmode, 0);
11503 rtx mem = gen_rtx_MEM (Pmode, addr);
11504 /* This should not be of rs6000_sr_alias_set, because of
11505 __builtin_return_address. */
11506
11507 insn = emit_move_insn (mem, reg);
11508 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
11509 reg, gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
11510 }
11511
11512 /* Save CR if we use any that must be preserved. */
11513 if (info->cr_save_p)
11514 {
11515 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
11516 GEN_INT (info->cr_save_offset + sp_offset));
11517 rtx mem = gen_rtx_MEM (SImode, addr);
ba4828e0
RK
11518
11519 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
11520
11521 /* If r12 was used to hold the original sp, copy cr into r0 now
11522 that it's free. */
11523 if (REGNO (frame_reg_rtx) == 12)
11524 {
11525 cr_save_rtx = gen_rtx_REG (SImode, 0);
11526 emit_insn (gen_movesi_from_cr (cr_save_rtx));
11527 }
11528 insn = emit_move_insn (mem, cr_save_rtx);
11529
11530 /* Now, there's no way that dwarf2out_frame_debug_expr is going
615158e2
JJ
11531 to understand '(unspec:SI [(reg:CC 68) ...] UNSPEC_MOVESI_FROM_CR)'.
11532 But that's OK. All we have to do is specify that _one_ condition
11533 code register is saved in this stack slot. The thrower's epilogue
a1dc9455
FS
11534 will then restore all the call-saved registers.
11535 We use CR2_REGNO (70) to be compatible with gcc-2.95 on Linux. */
9ebbca7d 11536 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
a1dc9455 11537 cr_save_rtx, gen_rtx_REG (SImode, CR2_REGNO));
9ebbca7d
GK
11538 }
11539
11540 /* Update stack and set back pointer unless this is V.4,
11541 for which it was done previously. */
f607bc57 11542 if (info->push_p && DEFAULT_ABI != ABI_V4)
9ebbca7d
GK
11543 rs6000_emit_allocate_stack (info->total_size, FALSE);
11544
11545 /* Set frame pointer, if needed. */
11546 if (frame_pointer_needed)
11547 {
a3170dc6 11548 insn = emit_move_insn (gen_rtx_REG (Pmode, FRAME_POINTER_REGNUM),
9ebbca7d
GK
11549 sp_reg_rtx);
11550 RTX_FRAME_RELATED_P (insn) = 1;
b6c9286a 11551 }
9878760c 11552
1db02437 11553 /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up. */
9ebbca7d 11554 if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
f607bc57 11555 || (DEFAULT_ABI == ABI_V4 && flag_pic == 1
1db02437 11556 && regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM]))
9ebbca7d
GK
11557 {
11558 /* If emit_load_toc_table will use the link register, we need to save
c4501e62 11559 it. We use R12 for this purpose because emit_load_toc_table
9ebbca7d
GK
11560 can use register 0. This allows us to use a plain 'blr' to return
11561 from the procedure more often. */
f1384257
AM
11562 int save_LR_around_toc_setup = (TARGET_ELF
11563 && DEFAULT_ABI != ABI_AIX
11564 && flag_pic
d5fa86ba
GK
11565 && ! info->lr_save_p
11566 && EXIT_BLOCK_PTR->pred != NULL);
9ebbca7d 11567 if (save_LR_around_toc_setup)
c4501e62
JJ
11568 {
11569 rtx lr = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
11570 rs6000_maybe_dead (emit_move_insn (frame_ptr_rtx, lr));
11571 rs6000_emit_load_toc_table (TRUE);
11572 rs6000_maybe_dead (emit_move_insn (lr, frame_ptr_rtx));
11573 }
11574 else
11575 rs6000_emit_load_toc_table (TRUE);
9ebbca7d 11576 }
ee890fe2 11577
fcce224d 11578#if TARGET_MACHO
ee890fe2
SS
11579 if (DEFAULT_ABI == ABI_DARWIN
11580 && flag_pic && current_function_uses_pic_offset_table)
11581 {
11582 rtx dest = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
f099d360 11583 const char *picbase = machopic_function_base_name ();
6788f5ca 11584 rtx src = gen_rtx_SYMBOL_REF (Pmode, picbase);
ee890fe2 11585
f51eee6a 11586 rs6000_maybe_dead (emit_insn (gen_load_macho_picbase (dest, src)));
ee890fe2
SS
11587
11588 rs6000_maybe_dead (
1db02437 11589 emit_move_insn (gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM),
ee890fe2
SS
11590 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)));
11591 }
fcce224d 11592#endif
9ebbca7d
GK
11593}
11594
9ebbca7d 11595/* Write function prologue. */
a4f6c312 11596
08c148a8
NB
11597static void
11598rs6000_output_function_prologue (file, size)
9ebbca7d 11599 FILE *file;
08c148a8 11600 HOST_WIDE_INT size ATTRIBUTE_UNUSED;
9ebbca7d
GK
11601{
11602 rs6000_stack_t *info = rs6000_stack_info ();
11603
4697a36c
MM
11604 if (TARGET_DEBUG_STACK)
11605 debug_stack_info (info);
9878760c 11606
a4f6c312
SS
11607 /* Write .extern for any function we will call to save and restore
11608 fp values. */
11609 if (info->first_fp_reg_save < 64
11610 && !FP_SAVE_INLINE (info->first_fp_reg_save))
4d30c363 11611 fprintf (file, "\t.extern %s%d%s\n\t.extern %s%d%s\n",
4697a36c 11612 SAVE_FP_PREFIX, info->first_fp_reg_save - 32, SAVE_FP_SUFFIX,
a4f6c312
SS
11613 RESTORE_FP_PREFIX, info->first_fp_reg_save - 32,
11614 RESTORE_FP_SUFFIX);
9878760c 11615
c764f757
RK
11616 /* Write .extern for AIX common mode routines, if needed. */
11617 if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
11618 {
f6709c70
JW
11619 fputs ("\t.extern __mulh\n", file);
11620 fputs ("\t.extern __mull\n", file);
11621 fputs ("\t.extern __divss\n", file);
11622 fputs ("\t.extern __divus\n", file);
11623 fputs ("\t.extern __quoss\n", file);
11624 fputs ("\t.extern __quous\n", file);
c764f757
RK
11625 common_mode_defined = 1;
11626 }
9878760c 11627
9ebbca7d 11628 if (! HAVE_prologue)
979721f8 11629 {
9ebbca7d 11630 start_sequence ();
9dda4cc8 11631
a4f6c312
SS
11632 /* A NOTE_INSN_DELETED is supposed to be at the start and end of
11633 the "toplevel" insn chain. */
2e040219 11634 emit_note (NOTE_INSN_DELETED);
9ebbca7d 11635 rs6000_emit_prologue ();
2e040219 11636 emit_note (NOTE_INSN_DELETED);
178c3eff
DJ
11637
11638 /* Expand INSN_ADDRESSES so final() doesn't crash. */
11639 {
11640 rtx insn;
11641 unsigned addr = 0;
11642 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
11643 {
11644 INSN_ADDRESSES_NEW (insn, addr);
11645 addr += 4;
11646 }
11647 }
9dda4cc8 11648
9ebbca7d 11649 if (TARGET_DEBUG_STACK)
a4f6c312
SS
11650 debug_rtx_list (get_insns (), 100);
11651 final (get_insns (), file, FALSE, FALSE);
9ebbca7d 11652 end_sequence ();
979721f8
MM
11653 }
11654
9ebbca7d
GK
11655 rs6000_pic_labelno++;
11656}
11657
11658/* Emit function epilogue as insns.
9878760c 11659
9ebbca7d
GK
11660 At present, dwarf2out_frame_debug_expr doesn't understand
11661 register restores, so we don't bother setting RTX_FRAME_RELATED_P
11662 anywhere in the epilogue. Most of the insns below would in any case
11663 need special notes to explain where r11 is in relation to the stack. */
9878760c 11664
9ebbca7d 11665void
83720594 11666rs6000_emit_epilogue (sibcall)
9ebbca7d
GK
11667 int sibcall;
11668{
11669 rs6000_stack_t *info;
11670 int restoring_FPRs_inline;
11671 int using_load_multiple;
11672 int using_mfcr_multiple;
11673 int use_backchain_to_restore_sp;
11674 int sp_offset = 0;
11675 rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
11676 rtx frame_reg_rtx = sp_reg_rtx;
11677 enum machine_mode reg_mode = TARGET_POWERPC64 ? DImode : SImode;
11678 int reg_size = TARGET_POWERPC64 ? 8 : 4;
11679 int i;
11680
c19de7aa
AH
11681 info = rs6000_stack_info ();
11682
11683 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
a3170dc6
AH
11684 {
11685 reg_mode = V2SImode;
11686 reg_size = 8;
11687 }
11688
9ebbca7d 11689 using_load_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
c19de7aa
AH
11690 && (!TARGET_SPE_ABI
11691 || info->spe_64bit_regs_used == 0)
9ebbca7d
GK
11692 && info->first_gp_reg_save < 31);
11693 restoring_FPRs_inline = (sibcall
83720594 11694 || current_function_calls_eh_return
9ebbca7d
GK
11695 || info->first_fp_reg_save == 64
11696 || FP_SAVE_INLINE (info->first_fp_reg_save));
11697 use_backchain_to_restore_sp = (frame_pointer_needed
11698 || current_function_calls_alloca
11699 || info->total_size > 32767);
11700 using_mfcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
11701 || rs6000_cpu == PROCESSOR_PPC603
11702 || rs6000_cpu == PROCESSOR_PPC750
11703 || optimize_size);
11704
11705 /* If we have a frame pointer, a call to alloca, or a large stack
11706 frame, restore the old stack pointer using the backchain. Otherwise,
11707 we know what size to update it with. */
11708 if (use_backchain_to_restore_sp)
bacbde18 11709 {
9ebbca7d
GK
11710 /* Under V.4, don't reset the stack pointer until after we're done
11711 loading the saved registers. */
f607bc57 11712 if (DEFAULT_ABI == ABI_V4)
9ebbca7d 11713 frame_reg_rtx = gen_rtx_REG (Pmode, 11);
4697a36c 11714
9ebbca7d
GK
11715 emit_move_insn (frame_reg_rtx,
11716 gen_rtx_MEM (Pmode, sp_reg_rtx));
11717
bacbde18 11718 }
9ebbca7d 11719 else if (info->push_p)
85638c0d 11720 {
f607bc57 11721 if (DEFAULT_ABI == ABI_V4)
9ebbca7d
GK
11722 sp_offset = info->total_size;
11723 else
11724 {
11725 emit_insn (TARGET_32BIT
11726 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
11727 GEN_INT (info->total_size))
11728 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
11729 GEN_INT (info->total_size)));
11730 }
85638c0d 11731 }
9ebbca7d 11732
9aa86737
AH
11733 /* Restore AltiVec registers if needed. */
11734 if (TARGET_ALTIVEC_ABI && info->altivec_size != 0)
11735 {
11736 int i;
11737
11738 for (i = info->first_altivec_reg_save; i <= LAST_ALTIVEC_REGNO; ++i)
11739 if (info->vrsave_mask & ALTIVEC_REG_BIT (i))
11740 {
11741 rtx addr, areg, mem;
11742
11743 areg = gen_rtx_REG (Pmode, 0);
11744 emit_move_insn
11745 (areg, GEN_INT (info->altivec_save_offset
11746 + sp_offset
11747 + 16 * (i - info->first_altivec_reg_save)));
11748
11749 /* AltiVec addressing mode is [reg+reg]. */
11750 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, areg);
11751 mem = gen_rtx_MEM (V4SImode, addr);
11752 set_mem_alias_set (mem, rs6000_sr_alias_set);
11753
11754 emit_move_insn (gen_rtx_REG (V4SImode, i), mem);
11755 }
11756 }
11757
11758 /* Restore VRSAVE if needed. */
11759 if (TARGET_ALTIVEC_ABI && info->vrsave_mask != 0)
11760 {
11761 rtx addr, mem, reg;
11762
11763 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
11764 GEN_INT (info->vrsave_save_offset + sp_offset));
11765 mem = gen_rtx_MEM (SImode, addr);
11766 set_mem_alias_set (mem, rs6000_sr_alias_set);
11767 reg = gen_rtx_REG (SImode, 12);
11768 emit_move_insn (reg, mem);
11769
11770 emit_insn (generate_set_vrsave (reg, info, 1));
11771 }
11772
9ebbca7d
GK
11773 /* Get the old lr if we saved it. */
11774 if (info->lr_save_p)
b6c9286a 11775 {
a3170dc6
AH
11776 rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
11777 info->lr_save_offset + sp_offset);
ba4828e0
RK
11778
11779 set_mem_alias_set (mem, rs6000_sr_alias_set);
b6c9286a 11780
9ebbca7d 11781 emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
b6c9286a 11782 }
9ebbca7d
GK
11783
11784 /* Get the old cr if we saved it. */
11785 if (info->cr_save_p)
11786 {
11787 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
11788 GEN_INT (info->cr_save_offset + sp_offset));
11789 rtx mem = gen_rtx_MEM (SImode, addr);
ba4828e0
RK
11790
11791 set_mem_alias_set (mem, rs6000_sr_alias_set);
b6c9286a 11792
9ebbca7d
GK
11793 emit_move_insn (gen_rtx_REG (SImode, 12), mem);
11794 }
11795
11796 /* Set LR here to try to overlap restores below. */
4697a36c 11797 if (info->lr_save_p)
9ebbca7d
GK
11798 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM),
11799 gen_rtx_REG (Pmode, 0));
11800
83720594
RH
11801 /* Load exception handler data registers, if needed. */
11802 if (current_function_calls_eh_return)
11803 {
78e1b90d
DE
11804 unsigned int i, regno;
11805
83720594
RH
11806 for (i = 0; ; ++i)
11807 {
a3170dc6 11808 rtx mem;
83720594
RH
11809
11810 regno = EH_RETURN_DATA_REGNO (i);
11811 if (regno == INVALID_REGNUM)
11812 break;
11813
a3170dc6
AH
11814 mem = gen_frame_mem_offset (reg_mode, frame_reg_rtx,
11815 info->ehrd_offset + sp_offset
11816 + reg_size * (int) i);
ba4828e0 11817 set_mem_alias_set (mem, rs6000_sr_alias_set);
83720594
RH
11818
11819 emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
11820 }
11821 }
9ebbca7d
GK
11822
11823 /* Restore GPRs. This is done as a PARALLEL if we are using
11824 the load-multiple instructions. */
11825 if (using_load_multiple)
979721f8 11826 {
9ebbca7d
GK
11827 rtvec p;
11828 p = rtvec_alloc (32 - info->first_gp_reg_save);
11829 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
979721f8 11830 {
9ebbca7d
GK
11831 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
11832 GEN_INT (info->gp_save_offset
11833 + sp_offset
11834 + reg_size * i));
11835 rtx mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0
RK
11836
11837 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
11838
11839 RTVEC_ELT (p, i) =
11840 gen_rtx_SET (VOIDmode,
11841 gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
11842 mem);
979721f8 11843 }
9ebbca7d 11844 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
979721f8 11845 }
9ebbca7d
GK
11846 else
11847 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
11848 if ((regs_ever_live[info->first_gp_reg_save+i]
11849 && ! call_used_regs[info->first_gp_reg_save+i])
1db02437 11850 || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
14f00213 11851 && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
f607bc57 11852 || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
9ebbca7d
GK
11853 {
11854 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
11855 GEN_INT (info->gp_save_offset
11856 + sp_offset
11857 + reg_size * i));
11858 rtx mem = gen_rtx_MEM (reg_mode, addr);
ba4828e0 11859
a3170dc6 11860 /* Restore 64-bit quantities for SPE. */
c19de7aa 11861 if (TARGET_SPE_ABI && info->spe_64bit_regs_used != 0)
a3170dc6
AH
11862 {
11863 int offset = info->spe_gp_save_offset + sp_offset + 8 * i;
11864 rtx b;
11865
11866 if (!SPE_CONST_OFFSET_OK (offset))
11867 {
11868 b = gen_rtx_REG (Pmode, FIXED_SCRATCH);
11869 emit_move_insn (b, GEN_INT (offset));
11870 }
11871 else
11872 b = GEN_INT (offset);
11873
11874 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, b);
11875 mem = gen_rtx_MEM (V2SImode, addr);
11876 }
11877
ba4828e0 11878 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
11879
11880 emit_move_insn (gen_rtx_REG (reg_mode,
a3170dc6 11881 info->first_gp_reg_save + i), mem);
9ebbca7d 11882 }
9878760c 11883
9ebbca7d
GK
11884 /* Restore fpr's if we need to do it without calling a function. */
11885 if (restoring_FPRs_inline)
11886 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
11887 if ((regs_ever_live[info->first_fp_reg_save+i]
11888 && ! call_used_regs[info->first_fp_reg_save+i]))
11889 {
11890 rtx addr, mem;
11891 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
11892 GEN_INT (info->fp_save_offset
11893 + sp_offset
a4f6c312 11894 + 8 * i));
9ebbca7d 11895 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 11896 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
11897
11898 emit_move_insn (gen_rtx_REG (DFmode,
11899 info->first_fp_reg_save + i),
11900 mem);
11901 }
8d30c4ee 11902
9ebbca7d
GK
11903 /* If we saved cr, restore it here. Just those that were used. */
11904 if (info->cr_save_p)
979721f8 11905 {
9ebbca7d 11906 rtx r12_rtx = gen_rtx_REG (SImode, 12);
e35b9579 11907 int count = 0;
9ebbca7d
GK
11908
11909 if (using_mfcr_multiple)
979721f8 11910 {
9ebbca7d
GK
11911 for (i = 0; i < 8; i++)
11912 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
e35b9579 11913 count++;
9ebbca7d 11914 if (count == 0)
e35b9579
GK
11915 abort ();
11916 }
11917
11918 if (using_mfcr_multiple && count > 1)
11919 {
11920 rtvec p;
11921 int ndx;
9ebbca7d 11922
e35b9579 11923 p = rtvec_alloc (count);
9ebbca7d 11924
e35b9579 11925 ndx = 0;
9ebbca7d
GK
11926 for (i = 0; i < 8; i++)
11927 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
11928 {
11929 rtvec r = rtvec_alloc (2);
11930 RTVEC_ELT (r, 0) = r12_rtx;
11931 RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
e35b9579 11932 RTVEC_ELT (p, ndx) =
9ebbca7d 11933 gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
615158e2 11934 gen_rtx_UNSPEC (CCmode, r, UNSPEC_MOVESI_TO_CR));
e35b9579 11935 ndx++;
9ebbca7d
GK
11936 }
11937 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
e35b9579
GK
11938 if (ndx != count)
11939 abort ();
979721f8
MM
11940 }
11941 else
9ebbca7d
GK
11942 for (i = 0; i < 8; i++)
11943 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
979721f8 11944 {
9ebbca7d
GK
11945 emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
11946 CR0_REGNO+i),
11947 r12_rtx));
979721f8 11948 }
979721f8
MM
11949 }
11950
9ebbca7d
GK
11951 /* If this is V.4, unwind the stack pointer after all of the loads
11952 have been done. We need to emit a block here so that sched
11953 doesn't decide to move the sp change before the register restores
11954 (which may not have any obvious dependency on the stack). This
11955 doesn't hurt performance, because there is no scheduling that can
11956 be done after this point. */
f607bc57 11957 if (DEFAULT_ABI == ABI_V4)
b6c9286a 11958 {
9ebbca7d
GK
11959 if (frame_reg_rtx != sp_reg_rtx)
11960 rs6000_emit_stack_tie ();
b6c9286a 11961
9ebbca7d 11962 if (use_backchain_to_restore_sp)
b6c9286a 11963 {
9ebbca7d 11964 emit_move_insn (sp_reg_rtx, frame_reg_rtx);
b6c9286a 11965 }
9ebbca7d 11966 else if (sp_offset != 0)
13f1623b 11967 {
5b71a4e7 11968 emit_insn (TARGET_32BIT
9ebbca7d
GK
11969 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
11970 GEN_INT (sp_offset))
11971 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
11972 GEN_INT (sp_offset)));
13f1623b 11973 }
9ebbca7d 11974 }
b6c9286a 11975
83720594
RH
11976 if (current_function_calls_eh_return)
11977 {
11978 rtx sa = EH_RETURN_STACKADJ_RTX;
5b71a4e7 11979 emit_insn (TARGET_32BIT
83720594
RH
11980 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx, sa)
11981 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx, sa));
11982 }
11983
9ebbca7d
GK
11984 if (!sibcall)
11985 {
11986 rtvec p;
11987 if (! restoring_FPRs_inline)
11988 p = rtvec_alloc (3 + 64 - info->first_fp_reg_save);
11989 else
11990 p = rtvec_alloc (2);
b6c9286a 11991
e35b9579
GK
11992 RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
11993 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
9ebbca7d
GK
11994 gen_rtx_REG (Pmode,
11995 LINK_REGISTER_REGNUM));
9ebbca7d
GK
11996
11997 /* If we have to restore more than two FP registers, branch to the
11998 restore function. It will return to our caller. */
11999 if (! restoring_FPRs_inline)
12000 {
12001 int i;
12002 char rname[30];
520a57c8 12003 const char *alloc_rname;
979721f8 12004
9ebbca7d
GK
12005 sprintf (rname, "%s%d%s", RESTORE_FP_PREFIX,
12006 info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX);
a8a05998 12007 alloc_rname = ggc_strdup (rname);
9ebbca7d
GK
12008 RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode,
12009 gen_rtx_SYMBOL_REF (Pmode,
12010 alloc_rname));
b6c9286a 12011
9ebbca7d
GK
12012 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
12013 {
12014 rtx addr, mem;
12015 addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
12016 GEN_INT (info->fp_save_offset + 8*i));
12017 mem = gen_rtx_MEM (DFmode, addr);
ba4828e0 12018 set_mem_alias_set (mem, rs6000_sr_alias_set);
9ebbca7d
GK
12019
12020 RTVEC_ELT (p, i+3) =
12021 gen_rtx_SET (VOIDmode,
12022 gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
12023 mem);
b6c9286a
MM
12024 }
12025 }
9ebbca7d
GK
12026
12027 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
3daf36a4 12028 }
9878760c
RK
12029}
12030
12031/* Write function epilogue. */
12032
08c148a8
NB
12033static void
12034rs6000_output_function_epilogue (file, size)
9878760c 12035 FILE *file;
08c148a8 12036 HOST_WIDE_INT size ATTRIBUTE_UNUSED;
9878760c 12037{
4697a36c 12038 rs6000_stack_t *info = rs6000_stack_info ();
9878760c 12039
9ebbca7d 12040 if (! HAVE_epilogue)
9878760c 12041 {
9ebbca7d
GK
12042 rtx insn = get_last_insn ();
12043 /* If the last insn was a BARRIER, we don't have to write anything except
12044 the trace table. */
12045 if (GET_CODE (insn) == NOTE)
12046 insn = prev_nonnote_insn (insn);
12047 if (insn == 0 || GET_CODE (insn) != BARRIER)
4697a36c 12048 {
9ebbca7d
GK
12049 /* This is slightly ugly, but at least we don't have two
12050 copies of the epilogue-emitting code. */
12051 start_sequence ();
12052
12053 /* A NOTE_INSN_DELETED is supposed to be at the start
12054 and end of the "toplevel" insn chain. */
2e040219 12055 emit_note (NOTE_INSN_DELETED);
9ebbca7d 12056 rs6000_emit_epilogue (FALSE);
2e040219 12057 emit_note (NOTE_INSN_DELETED);
9ebbca7d 12058
178c3eff
DJ
12059 /* Expand INSN_ADDRESSES so final() doesn't crash. */
12060 {
12061 rtx insn;
12062 unsigned addr = 0;
12063 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
12064 {
12065 INSN_ADDRESSES_NEW (insn, addr);
12066 addr += 4;
12067 }
12068 }
12069
9ebbca7d 12070 if (TARGET_DEBUG_STACK)
a4f6c312
SS
12071 debug_rtx_list (get_insns (), 100);
12072 final (get_insns (), file, FALSE, FALSE);
9ebbca7d 12073 end_sequence ();
4697a36c 12074 }
9878760c 12075 }
b4ac57ab 12076
9b30bae2 12077 /* Output a traceback table here. See /usr/include/sys/debug.h for info
314fc5a9
ILT
12078 on its format.
12079
12080 We don't output a traceback table if -finhibit-size-directive was
12081 used. The documentation for -finhibit-size-directive reads
12082 ``don't output a @code{.size} assembler directive, or anything
12083 else that would cause trouble if the function is split in the
12084 middle, and the two halves are placed at locations far apart in
12085 memory.'' The traceback table has this property, since it
12086 includes the offset from the start of the function to the
4d30c363
MM
12087 traceback table itself.
12088
12089 System V.4 Powerpc's (and the embedded ABI derived from it) use a
b6c9286a 12090 different traceback table. */
57ac7be9
AM
12091 if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
12092 && rs6000_traceback != traceback_none)
9b30bae2 12093 {
69c75916 12094 const char *fname = NULL;
3ac88239 12095 const char *language_string = lang_hooks.name;
6041bf2f 12096 int fixed_parms = 0, float_parms = 0, parm_info = 0;
314fc5a9 12097 int i;
57ac7be9
AM
12098 int optional_tbtab;
12099
12100 if (rs6000_traceback == traceback_full)
12101 optional_tbtab = 1;
12102 else if (rs6000_traceback == traceback_part)
12103 optional_tbtab = 0;
12104 else
12105 optional_tbtab = !optimize_size && !TARGET_ELF;
314fc5a9 12106
69c75916
AM
12107 if (optional_tbtab)
12108 {
12109 fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
12110 while (*fname == '.') /* V.4 encodes . in the name */
12111 fname++;
12112
12113 /* Need label immediately before tbtab, so we can compute
12114 its offset from the function start. */
12115 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
12116 ASM_OUTPUT_LABEL (file, fname);
12117 }
314fc5a9
ILT
12118
12119 /* The .tbtab pseudo-op can only be used for the first eight
12120 expressions, since it can't handle the possibly variable
12121 length fields that follow. However, if you omit the optional
12122 fields, the assembler outputs zeros for all optional fields
12123 anyways, giving each variable length field is minimum length
12124 (as defined in sys/debug.h). Thus we can not use the .tbtab
12125 pseudo-op at all. */
12126
12127 /* An all-zero word flags the start of the tbtab, for debuggers
12128 that have to find it by searching forward from the entry
12129 point or from the current pc. */
19d2d16f 12130 fputs ("\t.long 0\n", file);
314fc5a9
ILT
12131
12132 /* Tbtab format type. Use format type 0. */
19d2d16f 12133 fputs ("\t.byte 0,", file);
314fc5a9
ILT
12134
12135 /* Language type. Unfortunately, there doesn't seem to be any
12136 official way to get this info, so we use language_string. C
12137 is 0. C++ is 9. No number defined for Obj-C, so use the
9517ead8 12138 value for C for now. There is no official value for Java,
6f573ff9 12139 although IBM appears to be using 13. There is no official value
f710504c 12140 for Chill, so we've chosen 44 pseudo-randomly. */
314fc5a9 12141 if (! strcmp (language_string, "GNU C")
e2c953b6 12142 || ! strcmp (language_string, "GNU Objective-C"))
314fc5a9
ILT
12143 i = 0;
12144 else if (! strcmp (language_string, "GNU F77"))
12145 i = 1;
12146 else if (! strcmp (language_string, "GNU Ada"))
12147 i = 3;
8b83775b 12148 else if (! strcmp (language_string, "GNU Pascal"))
314fc5a9
ILT
12149 i = 2;
12150 else if (! strcmp (language_string, "GNU C++"))
12151 i = 9;
9517ead8
AG
12152 else if (! strcmp (language_string, "GNU Java"))
12153 i = 13;
6f573ff9
JL
12154 else if (! strcmp (language_string, "GNU CHILL"))
12155 i = 44;
314fc5a9
ILT
12156 else
12157 abort ();
12158 fprintf (file, "%d,", i);
12159
12160 /* 8 single bit fields: global linkage (not set for C extern linkage,
12161 apparently a PL/I convention?), out-of-line epilogue/prologue, offset
12162 from start of procedure stored in tbtab, internal function, function
12163 has controlled storage, function has no toc, function uses fp,
12164 function logs/aborts fp operations. */
12165 /* Assume that fp operations are used if any fp reg must be saved. */
6041bf2f
DE
12166 fprintf (file, "%d,",
12167 (optional_tbtab << 5) | ((info->first_fp_reg_save != 64) << 1));
314fc5a9
ILT
12168
12169 /* 6 bitfields: function is interrupt handler, name present in
12170 proc table, function calls alloca, on condition directives
12171 (controls stack walks, 3 bits), saves condition reg, saves
12172 link reg. */
12173 /* The `function calls alloca' bit seems to be set whenever reg 31 is
12174 set up as a frame pointer, even when there is no alloca call. */
12175 fprintf (file, "%d,",
6041bf2f
DE
12176 ((optional_tbtab << 6)
12177 | ((optional_tbtab & frame_pointer_needed) << 5)
12178 | (info->cr_save_p << 1)
12179 | (info->lr_save_p)));
314fc5a9 12180
6041bf2f 12181 /* 3 bitfields: saves backchain, fixup code, number of fpr saved
314fc5a9
ILT
12182 (6 bits). */
12183 fprintf (file, "%d,",
4697a36c 12184 (info->push_p << 7) | (64 - info->first_fp_reg_save));
314fc5a9
ILT
12185
12186 /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits). */
12187 fprintf (file, "%d,", (32 - first_reg_to_save ()));
12188
6041bf2f
DE
12189 if (optional_tbtab)
12190 {
12191 /* Compute the parameter info from the function decl argument
12192 list. */
12193 tree decl;
12194 int next_parm_info_bit = 31;
314fc5a9 12195
6041bf2f
DE
12196 for (decl = DECL_ARGUMENTS (current_function_decl);
12197 decl; decl = TREE_CHAIN (decl))
12198 {
12199 rtx parameter = DECL_INCOMING_RTL (decl);
12200 enum machine_mode mode = GET_MODE (parameter);
314fc5a9 12201
6041bf2f
DE
12202 if (GET_CODE (parameter) == REG)
12203 {
12204 if (GET_MODE_CLASS (mode) == MODE_FLOAT)
12205 {
12206 int bits;
12207
12208 float_parms++;
12209
12210 if (mode == SFmode)
12211 bits = 0x2;
fcce224d 12212 else if (mode == DFmode || mode == TFmode)
6041bf2f
DE
12213 bits = 0x3;
12214 else
12215 abort ();
12216
12217 /* If only one bit will fit, don't or in this entry. */
12218 if (next_parm_info_bit > 0)
12219 parm_info |= (bits << (next_parm_info_bit - 1));
12220 next_parm_info_bit -= 2;
12221 }
12222 else
12223 {
12224 fixed_parms += ((GET_MODE_SIZE (mode)
12225 + (UNITS_PER_WORD - 1))
12226 / UNITS_PER_WORD);
12227 next_parm_info_bit -= 1;
12228 }
12229 }
12230 }
12231 }
314fc5a9
ILT
12232
12233 /* Number of fixed point parameters. */
12234 /* This is actually the number of words of fixed point parameters; thus
12235 an 8 byte struct counts as 2; and thus the maximum value is 8. */
12236 fprintf (file, "%d,", fixed_parms);
12237
12238 /* 2 bitfields: number of floating point parameters (7 bits), parameters
12239 all on stack. */
12240 /* This is actually the number of fp registers that hold parameters;
12241 and thus the maximum value is 13. */
12242 /* Set parameters on stack bit if parameters are not in their original
12243 registers, regardless of whether they are on the stack? Xlc
12244 seems to set the bit when not optimizing. */
12245 fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
12246
6041bf2f
DE
12247 if (! optional_tbtab)
12248 return;
12249
314fc5a9
ILT
12250 /* Optional fields follow. Some are variable length. */
12251
12252 /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
12253 11 double float. */
12254 /* There is an entry for each parameter in a register, in the order that
12255 they occur in the parameter list. Any intervening arguments on the
12256 stack are ignored. If the list overflows a long (max possible length
12257 34 bits) then completely leave off all elements that don't fit. */
12258 /* Only emit this long if there was at least one parameter. */
12259 if (fixed_parms || float_parms)
12260 fprintf (file, "\t.long %d\n", parm_info);
12261
12262 /* Offset from start of code to tb table. */
19d2d16f 12263 fputs ("\t.long ", file);
314fc5a9 12264 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
54ee9799
DE
12265#if TARGET_AIX
12266 RS6000_OUTPUT_BASENAME (file, fname);
12267#else
9ebbca7d 12268 assemble_name (file, fname);
54ee9799 12269#endif
19d2d16f 12270 fputs ("-.", file);
54ee9799
DE
12271#if TARGET_AIX
12272 RS6000_OUTPUT_BASENAME (file, fname);
12273#else
9ebbca7d 12274 assemble_name (file, fname);
54ee9799 12275#endif
19d2d16f 12276 putc ('\n', file);
314fc5a9
ILT
12277
12278 /* Interrupt handler mask. */
12279 /* Omit this long, since we never set the interrupt handler bit
12280 above. */
12281
12282 /* Number of CTL (controlled storage) anchors. */
12283 /* Omit this long, since the has_ctl bit is never set above. */
12284
12285 /* Displacement into stack of each CTL anchor. */
12286 /* Omit this list of longs, because there are no CTL anchors. */
12287
12288 /* Length of function name. */
69c75916
AM
12289 if (*fname == '*')
12290 ++fname;
296b8152 12291 fprintf (file, "\t.short %d\n", (int) strlen (fname));
314fc5a9
ILT
12292
12293 /* Function name. */
12294 assemble_string (fname, strlen (fname));
12295
12296 /* Register for alloca automatic storage; this is always reg 31.
12297 Only emit this if the alloca bit was set above. */
12298 if (frame_pointer_needed)
19d2d16f 12299 fputs ("\t.byte 31\n", file);
b1765bde
DE
12300
12301 fputs ("\t.align 2\n", file);
9b30bae2 12302 }
9878760c 12303}
17167fd8 12304\f
a4f6c312
SS
12305/* A C compound statement that outputs the assembler code for a thunk
12306 function, used to implement C++ virtual function calls with
12307 multiple inheritance. The thunk acts as a wrapper around a virtual
12308 function, adjusting the implicit object parameter before handing
12309 control off to the real function.
12310
12311 First, emit code to add the integer DELTA to the location that
12312 contains the incoming first argument. Assume that this argument
12313 contains a pointer, and is the one used to pass the `this' pointer
12314 in C++. This is the incoming argument *before* the function
12315 prologue, e.g. `%o0' on a sparc. The addition must preserve the
12316 values of all other incoming arguments.
17167fd8
MM
12317
12318 After the addition, emit code to jump to FUNCTION, which is a
a4f6c312
SS
12319 `FUNCTION_DECL'. This is a direct pure jump, not a call, and does
12320 not touch the return address. Hence returning from FUNCTION will
12321 return to whoever called the current `thunk'.
17167fd8 12322
a4f6c312
SS
12323 The effect must be as if FUNCTION had been called directly with the
12324 adjusted first argument. This macro is responsible for emitting
12325 all of the code for a thunk function; output_function_prologue()
12326 and output_function_epilogue() are not invoked.
17167fd8 12327
a4f6c312
SS
12328 The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already
12329 been extracted from it.) It might possibly be useful on some
12330 targets, but probably not.
17167fd8 12331
a4f6c312
SS
12332 If you do not define this macro, the target-independent code in the
12333 C++ frontend will generate a less efficient heavyweight thunk that
12334 calls FUNCTION instead of jumping to it. The generic approach does
12335 not support varargs. */
17167fd8 12336
3961e8fe
RH
12337static void
12338rs6000_output_mi_thunk (file, thunk_fndecl, delta, vcall_offset, function)
17167fd8 12339 FILE *file;
d330fd93 12340 tree thunk_fndecl ATTRIBUTE_UNUSED;
eb0424da 12341 HOST_WIDE_INT delta;
5b71a4e7 12342 HOST_WIDE_INT vcall_offset;
17167fd8
MM
12343 tree function;
12344{
5b71a4e7 12345 rtx this, insn, funexp;
17167fd8 12346
5b71a4e7 12347 reload_completed = 1;
fe3ad572 12348 epilogue_completed = 1;
5b71a4e7 12349 no_new_pseudos = 1;
56a7189a 12350
5b71a4e7 12351 /* Mark the end of the (empty) prologue. */
2e040219 12352 emit_note (NOTE_INSN_PROLOGUE_END);
17167fd8 12353
5b71a4e7
DE
12354 /* Find the "this" pointer. If the function returns a structure,
12355 the structure return pointer is in r3. */
12356 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function))))
12357 this = gen_rtx_REG (Pmode, 4);
56a7189a 12358 else
5b71a4e7 12359 this = gen_rtx_REG (Pmode, 3);
17167fd8 12360
5b71a4e7
DE
12361 /* Apply the constant offset, if required. */
12362 if (delta)
12363 {
12364 rtx delta_rtx = GEN_INT (delta);
12365 emit_insn (TARGET_32BIT
12366 ? gen_addsi3 (this, this, delta_rtx)
12367 : gen_adddi3 (this, this, delta_rtx));
17167fd8
MM
12368 }
12369
5b71a4e7
DE
12370 /* Apply the offset from the vtable, if required. */
12371 if (vcall_offset)
17167fd8 12372 {
5b71a4e7
DE
12373 rtx vcall_offset_rtx = GEN_INT (vcall_offset);
12374 rtx tmp = gen_rtx_REG (Pmode, 12);
17167fd8 12375
5b71a4e7 12376 emit_move_insn (tmp, gen_rtx_MEM (Pmode, this));
eeff9307
JJ
12377 if (((unsigned HOST_WIDE_INT) vcall_offset) + 0x8000 >= 0x10000)
12378 {
12379 emit_insn (TARGET_32BIT
12380 ? gen_addsi3 (tmp, tmp, vcall_offset_rtx)
12381 : gen_adddi3 (tmp, tmp, vcall_offset_rtx));
12382 emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
12383 }
12384 else
12385 {
12386 rtx loc = gen_rtx_PLUS (Pmode, tmp, vcall_offset_rtx);
12387
12388 emit_move_insn (tmp, gen_rtx_MEM (Pmode, loc));
12389 }
5b71a4e7
DE
12390 emit_insn (TARGET_32BIT
12391 ? gen_addsi3 (this, this, tmp)
12392 : gen_adddi3 (this, this, tmp));
17167fd8
MM
12393 }
12394
5b71a4e7
DE
12395 /* Generate a tail call to the target function. */
12396 if (!TREE_USED (function))
12397 {
12398 assemble_external (function);
12399 TREE_USED (function) = 1;
12400 }
12401 funexp = XEXP (DECL_RTL (function), 0);
5b71a4e7 12402 funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
ee890fe2
SS
12403
12404#if TARGET_MACHO
ab82a49f 12405 if (MACHOPIC_INDIRECT)
5b71a4e7 12406 funexp = machopic_indirect_call_target (funexp);
ee890fe2 12407#endif
5b71a4e7
DE
12408
12409 /* gen_sibcall expects reload to convert scratch pseudo to LR so we must
12410 generate sibcall RTL explicitly to avoid constraint abort. */
12411 insn = emit_call_insn (
12412 gen_rtx_PARALLEL (VOIDmode,
12413 gen_rtvec (4,
12414 gen_rtx_CALL (VOIDmode,
12415 funexp, const0_rtx),
12416 gen_rtx_USE (VOIDmode, const0_rtx),
12417 gen_rtx_USE (VOIDmode,
12418 gen_rtx_REG (SImode,
12419 LINK_REGISTER_REGNUM)),
12420 gen_rtx_RETURN (VOIDmode))));
12421 SIBLING_CALL_P (insn) = 1;
12422 emit_barrier ();
12423
12424 /* Run just enough of rest_of_compilation to get the insns emitted.
12425 There's not really enough bulk here to make other passes such as
12426 instruction scheduling worth while. Note that use_thunk calls
12427 assemble_start_function and assemble_end_function. */
12428 insn = get_insns ();
a2855205 12429 insn_locators_initialize ();
5b71a4e7
DE
12430 shorten_branches (insn);
12431 final_start_function (insn, file, 1);
12432 final (insn, file, 1, 0);
12433 final_end_function ();
12434
12435 reload_completed = 0;
fe3ad572 12436 epilogue_completed = 0;
5b71a4e7 12437 no_new_pseudos = 0;
9ebbca7d 12438}
9ebbca7d
GK
12439\f
12440/* A quick summary of the various types of 'constant-pool tables'
12441 under PowerPC:
12442
12443 Target Flags Name One table per
12444 AIX (none) AIX TOC object file
12445 AIX -mfull-toc AIX TOC object file
12446 AIX -mminimal-toc AIX minimal TOC translation unit
12447 SVR4/EABI (none) SVR4 SDATA object file
12448 SVR4/EABI -fpic SVR4 pic object file
12449 SVR4/EABI -fPIC SVR4 PIC translation unit
12450 SVR4/EABI -mrelocatable EABI TOC function
12451 SVR4/EABI -maix AIX TOC object file
12452 SVR4/EABI -maix -mminimal-toc
12453 AIX minimal TOC translation unit
12454
12455 Name Reg. Set by entries contains:
12456 made by addrs? fp? sum?
12457
12458 AIX TOC 2 crt0 as Y option option
12459 AIX minimal TOC 30 prolog gcc Y Y option
12460 SVR4 SDATA 13 crt0 gcc N Y N
12461 SVR4 pic 30 prolog ld Y not yet N
12462 SVR4 PIC 30 prolog gcc Y option option
12463 EABI TOC 30 prolog gcc Y option option
12464
12465*/
12466
9ebbca7d
GK
12467/* Hash functions for the hash table. */
12468
12469static unsigned
12470rs6000_hash_constant (k)
12471 rtx k;
12472{
46b33600
RH
12473 enum rtx_code code = GET_CODE (k);
12474 enum machine_mode mode = GET_MODE (k);
12475 unsigned result = (code << 3) ^ mode;
12476 const char *format;
12477 int flen, fidx;
9ebbca7d 12478
46b33600
RH
12479 format = GET_RTX_FORMAT (code);
12480 flen = strlen (format);
12481 fidx = 0;
9ebbca7d 12482
46b33600
RH
12483 switch (code)
12484 {
12485 case LABEL_REF:
12486 return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
12487
12488 case CONST_DOUBLE:
12489 if (mode != VOIDmode)
12490 return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
12491 flen = 2;
12492 break;
12493
12494 case CODE_LABEL:
12495 fidx = 3;
12496 break;
12497
12498 default:
12499 break;
12500 }
9ebbca7d
GK
12501
12502 for (; fidx < flen; fidx++)
12503 switch (format[fidx])
12504 {
12505 case 's':
12506 {
12507 unsigned i, len;
12508 const char *str = XSTR (k, fidx);
12509 len = strlen (str);
12510 result = result * 613 + len;
12511 for (i = 0; i < len; i++)
12512 result = result * 613 + (unsigned) str[i];
17167fd8
MM
12513 break;
12514 }
9ebbca7d
GK
12515 case 'u':
12516 case 'e':
12517 result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
12518 break;
12519 case 'i':
12520 case 'n':
12521 result = result * 613 + (unsigned) XINT (k, fidx);
12522 break;
12523 case 'w':
12524 if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
12525 result = result * 613 + (unsigned) XWINT (k, fidx);
12526 else
12527 {
12528 size_t i;
12529 for (i = 0; i < sizeof(HOST_WIDE_INT)/sizeof(unsigned); i++)
12530 result = result * 613 + (unsigned) (XWINT (k, fidx)
12531 >> CHAR_BIT * i);
12532 }
12533 break;
09501938
DE
12534 case '0':
12535 break;
9ebbca7d 12536 default:
a4f6c312 12537 abort ();
9ebbca7d 12538 }
46b33600 12539
9ebbca7d
GK
12540 return result;
12541}
12542
12543static unsigned
12544toc_hash_function (hash_entry)
12545 const void * hash_entry;
12546{
a9098fd0
GK
12547 const struct toc_hash_struct *thc =
12548 (const struct toc_hash_struct *) hash_entry;
12549 return rs6000_hash_constant (thc->key) ^ thc->key_mode;
9ebbca7d
GK
12550}
12551
12552/* Compare H1 and H2 for equivalence. */
12553
12554static int
12555toc_hash_eq (h1, h2)
12556 const void * h1;
12557 const void * h2;
12558{
12559 rtx r1 = ((const struct toc_hash_struct *) h1)->key;
12560 rtx r2 = ((const struct toc_hash_struct *) h2)->key;
12561
a9098fd0
GK
12562 if (((const struct toc_hash_struct *) h1)->key_mode
12563 != ((const struct toc_hash_struct *) h2)->key_mode)
12564 return 0;
12565
5692c7bc 12566 return rtx_equal_p (r1, r2);
9ebbca7d
GK
12567}
12568
28e510bd
MM
12569/* These are the names given by the C++ front-end to vtables, and
12570 vtable-like objects. Ideally, this logic should not be here;
12571 instead, there should be some programmatic way of inquiring as
12572 to whether or not an object is a vtable. */
12573
12574#define VTABLE_NAME_P(NAME) \
12575 (strncmp ("_vt.", name, strlen("_vt.")) == 0 \
12576 || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0 \
12577 || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0 \
12578 || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
12579
12580void
12581rs6000_output_symbol_ref (file, x)
12582 FILE *file;
12583 rtx x;
12584{
12585 /* Currently C++ toc references to vtables can be emitted before it
12586 is decided whether the vtable is public or private. If this is
12587 the case, then the linker will eventually complain that there is
12588 a reference to an unknown section. Thus, for vtables only,
12589 we emit the TOC reference to reference the symbol and not the
12590 section. */
12591 const char *name = XSTR (x, 0);
54ee9799
DE
12592
12593 if (VTABLE_NAME_P (name))
12594 {
12595 RS6000_OUTPUT_BASENAME (file, name);
12596 }
12597 else
12598 assemble_name (file, name);
28e510bd
MM
12599}
12600
a4f6c312
SS
12601/* Output a TOC entry. We derive the entry name from what is being
12602 written. */
9878760c
RK
12603
12604void
a9098fd0 12605output_toc (file, x, labelno, mode)
9878760c
RK
12606 FILE *file;
12607 rtx x;
12608 int labelno;
a9098fd0 12609 enum machine_mode mode;
9878760c
RK
12610{
12611 char buf[256];
3cce094d 12612 const char *name = buf;
ec940faa 12613 const char *real_name;
9878760c
RK
12614 rtx base = x;
12615 int offset = 0;
12616
4697a36c
MM
12617 if (TARGET_NO_TOC)
12618 abort ();
12619
9ebbca7d
GK
12620 /* When the linker won't eliminate them, don't output duplicate
12621 TOC entries (this happens on AIX if there is any kind of TOC,
17211ab5
GK
12622 and on SVR4 under -fPIC or -mrelocatable). Don't do this for
12623 CODE_LABELs. */
12624 if (TARGET_TOC && GET_CODE (x) != LABEL_REF)
9ebbca7d
GK
12625 {
12626 struct toc_hash_struct *h;
12627 void * * found;
12628
17211ab5 12629 /* Create toc_hash_table. This can't be done at OVERRIDE_OPTIONS
39e3f58c 12630 time because GGC is not initialized at that point. */
17211ab5
GK
12631 if (toc_hash_table == NULL)
12632 toc_hash_table = htab_create_ggc (1021, toc_hash_function,
12633 toc_hash_eq, NULL);
12634
9ebbca7d
GK
12635 h = ggc_alloc (sizeof (*h));
12636 h->key = x;
a9098fd0 12637 h->key_mode = mode;
9ebbca7d
GK
12638 h->labelno = labelno;
12639
12640 found = htab_find_slot (toc_hash_table, h, 1);
12641 if (*found == NULL)
12642 *found = h;
12643 else /* This is indeed a duplicate.
12644 Set this label equal to that label. */
12645 {
12646 fputs ("\t.set ", file);
12647 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
12648 fprintf (file, "%d,", labelno);
12649 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
12650 fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
12651 found)->labelno));
12652 return;
12653 }
12654 }
12655
12656 /* If we're going to put a double constant in the TOC, make sure it's
12657 aligned properly when strict alignment is on. */
ff1720ed
RK
12658 if (GET_CODE (x) == CONST_DOUBLE
12659 && STRICT_ALIGNMENT
a9098fd0 12660 && GET_MODE_BITSIZE (mode) >= 64
ff1720ed
RK
12661 && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
12662 ASM_OUTPUT_ALIGN (file, 3);
12663 }
12664
4977bab6 12665 (*targetm.asm_out.internal_label) (file, "LC", labelno);
9878760c 12666
37c37a57
RK
12667 /* Handle FP constants specially. Note that if we have a minimal
12668 TOC, things we put here aren't actually in the TOC, so we can allow
12669 FP constants. */
fcce224d
DE
12670 if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == TFmode)
12671 {
12672 REAL_VALUE_TYPE rv;
12673 long k[4];
12674
12675 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
12676 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
12677
12678 if (TARGET_64BIT)
12679 {
12680 if (TARGET_MINIMAL_TOC)
12681 fputs (DOUBLE_INT_ASM_OP, file);
12682 else
12683 fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
12684 k[0] & 0xffffffff, k[1] & 0xffffffff,
12685 k[2] & 0xffffffff, k[3] & 0xffffffff);
12686 fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
12687 k[0] & 0xffffffff, k[1] & 0xffffffff,
12688 k[2] & 0xffffffff, k[3] & 0xffffffff);
12689 return;
12690 }
12691 else
12692 {
12693 if (TARGET_MINIMAL_TOC)
12694 fputs ("\t.long ", file);
12695 else
12696 fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
12697 k[0] & 0xffffffff, k[1] & 0xffffffff,
12698 k[2] & 0xffffffff, k[3] & 0xffffffff);
12699 fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
12700 k[0] & 0xffffffff, k[1] & 0xffffffff,
12701 k[2] & 0xffffffff, k[3] & 0xffffffff);
12702 return;
12703 }
12704 }
12705 else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
9878760c 12706 {
042259f2
DE
12707 REAL_VALUE_TYPE rv;
12708 long k[2];
0adc764e 12709
042259f2
DE
12710 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
12711 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
31bfaa0b 12712
13ded975
DE
12713 if (TARGET_64BIT)
12714 {
12715 if (TARGET_MINIMAL_TOC)
2bfcf297 12716 fputs (DOUBLE_INT_ASM_OP, file);
13ded975 12717 else
2f0552b6
AM
12718 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
12719 k[0] & 0xffffffff, k[1] & 0xffffffff);
12720 fprintf (file, "0x%lx%08lx\n",
12721 k[0] & 0xffffffff, k[1] & 0xffffffff);
13ded975
DE
12722 return;
12723 }
1875cc88 12724 else
13ded975
DE
12725 {
12726 if (TARGET_MINIMAL_TOC)
2bfcf297 12727 fputs ("\t.long ", file);
13ded975 12728 else
2f0552b6
AM
12729 fprintf (file, "\t.tc FD_%lx_%lx[TC],",
12730 k[0] & 0xffffffff, k[1] & 0xffffffff);
12731 fprintf (file, "0x%lx,0x%lx\n",
12732 k[0] & 0xffffffff, k[1] & 0xffffffff);
13ded975
DE
12733 return;
12734 }
9878760c 12735 }
a9098fd0 12736 else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
9878760c 12737 {
042259f2
DE
12738 REAL_VALUE_TYPE rv;
12739 long l;
9878760c 12740
042259f2
DE
12741 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
12742 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
12743
31bfaa0b
DE
12744 if (TARGET_64BIT)
12745 {
12746 if (TARGET_MINIMAL_TOC)
2bfcf297 12747 fputs (DOUBLE_INT_ASM_OP, file);
31bfaa0b 12748 else
2f0552b6
AM
12749 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
12750 fprintf (file, "0x%lx00000000\n", l & 0xffffffff);
31bfaa0b
DE
12751 return;
12752 }
042259f2 12753 else
31bfaa0b
DE
12754 {
12755 if (TARGET_MINIMAL_TOC)
2bfcf297 12756 fputs ("\t.long ", file);
31bfaa0b 12757 else
2f0552b6
AM
12758 fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
12759 fprintf (file, "0x%lx\n", l & 0xffffffff);
31bfaa0b
DE
12760 return;
12761 }
042259f2 12762 }
f176e826 12763 else if (GET_MODE (x) == VOIDmode
a9098fd0 12764 && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
042259f2 12765 {
e2c953b6 12766 unsigned HOST_WIDE_INT low;
042259f2
DE
12767 HOST_WIDE_INT high;
12768
12769 if (GET_CODE (x) == CONST_DOUBLE)
12770 {
12771 low = CONST_DOUBLE_LOW (x);
12772 high = CONST_DOUBLE_HIGH (x);
12773 }
12774 else
12775#if HOST_BITS_PER_WIDE_INT == 32
12776 {
12777 low = INTVAL (x);
0858c623 12778 high = (low & 0x80000000) ? ~0 : 0;
042259f2
DE
12779 }
12780#else
12781 {
0858c623 12782 low = INTVAL (x) & 0xffffffff;
042259f2
DE
12783 high = (HOST_WIDE_INT) INTVAL (x) >> 32;
12784 }
12785#endif
9878760c 12786
a9098fd0
GK
12787 /* TOC entries are always Pmode-sized, but since this
12788 is a bigendian machine then if we're putting smaller
12789 integer constants in the TOC we have to pad them.
12790 (This is still a win over putting the constants in
12791 a separate constant pool, because then we'd have
02a4ec28
FS
12792 to have both a TOC entry _and_ the actual constant.)
12793
12794 For a 32-bit target, CONST_INT values are loaded and shifted
12795 entirely within `low' and can be stored in one TOC entry. */
12796
12797 if (TARGET_64BIT && POINTER_SIZE < GET_MODE_BITSIZE (mode))
a9098fd0 12798 abort ();/* It would be easy to make this work, but it doesn't now. */
02a4ec28
FS
12799
12800 if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
fb52d8de
AM
12801 {
12802#if HOST_BITS_PER_WIDE_INT == 32
12803 lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
12804 POINTER_SIZE, &low, &high, 0);
12805#else
12806 low |= high << 32;
12807 low <<= POINTER_SIZE - GET_MODE_BITSIZE (mode);
12808 high = (HOST_WIDE_INT) low >> 32;
12809 low &= 0xffffffff;
12810#endif
12811 }
a9098fd0 12812
13ded975
DE
12813 if (TARGET_64BIT)
12814 {
12815 if (TARGET_MINIMAL_TOC)
2bfcf297 12816 fputs (DOUBLE_INT_ASM_OP, file);
13ded975 12817 else
2f0552b6
AM
12818 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
12819 (long) high & 0xffffffff, (long) low & 0xffffffff);
12820 fprintf (file, "0x%lx%08lx\n",
12821 (long) high & 0xffffffff, (long) low & 0xffffffff);
13ded975
DE
12822 return;
12823 }
1875cc88 12824 else
13ded975 12825 {
02a4ec28
FS
12826 if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
12827 {
12828 if (TARGET_MINIMAL_TOC)
2bfcf297 12829 fputs ("\t.long ", file);
02a4ec28 12830 else
2bfcf297 12831 fprintf (file, "\t.tc ID_%lx_%lx[TC],",
2f0552b6
AM
12832 (long) high & 0xffffffff, (long) low & 0xffffffff);
12833 fprintf (file, "0x%lx,0x%lx\n",
12834 (long) high & 0xffffffff, (long) low & 0xffffffff);
02a4ec28 12835 }
13ded975 12836 else
02a4ec28
FS
12837 {
12838 if (TARGET_MINIMAL_TOC)
2bfcf297 12839 fputs ("\t.long ", file);
02a4ec28 12840 else
2f0552b6
AM
12841 fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
12842 fprintf (file, "0x%lx\n", (long) low & 0xffffffff);
02a4ec28 12843 }
13ded975
DE
12844 return;
12845 }
9878760c
RK
12846 }
12847
12848 if (GET_CODE (x) == CONST)
12849 {
2bfcf297
DB
12850 if (GET_CODE (XEXP (x, 0)) != PLUS)
12851 abort ();
12852
9878760c
RK
12853 base = XEXP (XEXP (x, 0), 0);
12854 offset = INTVAL (XEXP (XEXP (x, 0), 1));
12855 }
12856
12857 if (GET_CODE (base) == SYMBOL_REF)
12858 name = XSTR (base, 0);
12859 else if (GET_CODE (base) == LABEL_REF)
12860 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (XEXP (base, 0)));
12861 else if (GET_CODE (base) == CODE_LABEL)
12862 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
12863 else
12864 abort ();
12865
772c5265 12866 real_name = (*targetm.strip_name_encoding) (name);
1875cc88 12867 if (TARGET_MINIMAL_TOC)
2bfcf297 12868 fputs (TARGET_32BIT ? "\t.long " : DOUBLE_INT_ASM_OP, file);
1875cc88
JW
12869 else
12870 {
b6c9286a 12871 fprintf (file, "\t.tc %s", real_name);
9878760c 12872
1875cc88
JW
12873 if (offset < 0)
12874 fprintf (file, ".N%d", - offset);
12875 else if (offset)
12876 fprintf (file, ".P%d", offset);
9878760c 12877
19d2d16f 12878 fputs ("[TC],", file);
1875cc88 12879 }
581bc4de
MM
12880
12881 /* Currently C++ toc references to vtables can be emitted before it
12882 is decided whether the vtable is public or private. If this is
12883 the case, then the linker will eventually complain that there is
12884 a TOC reference to an unknown section. Thus, for vtables only,
12885 we emit the TOC reference to reference the symbol and not the
12886 section. */
28e510bd 12887 if (VTABLE_NAME_P (name))
581bc4de 12888 {
54ee9799 12889 RS6000_OUTPUT_BASENAME (file, name);
581bc4de
MM
12890 if (offset < 0)
12891 fprintf (file, "%d", offset);
12892 else if (offset > 0)
12893 fprintf (file, "+%d", offset);
12894 }
12895 else
12896 output_addr_const (file, x);
19d2d16f 12897 putc ('\n', file);
9878760c
RK
12898}
12899\f
12900/* Output an assembler pseudo-op to write an ASCII string of N characters
12901 starting at P to FILE.
12902
12903 On the RS/6000, we have to do this using the .byte operation and
12904 write out special characters outside the quoted string.
12905 Also, the assembler is broken; very long strings are truncated,
a4f6c312 12906 so we must artificially break them up early. */
9878760c
RK
12907
12908void
12909output_ascii (file, p, n)
12910 FILE *file;
d330fd93 12911 const char *p;
9878760c
RK
12912 int n;
12913{
12914 char c;
12915 int i, count_string;
d330fd93
KG
12916 const char *for_string = "\t.byte \"";
12917 const char *for_decimal = "\t.byte ";
12918 const char *to_close = NULL;
9878760c
RK
12919
12920 count_string = 0;
12921 for (i = 0; i < n; i++)
12922 {
12923 c = *p++;
12924 if (c >= ' ' && c < 0177)
12925 {
12926 if (for_string)
12927 fputs (for_string, file);
12928 putc (c, file);
12929
12930 /* Write two quotes to get one. */
12931 if (c == '"')
12932 {
12933 putc (c, file);
12934 ++count_string;
12935 }
12936
12937 for_string = NULL;
12938 for_decimal = "\"\n\t.byte ";
12939 to_close = "\"\n";
12940 ++count_string;
12941
12942 if (count_string >= 512)
12943 {
12944 fputs (to_close, file);
12945
12946 for_string = "\t.byte \"";
12947 for_decimal = "\t.byte ";
12948 to_close = NULL;
12949 count_string = 0;
12950 }
12951 }
12952 else
12953 {
12954 if (for_decimal)
12955 fputs (for_decimal, file);
12956 fprintf (file, "%d", c);
12957
12958 for_string = "\n\t.byte \"";
12959 for_decimal = ", ";
12960 to_close = "\n";
12961 count_string = 0;
12962 }
12963 }
12964
12965 /* Now close the string if we have written one. Then end the line. */
12966 if (to_close)
9ebbca7d 12967 fputs (to_close, file);
9878760c
RK
12968}
12969\f
12970/* Generate a unique section name for FILENAME for a section type
12971 represented by SECTION_DESC. Output goes into BUF.
12972
12973 SECTION_DESC can be any string, as long as it is different for each
12974 possible section type.
12975
12976 We name the section in the same manner as xlc. The name begins with an
12977 underscore followed by the filename (after stripping any leading directory
11e5fe42
RK
12978 names) with the last period replaced by the string SECTION_DESC. If
12979 FILENAME does not contain a period, SECTION_DESC is appended to the end of
12980 the name. */
9878760c
RK
12981
12982void
12983rs6000_gen_section_name (buf, filename, section_desc)
12984 char **buf;
9ebbca7d
GK
12985 const char *filename;
12986 const char *section_desc;
9878760c 12987{
9ebbca7d 12988 const char *q, *after_last_slash, *last_period = 0;
9878760c
RK
12989 char *p;
12990 int len;
9878760c
RK
12991
12992 after_last_slash = filename;
12993 for (q = filename; *q; q++)
11e5fe42
RK
12994 {
12995 if (*q == '/')
12996 after_last_slash = q + 1;
12997 else if (*q == '.')
12998 last_period = q;
12999 }
9878760c 13000
11e5fe42 13001 len = strlen (after_last_slash) + strlen (section_desc) + 2;
6d9f628e 13002 *buf = (char *) xmalloc (len);
9878760c
RK
13003
13004 p = *buf;
13005 *p++ = '_';
13006
13007 for (q = after_last_slash; *q; q++)
13008 {
11e5fe42 13009 if (q == last_period)
9878760c
RK
13010 {
13011 strcpy (p, section_desc);
13012 p += strlen (section_desc);
e3981aab 13013 break;
9878760c
RK
13014 }
13015
e9a780ec 13016 else if (ISALNUM (*q))
9878760c
RK
13017 *p++ = *q;
13018 }
13019
11e5fe42 13020 if (last_period == 0)
9878760c
RK
13021 strcpy (p, section_desc);
13022 else
13023 *p = '\0';
13024}
e165f3f0 13025\f
a4f6c312 13026/* Emit profile function. */
411707f4 13027
411707f4
CC
13028void
13029output_profile_hook (labelno)
57ac7be9 13030 int labelno ATTRIBUTE_UNUSED;
411707f4 13031{
ffcfcb5f
AM
13032 if (TARGET_PROFILE_KERNEL)
13033 return;
13034
8480e480
CC
13035 if (DEFAULT_ABI == ABI_AIX)
13036 {
9739c90c
JJ
13037#ifndef NO_PROFILE_COUNTERS
13038# define NO_PROFILE_COUNTERS 0
13039#endif
13040 if (NO_PROFILE_COUNTERS)
13041 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 0);
13042 else
13043 {
13044 char buf[30];
13045 const char *label_name;
13046 rtx fun;
411707f4 13047
9739c90c
JJ
13048 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
13049 label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
13050 fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
411707f4 13051
9739c90c
JJ
13052 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 1,
13053 fun, Pmode);
13054 }
8480e480 13055 }
ee890fe2
SS
13056 else if (DEFAULT_ABI == ABI_DARWIN)
13057 {
d5fa86ba 13058 const char *mcount_name = RS6000_MCOUNT;
ee890fe2
SS
13059 int caller_addr_regno = LINK_REGISTER_REGNUM;
13060
13061 /* Be conservative and always set this, at least for now. */
13062 current_function_uses_pic_offset_table = 1;
13063
13064#if TARGET_MACHO
13065 /* For PIC code, set up a stub and collect the caller's address
13066 from r0, which is where the prologue puts it. */
ab82a49f 13067 if (MACHOPIC_INDIRECT)
ee890fe2
SS
13068 {
13069 mcount_name = machopic_stub_name (mcount_name);
13070 if (current_function_uses_pic_offset_table)
13071 caller_addr_regno = 0;
13072 }
13073#endif
13074 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
13075 0, VOIDmode, 1,
13076 gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
13077 }
411707f4
CC
13078}
13079
a4f6c312 13080/* Write function profiler code. */
e165f3f0
RK
13081
13082void
13083output_function_profiler (file, labelno)
13084 FILE *file;
13085 int labelno;
13086{
3daf36a4 13087 char buf[100];
09eeeacb 13088 int save_lr = 8;
e165f3f0 13089
38c1f2d7 13090 switch (DEFAULT_ABI)
3daf36a4 13091 {
38c1f2d7
MM
13092 default:
13093 abort ();
13094
13095 case ABI_V4:
09eeeacb 13096 save_lr = 4;
09eeeacb
AM
13097 if (!TARGET_32BIT)
13098 {
13099 warning ("no profiling of 64-bit code for this ABI");
13100 return;
13101 }
ffcfcb5f 13102 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
38c1f2d7
MM
13103 fprintf (file, "\tmflr %s\n", reg_names[0]);
13104 if (flag_pic == 1)
13105 {
dfdfa60f 13106 fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
09eeeacb
AM
13107 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
13108 reg_names[0], save_lr, reg_names[1]);
17167fd8 13109 asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
dfdfa60f 13110 asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
38c1f2d7 13111 assemble_name (file, buf);
17167fd8 13112 asm_fprintf (file, "@got(%s)\n", reg_names[12]);
38c1f2d7 13113 }
9ebbca7d 13114 else if (flag_pic > 1)
38c1f2d7 13115 {
09eeeacb
AM
13116 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
13117 reg_names[0], save_lr, reg_names[1]);
9ebbca7d
GK
13118 /* Now, we need to get the address of the label. */
13119 fputs ("\tbl 1f\n\t.long ", file);
034e84c4 13120 assemble_name (file, buf);
9ebbca7d
GK
13121 fputs ("-.\n1:", file);
13122 asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
13123 asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
13124 reg_names[0], reg_names[11]);
13125 asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
13126 reg_names[0], reg_names[0], reg_names[11]);
38c1f2d7 13127 }
38c1f2d7
MM
13128 else
13129 {
17167fd8 13130 asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
38c1f2d7 13131 assemble_name (file, buf);
dfdfa60f 13132 fputs ("@ha\n", file);
09eeeacb
AM
13133 asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
13134 reg_names[0], save_lr, reg_names[1]);
a260abc9 13135 asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
38c1f2d7 13136 assemble_name (file, buf);
17167fd8 13137 asm_fprintf (file, "@l(%s)\n", reg_names[12]);
38c1f2d7
MM
13138 }
13139
50d440bc
NC
13140 /* ABI_V4 saves the static chain reg with ASM_OUTPUT_REG_PUSH. */
13141 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
38c1f2d7
MM
13142 break;
13143
13144 case ABI_AIX:
ee890fe2 13145 case ABI_DARWIN:
ffcfcb5f
AM
13146 if (!TARGET_PROFILE_KERNEL)
13147 {
13148 /* Don't do anything, done in output_profile_hook (). */
13149 }
13150 else
13151 {
13152 if (TARGET_32BIT)
13153 abort ();
13154
13155 asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
13156 asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
13157
13158 if (current_function_needs_context)
13159 {
13160 asm_fprintf (file, "\tstd %s,24(%s)\n",
13161 reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
13162 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
13163 asm_fprintf (file, "\tld %s,24(%s)\n",
13164 reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
13165 }
13166 else
13167 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
13168 }
38c1f2d7
MM
13169 break;
13170 }
e165f3f0 13171}
a251ffd0 13172
b54cf83a
DE
13173\f
13174static int
13175rs6000_use_dfa_pipeline_interface ()
13176{
13177 return 1;
13178}
13179
b54cf83a
DE
13180/* Power4 load update and store update instructions are cracked into a
13181 load or store and an integer insn which are executed in the same cycle.
13182 Branches have their own dispatch slot which does not count against the
13183 GCC issue rate, but it changes the program flow so there are no other
13184 instructions to issue in this cycle. */
13185
13186static int
13187rs6000_variable_issue (stream, verbose, insn, more)
13188 FILE *stream ATTRIBUTE_UNUSED;
13189 int verbose ATTRIBUTE_UNUSED;
13190 rtx insn;
13191 int more;
13192{
13193 if (GET_CODE (PATTERN (insn)) == USE
13194 || GET_CODE (PATTERN (insn)) == CLOBBER)
13195 return more;
13196
13197 if (rs6000_cpu == PROCESSOR_POWER4)
13198 {
13199 enum attr_type type = get_attr_type (insn);
13200 if (type == TYPE_LOAD_EXT_U || type == TYPE_LOAD_EXT_UX
9259f3b0 13201 || type == TYPE_LOAD_UX || type == TYPE_STORE_UX)
b54cf83a
DE
13202 return 0;
13203 else if (type == TYPE_LOAD_U || type == TYPE_STORE_U
13204 || type == TYPE_FPLOAD_U || type == TYPE_FPSTORE_U
9259f3b0
DE
13205 || type == TYPE_FPLOAD_UX || type == TYPE_FPSTORE_UX
13206 || type == TYPE_LOAD_EXT || type == TYPE_DELAYED_CR
13207 || type == TYPE_COMPARE || type == TYPE_DELAYED_COMPARE
13208 || type == TYPE_IMUL_COMPARE || type == TYPE_LMUL_COMPARE
8e8238f1
DE
13209 || type == TYPE_IDIV || type == TYPE_LDIV
13210 || type == TYPE_INSERT_WORD)
3317bab1 13211 return more > 2 ? more - 2 : 0;
b54cf83a 13212 }
165b263e
DE
13213
13214 return more - 1;
b54cf83a
DE
13215}
13216
a251ffd0
TG
13217/* Adjust the cost of a scheduling dependency. Return the new cost of
13218 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
13219
c237e94a 13220static int
a06faf84 13221rs6000_adjust_cost (insn, link, dep_insn, cost)
a251ffd0
TG
13222 rtx insn;
13223 rtx link;
296b8152 13224 rtx dep_insn ATTRIBUTE_UNUSED;
a251ffd0
TG
13225 int cost;
13226{
13227 if (! recog_memoized (insn))
13228 return 0;
13229
13230 if (REG_NOTE_KIND (link) != 0)
13231 return 0;
13232
13233 if (REG_NOTE_KIND (link) == 0)
13234 {
ed947a96
DJ
13235 /* Data dependency; DEP_INSN writes a register that INSN reads
13236 some cycles later. */
13237 switch (get_attr_type (insn))
13238 {
13239 case TYPE_JMPREG:
309323c2 13240 /* Tell the first scheduling pass about the latency between
ed947a96
DJ
13241 a mtctr and bctr (and mtlr and br/blr). The first
13242 scheduling pass will not know about this latency since
13243 the mtctr instruction, which has the latency associated
13244 to it, will be generated by reload. */
309323c2 13245 return TARGET_POWER ? 5 : 4;
ed947a96
DJ
13246 case TYPE_BRANCH:
13247 /* Leave some extra cycles between a compare and its
13248 dependent branch, to inhibit expensive mispredicts. */
309323c2
DE
13249 if ((rs6000_cpu_attr == CPU_PPC603
13250 || rs6000_cpu_attr == CPU_PPC604
13251 || rs6000_cpu_attr == CPU_PPC604E
13252 || rs6000_cpu_attr == CPU_PPC620
13253 || rs6000_cpu_attr == CPU_PPC630
13254 || rs6000_cpu_attr == CPU_PPC750
13255 || rs6000_cpu_attr == CPU_PPC7400
13256 || rs6000_cpu_attr == CPU_PPC7450
13257 || rs6000_cpu_attr == CPU_POWER4)
ed947a96
DJ
13258 && recog_memoized (dep_insn)
13259 && (INSN_CODE (dep_insn) >= 0)
b54cf83a
DE
13260 && (get_attr_type (dep_insn) == TYPE_CMP
13261 || get_attr_type (dep_insn) == TYPE_COMPARE
ed947a96 13262 || get_attr_type (dep_insn) == TYPE_DELAYED_COMPARE
9259f3b0
DE
13263 || get_attr_type (dep_insn) == TYPE_IMUL_COMPARE
13264 || get_attr_type (dep_insn) == TYPE_LMUL_COMPARE
ed947a96 13265 || get_attr_type (dep_insn) == TYPE_FPCOMPARE
b54cf83a
DE
13266 || get_attr_type (dep_insn) == TYPE_CR_LOGICAL
13267 || get_attr_type (dep_insn) == TYPE_DELAYED_CR))
ed947a96
DJ
13268 return cost + 2;
13269 default:
13270 break;
13271 }
a251ffd0
TG
13272 /* Fall out to return default cost. */
13273 }
13274
13275 return cost;
13276}
b6c9286a 13277
a4f6c312
SS
13278/* A C statement (sans semicolon) to update the integer scheduling
13279 priority INSN_PRIORITY (INSN). Reduce the priority to execute the
13280 INSN earlier, increase the priority to execute INSN later. Do not
13281 define this macro if you do not need to adjust the scheduling
13282 priorities of insns. */
bef84347 13283
c237e94a 13284static int
bef84347 13285rs6000_adjust_priority (insn, priority)
d330fd93 13286 rtx insn ATTRIBUTE_UNUSED;
bef84347
VM
13287 int priority;
13288{
a4f6c312
SS
13289 /* On machines (like the 750) which have asymmetric integer units,
13290 where one integer unit can do multiply and divides and the other
13291 can't, reduce the priority of multiply/divide so it is scheduled
13292 before other integer operations. */
bef84347
VM
13293
13294#if 0
2c3c49de 13295 if (! INSN_P (insn))
bef84347
VM
13296 return priority;
13297
13298 if (GET_CODE (PATTERN (insn)) == USE)
13299 return priority;
13300
13301 switch (rs6000_cpu_attr) {
13302 case CPU_PPC750:
13303 switch (get_attr_type (insn))
13304 {
13305 default:
13306 break;
13307
13308 case TYPE_IMUL:
13309 case TYPE_IDIV:
3cb999d8
DE
13310 fprintf (stderr, "priority was %#x (%d) before adjustment\n",
13311 priority, priority);
bef84347
VM
13312 if (priority >= 0 && priority < 0x01000000)
13313 priority >>= 3;
13314 break;
13315 }
13316 }
13317#endif
13318
13319 return priority;
13320}
13321
a4f6c312
SS
13322/* Return how many instructions the machine can issue per cycle. */
13323
c237e94a
ZW
13324static int
13325rs6000_issue_rate ()
b6c9286a 13326{
3317bab1
DE
13327 /* Use issue rate of 1 for first scheduling pass to decrease degradation. */
13328 if (!reload_completed)
13329 return 1;
13330
b6c9286a 13331 switch (rs6000_cpu_attr) {
3cb999d8
DE
13332 case CPU_RIOS1: /* ? */
13333 case CPU_RS64A:
13334 case CPU_PPC601: /* ? */
ed947a96 13335 case CPU_PPC7450:
3cb999d8 13336 return 3;
b54cf83a 13337 case CPU_PPC440:
b6c9286a 13338 case CPU_PPC603:
bef84347 13339 case CPU_PPC750:
ed947a96 13340 case CPU_PPC7400:
be12c2b0 13341 case CPU_PPC8540:
bef84347 13342 return 2;
3cb999d8 13343 case CPU_RIOS2:
b6c9286a 13344 case CPU_PPC604:
19684119 13345 case CPU_PPC604E:
b6c9286a 13346 case CPU_PPC620:
3cb999d8 13347 case CPU_PPC630:
309323c2 13348 case CPU_POWER4:
b6c9286a
MM
13349 return 4;
13350 default:
13351 return 1;
13352 }
13353}
13354
be12c2b0
VM
13355/* Return how many instructions to look ahead for better insn
13356 scheduling. */
13357
13358static int
13359rs6000_use_sched_lookahead ()
13360{
13361 if (rs6000_cpu_attr == CPU_PPC8540)
13362 return 4;
13363 return 0;
13364}
13365
b6c9286a 13366\f
b6c9286a
MM
13367/* Length in units of the trampoline for entering a nested function. */
13368
13369int
13370rs6000_trampoline_size ()
13371{
13372 int ret = 0;
13373
13374 switch (DEFAULT_ABI)
13375 {
13376 default:
13377 abort ();
13378
13379 case ABI_AIX:
8f802bfb 13380 ret = (TARGET_32BIT) ? 12 : 24;
b6c9286a
MM
13381 break;
13382
4dabc42d 13383 case ABI_DARWIN:
b6c9286a 13384 case ABI_V4:
03a7e1a5 13385 ret = (TARGET_32BIT) ? 40 : 48;
b6c9286a 13386 break;
b6c9286a
MM
13387 }
13388
13389 return ret;
13390}
13391
13392/* Emit RTL insns to initialize the variable parts of a trampoline.
13393 FNADDR is an RTX for the address of the function's pure code.
13394 CXT is an RTX for the static chain value for the function. */
13395
13396void
13397rs6000_initialize_trampoline (addr, fnaddr, cxt)
13398 rtx addr;
13399 rtx fnaddr;
13400 rtx cxt;
13401{
ac2a93a1 13402 enum machine_mode pmode = Pmode;
8bd04c56
MM
13403 int regsize = (TARGET_32BIT) ? 4 : 8;
13404 rtx ctx_reg = force_reg (pmode, cxt);
b6c9286a
MM
13405
13406 switch (DEFAULT_ABI)
13407 {
13408 default:
13409 abort ();
13410
8bd04c56 13411/* Macros to shorten the code expansions below. */
39403d82 13412#define MEM_DEREF(addr) gen_rtx_MEM (pmode, memory_address (pmode, addr))
c5c76735
JL
13413#define MEM_PLUS(addr,offset) \
13414 gen_rtx_MEM (pmode, memory_address (pmode, plus_constant (addr, offset)))
7c59dc5d 13415
b6c9286a
MM
13416 /* Under AIX, just build the 3 word function descriptor */
13417 case ABI_AIX:
8bd04c56
MM
13418 {
13419 rtx fn_reg = gen_reg_rtx (pmode);
13420 rtx toc_reg = gen_reg_rtx (pmode);
13421 emit_move_insn (fn_reg, MEM_DEREF (fnaddr));
1cb18e3c 13422 emit_move_insn (toc_reg, MEM_PLUS (fnaddr, regsize));
8bd04c56
MM
13423 emit_move_insn (MEM_DEREF (addr), fn_reg);
13424 emit_move_insn (MEM_PLUS (addr, regsize), toc_reg);
13425 emit_move_insn (MEM_PLUS (addr, 2*regsize), ctx_reg);
13426 }
b6c9286a
MM
13427 break;
13428
4dabc42d
TC
13429 /* Under V.4/eabi/darwin, __trampoline_setup does the real work. */
13430 case ABI_DARWIN:
b6c9286a 13431 case ABI_V4:
39403d82 13432 emit_library_call (gen_rtx_SYMBOL_REF (SImode, "__trampoline_setup"),
eaf1bcf1
MM
13433 FALSE, VOIDmode, 4,
13434 addr, pmode,
13435 GEN_INT (rs6000_trampoline_size ()), SImode,
13436 fnaddr, pmode,
13437 ctx_reg, pmode);
b6c9286a 13438 break;
b6c9286a
MM
13439 }
13440
13441 return;
13442}
7509c759
MM
13443
13444\f
91d231cb 13445/* Table of valid machine attributes. */
a4f6c312 13446
91d231cb 13447const struct attribute_spec rs6000_attribute_table[] =
7509c759 13448{
91d231cb 13449 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
a5c76ee6
ZW
13450 { "longcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
13451 { "shortcall", 0, 0, false, true, true, rs6000_handle_longcall_attribute },
13452 { NULL, 0, 0, false, false, false, NULL }
91d231cb 13453};
7509c759 13454
a5c76ee6
ZW
13455/* Handle a "longcall" or "shortcall" attribute; arguments as in
13456 struct attribute_spec.handler. */
a4f6c312 13457
91d231cb
JM
13458static tree
13459rs6000_handle_longcall_attribute (node, name, args, flags, no_add_attrs)
13460 tree *node;
13461 tree name;
13462 tree args ATTRIBUTE_UNUSED;
13463 int flags ATTRIBUTE_UNUSED;
13464 bool *no_add_attrs;
13465{
13466 if (TREE_CODE (*node) != FUNCTION_TYPE
13467 && TREE_CODE (*node) != FIELD_DECL
13468 && TREE_CODE (*node) != TYPE_DECL)
13469 {
13470 warning ("`%s' attribute only applies to functions",
13471 IDENTIFIER_POINTER (name));
13472 *no_add_attrs = true;
13473 }
6a4cee5f 13474
91d231cb 13475 return NULL_TREE;
7509c759
MM
13476}
13477
a5c76ee6
ZW
13478/* Set longcall attributes on all functions declared when
13479 rs6000_default_long_calls is true. */
13480static void
13481rs6000_set_default_type_attributes (type)
13482 tree type;
13483{
13484 if (rs6000_default_long_calls
13485 && (TREE_CODE (type) == FUNCTION_TYPE
13486 || TREE_CODE (type) == METHOD_TYPE))
13487 TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("longcall"),
13488 NULL_TREE,
13489 TYPE_ATTRIBUTES (type));
13490}
13491
3cb999d8
DE
13492/* Return a reference suitable for calling a function with the
13493 longcall attribute. */
a4f6c312 13494
6a4cee5f
MM
13495struct rtx_def *
13496rs6000_longcall_ref (call_ref)
13497 rtx call_ref;
13498{
d330fd93 13499 const char *call_name;
6a4cee5f
MM
13500 tree node;
13501
13502 if (GET_CODE (call_ref) != SYMBOL_REF)
13503 return call_ref;
13504
13505 /* System V adds '.' to the internal name, so skip them. */
13506 call_name = XSTR (call_ref, 0);
13507 if (*call_name == '.')
13508 {
13509 while (*call_name == '.')
13510 call_name++;
13511
13512 node = get_identifier (call_name);
39403d82 13513 call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
6a4cee5f
MM
13514 }
13515
13516 return force_reg (Pmode, call_ref);
13517}
7509c759 13518\f
b64a1b53
RH
13519#ifdef USING_ELFOS_H
13520
7509c759
MM
13521/* A C statement or statements to switch to the appropriate section
13522 for output of RTX in mode MODE. You can assume that RTX is some
13523 kind of constant in RTL. The argument MODE is redundant except in
13524 the case of a `const_int' rtx. Select the section by calling
13525 `text_section' or one of the alternatives for other sections.
13526
13527 Do not define this macro if you put all constants in the read-only
13528 data section. */
13529
b64a1b53
RH
13530static void
13531rs6000_elf_select_rtx_section (mode, x, align)
a9098fd0 13532 enum machine_mode mode;
7509c759 13533 rtx x;
b64a1b53 13534 unsigned HOST_WIDE_INT align;
7509c759 13535{
a9098fd0 13536 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
7509c759 13537 toc_section ();
7509c759 13538 else
b64a1b53 13539 default_elf_select_rtx_section (mode, x, align);
7509c759
MM
13540}
13541
13542/* A C statement or statements to switch to the appropriate
13543 section for output of DECL. DECL is either a `VAR_DECL' node
13544 or a constant of some sort. RELOC indicates whether forming
13545 the initial value of DECL requires link-time relocations. */
13546
ae46c4e0
RH
13547static void
13548rs6000_elf_select_section (decl, reloc, align)
7509c759
MM
13549 tree decl;
13550 int reloc;
0e5dbd9b 13551 unsigned HOST_WIDE_INT align;
7509c759 13552{
f1384257
AM
13553 /* Pretend that we're always building for a shared library when
13554 ABI_AIX, because otherwise we end up with dynamic relocations
13555 in read-only sections. This happens for function pointers,
13556 references to vtables in typeinfo, and probably other cases. */
0e5dbd9b
DE
13557 default_elf_select_section_1 (decl, reloc, align,
13558 flag_pic || DEFAULT_ABI == ABI_AIX);
63019373
GK
13559}
13560
13561/* A C statement to build up a unique section name, expressed as a
13562 STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
13563 RELOC indicates whether the initial value of EXP requires
13564 link-time relocations. If you do not define this macro, GCC will use
13565 the symbol name prefixed by `.' as the section name. Note - this
f5143c46 13566 macro can now be called for uninitialized data items as well as
4912a07c 13567 initialized data and functions. */
63019373 13568
ae46c4e0
RH
13569static void
13570rs6000_elf_unique_section (decl, reloc)
63019373
GK
13571 tree decl;
13572 int reloc;
13573{
f1384257
AM
13574 /* As above, pretend that we're always building for a shared library
13575 when ABI_AIX, to avoid dynamic relocations in read-only sections. */
0e5dbd9b
DE
13576 default_unique_section_1 (decl, reloc,
13577 flag_pic || DEFAULT_ABI == ABI_AIX);
7509c759 13578}
d9407988 13579\f
d1908feb
JJ
13580/* For a SYMBOL_REF, set generic flags and then perform some
13581 target-specific processing.
13582
d1908feb
JJ
13583 When the AIX ABI is requested on a non-AIX system, replace the
13584 function name with the real name (with a leading .) rather than the
13585 function descriptor name. This saves a lot of overriding code to
13586 read the prefixes. */
d9407988 13587
fb49053f 13588static void
c6a2438a 13589rs6000_elf_encode_section_info (decl, rtl, first)
d9407988 13590 tree decl;
c6a2438a 13591 rtx rtl;
b2003250 13592 int first;
d9407988 13593{
d1908feb 13594 default_encode_section_info (decl, rtl, first);
b2003250 13595
d1908feb
JJ
13596 if (first
13597 && TREE_CODE (decl) == FUNCTION_DECL
13598 && !TARGET_AIX
13599 && DEFAULT_ABI == ABI_AIX)
d9407988 13600 {
c6a2438a 13601 rtx sym_ref = XEXP (rtl, 0);
d1908feb
JJ
13602 size_t len = strlen (XSTR (sym_ref, 0));
13603 char *str = alloca (len + 2);
13604 str[0] = '.';
13605 memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
13606 XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
d9407988 13607 }
d9407988
MM
13608}
13609
0e5dbd9b
DE
13610static bool
13611rs6000_elf_in_small_data_p (decl)
13612 tree decl;
13613{
13614 if (rs6000_sdata == SDATA_NONE)
13615 return false;
13616
13617 if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
13618 {
13619 const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
13620 if (strcmp (section, ".sdata") == 0
13621 || strcmp (section, ".sdata2") == 0
20bfcd69
GK
13622 || strcmp (section, ".sbss") == 0
13623 || strcmp (section, ".sbss2") == 0
13624 || strcmp (section, ".PPC.EMB.sdata0") == 0
13625 || strcmp (section, ".PPC.EMB.sbss0") == 0)
0e5dbd9b
DE
13626 return true;
13627 }
13628 else
13629 {
13630 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
13631
13632 if (size > 0
307b599c 13633 && (unsigned HOST_WIDE_INT) size <= g_switch_value
20bfcd69
GK
13634 /* If it's not public, and we're not going to reference it there,
13635 there's no need to put it in the small data section. */
0e5dbd9b
DE
13636 && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
13637 return true;
13638 }
13639
13640 return false;
13641}
13642
b91da81f 13643#endif /* USING_ELFOS_H */
000034eb 13644
a6c2a102 13645\f
000034eb 13646/* Return a REG that occurs in ADDR with coefficient 1.
02441cd6
JL
13647 ADDR can be effectively incremented by incrementing REG.
13648
13649 r0 is special and we must not select it as an address
13650 register by this routine since our caller will try to
13651 increment the returned register via an "la" instruction. */
000034eb
DE
13652
13653struct rtx_def *
13654find_addr_reg (addr)
13655 rtx addr;
13656{
13657 while (GET_CODE (addr) == PLUS)
13658 {
02441cd6
JL
13659 if (GET_CODE (XEXP (addr, 0)) == REG
13660 && REGNO (XEXP (addr, 0)) != 0)
000034eb 13661 addr = XEXP (addr, 0);
02441cd6
JL
13662 else if (GET_CODE (XEXP (addr, 1)) == REG
13663 && REGNO (XEXP (addr, 1)) != 0)
000034eb
DE
13664 addr = XEXP (addr, 1);
13665 else if (CONSTANT_P (XEXP (addr, 0)))
13666 addr = XEXP (addr, 1);
13667 else if (CONSTANT_P (XEXP (addr, 1)))
13668 addr = XEXP (addr, 0);
13669 else
13670 abort ();
13671 }
02441cd6 13672 if (GET_CODE (addr) == REG && REGNO (addr) != 0)
000034eb
DE
13673 return addr;
13674 abort ();
13675}
13676
a6c2a102
DE
13677void
13678rs6000_fatal_bad_address (op)
13679 rtx op;
13680{
13681 fatal_insn ("bad address", op);
13682}
c8023011 13683
ee890fe2
SS
13684#if TARGET_MACHO
13685
13686#if 0
13687/* Returns 1 if OP is either a symbol reference or a sum of a symbol
13688 reference and a constant. */
13689
13690int
13691symbolic_operand (op)
592696dd 13692 rtx op;
ee890fe2
SS
13693{
13694 switch (GET_CODE (op))
13695 {
13696 case SYMBOL_REF:
13697 case LABEL_REF:
13698 return 1;
13699 case CONST:
13700 op = XEXP (op, 0);
13701 return (GET_CODE (op) == SYMBOL_REF ||
13702 (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
13703 || GET_CODE (XEXP (op, 0)) == LABEL_REF)
13704 && GET_CODE (XEXP (op, 1)) == CONST_INT);
13705 default:
13706 return 0;
13707 }
c8023011 13708}
ee890fe2
SS
13709#endif
13710
13711#ifdef RS6000_LONG_BRANCH
13712
13713static tree stub_list = 0;
13714
13715/* ADD_COMPILER_STUB adds the compiler generated stub for handling
13716 procedure calls to the linked list. */
13717
13718void
13719add_compiler_stub (label_name, function_name, line_number)
13720 tree label_name;
13721 tree function_name;
13722 int line_number;
13723{
13724 tree stub = build_tree_list (function_name, label_name);
13725 TREE_TYPE (stub) = build_int_2 (line_number, 0);
13726 TREE_CHAIN (stub) = stub_list;
13727 stub_list = stub;
13728}
13729
13730#define STUB_LABEL_NAME(STUB) TREE_VALUE (STUB)
13731#define STUB_FUNCTION_NAME(STUB) TREE_PURPOSE (STUB)
13732#define STUB_LINE_NUMBER(STUB) TREE_INT_CST_LOW (TREE_TYPE (STUB))
13733
a4f6c312
SS
13734/* OUTPUT_COMPILER_STUB outputs the compiler generated stub for
13735 handling procedure calls from the linked list and initializes the
13736 linked list. */
ee890fe2 13737
a4f6c312
SS
13738void
13739output_compiler_stub ()
ee890fe2
SS
13740{
13741 char tmp_buf[256];
13742 char label_buf[256];
308c142a 13743 tree stub;
ee890fe2
SS
13744
13745 if (!flag_pic)
13746 for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
13747 {
13748 fprintf (asm_out_file,
13749 "%s:\n", IDENTIFIER_POINTER(STUB_LABEL_NAME(stub)));
13750
13751#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
13752 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
13753 fprintf (asm_out_file, "\t.stabd 68,0,%d\n", STUB_LINE_NUMBER(stub));
13754#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
13755
13756 if (IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub))[0] == '*')
13757 strcpy (label_buf,
13758 IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub))+1);
13759 else
13760 {
13761 label_buf[0] = '_';
13762 strcpy (label_buf+1,
13763 IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub)));
13764 }
13765
13766 strcpy (tmp_buf, "lis r12,hi16(");
13767 strcat (tmp_buf, label_buf);
13768 strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
13769 strcat (tmp_buf, label_buf);
13770 strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
13771 output_asm_insn (tmp_buf, 0);
13772
13773#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
13774 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
13775 fprintf(asm_out_file, "\t.stabd 68,0,%d\n", STUB_LINE_NUMBER (stub));
13776#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
13777 }
13778
13779 stub_list = 0;
13780}
13781
13782/* NO_PREVIOUS_DEF checks in the link list whether the function name is
13783 already there or not. */
13784
a4f6c312
SS
13785int
13786no_previous_def (function_name)
ee890fe2
SS
13787 tree function_name;
13788{
13789 tree stub;
13790 for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
13791 if (function_name == STUB_FUNCTION_NAME (stub))
13792 return 0;
13793 return 1;
13794}
13795
13796/* GET_PREV_LABEL gets the label name from the previous definition of
13797 the function. */
13798
a4f6c312
SS
13799tree
13800get_prev_label (function_name)
ee890fe2
SS
13801 tree function_name;
13802{
13803 tree stub;
13804 for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
13805 if (function_name == STUB_FUNCTION_NAME (stub))
13806 return STUB_LABEL_NAME (stub);
13807 return 0;
13808}
13809
13810/* INSN is either a function call or a millicode call. It may have an
13811 unconditional jump in its delay slot.
13812
13813 CALL_DEST is the routine we are calling. */
13814
13815char *
13816output_call (insn, call_dest, operand_number)
13817 rtx insn;
13818 rtx call_dest;
13819 int operand_number;
13820{
13821 static char buf[256];
13822 if (GET_CODE (call_dest) == SYMBOL_REF && TARGET_LONG_BRANCH && !flag_pic)
13823 {
13824 tree labelname;
13825 tree funname = get_identifier (XSTR (call_dest, 0));
13826
13827 if (no_previous_def (funname))
13828 {
308c142a 13829 int line_number = 0;
ee890fe2
SS
13830 rtx label_rtx = gen_label_rtx ();
13831 char *label_buf, temp_buf[256];
13832 ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
13833 CODE_LABEL_NUMBER (label_rtx));
13834 label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
13835 labelname = get_identifier (label_buf);
13836 for (; insn && GET_CODE (insn) != NOTE; insn = PREV_INSN (insn));
13837 if (insn)
13838 line_number = NOTE_LINE_NUMBER (insn);
13839 add_compiler_stub (labelname, funname, line_number);
13840 }
13841 else
13842 labelname = get_prev_label (funname);
13843
13844 sprintf (buf, "jbsr %%z%d,%.246s",
13845 operand_number, IDENTIFIER_POINTER (labelname));
13846 return buf;
13847 }
13848 else
13849 {
13850 sprintf (buf, "bl %%z%d", operand_number);
13851 return buf;
13852 }
13853}
13854
13855#endif /* RS6000_LONG_BRANCH */
13856
13857#define GEN_LOCAL_LABEL_FOR_SYMBOL(BUF,SYMBOL,LENGTH,N) \
13858 do { \
83182544 13859 const char *const symbol_ = (SYMBOL); \
ee890fe2
SS
13860 char *buffer_ = (BUF); \
13861 if (symbol_[0] == '"') \
13862 { \
13863 sprintf(buffer_, "\"L%d$%s", (N), symbol_+1); \
13864 } \
13865 else if (name_needs_quotes(symbol_)) \
13866 { \
13867 sprintf(buffer_, "\"L%d$%s\"", (N), symbol_); \
13868 } \
13869 else \
13870 { \
13871 sprintf(buffer_, "L%d$%s", (N), symbol_); \
13872 } \
13873 } while (0)
13874
13875
13876/* Generate PIC and indirect symbol stubs. */
13877
13878void
13879machopic_output_stub (file, symb, stub)
13880 FILE *file;
13881 const char *symb, *stub;
13882{
13883 unsigned int length;
a4f6c312
SS
13884 char *symbol_name, *lazy_ptr_name;
13885 char *local_label_0;
ee890fe2
SS
13886 static int label = 0;
13887
df56a27f 13888 /* Lose our funky encoding stuff so it doesn't contaminate the stub. */
772c5265 13889 symb = (*targetm.strip_name_encoding) (symb);
df56a27f 13890
ee890fe2
SS
13891 label += 1;
13892
ee890fe2
SS
13893 length = strlen (symb);
13894 symbol_name = alloca (length + 32);
13895 GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
13896
13897 lazy_ptr_name = alloca (length + 32);
13898 GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
13899
13900 local_label_0 = alloca (length + 32);
13901 GEN_LOCAL_LABEL_FOR_SYMBOL (local_label_0, symb, length, 0);
13902
ee890fe2 13903 if (flag_pic == 2)
d3c300d2 13904 machopic_picsymbol_stub1_section ();
ee890fe2 13905 else
d3c300d2
DJ
13906 machopic_symbol_stub1_section ();
13907 fprintf (file, "\t.align 2\n");
ee890fe2
SS
13908
13909 fprintf (file, "%s:\n", stub);
13910 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
13911
13912 if (flag_pic == 2)
13913 {
13914 fprintf (file, "\tmflr r0\n");
13915 fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
13916 fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
13917 fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
13918 lazy_ptr_name, local_label_0);
13919 fprintf (file, "\tmtlr r0\n");
d3c300d2 13920 fprintf (file, "\tlwzu r12,lo16(%s-%s)(r11)\n",
ee890fe2
SS
13921 lazy_ptr_name, local_label_0);
13922 fprintf (file, "\tmtctr r12\n");
ee890fe2
SS
13923 fprintf (file, "\tbctr\n");
13924 }
13925 else
ab82a49f
AP
13926 {
13927 fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
13928 fprintf (file, "\tlwzu r12,lo16(%s)(r11)\n", lazy_ptr_name);
13929 fprintf (file, "\tmtctr r12\n");
13930 fprintf (file, "\tbctr\n");
13931 }
ee890fe2
SS
13932
13933 machopic_lazy_symbol_ptr_section ();
13934 fprintf (file, "%s:\n", lazy_ptr_name);
13935 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
13936 fprintf (file, "\t.long dyld_stub_binding_helper\n");
13937}
13938
13939/* Legitimize PIC addresses. If the address is already
13940 position-independent, we return ORIG. Newly generated
13941 position-independent addresses go into a reg. This is REG if non
13942 zero, otherwise we allocate register(s) as necessary. */
13943
c859cda6 13944#define SMALL_INT(X) ((unsigned) (INTVAL(X) + 0x8000) < 0x10000)
ee890fe2
SS
13945
13946rtx
13947rs6000_machopic_legitimize_pic_address (orig, mode, reg)
13948 rtx orig;
13949 enum machine_mode mode;
13950 rtx reg;
13951{
13952 rtx base, offset;
13953
13954 if (reg == NULL && ! reload_in_progress && ! reload_completed)
13955 reg = gen_reg_rtx (Pmode);
13956
13957 if (GET_CODE (orig) == CONST)
13958 {
13959 if (GET_CODE (XEXP (orig, 0)) == PLUS
13960 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
13961 return orig;
13962
13963 if (GET_CODE (XEXP (orig, 0)) == PLUS)
13964 {
a4f6c312
SS
13965 base =
13966 rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
13967 Pmode, reg);
13968 offset =
13969 rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
13970 Pmode, reg);
ee890fe2
SS
13971 }
13972 else
13973 abort ();
13974
13975 if (GET_CODE (offset) == CONST_INT)
13976 {
13977 if (SMALL_INT (offset))
ed8908e7 13978 return plus_constant (base, INTVAL (offset));
ee890fe2
SS
13979 else if (! reload_in_progress && ! reload_completed)
13980 offset = force_reg (Pmode, offset);
13981 else
c859cda6
DJ
13982 {
13983 rtx mem = force_const_mem (Pmode, orig);
13984 return machopic_legitimize_pic_address (mem, Pmode, reg);
13985 }
ee890fe2
SS
13986 }
13987 return gen_rtx (PLUS, Pmode, base, offset);
13988 }
13989
13990 /* Fall back on generic machopic code. */
13991 return machopic_legitimize_pic_address (orig, mode, reg);
13992}
13993
13994/* This is just a placeholder to make linking work without having to
13995 add this to the generic Darwin EXTRA_SECTIONS. If -mcall-aix is
13996 ever needed for Darwin (not too likely!) this would have to get a
13997 real definition. */
13998
13999void
14000toc_section ()
14001{
14002}
14003
14004#endif /* TARGET_MACHO */
7c262518
RH
14005
14006#if TARGET_ELF
14007static unsigned int
14008rs6000_elf_section_type_flags (decl, name, reloc)
14009 tree decl;
14010 const char *name;
14011 int reloc;
14012{
5add3202
DE
14013 unsigned int flags
14014 = default_section_type_flags_1 (decl, name, reloc,
14015 flag_pic || DEFAULT_ABI == ABI_AIX);
7c262518 14016
270fc29b
RH
14017 if (TARGET_RELOCATABLE)
14018 flags |= SECTION_WRITE;
7c262518 14019
d0101753 14020 return flags;
7c262518 14021}
d9f6800d
RH
14022
14023/* Record an element in the table of global constructors. SYMBOL is
14024 a SYMBOL_REF of the function to be called; PRIORITY is a number
14025 between 0 and MAX_INIT_PRIORITY.
14026
14027 This differs from default_named_section_asm_out_constructor in
14028 that we have special handling for -mrelocatable. */
14029
14030static void
14031rs6000_elf_asm_out_constructor (symbol, priority)
14032 rtx symbol;
14033 int priority;
14034{
14035 const char *section = ".ctors";
14036 char buf[16];
14037
14038 if (priority != DEFAULT_INIT_PRIORITY)
14039 {
14040 sprintf (buf, ".ctors.%.5u",
14041 /* Invert the numbering so the linker puts us in the proper
14042 order; constructors are run from right to left, and the
14043 linker sorts in increasing order. */
14044 MAX_INIT_PRIORITY - priority);
14045 section = buf;
14046 }
14047
715bdd29
RH
14048 named_section_flags (section, SECTION_WRITE);
14049 assemble_align (POINTER_SIZE);
d9f6800d
RH
14050
14051 if (TARGET_RELOCATABLE)
14052 {
14053 fputs ("\t.long (", asm_out_file);
14054 output_addr_const (asm_out_file, symbol);
14055 fputs (")@fixup\n", asm_out_file);
14056 }
14057 else
c8af3574 14058 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
d9f6800d
RH
14059}
14060
14061static void
14062rs6000_elf_asm_out_destructor (symbol, priority)
14063 rtx symbol;
14064 int priority;
14065{
14066 const char *section = ".dtors";
14067 char buf[16];
14068
14069 if (priority != DEFAULT_INIT_PRIORITY)
14070 {
14071 sprintf (buf, ".dtors.%.5u",
14072 /* Invert the numbering so the linker puts us in the proper
14073 order; constructors are run from right to left, and the
14074 linker sorts in increasing order. */
14075 MAX_INIT_PRIORITY - priority);
14076 section = buf;
14077 }
14078
715bdd29
RH
14079 named_section_flags (section, SECTION_WRITE);
14080 assemble_align (POINTER_SIZE);
d9f6800d
RH
14081
14082 if (TARGET_RELOCATABLE)
14083 {
14084 fputs ("\t.long (", asm_out_file);
14085 output_addr_const (asm_out_file, symbol);
14086 fputs (")@fixup\n", asm_out_file);
14087 }
14088 else
c8af3574 14089 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
d9f6800d 14090}
9739c90c
JJ
14091
14092void
14093rs6000_elf_declare_function_name (file, name, decl)
14094 FILE *file;
14095 const char *name;
14096 tree decl;
14097{
14098 if (TARGET_64BIT)
14099 {
14100 fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
14101 ASM_OUTPUT_LABEL (file, name);
14102 fputs (DOUBLE_INT_ASM_OP, file);
14103 putc ('.', file);
14104 assemble_name (file, name);
14105 fputs (",.TOC.@tocbase,0\n\t.previous\n\t.size\t", file);
14106 assemble_name (file, name);
14107 fputs (",24\n\t.type\t.", file);
14108 assemble_name (file, name);
14109 fputs (",@function\n", file);
14110 if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
14111 {
14112 fputs ("\t.globl\t.", file);
14113 assemble_name (file, name);
14114 putc ('\n', file);
14115 }
14116 ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
14117 putc ('.', file);
14118 ASM_OUTPUT_LABEL (file, name);
14119 return;
14120 }
14121
14122 if (TARGET_RELOCATABLE
14123 && (get_pool_size () != 0 || current_function_profile)
14124 && uses_TOC())
14125 {
14126 char buf[256];
14127
14128 (*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
14129
14130 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
14131 fprintf (file, "\t.long ");
14132 assemble_name (file, buf);
14133 putc ('-', file);
14134 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
14135 assemble_name (file, buf);
14136 putc ('\n', file);
14137 }
14138
14139 ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
14140 ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
14141
14142 if (DEFAULT_ABI == ABI_AIX)
14143 {
14144 const char *desc_name, *orig_name;
14145
14146 orig_name = (*targetm.strip_name_encoding) (name);
14147 desc_name = orig_name;
14148 while (*desc_name == '.')
14149 desc_name++;
14150
14151 if (TREE_PUBLIC (decl))
14152 fprintf (file, "\t.globl %s\n", desc_name);
14153
14154 fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
14155 fprintf (file, "%s:\n", desc_name);
14156 fprintf (file, "\t.long %s\n", orig_name);
14157 fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
14158 if (DEFAULT_ABI == ABI_AIX)
14159 fputs ("\t.long 0\n", file);
14160 fprintf (file, "\t.previous\n");
14161 }
14162 ASM_OUTPUT_LABEL (file, name);
14163}
7c262518
RH
14164#endif
14165
cbaaba19 14166#if TARGET_XCOFF
7c262518 14167static void
b275d088
DE
14168rs6000_xcoff_asm_globalize_label (stream, name)
14169 FILE *stream;
14170 const char *name;
14171{
14172 fputs (GLOBAL_ASM_OP, stream);
14173 RS6000_OUTPUT_BASENAME (stream, name);
14174 putc ('\n', stream);
14175}
14176
14177static void
14178rs6000_xcoff_asm_named_section (name, flags)
7c262518 14179 const char *name;
0e5dbd9b 14180 unsigned int flags;
7c262518 14181{
0e5dbd9b
DE
14182 int smclass;
14183 static const char * const suffix[3] = { "PR", "RO", "RW" };
14184
14185 if (flags & SECTION_CODE)
14186 smclass = 0;
14187 else if (flags & SECTION_WRITE)
14188 smclass = 2;
14189 else
14190 smclass = 1;
14191
5b5198f7 14192 fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
0e5dbd9b 14193 (flags & SECTION_CODE) ? "." : "",
5b5198f7 14194 name, suffix[smclass], flags & SECTION_ENTSIZE);
7c262518 14195}
ae46c4e0
RH
14196
14197static void
0e5dbd9b
DE
14198rs6000_xcoff_select_section (decl, reloc, align)
14199 tree decl;
ae46c4e0
RH
14200 int reloc;
14201 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
14202{
5add3202 14203 if (decl_readonly_section_1 (decl, reloc, 1))
ae46c4e0 14204 {
0e5dbd9b 14205 if (TREE_PUBLIC (decl))
ae46c4e0
RH
14206 read_only_data_section ();
14207 else
14208 read_only_private_data_section ();
14209 }
14210 else
14211 {
0e5dbd9b 14212 if (TREE_PUBLIC (decl))
ae46c4e0
RH
14213 data_section ();
14214 else
14215 private_data_section ();
14216 }
14217}
14218
14219static void
14220rs6000_xcoff_unique_section (decl, reloc)
14221 tree decl;
772c5265 14222 int reloc ATTRIBUTE_UNUSED;
ae46c4e0
RH
14223{
14224 const char *name;
ae46c4e0 14225
5b5198f7
DE
14226 /* Use select_section for private and uninitialized data. */
14227 if (!TREE_PUBLIC (decl)
14228 || DECL_COMMON (decl)
0e5dbd9b
DE
14229 || DECL_INITIAL (decl) == NULL_TREE
14230 || DECL_INITIAL (decl) == error_mark_node
14231 || (flag_zero_initialized_in_bss
14232 && initializer_zerop (DECL_INITIAL (decl))))
14233 return;
14234
14235 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
14236 name = (*targetm.strip_name_encoding) (name);
14237 DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
ae46c4e0 14238}
b64a1b53 14239
fb49053f
RH
14240/* Select section for constant in constant pool.
14241
14242 On RS/6000, all constants are in the private read-only data area.
14243 However, if this is being placed in the TOC it must be output as a
14244 toc entry. */
14245
b64a1b53
RH
14246static void
14247rs6000_xcoff_select_rtx_section (mode, x, align)
14248 enum machine_mode mode;
14249 rtx x;
14250 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
14251{
14252 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
14253 toc_section ();
14254 else
14255 read_only_private_data_section ();
14256}
772c5265
RH
14257
14258/* Remove any trailing [DS] or the like from the symbol name. */
14259
14260static const char *
14261rs6000_xcoff_strip_name_encoding (name)
14262 const char *name;
14263{
14264 size_t len;
14265 if (*name == '*')
14266 name++;
14267 len = strlen (name);
14268 if (name[len - 1] == ']')
14269 return ggc_alloc_string (name, len - 4);
14270 else
14271 return name;
14272}
14273
5add3202
DE
14274/* Section attributes. AIX is always PIC. */
14275
14276static unsigned int
14277rs6000_xcoff_section_type_flags (decl, name, reloc)
14278 tree decl;
14279 const char *name;
14280 int reloc;
14281{
5b5198f7
DE
14282 unsigned int align;
14283 unsigned int flags = default_section_type_flags_1 (decl, name, reloc, 1);
14284
14285 /* Align to at least UNIT size. */
14286 if (flags & SECTION_CODE)
14287 align = MIN_UNITS_PER_WORD;
14288 else
14289 /* Increase alignment of large objects if not already stricter. */
14290 align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
14291 int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
14292 ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
14293
14294 return flags | (exact_log2 (align) & SECTION_ENTSIZE);
5add3202 14295}
a5fe455b 14296
1bc7c5b6
ZW
14297/* Output at beginning of assembler file.
14298
14299 Initialize the section names for the RS/6000 at this point.
14300
14301 Specify filename, including full path, to assembler.
14302
14303 We want to go into the TOC section so at least one .toc will be emitted.
14304 Also, in order to output proper .bs/.es pairs, we need at least one static
14305 [RW] section emitted.
14306
14307 Finally, declare mcount when profiling to make the assembler happy. */
14308
14309static void
14310rs6000_xcoff_file_start ()
14311{
14312 rs6000_gen_section_name (&xcoff_bss_section_name,
14313 main_input_filename, ".bss_");
14314 rs6000_gen_section_name (&xcoff_private_data_section_name,
14315 main_input_filename, ".rw_");
14316 rs6000_gen_section_name (&xcoff_read_only_section_name,
14317 main_input_filename, ".ro_");
14318
14319 fputs ("\t.file\t", asm_out_file);
14320 output_quoted_string (asm_out_file, main_input_filename);
14321 fputc ('\n', asm_out_file);
14322 toc_section ();
14323 if (write_symbols != NO_DEBUG)
14324 private_data_section ();
14325 text_section ();
14326 if (profile_flag)
14327 fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
14328 rs6000_file_start ();
14329}
14330
a5fe455b
ZW
14331/* Output at end of assembler file.
14332 On the RS/6000, referencing data should automatically pull in text. */
14333
14334static void
14335rs6000_xcoff_file_end ()
14336{
14337 text_section ();
14338 fputs ("_section_.text:\n", asm_out_file);
14339 data_section ();
14340 fputs (TARGET_32BIT
14341 ? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
14342 asm_out_file);
14343}
f1384257 14344#endif /* TARGET_XCOFF */
0e5dbd9b 14345
f1384257
AM
14346#if TARGET_MACHO
14347/* Cross-module name binding. Darwin does not support overriding
7f3d8013 14348 functions at dynamic-link time. */
0e5dbd9b 14349
2bcc50d0 14350static bool
0e5dbd9b
DE
14351rs6000_binds_local_p (decl)
14352 tree decl;
14353{
f1384257 14354 return default_binds_local_p_1 (decl, 0);
0e5dbd9b 14355}
f1384257 14356#endif
34bb030a 14357
3c50106f
RH
14358/* Compute a (partial) cost for rtx X. Return true if the complete
14359 cost has been computed, and false if subexpressions should be
14360 scanned. In either case, *TOTAL contains the cost result. */
14361
14362static bool
14363rs6000_rtx_costs (x, code, outer_code, total)
14364 rtx x;
14365 int code, outer_code ATTRIBUTE_UNUSED;
14366 int *total;
14367{
14368 switch (code)
14369 {
14370 /* On the RS/6000, if it is valid in the insn, it is free.
14371 So this always returns 0. */
14372 case CONST_INT:
14373 case CONST:
14374 case LABEL_REF:
14375 case SYMBOL_REF:
14376 case CONST_DOUBLE:
14377 case HIGH:
14378 *total = 0;
14379 return true;
14380
14381 case PLUS:
14382 *total = ((GET_CODE (XEXP (x, 1)) == CONST_INT
14383 && ((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1))
14384 + 0x8000) >= 0x10000)
14385 && ((INTVAL (XEXP (x, 1)) & 0xffff) != 0))
14386 ? COSTS_N_INSNS (2)
14387 : COSTS_N_INSNS (1));
14388 return true;
14389
14390 case AND:
14391 case IOR:
14392 case XOR:
14393 *total = ((GET_CODE (XEXP (x, 1)) == CONST_INT
14394 && (INTVAL (XEXP (x, 1)) & (~ (HOST_WIDE_INT) 0xffff)) != 0
14395 && ((INTVAL (XEXP (x, 1)) & 0xffff) != 0))
14396 ? COSTS_N_INSNS (2)
14397 : COSTS_N_INSNS (1));
14398 return true;
14399
14400 case MULT:
14401 if (optimize_size)
14402 {
14403 *total = COSTS_N_INSNS (2);
14404 return true;
14405 }
14406 switch (rs6000_cpu)
14407 {
14408 case PROCESSOR_RIOS1:
14409 case PROCESSOR_PPC405:
14410 *total = (GET_CODE (XEXP (x, 1)) != CONST_INT
14411 ? COSTS_N_INSNS (5)
14412 : (INTVAL (XEXP (x, 1)) >= -256
14413 && INTVAL (XEXP (x, 1)) <= 255)
14414 ? COSTS_N_INSNS (3) : COSTS_N_INSNS (4));
14415 return true;
14416
02ca7595
DE
14417 case PROCESSOR_PPC440:
14418 *total = (GET_CODE (XEXP (x, 1)) != CONST_INT
14419 ? COSTS_N_INSNS (3)
14420 : COSTS_N_INSNS (2));
14421 return true;
14422
3c50106f
RH
14423 case PROCESSOR_RS64A:
14424 *total = (GET_CODE (XEXP (x, 1)) != CONST_INT
14425 ? GET_MODE (XEXP (x, 1)) != DImode
14426 ? COSTS_N_INSNS (20) : COSTS_N_INSNS (34)
14427 : (INTVAL (XEXP (x, 1)) >= -256
14428 && INTVAL (XEXP (x, 1)) <= 255)
14429 ? COSTS_N_INSNS (8) : COSTS_N_INSNS (12));
14430 return true;
14431
14432 case PROCESSOR_RIOS2:
14433 case PROCESSOR_MPCCORE:
14434 case PROCESSOR_PPC604e:
14435 *total = COSTS_N_INSNS (2);
14436 return true;
14437
14438 case PROCESSOR_PPC601:
14439 *total = COSTS_N_INSNS (5);
14440 return true;
14441
14442 case PROCESSOR_PPC603:
14443 case PROCESSOR_PPC7400:
14444 case PROCESSOR_PPC750:
14445 *total = (GET_CODE (XEXP (x, 1)) != CONST_INT
14446 ? COSTS_N_INSNS (5)
14447 : (INTVAL (XEXP (x, 1)) >= -256
14448 && INTVAL (XEXP (x, 1)) <= 255)
14449 ? COSTS_N_INSNS (2) : COSTS_N_INSNS (3));
14450 return true;
14451
14452 case PROCESSOR_PPC7450:
14453 *total = (GET_CODE (XEXP (x, 1)) != CONST_INT
14454 ? COSTS_N_INSNS (4)
14455 : COSTS_N_INSNS (3));
14456 return true;
14457
14458 case PROCESSOR_PPC403:
14459 case PROCESSOR_PPC604:
14460 case PROCESSOR_PPC8540:
14461 *total = COSTS_N_INSNS (4);
14462 return true;
14463
14464 case PROCESSOR_PPC620:
14465 case PROCESSOR_PPC630:
3c50106f
RH
14466 *total = (GET_CODE (XEXP (x, 1)) != CONST_INT
14467 ? GET_MODE (XEXP (x, 1)) != DImode
14468 ? COSTS_N_INSNS (5) : COSTS_N_INSNS (7)
14469 : (INTVAL (XEXP (x, 1)) >= -256
14470 && INTVAL (XEXP (x, 1)) <= 255)
14471 ? COSTS_N_INSNS (3) : COSTS_N_INSNS (4));
14472 return true;
14473
9259f3b0
DE
14474 case PROCESSOR_POWER4:
14475 *total = (GET_CODE (XEXP (x, 1)) != CONST_INT
14476 ? GET_MODE (XEXP (x, 1)) != DImode
984e25ac
DE
14477 ? COSTS_N_INSNS (3) : COSTS_N_INSNS (4)
14478 : COSTS_N_INSNS (2));
9259f3b0
DE
14479 return true;
14480
3c50106f
RH
14481 default:
14482 abort ();
14483 }
14484
14485 case DIV:
14486 case MOD:
14487 if (GET_CODE (XEXP (x, 1)) == CONST_INT
14488 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
14489 {
14490 *total = COSTS_N_INSNS (2);
14491 return true;
14492 }
14493 /* FALLTHRU */
14494
14495 case UDIV:
14496 case UMOD:
14497 switch (rs6000_cpu)
14498 {
14499 case PROCESSOR_RIOS1:
14500 *total = COSTS_N_INSNS (19);
14501 return true;
14502
14503 case PROCESSOR_RIOS2:
14504 *total = COSTS_N_INSNS (13);
14505 return true;
14506
14507 case PROCESSOR_RS64A:
14508 *total = (GET_MODE (XEXP (x, 1)) != DImode
14509 ? COSTS_N_INSNS (65)
14510 : COSTS_N_INSNS (67));
14511 return true;
14512
14513 case PROCESSOR_MPCCORE:
14514 *total = COSTS_N_INSNS (6);
14515 return true;
14516
14517 case PROCESSOR_PPC403:
14518 *total = COSTS_N_INSNS (33);
14519 return true;
14520
14521 case PROCESSOR_PPC405:
14522 *total = COSTS_N_INSNS (35);
14523 return true;
14524
02ca7595
DE
14525 case PROCESSOR_PPC440:
14526 *total = COSTS_N_INSNS (34);
14527 return true;
14528
3c50106f
RH
14529 case PROCESSOR_PPC601:
14530 *total = COSTS_N_INSNS (36);
14531 return true;
14532
14533 case PROCESSOR_PPC603:
14534 *total = COSTS_N_INSNS (37);
14535 return true;
14536
14537 case PROCESSOR_PPC604:
14538 case PROCESSOR_PPC604e:
14539 *total = COSTS_N_INSNS (20);
14540 return true;
14541
14542 case PROCESSOR_PPC620:
14543 case PROCESSOR_PPC630:
3c50106f
RH
14544 *total = (GET_MODE (XEXP (x, 1)) != DImode
14545 ? COSTS_N_INSNS (21)
14546 : COSTS_N_INSNS (37));
14547 return true;
14548
14549 case PROCESSOR_PPC750:
14550 case PROCESSOR_PPC8540:
14551 case PROCESSOR_PPC7400:
14552 *total = COSTS_N_INSNS (19);
14553 return true;
14554
14555 case PROCESSOR_PPC7450:
14556 *total = COSTS_N_INSNS (23);
14557 return true;
984e25ac
DE
14558
14559 case PROCESSOR_POWER4:
14560 *total = (GET_MODE (XEXP (x, 1)) != DImode
14561 ? COSTS_N_INSNS (18)
14562 : COSTS_N_INSNS (34));
14563 return true;
3c50106f
RH
14564
14565 default:
14566 abort ();
14567 }
14568
14569 case FFS:
14570 *total = COSTS_N_INSNS (4);
14571 return true;
14572
14573 case MEM:
14574 /* MEM should be slightly more expensive than (plus (reg) (const)) */
14575 *total = 5;
14576 return true;
14577
14578 default:
14579 return false;
14580 }
14581}
14582
34bb030a
DE
14583/* A C expression returning the cost of moving data from a register of class
14584 CLASS1 to one of CLASS2. */
14585
14586int
14587rs6000_register_move_cost (mode, from, to)
14588 enum machine_mode mode;
14589 enum reg_class from, to;
14590{
14591 /* Moves from/to GENERAL_REGS. */
14592 if (reg_classes_intersect_p (to, GENERAL_REGS)
14593 || reg_classes_intersect_p (from, GENERAL_REGS))
14594 {
14595 if (! reg_classes_intersect_p (to, GENERAL_REGS))
14596 from = to;
14597
14598 if (from == FLOAT_REGS || from == ALTIVEC_REGS)
14599 return (rs6000_memory_move_cost (mode, from, 0)
14600 + rs6000_memory_move_cost (mode, GENERAL_REGS, 0));
14601
14602/* It's more expensive to move CR_REGS than CR0_REGS because of the shift...*/
14603 else if (from == CR_REGS)
14604 return 4;
14605
14606 else
14607/* A move will cost one instruction per GPR moved. */
14608 return 2 * HARD_REGNO_NREGS (0, mode);
14609 }
14610
14611/* Moving between two similar registers is just one instruction. */
14612 else if (reg_classes_intersect_p (to, from))
14613 return mode == TFmode ? 4 : 2;
14614
14615/* Everything else has to go through GENERAL_REGS. */
14616 else
14617 return (rs6000_register_move_cost (mode, GENERAL_REGS, to)
14618 + rs6000_register_move_cost (mode, from, GENERAL_REGS));
14619}
14620
14621/* A C expressions returning the cost of moving data of MODE from a register to
14622 or from memory. */
14623
14624int
14625rs6000_memory_move_cost (mode, class, in)
14626 enum machine_mode mode;
14627 enum reg_class class;
14628 int in ATTRIBUTE_UNUSED;
14629{
14630 if (reg_classes_intersect_p (class, GENERAL_REGS))
14631 return 4 * HARD_REGNO_NREGS (0, mode);
14632 else if (reg_classes_intersect_p (class, FLOAT_REGS))
14633 return 4 * HARD_REGNO_NREGS (32, mode);
14634 else if (reg_classes_intersect_p (class, ALTIVEC_REGS))
14635 return 4 * HARD_REGNO_NREGS (FIRST_ALTIVEC_REGNO, mode);
14636 else
14637 return 4 + rs6000_register_move_cost (mode, class, GENERAL_REGS);
14638}
14639
ded9bf77
AH
14640/* Return an RTX representing where to find the function value of a
14641 function returning MODE. */
14642static rtx
14643rs6000_complex_function_value (enum machine_mode mode)
14644{
14645 unsigned int regno;
14646 rtx r1, r2;
14647 enum machine_mode inner = GET_MODE_INNER (mode);
14648
14649 if (FLOAT_MODE_P (mode))
14650 regno = FP_ARG_RETURN;
14651 else
14652 {
14653 regno = GP_ARG_RETURN;
14654
14655 /* 32-bit is OK since it'll go in r3/r4. */
165848da
AH
14656 if (TARGET_32BIT
14657 && GET_MODE_BITSIZE (inner) >= 32)
ded9bf77
AH
14658 return gen_rtx_REG (mode, regno);
14659 }
14660
14661 r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
14662 const0_rtx);
14663 r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
14664 GEN_INT (GET_MODE_UNIT_SIZE (inner)));
14665 return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
14666}
14667
a6ebc39a
AH
14668/* Define how to find the value returned by a function.
14669 VALTYPE is the data type of the value (as a tree).
14670 If the precise function being called is known, FUNC is its FUNCTION_DECL;
14671 otherwise, FUNC is 0.
14672
14673 On the SPE, both FPs and vectors are returned in r3.
14674
14675 On RS/6000 an integer value is in r3 and a floating-point value is in
14676 fp1, unless -msoft-float. */
14677
14678rtx
14679rs6000_function_value (tree valtype, tree func ATTRIBUTE_UNUSED)
14680{
14681 enum machine_mode mode;
2a8fa26c 14682 unsigned int regno;
a6ebc39a
AH
14683
14684 if ((INTEGRAL_TYPE_P (valtype)
14685 && TYPE_PRECISION (valtype) < BITS_PER_WORD)
14686 || POINTER_TYPE_P (valtype))
14687 mode = word_mode;
14688 else
14689 mode = TYPE_MODE (valtype);
14690
2a8fa26c
DE
14691 if (TREE_CODE (valtype) == REAL_TYPE && TARGET_HARD_FLOAT && TARGET_FPRS)
14692 regno = FP_ARG_RETURN;
ded9bf77
AH
14693 else if (TREE_CODE (valtype) == COMPLEX_TYPE
14694 && TARGET_HARD_FLOAT
14695 && SPLIT_COMPLEX_ARGS)
14696 return rs6000_complex_function_value (mode);
2a8fa26c 14697 else if (TREE_CODE (valtype) == VECTOR_TYPE && TARGET_ALTIVEC)
a6ebc39a
AH
14698 regno = ALTIVEC_ARG_RETURN;
14699 else
14700 regno = GP_ARG_RETURN;
14701
14702 return gen_rtx_REG (mode, regno);
14703}
14704
ded9bf77
AH
14705/* Define how to find the value returned by a library function
14706 assuming the value has mode MODE. */
14707rtx
14708rs6000_libcall_value (enum machine_mode mode)
14709{
14710 unsigned int regno;
14711
14712 if (GET_MODE_CLASS (mode) == MODE_FLOAT
14713 && TARGET_HARD_FLOAT && TARGET_FPRS)
14714 regno = FP_ARG_RETURN;
14715 else if (ALTIVEC_VECTOR_MODE (mode))
14716 regno = ALTIVEC_ARG_RETURN;
14717 else if (COMPLEX_MODE_P (mode) && SPLIT_COMPLEX_ARGS)
14718 return rs6000_complex_function_value (mode);
14719 else
14720 regno = GP_ARG_RETURN;
14721
14722 return gen_rtx_REG (mode, regno);
14723}
14724
62e1dfcf
NC
14725/* Return true if TYPE is of type __ev64_opaque__. */
14726
c8e4f0e9 14727static bool
62e1dfcf
NC
14728is_ev64_opaque_type (type)
14729 tree type;
14730{
c8e4f0e9 14731 return (TARGET_SPE
2abe3e28
AH
14732 && (type == opaque_V2SI_type_node
14733 || type == opaque_V2SF_type_node
6035d635 14734 || type == opaque_p_V2SI_type_node
2abe3e28
AH
14735 || (TREE_CODE (type) == VECTOR_TYPE
14736 && TYPE_NAME (type)
14737 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
14738 && DECL_NAME (TYPE_NAME (type))
14739 && strcmp (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))),
14740 "__ev64_opaque__") == 0)));
62e1dfcf
NC
14741}
14742
96714395
AH
14743static rtx
14744rs6000_dwarf_register_span (reg)
14745 rtx reg;
14746{
14747 unsigned regno;
14748
14749 if (!TARGET_SPE || !SPE_VECTOR_MODE (GET_MODE (reg)))
14750 return NULL_RTX;
14751
14752 regno = REGNO (reg);
14753
14754 /* The duality of the SPE register size wreaks all kinds of havoc.
14755 This is a way of distinguishing r0 in 32-bits from r0 in
14756 64-bits. */
14757 return
14758 gen_rtx_PARALLEL (VOIDmode,
3bd104d1
AH
14759 BYTES_BIG_ENDIAN
14760 ? gen_rtvec (2,
14761 gen_rtx_REG (SImode, regno + 1200),
14762 gen_rtx_REG (SImode, regno))
14763 : gen_rtvec (2,
14764 gen_rtx_REG (SImode, regno),
14765 gen_rtx_REG (SImode, regno + 1200)));
96714395
AH
14766}
14767
17211ab5 14768#include "gt-rs6000.h"