]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/rs6000/rs6000.c
combine.c (combine_simplify_rtx): Clear op0_mode if simplification suceeded.
[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,
63b6e069 3 2000, 2001 Free Software Foundation, Inc.
fab3bcc3 4 Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
9878760c
RK
5
6This file is part of GNU CC.
7
8GNU CC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2, or (at your option)
11any later version.
12
13GNU CC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GNU CC; see the file COPYING. If not, write to
c15c9075
RK
20the Free Software Foundation, 59 Temple Place - Suite 330,
21Boston, MA 02111-1307, USA. */
9878760c 22
956d6950 23#include "config.h"
c4d38ccb 24#include "system.h"
9878760c
RK
25#include "rtl.h"
26#include "regs.h"
27#include "hard-reg-set.h"
28#include "real.h"
29#include "insn-config.h"
30#include "conditions.h"
9878760c
RK
31#include "insn-attr.h"
32#include "flags.h"
33#include "recog.h"
9878760c 34#include "obstack.h"
9b30bae2 35#include "tree.h"
dfafc897 36#include "expr.h"
2a430ec1 37#include "except.h"
a7df97e6 38#include "function.h"
296b8152 39#include "output.h"
d5fa86ba 40#include "basic-block.h"
296b8152 41#include "toplev.h"
c8023011 42#include "ggc.h"
9ebbca7d
GK
43#include "hashtab.h"
44#include "tm_p.h"
9b30bae2 45
7509c759
MM
46#ifndef TARGET_NO_PROTOTYPE
47#define TARGET_NO_PROTOTYPE 0
48#endif
49
5248c961 50extern int profile_block_flag;
9878760c
RK
51
52#define min(A,B) ((A) < (B) ? (A) : (B))
53#define max(A,B) ((A) > (B) ? (A) : (B))
54
5248c961
RK
55/* Target cpu type */
56
57enum processor_type rs6000_cpu;
8e3f41e7
MM
58struct rs6000_cpu_select rs6000_select[3] =
59{
815cdc52
MM
60 /* switch name, tune arch */
61 { (const char *)0, "--with-cpu=", 1, 1 },
62 { (const char *)0, "-mcpu=", 1, 1 },
63 { (const char *)0, "-mtune=", 1, 0 },
8e3f41e7 64};
5248c961 65
c764f757
RK
66/* Set to non-zero once AIX common-mode calls have been defined. */
67static int common_mode_defined;
c81bebd7 68
9878760c
RK
69/* Save information from a "cmpxx" operation until the branch or scc is
70 emitted. */
9878760c
RK
71rtx rs6000_compare_op0, rs6000_compare_op1;
72int rs6000_compare_fp_p;
874a0744 73
874a0744
MM
74/* Label number of label created for -mrelocatable, to call to so we can
75 get the address of the GOT section */
76int rs6000_pic_labelno;
c81bebd7 77
9ebbca7d 78#ifdef USING_SVR4_H
c81bebd7 79/* Which abi to adhere to */
815cdc52 80const char *rs6000_abi_name = RS6000_ABI_NAME;
d9407988
MM
81
82/* Semantics of the small data area */
83enum rs6000_sdata_type rs6000_sdata = SDATA_DATA;
84
85/* Which small data model to use */
815cdc52 86const char *rs6000_sdata_name = (char *)0;
9ebbca7d
GK
87
88/* Counter for labels which are to be placed in .fixup. */
89int fixuplabelno = 0;
874a0744 90#endif
4697a36c 91
b6c9286a
MM
92/* ABI enumeration available for subtarget to use. */
93enum rs6000_abi rs6000_current_abi;
94
38c1f2d7 95/* Debug flags */
815cdc52 96const char *rs6000_debug_name;
38c1f2d7
MM
97int rs6000_debug_stack; /* debug stack applications */
98int rs6000_debug_arg; /* debug argument handling */
99
100/* Flag to say the TOC is initialized */
101int toc_initialized;
9ebbca7d 102char toc_label_name[10];
38c1f2d7 103
9ebbca7d
GK
104/* Alias set for saves and restores from the rs6000 stack. */
105static int rs6000_sr_alias_set;
c8023011 106
9ebbca7d
GK
107static void rs6000_add_gc_roots PARAMS ((void));
108static int num_insns_constant_wide PARAMS ((HOST_WIDE_INT));
109static rtx expand_block_move_mem PARAMS ((enum machine_mode, rtx, rtx));
39a10a29
GK
110static void validate_condition_mode
111 PARAMS ((enum rtx_code, enum machine_mode));
112static rtx rs6000_generate_compare PARAMS ((enum rtx_code));
e50f5f3d 113static void rs6000_maybe_dead PARAMS ((rtx));
9ebbca7d
GK
114static void rs6000_emit_stack_tie PARAMS ((void));
115static void rs6000_frame_related PARAMS ((rtx, rtx, HOST_WIDE_INT, rtx, rtx));
116static void rs6000_emit_allocate_stack PARAMS ((HOST_WIDE_INT, int));
117static unsigned rs6000_hash_constant PARAMS ((rtx));
118static unsigned toc_hash_function PARAMS ((const void *));
119static int toc_hash_eq PARAMS ((const void *, const void *));
2eba1afa 120static int toc_hash_mark_entry PARAMS ((void **, void *));
9ebbca7d
GK
121static void toc_hash_mark_table PARAMS ((void *));
122static int constant_pool_expr_1 PARAMS ((rtx, int *, int *));
6fee9e99
NC
123static void rs6000_free_machine_status PARAMS ((struct function *));
124static void rs6000_init_machine_status PARAMS ((struct function *));
71f123ca
FS
125static void rs6000_mark_machine_status PARAMS ((struct function *));
126static int rs6000_ra_ever_killed PARAMS ((void));
c81bebd7
MM
127\f
128/* Default register names. */
129char rs6000_reg_names[][8] =
130{
802a0058
MM
131 "0", "1", "2", "3", "4", "5", "6", "7",
132 "8", "9", "10", "11", "12", "13", "14", "15",
133 "16", "17", "18", "19", "20", "21", "22", "23",
134 "24", "25", "26", "27", "28", "29", "30", "31",
135 "0", "1", "2", "3", "4", "5", "6", "7",
136 "8", "9", "10", "11", "12", "13", "14", "15",
137 "16", "17", "18", "19", "20", "21", "22", "23",
138 "24", "25", "26", "27", "28", "29", "30", "31",
139 "mq", "lr", "ctr","ap",
140 "0", "1", "2", "3", "4", "5", "6", "7",
9ebbca7d 141 "xer"
c81bebd7
MM
142};
143
144#ifdef TARGET_REGNAMES
145static char alt_reg_names[][8] =
146{
802a0058
MM
147 "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7",
148 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
149 "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
150 "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
151 "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
152 "%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
153 "%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
154 "%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
155 "mq", "lr", "ctr", "ap",
156 "%cr0", "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7",
9ebbca7d 157 "xer"
c81bebd7
MM
158};
159#endif
9878760c 160\f
daf11973
MM
161#ifndef MASK_STRICT_ALIGN
162#define MASK_STRICT_ALIGN 0
163#endif
164
5248c961
RK
165/* Override command line options. Mostly we process the processor
166 type and sometimes adjust other TARGET_ options. */
167
168void
8e3f41e7 169rs6000_override_options (default_cpu)
d330fd93 170 const char *default_cpu;
5248c961 171{
c4d38ccb 172 size_t i, j;
8e3f41e7 173 struct rs6000_cpu_select *ptr;
5248c961 174
85638c0d
RK
175 /* Simplify the entries below by making a mask for any POWER
176 variant and any PowerPC variant. */
177
938937d8 178#define POWER_MASKS (MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING)
68c49ffa
RK
179#define POWERPC_MASKS (MASK_POWERPC | MASK_PPC_GPOPT \
180 | MASK_PPC_GFXOPT | MASK_POWERPC64)
181#define POWERPC_OPT_MASKS (MASK_PPC_GPOPT | MASK_PPC_GFXOPT)
85638c0d 182
5248c961
RK
183 static struct ptt
184 {
d330fd93 185 const char *name; /* Canonical processor name. */
5248c961
RK
186 enum processor_type processor; /* Processor type enum value. */
187 int target_enable; /* Target flags to enable. */
188 int target_disable; /* Target flags to disable. */
189 } processor_target_table[]
cf27b467
MM
190 = {{"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS,
191 POWER_MASKS | POWERPC_MASKS},
db7f1e43 192 {"power", PROCESSOR_POWER,
938937d8 193 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43 194 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
8e3f41e7
MM
195 {"power2", PROCESSOR_POWER,
196 MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
197 POWERPC_MASKS | MASK_NEW_MNEMONICS},
c71791e0
DE
198 {"power3", PROCESSOR_PPC630,
199 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
200 POWER_MASKS | MASK_PPC_GPOPT},
db7f1e43
RK
201 {"powerpc", PROCESSOR_POWERPC,
202 MASK_POWERPC | MASK_NEW_MNEMONICS,
68c49ffa 203 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
3cb999d8
DE
204 {"powerpc64", PROCESSOR_POWERPC64,
205 MASK_POWERPC | MASK_POWERPC64 | MASK_NEW_MNEMONICS,
206 POWER_MASKS | POWERPC_OPT_MASKS},
db7f1e43 207 {"rios", PROCESSOR_RIOS1,
938937d8 208 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
209 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
210 {"rios1", PROCESSOR_RIOS1,
938937d8 211 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
212 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
213 {"rsc", PROCESSOR_PPC601,
938937d8 214 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
215 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
216 {"rsc1", PROCESSOR_PPC601,
938937d8 217 MASK_POWER | MASK_MULTIPLE | MASK_STRING,
db7f1e43
RK
218 MASK_POWER2 | POWERPC_MASKS | MASK_NEW_MNEMONICS},
219 {"rios2", PROCESSOR_RIOS2,
938937d8 220 MASK_POWER | MASK_MULTIPLE | MASK_STRING | MASK_POWER2,
db7f1e43 221 POWERPC_MASKS | MASK_NEW_MNEMONICS},
3cb999d8
DE
222 {"rs64a", PROCESSOR_RS64A,
223 MASK_POWERPC | MASK_NEW_MNEMONICS,
224 POWER_MASKS | POWERPC_OPT_MASKS},
a3a1dbf6
MM
225 {"401", PROCESSOR_PPC403,
226 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
227 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
49a0b204 228 {"403", PROCESSOR_PPC403,
daf11973 229 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS | MASK_STRICT_ALIGN,
49a0b204 230 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
cf27b467
MM
231 {"505", PROCESSOR_MPCCORE,
232 MASK_POWERPC | MASK_NEW_MNEMONICS,
233 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
5248c961 234 {"601", PROCESSOR_PPC601,
938937d8 235 MASK_POWER | MASK_POWERPC | MASK_NEW_MNEMONICS | MASK_MULTIPLE | MASK_STRING,
68c49ffa 236 MASK_POWER2 | POWERPC_OPT_MASKS | MASK_POWERPC64},
1ec26da6 237 {"602", PROCESSOR_PPC603,
cf27b467
MM
238 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
239 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
5248c961 240 {"603", PROCESSOR_PPC603,
68c49ffa
RK
241 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
242 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
b6c9286a
MM
243 {"603e", PROCESSOR_PPC603,
244 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
245 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
b5370a88 246 {"ec603e", PROCESSOR_PPC603,
a3a1dbf6
MM
247 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
248 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
5248c961 249 {"604", PROCESSOR_PPC604,
b6c9286a
MM
250 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
251 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
cac8ce95 252 {"604e", PROCESSOR_PPC604e,
07e6159a
MM
253 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
254 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
b6c9286a 255 {"620", PROCESSOR_PPC620,
68c49ffa 256 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
a260abc9 257 POWER_MASKS | MASK_PPC_GPOPT},
3cb999d8
DE
258 {"630", PROCESSOR_PPC630,
259 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
260 POWER_MASKS | MASK_PPC_GPOPT},
bef84347
VM
261 {"740", PROCESSOR_PPC750,
262 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
263 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
264 {"750", PROCESSOR_PPC750,
265 MASK_POWERPC | MASK_PPC_GFXOPT | MASK_NEW_MNEMONICS,
266 POWER_MASKS | MASK_PPC_GPOPT | MASK_POWERPC64},
07e6159a
MM
267 {"801", PROCESSOR_MPCCORE,
268 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
269 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
cf27b467
MM
270 {"821", PROCESSOR_MPCCORE,
271 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
272 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
07e6159a
MM
273 {"823", PROCESSOR_MPCCORE,
274 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
275 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
cf27b467
MM
276 {"860", PROCESSOR_MPCCORE,
277 MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
278 POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64}};
5248c961 279
c4d38ccb 280 size_t ptt_size = sizeof (processor_target_table) / sizeof (struct ptt);
5248c961 281
8a61d227 282 int multiple = TARGET_MULTIPLE; /* save current -mmultiple/-mno-multiple status */
938937d8 283 int string = TARGET_STRING; /* save current -mstring/-mno-string status */
8a61d227 284
5248c961
RK
285 profile_block_flag = 0;
286
287 /* Identify the processor type */
8e3f41e7 288 rs6000_select[0].string = default_cpu;
3cb999d8 289 rs6000_cpu = TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT;
8e3f41e7 290
b6a1cbae 291 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
5248c961 292 {
8e3f41e7
MM
293 ptr = &rs6000_select[i];
294 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
5248c961 295 {
8e3f41e7
MM
296 for (j = 0; j < ptt_size; j++)
297 if (! strcmp (ptr->string, processor_target_table[j].name))
298 {
299 if (ptr->set_tune_p)
300 rs6000_cpu = processor_target_table[j].processor;
301
302 if (ptr->set_arch_p)
303 {
304 target_flags |= processor_target_table[j].target_enable;
305 target_flags &= ~processor_target_table[j].target_disable;
306 }
307 break;
308 }
309
4406229e 310 if (j == ptt_size)
8e3f41e7 311 error ("bad value (%s) for %s switch", ptr->string, ptr->name);
5248c961
RK
312 }
313 }
8a61d227 314
ef792183
MM
315 /* If we are optimizing big endian systems for space, use the
316 store multiple instructions. */
317 if (BYTES_BIG_ENDIAN && optimize_size)
318 target_flags |= MASK_MULTIPLE;
319
8a61d227
MM
320 /* If -mmultiple or -mno-multiple was explicitly used, don't
321 override with the processor default */
322 if (TARGET_MULTIPLE_SET)
323 target_flags = (target_flags & ~MASK_MULTIPLE) | multiple;
7e69e155 324
938937d8
MM
325 /* If -mstring or -mno-string was explicitly used, don't
326 override with the processor default */
327 if (TARGET_STRING_SET)
1f5515bf 328 target_flags = (target_flags & ~MASK_STRING) | string;
938937d8 329
bef84347
VM
330 /* Don't allow -mmultiple or -mstring on little endian systems unless the cpu
331 is a 750, because the hardware doesn't support the instructions used in
332 little endian mode, and causes an alignment trap. The 750 does not cause
333 an alignment trap (except when the target is unaligned). */
334
bfc79d3b 335 if (! BYTES_BIG_ENDIAN && rs6000_cpu != PROCESSOR_PPC750)
7e69e155
MM
336 {
337 if (TARGET_MULTIPLE)
338 {
339 target_flags &= ~MASK_MULTIPLE;
340 if (TARGET_MULTIPLE_SET)
341 warning ("-mmultiple is not supported on little endian systems");
342 }
343
344 if (TARGET_STRING)
345 {
346 target_flags &= ~MASK_STRING;
938937d8
MM
347 if (TARGET_STRING_SET)
348 warning ("-mstring is not supported on little endian systems");
7e69e155
MM
349 }
350 }
3933e0e1 351
a260abc9
DE
352 if (flag_pic && (DEFAULT_ABI == ABI_AIX))
353 {
354 warning ("-f%s ignored for AIX (all code is position independent)",
355 (flag_pic > 1) ? "PIC" : "pic");
356 flag_pic = 0;
357 }
358
9861b0c9
DE
359 if (flag_function_sections && (write_symbols != NO_DEBUG)
360 && (DEFAULT_ABI == ABI_AIX))
361 {
362 warning ("-ffunction-sections disabled on AIX when debugging");
363 flag_function_sections = 0;
364 }
365
366 if (flag_data_sections && (DEFAULT_ABI == ABI_AIX))
367 {
368 warning ("-fdata-sections not supported on AIX");
369 flag_data_sections = 0;
370 }
371
38c1f2d7
MM
372 /* Set debug flags */
373 if (rs6000_debug_name)
374 {
bfc79d3b 375 if (! strcmp (rs6000_debug_name, "all"))
38c1f2d7 376 rs6000_debug_stack = rs6000_debug_arg = 1;
bfc79d3b 377 else if (! strcmp (rs6000_debug_name, "stack"))
38c1f2d7 378 rs6000_debug_stack = 1;
bfc79d3b 379 else if (! strcmp (rs6000_debug_name, "arg"))
38c1f2d7
MM
380 rs6000_debug_arg = 1;
381 else
382 error ("Unknown -mdebug-%s switch", rs6000_debug_name);
383 }
384
c81bebd7
MM
385#ifdef TARGET_REGNAMES
386 /* If the user desires alternate register names, copy in the alternate names
387 now. */
388 if (TARGET_REGNAMES)
4e135bdd 389 memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));
c81bebd7
MM
390#endif
391
3933e0e1
MM
392#ifdef SUBTARGET_OVERRIDE_OPTIONS
393 SUBTARGET_OVERRIDE_OPTIONS;
394#endif
c8023011
MM
395
396 /* Register global variables with the garbage collector. */
397 rs6000_add_gc_roots ();
9ebbca7d
GK
398
399 /* Allocate an alias set for register saves & restores from stack. */
400 rs6000_sr_alias_set = new_alias_set ();
401
402 if (TARGET_TOC)
403 ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1);
71f123ca
FS
404
405 /* Arrange to save and restore machine status around nested functions. */
406 init_machine_status = rs6000_init_machine_status;
407 mark_machine_status = rs6000_mark_machine_status;
408 free_machine_status = rs6000_free_machine_status;
5248c961 409}
5accd822
DE
410
411void
412optimization_options (level, size)
e2c953b6 413 int level ATTRIBUTE_UNUSED;
5accd822
DE
414 int size ATTRIBUTE_UNUSED;
415{
5accd822 416}
3cfa4909
MM
417\f
418/* Do anything needed at the start of the asm file. */
419
420void
421rs6000_file_start (file, default_cpu)
422 FILE *file;
d330fd93 423 const char *default_cpu;
3cfa4909 424{
c4d38ccb 425 size_t i;
3cfa4909 426 char buffer[80];
d330fd93 427 const char *start = buffer;
3cfa4909
MM
428 struct rs6000_cpu_select *ptr;
429
430 if (flag_verbose_asm)
431 {
432 sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);
433 rs6000_select[0].string = default_cpu;
434
b6a1cbae 435 for (i = 0; i < ARRAY_SIZE (rs6000_select); i++)
3cfa4909
MM
436 {
437 ptr = &rs6000_select[i];
438 if (ptr->string != (char *)0 && ptr->string[0] != '\0')
439 {
440 fprintf (file, "%s %s%s", start, ptr->name, ptr->string);
441 start = "";
442 }
443 }
444
445#ifdef USING_SVR4_H
446 switch (rs6000_sdata)
447 {
448 case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break;
449 case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break;
450 case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break;
451 case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break;
452 }
453
454 if (rs6000_sdata && g_switch_value)
455 {
456 fprintf (file, "%s -G %d", start, g_switch_value);
457 start = "";
458 }
459#endif
460
461 if (*start == '\0')
949ea356 462 putc ('\n', file);
3cfa4909
MM
463 }
464}
465
24d304eb
RK
466\f
467/* Create a CONST_DOUBLE from a string. */
468
469struct rtx_def *
470rs6000_float_const (string, mode)
d330fd93 471 const char *string;
24d304eb
RK
472 enum machine_mode mode;
473{
ca5adc63
GK
474 REAL_VALUE_TYPE value;
475 value = REAL_VALUE_ATOF (string, mode);
24d304eb
RK
476 return immed_real_const_1 (value, mode);
477}
5248c961 478\f
9878760c
RK
479/* Return non-zero if this function is known to have a null epilogue. */
480
481int
482direct_return ()
483{
4697a36c
MM
484 if (reload_completed)
485 {
486 rs6000_stack_t *info = rs6000_stack_info ();
487
488 if (info->first_gp_reg_save == 32
489 && info->first_fp_reg_save == 64
c81fc13e
DE
490 && ! info->lr_save_p
491 && ! info->cr_save_p
492 && ! info->push_p)
4697a36c
MM
493 return 1;
494 }
495
496 return 0;
9878760c
RK
497}
498
499/* Returns 1 always. */
500
501int
502any_operand (op, mode)
296b8152
KG
503 register rtx op ATTRIBUTE_UNUSED;
504 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
505{
506 return 1;
507}
508
b6c9286a 509/* Returns 1 if op is the count register */
38c1f2d7
MM
510int
511count_register_operand(op, mode)
b6c9286a 512 register rtx op;
296b8152 513 enum machine_mode mode ATTRIBUTE_UNUSED;
b6c9286a
MM
514{
515 if (GET_CODE (op) != REG)
516 return 0;
517
518 if (REGNO (op) == COUNT_REGISTER_REGNUM)
519 return 1;
520
521 if (REGNO (op) > FIRST_PSEUDO_REGISTER)
522 return 1;
523
524 return 0;
525}
526
38c1f2d7 527int
9ebbca7d 528xer_operand(op, mode)
802a0058 529 register rtx op;
296b8152 530 enum machine_mode mode ATTRIBUTE_UNUSED;
802a0058
MM
531{
532 if (GET_CODE (op) != REG)
533 return 0;
534
9ebbca7d 535 if (XER_REGNO_P (REGNO (op)))
802a0058
MM
536 return 1;
537
802a0058
MM
538 return 0;
539}
540
9878760c
RK
541/* Return 1 if OP is a constant that can fit in a D field. */
542
543int
544short_cint_operand (op, mode)
545 register rtx op;
296b8152 546 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c 547{
5f59ecb7
DE
548 return (GET_CODE (op) == CONST_INT
549 && CONST_OK_FOR_LETTER_P (INTVAL (op), 'I'));
9878760c
RK
550}
551
552/* Similar for a unsigned D field. */
553
554int
555u_short_cint_operand (op, mode)
556 register rtx op;
296b8152 557 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c 558{
19684119 559 return (GET_CODE (op) == CONST_INT
5f59ecb7 560 && CONST_OK_FOR_LETTER_P (INTVAL (op), 'K'));
9878760c
RK
561}
562
dcfedcd0
RK
563/* Return 1 if OP is a CONST_INT that cannot fit in a signed D field. */
564
565int
566non_short_cint_operand (op, mode)
567 register rtx op;
296b8152 568 enum machine_mode mode ATTRIBUTE_UNUSED;
dcfedcd0
RK
569{
570 return (GET_CODE (op) == CONST_INT
a7653a2c 571 && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x8000) >= 0x10000);
dcfedcd0
RK
572}
573
9878760c
RK
574/* Returns 1 if OP is a register that is not special (i.e., not MQ,
575 ctr, or lr). */
576
577int
cd2b37d9 578gpc_reg_operand (op, mode)
9878760c
RK
579 register rtx op;
580 enum machine_mode mode;
581{
582 return (register_operand (op, mode)
802a0058 583 && (GET_CODE (op) != REG
9ebbca7d
GK
584 || (REGNO (op) >= ARG_POINTER_REGNUM
585 && !XER_REGNO_P (REGNO (op)))
586 || REGNO (op) < MQ_REGNO));
9878760c
RK
587}
588
589/* Returns 1 if OP is either a pseudo-register or a register denoting a
590 CR field. */
591
592int
593cc_reg_operand (op, mode)
594 register rtx op;
595 enum machine_mode mode;
596{
597 return (register_operand (op, mode)
598 && (GET_CODE (op) != REG
599 || REGNO (op) >= FIRST_PSEUDO_REGISTER
600 || CR_REGNO_P (REGNO (op))));
601}
602
815cdc52
MM
603/* Returns 1 if OP is either a pseudo-register or a register denoting a
604 CR field that isn't CR0. */
605
606int
607cc_reg_not_cr0_operand (op, mode)
608 register rtx op;
609 enum machine_mode mode;
610{
611 return (register_operand (op, mode)
612 && (GET_CODE (op) != REG
613 || REGNO (op) >= FIRST_PSEUDO_REGISTER
614 || CR_REGNO_NOT_CR0_P (REGNO (op))));
615}
616
9878760c
RK
617/* Returns 1 if OP is either a constant integer valid for a D-field or a
618 non-special register. If a register, it must be in the proper mode unless
619 MODE is VOIDmode. */
620
621int
622reg_or_short_operand (op, mode)
623 register rtx op;
624 enum machine_mode mode;
625{
f5a28898 626 return short_cint_operand (op, mode) || gpc_reg_operand (op, mode);
9878760c
RK
627}
628
629/* Similar, except check if the negation of the constant would be valid for
630 a D-field. */
631
632int
633reg_or_neg_short_operand (op, mode)
634 register rtx op;
635 enum machine_mode mode;
636{
637 if (GET_CODE (op) == CONST_INT)
638 return CONST_OK_FOR_LETTER_P (INTVAL (op), 'P');
639
cd2b37d9 640 return gpc_reg_operand (op, mode);
9878760c
RK
641}
642
643/* Return 1 if the operand is either a register or an integer whose high-order
644 16 bits are zero. */
645
646int
647reg_or_u_short_operand (op, mode)
648 register rtx op;
649 enum machine_mode mode;
650{
e675f625 651 return u_short_cint_operand (op, mode) || gpc_reg_operand (op, mode);
9878760c
RK
652}
653
654/* Return 1 is the operand is either a non-special register or ANY
655 constant integer. */
656
657int
658reg_or_cint_operand (op, mode)
659 register rtx op;
660 enum machine_mode mode;
661{
f6bf7de2
DE
662 return (GET_CODE (op) == CONST_INT || gpc_reg_operand (op, mode));
663}
664
665/* Return 1 is the operand is either a non-special register or ANY
666 32-bit signed constant integer. */
667
668int
669reg_or_arith_cint_operand (op, mode)
670 register rtx op;
671 enum machine_mode mode;
672{
673 return (gpc_reg_operand (op, mode)
674 || (GET_CODE (op) == CONST_INT
675#if HOST_BITS_PER_WIDE_INT != 32
676 && ((unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80000000)
78e1b90d 677 < (unsigned HOST_WIDE_INT) 0x100000000ll)
f6bf7de2
DE
678#endif
679 ));
9878760c
RK
680}
681
9ebbca7d
GK
682/* Return 1 is the operand is either a non-special register or ANY
683 32-bit unsigned constant integer. */
684
685int
1d328b19 686reg_or_logical_cint_operand (op, mode)
9ebbca7d
GK
687 register rtx op;
688 enum machine_mode mode;
689{
1d328b19
GK
690 if (GET_CODE (op) == CONST_INT)
691 {
692 if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
693 {
694 if (GET_MODE_BITSIZE (mode) <= 32)
695 abort();
696
697 if (INTVAL (op) < 0)
698 return 0;
699 }
700
701 return ((INTVAL (op) & GET_MODE_MASK (mode)
0858c623 702 & (~ (unsigned HOST_WIDE_INT) 0xffffffff)) == 0);
1d328b19
GK
703 }
704 else if (GET_CODE (op) == CONST_DOUBLE)
705 {
706 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
707 || mode != DImode)
708 abort();
709
710 return CONST_DOUBLE_HIGH (op) == 0;
711 }
712 else
713 return gpc_reg_operand (op, mode);
9ebbca7d
GK
714}
715
766a866c
MM
716/* Return 1 if the operand is an operand that can be loaded via the GOT */
717
718int
719got_operand (op, mode)
720 register rtx op;
296b8152 721 enum machine_mode mode ATTRIBUTE_UNUSED;
766a866c
MM
722{
723 return (GET_CODE (op) == SYMBOL_REF
724 || GET_CODE (op) == CONST
725 || GET_CODE (op) == LABEL_REF);
726}
727
38c1f2d7
MM
728/* Return 1 if the operand is a simple references that can be loaded via
729 the GOT (labels involving addition aren't allowed). */
730
731int
732got_no_const_operand (op, mode)
733 register rtx op;
296b8152 734 enum machine_mode mode ATTRIBUTE_UNUSED;
38c1f2d7
MM
735{
736 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF);
737}
738
4e74d8ec
MM
739/* Return the number of instructions it takes to form a constant in an
740 integer register. */
741
742static int
743num_insns_constant_wide (value)
744 HOST_WIDE_INT value;
745{
746 /* signed constant loadable with {cal|addi} */
5f59ecb7 747 if (CONST_OK_FOR_LETTER_P (value, 'I'))
0865c631
GK
748 return 1;
749
4e74d8ec 750 /* constant loadable with {cau|addis} */
5f59ecb7 751 else if (CONST_OK_FOR_LETTER_P (value, 'L'))
4e74d8ec
MM
752 return 1;
753
5f59ecb7 754#if HOST_BITS_PER_WIDE_INT == 64
c81fc13e 755 else if (TARGET_POWERPC64)
4e74d8ec 756 {
0d30d435 757 HOST_WIDE_INT low = value & 0xffffffff;
4e74d8ec
MM
758 HOST_WIDE_INT high = value >> 32;
759
0d30d435
DE
760 low = (low ^ 0x80000000) - 0x80000000; /* sign extend */
761
0858c623 762 if (high == 0 && (low & 0x80000000) == 0)
4e74d8ec
MM
763 return 2;
764
0858c623 765 else if (high == -1 && (low & 0x80000000) != 0)
4e74d8ec
MM
766 return 2;
767
c81fc13e 768 else if (! low)
4e74d8ec
MM
769 return num_insns_constant_wide (high) + 1;
770
771 else
772 return (num_insns_constant_wide (high)
e396202a 773 + num_insns_constant_wide (low) + 1);
4e74d8ec
MM
774 }
775#endif
776
777 else
778 return 2;
779}
780
781int
782num_insns_constant (op, mode)
783 rtx op;
784 enum machine_mode mode;
785{
4e74d8ec 786 if (GET_CODE (op) == CONST_INT)
0d30d435
DE
787 {
788#if HOST_BITS_PER_WIDE_INT == 64
789 if (mask64_operand (op, mode))
790 return 2;
791 else
792#endif
793 return num_insns_constant_wide (INTVAL (op));
794 }
4e74d8ec 795
6fc48950
MM
796 else if (GET_CODE (op) == CONST_DOUBLE && mode == SFmode)
797 {
798 long l;
799 REAL_VALUE_TYPE rv;
800
801 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
802 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
803 return num_insns_constant_wide ((HOST_WIDE_INT)l);
804 }
805
47ad8c61 806 else if (GET_CODE (op) == CONST_DOUBLE)
4e74d8ec 807 {
47ad8c61
MM
808 HOST_WIDE_INT low;
809 HOST_WIDE_INT high;
810 long l[2];
811 REAL_VALUE_TYPE rv;
812 int endian = (WORDS_BIG_ENDIAN == 0);
4e74d8ec 813
47ad8c61
MM
814 if (mode == VOIDmode || mode == DImode)
815 {
816 high = CONST_DOUBLE_HIGH (op);
817 low = CONST_DOUBLE_LOW (op);
818 }
819 else
820 {
821 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
822 REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
823 high = l[endian];
824 low = l[1 - endian];
825 }
4e74d8ec 826
47ad8c61
MM
827 if (TARGET_32BIT)
828 return (num_insns_constant_wide (low)
829 + num_insns_constant_wide (high));
4e74d8ec
MM
830
831 else
47ad8c61 832 {
0858c623 833 if (high == 0 && (low & 0x80000000) == 0)
47ad8c61
MM
834 return num_insns_constant_wide (low);
835
0858c623 836 else if (high == -1 && (low & 0x80000000) != 0)
47ad8c61
MM
837 return num_insns_constant_wide (low);
838
a260abc9
DE
839 else if (mask64_operand (op, mode))
840 return 2;
841
47ad8c61
MM
842 else if (low == 0)
843 return num_insns_constant_wide (high) + 1;
844
845 else
846 return (num_insns_constant_wide (high)
847 + num_insns_constant_wide (low) + 1);
848 }
4e74d8ec
MM
849 }
850
851 else
852 abort ();
853}
854
6f2f8311
RK
855/* Return 1 if the operand is a CONST_DOUBLE and it can be put into a register
856 with one instruction per word. We only do this if we can safely read
857 CONST_DOUBLE_{LOW,HIGH}. */
9878760c
RK
858
859int
860easy_fp_constant (op, mode)
861 register rtx op;
862 register enum machine_mode mode;
863{
9878760c
RK
864 if (GET_CODE (op) != CONST_DOUBLE
865 || GET_MODE (op) != mode
4e74d8ec 866 || (GET_MODE_CLASS (mode) != MODE_FLOAT && mode != DImode))
9878760c
RK
867 return 0;
868
b6c9286a 869 /* Consider all constants with -msoft-float to be easy */
4e74d8ec 870 if (TARGET_SOFT_FLOAT && mode != DImode)
b6c9286a
MM
871 return 1;
872
a7273471
MM
873 /* If we are using V.4 style PIC, consider all constants to be hard */
874 if (flag_pic && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS))
875 return 0;
876
5ae4759c
MM
877#ifdef TARGET_RELOCATABLE
878 /* Similarly if we are using -mrelocatable, consider all constants to be hard */
879 if (TARGET_RELOCATABLE)
880 return 0;
881#endif
882
042259f2
DE
883 if (mode == DFmode)
884 {
885 long k[2];
886 REAL_VALUE_TYPE rv;
887
888 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
889 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
9878760c 890
4e74d8ec
MM
891 return (num_insns_constant_wide ((HOST_WIDE_INT)k[0]) == 1
892 && num_insns_constant_wide ((HOST_WIDE_INT)k[1]) == 1);
042259f2 893 }
4e74d8ec
MM
894
895 else if (mode == SFmode)
042259f2
DE
896 {
897 long l;
898 REAL_VALUE_TYPE rv;
899
900 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
901 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
9878760c 902
4e74d8ec 903 return num_insns_constant_wide (l) == 1;
042259f2 904 }
4e74d8ec 905
a260abc9 906 else if (mode == DImode)
c81fc13e 907 return ((TARGET_POWERPC64
a260abc9
DE
908 && GET_CODE (op) == CONST_DOUBLE && CONST_DOUBLE_LOW (op) == 0)
909 || (num_insns_constant (op, DImode) <= 2));
4e74d8ec 910
a9098fd0
GK
911 else if (mode == SImode)
912 return 1;
4e74d8ec
MM
913 else
914 abort ();
9878760c 915}
8f75773e 916
b6c9286a
MM
917/* Return 1 if the operand is in volatile memory. Note that during the
918 RTL generation phase, memory_operand does not return TRUE for
919 volatile memory references. So this function allows us to
920 recognize volatile references where its safe. */
921
922int
923volatile_mem_operand (op, mode)
924 register rtx op;
925 enum machine_mode mode;
926{
927 if (GET_CODE (op) != MEM)
928 return 0;
929
930 if (!MEM_VOLATILE_P (op))
931 return 0;
932
933 if (mode != GET_MODE (op))
934 return 0;
935
936 if (reload_completed)
937 return memory_operand (op, mode);
938
939 if (reload_in_progress)
940 return strict_memory_address_p (mode, XEXP (op, 0));
941
942 return memory_address_p (mode, XEXP (op, 0));
943}
944
97f6e72f 945/* Return 1 if the operand is an offsettable memory operand. */
914c2e77
RK
946
947int
97f6e72f 948offsettable_mem_operand (op, mode)
914c2e77
RK
949 register rtx op;
950 enum machine_mode mode;
951{
97f6e72f 952 return ((GET_CODE (op) == MEM)
677a9668 953 && offsettable_address_p (reload_completed || reload_in_progress,
97f6e72f 954 mode, XEXP (op, 0)));
914c2e77
RK
955}
956
9878760c
RK
957/* Return 1 if the operand is either an easy FP constant (see above) or
958 memory. */
959
960int
961mem_or_easy_const_operand (op, mode)
962 register rtx op;
963 enum machine_mode mode;
964{
965 return memory_operand (op, mode) || easy_fp_constant (op, mode);
966}
967
968/* Return 1 if the operand is either a non-special register or an item
5f59ecb7 969 that can be used as the operand of a `mode' add insn. */
9878760c
RK
970
971int
972add_operand (op, mode)
973 register rtx op;
974 enum machine_mode mode;
975{
976 return (reg_or_short_operand (op, mode)
19684119 977 || (GET_CODE (op) == CONST_INT
38886f37 978 && CONST_OK_FOR_LETTER_P (INTVAL (op), 'L')));
9878760c
RK
979}
980
dcfedcd0
RK
981/* Return 1 if OP is a constant but not a valid add_operand. */
982
983int
984non_add_cint_operand (op, mode)
985 register rtx op;
296b8152 986 enum machine_mode mode ATTRIBUTE_UNUSED;
dcfedcd0
RK
987{
988 return (GET_CODE (op) == CONST_INT
a7653a2c 989 && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x8000) >= 0x10000
38886f37 990 && ! CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'));
dcfedcd0
RK
991}
992
9878760c
RK
993/* Return 1 if the operand is a non-special register or a constant that
994 can be used as the operand of an OR or XOR insn on the RS/6000. */
995
996int
997logical_operand (op, mode)
998 register rtx op;
999 enum machine_mode mode;
1000{
1d328b19
GK
1001 /* an unsigned representation of 'op'. */
1002 unsigned HOST_WIDE_INT opl, oph;
1003
dfbdccdb
GK
1004 if (gpc_reg_operand (op, mode))
1005 return 1;
1d328b19 1006
dfbdccdb 1007 if (GET_CODE (op) == CONST_INT)
38886f37 1008 opl = INTVAL (op);
dfbdccdb
GK
1009 else if (GET_CODE (op) == CONST_DOUBLE)
1010 {
1d328b19
GK
1011 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
1012 abort();
1013
1014 opl = CONST_DOUBLE_LOW (op);
1015 oph = CONST_DOUBLE_HIGH (op);
38886f37
AO
1016
1017 if (oph != ((unsigned HOST_WIDE_INT)0
1018 - ((opl & ((unsigned HOST_WIDE_INT)1
1019 << (HOST_BITS_PER_WIDE_INT - 1))) != 0)))
1020 return 0;
dfbdccdb
GK
1021 }
1022 else
1023 return 0;
1d328b19 1024
38886f37 1025 /* This must really be SImode, not MODE. */
78e1b90d 1026 if (opl != (unsigned HOST_WIDE_INT) trunc_int_for_mode (opl, SImode))
38886f37
AO
1027 return 0;
1028
1029 return ((opl & 0xffff) == 0
1030 || (opl & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0);
9878760c
RK
1031}
1032
dcfedcd0 1033/* Return 1 if C is a constant that is not a logical operand (as
1d328b19 1034 above), but could be split into one. */
dcfedcd0
RK
1035
1036int
1037non_logical_cint_operand (op, mode)
1038 register rtx op;
5f59ecb7 1039 enum machine_mode mode;
dcfedcd0 1040{
dfbdccdb 1041 return ((GET_CODE (op) == CONST_INT || GET_CODE (op) == CONST_DOUBLE)
1d328b19
GK
1042 && ! logical_operand (op, mode)
1043 && reg_or_logical_cint_operand (op, mode));
dcfedcd0
RK
1044}
1045
19ba8161 1046/* Return 1 if C is a constant that can be encoded in a 32-bit mask on the
9878760c
RK
1047 RS/6000. It is if there are no more than two 1->0 or 0->1 transitions.
1048 Reject all ones and all zeros, since these should have been optimized
1049 away and confuse the making of MB and ME. */
1050
1051int
19ba8161
DE
1052mask_operand (op, mode)
1053 register rtx op;
1054 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c 1055{
19ba8161 1056 HOST_WIDE_INT c;
9878760c
RK
1057 int i;
1058 int last_bit_value;
1059 int transitions = 0;
1060
19ba8161
DE
1061 if (GET_CODE (op) != CONST_INT)
1062 return 0;
1063
1064 c = INTVAL (op);
1065
9878760c
RK
1066 if (c == 0 || c == ~0)
1067 return 0;
1068
1069 last_bit_value = c & 1;
1070
1071 for (i = 1; i < 32; i++)
1072 if (((c >>= 1) & 1) != last_bit_value)
1073 last_bit_value ^= 1, transitions++;
1074
1075 return transitions <= 2;
1076}
1077
a260abc9
DE
1078/* Return 1 if the operand is a constant that is a PowerPC64 mask.
1079 It is if there are no more than one 1->0 or 0->1 transitions.
1080 Reject all ones and all zeros, since these should have been optimized
1081 away and confuse the making of MB and ME. */
9878760c
RK
1082
1083int
a260abc9
DE
1084mask64_operand (op, mode)
1085 register rtx op;
1086 enum machine_mode mode;
1087{
1088 if (GET_CODE (op) == CONST_INT)
1089 {
1090 HOST_WIDE_INT c = INTVAL (op);
1091 int i;
1092 int last_bit_value;
1093 int transitions = 0;
1094
1095 if (c == 0 || c == ~0)
1096 return 0;
1097
1098 last_bit_value = c & 1;
1099
1100 for (i = 1; i < HOST_BITS_PER_WIDE_INT; i++)
1101 if (((c >>= 1) & 1) != last_bit_value)
1102 last_bit_value ^= 1, transitions++;
1103
e2c953b6
DE
1104 return transitions <= 1;
1105 }
1106 else if (GET_CODE (op) == CONST_DOUBLE
1107 && (mode == VOIDmode || mode == DImode))
1108 {
1109 HOST_WIDE_INT low = CONST_DOUBLE_LOW (op);
1110#if HOST_BITS_PER_WIDE_INT == 32
1111 HOST_WIDE_INT high = CONST_DOUBLE_HIGH (op);
1112#endif
1113 int i;
1114 int last_bit_value;
1115 int transitions = 0;
1116
1117 if ((low == 0
1118#if HOST_BITS_PER_WIDE_INT == 32
1119 && high == 0
1120#endif
1121 )
1122 || (low == ~0
1123#if HOST_BITS_PER_WIDE_INT == 32
1124 && high == ~0
1125#endif
1126 ))
1127 return 0;
1128
1129 last_bit_value = low & 1;
1130
1131 for (i = 1; i < HOST_BITS_PER_WIDE_INT; i++)
1132 if (((low >>= 1) & 1) != last_bit_value)
1133 last_bit_value ^= 1, transitions++;
1134
a238cd8b 1135#if HOST_BITS_PER_WIDE_INT == 32
e2c953b6
DE
1136 if ((high & 1) != last_bit_value)
1137 last_bit_value ^= 1, transitions++;
1138
1139 for (i = 1; i < HOST_BITS_PER_WIDE_INT; i++)
1140 if (((high >>= 1) & 1) != last_bit_value)
1141 last_bit_value ^= 1, transitions++;
a260abc9
DE
1142#endif
1143
1144 return transitions <= 1;
1145 }
e2c953b6
DE
1146 else
1147 return 0;
1148}
1149
1150/* Return 1 if the operand is a constant that is a PowerPC64 mask.
1151 It is if there are no more than two 1->0 or 0->1 transitions.
1152 Reject all ones and all zeros, since these should have been optimized
1153 away and confuse the making of MB and ME. */
1154
1155int
1156rldic_operand (op, mode)
1157 register rtx op;
1158 enum machine_mode mode;
1159{
1160 if (GET_CODE (op) == CONST_INT)
1161 {
1162 HOST_WIDE_INT c = INTVAL (op);
1163 int i;
1164 int last_bit_value;
1165 int transitions = 0;
1166
1167 if (c == 0 || c == ~0)
1168 return 0;
1169
1170 last_bit_value = c & 1;
1171
1172 for (i = 1; i < HOST_BITS_PER_WIDE_INT; i++)
1173 if (((c >>= 1) & 1) != last_bit_value)
1174 last_bit_value ^= 1, transitions++;
1175
1176 return transitions <= 2;
1177 }
a260abc9
DE
1178 else if (GET_CODE (op) == CONST_DOUBLE
1179 && (mode == VOIDmode || mode == DImode))
1180 {
1181 HOST_WIDE_INT low = CONST_DOUBLE_LOW (op);
a238cd8b 1182#if HOST_BITS_PER_WIDE_INT == 32
a260abc9
DE
1183 HOST_WIDE_INT high = CONST_DOUBLE_HIGH (op);
1184#endif
1185 int i;
1186 int last_bit_value;
1187 int transitions = 0;
1188
1189 if ((low == 0
a238cd8b 1190#if HOST_BITS_PER_WIDE_INT == 32
a260abc9
DE
1191 && high == 0
1192#endif
1193 )
1194 || (low == ~0
a238cd8b 1195#if HOST_BITS_PER_WIDE_INT == 32
a260abc9
DE
1196 && high == ~0
1197#endif
1198 ))
1199 return 0;
1200
1201 last_bit_value = low & 1;
1202
1203 for (i = 1; i < HOST_BITS_PER_WIDE_INT; i++)
1204 if (((low >>= 1) & 1) != last_bit_value)
1205 last_bit_value ^= 1, transitions++;
1206
a238cd8b 1207#if HOST_BITS_PER_WIDE_INT == 32
a260abc9
DE
1208 if ((high & 1) != last_bit_value)
1209 last_bit_value ^= 1, transitions++;
1210
1211 for (i = 1; i < HOST_BITS_PER_WIDE_INT; i++)
1212 if (((high >>= 1) & 1) != last_bit_value)
1213 last_bit_value ^= 1, transitions++;
1214#endif
1215
e2c953b6 1216 return transitions <= 2;
a260abc9
DE
1217 }
1218 else
1219 return 0;
1220}
1221
1222/* Return 1 if the operand is either a non-special register or a constant
1223 that can be used as the operand of a PowerPC64 logical AND insn. */
1224
1225int
1226and64_operand (op, mode)
9878760c
RK
1227 register rtx op;
1228 enum machine_mode mode;
1229{
9ebbca7d 1230 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
52d3af72
DE
1231 return (gpc_reg_operand (op, mode) || mask64_operand (op, mode));
1232
1233 return (logical_operand (op, mode) || mask64_operand (op, mode));
9878760c
RK
1234}
1235
a260abc9
DE
1236/* Return 1 if the operand is either a non-special register or a
1237 constant that can be used as the operand of an RS/6000 logical AND insn. */
dcfedcd0
RK
1238
1239int
a260abc9
DE
1240and_operand (op, mode)
1241 register rtx op;
1242 enum machine_mode mode;
dcfedcd0 1243{
9ebbca7d 1244 if (fixed_regs[CR0_REGNO]) /* CR0 not available, don't do andi./andis. */
52d3af72
DE
1245 return (gpc_reg_operand (op, mode) || mask_operand (op, mode));
1246
1247 return (logical_operand (op, mode) || mask_operand (op, mode));
dcfedcd0
RK
1248}
1249
9878760c
RK
1250/* Return 1 if the operand is a general register or memory operand. */
1251
1252int
1253reg_or_mem_operand (op, mode)
1254 register rtx op;
1255 register enum machine_mode mode;
1256{
b6c9286a
MM
1257 return (gpc_reg_operand (op, mode)
1258 || memory_operand (op, mode)
1259 || volatile_mem_operand (op, mode));
9878760c
RK
1260}
1261
a7a813f7 1262/* Return 1 if the operand is a general register or memory operand without
3cb999d8 1263 pre_inc or pre_dec which produces invalid form of PowerPC lwa
a7a813f7
RK
1264 instruction. */
1265
1266int
1267lwa_operand (op, mode)
1268 register rtx op;
1269 register enum machine_mode mode;
1270{
1271 rtx inner = op;
1272
1273 if (reload_completed && GET_CODE (inner) == SUBREG)
1274 inner = SUBREG_REG (inner);
1275
1276 return gpc_reg_operand (inner, mode)
1277 || (memory_operand (inner, mode)
1278 && GET_CODE (XEXP (inner, 0)) != PRE_INC
1279 && GET_CODE (XEXP (inner, 0)) != PRE_DEC);
1280}
1281
9878760c
RK
1282/* Return 1 if the operand, used inside a MEM, is a valid first argument
1283 to CALL. This is a SYMBOL_REF or a pseudo-register, which will be
1284 forced to lr. */
1285
1286int
1287call_operand (op, mode)
1288 register rtx op;
1289 enum machine_mode mode;
1290{
1291 if (mode != VOIDmode && GET_MODE (op) != mode)
1292 return 0;
1293
1294 return (GET_CODE (op) == SYMBOL_REF
1295 || (GET_CODE (op) == REG && REGNO (op) >= FIRST_PSEUDO_REGISTER));
1296}
1297
2af3d377
RK
1298
1299/* Return 1 if the operand is a SYMBOL_REF for a function known to be in
8f1b829e 1300 this file and the function is not weakly defined. */
2af3d377
RK
1301
1302int
1303current_file_function_operand (op, mode)
1304 register rtx op;
296b8152 1305 enum machine_mode mode ATTRIBUTE_UNUSED;
2af3d377
RK
1306{
1307 return (GET_CODE (op) == SYMBOL_REF
1308 && (SYMBOL_REF_FLAG (op)
8f1b829e 1309 || (op == XEXP (DECL_RTL (current_function_decl), 0)
c81fc13e 1310 && ! DECL_WEAK (current_function_decl))));
2af3d377
RK
1311}
1312
1313
9878760c
RK
1314/* Return 1 if this operand is a valid input for a move insn. */
1315
1316int
1317input_operand (op, mode)
1318 register rtx op;
1319 enum machine_mode mode;
1320{
eb4e8003 1321 /* Memory is always valid. */
9878760c
RK
1322 if (memory_operand (op, mode))
1323 return 1;
1324
34792e82 1325 /* Only a tiny bit of handling for CONSTANT_P_RTX is necessary. */
01b4cf2b 1326 if (GET_CODE (op) == CONSTANT_P_RTX)
34792e82
JL
1327 return 1;
1328
eb4e8003
RK
1329 /* For floating-point, easy constants are valid. */
1330 if (GET_MODE_CLASS (mode) == MODE_FLOAT
1331 && CONSTANT_P (op)
1332 && easy_fp_constant (op, mode))
1333 return 1;
1334
4e74d8ec
MM
1335 /* Allow any integer constant. */
1336 if (GET_MODE_CLASS (mode) == MODE_INT
e675f625 1337 && (GET_CODE (op) == CONST_INT
e675f625 1338 || GET_CODE (op) == CONST_DOUBLE))
4e74d8ec
MM
1339 return 1;
1340
eb4e8003
RK
1341 /* For floating-point or multi-word mode, the only remaining valid type
1342 is a register. */
9878760c
RK
1343 if (GET_MODE_CLASS (mode) == MODE_FLOAT
1344 || GET_MODE_SIZE (mode) > UNITS_PER_WORD)
eb4e8003 1345 return register_operand (op, mode);
9878760c 1346
88fe15a1
RK
1347 /* The only cases left are integral modes one word or smaller (we
1348 do not get called for MODE_CC values). These can be in any
1349 register. */
1350 if (register_operand (op, mode))
a8b3aeda 1351 return 1;
88fe15a1 1352
84cf9dda 1353 /* A SYMBOL_REF referring to the TOC is valid. */
7fec4abd 1354 if (LEGITIMATE_CONSTANT_POOL_ADDRESS_P (op))
84cf9dda
RK
1355 return 1;
1356
9ebbca7d
GK
1357 /* A constant pool expression (relative to the TOC) is valid */
1358 if (TOC_RELATIVE_EXPR_P (op))
b6c9286a
MM
1359 return 1;
1360
88228c4b
MM
1361 /* V.4 allows SYMBOL_REFs and CONSTs that are in the small data region
1362 to be valid. */
c81bebd7 1363 if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
88228c4b
MM
1364 && (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST)
1365 && small_data_operand (op, Pmode))
1366 return 1;
1367
042259f2 1368 return 0;
9878760c 1369}
7509c759
MM
1370
1371/* Return 1 for an operand in small memory on V.4/eabi */
1372
1373int
1374small_data_operand (op, mode)
296b8152
KG
1375 rtx op ATTRIBUTE_UNUSED;
1376 enum machine_mode mode ATTRIBUTE_UNUSED;
7509c759 1377{
38c1f2d7 1378#if TARGET_ELF
5f59ecb7 1379 rtx sym_ref;
7509c759 1380
d9407988 1381 if (rs6000_sdata == SDATA_NONE || rs6000_sdata == SDATA_DATA)
a54d04b7 1382 return 0;
a54d04b7 1383
5b9d9a0c 1384 if (DEFAULT_ABI != ABI_V4 && DEFAULT_ABI != ABI_SOLARIS)
7509c759
MM
1385 return 0;
1386
88228c4b
MM
1387 if (GET_CODE (op) == SYMBOL_REF)
1388 sym_ref = op;
1389
1390 else if (GET_CODE (op) != CONST
1391 || GET_CODE (XEXP (op, 0)) != PLUS
1392 || GET_CODE (XEXP (XEXP (op, 0), 0)) != SYMBOL_REF
1393 || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT)
7509c759
MM
1394 return 0;
1395
88228c4b 1396 else
dbf55e53
MM
1397 {
1398 rtx sum = XEXP (op, 0);
1399 HOST_WIDE_INT summand;
1400
1401 /* We have to be careful here, because it is the referenced address
1402 that must be 32k from _SDA_BASE_, not just the symbol. */
1403 summand = INTVAL (XEXP (sum, 1));
1404 if (summand < 0 || summand > g_switch_value)
1405 return 0;
1406
1407 sym_ref = XEXP (sum, 0);
1408 }
88228c4b
MM
1409
1410 if (*XSTR (sym_ref, 0) != '@')
7509c759
MM
1411 return 0;
1412
1413 return 1;
d9407988
MM
1414
1415#else
1416 return 0;
1417#endif
7509c759 1418}
9ebbca7d
GK
1419\f
1420static int
1421constant_pool_expr_1 (op, have_sym, have_toc)
1422 rtx op;
1423 int *have_sym;
1424 int *have_toc;
1425{
1426 switch (GET_CODE(op))
1427 {
1428 case SYMBOL_REF:
1429 if (CONSTANT_POOL_ADDRESS_P (op))
1430 {
a9098fd0 1431 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (op), Pmode))
9ebbca7d
GK
1432 {
1433 *have_sym = 1;
1434 return 1;
1435 }
1436 else
1437 return 0;
1438 }
1439 else if (! strcmp (XSTR (op, 0), toc_label_name))
1440 {
1441 *have_toc = 1;
1442 return 1;
1443 }
1444 else
1445 return 0;
1446 case PLUS:
1447 case MINUS:
1448 return constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc) &&
1449 constant_pool_expr_1 (XEXP (op, 1), have_sym, have_toc);
1450 case CONST:
1451 return constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc);
1452 case CONST_INT:
1453 return 1;
1454 default:
1455 return 0;
1456 }
1457}
1458
1459int
1460constant_pool_expr_p (op)
1461 rtx op;
1462{
1463 int have_sym = 0;
1464 int have_toc = 0;
1465 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_sym;
1466}
1467
1468int
1469toc_relative_expr_p (op)
1470 rtx op;
1471{
1472 int have_sym = 0;
1473 int have_toc = 0;
1474 return constant_pool_expr_1 (op, &have_sym, &have_toc) && have_toc;
1475}
1476
1477/* Try machine-dependent ways of modifying an illegitimate address
1478 to be legitimate. If we find one, return the new, valid address.
1479 This is used from only one place: `memory_address' in explow.c.
1480
1481 OLDX is the address as it was before break_out_memory_refs was called.
1482 In some cases it is useful to look at this to decide what needs to be done.
1483
1484 MODE is passed so that this macro can use GO_IF_LEGITIMATE_ADDRESS.
1485
1486 It is always safe for this macro to do nothing. It exists to recognize
1487 opportunities to optimize the output.
1488
1489 On RS/6000, first check for the sum of a register with a constant
1490 integer that is out of range. If so, generate code to add the
1491 constant with the low-order 16 bits masked to the register and force
1492 this result into another register (this can be done with `cau').
1493 Then generate an address of REG+(CONST&0xffff), allowing for the
1494 possibility of bit 16 being a one.
1495
1496 Then check for the sum of a register and something not constant, try to
1497 load the other things into a register and return the sum. */
1498rtx
1499rs6000_legitimize_address (x, oldx, mode)
1500 rtx x;
1501 rtx oldx ATTRIBUTE_UNUSED;
1502 enum machine_mode mode;
1503{
1504 if (GET_CODE (x) == PLUS
1505 && GET_CODE (XEXP (x, 0)) == REG
1506 && GET_CODE (XEXP (x, 1)) == CONST_INT
1507 && (unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) + 0x8000) >= 0x10000)
1508 {
1509 HOST_WIDE_INT high_int, low_int;
1510 rtx sum;
1511 high_int = INTVAL (XEXP (x, 1)) & (~ (HOST_WIDE_INT) 0xffff);
1512 low_int = INTVAL (XEXP (x, 1)) & 0xffff;
1513 if (low_int & 0x8000)
1514 high_int += 0x10000, low_int |= ((HOST_WIDE_INT) -1) << 16;
1515 sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
1516 GEN_INT (high_int)), 0);
1517 return gen_rtx_PLUS (Pmode, sum, GEN_INT (low_int));
1518 }
1519 else if (GET_CODE (x) == PLUS
1520 && GET_CODE (XEXP (x, 0)) == REG
1521 && GET_CODE (XEXP (x, 1)) != CONST_INT
1522 && (TARGET_HARD_FLOAT || TARGET_POWERPC64 || mode != DFmode)
1523 && (TARGET_POWERPC64 || mode != DImode)
1524 && mode != TImode)
1525 {
1526 return gen_rtx_PLUS (Pmode, XEXP (x, 0),
1527 force_reg (Pmode, force_operand (XEXP (x, 1), 0)));
1528 }
1529 else if (TARGET_ELF && TARGET_32BIT && TARGET_NO_TOC && ! flag_pic
1530 && GET_CODE (x) != CONST_INT
1531 && GET_CODE (x) != CONST_DOUBLE
1532 && CONSTANT_P (x)
1533 && (TARGET_HARD_FLOAT || mode != DFmode)
1534 && mode != DImode
1535 && mode != TImode)
1536 {
1537 rtx reg = gen_reg_rtx (Pmode);
1538 emit_insn (gen_elf_high (reg, (x)));
1539 return gen_rtx_LO_SUM (Pmode, reg, (x));
1540 }
ee890fe2
SS
1541 else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
1542 && ! flag_pic
1543 && GET_CODE (x) != CONST_INT
1544 && GET_CODE (x) != CONST_DOUBLE
1545 && CONSTANT_P (x)
1546 && (TARGET_HARD_FLOAT || mode != DFmode)
1547 && mode != DImode
1548 && mode != TImode)
1549 {
1550 rtx reg = gen_reg_rtx (Pmode);
1551 emit_insn (gen_macho_high (reg, (x)));
1552 return gen_rtx_LO_SUM (Pmode, reg, (x));
1553 }
9ebbca7d
GK
1554 else if (TARGET_TOC
1555 && CONSTANT_POOL_EXPR_P (x)
a9098fd0 1556 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), Pmode))
9ebbca7d
GK
1557 {
1558 return create_TOC_reference (x);
1559 }
1560 else
1561 return NULL_RTX;
1562}
258bfae2
FS
1563
1564/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
1565 that is a valid memory address for an instruction.
1566 The MODE argument is the machine mode for the MEM expression
1567 that wants to use this address.
1568
1569 On the RS/6000, there are four valid address: a SYMBOL_REF that
1570 refers to a constant pool entry of an address (or the sum of it
1571 plus a constant), a short (16-bit signed) constant plus a register,
1572 the sum of two registers, or a register indirect, possibly with an
1573 auto-increment. For DFmode and DImode with an constant plus register,
1574 we must ensure that both words are addressable or PowerPC64 with offset
1575 word aligned.
1576
1577 For modes spanning multiple registers (DFmode in 32-bit GPRs,
1578 32-bit DImode, TImode), indexed addressing cannot be used because
1579 adjacent memory cells are accessed by adding word-sized offsets
1580 during assembly output. */
1581int
1582rs6000_legitimate_address (mode, x, reg_ok_strict)
1583 enum machine_mode mode;
1584 rtx x;
1585 int reg_ok_strict;
1586{
1587 if (LEGITIMATE_INDIRECT_ADDRESS_P (x, reg_ok_strict))
1588 return 1;
1589 if ((GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
1590 && TARGET_UPDATE
1591 && LEGITIMATE_INDIRECT_ADDRESS_P (XEXP (x, 0), reg_ok_strict))
1592 return 1;
1593 if (LEGITIMATE_SMALL_DATA_P (mode, x))
1594 return 1;
1595 if (LEGITIMATE_CONSTANT_POOL_ADDRESS_P (x))
1596 return 1;
1597 /* If not REG_OK_STRICT (before reload) let pass any stack offset. */
1598 if (! reg_ok_strict
1599 && GET_CODE (x) == PLUS
1600 && GET_CODE (XEXP (x, 0)) == REG
1601 && XEXP (x, 0) == virtual_stack_vars_rtx
1602 && GET_CODE (XEXP (x, 1)) == CONST_INT)
1603 return 1;
1604 if (LEGITIMATE_OFFSET_ADDRESS_P (mode, x, reg_ok_strict))
1605 return 1;
1606 if (mode != TImode
1607 && (TARGET_HARD_FLOAT || TARGET_POWERPC64 || mode != DFmode)
1608 && (TARGET_POWERPC64 || mode != DImode)
1609 && LEGITIMATE_INDEXED_ADDRESS_P (x, reg_ok_strict))
1610 return 1;
1611 if (LEGITIMATE_LO_SUM_ADDRESS_P (mode, x, reg_ok_strict))
1612 return 1;
1613 return 0;
1614}
fb4d4348
GK
1615\f
1616/* Emit a move from SOURCE to DEST in mode MODE. */
1617void
1618rs6000_emit_move (dest, source, mode)
1619 rtx dest;
1620 rtx source;
1621 enum machine_mode mode;
1622{
1623 rtx operands[2];
1624 operands[0] = dest;
1625 operands[1] = source;
1626
1627 /* Sanity checks. Check that we get CONST_DOUBLE only when we should. */
1628 if (GET_CODE (operands[1]) == CONST_DOUBLE
1629 && ! FLOAT_MODE_P (mode)
1630 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
1631 {
1632 /* FIXME. This should never happen. */
1633 /* Since it seems that it does, do the safe thing and convert
1634 to a CONST_INT. */
1635 operands[1] =
1636 GEN_INT (trunc_int_for_mode (CONST_DOUBLE_LOW (operands[1]), mode));
1637 }
1638 if (GET_CODE (operands[1]) == CONST_DOUBLE
1639 && ! FLOAT_MODE_P (mode)
1640 && ((CONST_DOUBLE_HIGH (operands[1]) == 0
1641 && CONST_DOUBLE_LOW (operands[1]) >= 0)
1642 || (CONST_DOUBLE_HIGH (operands[1]) == -1
1643 && CONST_DOUBLE_LOW (operands[1]) < 0)))
1644 abort ();
1645
1646 if (! no_new_pseudos && GET_CODE (operands[0]) != REG)
1647 operands[1] = force_reg (mode, operands[1]);
a9098fd0 1648
ffc14f31
GK
1649 if (mode == SFmode && ! TARGET_POWERPC && TARGET_HARD_FLOAT
1650 && GET_CODE (operands[0]) == MEM)
fb4d4348 1651 {
ffc14f31
GK
1652 int regnum;
1653
1654 if (reload_in_progress || reload_completed)
1655 regnum = true_regnum (operands[1]);
1656 else if (GET_CODE (operands[1]) == REG)
1657 regnum = REGNO (operands[1]);
1658 else
1659 regnum = -1;
fb4d4348
GK
1660
1661 /* If operands[1] is a register, on POWER it may have
1662 double-precision data in it, so truncate it to single
1663 precision. */
1664 if (FP_REGNO_P (regnum) || regnum >= FIRST_PSEUDO_REGISTER)
1665 {
1666 rtx newreg;
1667 newreg = (no_new_pseudos ? operands[1] : gen_reg_rtx (mode));
1668 emit_insn (gen_aux_truncdfsf2 (newreg, operands[1]));
1669 operands[1] = newreg;
1670 }
1671 }
1672
a9098fd0
GK
1673 /* Handle the case where reload calls us with an invalid address;
1674 and the case of CONSTANT_P_RTX. */
1675 if (! general_operand (operands[1], mode)
1676 || ! nonimmediate_operand (operands[0], mode)
1677 || GET_CODE (operands[1]) == CONSTANT_P_RTX)
fb4d4348
GK
1678 {
1679 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
1680 return;
1681 }
a9098fd0 1682
fb4d4348
GK
1683 /* FIXME: In the long term, this switch statement should go away
1684 and be replaced by a sequence of tests based on things like
1685 mode == Pmode. */
1686 switch (mode)
1687 {
1688 case HImode:
1689 case QImode:
1690 if (CONSTANT_P (operands[1])
1691 && GET_CODE (operands[1]) != CONST_INT)
a9098fd0 1692 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
1693 break;
1694
1695 case DFmode:
1696 case SFmode:
1697 if (CONSTANT_P (operands[1])
1698 && ! easy_fp_constant (operands[1], mode))
a9098fd0 1699 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
1700 break;
1701
1702 case SImode:
a9098fd0 1703 case DImode:
fb4d4348
GK
1704 /* Use default pattern for address of ELF small data */
1705 if (TARGET_ELF
a9098fd0 1706 && mode == Pmode
fb4d4348 1707 && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
a9098fd0
GK
1708 && (GET_CODE (operands[1]) == SYMBOL_REF
1709 || GET_CODE (operands[1]) == CONST)
1710 && small_data_operand (operands[1], mode))
fb4d4348
GK
1711 {
1712 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
1713 return;
1714 }
1715
1716 if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
a9098fd0
GK
1717 && mode == Pmode && mode == SImode
1718 && flag_pic == 1 && got_operand (operands[1], mode))
fb4d4348
GK
1719 {
1720 emit_insn (gen_movsi_got (operands[0], operands[1]));
1721 return;
1722 }
1723
ee890fe2
SS
1724 if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
1725 && TARGET_NO_TOC && ! flag_pic
a9098fd0 1726 && mode == Pmode
fb4d4348
GK
1727 && CONSTANT_P (operands[1])
1728 && GET_CODE (operands[1]) != HIGH
1729 && GET_CODE (operands[1]) != CONST_INT)
1730 {
a9098fd0 1731 rtx target = (no_new_pseudos ? operands[0] : gen_reg_rtx (mode));
fb4d4348
GK
1732
1733 /* If this is a function address on -mcall-aixdesc,
1734 convert it to the address of the descriptor. */
1735 if (DEFAULT_ABI == ABI_AIX
1736 && GET_CODE (operands[1]) == SYMBOL_REF
1737 && XSTR (operands[1], 0)[0] == '.')
1738 {
1739 const char *name = XSTR (operands[1], 0);
1740 rtx new_ref;
1741 while (*name == '.')
1742 name++;
1743 new_ref = gen_rtx_SYMBOL_REF (Pmode, name);
1744 CONSTANT_POOL_ADDRESS_P (new_ref)
1745 = CONSTANT_POOL_ADDRESS_P (operands[1]);
1746 SYMBOL_REF_FLAG (new_ref) = SYMBOL_REF_FLAG (operands[1]);
1747 SYMBOL_REF_USED (new_ref) = SYMBOL_REF_USED (operands[1]);
1748 operands[1] = new_ref;
1749 }
7509c759 1750
ee890fe2
SS
1751 if (DEFAULT_ABI == ABI_DARWIN)
1752 {
1753 emit_insn (gen_macho_high (target, operands[1]));
1754 emit_insn (gen_macho_low (operands[0], target, operands[1]));
1755 return;
1756 }
1757
fb4d4348
GK
1758 emit_insn (gen_elf_high (target, operands[1]));
1759 emit_insn (gen_elf_low (operands[0], target, operands[1]));
1760 return;
1761 }
1762
a9098fd0
GK
1763 /* If this is a SYMBOL_REF that refers to a constant pool entry,
1764 and we have put it in the TOC, we just need to make a TOC-relative
1765 reference to it. */
1766 if (TARGET_TOC
1767 && GET_CODE (operands[1]) == SYMBOL_REF
1768 && CONSTANT_POOL_EXPR_P (operands[1])
1769 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (operands[1]),
1770 get_pool_mode (operands[1])))
fb4d4348 1771 {
a9098fd0 1772 operands[1] = create_TOC_reference (operands[1]);
fb4d4348 1773 }
a9098fd0
GK
1774 else if (mode == Pmode
1775 && CONSTANT_P (operands[1])
38886f37
AO
1776 && ((GET_CODE (operands[1]) != CONST_INT
1777 && ! easy_fp_constant (operands[1], mode))
1778 || (GET_CODE (operands[1]) == CONST_INT
1779 && num_insns_constant (operands[1], mode) > 2)
1780 || (GET_CODE (operands[0]) == REG
1781 && FP_REGNO_P (REGNO (operands[0]))))
a9098fd0
GK
1782 && GET_CODE (operands[1]) != HIGH
1783 && ! LEGITIMATE_CONSTANT_POOL_ADDRESS_P (operands[1])
1784 && ! TOC_RELATIVE_EXPR_P (operands[1]))
fb4d4348
GK
1785 {
1786 /* Emit a USE operation so that the constant isn't deleted if
1787 expensive optimizations are turned on because nobody
1788 references it. This should only be done for operands that
1789 contain SYMBOL_REFs with CONSTANT_POOL_ADDRESS_P set.
1790 This should not be done for operands that contain LABEL_REFs.
1791 For now, we just handle the obvious case. */
1792 if (GET_CODE (operands[1]) != LABEL_REF)
1793 emit_insn (gen_rtx_USE (VOIDmode, operands[1]));
1794
ee890fe2
SS
1795 /* Darwin uses a special PIC legitimizer. */
1796 if (DEFAULT_ABI == ABI_DARWIN && flag_pic)
1797 {
78e1b90d 1798#if TARGET_MACHO
ee890fe2
SS
1799 rtx temp_reg = ((reload_in_progress || reload_completed)
1800 ? operands[0] : NULL);
1801
ee890fe2
SS
1802 operands[1] =
1803 rs6000_machopic_legitimize_pic_address (operands[1], mode,
1804 temp_reg);
1805#endif
1806 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
1807 return;
1808 }
1809
fb4d4348
GK
1810 /* If we are to limit the number of things we put in the TOC and
1811 this is a symbol plus a constant we can add in one insn,
1812 just put the symbol in the TOC and add the constant. Don't do
1813 this if reload is in progress. */
1814 if (GET_CODE (operands[1]) == CONST
1815 && TARGET_NO_SUM_IN_TOC && ! reload_in_progress
1816 && GET_CODE (XEXP (operands[1], 0)) == PLUS
a9098fd0 1817 && add_operand (XEXP (XEXP (operands[1], 0), 1), mode)
fb4d4348
GK
1818 && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
1819 || GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
1820 && ! side_effects_p (operands[0]))
1821 {
a9098fd0 1822 rtx sym = force_const_mem (mode, XEXP (XEXP (operands[1], 0), 0));
fb4d4348
GK
1823 rtx other = XEXP (XEXP (operands[1], 0), 1);
1824
a9098fd0
GK
1825 sym = force_reg (mode, sym);
1826 if (mode == SImode)
1827 emit_insn (gen_addsi3 (operands[0], sym, other));
1828 else
1829 emit_insn (gen_adddi3 (operands[0], sym, other));
fb4d4348
GK
1830 return;
1831 }
1832
a9098fd0 1833 operands[1] = force_const_mem (mode, operands[1]);
fb4d4348
GK
1834
1835 if (TARGET_TOC
d34c5b80
DE
1836 && CONSTANT_POOL_EXPR_P (XEXP (operands[1], 0))
1837 && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
1838 get_pool_constant (XEXP (operands[1], 0)),
1839 get_pool_mode (XEXP (operands[1], 0))))
a9098fd0
GK
1840 {
1841 operands[1] = gen_rtx_MEM (mode,
1842 create_TOC_reference (XEXP (operands[1], 0)));
fb4d4348
GK
1843 MEM_ALIAS_SET (operands[1]) = get_TOC_alias_set ();
1844 RTX_UNCHANGING_P (operands[1]) = 1;
a9098fd0 1845 }
fb4d4348
GK
1846 }
1847 break;
a9098fd0 1848
fb4d4348
GK
1849 case TImode:
1850 if (GET_CODE (operands[0]) == MEM
1851 && GET_CODE (XEXP (operands[0], 0)) != REG
1852 && ! reload_in_progress)
1853 operands[0] = change_address (operands[0], TImode,
1854 copy_addr_to_reg (XEXP (operands[0], 0)));
1855
1856 if (GET_CODE (operands[1]) == MEM
1857 && GET_CODE (XEXP (operands[1], 0)) != REG
1858 && ! reload_in_progress)
1859 operands[1] = change_address (operands[1], TImode,
1860 copy_addr_to_reg (XEXP (operands[1], 0)));
1861 break;
1862
1863 default:
1864 abort ();
1865 }
1866
a9098fd0
GK
1867 /* Above, we may have called force_const_mem which may have returned
1868 an invalid address. If we can, fix this up; otherwise, reload will
1869 have to deal with it. */
1870 if (GET_CODE (operands[1]) == MEM
1871 && ! memory_address_p (mode, XEXP (operands[1], 0))
1872 && ! reload_in_progress)
1873 operands[1] = change_address (operands[1], mode,
1874 XEXP (operands[1], 0));
1875
fb4d4348 1876 emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
02a4ec28 1877 return;
fb4d4348 1878}
4697a36c
MM
1879\f
1880/* Initialize a variable CUM of type CUMULATIVE_ARGS
1881 for a call to a function whose data type is FNTYPE.
1882 For a library call, FNTYPE is 0.
1883
1884 For incoming args we set the number of arguments in the prototype large
1c20ae99 1885 so we never return a PARALLEL. */
4697a36c
MM
1886
1887void
1888init_cumulative_args (cum, fntype, libname, incoming)
1889 CUMULATIVE_ARGS *cum;
1890 tree fntype;
296b8152 1891 rtx libname ATTRIBUTE_UNUSED;
4697a36c
MM
1892 int incoming;
1893{
1894 static CUMULATIVE_ARGS zero_cumulative;
1895
1896 *cum = zero_cumulative;
1897 cum->words = 0;
1898 cum->fregno = FP_ARG_MIN_REG;
1899 cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
7509c759 1900 cum->call_cookie = CALL_NORMAL;
4cc833b7 1901 cum->sysv_gregno = GP_ARG_MIN_REG;
4697a36c
MM
1902
1903 if (incoming)
bd227acc 1904 cum->nargs_prototype = 1000; /* don't return a PARALLEL */
4697a36c
MM
1905
1906 else if (cum->prototype)
1907 cum->nargs_prototype = (list_length (TYPE_ARG_TYPES (fntype)) - 1
1908 + (TYPE_MODE (TREE_TYPE (fntype)) == BLKmode
1909 || RETURN_IN_MEMORY (TREE_TYPE (fntype))));
1910
1911 else
1912 cum->nargs_prototype = 0;
1913
1914 cum->orig_nargs = cum->nargs_prototype;
7509c759 1915
9ebbca7d
GK
1916 /* Check for longcall's */
1917 if (fntype && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype)))
6a4cee5f
MM
1918 cum->call_cookie = CALL_LONG;
1919
4697a36c
MM
1920 if (TARGET_DEBUG_ARG)
1921 {
1922 fprintf (stderr, "\ninit_cumulative_args:");
1923 if (fntype)
1924 {
1925 tree ret_type = TREE_TYPE (fntype);
1926 fprintf (stderr, " ret code = %s,",
1927 tree_code_name[ (int)TREE_CODE (ret_type) ]);
1928 }
1929
6a4cee5f
MM
1930 if (cum->call_cookie & CALL_LONG)
1931 fprintf (stderr, " longcall,");
1932
4697a36c
MM
1933 fprintf (stderr, " proto = %d, nargs = %d\n",
1934 cum->prototype, cum->nargs_prototype);
1935 }
1936}
1937\f
c229cba9
DE
1938/* If defined, a C expression which determines whether, and in which
1939 direction, to pad out an argument with extra space. The value
1940 should be of type `enum direction': either `upward' to pad above
1941 the argument, `downward' to pad below, or `none' to inhibit
1942 padding.
1943
1944 For the AIX ABI structs are always stored left shifted in their
1945 argument slot. */
1946
9ebbca7d 1947enum direction
c229cba9
DE
1948function_arg_padding (mode, type)
1949 enum machine_mode mode;
1950 tree type;
1951{
c85f7c16 1952 if (type != 0 && AGGREGATE_TYPE_P (type))
9ebbca7d 1953 return upward;
c229cba9
DE
1954
1955 /* This is the default definition. */
1956 return (! BYTES_BIG_ENDIAN
9ebbca7d 1957 ? upward
c229cba9
DE
1958 : ((mode == BLKmode
1959 ? (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
1960 && int_size_in_bytes (type) < (PARM_BOUNDARY / BITS_PER_UNIT))
1961 : GET_MODE_BITSIZE (mode) < PARM_BOUNDARY)
9ebbca7d 1962 ? downward : upward));
c229cba9
DE
1963}
1964
b6c9286a
MM
1965/* If defined, a C expression that gives the alignment boundary, in bits,
1966 of an argument with the specified mode and type. If it is not defined,
1967 PARM_BOUNDARY is used for all arguments.
1968
2310f99a 1969 V.4 wants long longs to be double word aligned. */
b6c9286a
MM
1970
1971int
1972function_arg_boundary (mode, type)
1973 enum machine_mode mode;
9ebbca7d 1974 tree type ATTRIBUTE_UNUSED;
b6c9286a 1975{
4cc833b7
RH
1976 if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
1977 && (mode == DImode || mode == DFmode))
e1f83b4d 1978 return 64;
9ebbca7d 1979 else
b6c9286a 1980 return PARM_BOUNDARY;
b6c9286a
MM
1981}
1982\f
4697a36c
MM
1983/* Update the data in CUM to advance over an argument
1984 of mode MODE and data type TYPE.
1985 (TYPE is null for libcalls where that information may not be available.) */
1986
1987void
1988function_arg_advance (cum, mode, type, named)
1989 CUMULATIVE_ARGS *cum;
1990 enum machine_mode mode;
1991 tree type;
1992 int named;
1993{
1994 cum->nargs_prototype--;
1995
c81bebd7 1996 if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
4697a36c 1997 {
4cc833b7
RH
1998 if (TARGET_HARD_FLOAT
1999 && (mode == SFmode || mode == DFmode))
4697a36c 2000 {
4cc833b7
RH
2001 if (cum->fregno <= FP_ARG_V4_MAX_REG)
2002 cum->fregno++;
2003 else
2004 {
2005 if (mode == DFmode)
2006 cum->words += cum->words & 1;
d34c5b80 2007 cum->words += RS6000_ARG_SIZE (mode, type);
4cc833b7 2008 }
4697a36c 2009 }
4cc833b7
RH
2010 else
2011 {
2012 int n_words;
2013 int gregno = cum->sysv_gregno;
2014
2015 /* Aggregates and IEEE quad get passed by reference. */
2016 if ((type && AGGREGATE_TYPE_P (type))
2017 || mode == TFmode)
2018 n_words = 1;
2019 else
d34c5b80 2020 n_words = RS6000_ARG_SIZE (mode, type);
4cc833b7
RH
2021
2022 /* Long long is put in odd registers. */
2023 if (n_words == 2 && (gregno & 1) == 0)
2024 gregno += 1;
2025
2026 /* Long long is not split between registers and stack. */
2027 if (gregno + n_words - 1 > GP_ARG_MAX_REG)
2028 {
2029 /* Long long is aligned on the stack. */
2030 if (n_words == 2)
2031 cum->words += cum->words & 1;
2032 cum->words += n_words;
2033 }
4697a36c 2034
4cc833b7
RH
2035 /* Note: continuing to accumulate gregno past when we've started
2036 spilling to the stack indicates the fact that we've started
2037 spilling to the stack to expand_builtin_saveregs. */
2038 cum->sysv_gregno = gregno + n_words;
2039 }
4697a36c 2040
4cc833b7
RH
2041 if (TARGET_DEBUG_ARG)
2042 {
2043 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
2044 cum->words, cum->fregno);
2045 fprintf (stderr, "gregno = %2d, nargs = %4d, proto = %d, ",
2046 cum->sysv_gregno, cum->nargs_prototype, cum->prototype);
2047 fprintf (stderr, "mode = %4s, named = %d\n",
2048 GET_MODE_NAME (mode), named);
2049 }
4697a36c
MM
2050 }
2051 else
4cc833b7
RH
2052 {
2053 int align = (TARGET_32BIT && (cum->words & 1) != 0
2054 && function_arg_boundary (mode, type) == 64) ? 1 : 0;
d34c5b80 2055 cum->words += align + RS6000_ARG_SIZE (mode, type);
4697a36c 2056
d34c5b80
DE
2057 if (GET_MODE_CLASS (mode) == MODE_FLOAT && TARGET_HARD_FLOAT)
2058 cum->fregno++;
4cc833b7
RH
2059
2060 if (TARGET_DEBUG_ARG)
2061 {
2062 fprintf (stderr, "function_adv: words = %2d, fregno = %2d, ",
2063 cum->words, cum->fregno);
2064 fprintf (stderr, "nargs = %4d, proto = %d, mode = %4s, ",
2065 cum->nargs_prototype, cum->prototype, GET_MODE_NAME (mode));
2066 fprintf (stderr, "named = %d, align = %d\n", named, align);
2067 }
2068 }
4697a36c
MM
2069}
2070\f
2071/* Determine where to put an argument to a function.
2072 Value is zero to push the argument on the stack,
2073 or a hard register in which to store the argument.
2074
2075 MODE is the argument's machine mode.
2076 TYPE is the data type of the argument (as a tree).
2077 This is null for libcalls where that information may
2078 not be available.
2079 CUM is a variable of type CUMULATIVE_ARGS which gives info about
2080 the preceding args and about the function being called.
2081 NAMED is nonzero if this argument is a named parameter
2082 (otherwise it is an extra parameter matching an ellipsis).
2083
2084 On RS/6000 the first eight words of non-FP are normally in registers
2085 and the rest are pushed. Under AIX, the first 13 FP args are in registers.
2086 Under V.4, the first 8 FP args are in registers.
2087
2088 If this is floating-point and no prototype is specified, we use
2089 both an FP and integer register (or possibly FP reg and stack). Library
2090 functions (when TYPE is zero) always have the proper types for args,
2091 so we can pass the FP value just in one register. emit_library_function
1c20ae99 2092 doesn't support PARALLEL anyway. */
4697a36c
MM
2093
2094struct rtx_def *
2095function_arg (cum, mode, type, named)
2096 CUMULATIVE_ARGS *cum;
2097 enum machine_mode mode;
2098 tree type;
d34c5b80 2099 int named ATTRIBUTE_UNUSED;
4697a36c 2100{
4cc833b7 2101 enum rs6000_abi abi = DEFAULT_ABI;
4697a36c 2102
4cc833b7
RH
2103 /* Return a marker to indicate whether CR1 needs to set or clear the bit
2104 that V.4 uses to say fp args were passed in registers. Assume that we
2105 don't need the marker for software floating point, or compiler generated
2106 library calls. */
4697a36c
MM
2107 if (mode == VOIDmode)
2108 {
c81bebd7 2109 if ((abi == ABI_V4 || abi == ABI_SOLARIS)
7509c759
MM
2110 && TARGET_HARD_FLOAT
2111 && cum->nargs_prototype < 0
4697a36c 2112 && type && (cum->prototype || TARGET_NO_PROTOTYPE))
7509c759 2113 {
6a4cee5f
MM
2114 return GEN_INT (cum->call_cookie
2115 | ((cum->fregno == FP_ARG_MIN_REG)
2116 ? CALL_V4_SET_FP_ARGS
2117 : CALL_V4_CLEAR_FP_ARGS));
7509c759 2118 }
4697a36c 2119
7509c759 2120 return GEN_INT (cum->call_cookie);
4697a36c
MM
2121 }
2122
4cc833b7 2123 if (abi == ABI_V4 || abi == ABI_SOLARIS)
4697a36c 2124 {
4cc833b7
RH
2125 if (TARGET_HARD_FLOAT
2126 && (mode == SFmode || mode == DFmode))
2127 {
2128 if (cum->fregno <= FP_ARG_V4_MAX_REG)
2129 return gen_rtx_REG (mode, cum->fregno);
2130 else
2131 return NULL;
2132 }
2133 else
2134 {
2135 int n_words;
2136 int gregno = cum->sysv_gregno;
2137
2138 /* Aggregates and IEEE quad get passed by reference. */
2139 if ((type && AGGREGATE_TYPE_P (type))
2140 || mode == TFmode)
2141 n_words = 1;
2142 else
d34c5b80 2143 n_words = RS6000_ARG_SIZE (mode, type);
4cc833b7
RH
2144
2145 /* Long long is put in odd registers. */
2146 if (n_words == 2 && (gregno & 1) == 0)
2147 gregno += 1;
2148
2149 /* Long long is not split between registers and stack. */
2150 if (gregno + n_words - 1 <= GP_ARG_MAX_REG)
2151 return gen_rtx_REG (mode, gregno);
2152 else
2153 return NULL;
2154 }
4697a36c 2155 }
4cc833b7
RH
2156 else
2157 {
2158 int align = (TARGET_32BIT && (cum->words & 1) != 0
2159 && function_arg_boundary (mode, type) == 64) ? 1 : 0;
2160 int align_words = cum->words + align;
4697a36c 2161
4cc833b7
RH
2162 if (type && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
2163 return NULL_RTX;
2164
2165 if (USE_FP_FOR_ARG_P (*cum, mode, type))
2166 {
2167 if (! type
2168 || ((cum->nargs_prototype > 0)
2169 /* IBM AIX extended its linkage convention definition always
2170 to require FP args after register save area hole on the
2171 stack. */
2172 && (DEFAULT_ABI != ABI_AIX
2173 || ! TARGET_XL_CALL
2174 || (align_words < GP_ARG_NUM_REG))))
2175 return gen_rtx_REG (mode, cum->fregno);
2176
2177 return gen_rtx_PARALLEL (mode,
2178 gen_rtvec (2,
39403d82 2179 gen_rtx_EXPR_LIST (VOIDmode,
1c20ae99
JW
2180 ((align_words >= GP_ARG_NUM_REG)
2181 ? NULL_RTX
2182 : (align_words
d34c5b80 2183 + RS6000_ARG_SIZE (mode, type)
1c20ae99
JW
2184 > GP_ARG_NUM_REG
2185 /* If this is partially on the stack, then
2186 we only include the portion actually
2187 in registers here. */
39403d82 2188 ? gen_rtx_REG (SImode,
1c20ae99 2189 GP_ARG_MIN_REG + align_words)
39403d82 2190 : gen_rtx_REG (mode,
1c20ae99
JW
2191 GP_ARG_MIN_REG + align_words))),
2192 const0_rtx),
39403d82
DE
2193 gen_rtx_EXPR_LIST (VOIDmode,
2194 gen_rtx_REG (mode, cum->fregno),
1c20ae99 2195 const0_rtx)));
4cc833b7
RH
2196 }
2197 else if (align_words < GP_ARG_NUM_REG)
2198 return gen_rtx_REG (mode, GP_ARG_MIN_REG + align_words);
2199 else
2200 return NULL_RTX;
4697a36c 2201 }
4697a36c
MM
2202}
2203\f
2204/* For an arg passed partly in registers and partly in memory,
2205 this is the number of registers used.
2206 For args passed entirely in registers or entirely in memory, zero. */
2207
2208int
2209function_arg_partial_nregs (cum, mode, type, named)
2210 CUMULATIVE_ARGS *cum;
2211 enum machine_mode mode;
2212 tree type;
d34c5b80 2213 int named ATTRIBUTE_UNUSED;
4697a36c 2214{
c81bebd7 2215 if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
4697a36c 2216 return 0;
4697a36c
MM
2217
2218 if (USE_FP_FOR_ARG_P (*cum, mode, type))
2219 {
2220 if (cum->nargs_prototype >= 0)
2221 return 0;
2222 }
2223
2224 if (cum->words < GP_ARG_NUM_REG
d34c5b80 2225 && GP_ARG_NUM_REG < (cum->words + RS6000_ARG_SIZE (mode, type)))
4697a36c
MM
2226 {
2227 int ret = GP_ARG_NUM_REG - cum->words;
2228 if (ret && TARGET_DEBUG_ARG)
2229 fprintf (stderr, "function_arg_partial_nregs: %d\n", ret);
2230
2231 return ret;
2232 }
2233
2234 return 0;
2235}
2236\f
2237/* A C expression that indicates when an argument must be passed by
2238 reference. If nonzero for an argument, a copy of that argument is
2239 made in memory and a pointer to the argument is passed instead of
2240 the argument itself. The pointer is passed in whatever way is
2241 appropriate for passing a pointer to that type.
2242
2243 Under V.4, structures and unions are passed by reference. */
2244
2245int
2246function_arg_pass_by_reference (cum, mode, type, named)
296b8152
KG
2247 CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED;
2248 enum machine_mode mode ATTRIBUTE_UNUSED;
4697a36c 2249 tree type;
296b8152 2250 int named ATTRIBUTE_UNUSED;
4697a36c 2251{
c81bebd7 2252 if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
4cc833b7
RH
2253 && ((type && AGGREGATE_TYPE_P (type))
2254 || mode == TFmode))
4697a36c
MM
2255 {
2256 if (TARGET_DEBUG_ARG)
2257 fprintf (stderr, "function_arg_pass_by_reference: aggregate\n");
2258
2259 return 1;
2260 }
4697a36c
MM
2261
2262 return 0;
2263}
4697a36c
MM
2264\f
2265/* Perform any needed actions needed for a function that is receiving a
2266 variable number of arguments.
2267
2268 CUM is as above.
2269
2270 MODE and TYPE are the mode and type of the current parameter.
2271
2272 PRETEND_SIZE is a variable that should be set to the amount of stack
2273 that must be pushed by the prolog to pretend that our caller pushed
2274 it.
2275
2276 Normally, this macro will push all remaining incoming registers on the
2277 stack and set PRETEND_SIZE to the length of the registers pushed. */
2278
2279void
2280setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
2281 CUMULATIVE_ARGS *cum;
2282 enum machine_mode mode;
2283 tree type;
2284 int *pretend_size;
2285 int no_rtl;
2286
2287{
4cc833b7
RH
2288 CUMULATIVE_ARGS next_cum;
2289 int reg_size = TARGET_32BIT ? 4 : 8;
ca5adc63 2290 rtx save_area = NULL_RTX, mem;
dfafc897 2291 int first_reg_offset, set;
d34c5b80
DE
2292 tree fntype;
2293 int stdarg_p;
4697a36c 2294
d34c5b80
DE
2295 fntype = TREE_TYPE (current_function_decl);
2296 stdarg_p = (TYPE_ARG_TYPES (fntype) != 0
2297 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
2298 != void_type_node));
4cc833b7 2299
d34c5b80
DE
2300 /* For varargs, we do not want to skip the dummy va_dcl argument.
2301 For stdargs, we do want to skip the last named argument. */
2302 next_cum = *cum;
2303 if (stdarg_p)
2304 function_arg_advance (&next_cum, mode, type, 1);
4cc833b7 2305
d34c5b80
DE
2306 if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
2307 {
4cc833b7
RH
2308 /* Indicate to allocate space on the stack for varargs save area. */
2309 /* ??? Does this really have to be located at a magic spot on the
2310 stack, or can we allocate this with assign_stack_local instead. */
00dba523 2311 cfun->machine->sysv_varargs_p = 1;
60e2d0ca 2312 if (! no_rtl)
2c4974b7 2313 save_area = plus_constant (virtual_stack_vars_rtx,
bd227acc 2314 - RS6000_VARARGS_SIZE);
4cc833b7
RH
2315
2316 first_reg_offset = next_cum.sysv_gregno - GP_ARG_MIN_REG;
4697a36c 2317 }
60e2d0ca 2318 else
4697a36c 2319 {
d34c5b80 2320 first_reg_offset = next_cum.words;
4cc833b7 2321 save_area = virtual_incoming_args_rtx;
00dba523 2322 cfun->machine->sysv_varargs_p = 0;
4697a36c
MM
2323
2324 if (MUST_PASS_IN_STACK (mode, type))
d34c5b80 2325 first_reg_offset += RS6000_ARG_SIZE (TYPE_MODE (type), type);
4cc833b7 2326 }
4697a36c 2327
dfafc897 2328 set = get_varargs_alias_set ();
c81fc13e 2329 if (! no_rtl && first_reg_offset < GP_ARG_NUM_REG)
4cc833b7 2330 {
dfafc897
FS
2331 mem = gen_rtx_MEM (BLKmode,
2332 plus_constant (save_area,
2333 first_reg_offset * reg_size)),
2334 MEM_ALIAS_SET (mem) = set;
2335
4cc833b7 2336 move_block_from_reg
dfafc897 2337 (GP_ARG_MIN_REG + first_reg_offset, mem,
4cc833b7
RH
2338 GP_ARG_NUM_REG - first_reg_offset,
2339 (GP_ARG_NUM_REG - first_reg_offset) * UNITS_PER_WORD);
2340
2341 /* ??? Does ABI_V4 need this at all? */
4697a36c
MM
2342 *pretend_size = (GP_ARG_NUM_REG - first_reg_offset) * UNITS_PER_WORD;
2343 }
2344
4697a36c 2345 /* Save FP registers if needed. */
4cc833b7 2346 if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
c81fc13e 2347 && TARGET_HARD_FLOAT && ! no_rtl
4cc833b7 2348 && next_cum.fregno <= FP_ARG_V4_MAX_REG)
4697a36c 2349 {
4cc833b7 2350 int fregno = next_cum.fregno;
9ebbca7d 2351 rtx cr1 = gen_rtx_REG (CCmode, CR1_REGNO);
4cc833b7
RH
2352 rtx lab = gen_label_rtx ();
2353 int off = (GP_ARG_NUM_REG * reg_size) + ((fregno - FP_ARG_MIN_REG) * 8);
4697a36c 2354
4cc833b7 2355 emit_jump_insn (gen_rtx_SET (VOIDmode,
4697a36c 2356 pc_rtx,
39403d82 2357 gen_rtx_IF_THEN_ELSE (VOIDmode,
4cc833b7
RH
2358 gen_rtx_NE (VOIDmode, cr1,
2359 const0_rtx),
39403d82 2360 gen_rtx_LABEL_REF (VOIDmode, lab),
4697a36c
MM
2361 pc_rtx)));
2362
4cc833b7
RH
2363 while (fregno <= FP_ARG_V4_MAX_REG)
2364 {
dfafc897
FS
2365 mem = gen_rtx_MEM (DFmode, plus_constant (save_area, off));
2366 MEM_ALIAS_SET (mem) = set;
2367 emit_move_insn (mem, gen_rtx_REG (DFmode, fregno));
4cc833b7
RH
2368 fregno++;
2369 off += 8;
4697a36c 2370 }
4cc833b7
RH
2371
2372 emit_label (lab);
4697a36c 2373 }
4697a36c 2374}
4697a36c 2375
dfafc897 2376/* Create the va_list data type. */
2c4974b7 2377
dfafc897
FS
2378tree
2379rs6000_build_va_list ()
2380{
bab45a51 2381 tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
4697a36c 2382
9ebbca7d
GK
2383 /* For AIX, prefer 'char *' because that's what the system
2384 header files like. */
dfafc897 2385 if (DEFAULT_ABI != ABI_V4 && DEFAULT_ABI != ABI_SOLARIS)
9ebbca7d 2386 return build_pointer_type (char_type_node);
dfafc897 2387
0f4fd75d 2388 record = make_lang_type (RECORD_TYPE);
bab45a51 2389 type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
0f4fd75d 2390
9ebbca7d
GK
2391 f_gpr = build_decl (FIELD_DECL, get_identifier ("gpr"),
2392 unsigned_char_type_node);
2393 f_fpr = build_decl (FIELD_DECL, get_identifier ("fpr"),
2394 unsigned_char_type_node);
dfafc897
FS
2395 f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
2396 ptr_type_node);
2397 f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
2398 ptr_type_node);
2399
2400 DECL_FIELD_CONTEXT (f_gpr) = record;
2401 DECL_FIELD_CONTEXT (f_fpr) = record;
2402 DECL_FIELD_CONTEXT (f_ovf) = record;
2403 DECL_FIELD_CONTEXT (f_sav) = record;
2404
bab45a51
FS
2405 TREE_CHAIN (record) = type_decl;
2406 TYPE_NAME (record) = type_decl;
dfafc897
FS
2407 TYPE_FIELDS (record) = f_gpr;
2408 TREE_CHAIN (f_gpr) = f_fpr;
2409 TREE_CHAIN (f_fpr) = f_ovf;
2410 TREE_CHAIN (f_ovf) = f_sav;
2411
2412 layout_type (record);
2413
2414 /* The correct type is an array type of one element. */
2415 return build_array_type (record, build_index_type (size_zero_node));
2416}
2417
2418/* Implement va_start. */
2419
2420void
2421rs6000_va_start (stdarg_p, valist, nextarg)
2422 int stdarg_p;
2423 tree valist;
2424 rtx nextarg;
4697a36c 2425{
dfafc897
FS
2426 HOST_WIDE_INT words, n_gpr, n_fpr;
2427 tree f_gpr, f_fpr, f_ovf, f_sav;
2428 tree gpr, fpr, ovf, sav, t;
2c4974b7 2429
dfafc897 2430 /* Only SVR4 needs something special. */
2c4974b7 2431 if (DEFAULT_ABI != ABI_V4 && DEFAULT_ABI != ABI_SOLARIS)
dfafc897
FS
2432 {
2433 std_expand_builtin_va_start (stdarg_p, valist, nextarg);
2434 return;
2435 }
2436
973a648b 2437 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
dfafc897
FS
2438 f_fpr = TREE_CHAIN (f_gpr);
2439 f_ovf = TREE_CHAIN (f_fpr);
2440 f_sav = TREE_CHAIN (f_ovf);
2441
8ebecc3b 2442 valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
dfafc897
FS
2443 gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr);
2444 fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr);
2445 ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf);
2446 sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav);
2447
2448 /* Count number of gp and fp argument registers used. */
4cc833b7 2449 words = current_function_args_info.words;
dfafc897
FS
2450 n_gpr = current_function_args_info.sysv_gregno - GP_ARG_MIN_REG;
2451 n_fpr = current_function_args_info.fregno - FP_ARG_MIN_REG;
2452
2453 if (TARGET_DEBUG_ARG)
78e1b90d
DE
2454 {
2455 fputs ("va_start: words = ", stderr);
2456 fprintf (stderr, HOST_WIDE_INT_PRINT_DEC, words);
2457 fputs (", n_gpr = ", stderr);
2458 fprintf (stderr, HOST_WIDE_INT_PRINT_DEC, n_gpr);
2459 fputs (", n_fpr = ", stderr);
2460 fprintf (stderr, HOST_WIDE_INT_PRINT_DEC, n_fpr);
2461 putc ('\n', stderr);
2462 }
dfafc897
FS
2463
2464 t = build (MODIFY_EXPR, TREE_TYPE (gpr), gpr, build_int_2 (n_gpr, 0));
2465 TREE_SIDE_EFFECTS (t) = 1;
2466 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2467
2468 t = build (MODIFY_EXPR, TREE_TYPE (fpr), fpr, build_int_2 (n_fpr, 0));
2469 TREE_SIDE_EFFECTS (t) = 1;
2470 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2471
2472 /* Find the overflow area. */
2473 t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
2474 if (words != 0)
2475 t = build (PLUS_EXPR, TREE_TYPE (ovf), t,
2476 build_int_2 (words * UNITS_PER_WORD, 0));
2477 t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
2478 TREE_SIDE_EFFECTS (t) = 1;
2479 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2480
2481 /* Find the register save area. */
2482 t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
2483 t = build (PLUS_EXPR, TREE_TYPE (sav), t,
2484 build_int_2 (-RS6000_VARARGS_SIZE, -1));
2485 t = build (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
2486 TREE_SIDE_EFFECTS (t) = 1;
2487 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2488}
2489
2490/* Implement va_arg. */
2491
2492rtx
2493rs6000_va_arg (valist, type)
2494 tree valist, type;
2495{
2496 tree f_gpr, f_fpr, f_ovf, f_sav;
2497 tree gpr, fpr, ovf, sav, reg, t, u;
2498 int indirect_p, size, rsize, n_reg, sav_ofs, sav_scale;
2499 rtx lab_false, lab_over, addr_rtx, r;
2500
9ebbca7d
GK
2501 /* For AIX, the rule is that structures are passed left-aligned in
2502 their stack slot. However, GCC does not presently do this:
2503 structures which are the same size as integer types are passed
2504 right-aligned, as if they were in fact integers. This only
2505 matters for structures of size 1 or 2, or 4 when TARGET_64BIT. */
dfafc897 2506 if (DEFAULT_ABI != ABI_V4 && DEFAULT_ABI != ABI_SOLARIS)
9ebbca7d
GK
2507 {
2508 HOST_WIDE_INT align, rounded_size;
2509 enum machine_mode mode;
2510 tree addr_tree;
2511
2512 /* Compute the rounded size of the type. */
2513 align = PARM_BOUNDARY / BITS_PER_UNIT;
2514 rounded_size = (((int_size_in_bytes (type) + align - 1) / align)
2515 * align);
2516
2517 addr_tree = valist;
2518
2519 mode = TYPE_MODE (type);
2520 if (mode != BLKmode)
2521 {
2522 HOST_WIDE_INT adj;
2523 adj = TREE_INT_CST_LOW (TYPE_SIZE (type)) / BITS_PER_UNIT;
2524 if (rounded_size > align)
2525 adj = rounded_size;
2526
2527 addr_tree = build (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree,
2528 build_int_2 (rounded_size - adj, 0));
2529 }
2530
2531 addr_rtx = expand_expr (addr_tree, NULL_RTX, Pmode, EXPAND_NORMAL);
2532 addr_rtx = copy_to_reg (addr_rtx);
2533
2534 /* Compute new value for AP. */
2535 t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
2536 build (PLUS_EXPR, TREE_TYPE (valist), valist,
2537 build_int_2 (rounded_size, 0)));
2538 TREE_SIDE_EFFECTS (t) = 1;
2539 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2540
2541 return addr_rtx;
2542 }
dfafc897 2543
973a648b 2544 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
dfafc897
FS
2545 f_fpr = TREE_CHAIN (f_gpr);
2546 f_ovf = TREE_CHAIN (f_fpr);
2547 f_sav = TREE_CHAIN (f_ovf);
2548
8ebecc3b 2549 valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
dfafc897
FS
2550 gpr = build (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr);
2551 fpr = build (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr);
2552 ovf = build (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf);
2553 sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav);
2554
2555 size = int_size_in_bytes (type);
2556 rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4cc833b7 2557
dfafc897 2558 if (AGGREGATE_TYPE_P (type) || TYPE_MODE (type) == TFmode)
4cc833b7 2559 {
dfafc897
FS
2560 /* Aggregates and long doubles are passed by reference. */
2561 indirect_p = 1;
2562 reg = gpr;
2563 n_reg = 1;
2564 sav_ofs = 0;
2565 sav_scale = 4;
2566 size = rsize = UNITS_PER_WORD;
2567 }
2568 else if (FLOAT_TYPE_P (type) && ! TARGET_SOFT_FLOAT)
2569 {
2570 /* FP args go in FP registers, if present. */
2571 indirect_p = 0;
2572 reg = fpr;
2573 n_reg = 1;
2574 sav_ofs = 8*4;
2575 sav_scale = 8;
4cc833b7 2576 }
dfafc897
FS
2577 else
2578 {
2579 /* Otherwise into GP registers. */
2580 indirect_p = 0;
2581 reg = gpr;
2582 n_reg = rsize;
2583 sav_ofs = 0;
2584 sav_scale = 4;
2585 }
2586
2587 /*
2588 * Pull the value out of the saved registers ...
2589 */
2590
2591 lab_false = gen_label_rtx ();
2592 lab_over = gen_label_rtx ();
2593 addr_rtx = gen_reg_rtx (Pmode);
2594
2595 emit_cmp_and_jump_insns (expand_expr (reg, NULL_RTX, QImode, EXPAND_NORMAL),
2596 GEN_INT (8 - n_reg + 1),
2597 GE, const1_rtx, QImode, 1, 1, lab_false);
2c4974b7 2598
dfafc897
FS
2599 /* Long long is aligned in the registers. */
2600 if (n_reg > 1)
2c4974b7 2601 {
dfafc897
FS
2602 u = build (BIT_AND_EXPR, TREE_TYPE (reg), reg,
2603 build_int_2 (n_reg - 1, 0));
2604 u = build (PLUS_EXPR, TREE_TYPE (reg), reg, u);
2605 u = build (MODIFY_EXPR, TREE_TYPE (reg), reg, u);
2606 TREE_SIDE_EFFECTS (u) = 1;
2607 expand_expr (u, const0_rtx, VOIDmode, EXPAND_NORMAL);
2c4974b7 2608 }
dfafc897
FS
2609
2610 if (sav_ofs)
2611 t = build (PLUS_EXPR, ptr_type_node, sav, build_int_2 (sav_ofs, 0));
2c4974b7 2612 else
dfafc897 2613 t = sav;
2c4974b7 2614
dfafc897
FS
2615 u = build (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg, build_int_2 (n_reg, 0));
2616 TREE_SIDE_EFFECTS (u) = 1;
2c4974b7 2617
dfafc897
FS
2618 u = build1 (CONVERT_EXPR, integer_type_node, u);
2619 TREE_SIDE_EFFECTS (u) = 1;
2c4974b7 2620
dfafc897
FS
2621 u = build (MULT_EXPR, integer_type_node, u, build_int_2 (sav_scale, 0));
2622 TREE_SIDE_EFFECTS (u) = 1;
2623
2624 t = build (PLUS_EXPR, ptr_type_node, t, u);
2625 TREE_SIDE_EFFECTS (t) = 1;
2626
2627 r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL);
2628 if (r != addr_rtx)
2629 emit_move_insn (addr_rtx, r);
2630
2631 emit_jump_insn (gen_jump (lab_over));
2632 emit_barrier ();
2633 emit_label (lab_false);
2634
2635 /*
2636 * ... otherwise out of the overflow area.
2637 */
2638
2639 /* Make sure we don't find reg 7 for the next int arg. */
2640 if (n_reg > 1)
2641 {
2642 t = build (MODIFY_EXPR, TREE_TYPE (reg), reg, build_int_2 (8, 0));
2643 TREE_SIDE_EFFECTS (t) = 1;
2644 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2645 }
2646
2647 /* Care for on-stack alignment if needed. */
2648 if (rsize <= 1)
2649 t = ovf;
2650 else
2651 {
2652 t = build (PLUS_EXPR, TREE_TYPE (ovf), ovf, build_int_2 (7, 0));
2653 t = build (BIT_AND_EXPR, TREE_TYPE (t), t, build_int_2 (-8, -1));
2654 }
2655 t = save_expr (t);
2656
2657 r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL);
2658 if (r != addr_rtx)
2659 emit_move_insn (addr_rtx, r);
2660
2661 t = build (PLUS_EXPR, TREE_TYPE (t), t, build_int_2 (size, 0));
2662 t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
2663 TREE_SIDE_EFFECTS (t) = 1;
2664 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2665
2666 emit_label (lab_over);
2667
2668 if (indirect_p)
2669 {
2670 r = gen_rtx_MEM (Pmode, addr_rtx);
2671 MEM_ALIAS_SET (r) = get_varargs_alias_set ();
2672 emit_move_insn (addr_rtx, r);
2673 }
2674
2675 return addr_rtx;
4697a36c 2676}
5b5040b9
RK
2677\f
2678/* Generate a memory reference for expand_block_move, copying volatile,
2679 and other bits from an original memory reference. */
2680
2681static rtx
2682expand_block_move_mem (mode, addr, orig_mem)
2683 enum machine_mode mode;
2684 rtx addr;
2685 rtx orig_mem;
2686{
39403d82 2687 rtx mem = gen_rtx_MEM (mode, addr);
b6c9286a 2688
c6df88cb 2689 MEM_COPY_ATTRIBUTES (mem, orig_mem);
b6c9286a
MM
2690#ifdef MEM_UNALIGNED_P
2691 MEM_UNALIGNED_P (mem) = MEM_UNALIGNED_P (orig_mem);
2692#endif
5b5040b9
RK
2693 return mem;
2694}
2695
7e69e155
MM
2696/* Expand a block move operation, and return 1 if successful. Return 0
2697 if we should let the compiler generate normal code.
2698
2699 operands[0] is the destination
2700 operands[1] is the source
2701 operands[2] is the length
2702 operands[3] is the alignment */
2703
3933e0e1
MM
2704#define MAX_MOVE_REG 4
2705
7e69e155
MM
2706int
2707expand_block_move (operands)
2708 rtx operands[];
2709{
b6c9286a
MM
2710 rtx orig_dest = operands[0];
2711 rtx orig_src = operands[1];
7e69e155 2712 rtx bytes_rtx = operands[2];
7e69e155 2713 rtx align_rtx = operands[3];
3933e0e1 2714 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
5ee95df6 2715 int align;
3933e0e1
MM
2716 int bytes;
2717 int offset;
2718 int num_reg;
2719 int i;
7e69e155
MM
2720 rtx src_reg;
2721 rtx dest_reg;
3933e0e1
MM
2722 rtx src_addr;
2723 rtx dest_addr;
7e69e155 2724 rtx tmp_reg;
3933e0e1 2725 rtx stores[MAX_MOVE_REG];
7e69e155
MM
2726 int move_bytes;
2727
3933e0e1 2728 /* If this is not a fixed size move, just call memcpy */
cc0d9ba8 2729 if (! constp)
3933e0e1
MM
2730 return 0;
2731
5ee95df6
FS
2732 /* If this is not a fixed size alignment, abort */
2733 if (GET_CODE (align_rtx) != CONST_INT)
2734 abort ();
2735 align = INTVAL (align_rtx);
2736
7e69e155 2737 /* Anything to move? */
3933e0e1
MM
2738 bytes = INTVAL (bytes_rtx);
2739 if (bytes <= 0)
7e69e155
MM
2740 return 1;
2741
3933e0e1
MM
2742 /* Don't support real large moves. If string instructions are not used,
2743 then don't generate more than 8 loads. */
2744 if (TARGET_STRING)
2745 {
c81fc13e 2746 if (bytes > 8*4)
3933e0e1
MM
2747 return 0;
2748 }
cc0d9ba8 2749 else if (! STRICT_ALIGNMENT)
3933e0e1 2750 {
c81fc13e
DE
2751 if (TARGET_POWERPC64 && align >= 4)
2752 {
2753 if (bytes > 8*8)
2754 return 0;
2755 }
2756 else
2757 if (bytes > 8*4)
2758 return 0;
3933e0e1
MM
2759 }
2760 else if (bytes > 8*align)
7e69e155
MM
2761 return 0;
2762
2763 /* Move the address into scratch registers. */
b6c9286a
MM
2764 dest_reg = copy_addr_to_reg (XEXP (orig_dest, 0));
2765 src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
7e69e155 2766
3933e0e1 2767 if (TARGET_STRING) /* string instructions are available */
7e69e155 2768 {
3933e0e1 2769 for ( ; bytes > 0; bytes -= move_bytes)
7e69e155 2770 {
3933e0e1 2771 if (bytes > 24 /* move up to 32 bytes at a time */
cc0d9ba8
DE
2772 && ! fixed_regs[5]
2773 && ! fixed_regs[6]
2774 && ! fixed_regs[7]
2775 && ! fixed_regs[8]
2776 && ! fixed_regs[9]
2777 && ! fixed_regs[10]
2778 && ! fixed_regs[11]
2779 && ! fixed_regs[12])
3933e0e1
MM
2780 {
2781 move_bytes = (bytes > 32) ? 32 : bytes;
cc0d9ba8
DE
2782 emit_insn (gen_movstrsi_8reg (expand_block_move_mem (BLKmode,
2783 dest_reg,
2784 orig_dest),
2785 expand_block_move_mem (BLKmode,
2786 src_reg,
2787 orig_src),
2788 GEN_INT ((move_bytes == 32)
2789 ? 0 : move_bytes),
4c64a852 2790 align_rtx));
3933e0e1
MM
2791 }
2792 else if (bytes > 16 /* move up to 24 bytes at a time */
f9562f27
DE
2793 && ! fixed_regs[5]
2794 && ! fixed_regs[6]
cc0d9ba8
DE
2795 && ! fixed_regs[7]
2796 && ! fixed_regs[8]
2797 && ! fixed_regs[9]
f9562f27 2798 && ! fixed_regs[10])
3933e0e1
MM
2799 {
2800 move_bytes = (bytes > 24) ? 24 : bytes;
cc0d9ba8
DE
2801 emit_insn (gen_movstrsi_6reg (expand_block_move_mem (BLKmode,
2802 dest_reg,
2803 orig_dest),
2804 expand_block_move_mem (BLKmode,
2805 src_reg,
2806 orig_src),
3933e0e1 2807 GEN_INT (move_bytes),
4c64a852 2808 align_rtx));
3933e0e1
MM
2809 }
2810 else if (bytes > 8 /* move up to 16 bytes at a time */
f9562f27
DE
2811 && ! fixed_regs[5]
2812 && ! fixed_regs[6]
2813 && ! fixed_regs[7]
2814 && ! fixed_regs[8])
3933e0e1
MM
2815 {
2816 move_bytes = (bytes > 16) ? 16 : bytes;
cc0d9ba8
DE
2817 emit_insn (gen_movstrsi_4reg (expand_block_move_mem (BLKmode,
2818 dest_reg,
2819 orig_dest),
2820 expand_block_move_mem (BLKmode,
2821 src_reg,
2822 orig_src),
3933e0e1 2823 GEN_INT (move_bytes),
4c64a852 2824 align_rtx));
3933e0e1 2825 }
acad7ed3
DE
2826 else if (bytes >= 8 && TARGET_POWERPC64
2827 /* 64-bit loads and stores require word-aligned displacements. */
2828 && (align >= 8 || (! STRICT_ALIGNMENT && align >= 4)))
2829 {
2830 move_bytes = 8;
2831 tmp_reg = gen_reg_rtx (DImode);
2832 emit_move_insn (tmp_reg,
2833 expand_block_move_mem (DImode,
2eba1afa 2834 src_reg, orig_src));
acad7ed3 2835 emit_move_insn (expand_block_move_mem (DImode,
2eba1afa 2836 dest_reg, orig_dest),
acad7ed3
DE
2837 tmp_reg);
2838 }
2839 else if (bytes > 4)
3933e0e1
MM
2840 { /* move up to 8 bytes at a time */
2841 move_bytes = (bytes > 8) ? 8 : bytes;
cc0d9ba8
DE
2842 emit_insn (gen_movstrsi_2reg (expand_block_move_mem (BLKmode,
2843 dest_reg,
2844 orig_dest),
2845 expand_block_move_mem (BLKmode,
2846 src_reg,
2847 orig_src),
3933e0e1 2848 GEN_INT (move_bytes),
4c64a852 2849 align_rtx));
3933e0e1 2850 }
cc0d9ba8 2851 else if (bytes >= 4 && (align >= 4 || ! STRICT_ALIGNMENT))
3933e0e1
MM
2852 { /* move 4 bytes */
2853 move_bytes = 4;
2854 tmp_reg = gen_reg_rtx (SImode);
cc0d9ba8
DE
2855 emit_move_insn (tmp_reg,
2856 expand_block_move_mem (SImode,
2857 src_reg, orig_src));
2858 emit_move_insn (expand_block_move_mem (SImode,
2859 dest_reg, orig_dest),
2860 tmp_reg);
3933e0e1 2861 }
cc0d9ba8 2862 else if (bytes == 2 && (align >= 2 || ! STRICT_ALIGNMENT))
3933e0e1
MM
2863 { /* move 2 bytes */
2864 move_bytes = 2;
2865 tmp_reg = gen_reg_rtx (HImode);
cc0d9ba8
DE
2866 emit_move_insn (tmp_reg,
2867 expand_block_move_mem (HImode,
2868 src_reg, orig_src));
2869 emit_move_insn (expand_block_move_mem (HImode,
2870 dest_reg, orig_dest),
2871 tmp_reg);
3933e0e1
MM
2872 }
2873 else if (bytes == 1) /* move 1 byte */
2874 {
2875 move_bytes = 1;
2876 tmp_reg = gen_reg_rtx (QImode);
cc0d9ba8
DE
2877 emit_move_insn (tmp_reg,
2878 expand_block_move_mem (QImode,
2879 src_reg, orig_src));
2880 emit_move_insn (expand_block_move_mem (QImode,
2881 dest_reg, orig_dest),
2882 tmp_reg);
3933e0e1
MM
2883 }
2884 else
2885 { /* move up to 4 bytes at a time */
2886 move_bytes = (bytes > 4) ? 4 : bytes;
cc0d9ba8
DE
2887 emit_insn (gen_movstrsi_1reg (expand_block_move_mem (BLKmode,
2888 dest_reg,
2889 orig_dest),
2890 expand_block_move_mem (BLKmode,
2891 src_reg,
2892 orig_src),
3933e0e1 2893 GEN_INT (move_bytes),
4c64a852 2894 align_rtx));
3933e0e1 2895 }
4c64a852 2896
015892ee
RK
2897 if (bytes > move_bytes)
2898 {
cc0d9ba8
DE
2899 if (! TARGET_POWERPC64)
2900 {
2901 emit_insn (gen_addsi3 (src_reg, src_reg,
2902 GEN_INT (move_bytes)));
2903 emit_insn (gen_addsi3 (dest_reg, dest_reg,
2904 GEN_INT (move_bytes)));
2905 }
2906 else
2907 {
2908 emit_insn (gen_adddi3 (src_reg, src_reg,
2909 GEN_INT (move_bytes)));
2910 emit_insn (gen_adddi3 (dest_reg, dest_reg,
2911 GEN_INT (move_bytes)));
2912 }
015892ee 2913 }
4c64a852 2914 }
3933e0e1
MM
2915 }
2916
2917 else /* string instructions not available */
2918 {
2919 num_reg = offset = 0;
2920 for ( ; bytes > 0; (bytes -= move_bytes), (offset += move_bytes))
7e69e155 2921 {
3933e0e1
MM
2922 /* Calculate the correct offset for src/dest */
2923 if (offset == 0)
7e69e155 2924 {
3933e0e1
MM
2925 src_addr = src_reg;
2926 dest_addr = dest_reg;
2927 }
2928 else
2929 {
c5c76735
JL
2930 src_addr = plus_constant (src_reg, offset);
2931 dest_addr = plus_constant (dest_reg, offset);
3933e0e1
MM
2932 }
2933
cc0d9ba8
DE
2934 /* Generate the appropriate load and store, saving the stores
2935 for later. */
2936 if (bytes >= 8 && TARGET_POWERPC64
2937 /* 64-bit loads and stores require word-aligned displacements. */
2938 && (align >= 8 || (! STRICT_ALIGNMENT && align >= 4)))
b6c9286a
MM
2939 {
2940 move_bytes = 8;
2941 tmp_reg = gen_reg_rtx (DImode);
cc0d9ba8
DE
2942 emit_insn (gen_movdi (tmp_reg,
2943 expand_block_move_mem (DImode,
2944 src_addr,
2945 orig_src)));
2946 stores[num_reg++] = gen_movdi (expand_block_move_mem (DImode,
2947 dest_addr,
2948 orig_dest),
2949 tmp_reg);
b6c9286a 2950 }
cc0d9ba8 2951 else if (bytes >= 4 && (align >= 4 || ! STRICT_ALIGNMENT))
3933e0e1
MM
2952 {
2953 move_bytes = 4;
2954 tmp_reg = gen_reg_rtx (SImode);
cc0d9ba8
DE
2955 emit_insn (gen_movsi (tmp_reg,
2956 expand_block_move_mem (SImode,
2957 src_addr,
2958 orig_src)));
2959 stores[num_reg++] = gen_movsi (expand_block_move_mem (SImode,
2960 dest_addr,
2961 orig_dest),
2962 tmp_reg);
3933e0e1 2963 }
cc0d9ba8 2964 else if (bytes >= 2 && (align >= 2 || ! STRICT_ALIGNMENT))
3933e0e1
MM
2965 {
2966 move_bytes = 2;
2967 tmp_reg = gen_reg_rtx (HImode);
c81fc13e 2968 emit_insn (gen_movhi (tmp_reg,
cc0d9ba8
DE
2969 expand_block_move_mem (HImode,
2970 src_addr,
2971 orig_src)));
2972 stores[num_reg++] = gen_movhi (expand_block_move_mem (HImode,
2973 dest_addr,
2974 orig_dest),
2975 tmp_reg);
3933e0e1
MM
2976 }
2977 else
2978 {
2979 move_bytes = 1;
2980 tmp_reg = gen_reg_rtx (QImode);
c81fc13e 2981 emit_insn (gen_movqi (tmp_reg,
cc0d9ba8
DE
2982 expand_block_move_mem (QImode,
2983 src_addr,
2984 orig_src)));
2985 stores[num_reg++] = gen_movqi (expand_block_move_mem (QImode,
2986 dest_addr,
2987 orig_dest),
2988 tmp_reg);
3933e0e1
MM
2989 }
2990
2991 if (num_reg >= MAX_MOVE_REG)
2992 {
2993 for (i = 0; i < num_reg; i++)
2994 emit_insn (stores[i]);
2995 num_reg = 0;
7e69e155
MM
2996 }
2997 }
3933e0e1 2998
b6c9286a
MM
2999 for (i = 0; i < num_reg; i++)
3000 emit_insn (stores[i]);
7e69e155
MM
3001 }
3002
3003 return 1;
3004}
3005
9878760c
RK
3006\f
3007/* Return 1 if OP is a load multiple operation. It is known to be a
3008 PARALLEL and the first section will be tested. */
3009
3010int
3011load_multiple_operation (op, mode)
3012 rtx op;
296b8152 3013 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
3014{
3015 int count = XVECLEN (op, 0);
e2c953b6 3016 unsigned int dest_regno;
9878760c
RK
3017 rtx src_addr;
3018 int i;
3019
3020 /* Perform a quick check so we don't blow up below. */
3021 if (count <= 1
3022 || GET_CODE (XVECEXP (op, 0, 0)) != SET
3023 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
3024 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM)
3025 return 0;
3026
3027 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
3028 src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);
3029
3030 for (i = 1; i < count; i++)
3031 {
3032 rtx elt = XVECEXP (op, 0, i);
3033
3034 if (GET_CODE (elt) != SET
3035 || GET_CODE (SET_DEST (elt)) != REG
3036 || GET_MODE (SET_DEST (elt)) != SImode
3037 || REGNO (SET_DEST (elt)) != dest_regno + i
3038 || GET_CODE (SET_SRC (elt)) != MEM
3039 || GET_MODE (SET_SRC (elt)) != SImode
3040 || GET_CODE (XEXP (SET_SRC (elt), 0)) != PLUS
3041 || ! rtx_equal_p (XEXP (XEXP (SET_SRC (elt), 0), 0), src_addr)
3042 || GET_CODE (XEXP (XEXP (SET_SRC (elt), 0), 1)) != CONST_INT
3043 || INTVAL (XEXP (XEXP (SET_SRC (elt), 0), 1)) != i * 4)
3044 return 0;
3045 }
3046
3047 return 1;
3048}
3049
3050/* Similar, but tests for store multiple. Here, the second vector element
3051 is a CLOBBER. It will be tested later. */
3052
3053int
3054store_multiple_operation (op, mode)
3055 rtx op;
296b8152 3056 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
3057{
3058 int count = XVECLEN (op, 0) - 1;
e2c953b6 3059 unsigned int src_regno;
9878760c
RK
3060 rtx dest_addr;
3061 int i;
3062
3063 /* Perform a quick check so we don't blow up below. */
3064 if (count <= 1
3065 || GET_CODE (XVECEXP (op, 0, 0)) != SET
3066 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM
3067 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG)
3068 return 0;
3069
3070 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
3071 dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);
3072
3073 for (i = 1; i < count; i++)
3074 {
3075 rtx elt = XVECEXP (op, 0, i + 1);
3076
3077 if (GET_CODE (elt) != SET
3078 || GET_CODE (SET_SRC (elt)) != REG
3079 || GET_MODE (SET_SRC (elt)) != SImode
3080 || REGNO (SET_SRC (elt)) != src_regno + i
3081 || GET_CODE (SET_DEST (elt)) != MEM
3082 || GET_MODE (SET_DEST (elt)) != SImode
3083 || GET_CODE (XEXP (SET_DEST (elt), 0)) != PLUS
3084 || ! rtx_equal_p (XEXP (XEXP (SET_DEST (elt), 0), 0), dest_addr)
3085 || GET_CODE (XEXP (XEXP (SET_DEST (elt), 0), 1)) != CONST_INT
3086 || INTVAL (XEXP (XEXP (SET_DEST (elt), 0), 1)) != i * 4)
3087 return 0;
3088 }
3089
3090 return 1;
3091}
9ebbca7d
GK
3092
3093/* Return 1 for an PARALLEL suitable for mtcrf. */
3094
3095int
3096mtcrf_operation (op, mode)
3097 rtx op;
3098 enum machine_mode mode ATTRIBUTE_UNUSED;
3099{
3100 int count = XVECLEN (op, 0);
3101 int i;
9ebbca7d
GK
3102 rtx src_reg;
3103
3104 /* Perform a quick check so we don't blow up below. */
e35b9579
GK
3105 if (count < 1
3106 || GET_CODE (XVECEXP (op, 0, 0)) != SET
3107 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC
3108 || XVECLEN (SET_SRC (XVECEXP (op, 0, 0)), 0) != 2)
9ebbca7d 3109 return 0;
e35b9579 3110 src_reg = XVECEXP (SET_SRC (XVECEXP (op, 0, 0)), 0, 0);
9ebbca7d
GK
3111
3112 if (GET_CODE (src_reg) != REG
3113 || GET_MODE (src_reg) != SImode
3114 || ! INT_REGNO_P (REGNO (src_reg)))
3115 return 0;
3116
e35b9579 3117 for (i = 0; i < count; i++)
9ebbca7d
GK
3118 {
3119 rtx exp = XVECEXP (op, 0, i);
3120 rtx unspec;
3121 int maskval;
3122
3123 if (GET_CODE (exp) != SET
3124 || GET_CODE (SET_DEST (exp)) != REG
3125 || GET_MODE (SET_DEST (exp)) != CCmode
3126 || ! CR_REGNO_P (REGNO (SET_DEST (exp))))
3127 return 0;
3128 unspec = SET_SRC (exp);
3129 maskval = 1 << (MAX_CR_REGNO - REGNO (SET_DEST (exp)));
9ebbca7d
GK
3130
3131 if (GET_CODE (unspec) != UNSPEC
3132 || XINT (unspec, 1) != 20
3133 || XVECLEN (unspec, 0) != 2
3134 || XVECEXP (unspec, 0, 0) != src_reg
3135 || GET_CODE (XVECEXP (unspec, 0, 1)) != CONST_INT
3136 || INTVAL (XVECEXP (unspec, 0, 1)) != maskval)
3137 return 0;
3138 }
e35b9579 3139 return 1;
9ebbca7d
GK
3140}
3141
3142/* Return 1 for an PARALLEL suitable for lmw. */
3143
3144int
3145lmw_operation (op, mode)
3146 rtx op;
3147 enum machine_mode mode ATTRIBUTE_UNUSED;
3148{
3149 int count = XVECLEN (op, 0);
e2c953b6 3150 unsigned int dest_regno;
9ebbca7d 3151 rtx src_addr;
e2c953b6 3152 unsigned int base_regno;
9ebbca7d
GK
3153 HOST_WIDE_INT offset;
3154 int i;
3155
3156 /* Perform a quick check so we don't blow up below. */
3157 if (count <= 1
3158 || GET_CODE (XVECEXP (op, 0, 0)) != SET
3159 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
3160 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM)
3161 return 0;
3162
3163 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
3164 src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);
3165
3166 if (dest_regno > 31
e2c953b6 3167 || count != 32 - (int) dest_regno)
9ebbca7d
GK
3168 return 0;
3169
258bfae2 3170 if (LEGITIMATE_INDIRECT_ADDRESS_P (src_addr, 0))
9ebbca7d
GK
3171 {
3172 offset = 0;
3173 base_regno = REGNO (src_addr);
3174 if (base_regno == 0)
3175 return 0;
3176 }
258bfae2 3177 else if (LEGITIMATE_OFFSET_ADDRESS_P (SImode, src_addr, 0))
9ebbca7d
GK
3178 {
3179 offset = INTVAL (XEXP (src_addr, 1));
3180 base_regno = REGNO (XEXP (src_addr, 0));
3181 }
3182 else
3183 return 0;
3184
3185 for (i = 0; i < count; i++)
3186 {
3187 rtx elt = XVECEXP (op, 0, i);
3188 rtx newaddr;
3189 rtx addr_reg;
3190 HOST_WIDE_INT newoffset;
3191
3192 if (GET_CODE (elt) != SET
3193 || GET_CODE (SET_DEST (elt)) != REG
3194 || GET_MODE (SET_DEST (elt)) != SImode
3195 || REGNO (SET_DEST (elt)) != dest_regno + i
3196 || GET_CODE (SET_SRC (elt)) != MEM
3197 || GET_MODE (SET_SRC (elt)) != SImode)
3198 return 0;
3199 newaddr = XEXP (SET_SRC (elt), 0);
258bfae2 3200 if (LEGITIMATE_INDIRECT_ADDRESS_P (newaddr, 0))
9ebbca7d
GK
3201 {
3202 newoffset = 0;
3203 addr_reg = newaddr;
3204 }
258bfae2 3205 else if (LEGITIMATE_OFFSET_ADDRESS_P (SImode, newaddr, 0))
9ebbca7d
GK
3206 {
3207 addr_reg = XEXP (newaddr, 0);
3208 newoffset = INTVAL (XEXP (newaddr, 1));
3209 }
3210 else
3211 return 0;
3212 if (REGNO (addr_reg) != base_regno
3213 || newoffset != offset + 4 * i)
3214 return 0;
3215 }
3216
3217 return 1;
3218}
3219
3220/* Return 1 for an PARALLEL suitable for stmw. */
3221
3222int
3223stmw_operation (op, mode)
3224 rtx op;
3225 enum machine_mode mode ATTRIBUTE_UNUSED;
3226{
3227 int count = XVECLEN (op, 0);
e2c953b6 3228 unsigned int src_regno;
9ebbca7d 3229 rtx dest_addr;
e2c953b6 3230 unsigned int base_regno;
9ebbca7d
GK
3231 HOST_WIDE_INT offset;
3232 int i;
3233
3234 /* Perform a quick check so we don't blow up below. */
3235 if (count <= 1
3236 || GET_CODE (XVECEXP (op, 0, 0)) != SET
3237 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM
3238 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG)
3239 return 0;
3240
3241 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
3242 dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);
3243
3244 if (src_regno > 31
e2c953b6 3245 || count != 32 - (int) src_regno)
9ebbca7d
GK
3246 return 0;
3247
258bfae2 3248 if (LEGITIMATE_INDIRECT_ADDRESS_P (dest_addr, 0))
9ebbca7d
GK
3249 {
3250 offset = 0;
3251 base_regno = REGNO (dest_addr);
3252 if (base_regno == 0)
3253 return 0;
3254 }
258bfae2 3255 else if (LEGITIMATE_OFFSET_ADDRESS_P (SImode, dest_addr, 0))
9ebbca7d
GK
3256 {
3257 offset = INTVAL (XEXP (dest_addr, 1));
3258 base_regno = REGNO (XEXP (dest_addr, 0));
3259 }
3260 else
3261 return 0;
3262
3263 for (i = 0; i < count; i++)
3264 {
3265 rtx elt = XVECEXP (op, 0, i);
3266 rtx newaddr;
3267 rtx addr_reg;
3268 HOST_WIDE_INT newoffset;
3269
3270 if (GET_CODE (elt) != SET
3271 || GET_CODE (SET_SRC (elt)) != REG
3272 || GET_MODE (SET_SRC (elt)) != SImode
3273 || REGNO (SET_SRC (elt)) != src_regno + i
3274 || GET_CODE (SET_DEST (elt)) != MEM
3275 || GET_MODE (SET_DEST (elt)) != SImode)
3276 return 0;
3277 newaddr = XEXP (SET_DEST (elt), 0);
258bfae2 3278 if (LEGITIMATE_INDIRECT_ADDRESS_P (newaddr, 0))
9ebbca7d
GK
3279 {
3280 newoffset = 0;
3281 addr_reg = newaddr;
3282 }
258bfae2 3283 else if (LEGITIMATE_OFFSET_ADDRESS_P (SImode, newaddr, 0))
9ebbca7d
GK
3284 {
3285 addr_reg = XEXP (newaddr, 0);
3286 newoffset = INTVAL (XEXP (newaddr, 1));
3287 }
3288 else
3289 return 0;
3290 if (REGNO (addr_reg) != base_regno
3291 || newoffset != offset + 4 * i)
3292 return 0;
3293 }
3294
3295 return 1;
3296}
9878760c 3297\f
39a10a29
GK
3298
3299/* A validation routine: say whether CODE, a condition code,
3300 and MODE match. The other alternatives either don't make
3301 sense or should never be generated. */
3302static void
3303validate_condition_mode (code, mode)
3304 enum rtx_code code;
3305 enum machine_mode mode;
3306{
3307 if (GET_RTX_CLASS (code) != '<'
3308 || GET_MODE_CLASS (mode) != MODE_CC)
3309 abort ();
3310
3311 /* These don't make sense. */
3312 if ((code == GT || code == LT || code == GE || code == LE)
3313 && mode == CCUNSmode)
3314 abort ();
3315
3316 if ((code == GTU || code == LTU || code == GEU || code == LEU)
3317 && mode != CCUNSmode)
3318 abort ();
3319
3320 if (mode != CCFPmode
3321 && (code == ORDERED || code == UNORDERED
3322 || code == UNEQ || code == LTGT
3323 || code == UNGT || code == UNLT
3324 || code == UNGE || code == UNLE))
3325 abort();
3326
de6c5979
BL
3327 /* These should never be generated except for
3328 flag_unsafe_math_optimizations. */
39a10a29 3329 if (mode == CCFPmode
de6c5979 3330 && ! flag_unsafe_math_optimizations
39a10a29
GK
3331 && (code == LE || code == GE
3332 || code == UNEQ || code == LTGT
3333 || code == UNGT || code == UNLT))
3334 abort ();
3335
3336 /* These are invalid; the information is not there. */
3337 if (mode == CCEQmode
3338 && code != EQ && code != NE)
3339 abort ();
3340}
3341
9878760c
RK
3342/* Return 1 if OP is a comparison operation that is valid for a branch insn.
3343 We only check the opcode against the mode of the CC value here. */
3344
3345int
3346branch_comparison_operator (op, mode)
3347 register rtx op;
296b8152 3348 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
3349{
3350 enum rtx_code code = GET_CODE (op);
3351 enum machine_mode cc_mode;
3352
3353 if (GET_RTX_CLASS (code) != '<')
3354 return 0;
3355
3356 cc_mode = GET_MODE (XEXP (op, 0));
3357 if (GET_MODE_CLASS (cc_mode) != MODE_CC)
3358 return 0;
3359
39a10a29 3360 validate_condition_mode (code, cc_mode);
9878760c 3361
39a10a29
GK
3362 return 1;
3363}
3364
3365/* Return 1 if OP is a comparison operation that is valid for a branch
3366 insn and which is true if the corresponding bit in the CC register
3367 is set. */
3368
3369int
3370branch_positive_comparison_operator (op, mode)
3371 register rtx op;
3372 enum machine_mode mode;
3373{
3374 enum rtx_code code;
3375
3376 if (! branch_comparison_operator (op, mode))
9878760c
RK
3377 return 0;
3378
39a10a29
GK
3379 code = GET_CODE (op);
3380 return (code == EQ || code == LT || code == GT
3381 || code == LTU || code == GTU
3382 || code == UNORDERED);
9878760c
RK
3383}
3384
39a10a29 3385
9878760c
RK
3386/* Return 1 if OP is a comparison operation that is valid for an scc insn.
3387 We check the opcode against the mode of the CC value and disallow EQ or
3388 NE comparisons for integers. */
3389
3390int
3391scc_comparison_operator (op, mode)
3392 register rtx op;
3393 enum machine_mode mode;
3394{
3395 enum rtx_code code = GET_CODE (op);
3396 enum machine_mode cc_mode;
3397
3398 if (GET_MODE (op) != mode && mode != VOIDmode)
3399 return 0;
3400
3401 if (GET_RTX_CLASS (code) != '<')
3402 return 0;
3403
3404 cc_mode = GET_MODE (XEXP (op, 0));
3405 if (GET_MODE_CLASS (cc_mode) != MODE_CC)
3406 return 0;
3407
39a10a29 3408 validate_condition_mode (code, cc_mode);
9878760c 3409
39a10a29 3410 if (code == NE && cc_mode != CCFPmode)
c5defebb
RK
3411 return 0;
3412
9878760c
RK
3413 return 1;
3414}
e0cd0770
JC
3415
3416int
3417trap_comparison_operator (op, mode)
3418 rtx op;
3419 enum machine_mode mode;
3420{
3421 if (mode != VOIDmode && mode != GET_MODE (op))
3422 return 0;
39a10a29 3423 return GET_RTX_CLASS (GET_CODE (op)) == '<';
e0cd0770 3424}
dfbdccdb
GK
3425
3426int
3427boolean_operator (op, mode)
3428 rtx op;
3429 enum machine_mode mode ATTRIBUTE_UNUSED;
3430{
3431 enum rtx_code code = GET_CODE (op);
3432 return (code == AND || code == IOR || code == XOR);
3433}
1d328b19
GK
3434
3435int
3436boolean_or_operator (op, mode)
3437 rtx op;
3438 enum machine_mode mode ATTRIBUTE_UNUSED;
3439{
3440 enum rtx_code code = GET_CODE (op);
3441 return (code == IOR || code == XOR);
3442}
9878760c
RK
3443\f
3444/* Return 1 if ANDOP is a mask that has no bits on that are not in the
3445 mask required to convert the result of a rotate insn into a shift
3446 left insn of SHIFTOP bits. Both are known to be CONST_INT. */
3447
3448int
3449includes_lshift_p (shiftop, andop)
3450 register rtx shiftop;
3451 register rtx andop;
3452{
e2c953b6
DE
3453 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
3454
3455 shift_mask <<= INTVAL (shiftop);
9878760c
RK
3456
3457 return (INTVAL (andop) & ~shift_mask) == 0;
3458}
3459
3460/* Similar, but for right shift. */
3461
3462int
3463includes_rshift_p (shiftop, andop)
3464 register rtx shiftop;
3465 register rtx andop;
3466{
a7653a2c 3467 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
9878760c
RK
3468
3469 shift_mask >>= INTVAL (shiftop);
3470
e2c953b6
DE
3471 return (INTVAL (andop) & ~shift_mask) == 0;
3472}
3473
3474/* Return 1 if ANDOP is a mask that has no bits on that are not in the
3475 mask required to convert the result of a rotate insn into a shift
3476 left insn of SHIFTOP bits. */
3477
3478int
3479includes_lshift64_p (shiftop, andop)
3480 register rtx shiftop;
3481 register rtx andop;
3482{
3483#if HOST_BITS_PER_WIDE_INT == 64
3484 unsigned HOST_WIDE_INT shift_mask = ~(unsigned HOST_WIDE_INT) 0;
3485
3486 shift_mask <<= INTVAL (shiftop);
3487
3488 return (INTVAL (andop) & ~shift_mask) == 0;
3489#else
3490 unsigned HOST_WIDE_INT shift_mask_low = ~(unsigned HOST_WIDE_INT) 0;
3491 unsigned HOST_WIDE_INT shift_mask_high = ~(unsigned HOST_WIDE_INT) 0;
3492
3493 shift_mask_low <<= INTVAL (shiftop);
3494
3495 if (INTVAL (shiftop) > 32)
3496 shift_mask_high <<= (INTVAL (shiftop) - 32);
3497
3498 if (GET_CODE (andop) == CONST_INT)
3499 return (INTVAL (andop) & ~shift_mask_low) == 0;
3500 else
3501 return ((CONST_DOUBLE_HIGH (andop) & ~shift_mask_high) == 0
3502 && (CONST_DOUBLE_LOW (andop) & ~shift_mask_low) == 0);
3503#endif
9878760c 3504}
35068b43
RK
3505
3506/* Return 1 if REGNO (reg1) == REGNO (reg2) - 1 making them candidates
3507 for lfq and stfq insns.
3508
3509 Note reg1 and reg2 *must* be hard registers. To be sure we will
3510 abort if we are passed pseudo registers. */
3511
3512int
3513registers_ok_for_quad_peep (reg1, reg2)
3514 rtx reg1, reg2;
3515{
3516 /* We might have been passed a SUBREG. */
3517 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
3518 return 0;
3519
3520 return (REGNO (reg1) == REGNO (reg2) - 1);
3521}
3522
3523/* Return 1 if addr1 and addr2 are suitable for lfq or stfq insn. addr1 and
3524 addr2 must be in consecutive memory locations (addr2 == addr1 + 8). */
3525
3526int
3527addrs_ok_for_quad_peep (addr1, addr2)
3528 register rtx addr1;
3529 register rtx addr2;
3530{
e2c953b6 3531 unsigned int reg1;
35068b43
RK
3532 int offset1;
3533
3534 /* Extract an offset (if used) from the first addr. */
3535 if (GET_CODE (addr1) == PLUS)
3536 {
3537 /* If not a REG, return zero. */
3538 if (GET_CODE (XEXP (addr1, 0)) != REG)
3539 return 0;
3540 else
3541 {
3542 reg1 = REGNO (XEXP (addr1, 0));
3543 /* The offset must be constant! */
3544 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
3545 return 0;
3546 offset1 = INTVAL (XEXP (addr1, 1));
3547 }
3548 }
3549 else if (GET_CODE (addr1) != REG)
3550 return 0;
3551 else
3552 {
3553 reg1 = REGNO (addr1);
3554 /* This was a simple (mem (reg)) expression. Offset is 0. */
3555 offset1 = 0;
3556 }
3557
acad7ed3 3558 /* Make sure the second address is a (mem (plus (reg) (const_int))). */
35068b43
RK
3559 if (GET_CODE (addr2) != PLUS)
3560 return 0;
3561
3562 if (GET_CODE (XEXP (addr2, 0)) != REG
3563 || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
3564 return 0;
3565
3566 if (reg1 != REGNO (XEXP (addr2, 0)))
3567 return 0;
3568
3569 /* The offset for the second addr must be 8 more than the first addr. */
3570 if (INTVAL (XEXP (addr2, 1)) != offset1 + 8)
3571 return 0;
3572
3573 /* All the tests passed. addr1 and addr2 are valid for lfq or stfq
3574 instructions. */
3575 return 1;
3576}
9878760c
RK
3577\f
3578/* Return the register class of a scratch register needed to copy IN into
3579 or out of a register in CLASS in MODE. If it can be done directly,
3580 NO_REGS is returned. */
3581
3582enum reg_class
3583secondary_reload_class (class, mode, in)
3584 enum reg_class class;
296b8152 3585 enum machine_mode mode ATTRIBUTE_UNUSED;
9878760c
RK
3586 rtx in;
3587{
5accd822 3588 int regno;
9878760c 3589
3cb999d8 3590#if TARGET_ELF
1427100a 3591 /* We can not copy a symbolic operand directly into anything other than
e7b7998a
JL
3592 BASE_REGS for TARGET_ELF. So indicate that a register from BASE_REGS
3593 is needed as an intermediate register. */
3cb999d8 3594 if (class != BASE_REGS
e7b7998a 3595 && (GET_CODE (in) == SYMBOL_REF
201b6183 3596 || GET_CODE (in) == HIGH
e7b7998a
JL
3597 || GET_CODE (in) == LABEL_REF
3598 || GET_CODE (in) == CONST))
3599 return BASE_REGS;
3cb999d8 3600#endif
e7b7998a 3601
5accd822
DE
3602 if (GET_CODE (in) == REG)
3603 {
3604 regno = REGNO (in);
3605 if (regno >= FIRST_PSEUDO_REGISTER)
3606 {
3607 regno = true_regnum (in);
3608 if (regno >= FIRST_PSEUDO_REGISTER)
3609 regno = -1;
3610 }
3611 }
3612 else if (GET_CODE (in) == SUBREG)
3613 {
3614 regno = true_regnum (in);
3615 if (regno >= FIRST_PSEUDO_REGISTER)
3616 regno = -1;
3617 }
3618 else
3619 regno = -1;
3620
9878760c
RK
3621 /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
3622 into anything. */
3623 if (class == GENERAL_REGS || class == BASE_REGS
3624 || (regno >= 0 && INT_REGNO_P (regno)))
3625 return NO_REGS;
3626
3627 /* Constants, memory, and FP registers can go into FP registers. */
3628 if ((regno == -1 || FP_REGNO_P (regno))
3629 && (class == FLOAT_REGS || class == NON_SPECIAL_REGS))
3630 return NO_REGS;
3631
3632 /* We can copy among the CR registers. */
3633 if ((class == CR_REGS || class == CR0_REGS)
3634 && regno >= 0 && CR_REGNO_P (regno))
3635 return NO_REGS;
3636
3637 /* Otherwise, we need GENERAL_REGS. */
3638 return GENERAL_REGS;
3639}
3640\f
3641/* Given a comparison operation, return the bit number in CCR to test. We
3642 know this is a valid comparison.
3643
3644 SCC_P is 1 if this is for an scc. That means that %D will have been
3645 used instead of %C, so the bits will be in different places.
3646
b4ac57ab 3647 Return -1 if OP isn't a valid comparison for some reason. */
9878760c
RK
3648
3649int
3650ccr_bit (op, scc_p)
3651 register rtx op;
3652 int scc_p;
3653{
3654 enum rtx_code code = GET_CODE (op);
3655 enum machine_mode cc_mode;
3656 int cc_regnum;
3657 int base_bit;
9ebbca7d 3658 rtx reg;
9878760c
RK
3659
3660 if (GET_RTX_CLASS (code) != '<')
3661 return -1;
3662
9ebbca7d
GK
3663 reg = XEXP (op, 0);
3664
3665 if (GET_CODE (reg) != REG
3666 || ! CR_REGNO_P (REGNO (reg)))
3667 abort ();
3668
3669 cc_mode = GET_MODE (reg);
3670 cc_regnum = REGNO (reg);
3671 base_bit = 4 * (cc_regnum - CR0_REGNO);
9878760c 3672
39a10a29 3673 validate_condition_mode (code, cc_mode);
c5defebb 3674
9878760c
RK
3675 switch (code)
3676 {
3677 case NE:
3678 return scc_p ? base_bit + 3 : base_bit + 2;
3679 case EQ:
3680 return base_bit + 2;
1c882ea4 3681 case GT: case GTU: case UNLE:
9878760c 3682 return base_bit + 1;
1c882ea4 3683 case LT: case LTU: case UNGE:
9878760c 3684 return base_bit;
1c882ea4
GK
3685 case ORDERED: case UNORDERED:
3686 return base_bit + 3;
9878760c
RK
3687
3688 case GE: case GEU:
39a10a29 3689 /* If scc, we will have done a cror to put the bit in the
9878760c
RK
3690 unordered position. So test that bit. For integer, this is ! LT
3691 unless this is an scc insn. */
39a10a29 3692 return scc_p ? base_bit + 3 : base_bit;
9878760c
RK
3693
3694 case LE: case LEU:
39a10a29 3695 return scc_p ? base_bit + 3 : base_bit + 1;
1c882ea4 3696
9878760c
RK
3697 default:
3698 abort ();
3699 }
3700}
1ff7789b 3701\f
8d30c4ee 3702/* Return the GOT register. */
1ff7789b
MM
3703
3704struct rtx_def *
3705rs6000_got_register (value)
5f59ecb7 3706 rtx value ATTRIBUTE_UNUSED;
1ff7789b 3707{
8d30c4ee
FS
3708 /* The second flow pass currently (June 1999) can't update regs_ever_live
3709 without disturbing other parts of the compiler, so update it here to
3710 make the prolog/epilogue code happy. */
3cb999d8 3711 if (no_new_pseudos && ! regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
8d30c4ee 3712 regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
1ff7789b 3713
8d30c4ee 3714 current_function_uses_pic_offset_table = 1;
3cb999d8 3715
1ff7789b
MM
3716 return pic_offset_table_rtx;
3717}
a7df97e6 3718\f
71f123ca 3719/* Functions to init, mark and free struct machine_function.
a7df97e6
MM
3720 These will be called, via pointer variables,
3721 from push_function_context and pop_function_context. */
3722
00dba523
NC
3723static void
3724rs6000_init_machine_status (p)
a7df97e6
MM
3725 struct function *p;
3726{
71f123ca
FS
3727 p->machine = (machine_function *) xcalloc (1, sizeof (machine_function));
3728}
a7df97e6 3729
71f123ca
FS
3730static void
3731rs6000_mark_machine_status (p)
3732 struct function *p;
3733{
3734 if (p->machine)
3735 ggc_mark_rtx (p->machine->ra_rtx);
a7df97e6
MM
3736}
3737
00dba523
NC
3738static void
3739rs6000_free_machine_status (p)
a7df97e6
MM
3740 struct function *p;
3741{
00dba523
NC
3742 if (p->machine == NULL)
3743 return;
a7df97e6 3744
00dba523
NC
3745 free (p->machine);
3746 p->machine = NULL;
a7df97e6
MM
3747}
3748
9878760c
RK
3749\f
3750/* Print an operand. Recognize special options, documented below. */
3751
38c1f2d7 3752#if TARGET_ELF
d9407988 3753#define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
8fbd2dc7 3754#define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
ba5e43aa
MM
3755#else
3756#define SMALL_DATA_RELOC "sda21"
8fbd2dc7 3757#define SMALL_DATA_REG 0
ba5e43aa
MM
3758#endif
3759
9878760c
RK
3760void
3761print_operand (file, x, code)
3762 FILE *file;
3763 rtx x;
9ebbca7d 3764 int code;
9878760c
RK
3765{
3766 int i;
a260abc9 3767 HOST_WIDE_INT val;
9878760c
RK
3768
3769 /* These macros test for integers and extract the low-order bits. */
3770#define INT_P(X) \
3771((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE) \
3772 && GET_MODE (X) == VOIDmode)
3773
3774#define INT_LOWPART(X) \
3775 (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
3776
3777 switch (code)
3778 {
a8b3aeda 3779 case '.':
a85d226b
RK
3780 /* Write out an instruction after the call which may be replaced
3781 with glue code by the loader. This depends on the AIX version. */
3782 asm_fprintf (file, RS6000_CALL_GLUE);
a8b3aeda
RK
3783 return;
3784
c81bebd7
MM
3785 case '$':
3786 /* Write out either a '.' or '$' for the current location, depending
3787 on whether this is Solaris or not. */
3788 putc ((DEFAULT_ABI == ABI_SOLARIS) ? '.' : '$', file);
3789 return;
3790
81eace42
GK
3791 /* %a is output_address. */
3792
9854d9ed
RK
3793 case 'A':
3794 /* If X is a constant integer whose low-order 5 bits are zero,
3795 write 'l'. Otherwise, write 'r'. This is a kludge to fix a bug
76229ac8 3796 in the AIX assembler where "sri" with a zero shift count
9854d9ed
RK
3797 write a trash instruction. */
3798 if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
76229ac8 3799 putc ('l', file);
9854d9ed 3800 else
76229ac8 3801 putc ('r', file);
9854d9ed
RK
3802 return;
3803
3804 case 'b':
e2c953b6
DE
3805 /* If constant, low-order 16 bits of constant, unsigned.
3806 Otherwise, write normally. */
3807 if (INT_P (x))
3808 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 0xffff);
3809 else
3810 print_operand (file, x, 0);
cad12a8d
RK
3811 return;
3812
a260abc9
DE
3813 case 'B':
3814 /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
3815 for 64-bit mask direction. */
296b8152 3816 putc (((INT_LOWPART(x) & 1) == 0 ? 'r' : 'l'), file);
a238cd8b 3817 return;
a260abc9 3818
81eace42
GK
3819 /* %c is output_addr_const if a CONSTANT_ADDRESS_P, otherwise
3820 output_operand. */
3821
9854d9ed 3822 case 'D':
39a10a29
GK
3823 /* There used to be a comment for 'C' reading "This is an
3824 optional cror needed for certain floating-point
3825 comparisons. Otherwise write nothing." */
3826
9854d9ed
RK
3827 /* Similar, except that this is for an scc, so we must be able to
3828 encode the test in a single bit that is one. We do the above
3829 for any LE, GE, GEU, or LEU and invert the bit for NE. */
3830 if (GET_CODE (x) == LE || GET_CODE (x) == GE
3831 || GET_CODE (x) == LEU || GET_CODE (x) == GEU)
3832 {
9ebbca7d 3833 int base_bit = 4 * (REGNO (XEXP (x, 0)) - CR0_REGNO);
9854d9ed
RK
3834
3835 fprintf (file, "cror %d,%d,%d\n\t", base_bit + 3,
3836 base_bit + 2,
3837 base_bit + (GET_CODE (x) == GE || GET_CODE (x) == GEU));
3838 }
3839
3840 else if (GET_CODE (x) == NE)
3841 {
9ebbca7d 3842 int base_bit = 4 * (REGNO (XEXP (x, 0)) - CR0_REGNO);
9854d9ed
RK
3843
3844 fprintf (file, "crnor %d,%d,%d\n\t", base_bit + 3,
3845 base_bit + 2, base_bit + 2);
3846 }
3847 return;
3848
3849 case 'E':
39a10a29 3850 /* X is a CR register. Print the number of the EQ bit of the CR */
9854d9ed
RK
3851 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
3852 output_operand_lossage ("invalid %%E value");
78fbdbf7 3853 else
39a10a29 3854 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO) + 2);
a85d226b 3855 return;
9854d9ed
RK
3856
3857 case 'f':
3858 /* X is a CR register. Print the shift count needed to move it
3859 to the high-order four bits. */
3860 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
3861 output_operand_lossage ("invalid %%f value");
3862 else
9ebbca7d 3863 fprintf (file, "%d", 4 * (REGNO (x) - CR0_REGNO));
9854d9ed
RK
3864 return;
3865
3866 case 'F':
3867 /* Similar, but print the count for the rotate in the opposite
3868 direction. */
3869 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
3870 output_operand_lossage ("invalid %%F value");
3871 else
9ebbca7d 3872 fprintf (file, "%d", 32 - 4 * (REGNO (x) - CR0_REGNO));
9854d9ed
RK
3873 return;
3874
3875 case 'G':
3876 /* X is a constant integer. If it is negative, print "m",
3877 otherwise print "z". This is to make a aze or ame insn. */
3878 if (GET_CODE (x) != CONST_INT)
3879 output_operand_lossage ("invalid %%G value");
3880 else if (INTVAL (x) >= 0)
76229ac8 3881 putc ('z', file);
9854d9ed 3882 else
76229ac8 3883 putc ('m', file);
9854d9ed 3884 return;
e2c953b6 3885
9878760c 3886 case 'h':
df3d94ed
RK
3887 /* If constant, output low-order five bits. Otherwise,
3888 write normally. */
9878760c 3889 if (INT_P (x))
5f59ecb7 3890 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 31);
9878760c
RK
3891 else
3892 print_operand (file, x, 0);
3893 return;
3894
64305719
DE
3895 case 'H':
3896 /* If constant, output low-order six bits. Otherwise,
3897 write normally. */
3898 if (INT_P (x))
5f59ecb7 3899 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INT_LOWPART (x) & 63);
64305719
DE
3900 else
3901 print_operand (file, x, 0);
3902 return;
3903
9854d9ed
RK
3904 case 'I':
3905 /* Print `i' if this is a constant, else nothing. */
9878760c 3906 if (INT_P (x))
76229ac8 3907 putc ('i', file);
9878760c
RK
3908 return;
3909
9854d9ed
RK
3910 case 'j':
3911 /* Write the bit number in CCR for jump. */
3912 i = ccr_bit (x, 0);
3913 if (i == -1)
3914 output_operand_lossage ("invalid %%j code");
9878760c 3915 else
9854d9ed 3916 fprintf (file, "%d", i);
9878760c
RK
3917 return;
3918
9854d9ed
RK
3919 case 'J':
3920 /* Similar, but add one for shift count in rlinm for scc and pass
3921 scc flag to `ccr_bit'. */
3922 i = ccr_bit (x, 1);
3923 if (i == -1)
3924 output_operand_lossage ("invalid %%J code");
3925 else
a0466a68
RK
3926 /* If we want bit 31, write a shift count of zero, not 32. */
3927 fprintf (file, "%d", i == 31 ? 0 : i + 1);
9878760c
RK
3928 return;
3929
9854d9ed
RK
3930 case 'k':
3931 /* X must be a constant. Write the 1's complement of the
3932 constant. */
9878760c 3933 if (! INT_P (x))
9854d9ed 3934 output_operand_lossage ("invalid %%k value");
e2c953b6
DE
3935 else
3936 fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~ INT_LOWPART (x));
9878760c
RK
3937 return;
3938
81eace42 3939 case 'K':
9ebbca7d
GK
3940 /* X must be a symbolic constant on ELF. Write an
3941 expression suitable for an 'addi' that adds in the low 16
3942 bits of the MEM. */
3943 if (GET_CODE (x) != CONST)
3944 {
3945 print_operand_address (file, x);
3946 fputs ("@l", file);
3947 }
3948 else
3949 {
3950 if (GET_CODE (XEXP (x, 0)) != PLUS
3951 || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
3952 && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
3953 || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
53cd5d6c 3954 output_operand_lossage ("invalid %%K value");
9ebbca7d
GK
3955 print_operand_address (file, XEXP (XEXP (x, 0), 0));
3956 fputs ("@l", file);
3957 print_operand (file, XEXP (XEXP (x, 0), 1), 0);
3958 }
81eace42
GK
3959 return;
3960
3961 /* %l is output_asm_label. */
9ebbca7d 3962
9854d9ed
RK
3963 case 'L':
3964 /* Write second word of DImode or DFmode reference. Works on register
3965 or non-indexed memory only. */
3966 if (GET_CODE (x) == REG)
5ebfb2ba 3967 fprintf (file, "%s", reg_names[REGNO (x) + 1]);
9854d9ed
RK
3968 else if (GET_CODE (x) == MEM)
3969 {
3970 /* Handle possible auto-increment. Since it is pre-increment and
1427100a 3971 we have already done it, we can just use an offset of word. */
9854d9ed
RK
3972 if (GET_CODE (XEXP (x, 0)) == PRE_INC
3973 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
19087b1c
DE
3974 output_address (plus_constant_for_output (XEXP (XEXP (x, 0), 0),
3975 UNITS_PER_WORD));
9854d9ed 3976 else
19087b1c
DE
3977 output_address (plus_constant_for_output (XEXP (x, 0),
3978 UNITS_PER_WORD));
ba5e43aa 3979 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
3980 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
3981 reg_names[SMALL_DATA_REG]);
9854d9ed 3982 }
9878760c 3983 return;
9854d9ed 3984
9878760c
RK
3985 case 'm':
3986 /* MB value for a mask operand. */
3987 if (! mask_operand (x, VOIDmode))
3988 output_operand_lossage ("invalid %%m value");
3989
3990 val = INT_LOWPART (x);
3991
3992 /* If the high bit is set and the low bit is not, the value is zero.
3993 If the high bit is zero, the value is the first 1 bit we find from
3994 the left. */
0858c623 3995 if ((val & 0x80000000) && ((val & 1) == 0))
9878760c 3996 {
19d2d16f 3997 putc ('0', file);
9878760c
RK
3998 return;
3999 }
0858c623 4000 else if ((val & 0x80000000) == 0)
9878760c
RK
4001 {
4002 for (i = 1; i < 32; i++)
0858c623 4003 if ((val <<= 1) & 0x80000000)
9878760c
RK
4004 break;
4005 fprintf (file, "%d", i);
4006 return;
4007 }
4008
4009 /* Otherwise, look for the first 0 bit from the right. The result is its
4010 number plus 1. We know the low-order bit is one. */
4011 for (i = 0; i < 32; i++)
4012 if (((val >>= 1) & 1) == 0)
4013 break;
4014
a260abc9 4015 /* If we ended in ...01, i would be 0. The correct value is 31, so
9878760c
RK
4016 we want 31 - i. */
4017 fprintf (file, "%d", 31 - i);
4018 return;
4019
4020 case 'M':
4021 /* ME value for a mask operand. */
4022 if (! mask_operand (x, VOIDmode))
a260abc9 4023 output_operand_lossage ("invalid %%M value");
9878760c
RK
4024
4025 val = INT_LOWPART (x);
4026
4027 /* If the low bit is set and the high bit is not, the value is 31.
4028 If the low bit is zero, the value is the first 1 bit we find from
4029 the right. */
0858c623 4030 if ((val & 1) && ((val & 0x80000000) == 0))
9878760c 4031 {
76229ac8 4032 fputs ("31", file);
9878760c
RK
4033 return;
4034 }
4035 else if ((val & 1) == 0)
4036 {
4037 for (i = 0; i < 32; i++)
4038 if ((val >>= 1) & 1)
4039 break;
4040
a260abc9 4041 /* If we had ....10, i would be 0. The result should be
9878760c
RK
4042 30, so we need 30 - i. */
4043 fprintf (file, "%d", 30 - i);
4044 return;
4045 }
4046
4047 /* Otherwise, look for the first 0 bit from the left. The result is its
4048 number minus 1. We know the high-order bit is one. */
4049 for (i = 0; i < 32; i++)
0858c623 4050 if (((val <<= 1) & 0x80000000) == 0)
9878760c
RK
4051 break;
4052
4053 fprintf (file, "%d", i);
4054 return;
4055
81eace42
GK
4056 /* %n outputs the negative of its operand. */
4057
9878760c
RK
4058 case 'N':
4059 /* Write the number of elements in the vector times 4. */
4060 if (GET_CODE (x) != PARALLEL)
4061 output_operand_lossage ("invalid %%N value");
e2c953b6
DE
4062 else
4063 fprintf (file, "%d", XVECLEN (x, 0) * 4);
9878760c
RK
4064 return;
4065
4066 case 'O':
4067 /* Similar, but subtract 1 first. */
4068 if (GET_CODE (x) != PARALLEL)
1427100a 4069 output_operand_lossage ("invalid %%O value");
e2c953b6
DE
4070 else
4071 fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
9878760c
RK
4072 return;
4073
9854d9ed
RK
4074 case 'p':
4075 /* X is a CONST_INT that is a power of two. Output the logarithm. */
4076 if (! INT_P (x)
4077 || (i = exact_log2 (INT_LOWPART (x))) < 0)
4078 output_operand_lossage ("invalid %%p value");
e2c953b6
DE
4079 else
4080 fprintf (file, "%d", i);
9854d9ed
RK
4081 return;
4082
9878760c
RK
4083 case 'P':
4084 /* The operand must be an indirect memory reference. The result
4085 is the register number. */
4086 if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
4087 || REGNO (XEXP (x, 0)) >= 32)
4088 output_operand_lossage ("invalid %%P value");
e2c953b6
DE
4089 else
4090 fprintf (file, "%d", REGNO (XEXP (x, 0)));
9878760c
RK
4091 return;
4092
dfbdccdb
GK
4093 case 'q':
4094 /* This outputs the logical code corresponding to a boolean
4095 expression. The expression may have one or both operands
39a10a29
GK
4096 negated (if one, only the first one). For condition register
4097 logical operations, it will also treat the negated
4098 CR codes as NOTs, but not handle NOTs of them. */
dfbdccdb 4099 {
63bc1d05 4100 const char *const *t = 0;
dfbdccdb
GK
4101 const char *s;
4102 enum rtx_code code = GET_CODE (x);
4103 static const char * const tbl[3][3] = {
4104 { "and", "andc", "nor" },
4105 { "or", "orc", "nand" },
4106 { "xor", "eqv", "xor" } };
4107
4108 if (code == AND)
4109 t = tbl[0];
4110 else if (code == IOR)
4111 t = tbl[1];
4112 else if (code == XOR)
4113 t = tbl[2];
4114 else
4115 output_operand_lossage ("invalid %%q value");
4116
4117 if (GET_CODE (XEXP (x, 0)) != NOT)
4118 s = t[0];
4119 else
4120 {
4121 if (GET_CODE (XEXP (x, 1)) == NOT)
4122 s = t[2];
4123 else
4124 s = t[1];
4125 }
4126
4127 fputs (s, file);
4128 }
4129 return;
4130
9854d9ed
RK
4131 case 'R':
4132 /* X is a CR register. Print the mask for `mtcrf'. */
4133 if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
4134 output_operand_lossage ("invalid %%R value");
4135 else
9ebbca7d 4136 fprintf (file, "%d", 128 >> (REGNO (x) - CR0_REGNO));
9878760c 4137 return;
9854d9ed
RK
4138
4139 case 's':
4140 /* Low 5 bits of 32 - value */
4141 if (! INT_P (x))
4142 output_operand_lossage ("invalid %%s value");
e2c953b6
DE
4143 else
4144 fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INT_LOWPART (x)) & 31);
9878760c 4145 return;
9854d9ed 4146
a260abc9
DE
4147 case 'S':
4148 /* PowerPC64 mask position. All 0's and all 1's are excluded.
4149 CONST_INT 32-bit mask is considered sign-extended so any
4150 transition must occur within the CONST_INT, not on the boundary. */
4151 if (! mask64_operand (x, VOIDmode))
4152 output_operand_lossage ("invalid %%S value");
4153
4154 val = INT_LOWPART (x);
4155
4156 if (val & 1) /* Clear Left */
4157 {
a238cd8b
DE
4158 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4159 if (!((val >>= 1) & 1))
4160 break;
a260abc9 4161
a238cd8b
DE
4162#if HOST_BITS_PER_WIDE_INT == 32
4163 if (GET_CODE (x) == CONST_DOUBLE && i == 32)
4164 {
4165 val = CONST_DOUBLE_HIGH (x);
4166
4167 if (val == 0)
4168 --i;
4169 else
4170 for (i = 32; i < 64; i++)
4171 if (!((val >>= 1) & 1))
4172 break;
4173 }
a260abc9 4174#endif
a238cd8b
DE
4175 /* i = index of last set bit from right
4176 mask begins at 63 - i from left */
4177 if (i > 63)
4178 output_operand_lossage ("%%S computed all 1's mask");
cccf3bdc 4179
a260abc9
DE
4180 fprintf (file, "%d", 63 - i);
4181 return;
4182 }
4183 else /* Clear Right */
4184 {
a238cd8b
DE
4185 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4186 if ((val >>= 1) & 1)
4187 break;
a260abc9 4188
a238cd8b 4189#if HOST_BITS_PER_WIDE_INT == 32
a260abc9
DE
4190 if (GET_CODE (x) == CONST_DOUBLE && i == 32)
4191 {
a238cd8b 4192 val = CONST_DOUBLE_HIGH (x);
a260abc9 4193
a238cd8b 4194 if (val == (HOST_WIDE_INT) -1)
a260abc9 4195 --i;
a260abc9 4196 else
a238cd8b
DE
4197 for (i = 32; i < 64; i++)
4198 if ((val >>= 1) & 1)
a260abc9
DE
4199 break;
4200 }
4201#endif
a238cd8b
DE
4202 /* i = index of last clear bit from right
4203 mask ends at 62 - i from left */
4204 if (i > 62)
4205 output_operand_lossage ("%%S computed all 0's mask");
cccf3bdc 4206
a238cd8b 4207 fprintf (file, "%d", 62 - i);
a260abc9
DE
4208 return;
4209 }
4210
cccf3bdc
DE
4211 case 'T':
4212 /* Print the symbolic name of a branch target register. */
4213 if (GET_CODE (x) != REG || (REGNO (x) != LINK_REGISTER_REGNUM
4214 && REGNO (x) != COUNT_REGISTER_REGNUM))
4215 output_operand_lossage ("invalid %%T value");
e2c953b6 4216 else if (REGNO (x) == LINK_REGISTER_REGNUM)
cccf3bdc
DE
4217 fputs (TARGET_NEW_MNEMONICS ? "lr" : "r", file);
4218 else
4219 fputs ("ctr", file);
4220 return;
4221
9854d9ed 4222 case 'u':
802a0058 4223 /* High-order 16 bits of constant for use in unsigned operand. */
9854d9ed
RK
4224 if (! INT_P (x))
4225 output_operand_lossage ("invalid %%u value");
e2c953b6
DE
4226 else
4227 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
4228 (INT_LOWPART (x) >> 16) & 0xffff);
9878760c
RK
4229 return;
4230
802a0058
MM
4231 case 'v':
4232 /* High-order 16 bits of constant for use in signed operand. */
4233 if (! INT_P (x))
4234 output_operand_lossage ("invalid %%v value");
e2c953b6
DE
4235 else
4236 {
4237 int value = (INT_LOWPART (x) >> 16) & 0xffff;
802a0058 4238
e2c953b6
DE
4239 /* Solaris assembler doesn't like lis 0,0x8000 */
4240 if (DEFAULT_ABI == ABI_SOLARIS && (value & 0x8000) != 0)
4241 fprintf (file, "%d", value | (~0 << 16));
4242 else
4243 fprintf (file, "0x%x", value);
4244 return;
4245 }
802a0058 4246
9854d9ed
RK
4247 case 'U':
4248 /* Print `u' if this has an auto-increment or auto-decrement. */
4249 if (GET_CODE (x) == MEM
4250 && (GET_CODE (XEXP (x, 0)) == PRE_INC
4251 || GET_CODE (XEXP (x, 0)) == PRE_DEC))
76229ac8 4252 putc ('u', file);
9854d9ed 4253 return;
9878760c 4254
e0cd0770
JC
4255 case 'V':
4256 /* Print the trap code for this operand. */
4257 switch (GET_CODE (x))
4258 {
4259 case EQ:
4260 fputs ("eq", file); /* 4 */
4261 break;
4262 case NE:
4263 fputs ("ne", file); /* 24 */
4264 break;
4265 case LT:
4266 fputs ("lt", file); /* 16 */
4267 break;
4268 case LE:
4269 fputs ("le", file); /* 20 */
4270 break;
4271 case GT:
4272 fputs ("gt", file); /* 8 */
4273 break;
4274 case GE:
4275 fputs ("ge", file); /* 12 */
4276 break;
4277 case LTU:
4278 fputs ("llt", file); /* 2 */
4279 break;
4280 case LEU:
4281 fputs ("lle", file); /* 6 */
4282 break;
4283 case GTU:
4284 fputs ("lgt", file); /* 1 */
4285 break;
4286 case GEU:
4287 fputs ("lge", file); /* 5 */
4288 break;
4289 default:
4290 abort ();
4291 }
4292 break;
4293
9854d9ed
RK
4294 case 'w':
4295 /* If constant, low-order 16 bits of constant, signed. Otherwise, write
4296 normally. */
4297 if (INT_P (x))
5f59ecb7
DE
4298 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
4299 ((INT_LOWPART (x) & 0xffff) ^ 0x8000) - 0x8000);
9854d9ed
RK
4300 else
4301 print_operand (file, x, 0);
9878760c
RK
4302 return;
4303
9854d9ed 4304 case 'W':
e2c953b6
DE
4305 /* MB value for a PowerPC64 rldic operand. */
4306 if (! rldic_operand (x, VOIDmode))
4307 output_operand_lossage ("invalid %%W value");
4308
4309 val = (GET_CODE (x) == CONST_INT
4310 ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
4311
4312 if (val < 0)
4313 i = -1;
9854d9ed 4314 else
e2c953b6
DE
4315 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4316 if ((val <<= 1) < 0)
4317 break;
4318
4319#if HOST_BITS_PER_WIDE_INT == 32
4320 if (GET_CODE (x) == CONST_INT && i >= 0)
4321 i += 32; /* zero-extend high-part was all 0's */
4322 else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
4323 {
4324 val = CONST_DOUBLE_LOW (x);
4325
4326 if (val == 0)
4327 abort();
4328 else if (val < 0)
4329 --i;
4330 else
4331 for ( ; i < 64; i++)
4332 if ((val <<= 1) < 0)
4333 break;
4334 }
4335#endif
4336
4337 fprintf (file, "%d", i + 1);
9854d9ed 4338 return;
9878760c 4339
9854d9ed
RK
4340 case 'X':
4341 if (GET_CODE (x) == MEM
258bfae2 4342 && LEGITIMATE_INDEXED_ADDRESS_P (XEXP (x, 0), 0))
76229ac8 4343 putc ('x', file);
9854d9ed 4344 return;
9878760c 4345
9854d9ed
RK
4346 case 'Y':
4347 /* Like 'L', for third word of TImode */
4348 if (GET_CODE (x) == REG)
5ebfb2ba 4349 fprintf (file, "%s", reg_names[REGNO (x) + 2]);
9854d9ed 4350 else if (GET_CODE (x) == MEM)
9878760c 4351 {
9854d9ed
RK
4352 if (GET_CODE (XEXP (x, 0)) == PRE_INC
4353 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
a54d04b7 4354 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
9854d9ed 4355 else
a54d04b7 4356 output_address (plus_constant (XEXP (x, 0), 8));
ba5e43aa 4357 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
4358 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
4359 reg_names[SMALL_DATA_REG]);
9878760c
RK
4360 }
4361 return;
9854d9ed 4362
9878760c 4363 case 'z':
b4ac57ab
RS
4364 /* X is a SYMBOL_REF. Write out the name preceded by a
4365 period and without any trailing data in brackets. Used for function
4d30c363
MM
4366 names. If we are configured for System V (or the embedded ABI) on
4367 the PowerPC, do not emit the period, since those systems do not use
4368 TOCs and the like. */
9878760c
RK
4369 if (GET_CODE (x) != SYMBOL_REF)
4370 abort ();
4371
b6c9286a
MM
4372 if (XSTR (x, 0)[0] != '.')
4373 {
4374 switch (DEFAULT_ABI)
4375 {
4376 default:
4377 abort ();
4378
4379 case ABI_AIX:
4380 putc ('.', file);
4381 break;
4382
4383 case ABI_V4:
4384 case ABI_AIX_NODESC:
c81bebd7 4385 case ABI_SOLARIS:
ee890fe2 4386 case ABI_DARWIN:
b6c9286a 4387 break;
b6c9286a
MM
4388 }
4389 }
9ebbca7d 4390#if TARGET_AIX
9878760c 4391 RS6000_OUTPUT_BASENAME (file, XSTR (x, 0));
9ebbca7d
GK
4392#else
4393 assemble_name (file, XSTR (x, 0));
4394#endif
9878760c
RK
4395 return;
4396
9854d9ed
RK
4397 case 'Z':
4398 /* Like 'L', for last word of TImode. */
4399 if (GET_CODE (x) == REG)
5ebfb2ba 4400 fprintf (file, "%s", reg_names[REGNO (x) + 3]);
9854d9ed
RK
4401 else if (GET_CODE (x) == MEM)
4402 {
4403 if (GET_CODE (XEXP (x, 0)) == PRE_INC
4404 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
a54d04b7 4405 output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
9854d9ed 4406 else
a54d04b7 4407 output_address (plus_constant (XEXP (x, 0), 12));
ba5e43aa 4408 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
4409 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
4410 reg_names[SMALL_DATA_REG]);
9854d9ed 4411 }
5c23c401 4412 return;
9854d9ed 4413
9878760c
RK
4414 case 0:
4415 if (GET_CODE (x) == REG)
4416 fprintf (file, "%s", reg_names[REGNO (x)]);
4417 else if (GET_CODE (x) == MEM)
4418 {
4419 /* We need to handle PRE_INC and PRE_DEC here, since we need to
4420 know the width from the mode. */
4421 if (GET_CODE (XEXP (x, 0)) == PRE_INC)
79ba6d34
MM
4422 fprintf (file, "%d(%s)", GET_MODE_SIZE (GET_MODE (x)),
4423 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
9878760c 4424 else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
79ba6d34
MM
4425 fprintf (file, "%d(%s)", - GET_MODE_SIZE (GET_MODE (x)),
4426 reg_names[REGNO (XEXP (XEXP (x, 0), 0))]);
9878760c 4427 else
a54d04b7 4428 output_address (XEXP (x, 0));
9878760c
RK
4429 }
4430 else
a54d04b7 4431 output_addr_const (file, x);
a85d226b 4432 return;
9878760c
RK
4433
4434 default:
4435 output_operand_lossage ("invalid %%xn code");
4436 }
4437}
4438\f
4439/* Print the address of an operand. */
4440
4441void
4442print_operand_address (file, x)
4443 FILE *file;
4444 register rtx x;
4445{
4446 if (GET_CODE (x) == REG)
4697a36c 4447 fprintf (file, "0(%s)", reg_names[ REGNO (x) ]);
9ebbca7d
GK
4448 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST
4449 || GET_CODE (x) == LABEL_REF)
9878760c
RK
4450 {
4451 output_addr_const (file, x);
ba5e43aa 4452 if (small_data_operand (x, GET_MODE (x)))
8fbd2dc7
MM
4453 fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
4454 reg_names[SMALL_DATA_REG]);
9ebbca7d
GK
4455 else if (TARGET_TOC)
4456 abort();
9878760c
RK
4457 }
4458 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
4459 {
4460 if (REGNO (XEXP (x, 0)) == 0)
4697a36c
MM
4461 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 1)) ],
4462 reg_names[ REGNO (XEXP (x, 0)) ]);
9878760c 4463 else
4697a36c
MM
4464 fprintf (file, "%s,%s", reg_names[ REGNO (XEXP (x, 0)) ],
4465 reg_names[ REGNO (XEXP (x, 1)) ]);
9878760c
RK
4466 }
4467 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
5f59ecb7
DE
4468 {
4469 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (XEXP (x, 1)));
4470 fprintf (file, "(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
4471 }
3cb999d8
DE
4472#if TARGET_ELF
4473 else if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == REG
4474 && CONSTANT_P (XEXP (x, 1)))
4697a36c
MM
4475 {
4476 output_addr_const (file, XEXP (x, 1));
4477 fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]);
4478 }
3cb999d8 4479#endif
9ebbca7d
GK
4480 else if (LEGITIMATE_CONSTANT_POOL_ADDRESS_P (x))
4481 {
4482 if (TARGET_AIX)
4483 {
4484 rtx contains_minus = XEXP (x, 1);
4485 rtx minus;
4486
4487 /* Find the (minus (sym) (toc)) buried in X, and temporarily
4488 turn it into (sym) for output_addr_const. */
4489 while (GET_CODE (XEXP (contains_minus, 0)) != MINUS)
4490 contains_minus = XEXP (contains_minus, 0);
4491
4492 minus = XEXP (contains_minus, 0);
4493 XEXP (contains_minus, 0) = XEXP (minus, 0);
4494 output_addr_const (file, XEXP (x, 1));
4495 XEXP (contains_minus, 0) = minus;
4496 }
4497 else
4498 output_addr_const (file, XEXP (x, 1));
4499
4500 fprintf (file, "(%s)", reg_names[REGNO (XEXP (x, 0))]);
4501 }
9878760c
RK
4502 else
4503 abort ();
4504}
4505\f
39a10a29
GK
4506enum rtx_code
4507rs6000_reverse_condition (mode, code)
4508 enum machine_mode mode;
4509 enum rtx_code code;
4510{
4511 /* Reversal of FP compares takes care -- an ordered compare
4512 becomes an unordered compare and vice versa. */
4513 if (mode == CCFPmode)
bab6226b 4514 return reverse_condition_maybe_unordered (code);
39a10a29 4515 else
bab6226b 4516 return reverse_condition (code);
39a10a29
GK
4517}
4518
4519
4520/* Generate a compare for CODE. Return a brand-new rtx that
4521 represents the result of the compare. */
4522static rtx
4523rs6000_generate_compare (code)
4524 enum rtx_code code;
4525{
4526 enum machine_mode comp_mode;
4527 rtx compare_result;
4528
4529 if (rs6000_compare_fp_p)
4530 comp_mode = CCFPmode;
4531 else if (code == GTU || code == LTU
4532 || code == GEU || code == LEU)
4533 comp_mode = CCUNSmode;
4534 else
4535 comp_mode = CCmode;
4536
4537 /* First, the compare. */
4538 compare_result = gen_reg_rtx (comp_mode);
4539 emit_insn (gen_rtx_SET (VOIDmode, compare_result,
4540 gen_rtx_COMPARE (comp_mode,
4541 rs6000_compare_op0,
4542 rs6000_compare_op1)));
4543
ca5adc63 4544 /* Some kinds of FP comparisons need an OR operation;
de6c5979 4545 except for flag_unsafe_math_optimizations we don't bother. */
39a10a29 4546 if (rs6000_compare_fp_p
de6c5979 4547 && ! flag_unsafe_math_optimizations
39a10a29
GK
4548 && (code == LE || code == GE
4549 || code == UNEQ || code == LTGT
4550 || code == UNGT || code == UNLT))
4551 {
4552 enum rtx_code or1, or2;
4553 rtx or1_rtx, or2_rtx, compare2_rtx;
4554 rtx or_result = gen_reg_rtx (CCEQmode);
4555
4556 switch (code)
4557 {
4558 case LE: or1 = LT; or2 = EQ; break;
4559 case GE: or1 = GT; or2 = EQ; break;
4560 case UNEQ: or1 = UNORDERED; or2 = EQ; break;
4561 case LTGT: or1 = LT; or2 = GT; break;
4562 case UNGT: or1 = UNORDERED; or2 = GT; break;
4563 case UNLT: or1 = UNORDERED; or2 = LT; break;
4564 default: abort ();
4565 }
4566 validate_condition_mode (or1, comp_mode);
4567 validate_condition_mode (or2, comp_mode);
4568 or1_rtx = gen_rtx (or1, SImode, compare_result, const0_rtx);
4569 or2_rtx = gen_rtx (or2, SImode, compare_result, const0_rtx);
4570 compare2_rtx = gen_rtx_COMPARE (CCEQmode,
4571 gen_rtx_IOR (SImode, or1_rtx, or2_rtx),
4572 const_true_rtx);
4573 emit_insn (gen_rtx_SET (VOIDmode, or_result, compare2_rtx));
4574
4575 compare_result = or_result;
4576 code = EQ;
4577 }
4578
4579 validate_condition_mode (code, GET_MODE (compare_result));
4580
4581 return gen_rtx (code, VOIDmode, compare_result, const0_rtx);
4582}
4583
4584
4585/* Emit the RTL for an sCOND pattern. */
4586
4587void
4588rs6000_emit_sCOND (code, result)
4589 enum rtx_code code;
4590 rtx result;
4591{
4592 rtx condition_rtx;
4593 enum machine_mode op_mode;
4594
4595 condition_rtx = rs6000_generate_compare (code);
4596
4597 op_mode = GET_MODE (rs6000_compare_op0);
4598 if (op_mode == VOIDmode)
4599 op_mode = GET_MODE (rs6000_compare_op1);
4600
4601 if (TARGET_POWERPC64 && (op_mode == DImode || rs6000_compare_fp_p))
4602 {
4603 PUT_MODE (condition_rtx, DImode);
4604 convert_move (result, condition_rtx, 0);
4605 }
4606 else
4607 {
4608 PUT_MODE (condition_rtx, SImode);
4609 emit_insn (gen_rtx_SET (VOIDmode, result, condition_rtx));
4610 }
4611}
4612
4613
4614/* Emit a branch of kind CODE to location LOC. */
4615
4616void
4617rs6000_emit_cbranch (code, loc)
4618 enum rtx_code code;
4619 rtx loc;
4620{
4621 rtx condition_rtx, loc_ref;
4622
4623 condition_rtx = rs6000_generate_compare (code);
4624 loc_ref = gen_rtx_LABEL_REF (VOIDmode, loc);
4625 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
4626 gen_rtx_IF_THEN_ELSE (VOIDmode, condition_rtx,
4627 loc_ref, pc_rtx)));
4628}
4629
4630
12a4e8c5
GK
4631/* Return the string to output a conditional branch to LABEL, which is
4632 the operand number of the label, or -1 if the branch is really a
4633 conditional return.
4634
4635 OP is the conditional expression. XEXP (OP, 0) is assumed to be a
4636 condition code register and its mode specifies what kind of
4637 comparison we made.
4638
4639 REVERSED is non-zero if we should reverse the sense of the comparison.
4640
4641 INSN is the insn. */
4642
4643char *
4644output_cbranch (op, label, reversed, insn)
4645 rtx op;
4646 const char * label;
4647 int reversed;
4648 rtx insn;
4649{
4650 static char string[64];
4651 enum rtx_code code = GET_CODE (op);
4652 rtx cc_reg = XEXP (op, 0);
4653 enum machine_mode mode = GET_MODE (cc_reg);
4654 int cc_regno = REGNO (cc_reg) - CR0_REGNO;
39a10a29 4655 int need_longbranch = label != NULL && get_attr_length (insn) == 8;
12a4e8c5
GK
4656 int really_reversed = reversed ^ need_longbranch;
4657 char *s = string;
4658 const char *ccode;
4659 const char *pred;
4660 rtx note;
4661
39a10a29
GK
4662 validate_condition_mode (code, mode);
4663
4664 /* Work out which way this really branches. We could use
4665 reverse_condition_maybe_unordered here always but this
4666 makes the resulting assembler clearer. */
12a4e8c5 4667 if (really_reversed)
39a10a29 4668 code = rs6000_reverse_condition (mode, code);
12a4e8c5 4669
39a10a29 4670 switch (code)
12a4e8c5
GK
4671 {
4672 /* Not all of these are actually distinct opcodes, but
4673 we distinguish them for clarity of the resulting assembler. */
4674 case NE: ccode = "ne"; break;
4675 case EQ: ccode = "eq"; break;
4676 case GE: case GEU: ccode = "ge"; break;
4677 case GT: case GTU: ccode = "gt"; break;
4678 case LE: case LEU: ccode = "le"; break;
4679 case LT: case LTU: ccode = "lt"; break;
4680 case UNORDERED: ccode = "un"; break;
4681 case ORDERED: ccode = "nu"; break;
4682 case UNGE: ccode = "nl"; break;
4683 case UNLE: ccode = "ng"; break;
4684 default:
4685 abort();
4686 }
4687
94a54f47
GK
4688 /* Maybe we have a guess as to how likely the branch is.
4689 The old mnemonics don't have a way to specify this information. */
12a4e8c5
GK
4690 note = find_reg_note (insn, REG_BR_PROB, NULL_RTX);
4691 if (note != NULL_RTX)
4692 {
4693 /* PROB is the difference from 50%. */
4694 int prob = INTVAL (XEXP (note, 0)) - REG_BR_PROB_BASE / 2;
4695
4696 /* For branches that are very close to 50%, assume not-taken. */
4697 if (abs (prob) > REG_BR_PROB_BASE / 20
4698 && ((prob > 0) ^ need_longbranch))
4699 pred = "+";
4700 else
4701 pred = "-";
4702 }
4703 else
4704 pred = "";
4705
4706 if (label == NULL)
94a54f47 4707 s += sprintf (s, "{b%sr|b%slr%s} ", ccode, ccode, pred);
12a4e8c5 4708 else
94a54f47 4709 s += sprintf (s, "{b%s|b%s%s} ", ccode, ccode, pred);
12a4e8c5 4710
37c67319
GK
4711 /* We need to escape any '%' characters in the reg_names string.
4712 Assume they'd only be the first character... */
4713 if (reg_names[cc_regno + CR0_REGNO][0] == '%')
4714 *s++ = '%';
94a54f47 4715 s += sprintf (s, "%s", reg_names[cc_regno + CR0_REGNO]);
12a4e8c5
GK
4716
4717 if (label != NULL)
4718 {
4719 /* If the branch distance was too far, we may have to use an
4720 unconditional branch to go the distance. */
4721 if (need_longbranch)
33011c35 4722 s += sprintf (s, ",%c$+8\n\tb %s", '%', label);
12a4e8c5
GK
4723 else
4724 s += sprintf (s, ",%s", label);
4725 }
4726
4727 return string;
4728}
4729\f
9878760c
RK
4730/* This page contains routines that are used to determine what the function
4731 prologue and epilogue code will do and write them out. */
4732
4733/* Return the first fixed-point register that is required to be saved. 32 if
4734 none. */
4735
4736int
4737first_reg_to_save ()
4738{
4739 int first_reg;
4740
4741 /* Find lowest numbered live register. */
4742 for (first_reg = 13; first_reg <= 31; first_reg++)
a38d360d
GK
4743 if (regs_ever_live[first_reg]
4744 && (! call_used_regs[first_reg]
4745 || (first_reg == PIC_OFFSET_TABLE_REGNUM
ee890fe2
SS
4746 && (((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
4747 && flag_pic == 1)
4748 || (DEFAULT_ABI == ABI_DARWIN
4749 && flag_pic)))))
9878760c
RK
4750 break;
4751
b5253831
DE
4752 if (profile_flag)
4753 {
4754 /* AIX must save/restore every register that contains a parameter
4755 before/after the .__mcount call plus an additional register
4756 for the static chain, if needed; use registers from 30 down to 22
4757 to do this. */
ee890fe2 4758 if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
b5253831
DE
4759 {
4760 int last_parm_reg, profile_first_reg;
4761
4762 /* Figure out last used parameter register. The proper thing
4763 to do is to walk incoming args of the function. A function
4764 might have live parameter registers even if it has no
4765 incoming args. */
4766 for (last_parm_reg = 10;
4767 last_parm_reg > 2 && ! regs_ever_live [last_parm_reg];
4768 last_parm_reg--)
4769 ;
4770
4771 /* Calculate first reg for saving parameter registers
4772 and static chain.
4773 Skip reg 31 which may contain the frame pointer. */
4774 profile_first_reg = (33 - last_parm_reg
4775 - (current_function_needs_context ? 1 : 0));
ee890fe2
SS
4776#if TARGET_MACHO
4777 /* Need to skip another reg to account for R31 being PICBASE
4778 (when flag_pic is set) or R30 being used as the frame
4779 pointer (when flag_pic is not set). */
4780 --profile_first_reg;
4781#endif
b5253831
DE
4782 /* Do not save frame pointer if no parameters needs to be saved. */
4783 if (profile_first_reg == 31)
4784 profile_first_reg = 32;
4785
4786 if (first_reg > profile_first_reg)
4787 first_reg = profile_first_reg;
4788 }
e165f3f0 4789
b5253831
DE
4790 /* SVR4 may need one register to preserve the static chain. */
4791 else if (current_function_needs_context)
4792 {
4793 /* Skip reg 31 which may contain the frame pointer. */
4794 if (first_reg > 30)
4795 first_reg = 30;
4796 }
4797 }
e165f3f0 4798
ee890fe2
SS
4799#if TARGET_MACHO
4800 if (flag_pic && current_function_uses_pic_offset_table &&
4801 (first_reg > PIC_OFFSET_TABLE_REGNUM))
4802 return PIC_OFFSET_TABLE_REGNUM;
4803#endif
4804
9878760c
RK
4805 return first_reg;
4806}
4807
4808/* Similar, for FP regs. */
4809
4810int
4811first_fp_reg_to_save ()
4812{
4813 int first_reg;
4814
4815 /* Find lowest numbered live register. */
4816 for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
4817 if (regs_ever_live[first_reg])
4818 break;
4819
4820 return first_reg;
4821}
4697a36c
MM
4822\f
4823/* Calculate the stack information for the current function. This is
4824 complicated by having two separate calling sequences, the AIX calling
4825 sequence and the V.4 calling sequence.
4826
ee890fe2 4827 AIX (and Darwin/Mac OS) stack frames look like:
a260abc9 4828 32-bit 64-bit
4697a36c 4829 SP----> +---------------------------------------+
a260abc9 4830 | back chain to caller | 0 0
4697a36c 4831 +---------------------------------------+
a260abc9 4832 | saved CR | 4 8 (8-11)
4697a36c 4833 +---------------------------------------+
a260abc9 4834 | saved LR | 8 16
4697a36c 4835 +---------------------------------------+
a260abc9 4836 | reserved for compilers | 12 24
4697a36c 4837 +---------------------------------------+
a260abc9 4838 | reserved for binders | 16 32
4697a36c 4839 +---------------------------------------+
a260abc9 4840 | saved TOC pointer | 20 40
4697a36c 4841 +---------------------------------------+
a260abc9 4842 | Parameter save area (P) | 24 48
4697a36c 4843 +---------------------------------------+
a260abc9 4844 | Alloca space (A) | 24+P etc.
802a0058 4845 +---------------------------------------+
a7df97e6 4846 | Local variable space (L) | 24+P+A
4697a36c 4847 +---------------------------------------+
a7df97e6 4848 | Float/int conversion temporary (X) | 24+P+A+L
4697a36c 4849 +---------------------------------------+
a7df97e6 4850 | Save area for GP registers (G) | 24+P+A+X+L
4697a36c 4851 +---------------------------------------+
a7df97e6 4852 | Save area for FP registers (F) | 24+P+A+X+L+G
4697a36c
MM
4853 +---------------------------------------+
4854 old SP->| back chain to caller's caller |
4855 +---------------------------------------+
4856
5376a30c
KR
4857 The required alignment for AIX configurations is two words (i.e., 8
4858 or 16 bytes).
4859
4860
4697a36c
MM
4861 V.4 stack frames look like:
4862
4863 SP----> +---------------------------------------+
4864 | back chain to caller | 0
4865 +---------------------------------------+
5eb387b8 4866 | caller's saved LR | 4
4697a36c
MM
4867 +---------------------------------------+
4868 | Parameter save area (P) | 8
4869 +---------------------------------------+
a7df97e6
MM
4870 | Alloca space (A) | 8+P
4871 +---------------------------------------+
4872 | Varargs save area (V) | 8+P+A
4873 +---------------------------------------+
4874 | Local variable space (L) | 8+P+A+V
4875 +---------------------------------------+
4876 | Float/int conversion temporary (X) | 8+P+A+V+L
4697a36c 4877 +---------------------------------------+
a7df97e6
MM
4878 | saved CR (C) | 8+P+A+V+L+X
4879 +---------------------------------------+
4880 | Save area for GP registers (G) | 8+P+A+V+L+X+C
4881 +---------------------------------------+
4882 | Save area for FP registers (F) | 8+P+A+V+L+X+C+G
4697a36c
MM
4883 +---------------------------------------+
4884 old SP->| back chain to caller's caller |
4885 +---------------------------------------+
b6c9286a 4886
5376a30c
KR
4887 The required alignment for V.4 is 16 bytes, or 8 bytes if -meabi is
4888 given. (But note below and in sysv4.h that we require only 8 and
4889 may round up the size of our stack frame anyways. The historical
4890 reason is early versions of powerpc-linux which didn't properly
4891 align the stack at program startup. A happy side-effect is that
4892 -mno-eabi libraries can be used with -meabi programs.)
4893
b6c9286a 4894
5376a30c
KR
4895 The EABI configuration defaults to the V.4 layout, unless
4896 -mcall-aix is used, in which case the AIX layout is used. However,
4897 the stack alignment requirements may differ. If -mno-eabi is not
4898 given, the required stack alignment is 8 bytes; if -mno-eabi is
4899 given, the required alignment is 16 bytes. (But see V.4 comment
4900 above.) */
4697a36c 4901
61b2fbe7
MM
4902#ifndef ABI_STACK_BOUNDARY
4903#define ABI_STACK_BOUNDARY STACK_BOUNDARY
4904#endif
4905
4697a36c
MM
4906rs6000_stack_t *
4907rs6000_stack_info ()
4908{
4909 static rs6000_stack_t info, zero_info;
4910 rs6000_stack_t *info_ptr = &info;
9ebbca7d 4911 int reg_size = TARGET_POWERPC64 ? 8 : 4;
24d304eb 4912 enum rs6000_abi abi;
83720594 4913 int ehrd_size;
b6c9286a 4914 int total_raw_size;
4697a36c
MM
4915
4916 /* Zero all fields portably */
4917 info = zero_info;
4918
4919 /* Select which calling sequence */
b6c9286a 4920 info_ptr->abi = abi = DEFAULT_ABI;
9878760c 4921
4697a36c
MM
4922 /* Calculate which registers need to be saved & save area size */
4923 info_ptr->first_gp_reg_save = first_reg_to_save ();
906fb125
GK
4924 /* Assume that we will have to save PIC_OFFSET_TABLE_REGNUM,
4925 even if it currently looks like we won't. */
ee890fe2
SS
4926 if (((flag_pic == 1
4927 && (abi == ABI_V4 || abi == ABI_SOLARIS))
4928 || (flag_pic &&
4929 abi == ABI_DARWIN))
906fb125
GK
4930 && info_ptr->first_gp_reg_save > PIC_OFFSET_TABLE_REGNUM)
4931 info_ptr->gp_size = reg_size * (32 - PIC_OFFSET_TABLE_REGNUM);
4932 else
4933 info_ptr->gp_size = reg_size * (32 - info_ptr->first_gp_reg_save);
4697a36c
MM
4934
4935 info_ptr->first_fp_reg_save = first_fp_reg_to_save ();
4936 info_ptr->fp_size = 8 * (64 - info_ptr->first_fp_reg_save);
4937
4938 /* Does this function call anything? */
71f123ca
FS
4939 info_ptr->calls_p = (! current_function_is_leaf
4940 || cfun->machine->ra_needs_full_frame);
b6c9286a 4941
4697a36c 4942 /* Determine if we need to save the link register */
71f123ca 4943 if (rs6000_ra_ever_killed ()
38c1f2d7 4944 || (DEFAULT_ABI == ABI_AIX && profile_flag)
4697a36c
MM
4945#ifdef TARGET_RELOCATABLE
4946 || (TARGET_RELOCATABLE && (get_pool_size () != 0))
4947#endif
4948 || (info_ptr->first_fp_reg_save != 64
4949 && !FP_SAVE_INLINE (info_ptr->first_fp_reg_save))
24d304eb 4950 || (abi == ABI_V4 && current_function_calls_alloca)
c81bebd7 4951 || (abi == ABI_SOLARIS && current_function_calls_alloca)
ee890fe2 4952 || (DEFAULT_ABI == ABI_DARWIN && flag_pic && current_function_uses_pic_offset_table)
4697a36c
MM
4953 || info_ptr->calls_p)
4954 {
4955 info_ptr->lr_save_p = 1;
9ebbca7d 4956 regs_ever_live[LINK_REGISTER_REGNUM] = 1;
4697a36c
MM
4957 }
4958
9ebbca7d
GK
4959 /* Determine if we need to save the condition code registers. */
4960 if (regs_ever_live[CR2_REGNO]
4961 || regs_ever_live[CR3_REGNO]
4962 || regs_ever_live[CR4_REGNO])
4697a36c
MM
4963 {
4964 info_ptr->cr_save_p = 1;
9ebbca7d 4965 if (abi == ABI_V4 || abi == ABI_SOLARIS)
4697a36c
MM
4966 info_ptr->cr_size = reg_size;
4967 }
4968
83720594
RH
4969 /* If the current function calls __builtin_eh_return, then we need
4970 to allocate stack space for registers that will hold data for
4971 the exception handler. */
4972 if (current_function_calls_eh_return)
4973 {
4974 unsigned int i;
4975 for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
4976 continue;
4977 ehrd_size = i * UNITS_PER_WORD;
4978 }
4979 else
4980 ehrd_size = 0;
4981
4697a36c
MM
4982 /* Determine various sizes */
4983 info_ptr->reg_size = reg_size;
4984 info_ptr->fixed_size = RS6000_SAVE_AREA;
4985 info_ptr->varargs_size = RS6000_VARARGS_AREA;
189e03e3
DE
4986 info_ptr->vars_size = RS6000_ALIGN (get_frame_size (), 8);
4987 info_ptr->parm_size = RS6000_ALIGN (current_function_outgoing_args_size, 8);
189e03e3 4988 info_ptr->save_size = RS6000_ALIGN (info_ptr->fp_size
b6c9286a 4989 + info_ptr->gp_size
83720594 4990 + ehrd_size
b6c9286a
MM
4991 + info_ptr->cr_size
4992 + info_ptr->lr_size
9ebbca7d 4993 + info_ptr->toc_size, 8);
ee890fe2
SS
4994 if (DEFAULT_ABI == ABI_DARWIN)
4995 info_ptr->save_size = RS6000_ALIGN (info_ptr->save_size, 16);
b6c9286a 4996
4697a36c 4997 /* Calculate the offsets */
24d304eb 4998 switch (abi)
4697a36c 4999 {
b6c9286a 5000 case ABI_NONE:
24d304eb 5001 default:
b6c9286a
MM
5002 abort ();
5003
5004 case ABI_AIX:
5005 case ABI_AIX_NODESC:
ee890fe2 5006 case ABI_DARWIN:
b6c9286a
MM
5007 info_ptr->fp_save_offset = - info_ptr->fp_size;
5008 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
83720594 5009 info_ptr->ehrd_offset = info_ptr->gp_save_offset - ehrd_size;
a260abc9
DE
5010 info_ptr->cr_save_offset = reg_size; /* first word when 64-bit. */
5011 info_ptr->lr_save_offset = 2*reg_size;
24d304eb
RK
5012 break;
5013
5014 case ABI_V4:
c81bebd7 5015 case ABI_SOLARIS:
b6c9286a
MM
5016 info_ptr->fp_save_offset = - info_ptr->fp_size;
5017 info_ptr->gp_save_offset = info_ptr->fp_save_offset - info_ptr->gp_size;
a7df97e6
MM
5018 info_ptr->cr_save_offset = info_ptr->gp_save_offset - info_ptr->cr_size;
5019 info_ptr->toc_save_offset = info_ptr->cr_save_offset - info_ptr->toc_size;
83720594 5020 info_ptr->ehrd_offset = info_ptr->toc_save_offset - ehrd_size;
b6c9286a
MM
5021 info_ptr->lr_save_offset = reg_size;
5022 break;
4697a36c
MM
5023 }
5024
ff381587
MM
5025 total_raw_size = (info_ptr->vars_size
5026 + info_ptr->parm_size
ff381587
MM
5027 + info_ptr->save_size
5028 + info_ptr->varargs_size
5029 + info_ptr->fixed_size);
5030
5031 info_ptr->total_size = RS6000_ALIGN (total_raw_size, ABI_STACK_BOUNDARY / BITS_PER_UNIT);
5032
5033 /* Determine if we need to allocate any stack frame:
5034
5035 For AIX we need to push the stack if a frame pointer is needed (because
5036 the stack might be dynamically adjusted), if we are debugging, if we
9ebbca7d 5037 make calls, or if the sum of fp_save, gp_save, and local variables
ff381587 5038 are more than the space needed to save all non-volatile registers:
bfc79d3b 5039 32-bit: 18*8 + 19*4 = 220 or 64-bit: 18*8 + 18*8 = 288 (GPR13 reserved).
ff381587
MM
5040
5041 For V.4 we don't have the stack cushion that AIX uses, but assume that
5042 the debugger can handle stackless frames. */
5043
5044 if (info_ptr->calls_p)
5045 info_ptr->push_p = 1;
5046
9ebbca7d 5047 else if (abi == ABI_V4 || abi == ABI_SOLARIS)
ff381587 5048 info_ptr->push_p = (total_raw_size > info_ptr->fixed_size
9ebbca7d 5049 || info_ptr->calls_p);
ff381587
MM
5050
5051 else
5052 info_ptr->push_p = (frame_pointer_needed
ee890fe2 5053 || (abi != ABI_DARWIN && write_symbols != NO_DEBUG)
ff381587 5054 || ((total_raw_size - info_ptr->fixed_size)
bfc79d3b 5055 > (TARGET_32BIT ? 220 : 288)));
ff381587 5056
4697a36c 5057 /* Zero offsets if we're not saving those registers */
8dda1a21 5058 if (info_ptr->fp_size == 0)
4697a36c
MM
5059 info_ptr->fp_save_offset = 0;
5060
8dda1a21 5061 if (info_ptr->gp_size == 0)
4697a36c
MM
5062 info_ptr->gp_save_offset = 0;
5063
c81fc13e 5064 if (! info_ptr->lr_save_p)
4697a36c
MM
5065 info_ptr->lr_save_offset = 0;
5066
c81fc13e 5067 if (! info_ptr->cr_save_p)
4697a36c
MM
5068 info_ptr->cr_save_offset = 0;
5069
c81fc13e 5070 if (! info_ptr->toc_save_p)
b6c9286a
MM
5071 info_ptr->toc_save_offset = 0;
5072
4697a36c
MM
5073 return info_ptr;
5074}
5075
5076void
5077debug_stack_info (info)
5078 rs6000_stack_t *info;
9878760c 5079{
d330fd93 5080 const char *abi_string;
24d304eb 5081
c81fc13e 5082 if (! info)
4697a36c
MM
5083 info = rs6000_stack_info ();
5084
5085 fprintf (stderr, "\nStack information for function %s:\n",
5086 ((current_function_decl && DECL_NAME (current_function_decl))
5087 ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
5088 : "<unknown>"));
5089
24d304eb
RK
5090 switch (info->abi)
5091 {
b6c9286a
MM
5092 default: abi_string = "Unknown"; break;
5093 case ABI_NONE: abi_string = "NONE"; break;
5094 case ABI_AIX: abi_string = "AIX"; break;
5095 case ABI_AIX_NODESC: abi_string = "AIX"; break;
ee890fe2 5096 case ABI_DARWIN: abi_string = "Darwin"; break;
b6c9286a 5097 case ABI_V4: abi_string = "V.4"; break;
c81bebd7 5098 case ABI_SOLARIS: abi_string = "Solaris"; break;
24d304eb
RK
5099 }
5100
5101 fprintf (stderr, "\tABI = %5s\n", abi_string);
5102
4697a36c
MM
5103 if (info->first_gp_reg_save != 32)
5104 fprintf (stderr, "\tfirst_gp_reg_save = %5d\n", info->first_gp_reg_save);
5105
5106 if (info->first_fp_reg_save != 64)
5107 fprintf (stderr, "\tfirst_fp_reg_save = %5d\n", info->first_fp_reg_save);
9878760c 5108
4697a36c
MM
5109 if (info->lr_save_p)
5110 fprintf (stderr, "\tlr_save_p = %5d\n", info->lr_save_p);
9878760c 5111
4697a36c
MM
5112 if (info->cr_save_p)
5113 fprintf (stderr, "\tcr_save_p = %5d\n", info->cr_save_p);
5114
b6c9286a
MM
5115 if (info->toc_save_p)
5116 fprintf (stderr, "\ttoc_save_p = %5d\n", info->toc_save_p);
5117
4697a36c
MM
5118 if (info->push_p)
5119 fprintf (stderr, "\tpush_p = %5d\n", info->push_p);
5120
5121 if (info->calls_p)
5122 fprintf (stderr, "\tcalls_p = %5d\n", info->calls_p);
5123
4697a36c
MM
5124 if (info->gp_save_offset)
5125 fprintf (stderr, "\tgp_save_offset = %5d\n", info->gp_save_offset);
5126
5127 if (info->fp_save_offset)
5128 fprintf (stderr, "\tfp_save_offset = %5d\n", info->fp_save_offset);
5129
5130 if (info->lr_save_offset)
5131 fprintf (stderr, "\tlr_save_offset = %5d\n", info->lr_save_offset);
5132
5133 if (info->cr_save_offset)
5134 fprintf (stderr, "\tcr_save_offset = %5d\n", info->cr_save_offset);
5135
b6c9286a
MM
5136 if (info->toc_save_offset)
5137 fprintf (stderr, "\ttoc_save_offset = %5d\n", info->toc_save_offset);
5138
4697a36c
MM
5139 if (info->varargs_save_offset)
5140 fprintf (stderr, "\tvarargs_save_offset = %5d\n", info->varargs_save_offset);
5141
5142 if (info->total_size)
5143 fprintf (stderr, "\ttotal_size = %5d\n", info->total_size);
5144
5145 if (info->varargs_size)
5146 fprintf (stderr, "\tvarargs_size = %5d\n", info->varargs_size);
5147
5148 if (info->vars_size)
5149 fprintf (stderr, "\tvars_size = %5d\n", info->vars_size);
5150
5151 if (info->parm_size)
5152 fprintf (stderr, "\tparm_size = %5d\n", info->parm_size);
5153
5154 if (info->fixed_size)
5155 fprintf (stderr, "\tfixed_size = %5d\n", info->fixed_size);
5156
5157 if (info->gp_size)
5158 fprintf (stderr, "\tgp_size = %5d\n", info->gp_size);
5159
5160 if (info->fp_size)
5161 fprintf (stderr, "\tfp_size = %5d\n", info->fp_size);
5162
b6c9286a
MM
5163 if (info->lr_size)
5164 fprintf (stderr, "\tlr_size = %5d\n", info->cr_size);
5165
4697a36c
MM
5166 if (info->cr_size)
5167 fprintf (stderr, "\tcr_size = %5d\n", info->cr_size);
5168
b6c9286a
MM
5169 if (info->toc_size)
5170 fprintf (stderr, "\ttoc_size = %5d\n", info->toc_size);
5171
4697a36c
MM
5172 if (info->save_size)
5173 fprintf (stderr, "\tsave_size = %5d\n", info->save_size);
5174
5175 if (info->reg_size != 4)
5176 fprintf (stderr, "\treg_size = %5d\n", info->reg_size);
5177
5178 fprintf (stderr, "\n");
9878760c 5179}
71f123ca
FS
5180
5181rtx
5182rs6000_return_addr (count, frame)
5183 int count;
5184 rtx frame;
5185{
5186 rtx init, reg;
5187
5188 /* Currently we don't optimize very well between prolog and body code and
5189 for PIC code the code can be actually quite bad, so don't try to be
5190 too clever here. */
3418dd3a
FS
5191 if (count != 0
5192 || flag_pic != 0
5193 || DEFAULT_ABI == ABI_AIX
5194 || DEFAULT_ABI == ABI_AIX_NODESC)
71f123ca
FS
5195 {
5196 cfun->machine->ra_needs_full_frame = 1;
5197 return
5198 gen_rtx_MEM (Pmode,
3418dd3a 5199 memory_address (Pmode,
71f123ca
FS
5200 plus_constant (copy_to_reg (gen_rtx_MEM (Pmode,
5201 memory_address (Pmode, frame))),
5202 RETURN_ADDRESS_OFFSET)));
5203 }
5204
5205 reg = cfun->machine->ra_rtx;
5206 if (reg == NULL)
5207 {
5208 /* No rtx yet. Invent one, and initialize it from LR in
5209 the prologue. */
5210 reg = gen_reg_rtx (Pmode);
5211 cfun->machine->ra_rtx = reg;
5212 init = gen_rtx_SET (VOIDmode, reg,
5213 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
5214
5215 /* Emit the insn to the prologue with the other argument copies. */
5216 push_topmost_sequence ();
5217 emit_insn_after (init, get_insns ());
5218 pop_topmost_sequence ();
5219 }
5220
5221 return reg;
5222}
5223
5224static int
5225rs6000_ra_ever_killed ()
5226{
5227 rtx top;
5228
5229#ifdef ASM_OUTPUT_MI_THUNK
5230 if (current_function_is_thunk)
5231 return 0;
5232#endif
5233 if (!cfun->machine->ra_rtx || cfun->machine->ra_needs_full_frame)
5234 return regs_ever_live[LINK_REGISTER_REGNUM];
5235
5236 push_topmost_sequence ();
5237 top = get_insns ();
5238 pop_topmost_sequence ();
5239
5240 return reg_set_between_p (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM),
5241 top, NULL_RTX);
5242}
4697a36c 5243\f
8cd8f856
GK
5244/* Add a REG_MAYBE_DEAD note to the insn. */
5245static void
5246rs6000_maybe_dead (insn)
5247 rtx insn;
5248{
5249 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD,
5250 const0_rtx,
5251 REG_NOTES (insn));
5252}
5253
9ebbca7d 5254/* Emit instructions needed to load the TOC register.
c7ca610e 5255 This is only needed when TARGET_TOC, TARGET_MINIMAL_TOC, and there is
9ebbca7d 5256 a constant pool; or for SVR4 -fpic. */
c7ca610e
RK
5257
5258void
9ebbca7d
GK
5259rs6000_emit_load_toc_table (fromprolog)
5260 int fromprolog;
c7ca610e 5261{
9ebbca7d
GK
5262 rtx dest;
5263 dest = gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM);
c7ca610e 5264
9ebbca7d 5265 if (TARGET_ELF)
c7ca610e 5266 {
9ebbca7d
GK
5267 if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
5268 && flag_pic == 1)
38c1f2d7 5269 {
9ebbca7d
GK
5270 rtx temp = (fromprolog
5271 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
5272 : gen_reg_rtx (Pmode));
5273 if (TARGET_32BIT)
8cd8f856 5274 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_pic_si (temp)));
9ebbca7d 5275 else
8cd8f856
GK
5276 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_pic_di (temp)));
5277 rs6000_maybe_dead (emit_move_insn (dest, temp));
38c1f2d7 5278 }
9ebbca7d
GK
5279 else if (flag_pic == 2)
5280 {
5281 char buf[30];
5282 rtx tempLR = (fromprolog
5283 ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
5284 : gen_reg_rtx (Pmode));
5285 rtx temp0 = (fromprolog
5286 ? gen_rtx_REG (Pmode, 0)
5287 : gen_reg_rtx (Pmode));
5288 rtx symF;
5289
5290 /* possibly create the toc section */
5291 if (! toc_initialized)
5292 {
5293 toc_section ();
5294 function_section (current_function_decl);
5295 }
5296
5297 if (fromprolog)
5298 {
5299 rtx symL;
5300
5301 ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
a8a05998 5302 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
38c1f2d7 5303
9ebbca7d 5304 ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
a8a05998 5305 symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
38c1f2d7 5306
8cd8f856
GK
5307 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1 (tempLR,
5308 symF)));
5309 rs6000_maybe_dead (emit_move_insn (dest, tempLR));
5310 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest,
5311 symL,
5312 symF)));
9ebbca7d
GK
5313 }
5314 else
5315 {
5316 rtx tocsym;
5317 static int reload_toc_labelno = 0;
5318
a8a05998 5319 tocsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (toc_label_name));
38c1f2d7 5320
9ebbca7d 5321 ASM_GENERATE_INTERNAL_LABEL (buf, "LCG", reload_toc_labelno++);
a8a05998 5322 symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9ebbca7d 5323
8cd8f856
GK
5324 rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1b (tempLR,
5325 symF,
5326 tocsym)));
5327 rs6000_maybe_dead (emit_move_insn (dest, tempLR));
5328 rs6000_maybe_dead (emit_move_insn (temp0,
5329 gen_rtx_MEM (Pmode, dest)));
9ebbca7d 5330 }
8cd8f856 5331 rs6000_maybe_dead (emit_insn (gen_addsi3 (dest, temp0, dest)));
9ebbca7d
GK
5332 }
5333 else if (flag_pic == 0 && TARGET_MINIMAL_TOC)
5334 {
5335 /* This is for AIX code running in non-PIC ELF. */
5336 char buf[30];
5337 rtx realsym;
38c1f2d7 5338 ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
a8a05998 5339 realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9ebbca7d 5340
8cd8f856
GK
5341 rs6000_maybe_dead (emit_insn (gen_elf_high (dest, realsym)));
5342 rs6000_maybe_dead (emit_insn (gen_elf_low (dest, dest, realsym)));
9ebbca7d
GK
5343 }
5344 else
5345 abort();
5346 }
5347 else
5348 {
5349 if (TARGET_32BIT)
8cd8f856 5350 rs6000_maybe_dead (emit_insn (gen_load_toc_aix_si (dest)));
9ebbca7d 5351 else
8cd8f856 5352 rs6000_maybe_dead (emit_insn (gen_load_toc_aix_di (dest)));
9ebbca7d
GK
5353 }
5354}
5355
5356int
5357get_TOC_alias_set ()
5358{
5359 static int set = -1;
5360 if (set == -1)
5361 set = new_alias_set ();
5362 return set;
5363}
5364
5365/* This retuns nonzero if the current function uses the TOC. This is
5366 determined by the presence of (unspec ... 7), which is generated by
5367 the various load_toc_* patterns. */
5368int
5369uses_TOC ()
5370{
5371 rtx insn;
38c1f2d7 5372
9ebbca7d 5373 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2c3c49de 5374 if (INSN_P (insn))
9ebbca7d
GK
5375 {
5376 rtx pat = PATTERN (insn);
5377 int i;
5378
8cd8f856 5379 if (GET_CODE (pat) == PARALLEL)
9ebbca7d
GK
5380 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
5381 if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == UNSPEC
5382 && XINT (XVECEXP (PATTERN (insn), 0, i), 1) == 7)
5383 return 1;
38c1f2d7 5384 }
9ebbca7d
GK
5385 return 0;
5386}
38c1f2d7 5387
9ebbca7d
GK
5388rtx
5389create_TOC_reference(symbol)
5390 rtx symbol;
5391{
a8a05998
ZW
5392 return gen_rtx_PLUS (Pmode,
5393 gen_rtx_REG (Pmode, TOC_REGISTER),
5394 gen_rtx_CONST (Pmode,
5395 gen_rtx_MINUS (Pmode, symbol,
5396 gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (toc_label_name)))));
9ebbca7d 5397}
38c1f2d7 5398
9ebbca7d
GK
5399#if TARGET_AIX
5400/* __throw will restore its own return address to be the same as the
5401 return address of the function that the throw is being made to.
5402 This is unfortunate, because we want to check the original
5403 return address to see if we need to restore the TOC.
5404 So we have to squirrel it away here.
5405 This is used only in compiling __throw and __rethrow.
c7ca610e 5406
9ebbca7d
GK
5407 Most of this code should be removed by CSE. */
5408static rtx insn_after_throw;
c7ca610e 5409
9ebbca7d
GK
5410/* This does the saving... */
5411void
5412rs6000_aix_emit_builtin_unwind_init ()
5413{
5414 rtx mem;
5415 rtx stack_top = gen_reg_rtx (Pmode);
5416 rtx opcode_addr = gen_reg_rtx (Pmode);
5417
5418 insn_after_throw = gen_reg_rtx (SImode);
5419
5420 mem = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
5421 emit_move_insn (stack_top, mem);
5422
5423 mem = gen_rtx_MEM (Pmode,
5424 gen_rtx_PLUS (Pmode, stack_top,
5425 GEN_INT (2 * GET_MODE_SIZE (Pmode))));
5426 emit_move_insn (opcode_addr, mem);
5427 emit_move_insn (insn_after_throw, gen_rtx_MEM (SImode, opcode_addr));
c7ca610e
RK
5428}
5429
9ebbca7d
GK
5430/* Emit insns to _restore_ the TOC register, at runtime (specifically in _eh.o).
5431 Only used on AIX.
5432
5433 The idea is that on AIX, function calls look like this:
5434 bl somefunction-trampoline
5435 lwz r2,20(sp)
5436
5437 and later,
5438 somefunction-trampoline:
5439 stw r2,20(sp)
5440 ... load function address in the count register ...
5441 bctr
5442 or like this, if the linker determines that this is not a cross-module call
5443 and so the TOC need not be restored:
5444 bl somefunction
5445 nop
5446 or like this, if the compiler could determine that this is not a
5447 cross-module call:
5448 bl somefunction
5449 now, the tricky bit here is that register 2 is saved and restored
5450 by the _linker_, so we can't readily generate debugging information
5451 for it. So we need to go back up the call chain looking at the
5452 insns at return addresses to see which calls saved the TOC register
5453 and so see where it gets restored from.
5454
5455 Oh, and all this gets done in RTL inside the eh_epilogue pattern,
5456 just before the actual epilogue.
5457
5458 On the bright side, this incurs no space or time overhead unless an
5459 exception is thrown, except for the extra code in libgcc.a.
5460
5461 The parameter STACKSIZE is a register containing (at runtime)
5462 the amount to be popped off the stack in addition to the stack frame
5463 of this routine (which will be __throw or __rethrow, and so is
5464 guaranteed to have a stack frame). */
5465void
5466rs6000_emit_eh_toc_restore (stacksize)
5467 rtx stacksize;
5468{
5469 rtx top_of_stack;
5470 rtx bottom_of_stack = gen_reg_rtx (Pmode);
5471 rtx tocompare = gen_reg_rtx (SImode);
5472 rtx opcode = gen_reg_rtx (SImode);
5473 rtx opcode_addr = gen_reg_rtx (Pmode);
5474 rtx mem;
5475 rtx loop_start = gen_label_rtx ();
5476 rtx no_toc_restore_needed = gen_label_rtx ();
5477 rtx loop_exit = gen_label_rtx ();
5478
5479 mem = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
5480 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
5481 emit_move_insn (bottom_of_stack, mem);
5482
5483 top_of_stack = expand_binop (Pmode, add_optab,
5484 bottom_of_stack, stacksize,
5485 NULL_RTX, 1, OPTAB_WIDEN);
5486
5487 emit_move_insn (tocompare,
5488 GEN_INT (trunc_int_for_mode (TARGET_32BIT
5489 ? 0x80410014
5490 : 0xE8410028, SImode)));
5491
5492 if (insn_after_throw == NULL_RTX)
5493 abort();
5494 emit_move_insn (opcode, insn_after_throw);
5495
6496a589 5496 emit_note (NULL, NOTE_INSN_LOOP_BEG);
9ebbca7d
GK
5497 emit_label (loop_start);
5498
5499 do_compare_rtx_and_jump (opcode, tocompare, NE, 1,
5500 SImode, NULL_RTX, 0, NULL_RTX,
5501 no_toc_restore_needed);
5502
5503 mem = gen_rtx_MEM (Pmode,
5504 gen_rtx_PLUS (Pmode, bottom_of_stack,
5505 GEN_INT (5 * GET_MODE_SIZE (Pmode))));
5506 emit_move_insn (gen_rtx_REG (Pmode, 2), mem);
5507
5508 emit_label (no_toc_restore_needed);
5509 do_compare_rtx_and_jump (top_of_stack, bottom_of_stack, EQ, 1,
5510 Pmode, NULL_RTX, 0, NULL_RTX,
5511 loop_exit);
5512
5513 mem = gen_rtx_MEM (Pmode, bottom_of_stack);
5514 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
5515 emit_move_insn (bottom_of_stack, mem);
5516
5517 mem = gen_rtx_MEM (Pmode,
5518 gen_rtx_PLUS (Pmode, bottom_of_stack,
5519 GEN_INT (2 * GET_MODE_SIZE (Pmode))));
5520 emit_move_insn (opcode_addr, mem);
5521 emit_move_insn (opcode, gen_rtx_MEM (SImode, opcode_addr));
5522
6496a589 5523 emit_note (NULL, NOTE_INSN_LOOP_CONT);
9ebbca7d 5524 emit_jump (loop_start);
6496a589 5525 emit_note (NULL, NOTE_INSN_LOOP_END);
9ebbca7d
GK
5526 emit_label (loop_exit);
5527}
5528#endif /* TARGET_AIX */
38c1f2d7 5529\f
9ebbca7d
GK
5530/* This ties together stack memory
5531 (MEM with an alias set of rs6000_sr_alias_set)
5532 and the change to the stack pointer. */
5533static void
5534rs6000_emit_stack_tie ()
5535{
5536 rtx mem;
5537 mem = gen_rtx_MEM (BLKmode, gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
5538 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
5539 emit_insn (gen_stack_tie (mem));
5540}
38c1f2d7 5541
9ebbca7d
GK
5542/* Emit the correct code for allocating stack space, as insns.
5543 If COPY_R12, make sure a copy of the old frame is left in r12.
5544 The generated code may use hard register 0 as a temporary. */
5545
5546static void
5547rs6000_emit_allocate_stack (size, copy_r12)
5548 HOST_WIDE_INT size;
38c1f2d7
MM
5549 int copy_r12;
5550{
9ebbca7d
GK
5551 rtx insn;
5552 rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
5553 rtx tmp_reg = gen_rtx_REG (Pmode, 0);
5554 rtx todec = GEN_INT (-size);
a157febd
GK
5555
5556 if (current_function_limit_stack)
5557 {
5558 if (REG_P (stack_limit_rtx)
5559 && REGNO (stack_limit_rtx) > 1
5560 && REGNO (stack_limit_rtx) <= 31)
5561 {
9ebbca7d
GK
5562 emit_insn (Pmode == SImode
5563 ? gen_addsi3 (tmp_reg,
5564 stack_limit_rtx,
5565 GEN_INT (size))
5566 : gen_adddi3 (tmp_reg,
5567 stack_limit_rtx,
5568 GEN_INT (size)));
5569
5570 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
5571 const0_rtx));
a157febd
GK
5572 }
5573 else if (GET_CODE (stack_limit_rtx) == SYMBOL_REF
9ebbca7d 5574 && TARGET_32BIT
a157febd
GK
5575 && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS))
5576 {
9ebbca7d
GK
5577 rtx toload = gen_rtx_CONST (VOIDmode,
5578 gen_rtx_PLUS (Pmode,
5579 stack_limit_rtx,
5580 GEN_INT (size)));
5581
5582 emit_insn (gen_elf_high (tmp_reg, toload));
5583 emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
5584 emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
5585 const0_rtx));
a157febd
GK
5586 }
5587 else
5588 warning ("stack limit expression is not supported");
5589 }
5590
9ebbca7d
GK
5591 if (copy_r12 || ! TARGET_UPDATE)
5592 emit_move_insn (gen_rtx_REG (Pmode, 12), stack_reg);
5593
38c1f2d7
MM
5594 if (TARGET_UPDATE)
5595 {
9ebbca7d 5596 if (size > 32767)
38c1f2d7 5597 {
9ebbca7d
GK
5598 /* Need a note here so that try_split doesn't get confused. */
5599 if (get_last_insn() == NULL_RTX)
5600 emit_note (0, NOTE_INSN_DELETED);
5601 insn = emit_move_insn (tmp_reg, todec);
5602 try_split (PATTERN (insn), insn, 0);
5603 todec = tmp_reg;
38c1f2d7 5604 }
9ebbca7d
GK
5605
5606 if (Pmode == SImode)
5607 insn = emit_insn (gen_movsi_update (stack_reg, stack_reg,
5608 todec, stack_reg));
5609 else
5610 insn = emit_insn (gen_movdi_update (stack_reg, stack_reg,
5611 todec, stack_reg));
38c1f2d7
MM
5612 }
5613 else
5614 {
9ebbca7d
GK
5615 if (Pmode == SImode)
5616 insn = emit_insn (gen_addsi3 (stack_reg, stack_reg, todec));
38c1f2d7 5617 else
9ebbca7d
GK
5618 insn = emit_insn (gen_adddi3 (stack_reg, stack_reg, todec));
5619 emit_move_insn (gen_rtx_MEM (Pmode, stack_reg),
5620 gen_rtx_REG (Pmode, 12));
5621 }
5622
5623 RTX_FRAME_RELATED_P (insn) = 1;
5624 REG_NOTES (insn) =
5625 gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
5626 gen_rtx_SET (VOIDmode, stack_reg,
5627 gen_rtx_PLUS (Pmode, stack_reg,
5628 GEN_INT (-size))),
5629 REG_NOTES (insn));
5630}
5631
5632/* Add to 'insn' a note which is PATTERN (INSN) but with REG replaced with
5633 (plus:P (reg 1) VAL), and with REG2 replaced with RREG if REG2 is not
5634 NULL.
5635 It would be nice if dwarf2out_frame_debug_expr could deduce these
5636 equivalences by itself so it wasn't necessary to hold its hand so much. */
5637
5638static void
5639rs6000_frame_related (insn, reg, val, reg2, rreg)
5640 rtx insn;
5641 rtx reg;
5642 HOST_WIDE_INT val;
5643 rtx reg2;
5644 rtx rreg;
5645{
5646 rtx real, temp;
5647
5648 real = copy_rtx (PATTERN (insn));
5649
5650 real = replace_rtx (real, reg,
5651 gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode,
5652 STACK_POINTER_REGNUM),
5653 GEN_INT (val)));
5654
5655 /* We expect that 'real' is either a SET or a PARALLEL containing
5656 SETs (and possibly other stuff). In a PARALLEL, all the SETs
5657 are important so they all have to be marked RTX_FRAME_RELATED_P. */
5658
5659 if (GET_CODE (real) == SET)
5660 {
5661 rtx set = real;
5662
5663 temp = simplify_rtx (SET_SRC (set));
5664 if (temp)
5665 SET_SRC (set) = temp;
5666 temp = simplify_rtx (SET_DEST (set));
5667 if (temp)
5668 SET_DEST (set) = temp;
5669 if (GET_CODE (SET_DEST (set)) == MEM)
38c1f2d7 5670 {
9ebbca7d
GK
5671 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
5672 if (temp)
5673 XEXP (SET_DEST (set), 0) = temp;
38c1f2d7 5674 }
38c1f2d7 5675 }
9ebbca7d
GK
5676 else if (GET_CODE (real) == PARALLEL)
5677 {
5678 int i;
5679 for (i = 0; i < XVECLEN (real, 0); i++)
5680 if (GET_CODE (XVECEXP (real, 0, i)) == SET)
5681 {
5682 rtx set = XVECEXP (real, 0, i);
5683
5684 temp = simplify_rtx (SET_SRC (set));
5685 if (temp)
5686 SET_SRC (set) = temp;
5687 temp = simplify_rtx (SET_DEST (set));
5688 if (temp)
5689 SET_DEST (set) = temp;
5690 if (GET_CODE (SET_DEST (set)) == MEM)
5691 {
5692 temp = simplify_rtx (XEXP (SET_DEST (set), 0));
5693 if (temp)
5694 XEXP (SET_DEST (set), 0) = temp;
5695 }
5696 RTX_FRAME_RELATED_P (set) = 1;
5697 }
5698 }
5699 else
5700 abort();
5701
5702 if (reg2 != NULL_RTX)
5703 real = replace_rtx (real, reg2, rreg);
5704
5705 RTX_FRAME_RELATED_P (insn) = 1;
5706 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
5707 real,
5708 REG_NOTES (insn));
38c1f2d7
MM
5709}
5710
9ebbca7d
GK
5711/* Emit function prologue as insns. */
5712
9878760c 5713void
83720594 5714rs6000_emit_prologue ()
9878760c 5715{
4697a36c 5716 rs6000_stack_t *info = rs6000_stack_info ();
9ebbca7d
GK
5717 enum machine_mode reg_mode = TARGET_POWERPC64 ? DImode : SImode;
5718 int reg_size = TARGET_POWERPC64 ? 8 : 4;
5719 rtx sp_reg_rtx = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
5720 rtx frame_ptr_rtx = gen_rtx_REG (Pmode, 12);
5721 rtx frame_reg_rtx = sp_reg_rtx;
5722 rtx cr_save_rtx = NULL;
5723 rtx insn;
5724 int saving_FPRs_inline;
5725 int using_store_multiple;
5726 HOST_WIDE_INT sp_offset = 0;
5727
5728 using_store_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
5729 && info->first_gp_reg_save < 31);
5730 saving_FPRs_inline = (info->first_fp_reg_save == 64
5731 || FP_SAVE_INLINE (info->first_fp_reg_save));
5732
5733 /* For V.4, update stack before we do any saving and set back pointer. */
5734 if (info->push_p && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS))
5735 {
5736 if (info->total_size < 32767)
5737 sp_offset = info->total_size;
5738 else
5739 frame_reg_rtx = frame_ptr_rtx;
5740 rs6000_emit_allocate_stack (info->total_size,
5741 (frame_reg_rtx != sp_reg_rtx
5742 && (info->cr_save_p
5743 || info->lr_save_p
5744 || info->first_fp_reg_save < 64
5745 || info->first_gp_reg_save < 32
5746 )));
5747 if (frame_reg_rtx != sp_reg_rtx)
5748 rs6000_emit_stack_tie ();
5749 }
5750
5751 /* If we use the link register, get it into r0. */
5752 if (info->lr_save_p)
71f123ca 5753 emit_move_insn (gen_rtx_REG (Pmode, 0),
9ebbca7d
GK
5754 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
5755
5756 /* If we need to save CR, put it into r12. */
5757 if (info->cr_save_p && frame_reg_rtx != frame_ptr_rtx)
5758 {
5759 cr_save_rtx = gen_rtx_REG (SImode, 12);
5760 emit_insn (gen_movesi_from_cr (cr_save_rtx));
5761 }
5762
5763 /* Do any required saving of fpr's. If only one or two to save, do it
5764 ourself. Otherwise, call function. */
5765 if (saving_FPRs_inline)
5766 {
5767 int i;
5768 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
5769 if ((regs_ever_live[info->first_fp_reg_save+i]
5770 && ! call_used_regs[info->first_fp_reg_save+i]))
5771 {
5772 rtx addr, reg, mem;
5773 reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
5774 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
5775 GEN_INT (info->fp_save_offset
5776 + sp_offset
5777 + 8*i));
5778 mem = gen_rtx_MEM (DFmode, addr);
5779 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
5780
5781 insn = emit_move_insn (mem, reg);
5782 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
5783 NULL_RTX, NULL_RTX);
5784 }
5785 }
5786 else if (info->first_fp_reg_save != 64)
5787 {
5788 int i;
5789 char rname[30];
520a57c8 5790 const char *alloc_rname;
9ebbca7d
GK
5791 rtvec p;
5792 p = rtvec_alloc (2 + 64 - info->first_fp_reg_save);
5793
5794 RTVEC_ELT (p, 0) = gen_rtx_CLOBBER (VOIDmode,
5795 gen_rtx_REG (Pmode,
5796 LINK_REGISTER_REGNUM));
5797 sprintf (rname, "%s%d%s", SAVE_FP_PREFIX,
5798 info->first_fp_reg_save - 32, SAVE_FP_SUFFIX);
a8a05998 5799 alloc_rname = ggc_strdup (rname);
9ebbca7d
GK
5800 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
5801 gen_rtx_SYMBOL_REF (Pmode,
5802 alloc_rname));
5803 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
5804 {
5805 rtx addr, reg, mem;
5806 reg = gen_rtx_REG (DFmode, info->first_fp_reg_save + i);
5807 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
5808 GEN_INT (info->fp_save_offset
5809 + sp_offset + 8*i));
5810 mem = gen_rtx_MEM (DFmode, addr);
5811 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
5812
5813 RTVEC_ELT (p, i + 2) = gen_rtx_SET (VOIDmode, mem, reg);
5814 }
5815 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
5816 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
5817 NULL_RTX, NULL_RTX);
5818 }
b6c9286a 5819
9ebbca7d
GK
5820 /* Save GPRs. This is done as a PARALLEL if we are using
5821 the store-multiple instructions. */
5822 if (using_store_multiple)
b6c9286a 5823 {
9ebbca7d
GK
5824 rtvec p, dwarfp;
5825 int i;
5826 p = rtvec_alloc (32 - info->first_gp_reg_save);
5827 dwarfp = rtvec_alloc (32 - info->first_gp_reg_save);
5828 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
5829 {
5830 rtx addr, reg, mem;
5831 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
5832 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
5833 GEN_INT (info->gp_save_offset
5834 + sp_offset
5835 + reg_size * i));
5836 mem = gen_rtx_MEM (reg_mode, addr);
5837 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
5838
5839 RTVEC_ELT (p, i) = gen_rtx_SET (VOIDmode, mem, reg);
5840 }
5841 insn = emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
5842 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
5843 NULL_RTX, NULL_RTX);
b6c9286a
MM
5844 }
5845 else
5846 {
9ebbca7d
GK
5847 int i;
5848 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
5849 if ((regs_ever_live[info->first_gp_reg_save+i]
5850 && ! call_used_regs[info->first_gp_reg_save+i])
5851 || (i+info->first_gp_reg_save == PIC_OFFSET_TABLE_REGNUM
ee890fe2
SS
5852 && (((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
5853 && flag_pic == 1)
5854 || (DEFAULT_ABI == ABI_DARWIN
5855 && flag_pic))))
9ebbca7d
GK
5856 {
5857 rtx addr, reg, mem;
5858 reg = gen_rtx_REG (reg_mode, info->first_gp_reg_save + i);
5859 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
5860 GEN_INT (info->gp_save_offset
5861 + sp_offset
5862 + reg_size * i));
5863 mem = gen_rtx_MEM (reg_mode, addr);
5864 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
5865
5866 insn = emit_move_insn (mem, reg);
5867 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
5868 NULL_RTX, NULL_RTX);
5869 }
5870 }
5871
83720594
RH
5872 /* ??? There's no need to emit actual instructions here, but it's the
5873 easiest way to get the frame unwind information emitted. */
5874 if (current_function_calls_eh_return)
5875 {
78e1b90d
DE
5876 unsigned int i, regno;
5877
83720594
RH
5878 for (i = 0; ; ++i)
5879 {
5880 rtx addr, reg, mem;
5881
5882 regno = EH_RETURN_DATA_REGNO (i);
5883 if (regno == INVALID_REGNUM)
5884 break;
5885
5886 reg = gen_rtx_REG (reg_mode, regno);
5887 addr = plus_constant (frame_reg_rtx,
78e1b90d
DE
5888 info->ehrd_offset + sp_offset
5889 + reg_size * (int) i);
83720594
RH
5890 mem = gen_rtx_MEM (reg_mode, addr);
5891 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
5892
5893 insn = emit_move_insn (mem, reg);
5894 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
5895 NULL_RTX, NULL_RTX);
5896 }
5897 }
5898
9ebbca7d
GK
5899 /* Save lr if we used it. */
5900 if (info->lr_save_p)
5901 {
5902 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
5903 GEN_INT (info->lr_save_offset + sp_offset));
5904 rtx reg = gen_rtx_REG (Pmode, 0);
5905 rtx mem = gen_rtx_MEM (Pmode, addr);
5906 /* This should not be of rs6000_sr_alias_set, because of
5907 __builtin_return_address. */
5908
5909 insn = emit_move_insn (mem, reg);
5910 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
5911 reg, gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
5912 }
5913
5914 /* Save CR if we use any that must be preserved. */
5915 if (info->cr_save_p)
5916 {
5917 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
5918 GEN_INT (info->cr_save_offset + sp_offset));
5919 rtx mem = gen_rtx_MEM (SImode, addr);
5920 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
5921
5922 /* If r12 was used to hold the original sp, copy cr into r0 now
5923 that it's free. */
5924 if (REGNO (frame_reg_rtx) == 12)
5925 {
5926 cr_save_rtx = gen_rtx_REG (SImode, 0);
5927 emit_insn (gen_movesi_from_cr (cr_save_rtx));
5928 }
5929 insn = emit_move_insn (mem, cr_save_rtx);
5930
5931 /* Now, there's no way that dwarf2out_frame_debug_expr is going
5932 to understand '(unspec:SI [(reg:CC 68) ...] 19)'. But that's
5933 OK. All we have to do is specify that _one_ condition code
5934 register is saved in this stack slot. The thrower's epilogue
5935 will then restore all the call-saved registers. */
5936 rs6000_frame_related (insn, frame_ptr_rtx, info->total_size,
5937 cr_save_rtx, gen_rtx_REG (SImode, CR0_REGNO));
5938 }
5939
5940 /* Update stack and set back pointer unless this is V.4,
5941 for which it was done previously. */
5942 if (info->push_p && DEFAULT_ABI != ABI_V4 && DEFAULT_ABI != ABI_SOLARIS)
5943 rs6000_emit_allocate_stack (info->total_size, FALSE);
5944
5945 /* Set frame pointer, if needed. */
5946 if (frame_pointer_needed)
5947 {
5948 insn = emit_move_insn (gen_rtx_REG (reg_mode, FRAME_POINTER_REGNUM),
5949 sp_reg_rtx);
5950 RTX_FRAME_RELATED_P (insn) = 1;
b6c9286a 5951 }
9878760c 5952
9ebbca7d
GK
5953 /* If we are using PIC_OFFSET_TABLE_REGNUM, we need to set it up. */
5954 if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
5955 || ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
5956 && flag_pic == 1 && regs_ever_live[PIC_OFFSET_TABLE_REGNUM]))
5957 {
5958 /* If emit_load_toc_table will use the link register, we need to save
5959 it. We use R11 for this purpose because emit_load_toc_table
5960 can use register 0. This allows us to use a plain 'blr' to return
5961 from the procedure more often. */
d5fa86ba
GK
5962 int save_LR_around_toc_setup = (TARGET_ELF && flag_pic != 0
5963 && ! info->lr_save_p
5964 && EXIT_BLOCK_PTR->pred != NULL);
9ebbca7d
GK
5965 if (save_LR_around_toc_setup)
5966 emit_move_insn (gen_rtx_REG (Pmode, 11),
5967 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
5968
5969 rs6000_emit_load_toc_table (TRUE);
5970
5971 if (save_LR_around_toc_setup)
5972 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM),
5973 gen_rtx_REG (Pmode, 11));
5974 }
ee890fe2
SS
5975
5976 if (DEFAULT_ABI == ABI_DARWIN
5977 && flag_pic && current_function_uses_pic_offset_table)
5978 {
5979 rtx dest = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
5980
5981 rs6000_maybe_dead (emit_insn (gen_load_macho_picbase (dest)));
5982
5983 rs6000_maybe_dead (
5984 emit_move_insn (gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM),
5985 gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)));
5986 }
9ebbca7d
GK
5987}
5988
5989
5990/* Write function prologue. */
5991void
5992output_prolog (file, size)
5993 FILE *file;
5994 int size ATTRIBUTE_UNUSED;
5995{
5996 rs6000_stack_t *info = rs6000_stack_info ();
5997
4697a36c
MM
5998 if (TARGET_DEBUG_STACK)
5999 debug_stack_info (info);
9878760c
RK
6000
6001 /* Write .extern for any function we will call to save and restore fp
6002 values. */
b6c9286a 6003 if (info->first_fp_reg_save < 64 && !FP_SAVE_INLINE (info->first_fp_reg_save))
4d30c363 6004 fprintf (file, "\t.extern %s%d%s\n\t.extern %s%d%s\n",
4697a36c
MM
6005 SAVE_FP_PREFIX, info->first_fp_reg_save - 32, SAVE_FP_SUFFIX,
6006 RESTORE_FP_PREFIX, info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX);
9878760c 6007
c764f757
RK
6008 /* Write .extern for AIX common mode routines, if needed. */
6009 if (! TARGET_POWER && ! TARGET_POWERPC && ! common_mode_defined)
6010 {
f6709c70
JW
6011 fputs ("\t.extern __mulh\n", file);
6012 fputs ("\t.extern __mull\n", file);
6013 fputs ("\t.extern __divss\n", file);
6014 fputs ("\t.extern __divus\n", file);
6015 fputs ("\t.extern __quoss\n", file);
6016 fputs ("\t.extern __quous\n", file);
c764f757
RK
6017 common_mode_defined = 1;
6018 }
9878760c 6019
9ebbca7d 6020 if (! HAVE_prologue)
979721f8 6021 {
9ebbca7d
GK
6022 start_sequence ();
6023
6024 /* A NOTE_INSN_DELETED is supposed to be at the start
6025 and end of the "toplevel" insn chain. */
6026 emit_note (0, NOTE_INSN_DELETED);
6027 rs6000_emit_prologue ();
6028 emit_note (0, NOTE_INSN_DELETED);
6029
6030 if (TARGET_DEBUG_STACK)
6031 debug_rtx_list (get_insns(), 100);
6032 final (get_insns(), file, FALSE, FALSE);
6033 end_sequence ();
979721f8
MM
6034 }
6035
9ebbca7d
GK
6036 rs6000_pic_labelno++;
6037}
6038
6039/* Emit function epilogue as insns.
9878760c 6040
9ebbca7d
GK
6041 At present, dwarf2out_frame_debug_expr doesn't understand
6042 register restores, so we don't bother setting RTX_FRAME_RELATED_P
6043 anywhere in the epilogue. Most of the insns below would in any case
6044 need special notes to explain where r11 is in relation to the stack. */
9878760c 6045
9ebbca7d 6046void
83720594 6047rs6000_emit_epilogue (sibcall)
9ebbca7d
GK
6048 int sibcall;
6049{
6050 rs6000_stack_t *info;
6051 int restoring_FPRs_inline;
6052 int using_load_multiple;
6053 int using_mfcr_multiple;
6054 int use_backchain_to_restore_sp;
6055 int sp_offset = 0;
6056 rtx sp_reg_rtx = gen_rtx_REG (Pmode, 1);
6057 rtx frame_reg_rtx = sp_reg_rtx;
6058 enum machine_mode reg_mode = TARGET_POWERPC64 ? DImode : SImode;
6059 int reg_size = TARGET_POWERPC64 ? 8 : 4;
6060 int i;
6061
6062 info = rs6000_stack_info ();
6063 using_load_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
6064 && info->first_gp_reg_save < 31);
6065 restoring_FPRs_inline = (sibcall
83720594 6066 || current_function_calls_eh_return
9ebbca7d
GK
6067 || info->first_fp_reg_save == 64
6068 || FP_SAVE_INLINE (info->first_fp_reg_save));
6069 use_backchain_to_restore_sp = (frame_pointer_needed
6070 || current_function_calls_alloca
6071 || info->total_size > 32767);
6072 using_mfcr_multiple = (rs6000_cpu == PROCESSOR_PPC601
6073 || rs6000_cpu == PROCESSOR_PPC603
6074 || rs6000_cpu == PROCESSOR_PPC750
6075 || optimize_size);
6076
6077 /* If we have a frame pointer, a call to alloca, or a large stack
6078 frame, restore the old stack pointer using the backchain. Otherwise,
6079 we know what size to update it with. */
6080 if (use_backchain_to_restore_sp)
bacbde18 6081 {
9ebbca7d
GK
6082 /* Under V.4, don't reset the stack pointer until after we're done
6083 loading the saved registers. */
6084 if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
6085 frame_reg_rtx = gen_rtx_REG (Pmode, 11);
4697a36c 6086
9ebbca7d
GK
6087 emit_move_insn (frame_reg_rtx,
6088 gen_rtx_MEM (Pmode, sp_reg_rtx));
6089
bacbde18 6090 }
9ebbca7d 6091 else if (info->push_p)
85638c0d 6092 {
9ebbca7d
GK
6093 if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
6094 sp_offset = info->total_size;
6095 else
6096 {
6097 emit_insn (TARGET_32BIT
6098 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
6099 GEN_INT (info->total_size))
6100 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
6101 GEN_INT (info->total_size)));
6102 }
85638c0d 6103 }
9ebbca7d
GK
6104
6105 /* Get the old lr if we saved it. */
6106 if (info->lr_save_p)
b6c9286a 6107 {
9ebbca7d
GK
6108 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
6109 GEN_INT (info->lr_save_offset + sp_offset));
6110 rtx mem = gen_rtx_MEM (Pmode, addr);
6111 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
b6c9286a 6112
9ebbca7d 6113 emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
b6c9286a 6114 }
9ebbca7d
GK
6115
6116 /* Get the old cr if we saved it. */
6117 if (info->cr_save_p)
6118 {
6119 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
6120 GEN_INT (info->cr_save_offset + sp_offset));
6121 rtx mem = gen_rtx_MEM (SImode, addr);
6122 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
b6c9286a 6123
9ebbca7d
GK
6124 emit_move_insn (gen_rtx_REG (SImode, 12), mem);
6125 }
6126
6127 /* Set LR here to try to overlap restores below. */
4697a36c 6128 if (info->lr_save_p)
9ebbca7d
GK
6129 emit_move_insn (gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM),
6130 gen_rtx_REG (Pmode, 0));
6131
83720594
RH
6132 /* Load exception handler data registers, if needed. */
6133 if (current_function_calls_eh_return)
6134 {
78e1b90d
DE
6135 unsigned int i, regno;
6136
83720594
RH
6137 for (i = 0; ; ++i)
6138 {
6139 rtx addr, mem;
6140
6141 regno = EH_RETURN_DATA_REGNO (i);
6142 if (regno == INVALID_REGNUM)
6143 break;
6144
6145 addr = plus_constant (frame_reg_rtx,
78e1b90d
DE
6146 info->ehrd_offset + sp_offset
6147 + reg_size * (int) i);
83720594
RH
6148 mem = gen_rtx_MEM (reg_mode, addr);
6149 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
6150
6151 emit_move_insn (gen_rtx_REG (reg_mode, regno), mem);
6152 }
6153 }
9ebbca7d
GK
6154
6155 /* Restore GPRs. This is done as a PARALLEL if we are using
6156 the load-multiple instructions. */
6157 if (using_load_multiple)
979721f8 6158 {
9ebbca7d
GK
6159 rtvec p;
6160 p = rtvec_alloc (32 - info->first_gp_reg_save);
6161 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
979721f8 6162 {
9ebbca7d
GK
6163 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
6164 GEN_INT (info->gp_save_offset
6165 + sp_offset
6166 + reg_size * i));
6167 rtx mem = gen_rtx_MEM (reg_mode, addr);
6168 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
6169
6170 RTVEC_ELT (p, i) =
6171 gen_rtx_SET (VOIDmode,
6172 gen_rtx_REG (reg_mode, info->first_gp_reg_save + i),
6173 mem);
979721f8 6174 }
9ebbca7d 6175 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
979721f8 6176 }
9ebbca7d
GK
6177 else
6178 for (i = 0; i < 32 - info->first_gp_reg_save; i++)
6179 if ((regs_ever_live[info->first_gp_reg_save+i]
6180 && ! call_used_regs[info->first_gp_reg_save+i])
6181 || (i+info->first_gp_reg_save == PIC_OFFSET_TABLE_REGNUM
ee890fe2
SS
6182 && (((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
6183 && flag_pic == 1)
6184 || (DEFAULT_ABI == ABI_DARWIN
6185 && flag_pic))))
9ebbca7d
GK
6186 {
6187 rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
6188 GEN_INT (info->gp_save_offset
6189 + sp_offset
6190 + reg_size * i));
6191 rtx mem = gen_rtx_MEM (reg_mode, addr);
6192 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
6193
6194 emit_move_insn (gen_rtx_REG (reg_mode,
6195 info->first_gp_reg_save + i),
6196 mem);
6197 }
9878760c 6198
9ebbca7d
GK
6199 /* Restore fpr's if we need to do it without calling a function. */
6200 if (restoring_FPRs_inline)
6201 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
6202 if ((regs_ever_live[info->first_fp_reg_save+i]
6203 && ! call_used_regs[info->first_fp_reg_save+i]))
6204 {
6205 rtx addr, mem;
6206 addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
6207 GEN_INT (info->fp_save_offset
6208 + sp_offset
6209 + 8*i));
6210 mem = gen_rtx_MEM (DFmode, addr);
6211 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
6212
6213 emit_move_insn (gen_rtx_REG (DFmode,
6214 info->first_fp_reg_save + i),
6215 mem);
6216 }
8d30c4ee 6217
9ebbca7d
GK
6218 /* If we saved cr, restore it here. Just those that were used. */
6219 if (info->cr_save_p)
979721f8 6220 {
9ebbca7d 6221 rtx r12_rtx = gen_rtx_REG (SImode, 12);
e35b9579 6222 int count = 0;
9ebbca7d
GK
6223
6224 if (using_mfcr_multiple)
979721f8 6225 {
9ebbca7d
GK
6226 for (i = 0; i < 8; i++)
6227 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
e35b9579 6228 count++;
9ebbca7d 6229 if (count == 0)
e35b9579
GK
6230 abort ();
6231 }
6232
6233 if (using_mfcr_multiple && count > 1)
6234 {
6235 rtvec p;
6236 int ndx;
9ebbca7d 6237
e35b9579 6238 p = rtvec_alloc (count);
9ebbca7d 6239
e35b9579 6240 ndx = 0;
9ebbca7d
GK
6241 for (i = 0; i < 8; i++)
6242 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
6243 {
6244 rtvec r = rtvec_alloc (2);
6245 RTVEC_ELT (r, 0) = r12_rtx;
6246 RTVEC_ELT (r, 1) = GEN_INT (1 << (7-i));
e35b9579 6247 RTVEC_ELT (p, ndx) =
9ebbca7d
GK
6248 gen_rtx_SET (VOIDmode, gen_rtx_REG (CCmode, CR0_REGNO+i),
6249 gen_rtx_UNSPEC (CCmode, r, 20));
e35b9579 6250 ndx++;
9ebbca7d
GK
6251 }
6252 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
e35b9579
GK
6253 if (ndx != count)
6254 abort ();
979721f8
MM
6255 }
6256 else
9ebbca7d
GK
6257 for (i = 0; i < 8; i++)
6258 if (regs_ever_live[CR0_REGNO+i] && ! call_used_regs[CR0_REGNO+i])
979721f8 6259 {
9ebbca7d
GK
6260 emit_insn (gen_movsi_to_cr_one (gen_rtx_REG (CCmode,
6261 CR0_REGNO+i),
6262 r12_rtx));
979721f8 6263 }
979721f8
MM
6264 }
6265
9ebbca7d
GK
6266 /* If this is V.4, unwind the stack pointer after all of the loads
6267 have been done. We need to emit a block here so that sched
6268 doesn't decide to move the sp change before the register restores
6269 (which may not have any obvious dependency on the stack). This
6270 doesn't hurt performance, because there is no scheduling that can
6271 be done after this point. */
6272 if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
b6c9286a 6273 {
9ebbca7d
GK
6274 if (frame_reg_rtx != sp_reg_rtx)
6275 rs6000_emit_stack_tie ();
b6c9286a 6276
9ebbca7d 6277 if (use_backchain_to_restore_sp)
b6c9286a 6278 {
9ebbca7d 6279 emit_move_insn (sp_reg_rtx, frame_reg_rtx);
b6c9286a 6280 }
9ebbca7d 6281 else if (sp_offset != 0)
13f1623b 6282 {
9ebbca7d
GK
6283 emit_insn (Pmode == SImode
6284 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx,
6285 GEN_INT (sp_offset))
6286 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx,
6287 GEN_INT (sp_offset)));
13f1623b 6288 }
9ebbca7d 6289 }
b6c9286a 6290
83720594
RH
6291 if (current_function_calls_eh_return)
6292 {
6293 rtx sa = EH_RETURN_STACKADJ_RTX;
6294 emit_insn (Pmode == SImode
6295 ? gen_addsi3 (sp_reg_rtx, sp_reg_rtx, sa)
6296 : gen_adddi3 (sp_reg_rtx, sp_reg_rtx, sa));
6297 }
6298
9ebbca7d
GK
6299 if (!sibcall)
6300 {
6301 rtvec p;
6302 if (! restoring_FPRs_inline)
6303 p = rtvec_alloc (3 + 64 - info->first_fp_reg_save);
6304 else
6305 p = rtvec_alloc (2);
b6c9286a 6306
e35b9579
GK
6307 RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
6308 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
9ebbca7d
GK
6309 gen_rtx_REG (Pmode,
6310 LINK_REGISTER_REGNUM));
9ebbca7d
GK
6311
6312 /* If we have to restore more than two FP registers, branch to the
6313 restore function. It will return to our caller. */
6314 if (! restoring_FPRs_inline)
6315 {
6316 int i;
6317 char rname[30];
520a57c8 6318 const char *alloc_rname;
979721f8 6319
9ebbca7d
GK
6320 sprintf (rname, "%s%d%s", RESTORE_FP_PREFIX,
6321 info->first_fp_reg_save - 32, RESTORE_FP_SUFFIX);
a8a05998 6322 alloc_rname = ggc_strdup (rname);
9ebbca7d
GK
6323 RTVEC_ELT (p, 2) = gen_rtx_USE (VOIDmode,
6324 gen_rtx_SYMBOL_REF (Pmode,
6325 alloc_rname));
b6c9286a 6326
9ebbca7d
GK
6327 for (i = 0; i < 64 - info->first_fp_reg_save; i++)
6328 {
6329 rtx addr, mem;
6330 addr = gen_rtx_PLUS (Pmode, sp_reg_rtx,
6331 GEN_INT (info->fp_save_offset + 8*i));
6332 mem = gen_rtx_MEM (DFmode, addr);
6333 MEM_ALIAS_SET (mem) = rs6000_sr_alias_set;
6334
6335 RTVEC_ELT (p, i+3) =
6336 gen_rtx_SET (VOIDmode,
6337 gen_rtx_REG (DFmode, info->first_fp_reg_save + i),
6338 mem);
b6c9286a
MM
6339 }
6340 }
9ebbca7d
GK
6341
6342 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
3daf36a4 6343 }
9878760c
RK
6344}
6345
6346/* Write function epilogue. */
6347
6348void
6349output_epilog (file, size)
6350 FILE *file;
296b8152 6351 int size ATTRIBUTE_UNUSED;
9878760c 6352{
4697a36c 6353 rs6000_stack_t *info = rs6000_stack_info ();
9878760c 6354
9ebbca7d 6355 if (! HAVE_epilogue)
9878760c 6356 {
9ebbca7d
GK
6357 rtx insn = get_last_insn ();
6358 /* If the last insn was a BARRIER, we don't have to write anything except
6359 the trace table. */
6360 if (GET_CODE (insn) == NOTE)
6361 insn = prev_nonnote_insn (insn);
6362 if (insn == 0 || GET_CODE (insn) != BARRIER)
4697a36c 6363 {
9ebbca7d
GK
6364 /* This is slightly ugly, but at least we don't have two
6365 copies of the epilogue-emitting code. */
6366 start_sequence ();
6367
6368 /* A NOTE_INSN_DELETED is supposed to be at the start
6369 and end of the "toplevel" insn chain. */
6370 emit_note (0, NOTE_INSN_DELETED);
6371 rs6000_emit_epilogue (FALSE);
6372 emit_note (0, NOTE_INSN_DELETED);
6373
6374 if (TARGET_DEBUG_STACK)
6375 debug_rtx_list (get_insns(), 100);
6376 final (get_insns(), file, FALSE, FALSE);
6377 end_sequence ();
4697a36c 6378 }
9878760c 6379 }
b4ac57ab 6380
9b30bae2 6381 /* Output a traceback table here. See /usr/include/sys/debug.h for info
314fc5a9
ILT
6382 on its format.
6383
6384 We don't output a traceback table if -finhibit-size-directive was
6385 used. The documentation for -finhibit-size-directive reads
6386 ``don't output a @code{.size} assembler directive, or anything
6387 else that would cause trouble if the function is split in the
6388 middle, and the two halves are placed at locations far apart in
6389 memory.'' The traceback table has this property, since it
6390 includes the offset from the start of the function to the
4d30c363
MM
6391 traceback table itself.
6392
6393 System V.4 Powerpc's (and the embedded ABI derived from it) use a
b6c9286a
MM
6394 different traceback table. */
6395 if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive)
9b30bae2 6396 {
3cce094d 6397 const char *fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
314fc5a9
ILT
6398 int fixed_parms, float_parms, parm_info;
6399 int i;
6400
b6c9286a
MM
6401 while (*fname == '.') /* V.4 encodes . in the name */
6402 fname++;
6403
314fc5a9
ILT
6404 /* Need label immediately before tbtab, so we can compute its offset
6405 from the function start. */
6406 if (*fname == '*')
6407 ++fname;
6408 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
6409 ASM_OUTPUT_LABEL (file, fname);
6410
6411 /* The .tbtab pseudo-op can only be used for the first eight
6412 expressions, since it can't handle the possibly variable
6413 length fields that follow. However, if you omit the optional
6414 fields, the assembler outputs zeros for all optional fields
6415 anyways, giving each variable length field is minimum length
6416 (as defined in sys/debug.h). Thus we can not use the .tbtab
6417 pseudo-op at all. */
6418
6419 /* An all-zero word flags the start of the tbtab, for debuggers
6420 that have to find it by searching forward from the entry
6421 point or from the current pc. */
19d2d16f 6422 fputs ("\t.long 0\n", file);
314fc5a9
ILT
6423
6424 /* Tbtab format type. Use format type 0. */
19d2d16f 6425 fputs ("\t.byte 0,", file);
314fc5a9
ILT
6426
6427 /* Language type. Unfortunately, there doesn't seem to be any
6428 official way to get this info, so we use language_string. C
6429 is 0. C++ is 9. No number defined for Obj-C, so use the
9517ead8 6430 value for C for now. There is no official value for Java,
6f573ff9
JL
6431 although IBM appears to be using 13. There is no official value
6432 for Chill, so we've choosen 44 pseudo-randomly. */
314fc5a9 6433 if (! strcmp (language_string, "GNU C")
e2c953b6 6434 || ! strcmp (language_string, "GNU Objective-C"))
314fc5a9
ILT
6435 i = 0;
6436 else if (! strcmp (language_string, "GNU F77"))
6437 i = 1;
6438 else if (! strcmp (language_string, "GNU Ada"))
6439 i = 3;
8b83775b 6440 else if (! strcmp (language_string, "GNU Pascal"))
314fc5a9
ILT
6441 i = 2;
6442 else if (! strcmp (language_string, "GNU C++"))
6443 i = 9;
9517ead8
AG
6444 else if (! strcmp (language_string, "GNU Java"))
6445 i = 13;
6f573ff9
JL
6446 else if (! strcmp (language_string, "GNU CHILL"))
6447 i = 44;
314fc5a9
ILT
6448 else
6449 abort ();
6450 fprintf (file, "%d,", i);
6451
6452 /* 8 single bit fields: global linkage (not set for C extern linkage,
6453 apparently a PL/I convention?), out-of-line epilogue/prologue, offset
6454 from start of procedure stored in tbtab, internal function, function
6455 has controlled storage, function has no toc, function uses fp,
6456 function logs/aborts fp operations. */
6457 /* Assume that fp operations are used if any fp reg must be saved. */
4697a36c 6458 fprintf (file, "%d,", (1 << 5) | ((info->first_fp_reg_save != 64) << 1));
314fc5a9
ILT
6459
6460 /* 6 bitfields: function is interrupt handler, name present in
6461 proc table, function calls alloca, on condition directives
6462 (controls stack walks, 3 bits), saves condition reg, saves
6463 link reg. */
6464 /* The `function calls alloca' bit seems to be set whenever reg 31 is
6465 set up as a frame pointer, even when there is no alloca call. */
6466 fprintf (file, "%d,",
6467 ((1 << 6) | (frame_pointer_needed << 5)
4697a36c 6468 | (info->cr_save_p << 1) | (info->lr_save_p)));
314fc5a9
ILT
6469
6470 /* 3 bitfields: saves backchain, spare bit, number of fpr saved
6471 (6 bits). */
6472 fprintf (file, "%d,",
4697a36c 6473 (info->push_p << 7) | (64 - info->first_fp_reg_save));
314fc5a9
ILT
6474
6475 /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits). */
6476 fprintf (file, "%d,", (32 - first_reg_to_save ()));
6477
6478 {
6479 /* Compute the parameter info from the function decl argument
6480 list. */
6481 tree decl;
6482 int next_parm_info_bit;
6483
6484 next_parm_info_bit = 31;
6485 parm_info = 0;
6486 fixed_parms = 0;
6487 float_parms = 0;
6488
6489 for (decl = DECL_ARGUMENTS (current_function_decl);
6490 decl; decl = TREE_CHAIN (decl))
6491 {
6492 rtx parameter = DECL_INCOMING_RTL (decl);
6493 enum machine_mode mode = GET_MODE (parameter);
6494
6495 if (GET_CODE (parameter) == REG)
6496 {
6497 if (GET_MODE_CLASS (mode) == MODE_FLOAT)
6498 {
6499 int bits;
6500
6501 float_parms++;
6502
6503 if (mode == SFmode)
6504 bits = 0x2;
6505 else if (mode == DFmode)
6506 bits = 0x3;
6507 else
6508 abort ();
6509
6510 /* If only one bit will fit, don't or in this entry. */
6511 if (next_parm_info_bit > 0)
6512 parm_info |= (bits << (next_parm_info_bit - 1));
6513 next_parm_info_bit -= 2;
6514 }
6515 else
6516 {
6517 fixed_parms += ((GET_MODE_SIZE (mode)
6518 + (UNITS_PER_WORD - 1))
6519 / UNITS_PER_WORD);
6520 next_parm_info_bit -= 1;
6521 }
6522 }
6523 }
6524 }
6525
6526 /* Number of fixed point parameters. */
6527 /* This is actually the number of words of fixed point parameters; thus
6528 an 8 byte struct counts as 2; and thus the maximum value is 8. */
6529 fprintf (file, "%d,", fixed_parms);
6530
6531 /* 2 bitfields: number of floating point parameters (7 bits), parameters
6532 all on stack. */
6533 /* This is actually the number of fp registers that hold parameters;
6534 and thus the maximum value is 13. */
6535 /* Set parameters on stack bit if parameters are not in their original
6536 registers, regardless of whether they are on the stack? Xlc
6537 seems to set the bit when not optimizing. */
6538 fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
6539
6540 /* Optional fields follow. Some are variable length. */
6541
6542 /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
6543 11 double float. */
6544 /* There is an entry for each parameter in a register, in the order that
6545 they occur in the parameter list. Any intervening arguments on the
6546 stack are ignored. If the list overflows a long (max possible length
6547 34 bits) then completely leave off all elements that don't fit. */
6548 /* Only emit this long if there was at least one parameter. */
6549 if (fixed_parms || float_parms)
6550 fprintf (file, "\t.long %d\n", parm_info);
6551
6552 /* Offset from start of code to tb table. */
19d2d16f 6553 fputs ("\t.long ", file);
314fc5a9 6554 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
9ebbca7d 6555#if TARGET_AIX
314fc5a9 6556 RS6000_OUTPUT_BASENAME (file, fname);
9ebbca7d
GK
6557#else
6558 assemble_name (file, fname);
6559#endif
19d2d16f 6560 fputs ("-.", file);
9ebbca7d 6561#if TARGET_AIX
314fc5a9 6562 RS6000_OUTPUT_BASENAME (file, fname);
9ebbca7d
GK
6563#else
6564 assemble_name (file, fname);
6565#endif
19d2d16f 6566 putc ('\n', file);
314fc5a9
ILT
6567
6568 /* Interrupt handler mask. */
6569 /* Omit this long, since we never set the interrupt handler bit
6570 above. */
6571
6572 /* Number of CTL (controlled storage) anchors. */
6573 /* Omit this long, since the has_ctl bit is never set above. */
6574
6575 /* Displacement into stack of each CTL anchor. */
6576 /* Omit this list of longs, because there are no CTL anchors. */
6577
6578 /* Length of function name. */
296b8152 6579 fprintf (file, "\t.short %d\n", (int) strlen (fname));
314fc5a9
ILT
6580
6581 /* Function name. */
6582 assemble_string (fname, strlen (fname));
6583
6584 /* Register for alloca automatic storage; this is always reg 31.
6585 Only emit this if the alloca bit was set above. */
6586 if (frame_pointer_needed)
19d2d16f 6587 fputs ("\t.byte 31\n", file);
9b30bae2 6588 }
9878760c 6589}
17167fd8
MM
6590\f
6591/* A C compound statement that outputs the assembler code for a thunk function,
6592 used to implement C++ virtual function calls with multiple inheritance. The
6593 thunk acts as a wrapper around a virtual function, adjusting the implicit
6594 object parameter before handing control off to the real function.
6595
6596 First, emit code to add the integer DELTA to the location that contains the
6597 incoming first argument. Assume that this argument contains a pointer, and
6598 is the one used to pass the `this' pointer in C++. This is the incoming
6599 argument *before* the function prologue, e.g. `%o0' on a sparc. The
6600 addition must preserve the values of all other incoming arguments.
6601
6602 After the addition, emit code to jump to FUNCTION, which is a
6603 `FUNCTION_DECL'. This is a direct pure jump, not a call, and does not touch
6604 the return address. Hence returning from FUNCTION will return to whoever
6605 called the current `thunk'.
6606
6607 The effect must be as if FUNCTION had been called directly with the adjusted
6608 first argument. This macro is responsible for emitting all of the code for
6609 a thunk function; `FUNCTION_PROLOGUE' and `FUNCTION_EPILOGUE' are not
6610 invoked.
6611
6612 The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already been
6613 extracted from it.) It might possibly be useful on some targets, but
6614 probably not.
6615
6616 If you do not define this macro, the target-independent code in the C++
6617 frontend will generate a less efficient heavyweight thunk that calls
6618 FUNCTION instead of jumping to it. The generic approach does not support
6619 varargs. */
6620
6621void
6622output_mi_thunk (file, thunk_fndecl, delta, function)
6623 FILE *file;
d330fd93 6624 tree thunk_fndecl ATTRIBUTE_UNUSED;
17167fd8
MM
6625 int delta;
6626 tree function;
6627{
d330fd93
KG
6628 const char *this_reg = reg_names[ aggregate_value_p (TREE_TYPE (TREE_TYPE (function))) ? 4 : 3 ];
6629 const char *prefix;
3cce094d 6630 const char *fname;
d330fd93 6631 const char *r0 = reg_names[0];
d330fd93
KG
6632 const char *toc = reg_names[2];
6633 const char *schain = reg_names[11];
6634 const char *r12 = reg_names[12];
17167fd8
MM
6635 char buf[512];
6636 static int labelno = 0;
6637
6638 /* Small constants that can be done by one add instruction */
6639 if (delta >= -32768 && delta <= 32767)
6640 {
22b4a3b0 6641 if (! TARGET_NEW_MNEMONICS)
17167fd8
MM
6642 fprintf (file, "\tcal %s,%d(%s)\n", this_reg, delta, this_reg);
6643 else
6644 fprintf (file, "\taddi %s,%s,%d\n", this_reg, this_reg, delta);
6645 }
6646
6647 /* Large constants that can be done by one addis instruction */
6648 else if ((delta & 0xffff) == 0 && num_insns_constant_wide (delta) == 1)
6649 asm_fprintf (file, "\t{cau|addis} %s,%s,%d\n", this_reg, this_reg,
6650 delta >> 16);
6651
6652 /* 32-bit constants that can be done by an add and addis instruction. */
6653 else if (TARGET_32BIT || num_insns_constant_wide (delta) == 1)
6654 {
22b4a3b0 6655 /* Break into two pieces, propagating the sign bit from the low word to
17167fd8
MM
6656 the upper word. */
6657 int delta_high = delta >> 16;
6658 int delta_low = delta & 0xffff;
6659 if ((delta_low & 0x8000) != 0)
6660 {
6661 delta_high++;
6662 delta_low = (delta_low ^ 0x8000) - 0x8000; /* sign extend */
6663 }
6664
6665 asm_fprintf (file, "\t{cau|addis} %s,%s,%d\n", this_reg, this_reg,
6666 delta_high);
6667
22b4a3b0 6668 if (! TARGET_NEW_MNEMONICS)
17167fd8
MM
6669 fprintf (file, "\tcal %s,%d(%s)\n", this_reg, delta_low, this_reg);
6670 else
6671 fprintf (file, "\taddi %s,%s,%d\n", this_reg, this_reg, delta_low);
6672 }
6673
6674 /* 64-bit constants, fixme */
6675 else
6676 abort ();
6677
6678 /* Get the prefix in front of the names. */
6679 switch (DEFAULT_ABI)
6680 {
6681 default:
6682 abort ();
6683
6684 case ABI_AIX:
6685 prefix = ".";
6686 break;
6687
6688 case ABI_V4:
6689 case ABI_AIX_NODESC:
6690 case ABI_SOLARIS:
6691 prefix = "";
6692 break;
17167fd8
MM
6693 }
6694
6695 /* If the function is compiled in this module, jump to it directly.
6696 Otherwise, load up its address and jump to it. */
6697
6698 fname = XSTR (XEXP (DECL_RTL (function), 0), 0);
42820a49 6699
9ebbca7d 6700 if (current_file_function_operand (XEXP (DECL_RTL (function), 0), VOIDmode)
22b4a3b0
FS
6701 && ! lookup_attribute ("longcall",
6702 TYPE_ATTRIBUTES (TREE_TYPE (function))))
17167fd8
MM
6703 {
6704 fprintf (file, "\tb %s", prefix);
6705 assemble_name (file, fname);
22b4a3b0 6706 if (DEFAULT_ABI == ABI_V4 && flag_pic) fputs ("@local", file);
949ea356 6707 putc ('\n', file);
17167fd8
MM
6708 }
6709
6710 else
6711 {
6712 switch (DEFAULT_ABI)
6713 {
6714 default:
17167fd8
MM
6715 abort ();
6716
6717 case ABI_AIX:
6718 /* Set up a TOC entry for the function. */
6719 ASM_GENERATE_INTERNAL_LABEL (buf, "Lthunk", labelno);
6720 toc_section ();
6721 ASM_OUTPUT_INTERNAL_LABEL (file, "Lthunk", labelno);
6722 labelno++;
6723
6724 /* Note, MINIMAL_TOC doesn't make sense in the case of a thunk, since
6725 there will be only one TOC entry for this function. */
6726 fputs ("\t.tc\t", file);
6727 assemble_name (file, buf);
6728 fputs ("[TC],", file);
6729 assemble_name (file, buf);
6730 putc ('\n', file);
6731 text_section ();
6732 asm_fprintf (file, (TARGET_32BIT) ? "\t{l|lwz} %s," : "\tld %s", r12);
6733 assemble_name (file, buf);
6734 asm_fprintf (file, "(%s)\n", reg_names[2]);
6735 asm_fprintf (file,
6736 (TARGET_32BIT) ? "\t{l|lwz} %s,0(%s)\n" : "\tld %s,0(%s)\n",
6737 r0, r12);
6738
6739 asm_fprintf (file,
6740 (TARGET_32BIT) ? "\t{l|lwz} %s,4(%s)\n" : "\tld %s,8(%s)\n",
6741 toc, r12);
6742
6743 asm_fprintf (file, "\tmtctr %s\n", r0);
6744 asm_fprintf (file,
6745 (TARGET_32BIT) ? "\t{l|lwz} %s,8(%s)\n" : "\tld %s,16(%s)\n",
6746 schain, r12);
6747
6748 asm_fprintf (file, "\tbctr\n");
6749 break;
6750
9ebbca7d
GK
6751 case ABI_AIX_NODESC:
6752 case ABI_SOLARIS:
17167fd8 6753 case ABI_V4:
22b4a3b0
FS
6754 fprintf (file, "\tb %s", prefix);
6755 assemble_name (file, fname);
6756 if (flag_pic) fputs ("@plt", file);
949ea356 6757 putc ('\n', file);
22b4a3b0 6758 break;
ee890fe2
SS
6759
6760#if TARGET_MACHO
6761 case ABI_DARWIN:
6762 fprintf (file, "\tb %s", prefix);
6763 if (flag_pic && !machopic_name_defined_p (fname))
6764 assemble_name (file, machopic_stub_name (fname));
6765 else
6766 assemble_name (file, fname);
6767 putc ('\n', file);
6768 break;
6769#endif
9ebbca7d
GK
6770 }
6771 }
6772}
42820a49 6773
9ebbca7d
GK
6774\f
6775/* A quick summary of the various types of 'constant-pool tables'
6776 under PowerPC:
6777
6778 Target Flags Name One table per
6779 AIX (none) AIX TOC object file
6780 AIX -mfull-toc AIX TOC object file
6781 AIX -mminimal-toc AIX minimal TOC translation unit
6782 SVR4/EABI (none) SVR4 SDATA object file
6783 SVR4/EABI -fpic SVR4 pic object file
6784 SVR4/EABI -fPIC SVR4 PIC translation unit
6785 SVR4/EABI -mrelocatable EABI TOC function
6786 SVR4/EABI -maix AIX TOC object file
6787 SVR4/EABI -maix -mminimal-toc
6788 AIX minimal TOC translation unit
6789
6790 Name Reg. Set by entries contains:
6791 made by addrs? fp? sum?
6792
6793 AIX TOC 2 crt0 as Y option option
6794 AIX minimal TOC 30 prolog gcc Y Y option
6795 SVR4 SDATA 13 crt0 gcc N Y N
6796 SVR4 pic 30 prolog ld Y not yet N
6797 SVR4 PIC 30 prolog gcc Y option option
6798 EABI TOC 30 prolog gcc Y option option
6799
6800*/
6801
6802/* Hash table stuff for keeping track of TOC entries. */
6803
6804struct toc_hash_struct
6805{
6806 /* `key' will satisfy CONSTANT_P; in fact, it will satisfy
6807 ASM_OUTPUT_SPECIAL_POOL_ENTRY_P. */
6808 rtx key;
a9098fd0 6809 enum machine_mode key_mode;
9ebbca7d
GK
6810 int labelno;
6811};
17167fd8 6812
9ebbca7d
GK
6813static htab_t toc_hash_table;
6814
6815/* Hash functions for the hash table. */
6816
6817static unsigned
6818rs6000_hash_constant (k)
6819 rtx k;
6820{
a9098fd0 6821 unsigned result = (GET_CODE (k) << 3) ^ GET_MODE (k);
9ebbca7d
GK
6822 const char *format = GET_RTX_FORMAT (GET_CODE (k));
6823 int flen = strlen (format);
6824 int fidx;
6825
6826 if (GET_CODE (k) == LABEL_REF)
832ea3b3 6827 return result * 1231 + X0INT (XEXP (k, 0), 3);
9ebbca7d
GK
6828
6829 if (GET_CODE (k) == CONST_DOUBLE)
6830 fidx = 2;
6831 else if (GET_CODE (k) == CODE_LABEL)
6832 fidx = 3;
6833 else
6834 fidx = 0;
6835
6836 for (; fidx < flen; fidx++)
6837 switch (format[fidx])
6838 {
6839 case 's':
6840 {
6841 unsigned i, len;
6842 const char *str = XSTR (k, fidx);
6843 len = strlen (str);
6844 result = result * 613 + len;
6845 for (i = 0; i < len; i++)
6846 result = result * 613 + (unsigned) str[i];
17167fd8
MM
6847 break;
6848 }
9ebbca7d
GK
6849 case 'u':
6850 case 'e':
6851 result = result * 1231 + rs6000_hash_constant (XEXP (k, fidx));
6852 break;
6853 case 'i':
6854 case 'n':
6855 result = result * 613 + (unsigned) XINT (k, fidx);
6856 break;
6857 case 'w':
6858 if (sizeof (unsigned) >= sizeof (HOST_WIDE_INT))
6859 result = result * 613 + (unsigned) XWINT (k, fidx);
6860 else
6861 {
6862 size_t i;
6863 for (i = 0; i < sizeof(HOST_WIDE_INT)/sizeof(unsigned); i++)
6864 result = result * 613 + (unsigned) (XWINT (k, fidx)
6865 >> CHAR_BIT * i);
6866 }
6867 break;
6868 default:
6869 abort();
6870 }
6871 return result;
6872}
6873
6874static unsigned
6875toc_hash_function (hash_entry)
6876 const void * hash_entry;
6877{
a9098fd0
GK
6878 const struct toc_hash_struct *thc =
6879 (const struct toc_hash_struct *) hash_entry;
6880 return rs6000_hash_constant (thc->key) ^ thc->key_mode;
9ebbca7d
GK
6881}
6882
6883/* Compare H1 and H2 for equivalence. */
6884
6885static int
6886toc_hash_eq (h1, h2)
6887 const void * h1;
6888 const void * h2;
6889{
6890 rtx r1 = ((const struct toc_hash_struct *) h1)->key;
6891 rtx r2 = ((const struct toc_hash_struct *) h2)->key;
6892
a9098fd0
GK
6893 if (((const struct toc_hash_struct *) h1)->key_mode
6894 != ((const struct toc_hash_struct *) h2)->key_mode)
6895 return 0;
6896
9ebbca7d
GK
6897 /* Gotcha: One of these const_doubles will be in memory.
6898 The other may be on the constant-pool chain.
6899 So rtx_equal_p will think they are different... */
6900 if (r1 == r2)
6901 return 1;
6902 if (GET_CODE (r1) != GET_CODE (r2)
6903 || GET_MODE (r1) != GET_MODE (r2))
6904 return 0;
6905 if (GET_CODE (r1) == CONST_DOUBLE)
6906 {
6907 int format_len = strlen (GET_RTX_FORMAT (CONST_DOUBLE));
6908 int i;
6909 for (i = 2; i < format_len; i++)
6910 if (XWINT (r1, i) != XWINT (r2, i))
6911 return 0;
6912
6913 return 1;
17167fd8 6914 }
9ebbca7d 6915 else if (GET_CODE (r1) == LABEL_REF)
e4a0656f
GK
6916 return (CODE_LABEL_NUMBER (XEXP (r1, 0))
6917 == CODE_LABEL_NUMBER (XEXP (r2, 0)));
9ebbca7d
GK
6918 else
6919 return rtx_equal_p (r1, r2);
6920}
6921
6922/* Mark the hash table-entry HASH_ENTRY. */
6923
6924static int
6925toc_hash_mark_entry (hash_slot, unused)
2eba1afa 6926 void ** hash_slot;
9ebbca7d
GK
6927 void * unused ATTRIBUTE_UNUSED;
6928{
6929 const struct toc_hash_struct * hash_entry =
6930 *(const struct toc_hash_struct **) hash_slot;
6931 rtx r = hash_entry->key;
6932 ggc_set_mark (hash_entry);
6933 /* For CODE_LABELS, we don't want to drag in the whole insn chain... */
6934 if (GET_CODE (r) == LABEL_REF)
6935 {
6936 ggc_set_mark (r);
6937 ggc_set_mark (XEXP (r, 0));
6938 }
6939 else
6940 ggc_mark_rtx (r);
6941 return 1;
6942}
6943
6944/* Mark all the elements of the TOC hash-table *HT. */
6945
6946static void
6947toc_hash_mark_table (vht)
6948 void *vht;
6949{
6950 htab_t *ht = vht;
6951
6952 htab_traverse (*ht, toc_hash_mark_entry, (void *)0);
17167fd8
MM
6953}
6954
28e510bd
MM
6955/* These are the names given by the C++ front-end to vtables, and
6956 vtable-like objects. Ideally, this logic should not be here;
6957 instead, there should be some programmatic way of inquiring as
6958 to whether or not an object is a vtable. */
6959
6960#define VTABLE_NAME_P(NAME) \
6961 (strncmp ("_vt.", name, strlen("_vt.")) == 0 \
6962 || strncmp ("_ZTV", name, strlen ("_ZTV")) == 0 \
6963 || strncmp ("_ZTT", name, strlen ("_ZTT")) == 0 \
6964 || strncmp ("_ZTC", name, strlen ("_ZTC")) == 0)
6965
6966void
6967rs6000_output_symbol_ref (file, x)
6968 FILE *file;
6969 rtx x;
6970{
6971 /* Currently C++ toc references to vtables can be emitted before it
6972 is decided whether the vtable is public or private. If this is
6973 the case, then the linker will eventually complain that there is
6974 a reference to an unknown section. Thus, for vtables only,
6975 we emit the TOC reference to reference the symbol and not the
6976 section. */
6977 const char *name = XSTR (x, 0);
6978
6979 if (VTABLE_NAME_P (name))
6980 {
6981 RS6000_OUTPUT_BASENAME (file, name);
6982 }
6983 else
6984 assemble_name (file, name);
6985}
6986
9878760c
RK
6987/* Output a TOC entry. We derive the entry name from what is
6988 being written. */
6989
6990void
a9098fd0 6991output_toc (file, x, labelno, mode)
9878760c
RK
6992 FILE *file;
6993 rtx x;
6994 int labelno;
a9098fd0 6995 enum machine_mode mode;
9878760c
RK
6996{
6997 char buf[256];
3cce094d 6998 const char *name = buf;
ec940faa 6999 const char *real_name;
9878760c
RK
7000 rtx base = x;
7001 int offset = 0;
7002
4697a36c
MM
7003 if (TARGET_NO_TOC)
7004 abort ();
7005
9ebbca7d
GK
7006 /* When the linker won't eliminate them, don't output duplicate
7007 TOC entries (this happens on AIX if there is any kind of TOC,
1f8f4a0b
MM
7008 and on SVR4 under -fPIC or -mrelocatable). */
7009 if (TARGET_TOC)
9ebbca7d
GK
7010 {
7011 struct toc_hash_struct *h;
7012 void * * found;
7013
7014 h = ggc_alloc (sizeof (*h));
7015 h->key = x;
a9098fd0 7016 h->key_mode = mode;
9ebbca7d
GK
7017 h->labelno = labelno;
7018
7019 found = htab_find_slot (toc_hash_table, h, 1);
7020 if (*found == NULL)
7021 *found = h;
7022 else /* This is indeed a duplicate.
7023 Set this label equal to that label. */
7024 {
7025 fputs ("\t.set ", file);
7026 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
7027 fprintf (file, "%d,", labelno);
7028 ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LC");
7029 fprintf (file, "%d\n", ((*(const struct toc_hash_struct **)
7030 found)->labelno));
7031 return;
7032 }
7033 }
7034
7035 /* If we're going to put a double constant in the TOC, make sure it's
7036 aligned properly when strict alignment is on. */
ff1720ed
RK
7037 if (GET_CODE (x) == CONST_DOUBLE
7038 && STRICT_ALIGNMENT
a9098fd0 7039 && GET_MODE_BITSIZE (mode) >= 64
ff1720ed
RK
7040 && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC)) {
7041 ASM_OUTPUT_ALIGN (file, 3);
7042 }
7043
9ebbca7d 7044 ASM_OUTPUT_INTERNAL_LABEL (file, "LC", labelno);
9878760c 7045
37c37a57
RK
7046 /* Handle FP constants specially. Note that if we have a minimal
7047 TOC, things we put here aren't actually in the TOC, so we can allow
7048 FP constants. */
a9098fd0 7049 if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
9878760c 7050 {
042259f2
DE
7051 REAL_VALUE_TYPE rv;
7052 long k[2];
0adc764e 7053
042259f2
DE
7054 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
7055 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
31bfaa0b 7056
13ded975
DE
7057 if (TARGET_64BIT)
7058 {
7059 if (TARGET_MINIMAL_TOC)
7060 fprintf (file, "\t.llong 0x%lx%08lx\n", k[0], k[1]);
7061 else
7062 fprintf (file, "\t.tc FD_%lx_%lx[TC],0x%lx%08lx\n",
0858c623 7063 k[0], k[1], k[0] & 0xffffffff, k[1] & 0xffffffff);
13ded975
DE
7064 return;
7065 }
1875cc88 7066 else
13ded975
DE
7067 {
7068 if (TARGET_MINIMAL_TOC)
31bfaa0b 7069 fprintf (file, "\t.long 0x%lx\n\t.long 0x%lx\n", k[0], k[1]);
13ded975 7070 else
31bfaa0b 7071 fprintf (file, "\t.tc FD_%lx_%lx[TC],0x%lx,0x%lx\n",
13ded975
DE
7072 k[0], k[1], k[0], k[1]);
7073 return;
7074 }
9878760c 7075 }
a9098fd0 7076 else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
9878760c 7077 {
042259f2
DE
7078 REAL_VALUE_TYPE rv;
7079 long l;
9878760c 7080
042259f2
DE
7081 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
7082 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
7083
31bfaa0b
DE
7084 if (TARGET_64BIT)
7085 {
7086 if (TARGET_MINIMAL_TOC)
7087 fprintf (file, "\t.llong 0x%lx00000000\n", l);
7088 else
7089 fprintf (file, "\t.tc FS_%lx[TC],0x%lx00000000\n", l, l);
7090 return;
7091 }
042259f2 7092 else
31bfaa0b
DE
7093 {
7094 if (TARGET_MINIMAL_TOC)
7095 fprintf (file, "\t.long 0x%lx\n", l);
7096 else
7097 fprintf (file, "\t.tc FS_%lx[TC],0x%lx\n", l, l);
7098 return;
7099 }
042259f2 7100 }
f176e826 7101 else if (GET_MODE (x) == VOIDmode
a9098fd0 7102 && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
042259f2 7103 {
e2c953b6 7104 unsigned HOST_WIDE_INT low;
042259f2
DE
7105 HOST_WIDE_INT high;
7106
7107 if (GET_CODE (x) == CONST_DOUBLE)
7108 {
7109 low = CONST_DOUBLE_LOW (x);
7110 high = CONST_DOUBLE_HIGH (x);
7111 }
7112 else
7113#if HOST_BITS_PER_WIDE_INT == 32
7114 {
7115 low = INTVAL (x);
0858c623 7116 high = (low & 0x80000000) ? ~0 : 0;
042259f2
DE
7117 }
7118#else
7119 {
0858c623 7120 low = INTVAL (x) & 0xffffffff;
042259f2
DE
7121 high = (HOST_WIDE_INT) INTVAL (x) >> 32;
7122 }
7123#endif
9878760c 7124
a9098fd0
GK
7125 /* TOC entries are always Pmode-sized, but since this
7126 is a bigendian machine then if we're putting smaller
7127 integer constants in the TOC we have to pad them.
7128 (This is still a win over putting the constants in
7129 a separate constant pool, because then we'd have
02a4ec28
FS
7130 to have both a TOC entry _and_ the actual constant.)
7131
7132 For a 32-bit target, CONST_INT values are loaded and shifted
7133 entirely within `low' and can be stored in one TOC entry. */
7134
7135 if (TARGET_64BIT && POINTER_SIZE < GET_MODE_BITSIZE (mode))
a9098fd0 7136 abort ();/* It would be easy to make this work, but it doesn't now. */
02a4ec28
FS
7137
7138 if (POINTER_SIZE > GET_MODE_BITSIZE (mode))
a9098fd0
GK
7139 lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
7140 POINTER_SIZE, &low, &high, 0);
7141
13ded975
DE
7142 if (TARGET_64BIT)
7143 {
7144 if (TARGET_MINIMAL_TOC)
7145 fprintf (file, "\t.llong 0x%lx%08lx\n", (long)high, (long)low);
7146 else
7147 fprintf (file, "\t.tc ID_%lx_%lx[TC],0x%lx%08lx\n",
7148 (long)high, (long)low, (long)high, (long)low);
7149 return;
7150 }
1875cc88 7151 else
13ded975 7152 {
02a4ec28
FS
7153 if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
7154 {
7155 if (TARGET_MINIMAL_TOC)
7156 fprintf (file, "\t.long 0x%lx\n\t.long 0x%lx\n",
7157 (long)high, (long)low);
7158 else
7159 fprintf (file, "\t.tc ID_%lx_%lx[TC],0x%lx,0x%lx\n",
7160 (long)high, (long)low, (long)high, (long)low);
7161 }
13ded975 7162 else
02a4ec28
FS
7163 {
7164 if (TARGET_MINIMAL_TOC)
7165 fprintf (file, "\t.long 0x%lx\n",
7166 (long)low);
7167 else
7168 fprintf (file, "\t.tc IS_%lx[TC],0x%lx\n",
7169 (long)low, (long)low);
7170 }
13ded975
DE
7171 return;
7172 }
9878760c
RK
7173 }
7174
7175 if (GET_CODE (x) == CONST)
7176 {
7177 base = XEXP (XEXP (x, 0), 0);
7178 offset = INTVAL (XEXP (XEXP (x, 0), 1));
7179 }
7180
7181 if (GET_CODE (base) == SYMBOL_REF)
7182 name = XSTR (base, 0);
7183 else if (GET_CODE (base) == LABEL_REF)
7184 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (XEXP (base, 0)));
7185 else if (GET_CODE (base) == CODE_LABEL)
7186 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
7187 else
7188 abort ();
7189
2e4eb9b0 7190 STRIP_NAME_ENCODING (real_name, name);
1875cc88 7191 if (TARGET_MINIMAL_TOC)
13ded975 7192 fputs (TARGET_32BIT ? "\t.long " : "\t.llong ", file);
1875cc88
JW
7193 else
7194 {
b6c9286a 7195 fprintf (file, "\t.tc %s", real_name);
9878760c 7196
1875cc88
JW
7197 if (offset < 0)
7198 fprintf (file, ".N%d", - offset);
7199 else if (offset)
7200 fprintf (file, ".P%d", offset);
9878760c 7201
19d2d16f 7202 fputs ("[TC],", file);
1875cc88 7203 }
581bc4de
MM
7204
7205 /* Currently C++ toc references to vtables can be emitted before it
7206 is decided whether the vtable is public or private. If this is
7207 the case, then the linker will eventually complain that there is
7208 a TOC reference to an unknown section. Thus, for vtables only,
7209 we emit the TOC reference to reference the symbol and not the
7210 section. */
28e510bd 7211 if (VTABLE_NAME_P (name))
581bc4de 7212 {
89c01f0e 7213 RS6000_OUTPUT_BASENAME (file, name);
581bc4de
MM
7214 if (offset < 0)
7215 fprintf (file, "%d", offset);
7216 else if (offset > 0)
7217 fprintf (file, "+%d", offset);
7218 }
7219 else
7220 output_addr_const (file, x);
19d2d16f 7221 putc ('\n', file);
9878760c
RK
7222}
7223\f
7224/* Output an assembler pseudo-op to write an ASCII string of N characters
7225 starting at P to FILE.
7226
7227 On the RS/6000, we have to do this using the .byte operation and
7228 write out special characters outside the quoted string.
7229 Also, the assembler is broken; very long strings are truncated,
7230 so we must artificially break them up early. */
7231
7232void
7233output_ascii (file, p, n)
7234 FILE *file;
d330fd93 7235 const char *p;
9878760c
RK
7236 int n;
7237{
7238 char c;
7239 int i, count_string;
d330fd93
KG
7240 const char *for_string = "\t.byte \"";
7241 const char *for_decimal = "\t.byte ";
7242 const char *to_close = NULL;
9878760c
RK
7243
7244 count_string = 0;
7245 for (i = 0; i < n; i++)
7246 {
7247 c = *p++;
7248 if (c >= ' ' && c < 0177)
7249 {
7250 if (for_string)
7251 fputs (for_string, file);
7252 putc (c, file);
7253
7254 /* Write two quotes to get one. */
7255 if (c == '"')
7256 {
7257 putc (c, file);
7258 ++count_string;
7259 }
7260
7261 for_string = NULL;
7262 for_decimal = "\"\n\t.byte ";
7263 to_close = "\"\n";
7264 ++count_string;
7265
7266 if (count_string >= 512)
7267 {
7268 fputs (to_close, file);
7269
7270 for_string = "\t.byte \"";
7271 for_decimal = "\t.byte ";
7272 to_close = NULL;
7273 count_string = 0;
7274 }
7275 }
7276 else
7277 {
7278 if (for_decimal)
7279 fputs (for_decimal, file);
7280 fprintf (file, "%d", c);
7281
7282 for_string = "\n\t.byte \"";
7283 for_decimal = ", ";
7284 to_close = "\n";
7285 count_string = 0;
7286 }
7287 }
7288
7289 /* Now close the string if we have written one. Then end the line. */
7290 if (to_close)
9ebbca7d 7291 fputs (to_close, file);
9878760c
RK
7292}
7293\f
7294/* Generate a unique section name for FILENAME for a section type
7295 represented by SECTION_DESC. Output goes into BUF.
7296
7297 SECTION_DESC can be any string, as long as it is different for each
7298 possible section type.
7299
7300 We name the section in the same manner as xlc. The name begins with an
7301 underscore followed by the filename (after stripping any leading directory
11e5fe42
RK
7302 names) with the last period replaced by the string SECTION_DESC. If
7303 FILENAME does not contain a period, SECTION_DESC is appended to the end of
7304 the name. */
9878760c
RK
7305
7306void
7307rs6000_gen_section_name (buf, filename, section_desc)
7308 char **buf;
9ebbca7d
GK
7309 const char *filename;
7310 const char *section_desc;
9878760c 7311{
9ebbca7d 7312 const char *q, *after_last_slash, *last_period = 0;
9878760c
RK
7313 char *p;
7314 int len;
9878760c
RK
7315
7316 after_last_slash = filename;
7317 for (q = filename; *q; q++)
11e5fe42
RK
7318 {
7319 if (*q == '/')
7320 after_last_slash = q + 1;
7321 else if (*q == '.')
7322 last_period = q;
7323 }
9878760c 7324
11e5fe42 7325 len = strlen (after_last_slash) + strlen (section_desc) + 2;
9878760c
RK
7326 *buf = (char *) permalloc (len);
7327
7328 p = *buf;
7329 *p++ = '_';
7330
7331 for (q = after_last_slash; *q; q++)
7332 {
11e5fe42 7333 if (q == last_period)
9878760c
RK
7334 {
7335 strcpy (p, section_desc);
7336 p += strlen (section_desc);
9878760c
RK
7337 }
7338
e9a780ec 7339 else if (ISALNUM (*q))
9878760c
RK
7340 *p++ = *q;
7341 }
7342
11e5fe42 7343 if (last_period == 0)
9878760c
RK
7344 strcpy (p, section_desc);
7345 else
7346 *p = '\0';
7347}
e165f3f0 7348\f
411707f4
CC
7349
7350/* Emit profile function. */
7351void
7352output_profile_hook (labelno)
7353 int labelno;
7354{
8480e480
CC
7355 if (DEFAULT_ABI == ABI_AIX)
7356 {
7357 char buf[30];
7358 char *label_name;
7359 rtx fun;
411707f4 7360
8480e480 7361 labelno += 1;
411707f4 7362
8480e480
CC
7363 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
7364 STRIP_NAME_ENCODING (label_name, ggc_strdup (buf));
7365 fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
411707f4 7366
8480e480
CC
7367 emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 1,
7368 fun, Pmode);
7369 }
ee890fe2
SS
7370 else if (DEFAULT_ABI == ABI_DARWIN)
7371 {
d5fa86ba 7372 const char *mcount_name = RS6000_MCOUNT;
ee890fe2
SS
7373 int caller_addr_regno = LINK_REGISTER_REGNUM;
7374
7375 /* Be conservative and always set this, at least for now. */
7376 current_function_uses_pic_offset_table = 1;
7377
7378#if TARGET_MACHO
7379 /* For PIC code, set up a stub and collect the caller's address
7380 from r0, which is where the prologue puts it. */
7381 if (flag_pic)
7382 {
7383 mcount_name = machopic_stub_name (mcount_name);
7384 if (current_function_uses_pic_offset_table)
7385 caller_addr_regno = 0;
7386 }
7387#endif
7388 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
7389 0, VOIDmode, 1,
7390 gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
7391 }
411707f4
CC
7392}
7393
e165f3f0
RK
7394/* Write function profiler code. */
7395
7396void
7397output_function_profiler (file, labelno)
7398 FILE *file;
7399 int labelno;
7400{
3daf36a4 7401 char buf[100];
e165f3f0 7402
3daf36a4 7403 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
38c1f2d7 7404 switch (DEFAULT_ABI)
3daf36a4 7405 {
38c1f2d7
MM
7406 default:
7407 abort ();
7408
7409 case ABI_V4:
7410 case ABI_SOLARIS:
7411 case ABI_AIX_NODESC:
7412 fprintf (file, "\tmflr %s\n", reg_names[0]);
7413 if (flag_pic == 1)
7414 {
dfdfa60f
DE
7415 fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
7416 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
7417 reg_names[0], reg_names[1]);
17167fd8 7418 asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
dfdfa60f 7419 asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
38c1f2d7 7420 assemble_name (file, buf);
17167fd8 7421 asm_fprintf (file, "@got(%s)\n", reg_names[12]);
38c1f2d7 7422 }
9ebbca7d 7423 else if (flag_pic > 1)
38c1f2d7 7424 {
dfdfa60f
DE
7425 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
7426 reg_names[0], reg_names[1]);
9ebbca7d
GK
7427 /* Now, we need to get the address of the label. */
7428 fputs ("\tbl 1f\n\t.long ", file);
034e84c4 7429 assemble_name (file, buf);
9ebbca7d
GK
7430 fputs ("-.\n1:", file);
7431 asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
7432 asm_fprintf (file, "\t{l|lwz} %s,0(%s)\n",
7433 reg_names[0], reg_names[11]);
7434 asm_fprintf (file, "\t{cax|add} %s,%s,%s\n",
7435 reg_names[0], reg_names[0], reg_names[11]);
38c1f2d7 7436 }
38c1f2d7
MM
7437 else
7438 {
17167fd8 7439 asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
38c1f2d7 7440 assemble_name (file, buf);
dfdfa60f 7441 fputs ("@ha\n", file);
b5253831
DE
7442 asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
7443 reg_names[0], reg_names[1]);
a260abc9 7444 asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
38c1f2d7 7445 assemble_name (file, buf);
17167fd8 7446 asm_fprintf (file, "@l(%s)\n", reg_names[12]);
38c1f2d7
MM
7447 }
7448
b5253831
DE
7449 if (current_function_needs_context)
7450 asm_fprintf (file, "\tmr %s,%s\n",
7451 reg_names[30], reg_names[STATIC_CHAIN_REGNUM]);
38c1f2d7 7452 fprintf (file, "\tbl %s\n", RS6000_MCOUNT);
b5253831
DE
7453 if (current_function_needs_context)
7454 asm_fprintf (file, "\tmr %s,%s\n",
7455 reg_names[STATIC_CHAIN_REGNUM], reg_names[30]);
38c1f2d7
MM
7456 break;
7457
7458 case ABI_AIX:
ee890fe2 7459 case ABI_DARWIN:
411707f4 7460 /* Don't do anything, done in output_profile_hook (). */
38c1f2d7 7461 break;
411707f4 7462
38c1f2d7 7463 }
e165f3f0 7464}
a251ffd0
TG
7465
7466/* Adjust the cost of a scheduling dependency. Return the new cost of
7467 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
7468
7469int
a06faf84 7470rs6000_adjust_cost (insn, link, dep_insn, cost)
a251ffd0
TG
7471 rtx insn;
7472 rtx link;
296b8152 7473 rtx dep_insn ATTRIBUTE_UNUSED;
a251ffd0
TG
7474 int cost;
7475{
7476 if (! recog_memoized (insn))
7477 return 0;
7478
7479 if (REG_NOTE_KIND (link) != 0)
7480 return 0;
7481
7482 if (REG_NOTE_KIND (link) == 0)
7483 {
7484 /* Data dependency; DEP_INSN writes a register that INSN reads some
7485 cycles later. */
7486
7487 /* Tell the first scheduling pass about the latency between a mtctr
7488 and bctr (and mtlr and br/blr). The first scheduling pass will not
7489 know about this latency since the mtctr instruction, which has the
7490 latency associated to it, will be generated by reload. */
7491 if (get_attr_type (insn) == TYPE_JMPREG)
7492 return TARGET_POWER ? 5 : 4;
7493
7494 /* Fall out to return default cost. */
7495 }
7496
7497 return cost;
7498}
b6c9286a 7499
bef84347
VM
7500/* A C statement (sans semicolon) to update the integer scheduling priority
7501 INSN_PRIORITY (INSN). Reduce the priority to execute the INSN earlier,
7502 increase the priority to execute INSN later. Do not define this macro if
7503 you do not need to adjust the scheduling priorities of insns. */
7504
7505int
7506rs6000_adjust_priority (insn, priority)
d330fd93 7507 rtx insn ATTRIBUTE_UNUSED;
bef84347
VM
7508 int priority;
7509{
7510 /* On machines (like the 750) which have asymetric integer units, where one
7511 integer unit can do multiply and divides and the other can't, reduce the
7512 priority of multiply/divide so it is scheduled before other integer
7513 operationss. */
7514
7515#if 0
2c3c49de 7516 if (! INSN_P (insn))
bef84347
VM
7517 return priority;
7518
7519 if (GET_CODE (PATTERN (insn)) == USE)
7520 return priority;
7521
7522 switch (rs6000_cpu_attr) {
7523 case CPU_PPC750:
7524 switch (get_attr_type (insn))
7525 {
7526 default:
7527 break;
7528
7529 case TYPE_IMUL:
7530 case TYPE_IDIV:
3cb999d8
DE
7531 fprintf (stderr, "priority was %#x (%d) before adjustment\n",
7532 priority, priority);
bef84347
VM
7533 if (priority >= 0 && priority < 0x01000000)
7534 priority >>= 3;
7535 break;
7536 }
7537 }
7538#endif
7539
7540 return priority;
7541}
7542
b6c9286a
MM
7543/* Return how many instructions the machine can issue per cycle */
7544int get_issue_rate()
7545{
7546 switch (rs6000_cpu_attr) {
3cb999d8
DE
7547 case CPU_RIOS1: /* ? */
7548 case CPU_RS64A:
7549 case CPU_PPC601: /* ? */
7550 return 3;
b6c9286a 7551 case CPU_PPC603:
bef84347
VM
7552 case CPU_PPC750:
7553 return 2;
3cb999d8 7554 case CPU_RIOS2:
b6c9286a 7555 case CPU_PPC604:
19684119 7556 case CPU_PPC604E:
b6c9286a 7557 case CPU_PPC620:
3cb999d8 7558 case CPU_PPC630:
b6c9286a
MM
7559 return 4;
7560 default:
7561 return 1;
7562 }
7563}
7564
b6c9286a 7565\f
b6c9286a
MM
7566/* Length in units of the trampoline for entering a nested function. */
7567
7568int
7569rs6000_trampoline_size ()
7570{
7571 int ret = 0;
7572
7573 switch (DEFAULT_ABI)
7574 {
7575 default:
7576 abort ();
7577
7578 case ABI_AIX:
8f802bfb 7579 ret = (TARGET_32BIT) ? 12 : 24;
b6c9286a
MM
7580 break;
7581
7582 case ABI_V4:
c81bebd7 7583 case ABI_SOLARIS:
b6c9286a 7584 case ABI_AIX_NODESC:
03a7e1a5 7585 ret = (TARGET_32BIT) ? 40 : 48;
b6c9286a 7586 break;
b6c9286a
MM
7587 }
7588
7589 return ret;
7590}
7591
7592/* Emit RTL insns to initialize the variable parts of a trampoline.
7593 FNADDR is an RTX for the address of the function's pure code.
7594 CXT is an RTX for the static chain value for the function. */
7595
7596void
7597rs6000_initialize_trampoline (addr, fnaddr, cxt)
7598 rtx addr;
7599 rtx fnaddr;
7600 rtx cxt;
7601{
ac2a93a1 7602 enum machine_mode pmode = Pmode;
8bd04c56
MM
7603 int regsize = (TARGET_32BIT) ? 4 : 8;
7604 rtx ctx_reg = force_reg (pmode, cxt);
b6c9286a
MM
7605
7606 switch (DEFAULT_ABI)
7607 {
7608 default:
7609 abort ();
7610
8bd04c56 7611/* Macros to shorten the code expansions below. */
39403d82 7612#define MEM_DEREF(addr) gen_rtx_MEM (pmode, memory_address (pmode, addr))
c5c76735
JL
7613#define MEM_PLUS(addr,offset) \
7614 gen_rtx_MEM (pmode, memory_address (pmode, plus_constant (addr, offset)))
7c59dc5d 7615
b6c9286a
MM
7616 /* Under AIX, just build the 3 word function descriptor */
7617 case ABI_AIX:
8bd04c56
MM
7618 {
7619 rtx fn_reg = gen_reg_rtx (pmode);
7620 rtx toc_reg = gen_reg_rtx (pmode);
7621 emit_move_insn (fn_reg, MEM_DEREF (fnaddr));
7622 emit_move_insn (toc_reg, MEM_PLUS (fnaddr, 4));
7623 emit_move_insn (MEM_DEREF (addr), fn_reg);
7624 emit_move_insn (MEM_PLUS (addr, regsize), toc_reg);
7625 emit_move_insn (MEM_PLUS (addr, 2*regsize), ctx_reg);
7626 }
b6c9286a
MM
7627 break;
7628
eaf1bcf1 7629 /* Under V.4/eabi, call __trampoline_setup to do the real work. */
b6c9286a 7630 case ABI_V4:
c81bebd7 7631 case ABI_SOLARIS:
b6c9286a 7632 case ABI_AIX_NODESC:
39403d82 7633 emit_library_call (gen_rtx_SYMBOL_REF (SImode, "__trampoline_setup"),
eaf1bcf1
MM
7634 FALSE, VOIDmode, 4,
7635 addr, pmode,
7636 GEN_INT (rs6000_trampoline_size ()), SImode,
7637 fnaddr, pmode,
7638 ctx_reg, pmode);
b6c9286a 7639 break;
b6c9286a
MM
7640 }
7641
7642 return;
7643}
7509c759
MM
7644
7645\f
7646/* If defined, a C expression whose value is nonzero if IDENTIFIER
7647 with arguments ARGS is a valid machine specific attribute for DECL.
7648 The attributes in ATTRIBUTES have previously been assigned to DECL. */
7649
7650int
7651rs6000_valid_decl_attribute_p (decl, attributes, identifier, args)
296b8152
KG
7652 tree decl ATTRIBUTE_UNUSED;
7653 tree attributes ATTRIBUTE_UNUSED;
7654 tree identifier ATTRIBUTE_UNUSED;
7655 tree args ATTRIBUTE_UNUSED;
7509c759
MM
7656{
7657 return 0;
7658}
7659
7660/* If defined, a C expression whose value is nonzero if IDENTIFIER
7661 with arguments ARGS is a valid machine specific attribute for TYPE.
7662 The attributes in ATTRIBUTES have previously been assigned to TYPE. */
7663
7664int
7665rs6000_valid_type_attribute_p (type, attributes, identifier, args)
7666 tree type;
296b8152 7667 tree attributes ATTRIBUTE_UNUSED;
7509c759
MM
7668 tree identifier;
7669 tree args;
7670{
7671 if (TREE_CODE (type) != FUNCTION_TYPE
7672 && TREE_CODE (type) != FIELD_DECL
7673 && TREE_CODE (type) != TYPE_DECL)
7674 return 0;
7675
6a4cee5f
MM
7676 /* Longcall attribute says that the function is not within 2**26 bytes
7677 of the current function, and to do an indirect call. */
7678 if (is_attribute_p ("longcall", identifier))
7679 return (args == NULL_TREE);
7680
7509c759
MM
7681 return 0;
7682}
7683
7684/* If defined, a C expression whose value is zero if the attributes on
7685 TYPE1 and TYPE2 are incompatible, one if they are compatible, and
7686 two if they are nearly compatible (which causes a warning to be
7687 generated). */
7688
7689int
7690rs6000_comp_type_attributes (type1, type2)
296b8152
KG
7691 tree type1 ATTRIBUTE_UNUSED;
7692 tree type2 ATTRIBUTE_UNUSED;
7509c759
MM
7693{
7694 return 1;
7695}
7696
7697/* If defined, a C statement that assigns default attributes to newly
7698 defined TYPE. */
7699
7700void
7701rs6000_set_default_type_attributes (type)
296b8152 7702 tree type ATTRIBUTE_UNUSED;
7509c759 7703{
3cb999d8 7704 return;
7509c759
MM
7705}
7706
3cb999d8
DE
7707/* Return a reference suitable for calling a function with the
7708 longcall attribute. */
6a4cee5f
MM
7709struct rtx_def *
7710rs6000_longcall_ref (call_ref)
7711 rtx call_ref;
7712{
d330fd93 7713 const char *call_name;
6a4cee5f
MM
7714 tree node;
7715
7716 if (GET_CODE (call_ref) != SYMBOL_REF)
7717 return call_ref;
7718
7719 /* System V adds '.' to the internal name, so skip them. */
7720 call_name = XSTR (call_ref, 0);
7721 if (*call_name == '.')
7722 {
7723 while (*call_name == '.')
7724 call_name++;
7725
7726 node = get_identifier (call_name);
39403d82 7727 call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
6a4cee5f
MM
7728 }
7729
7730 return force_reg (Pmode, call_ref);
7731}
7732
7509c759
MM
7733\f
7734/* A C statement or statements to switch to the appropriate section
7735 for output of RTX in mode MODE. You can assume that RTX is some
7736 kind of constant in RTL. The argument MODE is redundant except in
7737 the case of a `const_int' rtx. Select the section by calling
7738 `text_section' or one of the alternatives for other sections.
7739
7740 Do not define this macro if you put all constants in the read-only
7741 data section. */
7742
7743#ifdef USING_SVR4_H
7744
7745void
7746rs6000_select_rtx_section (mode, x)
a9098fd0 7747 enum machine_mode mode;
7509c759
MM
7748 rtx x;
7749{
a9098fd0 7750 if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
7509c759 7751 toc_section ();
7509c759
MM
7752 else
7753 const_section ();
7754}
7755
7756/* A C statement or statements to switch to the appropriate
7757 section for output of DECL. DECL is either a `VAR_DECL' node
7758 or a constant of some sort. RELOC indicates whether forming
7759 the initial value of DECL requires link-time relocations. */
7760
7761void
7762rs6000_select_section (decl, reloc)
7763 tree decl;
7764 int reloc;
7765{
7766 int size = int_size_in_bytes (TREE_TYPE (decl));
63019373
GK
7767 int needs_sdata;
7768 int readonly;
7769 static void (* const sec_funcs[4]) PARAMS ((void)) = {
7770 &const_section,
7771 &sdata2_section,
7772 &data_section,
7773 &sdata_section
7774 };
7775
7776 needs_sdata = (size > 0
7777 && size <= g_switch_value
7778 && rs6000_sdata != SDATA_NONE
7779 && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)));
7509c759
MM
7780
7781 if (TREE_CODE (decl) == STRING_CST)
63019373 7782 readonly = ! flag_writable_strings;
a9098fd0 7783 else if (TREE_CODE (decl) == VAR_DECL)
63019373
GK
7784 readonly = (! (flag_pic && reloc)
7785 && TREE_READONLY (decl)
7786 && ! TREE_SIDE_EFFECTS (decl)
7787 && DECL_INITIAL (decl)
7788 && DECL_INITIAL (decl) != error_mark_node
7789 && TREE_CONSTANT (DECL_INITIAL (decl)));
7509c759 7790 else
63019373
GK
7791 readonly = 1;
7792 if (needs_sdata && rs6000_sdata != SDATA_EABI)
7793 readonly = 0;
7794
7795 (*sec_funcs[(readonly ? 0 : 2) + (needs_sdata ? 1 : 0)])();
7796}
7797
7798/* A C statement to build up a unique section name, expressed as a
7799 STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
7800 RELOC indicates whether the initial value of EXP requires
7801 link-time relocations. If you do not define this macro, GCC will use
7802 the symbol name prefixed by `.' as the section name. Note - this
7803 macro can now be called for unitialised data items as well as
7804 initialised data and functions. */
7805
7806void
7807rs6000_unique_section (decl, reloc)
7808 tree decl;
7809 int reloc;
7810{
7811 int size = int_size_in_bytes (TREE_TYPE (decl));
7812 int needs_sdata;
7813 int readonly;
7814 int len;
7815 int sec;
7816 const char *name;
7817 char *string;
7818 const char *prefix;
7819
7820 static const char *const prefixes[7][2] =
7821 {
7822 { ".text.", ".gnu.linkonce.t." },
7823 { ".rodata.", ".gnu.linkonce.r." },
7824 { ".sdata2.", ".gnu.linkonce.s2." },
7825 { ".data.", ".gnu.linkonce.d." },
7826 { ".sdata.", ".gnu.linkonce.s." },
7827 { ".bss.", ".gnu.linkonce.b." },
7828 { ".sbss.", ".gnu.linkonce.sb." }
7829 };
7830
7831 needs_sdata = (TREE_CODE (decl) != FUNCTION_DECL
7832 && size > 0
7833 && size <= g_switch_value
7834 && rs6000_sdata != SDATA_NONE
7835 && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)));
7836
7837 if (TREE_CODE (decl) == STRING_CST)
7838 readonly = ! flag_writable_strings;
7839 else if (TREE_CODE (decl) == VAR_DECL)
7840 readonly = (! (flag_pic && reloc)
7841 && TREE_READONLY (decl)
7842 && ! TREE_SIDE_EFFECTS (decl)
7843 && DECL_INITIAL (decl)
7844 && DECL_INITIAL (decl) != error_mark_node
7845 && TREE_CONSTANT (DECL_INITIAL (decl)));
7846 else
7847 readonly = 1;
7848 if (needs_sdata && rs6000_sdata != SDATA_EABI)
7849 readonly = 0;
7850
7851 sec = ((TREE_CODE (decl) == FUNCTION_DECL ? 0 : 1)
7852 + (readonly ? 0 : 2)
7853 + (needs_sdata ? 1 : 0)
7854 + (DECL_INITIAL (decl) == 0
7855 || DECL_INITIAL (decl) == error_mark_node) ? 4 : 0);
7856
e6978109 7857 STRIP_NAME_ENCODING (name, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
63019373
GK
7858 prefix = prefixes[sec][DECL_ONE_ONLY (decl)];
7859 len = strlen (name) + strlen (prefix);
7860 string = alloca (len + 1);
7861
7862 sprintf (string, "%s%s", prefix, name);
7863
7864 DECL_SECTION_NAME (decl) = build_string (len, string);
7509c759 7865}
d9407988
MM
7866
7867\f
d9407988
MM
7868/* If we are referencing a function that is static or is known to be
7869 in this file, make the SYMBOL_REF special. We can use this to indicate
7870 that we can branch to this function without emitting a no-op after the
9ebbca7d 7871 call. For real AIX calling sequences, we also replace the
d9407988
MM
7872 function name with the real name (1 or 2 leading .'s), rather than
7873 the function descriptor name. This saves a lot of overriding code
a260abc9 7874 to read the prefixes. */
d9407988
MM
7875
7876void
7877rs6000_encode_section_info (decl)
7878 tree decl;
7879{
7880 if (TREE_CODE (decl) == FUNCTION_DECL)
7881 {
7882 rtx sym_ref = XEXP (DECL_RTL (decl), 0);
8f1b829e 7883 if ((TREE_ASM_WRITTEN (decl) || ! TREE_PUBLIC (decl))
c81fc13e 7884 && ! DECL_WEAK (decl))
d9407988
MM
7885 SYMBOL_REF_FLAG (sym_ref) = 1;
7886
9ebbca7d 7887 if (DEFAULT_ABI == ABI_AIX)
d9407988 7888 {
ff669a6c
RH
7889 size_t len1 = (DEFAULT_ABI == ABI_AIX) ? 1 : 2;
7890 size_t len2 = strlen (XSTR (sym_ref, 0));
520a57c8 7891 char *str = alloca (len1 + len2 + 1);
ff669a6c
RH
7892 str[0] = '.';
7893 str[1] = '.';
7894 memcpy (str + len1, XSTR (sym_ref, 0), len2 + 1);
7895
520a57c8 7896 XSTR (sym_ref, 0) = ggc_alloc_string (str, len1 + len2);
d9407988
MM
7897 }
7898 }
7899 else if (rs6000_sdata != SDATA_NONE
7900 && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
7901 && TREE_CODE (decl) == VAR_DECL)
7902 {
7903 int size = int_size_in_bytes (TREE_TYPE (decl));
7904 tree section_name = DECL_SECTION_NAME (decl);
d330fd93 7905 const char *name = (char *)0;
d9407988
MM
7906 int len = 0;
7907
7908 if (section_name)
7909 {
7910 if (TREE_CODE (section_name) == STRING_CST)
7911 {
7912 name = TREE_STRING_POINTER (section_name);
7913 len = TREE_STRING_LENGTH (section_name);
7914 }
7915 else
7916 abort ();
7917 }
7918
7919 if ((size > 0 && size <= g_switch_value)
7920 || (name
5f59ecb7 7921 && ((len == sizeof (".sdata") - 1
3cb999d8 7922 && strcmp (name, ".sdata") == 0)
5f59ecb7 7923 || (len == sizeof (".sdata2") - 1
3cb999d8 7924 && strcmp (name, ".sdata2") == 0)
5f59ecb7 7925 || (len == sizeof (".sbss") - 1
3cb999d8 7926 && strcmp (name, ".sbss") == 0)
5f59ecb7 7927 || (len == sizeof (".sbss2") - 1
3cb999d8 7928 && strcmp (name, ".sbss2") == 0)
5f59ecb7 7929 || (len == sizeof (".PPC.EMB.sdata0") - 1
3cb999d8 7930 && strcmp (name, ".PPC.EMB.sdata0") == 0)
5f59ecb7 7931 || (len == sizeof (".PPC.EMB.sbss0") - 1
3cb999d8 7932 && strcmp (name, ".PPC.EMB.sbss0") == 0))))
d9407988
MM
7933 {
7934 rtx sym_ref = XEXP (DECL_RTL (decl), 0);
ff669a6c 7935 size_t len = strlen (XSTR (sym_ref, 0));
88c1e412 7936 char *str = alloca (len + 2);
ff669a6c 7937
ff669a6c
RH
7938 str[0] = '@';
7939 memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
88c1e412 7940 XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
d9407988
MM
7941 }
7942 }
7943}
7944
7509c759 7945#endif /* USING_SVR4_H */
000034eb 7946
a6c2a102 7947\f
000034eb 7948/* Return a REG that occurs in ADDR with coefficient 1.
02441cd6
JL
7949 ADDR can be effectively incremented by incrementing REG.
7950
7951 r0 is special and we must not select it as an address
7952 register by this routine since our caller will try to
7953 increment the returned register via an "la" instruction. */
000034eb
DE
7954
7955struct rtx_def *
7956find_addr_reg (addr)
7957 rtx addr;
7958{
7959 while (GET_CODE (addr) == PLUS)
7960 {
02441cd6
JL
7961 if (GET_CODE (XEXP (addr, 0)) == REG
7962 && REGNO (XEXP (addr, 0)) != 0)
000034eb 7963 addr = XEXP (addr, 0);
02441cd6
JL
7964 else if (GET_CODE (XEXP (addr, 1)) == REG
7965 && REGNO (XEXP (addr, 1)) != 0)
000034eb
DE
7966 addr = XEXP (addr, 1);
7967 else if (CONSTANT_P (XEXP (addr, 0)))
7968 addr = XEXP (addr, 1);
7969 else if (CONSTANT_P (XEXP (addr, 1)))
7970 addr = XEXP (addr, 0);
7971 else
7972 abort ();
7973 }
02441cd6 7974 if (GET_CODE (addr) == REG && REGNO (addr) != 0)
000034eb
DE
7975 return addr;
7976 abort ();
7977}
7978
a6c2a102
DE
7979void
7980rs6000_fatal_bad_address (op)
7981 rtx op;
7982{
7983 fatal_insn ("bad address", op);
7984}
c8023011
MM
7985
7986/* Called to register all of our global variables with the garbage
7987 collector. */
7988
7989static void
7990rs6000_add_gc_roots ()
7991{
7992 ggc_add_rtx_root (&rs6000_compare_op0, 1);
7993 ggc_add_rtx_root (&rs6000_compare_op1, 1);
9ebbca7d
GK
7994
7995 toc_hash_table = htab_create (1021, toc_hash_function, toc_hash_eq, NULL);
7996 ggc_add_root (&toc_hash_table, 1, sizeof (toc_hash_table),
7997 toc_hash_mark_table);
ee890fe2
SS
7998
7999#if TARGET_MACHO
8000 machopic_add_gc_roots ();
8001#endif
8002}
8003
8004#if TARGET_MACHO
8005
8006#if 0
8007/* Returns 1 if OP is either a symbol reference or a sum of a symbol
8008 reference and a constant. */
8009
8010int
8011symbolic_operand (op)
8012 register rtx op;
8013{
8014 switch (GET_CODE (op))
8015 {
8016 case SYMBOL_REF:
8017 case LABEL_REF:
8018 return 1;
8019 case CONST:
8020 op = XEXP (op, 0);
8021 return (GET_CODE (op) == SYMBOL_REF ||
8022 (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
8023 || GET_CODE (XEXP (op, 0)) == LABEL_REF)
8024 && GET_CODE (XEXP (op, 1)) == CONST_INT);
8025 default:
8026 return 0;
8027 }
c8023011 8028}
ee890fe2
SS
8029#endif
8030
8031#ifdef RS6000_LONG_BRANCH
8032
8033static tree stub_list = 0;
8034
8035/* ADD_COMPILER_STUB adds the compiler generated stub for handling
8036 procedure calls to the linked list. */
8037
8038void
8039add_compiler_stub (label_name, function_name, line_number)
8040 tree label_name;
8041 tree function_name;
8042 int line_number;
8043{
8044 tree stub = build_tree_list (function_name, label_name);
8045 TREE_TYPE (stub) = build_int_2 (line_number, 0);
8046 TREE_CHAIN (stub) = stub_list;
8047 stub_list = stub;
8048}
8049
8050#define STUB_LABEL_NAME(STUB) TREE_VALUE (STUB)
8051#define STUB_FUNCTION_NAME(STUB) TREE_PURPOSE (STUB)
8052#define STUB_LINE_NUMBER(STUB) TREE_INT_CST_LOW (TREE_TYPE (STUB))
8053
8054/* OUTPUT_COMPILER_STUB outputs the compiler generated stub for handling
8055 procedure calls from the linked list and initializes the linked list. */
8056
8057void output_compiler_stub ()
8058{
8059 char tmp_buf[256];
8060 char label_buf[256];
8061 char *label;
8062 tree tmp_stub, stub;
8063
8064 if (!flag_pic)
8065 for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
8066 {
8067 fprintf (asm_out_file,
8068 "%s:\n", IDENTIFIER_POINTER(STUB_LABEL_NAME(stub)));
8069
8070#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
8071 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
8072 fprintf (asm_out_file, "\t.stabd 68,0,%d\n", STUB_LINE_NUMBER(stub));
8073#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
8074
8075 if (IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub))[0] == '*')
8076 strcpy (label_buf,
8077 IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub))+1);
8078 else
8079 {
8080 label_buf[0] = '_';
8081 strcpy (label_buf+1,
8082 IDENTIFIER_POINTER (STUB_FUNCTION_NAME (stub)));
8083 }
8084
8085 strcpy (tmp_buf, "lis r12,hi16(");
8086 strcat (tmp_buf, label_buf);
8087 strcat (tmp_buf, ")\n\tori r12,r12,lo16(");
8088 strcat (tmp_buf, label_buf);
8089 strcat (tmp_buf, ")\n\tmtctr r12\n\tbctr");
8090 output_asm_insn (tmp_buf, 0);
8091
8092#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
8093 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
8094 fprintf(asm_out_file, "\t.stabd 68,0,%d\n", STUB_LINE_NUMBER (stub));
8095#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
8096 }
8097
8098 stub_list = 0;
8099}
8100
8101/* NO_PREVIOUS_DEF checks in the link list whether the function name is
8102 already there or not. */
8103
8104int no_previous_def (function_name)
8105 tree function_name;
8106{
8107 tree stub;
8108 for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
8109 if (function_name == STUB_FUNCTION_NAME (stub))
8110 return 0;
8111 return 1;
8112}
8113
8114/* GET_PREV_LABEL gets the label name from the previous definition of
8115 the function. */
8116
8117tree get_prev_label (function_name)
8118 tree function_name;
8119{
8120 tree stub;
8121 for (stub = stub_list; stub; stub = TREE_CHAIN (stub))
8122 if (function_name == STUB_FUNCTION_NAME (stub))
8123 return STUB_LABEL_NAME (stub);
8124 return 0;
8125}
8126
8127/* INSN is either a function call or a millicode call. It may have an
8128 unconditional jump in its delay slot.
8129
8130 CALL_DEST is the routine we are calling. */
8131
8132char *
8133output_call (insn, call_dest, operand_number)
8134 rtx insn;
8135 rtx call_dest;
8136 int operand_number;
8137{
8138 static char buf[256];
8139 if (GET_CODE (call_dest) == SYMBOL_REF && TARGET_LONG_BRANCH && !flag_pic)
8140 {
8141 tree labelname;
8142 tree funname = get_identifier (XSTR (call_dest, 0));
8143
8144 if (no_previous_def (funname))
8145 {
8146 int line_number;
8147 rtx label_rtx = gen_label_rtx ();
8148 char *label_buf, temp_buf[256];
8149 ASM_GENERATE_INTERNAL_LABEL (temp_buf, "L",
8150 CODE_LABEL_NUMBER (label_rtx));
8151 label_buf = temp_buf[0] == '*' ? temp_buf + 1 : temp_buf;
8152 labelname = get_identifier (label_buf);
8153 for (; insn && GET_CODE (insn) != NOTE; insn = PREV_INSN (insn));
8154 if (insn)
8155 line_number = NOTE_LINE_NUMBER (insn);
8156 add_compiler_stub (labelname, funname, line_number);
8157 }
8158 else
8159 labelname = get_prev_label (funname);
8160
8161 sprintf (buf, "jbsr %%z%d,%.246s",
8162 operand_number, IDENTIFIER_POINTER (labelname));
8163 return buf;
8164 }
8165 else
8166 {
8167 sprintf (buf, "bl %%z%d", operand_number);
8168 return buf;
8169 }
8170}
8171
8172#endif /* RS6000_LONG_BRANCH */
8173
8174#define GEN_LOCAL_LABEL_FOR_SYMBOL(BUF,SYMBOL,LENGTH,N) \
8175 do { \
8176 const char *symbol_ = (SYMBOL); \
8177 char *buffer_ = (BUF); \
8178 if (symbol_[0] == '"') \
8179 { \
8180 sprintf(buffer_, "\"L%d$%s", (N), symbol_+1); \
8181 } \
8182 else if (name_needs_quotes(symbol_)) \
8183 { \
8184 sprintf(buffer_, "\"L%d$%s\"", (N), symbol_); \
8185 } \
8186 else \
8187 { \
8188 sprintf(buffer_, "L%d$%s", (N), symbol_); \
8189 } \
8190 } while (0)
8191
8192
8193/* Generate PIC and indirect symbol stubs. */
8194
8195void
8196machopic_output_stub (file, symb, stub)
8197 FILE *file;
8198 const char *symb, *stub;
8199{
8200 unsigned int length;
8201 char *binder_name, *symbol_name, *lazy_ptr_name;
8202 char *local_label_0, *local_label_1, *local_label_2;
8203 static int label = 0;
8204
8205 label += 1;
8206
8207 length = strlen (stub);
8208 binder_name = alloca (length + 32);
8209 GEN_BINDER_NAME_FOR_STUB (binder_name, stub, length);
8210
8211 length = strlen (symb);
8212 symbol_name = alloca (length + 32);
8213 GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
8214
8215 lazy_ptr_name = alloca (length + 32);
8216 GEN_LAZY_PTR_NAME_FOR_SYMBOL (lazy_ptr_name, symb, length);
8217
8218 local_label_0 = alloca (length + 32);
8219 GEN_LOCAL_LABEL_FOR_SYMBOL (local_label_0, symb, length, 0);
8220
8221 local_label_1 = alloca (length + 32);
8222 GEN_LOCAL_LABEL_FOR_SYMBOL (local_label_1, symb, length, 1);
8223
8224 local_label_2 = alloca (length + 32);
8225 GEN_LOCAL_LABEL_FOR_SYMBOL (local_label_2, symb, length, 2);
8226
8227 if (flag_pic == 2)
8228 machopic_picsymbol_stub_section ();
8229 else
8230 machopic_symbol_stub_section ();
8231
8232 fprintf (file, "%s:\n", stub);
8233 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
8234
8235 if (flag_pic == 2)
8236 {
8237 fprintf (file, "\tmflr r0\n");
8238 fprintf (file, "\tbcl 20,31,%s\n", local_label_0);
8239 fprintf (file, "%s:\n\tmflr r11\n", local_label_0);
8240 fprintf (file, "\taddis r11,r11,ha16(%s-%s)\n",
8241 lazy_ptr_name, local_label_0);
8242 fprintf (file, "\tmtlr r0\n");
8243 fprintf (file, "\tlwz r12,lo16(%s-%s)(r11)\n",
8244 lazy_ptr_name, local_label_0);
8245 fprintf (file, "\tmtctr r12\n");
8246 fprintf (file, "\taddi r11,r11,lo16(%s-%s)\n",
8247 lazy_ptr_name, local_label_0);
8248 fprintf (file, "\tbctr\n");
8249 }
8250 else
8251 fprintf (file, "non-pure not supported\n");
8252
8253 machopic_lazy_symbol_ptr_section ();
8254 fprintf (file, "%s:\n", lazy_ptr_name);
8255 fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
8256 fprintf (file, "\t.long dyld_stub_binding_helper\n");
8257}
8258
8259/* Legitimize PIC addresses. If the address is already
8260 position-independent, we return ORIG. Newly generated
8261 position-independent addresses go into a reg. This is REG if non
8262 zero, otherwise we allocate register(s) as necessary. */
8263
8264#define SMALL_INT(X) ((unsigned) (INTVAL(X) + 0x4000) < 0x8000)
8265
8266rtx
8267rs6000_machopic_legitimize_pic_address (orig, mode, reg)
8268 rtx orig;
8269 enum machine_mode mode;
8270 rtx reg;
8271{
8272 rtx base, offset;
8273
8274 if (reg == NULL && ! reload_in_progress && ! reload_completed)
8275 reg = gen_reg_rtx (Pmode);
8276
8277 if (GET_CODE (orig) == CONST)
8278 {
8279 if (GET_CODE (XEXP (orig, 0)) == PLUS
8280 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
8281 return orig;
8282
8283 if (GET_CODE (XEXP (orig, 0)) == PLUS)
8284 {
8285 base = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 0),
8286 Pmode, reg);
8287 offset = rs6000_machopic_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
8288 Pmode, reg);
8289 }
8290 else
8291 abort ();
8292
8293 if (GET_CODE (offset) == CONST_INT)
8294 {
8295 if (SMALL_INT (offset))
8296 return plus_constant_for_output (base, INTVAL (offset));
8297 else if (! reload_in_progress && ! reload_completed)
8298 offset = force_reg (Pmode, offset);
8299 else
8300 abort ();
8301 }
8302 return gen_rtx (PLUS, Pmode, base, offset);
8303 }
8304
8305 /* Fall back on generic machopic code. */
8306 return machopic_legitimize_pic_address (orig, mode, reg);
8307}
8308
8309/* This is just a placeholder to make linking work without having to
8310 add this to the generic Darwin EXTRA_SECTIONS. If -mcall-aix is
8311 ever needed for Darwin (not too likely!) this would have to get a
8312 real definition. */
8313
8314void
8315toc_section ()
8316{
8317}
8318
8319#endif /* TARGET_MACHO */